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 @@
- ¿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? +
+Esta acción no se puede deshacer.