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:
@@ -39,7 +39,6 @@ const emit = defineEmits(['close']);
|
|||||||
// existir, senão a key como-é.
|
// existir, senão a key como-é.
|
||||||
const ROUTE_ALIASES = {
|
const ROUTE_ALIASES = {
|
||||||
aparencia: 'aparencia',
|
aparencia: 'aparencia',
|
||||||
plano: 'cfg-plano',
|
|
||||||
negocio: 'cfg-negocio',
|
negocio: 'cfg-negocio',
|
||||||
seguranca: 'cfg-seguranca',
|
seguranca: 'cfg-seguranca',
|
||||||
bloqueios: 'cfg-bloqueios'
|
bloqueios: 'cfg-bloqueios'
|
||||||
@@ -99,7 +98,7 @@ const COMPONENT_MAP = {
|
|||||||
'cfg-auditoria': defineAsyncComponent(() => import('@/layout/configuracoes/AuditoriaPage.vue')),
|
'cfg-auditoria': defineAsyncComponent(() => import('@/layout/configuracoes/AuditoriaPage.vue')),
|
||||||
// Conta (páginas pessoais que vivem em /account/*)
|
// Conta (páginas pessoais que vivem em /account/*)
|
||||||
// 'cfg-perfil' removido — virou pagina nativa MelissaPerfil em /melissa/perfil
|
// 'cfg-perfil' removido — virou pagina nativa MelissaPerfil em /melissa/perfil
|
||||||
'cfg-plano': defineAsyncComponent(() => import('@/views/pages/billing/TherapistMeuPlanoPage.vue')),
|
// 'cfg-plano' removido — virou pagina nativa MelissaPlano em /melissa/plano
|
||||||
'cfg-negocio': defineAsyncComponent(() => import('@/views/pages/account/Negociopage.vue')),
|
'cfg-negocio': defineAsyncComponent(() => import('@/views/pages/account/Negociopage.vue')),
|
||||||
'cfg-seguranca': defineAsyncComponent(() => import('@/views/pages/auth/SecurityPage.vue'))
|
'cfg-seguranca': defineAsyncComponent(() => import('@/views/pages/auth/SecurityPage.vue'))
|
||||||
};
|
};
|
||||||
@@ -150,11 +149,11 @@ const grupos = [
|
|||||||
{
|
{
|
||||||
key: 'conta',
|
key: 'conta',
|
||||||
label: 'Conta',
|
label: 'Conta',
|
||||||
desc: 'Plano contratado, dados do negócio e segurança.',
|
desc: 'Dados do negócio e segurança.',
|
||||||
icon: 'pi pi-user',
|
icon: 'pi pi-user',
|
||||||
items: [
|
items: [
|
||||||
// "Meu Perfil" virou pagina nativa em /melissa/perfil (MelissaPerfil)
|
// "Meu Perfil" virou pagina nativa em /melissa/perfil (MelissaPerfil)
|
||||||
{ key: 'cfg-plano', label: 'Meu Plano', desc: 'Plano contratado, limites de uso e fatura.', icon: 'pi pi-credit-card' },
|
// "Meu Plano" virou pagina nativa em /melissa/plano (MelissaPlano)
|
||||||
{ key: 'cfg-negocio', label: 'Meu Negócio', desc: 'Dados do negócio, faturamento e branding.', icon: 'pi pi-briefcase' },
|
{ key: 'cfg-negocio', label: 'Meu Negócio', desc: 'Dados do negócio, faturamento e branding.', icon: 'pi pi-briefcase' },
|
||||||
{ key: 'cfg-seguranca', label: 'Segurança', desc: 'Senha, dispositivos confiáveis e sessões ativas.', icon: 'pi pi-shield' }
|
{ key: 'cfg-seguranca', label: 'Segurança', desc: 'Senha, dispositivos confiáveis e sessões ativas.', icon: 'pi pi-shield' }
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ import MelissaTags from './MelissaTags.vue';
|
|||||||
import MelissaGrupos from './MelissaGrupos.vue';
|
import MelissaGrupos from './MelissaGrupos.vue';
|
||||||
import MelissaConfiguracoes from './MelissaConfiguracoes.vue';
|
import MelissaConfiguracoes from './MelissaConfiguracoes.vue';
|
||||||
import MelissaPerfil from './MelissaPerfil.vue';
|
import MelissaPerfil from './MelissaPerfil.vue';
|
||||||
|
import MelissaPlano from './MelissaPlano.vue';
|
||||||
import MelissaEmbed from './MelissaEmbed.vue';
|
import MelissaEmbed from './MelissaEmbed.vue';
|
||||||
import MelissaCadastrosRecebidos from './MelissaCadastrosRecebidos.vue';
|
import MelissaCadastrosRecebidos from './MelissaCadastrosRecebidos.vue';
|
||||||
import MelissaAgendamentosRecebidos from './MelissaAgendamentosRecebidos.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.' },
|
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
|
// Pagina nativa do perfil (MelissaPerfil) — saiu do MelissaConfiguracoes
|
||||||
perfil: { label: 'Meu Perfil', icon: 'pi pi-user', descricao: 'Identidade, contato, bio, redes — gamificacao no aside.' },
|
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
|
// Pagina nativa do plano (MelissaPlano) — saiu do MelissaConfiguracoes
|
||||||
plano: { label: 'Meu Plano', icon: 'pi pi-credit-card', descricao: 'Plano contratado, limites e fatura.' },
|
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.' },
|
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.' },
|
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)
|
// 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',
|
'tags', 'grupos', 'cadastros-recebidos', 'medicos', 'agendamentos-recebidos',
|
||||||
'link-externo', 'notificacoes', 'financeiro', 'financeiro-lancamentos',
|
'link-externo', 'notificacoes', 'financeiro', 'financeiro-lancamentos',
|
||||||
'documentos', 'documentos-templates', 'relatorios',
|
'documentos', 'documentos-templates', 'relatorios',
|
||||||
'perfil',
|
'perfil', 'plano',
|
||||||
...MELISSA_EMBED_KEYS
|
...MELISSA_EMBED_KEYS
|
||||||
]);
|
]);
|
||||||
// Aliases "bonitos" + INLINE_KEYS reconhecidos pelo MelissaConfiguracoes.
|
// Aliases "bonitos" + INLINE_KEYS reconhecidos pelo MelissaConfiguracoes.
|
||||||
// Mantidos sincronizados com o ROUTE_ALIASES/INLINE_KEYS de lá.
|
// Mantidos sincronizados com o ROUTE_ALIASES/INLINE_KEYS de lá.
|
||||||
const MELISSA_CONFIG_ALIASES = new Set([
|
const MELISSA_CONFIG_ALIASES = new Set([
|
||||||
'aparencia', 'plano', 'negocio', 'seguranca', 'bloqueios',
|
'aparencia', 'negocio', 'seguranca', 'bloqueios',
|
||||||
'fundo', 'relogio', 'cronometro'
|
'fundo', 'relogio', 'cronometro'
|
||||||
]);
|
]);
|
||||||
function isMelissaConfigRoute(slug) {
|
function isMelissaConfigRoute(slug) {
|
||||||
@@ -2215,6 +2217,11 @@ function onKeydown(e) {
|
|||||||
@close="fecharSecao"
|
@close="fecharSecao"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<MelissaPlano
|
||||||
|
v-if="layoutReady && secaoAberta === 'plano'"
|
||||||
|
@close="fecharSecao"
|
||||||
|
/>
|
||||||
|
|
||||||
<MelissaConfiguracoes
|
<MelissaConfiguracoes
|
||||||
v-if="layoutReady && isMelissaConfigRoute(secaoAberta)"
|
v-if="layoutReady && isMelissaConfigRoute(secaoAberta)"
|
||||||
:secao-rota="secaoAberta"
|
:secao-rota="secaoAberta"
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user