From c90776ec4f2f204f20dbe642ea38688fb3c8e827 Mon Sep 17 00:00:00 2001 From: hreyes Date: Thu, 16 Apr 2026 07:29:59 -0600 Subject: [PATCH 1/5] feature/fecha-pago-visible --- frontend/src/app.css | 8 ++++++++ frontend/src/lib/components/ui/input/input.svelte | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/frontend/src/app.css b/frontend/src/app.css index 627e3836..af7ea21c 100644 --- a/frontend/src/app.css +++ b/frontend/src/app.css @@ -120,6 +120,14 @@ body { @apply bg-background text-foreground overflow-x-hidden; } + + /* Asegurar que el texto de los inputs de fecha sea legible en modo oscuro + y en navegadores WebKit */ + input[type="date"], + input[type="datetime-local"] { + color: var(--color-foreground); + -webkit-text-fill-color: var(--color-foreground); + } } @layer components { diff --git a/frontend/src/lib/components/ui/input/input.svelte b/frontend/src/lib/components/ui/input/input.svelte index 960167d7..ef1fbe7d 100644 --- a/frontend/src/lib/components/ui/input/input.svelte +++ b/frontend/src/lib/components/ui/input/input.svelte @@ -25,7 +25,7 @@ bind:this={ref} data-slot={dataSlot} class={cn( - "selection:bg-primary dark:bg-input/30 selection:text-primary-foreground border-input ring-offset-background placeholder:text-muted-foreground shadow-xs flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 pt-1.5 text-sm font-medium outline-none transition-[color,box-shadow] disabled:cursor-not-allowed disabled:opacity-50", + "selection:bg-primary dark:bg-input/30 selection:text-primary-foreground border-input ring-offset-background placeholder:text-muted-foreground shadow-xs flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 pt-1.5 text-sm font-medium text-foreground outline-none transition-[color,box-shadow] disabled:cursor-not-allowed disabled:opacity-50", "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]", "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", className @@ -40,7 +40,7 @@ bind:this={ref} data-slot={dataSlot} class={cn( - "border-input bg-background selection:bg-primary dark:bg-input/30 selection:text-primary-foreground ring-offset-background placeholder:text-muted-foreground shadow-xs flex h-9 w-full min-w-0 rounded-md border px-3 py-1 text-base outline-none transition-[color,box-shadow] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", + "border-input bg-background selection:bg-primary dark:bg-input/30 selection:text-primary-foreground ring-offset-background placeholder:text-muted-foreground shadow-xs flex h-9 w-full min-w-0 rounded-md border px-3 py-1 text-base text-foreground outline-none transition-[color,box-shadow] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]", "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", className From cf7d5c31cf3f93a1444249ea66a63d5ac7e74dc9 Mon Sep 17 00:00:00 2001 From: hreyes Date: Thu, 16 Apr 2026 08:06:51 -0600 Subject: [PATCH 2/5] fix/convertion-icon-clear-data --- .../goods/modales/unit-measure-dialog.svelte | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/frontend/src/lib/components/dashboard/goods/modales/unit-measure-dialog.svelte b/frontend/src/lib/components/dashboard/goods/modales/unit-measure-dialog.svelte index ff8b057e..81ee5af0 100644 --- a/frontend/src/lib/components/dashboard/goods/modales/unit-measure-dialog.svelte +++ b/frontend/src/lib/components/dashboard/goods/modales/unit-measure-dialog.svelte @@ -19,6 +19,7 @@ let allItems = $state([]); // Store full dataset let loading = $state(false); let searchTerm = $state(""); + let wasOpen = $state(false); // Derived state for filtering $effect(() => { @@ -34,11 +35,15 @@ } }); - // Cargar datos al abrir + // Cargar datos al abrir y resetear búsqueda cada vez que se abre $effect(() => { - if (open && companyStore.activeCompany && allItems.length === 0) { - loadData(); + if (open && !wasOpen) { + searchTerm = ""; + if (companyStore.activeCompany && allItems.length === 0) { + loadData(); + } } + wasOpen = open; }); async function loadData() { From 991dd924eeb72b2a18c9c7423aff1852a2a5ddf0 Mon Sep 17 00:00:00 2001 From: hreyes Date: Thu, 16 Apr 2026 08:36:41 -0600 Subject: [PATCH 3/5] feature/doble-clic-invoices --- .../lib/components/dashboard/invoices/data-table.svelte | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/frontend/src/lib/components/dashboard/invoices/data-table.svelte b/frontend/src/lib/components/dashboard/invoices/data-table.svelte index fc431493..ae206e98 100644 --- a/frontend/src/lib/components/dashboard/invoices/data-table.svelte +++ b/frontend/src/lib/components/dashboard/invoices/data-table.svelte @@ -70,6 +70,13 @@ manualSorting: true // Sorting is handled server-side for this component }); + function handleRowDoubleClick(row: any) { + const invoice = row.original; + if (invoice?.id) { + window.location.href = `/dashboard/invoices/edit/${invoice.id}`; + } + } + let scrollContainer = $state(); let loadingTrigger = $state(); @@ -200,6 +207,7 @@ data-state={row.getIsSelected() && 'selected'} class="group/inv-list cursor-pointer {row.getIsSelected() ? 'catalog-table-row-selected' : 'catalog-table-row'}" onclick={() => onRowClick && onRowClick(row.original)} + ondblclick={() => handleRowDoubleClick(row)} > {#each visibleCells as cell (cell.id)} {@const colId = cell.column.id} From e83be520bbcc7746fb49c867ca0c4721ad7ffd48 Mon Sep 17 00:00:00 2001 From: hreyes Date: Thu, 16 Apr 2026 08:53:13 -0600 Subject: [PATCH 4/5] feature/atajos-nav-invoices --- .../dashboard/pedimentos/data-table.svelte | 9 ++-- .../shortcuts/dashboard/invoices/list.ts | 2 +- .../shortcuts/dashboard/pedimentos/list.ts | 14 +++++++ .../routes/dashboard/pedimentos/+page.svelte | 42 ++++++++++++++++++- 4 files changed, 61 insertions(+), 6 deletions(-) diff --git a/frontend/src/lib/components/dashboard/pedimentos/data-table.svelte b/frontend/src/lib/components/dashboard/pedimentos/data-table.svelte index eb51c5d2..e6c1e89c 100644 --- a/frontend/src/lib/components/dashboard/pedimentos/data-table.svelte +++ b/frontend/src/lib/components/dashboard/pedimentos/data-table.svelte @@ -96,7 +96,7 @@ }); -
+
{#each table.getHeaderGroups() as headerGroup (headerGroup.id)} - + {#each headerGroup.headers as header (header.id)} {@const colId = header.column.id} {#each table.getRowModel().rows as row (row.id)} { if (onRowClick) { @@ -208,7 +209,7 @@ {/each} {:else} - + No hay resultados. @@ -217,7 +218,7 @@ {#if hasMore} - +
{#if loading} diff --git a/frontend/src/lib/config/shortcuts/dashboard/invoices/list.ts b/frontend/src/lib/config/shortcuts/dashboard/invoices/list.ts index 85d88179..6db05b7c 100644 --- a/frontend/src/lib/config/shortcuts/dashboard/invoices/list.ts +++ b/frontend/src/lib/config/shortcuts/dashboard/invoices/list.ts @@ -27,7 +27,7 @@ export const obtenerAtajosListaFacturas = (acciones: { }): ShortcutDef[] => [ { key: 'Alt+V', description: 'Ver Temporales', action: acciones.irTemporal }, { key: 'Alt+F', description: 'Ver Definitivas', action: acciones.irDefinitiva }, - { key: 'Alt+N', description: 'Ver Nacionales', action: acciones.irNacional }, + { key: 'Alt+Q', description: 'Ver Nacionales', action: acciones.irNacional }, { key: 'Alt+Z', description: 'Ver Cambio Régimen', action: acciones.irCambioRegimen }, { key: 'Alt+L', description: 'Ver Exportaciones', action: acciones.irExportacion }, { key: 'Alt+Y', description: 'Ver Reparaciones', action: acciones.irReparacion }, diff --git a/frontend/src/lib/config/shortcuts/dashboard/pedimentos/list.ts b/frontend/src/lib/config/shortcuts/dashboard/pedimentos/list.ts index 84fe8028..9c635bd3 100644 --- a/frontend/src/lib/config/shortcuts/dashboard/pedimentos/list.ts +++ b/frontend/src/lib/config/shortcuts/dashboard/pedimentos/list.ts @@ -5,6 +5,8 @@ export const obtenerAtajosListaPedimento = (acciones: { manejarActualizar: () => void; manejarEditar: () => void; manejarEliminar: () => void; + irATabla: () => void; + irAAcciones: () => void; }): ShortcutDef[] => [ { key: 'Alt+Shift+N', @@ -25,5 +27,17 @@ export const obtenerAtajosListaPedimento = (acciones: { key: 'Alt+Shift+D', description: 'Eliminar Seleccionado', action: acciones.manejarEliminar + }, + { + key: 'Alt+Shift+T', + description: 'Ir a tabla de pedimentos', + action: acciones.irATabla, + skipDefaultFocusAfter: true + }, + { + key: 'Alt+Shift+A', + description: 'Ir a acciones (barra inferior)', + action: acciones.irAAcciones, + skipDefaultFocusAfter: true } ]; diff --git a/frontend/src/routes/dashboard/pedimentos/+page.svelte b/frontend/src/routes/dashboard/pedimentos/+page.svelte index 0fedc396..a6c421d9 100644 --- a/frontend/src/routes/dashboard/pedimentos/+page.svelte +++ b/frontend/src/routes/dashboard/pedimentos/+page.svelte @@ -230,13 +230,52 @@ let filters = $state({ } // Keyboard Shortcuts + /** Teclado: foco en la primera fila de datos de la tabla */ + function focusFirstPedimentoTableRow() { + if (!browser) return; + const row = document.querySelector( + '[data-pedimento-list-table] tbody tr[data-pedimento-data-row][tabindex="0"]' + ); + if (row) { + row.focus(); + setTimeout(() => row.scrollIntoView({ behavior: 'smooth', block: 'nearest' }), 50); + return; + } + toast.info('No hay filas en la tabla'); + } + + /** Teclado: foco en el primer control habilitado de la barra de acciones fija */ + function focusPedimentoListFooterActions() { + if (!browser) return; + const footer = document.getElementById('pedimento-list-footer'); + if (!footer) return; + const candidates = footer.querySelectorAll( + 'button, a[href], input:not([type="hidden"]), select, textarea, [tabindex]:not([tabindex="-1"])' + ); + for (const el of candidates) { + if (el.offsetParent === null && el.getClientRects().length === 0) continue; + if (el.hasAttribute('disabled')) continue; + if ((el as HTMLButtonElement).disabled) continue; + el.focus(); + setTimeout(() => el.scrollIntoView({ behavior: 'smooth', block: 'nearest' }), 50); + return; + } + try { + footer.focus(); + } catch { + /* ignore */ + } + } + useShortcuts( 'Pedimentos', obtenerAtajosListaPedimento({ manejarCrear: handleCreateClick, manejarActualizar: reloadData, manejarEditar: handleEditSelected, - manejarEliminar: handleDelete + manejarEliminar: handleDelete, + irATabla: focusFirstPedimentoTableRow, + irAAcciones: focusPedimentoListFooterActions }) ); @@ -535,6 +574,7 @@ let filters = $state({