Creation.vue 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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(
  18. defineProps<{
  19. model: T
  20. /**
  21. * Route de retour
  22. */
  23. goBackRoute?: RouteLocationRaw | null
  24. /**
  25. * La validation est en cours
  26. */
  27. validationPending?: boolean
  28. /**
  29. * Faut-il rafraîchir le profil à la soumission du formulaire ?
  30. */
  31. refreshProfile?: boolean
  32. }>(),
  33. {
  34. goBackRoute: null,
  35. validationPending: false,
  36. refreshProfile: false,
  37. },
  38. )
  39. const router = useRouter()
  40. const { em } = useEntityManager()
  41. const entity = reactive(em.newInstance(props.model)) as InstanceType<T>
  42. const submitActions = computed(() => {
  43. const actions: AnyJson = {}
  44. if (props.goBackRoute !== null) {
  45. actions[SUBMIT_TYPE.SAVE_AND_BACK] = props.goBackRoute
  46. } else {
  47. actions[SUBMIT_TYPE.SAVE] = null
  48. }
  49. return actions
  50. })
  51. const quit = () => {
  52. if (!props.goBackRoute) {
  53. throw new Error('no go back route defined')
  54. }
  55. router.push(props.goBackRoute)
  56. }
  57. // Nettoyer les données lors du démontage du composant
  58. onBeforeUnmount(() => {
  59. // Nettoyer les références du store si nécessaire
  60. if (import.meta.client) {
  61. useRepo(props.model).flush()
  62. }
  63. })
  64. </script>
  65. <style scoped lang="scss"></style>