# Quick-Create Overlay Blueprint > **Status:** Pattern **universal**. Promovido de agenda-only em 2026-05-20 após audit baseline (`development/02-auditoria/AUDIT_BASELINE.md`) identificar 3 candidates já em produção fora da agenda. > **Stack:** Vue 3 + PrimeVue Dialog > **Canônicos:** > - `src/features/agenda/components/ServiceQuickCreateDialog.vue` (referência completa) > - `src/features/agenda/components/InsurancePlanQuickCreateDialog.vue` > - `src/features/agenda/components/InsurancePlanServiceQuickCreateDialog.vue` > **Legacy a refatorar (supabase direto, sem repository):** > - `src/components/CadastroRapidoMedico.vue` → migrar pra `features/medicos/components/` (módulo 1 da Fase 1) > - `src/components/CadastroRapidoConvenio.vue` → migrar pra `features/insurance/components/` > - `src/components/ComponentCadastroRapido.vue` → migrar pra path apropriado conforme dono da entidade --- ## 1. Princípio **Problema:** usuário está num fluxo (ex: agendar uma sessão) e precisa de uma entidade dependente que ainda não existe (serviço, convênio, plano). Navegar pra outra página significa **perder o contexto** do form em progresso. **Solução:** mini-dialog **por cima** do dialog/fluxo atual, com **campos mínimos** pra criar a entidade, e ao salvar **pré-seleciona** ela no select que disparou o quick-create. **Regra absoluta:** criar dependência faltante em **qualquer fluxo** deve **abrir overlay POR CIMA, nunca navegar pra fora**. Aplicável em todo o sistema desde a promoção do blueprint (2026-05-20). Origem do pattern: agenda (memória `feedback_agenda_inline_quick_create`, agora generalizada). --- ## 2. Quando aplicar (vs alternativas) | Situação | Solução | |---|---| | Fluxo crítico travado por dependência faltante (form em progresso) | **Quick-create overlay** ✅ | | Cadastro completo, com todos os campos | Página dedicada `/entity/new` ou Dialog full | | Apenas selecionar item existente | Select com busca; sem botão "+" | | Onboarding ou setup wizard | Não — fluxo é a página inteira, não um overlay | **Anti-uso:** quick-create NÃO é "shortcut pra criar do menu lateral". É **fallback contextual** quando o form atual depende de algo que falta. O parent **precisa estar pronto pra receber o evento `created`** e usar o ID. --- ## 3. Estrutura do componente `QuickCreateDialog.vue` ```vue ``` --- ## 4. Contrato canônico de props/emits ### Props (sempre) | Prop | Tipo | Default | Função | |---|---|---|---| | `modelValue` | `Boolean` | `false` | Visibilidade do dialog. Two-way via `v-model`. | | `ownerId` | `String` | `''` | Owner_id (terapeuta). Default: usuário logado. | | `initialName` | `String` | `''` | Pré-preenche o campo nome com o search atual do select (UX win). | ### Props (opcionais por entidade) - `parentId` (`String`) — quando a entidade tem hierarquia (ex: `plan_id` em `plan_service`) - `defaultDurationMin` (`Number`) — quando faz sentido herdar valor do contexto - Outras herdadas do contexto, **nunca** mais que 3 props extras (senão vira form pesado, não quick-create) ### Emits | Evento | Payload | Quando | |---|---|---| | `update:modelValue` | `Boolean` | `v-model` two-way | | `created` | `Object` (row inserida completa) | Após insert bem-sucedido | **Nunca emitir** `cancelled`, `closed`, `error` — parent não precisa saber dessas distinções; `update:modelValue=false` cobre. --- ## 5. Integração no parent ### Slot do botão `+` ao lado do select ```vue