From cdc3557d8eaff32a792d0744786b757730d4f226 Mon Sep 17 00:00:00 2001 From: busya Date: Wed, 11 Mar 2026 11:29:24 +0300 Subject: [PATCH] Migrate frontend to Svelte 5 runes semantics --- backend/mappings.db | Bin 282624 -> 0 bytes backend/migrations.db | Bin 28672 -> 0 bytes frontend/src/components/DashboardGrid.svelte | 19 +- frontend/src/components/DynamicForm.svelte | 17 +- frontend/src/components/EnvSelector.svelte | 12 +- frontend/src/components/MappingTable.svelte | 10 +- .../src/components/MissingMappingModal.svelte | 20 +- frontend/src/components/Navbar.svelte | 23 ++- frontend/src/components/PasswordPrompt.svelte | 25 +-- .../components/RepositoryDashboardGrid.svelte | 13 +- frontend/src/components/TaskHistory.svelte | 10 +- frontend/src/components/TaskList.svelte | 13 +- frontend/src/components/TaskLogViewer.svelte | 25 +-- frontend/src/components/TaskRunner.svelte | 44 ++--- .../src/components/backups/BackupList.svelte | 10 +- .../components/backups/BackupManager.svelte | 34 ++-- .../src/components/git/BranchSelector.svelte | 12 +- .../src/components/git/CommitModal.svelte | 6 +- .../components/git/ConflictResolver.svelte | 9 +- .../src/components/git/DeploymentModal.svelte | 8 +- frontend/src/components/git/GitManager.svelte | 12 +- .../src/components/llm/ProviderConfig.svelte | 33 ++-- .../src/components/storage/FileList.svelte | 13 +- .../src/components/storage/FileUpload.svelte | 12 +- .../src/components/tasks/LogFilterBar.svelte | 13 +- .../src/components/tasks/TaskLogPanel.svelte | 16 +- .../components/tools/ConnectionForm.svelte | 26 ++- .../components/tools/ConnectionList.svelte | 10 +- .../src/components/tools/DebugTool.svelte | 6 +- .../src/components/tools/MapperTool.svelte | 10 +- .../assistant/AssistantChatPanel.svelte | 110 ++++++----- .../lib/components/layout/Breadcrumbs.svelte | 12 +- .../src/lib/components/layout/Sidebar.svelte | 131 +++++++------ .../lib/components/layout/TaskDrawer.svelte | 159 +++++++-------- .../lib/components/layout/TopNavbar.svelte | 83 ++++---- .../lib/components/reports/ReportCard.svelte | 7 +- .../lib/components/reports/ReportsList.svelte | 2 +- frontend/src/lib/ui/Icon.svelte | 12 +- frontend/src/pages/Dashboard.svelte | 14 +- frontend/src/pages/Settings.svelte | 12 +- frontend/src/routes/+error.svelte | 6 +- frontend/src/routes/+layout.svelte | 21 +- frontend/src/routes/admin/roles/+page.svelte | 28 +-- .../src/routes/admin/settings/+page.svelte | 23 ++- .../routes/admin/settings/llm/+page.svelte | 2 +- frontend/src/routes/admin/users/+page.svelte | 29 +-- frontend/src/routes/dashboards/+page.svelte | 2 +- .../src/routes/dashboards/[id]/+page.svelte | 141 +++++++------- frontend/src/routes/datasets/+page.svelte | 184 ++++++++++-------- .../src/routes/datasets/[id]/+page.svelte | 29 ++- frontend/src/routes/git/+page.svelte | 38 ++-- frontend/src/routes/login/+page.svelte | 4 +- frontend/src/routes/migration/+page.svelte | 103 +++++----- .../routes/migration/mappings/+page.svelte | 8 +- frontend/src/routes/reports/+page.svelte | 14 +- .../routes/reports/llm/[taskId]/+page.svelte | 59 +++--- frontend/src/routes/settings/+page.svelte | 100 +++++----- .../routes/settings/connections/+page.svelte | 2 +- frontend/src/routes/settings/git/+page.svelte | 38 ++-- .../src/routes/storage/repos/+page.svelte | 38 ++-- .../src/routes/tools/storage/+page.svelte | 39 ++-- mappings.db | Bin 28672 -> 0 bytes 62 files changed, 989 insertions(+), 922 deletions(-) delete mode 100644 backend/mappings.db delete mode 100644 backend/migrations.db delete mode 100644 mappings.db diff --git a/backend/mappings.db b/backend/mappings.db deleted file mode 100644 index 0ec2020c3a4e5b7a5c82977dcc7c11d7d975737e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 282624 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 // [SECTION: IMPORTS] - import { createEventDispatcher } from "svelte"; import type { DashboardMetadata } from "../types/dashboard"; import { t } from "../lib/i18n"; import { Button, Input } from "../lib/ui"; @@ -108,10 +107,6 @@ ); // [/SECTION] - // [SECTION: EVENTS] - const dispatch = createEventDispatcher<{ selectionChanged: number[] }>(); - // [/SECTION] - // [DEF:handleSort:Function] // @PURPOSE: Toggles sort direction or changes sort column. // @PRE: column name is provided. @@ -129,7 +124,7 @@ // [DEF:handleSelectionChange:Function] // @PURPOSE: Handles individual checkbox changes. // @PRE: dashboard ID and checked status provided. - // @POST: selectedIds array updated and selectionChanged event dispatched. + // @POST: selectedIds array updated. function handleSelectionChange(id: number, checked: boolean) { let newSelected = [...selectedIds]; if (checked) { @@ -138,14 +133,13 @@ newSelected = newSelected.filter((sid) => sid !== id); } selectedIds = newSelected; - dispatch("selectionChanged", newSelected); } // [/DEF:handleSelectionChange:Function] // [DEF:handleSelectAll:Function] // @PURPOSE: Handles select all checkbox. // @PRE: checked status provided. - // @POST: selectedIds array updated for all paginated items and event dispatched. + // @POST: selectedIds array updated for all paginated items. function handleSelectAll(checked: boolean) { let newSelected = [...selectedIds]; if (checked) { @@ -158,7 +152,6 @@ }); } selectedIds = newSelected; - dispatch("selectionChanged", newSelected); } // [/DEF:handleSelectAll:Function] @@ -286,7 +279,7 @@ @@ -336,7 +329,7 @@ variant="secondary" size="sm" disabled={currentPage >= totalPages - 1} - on:click={() => goToPage(currentPage + 1)} + onclick={() => goToPage(currentPage + 1)} > {$t.dashboard.next} diff --git a/frontend/src/components/DynamicForm.svelte b/frontend/src/components/DynamicForm.svelte index fa9b059d..2d9f0a56 100755 --- a/frontend/src/components/DynamicForm.svelte +++ b/frontend/src/components/DynamicForm.svelte @@ -3,7 +3,7 @@ @SEMANTICS: form, schema, dynamic, json-schema @PURPOSE: Generates a form dynamically based on a JSON schema. @LAYER: UI -@RELATION: DEPENDS_ON -> svelte:createEventDispatcher +@RELATION: BINDS_TO -> onsubmit callback @PROPS: - schema: Object - JSON schema for the form. @@ -11,27 +11,22 @@ - submit: Object - Dispatched when the form is submitted, containing the form data. --> -
+ { event.preventDefault(); handleSubmit(); }} class="space-y-4"> {#if schema && schema.properties} {#each Object.entries(schema.properties) as [key, prop]}
diff --git a/frontend/src/components/EnvSelector.svelte b/frontend/src/components/EnvSelector.svelte index 10cc9744..5865685c 100644 --- a/frontend/src/components/EnvSelector.svelte +++ b/frontend/src/components/EnvSelector.svelte @@ -10,7 +10,6 @@ @@ -47,7 +45,7 @@ id="env-select" class="block w-full pl-3 pr-10 py-2 text-base border-gray-300 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm rounded-md" value={selectedId} - on:change={handleSelect} + onchange={handleSelect} > {#each environments as env} diff --git a/frontend/src/components/MappingTable.svelte b/frontend/src/components/MappingTable.svelte index 736ce3fe..7e109f17 100644 --- a/frontend/src/components/MappingTable.svelte +++ b/frontend/src/components/MappingTable.svelte @@ -10,7 +10,6 @@ @@ -72,7 +69,7 @@
  • @@ -241,7 +244,7 @@ {taskId} {logs} {autoScroll} - on:filterChange={handleFilterChange} + onfilterchange={handleFilterChange} /> {/if}
  • diff --git a/frontend/src/components/TaskRunner.svelte b/frontend/src/components/TaskRunner.svelte index 83dd5f69..c71f279a 100755 --- a/frontend/src/components/TaskRunner.svelte +++ b/frontend/src/components/TaskRunner.svelte @@ -370,12 +370,12 @@
    - + {#if waitingForData && connectionStatus === 'connected'}
    @@ -388,22 +388,22 @@ {/if}
    - { connectionStatus = 'disconnected'; ws.close(); }} -/> - - { showPasswordPrompt = false; }} -/> + { connectionStatus = 'disconnected'; ws.close(); }} +/> + + { showPasswordPrompt = false; }} +/> diff --git a/frontend/src/components/backups/BackupList.svelte b/frontend/src/components/backups/BackupList.svelte index b684793a..89175e55 100644 --- a/frontend/src/components/backups/BackupList.svelte +++ b/frontend/src/components/backups/BackupList.svelte @@ -49,7 +49,7 @@
    diff --git a/frontend/src/components/backups/BackupManager.svelte b/frontend/src/components/backups/BackupManager.svelte index f3accdcc..a6736c5a 100644 --- a/frontend/src/components/backups/BackupManager.svelte +++ b/frontend/src/components/backups/BackupManager.svelte @@ -21,23 +21,27 @@ // [/SECTION] // [SECTION: STATE] - let backups: Backup[] = []; - let environments: any[] = []; - let selectedEnvId = ''; - let loading = true; - let creating = false; - let savingSchedule = false; - let currentPath = 'backups'; + let backups: Backup[] = $state([]); + let environments: any[] = $state([]); + let selectedEnvId = $state(''); + let loading = $state(true); + let creating = $state(false); + let savingSchedule = $state(false); + let currentPath = $state('backups'); // Schedule state for selected environment - let scheduleEnabled = false; - let cronExpression = '0 0 * * *'; + let scheduleEnabled = $state(false); + let cronExpression = $state('0 0 * * *'); + let selectedEnv = $derived( + environments.find((environment) => environment.id === selectedEnvId), + ); - $: selectedEnv = environments.find(e => e.id === selectedEnvId); - $: if (selectedEnv) { + $effect(() => { + if (!selectedEnv) return; scheduleEnabled = selectedEnv.backup_schedule?.enabled ?? false; - cronExpression = selectedEnv.backup_schedule?.cron_expression ?? '0 0 * * *'; - } + cronExpression = + selectedEnv.backup_schedule?.cron_expression ?? '0 0 * * *'; + }); // [/SECTION] // [DEF:loadData:Function] @@ -193,7 +197,7 @@
    {#if activeTaskDetails?.plugin_id === "llm_dashboard_validation"} @@ -719,7 +723,7 @@ {@const taskValidation = resolveLlmValidationStatus(task)}
    - + {/if} -``` diff --git a/frontend/src/lib/components/layout/TopNavbar.svelte b/frontend/src/lib/components/layout/TopNavbar.svelte index 56fc4f67..67809b94 100644 --- a/frontend/src/lib/components/layout/TopNavbar.svelte +++ b/frontend/src/lib/components/layout/TopNavbar.svelte @@ -30,9 +30,9 @@ * @TEST_INVARIANT ui_consistency -> verifies: [logged_in] */ - import { createEventDispatcher, onMount } from "svelte"; + import { onMount } from "svelte"; import { goto } from "$app/navigation"; - import { page } from "$app/stores"; + import { page } from "$app/state"; import { api } from "$lib/api.js"; import { getReports } from "$lib/api/reports.js"; import { activityStore } from "$lib/stores/activity.js"; @@ -55,32 +55,44 @@ setSelectedEnvironment, selectedEnvironmentStore, } from "$lib/stores/environmentContext.js"; + import { fromStore } from "svelte/store"; - const dispatch = createEventDispatcher(); - - let showUserMenu = false; - let isSearchFocused = false; - let searchQuery = ""; - let showSearchDropdown = false; - let isSearchLoading = false; - let groupedSearchResults = []; + let showUserMenu = $state(false); + let isSearchFocused = $state(false); + let searchQuery = $state(""); + let showSearchDropdown = $state(false); + let isSearchLoading = $state(false); + let groupedSearchResults = $state([]); let searchTimer = null; const SEARCH_DEBOUNCE_MS = 250; const SEARCH_MIN_LENGTH = 2; const SEARCH_LIMIT = 5; - $: isExpanded = $sidebarStore?.isExpanded ?? true; - $: activeCount = $activityStore?.activeCount || 0; - $: recentTasks = $activityStore?.recentTasks || []; - $: user = $auth?.user || null; - $: canOpenSettings = hasPermission(user, "admin:settings", "READ"); - $: globalEnvironments = $environmentContextStore?.environments || []; - $: globalSelectedEnvId = $environmentContextStore?.selectedEnvId || ""; - $: globalSelectedEnv = $selectedEnvironmentStore; - $: isProdContext = + const sidebarState = fromStore(sidebarStore); + const activityState = fromStore(activityStore); + const authState = fromStore(auth); + const environmentContextState = fromStore(environmentContextStore); + const selectedEnvironmentState = fromStore(selectedEnvironmentStore); + + let isExpanded = $derived(sidebarState.current?.isExpanded ?? true); + let activeCount = $derived(activityState.current?.activeCount || 0); + let recentTasks = $derived(activityState.current?.recentTasks || []); + let user = $derived(authState.current?.user || null); + let canOpenSettings = $derived( + hasPermission(user, "admin:settings", "READ"), + ); + let globalEnvironments = $derived( + environmentContextState.current?.environments || [], + ); + let globalSelectedEnvId = $derived( + environmentContextState.current?.selectedEnvId || "", + ); + let globalSelectedEnv = $derived(selectedEnvironmentState.current); + let isProdContext = $derived( String(globalSelectedEnv?.stage || "").toUpperCase() === "PROD" || - Boolean(globalSelectedEnv?.is_production); + Boolean(globalSelectedEnv?.is_production), + ); function toggleUserMenu(event) { event.stopPropagation(); @@ -106,7 +118,6 @@ } else { openDrawer(); } - dispatch("activityClick"); } function handleAssistantClick() { @@ -358,7 +369,7 @@ @@ -271,9 +271,9 @@ {env.username} {env.is_default ? $t.common?.yes : $t.common?.no} - - - + + + {/each} @@ -324,11 +324,11 @@
    - {#if editingEnvId} - {/if} diff --git a/frontend/src/routes/+error.svelte b/frontend/src/routes/+error.svelte index 80f3411d..d85aa271 100644 --- a/frontend/src/routes/+error.svelte +++ b/frontend/src/routes/+error.svelte @@ -6,13 +6,13 @@ * @LAYER: UI * @UX_STATE: Error -> Displays error code and message with home link */ - import { page } from "$app/stores"; + import { page } from "$app/state"; - - + + {/each} @@ -197,29 +197,33 @@

    {isEditing ? $t.admin.roles.modal_edit_title : $t.admin.roles.modal_create_title}

    - + { + event.preventDefault(); + handleSaveRole(); + }}>
    - - + +
    - - + +
    - -
    +

    {$t.admin.roles.permissions}

    +
    + {$t.admin.roles.permissions} {#each permissions as perm} {/each} -
    +

    {$t.admin.roles.permissions_hint}

    - +
    diff --git a/frontend/src/routes/admin/settings/+page.svelte b/frontend/src/routes/admin/settings/+page.svelte index 6730725b..d26599b4 100644 --- a/frontend/src/routes/admin/settings/+page.svelte +++ b/frontend/src/routes/admin/settings/+page.svelte @@ -180,7 +180,7 @@

    {$t.admin.settings.title}

    @@ -244,8 +244,9 @@
    - + @@ -285,7 +287,7 @@
    +
    diff --git a/frontend/src/routes/dashboards/+page.svelte b/frontend/src/routes/dashboards/+page.svelte index 7c27f969..42228fe2 100644 --- a/frontend/src/routes/dashboards/+page.svelte +++ b/frontend/src/routes/dashboards/+page.svelte @@ -2392,7 +2392,7 @@ target_db_uuid: t, }))} suggestions={availableDbMappings} - on:update={handleMappingUpdate} + onupdate={handleMappingUpdate} />
    {:else} diff --git a/frontend/src/routes/dashboards/[id]/+page.svelte b/frontend/src/routes/dashboards/[id]/+page.svelte index 3021c673..0645279a 100644 --- a/frontend/src/routes/dashboards/[id]/+page.svelte +++ b/frontend/src/routes/dashboards/[id]/+page.svelte @@ -24,7 +24,7 @@ import { onMount, onDestroy } from "svelte"; import { goto } from "$app/navigation"; - import { page } from "$app/stores"; + import { page } from "$app/state"; import { t } from "$lib/i18n"; import { api } from "$lib/api.js"; import { gitService } from "../../../services/gitService"; @@ -37,43 +37,48 @@ import CommitHistory from "../../../components/git/CommitHistory.svelte"; import GitManager from "../../../components/git/GitManager.svelte"; - $: dashboardRef = $page.params.id; - $: envId = $page.url.searchParams.get("env_id") || ""; - $: gitDashboardRef = dashboard?.slug || dashboardRef || ""; - $: resolvedDashboardId = + let dashboardRef = $derived(page.params.id); + let envId = $derived(page.url.searchParams.get("env_id") || ""); + let gitDashboardRef = $derived(dashboard?.slug || dashboardRef || ""); + let resolvedDashboardId = $derived( dashboard?.id ?? - (/^\d+$/.test(String(dashboardRef || "")) ? Number(dashboardRef) : null); + (/^\d+$/.test(String(dashboardRef || "")) ? Number(dashboardRef) : null), + ); - let dashboard = null; - let isLoading = true; - let error = null; - let taskHistory = []; - let isTaskHistoryLoading = false; - let taskHistoryError = null; - let isStartingBackup = false; - let isStartingValidation = false; - let thumbnailUrl = ""; - let isThumbnailLoading = false; - let thumbnailError = null; - let llmReady = true; - let llmStatusReason = ""; - let gitStatus = null; - let isGitStatusLoading = false; - let gitStatusError = null; - let gitDiffPreview = ""; - let isGitDiffLoading = false; - let isSyncingGit = false; - let isPullingGit = false; - let isPushingGit = false; - let currentBranch = "main"; - let activeTab = "resources"; - let showGitManager = false; - let wasGitManagerOpen = false; - let gitMeta = getGitStatusMeta(); - let gitSyncState = "NO_REPO"; - let changedChartsCount = 0; - let changedDatasetsCount = 0; - let hasChangesToCommit = false; + let dashboard = $state(null); + let isLoading = $state(true); + let error = $state(null); + let taskHistory = $state([]); + let isTaskHistoryLoading = $state(false); + let taskHistoryError = $state(null); + let isStartingBackup = $state(false); + let isStartingValidation = $state(false); + let thumbnailUrl = $state(""); + let isThumbnailLoading = $state(false); + let thumbnailError = $state(null); + let llmReady = $state(true); + let llmStatusReason = $state(""); + let gitStatus = $state(null); + let isGitStatusLoading = $state(false); + let gitStatusError = $state(null); + let gitDiffPreview = $state(""); + let isGitDiffLoading = $state(false); + let isSyncingGit = $state(false); + let isPullingGit = $state(false); + let isPushingGit = $state(false); + let currentBranch = $state("main"); + let activeTab = $state("resources"); + let showGitManager = $state(false); + let wasGitManagerOpen = $state(false); + let gitMeta = $derived(getGitStatusMeta()); + let gitSyncState = $derived(resolveGitSyncState()); + let changedChartsCount = $derived( + countChangedByAnyPath(["/charts/", "charts/"]), + ); + let changedDatasetsCount = $derived( + countChangedByAnyPath(["/datasets/", "datasets/"]), + ); + let hasChangesToCommit = $derived(allChangedFiles().length > 0); onMount(async () => { await loadDashboardPage(); @@ -504,21 +509,15 @@ await loadGitStatus(); } - $: { - gitStatus; - $t; - gitMeta = getGitStatusMeta(); - gitSyncState = resolveGitSyncState(); - changedChartsCount = countChangedByAnyPath(["/charts/", "charts/"]); - changedDatasetsCount = countChangedByAnyPath(["/datasets/", "datasets/"]); - hasChangesToCommit = allChangedFiles().length > 0; - } - $: if (showGitManager) { - wasGitManagerOpen = true; - } else if (wasGitManagerOpen) { + $effect(() => { + if (showGitManager) { + wasGitManagerOpen = true; + return; + } + if (!wasGitManagerOpen) return; wasGitManagerOpen = false; - loadGitStatus(); - } + void loadGitStatus(); + });
    @@ -526,7 +525,7 @@
    {/if} @@ -568,13 +567,13 @@
    @@ -633,7 +632,7 @@ {error} @@ -660,7 +659,7 @@
    @@ -746,7 +745,7 @@
    @@ -891,7 +890,7 @@ {#if chart.dataset_id} diff --git a/frontend/src/routes/datasets/+page.svelte b/frontend/src/routes/datasets/+page.svelte index ade754cb..9d488521 100644 --- a/frontend/src/routes/datasets/+page.svelte +++ b/frontend/src/routes/datasets/+page.svelte @@ -36,6 +36,7 @@ import { onMount } from "svelte"; import { goto } from "$app/navigation"; + import { fromStore } from "svelte/store"; import { t } from "$lib/i18n"; import { openDrawerForTask, @@ -50,38 +51,44 @@ selectedEnvironmentStore, } from "$lib/stores/environmentContext.js"; + const environmentContextState = fromStore(environmentContextStore); + const selectedEnvironmentState = fromStore(selectedEnvironmentStore); + // State - let selectedEnv = null; - let datasets = []; - let isLoading = true; - let error = null; + let selectedEnv = $state(null); + let datasets = $state([]); + let isLoading = $state(true); + let error = $state(null); // Pagination state - let currentPage = 1; - let pageSize = 10; - let totalPages = 1; - let total = 0; + let currentPage = $state(1); + let pageSize = $state(10); + let totalPages = $state(1); + let total = $state(0); // Selection state - let selectedIds = new Set(); - let isAllSelected = false; - let isAllVisibleSelected = false; + let selectedIds = $state(new Set()); + let isAllSelected = $state(false); + let isAllVisibleSelected = $state(false); // Search state - let searchQuery = ""; + let searchQuery = $state(""); // Bulk action modal state - let showMapColumnsModal = false; - let showGenerateDocsModal = false; - let mapSourceType = "postgresql"; - let mapConnectionId = ""; - let mapFileData = null; - let mapFileInput; - let llmProvider = ""; - let llmOptions = {}; + let showMapColumnsModal = $state(false); + let showGenerateDocsModal = $state(false); + let mapSourceType = $state("postgresql"); + let mapConnectionId = $state(""); + let mapFileData = $state(null); + let mapFileInput = $state(null); + let llmProvider = $state(""); + let llmOptions = $state({}); // Environment options - will be loaded from API - let environments = []; + let environments = $derived( + environmentContextState.current?.environments || [], + ); + let activeEnvironment = $derived(selectedEnvironmentState.current || null); // Debounced search function const debouncedSearch = debounce((query) => { @@ -92,8 +99,8 @@ // Load environments and datasets on mount onMount(async () => { await initializeEnvironmentContext(); - if (!selectedEnv && $environmentContextStore?.selectedEnvId) { - selectedEnv = $environmentContextStore.selectedEnvId; + if (!selectedEnv && environmentContextState.current?.selectedEnvId) { + selectedEnv = environmentContextState.current.selectedEnvId; } await loadDatasets(); }); @@ -387,18 +394,15 @@ } } - $: environments = $environmentContextStore?.environments || []; - $: activeEnvironment = $selectedEnvironmentStore; - $: if ( - $environmentContextStore?.selectedEnvId && - selectedEnv !== $environmentContextStore.selectedEnvId - ) { - selectedEnv = $environmentContextStore.selectedEnvId; + $effect(() => { + const nextSelectedEnvId = environmentContextState.current?.selectedEnvId; + if (!nextSelectedEnvId || selectedEnv === nextSelectedEnvId) return; + selectedEnv = nextSelectedEnvId; setSelectedEnvironment(selectedEnv); currentPage = 1; selectedIds.clear(); - loadDatasets(); - } + void loadDatasets(); + });
    @@ -415,7 +419,7 @@ @@ -430,7 +434,7 @@ {error} @@ -482,14 +486,14 @@
    @@ -542,7 +546,7 @@ handleCheckboxChange(dataset, e)} + onchange={(e) => handleCheckboxChange(dataset, e)} />
    @@ -587,11 +591,10 @@
    {#if dataset.lastTask} -
    handleTaskStatusClick(dataset)} - role="button" - tabindex="0" +
    + {:else} - {/if} @@ -617,7 +620,7 @@ {#if dataset.actions.includes("map_columns")} {/each}
    {#if mapSourceType === "postgresql"}
    - + {:else}
    - + {/if}
    - -
    +

    + {$t.datasets?.selected_datasets} +

    +
    {#each Array.from(selectedIds) as id} {#each datasets as d} {#if d.id === id} @@ -830,13 +839,16 @@
    @@ -269,11 +269,10 @@
    {#each dataset.linked_dashboards as dashboard} -
    navigateToDashboard(dashboard)} - role="button" - tabindex="0" + {/each}
    diff --git a/frontend/src/routes/git/+page.svelte b/frontend/src/routes/git/+page.svelte index 83341874..7dc57cba 100644 --- a/frontend/src/routes/git/+page.svelte +++ b/frontend/src/routes/git/+page.svelte @@ -6,6 +6,7 @@ -->
    diff --git a/frontend/src/routes/login/+page.svelte b/frontend/src/routes/login/+page.svelte index 39ebaa32..cd4c0e87 100644 --- a/frontend/src/routes/login/+page.svelte +++ b/frontend/src/routes/login/+page.svelte @@ -102,7 +102,7 @@
    {/if} -
    + { event.preventDefault(); handleLogin(); }} class="space-y-4">
    @@ -310,7 +315,7 @@ @@ -480,7 +480,7 @@ {error} @@ -510,7 +510,7 @@ class:hover:text-gray-800={activeTab !== "environments"} class:hover:border-gray-300={activeTab !== "environments"} aria-current={activeTab === "environments" ? "page" : undefined} - on:click={() => handleTabChange("environments")} + onclick={() => handleTabChange("environments")} > {$t.settings?.environments} @@ -523,7 +523,7 @@ class:hover:text-gray-800={activeTab !== "logging"} class:hover:border-gray-300={activeTab !== "logging"} aria-current={activeTab === "logging" ? "page" : undefined} - on:click={() => handleTabChange("logging")} + onclick={() => handleTabChange("logging")} > {$t.settings?.logging} @@ -536,7 +536,7 @@ class:hover:text-gray-800={activeTab !== "connections"} class:hover:border-gray-300={activeTab !== "connections"} aria-current={activeTab === "connections" ? "page" : undefined} - on:click={() => handleTabChange("connections")} + onclick={() => handleTabChange("connections")} > {$t.settings?.connections} @@ -549,7 +549,7 @@ class:hover:text-gray-800={activeTab !== "git"} class:hover:border-gray-300={activeTab !== "git"} aria-current={activeTab === "git" ? "page" : undefined} - on:click={() => handleTabChange("git")} + onclick={() => handleTabChange("git")} > {$t.nav?.settings_git || $t.nav?.git || "Git"} @@ -562,7 +562,7 @@ class:hover:text-gray-800={activeTab !== "llm"} class:hover:border-gray-300={activeTab !== "llm"} aria-current={activeTab === "llm" ? "page" : undefined} - on:click={() => handleTabChange("llm")} + onclick={() => handleTabChange("llm")} > {$t.settings?.llm} @@ -575,7 +575,7 @@ class:hover:text-gray-800={activeTab !== "migration"} class:hover:border-gray-300={activeTab !== "migration"} aria-current={activeTab === "migration" ? "page" : undefined} - on:click={() => handleTabChange("migration")} + onclick={() => handleTabChange("migration")} > {$t.settings?.migration_sync} @@ -588,7 +588,7 @@ class:hover:text-gray-800={activeTab !== "storage"} class:hover:border-gray-300={activeTab !== "storage"} aria-current={activeTab === "storage" ? "page" : undefined} - on:click={() => handleTabChange("storage")} + onclick={() => handleTabChange("storage")} > {$t.settings?.storage} @@ -601,7 +601,7 @@ class:hover:text-gray-800={activeTab !== "automation"} class:hover:border-gray-300={activeTab !== "automation"} aria-current={activeTab === "automation" ? "page" : undefined} - on:click={() => handleTabChange("automation")} + onclick={() => handleTabChange("automation")} > {$t.settings?.automation || "Automation"} @@ -623,7 +623,7 @@
    @@ -957,7 +957,7 @@
    @@ -1242,14 +1242,14 @@