fix: solución de bloqueos y estandarización de permisos
This commit is contained in:
@@ -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"
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
@@ -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 -->
|
||||
|
||||
Reference in New Issue
Block a user