Delete.vue 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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>