Delete.vue 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. <!--
  2. Bouton Delete avec modale de confirmation de la suppression
  3. -->
  4. <template>
  5. <main>
  6. <div class="div_to_clicked" @click="onDeleteClicked()">
  7. <!-- Content -->
  8. <slot />
  9. </div>
  10. <UiFormDeletionConfirmationDialog
  11. v-model="showDeletionConfirmationDialog"
  12. @delete-clicked="onDeleteConfirmed"
  13. @cancel-clicked="onCancelClicked"
  14. />
  15. </main>
  16. </template>
  17. <script setup lang="ts" generic="T extends ApiResource">
  18. import { type Ref, ref } from 'vue'
  19. import type ApiResource from '~/models/ApiResource'
  20. import { useDeleteItem } from '~/composables/form/useDeleteItem'
  21. import { useEntityManager } from '~/composables/data/useEntityManager'
  22. const props = defineProps<{
  23. entity: T
  24. }>()
  25. const { deleteItem } = useDeleteItem()
  26. const pageStore = usePageStore()
  27. const { em } = useEntityManager()
  28. const showDeletionConfirmationDialog: Ref<boolean> = ref(false)
  29. const itemToDelete: Ref<ApiResource | null> = ref(null)
  30. const onDeleteClicked = () => {
  31. itemToDelete.value = em.cast(em.getModel(props.entity), props.entity)
  32. showDeletionConfirmationDialog.value = true
  33. }
  34. const onCancelClicked = () => {
  35. itemToDelete.value = null
  36. }
  37. const onDeleteConfirmed = async () => {
  38. if (itemToDelete.value != null) {
  39. pageStore.loading = true
  40. await deleteItem(itemToDelete.value)
  41. pageStore.loading = false
  42. }
  43. }
  44. </script>
  45. <style scoped>
  46. .div_to_clicked {
  47. cursor: pointer;
  48. }
  49. </style>