fix: solución de bloqueos y estandarización de permisos

This commit is contained in:
2026-04-27 10:47:30 -05:00
parent fa3cbb4d0a
commit 5c2a84e95d
312 changed files with 13889 additions and 7911 deletions

View File

@@ -24,6 +24,7 @@ import { Title } from '../ui/alert';
export interface NavItem {
title: string;
url: string;
permission?: string;
}
export interface NavMainItem {
@@ -31,6 +32,7 @@ export interface NavMainItem {
url: string;
icon: any;
isActive?: boolean;
permission?: string;
items?: NavItem[];
}
@@ -108,6 +110,7 @@ export function getSidebarData(): SidebarData {
{
title: m["sidebar.reference_data.currency_types"](),
url: "/dashboard/reference_data/currency_types",
permission: "ref_currency_types.view",
},
{
title: m["sidebar.reference_data.customs_sections"](),
@@ -245,14 +248,17 @@ export function getSidebarData(): SidebarData {
{
title: m["sidebar.general_catalogs.conversions"](),
url: "/dashboard/general_catalogs/unit_conversions",
permission: "cat_unit_conversions.view",
},
{
title: m["sidebar.general_catalogs.equivalences"](),
url: "/dashboard/general_catalogs/equivalencies",
permission: "cat_equivalencies.view",
},
{
title: m["sidebar.general_catalogs.exchange_rates"](),
url: "/dashboard/general_catalogs/exchange-rate",
permission: "cat_exchange_rates.view",
},
{
title: m["sidebar.general_catalogs.currency_types"](),
@@ -261,6 +267,7 @@ export function getSidebarData(): SidebarData {
{
title: m["sidebar.general_catalogs.multi_currency"](),
url: "/dashboard/general_catalogs/multi_currency_types",
permission: "cat_multi_currency_types.view",
},
{
title: m["sidebar.general_catalogs.invoice_types"](),
@@ -411,23 +418,28 @@ export function getSidebarData(): SidebarData {
items: [
{
title: m["sidebar.import_invoices.temporary"](),
url: "/dashboard/invoices?operation_type=imp&invoice_type=TEM"
url: "/dashboard/invoices?operation_type=imp&invoice_type=TEM",
permission: "invoice.imp.tem.view"
},
{
title: m["sidebar.import_invoices.definitive"](),
url: "/dashboard/invoices?operation_type=imp&invoice_type=DEF",
permission: "invoice.imp.def.view"
},
{
title: m["sidebar.import_invoices.mexican_purchases"](),
url: "/dashboard/invoices?operation_type=imp&invoice_type=MEX",
permission: "invoice.imp.cm.view"
},
{
title: m["sidebar.import_invoices.regime_change"](),
url: "/dashboard/invoices?operation_type=imp&invoice_type=CR",
permission: "invoice.imp.cr.view"
},
{
title: m["sidebar.import_invoices.repair"](),
url: "/dashboard/invoices?operation_type=imp&invoice_type=REP",
permission: "invoice.imp.rep.view"
}
],
},
@@ -439,10 +451,12 @@ export function getSidebarData(): SidebarData {
{
title: m["sidebar.export_invoices.exportation"](),
url: "/dashboard/invoices?operation_type=exp",
permission: "invoice.exp.view"
},
{
title: m["sidebar.export_invoices.repair"](),
url: "/dashboard/invoices?operation_type=exp&invoice_type=REPAR",
permission: "invoice.exp.rep.view"
},
],
},

View File

@@ -4,6 +4,7 @@
import * as DropdownMenu from '$lib/components/ui/dropdown-menu/index.js';
import { useSidebar } from '$lib/components/ui/sidebar/context.svelte.js';
import ChevronRight from '@lucide/svelte/icons/chevron-right';
import { authStore, userHasPermission } from '$lib/auth';
let {
items
@@ -13,13 +14,37 @@
url: string;
icon?: any;
isActive?: boolean;
permission?: string;
items?: {
title: string;
url: string;
permission?: string;
}[];
}[];
} = $props();
// Filtrar items según permisos (si el item tiene la propiedad 'permission')
const filteredItems = $derived(
items
.map((item) => ({
...item,
items: item.items?.filter((subItem) => {
if (subItem.permission && !userHasPermission($authStore.user, subItem.permission)) return false;
return true;
})
}))
.filter((item) => {
// 1. Filtrar por permiso explícito del item principal
if (item.permission && !userHasPermission($authStore.user, item.permission)) return false;
// 2. Ocultar categorías (url="#") que se quedaron sin sub-items visibles
if (item.url === '#' && item.items && item.items.length === 0) return false;
return true;
})
);
const sidebar = useSidebar();
// Estado del Sistema Híbrido controlado por hover estricto (sin timers)
@@ -79,7 +104,7 @@
<Sidebar.Group>
<Sidebar.GroupLabel>Anexo-76</Sidebar.GroupLabel>
<Sidebar.Menu id="dashboard-sidebar-nav" aria-label="Navegación principal">
{#each items as item (item.title)}
{#each filteredItems as item (item.title)}
{#if item.items && item.items.length > 0}
{#if sidebar.state === 'collapsed'}
<!-- Sidebar Colapsado: Dropdown controlado por eventos estrictos -->