MelissaBloqueios: pagina nativa 2-col com nacionais + municipais + bloqueios

Tira "Bloqueios" do MelissaConfiguracoes (era embed cfg-bloqueios ->
BloqueiosPage.vue) e cria a /melissa/bloqueios nativa Melissa.

Sidebar (mbq-side):
- Card "Resumo" — 3 mini-stats coloridos (Nacionais blue, Municipais
  orange, Bloqueios red) + nav de ano (chevron < ANO > )
- Card "Adicionar" — 2 CTAs (Feriado municipal secundario + Novo
  bloqueio primary)
- Card "Como funciona" — FAQ 3-bullets explicando os tipos

Main (50/50 desktop, com Bloqueios full-row abaixo):
- Card Nacionais — read-only (gerado automaticamente), tags Movel
- Card Municipais — CRUD via dialog (nome + data + observacao)
- Card Bloqueios — CRUD via dialog (titulo + datas + horas + obs +
  recorrente). Border-left colorido por tipo (azul/laranja/vermelho).
- Items com data + titulo + observacao inline + acoes (edit/trash)

Cards aplicam o pattern dos anteriores: min-h 300, max-h 100%, body
overflow-y: auto. Bloqueios spans 2-col com .mbq-w--full.

Logica espelhada do BloqueiosPage (composable useFeriados +
agenda_bloqueios). Compativel com /configuracoes/bloqueios legacy.

Wire-up:
- MelissaLayout: import + render `<MelissaBloqueios>` quando
  secaoAberta === 'bloqueios'
- 'bloqueios' sai de MELISSA_CONFIG_ALIASES, entra em
  MELISSA_NON_CONFIG_SLUGS
- SECOES.bloqueios adicionado (icone pi-ban)
- MelissaConfiguracoes: cfg-bloqueios removido de COMPONENT_MAP,
  ROUTE_ALIASES e do grupo Agenda (resta cfg-agenda + cfg-agendador)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Leonardo
2026-05-06 16:21:44 -03:00
parent 33370018b5
commit 25444c1f5f
3 changed files with 1480 additions and 6 deletions
File diff suppressed because it is too large Load Diff
+3 -4
View File
@@ -38,8 +38,7 @@ const emit = defineEmits(['close']);
// rotaToSecao() lê alias OU key direta; secaoToRota() devolve alias se
// existir, senão a key como-é.
const ROUTE_ALIASES = {
aparencia: 'aparencia',
bloqueios: 'cfg-bloqueios'
aparencia: 'aparencia'
};
// URLs antigas (/melissa/fundo, /melissa/relogio, /melissa/cronometro)
// agora caem no slug unificado "aparencia" — pagina Layout Melissa
@@ -73,7 +72,7 @@ function secaoToRota(key) {
// Mantém o user dentro do overlay Melissa em vez de navegar pra fora.
const COMPONENT_MAP = {
'cfg-agenda': defineAsyncComponent(() => import('@/layout/configuracoes/ConfiguracoesAgendaPage.vue')),
'cfg-bloqueios': defineAsyncComponent(() => import('@/layout/configuracoes/BloqueiosPage.vue')),
// 'cfg-bloqueios' removido — virou pagina nativa MelissaBloqueios em /melissa/bloqueios
'cfg-agendador': defineAsyncComponent(() => import('@/layout/configuracoes/ConfiguracoesAgendadorPage.vue')),
'cfg-pagamento': defineAsyncComponent(() => import('@/layout/configuracoes/ConfiguracoesPagamentoPage.vue')),
'cfg-precificacao': defineAsyncComponent(() => import('@/layout/configuracoes/ConfiguracoesPrecificacaoPage.vue')),
@@ -153,7 +152,7 @@ const grupos = [
icon: 'pi pi-calendar',
items: [
{ key: 'cfg-agenda', label: 'Agenda', desc: 'Horários semanais, exceções, duração e intervalo padrão.', icon: 'pi pi-calendar' },
{ key: 'cfg-bloqueios', label: 'Bloqueios', desc: 'Feriados nacionais, municipais e períodos bloqueados.', icon: 'pi pi-ban' },
// "Bloqueios" virou pagina nativa em /melissa/bloqueios (MelissaBloqueios)
{ key: 'cfg-agendador', label: 'Agendador Online', desc: 'Link público para pacientes solicitarem horários.', icon: 'pi pi-calendar-clock' }
]
},
+10 -2
View File
@@ -38,6 +38,7 @@ import MelissaPlano from './MelissaPlano.vue';
import MelissaNegocio from './MelissaNegocio.vue';
import MelissaAlterarPlano from './MelissaAlterarPlano.vue';
import MelissaSeguranca from './MelissaSeguranca.vue';
import MelissaBloqueios from './MelissaBloqueios.vue';
import MelissaEmbed from './MelissaEmbed.vue';
import MelissaCadastrosRecebidos from './MelissaCadastrosRecebidos.vue';
import MelissaAgendamentosRecebidos from './MelissaAgendamentosRecebidos.vue';
@@ -176,6 +177,8 @@ const SECOES = {
negocio: { label: 'Meu Negócio', icon: 'pi pi-briefcase', descricao: 'Identidade, fiscal, endereco, contato, redes — gamificacao no aside.' },
// Pagina nativa de seguranca (MelissaSeguranca) — saiu do MelissaConfiguracoes
seguranca: { label: 'Segurança', icon: 'pi pi-shield', descricao: 'Trocar senha + boas praticas + estado da sessao.' },
// Pagina nativa de bloqueios (MelissaBloqueios) — saiu do MelissaConfiguracoes
bloqueios: { label: 'Bloqueios e Feriados', icon: 'pi pi-ban', descricao: 'Feriados nacionais (auto), municipais e bloqueios manuais.' },
// Pagina nativa de alterar plano (MelissaAlterarPlano) — substitui /therapist/upgrade
'alterar-plano': { label: 'Alterar Plano', icon: 'pi pi-arrow-up-right', descricao: 'Escolha um plano pessoal pra ativar todos os recursos.' },
// Onda 1 — pages embedadas via MelissaEmbed (1-coluna, hero glass)
@@ -203,13 +206,13 @@ const MELISSA_NON_CONFIG_SLUGS = new Set([
'tags', 'grupos', 'cadastros-recebidos', 'medicos', 'agendamentos-recebidos',
'link-externo', 'notificacoes', 'financeiro', 'financeiro-lancamentos',
'documentos', 'documentos-templates', 'relatorios',
'perfil', 'plano', 'negocio', 'seguranca', 'alterar-plano',
'perfil', 'plano', 'negocio', 'seguranca', 'bloqueios', 'alterar-plano',
...MELISSA_EMBED_KEYS
]);
// Aliases "bonitos" + INLINE_KEYS reconhecidos pelo MelissaConfiguracoes.
// Mantidos sincronizados com o ROUTE_ALIASES/INLINE_KEYS de lá.
const MELISSA_CONFIG_ALIASES = new Set([
'aparencia', 'bloqueios',
'aparencia',
'fundo', 'relogio', 'cronometro'
]);
function isMelissaConfigRoute(slug) {
@@ -2244,6 +2247,11 @@ function onKeydown(e) {
@close="fecharSecao"
/>
<MelissaBloqueios
v-if="layoutReady && secaoAberta === 'bloqueios'"
@close="fecharSecao"
/>
<MelissaConfiguracoes
v-if="layoutReady && isMelissaConfigRoute(secaoAberta)"
:secao-rota="secaoAberta"