Edition.vue 2.3 KB

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