Patterns de Negócio do Pedbot

Como componentes se combinam para formar os fluxos reais de usuário —
composição de telas, estados, edge cases e interações entre componentes.

12
Patterns
127
Estados

Auth Flow

17 componentes 18 estados 0 passos 8 edge cases

Fluxo completo de autenticacao do Pedbot. Inclui: login com captcha (Turnstile/AWS WAF), recuperacao de senha, redefinicao de senha, two-factor authentication (Google Authenticator), inatividade/unlock, e swap de sessao de usuario. Todas as telas de auth sao paginas isoladas (sem sidebar/navbar) em fundo branco, card centralizado.

full-screen-centered
Telas de auth: background branco (min-height: 100vh), card centralizado max-w-md, sem sidebar/navbar. Completamente isoladas do layout principal do app.
auth-card max-w-md (448px)Card centralizado max-w-md, bg-white, rounded-xl, px-6 py-10. Contem logo, titulo, campos e acoes.
terms-overlayOverlay fixo z-index 9999 sobre toda a tela quando termsPopup=true. Modal max-w-960px com iframe PDF.
captcha-widgetWidget de captcha renderizado pelo Turnstile ou AWS WAF abaixo dos campos, acima do botao de login.
vuex: authhttplocalStorageexternal-script

Fluxo não documentado.

login-idle
Formulario de login vazio. Captcha carregando/carregado. Botao 'Acessar Pedbot' desabilitado.
Card branco centralizado: logo + titulo + campos vazios + captcha widget + botao cinza
login-filled
Email e senha preenchidos. Captcha resolvido. Botao habilitado.
Campos com texto + captcha com checkmark + botao primario
login-loading
buttonDisabled=true durante autenticacao. Botao desabilitado.
Botao inativo durante requisicao
login-error
Credenciais invalidas. errorPassword preenchido.
Mensagem de erro text-danger abaixo do campo senha
login-captcha-missing
Tentativa de login sem completar captcha.
vs.notify warning 'Por favor, complete o reCAPTCHA antes de prosseguir.'
login-terms-open
termsPopup=true. Overlay escuro com modal PDF dos termos de uso.
Overlay rgba(0,0,0,0.5) + modal 960px max com iframe PDF + botao fechar
two-factor-setup
Rota /two-factor. Alert laranja + QR Code + input TOTP.
Tela dedicada com QR code centralizado e campo de 6 digitos
two-factor-already-validated
twoFactorValidatedInSession no localStorage. Skip automatico.
Redirect imediato sem exibir a tela
forgot-idle
Campo email vazio. Botao desabilitado.
Icone cadeado + titulo + campo email vazio + botao cinza + link voltar
forgot-sent
Email enviado com sucesso. Botao desabilitado por 10s.
vs.notify success + botao temporariamente cinza (anti-spam)
new-password-requirements-collapsed
showRequirements=false. vs-alert primario com apenas uma linha de texto + ChevronDown.
Alert azul colapsado acima dos campos de senha
new-password-requirements-expanded
showRequirements=true. Alert height 170px com lista de requisitos.
Alert azul expandido com 6 items de lista + ChevronUp
new-password-weak
PasswordStrong com score baixo.
Barra vermelha/amarela do PasswordStrong
new-password-strong
PasswordStrong com score alto. Botao habilitado.
Barra verde do PasswordStrong
inactivity-locked
InactivityOverlay ativo. 4 paineis escuros sobre a tela do app.
Toda a UI coberta por rgba(0,0,0,0.5) com buraco transparente no icone de cadeado
session-swap-select
SelectUser popup aberto. Lista de usuarios da conta.
Popup 1050px com filtros + tabela de usuarios
session-swap-login
LoginSwap popup aberto. Campo de senha do usuario selecionado.
Popup 500x300px com campo de senha
session-swap-2fa
TwoFactor popup aberto apos login swap bem-sucedido.
Popup 500x250px com input TOTP
TurnstileAwsCaptchaPasswordStrongTwoFactorAuthSetupInactivityOverlaySelectUserLoginSwapTwoFactor (popup)LogoutUnlockfeather-iconvs-inputvs-buttonvs-switchvs-iconvs-alertvx-card
Vuesax componente padrão do Vuesax    Custom componente criado pelo Pedbot
sso-funcional
isFuncional=true (VUE_APP_IS_FUNCIONAL). Link 'Entrar com a Funcional' aparece no login.
Impacto: Redirect para OAuth2 Funcional. Retorno com ?code= na URL → loginSSO() automatico.
captcha-provider-dinamico
setCaptchaProvider() consulta API do tenant ao montar a tela de login.
Impacto: Renderiza Turnstile ou AwsCaptcha dependendo da resposta. Dev local: captcha bypassado.
senha-expirada
localStorage.expiration='true' e email salvo. Login redireciona automaticamente para /forgot.
Impacto: ForgotPassword auto-envia o email na criacao do componente.
ja-logado
checkLogin() detecta que o usuario ja esta autenticado.
Impacto: vs.notify warning 'You are already logged in!' + processo de login abortado.
token-invalido-forgot
Token do link de email invalido ou expirado.
Impacto: API retorna erro. Sem feedback visual especifico documentado.
2fa-session-persistida
twoFactorValidatedInSession no localStorage.
Impacto: Tela /two-factor e pulada automaticamente — boa UX para logins repetidos na mesma sessao do browser.
lembrar-de-mim
checkboxRememberMe=true. Salvo em localStorage.
Impacto: Token de autenticacao com maior duracao. Toggle pre-selecionado na proxima visita.
password-visibility-toggle
Icone visibility/visibility_off sobre o campo de senha.
Impacto: Todos os campos de senha tem toggle de visibilidade via vs-icon absoluto.
src/views/pages/login/LoginJWT.vue main-login

Tela de login principal. Email + senha com toggle de visibilidade. Switch 'Lembrar de Mim'. Captcha condicional (Turnstile ou AWS WAF). Botao 'Acessar Pedbot'. Link SSO Funcional (condicional). Link 'Esqueceu a senha'. Link 'Ver termos de uso' (abre overlay com PDF iframe). Redireciona para /two-factor se twofactor_activity=true.

src/views/pages/forgot/ForgotPassword.vue forgot-password

Tela de recuperacao de senha. Icone de cadeado + titulo 'Recupere sua Senha' + campo email + botao 'Enviar' (desabilitado 10s apos envio para prevenir spam). vs.notify success apos envio. Link 'Voltar para Login' com ChevronLeftIcon. Auto-envia se localStorage tem email e expiration=true.

src/views/pages/forgot/NewPassword.vue new-password

Tela de redefinicao de senha (acessada via link do email). Icone de cadeado. vs-alert primario collapsible com requisitos de senha (mesmo pattern do UpdatePasswordPopup). 2 campos de senha com toggle visibility. PasswordStrong. Botao 'Salvar'. Link 'Voltar para Login'.

src/views/pages/LockScreen.vue lock-screen

Tela de sessao bloqueada (Vuexy template — pouco customizado). Imagem lock-screen + username + password. Botao Unlock. Link para /login. Usado como fallback de sessao expirada.

src/components/twoFactor/TwoFactorAuthSetup.vue two-factor-setup

