fix(slides): make delete icon always visible, fix confirm dialog z-index, and reset dropzone after upload
- Remove opacity-0/group-hover:opacity-100 so delete button is always visible - Wrap ConfirmDialog in Teleport to body so it renders above all content - Replace router.delete with axios.delete for proper slide deletion - Add dropzoneKey ref to force Vue3Dropzone re-mount after upload completes
This commit is contained in:
parent
8cbda3b8bc
commit
1c1e63de3d
|
|
@ -1,6 +1,7 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, computed } from 'vue'
|
import { ref, computed } from 'vue'
|
||||||
import { router } from '@inertiajs/vue3'
|
import { router } from '@inertiajs/vue3'
|
||||||
|
import axios from 'axios'
|
||||||
import ConfirmDialog from '@/Components/ConfirmDialog.vue'
|
import ConfirmDialog from '@/Components/ConfirmDialog.vue'
|
||||||
import LoadingSpinner from '@/Components/LoadingSpinner.vue'
|
import LoadingSpinner from '@/Components/LoadingSpinner.vue'
|
||||||
|
|
||||||
|
|
@ -85,19 +86,17 @@ function confirmDelete() {
|
||||||
if (!slideToDelete.value) return
|
if (!slideToDelete.value) return
|
||||||
deleting.value = true
|
deleting.value = true
|
||||||
|
|
||||||
router.delete(route('slides.destroy', slideToDelete.value.id), {
|
axios.delete(route('slides.destroy', slideToDelete.value.id))
|
||||||
preserveScroll: true,
|
.then(() => {
|
||||||
preserveState: true,
|
|
||||||
onSuccess: () => {
|
|
||||||
confirmingDelete.value = false
|
confirmingDelete.value = false
|
||||||
slideToDelete.value = null
|
slideToDelete.value = null
|
||||||
deleting.value = false
|
deleting.value = false
|
||||||
emit('deleted')
|
emit('deleted')
|
||||||
},
|
router.reload({ preserveScroll: true })
|
||||||
onError: () => {
|
})
|
||||||
|
.catch(() => {
|
||||||
deleting.value = false
|
deleting.value = false
|
||||||
},
|
})
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Expire date editing
|
// Expire date editing
|
||||||
|
|
@ -194,7 +193,7 @@ function isExpired(expireDate) {
|
||||||
<button
|
<button
|
||||||
data-testid="slide-grid-delete-button"
|
data-testid="slide-grid-delete-button"
|
||||||
@click.stop="promptDelete(slide)"
|
@click.stop="promptDelete(slide)"
|
||||||
class="absolute right-2 top-2 flex h-7 w-7 items-center justify-center rounded-lg bg-black/50 text-white/80 opacity-0 backdrop-blur-sm transition-all duration-200 hover:bg-red-600 hover:text-white group-hover:opacity-100"
|
class="absolute right-2 top-2 flex h-7 w-7 items-center justify-center rounded-lg bg-black/50 text-white/80 backdrop-blur-sm transition-all duration-200 hover:bg-red-600 hover:text-white"
|
||||||
title="Löschen"
|
title="Löschen"
|
||||||
>
|
>
|
||||||
<svg class="h-3.5 w-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
|
<svg class="h-3.5 w-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
|
||||||
|
|
@ -321,16 +320,18 @@ function isExpired(expireDate) {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Delete confirmation dialog -->
|
<!-- Delete confirmation dialog -->
|
||||||
<ConfirmDialog
|
<Teleport to="body">
|
||||||
:show="confirmingDelete"
|
<ConfirmDialog
|
||||||
title="Folie löschen?"
|
:show="confirmingDelete"
|
||||||
:message="`Möchtest du die Folie '${slideToDelete?.original_filename || ''}' wirklich löschen?`"
|
title="Folie löschen?"
|
||||||
confirm-label="Löschen"
|
:message="`Möchtest du die Folie '${slideToDelete?.original_filename || ''}' wirklich löschen?`"
|
||||||
cancel-label="Abbrechen"
|
confirm-label="Löschen"
|
||||||
variant="danger"
|
cancel-label="Abbrechen"
|
||||||
@confirm="confirmDelete"
|
variant="danger"
|
||||||
@cancel="cancelDelete"
|
@confirm="confirmDelete"
|
||||||
/>
|
@cancel="cancelDelete"
|
||||||
|
/>
|
||||||
|
</Teleport>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ const props = defineProps({
|
||||||
const emit = defineEmits(['uploaded'])
|
const emit = defineEmits(['uploaded'])
|
||||||
|
|
||||||
const files = ref([])
|
const files = ref([])
|
||||||
|
const dropzoneKey = ref(0)
|
||||||
const expireDate = ref('')
|
const expireDate = ref('')
|
||||||
const uploading = ref(false)
|
const uploading = ref(false)
|
||||||
const uploadProgress = ref(0)
|
const uploadProgress = ref(0)
|
||||||
|
|
@ -68,6 +69,7 @@ function uploadNextFile(index) {
|
||||||
uploading.value = false
|
uploading.value = false
|
||||||
uploadProgress.value = 100
|
uploadProgress.value = 100
|
||||||
files.value = []
|
files.value = []
|
||||||
|
dropzoneKey.value++
|
||||||
emit('uploaded')
|
emit('uploaded')
|
||||||
|
|
||||||
// Reload Inertia page data to reflect newly uploaded slides
|
// Reload Inertia page data to reflect newly uploaded slides
|
||||||
|
|
@ -206,6 +208,7 @@ function dismissError() {
|
||||||
|
|
||||||
<!-- Dropzone -->
|
<!-- Dropzone -->
|
||||||
<Vue3Dropzone
|
<Vue3Dropzone
|
||||||
|
:key="dropzoneKey"
|
||||||
data-testid="slide-uploader-dropzone"
|
data-testid="slide-uploader-dropzone"
|
||||||
v-model="files"
|
v-model="files"
|
||||||
:multiple="true"
|
:multiple="true"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue