Files
sgse-app/apps/web/src/routes/(dashboard)/+layout.svelte

85 lines
3.1 KiB
Svelte

<script lang="ts">
import { page } from "$app/state";
import MenuProtection from "$lib/components/MenuProtection.svelte";
const { children } = $props();
// Mapa de rotas para verificação de permissões
const ROUTE_PERMISSIONS: Record<string, { path: string; requireGravar?: boolean }> = {
// Recursos Humanos
"/recursos-humanos": { path: "/recursos-humanos" },
"/recursos-humanos/funcionarios": { path: "/recursos-humanos/funcionarios" },
"/recursos-humanos/funcionarios/cadastro": { path: "/recursos-humanos/funcionarios", requireGravar: true },
"/recursos-humanos/funcionarios/excluir": { path: "/recursos-humanos/funcionarios", requireGravar: true },
"/recursos-humanos/funcionarios/relatorios": { path: "/recursos-humanos/funcionarios" },
"/recursos-humanos/simbolos": { path: "/recursos-humanos/simbolos" },
"/recursos-humanos/simbolos/cadastro": { path: "/recursos-humanos/simbolos", requireGravar: true },
// Outros menus
"/financeiro": { path: "/financeiro" },
"/controladoria": { path: "/controladoria" },
"/licitacoes": { path: "/licitacoes" },
"/compras": { path: "/compras" },
"/juridico": { path: "/juridico" },
"/comunicacao": { path: "/comunicacao" },
"/programas-esportivos": { path: "/programas-esportivos" },
"/secretaria-executiva": { path: "/secretaria-executiva" },
"/gestao-pessoas": { path: "/gestao-pessoas" },
"/ti": { path: "/ti" },
};
// Obter configuração para a rota atual
const getCurrentRouteConfig = $derived.by(() => {
const currentPath = page.url.pathname;
// Verificar correspondência exata
if (ROUTE_PERMISSIONS[currentPath]) {
return ROUTE_PERMISSIONS[currentPath];
}
// Verificar rotas dinâmicas (com [id])
if (currentPath.includes("/editar") || currentPath.includes("/funcionarioId") || currentPath.includes("/simboloId")) {
// Extrair o caminho base
if (currentPath.includes("/funcionarios/")) {
return { path: "/recursos-humanos/funcionarios", requireGravar: true };
}
if (currentPath.includes("/simbolos/")) {
return { path: "/recursos-humanos/simbolos", requireGravar: true };
}
}
// Rotas públicas (Dashboard, Solicitar Acesso, etc)
if (currentPath === "/" || currentPath === "/solicitar-acesso") {
return null;
}
// Para qualquer outra rota dentro do dashboard, verificar o primeiro segmento
const segments = currentPath.split("/").filter(Boolean);
if (segments.length > 0) {
const firstSegment = "/" + segments[0];
if (ROUTE_PERMISSIONS[firstSegment]) {
return ROUTE_PERMISSIONS[firstSegment];
}
}
return null;
});
</script>
{#if getCurrentRouteConfig}
<MenuProtection menuPath={getCurrentRouteConfig.path} requireGravar={getCurrentRouteConfig.requireGravar || false}>
<main
id="container-central"
class="w-full max-w-none px-3 lg:px-4 py-4"
>
{@render children()}
</main>
</MenuProtection>
{:else}
<main
id="container-central"
class="w-full max-w-none px-3 lg:px-4 py-4"
>
{@render children()}
</main>
{/if}