From a1e7dddda0439f4b3ba62ff39c84ac80e4b97a30 Mon Sep 17 00:00:00 2001 From: hreyes Date: Thu, 2 Jul 2026 21:00:34 +0000 Subject: [PATCH] feature/mejora-del-side-bar (#14) mejora de sidebar y correcciones en interfaces y propagacion de contrasena sql Reviewed-on: https://git.aduanasoft.com/ADUANASOFT/PANEL_BASES_ANEXO24/pulls/14 Co-authored-by: hreyes Co-committed-by: hreyes --- database/schema.sql | 22 +++ src/lib/components/AppShell.svelte | 220 ++++++++++++++++++++++++++--- src/lib/nav.test.ts | 38 +++++ src/lib/nav.ts | 36 +++++ src/lib/server/controldesk-pg.ts | 90 ++++++++++-- src/lib/server/mssql-nodes.test.ts | 54 +++++++ src/lib/server/mssql-nodes.ts | 28 +++- src/routes/+page.server.ts | 63 ++++++--- src/routes/+page.svelte | 139 +++++++----------- 9 files changed, 543 insertions(+), 147 deletions(-) create mode 100644 src/lib/nav.test.ts create mode 100644 src/lib/nav.ts create mode 100644 src/lib/server/mssql-nodes.test.ts diff --git a/database/schema.sql b/database/schema.sql index 241fd90..0a37f84 100644 --- a/database/schema.sql +++ b/database/schema.sql @@ -106,6 +106,28 @@ ALTER TABLE a24c.database_nodes ADD COLUMN IF NOT EXISTS restore_target_id INTEGER REFERENCES a24c.restore_targets (id) ON DELETE SET NULL; +-- Backfill único: la credencial SQL del nodo (database_nodes.sql_password, columna de a24c) se +-- copia del restaurador asignado como sobre cifrado gcm: (el panel lo descifra al conectar). +-- Idempotente: solo rellena nodos ya asignados sin contraseña; no pisa valores existentes. +-- Guardado por si a24c aún no aprovisionó la columna sql_password (evita romper el init). +-- Rollback: UPDATE a24c.database_nodes SET sql_password = NULL; +DO $$ +BEGIN + IF EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_schema = 'a24c' + AND table_name = 'database_nodes' + AND column_name = 'sql_password' + ) THEN + UPDATE a24c.database_nodes n + SET sql_password = rt.sql_password_encrypted + FROM a24c.restore_targets rt + WHERE n.restore_target_id = rt.id + AND rt.sql_password_encrypted IS NOT NULL + AND (n.sql_password IS NULL OR n.sql_password = ''); + END IF; +END $$; + -- Bitácora de restauraciones reportadas por CloudRestoreAS. CREATE TABLE IF NOT EXISTS a24c.restore_job_logs ( id SERIAL PRIMARY KEY, diff --git a/src/lib/components/AppShell.svelte b/src/lib/components/AppShell.svelte index 10f21ef..38f4299 100644 --- a/src/lib/components/AppShell.svelte +++ b/src/lib/components/AppShell.svelte @@ -1,7 +1,8 @@ {#snippet navLink(item: NavItem, isCollapsed: boolean)} { + if (isCollapsed) showNavTip(item, e.currentTarget); + }} + onmouseleave={() => { + if (isCollapsed) hideNavTip(); + }} class={`flex w-full items-center gap-2 rounded-lg py-2 text-[0.75rem] font-medium transition-colors ${ isActive(item.href) ? 'bg-sky-50 text-sky-800 border border-sky-100' : 'text-slate-600 hover:bg-slate-100' } ${isCollapsed ? 'justify-center px-2' : 'px-2.5'}`} - title={isCollapsed ? item.label : ''} > {item.icon} {#if !isCollapsed}{item.label}{/if} {/snippet} +{#snippet viewLink(view: PanelView, isCollapsed: boolean)} + handleViewClick(event, view)} + class={`flex w-full items-center gap-2 rounded-lg py-2 text-[0.75rem] font-medium transition-colors ${ + activePanelView === view.key + ? 'bg-sky-50 text-sky-800 border border-sky-100' + : 'text-slate-600 hover:bg-slate-100' + } ${isCollapsed ? 'justify-center px-2' : 'px-2.5'}`} + title={isCollapsed ? view.label : ''} + > + {view.icon} + {#if !isCollapsed}{view.label}{/if} + +{/snippet} + {#snippet sidebarInner(isCollapsed: boolean, isMobile: boolean)}
-
+
-
- Aduanasoft +
+ Aduanasoft
{#if !isCollapsed || isMobile}
@@ -113,10 +215,10 @@ {:else} {/if}
@@ -127,20 +229,60 @@ {#if !isCollapsed || isMobile}

General

{/if} + + + {#if isCollapsed && !isMobile} + +
+ + +
+ {:else} + + {#if panelGroupOpen} +
+ {#each panelViews as view (view.key)} + {@render viewLink(view, false)} + {/each} +
+ {/if} + {/if} + {#each navGeneral as item (item.href)} {@render navLink(item, isCollapsed && !isMobile)} {/each}
- {#if navExtra} -
- {#if !isCollapsed || isMobile} -

Vistas

- {/if} - {@render navExtra(isCollapsed && !isMobile)} -
- {/if} - {#if isAdmin}
{#if !isCollapsed || isMobile} @@ -193,11 +335,49 @@ {/snippet}
+ + {#if $navigating} +
+ {/if} + + + {#if collapsed && panelFlyoutOpen} + + {/if} + + + {#if collapsed && navTip} + + {/if} + {#if mobileOpen} - - - - {#if data.currentUser?.es_admin} - - {/if} - - {#if data.currentUser?.es_admin} - - {/if} - {/snippet} -
{#if activeView === 'dashboard'} @@ -1608,10 +1561,15 @@

Respaldos restaurados

- Último respaldo restaurado por nodo, por servidor de restauración. Se - conserva aunque el nodo se reasigne a otro restaurador. + Historial de restauraciones exitosas por servidor, reportadas por + CloudRestoreAS.

+ {#if data.errors?.restores} +
+ {data.errors.restores} +
+ {/if}
@@ -1625,7 +1583,7 @@ - {#each restoredBackups as r (r.database_node_id)} + {#each restoredBackups as r (r.id)}
{r.server_name ?? '—'} @@ -1668,6 +1626,11 @@ para diagnóstico.

+ {#if data.errors?.restores} +
+ {data.errors.restores} +
+ {/if}