From: Louis Jeckel Date: Sat, 15 Aug 2020 23:13:46 +0000 (+0200) Subject: poll answer viewing X-Git-Url: http://git.cubedesigners.com/?a=commitdiff_plain;h=0c3f3738863d9a3d2fbd469753f1afbaac151631;p=psq.git poll answer viewing --- diff --git a/app/Http/Controllers/Admin/PollController.php b/app/Http/Controllers/Admin/PollController.php index dfe6567..cf27b1e 100644 --- a/app/Http/Controllers/Admin/PollController.php +++ b/app/Http/Controllers/Admin/PollController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers\Admin; use A17\Twill\Http\Controllers\Admin\ModuleController; use App\Models\Poll; +use Illuminate\Support\Arr; class PollController extends ModuleController { @@ -24,9 +25,41 @@ class PollController extends ModuleController public function getPollAnswers(Poll $poll) { + $questions = $poll->getQuestions(); + $answers = $poll->entries()->get(); + + $answerCount = $answers->count(); + + + $data = $questions->map(function($question) use($answers, $answerCount){ + + + $ans = $answers->flatMap(function($ans) use($question){ + return Arr::wrap($ans->answers[$question['slug']]); + }); + $ansCountBy = $ans->countBy()->toArray(); + + + $ansCountBy = array_map(function($value, $count) use($answerCount) { + return [ + 'value' => $value, + 'count' => $count, + 'percentage' => number_format($count*100/$answerCount, 2) + ]; + }, array_keys($ansCountBy), $ansCountBy); + + + + + return array_merge($question, [ + 'answers' => $ansCountBy + ]); + }); + + return response()->json([ - 'poll' => $poll->getQuestions(), - 'answsers' => $poll->entries()->get() + 'questions' => $data, + 'entries_count' => $answerCount, ]); } diff --git a/app/Models/Poll.php b/app/Models/Poll.php index 2a7019c..e1a91fb 100644 --- a/app/Models/Poll.php +++ b/app/Models/Poll.php @@ -8,6 +8,7 @@ use A17\Twill\Models\Behaviors\HasMedias; use A17\Twill\Models\Block; use A17\Twill\Models\Model; use App\PollEntry; +use Illuminate\Support\Collection; use Illuminate\Support\Str; class Poll extends Model @@ -24,6 +25,11 @@ class Poll extends Model 'title', ]; + public static $pollTypes = [ + 'poll_text' => 'Question ouverte (texte)', + 'poll_check_check' => 'Question fermée (choix multiples)', + 'poll_check_radio' => 'Question fermée (choix unique)', + ]; /** * @return \Illuminate\Database\Eloquent\Relations\HasMany @@ -34,16 +40,23 @@ class Poll extends Model } + /** + * @return Collection + */ public function getQuestions() { $questions = $this->blocks()->whereNull('parent_id')->get(); return $questions->map(function(Block $q) { $q->options = $q->children; + $subtype = $q->input('type'); + $subtype = $subtype === null ? + '' : + "_$subtype"; return [ - 'type' => $q->type, - 'sub_type' => $q->input('type'), + 'type' => $type = $q->type.$subtype, + 'type_str' => self::$pollTypes[$type] ?? 'Type inconnu', 'question' => $question = $q->input('question'), 'slug' => Str::slug($question), 'position' => $q->position, diff --git a/public/admin/js/admin.js b/public/admin/js/admin.js index ae0d05c..77bc4a7 100644 --- a/public/admin/js/admin.js +++ b/public/admin/js/admin.js @@ -2575,14 +2575,51 @@ __webpack_require__.r(__webpack_exports__); // // // +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// /* harmony default export */ __webpack_exports__["default"] = ({ name: "PollAnswers", data: function data() { return { polls: [], selected_poll: null, - answers: null, - loaded: false + poll_data: null, + loaded: false, + selected_question: null }; }, watch: { @@ -2590,7 +2627,7 @@ __webpack_require__.r(__webpack_exports__); var _this = this; axios.get('/otherContent/pollAnswers/' + value.id).then(function (d) { - return _this.answers = d.data; + return _this.poll_data = d.data; }); } }, @@ -50541,7 +50578,7 @@ var render = function() { ? _c( "div", [ - _c("div", { staticClass: "form-group" }, [ + _c("div", { staticClass: "form-group mb-4" }, [ _c("label", { attrs: { for: "polls" } }), _vm._v(" "), _c( @@ -50584,26 +50621,117 @@ var render = function() { _vm._v(" "), !!_vm.selected_poll ? [ - _vm.answers === null + _vm.poll_data === null ? _c("div", { staticClass: "alert alert-info" }, [ _vm._v( - "\n Chargement en cours...\n " + "\n Chargement en cours...\n " ) ]) - : !!_vm.answers && _vm.answers.length === 0 + : !!_vm.poll_data && _vm.poll_data.entries_count === 0 ? _c("div", { staticClass: "alert alert-warning" }, [ _vm._v( - "\n Aucune réponse pour le moment !\n " + "\n Aucune réponse pour le moment !\n " ) ]) - : _c("div", [ - _c("pre", [ + : _c("div", { staticClass: "box p-3" }, [ + _c("p", { staticClass: "lead" }, [ _vm._v( - " " + - _vm._s(_vm.answers) + - "\n " + _vm._s(_vm.poll_data.entries_count) + + " réponses enregistrées" ) - ]) + ]), + _vm._v(" "), + _c("div", { staticClass: "form-group mb-2" }, [ + _c("label", { attrs: { for: "question" } }, [ + _vm._v( + "Sélectionnez une question pour voir les résultats" + ) + ]), + _vm._v(" "), + _c( + "select", + { + directives: [ + { + name: "model", + rawName: "v-model", + value: _vm.selected_question, + expression: "selected_question" + } + ], + staticClass: "form-control", + attrs: { name: "question", id: "question" }, + on: { + change: function($event) { + var $$selectedVal = Array.prototype.filter + .call($event.target.options, function(o) { + return o.selected + }) + .map(function(o) { + var val = + "_value" in o ? o._value : o.value + return val + }) + _vm.selected_question = $event.target.multiple + ? $$selectedVal + : $$selectedVal[0] + } + } + }, + _vm._l(_vm.poll_data.questions, function(question) { + return _c( + "option", + { domProps: { value: question } }, + [_vm._v(_vm._s(question.question))] + ) + }), + 0 + ) + ]), + _vm._v(" "), + _vm.selected_question === null + ? _c("div", { staticClass: "alert alert-info" }, [ + _vm._v( + "\n Sélectionnez une question pour voir les réponses\n " + ) + ]) + : _c("div", [ + _c( + "table", + { + staticClass: + "table table-bordered table-hover" + }, + [ + _vm._m(0), + _vm._v(" "), + _c( + "tbody", + _vm._l( + _vm.selected_question.answers, + function(answer) { + return _c("tr", [ + _c("td", [ + _vm._v(_vm._s(answer.value)) + ]), + _vm._v(" "), + _c("td", [ + _vm._v(_vm._s(answer.count)) + ]), + _vm._v(" "), + _c("td", [ + _vm._v( + _vm._s(answer.percentage) + "%" + ) + ]) + ]) + } + ), + 0 + ) + ] + ) + ]) ]) ] : _vm._e() @@ -50612,14 +50740,29 @@ var render = function() { ) : _vm.loaded ? _c("div", { staticClass: "alert alert-warning" }, [ - _vm._v("\n Aucun sondage trouvé\n ") + _vm._v("\n Aucun sondage trouvé\n ") ]) : _c("div", { staticClass: "alert alert-info" }, [ - _vm._v("\n Chargement en cours...\n ") + _vm._v("\n Chargement en cours...\n ") ]) ]) } -var staticRenderFns = [] +var staticRenderFns = [ + function() { + var _vm = this + var _h = _vm.$createElement + var _c = _vm._self._c || _h + return _c("thead", [ + _c("tr", [ + _c("th", [_vm._v("Réponse")]), + _vm._v(" "), + _c("th", [_vm._v("Occurences")]), + _vm._v(" "), + _c("th", [_vm._v("Pourcentage")]) + ]) + ]) + } +] render._withStripped = true diff --git a/public/js/app.js b/public/js/app.js index 6b9b845..8c9f06b 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -7770,14 +7770,51 @@ __webpack_require__.r(__webpack_exports__); // // // +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// /* harmony default export */ __webpack_exports__["default"] = ({ name: "PollAnswers", data: function data() { return { polls: [], selected_poll: null, - answers: null, - loaded: false + poll_data: null, + loaded: false, + selected_question: null }; }, watch: { @@ -7785,7 +7822,7 @@ __webpack_require__.r(__webpack_exports__); var _this = this; axios.get('/otherContent/pollAnswers/' + value.id).then(function (d) { - return _this.answers = d.data; + return _this.poll_data = d.data; }); } }, @@ -80021,7 +80058,7 @@ var render = function() { ? _c( "div", [ - _c("div", { staticClass: "form-group" }, [ + _c("div", { staticClass: "form-group mb-4" }, [ _c("label", { attrs: { for: "polls" } }), _vm._v(" "), _c( @@ -80064,26 +80101,117 @@ var render = function() { _vm._v(" "), !!_vm.selected_poll ? [ - _vm.answers === null + _vm.poll_data === null ? _c("div", { staticClass: "alert alert-info" }, [ _vm._v( - "\n Chargement en cours...\n " + "\n Chargement en cours...\n " ) ]) - : !!_vm.answers && _vm.answers.length === 0 + : !!_vm.poll_data && _vm.poll_data.entries_count === 0 ? _c("div", { staticClass: "alert alert-warning" }, [ _vm._v( - "\n Aucune réponse pour le moment !\n " + "\n Aucune réponse pour le moment !\n " ) ]) - : _c("div", [ - _c("pre", [ + : _c("div", { staticClass: "box p-3" }, [ + _c("p", { staticClass: "lead" }, [ _vm._v( - " " + - _vm._s(_vm.answers) + - "\n " + _vm._s(_vm.poll_data.entries_count) + + " réponses enregistrées" ) - ]) + ]), + _vm._v(" "), + _c("div", { staticClass: "form-group mb-2" }, [ + _c("label", { attrs: { for: "question" } }, [ + _vm._v( + "Sélectionnez une question pour voir les résultats" + ) + ]), + _vm._v(" "), + _c( + "select", + { + directives: [ + { + name: "model", + rawName: "v-model", + value: _vm.selected_question, + expression: "selected_question" + } + ], + staticClass: "form-control", + attrs: { name: "question", id: "question" }, + on: { + change: function($event) { + var $$selectedVal = Array.prototype.filter + .call($event.target.options, function(o) { + return o.selected + }) + .map(function(o) { + var val = + "_value" in o ? o._value : o.value + return val + }) + _vm.selected_question = $event.target.multiple + ? $$selectedVal + : $$selectedVal[0] + } + } + }, + _vm._l(_vm.poll_data.questions, function(question) { + return _c( + "option", + { domProps: { value: question } }, + [_vm._v(_vm._s(question.question))] + ) + }), + 0 + ) + ]), + _vm._v(" "), + _vm.selected_question === null + ? _c("div", { staticClass: "alert alert-info" }, [ + _vm._v( + "\n Sélectionnez une question pour voir les réponses\n " + ) + ]) + : _c("div", [ + _c( + "table", + { + staticClass: + "table table-bordered table-hover" + }, + [ + _vm._m(0), + _vm._v(" "), + _c( + "tbody", + _vm._l( + _vm.selected_question.answers, + function(answer) { + return _c("tr", [ + _c("td", [ + _vm._v(_vm._s(answer.value)) + ]), + _vm._v(" "), + _c("td", [ + _vm._v(_vm._s(answer.count)) + ]), + _vm._v(" "), + _c("td", [ + _vm._v( + _vm._s(answer.percentage) + "%" + ) + ]) + ]) + } + ), + 0 + ) + ] + ) + ]) ]) ] : _vm._e() @@ -80092,14 +80220,29 @@ var render = function() { ) : _vm.loaded ? _c("div", { staticClass: "alert alert-warning" }, [ - _vm._v("\n Aucun sondage trouvé\n ") + _vm._v("\n Aucun sondage trouvé\n ") ]) : _c("div", { staticClass: "alert alert-info" }, [ - _vm._v("\n Chargement en cours...\n ") + _vm._v("\n Chargement en cours...\n ") ]) ]) } -var staticRenderFns = [] +var staticRenderFns = [ + function() { + var _vm = this + var _h = _vm.$createElement + var _c = _vm._self._c || _h + return _c("thead", [ + _c("tr", [ + _c("th", [_vm._v("Réponse")]), + _vm._v(" "), + _c("th", [_vm._v("Occurences")]), + _vm._v(" "), + _c("th", [_vm._v("Pourcentage")]) + ]) + ]) + } +] render._withStripped = true diff --git a/resources/js/components/PollAnswers/PollAnswers.vue b/resources/js/components/PollAnswers/PollAnswers.vue index fba4697..966de00 100644 --- a/resources/js/components/PollAnswers/PollAnswers.vue +++ b/resources/js/components/PollAnswers/PollAnswers.vue @@ -1,7 +1,7 @@