feat : ajout d'un order sur les sites prit en compte pour le calendrier et l'impression + ajout des légendes sur le calendrier et divers fix
This commit is contained in:
@@ -32,8 +32,15 @@
|
||||
v-for="site in sites"
|
||||
:key="site.id"
|
||||
class="grid grid-cols-[1fr_140px_160px] items-center gap-4 border-b border-neutral-100 px-6 py-3 text-md text-neutral-800 last:border-b-0"
|
||||
draggable="true"
|
||||
@dragstart="handleDragStart($event, site)"
|
||||
@dragover="handleDragOver"
|
||||
@drop="handleDrop($event, site)"
|
||||
>
|
||||
<span class="text-left">{{ site.name }}</span>
|
||||
<span class="flex items-center gap-2 text-left cursor-pointer">
|
||||
<span class="select-none text-xs">::</span>
|
||||
<span>{{ site.name }}</span>
|
||||
</span>
|
||||
<div class="flex items-center gap-2 justify-start">
|
||||
<span
|
||||
class="inline-block h-3 w-3 rounded-full"
|
||||
@@ -114,11 +121,12 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import type { Site } from '~/services/dto/site'
|
||||
import { createSite, deleteSite, listSites, updateSite } from '~/services/sites'
|
||||
import { createSite, deleteSite, listSites, updateSite, updateSiteOrder } from '~/services/sites'
|
||||
|
||||
const isDrawerOpen = ref(false)
|
||||
const isSubmitting = ref(false)
|
||||
const isLoading = ref(false)
|
||||
const isReordering = ref(false)
|
||||
|
||||
const sites = ref<Site[]>([])
|
||||
const editingSite = ref<Site | null>(null)
|
||||
@@ -207,7 +215,8 @@ const handleSubmit = async () => {
|
||||
} else {
|
||||
await createSite({
|
||||
name: form.name,
|
||||
color: form.color
|
||||
color: form.color,
|
||||
displayOrder: sites.value.length + 1
|
||||
})
|
||||
}
|
||||
|
||||
@@ -231,4 +240,52 @@ const confirmDelete = async (site: Site) => {
|
||||
await deleteSite(site.id)
|
||||
await loadSites()
|
||||
}
|
||||
|
||||
const handleDragStart = (event: DragEvent, site: Site) => {
|
||||
if (isReordering.value || !event.dataTransfer) return
|
||||
event.dataTransfer.effectAllowed = 'move'
|
||||
event.dataTransfer.setData('text/plain', String(site.id))
|
||||
}
|
||||
|
||||
const handleDragOver = (event: DragEvent) => {
|
||||
event.preventDefault()
|
||||
}
|
||||
|
||||
const handleDrop = async (event: DragEvent, site: Site) => {
|
||||
event.preventDefault()
|
||||
if (isReordering.value) return
|
||||
|
||||
const dragId = Number(event.dataTransfer?.getData('text/plain'))
|
||||
if (!dragId || dragId === site.id) return
|
||||
|
||||
const fromIndex = sites.value.findIndex((item) => item.id === dragId)
|
||||
const toIndex = sites.value.findIndex((item) => item.id === site.id)
|
||||
if (fromIndex < 0 || toIndex < 0 || fromIndex === toIndex) return
|
||||
|
||||
const reordered = [...sites.value]
|
||||
const [moved] = reordered.splice(fromIndex, 1)
|
||||
reordered.splice(toIndex, 0, moved)
|
||||
|
||||
const updates: Array<{ id: number; displayOrder: number }> = []
|
||||
reordered.forEach((item, index) => {
|
||||
const nextOrder = index + 1
|
||||
if ((item.displayOrder ?? 0) !== nextOrder) {
|
||||
updates.push({ id: item.id, displayOrder: nextOrder })
|
||||
}
|
||||
item.displayOrder = nextOrder
|
||||
})
|
||||
|
||||
sites.value = reordered
|
||||
if (updates.length === 0) return
|
||||
|
||||
isReordering.value = true
|
||||
try {
|
||||
await Promise.all(updates.map((update) => updateSiteOrder(update.id, update.displayOrder)))
|
||||
} catch {
|
||||
window.alert("Impossible de reordonner les sites.")
|
||||
await loadSites()
|
||||
} finally {
|
||||
isReordering.value = false
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
Reference in New Issue
Block a user