Vystup z vetve plati i za podminkou, samostatny krok Zalozit kontakt

Bezny postup nesel poskladat z kroku: najdi podle ICO, kdyz neni zkus mail,
kdyz porad neni zaloz - ID dava jednou jedna vetev a jednou druha, ale
rozsah vystupy z vetvi za podminku nepoustel. Slucovat kvuli tomu hledani
a zakladani do jednoho kroku bylo obejiti nasi chyby, ne reseni.

- Vystup z vetve je za podminkou k dispozici, jen jako nepovinny. Ze muze
  chybet, se neztratilo: builder to u pole ukaze a pri behu se dosadi
  prazdno.
- Vystup se stejnym jmenem uz z nabidky nemaze ten starsi. Po druhem
  hledani kontaktu zmizelo ID z prvniho, tedy to, co je v tu chvili
  potreba. Odkaz se jmenem kroku je jednoznacny.
- Duplicitni jmena u vystupu kroku uz nejsou nedodelek. Konflikt zustava
  mezi parametry spoustece, kde zadny prefix neni.
- Novy krok Zalozit kontakt. Nic nedohledava, hledani je vlastni krok.
  Najit nebo zalozit zustava pro toho, komu staci jistota jednim krokem.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
JiriUhlir
2026-08-20 09:01:57 +02:00
co-authored by Claude Opus 5
parent c62902bfb6
commit 6297bbf480
6 changed files with 249 additions and 41 deletions
+23 -15
View File
@@ -165,42 +165,50 @@ export function collectScopes(
}));
};
const walk = (steps: FlowStep[], inherited: TriggerField[]) => {
/**
* Projde sekvenci a vrati pole, ktera v ni vznikla.
* Musi sedet se serverem, viz src/data/flowScope.ts.
*/
const walk = (steps: FlowStep[], inherited: TriggerField[]): TriggerField[] => {
let available = inherited;
const produced: TriggerField[] = [];
const add = (outputs: TriggerField[]) => {
if (outputs.length === 0) return;
// Nic se neodebira: odkaz se jmenem kroku je jednoznacny a starsi vystup
// muze byt prave ten, ktery clovek potrebuje. Viz src/data/flowScope.ts.
available = [...available, ...outputs];
produced.push(...outputs);
};
for (const step of steps) {
byStep.set(step.id, available);
if (step.kind === 'condition') {
walk(step.yes, available);
walk(step.no, available);
const fromYes = walk(step.yes, available);
const fromNo = walk(step.no, available);
// Za podminkou plati obojí, ale jako nepovinne - probehla jen jedna vetev.
add([...fromYes, ...fromNo].map((field) => ({ ...field, required: false })));
continue;
}
if (step.kind === 'foreach') {
// Musi sedet se serverem, viz src/data/flowScope.ts.
walk(step.steps, [
...available,
{ id: `${step.id}.item`, name: 'item', type: 'object', required: true },
{ id: `${step.id}.index`, name: 'index', type: 'number', required: true },
]);
available = [
...available,
add([
{ id: `${step.id}.results`, name: `${step.id}.results`, type: 'list', required: true },
{ id: `${step.id}.count`, name: `${step.id}.count`, type: 'number', required: true },
];
]);
continue;
}
const outputs = outputsOf(step);
if (outputs.length > 0) {
// Novejsi vystup prekryje starsi se stejnym jmenem, stejne jako to
// dela runtime pri dosazovani do sablon. Musi to sedet se serverem,
// viz src/data/flowScope.ts.
const names = new Set(outputs.map((output) => output.name));
available = [...available.filter((field) => !names.has(field.name)), ...outputs];
}
add(outputsOf(step));
}
return produced;
};
walk(flow.steps, triggerFields);