index.vue 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. <template>
  2. <LayoutContainer>
  3. <UiLoadingPanel v-if="pending" />
  4. <div v-else>
  5. <v-table>
  6. <thead>
  7. <tr>
  8. <td>{{ $t('educationTimings') }}</td>
  9. <td></td>
  10. </tr>
  11. </thead>
  12. <tbody v-if="educationTimings.length > 0">
  13. <tr v-for="timing in educationTimings" :key="timing.id">
  14. <td class="cycle-editable-cell">
  15. {{ timing.timing }}
  16. </td>
  17. <td class="d-flex flex-row">
  18. <v-btn
  19. :flat="true"
  20. icon="fa fa-pen"
  21. class="cycle-edit-icon mr-3"
  22. @click="goToEditPage(timing.id as number)"
  23. />
  24. <UiButtonDelete
  25. :model="EducationTiming"
  26. :entity="timing"
  27. :flat="true"
  28. class="cycle-edit-icon"
  29. />
  30. </td>
  31. </tr>
  32. </tbody>
  33. <tbody v-else>
  34. <tr class="theme-neutral">
  35. <td>
  36. <i>{{ $t('nothing_to_show') }}</i>
  37. </td>
  38. <td></td>
  39. </tr>
  40. </tbody>
  41. </v-table>
  42. <v-btn
  43. :flat="true"
  44. prepend-icon="fa fa-plus"
  45. class="theme-primary mt-4"
  46. @click="goToCreatePage"
  47. >
  48. {{ $t('add') }}
  49. </v-btn>
  50. </div>
  51. </LayoutContainer>
  52. </template>
  53. <script setup lang="ts">
  54. import { useRepo } from 'pinia-orm'
  55. import type { ComputedRef } from 'vue'
  56. import { useEntityFetch } from '~/composables/data/useEntityFetch'
  57. import EducationTiming from '~/models/Education/EducationTiming'
  58. import EducationTimingsRepository from '~/stores/repositories/EducationTimingsRepository'
  59. import { useOrganizationProfileStore } from '~/stores/organizationProfile'
  60. import UrlUtils from '~/services/utils/urlUtils'
  61. definePageMeta({
  62. name: 'parameters_education_timings_page',
  63. })
  64. const organizationProfile = useOrganizationProfileStore()
  65. if (organizationProfile.parametersId === null) {
  66. throw new Error('Missing organization parameters id')
  67. }
  68. const { fetchCollection } = useEntityFetch()
  69. const { pending } = fetchCollection(EducationTiming)
  70. const educationTimingRepo = useRepo(EducationTimingsRepository)
  71. /**
  72. * On récupère les timings via le store
  73. * (sans ça, les mises à jour SSE ne seront pas prises en compte)
  74. */
  75. const educationTimings: ComputedRef<Array<EducationTiming>> = computed(() => {
  76. return educationTimingRepo.getEducationTimings()
  77. })
  78. const goToEditPage = (id: number) => {
  79. navigateTo(UrlUtils.join('/parameters/education_timings', id))
  80. }
  81. const goToCreatePage = () => {
  82. navigateTo('/parameters/education_timings/new')
  83. }
  84. </script>
  85. <style scoped lang="scss">
  86. .v-table {
  87. width: 100%;
  88. max-width: 800px;
  89. }
  90. // TODO: voir à factoriser ces styles, ptêt en faisant un component de ces boutons?
  91. :deep(.cycle-edit-icon .v-icon) {
  92. color: rgb(var(--v-theme-primary));
  93. font-size: 18px;
  94. }
  95. </style>