diff --git a/frontend/src/lib/components/dashboard/goods/classes/data-table.svelte b/frontend/src/lib/components/dashboard/goods/classes/data-table.svelte index 6d7254b9..c01eb548 100644 --- a/frontend/src/lib/components/dashboard/goods/classes/data-table.svelte +++ b/frontend/src/lib/components/dashboard/goods/classes/data-table.svelte @@ -156,15 +156,18 @@ onclick={(e) => { if ((e.target as HTMLElement).closest('input[type="checkbox"]')) return; const rowId = getRowIdValue(row.original); - if (rowId !== null) { - const isSelected = selectedIds.includes(rowId); - if (isSelected) { - onSelectedIdsChange?.(selectedIds.filter((id) => id !== rowId)); - } else { - // El id clickeado va primero para que el cuadro informativo lo muestre - onSelectedIdsChange?.([rowId, ...selectedIds.filter((id) => id !== rowId)]); - } + if (rowId === null) return; + // Click sobre la fila activa (la del frente) la deselecciona. + // Click sobre cualquier otra fila la trae al frente (mostrar su info). + if (selectedIds[0] === rowId) { + onSelectedIdsChange?.(selectedIds.filter((id) => id !== rowId)); + return; } + if (selectedIds.includes(rowId)) { + onSelectedIdsChange?.([rowId, ...selectedIds.filter((id) => id !== rowId)]); + return; + } + onSelectedIdsChange?.([rowId, ...selectedIds]); }} ondblclick={() => onRowDoubleClick?.(row.original)} class="cursor-pointer hover:bg-muted/50 transition-colors {row.getIsSelected() ? 'bg-primary/10' : ''}" diff --git a/frontend/src/routes/dashboard/goods/fixed-asset-classes/+page.svelte b/frontend/src/routes/dashboard/goods/fixed-asset-classes/+page.svelte index feb15659..eb994e0d 100644 --- a/frontend/src/routes/dashboard/goods/fixed-asset-classes/+page.svelte +++ b/frontend/src/routes/dashboard/goods/fixed-asset-classes/+page.svelte @@ -290,15 +290,15 @@ function handleDelete() { if (!canDelete) return; - if (!selectedClass) { - toast.error('Selecciona una clase para borrar'); + if (selectedClassIds.length === 0) { + toast.error('Selecciona al menos una clase para borrar'); return; } showDeleteDialog = true; } async function confirmDelete() { - if (!selectedClass) return; + if (selectedClassIds.length === 0) return; const companyId = companyStore.activeCompany?.id; if (!companyId) { @@ -306,24 +306,37 @@ return; } - const classToDelete = selectedClass; + const idsToDelete = [...selectedClassIds]; + let okCount = 0; + const errors: number[] = []; - try { - // El backend ahora elimina automáticamente la extensión FA si existe - await classesApi.delete(classToDelete.id, companyId); - - toast.success(`Clase ${classToDelete.class_code} eliminada correctamente`); - - // Recargar lista - await loadClasses(); - - selectedClassIds = []; - clearSelectedClass(); - showDeleteDialog = false; - } catch (error) { - console.error('Error deleting class:', error); - toast.error('Error al eliminar la clase'); + for (const id of idsToDelete) { + try { + // El backend elimina automáticamente la extensión FA si existe + await classesApi.delete(id, companyId); + okCount++; + } catch (error) { + console.error(`Error deleting class ${id}:`, error); + errors.push(id); + } } + + if (errors.length === 0) { + toast.success( + okCount === 1 + ? 'Clase eliminada correctamente' + : `${okCount} clases eliminadas correctamente` + ); + } else if (okCount === 0) { + toast.error(`Error al eliminar ${errors.length} clase(s)`); + } else { + toast.error(`${okCount} eliminada(s), ${errors.length} con error`); + } + + await loadClasses(); + selectedClassIds = []; + clearSelectedClass(); + showDeleteDialog = false; } // Keyboard Shortcuts @@ -615,9 +628,14 @@ > {/if} {#if canDelete} - + Borrar{selectedClassIds.length > 1 ? ` (${selectedClassIds.length})` : ''} + {/if} @@ -903,14 +921,28 @@ ¿Confirmar eliminación?
-

- ¿Estás seguro que deseas eliminar la clase {selectedClass?.class_code}? -

-

- {selectedClass?.description_es} -

+ {#if selectedClassIds.length === 1} +

+ ¿Estás seguro que deseas eliminar la clase + {selectedClass?.class_code}? +

+

+ {selectedClass?.description_es} +

+ {:else} +

+ ¿Estás seguro que deseas eliminar + {selectedClassIds.length} clases? +

+ + {/if}

Esta acción no se puede deshacer.