Creation.vue 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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. // @ts-expect-error Pour une raison que j'ignore, le type Ref<ApiModel> met en erreur la prop entity de UiForm...
  39. const entity: ApiModel = reactive(em.newInstance(props.model))
  40. const submitActions = computed(() => {
  41. const actions: AnyJson = {}
  42. if (props.goBackRoute !== null) {
  43. actions[SUBMIT_TYPE.SAVE_AND_BACK] = props.goBackRoute
  44. } else {
  45. actions[SUBMIT_TYPE.SAVE] = null
  46. }
  47. return actions
  48. })
  49. const quit = () => {
  50. if (!props.goBackRoute) {
  51. throw new Error('no go back route defined')
  52. }
  53. router.push(props.goBackRoute)
  54. }
  55. </script>
  56. <style scoped lang="scss"></style>