Edition.vue 2.4 KB

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