75e67eae5d
Templates de documentos sao "setup", nao operacao diaria — deveriam viver em Configuracoes, nao no menu de Documentos do paciente. Mudancas: 1. Melissa — melissaConfigGrupos.js ganha grupo "Documentos" com 1 item "Modelos de documentos" -> slug `documentos-templates` (pagina nativa MelissaDocumentosTemplates ja existe + ja esta wired no MelissaLayout linha 2896). 2. Rail/Classic — routes.configs.js ganha rota /configuracoes/documentos/templates (name=ConfiguracoesDocumentos Templates) apontando pro mesmo DocumentTemplatesPage.vue. 3. Rotas antigas removidas — routes.therapist.js e routes.clinic.js nao tem mais /documents/templates nem nomes de rota therapist-documents-templates / admin-documents-templates. URLs antigas dao 404 (decisao do user — limpa). 4. ConfiguracoesPage (sidebar Rail/Classic) ganha grupo "Documentos" antes do "Empresa & Plataforma" com item "Modelos de documentos". 5. Menus de pacientes (therapist.menu + clinic.menu) NAO tem mais "Templates" — caminho de acesso e Configuracoes. 6. pagesIndex.js (busca global) atualizado: novo path, novos keywords (recibo, atestado, laudo, tcle, lgpd, consent), roles ['therapist','admin']. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
131 lines
5.4 KiB
JavaScript
131 lines
5.4 KiB
JavaScript
/*
|
|
|--------------------------------------------------------------------------
|
|
| Agência PSI
|
|
|--------------------------------------------------------------------------
|
|
| Criado e desenvolvido por Leonardo Nohama
|
|
|
|
|
| Tecnologia aplicada à escuta.
|
|
| Estrutura para o cuidado.
|
|
|
|
|
| Arquivo: src/navigation/menus/clinic.menu.js
|
|
| Data: 2026
|
|
| Local: São Carlos/SP — Brasil
|
|
|--------------------------------------------------------------------------
|
|
| © 2026 — Todos os direitos reservados
|
|
|--------------------------------------------------------------------------
|
|
*/
|
|
export default function adminMenu(ctx = {}) {
|
|
const menu = [
|
|
{
|
|
label: 'Clínica',
|
|
items: [
|
|
// ✅ usar name real da rota (evita /admin cair em redirect estranho)
|
|
{ label: 'Dashboard', icon: 'pi pi-fw pi-home', to: { name: 'admin.dashboard' } },
|
|
|
|
{
|
|
label: 'Agenda da Clínica',
|
|
icon: 'pi pi-fw pi-calendar',
|
|
to: { name: 'admin-agenda-clinica' },
|
|
feature: 'agenda.view',
|
|
badgeKey: 'agendaHoje'
|
|
},
|
|
|
|
{
|
|
label: 'Recorrências',
|
|
icon: 'pi pi-fw pi-refresh',
|
|
to: { name: 'admin-agenda-recorrencias' },
|
|
feature: 'agenda.view'
|
|
},
|
|
|
|
// ✅ Compromissos determinísticos (tipos)
|
|
{
|
|
label: 'Compromissos',
|
|
icon: 'pi pi-fw pi-clock',
|
|
to: { name: 'admin-agenda-compromissos' },
|
|
feature: 'agenda.view'
|
|
}
|
|
]
|
|
},
|
|
|
|
// CRM de conversas / WhatsApp
|
|
{
|
|
label: 'Conversas',
|
|
icon: 'pi pi-fw pi-comments',
|
|
to: { name: 'admin-conversas' },
|
|
badgeKey: 'conversasUnread'
|
|
},
|
|
|
|
// ✅ SEM IF: sempre existe, só fica visível quando a feature estiver ligada
|
|
{
|
|
label: 'Pacientes',
|
|
visible: () => {
|
|
// 1) enquanto tenant/features estão carregando, NÃO some (evita piscar ao trocar de aba)
|
|
if (ctx?.tenantLoading?.()) return true;
|
|
if (ctx?.tenantFeaturesLoading?.()) return true;
|
|
|
|
// 2) quando estabilizou, aí sim decide pela feature
|
|
return !!ctx?.tenantFeatureEnabled?.('patients');
|
|
},
|
|
items: [
|
|
// ✅ usar name real das rotas (você já tem todas no routes.clinic.js)
|
|
{ label: 'Lista de Pacientes', icon: 'pi pi-fw pi-users', to: { name: 'admin-pacientes' }, quickCreate: true, quickCreateRoute: 'admin-pacientes-cadastro', quickCreateLinkTo: { name: 'admin-pacientes-link-externo' } },
|
|
{ label: 'Grupos', icon: 'pi pi-fw pi-sitemap', to: { name: 'admin-pacientes-grupos' } },
|
|
{ label: 'Tags', icon: 'pi pi-fw pi-tags', to: { name: 'admin-pacientes-tags' } },
|
|
{ label: 'Médicos & Referências', icon: 'pi pi-fw pi-heart', to: { name: 'admin-pacientes-medicos' } },
|
|
{ label: 'Link Externo', icon: 'pi pi-fw pi-link', to: { name: 'admin-pacientes-link-externo' } },
|
|
{ label: 'Cadastros recebidos', icon: 'pi pi-inbox', to: { name: 'admin-pacientes-recebidos' }, badgeKey: 'cadastrosRecebidos' }
|
|
// "Templates de Documentos" movido pra Configurações
|
|
]
|
|
},
|
|
|
|
{
|
|
label: 'Gestão',
|
|
items: [
|
|
{ label: 'Profissionais', icon: 'pi pi-fw pi-id-card', to: { name: 'admin-clinic-professionals' } },
|
|
{
|
|
label: 'Tipos de Clínicas',
|
|
icon: 'pi pi-fw pi-sliders-h',
|
|
to: { name: 'admin-clinic-features' },
|
|
visible: () => {
|
|
if (ctx?.tenantLoading?.()) return true; // ← true durante loading (evita piscar)
|
|
const role = ctx?.role?.();
|
|
return role === 'clinic_admin'; // tenant_admin normaliza para clinic_admin
|
|
}
|
|
},
|
|
{ label: 'Meu plano', icon: 'pi pi-fw pi-credit-card', to: { name: 'admin-meu-plano' } }
|
|
]
|
|
},
|
|
|
|
{
|
|
label: 'Financeiro',
|
|
items: [{ label: 'Cobranças', icon: 'pi pi-fw pi-wallet', to: { name: 'admin-financeiro' } }]
|
|
},
|
|
|
|
{
|
|
label: 'Sistema',
|
|
items: [
|
|
{ label: 'Meu Perfil', icon: 'pi pi-fw pi-user', to: '/account/profile' },
|
|
{ label: 'Meu Negócio', icon: 'pi pi-fw pi-building', to: '/account/negocio' },
|
|
{ label: 'Segurança', icon: 'pi pi-fw pi-shield', to: { name: 'admin-settings-security' } },
|
|
{
|
|
label: 'Agendamento Online (PRO)',
|
|
icon: 'pi pi-fw pi-calendar-plus',
|
|
to: { name: 'admin-online-scheduling' },
|
|
feature: 'online_scheduling.manage',
|
|
proBadge: true
|
|
},
|
|
{
|
|
label: 'Agendamentos Recebidos',
|
|
icon: 'pi pi-fw pi-inbox',
|
|
to: { name: 'admin-agendamentos-recebidos' },
|
|
feature: 'online_scheduling.manage',
|
|
proBadge: true,
|
|
badgeKey: 'agendamentosRecebidos'
|
|
}
|
|
]
|
|
}
|
|
];
|
|
|
|
return menu;
|
|
}
|