feat: ViaCEP em todos os forms de endereço + menus por papel + fix preview de plugins

ViaCEP (auto-preenche endereço ao completar 8 dígitos):
- novo util services/viacep.ts (buscarCep), reutilizado
- ligado em Pacientes, Salas, Profissionais(perfil); Configurações migrada p/ o util
- filtro 'CEP (região)' do marketplace mantido como busca (sem auto-fill)

Menus por papel:
- biomédico: sem Ortodontia, RX e 'Ser Tutor Orto' (não são escopo)
- protético: passa a ver Dashboard/Agenda/Tratamentos/Lançar GTO (antes não via nada)
- RX/Radiografias: só papéis odonto (dentista + donos/funcionário)
- bottom nav mobile ajustado (biomédico/protético)

Fix 'Visualizar como':
- getActivePlugins é preview-aware (todos os plugins ativos enquanto houver PREVIEW_ROLE),
  imune ao timing de hydrate/cache; enterPreview/exitPreview simplificados

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
VPS 4 Builder
2026-06-13 20:14:31 +02:00
parent ca7eba4531
commit cb00d9f383
9 changed files with 81 additions and 40 deletions
+2 -13
View File
@@ -259,12 +259,6 @@ export const HybridBackend = {
getPreviewRole: (): string | null => localStorage.getItem('SCOREODONTO_PREVIEW_ROLE'),
enterPreview: (role: string) => {
// Na primeira entrada do preview, guarda os plugins reais do superadmin p/ restaurar no exit.
// (não sobrescreve o backup se já estiver previewando e só trocando de papel)
if (!localStorage.getItem('SCOREODONTO_PREVIEW_ROLE')) {
const prevPlugins = localStorage.getItem('SCOREODONTO_ACTIVE_PLUGINS');
localStorage.setItem('SCOREODONTO_PREVIEW_PREV_PLUGINS', prevPlugins === null ? '__none__' : prevPlugins);
}
const synthetic = {
id: '00000000-0000-0000-0000-000000000000', // UUID inexistente → consultas retornam vazio
nome: `VISUALIZAÇÃO: ${role.toUpperCase()}`,
@@ -275,8 +269,8 @@ export const HybridBackend = {
localStorage.setItem('SCOREODONTO_PREVIEW_ROLE', role);
localStorage.setItem('SCOREODONTO_ACTIVE_WORKSPACE', JSON.stringify(synthetic));
localStorage.setItem('SCOREODONTO_WORKSPACES', JSON.stringify([synthetic]));
// Preview ativa os plugins para o superadmin ver/testar as telas (RX, Salas, Profissionais).
localStorage.setItem('SCOREODONTO_ACTIVE_PLUGINS', JSON.stringify(['rx-scoreodonto', 'locacao-salas', 'profissionais-marketplace']));
// Os plugins ativos no preview vêm de getActivePlugins() (preview-aware): todos
// ficam ativos enquanto SCOREODONTO_PREVIEW_ROLE existir. Nada a mutar aqui.
const path = role === 'paciente' ? '/tratamentos' : '/dashboard';
window.location.assign(path);
},
@@ -285,11 +279,6 @@ export const HybridBackend = {
localStorage.removeItem('SCOREODONTO_PREVIEW_ROLE');
localStorage.removeItem('SCOREODONTO_ACTIVE_WORKSPACE');
localStorage.removeItem('SCOREODONTO_WORKSPACES');
// Restaura os plugins que o superadmin tinha antes do preview.
const prev = localStorage.getItem('SCOREODONTO_PREVIEW_PREV_PLUGINS');
if (prev === null || prev === '__none__') localStorage.removeItem('SCOREODONTO_ACTIVE_PLUGINS');
else localStorage.setItem('SCOREODONTO_ACTIVE_PLUGINS', prev);
localStorage.removeItem('SCOREODONTO_PREVIEW_PREV_PLUGINS');
window.location.assign('/superadmin/overview');
},