feat: Enhance sidebar active state logic with path exclusion and add new permissions for pedidos, atas, objetos, and empresas.
This commit is contained in:
@@ -58,6 +58,8 @@
|
||||
label: string;
|
||||
link: string;
|
||||
permission?: MenuItemPermission;
|
||||
excludePaths?: string[];
|
||||
exact?: boolean;
|
||||
}
|
||||
|
||||
interface MenuItem {
|
||||
@@ -66,6 +68,8 @@
|
||||
link: string;
|
||||
permission?: MenuItemPermission;
|
||||
submenus?: SubMenuItem[];
|
||||
excludePaths?: string[];
|
||||
exact?: boolean;
|
||||
}
|
||||
|
||||
// Estrutura do menu definida no frontend
|
||||
@@ -107,7 +111,8 @@
|
||||
{
|
||||
label: 'Meus Pedidos',
|
||||
link: '/pedidos',
|
||||
permission: { recurso: 'pedidos', acao: 'listar' }
|
||||
permission: { recurso: 'pedidos', acao: 'listar' },
|
||||
excludePaths: ['/pedidos/aceite', '/pedidos/minhas-analises']
|
||||
},
|
||||
{
|
||||
label: 'Pedidos para Aceite',
|
||||
@@ -261,7 +266,15 @@
|
||||
return iconMap[name] || Home;
|
||||
}
|
||||
|
||||
function isRouteActive(path: string, exact = false) {
|
||||
function isRouteActive(path: string, options: { exact?: boolean; excludePaths?: string[] } = {}) {
|
||||
const { exact = false, excludePaths = [] } = options;
|
||||
|
||||
if (excludePaths.length > 0) {
|
||||
if (excludePaths.some((excludePath) => currentPath.startsWith(excludePath))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (exact) return currentPath === path;
|
||||
return currentPath === path || currentPath.startsWith(path + '/');
|
||||
}
|
||||
@@ -630,7 +643,10 @@
|
||||
<!-- Sidebar menu items -->
|
||||
{#snippet menuItem(item: MenuItem)}
|
||||
{@const Icon = getIconComponent(item.icon)}
|
||||
{@const isActive = isRouteActive(item.link, item.link === '/')}
|
||||
{@const isActive = isRouteActive(item.link, {
|
||||
exact: item.link === '/',
|
||||
excludePaths: item.excludePaths
|
||||
})}
|
||||
{@const hasSubmenus = item.submenus && item.submenus.length > 0}
|
||||
|
||||
<li class="mb-1">
|
||||
@@ -651,10 +667,13 @@
|
||||
class="h-4 w-4 opacity-50 transition-transform duration-200 group-open/details:rotate-180"
|
||||
/>
|
||||
</summary>
|
||||
<ul class="border-base-200 mt-1 ml-4 space-y-1 border-l-2 pl-2">
|
||||
<ul class="border-base-200 mt-1 ml-4 space-y-1 pl-2">
|
||||
{#if item.submenus}
|
||||
{#each item.submenus as sub (sub.link)}
|
||||
{@const isSubActive = isRouteActive(sub.link)}
|
||||
{@const isSubActive = isRouteActive(sub.link, {
|
||||
excludePaths: sub.excludePaths,
|
||||
exact: sub.exact
|
||||
})}
|
||||
<li>
|
||||
<a href={resolve(sub.link)} class={getMenuClasses(isSubActive, true)}>
|
||||
<span>{sub.label}</span>
|
||||
|
||||
@@ -433,6 +433,111 @@ const PERMISSOES_BASE = {
|
||||
acao: 'remover_item',
|
||||
descricao: 'Remover itens do pedido'
|
||||
},
|
||||
{
|
||||
nome: 'pedidos.editar',
|
||||
recurso: 'pedidos',
|
||||
acao: 'editar',
|
||||
descricao: 'Editar dados gerais do pedido'
|
||||
},
|
||||
{
|
||||
nome: 'pedidos.excluir',
|
||||
recurso: 'pedidos',
|
||||
acao: 'excluir',
|
||||
descricao: 'Excluir pedidos'
|
||||
},
|
||||
// Atas
|
||||
{
|
||||
nome: 'atas.listar',
|
||||
recurso: 'atas',
|
||||
acao: 'listar',
|
||||
descricao: 'Listar atas de registro de preços'
|
||||
},
|
||||
{
|
||||
nome: 'atas.criar',
|
||||
recurso: 'atas',
|
||||
acao: 'criar',
|
||||
descricao: 'Criar novas atas'
|
||||
},
|
||||
{
|
||||
nome: 'atas.ver',
|
||||
recurso: 'atas',
|
||||
acao: 'ver',
|
||||
descricao: 'Visualizar detalhes de atas'
|
||||
},
|
||||
{
|
||||
nome: 'atas.editar',
|
||||
recurso: 'atas',
|
||||
acao: 'editar',
|
||||
descricao: 'Editar atas'
|
||||
},
|
||||
{
|
||||
nome: 'atas.excluir',
|
||||
recurso: 'atas',
|
||||
acao: 'excluir',
|
||||
descricao: 'Excluir atas'
|
||||
},
|
||||
// Objetos
|
||||
{
|
||||
nome: 'objetos.listar',
|
||||
recurso: 'objetos',
|
||||
acao: 'listar',
|
||||
descricao: 'Listar objetos de contratação'
|
||||
},
|
||||
{
|
||||
nome: 'objetos.criar',
|
||||
recurso: 'objetos',
|
||||
acao: 'criar',
|
||||
descricao: 'Criar novos objetos'
|
||||
},
|
||||
{
|
||||
nome: 'objetos.ver',
|
||||
recurso: 'objetos',
|
||||
acao: 'ver',
|
||||
descricao: 'Visualizar detalhes de objetos'
|
||||
},
|
||||
{
|
||||
nome: 'objetos.editar',
|
||||
recurso: 'objetos',
|
||||
acao: 'editar',
|
||||
descricao: 'Editar objetos'
|
||||
},
|
||||
{
|
||||
nome: 'objetos.excluir',
|
||||
recurso: 'objetos',
|
||||
acao: 'excluir',
|
||||
descricao: 'Excluir objetos'
|
||||
},
|
||||
// Empresas
|
||||
{
|
||||
nome: 'empresas.listar',
|
||||
recurso: 'empresas',
|
||||
acao: 'listar',
|
||||
descricao: 'Listar empresas'
|
||||
},
|
||||
{
|
||||
nome: 'empresas.criar',
|
||||
recurso: 'empresas',
|
||||
acao: 'criar',
|
||||
descricao: 'Criar novas empresas'
|
||||
},
|
||||
{
|
||||
nome: 'empresas.ver',
|
||||
recurso: 'empresas',
|
||||
acao: 'ver',
|
||||
descricao: 'Visualizar detalhes de empresas'
|
||||
},
|
||||
{
|
||||
nome: 'empresas.editar',
|
||||
recurso: 'empresas',
|
||||
acao: 'editar',
|
||||
descricao: 'Editar empresas'
|
||||
},
|
||||
{
|
||||
nome: 'empresas.excluir',
|
||||
recurso: 'empresas',
|
||||
acao: 'excluir',
|
||||
descricao: 'Excluir empresas'
|
||||
},
|
||||
// Produtos
|
||||
{
|
||||
nome: 'produtos.listar',
|
||||
|
||||
Reference in New Issue
Block a user