attendances.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. <template>
  2. <LayoutContainer>
  3. <UiLoadingPanel v-if="pending" />
  4. <UiForm
  5. v-else-if="parameters !== null"
  6. :model="Parameters"
  7. :entity="parameters"
  8. action-position="bottom"
  9. >
  10. <v-row>
  11. <v-col cols="12">
  12. <UiInputCheckbox
  13. v-model="parameters.sendAttendanceEmail"
  14. field="sendAttendanceEmail"
  15. label="sendAttendanceEmail"
  16. />
  17. <UiInputCheckbox
  18. v-model="parameters.sendAttendanceSms"
  19. field="sendAttendanceSms"
  20. />
  21. <UiInputCheckbox
  22. v-model="parameters.notifyAdministrationAbsence"
  23. field="notifyAdministrationAbsence"
  24. />
  25. </v-col>
  26. </v-row>
  27. </UiForm>
  28. <v-divider class="my-10" />
  29. <UiLoadingPanel v-if="attendanceBookingReasonsPending" />
  30. <div v-else>
  31. <v-table>
  32. <thead>
  33. <tr>
  34. <td>{{ $t('attendanceBookingReasons') }}</td>
  35. <td></td>
  36. </tr>
  37. </thead>
  38. <tbody v-if="attendanceBookingReasons.length > 0">
  39. <tr v-for="reason in attendanceBookingReasons" :key="reason.id">
  40. <td class="cycle-editable-cell">
  41. {{ reason.reason }}
  42. </td>
  43. <td class="d-flex flex-row">
  44. <v-btn
  45. :flat="true"
  46. icon="fa fa-pen"
  47. class="cycle-edit-icon mr-3"
  48. @click="goToEditPage(reason.id as number)"
  49. />
  50. <UiButtonDelete
  51. :model="AttendanceBookingReason"
  52. :entity="reason"
  53. :flat="true"
  54. class="cycle-edit-icon"
  55. />
  56. </td>
  57. </tr>
  58. </tbody>
  59. <tbody v-else>
  60. <tr class="theme-neutral">
  61. <td>
  62. <i>{{ $t('nothing_to_show') }}</i>
  63. </td>
  64. <td></td>
  65. </tr>
  66. </tbody>
  67. </v-table>
  68. <v-btn
  69. :flat="true"
  70. prepend-icon="fa fa-plus"
  71. class="theme-primary mt-4"
  72. @click="goToCreatePage"
  73. >
  74. {{ $t('add') }}
  75. </v-btn>
  76. </div>
  77. </LayoutContainer>
  78. </template>
  79. <script setup lang="ts">
  80. import type { AsyncData } from '#app'
  81. import { type Collection, useRepo } from 'pinia-orm'
  82. import type { ComputedRef } from 'vue'
  83. import Parameters from '~/models/Organization/Parameters'
  84. import { useEntityFetch } from '~/composables/data/useEntityFetch'
  85. import { useOrganizationProfileStore } from '~/stores/organizationProfile'
  86. import UrlUtils from '~/services/utils/urlUtils'
  87. import AttendanceBookingReason from '~/models/Booking/AttendanceBookingReason'
  88. import AttendanceBookingReasonRepository from '~/stores/repositories/AttendanceBookingReasonRepository'
  89. const { fetch } = useEntityFetch()
  90. const organizationProfile = useOrganizationProfileStore()
  91. if (organizationProfile.parametersId === null) {
  92. throw new Error('Missing organization parameters id')
  93. }
  94. const { data: parameters, pending } = fetch(
  95. Parameters,
  96. organizationProfile.parametersId,
  97. ) as AsyncData<Parameters | null, Error | null>
  98. const { fetchCollection } = useEntityFetch()
  99. const { pending: attendanceBookingReasonsPending } = fetchCollection(
  100. AttendanceBookingReason,
  101. )
  102. const attendanceBookingReasonsRepo = useRepo(AttendanceBookingReasonRepository)
  103. /**
  104. * On récupère les timings via le store
  105. * (sans ça, les mises à jour SSE ne seront pas prises en compte)
  106. */
  107. const attendanceBookingReasons: ComputedRef<
  108. Collection<AttendanceBookingReason>
  109. > = computed(() => {
  110. return attendanceBookingReasonsRepo.getReasons()
  111. })
  112. const goToEditPage = (id: number) => {
  113. navigateTo(UrlUtils.join('/parameters/attendance_booking_reasons', id))
  114. }
  115. const goToCreatePage = () => {
  116. navigateTo('/parameters/attendance_booking_reasons/new')
  117. }
  118. </script>