diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue b/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue index 7ab16ac1136f5c2c420ca1d3d5f57139c5fc36d5..ecf771d40c7bba48bc9daec58248e853c3379181 100644 --- a/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue +++ b/aleksis/apps/alsijil/frontend/components/coursebook/Coursebook.vue @@ -38,6 +38,7 @@ <absence-reason-buttons allow-empty empty-value="present" + :custom-absence-reasons="absenceReasons" @input="handleMultipleAction" /> </v-col> @@ -51,6 +52,7 @@ <component :is="itemComponent" :extra-marks="extraMarks" + :absence-reasons="absenceReasons" :documentation="item" :affected-query="lastQuery" :value="(selectedParticipations[item.id] ??= [])" @@ -84,6 +86,7 @@ import AbsenceCreationDialog from "./absences/AbsenceCreationDialog.vue"; import { extraMarks } from "../extra_marks/extra_marks.graphql"; import DocumentationLoader from "./documentation/DocumentationLoader.vue"; import sendToServerMixin from "./absences/sendToServerMixin"; +import { absenceReasons } from "./absences/absenceReasons.graphql"; export default { name: "Coursebook", @@ -153,6 +156,7 @@ export default { currentDate: "", hashUpdater: false, extraMarks: [], + absenceReasons: [], selectedParticipations: {}, }; }, @@ -161,6 +165,10 @@ export default { query: extraMarks, update: (data) => data.items, }, + absenceReasons: { + query: absenceReasons, + update: (data) => data.items, + }, }, computed: { // Assertion: Should only fire on page load or selection change. diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/DocumentationAbsencesModal.vue b/aleksis/apps/alsijil/frontend/components/coursebook/absences/DocumentationAbsencesModal.vue index 1e092b4ee14c410f5f5a0f04cc8bec9e57c2a6c3..f639e731da82cd400c1d2b5cbba8dbc90da8d70e 100644 --- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/DocumentationAbsencesModal.vue +++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/DocumentationAbsencesModal.vue @@ -7,6 +7,8 @@ <documentation-absences compact v-bind="$attrs" + :extra-marks="extraMarks" + :absence-reasons="absenceReasons" :dialog-activator="activator" :value="value" @input="$emit('input', $event)" @@ -14,7 +16,12 @@ </template> <!-- dialog view -> deactivate dialog --> <!-- cancel | save (through lesson-summary) --> - <documentation v-bind="$attrs" @close="popup = false" /> + <documentation + v-bind="$attrs" + :extra-marks="extraMarks" + :absence-reasons="absenceReasons" + @close="popup = false" + /> </mobile-fullscreen-dialog> </template> @@ -40,6 +47,14 @@ export default { type: Array, required: true, }, + extraMarks: { + type: Array, + required: true, + }, + absenceReasons: { + type: Array, + required: true, + }, }, }; </script> diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsDialog.vue b/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsDialog.vue index d8f001d31df8c67833ab2c43f3aaefbf71b40e4d..7f96c23967989239d6440071ed1a6fc55d4d1052 100644 --- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsDialog.vue +++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/ManageStudentsDialog.vue @@ -179,9 +179,9 @@ export default { <v-card-text> <absence-reason-group-select allow-empty - empty-value="present" :load-selected-chip="loading" :value="item.absenceReason?.id || 'present'" + :custom-absence-reasons="absenceReasons" @input="sendToServer([item], 'absenceReason', $event)" /> <tardiness-field @@ -212,6 +212,7 @@ export default { <absence-reason-buttons allow-empty empty-value="present" + :custom-absence-reasons="absenceReasons" @input="handleMultipleAction" /> </div> diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/ParticipationList.vue b/aleksis/apps/alsijil/frontend/components/coursebook/absences/ParticipationList.vue index 1c941b8dd3cb362232dd0c79080e5237d632c7c2..dd84e644a78059284cdc338b6cd899f96a36066c 100644 --- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/ParticipationList.vue +++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/ParticipationList.vue @@ -26,8 +26,8 @@ import AbsenceReasonGroupSelect from "aleksis.apps.kolego/components/AbsenceReas v-if="participation.absenceReason && !compact" class="full-width" allow-empty - empty-value="present" :load-selected-chip="loading" + :custom-absence-reasons="absenceReasons" :value="participation.absenceReason?.id || 'present'" @input="sendToServer([participation], 'absenceReason', $event)" /> @@ -35,8 +35,8 @@ import AbsenceReasonGroupSelect from "aleksis.apps.kolego/components/AbsenceReas <v-list-item-action v-if="participation.absenceReason && compact"> <absence-reason-group-select allow-empty - empty-value="present" :load-selected-chip="loading" + :custom-absence-reasons="absenceReasons" :value="participation.absenceReason?.id || 'present'" @input="sendToServer([participation], 'absenceReason', $event)" /> diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/absenceReasons.graphql b/aleksis/apps/alsijil/frontend/components/coursebook/absences/absenceReasons.graphql new file mode 100644 index 0000000000000000000000000000000000000000..2a651a968265d18fa4f35a6550970d14de26885e --- /dev/null +++ b/aleksis/apps/alsijil/frontend/components/coursebook/absences/absenceReasons.graphql @@ -0,0 +1,11 @@ +query absenceReasons($orderBy: [String], $filters: JSONString) { + items: absenceReasons(orderBy: $orderBy, filters: $filters) { + id + shortName + name + colour + default + canEdit + canDelete + } +} diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationModal.vue b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationModal.vue index a679830c89c0b3fd77a5d712efaea5931b24332c..177e886f5b7d8e73eb66299738366e9cb22f496a 100644 --- a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationModal.vue +++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/DocumentationModal.vue @@ -9,6 +9,7 @@ v-bind="$attrs" :dialog-activator="activator" :extra-marks="extraMarks" + :absence-reasons="absenceReasons" /> </template> <!-- dialog view -> deactivate dialog --> @@ -16,6 +17,7 @@ <documentation v-bind="$attrs" :extra-marks="extraMarks" + :absence-reasons="absenceReasons" @close="popup = false" /> </mobile-fullscreen-dialog> @@ -41,6 +43,10 @@ export default { type: Array, required: true, }, + absenceReasons: { + type: Array, + required: true, + }, }, }; </script> diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/documentationPartMixin.js b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/documentationPartMixin.js index 35243ee3ca5e055c0d2fd5375fba614bbbd6e246..886803b433be0a1372cf2bd27620700b49d24f2f 100644 --- a/aleksis/apps/alsijil/frontend/components/coursebook/documentation/documentationPartMixin.js +++ b/aleksis/apps/alsijil/frontend/components/coursebook/documentation/documentationPartMixin.js @@ -40,6 +40,13 @@ export default { type: Array, required: true, }, + /** + * Once loaded list of absence reasons to avoid excessive network and database queries + */ + absenceReasons: { + type: Array, + required: true, + }, }, computed: { @@ -54,6 +61,7 @@ export default { dialogActivator: this.dialogActivator, affectedQuery: this.affectedQuery, extraMarks: this.extraMarks, + absenceReasons: this.absenceReasons, }; }, },