Teaching.vue 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. <template>
  2. <LayoutContainer>
  3. <UiLoadingPanel v-if="pending" />
  4. <UiForm
  5. v-else
  6. :model="Parameters"
  7. :entity="parameters"
  8. >
  9. <v-table>
  10. <thead>
  11. <tr>
  12. <td>{{ $t('originalLabel') }}</td>
  13. <td>{{ $t('effectiveLabel') }}</td>
  14. </tr>
  15. </thead>
  16. <tbody>
  17. <tr v-for="enumItem in cycleEnum">
  18. <td>{{ $t(enumItem.value) }}</td>
  19. <td class="cycle-editable-cell">
  20. {{ orderedCycles[enumItem.value] ? orderedCycles[enumItem.value].label : $t(enumItem.value) }}
  21. </td>
  22. <td style="max-width: 24px;">
  23. <v-btn
  24. :flat="true"
  25. icon="fa fa-pen"
  26. class="cycle-edit-icon"
  27. @click="orderedCycles[enumItem.value] ? goToCycleEditPage(orderedCycles[enumItem.value].id) : goToCycleCreatePage(enumItem.value)"
  28. />
  29. </td>
  30. </tr>
  31. </tbody>
  32. </v-table>
  33. <v-row>
  34. <v-col cols="6">
  35. <UiInputCheckbox
  36. v-model="parameters.showEducationIsACollectivePractice"
  37. field="showEducationIsACollectivePractice"
  38. label="allow_to_configure_teachings_with_played_instrument_choice"
  39. />
  40. </v-col>
  41. </v-row>
  42. </UiForm>
  43. </LayoutContainer>
  44. </template>
  45. <script setup lang="ts">
  46. import Parameters from "~/models/Organization/Parameters";
  47. import {useEntityFetch} from "~/composables/data/useEntityFetch";
  48. import Cycle from "~/models/Education/Cycle";
  49. import {AsyncData} from "#app";
  50. import {useOrganizationProfileStore} from "~/stores/organizationProfile";
  51. import {AnyJson} from "~/types/data";
  52. import {useEnumFetch} from "~/composables/data/useEnumFetch";
  53. const organizationProfile = useOrganizationProfileStore()
  54. if (organizationProfile.parametersId === null) {
  55. throw new Error('Missing organization parameters id')
  56. }
  57. const { fetch, fetchCollection } = useEntityFetch()
  58. const { fetch: fetchEnum } = useEnumFetch()
  59. const { data: cycleEnum, pending: enumPending } = fetchEnum('education_cycle')
  60. const { data: parameters, pending: parametersPending } = fetch(Parameters, organizationProfile.parametersId) as AsyncData<Parameters, Parameters | true>
  61. const { data: cycles, pending: cyclesPending } = fetchCollection(Cycle)
  62. const pending: ComputedRef<boolean> = computed(() => enumPending.value || parametersPending.value || cyclesPending.value)
  63. const orderedCycles: ComputedRef<AnyJson> = computed(() => {
  64. if (pending.value) {
  65. return []
  66. }
  67. let orderedCycles: AnyJson = {}
  68. for (const enumItem of cycleEnum.value) {
  69. orderedCycles[enumItem.value] = null
  70. }
  71. for (const cycle of cycles.value.items) {
  72. if (!orderedCycles.hasOwnProperty(cycle.cycleEnum)) {
  73. console.error('Unknown cycle enum : ' + cycle.cycleEnum)
  74. continue
  75. }
  76. orderedCycles[cycle.cycleEnum] = cycle
  77. }
  78. return orderedCycles
  79. })
  80. const goToCycleEditPage = (id: number) => {
  81. navigateTo(`parameters/cycles/${id}`)
  82. }
  83. const goToCycleCreatePage = (cycleEnumItem: string) => {
  84. navigateTo(`parameters/cycles/new?cycleEnum=` + cycleEnumItem)
  85. }
  86. </script>
  87. <style scoped lang="scss">
  88. .cycle-edit-icon {
  89. color: rgb(var(--v-theme-primary));
  90. }
  91. :deep(.cycle-edit-icon .v-icon) {
  92. font-size: 18px;
  93. }
  94. </style>