MelissaPlano: pagina nativa 2-col com assinatura + recursos + historico

Tira "Meu Plano" do MelissaConfiguracoes (era embed cfg-plano ->
TherapistMeuPlanoPage.vue) e cria a /melissa/plano como pagina
nativa Melissa no padrao das outras 2-col.

Sidebar (mpl-side):
- Card "Plano atual" — nome destacado + valor + status + ciclo
  + proxima renovacao (com badge cancelamento agendado vs auto) +
  descricao do plano
- Card "Resumo" — mini-stats: Recursos / Eventos / Renova-Encerra +
  ID da assinatura
- Footer: botao "Alterar plano" (router.push /therapist/upgrade)

Main:
- Card "Seu plano inclui" — features agrupadas por modulo (a partir
  do prefix antes do . ou _ na key), cada item com check verde +
  key + descricao em 1 linha (ellipsis), grid 1-2 cols
- Card "Historico" — subscription_events com tag de tipo + before
  -> after dos plan_ids + autor (profiles join) + reason + metadata
  (max 50 eventos)

Estados:
- Loading: skeletons na sidebar + main
- Sem assinatura: empty state grande no main com CTA "Ver planos",
  empty compacto na sidebar
- Erro: toast (mesma logica do TherapistMeuPlanoPage)

Wire-up:
- MelissaLayout: import + render `<MelissaPlano v-if=secaoAberta=='plano'>`
- 'plano' sai de MELISSA_CONFIG_ALIASES, entra em MELISSA_NON_CONFIG_SLUGS
- SECOES.plano descricao atualizada (Assinatura, recursos, historico)
- MelissaConfiguracoes: cfg-plano removido de COMPONENT_MAP,
  ROUTE_ALIASES e do grupo "Conta" (continua com Negocio + Seguranca)

Logica de fetch espelhada do TherapistMeuPlanoPage (subscriptions +
plans + plan_prices + plan_features + features + subscription_events
+ profiles), compativel com a /therapist/meu-plano legacy.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Leonardo
2026-05-06 15:31:50 -03:00
parent 56d30b4285
commit 6395c4c0b6
3 changed files with 1361 additions and 8 deletions
+11 -4
View File
@@ -34,6 +34,7 @@ import MelissaTags from './MelissaTags.vue';
import MelissaGrupos from './MelissaGrupos.vue';
import MelissaConfiguracoes from './MelissaConfiguracoes.vue';
import MelissaPerfil from './MelissaPerfil.vue';
import MelissaPlano from './MelissaPlano.vue';
import MelissaEmbed from './MelissaEmbed.vue';
import MelissaCadastrosRecebidos from './MelissaCadastrosRecebidos.vue';
import MelissaAgendamentosRecebidos from './MelissaAgendamentosRecebidos.vue';
@@ -166,8 +167,9 @@ const SECOES = {
aparencia: { label: 'Layout Melissa', icon: 'pi pi-palette', descricao: 'Aparência, plano de fundo, relógio e cronômetro do resumo.' },
// Pagina nativa do perfil (MelissaPerfil) — saiu do MelissaConfiguracoes
perfil: { label: 'Meu Perfil', icon: 'pi pi-user', descricao: 'Identidade, contato, bio, redes — gamificacao no aside.' },
// Atalhos de Conta restantes — todos montam o MelissaConfiguracoes com a seção embed pré-selecionada
plano: { label: 'Meu Plano', icon: 'pi pi-credit-card', descricao: 'Plano contratado, limites e fatura.' },
// Pagina nativa do plano (MelissaPlano) — saiu do MelissaConfiguracoes
plano: { label: 'Meu Plano', icon: 'pi pi-credit-card', descricao: 'Assinatura, recursos liberados e historico de mudancas.' },
// Atalhos de Conta restantes — montam o MelissaConfiguracoes com a seção embed pré-selecionada
negocio: { label: 'Meu Negócio', icon: 'pi pi-briefcase', descricao: 'Dados do negócio, faturamento e branding.' },
seguranca: { label: 'Segurança', icon: 'pi pi-shield', descricao: 'Senha, dispositivos confiáveis e sessões.' },
// Onda 1 — pages embedadas via MelissaEmbed (1-coluna, hero glass)
@@ -195,13 +197,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',
'perfil', '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', 'plano', 'negocio', 'seguranca', 'bloqueios',
'aparencia', 'negocio', 'seguranca', 'bloqueios',
'fundo', 'relogio', 'cronometro'
]);
function isMelissaConfigRoute(slug) {
@@ -2215,6 +2217,11 @@ function onKeydown(e) {
@close="fecharSecao"
/>
<MelissaPlano
v-if="layoutReady && secaoAberta === 'plano'"
@close="fecharSecao"
/>
<MelissaConfiguracoes
v-if="layoutReady && isMelissaConfigRoute(secaoAberta)"
:secao-rota="secaoAberta"