Edition.vue 2.3 KB

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