Creation.vue 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. <template>
  2. <UiForm v-model="entity" :submit-actions="submitActions">
  3. <template #form.button>
  4. <v-btn v-if="goBackRoute" class="theme-neutral mr-3" @click="quit">
  5. {{ $t('cancel') }}
  6. </v-btn>
  7. </template>
  8. <slot v-bind="{ model, entity }" />
  9. </UiForm>
  10. </template>
  11. <script setup lang="ts" generic="T extends typeof ApiModel">
  12. import type { RouteLocationRaw } from 'vue-router'
  13. import type ApiModel from '~/models/ApiModel'
  14. import type { AnyJson } from '~/types/data'
  15. import { SUBMIT_TYPE } from '~/types/enum/enums'
  16. import { useEntityManager } from '~/composables/data/useEntityManager'
  17. const props = withDefaults(defineProps<{
  18. model: T
  19. /**
  20. * Route de retour
  21. */
  22. goBackRoute?: RouteLocationRaw | null
  23. /**
  24. * La validation est en cours
  25. */
  26. validationPending?: boolean
  27. /**
  28. * Faut-il rafraîchir le profil à la soumission du formulaire ?
  29. */
  30. refreshProfile?: boolean
  31. }>(), {
  32. goBackRoute: null,
  33. validationPending: false,
  34. refreshProfile: false
  35. })
  36. const router = useRouter()
  37. const { em } = useEntityManager()
  38. const entity = reactive(em.newInstance(props.model)) as InstanceType<T>
  39. const submitActions = computed(() => {
  40. const actions: AnyJson = {}
  41. if (props.goBackRoute !== null) {
  42. actions[SUBMIT_TYPE.SAVE_AND_BACK] = props.goBackRoute
  43. } else {
  44. actions[SUBMIT_TYPE.SAVE] = null
  45. }
  46. return actions
  47. })
  48. const quit = () => {
  49. if (!props.goBackRoute) {
  50. throw new Error('no go back route defined')
  51. }
  52. router.push(props.goBackRoute)
  53. }
  54. // Nettoyer les données lors du démontage du composant
  55. onBeforeUnmount(() => {
  56. // Nettoyer les références du store si nécessaire
  57. if (import.meta.client) {
  58. useRepo(props.model).flush()
  59. }
  60. })
  61. </script>
  62. <style scoped lang="scss"></style>