Edition.vue 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <template>
  2. <LayoutContainer>
  3. <UiLoadingPanel v-if="status == FETCHING_STATUS.PENDING" />
  4. <UiForm v-else v-model="entity" :submit-actions="submitActions">
  5. <template #form.button>
  6. <v-btn v-if="goBackRoute" class="theme-neutral mr-3" @click="quit">
  7. {{ $t('cancel') }}
  8. </v-btn>
  9. </template>
  10. <slot v-bind="{ model, entity }" />
  11. </UiForm>
  12. </LayoutContainer>
  13. </template>
  14. <script setup lang="ts" generic="T extends typeof ApiModel">
  15. import { useRoute } from 'vue-router'
  16. import type { RouteLocationRaw } from 'vue-router'
  17. import type ApiModel from '~/models/ApiModel'
  18. import type { AnyJson } from '~/types/data'
  19. import { SUBMIT_TYPE } from '~/types/enum/enums'
  20. import { useEntityFetch } from '~/composables/data/useEntityFetch'
  21. import { FETCHING_STATUS } from '~/types/enum/data'
  22. const props = withDefaults(
  23. defineProps<{
  24. model: T
  25. /**
  26. * Id de l'objet
  27. * Si non renseigné, le composant essaiera de l'extraire de la route actuelle
  28. */
  29. id?: number | null
  30. /**
  31. * Route de retour
  32. */
  33. goBackRoute?: RouteLocationRaw | null
  34. /**
  35. * La validation est en cours
  36. */
  37. validationPending?: boolean
  38. /**
  39. * Faut-il rafraîchir le profil à la soumission du formulaire ?
  40. */
  41. refreshProfile?: boolean
  42. }>(),
  43. {
  44. id: null,
  45. goBackRoute: null,
  46. validationPending: false,
  47. refreshProfile: false,
  48. },
  49. )
  50. const { fetch } = useEntityFetch()
  51. const route = useRoute()
  52. const router = useRouter()
  53. const entityId =
  54. props.id !== null ? props.id : parseInt(route.params.id as string)
  55. const { data: entity, status } = fetch(props.model, entityId)
  56. const submitActions = computed(() => {
  57. const actions: AnyJson = {}
  58. if (props.goBackRoute !== null) {
  59. actions[SUBMIT_TYPE.SAVE_AND_BACK] = props.goBackRoute
  60. } else {
  61. actions[SUBMIT_TYPE.SAVE] = null
  62. }
  63. return actions
  64. })
  65. const quit = () => {
  66. if (!props.goBackRoute) {
  67. throw new Error('no go back route defined')
  68. }
  69. router.push(props.goBackRoute)
  70. }
  71. // Nettoyer les données lors du démontage du composant
  72. onBeforeUnmount(() => {
  73. // Nettoyer les références du store si nécessaire
  74. if (import.meta.client) {
  75. clearNuxtData('/^' + props.model.entity + '_' + props.id + '_/')
  76. useRepo(props.model).flush()
  77. // Forcer le garbage collection des objets Parameters
  78. entity.value = null
  79. }
  80. })
  81. </script>
  82. <style scoped lang="scss"></style>