diff --git a/frontend/src/lib/components/dashboard/pedimentos/edit/contributions-tab-form.svelte b/frontend/src/lib/components/dashboard/pedimentos/edit/contributions-tab-form.svelte index d76f1f7f..d14f69f6 100644 --- a/frontend/src/lib/components/dashboard/pedimentos/edit/contributions-tab-form.svelte +++ b/frontend/src/lib/components/dashboard/pedimentos/edit/contributions-tab-form.svelte @@ -26,15 +26,16 @@ Trash2 } from 'lucide-svelte'; import { shortcutStore } from '$lib/stores/shortcut-store'; - import { focusStore } from '$lib/stores/focus-store'; + import { focusStore, interactionMode } from '$lib/stores/focus-store'; import { obtenerAtajosPestanaContribuciones } from '$lib/config/shortcuts/dashboard/pedimentos/tabs/contributions'; // Active tab let activeTab = $state('DTA'); // Focus first input when switching sub-tabs via mouse + $effect(() => { - if (activeTab) { + if (activeTab && $interactionMode === 'keyboard') { focusStore.request('first-input'); } }); diff --git a/frontend/src/lib/components/dashboard/pedimentos/edit/general-tab-form.svelte b/frontend/src/lib/components/dashboard/pedimentos/edit/general-tab-form.svelte index 73527e05..adf9f65b 100644 --- a/frontend/src/lib/components/dashboard/pedimentos/edit/general-tab-form.svelte +++ b/frontend/src/lib/components/dashboard/pedimentos/edit/general-tab-form.svelte @@ -25,7 +25,7 @@ import { useShortcuts } from '$lib/hooks/use-shortcuts'; import { obtenerAtajosPestanaGeneral } from '$lib/config/shortcuts/dashboard/pedimentos/tabs/general'; import { shortcutStore } from '$lib/stores/shortcut-store'; - import { focusStore } from '$lib/stores/focus-store'; + import { focusStore, interactionMode } from '$lib/stores/focus-store'; let { pedimento, @@ -54,8 +54,9 @@ // Focus first input when switching sections via mouse // Shortcuts will override this by focusing the trigger themselves + $effect(() => { - if (activeSection) { + if (activeSection && $interactionMode === 'keyboard') { focusStore.request('first-input'); } }); diff --git a/frontend/src/lib/components/dashboard/pedimentos/edit/other-data-tab-form.svelte b/frontend/src/lib/components/dashboard/pedimentos/edit/other-data-tab-form.svelte index 676ff0c5..a7a749f6 100644 --- a/frontend/src/lib/components/dashboard/pedimentos/edit/other-data-tab-form.svelte +++ b/frontend/src/lib/components/dashboard/pedimentos/edit/other-data-tab-form.svelte @@ -14,7 +14,7 @@ TableRow } from '$lib/components/ui/table'; import { shortcutStore } from '$lib/stores/shortcut-store'; - import { focusStore } from '$lib/stores/focus-store'; + import { focusStore, interactionMode } from '$lib/stores/focus-store'; import { obtenerAtajosOtrosDatos } from '$lib/config/shortcuts/dashboard/pedimentos/tabs/other_data'; import { Dialog, @@ -165,8 +165,9 @@ >('calculos'); // Focus first input when switching sub-views via mouse + $effect(() => { - if (activeView) { + if (activeView && $interactionMode === 'keyboard') { focusStore.request('first-input'); } }); diff --git a/frontend/src/lib/components/keyboard/KeyboardManager.svelte b/frontend/src/lib/components/keyboard/KeyboardManager.svelte index 2c55c9f3..cd7288cb 100644 --- a/frontend/src/lib/components/keyboard/KeyboardManager.svelte +++ b/frontend/src/lib/components/keyboard/KeyboardManager.svelte @@ -4,7 +4,7 @@ import { browser } from '$app/environment'; import { GLOBAL_NAV } from '$lib/config/shortcuts'; import { shortcutStore, activeShortcutsList } from '$lib/stores/shortcut-store'; - import { focusStore } from '$lib/stores/focus-store'; + import { focusStore, interactionMode } from '$lib/stores/focus-store'; import ShortcutsHelpModal from './ShortcutsHelpModal.svelte'; let showHelp = $state(false); @@ -15,8 +15,8 @@ if (!browser) return false; const currentPath = $page?.url?.pathname || ''; const isAuthenticatedRoute = currentPath.startsWith('/dashboard'); - const hasAccessToken = document.cookie.includes('access_token=') || - localStorage.getItem('access_token'); + const hasAccessToken = + document.cookie.includes('access_token=') || localStorage.getItem('access_token'); return isAuthenticatedRoute && !!hasAccessToken; } @@ -203,24 +203,24 @@ event.preventDefault(); event.stopPropagation(); // Stop bubbling - lastShortcutTime = Date.now(); - match.action(); + lastShortcutTime = Date.now(); + match.action(); - // Hybrid focus strategy - if (combo.includes('Alt+') && match) { - const isDigit = combo.includes('Digit') || (event.code && event.code.startsWith('Digit')); - const strategy = FOCUS_POLICY[match.context] || 'first-input'; + // Hybrid focus strategy + if (combo.includes('Alt+') && match) { + const isDigit = combo.includes('Digit') || (event.code && event.code.startsWith('Digit')); + const strategy = FOCUS_POLICY[match.context] || 'first-input'; - if (isDigit && strategy === 'trigger') { - // Focus the trigger for specific views (General sub-tabs) - focusTriggerByDescription(match.description); - } else { - // Default: Focus the first input (Main tabs, non-trigger sub-tabs) - autoFocusFirstInput(); + if (isDigit && strategy === 'trigger') { + // Focus the trigger for specific views (General sub-tabs) + focusTriggerByDescription(match.description); + } else { + // Default: Focus the first input (Main tabs, non-trigger sub-tabs) + autoFocusFirstInput(); + } } + return; } - return; - } } // Fin del bloque authenticated // 4. GLOBAL NAV: Alt + Key (Legacy/Default behavior for global nav) @@ -355,7 +355,14 @@ }); - + { + interactionMode.set('keyboard'); + handleKeydown(e); + }} + onmousedown={() => interactionMode.set('mouse')} + onfocusin={handleFocusIn} +/> {#if showHelp} (showHelp = false)} /> diff --git a/frontend/src/lib/stores/focus-store.ts b/frontend/src/lib/stores/focus-store.ts index b9450e43..ae72626d 100644 --- a/frontend/src/lib/stores/focus-store.ts +++ b/frontend/src/lib/stores/focus-store.ts @@ -1,6 +1,7 @@ import { writable } from 'svelte/store'; export type FocusStrategy = 'first-input' | 'trigger'; +export type InteractionMode = 'mouse' | 'keyboard'; interface FocusRequest { strategy: FocusStrategy; @@ -20,3 +21,4 @@ function createFocusStore() { } export const focusStore = createFocusStore(); +export const interactionMode = writable('mouse'); diff --git a/frontend/src/routes/dashboard/pedimentos/edit/[id]/+page.svelte b/frontend/src/routes/dashboard/pedimentos/edit/[id]/+page.svelte index 88a57648..85fab884 100644 --- a/frontend/src/routes/dashboard/pedimentos/edit/[id]/+page.svelte +++ b/frontend/src/routes/dashboard/pedimentos/edit/[id]/+page.svelte @@ -24,7 +24,7 @@ } from 'lucide-svelte'; import { useSidebar } from '$lib/components/ui/sidebar/context.svelte'; import { useShortcuts } from '$lib/hooks/use-shortcuts'; - import { focusStore } from '$lib/stores/focus-store'; + import { focusStore, interactionMode } from '$lib/stores/focus-store'; import { obtenerAtajosPrincipalesEdicionPedimento } from '$lib/config/shortcuts/dashboard/pedimentos/edit'; // Importar los componentes de cada pestaƱa (ahora sin botones de guardar propios) @@ -43,13 +43,17 @@ import ValidationTabForm from '$lib/components/dashboard/pedimentos/edit/validation-tab-form.svelte'; // Importar solo la API de pedimentos - import { pedimentosApi, type CreatePedimentoData, type UpdatePedimentoData } from '$lib/api/dashboard/a76/pedimentos'; + import { + pedimentosApi, + type CreatePedimentoData, + type UpdatePedimentoData + } from '$lib/api/dashboard/a76/pedimentos'; import type { PedimentoCode } from '$lib/api/dashboard/reference_data/pedimento_codes'; import type { CustomsSection } from '$lib/api/dashboard/reference_data/customs_sections'; import type { CustomsBroker } from '$lib/api/dashboard/a76/customs-brokers'; import type { ClientProvider } from '$lib/api/dashboard/a76/clients-providers'; import type { CodePedimentoRegimen } from '$lib/api/dashboard/reference_data/code_pedimento_regimens'; - + // Get sidebar context const sidebar = useSidebar(); @@ -76,8 +80,9 @@ let activeTab = $state('general'); // Focus first input when switching main tabs (mouse or shortcut) + $effect(() => { - if (activeTab) { + if (activeTab && $interactionMode === 'keyboard') { focusStore.request('first-input'); } });