Setup e validacao de 2FA via Google Authenticator. Rota /two-factor. Alert laranja (#f9ebdd) 'Configure o 2FA'. QR Code SVG base64 para scan. Input de codigo TOTP 6 digitos. Botao confirmar. Se ja validado na sessao (localStorage.twoFactorValidatedInSession) pula automaticamente.

src/components/twoFactor/AwsCaptcha.vue captcha-aws

Captcha AWS WAF. Script dinamico injetado. Renderiza widget da AWS. Chama onVerify(token) apos resolucao. Usado na tela de login quando captchaProvider='aws'.

src/components/twoFactor/Turnstile.vue captcha-turnstile

Captcha Cloudflare Turnstile. Script dinamico injetado. Theme: light, lang: pt-br. Chama onVerify(token) apos resolucao. Cleanup em beforeDestroy. Usado na tela de login quando captchaProvider != 'aws'.

src/components/user/InactivityOverlay.vue inactivity-overlay

4 paineis RGBA(0,0,0,0.5) cobrindo a tela com recorte em torno do #__lock_element (icone de cadeado na sidebar). z-index 999999. Ativado por inatividade do usuario logado. Requer clique no cadeado para desbloquear (aciona unlock flow).

src/components/user/TwoFactor.vue two-factor-popup

Popup 500x250px de validacao de 2FA no contexto de swap de sessao. Diferente da tela /two-factor — este e um popup inline no chat-attendance.

src/components/user/LoginSwap.vue login-swap-popup

Popup 500x300px de login rapido para swap de sessao. Campo de senha + botao. Fluxo de troca de usuario sem sair da tela.

src/components/user/SelectUser.vue select-user-popup

Popup 1050x470px de selecao de usuario para swap. Filtros por disponibilidade/departamento/permissao. Tabela de usuarios com avatar + status online.

src/components/user/Logout.vue logout-popup

Popup de confirmacao de logout.

src/components/user/Unlock.vue unlock-popup

Popup de desbloqueio de sessao apos inatividade.

mobileCard max-w-md full-width com px-4. Todos os campos empilhados. Captcha widget se adapta. Terms modal full-width.
tabletIdem mobile. Card centralizado no viewport.
desktopCard fixo max-w-md centralizado. Background branco full-screen.

Documentar 6 frames principais: (1) Login: card max-w-md centrado, logo 30px, titulo 35px bold, 2 inputs com icone, switch + link, captcha widget placeholder, botao full-width. Variante com SSO Funcional. (2) Termos: overlay escuro + modal 960px com iframe. (3) Forgot Password: icone cadeado 96px bg-blue-100, titulo, campo email, botao, link voltar. (4) New Password: icone cadeado 50px, alert azul collapsible (2 estados), 2 inputs senha + visibility toggle, PasswordStrong, botao. (5) Two-Factor: tela separada com alert laranja + QR Code + input TOTP 6 digitos. (6) Inactivity Overlay: 4 retangulos semiopa sobre qualquer tela, com buraco no cadeado. Cores: fundo branco (#fff), textos #2C2C2C/#565656, primario (#7367F0), alert 2FA laranja (#f9ebdd).

Campaigns — Gestão de Campanhas

21 componentes 10 estados 15 passos 8 edge cases

Criação e gestão de campanhas de disparo em massa para WhatsApp, SMS e Email. Lista de campanhas + formulário de criação com scheduling, rate control, upload, preview de mensagem e popup de confirmação.

full-table + full-form
Tela de lista: vs-table full-width. Tela de add/edit: form centralizado com seções empilhadas (Configurações Gerais, upload, mensagem). vs-popup de preview sobreposto.
table-listTableCampaigns com header (Adicionar Nova + itens por página) + vs-table + expand rows
form-add-editViewCampaign: seções verticais de configuração + preview popup
vuex: campaignvuex: offlinePlatformexternal_service
  1. 1. Usuário acessa /whatsapp/campaigns (ou /sms/ ou /email/) via menu lateral
  2. 2. Vê TableCampaigns com lista de campanhas. Cada linha expansível mostra contatos ou sub-campanhas.
  3. 3. Clica em 'Adicionar Nova' → navega para ViewCampaign (/whatsapp/campaigns/add)
  4. 4. ViewCampaign: seleciona Conexão (WhatsApp) ou preenche campos de Email
  5. 5. Define Nome da Campanha
  6. 6. Escolhe scheduling: Envio Imediato ou Selecionar Data e Horário (flat-pickr início/fim)
  7. 7. Configura rate: msgs/min + intervalo em minutos
  8. 8. Configura opções: Bot de Conversa / Categoria / Humanizada / Opt-Out / Upload
  9. 9. Se Bot de Conversa: seleciona fluxo via v-tree
  10. 10. Se upload: sobe imagem/vídeo/documento
  11. 11. Clica em confirmar → review popup abre
  12. 12. Review popup: verifica configurações + preview da mensagem
  13. 13. Para WhatsApp Web: aceita checkbox de termos de risco de banimento
  14. 14. Clica Confirmar → campanha disparada
  15. 15. Para cancelar campanha ativa: clica XCircleIcon na linha → popup confirm → Continuar
list_empty
Nenhuma campanha criada
TableCampaigns com noDataText='Sem dados disponíveis' + botão 'Adicionar Nova'
list_populated
Tabela com campanhas
Linhas com nome, datas, contagem, chips de status, thumbnail de imagem (64x64), XCircleIcon cancelar
list_row_expanded
Linha expandida mostrando contatos ou sub-campanhas
TableCampaignCustomers (contatos) ou TableCampaignChildrens (sub-campanhas) abaixo da linha
offline
Plataforma offline
Componente Offline substitui toda a tabela
form_whatsapp
Formulário de nova campanha WhatsApp
Seções verticais: v-select Conexão, input Nome, radios scheduling, input-numbers rate, switches (Bot/Categoria/Humanizada/Opt-Out/Caption), upload file, mensagem preview
form_with_chat_flow
Formulário com Bot de Conversa ativado
v-tree do fluxo ocupa w-9/12. Switches Humanizada/Caption/Opt-Out ficam ocultos.
form_scheduled
Envio agendado selecionado
Dois flat-pickr aparecem: Data Inicial + Horário Inicial / Horário Final
review_popup_open
Popup de confirmação aberto
vs-popup com vs-card de configurações (texto) + vs-card de preview (message-bubble simulando WhatsApp)
review_popup_terms
Review popup com checkbox de termos (WhatsApp Web)
Área azul com vs-checkbox 'blue-warning' obrigatório antes de Confirmar
cancel_confirm
Confirmação de cancelamento de campanha
vs-popup com texto 'Essa campanha será cancelada!' + botões Cancelar (dark flat) e Continuar (danger filled)
vs-table / vs-th / vs-tr / vs-tdvs-popupvs-chipvs-cardvs-alertvs-switchvs-radiovs-checkboxvs-inputvs-buttonvs-dropdown / vs-dropdown-menu / vs-dropdown-itemv-selectv-tree (VTree)flat-pickrinput-numberuploadvx-tooltipfeather-iconOfflineTableCampaignChildrensTableCampaignCustomers
Vuesax componente padrão do Vuesax    Custom componente criado pelo Pedbot
rate_limit_warning
Se msgs por minuto > 2, vx-tooltip AlertTriangleIcon aparece com aviso de risco de banimento
Impacto: Feedback visual de risco. Usuário pode ignorar o aviso e continuar.
instancia_inativa
Se campaign.instance.activated === false, todos os switches e inputs ficam disabled + mensagem de erro abaixo do v-select
Impacto: Formulário parcialmente travado até usuário selecionar instância ativa
limite_diario_cloud
Instâncias WhatsApp Cloud com messaging_limit definido (não UNLIMITED) mostram campo extra de limite diário
Impacto: input-number limita mensagens por dia. Excesso é agendado para dias seguintes.
whatsapp_web_termos
Instâncias WhatsApp Web (non-official) exigem aceite de checkbox no review popup
Impacto: Botão Confirmar fica disabled até aceitar os termos de risco de banimento
campanha_cancelada_chip
Campanhas canceladas exibem vs-chip 'Cancelada' (danger) no lugar do XCircleIcon
Impacto: Não é possível cancelar novamente — chip é apenas visual
ios_tooltip_fallback
No iOS: isIphoneIos() retorna true, usa span.tooltip nativo em vez de vx-tooltip
Impacto: Layout de tooltip pode diferir levemente no iOS
template_message_cloud
Instâncias WhatsApp Cloud usam Template Messages (Meta-approved). Preview mostra header + body + footer + buttons + cards
Impacto: Preview mais rico com suporte a mídia (img/video/doc) e cards horizontais
offline_platform
Se offlinePlatform=true no Vuex, a view exibe <offline> em vez da tabela
Impacto: Usuário não consegue acessar campanhas quando plataforma está offline
src/views/campaigns/Campaigns.vue list-whatsapp

Wrapper thin para WhatsApp (type=0). Renderiza TableCampaigns com fixed=false. Tem fallback Offline component.

src/views/campaigns/SmsCampaings.vue list-sms

Wrapper thin para SMS (type=1, isSms=true). Mesma estrutura de Campaigns.vue.

src/views/campaigns/EmailCampaings.vue list-email

Wrapper thin para Email (type=3, isEmail=true). Mesma estrutura de Campaigns.vue.

src/views/campaigns/TableCampaigns.vue shared-table

Componente de tabela compartilhado entre WhatsApp/SMS/Email. Props: type, campaigns, allowCancel, fixed, isSms, isEmail. Dois modos: fixed=false (lista de campanhas) e fixed=true (campanhas fixas/reutilizáveis).

src/views/campaigns/ViewCampaign.vue add-edit-form

Formulário completo de criação/edição de campanha. Adapta-se por type (whatsapp/sms/email). Inclui configurações gerais, scheduling, rate control, message config e popup de revisão.

src/views/campaigns/TableCampaignChildrens.vue expand-row-fixed

Tabela de sub-campanhas exibida na linha expandida de campanhas fixas (tr.fixed=true).

src/views/campaigns/TableCampaignCustomers.vue expand-row-customers

Lista de contatos da campanha exibida na linha expandida (tr.fixed=false). Props: campaign-id, research, type, campaign_is_cancelled, customer-group, isSms, isEmail.

mobileTabela com scroll horizontal. Formulário em coluna única. Chips e botões adaptados.
tabletFormulário com flexbox row parcial (md:w-3/12 por seção).
desktopFormulário com seções lado a lado (upload + mensagem em flex-row).

Criar frames: (1) CampaignsList — tabela WhatsApp com todas as colunas incluindo chips coloridos (Interativa, Humanizada, Opt-Out, Cancelada) e thumbnail de imagem. (2) Linha expandida com TableCampaignCustomers. (3) ViewCampaign WhatsApp — form completo com v-select conexão + switches em grid horizontal + upload card + v-tree quando Bot de Conversa ativo. (4) ViewCampaign com scheduling: flat-pickr Data Inicial + Horário Inicial/Final. (5) Review popup: 2 vs-cards (configurações texto + preview de message-bubble simulando WhatsApp com header/body/footer/buttons). Criar component set para WhatsApp message preview bubble com variantes: simples (texto), com imagem, com template (header/body/footer/buttons), com cards horizontais.

Catalog

15 componentes 8 estados 0 passos 7 edge cases

Gestão do catálogo de produtos no WhatsApp Business — criação, edição e organização de itens e coleções vinculados a instâncias Business.

tabs-per-instance
vs-tabs alignment='left' com aba fixa 'Introdução' + uma aba por instância WhatsApp Business. Cada aba de instância contém vs-tabs internos com funcionalidades específicas.
api: customerProductsvuex: moduleInstancefeature_flagapi_upload

Fluxo não documentado.

feature_disabled
hasCatalogFeature=false
Tela completamente em branco — v-if silencioso sem fallback message
introduction
Aba Introdução selecionada (default)
vs-card centralizado com texto motivacional + botão verde 'Explorar Catálogo'
no_items
Instância sem itens cadastrados
vs-card com header 'Você ainda não tem produtos...' e instruções de 4 passos
items_populated
Itens cadastrados na instância
vs-table com paginação + dropdown itens-por-página; ícones de status coloridos por revisão Meta
instance_inactive
instance.active=false
Aba da instância desabilitada (vs-tab :disabled=true) — cinza, não clicável
popup_add_edit
Popup de criar ou editar item aberto
vs-popup sobreposto com formulário Upload + campos + switch Oculto/Visível
popup_confirm_delete
Popup de confirmação de exclusão aberto
vs-popup com vs-list-item do produto + botões undo/delete
collection_expanded
Linha de coleção expandida na tabela
Linha expand com tabela interna de itens da coleção (status, imagem, nome, descrição, link, código, preço)
uploadfeather-iconvx-tooltipv-selectvs-tabs / vs-tabvs-tablevs-popupvs-cardvs-switchvs-inputvs-textareavs-paginationvs-dropdown / vs-dropdown-menu / vs-dropdown-itemvs-list / vs-list-itemvs-avatar
Vuesax componente padrão do Vuesax    Custom componente criado pelo Pedbot
feature_gate
hasCatalogFeature verificado via hasFeature() — se false, toda a view não renderiza
Impacto: Sem mensagem de erro ou redirect — UI simplesmente não aparece
instancia_business
Filtro: formatNumber(instance.phone_number) === isBusiness.id — apenas instâncias que correspondem ao isBusiness são exibidas como tabs
Impacto: Instâncias não-Business não geram aba mesmo que ativas
status_meta_review
Itens passam por análise do Meta (capability_to_review_status). NO_REVIEW = em análise, não visível para clientes. APPROVED = aprovado e visível. Outros = rejeitado.
Impacto: Ícone colorido na tabela; tooltip explica o status ao atendente
preco_zero
Campo preço sem valor → padrão R$0,00 (tooltip de aviso no campo)
Impacto: Produto pode ser cadastrado sem preço; vx-tooltip com icon=info color=warning avisa
url_invalida
Campo Link com URL inválida → borderColor=red + mensagem 'Por favor, insira um URL válido.'
Impacto: Validação client-side; botão Criar ainda funciona (sem validação de bloqueio)
colecao_sem_repeticao
Versão atual do catálogo WhatsApp não permite que um item pertença a múltiplas coleções simultaneamente
Impacto: Aviso inline no popup de criar coleção; itens já em outra coleção podem não aparecer no v-select
imagem_cdn
Imagens armazenadas via CDN — uploadApiUrl = baseUrl + '/api/file/upload'; Authorization: Bearer token no header da requisição
Impacto: Upload direto para API; @on-success seta image; @on-error notifica erro
src/views/catalog/ItensCatalog.vue main-items

View de itens: vs-tabs com aba Introdução + aba por instância WhatsApp Business. Aba de instância tem sub-tabs Itens (tabela) e Adicionar Item (formulário).

src/views/catalog/ColletionsCatalog.vue main-collections

View de coleções: mesma estrutura de vs-tabs. Aba de instância tem sub-tab Coleções com tabela expansível mostrando itens de cada coleção.

mobilevs-tabs com alignment=left se comporta como tabs horizontais no mobile; formulários ficam em coluna única
tabletLayout mantém vs-card centralizado para introdução; tabela com scroll horizontal
desktopLayout completo; tabela com todas as colunas visíveis

Criar 3 frames por view (ItensCatalog e ColletionsCatalog): (1) Tab Introdução — vs-card onboarding centralizado com botão. (2) Tab Instância / sub-tab Itens — tabela com ícones de status coloridos e coluna Ações (3 ícones). (3) Tab Instância / sub-tab Adicionar Item — formulário de 2 colunas (upload à esquerda, campos à direita) + textarea full-width. Criar component set para o ícone de status Meta Review (3 variantes: pending/approved/rejected). Para ColletionsCatalog: criar frame com row expand mostrando sub-tabela de itens.

Chat Attendance

/chat-attendance (nova versao: NewIndex.vue)
34 componentes 13 estados 11 passos 10 edge cases

Fluxo completo de atendimento humano via chat. Tela principal do operador — onde ele ve, filtra e responde conversas de clientes via WhatsApp, Instagram, Facebook Messenger. Suporta dois modos de visualizacao: lista (sidebar + chat) e kanban (colunas por status). E a view mais complexa do sistema.

multi-column + optional-overlay-sidebars
3 colunas: plataforma (estreita) + sidebar de lista + area principal. Modo kanban substitui a area principal por colunas.
platform-col estreita (~50px)Coluna estreita com icones de plataforma (WhatsApp, Facebook, Instagram). Altura total.
sidebar-col fixo, colapsavel em mobileSidebar de lista de conversas. Contem: busca, filtros rapidos, filtro avancado (dropdown), lista de contatos, footer de acoes em massa.
main-col flex (ocupa o restante)Area principal. Modo lista: header (navbar) + historico de mensagens + input. Modo kanban: filterbar + colunas kanban.
profile-sidebarPainel de perfil do cliente. Overlay sobre a area principal quando activeProfileSidebar=true.
websocketvuex: chat / AppActiveUserhttpmedia-recorder
  1. 1. Atendente acessa /chat-attendance pelo menu lateral (icone de chat)
  2. 2. Seleciona o tab de filtro rapido: Inbox (pendentes) ou Meus atendimentos
  3. 3. Ve lista de contatos na sidebar esquerda com preview da ultima mensagem e badge de nao-lidas
  4. 4. Clica em um contato para abrir a conversa na area principal
  5. 5. Le o historico de mensagens (NewChatLog) que carrega automaticamente
  6. 6. Digita resposta na textarea (ou usa emoji picker, ou grava audio, ou envia arquivo)
  7. 7. Pode usar respostas rapidas digitando '/' ou acessando via menu '+'
  8. 8. Pode abrir perfil do cliente clicando no avatar no header
  9. 9. Pode encerrar ou transferir o atendimento via acoes no NewChatNavbar
  10. 10. Pode filtrar por plataforma na coluna esquerda (WhatsApp/Instagram/Facebook)
  11. 11. Pode usar filtros avancados no dropdown de funil (departamento, categoria, conexao)
no-conversation-selected
Sidebar com lista, area principal com icone MessageSquare + texto 'Iniciar Conversa'. Clicavel para abrir NewChatStart.
Area principal vazia com icone central e CTA
loading-conversation
Conversa selecionada mas historico carregando. vs-loading no container #chat-app.
Spinner/overlay de loading na area principal
active-conversation
Conversa aberta com historico + input ativo. Estado normal de operacao.
Header com contato + scroll de mensagens + input normal
kanban-view
isKanbanView=true. Sidebar some. Area principal mostra filterbar + colunas kanban.
Layout de colunas sem sidebar de lista
profile-open
activeProfileSidebar=true. Painel de perfil do cliente sobrepos a area do chat.
Classe chat-app--profile-open no container raiz. Painel desliza da direita.
bulk-selection
showSelectList=true. Checkboxes aparecem nos itens da lista. Footer de acoes em massa aparece.
Checkboxes nos contatos + footer azul na base da sidebar
new-chat-sidebar-open
activeNewChatSidebar=true. Sidebar de nova conversa aparece sobre a lista.
Formulario de iniciar conversa ocupa o espaco da sidebar
transfer-incoming
ticketTransfer nao nulo. popup de transferencia recebida aberto com countdown.
Popup central bloqueante com contador regressivo
stock-images-open
showImagesStock=true. Grid de imagens de estoque aparece acima do input.
Grade de imagens ViewStockImages sobre o footer do chat
audio-recording
audioGridActive=true. Barra de gravacao de audio substitui o input normal.
Barra com ponto vermelho piscante + timer + waveform + botoes pause/send/trash
comment-mode
commentActive=true. Input muda de cor (warning/amarelo). Pill 'Comentario' visivel.
Textarea + pill amarelo + botao enviar amarelo
bot-edit-mode
awaitBotResponse=true. Pill 'Mensagens do bot' visivel. Atendente edita sugestao da MarIA.
Pill roxo no input indicando modo bot
whatsapp-cloud-alert
Banner de alerta sobre migracao para API Cloud no topo da area de chat. Fechavel.
Banner amarelo/laranja no topo da conversa com texto e link
NewChatSidebarNewChatContactNewChatFiltersNewChatNavbarNewChatLogNewChatLogItemNewChatConversationLayoutNewChatKanbanNewChatPlatformNavbarNewChatStatusCheckerNewChatUserProfileNewChatBulkTransferComponentNewChatStartNewChatGetOrderByMsgExpandableImageViewStockImagesDraggableButtonNewTooltipVsDropdown / VsDropdownMenu / VsDropdownItemSelectUser / LoginSwap / TwoFactor / Logout / UnlockInteractiveMessagePopuppicker (emoji-mart-vue)vue-countdownvs-sidebarvs-popupvs-buttonvs-inputvs-collapse / vs-collapse-itemvs-chipvs-alertvs-navbarvs-radio / vs-checkboxvs-switchfeather-icon
Vuesax componente padrão do Vuesax    Custom componente criado pelo Pedbot
atendimento-encerrado
activeChatUser.finished_at preenchido. Input substituido por CTA clicavel para novo contato.
Impacto: Atendente nao pode responder — clicar abre novo atendimento
atendimento-outro-operador
user_id do ticket != user_id do atendente logado.
Impacto: Input substituido por mensagem com CTA para solicitar transferencia
aguardando-nps
activeChatUser.is_research=true. Atendimento aguardando avaliacao NPS.
Impacto: Input bloqueado. Com permissao 'reopen-nps' aparece CTA para reabrir.
transferencia-recebida
Outro atendente solicita transferencia. ticketTransfer preenchido.
Impacto: Popup bloqueante com countdown. Se nao responder, transferencia automatica.
telefone-invalido
activeChatUser.customer.has_valid_phone_number=false.
Impacto: Input desabilitado com mensagem 'Contato invalido'
atendimento-inbox
activeChatUser.inbox=true. Nao e possivel responder a partir da aba incorreta.
Impacto: Input com mensagem orientando a usar a aba correta
open-by-template
Atendimento aberto via template WhatsApp. activeChatUser.open_by_template=true.
Impacto: Input bloqueado — aguarda resposta do cliente antes de poder enviar
conexao-perdida-whatsapp
Status da conexao WhatsApp degradado.
Impacto: NewChatStatusChecker exibe banner de alerta no topo da sidebar
single-sign-on
singleSignOn=true. Header alternativo na sidebar com avatar + email + botoes de sessao (lock/logout/selectUser).
Impacto: Atendente pode trocar de usuario sem sair da tela
sessao-inativa
InactivityOverlay ativo (componente user-components). Tela bloqueada por inatividade.
Impacto: 4 paineis escuros cobrem a tela com recorte no icone de lock. Requer unlock.
src/views/chat-attendance/NewIndex.vue main

Orchestrator principal. Gerencia toda a logica de estado: contatos, mensagens, filtros, transferencias, modos de visualizacao (lista/kanban). Arquivo grande (~2000+ linhas).

src/views/chat-attendance/new-chat/NewChatSidebar.vue sidebar-wrapper

Container da sidebar esquerda com slots para search, filters e conteudo.

src/views/chat-attendance/new-chat/NewChatContact.vue list-item

Card de contato na lista da sidebar. Avatar + nome + preview ultima mensagem + badge de nao-lidas + icone de canal.

src/views/chat-attendance/new-chat/NewChatFilters.vue filter-tabs

Abas de filtro rapido: Inbox, Meus, Todos, Abertos, Fechados, Nao-lidos, por plataforma (WhatsApp/Instagram/Facebook), Maria, Campanhas, Status.

src/views/chat-attendance/new-chat/NewChatNavbar.vue chat-header

Navbar da conversa ativa. Nome/avatar do contato + acoes (encerrar, transferir, pesquisar, perfil).

src/views/chat-attendance/new-chat/NewChatLog.vue message-history

Area de historico de mensagens da conversa ativa. Lista de NewChatLogItem com scroll.

src/views/chat-attendance/new-chat/NewChatLogItem.vue message-bubble

Bolha de mensagem individual. Suporta texto, audio, imagem, video, arquivo, localizacao, sticker.

src/views/chat-attendance/new-chat/NewChatConversationLayout.vue conversation-wrapper

Layout da area de conversa com slots #header, #default (chat log), #alert (banner), #footer (input).

src/views/chat-attendance/new-chat/NewChatKanban.vue kanban-view

Visualizacao kanban alternativa. Colunas por status com cards de contato. Ativo quando isKanbanView=true.

src/views/chat-attendance/new-chat/NewChatPlatformNavbar.vue platform-switcher

Barra de icones de plataforma (WhatsApp/Facebook/Instagram) para filtrar por canal.

src/views/chat-attendance/new-chat/NewChatStart.vue new-conversation-sidebar

Sidebar de iniciar nova conversa. Selecao de conexao + numero do contato.

src/views/chat-attendance/new-chat/NewChatUserProfile.vue profile-sidebar

Painel lateral de perfil do cliente. Abre ao clicar no avatar do contato.

src/views/chat-attendance/new-chat/NewChatBulkTransferComponent.vue bulk-action

Componente de acao em massa (encerrar/transferir multiplos atendimentos).

src/views/chat-attendance/new-chat/NewChatStatusChecker.vue status-alert

Banner de alerta no topo da sidebar — alerta sobre status de conexao WhatsApp.

mobileSidebar colapsavel (class chat-sidebar-col--collapsed). Botao X para fechar. Botoes de acao no menu + compacto (vs-dropdown com radio icon add). Botao send com icon 'send'. MicIcon visivel no input.
tabletLayout intermediario. Sidebar ainda colapsavel.
desktopLayout completo 3 colunas. Dropdown '+' expandido com todos os itens. Botao send com icon 'arrow_upward'.

Criar frames para cada estado principal: (1) No-conversation: icone central + CTA. (2) Active-conversation: 3 colunas (platform strip + sidebar + chat). (3) Kanban-view: filterbar + colunas. Documentar o input com todos os modos (normal, comment, audio, blocked). Criar component set de NewChatContact com variantes: padrao, ativo, nao-lido, com badge. Documentar o filtro avancado como dropdown com accordion. O header da conversa (NewChatNavbar) merece frame proprio com todas as acoes. Cores: input normal = primary, comment mode = warning (#FF9F43), bot mode = pill roxo. Banner de cloud alert = cor de destaque amarela/laranja.

Chat Flows — Editor de Fluxos do Bot

19 componentes 10 estados 12 passos 8 edge cases

Editor de fluxos de conversa do bot (Bot de Triagem e Bot de Campanhas). Árvore interativa de nós + sidebar de edição + aba de horário de atendimento. Inclui também configuração da MarIA (new-chat-flows).

tabs-main + right-sidebar
vs-card principal com vs-tabs (2 tabs). vs-sidebar deslizante da direita para edição. vs-popup para preview.
tabs-containervs-card com vs-tabs: Tab 1 = árvore do fluxo, Tab 2 = horário de atendimento
tree-areav-tree (vue-tree-halower) com nós inline-editáveis. Botões 'adicionar fluxo', 'adicionar opção', 'editar', 'remover' renderizados via tpl() JSX
sidebar-editvs-sidebar right fixo ao body. Abre ao clicar em adicionar/editar nó.
preview-popupvs-popup 'sizePopup' com ChatFlowPreview simulando conversa do bot.
vuex: chatFlowvuex: settingsvuex: userDepartmentexternal
  1. 1. Usuário acessa /chat-flows/:type/list via menu lateral (Bot de Triagem) ou /chat-flows-active (Bot de Campanhas)
  2. 2. Vê vs-card com vs-tabs: Tab 'Fluxo Bot de Triagem/Campanhas' ativa
  3. 3. Árvore v-tree exibe: raiz 'Fluxos de Bots' > 'Exemplo de Fluxo' (com botão 'pré-visualização') > 'Fluxo Bot de {tipo}'
  4. 4. Clica em 'pré-visualização' → vs-popup abre com ChatFlowPreview (bubbles simulando a conversa)
  5. 5. Clica em 'adicionar fluxo' no nó do tipo → ChatFlowViewSidebar desliza da direita
  6. 6. Sidebar: digita Primeira Mensagem no textarea → Salvar → nó raiz do fluxo criado na árvore
  7. 7. Clica em 'adicionar opção' no nó criado → Sidebar reabre para adicionar sub-opções
  8. 8. Sidebar: escolhe Tipo de interação (Opção/Texto/Anexo/Link) → preenche campos específicos → Salvar
  9. 9. Repete steps 7-8 para construir a árvore de fluxo
  10. 10. Para horário (passive): aba 'Horário de Atendimento' → ativa useScheduling → configura dias/horas no BotSchedule → Salvar
  11. 11. Para editar nó existente: clica em 'editar' inline → Sidebar reabre com dados do nó
  12. 12. Para remover nó: clica em 'remover' → vs-dialog confirm → remove em cascata com sub-opções
flow_empty
Nenhum fluxo criado ainda
Árvore com 'Fluxos de Bots' > 'Exemplo de Fluxo' + 'Fluxo Bot de {tipo}' com botão 'adicionar fluxo'
flow_populated
Fluxo com nós criados
Árvore expandida com nós filhos. Cada nó tem botões inline: adicionar opção, editar, remover
sidebar_new_flow
Sidebar aberto para criar o nó raiz do fluxo
Painel lateral direito com header 'NOVO FLUXO BOT' + textarea 'Primeira Mensagem'
sidebar_add_option
Sidebar aberto para adicionar nova opção a um nó
Header 'ADICIONAR NOVA OPÇÃO' + select tipo de interação + campos por tipo
sidebar_edit_option
Sidebar aberto para editar opção existente
Header 'ATUALIZAR OPÇÃO' + campos preenchidos com dados do nó
preview_popup
Preview da conversa do bot aberto
vs-popup com bubbles de mensagem alternadas (bot: alinhado esquerda, usuário: alinhado direita). Passive = opções numeradas, active = vs-chip botões.
schedule_inactive
Aba de horário com scheduling desativado
Switch 'Ativar Configuração de Horário' OFF, sem campos adicionais
schedule_active
Scheduling ativado com grade de dias/horários
BotSchedule com 7 linhas de dias + flat-pickr para cada hora. Textarea para mensagem fora do horário.
schedule_by_department
Scheduling vinculado a departamentos
Lista de vs-checkbox de departamentos. Ao selecionar, painel settings-flow-panel com BotSchedule individual aparece abaixo de cada um.
delete_confirm
Confirmação de remoção de nó
vs-dialog color=danger com texto 'A opção e suas sub-opções serão excluídas em cadeia'
vs-tabs / vs-tabvs-cardvs-sidebarvs-popupvs-switchvs-select / vs-select-itemvs-textareavs-checkboxvs-collapse / vs-collapse-itemvs-inputvs-chipvs-buttonv-tree (VTree)BotScheduleChatFlowPreviewVuePerfectScrollbarflat-pickruploadfeather-icon
Vuesax componente padrão do Vuesax    Custom componente criado pelo Pedbot
active_sem_schedule
Tab 'Horário de Atendimento' é desabilitada (disabled) para fluxo active (Bot de Campanhas)
Impacto: Usuário no fluxo de campanhas não vê a aba de horário — ela existe mas não é acessível
link_type_apenas_cloud
Tipo de interação 'Link' (type=3) só aparece no select se hasCloud=true
Impacto: Conexões WhatsApp Web não têm opção de link no editor
delete_em_cascata
Ao remover um nó, todas as sub-opções são excluídas em cadeia
Impacto: Confirmação obrigatória via vs-dialog antes da remoção
limite_caracteres_interativo
No modo interativo (settingButtons ou is_interactive), textarea tem counter='20' e maxlength='20'
Impacto: Mensagens em nós interativos limitadas a 20 chars para caber em botões WhatsApp Cloud
back_option
Quando backOptionIsActive (setting enable_back_option_passive_flow), sidebar mostra checkbox 'Voltar para opção anterior'. Número do nó é decrementado automaticamente.
Impacto: Fluxo ganha opção '0 - Voltar' automática em cada nível
maria_activation
Checkbox 'Ativar MarIA' aparece apenas no passive flow quando hasMaria=true e o nó tem parent_option_id
Impacto: Ao marcar: trigger_new_passive_flow=true, nó não pode ter sub-opções
schedule_validacao
Salvar schedule valida: ao menos 1 dia selecionado, mensagem fora do horário preenchida, horas início != fim por dia, pausa configurada corretamente
Impacto: Notificações de erro específicas por tipo de falha de validação
maria_config_gated
NewChatFlowsList tem v-if='mariaIsEnabled && canSee()' — renderiza vazio se MarIA não ativa ou sem permissão
Impacto: Tela em branco sem mensagem de feedback para usuários sem MarIA
src/views/chat-flows/ChatFlowsList.vue main

View principal com vs-tabs (Fluxo Bot + Horário de Atendimento). Árvore de nós via v-tree (vue-tree-halower). Shared por passive e active via route param.

src/views/chat-flows/ChatFlowViewSidebar.vue sidebar

vs-sidebar direito deslizante para adicionar/editar nós do fluxo. Campos variam por tipo de interação e contexto do nó.

src/views/chat-flows/ChatFlowPreview.vue preview

Preview simulado da conversa do bot. Renderiza bubbles de mensagem com as opções do fluxo de exemplo.

src/views/new-chat-flows/NewChatFlowsList.vue maria-config

Configuração da MarIA (IA). Gated por mariaIsEnabled && canSee(). Grupos de configuração numerados.

src/views/new-chat-flows/NewChatFlowsListMemories.vue maria-memories

Lista de memórias da MarIA para gestão de contexto persistente.

mobileSidebar de edição em full-width. Árvore pode ser difícil de navegar em telas pequenas.
tabletSidebar ocupa ~50% da tela. Árvore com scroll horizontal se fluxo for profundo.
desktopLayout completo. Sidebar fixa à direita (~400px). Árvore com scroll vertical.

Criar frames: (1) ChatFlowsList empty state (árvore com apenas Exemplo de Fluxo + Adicionar Fluxo button). (2) ChatFlowsList populated (árvore com nós criados, mostrando botões inline por nó). (3) ChatFlowViewSidebar — criar 4 variantes: Novo Fluxo, Adicionar Opção tipo=0, Adicionar Opção tipo=2 (Anexo), Adicionar Opção tipo=3 (Link). (4) Schedule tab: variantes inactive/active/active-com-departamentos. (5) ChatFlowPreview popup: variante passive (numerado) e active (chips). Usar cores das labels dos nós: #FA9E43 (exemplo), #1E1E1E (triagem), #7367F0 (campanhas).

Configs — Configurações do Sistema

16 componentes 10 estados 8 passos 6 edge cases

Grupo de sub-rotas de configurações do Pedbot. Cada rota tem propósito distinto: ajustes dinâmicos de atendimento, mensagens automatizadas, respostas rápidas, formulário de farmácia e ferramentas Meta. Padrão comum: vs-card por seção + vs-switch/vs-checkbox + sidebars de edição.

per-route
Cada sub-rota tem seu próprio layout. DynamicSettings: vs-row/vs-col grid de vs-card. Messages: vs-table full-width + sidebar. BusinessAccount: sidebar-left (280px) + content-area. ClientForm: vs-card stack centralizado.
dynamic-settingsGrid de vs-card com vs-row/vs-col. Cada card = uma seção temática de configuração.
messages-viewsvs-table (ou vx-table) + vs-sidebar direito deslizante para edição.
business-accountSidebar menu esquerda (280px) com vs-card + content-area à direita.
vuex: settingshttp: requests/messages
  1. 1. Usuário acessa sub-rota de config via menu lateral (ex: /configs/dynamic-settings)
  2. 2. DynamicSettings: vê grid de cards por seção. Ativa/desativa switches e checkboxes — salva automaticamente via watchers.
  3. 3. Para habilitar MarIA: ativa 'Triagem Automática' → toggle para 'MarIA' → seleciona tipo → vincula conexões via popup
  4. 4. Para mensagens: acessa sub-rota (/closing-messages, /nps-messages, etc.) → vê vs-table com mensagens existentes
  5. 5. Clica EditIcon na linha → vs-sidebar desliza com textarea/fields da mensagem → Salvar
  6. 6. Quick answers (/quick-answers): 'Nova Resposta Rápida' → sidebar → preenche atalho + texto → Salvar
  7. 7. ClientForm (/client-form): preenche dados da farmácia (Nome Fantasia, Razão Social, CNPJ, Sobre Nós) → Salvar
  8. 8. BusinessAccount (/business-account): navega entre abas 'Limites de Mensagens' e 'Tiers da Meta' via menu lateral
dynamic_settings_default
Configurações carregadas com estado atual do sistema
Grid de vs-card com switches/checkboxes mostrando configurações atuais. HelpCircleIcon em cada seção.
dynamic_settings_maria_mode
MarIA ativada como triagem automática
Card 'Triagem Automática' expandido com v-select de tipo + chips de conexões + múltiplos vs-checkbox de MarIA
dynamic_settings_passive_flow_mode
Bot de Triagem (passiveFlow) ativado
Checkboxes de fluxo passivo aparecem: prioridade, sleep, reply, back option, LGPD, finalização
maria_instances_popup
Popup de seleção de conexões MarIA aberto
vs-popup com table-instances mostrando instâncias disponíveis para vincular
messages_table_empty
Nenhuma mensagem cadastrada
vs-table com noDataText='Sem dados disponíveis'
messages_table_populated
Tabela de mensagens com dados
Linhas com nome da mensagem + EditIcon
messages_sidebar_edit
Sidebar de edição de mensagem aberto
vs-sidebar direito com textarea/fields da mensagem + botão Salvar
business_account_limites
Aba 'Limites de Mensagens' ativa
Menu item 'Limites de Mensagens' highlighted + vs-card de limite unificado + consumo por conexão
business_account_tiers
Aba 'Tiers da Meta' ativa
Menu item 'Tiers da Meta' highlighted + conteúdo de progressão de tiers
client_form
Formulário de dados da farmácia
vs-card com aviso de segmento farmacêutico (AlertTriangleIcon primary) + campos do formulário
vs-cardvs-row / vs-colvs-switchvs-checkboxvs-iconvs-popupvs-table / vs-th / vs-tr / vs-tdvs-inputvs-sidebarvx-tablevx-tooltipv-selectvs-chipinput-numberfeather-icontable-instances
Vuesax componente padrão do Vuesax    Custom componente criado pelo Pedbot
interdependencias_checkboxes
DynamicSettings tem checkboxes fortemente interdependentes: Distribuição Automática requer Caixa de Entrada ativa para ser habilitada. Caixa de Entrada Inteligente é disabled=true e se ativa automaticamente.
Impacto: UI comunica interdependências via :disabled e vs-icon notices. Sem mensagens de erro explícitas.
maria_vs_passive_flow
Toggle entre 'Bot de Triagem' e 'MarIA' muda completamente os controles visíveis no card
Impacto: Ativar MarIA desativa o fluxo passivo antigo. Tooltip InfoIcon warning avisa sobre isso.
client_form_farmacia_only
ClientForm.vue tem vs-card explicitando 'Esta seção é exclusiva para lojas com segmento farmacêutico'
Impacto: Outros tipos de negócio veem a tela mas com aviso de que não se aplica a eles
auto_save
DynamicSettings não tem botão Salvar explícito — persiste via watchers automaticamente
Impacto: Cada toggle dispara imediatamente um save. Sem confirmação ou desfazer.
caixa_inteligente_disabled
vs-checkbox 'Caixa de Entrada Inteligente' tem disabled=true sempre — é auto-ativado pelo sistema
Impacto: Usuário não pode controlar diretamente. Mostra estado informativo apenas.
hasMaria_feature_flag
Seção 'Triagem Automática' só aparece se features.hasMaria=true
Impacto: Tenants sem MarIA não veem o card de triagem automática
src/views/configs/DynamicSettings.vue main

Ajustes dinâmicos de atendimento. vs-row/vs-col grid de vs-card por seção. Salva via watchers (sem botão explícito). Popup para seleção de conexões MarIA.

src/views/messages/Settings.vue closing-messages

vs-table de mensagens de encerramento. Apenas coluna de nome + EditIcon → SettingViewSidebar.

src/views/messages/MessageNPS.vue nps-messages

vs-table ou vx-table de mensagens NPS com sidebar de edição.

src/views/messages/MessageInactive.vue inactive-messages

Mensagens de inatividade com sidebar (MessageInactiveViewSidebar).

src/views/messages/MessageInactiveInbox.vue inactive-inbox-messages

Mensagens de inatividade da caixa de entrada com sidebar (MessageInactiveInboxViewSidebar).

src/views/messages/MessageTemplate.vue quick-answers

vx-table de respostas rápidas. Botão 'Nova Resposta Rápida' + items per page + search + sidebar (MessageTemplateViewSidebar).

src/views/configs/ClientForm.vue pharmacy-form

Formulário de dados da farmácia. vs-card exclusivo para farmácias com aviso de segmento + campos: Nome Fantasia, Razão Social, CNPJ (v-mask), Sobre Nós.

src/views/configs/BusinessAccount.vue meta-tools

Ferramentas Meta. Layout sidebar-esquerda (280px vs-card menu) + content-area. Abas: Limites de Mensagens e Tiers da Meta.

src/views/configs/ContractProposalPdf.vue contract-pdf

Visualização/geração de PDF de proposta de contrato.

mobilevs-card stack em coluna única. Sidebar full-width. BusinessAccount sidebar menu colapsa.
tabletvs-row/vs-col com 2 colunas. Sidebar ~50% tela.
desktopGrid de vs-card 2 colunas. BusinessAccount com sidebar 280px fixo.

Criar frames para cada sub-rota: (1) DynamicSettings — grid de 3 vs-card com seções Unificar Conexões, Atendimento Automatizado, Triagem Automática. Variantes: modo PassiveFlow (checkboxes) e modo MarIA (v-select + chips + checkboxes). (2) Messages table — vs-table simples nome + EditIcon. Sidebar de edição com textarea. (3) Quick Answers — vx-table com botão 'Nova Resposta Rápida'. (4) BusinessAccount — layout sidebar-menu 280px + content-area. (5) ClientForm — stack de vs-cards com formulário. Importante: documentar os vs-icon notices (subdirectory_arrow_right, cor #0a93ff) como padrão de UI para dependências entre campos.

Customers — Gestão de Contatos

/customers/list
20 componentes 10 estados 13 passos 7 edge cases

Lista e gestão completa de contatos (clientes) do Pedbot. vs-table server-side com busca, ordenação, paginação, sidebar de edição, categorias/tags, download de planilha e sincronização com ERP.

full-table
Tabela vs-table ocupa toda a área de conteúdo. Sidebar deslizante direito para edição. Modais sobrepostos para ERP, download e confirmações.
table-headerBotões de ação (Adicionar, Download, '...' dropdown) + seletor de itens por página com paginação atual
table-bodyLinhas de contato com colunas variáveis por feature flags. Linha expansível com TableCustomerCategory.
paginationvs-pagination max=7 na parte inferior
vuex: customer
  1. 1. Usuário acessa /customers/list via menu lateral
  2. 2. Vê vs-table com lista de contatos (busca e ordenação server-side)
  3. 3. Para adicionar: clica 'Adicionar Novo' → CustomersViewSidebar desliza da direita
  4. 4. Sidebar: preenche Nome + Telefone (obrigatórios), Email opcional, Informações, flags de bloqueio
  5. 5. Para categorias: clica vs-chip 'Adicionar Categoria' → popup abre com TableCategoryOfCustomer
  6. 6. Seleciona categorias → popup fecha → chips coloridos aparecem no sidebar
  7. 7. Clica Salvar → contato criado → tabela recarrega
  8. 8. Para editar: clica EditIcon na linha → sidebar reabre com dados do contato
  9. 9. Para expandir categorias: clica na linha (expand slot) → TableCustomerCategory aparece abaixo
  10. 10. Para deletar: clica TrashIcon → vs-popup confirm com avatar + nome + identificador
  11. 11. Para bulk delete: '...' → 'Selecionar Contatos' → checkboxes aparecem nas linhas → seleciona → TrashIcon → confirmação em lista
  12. 12. Para download: 'Baixar Lista de Contatos' → CustomersDownload popup → escolhe tipo + quantidade → baixa planilha(s)
  13. 13. Para sync ERP: '...' → 'Sincronizar com ERP' → CustomersSyncErpModal → seleciona ERP → sincroniza
empty
Nenhum contato cadastrado
vs-table com noDataText='Sem dados disponíveis' + botão 'Adicionar Novo' no header
populated
Tabela com contatos
Linhas com nome, identificador, status chips, favorito chip, conexão, ações. vs-pagination na base.
select_mode
Modo de seleção em massa ativo
Coluna de vs-checkbox adicionada à esquerda de cada linha. Dropdown de ações, paginação e seletor de itens por página ocultados. Ícone delete + close no header.
sidebar_new
Sidebar aberto para novo contato
Header 'ADICIONAR NOVO CONTATO' + campos vazios + 'Nenhuma categoria vinculada'
sidebar_edit
Sidebar aberto para editar contato existente
Header 'ATUALIZAR CONTATO' + campos preenchidos + chips de categorias vinculadas
add_category_popup
Popup 'Adicionar Categoria' aberto dentro do sidebar
vs-popup com TableCategoryOfCustomer (tabela de grupos disponíveis com checkboxes)
delete_single_confirm
Confirmação de deleção de um contato
vs-popup com vs-list-item (avatar + nome + identificador) + botão undo (primary) + delete (danger)
delete_bulk_confirm
Confirmação de deleção de múltiplos contatos
vs-popup com lista de vs-list-item dos contatos selecionados
download_modal
Modal de download de planilha
3 checkboxes (Todos / Por Conexão / Por Período) + input-number quantidade + v-select conexão (condicional)
erp_sync_modal
Modal de sincronização com ERP
vs-table de ERPs disponíveis para seleção
vs-table / vs-th / vs-tr / vs-tdvs-paginationvs-sidebarvs-popupvs-chipvs-checkboxvs-inputvs-textareavs-dropdown / vs-dropdown-menu / vs-dropdown-itemvs-buttonvs-list / vs-list-itemvs-avatarvs-dividerfeather-iconvx-input-phoneVuePerfectScrollbarv-selectinput-numberTableCustomerCategoryTableCategoryOfCustomer
Vuesax componente padrão do Vuesax    Custom componente criado pelo Pedbot
contato_messenger_instagram
Contatos oriundos de Instagram ou Messenger (têm messenger_id ou instagram_id) não exibem campo de telefone no sidebar
Impacto: vx-input-phone hidden; identificador é o ID da plataforma
status_multiplos_bloqueios
Um contato pode estar bloqueado em múltiplos canais simultaneamente
Impacto: Múltiplos vs-chip de status na mesma célula (ex: chip Pedbot + chip WhatsApp)
feature_flags
Colunas Email e Origem são condicionais por hasEmailFeature e hasErpFeature
Impacto: Tabela tem estrutura de colunas variável dependendo das features do tenant
paginacao_server_side
Busca e ordenação são server-side (sst=true). handleSearch e handleSort disparam requests.
Impacto: Não há filtragem client-side — cada digitação aciona request
itens_por_pagina_default_4
itemsPerPage padrão é 4 (muito baixo para uso real)
Impacto: Usuário frequentemente precisa mudar para 10/15/20 manualmente
categorias_closable
vs-chip de categoria no sidebar são closable — click no X remove a vinculação
Impacto: Remoção imediata sem confirmação — pode ser acidental
download_multiplas_planilhas
CustomersDownload permite baixar até 50 planilhas simultâneas via input-number
Impacto: Cada unidade provavelmente = 1 período/intervalo de exportação
src/views/customers/CustomersList.vue main

Tabela server-side de contatos com header de ações, linha expansível com categorias e popups de deleção.

src/views/customers/CustomersViewSidebar.vue sidebar

vs-sidebar direito para adicionar/editar contato. Inclui campos básicos, flags de bloqueio e gestão de categorias.

src/views/customers/TableCustomerCategory.vue expand-row

vs-table exibido na linha expandida do vs-tr. Lista as categorias (grupos) vinculadas ao contato.

src/views/customers/TableCategoryOfCustomer.vue modal-inner

Tabela dentro do vs-popup 'Adicionar Categoria'. Lista grupos disponíveis para vincular ao contato.

src/views/customers/AddCustomerPopUp.vue popup-simple

vs-popup simplificado de adição rápida de contato (apenas Nome + Telefone). Alternativa ao sidebar completo.

src/views/customers/CustomersSyncErpModal.vue modal-erp

vs-popup para sincronização com ERP. Lista ERPs disponíveis em vs-table. Visível apenas com hasErpFeature.

src/views/customers/CustomersDownload.vue modal-download

vs-popup para download da lista de contatos. Opções: Todos, Por Conexão, Por Período. input-number para quantidade de planilhas.

mobileTabela com scroll horizontal. Sidebar full-width. Chips de status podem ficar comprimidos.
tabletTabela com algumas colunas visíveis. Sidebar ~50% largura.
desktopLayout completo. Todas as colunas visíveis. Sidebar ~400px.

Criar frames: (1) CustomersList populated — tabela completa com todas as colunas (desktop). (2) CustomersList select mode — coluna de checkboxes ativa, bulk delete visível. (3) Linha expandida com TableCustomerCategory (grupos como chips coloridos com nome). (4) CustomersViewSidebar — variantes: new (vazio) e edit (preenchido com categorias). (5) Status chips — criar componente com variantes: Ativo (green), Pedbot bloqueado (red), WhatsApp bloqueado (orange), SMS bloqueado, Email bloqueado — e variante multi-status. (6) Delete confirm popup (singular e bulk). Usar vs-chip para categorias com suporte a cor customizável por grupo.

Dashboard / Analytics

13 componentes 7 estados 10 passos 7 edge cases

Telas de analytics e relatórios do Pedbot, compostas por filtros de data + iframes Metabase ou cards nativos Vue/Apex.

single-column
Layout de coluna única: filter card fixo no topo + expansão opcional de filtros adicionais + iframes Metabase empilhados
filter-cardCard com CSS grid 4 colunas (auto-fit minmax 280px): filter-panel + date-panel + checkbox-panel + actions-panel
active-filters-expansionCard condicional (v-if countFilter > 0) com grid de listas de seleção múltipla (slim lists). Número de colunas = countFilter (máx auto)
metabase-iframesUm ou mais iframes Metabase empilhados, cada um com altura em vw relativa ao tipo de dashboard (iframe-dafault: 235vw, iframe-cloud: 87vw, iframe-campaigns: 58vw, iframe-orders: 220vw, iframe-maria: 330vw, iframe-control-panel: 220vw)
external_servicevuex: instancevuex: layoutapiutility
  1. 1. Usuário acessa /dashboard/analytics pelo menu lateral (ícone de gráfico)
  2. 2. View carrega: beforeMount define initial_date e finish_date como hoje, chama setMinDate() para buscar a data mínima permitida pela API
  3. 3. loadMetabase() é chamado automaticamente — gera JWT e popula src dos iframes
  4. 4. Iframes Metabase carregam os dashboards correspondentes ao tipo de painel (1-3 iframes simultâneos)
  5. 5. Usuário pode ajustar o intervalo de datas com os dois flat-pickr e clicar em Filtrar
  6. 6. filterDateAnalytics() re-assina o JWT com novos params e atualiza src dos iframes
  7. 7. Opcionalmente, usuário ativa checkboxes de filtro (departamento, instância, etc.) — expande um card de listas de seleção abaixo do filter card
  8. 8. Usuário seleciona itens nas slim lists, clica Filtrar → JWT atualizado com os IDs selecionados
  9. 9. Para maria-panel: também filtra por tipo MarIA (Vendas vs Copilota)
  10. 10. Atualização automática: usuário configura intervalo (1/5/10 min) → filterDateAnalytics() chamado periodicamente via setInterval
loading_initial
beforeMount: setShowLoadingOverlay(true) enquanto carrega minDate e (se sem conexão oficial) aguarda 3s
Overlay de loading global sobre toda a view
filter_only
Filter card visível, iframes carregando (src acabou de ser setado)
Filter card completo + iframes em branco (carregando Metabase)
iframes_loaded
Todos os iframes Metabase estão carregados com dados do intervalo atual
Filter card + iframes com dashboards Metabase exibidos (sem bordas, sem título)
filters_expanded
Ao menos 1 checkbox de filtro está ativo — card de slim lists aparece abaixo do filter card
Filter card + cards de slim lists (grid horizontal proporcional ao countFilter) + iframes
auto_sync_active
Atualização automática configurada (1/5/10 min)
Sem indicador visual — iframes são re-carregados silenciosamente no intervalo
button_cooldown
Após clicar Filtrar, botão fica disabled por 2 segundos (anti-spam)
Botão Filtrar em estado disabled
control_panel_date_limit
No control-panel, ao selecionar data inicial o campo final é limitado a +14 dias
flat-pickr final com maxDate restrito dinamicamente
flat-pickrv-selectvx-cardvx-tooltipfeather-iconvs-checkboxvs-buttonUserDepartmentsSlimListCustomerCategorySlimListInstancesSlimListUsersSlimListProductCategoriesSlimListCustomersSlimList
Vuesax componente padrão do Vuesax    Custom componente criado pelo Pedbot
sem_conexao_oficial
Se hasOfficial=false, beforeMount aguarda 3s antes de esconder loading (delay para estabilizar o estado da store)
Impacto: iframe-cloud não é exibido; loading inicial mais lento
features_desabilitadas
features.hasCampaigns=false → iframe-campaigns não aparece; features.hasMaria=false → maria-panel não renderiza iframe; features.hasOrders=false → order-panel sem iframe
Impacto: Número de iframes renderizados varia por tenant/feature flag
troca_de_rota
watch em $route.name → ao navegar entre analytics/control-panel/order-panel/maria-panel o componente reutiliza a mesma instância; clear() reseta todos os filtros e loadMetabase() recarrega com o dashboard correto
Impacto: Estado de filtros é limpo automaticamente ao mudar de painel
auto_sync_destruicao
beforeDestroy cancela clearInterval e reseta autoSync=false
Impacto: Auto-refresh para ao navegar para outra seção
data_minima
fetchMinDatetime() busca data mínima de dados disponíveis na API; configura minDate dos dois flat-pickr
Impacto: Usuário não pode selecionar período anterior à data mínima
control_panel_intervalo_maximo
Para dashboard-control-panel, intervalo máximo é 15 dias (14 * 24 * 60 * 60 * 1000 ms); calendarChange limita maxDate do flat-pickr final
Impacto: Usuário recebe range truncado automaticamente se tentar selecionar mais de 15 dias
filtro_sem_departamento
UserDepartmentsSlimList tem opção showWithout que seta departmentsSelected=[999999999] para filtrar contatos sem departamento
Impacto: Parâmetro department_ids na JWT payload = '999999999'
src/views/analytics/MetabaseAnalytics.vue main

View principal do dashboard — filtros de data + iframes Metabase assinados via JWT. Serve 4 rotas diferentes (analytics, control-panel, order-panel, maria-panel)

src/views/analytics/Analytics.vue secondary

View legada com charts nativos Vue/Apex (KPI cards + radialBar + pie charts + tabela de atendimentos). Não está mais referenciada no router — substituída pelo MetabaseAnalytics.vue

src/views/DashboardECommerce.vue template-demo

Demo do template Vuexy (não usado em produção — sem rota ativa). Contém dados mockados em inglês.

src/views/report/Report.vue report

Relatório legado de métricas de atendentes com exportação

mobileGrid de filtros passa para minmax(240px, 1fr); iframes com altura em vw aumentam drasticamente (dafault: 1890vw em <576px)
tabletGrid de filtros com minmax(280px, 1fr); iframes com altura intermediária
desktopGrid auto-fit completo com todos os painéis visíveis lado a lado

Criar component set para o FilterCard com variantes por tipo de painel (analytics, control-panel, order-panel, maria-panel). O conteúdo principal é um placeholder de iframe — não há UI real para prototipar além do filter bar. Focar na anatomia do FilterCard: 4 painéis em grid responsivo. Criar frame separado para o estado 'filtros expandidos' com as slim lists.

Navigation

16 componentes 11 estados 10 passos 7 edge cases

Shell de layout principal do Pedbot — sidebar vertical, navbar, breadcrumb, dropdowns de perfil/notificações/status e popup de transferência de atendimento.

sidebar-content
Sidebar fixa à esquerda (vs-sidebar) + content-area à direita. No mobile (<1200px), sidebar é drawer oculto acionado por hambúrguer.
sidebar
navbar
router-headerh2 com routeTitle + VxBreadcrumb — visível quando $route.meta.breadcrumb ou $route.meta.pageTitle, exceto na rota 'Atendimento'
content-arearouter-view com transition (routerTransition from themeConfig) + NotificationPopup + ContractPopup + UpdatePasswordPopup globais
back-to-topBotão flutuante bottom=5% right=30px, visível após scroll 500px. vs-button icon=icon-arrow-up shadow-lg.
footer
vuex: storevuex: moduleLayoutthemeConfigenvapiwebsocket
  1. 1. Usuário autenticado entra na aplicação → Main.vue renderiza
  2. 2. Sidebar (VerticalNavMenu) exibida à esquerda com logo + itens de menu
  3. 3. Usuário clica em item de menu → router-view renderiza a view correspondente
  4. 4. Header da página exibe routeTitle (h2) + breadcrumb (se $route.meta.breadcrumb)
  5. 5. Usuário pode colapsar a sidebar clicando em DiscIcon → modo reduzido (apenas ícones)
  6. 6. Mouse enter na sidebar reduzida → expande temporariamente
  7. 7. No rodapé da sidebar: ConnectedSwitch para marcar Online/Offline
  8. 8. NotificationDropDown → BellIcon com badge → dropdown com notificações
  9. 9. UserDropDown → avatar → Configurações ou Logout
  10. 10. Em mobile: hamburger (MenuIcon) → abre sidebar como drawer
sidebar_expanded_desktop
Layout padrão — sidebar aberta com ícones + labels
Sidebar ~260px com logo, textos visíveis, ProfileDropDown expandido
sidebar_reduced_desktop
Sidebar colapsada — apenas ícones
Sidebar ~50px, DiscIcon → CircleIcon; content-area-lg
sidebar_hover_expand
Mouse sobre sidebar reduzida — expande temporariamente
Logo e textos aparecem; ProfileDropDown com nome do usuário
mobile_drawer_closed
Mobile (<1200px) — sidebar oculta, TheNavbarVertical visível no topo
Top navbar com MenuIcon + mt-16 na content-area
mobile_drawer_open
Sidebar aberta como overlay no mobile
Drawer full-height sobrepõe content; XIcon para fechar
online
ConnectedSwitch ativo — usuário Online
SwitchPedBot/vs-switch em posição ON; label 'Online'
offline
ConnectedSwitch inativo — usuário Offline
Switch em posição OFF; label 'Offline'
ticket_transfer_pending
Popup de transferência ativo — outro usuário está transferindo atendimento
vs-popup sobreposto com countdown + ACEITAR/NEGAR
session_swap_active
Admin logado como outro usuário (!isOriginalUser)
BackOriginalUser visível no TheNavbarVertical (mobile)
two_factor_page
Rota two-factor — sidebar e navbar ocultos
Layout completamente sem nav; apenas conteúdo da rota
atendimento_route
Rota 'Atendimento' — sem header de rota, sem footer, sem padding
Content area edge-to-edge; sidebar mantida; back-to-top oculto
VerticalNavMenuHorizontalNavMenuNotificationPopupContractPopupUpdatePasswordPopupSwitchPedBotfeather-iconvue-countdownvue-backtotopVuePerfectScrollbarvs-sidebarvs-navbarvs-dropdown / vs-dropdown-menu / vs-dropdown-itemvs-chipvs-switchvs-popup
Vuesax componente padrão do Vuesax    Custom componente criado pelo Pedbot
two_factor_lockout
Se twoFactorActivated=true (2FA não validado na sessão): itens de menu ocultos (v-if !twoFactorActivated), UserDropDown sem opção Configurações
Impacto: Usuário vê sidebar vazia; só pode fazer logout ou completar 2FA
whitelabel_logo
Logo carregada de /{publicImagesPath}/{logoPng}?lastmod=timestamp — path por tenant. VUE_APP_DISABLE_LOGO_TITLE=true oculta o texto título.
Impacto: Logo e título podem variar por tenant/whitelabel
admin_only_devices
UserDevicesDropDown visível apenas para role.name === 'administrador'
Impacto: Atendentes sem role admin não veem o dropdown de dispositivos
status_change_cooldown
ConnectedSwitch isDisabled=true durante mudança de status + 3s cooldown após. Debounce 500ms para evitar spam.
Impacto: Toggle desabilitado temporariamente durante a requisição
ticket_transfer_autocomplete
Popup de transferência tem countdown (vue-countdown). Ao expirar, o atendimento é transferido automaticamente.
Impacto: Atendente deve responder antes do timer zerar
disable_pedbot_references
VUE_APP_DISABLE_PEDBOT_REFERENCES=true oculta ButtonFloating
Impacto: Para versões whitelabel sem referências Pedbot
inactivity_timeout_chat
Quando rota inclui 'chat-attendance': event listeners de keydown/click disparam resetInactivityTimer(). Ao sair da rota, listeners são removidos.
Impacto: InactivityOverlay (do Auth Flow) é controlado globalmente pelo Main.vue
src/layouts/main/Main.vue main-shell

Container raiz da aplicação autenticada. Orquestra sidebar, navbar, content area, popups globais e o router-view.

src/layouts/components/vertical-nav-menu/VerticalNavMenu.vue sidebar

Sidebar vertical com logo, itens de menu dinâmicos, grupos/submenus, tags e ProfileDropDown no rodapé. Suporte a reduce (ícones) e swipe mobile.

src/layouts/components/vertical-nav-menu/VerticalNavMenuItem.vue nav-item

Item de menu simples: ícone + label + tag opcional (vs-chip)

src/layouts/components/vertical-nav-menu/VerticalNavMenuGroup.vue nav-group

Grupo de menu com submenu colapsável (openHover)

src/layouts/components/navbar/TheNavbarVertical.vue navbar-mobile

Navbar topo para mobile (<1200px): MenuIcon (abre sidebar) + BackOriginalUser

src/layouts/components/navbar/TheNavbarHorizontal.vue navbar-horizontal

Navbar horizontal (mainLayoutType='horizontal', ≥1200px) — arquivo vazio na versão atual

src/layouts/components/navbar/components/ProfileDropDown.vue sidebar-footer

Rodapé da sidebar: avatar do usuário + nome + ConnectedSwitch + TrasferrerDropDown + NotificationDropDown + UserDevicesDropDown (admin only) + UserDropDown

src/layouts/components/navbar/components/UserDropDown.vue user-menu

Avatar circular que abre dropdown: Configurações (/user-settings) + Logout

src/layouts/components/navbar/components/ConnectedSwitch.vue status-toggle

Toggle Online/Offline (SwitchPedBot quando sidebar expandida, vs-switch quando minimal). Debounced 500ms. Cooldown 3s após mudança.

src/layouts/components/navbar/components/NotificationDropDown.vue notifications

BellIcon com badge de não lidas. Dropdown: header bg-primary + lista scrollável de notificações com título, texto, tempo. Empty state.

src/layouts/components/navbar/components/TrasferrerDropDown.vue transfer-menu

Dropdown de ações de transferência de atendimento

src/layouts/components/navbar/components/UserDevicesDropDown.vue devices-menu

Dropdown de dispositivos conectados — visível apenas para role 'administrador'

src/layouts/components/navbar/components/BackOriginalUser.vue session-swap-indicator

Botão para retornar ao usuário original após session swap. Visível apenas quando !isOriginalUser.

src/layouts/components/VxBreadcrumb.vue breadcrumb

Breadcrumb de navegação. Exibido na área de header da rota quando $route.meta.breadcrumb está definido.

src/layouts/components/TheFooter.vue footer

Rodapé da aplicação. Oculto na rota de Atendimento.

mobileTheNavbarVertical no topo (MenuIcon); sidebar como drawer; content-area com mt-16
tabletMesma lógica mobile se windowWidth < 1200
desktop_reducedSidebar em modo ícones (reduce=true); content-area-lg
desktop_expandedSidebar completa; content-area-reduced
desktop_fullSidebar oculta (verticalNavMenuWidth='full'); content-area-full

Criar 5 frames de layout: (1) Desktop sidebar expandida, (2) Desktop sidebar reduzida (ícones), (3) Mobile com drawer fechado (top navbar), (4) Mobile com drawer aberto (overlay), (5) Rota Atendimento (edge-to-edge). ProfileDropDown: criar component set com variante expandida (horizontal) e minimal (vertical stack). Ticket Transfer popup: criar overlay modal com countdown pill e dois botões. Usar Auto Layout na sidebar para acomodar ambos os estados collapsed/expanded.

Onboarding — Conexões

/instances/list
13 componentes 12 estados 14 passos 8 edge cases

Fluxo de criação e gestão de conexões (WhatsApp Web, WhatsApp Cloud, Instagram, Messenger). Inclui wizard de 5 etapas para nova conexão e lista de instâncias ativas.

grid-cards
Grid responsivo de cards de instância. Wizard de nova conexão em modal vs-popup sobreposto.
instances-gridGrid de CardInstance cards, uma por conexão ativa
wizard-modalvs-popup com step indicators + conteúdo dinâmico por etapa
vuex: instanceenv_vars
  1. 1. Usuário acessa /instances/list via menu lateral
  2. 2. Vê grid de CardInstance (instâncias ativas) ou tela vazia
  3. 3. Clica em 'Nova Conexão' → BuildInstance wizard abre em vs-popup
  4. 4. Step 0 (Configuração Inicial): tela informativa com requisitos (3 ícones + textos)
  5. 5. Step 1 (Conta do Facebook): dados de conta — formulário varia por plataforma
  6. 6. Step 2 (Dados Comerciais): dados comerciais + botão 'Cadastrar'
  7. 7. Step 3 (Autorizar): OAuth da plataforma
  8. - WhatsApp Cloud: botão 'Vincular' abre popup Dialog Partner → BusinessSelectionModal
  9. - Instagram/Messenger: MetaConnectButton (FB SDK OAuth) → BusinessSelectionModal
  10. 8. Step 4 (Finalização):
  11. - WhatsApp Cloud: tela de espera da equipe Pedbot ativar o chip
  12. - Instagram/Messenger: PageTokenSelectionModal abre para selecionar página
  13. 9. Ao concluir: redireciona para /instances/list/choose-instance
  14. 10. WhatsApp Web (non-official): fluxo separado via 'Conectar-se no Whatsapp' no CardInstance → GenerateQrCode popup
instances_empty
Nenhuma instância criada ainda
Grid vazio, botão de Nova Conexão em destaque
instances_populated
Grid com CardInstance cards
Cada card: ícone de plataforma + ícone MarIA (se ativa) + nome/apelido + status chip colorido + dropdown de ações
wizard_step_0
Configuração Inicial — tela informativa
Chip 'Configuração Inicial' ativo + lista de requisitos com feather icons
wizard_step_1
Conta do Facebook — dados de conta
Chip 'Conta do Facebook' ativo + formulário de dados
wizard_step_2
Dados Comerciais — cadastro
Chip 'Dados Comerciais' ativo + formulário + botão 'Cadastrar'
wizard_step_3
Autorizar — OAuth
Chip 'Autorizar o {AppTitle}' ativo + instruções em 3 bullet points + botão 'Vincular'/'Conectar'
wizard_step_4
Finalização — aguardando
Chip 'Finalização' ativo + mensagem de aguardo + CheckIcon
business_selection_loading
BusinessSelectionModal carregando contas Meta
vs-popup aberto + vs-loading spinner
business_selection_empty
BusinessSelectionModal sem contas encontradas
AlertCircleIcon + mensagem de aviso
business_selection_populated
BusinessSelectionModal com lista de contas
Lista de contas com vs-radio + botão Confirmar
page_token_selection
PageTokenSelectionModal para Instagram/Messenger
Lista de páginas (page_name + page_id + ig_username para instagram) com vs-radio + Confirmar/Cancelar
qr_code_flow
Fluxo WhatsApp Web via QR Code
GenerateQrCode popup com QR Code para escanear
vs-popupvs-chipvs-cardvs-dropdown / vs-dropdown-menu / vs-dropdown-item / vs-dropdown-groupvs-buttonvs-radiofeather-iconconnect-buttonMetaConnectButtonBusinessSelectionModalPageTokenSelectionModalCardInstanceGenerateQrCode
Vuesax componente padrão do Vuesax    Custom componente criado pelo Pedbot
whatsapp_web_separate_flow
Instâncias WhatsApp Web (non-official) não usam o wizard. Conexão via QR Code (GenerateQrCode popup) acionado pelo CardInstance dropdown.
Impacto: Dois fluxos de onboarding distintos na mesma view
meta_oauth_sdk_not_loaded
MetaConnectButton fica desabilitado até fbSdkLoaded=true. FB SDK carregado de forma assíncrona.
Impacto: Botão de conexão aparece mas não responde até SDK estar pronto
no_businesses_found
BusinessSelectionModal não encontra contas Meta
Impacto: AlertCircleIcon + texto de aviso, sem opção de continuar
no_pages_found_instagram
PageTokenSelectionModal sem páginas com Instagram vinculado
Impacto: Mensagem específica: 'Nenhuma página com Instagram vinculado foi encontrada'
instance_in_maintenance
CardInstance.checkInstanceInMaintenance() bloqueia ações do dropdown se instância em manutenção
Impacto: Dropdown de ações fica bloqueado
permissions_rbac
Dropdown do CardInstance tem itens protegidos por canSee(). Ex: instances-list-wpp-auth, instance-edit, chat-batch-finalize, chat-lgpd-febrafar
Impacto: Ações não disponíveis para perfis sem permissão
app_title_whitelabel
AuthorizeStage e CloudStage usam VUE_APP_APP_TITLE (fallback 'PedBot'). Step 3 do wizard diz 'Autorizar o {AppTitle}'.
Impacto: Título da plataforma varia por whitelabel
maria_icon_badge
CardInstance exibe ícone da MarIA (icon_pedbot_cinza_png) se instance.maria_enabled
Impacto: Identificação visual de instâncias com IA ativa
src/views/instances/InstancesList.vue main

Grid de cards de instâncias ativas + botão de nova conexão. Orquestra todos os popups do fluxo.

src/views/instances/BuildInstance.vue wizard

Wizard de 5 etapas em vs-popup para criação de nova instância. Renderização dinâmica de stage por plataforma.

src/views/instances/CardInstance.vue card

Card individual de instância: ícone de plataforma, nome/apelido, status chip, dropdown de ações.

mobileGrid de cards empilhado em coluna única. Wizard em popup full-screen.
tabletGrid de 2 colunas. Popup modal centered.
desktopGrid de 3+ colunas. Popup modal com tamanho fixo.

Criar dois frames principais: (1) InstancesList com grid de cards — variantes: empty state e populated com 1/2/3+ cards. CardInstance component set com variantes por plataforma (whatsapp-web, whatsapp-cloud, instagram, messenger) × com/sem MarIA badge × status (ativo, inativo, manutenção). (2) BuildInstance wizard modal — criar 5 frames (um por step) com step indicators em vs-chip. Para step 3: variante whatsapp (authorize-stage + connect-button) e variante meta (meta-authorize-stage + MetaConnectButton). Criar componentes separados: BusinessSelectionModal (3 estados: loading/empty/populated) e PageTokenSelectionModal (3 estados: loading/empty/populated, instagram mostra @username).

Orders / Checkout

12 componentes 8 estados 0 passos 8 edge cases

Fluxo completo de orçamentos e pedidos do Pedbot — lista de pedidos, lista de orçamentos, wizard multi-step de criação e resumo do pedido.

full-page-table
Páginas de lista ocupam toda a área de conteúdo com vs-table. Wizard de criação é um vs-popup fullscreen sobreposto.
api_restvuex: customerlocalStorageevent_busfeature_flags

Fluxo não documentado.

orders_list_empty
Nenhum pedido encontrado
vs-table com noDataText='Sem dados disponíveis'
orders_list_populated
Lista de pedidos carregada
Tabela com linhas flutuantes (border-radius, shadow), status coloridos, paginação
orders_list_erp
Feature ERP habilitada
3 colunas extras: Integrado com ERP, Numero Pedido ERP, Pagamento Efetuado
wizard_open
OrdersMain aberto em vs-popup
Popup sobrepõe a view; header com nome do step; conteúdo muda por step (transição slide)
wizard_draft_restored
Existe rascunho salvo para o chat_ticket_id atual
vs-alert primary no topo: 'Há um orçamento em andamento, continue aqui.'
wizard_edit_mode
Usuário clicou 'Editar' no OrderSummary — volta a um step anterior preservando fromStep
Step anterior exibido; ao confirmar retorna ao OrderSummary
wizard_minimized
Usuário clicou MinusIcon durante atendimento chat
Popup fecha; MinimizeOrdersButton draggable aparece sobre a interface do chat
wizard_close_confirm
Usuário clica X durante fluxo em andamento (step > 0 em chat, step > 1 em out-chat)
vs.dialog tipo confirm: 'Tem certeza que deseja fechar? O orçamento não salvo será perdido.'
OrdersTablePreOrdersTableMinimizeOrdersButtonBuyNowfeather-iconvx-tooltipvs-popupvs-tablevs-dropdown / vs-dropdown-menu / vs-dropdown-itemvs-chipvs-alertvs-icon
Vuesax componente padrão do Vuesax    Custom componente criado pelo Pedbot
feature_orders_desabilitada
hasFeature('orders') retorna false na montagem de ProductOrders.vue
Impacto: Redirect automático para /not-authorized
draft_persistence
Durante atendimento chat (origin='chat'), cada mudança de step salva o estado em localStorage via saveDraft(chatTicketId). Ao reabrir o wizard para o mesmo cliente, getDraft() restaura o estado.
Impacto: Usuário pode retomar orçamento interrompido sem perder dados
origin_chat_vs_out_chat
origin='chat': começa no step 1 (Orçamentos), tem MinusIcon, fecha com confirmação. origin='out-chat': começa no step 0 (Cliente), sem minimize, botão voltar não aparece no OrderSummary
Impacto: Fluxo e header do wizard diferem conforme origem
servicos_vs_produtos
preOrder pode ter products (produtos físicos) OU services (serviços). Navegação entre steps difere: steps de Quantidade e Desconto são para produtos; steps 6-7 (CustomerKnowledge, NotesAndFiles) são para serviços. Se não tem products, pula steps de produto.
Impacto: previousStep() tem lógica especial para não pular steps incorretamente
erp_integration
hasErpFeature=true (verificado via API em mounted): adiciona colunas ERP na tabela, adiciona coluna Pagamento Efetuado. Tooltip HelpCircleIcon explica o status de integração ERP por pedido.
Impacto: UI da tabela é significativamente diferente com/sem ERP
status_colorido_customizavel
Statuses de pedidos são configurados por tenant em /orders/status. Cada status tem name e color personalizado. O botão de status na tabela usa background-color inline com a cor do status atual.
Impacto: A paleta de cores da tabela varia totalmente por tenant
pre_order_turn_into_order
Na PreOrders.vue, o evento @turnIntoOrder da PreOrdersTable chama $refs.ordersMain.setPreOrder(value) e abre o wizard no step do OrderSummary
Impacto: Orçamento convertido diretamente em pedido sem refazer o fluxo completo
before_route_leave
beforeRouteLeave em ProductOrders.vue dispara $events.fire('closeAllPopUps') e aguarda 200ms antes de navegar. Em PreOrders.vue, fecha todos os popups e reseta openOrdersFlow=false antes de navegar.
Impacto: Garante que popups aninhados fechem corretamente ao navegar
src/views/orders/product-orders/ProductOrders.vue main-orders-list

Thin wrapper: monta OrdersTable completo. Redireciona para /not-authorized se feature 'orders' desabilitada.

src/views/orders/pre-orders/PreOrders.vue main-preorders-list

Lista de orçamentos (PreOrdersTable) + botão '+ Criar Orçamento' que abre OrdersMain com origin='out-chat'

src/layouts/components/orders/OrdersMain.vue wizard

Wizard multi-step em vs-popup com 13 steps (0-12). Compartilhado entre origem chat e standalone. Suporta draft persistence e minimize durante atendimento.

src/views/chat-attendance/orders/OrdersTable.vue orders-table

Tabela de pedidos com colunas Nº, Data Criação, Nome, Documento, Identificador, Usuário, Finalizado, colunas ERP condicionais, Status dropdown colorido

src/views/chat-attendance/orders/Orders.vue orders-popup-from-chat

vs-popup 1300px de largura com OrdersTable, aberto dentro do chat para visualizar pedidos de um contato

src/views/orders/product-orders/ProductOrdersChildrens.vue order-detail-expand

Linha expansível com imagens dos produtos do pedido (90x80px, border dotted, border-radius 14px)

src/views/orders/pre-orders/PreOrdersChildrens.vue preorder-items-table

Tabela de itens do orçamento: Imagem 50px, Nome, Preço com Desconto, Preço original, Quantidade (produtos) ou Categoria (serviços)

mobilevs-table perde visibilidade de colunas; wizard ocupa tela cheia no mobile
tabletTabela com scroll horizontal
desktopLayout completo: tabela 102% de largura, popup com width dinâmica por step

Criar 3 frames principais: (1) Lista de Pedidos com variantes 'sem ERP' e 'com ERP' — usar component set para a linha de status colorida. (2) Lista de Orçamentos com header '+ Criar Orçamento'. (3) Wizard OrdersMain como overlay popup — criar frame para cada step (13 frames) + variante 'com alerta de draft'. A largura do popup muda por step — definir uma largura padrão para os frames Figma e adicionar nota sobre variação dinâmica.

WhatsApp/Meta Templates

/meta/template-messages
19 componentes 10 estados 11 passos 8 edge cases

Gestao completa dos Modelos de Mensagem WhatsApp (Meta Template Messages). Inclui listagem com status de aprovacao, criacao via wizard 2 etapas, edicao inline, remocao, visualizacao de templates pendentes e atribuicao de permissoes. Integra com a API oficial da Meta para aprovacao de templates.

full-page-table + wizard + popups
Pagina principal: tabela full-width com header de acoes. Criacao: pagina separada com wizard centralizado em cards. Edicoes/remocao: popups modais sobre a tabela.
list-headerLinha superior da tabela: botao 'Adicionar Novo' (PlusIcon) + botao 'Sincronizar Modelos' (RefreshCcwIcon) a esquerda; dropdown de items-por-pagina a direita.
tablevs-table com busca integrada, paginacao e ordenacao por coluna (sort-key). Colunas: Nome, Status, Categoria, Acoes.
wizard-cardsWizard de criacao: cards centralizados (w-6/12) empilhados verticalmente, cada secao numa 'items-card'. Navegacao: botao Voltar/Proximo entre as etapas.
popups4 popups sobrepostos: Update (edicao completa), Remove (confirmacao), View (preview), UpdateRole (permissoes). Classe sizePopup no Update.
httpvuex: setShowLoadingOverlayacl
  1. 1. Admin acessa /meta/template-messages pelo menu Configuracoes → Templates
  2. 2. Ve tabela com todos os templates: nome, status (chip colorido), categoria
  3. 3. Clica 'Adicionar Novo' para criar. Navega para /meta/template-messages/add
  4. 4. Etapa 1 (Configuration): escolhe categoria (Utilidade/Marketing com custo), define nome, ativa modelo generico se for FB/Instagram
  5. 5. Clica 'Proximo' → Etapa 2 (Message): preenche cabecalho opcional, corpo (com variaveis {{1}}), rodape opcional, botoes opcionais
  6. 6. Pode ativar modo carrossel para multiplos cards (produto / midia + corpo + botoes)
  7. 7. Clica 'Criar' → API Meta recebe e coloca em status PENDING
  8. 8. De volta a lista: template aparece com chip PENDING + AlertTriangle + tooltip explicativo
  9. 9. Meta aprova em ate 24h → status muda para APPROVED (chip success)
  10. 10. Admin pode editar (EditIcon → UpdatePopup), remover (TrashIcon → RemovePopup) ou configurar permissoes (SettingsIcon → UpdateRolePopup)
  11. 11. Clicar EyeIcon em template PENDING abre ViewTemplatePopup com preview
list-empty
Tabela sem templates. vs-table exibe noDataText 'Sem dados disponiveis'.
Tabela com header de acoes mas sem linhas
list-populated
Tabela com templates. Chips coloridos de status. Acoes condicionais por permissao e status.
Linhas com nome truncado, chip de status, categoria, icones de acao
pending-template
Template com status PENDING. AlertTriangleIcon warning + vx-tooltip aparece na coluna Status.
Chip warning + icone triangulo com tooltip explicativo ao hover
wizard-step-1
Tela de criacao, etapa Configuration. Cards centralizados: Canais/Categoria/Nome/Clonagem.
Cards w-6/12 centralizados, radios de categoria com icone e custo
wizard-step-2-single
Tela de criacao, etapa Message, modo mensagem unica (useCarousel=false). Cabecalho+Corpo+Rodape+Botoes empilhados.
Cards verticais: Permissao (se admin) + Formato + Cabecalho + Corpo + Rodape + Botoes + Preview
wizard-step-2-carousel
Modo carrossel ativo. Secao de Carrossel aparece. Cabecalho/Rodape/Botoes principais ficam ocultos.
Card de carrossel com editor de 1 card (cabecalho tipo + upload + corpo + botoes draggable)
wizard-step-2-generic
Modelo generico ativo (Facebook/Instagram). Rodape e upload de midia ocultos. Corpo com limites diferentes.
Wizard sem rodape, sem upload de midia no cabecalho
wizard-error
Erro ao criar: vs-alert danger aparece com lista de criterios a corrigir (variaveis mal posicionadas, caracteres especiais).
Alert vermelho com lista de bullets debaixo do campo Corpo
update-popup-open
UpdatePopup aberto. Chips de blocos: clicaveis para ativar/desativar secoes. Corpo sempre ativo.
Popup com chips de blocos + conteudo do bloco ativo abaixo
sync-popup-open
Popup de sincronizacao de modelos entre conexoes. Instrucoes + botao Sincronizar (success).
Popup pequeno com texto explicativo e botao verde
SelectMessageTemplateCountMessageTemplateInteractiveMessagePopupUploadVxTooltipfeather-iconvs-tablevs-chipvs-popupvs-select / vs-select-itemvs-inputvs-switchvs-checkboxvs-radiovs-alertvs-buttonvs-dropdown / vs-dropdown-menu / vs-dropdown-itemv-select (vue-select)draggable (vue-draggable)
Vuesax componente padrão do Vuesax    Custom componente criado pelo Pedbot
nome-ja-existe
checkTemplateName() via API retorna count > 0. valid=false.
Impacto: Botao Proximo desabilitado. Atencao visual no campo nome.
token-invalido-meta
API retorna erro 401 (token Meta expirado/invalido).
Impacto: vs.notify danger 'Token invalido!'. Criacao interrompida.
criacao-em-lote
useModel=true + modelCloneCount > 1. addModels() cria N templates em batches de 5.
Impacto: vs.notify com contagem de sucesso/falha. Loading overlay ativo durante processo.
template-rejeitado
Meta rejeita o template (viola politicas WhatsApp).
Impacto: Chip danger 'Rejeitado'. EditIcon disponivel para correcao e reenvio.
template-aprovado-categoria-locked
Template APPROVED: campo categoria disabled no UpdatePopup.
Impacto: Admin nao pode mudar categoria de template aprovado.
modelo-generico-restricoes
useGenericTemplate=true: Marketing disabled, rodape oculto, upload de midia oculto, carrossel disabled.
Impacto: Wizard com menos secoes visiveis
sem-permissao-add
!canSee('add'). Botao 'Adicionar Novo' nao renderizado na lista.
Impacto: Admin restrito nao pode criar templates
variavel-mal-posicionada
Variavel {{N}} no inicio/fim do texto ou apos caractere especial.
Impacto: vs-alert danger com explicacao + link para diretrizes da Meta
src/views/meta-template-messages/List.vue main

Tabela principal com todos os templates. Header com botoes Adicionar e Sincronizar. Colunas: Nome, Status (chip colorido), Categoria, Acoes (editar/deletar/visualizar/configurar). Gerencia abertura dos 4 popups de acao.

src/views/meta-template-messages/Add.vue wizard-orchestrator

Wizard de 2 etapas para criacao de template. Gerencia o objeto metaTemplateMessages e a navegacao entre paginas (page=0 → Configuration, page=1 → Message). Suporta criacao em lote (addModels) com batchSize=5.

src/views/meta-template-messages/Components/Wizard/Configuration.vue wizard-step-1

Etapa 1: configuracoes basicas. Secoes: Canais e Modelo Generico (toggle + checkboxes Facebook/Instagram), Categoria (radios: Utilidade/Marketing — com custo unitario por plano), Nome do template (vs-input com validacao de unicidade), Clonagem de modelos (switch useModel + numero de copias).

src/views/meta-template-messages/Components/Wizard/Message.vue wizard-step-2

Etapa 2: conteudo do template. Secoes: Permissao (vs-select de roles — condicional), Formato (toggle carrossel), Cabecalho (opcional: TEXT/IMAGE/VIDEO/DOCUMENT), Corpo (textarea + formatacao + variaveis), Carrossel (cards), Rodape (opcional), Botoes (QUICK_REPLY ou CTA_URL via draggable), Preview da mensagem, Botao Criar.

src/views/meta-template-messages/Components/ButtonItem.vue button-editor

Editor de item de botao no wizard. Usado dentro do draggable. Props: index, item, componentName, lengthMax, buttonType. Suporta QUICK_REPLY e CTA_URL.

src/views/meta-template-messages/UpdatePopup.vue edit-popup

vs-popup 'Editar Modelo'. Mostra nome (disabled) + categoria (disabled se APPROVED) + chips de blocos toggle: Cabecalho/Corpo/Rodape/Botoes/Carrossel (primario quando ativo). Permite editar o conteudo de cada bloco ativado. Suporta modo carrossel.

src/views/meta-template-messages/RemovePopup.vue delete-popup

vs-popup de confirmacao de exclusao de template. Simples: nome do template + botao confirmar danger.

src/views/meta-template-messages/ViewTemplatePopup.vue preview-popup

vs-popup de visualizacao de template com status PENDING. Exibe o conteudo do template para revisao enquanto aguarda aprovacao da Meta.

src/views/meta-template-messages/UpdateRolePopup.vue permissions-popup

vs-popup para atribuir permissoes (roles) ao template. Define quais perfis de usuario podem usar o template no chat. Campo vazio = disponivel para todos.

mobileUpdatePopup: vs-col xs=12 (campos empilham verticalmente). Tabela: scroll horizontal.
tabletUpdatePopup: vs-col sm=6 (2 colunas). Wizard cards w-6/12 responsivo.
desktopLayout completo. Wizard centralizado w-6/12. Tabela full-width.

Documentar 3 fluxos separados: (1) List: tabela com header de acoes, chips de status coloridos (success/warning/danger/grey), icones de acao condicionais. (2) Wizard: 2 frames (Configuration + Message) com cards centralizados. Cada secao e uma 'items-card' com titulo e subtitulo. Frame de erro (alert danger vermelho). (3) Popups: Update (chips de blocos ativos/inativos), Remove (confirmacao simples), View (preview), Sync (popup simples). Cores dos status: APPROVED=success (#28C76F), PENDING=warning (#FF9F43), REJECTED=danger (#EA5455). Botoes de formatacao no corpo: border primary com icone material. Carrossel: card com borda rgba(0,0,0,0.2), border-radius 10px.