diff --git a/lib/Controller/ApiController.php b/lib/Controller/ApiController.php index 8475ec2..92978b4 100644 --- a/lib/Controller/ApiController.php +++ b/lib/Controller/ApiController.php @@ -648,16 +648,8 @@ class ApiController extends Controller { $submissions[] = $submission; } - // Load question-texts, including deleted ones. - try { - $questionEntities = $this->questionMapper->findByForm($form->getId()); - } catch (DoesNotExistException $e) { - //handle silently - } - $questions = []; - foreach ($questionEntities as $questionEntity) { - $questions[] = $questionEntity->read(); - } + // Load currently active questions + $questions = $this->formsService->getQuestions($form->getId()); $response = [ 'submissions' => $submissions, diff --git a/lib/Service/FormsService.php b/lib/Service/FormsService.php index ad41f1d..5e9c43a 100644 --- a/lib/Service/FormsService.php +++ b/lib/Service/FormsService.php @@ -85,7 +85,12 @@ class FormsService { $this->currentUser = $userSession->getUser(); } - + /** + * Load options corresponding to question + * + * @param integer $questionId + * @return array + */ public function getOptions(int $questionId): array { $optionList = []; try { @@ -100,6 +105,12 @@ class FormsService { } } + /** + * Load questions corresponding to form + * + * @param integer $formId + * @return array + */ public function getQuestions(int $formId): array { $questionList = []; try { diff --git a/src/components/Results/Answer.vue b/src/components/Results/Answer.vue index 3352ac5..8977349 100644 --- a/src/components/Results/Answer.vue +++ b/src/components/Results/Answer.vue @@ -23,9 +23,9 @@ @@ -34,12 +34,12 @@ export default { name: 'Answer', props: { - answer: { - type: Object, + answerText: { + type: String, required: true, }, - question: { - type: Object, + questionText: { + type: String, required: true, }, }, diff --git a/src/components/Results/Submission.vue b/src/components/Results/Submission.vue index 72619d1..903253e 100644 --- a/src/components/Results/Submission.vue +++ b/src/components/Results/Submission.vue @@ -35,10 +35,10 @@

+ v-for="question in answeredQuestions" + :key="question.id" + :answer-text="question.squashedAnswers" + :question-text="question.text" /> @@ -70,30 +70,37 @@ export default { }, computed: { + // Format submission-timestamp to DateTime submissionDateTime() { return moment(this.submission.timestamp, 'X').format('LLLL') }, - squashedAnswers() { - const squashedArray = [] - this.submission.answers.forEach(answer => { - const index = squashedArray.findIndex(ansSq => ansSq.questionId === answer.questionId) - if (index > -1) { - squashedArray[index].text = squashedArray[index].text.concat('; ' + answer.text) - } else { - squashedArray.push(answer) + /** + * Join answered Questions with corresponding answers. + * Multiple answers to a question are squashed into one string. + * @returns {Array} + */ + answeredQuestions() { + const answeredQuestionsArray = [] + + this.questions.forEach(question => { + const answers = this.submission.answers.filter(answer => answer.questionId === question.id) + if (!answers.length) { + return // no answers, go to next question } - }) + const squashedAnswers = answers.map(answer => answer.text).join('; ') - return squashedArray + answeredQuestionsArray.push({ + 'id': question.id, + 'text': question.text, + 'squashedAnswers': squashedAnswers, + }) + }) + return answeredQuestionsArray }, }, methods: { - questionToAnswer(questionId) { - return this.questions.find(question => question.id === questionId) - }, - onDelete() { this.$emit('delete') }, diff --git a/src/views/Results.vue b/src/views/Results.vue index 325472d..355add2 100644 --- a/src/views/Results.vue +++ b/src/views/Results.vue @@ -71,10 +71,10 @@
@@ -117,14 +117,12 @@ export default { data() { return { loadingResults: true, - submissions: [], - questions: [], } }, computed: { noSubmissions() { - return this.submissions && this.submissions.length === 0 + return this.form.submissions?.length === 0 }, /** @@ -180,9 +178,8 @@ export default { const response = await axios.get(generateUrl('/apps/forms/api/v1/submissions/{hash}', { hash: this.form.hash, })) - this.submissions = response.data.submissions - this.questions = response.data.questions - console.debug(this.submissions) + this.form.submissions = response.data.submissions + this.form.questions = response.data.questions } catch (error) { console.error(error) showError(t('forms', 'There was an error while loading results')) @@ -196,8 +193,8 @@ export default { try { await axios.delete(generateUrl('/apps/forms/api/v1/submission/{id}', { id })) - const index = this.submissions.findIndex(search => search.id === id) - this.submissions.splice(index, 1) + const index = this.form.submissions.findIndex(search => search.id === id) + this.form.submissions.splice(index, 1) } catch (error) { console.error(error) showError(t('forms', 'There was an error while removing this response')) @@ -214,7 +211,7 @@ export default { this.loadingResults = true try { await axios.delete(generateUrl('/apps/forms/api/v1/submissions/{formId}', { formId: this.form.id })) - this.submissions = [] + this.form.submissions = [] } catch (error) { console.error(error) showError(t('forms', 'There was an error while removing responses')) @@ -231,19 +228,20 @@ export default { }) const formattedSubmissions = [] - this.submissions.forEach(submission => { + this.form.submissions.forEach(submission => { const formattedSubmission = { userDisplayName: submission.userDisplayName, timestamp: moment(submission.timestamp, 'X').format('L LT'), } - submission.answers.forEach(answer => { - const questionText = this.questions.find(question => question.id === answer.questionId).text - if (questionText in formattedSubmission) { - formattedSubmission[questionText] = formattedSubmission[questionText].concat('; ').concat(answer.text) - } else { - formattedSubmission[questionText] = answer.text + this.form.questions.forEach(question => { + const questionText = question.text + const answers = submission.answers.filter(answer => answer.questionId === question.id) + if (!answers.length) { + return // no answers, go to next question } + const squashedAnswers = answers.map(answer => answer.text).join('; ') + formattedSubmission[questionText] = squashedAnswers }) formattedSubmissions.push(formattedSubmission) })