Edition.vue 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <template>
  2. <LayoutContainer>
  3. <UiLoadingPanel v-if="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. const props = withDefaults(defineProps<{
  22. model: T
  23. /**
  24. * Id de l'objet
  25. * Si non renseigné, le composant essaiera de l'extraire de la route actuelle
  26. */
  27. id?: number | null
  28. /**
  29. * Route de retour
  30. */
  31. goBackRoute?: RouteLocationRaw | null
  32. /**
  33. * La validation est en cours
  34. */
  35. validationPending?: boolean
  36. /**
  37. * Faut-il rafraîchir le profil à la soumission du formulaire ?
  38. */
  39. refreshProfile?: boolean
  40. }>(), {
  41. id: null,
  42. goBackRoute: null,
  43. validationPending: false,
  44. refreshProfile: false
  45. })
  46. const { fetch } = useEntityFetch()
  47. const route = useRoute()
  48. const router = useRouter()
  49. const entityId =
  50. props.id !== null ? props.id : parseInt(route.params.id as string)
  51. const { data: entity, status } = fetch(props.model, entityId)
  52. const submitActions = computed(() => {
  53. const actions: AnyJson = {}
  54. if (props.goBackRoute !== null) {
  55. actions[SUBMIT_TYPE.SAVE_AND_BACK] = props.goBackRoute
  56. } else {
  57. actions[SUBMIT_TYPE.SAVE] = null
  58. }
  59. return actions
  60. })
  61. const quit = () => {
  62. if (!props.goBackRoute) {
  63. throw new Error('no go back route defined')
  64. }
  65. router.push(props.goBackRoute)
  66. }
  67. // Nettoyer les données lors du démontage du composant
  68. onBeforeUnmount(() => {
  69. // Nettoyer les références du store si nécessaire
  70. if (process.client) {
  71. clearNuxtData('/^' + props.model.entity + '_' + props.id + '_/')
  72. useRepo(props.model).flush()
  73. // Forcer le garbage collection des objets Parameters
  74. entity.value = null
  75. }
  76. })
  77. </script>
  78. <style scoped lang="scss"></style>