Skip to content

Routing - Roteamento

Estrutura de Rotas

typescript
{
  path: '/contracts',
  name: 'contracts',
  component: () => import('@/modules/contracts/pages/ListContracts.vue'),
  meta: {
    title: 'routes.contracts',
    transition: 'slide-left'
  }
}

Rotas por Módulo

  • Cada módulo exporta suas rotas em modules/[modulo]/router/index.ts
  • O arquivo principal src/router/index.ts importa e combina todas as rotas

Regras de Layout de Páginas

Título e Subtítulo

IMPORTANTE: Não adicionar título (<h1>) ou subtítulo dentro das páginas. O título da página já é exibido automaticamente no Header através da configuração de rotas (meta.title).

typescript
{
  path: '/templates/new',
  name: 'new-template',
  component: () => import('@/modules/templates/pages/CreateTemplate.vue'),
  meta: { title: i18n.global.t('routes.templates.new') }
}

Errado:

vue
<template>
  <container-app>
    <h1>Novo Template</h1>
    <p>Criar e gerenciar templates...</p>
    <!-- conteúdo -->
  </container-app>
</template>

Correto:

vue
<template>
  <container-app>
    <!-- conteúdo direto, sem título -->
  </container-app>
</template>

IMPORTANTE: O botão de voltar é gerenciado automaticamente pelo TopHeader. Páginas de listagem não exibem o botão, enquanto páginas de detalhe/edição exibem automaticamente.

Tipo de PáginaBotão VoltarConfiguração
Listagem❌ Nãometa: { isListPage: true }
Detalhe✅ SimAutomático (sem isListPage)
Edição/Criação✅ SimAutomático (sem isListPage)

Páginas de listagem devem configurar isListPage: true no meta da rota:

typescript
{
  path: '/my-contract',
  name: 'my-contract',
  meta: { isListPage: true, menuKey: 'my-contract' }
}

Páginas de detalhe/edição NÃO devem ter subheader próprio. O título e botão de voltar vêm do TopHeader:

vue
<template>
  <container-app>
    <!-- Botões de ação no topo, se necessário -->
    <div v-if="hasActions" class="flex justify-end mb-6">
      <n-button type="primary" @click="handleAction">Ação</n-button>
    </div>
    <!-- Cards de conteúdo -->
    <div class="bg-white dark:bg-neutral-800 rounded-lg p-6">
      <!-- conteúdo -->
    </div>
  </container-app>
</template>

Para manter o item do menu lateral ativo em sub-rotas, use meta.menuKey nas rotas:

typescript
{
  path: '/my-contract',
  name: 'my-contract',
  meta: { isListPage: true, menuKey: 'my-contract' }
},
{
  path: '/contract-provider/:id',
  name: 'my-contract-detail',
  meta: { menuKey: 'my-contract' }  // Mesmo menuKey mantém o menu ativo
}

O menuKey deve corresponder ao group definido no menu em ListMenu.vue.