Rotas e navegação
defineOonRoutes e defineOonNavigation — rotas com guards de permissão, lazy loading, layouts por rota, rotas públicas, rotas reservadas e menu por seções.
Rotas
import { defineOonRoutes } from "@oondemand/oon-core-front/routing";
import { HomePage } from "../pages/HomePage";
import { WorkspaceLayout } from "../layouts/WorkspaceLayout";
export const routes = defineOonRoutes([
{ path: "/", component: HomePage },
{
path: "/pedidos",
lazy: () => import("../pages/PedidosPage"),
layout: WorkspaceLayout,
permissions: ["pedidos.read"],
},
{ path: "/relatorios", element: <RelatoriosPage />, capabilities: ["core.transactional-email"] },
]);
| Propriedade | Descrição |
|---|---|
path |
Caminho absoluto iniciado por / |
component |
Página React instanciada pelo roteador |
element |
Elemento já construído |
lazy |
() => import("./Pagina") com export default — code splitting |
layout |
Componente { children } aplicado só a essa rota |
permissions |
Guard: exige qualquer uma das permissões |
capabilities |
Guard por capability declarada |
public |
Rota fora do guard de autenticação e do shell |
Cada rota declara exatamente uma fonte: element, component ou lazy. Caminhos duplicados são rejeitados.
Rotas públicas
{ path: "/status", component: StatusPage, public: true }
Rotas public são renderizadas fora do ActivationGuard, do AppAccessGuard e do shell autenticado — úteis para páginas de status, landing pages ou portais. Este site é um exemplo: todo ele é composto por rotas públicas de um App Oon.
Rotas reservadas
Pertencem ao Core e não podem ser declaradas: /login, /accept-invite, /first-access, /ativacao, /instancia-suspensa, /instancia-revogada, /acesso-negado. A lista está em OON_RESERVED_ROUTES.
Para personalizar o login de um portal, use systemPages: { login: MinhaPaginaDeLogin } — substitui o conteúdo e mantém rota e guards com o Core.
Navegação
import { defineOonNavigation } from "@oondemand/oon-core-front/routing";
export const navigation = defineOonNavigation([
{ label: "Início", href: "/", order: 10 },
{ label: "Pedidos", href: "/pedidos", section: "Operação", order: 20, permissions: ["pedidos.read"] },
{ label: "Aprovações", href: "/aprovacoes", section: "Operação", order: 30, requires: "temAprovacoes", badge: 3 },
{ label: "Documentação", href: "https://exemplo.com/docs", external: true, action: "user-menu" },
]);
| Propriedade | Descrição |
|---|---|
label |
Obrigatório |
href |
Absoluto (/…) ou externo com external: true |
section |
Agrupa itens no menu lateral |
order |
Ordem dentro da seção |
permissions, capabilities |
Esconde o item sem a permissão/capability |
requires |
Nome de uma condição em components.menuConditions |
children |
Submenu |
badge, icon, hidden |
Apresentação |
action |
"user-menu" move o item para o menu do avatar; "profile" define "Meu perfil" |
Cada item precisa de href, action ou children.
Condições de visibilidade
export const app = defineOonApp({
// ...
components: {
menuConditions: {
temAprovacoes: () => useAprovacoesPendentes() > 0, // hook React sem argumentos
},
},
});
Quando todos os itens de uma seção dependem de condições falsas, a seção inteira some. Os hooks são chamados sempre na mesma ordem a cada render do menu.
Comportamento do menu
- Seções com
orderrespeitado earia-currentno item ativo. - No celular, o menu vira gaveta aberta pelo cabeçalho.
- Itens
action: "user-menu"aparecem no menu do avatar — veja abaixo. - Versões ficam no "Sobre" (tooltip do título), fora da tela principal.
Menu do usuário
Itens com action: "user-menu" saem do menu lateral e vão para o menu do avatar, entre "Meu perfil" e "Sair". Desde a 0.7.39, eles são agrupados por section: cada grupo tem título e separador, os grupos seguem a ordem do primeiro item e, dentro de cada grupo, vale order. Itens sem section formam um grupo sem título.
defineOonNavigation([
{ label: "Preferências", href: "/preferencias", section: "Conta", order: 10, action: "user-menu" },
{ label: "Usuários e Acessos", href: "/usuarios-acessos", section: "Configurações", order: 60, permissions: ["users.read"], action: "user-menu" },
{ label: "Central de ajuda", href: "https://ajuda.exemplo.com", external: true, action: "user-menu" },
]);
Reposicionar itens do Core
O Core adiciona itens próprios ao menu — Usuários e Acessos (/usuarios-acessos) e E-mail transacional (/configuracoes/email-transacional). Desde a 0.7.39, um item de navegação do App com o mesmo href substitui o item padrão: você escolhe seção, ordem, rótulo ou o menu do usuário, e a rota e a página continuam sendo as do Core. Mantenha as mesmas permissions do item original (users.read, transactional-email.config.read).