Creation.vue 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <template>
  2. <UiForm
  3. :model="model"
  4. :entity="entity"
  5. :submitActions="submitActions"
  6. :preProcess="preProcess"
  7. >
  8. <template #form.button>
  9. <v-btn v-if="goBackRoute" class="theme-neutral mr-3" @click="quit">
  10. {{ $t('cancel') }}
  11. </v-btn>
  12. </template>
  13. <slot v-bind="{model, entity}"/>
  14. </UiForm>
  15. </template>
  16. <script setup lang="ts">
  17. import type {PropType} from "@vue/runtime-core";
  18. import type {RouteLocationRaw} from "@intlify/vue-router-bridge";
  19. import ApiModel from "~/models/ApiModel";
  20. import type {AnyJson} from "~/types/data";
  21. import {SUBMIT_TYPE} from "~/types/enum/enums";
  22. import {useEntityManager} from "~/composables/data/useEntityManager";
  23. const props = defineProps({
  24. /**
  25. * Classe de l'ApiModel (ex: Organization, Notification, ...)
  26. */
  27. model: {
  28. type: Function as any as () => typeof ApiModel,
  29. required: true
  30. },
  31. /**
  32. * Route de retour
  33. */
  34. goBackRoute: {
  35. type: Object as PropType<RouteLocationRaw>,
  36. required: false,
  37. default: null
  38. },
  39. /**
  40. * La validation est en cours
  41. */
  42. validationPending: {
  43. type: Boolean,
  44. required: false,
  45. default: false
  46. },
  47. /**
  48. * Faut-il rafraichir le profil à la soumission du formulaire ?
  49. */
  50. refreshProfile: {
  51. type: Boolean,
  52. required: false,
  53. default: false
  54. },
  55. /**
  56. * Cette méthode sera exécutée avant la soumission des données à l'API
  57. * Elle prends l'entité en paramètre, permet de la modifier et retourne l'entité qui en résulte.
  58. */
  59. preProcess: {
  60. type: Function as PropType<(instance: ApiModel) => ApiModel>,
  61. required: false,
  62. default: (instance: ApiModel) => instance
  63. }
  64. })
  65. const router = useRouter()
  66. const { em } = useEntityManager()
  67. //@ts-ignore Pour une raison que j'ignore, le type Ref<ApiModel> met en erreur la prop entity de UiForm...
  68. const entity: ApiModel = reactive(em.newInstance(props.model))
  69. const submitActions = computed(() => {
  70. let actions: AnyJson = {}
  71. if (props.goBackRoute !== null) {
  72. actions[SUBMIT_TYPE.SAVE_AND_BACK] = props.goBackRoute
  73. } else {
  74. actions[SUBMIT_TYPE.SAVE] = null
  75. }
  76. return actions
  77. })
  78. const quit = () => {
  79. if (!props.goBackRoute) {
  80. throw Error('no go back route defined')
  81. }
  82. router.push(props.goBackRoute)
  83. }
  84. </script>
  85. <style scoped lang="scss">
  86. </style>