{"version":3,"file":"Results-Bgs_-Qw_.chunk.mjs","sources":["../node_modules/@material-symbols/svg-400/outlined/csv.svg?raw","../node_modules/@material-symbols/svg-400/outlined/download.svg?raw","../node_modules/@material-symbols/svg-400/outlined/folder.svg?raw","../node_modules/@material-symbols/svg-400/outlined/link.svg?raw","../node_modules/@material-symbols/svg-400/outlined/link_off.svg?raw","../node_modules/@material-symbols/svg-400/outlined/search.svg?raw","../node_modules/@material-symbols/svg-400/outlined/table.svg?raw","../node_modules/@material-symbols/svg-400/outlined/table_chart.svg?raw","../node_modules/@material-symbols/svg-400/outlined/chevron_right.svg?raw","../node_modules/@material-symbols/svg-400/outlined/first_page.svg?raw","../node_modules/@material-symbols/svg-400/outlined/last_page.svg?raw","../src/components/PaginationToolbar.vue","../src/components/Results/ResultsSummary.vue","../src/components/Results/Answer.vue","../src/components/Results/Submission.vue","../src/views/Results.vue"],"sourcesContent":["export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"48\\\" height=\\\"48\\\" viewBox=\\\"0 -960 960 960\\\"><path d=\\\"M221-357h127v-50H238v-146h110v-50H221q-14.02 0-23.51 9.78Q188-583.45 188-569v179q0 14.02 9.49 23.51Q206.98-357 221-357Zm166 0h137q14.03 0 23.51-9.49Q557-375.98 557-390v-78q0-13-9.49-22-9.48-9-23.51-9h-87v-54h120v-50H420q-14.02 0-23.51 9.49Q387-584.03 387-570v78q0 14 9.49 23.5T420-459h87v52H387v50Zm271 0h57l75-246h-50l-53 183-47-183h-50l68 246ZM140-160q-24 0-42-18t-18-42v-520q0-24 18-42t42-18h680q24 0 42 18t18 42v520q0 24-18 42t-42 18H140Zm0-60h680v-520H140v520Zm0 0v-520 520Z\\\"/></svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"48\\\" height=\\\"48\\\" viewBox=\\\"0 -960 960 960\\\"><path d=\\\"M480-313 287-506l43-43 120 120v-371h60v371l120-120 43 43-193 193ZM220-160q-24 0-42-18t-18-42v-143h60v143h520v-143h60v143q0 24-18 42t-42 18H220Z\\\"/></svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"48\\\" height=\\\"48\\\" viewBox=\\\"0 -960 960 960\\\"><path d=\\\"M140-160q-24 0-42-18.5T80-220v-520q0-23 18-41.5t42-18.5h281l60 60h339q23 0 41.5 18.5T880-680v460q0 23-18.5 41.5T820-160H140Zm0-60h680v-460H456l-60-60H140v520Zm0 0v-520 520Z\\\"/></svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"48\\\" height=\\\"48\\\" viewBox=\\\"0 -960 960 960\\\"><path d=\\\"M450-280H280q-83 0-141.5-58.5T80-480q0-83 58.5-141.5T280-680h170v60H280q-58.33 0-99.17 40.76-40.83 40.77-40.83 99Q140-422 180.83-381q40.84 41 99.17 41h170v60ZM325-450v-60h310v60H325Zm185 170v-60h170q58.33 0 99.17-40.76 40.83-40.77 40.83-99Q820-538 779.17-579q-40.84-41-99.17-41H510v-60h170q83 0 141.5 58.5T880-480q0 83-58.5 141.5T680-280H510Z\\\"/></svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"48\\\" height=\\\"48\\\" viewBox=\\\"0 -960 960 960\\\"><path d=\\\"m750-291-49-49q51-10 85-48t34-89q0-58-41-99t-99-41H525v-60h155q83 0 141.5 58.5T880-477q0 62-36 112t-94 74ZM594-447l-60-60h101v60h-41ZM814-56 63-807l43-43L857-99l-43 43ZM450-280H280q-83 0-141.5-58.5T80-480q0-72 44.5-127T238-676l56 56h-14q-58 0-99 41t-41 99q0 58 41 99t99 41h170v60ZM325-450v-60h79l60 60H325Z\\\"/></svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"48\\\" height=\\\"48\\\" viewBox=\\\"0 -960 960 960\\\"><path d=\\\"M796-121 533-384q-30 26-70 40.5T378-329q-108 0-183-75t-75-181q0-106 75-181t182-75q106 0 180.5 75T632-585q0 43-14 83t-42 75l264 262-44 44ZM377-389q81 0 138-57.5T572-585q0-81-57-138.5T377-781q-82 0-139.5 57.5T180-585q0 81 57.5 138.5T377-389Z\\\"/></svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"48\\\" height=\\\"48\\\" viewBox=\\\"0 -960 960 960\\\"><path d=\\\"M180-120q-24 0-42-18t-18-42v-600q0-24 18-42t42-18h600q24 0 42 18t18 42v600q0 24-18 42t-42 18H180Zm270-250H180v190h270v-190Zm60 0v190h270v-190H510Zm-60-60v-190H180v190h270Zm60 0h270v-190H510v190ZM180-680h600v-100H180v100Z\\\"/></svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"48\\\" height=\\\"48\\\" viewBox=\\\"0 -960 960 960\\\"><path d=\\\"M780-121H180q-24 0-42-18t-18-42v-599q0-24 18-42t42-18h600q24 0 42 18t18 42v599q0 24-18 42t-42 18ZM180-639h600v-141H180v141Zm130 60H180v398h130v-398Zm340 0v398h130v-398H650Zm-60 0H370v398h220v-398Z\\\"/></svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"48\\\" height=\\\"48\\\" viewBox=\\\"0 -960 960 960\\\"><path d=\\\"M530-481 332-679l43-43 241 241-241 241-43-43 198-198Z\\\"/></svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"48\\\" height=\\\"48\\\" viewBox=\\\"0 -960 960 960\\\"><path d=\\\"M240-240v-480h60v480h-60Zm447-3L453-477l234-234 43 43-191 191 191 191-43 43Z\\\"/></svg>\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"48\\\" height=\\\"48\\\" viewBox=\\\"0 -960 960 960\\\"><path d=\\\"m272-245-43-43 192-192-192-192 43-43 235 235-235 235Zm388 5v-480h60v480h-60Z\\\"/></svg>\"","<!--\n  - SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors\n  - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<div class=\"pagination-block\">\n\t\t<div class=\"pagination-items\">\n\t\t\t<NcButton\n\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t:disabled=\"totalPages === 1 || pageNumber <= 1\"\n\t\t\t\t:aria-label=\"t('forms', 'Go to first page')\"\n\t\t\t\t@click=\"pageNumber = 1\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcIconSvgWrapper :svg=\"PageFirstIcon\" />\n\t\t\t\t</template>\n\t\t\t</NcButton>\n\t\t\t<NcButton\n\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t:disabled=\"totalPages === 1 || pageNumber <= 1\"\n\t\t\t\t:aria-label=\"t('forms', 'Go to previous page')\"\n\t\t\t\t@click=\"pageNumber--\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcIconSvgWrapper :svg=\"IconChevronLeft\" />\n\t\t\t\t</template>\n\t\t\t</NcButton>\n\t\t\t<div class=\"page-number\">\n\t\t\t\t<NcSelect\n\t\t\t\t\tv-model=\"pageNumber\"\n\t\t\t\t\t:options=\"allPageNumbersArray\"\n\t\t\t\t\t:aria-label-combobox=\"t('forms', 'Page number')\">\n\t\t\t\t\t<template #selected-option-container=\"{ option }\">\n\t\t\t\t\t\t<span class=\"selected-page\">\n\t\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t\tt('forms', '{page} of {totalPages}', {\n\t\t\t\t\t\t\t\t\tpage: option.label,\n\t\t\t\t\t\t\t\t\ttotalPages,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</template>\n\t\t\t\t</NcSelect>\n\t\t\t</div>\n\t\t\t<NcButton\n\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t:disabled=\"totalPages === 1 || pageNumber >= totalPages\"\n\t\t\t\t:aria-label=\"t('forms', 'Go to next page')\"\n\t\t\t\t@click=\"pageNumber++\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcIconSvgWrapper :svg=\"IconChevronRight\" />\n\t\t\t\t</template>\n\t\t\t</NcButton>\n\t\t\t<NcButton\n\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t:disabled=\"totalPages === 1 || pageNumber >= totalPages\"\n\t\t\t\t:aria-label=\"t('forms', 'Go to last page')\"\n\t\t\t\t@click=\"pageNumber = totalPages\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcIconSvgWrapper :svg=\"PageLastIcon\" />\n\t\t\t\t</template>\n\t\t\t</NcButton>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport IconChevronLeft from '@material-symbols/svg-400/outlined/chevron_left.svg?raw'\nimport IconChevronRight from '@material-symbols/svg-400/outlined/chevron_right.svg?raw'\nimport PageFirstIcon from '@material-symbols/svg-400/outlined/first_page.svg?raw'\nimport PageLastIcon from '@material-symbols/svg-400/outlined/last_page.svg?raw'\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'\nimport NcSelect from '@nextcloud/vue/components/NcSelect'\n\nexport default {\n\tname: 'PaginationToolbar',\n\tcomponents: {\n\t\tNcIconSvgWrapper,\n\t\tNcButton,\n\t\tNcSelect,\n\t},\n\n\tprops: {\n\t\ttotalItemsCount: {\n\t\t\ttype: Number,\n\t\t\trequired: true,\n\t\t},\n\n\t\tlimit: {\n\t\t\ttype: Number,\n\t\t\tdefault: 20,\n\t\t},\n\n\t\toffset: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\t},\n\n\temits: ['update:offset'],\n\n\tsetup() {\n\t\treturn {\n\t\t\tIconChevronLeft,\n\t\t\tIconChevronRight,\n\t\t\tPageFirstIcon,\n\t\t\tPageLastIcon,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tallPageNumbersArray() {\n\t\t\treturn Array.from(\n\t\t\t\t{ length: this.totalPages },\n\t\t\t\t(value, index) => 1 + index,\n\t\t\t)\n\t\t},\n\n\t\ttotalPages() {\n\t\t\treturn Math.max(1, Math.ceil(this.totalItemsCount / this.limit))\n\t\t},\n\n\t\tpageNumber: {\n\t\t\tget() {\n\t\t\t\treturn Math.floor(this.offset / this.limit) + 1\n\t\t\t},\n\n\t\t\tset(pageNumber) {\n\t\t\t\tthis.$emit('update:offset', (pageNumber - 1) * this.limit)\n\t\t\t},\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n:deep(.vs__clear) {\n\tdisplay: none;\n}\n\n:deep(.v-select) {\n\tmin-width: 95px !important;\n\t.vs__dropdown-toggle {\n\t\tbackground: none;\n\t}\n}\n\n.selected-page {\n\tpadding-left: 5px;\n\n\tdisplay: inline-flex;\n\talign-items: center;\n}\n\n.page-number {\n\tpadding-inline: 5px;\n\tpadding-top: 5px;\n\tpadding-bottom: 1px;\n}\n\n.pagination-items {\n\tbackground-color: var(--color-main-background);\n\tborder-radius: var(--border-radius-large);\n\tpointer-events: all;\n\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.pagination-block {\n\twidth: 100%;\n\tpointer-events: none;\n\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n}\n</style>\n","<!--\n  - SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors\n  - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<div class=\"section question-summary\">\n\t\t<h3 dir=\"auto\">\n\t\t\t{{ question.text }}\n\t\t</h3>\n\t\t<p class=\"question-summary__detail\">\n\t\t\t{{ questionTypeLabel }}\n\t\t</p>\n\n\t\t<!-- Ranking questions: Borda count with average rank -->\n\t\t<div v-if=\"question.type === 'ranking'\" class=\"question-summary__statistic\">\n\t\t\t<p class=\"question-summary__ranking-description\">\n\t\t\t\t{{\n\t\t\t\t\tt(\n\t\t\t\t\t\t'forms',\n\t\t\t\t\t\t'Ranked by Borda count: each 1st place receives {n} points, 2nd place {n1} points, and so on. Higher score means more preferred.',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tn: question.options.length,\n\t\t\t\t\t\t\tn1: question.options.length - 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t}}\n\t\t\t</p>\n\t\t\t<ol>\n\t\t\t\t<li v-for=\"option in rankingStats\" :key=\"option.id\">\n\t\t\t\t\t<label>\n\t\t\t\t\t\t<span class=\"question-summary__statistic-score\">\n\t\t\t\t\t\t\t{{ option.bordaTotal }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span class=\"question-summary__statistic-percentage\">\n\t\t\t\t\t\t\t({{\n\t\t\t\t\t\t\t\tt('forms', 'avg. rank {average}', {\n\t\t\t\t\t\t\t\t\taverage: option.avgRank,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}}):\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t\t'question-summary__statistic-text--best':\n\t\t\t\t\t\t\t\t\toption.best,\n\t\t\t\t\t\t\t}\">\n\t\t\t\t\t\t\t{{ option.text }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</label>\n\t\t\t\t\t<meter min=\"0\" :max=\"maxBordaScore\" :value=\"option.bordaTotal\" />\n\t\t\t\t</li>\n\t\t\t</ol>\n\t\t</div>\n\n\t\t<!-- Answers with countable results for visualization -->\n\t\t<ol\n\t\t\tv-else-if=\"answerTypes[question.type].predefined\"\n\t\t\tclass=\"question-summary__statistic\">\n\t\t\t<li v-for=\"option in questionOptions\" :key=\"option.id\">\n\t\t\t\t<label :for=\"`option-${option.questionId}-${option.id}`\">\n\t\t\t\t\t{{ option.count }}\n\t\t\t\t\t<span class=\"question-summary__statistic-percentage\">\n\t\t\t\t\t\t({{ option.percentage }}%):\n\t\t\t\t\t</span>\n\t\t\t\t\t<span\n\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t'question-summary__statistic-text--best': option.best,\n\t\t\t\t\t\t}\">\n\t\t\t\t\t\t{{ option.text }}\n\t\t\t\t\t</span>\n\t\t\t\t</label>\n\t\t\t\t<meter\n\t\t\t\t\t:id=\"`option-${option.questionId}-${option.id}`\"\n\t\t\t\t\tmin=\"0\"\n\t\t\t\t\t:max=\"submissions.length\"\n\t\t\t\t\t:value=\"option.count\" />\n\t\t\t</li>\n\t\t</ol>\n\n\t\t<div v-else-if=\"question.type === 'grid'\">\n\t\t\t<table class=\"answer-grid\">\n\t\t\t\t<thead>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<th class=\"first-column\"></th>\n\n\t\t\t\t\t\t<th v-for=\"column of gridColumns\" :key=\"column.id\">\n\t\t\t\t\t\t\t{{ column.text }}\n\t\t\t\t\t\t</th>\n\t\t\t\t\t</tr>\n\t\t\t\t</thead>\n\t\t\t\t<tbody>\n\t\t\t\t\t<tr v-for=\"row of gridRows\" :key=\"row.id\">\n\t\t\t\t\t\t<td class=\"first-column\">{{ row.text }}</td>\n\t\t\t\t\t\t<td v-for=\"column of gridColumns\" :key=\"column.id\">\n\t\t\t\t\t\t\t<template\n\t\t\t\t\t\t\t\tv-if=\"\n\t\t\t\t\t\t\t\t\tquestion.extraSettings.questionType === 'radio'\n\t\t\t\t\t\t\t\t\">\n\t\t\t\t\t\t\t\t{{ gridValue[row.id][column.id].answersCount }} ({{\n\t\t\t\t\t\t\t\t\tgridValue[row.id][column.id].percentage\n\t\t\t\t\t\t\t\t}}%)\n\t\t\t\t\t\t\t</template>\n\n\t\t\t\t\t\t\t<template\n\t\t\t\t\t\t\t\tv-if=\"\n\t\t\t\t\t\t\t\t\tquestion.extraSettings.questionType\n\t\t\t\t\t\t\t\t\t=== 'checkbox'\n\t\t\t\t\t\t\t\t\">\n\t\t\t\t\t\t\t\t{{ gridValue[row.id][column.id].answersCount }} ({{\n\t\t\t\t\t\t\t\t\tgridValue[row.id][column.id].percentage\n\t\t\t\t\t\t\t\t}}%)\n\t\t\t\t\t\t\t</template>\n\n\t\t\t\t\t\t\t<template\n\t\t\t\t\t\t\t\tv-if=\"\n\t\t\t\t\t\t\t\t\tquestion.extraSettings.questionType === 'number'\n\t\t\t\t\t\t\t\t\">\n\t\t\t\t\t\t\t\t{{ gridValue[row.id][column.id].averageValue }}\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</tr>\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</div>\n\n\t\t<!-- Text answers are simply listed for now, could be automatically grouped in the future -->\n\t\t<ul v-else class=\"question-summary__text\">\n\t\t\t<!-- Do not wrap the following line between tags! `white-space:pre-line` respects `\\n` but would produce additional empty first line -->\n\t\t\t<!-- eslint-disable-next-line -->\n\t\t\t<li v-for=\"(answer, index) in answers\" :key=\"answer.id\" dir=\"auto\">\n\t\t\t\t<template v-if=\"answer.url\">\n\t\t\t\t\t<a :href=\"answer.url\" target=\"_blank\">\n\t\t\t\t\t\t<NcIconSvgWrapper :svg=\"IconFile\" inline />\n\t\t\t\t\t\t{{ answer.text }}\n\t\t\t\t\t</a>\n\t\t\t\t</template>\n\t\t\t\t<template v-else-if=\"question.type === 'color'\">\n\t\t\t\t\t<div class=\"color__result\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"answer.id !== 0\"\n\t\t\t\t\t\t\t:style=\"{ 'background-color': answer.text }\"\n\t\t\t\t\t\t\t:class=\"\n\t\t\t\t\t\t\t\tindex === 1\n\t\t\t\t\t\t\t\t\t? 'color__field color__field__first'\n\t\t\t\t\t\t\t\t\t: 'color__field'\n\t\t\t\t\t\t\t\" />\n\t\t\t\t\t\t{{ answer.text }}\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\t\t\t\t<template v-else>\n\t\t\t\t\t{{ answer.text }}\n\t\t\t\t</template>\n\t\t\t</li>\n\t\t</ul>\n\t</div>\n</template>\n\n<script>\nimport IconFile from '@material-symbols/svg-400/outlined/draft.svg?raw'\nimport { generateUrl } from '@nextcloud/router'\nimport NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'\nimport answerTypes from '../../models/AnswerTypes.js'\nimport { GridCellType, OptionType } from '../../models/Constants.ts'\n\nexport default {\n\tname: 'ResultsSummary',\n\n\tcomponents: {\n\t\tNcIconSvgWrapper,\n\t},\n\n\tprops: {\n\t\tsubmissions: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\n\t\tquestion: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tsetup() {\n\t\treturn {\n\t\t\tIconFile,\n\t\t}\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tanswerTypes,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tquestionTypeLabel() {\n\t\t\tconst label = this.answerTypes[this.question.type].label\n\n\t\t\tif (this.question.type === 'grid') {\n\t\t\t\tif (\n\t\t\t\t\tthis.question.extraSettings.questionType\n\t\t\t\t\t=== GridCellType.Checkbox\n\t\t\t\t) {\n\t\t\t\t\treturn label + ' (' + t('forms', 'Checkbox') + ')'\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tthis.question.extraSettings.questionType === GridCellType.Number\n\t\t\t\t) {\n\t\t\t\t\treturn label + ' (' + t('forms', 'Number') + ')'\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tthis.question.extraSettings.questionType === GridCellType.Radio\n\t\t\t\t) {\n\t\t\t\t\treturn label + ' (' + t('forms', 'Radio') + ')'\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.question.type === 'linearscale') {\n\t\t\t\tconst labelLowest =\n\t\t\t\t\tthis.question.extraSettings?.optionsLabelLowest\n\t\t\t\t\t?? t('forms', 'Strongly disagree')\n\t\t\t\tconst labelHighest =\n\t\t\t\t\tthis.question.extraSettings?.optionsLabelHighest\n\t\t\t\t\t?? t('forms', 'Strongly agree')\n\t\t\t\tconst optionsLowest =\n\t\t\t\t\tthis.question.extraSettings?.optionsLowest?.toString() ?? '1'\n\t\t\t\tconst optionsHighest =\n\t\t\t\t\tthis.question.extraSettings?.optionsHighest?.toString() ?? '5'\n\n\t\t\t\tconst descriptionParts = []\n\t\t\t\tif (labelLowest !== '') {\n\t\t\t\t\tdescriptionParts.push(`${optionsLowest}: ${labelLowest}`)\n\t\t\t\t}\n\t\t\t\tif (labelHighest !== '') {\n\t\t\t\t\tdescriptionParts.push(`${optionsHighest}: ${labelHighest}`)\n\t\t\t\t}\n\t\t\t\tconst description = ` (${descriptionParts.join(', ')})`\n\t\t\t\treturn label + description\n\t\t\t}\n\n\t\t\treturn label\n\t\t},\n\n\t\t// For countable questions like multiple choice and checkboxes\n\t\tquestionOptions() {\n\t\t\t// Build list of question options\n\t\t\tlet questionOptionsStats\n\t\t\tif (this.question.type !== 'linearscale') {\n\t\t\t\tquestionOptionsStats = this.question.options.map((option) => ({\n\t\t\t\t\t...option,\n\t\t\t\t\tcount: 0,\n\t\t\t\t\tpercentage: 0,\n\t\t\t\t}))\n\t\t\t} else {\n\t\t\t\tquestionOptionsStats = Array.from(\n\t\t\t\t\t{\n\t\t\t\t\t\tlength:\n\t\t\t\t\t\t\t(this.question.extraSettings?.optionsHighest ?? 5)\n\t\t\t\t\t\t\t- (this.question.extraSettings?.optionsLowest ?? 1)\n\t\t\t\t\t\t\t+ 1,\n\t\t\t\t\t},\n\t\t\t\t\t(_, i) => ({\n\t\t\t\t\t\ttext: (\n\t\t\t\t\t\t\ti + (this.question.extraSettings?.optionsLowest ?? 1)\n\t\t\t\t\t\t).toString(),\n\t\t\t\t\t\tcount: 0,\n\t\t\t\t\t\tpercentage: 0,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}\n\n\t\t\t// Also record 'Other'\n\t\t\tif (this.question.extraSettings?.allowOtherAnswer) {\n\t\t\t\tquestionOptionsStats.unshift({\n\t\t\t\t\ttext: t('forms', 'Other'),\n\t\t\t\t\tcount: 0,\n\t\t\t\t\tpercentage: 0,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// Also record 'No response'\n\t\t\tquestionOptionsStats.unshift({\n\t\t\t\t// TRANSLATORS Counts on Results-Summary, how many users did not respond to this question.\n\t\t\t\ttext: t('forms', 'No response'),\n\t\t\t\tcount: 0,\n\t\t\t\tpercentage: 0,\n\t\t\t})\n\n\t\t\t// Go through submissions to check which options have how many responses\n\t\t\tthis.submissions.forEach((submission) => {\n\t\t\t\tconst answers = submission.answers.filter(\n\t\t\t\t\t(answer) => answer.questionId === this.question.id,\n\t\t\t\t)\n\t\t\t\tif (!answers.length) {\n\t\t\t\t\t// Record 'No response'\n\t\t\t\t\tquestionOptionsStats[0].count++\n\t\t\t\t}\n\n\t\t\t\t// Check question options to find which needs to be increased\n\t\t\t\tanswers.forEach((answer) => {\n\t\t\t\t\tconst optionsStatIndex = questionOptionsStats.findIndex(\n\t\t\t\t\t\t(option) => option.text === answer.text,\n\t\t\t\t\t)\n\t\t\t\t\tif (optionsStatIndex < 0) {\n\t\t\t\t\t\tif (this.question.extraSettings?.allowOtherAnswer) {\n\t\t\t\t\t\t\tquestionOptionsStats[1].count++\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tquestionOptionsStats.push({\n\t\t\t\t\t\t\t\ttext: answer.text,\n\t\t\t\t\t\t\t\tcount: 1,\n\t\t\t\t\t\t\t\tpercentage: 0,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tquestionOptionsStats[optionsStatIndex].count++\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\n\t\t\t// Sort options by response count\n\t\t\tif (this.question.type !== 'linearscale') {\n\t\t\t\tquestionOptionsStats.sort((object1, object2) => {\n\t\t\t\t\treturn object2.count - object1.count\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\t// for linear scale questions move the \"No response\" element to the end\n\t\t\t\tquestionOptionsStats.push(questionOptionsStats.shift())\n\t\t\t}\n\n\t\t\tquestionOptionsStats.forEach((questionOptionsStat) => {\n\t\t\t\t// Fill percentage values\n\t\t\t\tquestionOptionsStat.percentage = Math.round(\n\t\t\t\t\t(100 * questionOptionsStat.count) / this.submissions.length,\n\t\t\t\t)\n\t\t\t\t// Mark all best results\n\t\t\t\tconst maxCount = Math.max(\n\t\t\t\t\t...questionOptionsStats.map((option) => option.count),\n\t\t\t\t)\n\t\t\t\tquestionOptionsStat.best = questionOptionsStat.count === maxCount\n\t\t\t})\n\n\t\t\treturn questionOptionsStats\n\t\t},\n\n\t\t/**\n\t\t * Borda count ranking statistics\n\t\t */\n\t\trankingStats() {\n\t\t\tconst n = this.question.options.length\n\t\t\tconst stats = {}\n\n\t\t\tfor (const opt of this.question.options) {\n\t\t\t\tstats[opt.id] = {\n\t\t\t\t\tid: opt.id,\n\t\t\t\t\ttext: opt.text,\n\t\t\t\t\tbordaTotal: 0,\n\t\t\t\t\trankSum: 0,\n\t\t\t\t\tcount: 0,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const submission of this.submissions) {\n\t\t\t\tconst answer = submission.answers.find(\n\t\t\t\t\t(a) => a.questionId === this.question.id,\n\t\t\t\t)\n\t\t\t\tif (!answer) continue\n\t\t\t\tconst ranked = JSON.parse(answer.text)\n\t\t\t\tranked.forEach((optionId, index) => {\n\t\t\t\t\tif (stats[optionId]) {\n\t\t\t\t\t\tstats[optionId].bordaTotal += n - index\n\t\t\t\t\t\tstats[optionId].rankSum += index + 1\n\t\t\t\t\t\tstats[optionId].count++\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tconst result = Object.values(stats)\n\t\t\t\t.map((s) => ({\n\t\t\t\t\t...s,\n\t\t\t\t\tavgRank: s.count > 0 ? (s.rankSum / s.count).toFixed(1) : '-',\n\t\t\t\t}))\n\t\t\t\t.sort((a, b) => b.bordaTotal - a.bordaTotal)\n\n\t\t\t// Mark best (highest Borda score)\n\t\t\tif (result.length > 0 && result[0].bordaTotal > 0) {\n\t\t\t\tconst best = result[0].bordaTotal\n\t\t\t\tresult.forEach((o) => {\n\t\t\t\t\to.best = o.bordaTotal === best\n\t\t\t\t})\n\t\t\t}\n\n\t\t\treturn result\n\t\t},\n\n\t\tmaxBordaScore() {\n\t\t\tconst n = this.question.options.length\n\t\t\treturn n * this.submissions.length\n\t\t},\n\n\t\tgridColumns() {\n\t\t\treturn this.question.options.filter(\n\t\t\t\t(option) => option.optionType === OptionType.Column,\n\t\t\t)\n\t\t},\n\n\t\tgridRows() {\n\t\t\treturn this.question.options.filter(\n\t\t\t\t(option) => option.optionType === OptionType.Row,\n\t\t\t)\n\t\t},\n\n\t\tgridValue() {\n\t\t\tconst matrix = {}\n\t\t\tfor (const row of this.gridRows) {\n\t\t\t\tfor (const column of this.gridColumns) {\n\t\t\t\t\tmatrix[row.id] = matrix[row.id] || {}\n\t\t\t\t\tmatrix[row.id][column.id] = {\n\t\t\t\t\t\tanswersCount: 0,\n\t\t\t\t\t\tpercentage: 0,\n\t\t\t\t\t\ttotalValue: 0,\n\t\t\t\t\t\taverageValue: 0,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst answers = []\n\t\t\tthis.submissions.forEach((submission) => {\n\t\t\t\tsubmission.answers.forEach((answer) => {\n\t\t\t\t\tif (answer.questionId === this.question.id) {\n\t\t\t\t\t\tanswers.push(answer)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\n\t\t\tanswers.forEach((answer) => {\n\t\t\t\tconst answerJson = JSON.parse(answer.text)\n\n\t\t\t\tif (\n\t\t\t\t\tthis.question.extraSettings.questionType === GridCellType.Radio\n\t\t\t\t) {\n\t\t\t\t\tfor (const rowId of Object.keys(answerJson)) {\n\t\t\t\t\t\tconst columnId = answerJson[rowId]\n\n\t\t\t\t\t\tif (matrix[rowId]?.[columnId]) {\n\t\t\t\t\t\t\tmatrix[rowId][columnId].answersCount++\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (\n\t\t\t\t\tthis.question.extraSettings.questionType\n\t\t\t\t\t=== GridCellType.Checkbox\n\t\t\t\t) {\n\t\t\t\t\tfor (const rowId of Object.keys(answerJson)) {\n\t\t\t\t\t\tif (!Array.isArray(answerJson[rowId])) {\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor (const columnId of answerJson[rowId]) {\n\t\t\t\t\t\t\tif (matrix[rowId]?.[columnId]) {\n\t\t\t\t\t\t\t\tmatrix[rowId][columnId].answersCount++\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (\n\t\t\t\t\tthis.question.extraSettings.questionType === GridCellType.Number\n\t\t\t\t) {\n\t\t\t\t\tfor (const rowId of Object.keys(answerJson)) {\n\t\t\t\t\t\tif (!matrix[rowId]) {\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor (const columnId of Object.keys(answerJson[rowId])) {\n\t\t\t\t\t\t\tif ('' === answerJson[rowId][columnId]) {\n\t\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (matrix[rowId][columnId]) {\n\t\t\t\t\t\t\t\tmatrix[rowId][columnId].totalValue += parseFloat(\n\t\t\t\t\t\t\t\t\tanswerJson[rowId][columnId],\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tmatrix[rowId][columnId].answersCount++\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tfor (const rowId of Object.keys(matrix)) {\n\t\t\t\tfor (const columnId of Object.keys(matrix[rowId])) {\n\t\t\t\t\tlet totalAnswersCount = this.submissions.length\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis.question.extraSettings.questionType\n\t\t\t\t\t\t=== GridCellType.Checkbox\n\t\t\t\t\t) {\n\t\t\t\t\t\ttotalAnswersCount = Object.entries(matrix[rowId])\n\t\t\t\t\t\t\t.map(([, cell]) => cell.answersCount)\n\t\t\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t}\n\t\t\t\t\tif (totalAnswersCount === 0) {\n\t\t\t\t\t\ttotalAnswersCount = 1\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!matrix[rowId][columnId].answersCount) {\n\t\t\t\t\t\tmatrix[rowId][columnId].answersCount = 0\n\t\t\t\t\t}\n\n\t\t\t\t\tmatrix[rowId][columnId].percentage = Math.round(\n\t\t\t\t\t\t(100 * matrix[rowId][columnId].answersCount)\n\t\t\t\t\t\t\t/ totalAnswersCount,\n\t\t\t\t\t)\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis.question.extraSettings.questionType\n\t\t\t\t\t\t\t=== GridCellType.Number\n\t\t\t\t\t\t&& matrix[rowId][columnId].answersCount > 0\n\t\t\t\t\t) {\n\t\t\t\t\t\tmatrix[rowId][columnId].averageValue =\n\t\t\t\t\t\t\tmatrix[rowId][columnId].totalValue\n\t\t\t\t\t\t\t/ matrix[rowId][columnId].answersCount\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn matrix\n\t\t},\n\n\t\t// For text answers like short answer and long text\n\t\tanswers() {\n\t\t\tconst answersModels = []\n\n\t\t\t// Also record 'No response'\n\t\t\tlet noResponseCount = 0\n\n\t\t\t// Go through submissions to check which options have how many responses\n\t\t\tthis.submissions.forEach((submission) => {\n\t\t\t\tconst answers = submission.answers.filter(\n\t\t\t\t\t(answer) => answer.questionId === this.question.id,\n\t\t\t\t)\n\t\t\t\tif (!answers.length) {\n\t\t\t\t\t// Record 'No response'\n\t\t\t\t\tnoResponseCount++\n\t\t\t\t}\n\n\t\t\t\t// Add text answers\n\t\t\t\tif (\n\t\t\t\t\t['date', 'time'].includes(this.question.type)\n\t\t\t\t\t&& answers.length === 2\n\t\t\t\t) {\n\t\t\t\t\t// Combine the first two answers in order for date range questions\n\t\t\t\t\tanswersModels.push({\n\t\t\t\t\t\tid: `${answers[0].id}-${answers[1].id}`,\n\t\t\t\t\t\ttext: `${answers[0].text} - ${answers[1].text}`,\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tanswers.forEach((answer) => {\n\t\t\t\t\t\tif (answer.fileId) {\n\t\t\t\t\t\t\tanswersModels.push({\n\t\t\t\t\t\t\t\tid: answer.id,\n\t\t\t\t\t\t\t\ttext: answer.text,\n\t\t\t\t\t\t\t\turl: generateUrl('/f/{fileId}', {\n\t\t\t\t\t\t\t\t\tfileId: answer.fileId,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tanswersModels.push({\n\t\t\t\t\t\t\t\tid: answer.id,\n\t\t\t\t\t\t\t\ttext: answer.text,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t})\n\n\t\t\t// Calculate no response percentage\n\t\t\tconst noResponsePercentage = Math.round(\n\t\t\t\t(100 * noResponseCount) / this.submissions.length,\n\t\t\t)\n\t\t\tanswersModels.unshift({\n\t\t\t\tid: 0,\n\t\t\t\ttext:\n\t\t\t\t\tnoResponseCount\n\t\t\t\t\t+ ' ('\n\t\t\t\t\t+ noResponsePercentage\n\t\t\t\t\t+ '%): '\n\t\t\t\t\t+ t('forms', 'No response'),\n\t\t\t})\n\n\t\t\treturn answersModels\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.question-summary {\n\tpadding-inline: var(--default-clickable-area) 16px;\n\n\th3 {\n\t\tfont-weight: bold;\n\t}\n\n\t&__detail {\n\t\tcolor: var(--color-text-lighter);\n\t\tmargin-block-start: -8px;\n\t}\n\n\t&__text,\n\t&__statistic {\n\t\tmargin-block-start: 8px;\n\t}\n\n\t&__text {\n\t\tlist-style-type: initial;\n\n\t\tli {\n\t\t\tpadding-block: 4px;\n\t\t\tpadding-inline: 0;\n\t\t\twhite-space: pre-line;\n\n\t\t\t&:first-child {\n\t\t\t\tfont-weight: bold;\n\t\t\t}\n\t\t}\n\t}\n\n\t&__statistic {\n\t\tlist-style-type: none;\n\n\t\tli {\n\t\t\tposition: relative;\n\t\t\tpadding-block: 8px;\n\t\t\tpadding-inline: 0;\n\n\t\t\tlabel {\n\t\t\t\tcursor: default;\n\t\t\t}\n\n\t\t\t.question-summary__ranking-description {\n\t\t\t\tcolor: var(--color-text-maxcontrast);\n\t\t\t\tfont-style: italic;\n\t\t\t\tmargin-block-end: 8px;\n\t\t\t}\n\n\t\t\t.question-summary__statistic-text--best {\n\t\t\t\tfont-weight: bold;\n\t\t\t}\n\n\t\t\t.question-summary__statistic-percentage {\n\t\t\t\tcolor: var(--color-text-maxcontrast);\n\t\t\t}\n\n\t\t\tmeter {\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: 100%;\n\t\t\t\tmargin-block-start: 4px;\n\t\t\t\tbackground: var(--color-background-dark);\n\t\t\t\theight: calc(var(--border-radius) * 2);\n\t\t\t\tborder-radius: var(--border-radius);\n\n\t\t\t\t&::-webkit-meter-bar {\n\t\t\t\t\theight: calc(var(--border-radius) * 2);\n\t\t\t\t}\n\n\t\t\t\t// The pseudo-classes of -moz and -webkit have to stay separated even with SCSS, otherwise they don’t work\n\t\t\t\t&::-webkit-meter-optimum-value {\n\t\t\t\t\t// TODO switch to old gradient if it becomes available in server\n\t\t\t\t\tbackground: var(--gradient-primary-background);\n\t\t\t\t\tborder-radius: var(--border-radius);\n\t\t\t\t}\n\n\t\t\t\t&::-moz-meter-bar {\n\t\t\t\t\t// TODO switch to old gradient if it becomes available in server\n\t\t\t\t\tbackground: var(--gradient-primary-background);\n\t\t\t\t\tborder-radius: var(--border-radius);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t.color__field {\n\t\twidth: 100px;\n\t\theight: var(--default-clickable-area);\n\t\tborder-radius: var(--border-radius-element);\n\t\tposition: relative;\n\t\tinset-block-start: 12px;\n\n\t\t&__first {\n\t\t\tmargin-block-start: -12px;\n\t\t}\n\t}\n\n\t.color__result {\n\t\talign-items: baseline;\n\t\tdisplay: flex;\n\t\tgap: calc(var(--clickable-area-small) / 2);\n\t}\n\n\t.answer-grid {\n\t\tborder-collapse: collapse;\n\t\twidth: 100%;\n\n\t\tthead tr {\n\t\t\tborder-bottom: 2px solid var(--color-border);\n\t\t}\n\n\t\ttd {\n\t\t\tmin-height: 34px;\n\t\t\tmin-width: 64px;\n\t\t\ttext-align: center;\n\t\t\tpadding: 8px 4px;\n\n\t\t\t.checkbox-radio-switch {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: center;\n\t\t\t}\n\t\t}\n\n\t\tth {\n\t\t\tmin-height: 44px;\n\t\t\tpadding: 8px 4px;\n\t\t\ttext-align: center;\n\t\t}\n\n\t\t.first-column {\n\t\t\tmin-width: 200px;\n\t\t\ttext-align: left;\n\t\t\tposition: sticky;\n\t\t\tleft: 0;\n\t\t}\n\t}\n}\n</style>\n","<!--\n  - SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors\n  - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<div class=\"answer\">\n\t\t<h4 class=\"answer__question-text\" dir=\"auto\">\n\t\t\t{{ questionText }}\n\t\t</h4>\n\t\t<!-- Do not wrap the following line between tags! `white-space:pre-line` respects `\\n` but would produce additional empty first line -->\n\t\t<!-- eslint-disable-next-line -->\n\t\t<template v-if=\"questionType === 'file' && answers.length\">\n\t\t\t<p\n\t\t\t\tv-for=\"answer of answers\"\n\t\t\t\t:key=\"answer.id\"\n\t\t\t\tclass=\"answer__text\"\n\t\t\t\tdir=\"auto\">\n\t\t\t\t<a :href=\"answer.url\" target=\"_blank\">\n\t\t\t\t\t<NcIconSvgWrapper :svg=\"IconFile\" inline />\n\t\t\t\t\t<NcHighlight :text=\"answer.text\" :search=\"highlight\" />\n\t\t\t\t</a>\n\t\t\t</p>\n\t\t</template>\n\t\t<template v-else-if=\"questionType === 'color'\">\n\t\t\t<div class=\"color__result\">\n\t\t\t\t<div\n\t\t\t\t\t:style=\"{ 'background-color': answerText }\"\n\t\t\t\t\tclass=\"color__field\" />\n\t\t\t\t<NcHighlight :text=\"answerText\" :search=\"highlight\" />\n\t\t\t</div>\n\t\t</template>\n\t\t<template v-else-if=\"questionType === 'grid'\">\n\t\t\t<table class=\"answer-grid\">\n\t\t\t\t<thead>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<th class=\"first-column\"></th>\n\n\t\t\t\t\t\t<th v-for=\"column of gridColumns\" :key=\"column.id\">\n\t\t\t\t\t\t\t{{ column.text }}\n\t\t\t\t\t\t</th>\n\t\t\t\t\t</tr>\n\t\t\t\t</thead>\n\t\t\t\t<tbody>\n\t\t\t\t\t<tr v-for=\"row of gridRows\" :key=\"row.id\">\n\t\t\t\t\t\t<td class=\"first-column\">{{ row.text }}</td>\n\t\t\t\t\t\t<td v-for=\"column of gridColumns\" :key=\"column.id\">\n\t\t\t\t\t\t\t<template v-if=\"gridCellType === 'radio'\">\n\t\t\t\t\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t\t\t\t\t:modelValue=\"gridValue[row.id]\"\n\t\t\t\t\t\t\t\t\t:name=\"`${row.id}-answer`\"\n\t\t\t\t\t\t\t\t\t:value=\"column.id.toString()\"\n\t\t\t\t\t\t\t\t\tdisabled\n\t\t\t\t\t\t\t\t\ttype=\"radio\" />\n\t\t\t\t\t\t\t</template>\n\n\t\t\t\t\t\t\t<template v-if=\"gridCellType === 'checkbox'\">\n\t\t\t\t\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t\t\t\t\t:modelValue=\"gridValue[row.id] || []\"\n\t\t\t\t\t\t\t\t\t:name=\"`${row.id}-answer`\"\n\t\t\t\t\t\t\t\t\t:value=\"column.id.toString()\"\n\t\t\t\t\t\t\t\t\tdisabled\n\t\t\t\t\t\t\t\t\ttype=\"checkbox\" />\n\t\t\t\t\t\t\t</template>\n\n\t\t\t\t\t\t\t<template v-if=\"gridCellType === 'number'\">\n\t\t\t\t\t\t\t\t{{ gridValue[row.id][column.id] }}\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</tr>\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</template>\n\t\t<p v-else class=\"answer__text\" dir=\"auto\">\n\t\t\t<NcHighlight :text=\"answerText\" :search=\"highlight\" />\n\t\t</p>\n\t</div>\n</template>\n\n<script>\nimport IconFile from '@material-symbols/svg-400/outlined/draft.svg?raw'\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'\nimport NcHighlight from '@nextcloud/vue/components/NcHighlight'\nimport NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'\n\nexport default {\n\t// eslint-disable-next-line vue/multi-word-component-names\n\tname: 'Answer',\n\tcomponents: {\n\t\tNcCheckboxRadioSwitch,\n\t\tNcIconSvgWrapper,\n\t\tNcHighlight,\n\t},\n\n\tprops: {\n\t\tanswers: {\n\t\t\ttype: Array,\n\t\t\trequired: false,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\tanswerText: {\n\t\t\ttype: String,\n\t\t\trequired: false,\n\t\t\tdefault: '',\n\t\t},\n\n\t\tquestionText: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\n\t\tquestionType: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\n\t\tgridCellType: {\n\t\t\ttype: String,\n\t\t\trequired: false,\n\t\t\tdefault: null,\n\t\t},\n\n\t\tgridColumns: {\n\t\t\ttype: Array,\n\t\t\trequired: false,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\tgridRows: {\n\t\t\ttype: Array,\n\t\t\trequired: false,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\tgridValue: {\n\t\t\ttype: Object,\n\t\t\trequired: false,\n\t\t\tdefault: () => null,\n\t\t},\n\n\t\thighlight: {\n\t\t\ttype: String,\n\t\t\trequired: false,\n\t\t\tdefault: '',\n\t\t},\n\t},\n\n\tsetup() {\n\t\treturn {\n\t\t\tIconFile,\n\t\t}\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.answer {\n\tmargin-block-start: 12px;\n\twidth: 100%;\n\n\t&__question-text {\n\t\tfont-weight: bold;\n\t}\n\n\t&__text {\n\t\twhite-space: pre-line;\n\t}\n\n\t.color__field {\n\t\twidth: 100px;\n\t\theight: var(--default-clickable-area);\n\t\tborder-radius: var(--border-radius-element);\n\t\tposition: relative;\n\t\tinset-block-start: 12px;\n\t\tmargin-block-start: -12px;\n\t}\n\n\t.color__result {\n\t\talign-items: baseline;\n\t\tdisplay: flex;\n\t\tgap: calc(var(--clickable-area-small) / 2);\n\t}\n\n\t.answer-grid {\n\t\tborder-collapse: collapse;\n\t\twidth: 100%;\n\n\t\tthead tr {\n\t\t\tborder-bottom: 2px solid var(--color-border);\n\t\t}\n\n\t\ttd {\n\t\t\tmin-height: 34px;\n\t\t\tmin-width: 64px;\n\t\t\ttext-align: center;\n\t\t\tpadding: 8px 4px;\n\n\t\t\t.checkbox-radio-switch {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: center;\n\t\t\t}\n\t\t}\n\n\t\tth {\n\t\t\tmin-height: 44px;\n\t\t\tpadding: 8px 4px;\n\t\t\ttext-align: center;\n\t\t}\n\n\t\t.first-column {\n\t\t\tmin-width: 200px;\n\t\t\ttext-align: left;\n\t\t\tposition: sticky;\n\t\t\tleft: 0;\n\t\t}\n\t}\n}\n</style>\n","<!--\n  - SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors\n  - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<div class=\"section submission\" @copy=\"onCopy\">\n\t\t<div class=\"submission-head\">\n\t\t\t<h3 dir=\"auto\">\n\t\t\t\t{{ submission.userDisplayName }}\n\t\t\t</h3>\n\t\t\t<NcActions class=\"submission-menu\" forceMenu>\n\t\t\t\t<NcActionRouter\n\t\t\t\t\tv-if=\"canEditSubmission\"\n\t\t\t\t\t:to=\"{\n\t\t\t\t\t\tname: 'submit',\n\t\t\t\t\t\tparams: { hash: formHash, submissionId: submission.id },\n\t\t\t\t\t}\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<NcIconSvgWrapper :svg=\"IconPencil\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('forms', 'Edit this response') }}\n\t\t\t\t</NcActionRouter>\n\t\t\t\t<NcActionButton v-if=\"canDeleteSubmission\" @click=\"onDelete\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<NcIconSvgWrapper :svg=\"IconDelete\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('forms', 'Delete this response') }}\n\t\t\t\t</NcActionButton>\n\t\t\t</NcActions>\n\t\t</div>\n\t\t<p class=\"submission-date\">\n\t\t\t{{ submissionDateTime }}\n\t\t</p>\n\n\t\t<Answer\n\t\t\tv-for=\"question in answeredQuestions\"\n\t\t\t:key=\"question.id\"\n\t\t\t:highlight=\"highlight\"\n\t\t\t:answerText=\"question.squashedAnswers\"\n\t\t\t:answers=\"question.answers\"\n\t\t\t:questionText=\"question.text\"\n\t\t\t:gridCellType=\"question.gridCellType\"\n\t\t\t:gridColumns=\"question.gridColumns\"\n\t\t\t:gridRows=\"question.gridRows\"\n\t\t\t:gridValue=\"question.gridValue\"\n\t\t\t:questionType=\"question.type\" />\n\t</div>\n</template>\n\n<script>\nimport IconDelete from '@material-symbols/svg-400/outlined/delete.svg?raw'\nimport IconPencil from '@material-symbols/svg-400/outlined/edit.svg?raw'\nimport moment from '@nextcloud/moment'\nimport { generateUrl } from '@nextcloud/router'\nimport NcActionButton from '@nextcloud/vue/components/NcActionButton'\nimport NcActionRouter from '@nextcloud/vue/components/NcActionRouter'\nimport NcActions from '@nextcloud/vue/components/NcActions'\nimport NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'\nimport Answer from './Answer.vue'\nimport { OptionType } from '../../models/Constants.ts'\n\nexport default {\n\t// eslint-disable-next-line vue/multi-word-component-names\n\tname: 'Submission',\n\n\tcomponents: {\n\t\tAnswer,\n\t\tNcIconSvgWrapper,\n\t\tNcActions,\n\t\tNcActionButton,\n\t\tNcActionRouter,\n\t},\n\n\tprops: {\n\t\tformHash: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\n\t\tsubmission: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\n\t\tquestions: {\n\t\t\ttype: Array,\n\t\t\trequired: true,\n\t\t},\n\n\t\tcanDeleteSubmission: {\n\t\t\ttype: Boolean,\n\t\t\trequired: true,\n\t\t},\n\n\t\tcanEditSubmission: {\n\t\t\ttype: Boolean,\n\t\t\trequired: true,\n\t\t},\n\n\t\thighlight: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\t},\n\n\temits: ['delete'],\n\n\tsetup() {\n\t\treturn {\n\t\t\tIconDelete,\n\t\t\tIconPencil,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t// Format submission-timestamp to DateTime\n\t\tsubmissionDateTime() {\n\t\t\treturn moment(this.submission.timestamp, 'X').format('LLLL')\n\t\t},\n\n\t\t/**\n\t\t * Join answered Questions with corresponding answers.\n\t\t * Multiple answers to a question are squashed into one string.\n\t\t *\n\t\t * @return {Array}\n\t\t */\n\t\tansweredQuestions() {\n\t\t\tconst answeredQuestionsArray = []\n\n\t\t\tthis.questions.forEach((question) => {\n\t\t\t\tconst answers = this.submission.answers.filter(\n\t\t\t\t\t(answer) => answer.questionId === question.id,\n\t\t\t\t)\n\t\t\t\tif (!answers.length) {\n\t\t\t\t\treturn // no answers, go to next question\n\t\t\t\t}\n\n\t\t\t\tif (question.type === 'file') {\n\t\t\t\t\tansweredQuestionsArray.push({\n\t\t\t\t\t\tid: question.id,\n\t\t\t\t\t\ttext: question.text,\n\t\t\t\t\t\ttype: question.type,\n\t\t\t\t\t\tanswers: answers.map((answer) => {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tid: answer.id,\n\t\t\t\t\t\t\t\ttext: answer.text,\n\t\t\t\t\t\t\t\turl: generateUrl('/f/{fileId}', {\n\t\t\t\t\t\t\t\t\tfileId: answer.fileId,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}),\n\t\t\t\t\t})\n\t\t\t\t} else if (question.type === 'grid') {\n\t\t\t\t\tconst optionsPerId = {}\n\t\t\t\t\tquestion.options.forEach((option) => {\n\t\t\t\t\t\toptionsPerId[option.id] = option\n\t\t\t\t\t})\n\t\t\t\t\tlet squashedAnswers = ''\n\n\t\t\t\t\tconst gridValue = answers[0].text\n\t\t\t\t\t\t? JSON.parse(answers[0].text)\n\t\t\t\t\t\t: null\n\t\t\t\t\t// fixme: rename `questionType` to `gridCellType` everywhere in BE and FE\n\t\t\t\t\tif (\n\t\t\t\t\t\tgridValue\n\t\t\t\t\t\t&& question.extraSettings.questionType === 'radio'\n\t\t\t\t\t) {\n\t\t\t\t\t\tsquashedAnswers = Object.keys(gridValue)\n\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t(key) =>\n\t\t\t\t\t\t\t\t\toptionsPerId[key]\n\t\t\t\t\t\t\t\t\t&& optionsPerId[gridValue[key]],\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.map((key) => {\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\toptionsPerId[key].text\n\t\t\t\t\t\t\t\t\t+ ': '\n\t\t\t\t\t\t\t\t\t+ optionsPerId[gridValue[key]].text\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.join('\\n')\n\t\t\t\t\t} else if (\n\t\t\t\t\t\tgridValue\n\t\t\t\t\t\t&& question.extraSettings.questionType === 'checkbox'\n\t\t\t\t\t) {\n\t\t\t\t\t\tsquashedAnswers = Object.keys(gridValue)\n\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t(key) =>\n\t\t\t\t\t\t\t\t\toptionsPerId[key]\n\t\t\t\t\t\t\t\t\t&& Array.isArray(gridValue[key]),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.map((key) => {\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\toptionsPerId[key].text\n\t\t\t\t\t\t\t\t\t+ ': '\n\t\t\t\t\t\t\t\t\t+ gridValue[key]\n\t\t\t\t\t\t\t\t\t\t.filter((optionId) => optionsPerId[optionId])\n\t\t\t\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t\t\t\t(optionId) =>\n\t\t\t\t\t\t\t\t\t\t\t\toptionsPerId[optionId].text,\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t.join(', ')\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.join('\\n')\n\t\t\t\t\t}\n\n\t\t\t\t\tansweredQuestionsArray.push({\n\t\t\t\t\t\tid: question.id,\n\t\t\t\t\t\ttext: question.text,\n\t\t\t\t\t\ttype: question.type,\n\t\t\t\t\t\tgridValue,\n\t\t\t\t\t\tsquashedAnswers,\n\t\t\t\t\t\tgridCellType: question.extraSettings.questionType,\n\t\t\t\t\t\tgridRows: question.options.filter(\n\t\t\t\t\t\t\t(option) => option.optionType === OptionType.Row,\n\t\t\t\t\t\t),\n\t\t\t\t\t\tgridColumns: question.options.filter(\n\t\t\t\t\t\t\t(option) => option.optionType === OptionType.Column,\n\t\t\t\t\t\t),\n\t\t\t\t\t})\n\t\t\t\t} else if (['date', 'time'].includes(question.type)) {\n\t\t\t\t\tconst squashedAnswers = answers\n\t\t\t\t\t\t.map((answer) => answer.text)\n\t\t\t\t\t\t.join(' - ')\n\n\t\t\t\t\tansweredQuestionsArray.push({\n\t\t\t\t\t\tid: question.id,\n\t\t\t\t\t\ttext: question.text,\n\t\t\t\t\t\ttype: question.type,\n\t\t\t\t\t\tsquashedAnswers,\n\t\t\t\t\t})\n\t\t\t\t} else if (question.type === 'ranking') {\n\t\t\t\t\tconst optionsPerId = {}\n\t\t\t\t\tquestion.options.forEach((option) => {\n\t\t\t\t\t\toptionsPerId[option.id] = option\n\t\t\t\t\t})\n\t\t\t\t\tconst rankedIds = answers[0]?.text\n\t\t\t\t\t\t? JSON.parse(answers[0].text)\n\t\t\t\t\t\t: []\n\t\t\t\t\tconst squashedAnswers = rankedIds\n\t\t\t\t\t\t.map((id, index) => {\n\t\t\t\t\t\t\tconst option = optionsPerId[id]\n\t\t\t\t\t\t\treturn option\n\t\t\t\t\t\t\t\t? `${index + 1}. ${option.text}`\n\t\t\t\t\t\t\t\t: `${index + 1}. ?`\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.join('\\n')\n\n\t\t\t\t\tansweredQuestionsArray.push({\n\t\t\t\t\t\tid: question.id,\n\t\t\t\t\t\ttext: question.text,\n\t\t\t\t\t\ttype: question.type,\n\t\t\t\t\t\tsquashedAnswers,\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tconst squashedAnswers = answers\n\t\t\t\t\t\t.map((answer) => answer.text)\n\t\t\t\t\t\t.join('; ')\n\n\t\t\t\t\tansweredQuestionsArray.push({\n\t\t\t\t\t\tid: question.id,\n\t\t\t\t\t\ttext: question.text,\n\t\t\t\t\t\ttype: question.type,\n\t\t\t\t\t\tsquashedAnswers,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn answeredQuestionsArray\n\t\t},\n\t},\n\n\tmethods: {\n\t\tonDelete() {\n\t\t\tthis.$emit('delete')\n\t\t},\n\n\t\tonCopy(event) {\n\t\t\tif (!event.clipboardData) return\n\n\t\t\tconst selection = window.getSelection()\n\t\t\tif (!selection || selection.isCollapsed) return\n\n\t\t\tconst fragment = selection.getRangeAt(0).cloneContents()\n\t\t\tconst text = this.serializeNode(fragment).trim()\n\n\t\t\tif (!text) return\n\n\t\t\tevent.clipboardData.setData('text/plain', text)\n\t\t\tevent.preventDefault()\n\t\t},\n\n\t\tserializeNode(node) {\n\t\t\tif (node.nodeType === Node.TEXT_NODE) {\n\t\t\t\treturn node.textContent\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tnode.nodeType !== Node.ELEMENT_NODE\n\t\t\t\t&& node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE\n\t\t\t) {\n\t\t\t\treturn ''\n\t\t\t}\n\n\t\t\tconst tag = node.tagName?.toLowerCase()\n\n\t\t\tif (tag && ['svg', 'script', 'style'].includes(tag)) return ''\n\t\t\tif (tag === 'br') return '\\n'\n\n\t\t\tconst children = Array.from(node.childNodes)\n\t\t\t\t.map((child) => this.serializeNode(child))\n\t\t\t\t.join('')\n\n\t\t\t// Answer blocks get a blank line before them as visual separator\n\t\t\tif (tag === 'div' && node.classList?.contains('answer')) {\n\t\t\t\tconst trimmed = children.replace(/\\s+$/, '')\n\t\t\t\treturn trimmed ? '\\n' + trimmed + '\\n' : ''\n\t\t\t}\n\n\t\t\tconst isBlock =\n\t\t\t\ttag\n\t\t\t\t&& [\n\t\t\t\t\t'div',\n\t\t\t\t\t'p',\n\t\t\t\t\t'h1',\n\t\t\t\t\t'h2',\n\t\t\t\t\t'h3',\n\t\t\t\t\t'h4',\n\t\t\t\t\t'h5',\n\t\t\t\t\t'h6',\n\t\t\t\t\t'li',\n\t\t\t\t\t'td',\n\t\t\t\t\t'tr',\n\t\t\t\t\t'th',\n\t\t\t\t\t'dt',\n\t\t\t\t\t'dd',\n\t\t\t\t].includes(tag)\n\t\t\tif (isBlock) {\n\t\t\t\tconst trimmed = children.replace(/\\s+$/, '')\n\t\t\t\treturn trimmed ? trimmed + '\\n' : ''\n\t\t\t}\n\n\t\t\treturn children\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.submission {\n\tpadding-inline: var(--default-clickable-area) 16px;\n\n\t&-head {\n\t\tdisplay: flex;\n\t\talign-items: flex-end;\n\n\t\th3 {\n\t\t\tfont-weight: bold;\n\t\t}\n\t}\n\n\t&-menu {\n\t\tmargin: 0 0 12px var(--default-grid-baseline);\n\t\tdisplay: inline-block;\n\t}\n\n\t&-date {\n\t\tcolor: var(--color-text-lighter);\n\t\tmargin-block-start: -8px;\n\t}\n}\n</style>\n","<!--\n  - SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors\n  - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<NcAppContent :pageHeading=\"t('forms', 'Responses')\">\n\t\t<NcDialog\n\t\t\tv-model:open=\"showLinkedFileNotAvailableDialog\"\n\t\t\t:name=\"t('forms', 'Linked file not available')\"\n\t\t\t:message=\"\n\t\t\t\tt(\n\t\t\t\t\t'forms',\n\t\t\t\t\t'Linked file is not available, would you like to link a new file?',\n\t\t\t\t)\n\t\t\t\"\n\t\t\t:buttons=\"linkedFileNotAvailableButtons\"\n\t\t\tsize=\"normal\"\n\t\t\tnoClose />\n\n\t\t<TopBar\n\t\t\t:archived=\"isFormArchived\"\n\t\t\t:locked=\"isFormLocked\"\n\t\t\t:permissions=\"form?.permissions\"\n\t\t\t:sidebarOpened=\"sidebarOpened\"\n\t\t\t:submissionCount=\"form?.submissionCount\"\n\t\t\t@shareForm=\"onShareForm\" />\n\n\t\t<!-- Showing submissions -->\n\t\t<header>\n\t\t\t<h2 dir=\"auto\">\n\t\t\t\t{{ formTitle }}\n\t\t\t</h2>\n\t\t\t<p>\n\t\t\t\t{{\n\t\t\t\t\tt('forms', '{amount} responses', {\n\t\t\t\t\t\tamount: filteredSubmissionsCount,\n\t\t\t\t\t})\n\t\t\t\t}}\n\t\t\t</p>\n\n\t\t\t<!-- View switcher between Summary and Responses -->\n\t\t\t<div class=\"response-actions\">\n\t\t\t\t<PillMenu\n\t\t\t\t\tv-model:active=\"activeResponseView\"\n\t\t\t\t\t:disabled=\"noSubmissions\"\n\t\t\t\t\t:options=\"responseViews\"\n\t\t\t\t\t:groupLabel=\"t('forms', 'View mode')\"\n\t\t\t\t\tclass=\"response-actions__toggle\"\n\t\t\t\t\t@update:active=\"loadFormResults\" />\n\n\t\t\t\t<!-- Action menu for cloud export and deletion -->\n\t\t\t\t<NcActions\n\t\t\t\t\tv-if=\"canExportSubmissions\"\n\t\t\t\t\t:aria-label=\"t('forms', 'Options')\"\n\t\t\t\t\tforceName\n\t\t\t\t\t:inline=\"isMobile ? 0 : 1\"\n\t\t\t\t\t@blur=\"isDownloadActionOpened = false\"\n\t\t\t\t\t@close=\"isDownloadActionOpened = false\">\n\t\t\t\t\t<template v-if=\"!isDownloadActionOpened\">\n\t\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\t\tv-if=\"canEditForm && !form.fileId && !isFormLocked\"\n\t\t\t\t\t\t\t@click=\"onLinkFile\">\n\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t<NcIconSvgWrapper :svg=\"IconLink\" />\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t{{ t('forms', 'Create spreadsheet') }}\n\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t<template v-if=\"canEditForm && form.fileId\">\n\t\t\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\t\t\t:href=\"fileUrl\"\n\t\t\t\t\t\t\t\ttype=\"tertiary-no-background\">\n\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t<NcIconSvgWrapper :svg=\"IconTable\" />\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t{{ t('forms', 'Open spreadsheet') }}\n\t\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t\t<NcActionButton closeAfterClick @click=\"onReExport\">\n\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t<NcIconSvgWrapper :svg=\"IconRefresh\" />\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t{{ t('forms', 'Re-export spreadsheet') }}\n\t\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\t\t\tcloseAfterClick\n\t\t\t\t\t\t\t\t:disabled=\"isFormLocked\"\n\t\t\t\t\t\t\t\t@click=\"onUnlinkFile\">\n\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t<NcIconSvgWrapper :svg=\"IconLinkVariantOff\" />\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t{{ t('forms', 'Unlink spreadsheet') }}\n\t\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t\t<NcActionSeparator v-if=\"!noSubmissions\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\t\tv-if=\"!noSubmissions\"\n\t\t\t\t\t\t\tcloseAfterClick\n\t\t\t\t\t\t\t@click=\"onStoreToFiles\">\n\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t<NcIconSvgWrapper :svg=\"IconFolder\" />\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t{{ t('forms', 'Save copy to Files') }}\n\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\t\tv-if=\"!noSubmissions\"\n\t\t\t\t\t\t\t:closeAfterClick=\"false\"\n\t\t\t\t\t\t\tisMenu\n\t\t\t\t\t\t\t@click=\"isDownloadActionOpened = true\">\n\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t<NcIconSvgWrapper :svg=\"IconDownload\" />\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t{{ t('forms', 'Download') }}\n\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\t\tv-if=\"canDeleteSubmissions && !noSubmissions\"\n\t\t\t\t\t\t\tcloseAfterClick\n\t\t\t\t\t\t\t@click=\"deleteAllSubmissions\">\n\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t<NcIconSvgWrapper :svg=\"IconDelete\" />\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t{{ t('forms', 'Delete all responses') }}\n\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t</template>\n\n\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t<!-- Back to top-level button -->\n\t\t\t\t\t\t<NcActionButton @click=\"isDownloadActionOpened = false\">\n\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t<NcIconSvgWrapper :svg=\"IconChevronLeft\" />\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t{{ t('forms', 'Download') }}\n\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t<NcActionSeparator />\n\t\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\t\tcloseAfterClick\n\t\t\t\t\t\t\t@click=\"onDownloadFile('csv')\">\n\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t<NcIconSvgWrapper :svg=\"IconFileDelimited\" />\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\tCSV\n\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\t\tcloseAfterClick\n\t\t\t\t\t\t\t@click=\"onDownloadFile('ods')\">\n\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t<NcIconSvgWrapper :svg=\"IconTable\" />\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\tODS\n\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\t\tcloseAfterClick\n\t\t\t\t\t\t\t@click=\"onDownloadFile('xlsx')\">\n\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t<NcIconSvgWrapper :svg=\"IconFileExcelOutline\" />\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\tXSLX\n\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t</template>\n\t\t\t\t</NcActions>\n\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"\n\t\t\t\t\t\t(!noSubmissions\n\t\t\t\t\t\t\t|| loadingResults\n\t\t\t\t\t\t\t|| submissionSearch.length > 0)\n\t\t\t\t\t\t&& activeResponseView.id !== 'summary'\n\t\t\t\t\t\"\n\t\t\t\t\tclass=\"search-wrapper\">\n\t\t\t\t\t<NcTextField\n\t\t\t\t\t\tv-model=\"submissionSearch\"\n\t\t\t\t\t\t:label=\"t('forms', 'Search')\"\n\t\t\t\t\t\ttrailingButtonIcon=\"close\"\n\t\t\t\t\t\t:showTrailingButton=\"submissionSearch.length > 0\"\n\t\t\t\t\t\t@trailingButtonClick=\"submissionSearch = ''\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<NcIconSvgWrapper :svg=\"IconMagnify\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcTextField>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</header>\n\n\t\t<!-- Loading submissions -->\n\t\t<NcEmptyContent\n\t\t\tv-if=\"loadingResults\"\n\t\t\tclass=\"forms-emptycontent\"\n\t\t\t:name=\"t('forms', 'Loading responses …')\">\n\t\t\t<template #icon>\n\t\t\t\t<NcLoadingIcon :size=\"64\" />\n\t\t\t</template>\n\t\t</NcEmptyContent>\n\n\t\t<!-- Empty search results -->\n\t\t<NcEmptyContent\n\t\t\tv-else-if=\"noFilteredSubmissions && submissionSearch.length > 0\"\n\t\t\t:name=\"t('forms', 'No responses found')\"\n\t\t\tclass=\"forms-emptycontent\"\n\t\t\t:description=\"\n\t\t\t\tt('forms', 'No responses found for \\'{submissionSearch}\\'', {\n\t\t\t\t\tsubmissionSearch,\n\t\t\t\t})\n\t\t\t\">\n\t\t\t<template #icon>\n\t\t\t\t<NcIconSvgWrapper :svg=\"IconPoll\" :size=\"64\" />\n\t\t\t</template>\n\t\t</NcEmptyContent>\n\n\t\t<!-- No submissions -->\n\t\t<NcEmptyContent\n\t\t\tv-else-if=\"noSubmissions\"\n\t\t\t:name=\"t('forms', 'No responses yet')\"\n\t\t\tclass=\"forms-emptycontent\"\n\t\t\t:description=\"t('forms', 'Responses will show up here')\">\n\t\t\t<template #icon>\n\t\t\t\t<NcIconSvgWrapper :svg=\"IconPoll\" :size=\"64\" />\n\t\t\t</template>\n\t\t\t<template #action>\n\t\t\t\t<div class=\"response-actions\">\n\t\t\t\t\t<NcButton variant=\"primary\" @click=\"onShareForm\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<NcIconSvgWrapper :svg=\"IconShareVariant\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ t('forms', 'Share form') }}\n\t\t\t\t\t</NcButton>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t</NcEmptyContent>\n\n\t\t<!-- Summary view for visualization -->\n\t\t<section v-else-if=\"activeResponseView.id === 'summary'\">\n\t\t\t<ResultsSummary\n\t\t\t\tv-for=\"question in questions\"\n\t\t\t\t:key=\"question.id\"\n\t\t\t\t:question=\"question\"\n\t\t\t\t:submissions=\"submissions\" />\n\t\t</section>\n\n\t\t<!-- Responses view for individual responses -->\n\t\t<section v-else>\n\t\t\t<Submission\n\t\t\t\tv-for=\"submission in submissions\"\n\t\t\t\t:key=\"submission.id\"\n\t\t\t\t:formHash=\"form.hash\"\n\t\t\t\t:submission=\"submission\"\n\t\t\t\t:questions=\"questions\"\n\t\t\t\t:highlight=\"submissionSearch\"\n\t\t\t\t:canDeleteSubmission=\"canDeleteSubmission(submission.userId)\"\n\t\t\t\t:canEditSubmission=\"canEditSubmission(submission.userId)\"\n\t\t\t\t@delete=\"deleteSubmission(submission.id)\" />\n\n\t\t\t<PaginationToolbar\n\t\t\t\tv-model:limit=\"limit\"\n\t\t\t\tv-model:offset=\"offset\"\n\t\t\t\tclass=\"bottom-pagination\"\n\t\t\t\t:totalItemsCount=\"filteredSubmissionsCount\" />\n\t\t</section>\n\n\t\t<!-- Confirmation dialog for deleting all submissions -->\n\t\t<NcDialog\n\t\t\tv-model:open=\"showConfirmDeleteDialog\"\n\t\t\t:name=\"t('forms', 'Delete responses')\"\n\t\t\t:message=\"t('forms', 'Are you sure you want to delete all responses?')\"\n\t\t\t:buttons=\"confirmDeleteButtons\" />\n\t</NcAppContent>\n</template>\n\n<script>\nimport IconPoll from '@material-symbols/svg-400/outlined/bar_chart.svg?raw'\nimport IconCancel from '@material-symbols/svg-400/outlined/block.svg?raw'\nimport IconChevronLeft from '@material-symbols/svg-400/outlined/chevron_left.svg?raw'\nimport IconFileDelimited from '@material-symbols/svg-400/outlined/csv.svg?raw'\nimport IconDelete from '@material-symbols/svg-400/outlined/delete.svg?raw'\nimport IconDownload from '@material-symbols/svg-400/outlined/download.svg?raw'\nimport IconFolder from '@material-symbols/svg-400/outlined/folder.svg?raw'\nimport IconLink from '@material-symbols/svg-400/outlined/link.svg?raw'\nimport IconLinkVariantOff from '@material-symbols/svg-400/outlined/link_off.svg?raw'\nimport IconRefresh from '@material-symbols/svg-400/outlined/refresh.svg?raw'\nimport IconMagnify from '@material-symbols/svg-400/outlined/search.svg?raw'\nimport IconShareVariant from '@material-symbols/svg-400/outlined/share.svg?raw'\nimport IconFileExcelOutline from '@material-symbols/svg-400/outlined/table.svg?raw'\nimport IconTable from '@material-symbols/svg-400/outlined/table_chart.svg?raw'\nimport { getCurrentUser, getRequestToken } from '@nextcloud/auth'\nimport axios from '@nextcloud/axios'\nimport { getFilePickerBuilder, showError, showSuccess } from '@nextcloud/dialogs'\nimport { emit } from '@nextcloud/event-bus'\nimport { FileType } from '@nextcloud/files'\nimport moment from '@nextcloud/moment'\nimport { generateOcsUrl, generateUrl } from '@nextcloud/router'\nimport { useIsSmallMobile } from '@nextcloud/vue'\nimport debounce from 'debounce'\nimport NcActionButton from '@nextcloud/vue/components/NcActionButton'\nimport NcActions from '@nextcloud/vue/components/NcActions'\nimport NcActionSeparator from '@nextcloud/vue/components/NcActionSeparator'\nimport NcAppContent from '@nextcloud/vue/components/NcAppContent'\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport NcDialog from '@nextcloud/vue/components/NcDialog'\nimport NcEmptyContent from '@nextcloud/vue/components/NcEmptyContent'\nimport NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'\nimport NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'\nimport NcTextField from '@nextcloud/vue/components/NcTextField'\nimport PaginationToolbar from '../components/PaginationToolbar.vue'\nimport PillMenu from '../components/PillMenu.vue'\nimport ResultsSummary from '../components/Results/ResultsSummary.vue'\nimport Submission from '../components/Results/Submission.vue'\nimport TopBar from '../components/TopBar.vue'\nimport PermissionTypes from '../mixins/PermissionTypes.js'\nimport ViewsMixin from '../mixins/ViewsMixin.js'\nimport answerTypes from '../models/AnswerTypes.js'\nimport { FormState, INPUT_DEBOUNCE_MS } from '../models/Constants.ts'\nimport logger from '../utils/Logger.js'\nimport OcsResponse2Data from '../utils/OcsResponse2Data.js'\nimport SetWindowTitle from '../utils/SetWindowTitle.js'\n\nconst SUPPORTED_FILE_FORMATS = {\n\tods: IconTable,\n\tcsv: IconFileDelimited,\n\txlsx: IconFileExcelOutline,\n}\nlet fileFormat = 'csv'\n\nconst responseViews = [\n\t{\n\t\ttitle: t('forms', 'Summary'),\n\t\tid: 'summary',\n\t},\n\t{\n\t\ttitle: t('forms', 'Responses'),\n\t\tid: 'responses',\n\t},\n]\n\nexport default {\n\t// eslint-disable-next-line vue/multi-word-component-names\n\tname: 'Results',\n\n\tcomponents: {\n\t\tNcActionButton,\n\t\tNcActionSeparator,\n\t\tNcActions,\n\t\tNcAppContent,\n\t\tNcButton,\n\t\tNcDialog,\n\t\tNcIconSvgWrapper,\n\t\tNcTextField,\n\t\tPaginationToolbar,\n\t\tNcEmptyContent,\n\t\tNcLoadingIcon,\n\t\tPillMenu,\n\t\tResultsSummary,\n\t\tSubmission,\n\t\tTopBar,\n\t},\n\n\tmixins: [PermissionTypes, ViewsMixin],\n\temits: ['update:form'],\n\n\tsetup() {\n\t\treturn {\n\t\t\tisMobile: useIsSmallMobile(),\n\n\t\t\t// non reactive props\n\t\t\tresponseViews,\n\n\t\t\tIconChevronLeft,\n\t\t\tIconDelete,\n\t\t\tIconDownload,\n\t\t\tIconFileDelimited,\n\t\t\tIconFileExcelOutline,\n\t\t\tIconFolder,\n\t\t\tIconLink,\n\t\t\tIconLinkVariantOff,\n\t\t\tIconPoll,\n\t\t\tIconRefresh,\n\t\t\tIconShareVariant,\n\t\t\tIconTable,\n\t\t\tIconMagnify,\n\t\t}\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tactiveResponseView: responseViews[0],\n\n\t\t\tquestions: [],\n\t\t\tsubmissions: [],\n\t\t\tfilteredSubmissionsCount: 0,\n\n\t\t\tisDownloadActionOpened: false,\n\t\t\tloadingResults: true,\n\t\t\tskipReloadOnOffsetChange: false,\n\n\t\t\tpicker: null,\n\t\t\tshowConfirmDeleteDialog: false,\n\n\t\t\tsubmissionSearch: '',\n\t\t\tlimit: 20,\n\t\t\toffset: 0,\n\n\t\t\tlinkedFileNotAvailableButtons: [\n\t\t\t\t{\n\t\t\t\t\tlabel: t('forms', 'Unlink spreadsheet'),\n\t\t\t\t\ticon: IconLinkVariantOff,\n\t\t\t\t\tvariant: 'error',\n\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\tthis.onUnlinkFile()\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: t('forms', 'Create spreadsheet'),\n\t\t\t\t\ticon: IconLink,\n\t\t\t\t\tvariant: 'primary',\n\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\tthis.onLinkFile()\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\n\t\t\tconfirmDeleteButtons: [\n\t\t\t\t{\n\t\t\t\t\tlabel: t('forms', 'Cancel'),\n\t\t\t\t\ticon: IconCancel,\n\t\t\t\t\tvariant: 'tertiary',\n\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\tthis.showConfirmDeleteDialog = false\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: t('forms', 'Delete responses'),\n\t\t\t\t\ticon: IconDelete,\n\t\t\t\t\tvariant: 'error',\n\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\tthis.deleteAllSubmissionsConfirmed()\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tisFormArchived() {\n\t\t\treturn this.form.state === FormState.FormArchived\n\t\t},\n\n\t\tcanExportSubmissions() {\n\t\t\treturn this.form.permissions.includes(\n\t\t\t\tthis.PERMISSION_TYPES.PERMISSION_RESULTS,\n\t\t\t)\n\t\t},\n\n\t\tcanDeleteSubmissions() {\n\t\t\treturn (\n\t\t\t\tthis.form.permissions.includes(\n\t\t\t\t\tthis.PERMISSION_TYPES.PERMISSION_RESULTS_DELETE,\n\t\t\t\t) && !this.isFormArchived\n\t\t\t)\n\t\t},\n\n\t\tcanEditForm() {\n\t\t\treturn this.form.permissions.includes(\n\t\t\t\tthis.PERMISSION_TYPES.PERMISSION_EDIT,\n\t\t\t)\n\t\t},\n\n\t\tnoSubmissions() {\n\t\t\treturn this.form?.submissionCount === 0\n\t\t},\n\n\t\tnoFilteredSubmissions() {\n\t\t\treturn this.submissions.length === 0\n\t\t},\n\n\t\t/**\n\t\t * Generate link to linked file\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tfileUrl() {\n\t\t\tif (this.form.fileId) {\n\t\t\t\treturn generateUrl('/f/{fileId}', { fileId: this.form.fileId })\n\t\t\t}\n\t\t\treturn window.location.href\n\t\t},\n\n\t\tshowLinkedFileNotAvailableDialog() {\n\t\t\tif (this.form.partial) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn (\n\t\t\t\tthis.canEditForm\n\t\t\t\t&& this.form.fileId\n\t\t\t\t&& !this.form.filePath\n\t\t\t\t&& !this.isFormLocked\n\t\t\t)\n\t\t},\n\t},\n\n\twatch: {\n\t\t// Reload results when form changes\n\t\tasync hash() {\n\t\t\tawait this.fetchFullForm(this.form.id)\n\t\t\tthis.loadFormResults()\n\t\t\tSetWindowTitle(this.formTitle)\n\t\t},\n\n\t\tlimit() {\n\t\t\tthis.loadFormResults()\n\t\t},\n\n\t\toffset() {\n\t\t\t// Only load results if we're not changing offset from submissionSearch watch\n\t\t\tif (!this.skipReloadOnOffsetChange) {\n\t\t\t\tthis.loadFormResults()\n\t\t\t}\n\t\t},\n\n\t\tsubmissionSearch: debounce(function () {\n\t\t\tthis.skipReloadOnOffsetChange = true\n\t\t\tthis.offset = 0\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis.skipReloadOnOffsetChange = false\n\t\t\t})\n\t\t\tthis.loadFormResults()\n\t\t}, INPUT_DEBOUNCE_MS),\n\t},\n\n\tasync beforeMount() {\n\t\tawait this.fetchFullForm(this.form.id)\n\t\tthis.loadFormResults()\n\t\tSetWindowTitle(this.formTitle)\n\t},\n\n\tmethods: {\n\t\tasync onUnlinkFile() {\n\t\t\tawait axios.patch(\n\t\t\t\tgenerateOcsUrl('apps/forms/api/v3/forms/{formId}', {\n\t\t\t\t\tformId: this.form.id,\n\t\t\t\t}),\n\t\t\t\t{\n\t\t\t\t\tkeyValuePairs: {\n\t\t\t\t\t\tfileId: null,\n\t\t\t\t\t\tfileFormat: null,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t)\n\n\t\t\tconst updatedForm = {\n\t\t\t\t...this.form,\n\t\t\t\tfileFormat: null,\n\t\t\t\tfileId: null,\n\t\t\t\tfilePath: null,\n\t\t\t}\n\t\t\tthis.$emit('update:form', updatedForm)\n\t\t\temit('forms:last-updated:set', this.form.id)\n\t\t},\n\n\t\tasync loadFormResults() {\n\t\t\tthis.loadingResults = true\n\t\t\tlogger.debug(`Loading responses for form ${this.form.hash}`)\n\n\t\t\ttry {\n\t\t\t\tlet response = null\n\t\t\t\tif (this.activeResponseView.id === 'summary') {\n\t\t\t\t\tresponse = await axios.get(\n\t\t\t\t\t\tgenerateOcsUrl('apps/forms/api/v3/forms/{id}/submissions', {\n\t\t\t\t\t\t\tid: this.form.id,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t} else {\n\t\t\t\t\tresponse = await axios.get(\n\t\t\t\t\t\tgenerateOcsUrl(\n\t\t\t\t\t\t\t'apps/forms/api/v3/forms/{id}/submissions?limit={limit}&offset={offset}&query={query}',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: this.form.id,\n\t\t\t\t\t\t\t\tlimit: this.limit,\n\t\t\t\t\t\t\t\toffset: this.offset,\n\t\t\t\t\t\t\t\tquery: this.submissionSearch,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tconst data = OcsResponse2Data(response)\n\n\t\t\t\t// Append questions & submissions\n\t\t\t\tthis.submissions = this.formatDateAnswers(\n\t\t\t\t\tdata.submissions,\n\t\t\t\t\tdata.questions,\n\t\t\t\t)\n\t\t\t\tthis.questions = data.questions\n\t\t\t\tthis.filteredSubmissionsCount = data.filteredSubmissionsCount\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error('Error while loading responses', { error })\n\t\t\t\tshowError(t('forms', 'An error occurred while loading responses'))\n\t\t\t} finally {\n\t\t\t\tthis.loadingResults = false\n\t\t\t}\n\t\t},\n\n\t\tasync onDownloadFile(fileFormat) {\n\t\t\tconst exportUrl =\n\t\t\t\tgenerateOcsUrl('apps/forms/api/v3/forms/{id}/submissions', {\n\t\t\t\t\tid: this.form.id,\n\t\t\t\t})\n\t\t\t\t+ '?requesttoken='\n\t\t\t\t+ encodeURIComponent(getRequestToken())\n\t\t\t\t+ '&fileFormat='\n\t\t\t\t+ fileFormat\n\t\t\twindow.open(exportUrl, '_self')\n\t\t},\n\n\t\tasync onLinkFile() {\n\t\t\ttry {\n\t\t\t\tawait this.getPicker()\n\t\t\t\t\t.pick()\n\t\t\t\t\t.then(async (path) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait axios.patch(\n\t\t\t\t\t\t\t\tgenerateOcsUrl('apps/forms/api/v3/forms/{id}', {\n\t\t\t\t\t\t\t\t\tid: this.form.id,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tkeyValuePairs: {\n\t\t\t\t\t\t\t\t\t\tpath,\n\t\t\t\t\t\t\t\t\t\tfileFormat,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tawait this.fetchFullForm(this.form.id)\n\t\t\t\t\t\t\tawait this.loadFormResults()\n\n\t\t\t\t\t\t\tshowSuccess(\n\t\t\t\t\t\t\t\tt('forms', 'File {file} successfully linked', {\n\t\t\t\t\t\t\t\t\tfile: this.form.filePath.split('/').pop(),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\temit('forms:last-updated:set', this.form.id)\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tlogger.error(\n\t\t\t\t\t\t\t\t'Error while exporting to Files and linking',\n\t\t\t\t\t\t\t\t{ error },\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tshowError(\n\t\t\t\t\t\t\t\tt(\n\t\t\t\t\t\t\t\t\t'forms',\n\t\t\t\t\t\t\t\t\t'There was an error while linking the file',\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t} catch (error) {\n\t\t\t\t// User aborted\n\t\t\t\tlogger.debug('No file selected', { error })\n\t\t\t}\n\t\t},\n\n\t\t// Show Filepicker, then call API to store\n\t\tasync onStoreToFiles() {\n\t\t\ttry {\n\t\t\t\tawait this.getPicker()\n\t\t\t\t\t.pick()\n\t\t\t\t\t.then(async (path) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst response = await axios.post(\n\t\t\t\t\t\t\t\tgenerateOcsUrl(\n\t\t\t\t\t\t\t\t\t'apps/forms/api/v3/forms/{id}/submissions/export',\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tid: this.form.id,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpath,\n\t\t\t\t\t\t\t\t\tfileFormat,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tshowSuccess(\n\t\t\t\t\t\t\t\tt('forms', 'Export successful to {file}', {\n\t\t\t\t\t\t\t\t\tfile: OcsResponse2Data(response),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tlogger.error('Error while exporting to Files', {\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tshowError(\n\t\t\t\t\t\t\t\tt(\n\t\t\t\t\t\t\t\t\t'forms',\n\t\t\t\t\t\t\t\t\t'There was an error while exporting to Files',\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t} catch (error) {\n\t\t\t\t// User aborted\n\t\t\t\tlogger.debug('No file selected', { error })\n\t\t\t}\n\t\t},\n\n\t\tasync onReExport() {\n\t\t\tif (!this.form.fileId) {\n\t\t\t\t// Theoretically this will never fire\n\t\t\t\tshowError(t('forms', 'File is not linked'))\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst response = await axios.post(\n\t\t\t\t\tgenerateOcsUrl(\n\t\t\t\t\t\t'apps/forms/api/v3/forms/{id}/submissions/export',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: this.form.id,\n\t\t\t\t\t\t},\n\t\t\t\t\t),\n\t\t\t\t\t{\n\t\t\t\t\t\tpath: this.form.filePath,\n\t\t\t\t\t\tfileFormat: this.form.fileFormat,\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tshowSuccess(\n\t\t\t\t\tt('forms', 'Export successful to {file}', {\n\t\t\t\t\t\tfile: OcsResponse2Data(response),\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error('Error while exporting to Files', { error })\n\t\t\t\tshowError(t('forms', 'There was an error, while exporting to Files'))\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Determines if a submission can be deleted.\n\t\t *\n\t\t * @param {string} submissionUser - The ID of the user who created the submission.\n\t\t * @return {boolean} - Returns true if the submission can be deleted, otherwise false.\n\t\t *                      A submission can be deleted if:\n\t\t *                      - The user has the `canDeleteSubmissions` permission, or\n\t\t *                      - The form allows editing (`form.allowEditSubmissions`) and the current user is the owner of the submission.\n\t\t */\n\t\tcanDeleteSubmission(submissionUser) {\n\t\t\treturn (\n\t\t\t\tthis.canDeleteSubmissions\n\t\t\t\t|| (this.form.allowEditSubmissions\n\t\t\t\t\t&& getCurrentUser().uid === submissionUser)\n\t\t\t)\n\t\t},\n\n\t\t/**\n\t\t * Determines if a submission can be edited.\n\t\t *\n\t\t * @param {string} submissionUser - The ID of the user who created the submission.\n\t\t * @return {boolean} - Returns true if the submission can be edited, otherwise false.\n\t\t */\n\t\tcanEditSubmission(submissionUser) {\n\t\t\treturn (\n\t\t\t\tthis.form.allowEditSubmissions\n\t\t\t\t&& getCurrentUser().uid === submissionUser\n\t\t\t)\n\t\t},\n\n\t\tasync deleteSubmission(id) {\n\t\t\tthis.loadingResults = true\n\n\t\t\ttry {\n\t\t\t\tawait axios.delete(\n\t\t\t\t\tgenerateOcsUrl(\n\t\t\t\t\t\t'apps/forms/api/v3/forms/{id}/submissions/{submissionId}',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: this.form.id,\n\t\t\t\t\t\t\tsubmissionId: id,\n\t\t\t\t\t\t},\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\tshowSuccess(t('forms', 'Response deleted'))\n\t\t\t\tconst index = this.submissions.findIndex(\n\t\t\t\t\t(search) => search.id === id,\n\t\t\t\t)\n\t\t\t\tthis.submissions.splice(index, 1)\n\t\t\t\temit('forms:last-updated:set', this.form.id)\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(`Error while deleting response ${id}`, { error })\n\t\t\t\tshowError(\n\t\t\t\t\tt('forms', 'An error occurred while deleting this response'),\n\t\t\t\t)\n\t\t\t} finally {\n\t\t\t\tthis.loadingResults = false\n\t\t\t}\n\t\t},\n\n\t\tdeleteAllSubmissions() {\n\t\t\tthis.showConfirmDeleteDialog = true\n\t\t},\n\n\t\tasync deleteAllSubmissionsConfirmed() {\n\t\t\tthis.showConfirmDeleteDialog = false\n\t\t\tthis.loadingResults = true\n\t\t\ttry {\n\t\t\t\tawait axios.delete(\n\t\t\t\t\tgenerateOcsUrl('apps/forms/api/v3/forms/{id}/submissions', {\n\t\t\t\t\t\tid: this.form.id,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\tthis.submissions = []\n\t\t\t\tthis.form.submissionCount = 0\n\t\t\t\temit('forms:last-updated:set', this.form.id)\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error('Error while deleting responses', { error })\n\t\t\t\tshowError(t('forms', 'An error occurred while deleting responses'))\n\t\t\t} finally {\n\t\t\t\tthis.loadingResults = false\n\t\t\t}\n\t\t},\n\n\t\tformatDateAnswers(submissions, questions) {\n\t\t\t// Filter questions that are date/datetime/time\n\t\t\tconst dateQuestions = Object.fromEntries(\n\t\t\t\tquestions\n\t\t\t\t\t.filter(\n\t\t\t\t\t\t(question) =>\n\t\t\t\t\t\t\t(question.type === 'date')\n\t\t\t\t\t\t\t| (question.type === 'datetime')\n\t\t\t\t\t\t\t| (question.type === 'time'),\n\t\t\t\t\t)\n\t\t\t\t\t.map((question) => [question.id, question.type]),\n\t\t\t)\n\n\t\t\t// Go through submissions and reformat answers to date/time questions\n\t\t\tsubmissions.forEach((submission) => {\n\t\t\t\tsubmission.answers\n\t\t\t\t\t.filter((answer) => answer.questionId in dateQuestions)\n\t\t\t\t\t.forEach((answer) => {\n\t\t\t\t\t\tconst date = moment(\n\t\t\t\t\t\t\tanswer.text,\n\t\t\t\t\t\t\tanswerTypes[dateQuestions[answer.questionId]]\n\t\t\t\t\t\t\t\t.storageFormat,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tif (date.isValid()) {\n\t\t\t\t\t\t\tanswer.text = date.format(\n\t\t\t\t\t\t\t\tanswerTypes[dateQuestions[answer.questionId]]\n\t\t\t\t\t\t\t\t\t.momentFormat,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t})\n\n\t\t\treturn submissions\n\t\t},\n\n\t\tgetPicker() {\n\t\t\tif (this.picker !== null) {\n\t\t\t\treturn this.picker\n\t\t\t}\n\n\t\t\tthis.picker = getFilePickerBuilder(\n\t\t\t\tt('forms', 'Choose spreadsheet location'),\n\t\t\t)\n\t\t\t\t.setMultiSelect(false)\n\t\t\t\t.allowDirectories(true)\n\t\t\t\t.setCanPick((node) => {\n\t\t\t\t\tif (node.type === FileType.Folder) {\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\n\t\t\t\t\tconst extension = node.extension?.slice(1).toLowerCase()\n\t\t\t\t\treturn !!extension && extension in SUPPORTED_FILE_FORMATS\n\t\t\t\t})\n\t\t\t\t.setButtonFactory((selectedNodes) => {\n\t\t\t\t\tconst [node] = selectedNodes\n\t\t\t\t\tif (node && node.type === FileType.File) {\n\t\t\t\t\t\tconst extension = node.extension?.slice(1).toLowerCase()\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: t('forms', 'Select {file}', {\n\t\t\t\t\t\t\t\t\tfile: selectedNodes[0].basename,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\ticon: SUPPORTED_FILE_FORMATS[extension],\n\t\t\t\t\t\t\t\tcallback() {\n\t\t\t\t\t\t\t\t\tfileFormat = extension\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tvariant: 'primary',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]\n\t\t\t\t\t}\n\n\t\t\t\t\t// no node selected (pick current folder) or folder selected\n\t\t\t\t\treturn [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlabel: t('forms', 'Create XLSX'),\n\t\t\t\t\t\t\ticon: IconFileExcelOutline,\n\t\t\t\t\t\t\tcallback() {\n\t\t\t\t\t\t\t\tfileFormat = 'xlsx'\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tvariant: 'secondary',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlabel: t('forms', 'Create CSV'),\n\t\t\t\t\t\t\ticon: IconFileDelimited,\n\t\t\t\t\t\t\tcallback() {\n\t\t\t\t\t\t\t\tfileFormat = 'csv'\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tvariant: 'secondary',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlabel: t('forms', 'Create ODS'),\n\t\t\t\t\t\t\ticon: IconTable,\n\t\t\t\t\t\t\tcallback() {\n\t\t\t\t\t\t\t\tfileFormat = 'ods'\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tvariant: 'primary',\n\t\t\t\t\t\t},\n\t\t\t\t\t]\n\t\t\t\t})\n\t\t\t\t.build()\n\n\t\t\treturn this.picker\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.forms-emptycontent {\n\theight: 100%;\n}\n\n.app-content {\n\tdisplay: flex;\n\talign-items: center;\n\tflex-direction: column;\n\n\theader,\n\tsection {\n\t\twidth: 100%;\n\t\tmax-width: 750px;\n\t}\n\n\t// Title & description header\n\theader {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tmargin-block-end: 24px;\n\t\tmargin-inline-start: 40px;\n\n\t\th2 {\n\t\t\tmargin-block-end: 0; // because the input field has enough padding\n\t\t\tfont-size: 28px;\n\t\t\tfont-weight: bold;\n\t\t\tmargin-block-start: 32px;\n\t\t\tpadding-inline-start: 14px;\n\t\t\tpadding-block-end: 8px;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\twhite-space: nowrap;\n\t\t}\n\n\t\tp {\n\t\t\tpadding-inline-start: 14px;\n\t\t}\n\t}\n\n\t.response-actions {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t\talign-items: center;\n\t\tmargin-block-start: 8px;\n\t\tmargin-inline-start: 8px;\n\t\tpadding-inline-start: calc(14px - var(--border-radius-pill));\n\n\t\t&__toggle {\n\t\t\tmargin-inline-end: 1em;\n\t\t}\n\t}\n}\n\n.search-wrapper {\n\tmargin-block-start: calc(-1 * var(--default-grid-baseline));\n\tmargin-inline-start: auto;\n\tmargin-inline-end: var(--default-clickable-area);\n}\n\n.bottom-pagination {\n\tmargin-bottom: 24px;\n}\n</style>\n"],"names":["IconFileDelimited","IconDownload","IconFolder","IconLink","IconLinkVariantOff","IconMagnify","IconFileExcelOutline","IconTable","IconChevronRight","PageFirstIcon","PageLastIcon","_sfc_main","NcIconSvgWrapper","NcButton","NcSelect","IconChevronLeft","value","index","pageNumber","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_openBlock","_createElementBlock","_createElementVNode","_createVNode","_component_NcButton","$options","_ctx","_component_NcIconSvgWrapper","$setup","_component_NcSelect","$event","_withCtx","option","_toDisplayString","_cache","IconFile","answerTypes","label","GridCellType","labelLowest","labelHighest","optionsLowest","optionsHighest","descriptionParts","description","questionOptionsStats","_","i","submission","answers","answer","optionsStatIndex","object1","object2","questionOptionsStat","maxCount","n","stats","opt","a","optionId","result","s","b","best","o","OptionType","matrix","row","column","answerJson","rowId","columnId","totalAnswersCount","cell","answersModels","noResponseCount","generateUrl","noResponsePercentage","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_11","_hoisted_14","_hoisted_15","$props","_Fragment","_renderList","_normalizeClass","$data","_hoisted_9","_hoisted_13","_hoisted_16","_hoisted_18","_normalizeStyle","_createTextVNode","NcCheckboxRadioSwitch","NcHighlight","_component_NcHighlight","_createBlock","_component_NcCheckboxRadioSwitch","Answer","NcActions","NcActionButton","NcActionRouter","IconDelete","IconPencil","moment","answeredQuestionsArray","question","optionsPerId","squashedAnswers","gridValue","key","id","event","selection","fragment","text","node","tag","children","child","trimmed","args","_component_NcActions","_component_NcActionRouter","_component_NcActionButton","_component_Answer","SUPPORTED_FILE_FORMATS","fileFormat","responseViews","NcActionSeparator","NcAppContent","NcDialog","NcTextField","PaginationToolbar","NcEmptyContent","NcLoadingIcon","PillMenu","ResultsSummary","Submission","TopBar","PermissionTypes","ViewsMixin","useIsSmallMobile","IconPoll","IconRefresh","IconShareVariant","IconCancel","FormState","SetWindowTitle","debounce","INPUT_DEBOUNCE_MS","axios","generateOcsUrl","updatedForm","emit","logger","response","data","OcsResponse2Data","error","showError","exportUrl","getRequestToken","path","showSuccess","submissionUser","getCurrentUser","search","submissions","questions","dateQuestions","date","getFilePickerBuilder","FileType","extension","selectedNodes","_component_NcAppContent","_component_NcDialog","_component_TopBar","_component_PillMenu","_component_NcActionSeparator","_component_NcTextField","_component_NcEmptyContent","_component_NcLoadingIcon","_component_ResultsSummary","_component_Submission","_component_PaginationToolbar"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10]}