Edition.vue 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <template>
  2. <UiLoadingPanel v-if="pending" />
  3. <UiForm
  4. v-else
  5. :model="model"
  6. :entity="entity"
  7. :submitActions="submitActions"
  8. >
  9. <template #form.button>
  10. <v-btn v-if="goBackRoute" class="theme-neutral mr-3" @click="quit">
  11. {{ $t('cancel') }}
  12. </v-btn>
  13. </template>
  14. <slot v-bind="{model, entity}"/>
  15. </UiForm>
  16. </template>
  17. <script setup lang="ts">
  18. import type {PropType} from "@vue/runtime-core";
  19. import type {RouteLocationRaw} from "@intlify/vue-router-bridge";
  20. import ApiModel from "~/models/ApiModel";
  21. import type {AnyJson} from "~/types/data";
  22. import {SUBMIT_TYPE} from "~/types/enum/enums";
  23. import {useRoute} from "vue-router";
  24. import {useEntityFetch} from "~/composables/data/useEntityFetch";
  25. const props = defineProps({
  26. /**
  27. * Classe de l'ApiModel (ex: Organization, Notification, ...)
  28. */
  29. model: {
  30. type: Function as any as () => typeof ApiModel,
  31. required: true
  32. },
  33. /**
  34. * Id de l'objet
  35. * Si non renseigné, le component essaiera de l'extraire de la route actuelle
  36. */
  37. id: {
  38. type: Number,
  39. required: false,
  40. default: null
  41. },
  42. /**
  43. * Route de retour
  44. */
  45. goBackRoute: {
  46. type: Object as PropType<RouteLocationRaw>,
  47. required: false,
  48. default: null
  49. },
  50. /**
  51. * La validation est en cours
  52. */
  53. validationPending: {
  54. type: Boolean,
  55. required: false,
  56. default: false
  57. },
  58. /**
  59. * Faut-il rafraichir le profil à la soumission du formulaire?
  60. */
  61. refreshProfile: {
  62. type: Boolean,
  63. required: false,
  64. default: false
  65. }
  66. })
  67. const { fetch } = useEntityFetch()
  68. const route = useRoute()
  69. const router = useRouter()
  70. const entityId = computed(() => {
  71. if (props.id !== null) {
  72. return props.id
  73. }
  74. return parseInt(route.params.id as string)
  75. })
  76. const { data: entity, pending } = fetch(
  77. props.model,
  78. entityId.value
  79. )
  80. const submitActions = computed(() => {
  81. let actions: AnyJson = {}
  82. if (props.goBackRoute !== null) {
  83. actions[SUBMIT_TYPE.SAVE_AND_BACK] = props.goBackRoute
  84. } else {
  85. actions[SUBMIT_TYPE.SAVE] = null
  86. }
  87. return actions
  88. })
  89. const quit = () => {
  90. if (!props.goBackRoute) {
  91. throw Error('no go back route defined')
  92. }
  93. router.push(props.goBackRoute)
  94. }
  95. </script>
  96. <style scoped lang="scss">
  97. </style>