fix(journey): gatilho por evento sem ids obrigatórios e filtros usáveis (CRM-519) - #371
Merged
gomessguii merged 3 commits intoSep 6, 2026
Merged
Conversation
There was a problem hiding this comment.
Sorry @nickoliveira23, you've used your own review budget of 250,000 diff characters for the last 7 days.
You can request another review in 3 days by commenting @sourcery-ai review. Upgrade to get a review now.
Reviewer's GuideReplaces unusable required event-trigger inputs with optional, localized equality filters, adds CRM-backed and enum selects with channel-aware behavior, improves event switching and save validation, and strengthens regression and i18n contract coverage without changing the persisted evo-flow contract. Sequence diagram for switching event filters with UndosequenceDiagram
participant User
participant EventBasicConfig
participant EventPropertiesForm
participant JourneyTriggerPanel
User->>EventBasicConfig: Select new event
EventBasicConfig->>EventPropertiesForm: preserveCompatibleValues
EventPropertiesForm-->>EventBasicConfig: Compatible filters
EventBasicConfig->>EventBasicConfig: onEventPropertiesChange
EventBasicConfig-->>User: Show dropped-filter status and Undo
alt User selects Undo
User->>EventBasicConfig: handleUndoSwitch
EventBasicConfig->>EventBasicConfig: onEventNameChange
EventBasicConfig->>EventBasicConfig: onEventPropertiesChange
EventBasicConfig-->>User: Restore prior event and filters
else User edits a filter
User->>EventBasicConfig: Edit filter
EventBasicConfig->>EventBasicConfig: Clear dropped-filter status
end
Flow diagram for configuring an event trigger with optional filtersflowchart TD
A[Choose event] --> B{Canonical or custom?}
B -->|Canonical| C[Show localized event description]
C --> D[Add optional equality filter]
D --> E{Filter type}
E -->|CRM id| F[Load options from CRM service]
E -->|Closed set| G[Show enum Select]
E -->|Other supported field| H[Show value input]
F --> I[Persist path and Equals value]
G --> I
H --> I
C --> J[Save with no filters]
B -->|Custom| K[Enter custom event name]
K --> L{Name present?}
L -->|Yes| M[Enable Save]
L -->|No| N[Keep Save disabled]
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
nickoliveira23
force-pushed
the
fix/CRM-519-gatilho-evento-sem-ids-obrigatorios
branch
from
September 5, 2026 13:38
3c0adc0 to
8fe4646
Compare
…is (CRM-519) O formulário do gatilho lia `schema.required` do catálogo como "o usuário precisa preencher" e pedia purchase_id, conversation_id, message_id com asterisco. No catálogo, required significa "o produtor sempre envia"; no evo-flow, as propriedades do gatilho são um filtro opcional por igualdade. - Todo campo do schema é filtro opcional atrás de "+ Adicionar filtro", com remoção por linha. Ids de identidade, chaves internas, timestamps e objetos não são oferecidos; linha legada persistida continua visível e removível. - Ids do CRM viram select (funil, etapa dependente do funil, canal, etiqueta, agente, campanha, template). Conjuntos fechados viram select via `options` no FieldSpec, com os valores que o CRM emite (Channel::*, incoming/outgoing, sent/delivered/read/failed...). - Canal e tipo de canal são um filtro só: a lista de canais segue o tipo escolhido, o tipo some quando há canal, par legado contraditório ganha aviso inline. - Rótulo, ajuda e descrição de evento em pt, pt-BR, en, es, fr e it; sem fallback para o texto em inglês do catálogo. - Troca de evento sem diálogo: mantém os filtros compatíveis, avisa quantos saíram e oferece Desfazer. - Salvar desabilitado sem evento ou com personalizado sem nome, com a mensagem sob o campo. `validateEventProperties` removida. - Modal: sem separador colado no título, "Como a jornada começa", descrição como texto simples, um aviso e um título no modo personalizado, roda do mouse nos dropdowns (Popover modal). - Spec de contrato do filtro (rótulo e ajuda em todo locale, select para uuid e conjunto fechado, nada de date/object) na lane do Vitest. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JxYjUwr2vV69kYddiXJHRo
…ados e acabamento do review (CRM-519) Rodada 2 do review. A branch foi rebaseada no develop, que trouxe o purchase.approved (PR #369) depois de a rodada 1 nascer: - events.purchase_approved.description nos 6 locales e `options` em `outcome` (created | already_in_pipeline) com rótulos, para a guarda de contrato ficar verde com o catálogo atual. - Specs cobrindo purchase.approved: ids da compra e do card fora do picker, product em texto livre e amount numérico, outcome como select. - Lookups pedem o mesmo tamanho de página que os filtros do CRM já usam (etiquetas e canais 200, agentes 100, templates -1); o index de canais pagina, então InboxesService.list ganha o parâmetro opcional. - Comentários que o diff anterior tornou falsos corrigidos (diálogo de troca de evento e campos obrigatórios não existem mais); justificativa verdadeira no eslint-disable; fragmento vazio removido; ajuda do tipo de canal e rótulo de "Atribuído por" condizentes com selects. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JxYjUwr2vV69kYddiXJHRo
… fixes (CRM-519) Round 2 review findings. - provider is a closed set of four adapters (virtu, hotmart, kiwify, cakto, registered in config/initializers/purchase_adapters.rb) and was the last offered key still rendering as free text. It gets `options` plus labels in the six locales, and its help stops reading as a "type it like this" hint now that it is a select. - The contract guard only read a closed set off a `|` in the description, which is why provider slipped through: it now also reads a parenthesised comma list of three or more bare tokens. - The campaign lookup still asked for the default page (25 in evo-flow), the one paginated endpoint the previous round left out. - The page sizes had no guard at all; EventPropertiesForm.spec pins what each lookup sends, including the pipeline endpoints that take nothing. - Event-config validity moves from `dirty` to `saveDisabled`, the NodeConfigModal prop documented for it. Same rendered state. - Comments: the flag in JourneyTriggerPanel no longer reports "required-field validity" (nothing is required), and EventBasicConfig is no longer an "extracted verbatim" copy of EventConfiguration. - CI lane takes EventBasicConfig.spec (switch notice and Undo) and journey-parity.spec, the only guard for the six-locale event-switch keys since i18n-parity skips journey.json.
gomessguii
force-pushed
the
fix/CRM-519-gatilho-evento-sem-ids-obrigatorios
branch
from
September 6, 2026 14:54
2d65f54 to
f495054
Compare
gomessguii
approved these changes
Sep 6, 2026
gomessguii
deleted the
fix/CRM-519-gatilho-evento-sem-ids-obrigatorios
branch
September 6, 2026 15:00
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
requireddo catálogo como inputs obrigatórios do usuário (asterisco empurchase_id,conversation_id,message_id). No catálogo,requiredé "o produtor sempre envia"; no evo-flow, as propriedades do gatilho são um filtro opcional por igualdade. O gatilho era inutilizável pela tela.source, dumps), nomes que duplicam um id e camposdate/objectnão são oferecidos. Linha legada persistida continua visível e removível.Selectalimentado pelos services (funil, etapa dependente do funil, canal, etiqueta, agente, campanha, template). Conjuntos fechados viramSelectviaoptionsnoFieldSpec, com os valores que o CRM emite de fato (Channel::*,incoming/outgoing,sent/delivered/read/failed,contact_type,created_via,content_type).modaldentro do Dialog).Security
{path, operator: {type: 'Equals', value}}é a mesma).Test plan
npx vitest run src/components/journey/nodes/trigger src/components/journey/shared src/lib/events-manifest src/i18n src/services/channels(488 passed, na branch rebaseada nodevelopatual)npx tsc --noEmiteeslintnos arquivos tocados (limpos);vite builddo shell OKcreated_at/customAttributes/id, com E-mail, Telefone e Tipo de contato; troca de evento com filtro incompatível mostra "1 filtro removido…" com Desfazer; personalizado sem nome não salva e diz o motivo; roda do mouse rola os dropdowns.Rodada 2 (review de 04/09)
develop: só otest.ymlconflitou (lanes de lista fechada), mantidos os dois lados.purchase.approvedentrou nodeveloppela PR feat(frontend): evento Compra aprovada no manifesto de eventos (CRM-316) #369 depois desta branch: descrição do evento nos 6 locales,outcomecomoptions(created|already_in_pipeline) e rótulos, e 3 specs cobrindo o evento (ids escondidos,producttexto livre eamountnumérico,outcomeselect).InboxesService.listganhou o parâmetro opcional; os outros chamadores seguem sem argumento.productfica em texto livre. Nopurchase.approvedele é a string do produto que a plataforma de pagamento envia (virtu, hotmart, kiwify, cakto), não umProductdo CRM; um dropdown de produtos do CRM geraria filtro que nunca casa.eslint-disable, fragmento vazio removido, ajuda do tipo de canal e rótulo "Atribuído por" condizentes com selects.Fora do escopo
EventAdvancedConfig+VariableMapping): não foi tocada; estouro horizontal, caixa fixa e copy ficam para cards próprios.activity_type,changeType,resolved_by_type,reason.Changed Files
src/components/journey/shared/EventPropertiesForm/{EventPropertiesForm.tsx,filterFields.ts,filterFields.spec.ts,EventPropertiesForm.spec.tsx,EventPropertiesForm.stories.tsx}src/components/journey/shared/EventSelector/EventSelector.tsxsrc/components/journey/nodes/trigger/{JourneyTriggerPanel.tsx,JourneyTriggerPanel.spec.tsx}src/components/journey/nodes/trigger/components/{EventBasicConfig.tsx,EventBasicConfig.spec.tsx,EventConfiguration.tsx,EventConfiguration.spec.tsx,EventConfiguration.both-contexts.spec.tsx,TriggerDescription.tsx}src/lib/events-manifest/{catalog.ts,types.ts,index.ts,event-properties-bridge.ts,event-properties-bridge.spec.ts}src/services/channels/inboxesService.tssrc/i18n/locales/{pt,pt-BR,en,es,fr,it}/{events.json,journey.json},src/i18n/locales/_lib/allowlist.ts,src/i18n/locales/journey-parity.spec.ts.github/workflows/test.ymlLinked Issue
🤖 Generated with Claude Code
https://claude.ai/code/session_01JxYjUwr2vV69kYddiXJHRo
Summary by Sourcery
Make journey event triggers usable with optional, localized, and CRM-aware filters while preserving compatibility with existing saved configurations.
New Features:
Bug Fixes:
Enhancements:
CI:
Documentation:
Tests:
Chores: