@esfaenza/flow-builder 20.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +354 -0
- package/fesm2022/esfaenza-flow-builder.mjs +7270 -0
- package/fesm2022/esfaenza-flow-builder.mjs.map +1 -0
- package/index.d.ts +2666 -0
- package/package.json +26 -0
- package/styles/flow-builder.css +483 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"esfaenza-flow-builder.mjs","sources":["../../../projects/flow-builder/src/lib/model/flow.model.ts","../../../projects/flow-builder/src/lib/model/dictionary.model.ts","../../../projects/flow-builder/src/lib/model/api.model.ts","../../../projects/flow-builder/src/lib/model/error.model.ts","../../../projects/flow-builder/src/lib/api/flow-builder-api.ts","../../../projects/flow-builder/src/lib/api/http-flow-builder-api.ts","../../../projects/flow-builder/src/lib/core/element-outlets.ts","../../../projects/flow-builder/src/lib/core/element-icons.ts","../../../projects/flow-builder/src/lib/core/flow-name.util.ts","../../../projects/flow-builder/src/lib/core/condition-logic.util.ts","../../../projects/flow-builder/src/lib/core/flow-document.store.ts","../../../projects/flow-builder/src/lib/core/flow-dictionary.store.ts","../../../projects/flow-builder/src/lib/core/flow-validation.store.ts","../../../projects/flow-builder/src/lib/core/flow-layout.service.ts","../../../projects/flow-builder/src/lib/core/flow-editor-session.ts","../../../projects/flow-builder/src/lib/ui/canvas/flow-canvas.model.ts","../../../projects/flow-builder/src/lib/ui/canvas/flow-canvas.component.ts","../../../projects/flow-builder/src/lib/ui/canvas/flow-canvas.component.html","../../../projects/flow-builder/src/lib/ui/palette/element-palette.component.ts","../../../projects/flow-builder/src/lib/ui/palette/element-palette.component.html","../../../projects/flow-builder/src/lib/ui/shared/reference-picker.component.ts","../../../projects/flow-builder/src/lib/ui/shared/reference-picker.component.html","../../../projects/flow-builder/src/lib/ui/shared/select-value.directive.ts","../../../projects/flow-builder/src/lib/ui/shared/value-editor.component.ts","../../../projects/flow-builder/src/lib/ui/shared/value-editor.component.html","../../../projects/flow-builder/src/lib/ui/shared/condition-editor.component.ts","../../../projects/flow-builder/src/lib/ui/shared/condition-editor.component.html","../../../projects/flow-builder/src/lib/ui/shared/record-filter-editor.component.ts","../../../projects/flow-builder/src/lib/ui/shared/record-filter-editor.component.html","../../../projects/flow-builder/src/lib/ui/shared/parameter-editor.component.ts","../../../projects/flow-builder/src/lib/ui/shared/parameter-editor.component.html","../../../projects/flow-builder/src/lib/ui/shared/field-assignment-editor.component.ts","../../../projects/flow-builder/src/lib/ui/shared/field-assignment-editor.component.html","../../../projects/flow-builder/src/lib/ui/shared/connector-editor.component.ts","../../../projects/flow-builder/src/lib/ui/shared/connector-editor.component.html","../../../projects/flow-builder/src/lib/ui/inspector/node-inspector-base.ts","../../../projects/flow-builder/src/lib/ui/inspector/action-call-inspector.component.ts","../../../projects/flow-builder/src/lib/ui/inspector/action-call-inspector.component.html","../../../projects/flow-builder/src/lib/ui/inspector/assignment-inspector.component.ts","../../../projects/flow-builder/src/lib/ui/inspector/assignment-inspector.component.html","../../../projects/flow-builder/src/lib/ui/inspector/collection-processor-inspector.component.ts","../../../projects/flow-builder/src/lib/ui/inspector/collection-processor-inspector.component.html","../../../projects/flow-builder/src/lib/ui/inspector/custom-error-inspector.component.ts","../../../projects/flow-builder/src/lib/ui/inspector/custom-error-inspector.component.html","../../../projects/flow-builder/src/lib/ui/inspector/decision-inspector.component.ts","../../../projects/flow-builder/src/lib/ui/inspector/decision-inspector.component.html","../../../projects/flow-builder/src/lib/ui/inspector/loop-inspector.component.ts","../../../projects/flow-builder/src/lib/ui/inspector/loop-inspector.component.html","../../../projects/flow-builder/src/lib/ui/inspector/record-lookup-inspector.component.ts","../../../projects/flow-builder/src/lib/ui/inspector/record-lookup-inspector.component.html","../../../projects/flow-builder/src/lib/ui/inspector/record-rollback-inspector.component.ts","../../../projects/flow-builder/src/lib/ui/inspector/record-rollback-inspector.component.html","../../../projects/flow-builder/src/lib/ui/inspector/record-write-inspector.component.ts","../../../projects/flow-builder/src/lib/ui/inspector/record-write-inspector.component.html","../../../projects/flow-builder/src/lib/ui/inspector/screen-inspector.component.ts","../../../projects/flow-builder/src/lib/ui/inspector/screen-inspector.component.html","../../../projects/flow-builder/src/lib/ui/inspector/script-call-inspector.component.ts","../../../projects/flow-builder/src/lib/ui/inspector/script-call-inspector.component.html","../../../projects/flow-builder/src/lib/ui/inspector/start-inspector.component.ts","../../../projects/flow-builder/src/lib/ui/inspector/start-inspector.component.html","../../../projects/flow-builder/src/lib/ui/inspector/subflow-inspector.component.ts","../../../projects/flow-builder/src/lib/ui/inspector/subflow-inspector.component.html","../../../projects/flow-builder/src/lib/ui/inspector/transform-inspector.component.ts","../../../projects/flow-builder/src/lib/ui/inspector/transform-inspector.component.html","../../../projects/flow-builder/src/lib/ui/inspector/wait-inspector.component.ts","../../../projects/flow-builder/src/lib/ui/inspector/wait-inspector.component.html","../../../projects/flow-builder/src/lib/ui/inspector/element-inspector.component.ts","../../../projects/flow-builder/src/lib/ui/inspector/element-inspector.component.html","../../../projects/flow-builder/src/lib/ui/inspector/element-dialog.component.ts","../../../projects/flow-builder/src/lib/ui/inspector/element-dialog.component.html","../../../projects/flow-builder/src/lib/ui/resources/resource-panel.component.ts","../../../projects/flow-builder/src/lib/ui/resources/resource-panel.component.html","../../../projects/flow-builder/src/lib/ui/problems/problems-panel.component.ts","../../../projects/flow-builder/src/lib/ui/problems/problems-panel.component.html","../../../projects/flow-builder/src/lib/ui/versions/version-panel.component.ts","../../../projects/flow-builder/src/lib/ui/versions/version-panel.component.html","../../../projects/flow-builder/src/lib/ui/debug/debug-panel.component.ts","../../../projects/flow-builder/src/lib/ui/debug/debug-panel.component.html","../../../projects/flow-builder/src/lib/ui/flow-builder.component.ts","../../../projects/flow-builder/src/lib/ui/flow-builder.component.html","../../../projects/flow-builder/src/esfaenza-flow-builder.ts"],"sourcesContent":["/**\n * Modello del documento Flow — FRONTEND.md §3, §4, §5.\n *\n * Regole del contratto rispettate qui:\n * - camelCase su ogni proprieta';\n * - ogni campo e' opzionale (una definizione incompleta e' salvabile);\n * - nessun `$type`: il tipo di un node e' la collection in cui sta (§3.1);\n * - gli enum sono stringhe, ma i tipi sono aperti (`| string`) perche' gli elenchi\n * autoritativi arrivano da `GET /flows/dictionaries` e possono crescere (§13.11).\n */\n\n/** §4.2 — i sette tipi del sistema. Aperto: il dizionario `dataTypes` e' autoritativo. */\nexport type FlowDataType = 'String' | 'Integer' | 'Number' | 'Date' | 'Boolean' | 'Enum' | 'Object' | string;\n\nexport type FlowProcessType = 'Screen' | 'AutoLaunched' | 'Evaluation' | 'Orchestration' | string;\n\nexport type FlowVersionStatus = 'Draft' | 'InvalidDraft' | 'UnderReview' | 'Active' | 'Obsolete' | string;\n\nexport type FlowTriggerType =\n | 'None'\n | 'RecordBeforeSave'\n | 'RecordAfterSave'\n | 'RecordBeforeDelete'\n | 'Scheduled'\n | 'Event'\n | string;\n\nexport type FlowRecordTriggerType = 'Create' | 'Update' | 'CreateAndUpdate' | 'Delete' | string;\n\nexport type FlowSortOrder = 'Asc' | 'Desc' | string;\n\nexport type FlowOffsetUnit = 'Minutes' | 'Hours' | 'Days' | 'Months' | string;\n\nexport type FlowCollectionProcessorType = 'Sort' | 'Filter' | string;\n\nexport type FlowTransformType = 'Map' | 'Sum' | 'Count' | string;\n\nexport type FlowTransactionModel = 'Automatic' | 'CurrentTransaction' | 'NewTransaction' | string;\n\n/**\n * §4.2 — un riferimento **oppure** un valore letterale.\n * Va valorizzato **uno e un solo** campo; `formulaExpression` e' l'unica eccezione\n * (espressione + tipo atteso). Piu' campi insieme = `VALUE_AMBIGUOUS`.\n */\nexport interface FlowValue {\n elementReference?: string;\n stringValue?: string;\n integerValue?: number;\n numberValue?: number;\n /** Formato roundtrip senza fuso: `2026-08-15T00:00:00` (§2, §4.2). */\n dateValue?: string;\n booleanValue?: boolean;\n enumValue?: string;\n formulaExpression?: string;\n formulaDataType?: FlowDataType;\n}\n\n/** §3.5 — un connector e' sempre la stessa forma; cambia solo il campo in cui vive. */\nexport interface FlowConnector {\n targetReference?: string;\n /** Solo suggerimento di disegno: la semantica di esecuzione e' identica (§3.5). */\n isGoTo?: boolean;\n}\n\n/** §4.3 — condizione su risorse. Per gli operatori unari `rightValue` e' l'esito atteso. */\nexport interface FlowCondition {\n leftValueReference?: string;\n operator?: FlowComparisonOperator;\n rightValue?: FlowValue;\n}\n\nexport type FlowComparisonOperator =\n | 'EqualTo'\n | 'NotEqualTo'\n | 'GreaterThan'\n | 'GreaterThanOrEqualTo'\n | 'LessThan'\n | 'LessThanOrEqualTo'\n | 'Contains'\n | 'StartsWith'\n | 'EndsWith'\n | 'In'\n | 'NotIn'\n | 'IsNull'\n | 'IsBlank'\n | 'IsEmpty'\n | 'IsChanged'\n | 'WasSet'\n | 'WasVisited'\n | 'HasError'\n | 'None'\n | string;\n\n/** §4.4 — filtro su campi di un'entita': struttura **diversa** dalle condizioni. */\nexport interface FlowRecordFilter {\n field?: string;\n operator?: FlowRecordFilterOperator;\n value?: FlowValue;\n}\n\nexport type FlowRecordFilterOperator =\n | 'EqualTo'\n | 'NotEqualTo'\n | 'GreaterThan'\n | 'GreaterThanOrEqualTo'\n | 'LessThan'\n | 'LessThanOrEqualTo'\n | 'StartsWith'\n | 'EndsWith'\n | 'Contains'\n | 'IsNull'\n | string;\n\n/** §4.3 — `and` | `or` | espressione sugli indici 1-based | `Formula`. */\nexport type FlowConditionLogic = 'and' | 'or' | 'Formula' | string;\n\n/** Blocco condizioni riusato da Decision rule, Wait event, Collection Processor, Start. */\nexport interface FlowConditionHolder {\n conditionLogic?: FlowConditionLogic;\n conditions?: FlowCondition[];\n /** Usato quando `conditionLogic === 'Formula'`; in quel caso `conditions` e' ignorato. */\n formula?: string;\n}\n\n/** Parametro di input verso form / action / script / wait event. */\nexport interface FlowInputParameter {\n name?: string;\n value?: FlowValue;\n}\n\n/** Parametro di output: `assignToReference` deve essere una destinazione scrivibile (§4.6). */\nexport interface FlowOutputParameter {\n name?: string;\n assignToReference?: string;\n}\n\n/** Campo di un record → valore (Create/Update). */\nexport interface FlowInputFieldAssignment {\n field?: string;\n value?: FlowValue;\n}\n\n/** Campo di un record → variabile (Get Records con output esplicito). */\nexport interface FlowOutputFieldAssignment {\n field?: string;\n assignToReference?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Risorse (§4.6)\n// ---------------------------------------------------------------------------\n\nexport interface FlowVariable {\n name?: string;\n description?: string;\n dataType?: FlowDataType;\n /** Obbligatorio per `Object` ed `Enum`: nome dell'entita' o del tipo di enum. */\n objectType?: string;\n isCollection?: boolean;\n isInput?: boolean;\n isOutput?: boolean;\n /** Solo per `Number` e `Integer`; altrove e' `SCALE_NOT_APPLICABLE`. */\n scale?: number;\n value?: FlowValue;\n}\n\nexport interface FlowConstant {\n name?: string;\n description?: string;\n dataType?: FlowDataType;\n /** Non puo' referenziare altre risorse: `CONSTANT_REFERENCES_RESOURCE`. */\n value?: FlowValue;\n}\n\nexport interface FlowFormula {\n name?: string;\n description?: string;\n dataType?: FlowDataType;\n scale?: number;\n /** Passata verbatim al motore di regole: il backend non la valida (§4.6). */\n expression?: string;\n}\n\nexport interface FlowTextTemplate {\n name?: string;\n description?: string;\n text?: string;\n isViewedAsPlainText?: boolean;\n}\n\nexport interface FlowChoice {\n name?: string;\n description?: string;\n dataType?: FlowDataType;\n choiceText?: string;\n value?: FlowValue;\n}\n\nexport interface FlowDynamicChoiceSet {\n name?: string;\n description?: string;\n dataType?: FlowDataType;\n object?: string;\n displayField?: string;\n valueField?: string;\n sortField?: string;\n sortOrder?: FlowSortOrder;\n limit?: number;\n /** Sempre in AND: nessun `filterLogic` qui (§4.4). */\n filters?: FlowRecordFilter[];\n}\n\nexport interface FlowStage {\n name?: string;\n label?: string;\n description?: string;\n /** Devono essere distinti: `STAGE_ORDER_DUPLICATED`. */\n stageOrder?: number;\n isActive?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Node (§5)\n// ---------------------------------------------------------------------------\n\n/** Campi comuni a ogni node. `locationX`/`locationY` sono l'unico layout persistito (§3.5). */\nexport interface FlowNodeBase {\n name?: string;\n label?: string;\n description?: string;\n locationX?: number;\n locationY?: number;\n}\n\n/** §5.1 — lo screen dichiara *quale* form mostrare, non i suoi campi. */\nexport interface FlowScreen extends FlowNodeBase {\n formName?: string;\n helpText?: string;\n allowBack?: boolean;\n allowFinish?: boolean;\n allowPause?: boolean;\n pausedText?: string;\n inputParameters?: FlowInputParameter[];\n outputParameters?: FlowOutputParameter[];\n connector?: FlowConnector;\n}\n\nexport type FlowAssignmentOperator =\n | 'Assign'\n | 'Add'\n | 'Subtract'\n | 'AddAtStart'\n | 'AssignCount'\n | 'RemoveFirst'\n | 'RemoveAll'\n | 'RemovePosition'\n | 'RemoveAfterFirst'\n | 'RemoveBeforeFirst'\n | 'RemoveUncommon'\n | string;\n\nexport interface FlowAssignmentItem {\n assignToReference?: string;\n operator?: FlowAssignmentOperator;\n value?: FlowValue;\n}\n\n/** §5.2 — le operazioni sono eseguite nell'ordine dichiarato. */\nexport interface FlowAssignment extends FlowNodeBase {\n assignmentItems?: FlowAssignmentItem[];\n connector?: FlowConnector;\n}\n\n/** §5.3 — una regola per ramo; l'ordine e' semantico. */\nexport interface FlowDecisionRule extends FlowConditionHolder {\n name?: string;\n label?: string;\n description?: string;\n connector?: FlowConnector;\n}\n\nexport interface FlowDecision extends FlowNodeBase {\n rules?: FlowDecisionRule[];\n defaultConnector?: FlowConnector;\n defaultConnectorLabel?: string;\n}\n\n/** §5.4 */\nexport interface FlowLoop extends FlowNodeBase {\n collectionReference?: string;\n assignNextValueToReference?: string;\n iterationOrder?: FlowSortOrder;\n nextValueConnector?: FlowConnector;\n noMoreValuesConnector?: FlowConnector;\n}\n\nexport interface FlowSortOption {\n sortField?: string;\n sortOrder?: FlowSortOrder;\n doesPutEmptyStringAndNullFirst?: boolean;\n}\n\n/** §5.5 — `assignNextValueToReference` e' l'elemento in esame, non la destinazione. */\nexport interface FlowCollectionProcessor extends FlowNodeBase, FlowConditionHolder {\n collectionProcessorType?: FlowCollectionProcessorType;\n collectionReference?: string;\n assignNextValueToReference?: string;\n limit?: number;\n sortOptions?: FlowSortOption[];\n connector?: FlowConnector;\n}\n\n/** §5.6 */\nexport interface FlowRecordLookup extends FlowNodeBase {\n object?: string;\n filterLogic?: FlowConditionLogic;\n filters?: FlowRecordFilter[];\n filterFormula?: string;\n sortField?: string;\n sortOrder?: FlowSortOrder;\n getFirstRecordOnly?: boolean;\n queriedFields?: string[];\n limit?: number;\n /** Alternativo a `outputReference`/`outputAssignments`: `OUTPUT_CONFIGURATION_CONFLICT`. */\n storeOutputAutomatically?: boolean;\n outputReference?: string;\n outputAssignments?: FlowOutputFieldAssignment[];\n /** Modellato ma non tradotto in query (§5.6). */\n relatedRecords?: unknown[];\n connector?: FlowConnector;\n faultConnector?: FlowConnector;\n}\n\n/** §5.7 */\nexport interface FlowRecordCreate extends FlowNodeBase {\n object?: string;\n inputReference?: string;\n inputAssignments?: FlowInputFieldAssignment[];\n filterLogic?: FlowConditionLogic;\n filters?: FlowRecordFilter[];\n doesUpsert?: boolean;\n upsertExternalIdField?: string;\n upsertStandardIdField?: string;\n storeOutputAutomatically?: boolean;\n assignRecordIdToReference?: string;\n connector?: FlowConnector;\n faultConnector?: FlowConnector;\n}\n\nexport interface FlowRecordUpdate extends FlowNodeBase {\n object?: string;\n inputReference?: string;\n /** Nessun `filterLogic` qui: i filtri sono sempre in AND (§4.4). */\n filters?: FlowRecordFilter[];\n filterFormula?: string;\n inputAssignments?: FlowInputFieldAssignment[];\n connector?: FlowConnector;\n faultConnector?: FlowConnector;\n}\n\nexport interface FlowRecordDelete extends FlowNodeBase {\n object?: string;\n inputReference?: string;\n /** Senza filtri e' un **errore**, non un avviso (§5.7). */\n filters?: FlowRecordFilter[];\n connector?: FlowConnector;\n faultConnector?: FlowConnector;\n}\n\nexport interface FlowRecordRollback extends FlowNodeBase {\n connector?: FlowConnector;\n}\n\n/** §5.8 */\nexport interface FlowActionCall extends FlowNodeBase {\n actionType?: string;\n actionName?: string;\n flowTransactionModel?: FlowTransactionModel;\n inputParameters?: FlowInputParameter[];\n outputParameters?: FlowOutputParameter[];\n storeOutputAutomatically?: boolean;\n isWaitUntilCompleted?: boolean;\n offset?: number;\n offsetUnit?: FlowOffsetUnit;\n /** Il ramo di timeout esiste solo con `EnableTimeoutPath`. */\n timeoutPathUsage?: 'EnableTimeoutPath' | 'NoTimeoutPath' | string;\n connector?: FlowConnector;\n faultConnector?: FlowConnector;\n timeoutConnector?: FlowConnector;\n}\n\nexport interface FlowScriptPluginCall extends FlowNodeBase {\n scriptName?: string;\n inputParameters?: FlowInputParameter[];\n outputParameters?: FlowOutputParameter[];\n storeOutputAutomatically?: boolean;\n connector?: FlowConnector;\n faultConnector?: FlowConnector;\n}\n\n/** §5.9 — i `name` sono le variabili isInput/isOutput del flow **invocato**. */\nexport interface FlowSubflowInputAssignment {\n name?: string;\n value?: FlowValue;\n}\n\nexport interface FlowSubflowOutputAssignment {\n name?: string;\n assignToReference?: string;\n}\n\nexport interface FlowSubflow extends FlowNodeBase {\n flowName?: string;\n inputAssignments?: FlowSubflowInputAssignment[];\n outputAssignments?: FlowSubflowOutputAssignment[];\n storeOutputAutomatically?: boolean;\n connector?: FlowConnector;\n}\n\n/** §5.10 */\nexport interface FlowWaitEvent extends FlowConditionHolder {\n name?: string;\n label?: string;\n description?: string;\n eventType?: string;\n filterLogic?: FlowConditionLogic;\n filters?: FlowRecordFilter[];\n inputParameters?: FlowInputParameter[];\n outputParameters?: FlowOutputParameter[];\n connector?: FlowConnector;\n}\n\nexport interface FlowWait extends FlowNodeBase {\n waitEvents?: FlowWaitEvent[];\n defaultConnector?: FlowConnector;\n defaultConnectorLabel?: string;\n faultConnector?: FlowConnector;\n}\n\n/** §5.11 */\nexport interface FlowCustomErrorMessage {\n errorMessage?: string;\n isFieldError?: boolean;\n fieldSelection?: string;\n}\n\nexport interface FlowCustomError extends FlowNodeBase {\n customErrorMessages?: FlowCustomErrorMessage[];\n}\n\n/** §5.12 */\nexport interface FlowTransformValueAction {\n transformType?: FlowTransformType;\n outputFieldApiName?: string;\n value?: FlowValue;\n inputParameters?: FlowInputParameter[];\n}\n\nexport interface FlowTransformValue {\n transformValueActions?: FlowTransformValueAction[];\n}\n\nexport interface FlowTransform extends FlowNodeBase {\n dataType?: FlowDataType;\n objectType?: string;\n isCollection?: boolean;\n transformValues?: FlowTransformValue[];\n /** **Array** per fedelta' storica: usa il primo (§3.5). */\n connector?: FlowConnector[];\n}\n\n/** Non supportati dal motore: nascosti dalla palette (§3.2, §13.9). */\nexport interface FlowUnsupportedNode extends FlowNodeBase {\n connector?: FlowConnector;\n [key: string]: unknown;\n}\n\n// ---------------------------------------------------------------------------\n// Start (§3.4)\n// ---------------------------------------------------------------------------\n\nexport interface FlowSchedule {\n frequency?: 'Once' | 'Daily' | 'Weekly' | 'Monthly' | string;\n /** Data senza fuso: `2026-08-01T00:00:00`. */\n startDate?: string;\n /** `08:00:00`. */\n startTime?: string;\n}\n\nexport interface FlowScheduledPath {\n name?: string;\n label?: string;\n offsetNumber?: number;\n offsetUnit?: FlowOffsetUnit;\n timeSource?: string;\n recordField?: string;\n connector?: FlowConnector;\n}\n\nexport interface FlowStart {\n locationX?: number;\n locationY?: number;\n /** Sempre necessario: senza, `START_NO_ENTRY_POINT`. */\n connector?: FlowConnector;\n triggerType?: FlowTriggerType;\n object?: string;\n recordTriggerType?: FlowRecordTriggerType;\n filterLogic?: FlowConditionLogic;\n filters?: FlowRecordFilter[];\n filterFormula?: string;\n doesRequireRecordChangedToMeetCriteria?: boolean;\n schedule?: FlowSchedule;\n scheduledPaths?: FlowScheduledPath[];\n inputs?: FlowInputParameter[];\n}\n\n// ---------------------------------------------------------------------------\n// Documento radice (§3.1)\n// ---------------------------------------------------------------------------\n\nexport interface FlowCustomProperty {\n name?: string;\n value?: string;\n}\n\n/**\n * §3.1 — i node non stanno in un'unica lista: c'e' una collection per tipo.\n * Il tipo di un node **e'** la collection in cui sta.\n */\nexport interface FlowDefinition {\n /** Identificatore. Rinominare passa da una primitiva dedicata, non dal JSON (§2). */\n fullName?: string;\n label?: string;\n description?: string;\n processType?: FlowProcessType;\n /** Sola lettura per l'editor: lo governa il ciclo di vita (§8). */\n status?: FlowVersionStatus;\n interviewLabel?: string;\n\n /** Array di uno per fedelta' storica: usa sempre il primo (§3.4). */\n start?: FlowStart[];\n\n variables?: FlowVariable[];\n constants?: FlowConstant[];\n formulas?: FlowFormula[];\n textTemplates?: FlowTextTemplate[];\n choices?: FlowChoice[];\n dynamicChoiceSets?: FlowDynamicChoiceSet[];\n stages?: FlowStage[];\n\n screens?: FlowScreen[];\n assignments?: FlowAssignment[];\n decisions?: FlowDecision[];\n loops?: FlowLoop[];\n collectionProcessors?: FlowCollectionProcessor[];\n recordLookups?: FlowRecordLookup[];\n recordCreates?: FlowRecordCreate[];\n recordUpdates?: FlowRecordUpdate[];\n recordDeletes?: FlowRecordDelete[];\n recordRollbacks?: FlowRecordRollback[];\n actionCalls?: FlowActionCall[];\n scriptPluginCalls?: FlowScriptPluginCall[];\n subflows?: FlowSubflow[];\n transforms?: FlowTransform[];\n waits?: FlowWait[];\n customErrors?: FlowCustomError[];\n\n /** Non supportati: conservati nel round-trip ma non creabili dalla palette. */\n steps?: FlowUnsupportedNode[];\n experiments?: FlowUnsupportedNode[];\n orchestratedStages?: FlowUnsupportedNode[];\n\n apiVersion?: string;\n timeZoneSidKey?: string;\n triggerOrder?: number;\n isTemplate?: boolean;\n customProperties?: FlowCustomProperty[];\n}\n\n// ---------------------------------------------------------------------------\n// Chiavi delle collection\n// ---------------------------------------------------------------------------\n\n/** Le collection di node: `metadataProperty` del dizionario `elementTypes` (§3.2). */\nexport const FLOW_NODE_COLLECTIONS = [\n 'screens',\n 'assignments',\n 'decisions',\n 'loops',\n 'collectionProcessors',\n 'recordLookups',\n 'recordCreates',\n 'recordUpdates',\n 'recordDeletes',\n 'recordRollbacks',\n 'actionCalls',\n 'scriptPluginCalls',\n 'subflows',\n 'transforms',\n 'waits',\n 'customErrors',\n 'steps',\n 'experiments',\n 'orchestratedStages',\n] as const;\n\nexport type FlowNodeCollection = (typeof FLOW_NODE_COLLECTIONS)[number];\n\n/** Le collection di risorse (§4.6). Condividono lo spazio dei nomi con i node (§3.3). */\nexport const FLOW_RESOURCE_COLLECTIONS = [\n 'variables',\n 'constants',\n 'formulas',\n 'textTemplates',\n 'choices',\n 'dynamicChoiceSets',\n 'stages',\n] as const;\n\nexport type FlowResourceCollection = (typeof FLOW_RESOURCE_COLLECTIONS)[number];\n\n/** Il discriminatore `value` del dizionario `elementTypes`. */\nexport type FlowElementType =\n | 'Screen'\n | 'Assignment'\n | 'Decision'\n | 'Loop'\n | 'CollectionProcessor'\n | 'CustomError'\n | 'Wait'\n | 'RecordLookup'\n | 'RecordCreate'\n | 'RecordUpdate'\n | 'RecordDelete'\n | 'RecordRollback'\n | 'ActionCall'\n | 'ScriptCall'\n | 'Subflow'\n | 'Transform'\n | 'Step'\n | 'Experiment'\n | 'OrchestratedStage'\n | string;\n\n/** Un node qualunque, come lo vede il canvas. */\nexport type FlowAnyNode = FlowNodeBase & Record<string, unknown>;\n","/**\n * Dizionari — FRONTEND.md §6.4.\n *\n * Sono statici: si caricano una volta e si tengono in cache. Nessun elenco di enum\n * o di operatori va cablato nel frontend (§13.11): tutte le tendine leggono da qui.\n */\n\nimport { FlowDataType, FlowElementType, FlowNodeCollection } from './flow.model';\n\n/** Ogni voce di dizionario ha almeno `value` (da scrivere) e `label` (da mostrare). */\nexport interface FlowDictionaryEntry {\n value: string;\n label: string;\n description?: string | null;\n}\n\nexport interface FlowDataTypeEntry extends FlowDictionaryEntry {\n value: FlowDataType;\n /** `Object` ed `Enum` richiedono `objectType` (§4.6). */\n requiresObjectType?: boolean;\n /** `scale` si applica solo ai numerici (§4.6). */\n supportsScale?: boolean;\n}\n\n/** §3.2 — la voce che descrive un tipo di elemento. */\nexport interface FlowElementTypeEntry extends FlowDictionaryEntry {\n value: FlowElementType;\n /** Categoria per raggruppare la palette: Interazione, Logica, Dati, Azione, Flow. */\n category?: string | null;\n /** La collection in cui scrivere il node (§3.1). */\n metadataProperty?: FlowNodeCollection | string;\n /** `false` → va nascosto dalla palette (§13.9). */\n isSupported?: boolean;\n hasFaultConnector?: boolean;\n hasAutomaticOutput?: boolean;\n}\n\n/** §4.3 — operatore di confronto per le condizioni su risorse. */\nexport interface FlowComparisonOperatorEntry extends FlowDictionaryEntry {\n /**\n * Trappola numero uno (§13.1): per gli unari `rightValue` e' l'**esito atteso**,\n * non il termine di confronto.\n */\n isUnary?: boolean;\n /** A sinistra vuole il nome di un **node**, non di una risorsa (`WasVisited`, `HasError`). */\n appliesToElements?: boolean;\n /** Tipi a cui l'operatore si applica; vuoto o assente = qualunque tipo. */\n appliesTo?: FlowDataType[] | null;\n}\n\n/** §5.2 — operatore di assegnazione. */\nexport interface FlowAssignmentOperatorEntry extends FlowDictionaryEntry {\n /** Ha senso solo su destinazioni collection; altrove e' un avviso. */\n expectsCollection?: boolean;\n}\n\n/** §4.1 — variabile globale proponibile invece di farla digitare. */\nexport interface FlowGlobalVariableEntry extends FlowDictionaryEntry {\n /** `$Flow`, `$GlobalConstant`, `$Record`, `$User`, … */\n scope?: string;\n /** Percorsi noti dello scope; per gli scope dell'host e' vuoto. */\n paths?: string[] | null;\n /** `true` → il backend non sa quali percorsi esistano e accetta qualunque cosa (§4.1). */\n isResolvedByHost?: boolean;\n /** Disponibile solo con un trigger su record (`$Record`, `$Record__Prior`). */\n requiresRecordTrigger?: boolean;\n}\n\nexport interface FlowResourceKindEntry extends FlowDictionaryEntry {\n /** Solo le variabili sono scrivibili (§4.6). */\n isWritable?: boolean;\n /** La collection del documento in cui vive la risorsa. */\n metadataProperty?: string;\n}\n\n/**\n * §6.4 — tutte le tendine statiche in una risposta.\n * I campi sono opzionali: un backend che non popola un dizionario non deve far\n * crollare l'editor, che degrada mostrando il valore grezzo.\n */\nexport interface FlowDictionaries {\n dataTypes?: FlowDataTypeEntry[];\n comparisonOperators?: FlowComparisonOperatorEntry[];\n assignmentOperators?: FlowAssignmentOperatorEntry[];\n recordFilterOperators?: FlowDictionaryEntry[];\n elementTypes?: FlowElementTypeEntry[];\n resourceKinds?: FlowResourceKindEntry[];\n globalVariables?: FlowGlobalVariableEntry[];\n processTypes?: FlowDictionaryEntry[];\n versionStatuses?: FlowDictionaryEntry[];\n triggerTypes?: FlowDictionaryEntry[];\n recordTriggerTypes?: FlowDictionaryEntry[];\n startFrequencies?: FlowDictionaryEntry[];\n offsetUnits?: FlowDictionaryEntry[];\n sortOrders?: FlowDictionaryEntry[];\n collectionProcessorTypes?: FlowDictionaryEntry[];\n transformTypes?: FlowDictionaryEntry[];\n transactionModels?: FlowDictionaryEntry[];\n waitEventTypes?: FlowDictionaryEntry[];\n conditionLogicModes?: FlowDictionaryEntry[];\n screenNavigations?: FlowDictionaryEntry[];\n}\n\n// ---------------------------------------------------------------------------\n// Cataloghi (§6.4)\n// ---------------------------------------------------------------------------\n\nexport interface FlowObjectSummary {\n name: string;\n label?: string | null;\n description?: string | null;\n}\n\nexport interface FlowObjectDescription {\n name: string;\n label?: string | null;\n fields?: FlowFieldDescription[];\n}\n\nexport interface FlowFieldDescription {\n name: string;\n label?: string | null;\n dataType?: FlowDataType;\n objectType?: string | null;\n isFilterable?: boolean;\n isSortable?: boolean;\n isUpdateable?: boolean;\n isRequired?: boolean;\n /** `true` → i valori ammessi si chiedono a `.../fields/{field}/values`. */\n hasClosedValueSet?: boolean;\n}\n\n/** `any` | `filterable` | `sortable` | `updateable` (§6.4). */\nexport type FlowFieldUsage = 'any' | 'filterable' | 'sortable' | 'updateable';\n\nexport interface FlowFieldValue {\n value: string;\n label?: string | null;\n}\n\n/** Voce di catalogo per action, script, form, eventi, tipi di enum. */\nexport interface FlowCatalogEntry {\n name: string;\n label?: string | null;\n description?: string | null;\n}\n\n/**\n * Parametro dichiarato da un'action, uno script o un form.\n * Con il catalogo popolato un parametro inesistente e' un **errore** (§5.8).\n */\nexport interface FlowCatalogParameter {\n name: string;\n label?: string | null;\n description?: string | null;\n dataType?: FlowDataType;\n objectType?: string | null;\n isCollection?: boolean;\n isInput?: boolean;\n isOutput?: boolean;\n isRequired?: boolean;\n}\n","/**\n * Payload delle primitive — FRONTEND.md §6, §7, §8, §10.\n */\n\nimport { FlowDataType, FlowDefinition, FlowProcessType, FlowVersionStatus } from './flow.model';\n\n// ---------------------------------------------------------------------------\n// Elenchi (§6.1)\n// ---------------------------------------------------------------------------\n\n/** Una riga per **nome**, non per versione (§6.1). */\nexport interface FlowSummary {\n flowName: string;\n label?: string | null;\n description?: string | null;\n processType?: FlowProcessType;\n activeVersion?: number | null;\n latestVersion?: number;\n versionCount?: number;\n hasDraft?: boolean;\n updatedAt?: string;\n /** Esiste una versione attiva. Non ricalcolarlo lato client (§6.1). */\n isRunnable?: boolean;\n}\n\nexport interface FlowVersionSummary {\n flowName: string;\n version: number;\n status?: FlowVersionStatus;\n label?: string | null;\n description?: string | null;\n processType?: FlowProcessType;\n createdAt?: string;\n /** Da conservare e rimandare come `expectedUpdatedAt` al salvataggio (§9). */\n updatedAt?: string;\n updatedBy?: string | null;\n isActive?: boolean;\n /** La versione e' una bozza. Non ricalcolarlo lato client (§6.1). */\n isEditable?: boolean;\n}\n\nexport interface FlowListQuery {\n search?: string;\n processType?: FlowProcessType;\n onlyActive?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Validazione (§7)\n// ---------------------------------------------------------------------------\n\nexport type FlowIssueSeverity = 'Error' | 'Warning' | 'Info' | string;\n\nexport interface FlowValidationIssue {\n /** Stabile: usalo per decidere il comportamento. Non interpretare `message` (§7). */\n code: string;\n severity: FlowIssueSeverity;\n message: string;\n /** Ancora per portare l'utente sull'elemento con un clic. */\n elementName?: string | null;\n /** Campo dentro l'elemento, es. `rules[Approvato].connector.targetReference`. */\n path?: string | null;\n}\n\nexport interface FlowValidationResult {\n /** Ordinati per gravita' decrescente (§7). */\n issues: FlowValidationIssue[];\n errorCount: number;\n warningCount: number;\n isValid: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Scrittura (§6.2)\n// ---------------------------------------------------------------------------\n\nexport interface FlowCreateRequest {\n definition: FlowDefinition;\n flowName?: string;\n author?: string;\n}\n\nexport interface FlowSaveRequest {\n definition: FlowDefinition;\n /** Se indicato **vince** sul `fullName` del documento: e' cosi' che si rinomina (§6.2). */\n flowName?: string;\n /** Mandare sempre la versione che si sta editando rende il risultato prevedibile (§8). */\n version?: number;\n /** Concorrenza ottimistica: facoltativo ma raccomandato (§9). */\n expectedUpdatedAt?: string;\n author?: string;\n /** Salva **e** attiva. Fallisce senza scrivere nulla se ci sono errori. */\n activate?: boolean;\n}\n\nexport interface FlowSaveResult {\n flowName: string;\n version: number;\n status: FlowVersionStatus;\n isNewVersion: boolean;\n /** Da conservare per il salvataggio successivo (§9). */\n updatedAt: string;\n /** Il salvataggio riesce anche con errori: guarda qui, non l'esito HTTP (§6.2). */\n validation?: FlowValidationResult;\n}\n\nexport interface FlowCloneRequest {\n targetFlowName: string;\n label?: string;\n fromVersion?: number;\n author?: string;\n}\n\nexport interface FlowNewVersionRequest {\n /** Versione da copiare; se omessa, l'ultima. */\n from?: number;\n author?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Riferimenti e struttura (§6.4)\n// ---------------------------------------------------------------------------\n\nexport type FlowReferenceKind =\n | 'Variable'\n | 'Constant'\n | 'Formula'\n | 'TextTemplate'\n | 'Choice'\n | 'DynamicChoiceSet'\n | 'Stage'\n /** Output automatico di un elemento: valido pur non essendo dichiarato (§4.5, §13.3). */\n | 'ElementOutput'\n | 'Global'\n | string;\n\nexport interface FlowReference {\n name: string;\n label?: string | null;\n kind: FlowReferenceKind;\n dataType?: FlowDataType | null;\n isCollection?: boolean;\n objectType?: string | null;\n /** Per i campi di destinazione: solo le variabili sono scrivibili (§4.6). */\n isWritable?: boolean;\n description?: string | null;\n}\n\n/** Filtro opzionale per non trasferire riferimenti che il campo non accetta. */\nexport interface FlowReferenceQuery {\n definition: FlowDefinition;\n dataType?: FlowDataType;\n isCollection?: boolean;\n objectType?: string;\n}\n\nexport interface FlowConnectorTarget {\n name: string;\n label?: string | null;\n kind?: string;\n}\n\nexport type FlowConnectionKind =\n | 'Start'\n | 'ScheduledPath'\n | 'Next'\n | 'Rule'\n | 'Default'\n | 'LoopNext'\n | 'LoopEnd'\n | 'WaitEvent'\n | 'Fault'\n | 'Timeout'\n | string;\n\nexport interface FlowOutlineNode {\n name: string;\n label?: string | null;\n kind: string;\n description?: string | null;\n locationX?: number;\n locationY?: number;\n /** `false` → nessun percorso lo raggiunge dallo Start: va reso \"scollegato\" (§6.4). */\n isReachable?: boolean;\n}\n\nexport interface FlowOutlineConnection {\n /** `null` identifica gli archi uscenti dallo Start, che non ha nome (§6.4). */\n from?: string | null;\n /** `null` → il connector esiste ma non ha destinazione: ramo incompleto (§6.4). */\n to?: string | null;\n kind: FlowConnectionKind;\n label?: string | null;\n isGoTo?: boolean;\n}\n\nexport interface FlowOutline {\n flowName?: string | null;\n label?: string | null;\n processType?: FlowProcessType;\n triggerType?: string | null;\n entryElementName?: string | null;\n nodes: FlowOutlineNode[];\n connections: FlowOutlineConnection[];\n}\n\n// ---------------------------------------------------------------------------\n// Esecuzione (§6.5)\n// ---------------------------------------------------------------------------\n\nexport type FlowInterviewStatus =\n | 'Completed'\n | 'WaitingForScreen'\n | 'Paused'\n | 'Suspended'\n /** **Non** e' un errore HTTP: la richiesta e' riuscita, il flow e' fallito (§6.5). */\n | 'Failed'\n /** I criteri dello Start non erano soddisfatti: non e' un errore (§6.5). */\n | 'NotStarted'\n | string;\n\nexport type FlowScreenNavigation = 'Next' | 'Previous' | 'Pause' | 'Finish' | string;\n\n/** Il tipo dichiarato **vince** in lettura: distingue `Integer` da `Number` (§6.5). */\nexport interface FlowTypedValue {\n type?: FlowDataType;\n value?: unknown;\n}\n\nexport interface FlowPendingScreen {\n elementName?: string;\n formName?: string;\n label?: string | null;\n helpText?: string | null;\n inputs?: Record<string, FlowTypedValue>;\n /** Piu' precisi dei flag del metadata: sono la verita' su cosa abilitare (§6.5). */\n canGoBack?: boolean;\n canFinish?: boolean;\n canPause?: boolean;\n}\n\nexport interface FlowTraceEntry {\n sequence?: number;\n level?: string;\n message?: string;\n elementName?: string | null;\n}\n\nexport interface FlowInterviewResult {\n interviewId?: string;\n flowName?: string;\n status: FlowInterviewStatus;\n /** Opaco: da rimandare tale e quale (§6.5, §13.12). */\n continuationToken?: string | null;\n interviewKey?: string | null;\n pendingScreen?: FlowPendingScreen | null;\n outputs?: Record<string, FlowTypedValue>;\n errors?: string[];\n fault?: string | null;\n currentElementName?: string | null;\n steps?: number;\n /** Popolato solo con `debug: true`. Puo' contenere dati personali (§6.5). */\n trace?: FlowTraceEntry[];\n /** Con `debug: true`: i valori di **tutte** le risorse, non solo gli output. */\n resources?: Record<string, FlowTypedValue>;\n isSuccess?: boolean;\n}\n\nexport interface FlowStartInterviewRequest {\n flowName: string;\n version?: number;\n inputs?: Record<string, unknown>;\n debug?: boolean;\n}\n\nexport interface FlowScreenResponseRequest {\n continuationToken: string;\n screenElementName?: string;\n navigation?: FlowScreenNavigation;\n outputs?: Record<string, unknown>;\n debug?: boolean;\n}\n\nexport interface FlowResumeRequest {\n interviewKey: string;\n debug?: boolean;\n}\n\nexport interface FlowExportQuery {\n version?: number;\n indented?: boolean;\n}\n","/**\n * Errori categorizzati — FRONTEND.md §10.\n *\n * La UI si comporta in base alla **categoria**, non al messaggio. L'implementazione\n * dell'interfaccia backend ha il compito di tradurre l'errore di trasporto\n * (status HTTP, payload) in un `FlowApiError`: da lì in poi l'editor non conosce HTTP.\n */\n\nimport { FlowValidationResult } from './api.model';\n\n/** Categorie di authoring (§10). */\nexport type FlowErrorCategory =\n /** Bug del client: la richiesta e' incompleta. */\n | 'InvalidRequest'\n /** Il documento non e' leggibile: tipicamente l'import di un file sbagliato. */\n | 'InvalidDefinition'\n /** Apri il pannello dei problemi: il payload contiene `validation`. */\n | 'ValidationFailed'\n | 'FlowNotFound'\n | 'VersionNotFound'\n /** Nome già usato: chiedi un altro nome. */\n | 'AlreadyExists'\n /** Versione non modificabile: proponi \"Nuova versione\" (§8.1). */\n | 'NotEditable'\n /** Qualcun altro ha salvato: proponi ricarica (§9). */\n | 'VersionConflict'\n /** Funzione non configurata su questo ambiente: disabilita il comando. */\n | 'MissingService'\n // Categorie dell'esecuzione (§10, secondo capoverso)\n | 'InvalidToken'\n | 'InterviewNotFound'\n /** Fallback per un errore di trasporto non categorizzato. */\n | 'Unknown'\n | string;\n\n/** L'errore che ogni primitiva puo' rifiutare (§6, §10). */\nexport class FlowApiError extends Error {\n constructor(\n readonly category: FlowErrorCategory,\n message: string,\n /** Presente con `ValidationFailed`: l'elenco da aprire nel pannello (§8.3). */\n readonly validation?: FlowValidationResult,\n /** Con `VersionConflict`: chi ha modificato nel frattempo (§9). */\n readonly conflictingAuthor?: string,\n readonly details?: unknown,\n ) {\n super(message);\n this.name = 'FlowApiError';\n }\n\n static is(value: unknown): value is FlowApiError {\n return value instanceof FlowApiError;\n }\n}\n\n/** Mappatura HTTP suggerita (§10). Usata dall'implementazione HTTP dell'interfaccia. */\nexport const FLOW_ERROR_HTTP_STATUS: Record<string, number> = {\n InvalidRequest: 400,\n InvalidDefinition: 400,\n ValidationFailed: 422,\n FlowNotFound: 404,\n VersionNotFound: 404,\n InterviewNotFound: 404,\n AlreadyExists: 409,\n NotEditable: 409,\n VersionConflict: 409,\n InvalidToken: 400,\n MissingService: 501,\n};\n\n/** Messaggi di fallback: `message` del backend, quando c'e', ha la precedenza. */\nexport const FLOW_ERROR_FALLBACK_MESSAGE: Record<string, string> = {\n InvalidRequest: 'La richiesta non e’ valida.',\n InvalidDefinition: 'Il documento non e’ leggibile come definizione di flow.',\n ValidationFailed: 'La definizione contiene errori che impediscono l’attivazione.',\n FlowNotFound: 'Il flow non esiste piu’.',\n VersionNotFound: 'La versione richiesta non esiste.',\n AlreadyExists: 'Esiste già un flow con questo nome.',\n NotEditable: 'Questa versione non e’ modificabile: creane una nuova.',\n VersionConflict: 'Qualcun altro ha salvato questa versione nel frattempo.',\n MissingService: 'Funzione non configurata su questo ambiente.',\n InvalidToken: 'La sessione di prova non e’ piu’ valida: riavvia l’esecuzione.',\n InterviewNotFound: 'L’esecuzione sospesa non esiste piu’.',\n Unknown: 'Errore inatteso.',\n};\n","/**\n * L'unica porta verso il backend.\n *\n * **Tutto** il traffico di dati da e verso il backend passa da qui: nessun componente\n * e nessun servizio della libreria conosce HTTP, URL o formati di trasporto. Chi integra\n * il builder fornisce una implementazione di questa classe astratta e la registra come\n * provider — `FlowBuilderApi` e' anche il token di dependency injection.\n *\n * Contratto di errore: ogni metodo, in caso di rifiuto, deve fallire con un\n * {@link FlowApiError} categorizzato (§10). L'editor si comporta in base alla categoria,\n * mai leggendo il messaggio.\n *\n * Contratto di forma: i metodi restituiscono `Promise`. Le primitive marcate\n * \"prende il documento in lavorazione\" ricevono la definizione non ancora salvata,\n * perche' la risposta dipende da cio' che l'utente sta scrivendo (§6.4).\n *\n * I metodi con implementazione di default che lancia `MissingService` sono opzionali:\n * un ambiente che non li espone lascia l'editor funzionante, con il comando corrispondente\n * disabilitato (§10, categoria `MissingService`).\n */\n\nimport {\n FlowCatalogEntry,\n FlowCatalogParameter,\n FlowDictionaries,\n FlowFieldUsage,\n FlowFieldValue,\n FlowObjectDescription,\n FlowObjectSummary,\n} from '../model/dictionary.model';\nimport {\n FlowCloneRequest,\n FlowConnectorTarget,\n FlowCreateRequest,\n FlowExportQuery,\n FlowInterviewResult,\n FlowListQuery,\n FlowNewVersionRequest,\n FlowOutline,\n FlowReference,\n FlowReferenceQuery,\n FlowResumeRequest,\n FlowSaveRequest,\n FlowSaveResult,\n FlowScreenResponseRequest,\n FlowStartInterviewRequest,\n FlowSummary,\n FlowValidationResult,\n FlowVersionSummary,\n} from '../model/api.model';\nimport { FlowDefinition } from '../model/flow.model';\nimport { FlowApiError } from '../model/error.model';\n\n/** Helper per i metodi opzionali non implementati. */\nfunction missing(primitive: string): Promise<never> {\n return Promise.reject(\n new FlowApiError('MissingService', `Primitiva non disponibile su questo ambiente: ${primitive}.`),\n );\n}\n\nexport abstract class FlowBuilderApi {\n // -------------------------------------------------------------------------\n // §6.1 Catalogo e lettura\n // -------------------------------------------------------------------------\n\n /** `GET /flows` — una riga per nome, non per versione. */\n abstract listFlows(query?: FlowListQuery): Promise<FlowSummary[]>;\n\n /** `GET /flows/{name}/versions` — dalla piu' recente. */\n abstract listVersions(flowName: string): Promise<FlowVersionSummary[]>;\n\n /**\n * `GET /flows/{name}?version=` — senza `version` restituisce la versione attiva,\n * altrimenti l'ultima.\n */\n abstract loadFlow(flowName: string, version?: number): Promise<FlowDefinition>;\n\n /** `GET /flows/{name}/export` — il documento come stringa indentata. */\n exportFlow(flowName: string, query?: FlowExportQuery): Promise<string> {\n void flowName;\n void query;\n return missing('exportFlow');\n }\n\n /**\n * `POST /flows/parse` — normalizza un documento senza salvarlo.\n * Serve all'import di un file: rifiuta con `InvalidDefinition` se non e' leggibile.\n */\n parseFlow(definition: unknown): Promise<FlowDefinition> {\n void definition;\n return missing('parseFlow');\n }\n\n // -------------------------------------------------------------------------\n // §6.2 Scrittura e versionamento\n // -------------------------------------------------------------------------\n\n /** `POST /flows` — crea la versione 1. `AlreadyExists` se il nome e' già usato. */\n abstract createFlow(request: FlowCreateRequest): Promise<FlowSaveResult>;\n\n /**\n * `PUT /flows/{name}` — salva sulla bozza esistente o ne crea una nuova versione.\n * Riesce **anche con errori** di validazione: l'esito sano si legge in\n * `FlowSaveResult.validation`, non nell'assenza di eccezione (§6.2).\n */\n abstract saveFlow(flowName: string, request: FlowSaveRequest): Promise<FlowSaveResult>;\n\n /** `POST /flows/{name}/versions?from=` — copia una versione in una nuova bozza. */\n abstract createVersion(flowName: string, request?: FlowNewVersionRequest): Promise<FlowSaveResult>;\n\n /** `POST /flows/{name}/clone` — copia il flow sotto un altro nome, versione 1. */\n cloneFlow(flowName: string, request: FlowCloneRequest): Promise<FlowSaveResult> {\n void flowName;\n void request;\n return missing('cloneFlow');\n }\n\n /**\n * `POST /flows/{name}/versions/{v}/activate` — valida e attiva; la precedente\n * diventa `Obsolete`. Con errori fallisce con `ValidationFailed` e il payload\n * contiene l'elenco (§8.3).\n */\n abstract activateVersion(flowName: string, version: number): Promise<FlowSaveResult>;\n\n /** `POST /flows/{name}/deactivate` — il flow non e' piu' eseguibile. */\n abstract deactivateFlow(flowName: string): Promise<void>;\n\n /** `DELETE /flows/{name}/versions/{v}` — rifiutata sulla versione attiva. */\n deleteVersion(flowName: string, version: number): Promise<void> {\n void flowName;\n void version;\n return missing('deleteVersion');\n }\n\n /** `DELETE /flows/{name}` — rifiutata se esiste una versione attiva. */\n deleteFlow(flowName: string): Promise<void> {\n void flowName;\n return missing('deleteFlow');\n }\n\n // -------------------------------------------------------------------------\n // §6.3 Validazione\n // -------------------------------------------------------------------------\n\n /**\n * `POST /flows/validate` — non scrive nulla. È la primitiva del pannello dei\n * problemi, richiamabile a ogni pausa di digitazione (§11, debounce 300–500 ms).\n */\n abstract validateDefinition(definition: FlowDefinition): Promise<FlowValidationResult>;\n\n /** `GET /flows/{name}/versions/{v}/validate` — valida una versione già salvata. */\n validateVersion(flowName: string, version: number): Promise<FlowValidationResult> {\n void flowName;\n void version;\n return missing('validateVersion');\n }\n\n // -------------------------------------------------------------------------\n // §6.4 Dizionari, cataloghi e strumenti per l'interfaccia\n // -------------------------------------------------------------------------\n\n /**\n * `GET /flows/dictionaries` — tutte le tendine statiche in una risposta.\n * Statiche: si caricano una volta e si tengono in cache (§6.4, §13.11).\n */\n abstract getDictionaries(): Promise<FlowDictionaries>;\n\n /**\n * `POST /flows/references` — i valori proponibili in un campo che accetta una risorsa.\n * Include gli **output automatici** degli elementi, che non sono dichiarati in nessuna\n * collection: e' il motivo per cui non va ricostruita lato client (§4.5, §13.3).\n */\n abstract getReferences(query: FlowReferenceQuery): Promise<FlowReference[]>;\n\n /**\n * `POST /flows/references/writable` — solo le variabili, per i campi di destinazione.\n * Ai campi `assignToReference` va aggiunto `$Flow.CurrentStage` / `$Flow.ActiveStages`\n * se il flow dichiara stage (§5.2): quello lo fa l'editor, non la primitiva.\n */\n abstract getWritableReferences(query: FlowReferenceQuery): Promise<FlowReference[]>;\n\n /** `POST /flows/connector-targets?excluding=` — i node a cui un arco puo' puntare. */\n abstract getConnectorTargets(definition: FlowDefinition, excluding?: string): Promise<FlowConnectorTarget[]>;\n\n /**\n * `POST /flows/outline` — node, archi e raggiungibilita' per il canvas.\n * `isReachable` e' la fonte autoritativa dei node scollegati (§6.4).\n */\n abstract getOutline(definition: FlowDefinition): Promise<FlowOutline>;\n\n /** `GET /catalog/objects` — le entita' su cui i flow possono operare. */\n abstract listObjects(): Promise<FlowObjectSummary[]>;\n\n /** `GET /schema/{object}` — label e campi. */\n describeObject(object: string): Promise<FlowObjectDescription> {\n void object;\n return missing('describeObject');\n }\n\n /** `GET /schema/{object}/fields?usage=` — proponi solo i campi validi per l'uso (§4.4). */\n abstract listFields(object: string, usage?: FlowFieldUsage): Promise<FlowObjectDescription['fields']>;\n\n /** `GET /schema/{object}/fields/{field}/values` — per non far digitare i valori. */\n listFieldValues(object: string, field: string): Promise<FlowFieldValue[]> {\n void object;\n void field;\n return missing('listFieldValues');\n }\n\n /** `GET /catalog/action-types` */\n abstract listActionTypes(): Promise<FlowCatalogEntry[]>;\n\n /** `GET /catalog/actions?type=` */\n abstract listActions(actionType?: string): Promise<FlowCatalogEntry[]>;\n\n /** `GET /catalog/actions/{type}/{name}/parameters` */\n abstract listActionParameters(actionType: string, actionName: string): Promise<FlowCatalogParameter[]>;\n\n /** `GET /catalog/scripts` */\n abstract listScripts(): Promise<FlowCatalogEntry[]>;\n\n /** `GET /catalog/scripts/{name}/parameters` */\n abstract listScriptParameters(scriptName: string): Promise<FlowCatalogParameter[]>;\n\n /** `GET /catalog/forms` — i form realizzati a mano nel frontend applicativo (§5.1). */\n abstract listForms(): Promise<FlowCatalogEntry[]>;\n\n /** `GET /catalog/forms/{name}/parameters` */\n abstract listFormParameters(formName: string): Promise<FlowCatalogParameter[]>;\n\n /** `GET /catalog/enum-types` — per `objectType` delle risorse `Enum`. */\n abstract listEnumTypes(): Promise<FlowCatalogEntry[]>;\n\n /** `GET /catalog/events` — per gli eventi di un Wait. */\n abstract listEvents(): Promise<FlowCatalogEntry[]>;\n\n /**\n * `GET /flows/subflow-candidates?excluding=` — solo i flow con una versione attiva,\n * escluso quello corrente (§5.9).\n */\n abstract listSubflowCandidates(excluding?: string): Promise<FlowSummary[]>;\n\n // -------------------------------------------------------------------------\n // §6.5 Provare un flow dall'editor\n // -------------------------------------------------------------------------\n\n /**\n * `POST /interviews` — avvia. Ricorda: `status: 'Failed'` **non** e' un errore\n * di trasporto, e `debug: true` popola `trace` e `resources` con dati che\n * possono essere personali (§6.5).\n */\n startInterview(request: FlowStartInterviewRequest): Promise<FlowInterviewResult> {\n void request;\n return missing('startInterview');\n }\n\n /** `POST /interviews/screen` — il `continuationToken` va rimandato tale e quale (§13.12). */\n respondToScreen(request: FlowScreenResponseRequest): Promise<FlowInterviewResult> {\n void request;\n return missing('respondToScreen');\n }\n\n /** `POST /interviews/resume` — riprende un'esecuzione in pausa. */\n resumeInterview(request: FlowResumeRequest): Promise<FlowInterviewResult> {\n void request;\n return missing('resumeInterview');\n }\n\n /** `GET /interviews/{key}` — ispeziona una sospesa senza consumarla. */\n inspectInterview(interviewKey: string): Promise<FlowInterviewResult> {\n void interviewKey;\n return missing('inspectInterview');\n }\n\n /** `DELETE /interviews/{key}` — abbandona. */\n abandonInterview(interviewKey: string): Promise<void> {\n void interviewKey;\n return missing('abandonInterview');\n }\n}\n","/**\n * Implementazione HTTP dell'interfaccia {@link FlowBuilderApi}, sulle rotte proposte\n * dalla §6 di FRONTEND.md.\n *\n * I percorsi HTTP della specifica sono **una proposta**: le rotte definitive le decide\n * chi scrive i controller. Se le vostre differiscono, ci sono due strade e nessuna\n * tocca l'editor:\n * 1. estendere questa classe e sovrascrivere i soli metodi con rotta diversa;\n * 2. scrivere un'altra implementazione di `FlowBuilderApi` da zero.\n *\n * Qui vive l'unica conoscenza di HTTP della libreria, incluso il compito di tradurre\n * status e payload in {@link FlowApiError} categorizzati (§10).\n */\n\nimport { HttpClient, HttpErrorResponse, HttpParams } from '@angular/common/http';\nimport { InjectionToken, inject } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\n\nimport { FlowBuilderApi } from './flow-builder-api';\nimport {\n FlowCatalogEntry,\n FlowCatalogParameter,\n FlowDictionaries,\n FlowFieldUsage,\n FlowFieldValue,\n FlowObjectDescription,\n FlowObjectSummary,\n} from '../model/dictionary.model';\nimport {\n FlowCloneRequest,\n FlowConnectorTarget,\n FlowCreateRequest,\n FlowExportQuery,\n FlowInterviewResult,\n FlowListQuery,\n FlowNewVersionRequest,\n FlowOutline,\n FlowReference,\n FlowReferenceQuery,\n FlowResumeRequest,\n FlowSaveRequest,\n FlowSaveResult,\n FlowScreenResponseRequest,\n FlowStartInterviewRequest,\n FlowSummary,\n FlowValidationResult,\n FlowVersionSummary,\n} from '../model/api.model';\nimport { FlowDefinition } from '../model/flow.model';\nimport { FLOW_ERROR_FALLBACK_MESSAGE, FlowApiError, FlowErrorCategory } from '../model/error.model';\n\nexport interface FlowBuilderHttpConfig {\n /** Prefisso comune, es. `/api` o `https://host/api`. Senza slash finale. */\n baseUrl?: string;\n}\n\nexport const FLOW_BUILDER_HTTP_CONFIG = new InjectionToken<FlowBuilderHttpConfig>('FLOW_BUILDER_HTTP_CONFIG', {\n factory: () => ({ baseUrl: '/api' }),\n});\n\n/** Forma attesa del corpo di errore del backend. */\ninterface FlowErrorBody {\n category?: string;\n message?: string;\n validation?: FlowValidationResult;\n conflictingAuthor?: string;\n updatedBy?: string;\n}\n\n/** Ricava la categoria dallo status quando il corpo non la dichiara (§10). */\nfunction categoryFromStatus(status: number): FlowErrorCategory {\n switch (status) {\n case 400:\n return 'InvalidRequest';\n case 404:\n return 'FlowNotFound';\n case 409:\n return 'VersionConflict';\n case 422:\n return 'ValidationFailed';\n case 501:\n return 'MissingService';\n default:\n return 'Unknown';\n }\n}\n\nexport class HttpFlowBuilderApi extends FlowBuilderApi {\n private readonly http = inject(HttpClient);\n private readonly config = inject(FLOW_BUILDER_HTTP_CONFIG);\n\n protected url(path: string): string {\n return `${this.config.baseUrl ?? ''}${path}`;\n }\n\n /** Punto unico in cui un errore di trasporto diventa un errore di dominio. */\n protected async request<T>(call: Promise<T>): Promise<T> {\n try {\n return await call;\n } catch (error) {\n throw this.toApiError(error);\n }\n }\n\n protected toApiError(error: unknown): FlowApiError {\n if (FlowApiError.is(error)) {\n return error;\n }\n if (error instanceof HttpErrorResponse) {\n const body: FlowErrorBody = (error.error ?? {}) as FlowErrorBody;\n const category: FlowErrorCategory = body.category ?? categoryFromStatus(error.status);\n const message = body.message ?? FLOW_ERROR_FALLBACK_MESSAGE[category] ?? error.message;\n return new FlowApiError(\n category,\n message,\n body.validation,\n body.conflictingAuthor ?? body.updatedBy,\n error.error,\n );\n }\n const message = error instanceof Error ? error.message : String(error);\n return new FlowApiError('Unknown', message, undefined, undefined, error);\n }\n\n private get<T>(path: string, params?: HttpParams): Promise<T> {\n return this.request(firstValueFrom(this.http.get<T>(this.url(path), { params })));\n }\n\n private post<T>(path: string, body?: unknown, params?: HttpParams): Promise<T> {\n return this.request(firstValueFrom(this.http.post<T>(this.url(path), body ?? {}, { params })));\n }\n\n private put<T>(path: string, body?: unknown): Promise<T> {\n return this.request(firstValueFrom(this.http.put<T>(this.url(path), body ?? {})));\n }\n\n private del<T>(path: string): Promise<T> {\n return this.request(firstValueFrom(this.http.delete<T>(this.url(path))));\n }\n\n private static params(values: Record<string, string | number | boolean | undefined>): HttpParams {\n let params = new HttpParams();\n for (const [key, value] of Object.entries(values)) {\n if (value !== undefined && value !== null && value !== '') {\n params = params.set(key, String(value));\n }\n }\n return params;\n }\n\n private static segment(value: string): string {\n return encodeURIComponent(value);\n }\n\n // ---------------------------------------------------------------- §6.1\n\n listFlows(query?: FlowListQuery): Promise<FlowSummary[]> {\n return this.get<FlowSummary[]>('/flows', HttpFlowBuilderApi.params({ ...query }));\n }\n\n listVersions(flowName: string): Promise<FlowVersionSummary[]> {\n return this.get<FlowVersionSummary[]>(`/flows/${HttpFlowBuilderApi.segment(flowName)}/versions`);\n }\n\n loadFlow(flowName: string, version?: number): Promise<FlowDefinition> {\n return this.get<FlowDefinition>(\n `/flows/${HttpFlowBuilderApi.segment(flowName)}`,\n HttpFlowBuilderApi.params({ version }),\n );\n }\n\n override exportFlow(flowName: string, query?: FlowExportQuery): Promise<string> {\n return this.request(\n firstValueFrom(\n this.http.get(this.url(`/flows/${HttpFlowBuilderApi.segment(flowName)}/export`), {\n params: HttpFlowBuilderApi.params({ ...query }),\n responseType: 'text',\n }),\n ),\n );\n }\n\n override parseFlow(definition: unknown): Promise<FlowDefinition> {\n return this.post<FlowDefinition>('/flows/parse', definition);\n }\n\n // ---------------------------------------------------------------- §6.2\n\n createFlow(request: FlowCreateRequest): Promise<FlowSaveResult> {\n return this.post<FlowSaveResult>('/flows', request);\n }\n\n saveFlow(flowName: string, request: FlowSaveRequest): Promise<FlowSaveResult> {\n return this.put<FlowSaveResult>(`/flows/${HttpFlowBuilderApi.segment(flowName)}`, request);\n }\n\n createVersion(flowName: string, request?: FlowNewVersionRequest): Promise<FlowSaveResult> {\n return this.post<FlowSaveResult>(`/flows/${HttpFlowBuilderApi.segment(flowName)}/versions`, { author: request?.author }, HttpFlowBuilderApi.params({ from: request?.from }));\n }\n\n override cloneFlow(flowName: string, request: FlowCloneRequest): Promise<FlowSaveResult> {\n return this.post<FlowSaveResult>(`/flows/${HttpFlowBuilderApi.segment(flowName)}/clone`, request);\n }\n\n activateVersion(flowName: string, version: number): Promise<FlowSaveResult> {\n return this.post<FlowSaveResult>(`/flows/${HttpFlowBuilderApi.segment(flowName)}/versions/${version}/activate`);\n }\n\n deactivateFlow(flowName: string): Promise<void> {\n return this.post<void>(`/flows/${HttpFlowBuilderApi.segment(flowName)}/deactivate`);\n }\n\n override deleteVersion(flowName: string, version: number): Promise<void> {\n return this.del<void>(`/flows/${HttpFlowBuilderApi.segment(flowName)}/versions/${version}`);\n }\n\n override deleteFlow(flowName: string): Promise<void> {\n return this.del<void>(`/flows/${HttpFlowBuilderApi.segment(flowName)}`);\n }\n\n // ---------------------------------------------------------------- §6.3\n\n validateDefinition(definition: FlowDefinition): Promise<FlowValidationResult> {\n return this.post<FlowValidationResult>('/flows/validate', definition);\n }\n\n override validateVersion(flowName: string, version: number): Promise<FlowValidationResult> {\n return this.get<FlowValidationResult>(`/flows/${HttpFlowBuilderApi.segment(flowName)}/versions/${version}/validate`);\n }\n\n // ---------------------------------------------------------------- §6.4\n\n getDictionaries(): Promise<FlowDictionaries> {\n return this.get<FlowDictionaries>('/flows/dictionaries');\n }\n\n getReferences(query: FlowReferenceQuery): Promise<FlowReference[]> {\n return this.post<FlowReference[]>('/flows/references', query);\n }\n\n getWritableReferences(query: FlowReferenceQuery): Promise<FlowReference[]> {\n return this.post<FlowReference[]>('/flows/references/writable', query);\n }\n\n getConnectorTargets(definition: FlowDefinition, excluding?: string): Promise<FlowConnectorTarget[]> {\n return this.post<FlowConnectorTarget[]>('/flows/connector-targets', definition, HttpFlowBuilderApi.params({ excluding }));\n }\n\n getOutline(definition: FlowDefinition): Promise<FlowOutline> {\n return this.post<FlowOutline>('/flows/outline', definition);\n }\n\n listObjects(): Promise<FlowObjectSummary[]> {\n return this.get<FlowObjectSummary[]>('/catalog/objects');\n }\n\n override describeObject(object: string): Promise<FlowObjectDescription> {\n return this.get<FlowObjectDescription>(`/schema/${HttpFlowBuilderApi.segment(object)}`);\n }\n\n listFields(object: string, usage?: FlowFieldUsage): Promise<FlowObjectDescription['fields']> {\n return this.get<FlowObjectDescription['fields']>(`/schema/${HttpFlowBuilderApi.segment(object)}/fields`, HttpFlowBuilderApi.params({ usage }));\n }\n\n override listFieldValues(object: string, field: string): Promise<FlowFieldValue[]> {\n return this.get<FlowFieldValue[]>(`/schema/${HttpFlowBuilderApi.segment(object)}/fields/${HttpFlowBuilderApi.segment(field)}/values`);\n }\n\n listActionTypes(): Promise<FlowCatalogEntry[]> {\n return this.get<FlowCatalogEntry[]>('/catalog/action-types');\n }\n\n listActions(actionType?: string): Promise<FlowCatalogEntry[]> {\n return this.get<FlowCatalogEntry[]>('/catalog/actions', HttpFlowBuilderApi.params({ type: actionType }));\n }\n\n listActionParameters(actionType: string, actionName: string): Promise<FlowCatalogParameter[]> {\n return this.get<FlowCatalogParameter[]>(`/catalog/actions/${HttpFlowBuilderApi.segment(actionType)}/${HttpFlowBuilderApi.segment(actionName)}/parameters`);\n }\n\n listScripts(): Promise<FlowCatalogEntry[]> {\n return this.get<FlowCatalogEntry[]>('/catalog/scripts');\n }\n\n listScriptParameters(scriptName: string): Promise<FlowCatalogParameter[]> {\n return this.get<FlowCatalogParameter[]>(`/catalog/scripts/${HttpFlowBuilderApi.segment(scriptName)}/parameters`);\n }\n\n listForms(): Promise<FlowCatalogEntry[]> {\n return this.get<FlowCatalogEntry[]>('/catalog/forms');\n }\n\n listFormParameters(formName: string): Promise<FlowCatalogParameter[]> {\n return this.get<FlowCatalogParameter[]>(`/catalog/forms/${HttpFlowBuilderApi.segment(formName)}/parameters`);\n }\n\n listEnumTypes(): Promise<FlowCatalogEntry[]> {\n return this.get<FlowCatalogEntry[]>('/catalog/enum-types');\n }\n\n listEvents(): Promise<FlowCatalogEntry[]> {\n return this.get<FlowCatalogEntry[]>('/catalog/events');\n }\n\n listSubflowCandidates(excluding?: string): Promise<FlowSummary[]> {\n return this.get<FlowSummary[]>('/flows/subflow-candidates', HttpFlowBuilderApi.params({ excluding }));\n }\n\n // ---------------------------------------------------------------- §6.5\n\n override startInterview(request: FlowStartInterviewRequest): Promise<FlowInterviewResult> {\n return this.post<FlowInterviewResult>('/interviews', request);\n }\n\n override respondToScreen(request: FlowScreenResponseRequest): Promise<FlowInterviewResult> {\n return this.post<FlowInterviewResult>('/interviews/screen', request);\n }\n\n override resumeInterview(request: FlowResumeRequest): Promise<FlowInterviewResult> {\n return this.post<FlowInterviewResult>('/interviews/resume', request);\n }\n\n override inspectInterview(interviewKey: string): Promise<FlowInterviewResult> {\n return this.get<FlowInterviewResult>(`/interviews/${HttpFlowBuilderApi.segment(interviewKey)}`);\n }\n\n override abandonInterview(interviewKey: string): Promise<void> {\n return this.del<void>(`/interviews/${HttpFlowBuilderApi.segment(interviewKey)}`);\n }\n}\n","/**\n * Le uscite di ogni tipo di elemento — FRONTEND.md §3.5.\n *\n * Un connector e' sempre `{ targetReference, isGoTo }`. Quello che cambia e' **in quale\n * campo** vive, e il campo dipende dal tipo di elemento. Questo file e' l'unica sede di\n * quella mappa: canvas, inspector e outline locale la leggono da qui, invece di ripetere\n * `node['faultConnector']` in venti punti.\n *\n * Ogni uscita e' descritta da una chiave stabile piu' due accessori. La chiave finisce\n * nell'id del connettore sul canvas (`out:<node>:<key>`), quindi deve restare uguale fra\n * un render e l'altro: per i rami indicizzati (regole, eventi, scheduled path) usa\n * l'**indice** dentro la chiave.\n *\n * Nota: `Transform.connector` e' un array e `start` e' un array di uno, entrambi per\n * fedelta' storica; gli accessori qui sotto lo nascondono al resto della libreria.\n */\n\nimport {\n FlowAnyNode,\n FlowConnector,\n FlowDecision,\n FlowElementType,\n FlowNodeCollection,\n FlowStart,\n FlowTransform,\n FlowWait,\n} from '../model/flow.model';\nimport { FlowConnectionKind } from '../model/api.model';\n\n/** Nome fittizio dello Start sul canvas: nel documento non ha `name` (§6.4, `from: null`). */\nexport const START_NODE_NAME = '$start';\n\nexport interface FlowOutlet {\n /** Stabile fra i render: entra nell'id del connettore del canvas. */\n key: string;\n /** Determina lo stile dell'arco: `Fault` rosso, `Rule` etichettato, … (§6.4). */\n kind: FlowConnectionKind;\n /** Etichetta mostrata sul connettore e nel form. */\n label: string;\n /** Etichetta di ramo definita dall'autore (label della regola, dell'evento). */\n branchLabel?: string | null;\n /**\n * `true` → l'assenza del connector e' un problema strutturale, non la fine legittima\n * di un percorso: il corpo di un Loop (§3.5).\n */\n isStructural?: boolean;\n read(node: FlowAnyNode): FlowConnector | undefined;\n write(node: FlowAnyNode, connector: FlowConnector | undefined): void;\n}\n\n/** Accessore per un connector che vive in un campo diretto del node. */\nfunction field(\n key: string,\n kind: FlowConnectionKind,\n label: string,\n property: string,\n extra?: Partial<FlowOutlet>,\n): FlowOutlet {\n return {\n key,\n kind,\n label,\n read: (node) => node[property] as FlowConnector | undefined,\n write: (node, connector) => {\n if (connector) {\n node[property] = connector;\n } else {\n delete node[property];\n }\n },\n ...extra,\n };\n}\n\n/** Accessore per un connector dentro un elemento di array (`rules[i].connector`). */\nfunction nested(\n key: string,\n kind: FlowConnectionKind,\n label: string,\n arrayProperty: string,\n index: number,\n branchLabel?: string | null,\n): FlowOutlet {\n return {\n key,\n kind,\n label,\n branchLabel,\n read: (node) => {\n const list = node[arrayProperty] as Array<{ connector?: FlowConnector }> | undefined;\n return list?.[index]?.connector;\n },\n write: (node, connector) => {\n const list = node[arrayProperty] as Array<{ connector?: FlowConnector }> | undefined;\n const item = list?.[index];\n if (!item) {\n return;\n }\n if (connector) {\n item.connector = connector;\n } else {\n delete item.connector;\n }\n },\n };\n}\n\n/** `Transform.connector` e' un array: usa il primo (§3.5). */\nfunction transformOutlet(): FlowOutlet {\n return {\n key: 'next',\n kind: 'Next',\n label: 'Successivo',\n read: (node) => (node as FlowTransform).connector?.[0],\n write: (node, connector) => {\n const transform = node as FlowTransform;\n if (connector) {\n transform.connector = [connector];\n } else {\n delete transform.connector;\n }\n },\n };\n}\n\n/**\n * Le uscite di un node, nell'ordine in cui vanno mostrate.\n * `type` e' il discriminatore di `elementTypes`; per lo Start passa `'Start'`.\n */\nexport function outletsOf(type: FlowElementType, node: FlowAnyNode): FlowOutlet[] {\n switch (type) {\n case 'Start': {\n const start = node as FlowStart;\n const outlets: FlowOutlet[] = [\n field('next', 'Start', 'Inizio', 'connector', {\n // Senza, `START_NO_ENTRY_POINT`: e' strutturale (§3.4).\n isStructural: true,\n }),\n ];\n (start.scheduledPaths ?? []).forEach((path, index) => {\n outlets.push(\n nested(\n `scheduledPath:${index}`,\n 'ScheduledPath',\n path.label || path.name || `Percorso differito ${index + 1}`,\n 'scheduledPaths',\n index,\n path.label ?? path.name ?? null,\n ),\n );\n });\n return outlets;\n }\n\n case 'Decision': {\n const decision = node as FlowDecision;\n const outlets: FlowOutlet[] = (decision.rules ?? []).map((rule, index) =>\n nested(\n `rule:${index}`,\n 'Rule',\n rule.label || rule.name || `Regola ${index + 1}`,\n 'rules',\n index,\n rule.label ?? rule.name ?? null,\n ),\n );\n outlets.push(\n field('default', 'Default', decision.defaultConnectorLabel || 'Nessuna regola vera', 'defaultConnector', {\n branchLabel: decision.defaultConnectorLabel ?? null,\n }),\n );\n return outlets;\n }\n\n case 'Loop':\n return [\n // Senza corpo il ciclo non ha senso: la validazione lo segnala come errore (§3.5).\n field('loopNext', 'LoopNext', 'Per ogni valore', 'nextValueConnector', { isStructural: true }),\n field('loopEnd', 'LoopEnd', 'Nessun valore rimasto', 'noMoreValuesConnector'),\n ];\n\n case 'Wait': {\n const wait = node as FlowWait;\n const outlets: FlowOutlet[] = (wait.waitEvents ?? []).map((event, index) =>\n nested(\n `waitEvent:${index}`,\n 'WaitEvent',\n event.label || event.name || `Evento ${index + 1}`,\n 'waitEvents',\n index,\n event.label ?? event.name ?? null,\n ),\n );\n outlets.push(\n field('default', 'Default', wait.defaultConnectorLabel || 'Nessun evento verificato', 'defaultConnector', {\n branchLabel: wait.defaultConnectorLabel ?? null,\n }),\n );\n outlets.push(field('fault', 'Fault', 'Errore', 'faultConnector'));\n return outlets;\n }\n\n case 'ActionCall': {\n const outlets: FlowOutlet[] = [\n field('next', 'Next', 'Successivo', 'connector'),\n field('fault', 'Fault', 'Errore', 'faultConnector'),\n ];\n // Il ramo di timeout esiste solo con `timeoutPathUsage: 'EnableTimeoutPath'` (§5.8).\n if (node['timeoutPathUsage'] === 'EnableTimeoutPath' || node['timeoutConnector']) {\n outlets.push(field('timeout', 'Timeout', 'Timeout', 'timeoutConnector'));\n }\n return outlets;\n }\n\n case 'ScriptCall':\n case 'RecordLookup':\n case 'RecordCreate':\n case 'RecordUpdate':\n case 'RecordDelete':\n return [\n field('next', 'Next', 'Successivo', 'connector'),\n field('fault', 'Fault', 'Errore', 'faultConnector'),\n ];\n\n case 'Transform':\n return [transformOutlet()];\n\n // Il Custom Error interrompe l'esecuzione: non ha uscite (§5.11).\n case 'CustomError':\n return [];\n\n case 'Screen':\n case 'Assignment':\n case 'CollectionProcessor':\n case 'RecordRollback':\n case 'Subflow':\n return [field('next', 'Next', 'Successivo', 'connector')];\n\n default:\n // Tipo sconosciuto o non supportato: se ha un `connector`, mostralo comunque,\n // altrimenti nessuna uscita. Non inventare rami.\n return node['connector'] ? [field('next', 'Next', 'Successivo', 'connector')] : [];\n }\n}\n\n/** Trova un'uscita per chiave. */\nexport function outletByKey(type: FlowElementType, node: FlowAnyNode, key: string): FlowOutlet | undefined {\n return outletsOf(type, node).find((outlet) => outlet.key === key);\n}\n\n/**\n * Mappa di fallback tipo → collection, usata quando il dizionario `elementTypes` non e'\n * disponibile. La fonte autoritativa resta `metadataProperty` del dizionario (§3.2).\n */\nexport const FALLBACK_COLLECTION_BY_TYPE: Record<string, FlowNodeCollection> = {\n Screen: 'screens',\n Assignment: 'assignments',\n Decision: 'decisions',\n Loop: 'loops',\n CollectionProcessor: 'collectionProcessors',\n CustomError: 'customErrors',\n Wait: 'waits',\n RecordLookup: 'recordLookups',\n RecordCreate: 'recordCreates',\n RecordUpdate: 'recordUpdates',\n RecordDelete: 'recordDeletes',\n RecordRollback: 'recordRollbacks',\n ActionCall: 'actionCalls',\n ScriptCall: 'scriptPluginCalls',\n Subflow: 'subflows',\n Transform: 'transforms',\n Step: 'steps',\n Experiment: 'experiments',\n OrchestratedStage: 'orchestratedStages',\n};\n\n/** Inverso della mappa: serve al flatten in lettura (§3.1). */\nexport const TYPE_BY_COLLECTION: Record<string, FlowElementType> = Object.fromEntries(\n Object.entries(FALLBACK_COLLECTION_BY_TYPE).map(([type, collection]) => [collection, type]),\n);\n\n/** Etichette di fallback, se il dizionario non e' caricato. */\nexport const FALLBACK_TYPE_LABEL: Record<string, string> = {\n Screen: 'Screen',\n Assignment: 'Assegnazione',\n Decision: 'Decisione',\n Loop: 'Ciclo',\n CollectionProcessor: 'Ordina o filtra',\n CustomError: 'Errore custom',\n Wait: 'Attesa',\n RecordLookup: 'Get Records',\n RecordCreate: 'Create Records',\n RecordUpdate: 'Update Records',\n RecordDelete: 'Delete Records',\n RecordRollback: 'Roll Back Records',\n ActionCall: 'Action',\n ScriptCall: 'Script',\n Subflow: 'Subflow',\n Transform: 'Trasformazione',\n Step: 'Segnaposto',\n Experiment: 'Esperimento',\n OrchestratedStage: 'Stage di orchestrazione',\n};\n\n/** I tre tipi che il motore rifiuta: nascosti dalla palette (§3.2, §13.9). */\nexport const UNSUPPORTED_TYPES: ReadonlySet<string> = new Set(['Step', 'Experiment', 'OrchestratedStage']);\n\n/** Elementi che espongono il proprio risultato sotto il nome dell'elemento (§4.5). */\nexport const TYPES_WITH_AUTOMATIC_OUTPUT: ReadonlySet<string> = new Set([\n 'RecordLookup',\n 'RecordCreate',\n 'CollectionProcessor',\n 'Transform',\n 'ActionCall',\n 'Subflow',\n]);\n","/**\n * Il glifo di ogni tipo di elemento.\n *\n * Sono caratteri Unicode, non icone: la libreria non porta asset e non dipende da un font di\n * icone dell'applicazione ospite. Sta in `core` e non nel canvas perche' lo stesso glifo deve\n * comparire sulla palette e sul node: se divergessero, l'elemento trascinato non\n * assomiglierebbe a quello che compare sul canvas.\n */\n\nexport const FLOW_ELEMENT_ICONS: Record<string, string> = {\n Start: '▶',\n Screen: '▤',\n Decision: '◆',\n Assignment: '=',\n Loop: '↻',\n CollectionProcessor: '⇅',\n RecordLookup: '⌕',\n RecordCreate: '+',\n RecordUpdate: '✎',\n RecordDelete: '×',\n RecordRollback: '↺',\n ActionCall: '⚡',\n ScriptCall: '⟨⟩',\n Subflow: '⤵',\n Transform: '⇄',\n Wait: '◷',\n CustomError: '!',\n};\n\n/**\n * Il glifo del tipo. Per un tipo che il dizionario del backend aggiunge e questa mappa non\n * conosce, l'iniziale dell'etichetta e' un segnaposto migliore di un simbolo generico.\n */\nexport function elementIcon(type: string, label?: string): string {\n const icon = FLOW_ELEMENT_ICONS[type];\n if (icon) {\n return icon;\n }\n const fallback = (label || type).trim().charAt(0).toUpperCase();\n return fallback || '•';\n}\n","/**\n * Nomi — FRONTEND.md §3.3, §13.5.\n *\n * Tre regole, tutte e tre implementate qui:\n * 1. `^[A-Za-z][A-Za-z0-9_]*$` — niente punti (i riferimenti si spezzano sul punto),\n * niente spazi, niente `$`;\n * 2. node e risorse condividono **un unico** spazio di nomi;\n * 3. il confronto e' **case-insensitive**.\n */\n\nexport const FLOW_NAME_PATTERN = /^[A-Za-z][A-Za-z0-9_]*$/;\n\nexport type FlowNameProblem = 'empty' | 'pattern' | 'duplicate';\n\nexport interface FlowNameCheck {\n isValid: boolean;\n problem?: FlowNameProblem;\n message?: string;\n}\n\n/** Verifica solo la forma. */\nexport function isValidFlowName(name: string | undefined | null): boolean {\n return !!name && FLOW_NAME_PATTERN.test(name);\n}\n\n/**\n * Verifica forma **e** unicita' contro l'insieme dei nomi già usati.\n * `currentName` esclude se stesso dal controllo, per non segnalare un elemento in modifica.\n */\nexport function checkFlowName(\n name: string | undefined | null,\n usedNames: Iterable<string>,\n currentName?: string | null,\n): FlowNameCheck {\n const trimmed = (name ?? '').trim();\n if (!trimmed) {\n return { isValid: false, problem: 'empty', message: 'Il nome tecnico e’ obbligatorio.' };\n }\n if (!FLOW_NAME_PATTERN.test(trimmed)) {\n return {\n isValid: false,\n problem: 'pattern',\n message: 'Deve iniziare con una lettera e contenere solo lettere, cifre e underscore.',\n };\n }\n const lower = trimmed.toLowerCase();\n const currentLower = currentName?.trim().toLowerCase();\n for (const used of usedNames) {\n const usedLower = used.toLowerCase();\n if (usedLower === lower && usedLower !== currentLower) {\n // Il confronto e' case-insensitive: `Importo` e `importo` sono lo stesso nome.\n return {\n isValid: false,\n problem: 'duplicate',\n message: 'Questo nome e’ già usato da un altro elemento o da una risorsa.',\n };\n }\n }\n return { isValid: true };\n}\n\n/**\n * Genera il nome tecnico da una label: `\"Approva ordine\"` → `Approva_Ordine` (§3.3).\n * Va lasciato modificabile finche' l'elemento e' nuovo.\n */\nexport function slugifyFlowName(label: string | undefined | null): string {\n const source = (label ?? '').trim();\n if (!source) {\n return '';\n }\n const words = source\n // Toglie i diacritici: `Città` → `Citta`.\n .normalize('NFD')\n .replace(/\\p{Diacritic}/gu, '')\n .split(/[^A-Za-z0-9]+/)\n .filter(Boolean)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1));\n let name = words.join('_');\n if (!name) {\n return '';\n }\n // Deve iniziare con una lettera.\n if (!/^[A-Za-z]/.test(name)) {\n name = `X_${name}`;\n }\n return name;\n}\n\n/**\n * Genera un nome libero a partire da una base, aggiungendo un suffisso numerico.\n * `Decisione`, `Decisione_1`, `Decisione_2`, …\n */\nexport function uniqueFlowName(base: string, usedNames: Iterable<string>): string {\n const used = new Set(Array.from(usedNames, (name) => name.toLowerCase()));\n const root = slugifyFlowName(base) || 'Elemento';\n if (!used.has(root.toLowerCase())) {\n return root;\n }\n let index = 1;\n while (used.has(`${root}_${index}`.toLowerCase())) {\n index += 1;\n }\n return `${root}_${index}`;\n}\n\n/**\n * La prima parte di un riferimento, cioe' il nome che deve esistere.\n * `Cliente.Email` → `Cliente`; `$Record.Stato` → `$Record`; `Importo` → `Importo`.\n */\nexport function referenceRoot(reference: string | undefined | null): string {\n const value = (reference ?? '').trim();\n const dot = value.indexOf('.');\n return dot < 0 ? value : value.slice(0, dot);\n}\n\n/** `true` se il riferimento e' una variabile globale (`$Record`, `$Flow`, `$User`, …). */\nexport function isGlobalReference(reference: string | undefined | null): boolean {\n return (reference ?? '').trimStart().startsWith('$');\n}\n","/**\n * `conditionLogic` — FRONTEND.md §4.3 e trappola §13.4.\n *\n * L'espressione custom referenzia gli **indici 1-based** delle condizioni. Se l'editor\n * cancella o riordina una condizione, gli indici scalano e l'espressione va riscritta:\n * senza, si ottiene un `CONDITION_LOGIC_INVALID` o — peggio — un'espressione valida che\n * punta alla condizione sbagliata.\n */\n\nimport { FlowConditionHolder, FlowConditionLogic } from '../model/flow.model';\n\n/** Le tre forme non-espressione. `and` e' anche il default quando il campo e' assente. */\nexport function isCustomConditionLogic(logic: FlowConditionLogic | undefined): boolean {\n if (!logic) {\n return false;\n }\n const normalized = logic.trim().toLowerCase();\n return normalized !== 'and' && normalized !== 'or' && normalized !== 'formula';\n}\n\n/**\n * Riscrive un'espressione custom dopo che le condizioni sono state rimappate.\n *\n * `mapping[oldIndex0Based]` = nuovo indice 0-based, oppure `-1` se la condizione e' stata\n * cancellata. Un indice cancellato non puo' essere rimpiazzato da niente di sensato: il\n * termine viene sostituito da un segnaposto e la funzione lo segnala, così la UI puo'\n * avvisare che l'espressione va rivista.\n */\nexport function remapConditionLogic(\n logic: string,\n mapping: number[],\n): { logic: string; hasDroppedTerms: boolean } {\n let hasDroppedTerms = false;\n const rewritten = logic.replace(/\\d+/g, (match) => {\n const oldIndex = Number(match) - 1;\n const newIndex = mapping[oldIndex];\n if (newIndex === undefined || newIndex < 0) {\n hasDroppedTerms = true;\n // Segnaposto riconoscibile: la UI lo evidenzia e chiede di correggere.\n return '?';\n }\n return String(newIndex + 1);\n });\n return { logic: rewritten, hasDroppedTerms };\n}\n\n/**\n * Rimuove la condizione all'indice indicato e aggiorna `conditionLogic` di conseguenza.\n * Muta l'oggetto passato (che nello store e' già una copia di lavoro).\n */\nexport function removeCondition(holder: FlowConditionHolder, index: number): { hasDroppedTerms: boolean } {\n const conditions = holder.conditions ?? [];\n if (index < 0 || index >= conditions.length) {\n return { hasDroppedTerms: false };\n }\n conditions.splice(index, 1);\n\n if (!isCustomConditionLogic(holder.conditionLogic)) {\n return { hasDroppedTerms: false };\n }\n // Le condizioni dopo quella cancellata scalano di uno; quella cancellata → -1.\n const mapping: number[] = [];\n for (let position = 0; position <= conditions.length; position += 1) {\n if (position < index) {\n mapping.push(position);\n } else if (position === index) {\n mapping.push(-1);\n } else {\n mapping.push(position - 1);\n }\n }\n const result = remapConditionLogic(holder.conditionLogic as string, mapping);\n holder.conditionLogic = result.logic;\n return { hasDroppedTerms: result.hasDroppedTerms };\n}\n\n/** Sposta una condizione e riscrive l'espressione perche' punti agli stessi termini. */\nexport function moveCondition(holder: FlowConditionHolder, from: number, to: number): void {\n const conditions = holder.conditions ?? [];\n if (from === to || from < 0 || to < 0 || from >= conditions.length || to >= conditions.length) {\n return;\n }\n const [moved] = conditions.splice(from, 1);\n conditions.splice(to, 0, moved);\n\n if (!isCustomConditionLogic(holder.conditionLogic)) {\n return;\n }\n // Ricostruisce dove e' finito ogni vecchio indice.\n const order: number[] = [];\n for (let index = 0; index < conditions.length; index += 1) {\n order.push(index);\n }\n const oldOrder = order.slice();\n const [movedIndex] = oldOrder.splice(to, 1);\n oldOrder.splice(from, 0, movedIndex);\n // `oldOrder[oldIndex] = newIndex`\n const mapping: number[] = [];\n oldOrder.forEach((newIndex, oldIndex) => {\n mapping[oldIndex] = newIndex;\n });\n holder.conditionLogic = remapConditionLogic(holder.conditionLogic as string, mapping).logic;\n}\n\n/**\n * Verifica che un'espressione custom sia sintatticamente accettabile e che ogni indice\n * esista. Serve al feedback immediato nel form: la verita' resta della validazione\n * del backend (`CONDITION_LOGIC_INVALID`).\n */\nexport function checkConditionLogic(logic: string, conditionCount: number): string | null {\n const trimmed = logic.trim();\n if (!trimmed) {\n return null;\n }\n if (!isCustomConditionLogic(trimmed)) {\n return null;\n }\n // Caratteri ammessi: indici, AND, OR, NOT, parentesi, spazi.\n const stripped = trimmed.replace(/\\b(AND|OR|NOT)\\b/gi, ' ').replace(/[()\\s]/g, '');\n if (/[^0-9]/.test(stripped)) {\n return 'Ammessi solo indici, AND, OR, NOT e parentesi.';\n }\n let depth = 0;\n for (const character of trimmed) {\n if (character === '(') {\n depth += 1;\n } else if (character === ')') {\n depth -= 1;\n if (depth < 0) {\n return 'Parentesi non bilanciate.';\n }\n }\n }\n if (depth !== 0) {\n return 'Parentesi non bilanciate.';\n }\n const indexes = trimmed.match(/\\d+/g) ?? [];\n if (indexes.length === 0) {\n return 'L’espressione non referenzia nessuna condizione.';\n }\n for (const raw of indexes) {\n const index = Number(raw);\n if (index < 1 || index > conditionCount) {\n return `La condizione ${index} non esiste: sono definite ${conditionCount} condizioni.`;\n }\n }\n return null;\n}\n","/**\n * Lo store del documento in lavorazione.\n *\n * Il documento `FlowDefinition` e' la fonte di verita' unica: canvas, inspector e pannelli\n * leggono da qui e scrivono qui. Le primitive del backend non vengono chiamate da questo\n * store — se ne occupano i pannelli tramite {@link FlowBuilderApi} — così l'editing resta\n * sincrono e reattivo anche mentre una validazione e' in volo.\n *\n * Il flatten delle collection (§3.1) e la mappa delle uscite (§3.5) sono esposti come\n * signal derivati: e' cio' che rende il canvas una funzione del documento.\n */\n\nimport { Injectable, computed, signal } from '@angular/core';\n\nimport {\n FLOW_NODE_COLLECTIONS,\n FLOW_RESOURCE_COLLECTIONS,\n FlowAnyNode,\n FlowConnector,\n FlowDefinition,\n FlowElementType,\n FlowNodeCollection,\n FlowResourceCollection,\n FlowStart,\n} from '../model/flow.model';\nimport { FlowConnectionKind } from '../model/api.model';\nimport { FlowOutlet, START_NODE_NAME, TYPE_BY_COLLECTION, outletsOf } from './element-outlets';\n\n/** Un node come lo vede l'editor: il node piu' da dove viene. */\nexport interface FlowNodeRef {\n name: string;\n type: FlowElementType;\n collection: FlowNodeCollection;\n index: number;\n node: FlowAnyNode;\n}\n\n/** Un arco derivato dal documento, con la sua origine precisa. */\nexport interface FlowEdge {\n /** Id stabile: `<sorgente>|<chiave uscita>`. */\n id: string;\n /** `$start` per gli archi uscenti dallo Start. */\n from: string;\n /** `undefined` → il connector esiste ma non ha destinazione: ramo incompleto (§6.4). */\n to?: string;\n outletKey: string;\n kind: FlowConnectionKind;\n label?: string | null;\n isGoTo?: boolean;\n}\n\n/** Una risorsa come la vede l'editor. */\nexport interface FlowResourceRef {\n name: string;\n collection: FlowResourceCollection;\n index: number;\n resource: Record<string, unknown>;\n}\n\n/** Documento minimo per un flow nuovo (§11, \"Creare un flow\"). */\nexport function emptyFlowDefinition(fullName: string, label: string, processType: string): FlowDefinition {\n return {\n fullName,\n label,\n processType,\n // `start` con connector vuoto: il flow appena creato ha errori, ed e' normale (§11).\n start: [{ locationX: 60, locationY: 60 }],\n };\n}\n\n/** Copia profonda via JSON: il documento e' JSON per contratto (§2). */\nfunction clone<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nconst HISTORY_LIMIT = 100;\n\n@Injectable()\nexport class FlowDocumentStore {\n private readonly _document = signal<FlowDefinition>(emptyFlowDefinition('', '', 'Screen'));\n private readonly _isDirty = signal(false);\n private readonly _undoStack = signal<string[]>([]);\n private readonly _redoStack = signal<string[]>([]);\n\n /** Il documento in lavorazione. Sola lettura: si modifica con i metodi di questo store. */\n readonly document = this._document.asReadonly();\n readonly isDirty = this._isDirty.asReadonly();\n readonly canUndo = computed(() => this._undoStack().length > 0);\n readonly canRedo = computed(() => this._redoStack().length > 0);\n\n /** §3.4 — l'elemento Start: array di uno, usa sempre il primo. */\n readonly start = computed<FlowStart>(() => this._document().start?.[0] ?? {});\n\n /** §3.1 — tutte le collection appiattite in un'unica lista di node. */\n readonly nodes = computed<FlowNodeRef[]>(() => {\n const document = this._document();\n const result: FlowNodeRef[] = [];\n for (const collection of FLOW_NODE_COLLECTIONS) {\n const list = document[collection] as FlowAnyNode[] | undefined;\n list?.forEach((node, index) => {\n result.push({\n name: node.name ?? '',\n type: TYPE_BY_COLLECTION[collection] ?? collection,\n collection,\n index,\n node,\n });\n });\n }\n return result;\n });\n\n readonly nodeByName = computed<Map<string, FlowNodeRef>>(\n () => new Map(this.nodes().map((reference) => [reference.name, reference])),\n );\n\n readonly resources = computed<FlowResourceRef[]>(() => {\n const document = this._document();\n const result: FlowResourceRef[] = [];\n for (const collection of FLOW_RESOURCE_COLLECTIONS) {\n const list = document[collection] as Array<Record<string, unknown>> | undefined;\n list?.forEach((resource, index) => {\n result.push({\n name: (resource['name'] as string) ?? '',\n collection,\n index,\n resource,\n });\n });\n }\n return result;\n });\n\n /**\n * §3.3 — l'insieme dei nomi già usati: node **e** risorse, un unico spazio di nomi.\n * Il controllo di unicita' che guarda solo le variabili lascia passare una variabile\n * omonima di un node (§13.5).\n */\n readonly usedNames = computed<string[]>(() => [\n ...this.nodes().map((reference) => reference.name),\n ...this.resources().map((reference) => reference.name),\n ]);\n\n /** Gli archi derivati dal documento, Start incluso. */\n readonly edges = computed<FlowEdge[]>(() => {\n const edges: FlowEdge[] = [];\n const push = (from: string, node: FlowAnyNode, outlet: FlowOutlet) => {\n const connector = outlet.read(node);\n if (!connector) {\n return;\n }\n edges.push({\n id: `${from}|${outlet.key}`,\n from,\n to: connector.targetReference || undefined,\n outletKey: outlet.key,\n kind: outlet.kind,\n label: outlet.branchLabel ?? null,\n isGoTo: connector.isGoTo,\n });\n };\n\n const start = this.start() as FlowAnyNode;\n for (const outlet of outletsOf('Start', start)) {\n push(START_NODE_NAME, start, outlet);\n }\n for (const reference of this.nodes()) {\n for (const outlet of outletsOf(reference.type, reference.node)) {\n push(reference.name, reference.node, outlet);\n }\n }\n return edges;\n });\n\n /**\n * Raggiungibilita' calcolata localmente, per un feedback immediato mentre si disegna.\n * La fonte autoritativa resta `isReachable` di `POST /flows/outline` (§6.4): questa e'\n * un'anticipazione, non un sostituto.\n */\n readonly reachableNames = computed<ReadonlySet<string>>(() => {\n const adjacency = new Map<string, string[]>();\n for (const edge of this.edges()) {\n if (!edge.to) {\n continue;\n }\n const list = adjacency.get(edge.from) ?? [];\n list.push(edge.to);\n adjacency.set(edge.from, list);\n }\n const visited = new Set<string>();\n const queue = [START_NODE_NAME];\n while (queue.length) {\n const current = queue.shift() as string;\n for (const next of adjacency.get(current) ?? []) {\n if (!visited.has(next)) {\n visited.add(next);\n queue.push(next);\n }\n }\n }\n return visited;\n });\n\n // -------------------------------------------------------------------------\n // Caricamento e storico\n // -------------------------------------------------------------------------\n\n /** Carica un documento dal backend: azzera storico e flag di modifica. */\n load(definition: FlowDefinition): void {\n this._document.set(clone(definition));\n this._undoStack.set([]);\n this._redoStack.set([]);\n this._isDirty.set(false);\n }\n\n /** Dopo un salvataggio riuscito: il documento resta, la modifica non e' piu' pendente. */\n markSaved(): void {\n this._isDirty.set(false);\n }\n\n /**\n * Applica una modifica al documento.\n * Il mutatore riceve una **copia** e la modifica liberamente; lo store si occupa di\n * storico e di sostituire il riferimento (nuovo oggetto → i signal derivati ricalcolano).\n */\n update(mutate: (draft: FlowDefinition) => void, options?: { silent?: boolean }): void {\n const current = this._document();\n if (!options?.silent) {\n this.pushHistory(current);\n }\n const draft = clone(current);\n mutate(draft);\n this._document.set(draft);\n this._isDirty.set(true);\n }\n\n private pushHistory(snapshot: FlowDefinition): void {\n const serialized = JSON.stringify(snapshot);\n const stack = [...this._undoStack(), serialized];\n if (stack.length > HISTORY_LIMIT) {\n stack.shift();\n }\n this._undoStack.set(stack);\n this._redoStack.set([]);\n }\n\n undo(): void {\n const stack = [...this._undoStack()];\n const previous = stack.pop();\n if (!previous) {\n return;\n }\n this._redoStack.set([...this._redoStack(), JSON.stringify(this._document())]);\n this._undoStack.set(stack);\n this._document.set(JSON.parse(previous) as FlowDefinition);\n this._isDirty.set(true);\n }\n\n redo(): void {\n const stack = [...this._redoStack()];\n const next = stack.pop();\n if (!next) {\n return;\n }\n this._undoStack.set([...this._undoStack(), JSON.stringify(this._document())]);\n this._redoStack.set(stack);\n this._document.set(JSON.parse(next) as FlowDefinition);\n this._isDirty.set(true);\n }\n\n // -------------------------------------------------------------------------\n // Node\n // -------------------------------------------------------------------------\n\n /** Inserisce un node nella collection indicata dal dizionario (`metadataProperty`). */\n addNode(collection: FlowNodeCollection, node: FlowAnyNode): void {\n this.update((draft) => {\n const list = (draft[collection] as FlowAnyNode[] | undefined) ?? [];\n list.push(node);\n (draft as Record<string, unknown>)[collection] = list;\n });\n }\n\n /** Modifica un node per nome. Il mutatore riceve la copia di lavoro. */\n updateNode(name: string, mutate: (node: FlowAnyNode) => void, options?: { silent?: boolean }): void {\n const reference = this.nodeByName().get(name);\n if (!reference) {\n return;\n }\n this.update((draft) => {\n const list = draft[reference.collection] as FlowAnyNode[] | undefined;\n const node = list?.[reference.index];\n if (node) {\n mutate(node);\n }\n }, options);\n }\n\n /** Modifica lo Start. */\n updateStart(mutate: (start: FlowStart) => void, options?: { silent?: boolean }): void {\n this.update((draft) => {\n const list = draft.start ?? [{}];\n mutate(list[0]);\n draft.start = list;\n }, options);\n }\n\n /**\n * Sposta un node sul canvas. `silent` per non riempire lo storico durante il drag:\n * il chiamante registra un solo passo alla fine del gesto.\n */\n moveNode(name: string, x: number, y: number, options?: { silent?: boolean }): void {\n const rounded = { x: Math.round(x), y: Math.round(y) };\n if (name === START_NODE_NAME) {\n this.updateStart((start) => {\n start.locationX = rounded.x;\n start.locationY = rounded.y;\n }, options);\n return;\n }\n this.updateNode(\n name,\n (node) => {\n node.locationX = rounded.x;\n node.locationY = rounded.y;\n },\n options,\n );\n }\n\n /**\n * Rimuove un node **e** ogni connector che lo referenzia: un `targetReference` orfano\n * e' `CONNECTOR_TARGET_UNKNOWN`, cioe' un errore che blocca l'attivazione (§7).\n */\n removeNode(name: string): void {\n const reference = this.nodeByName().get(name);\n if (!reference) {\n return;\n }\n this.update((draft) => {\n const list = draft[reference.collection] as FlowAnyNode[] | undefined;\n list?.splice(reference.index, 1);\n if (list && list.length === 0) {\n delete (draft as Record<string, unknown>)[reference.collection];\n }\n FlowDocumentStore.clearReferencesTo(draft, name);\n });\n }\n\n /** Azzera i connector che puntano a un node scomparso, Start compreso. */\n private static clearReferencesTo(draft: FlowDefinition, removedName: string): void {\n const visit = (type: FlowElementType, node: FlowAnyNode) => {\n for (const outlet of outletsOf(type, node)) {\n const connector = outlet.read(node);\n if (connector?.targetReference === removedName) {\n // Il ramo resta, senza destinazione: e' un ramo incompleto, non un errore\n // di riferimento. La UI lo mostra come tale (§6.4, `to: null`).\n outlet.write(node, { ...connector, targetReference: undefined });\n }\n }\n };\n const start = draft.start?.[0];\n if (start) {\n visit('Start', start as FlowAnyNode);\n }\n for (const collection of FLOW_NODE_COLLECTIONS) {\n const list = draft[collection] as FlowAnyNode[] | undefined;\n const type = TYPE_BY_COLLECTION[collection] ?? collection;\n list?.forEach((node) => visit(type, node));\n }\n }\n\n /**\n * Rinomina un node riscrivendo **tutti** i riferimenti che lo raggiungono.\n * Nessuna primitiva del backend lo fa (§13.8): se l'editor offre la rinomina, la\n * riscrittura la deve fare lui. Copre `targetReference`, i riferimenti a risorsa e i\n * riferimenti a output automatico (`Vecchio.Campo` → `Nuovo.Campo`).\n */\n renameNode(oldName: string, newName: string): void {\n if (!oldName || !newName || oldName === newName) {\n return;\n }\n this.update((draft) => {\n const reference = this.nodeByName().get(oldName);\n if (reference) {\n const list = draft[reference.collection] as FlowAnyNode[] | undefined;\n const node = list?.[reference.index];\n if (node) {\n node.name = newName;\n }\n }\n FlowDocumentStore.rewriteReferences(draft, oldName, newName);\n });\n }\n\n /** Rinomina una risorsa, riscrivendo i riferimenti che la usano. */\n renameResource(collection: FlowResourceCollection, index: number, newName: string): void {\n this.update((draft) => {\n const list = draft[collection] as Array<Record<string, unknown>> | undefined;\n const resource = list?.[index];\n if (!resource) {\n return;\n }\n const oldName = resource['name'] as string;\n resource['name'] = newName;\n if (oldName) {\n FlowDocumentStore.rewriteReferences(draft, oldName, newName);\n }\n });\n }\n\n /**\n * Riscrive ogni occorrenza di un nome nei campi che contengono riferimenti.\n * Cammina l'intero documento: e' l'unico modo per non dimenticare un campo, dato che\n * i riferimenti compaiono in una ventina di posti diversi (§4).\n */\n private static rewriteReferences(draft: FlowDefinition, oldName: string, newName: string): void {\n /** Campi il cui valore e' un riferimento a risorsa o a node. */\n const referenceFields = new Set([\n 'targetReference',\n 'elementReference',\n 'assignToReference',\n 'leftValueReference',\n 'collectionReference',\n 'assignNextValueToReference',\n 'outputReference',\n 'inputReference',\n 'assignRecordIdToReference',\n ]);\n\n const rewrite = (value: string): string => {\n if (value === oldName) {\n return newName;\n }\n // Riferimento navigato: `Vecchio.Campo` → `Nuovo.Campo`.\n if (value.startsWith(`${oldName}.`)) {\n return `${newName}${value.slice(oldName.length)}`;\n }\n return value;\n };\n\n const walk = (value: unknown): void => {\n if (Array.isArray(value)) {\n value.forEach(walk);\n return;\n }\n if (!value || typeof value !== 'object') {\n return;\n }\n const record = value as Record<string, unknown>;\n for (const [key, child] of Object.entries(record)) {\n if (typeof child === 'string' && referenceFields.has(key)) {\n record[key] = rewrite(child);\n } else {\n walk(child);\n }\n }\n };\n\n walk(draft);\n }\n\n /** Duplica un node con un nome nuovo, senza copiarne le uscite. */\n duplicateNode(name: string, newName: string, offset = { x: 40, y: 40 }): void {\n const reference = this.nodeByName().get(name);\n if (!reference) {\n return;\n }\n const copy = clone(reference.node);\n copy.name = newName;\n copy.locationX = (copy.locationX ?? 0) + offset.x;\n copy.locationY = (copy.locationY ?? 0) + offset.y;\n // Le uscite non si copiano: duplicherebbero rami che l'utente non ha disegnato.\n for (const outlet of outletsOf(reference.type, copy)) {\n outlet.write(copy, undefined);\n }\n this.addNode(reference.collection, copy);\n }\n\n // -------------------------------------------------------------------------\n // Connector\n // -------------------------------------------------------------------------\n\n /** Scrive la destinazione di un'uscita. `target` assente → il ramo resta incompleto. */\n setConnector(fromName: string, outletKey: string, target: string | undefined, isGoTo?: boolean): void {\n const write = (type: FlowElementType, node: FlowAnyNode) => {\n const outlet = outletsOf(type, node).find((candidate) => candidate.key === outletKey);\n if (!outlet) {\n return;\n }\n const existing = outlet.read(node) ?? {};\n const connector: FlowConnector = { ...existing, targetReference: target };\n if (isGoTo !== undefined) {\n connector.isGoTo = isGoTo;\n }\n if (!connector.targetReference && !connector.isGoTo) {\n // Nessuna destinazione e nessun flag: meglio omettere il connector che scrivere\n // un oggetto vuoto (§2, \"proprieta' nulle omesse\").\n outlet.write(node, undefined);\n return;\n }\n outlet.write(node, connector);\n };\n\n if (fromName === START_NODE_NAME) {\n this.updateStart((start) => write('Start', start as FlowAnyNode));\n return;\n }\n this.updateNode(fromName, (node) => {\n const reference = this.nodeByName().get(fromName);\n write(reference?.type ?? '', node);\n });\n }\n\n /** Rimuove un arco: il percorso finisce lì, che e' legittimo (§3.5). */\n removeConnector(fromName: string, outletKey: string): void {\n this.setConnector(fromName, outletKey, undefined);\n }\n\n // -------------------------------------------------------------------------\n // Risorse\n // -------------------------------------------------------------------------\n\n addResource(collection: FlowResourceCollection, resource: Record<string, unknown>): void {\n this.update((draft) => {\n const list = (draft[collection] as Array<Record<string, unknown>> | undefined) ?? [];\n list.push(resource);\n (draft as Record<string, unknown>)[collection] = list;\n });\n }\n\n updateResource(\n collection: FlowResourceCollection,\n index: number,\n mutate: (resource: Record<string, unknown>) => void,\n ): void {\n this.update((draft) => {\n const list = draft[collection] as Array<Record<string, unknown>> | undefined;\n const resource = list?.[index];\n if (resource) {\n mutate(resource);\n }\n });\n }\n\n removeResource(collection: FlowResourceCollection, index: number): void {\n this.update((draft) => {\n const list = draft[collection] as Array<Record<string, unknown>> | undefined;\n list?.splice(index, 1);\n if (list && list.length === 0) {\n delete (draft as Record<string, unknown>)[collection];\n }\n });\n }\n\n // -------------------------------------------------------------------------\n // Radice\n // -------------------------------------------------------------------------\n\n /** Modifica i campi del documento radice (label, description, processType, …). */\n updateHeader(mutate: (definition: FlowDefinition) => void, options?: { silent?: boolean }): void {\n this.update(mutate, options);\n }\n}\n","/**\n * Cache dei dizionari e dei cataloghi — FRONTEND.md §6.4.\n *\n * I dizionari sono statici: si caricano una volta all'avvio dell'editor e si tengono in\n * cache. I cataloghi (oggetti, campi, action, form, script, eventi) non lo sono, ma\n * cambiano raramente: qui vengono memoizzati per chiave, in modo che aprire dieci volte lo\n * stesso inspector non produca dieci richieste.\n *\n * Nessun elenco di enum e' cablato: se il backend aggiunge un operatore, appare nelle\n * tendine senza toccare il frontend (§13.11).\n */\n\nimport { Injectable, computed, inject, signal } from '@angular/core';\n\nimport { FlowBuilderApi } from '../api/flow-builder-api';\nimport {\n FlowCatalogEntry,\n FlowCatalogParameter,\n FlowComparisonOperatorEntry,\n FlowDataTypeEntry,\n FlowDictionaries,\n FlowDictionaryEntry,\n FlowElementTypeEntry,\n FlowFieldDescription,\n FlowFieldUsage,\n FlowGlobalVariableEntry,\n FlowObjectSummary,\n} from '../model/dictionary.model';\nimport { FlowDataType, FlowNodeCollection } from '../model/flow.model';\nimport {\n FALLBACK_COLLECTION_BY_TYPE,\n FALLBACK_TYPE_LABEL,\n UNSUPPORTED_TYPES,\n} from './element-outlets';\n\n@Injectable()\nexport class FlowDictionaryStore {\n private readonly api = inject(FlowBuilderApi);\n\n private readonly _dictionaries = signal<FlowDictionaries>({});\n private readonly _isLoaded = signal(false);\n private loading?: Promise<void>;\n\n readonly dictionaries = this._dictionaries.asReadonly();\n readonly isLoaded = this._isLoaded.asReadonly();\n\n /** Idempotente: chiamabile da ogni componente che ne ha bisogno. */\n async load(): Promise<void> {\n if (this._isLoaded()) {\n return;\n }\n this.loading ??= this.api\n .getDictionaries()\n .then((dictionaries) => {\n this._dictionaries.set(dictionaries ?? {});\n this._isLoaded.set(true);\n })\n .finally(() => {\n this.loading = undefined;\n });\n return this.loading;\n }\n\n // -------------------------------------------------------------------------\n // Accessori tipizzati\n // -------------------------------------------------------------------------\n\n readonly dataTypes = computed<FlowDataTypeEntry[]>(() => this._dictionaries().dataTypes ?? []);\n readonly comparisonOperators = computed<FlowComparisonOperatorEntry[]>(\n () => this._dictionaries().comparisonOperators ?? [],\n );\n readonly assignmentOperators = computed(() => this._dictionaries().assignmentOperators ?? []);\n readonly recordFilterOperators = computed(() => this._dictionaries().recordFilterOperators ?? []);\n readonly resourceKinds = computed(() => this._dictionaries().resourceKinds ?? []);\n readonly globalVariables = computed<FlowGlobalVariableEntry[]>(\n () => this._dictionaries().globalVariables ?? [],\n );\n readonly processTypes = computed(() => this._dictionaries().processTypes ?? []);\n readonly triggerTypes = computed(() => this._dictionaries().triggerTypes ?? []);\n readonly recordTriggerTypes = computed(() => this._dictionaries().recordTriggerTypes ?? []);\n readonly startFrequencies = computed(() => this._dictionaries().startFrequencies ?? []);\n readonly offsetUnits = computed(() => this._dictionaries().offsetUnits ?? []);\n readonly sortOrders = computed(() => this._dictionaries().sortOrders ?? []);\n readonly collectionProcessorTypes = computed(() => this._dictionaries().collectionProcessorTypes ?? []);\n readonly transformTypes = computed(() => this._dictionaries().transformTypes ?? []);\n readonly transactionModels = computed(() => this._dictionaries().transactionModels ?? []);\n readonly waitEventTypes = computed(() => this._dictionaries().waitEventTypes ?? []);\n readonly conditionLogicModes = computed(() => this._dictionaries().conditionLogicModes ?? []);\n\n readonly elementTypes = computed<FlowElementTypeEntry[]>(() => this._dictionaries().elementTypes ?? []);\n\n /**\n * I tipi mostrabili nella palette: `isSupported: false` va nascosto (§3.2, §13.9).\n * Il filtro passa per la colonna del dizionario, non per una lista cablata; l'insieme\n * locale {@link UNSUPPORTED_TYPES} interviene solo se il dizionario non dichiara il flag.\n */\n readonly paletteTypes = computed<FlowElementTypeEntry[]>(() =>\n this.elementTypes().filter((entry) => {\n if (entry.isSupported === false) {\n return false;\n }\n if (entry.isSupported === undefined && UNSUPPORTED_TYPES.has(entry.value)) {\n return false;\n }\n return true;\n }),\n );\n\n /** Le categorie della palette, nell'ordine di prima apparizione nel dizionario. */\n readonly paletteCategories = computed<string[]>(() => {\n const categories: string[] = [];\n for (const entry of this.paletteTypes()) {\n const category = entry.category ?? 'Altro';\n if (!categories.includes(category)) {\n categories.push(category);\n }\n }\n return categories;\n });\n\n elementType(value: string): FlowElementTypeEntry | undefined {\n return this.elementTypes().find((entry) => entry.value === value);\n }\n\n /** La collection in cui scrivere un node: `metadataProperty`, con fallback locale (§3.2). */\n collectionOf(type: string): FlowNodeCollection | undefined {\n const fromDictionary = this.elementType(type)?.metadataProperty;\n return (fromDictionary as FlowNodeCollection | undefined) ?? FALLBACK_COLLECTION_BY_TYPE[type];\n }\n\n /** Etichetta di un tipo, con fallback: un tipo sconosciuto mostra il proprio `value`. */\n labelOf(type: string): string {\n return this.elementType(type)?.label ?? FALLBACK_TYPE_LABEL[type] ?? type;\n }\n\n hasFaultConnector(type: string): boolean {\n return this.elementType(type)?.hasFaultConnector ?? false;\n }\n\n hasAutomaticOutput(type: string): boolean {\n return this.elementType(type)?.hasAutomaticOutput ?? false;\n }\n\n /** Etichetta di una voce di dizionario, con fallback sul valore grezzo. */\n static labelIn(entries: FlowDictionaryEntry[], value: string | undefined | null): string {\n if (!value) {\n return '';\n }\n return entries.find((entry) => entry.value === value)?.label ?? value;\n }\n\n operator(value: string | undefined | null): FlowComparisonOperatorEntry | undefined {\n if (!value) {\n return undefined;\n }\n return this.comparisonOperators().find((entry) => entry.value === value);\n }\n\n /**\n * §13.1 — per gli operatori unari `rightValue` e' l'esito atteso, non un termine di\n * confronto. Il flag arriva dal dizionario (`isUnary`).\n */\n isUnaryOperator(value: string | undefined | null): boolean {\n return this.operator(value)?.isUnary ?? false;\n }\n\n /** §4.3 — `WasVisited` e `HasError` vogliono a sinistra il nome di un **node**. */\n operatorAppliesToElements(value: string | undefined | null): boolean {\n return this.operator(value)?.appliesToElements ?? false;\n }\n\n /** §5.2 — operatore che ha senso solo su destinazioni collection. */\n assignmentExpectsCollection(value: string | undefined | null): boolean {\n return this.assignmentOperators().find((entry) => entry.value === value)?.expectsCollection ?? false;\n }\n\n /**\n * Operatori applicabili al tipo del lato sinistro: `appliesTo` vuoto = qualunque tipo (§4.3).\n */\n operatorsFor(dataType: FlowDataType | undefined): FlowComparisonOperatorEntry[] {\n const operators = this.comparisonOperators();\n if (!dataType) {\n return operators;\n }\n return operators.filter(\n (entry) => !entry.appliesTo || entry.appliesTo.length === 0 || entry.appliesTo.includes(dataType),\n );\n }\n\n dataType(value: string | undefined | null): FlowDataTypeEntry | undefined {\n return this.dataTypes().find((entry) => entry.value === value);\n }\n\n /** §4.6 — `Object` ed `Enum` richiedono `objectType`. */\n requiresObjectType(dataType: string | undefined | null): boolean {\n const entry = this.dataType(dataType);\n if (entry?.requiresObjectType !== undefined) {\n return entry.requiresObjectType;\n }\n return dataType === 'Object' || dataType === 'Enum';\n }\n\n /** §4.6 — `scale` si applica solo ai numerici. */\n supportsScale(dataType: string | undefined | null): boolean {\n const entry = this.dataType(dataType);\n if (entry?.supportsScale !== undefined) {\n return entry.supportsScale;\n }\n return dataType === 'Number' || dataType === 'Integer';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Cataloghi\n// ---------------------------------------------------------------------------\n\n/** Memoizza per chiave le richieste di catalogo, condividendo la promise in volo. */\nclass AsyncCache<T> {\n private readonly entries = new Map<string, Promise<T>>();\n\n get(key: string, load: () => Promise<T>): Promise<T> {\n let entry = this.entries.get(key);\n if (!entry) {\n entry = load().catch((error) => {\n // Un errore non va memoizzato: al prossimo tentativo si riprova.\n this.entries.delete(key);\n throw error;\n });\n this.entries.set(key, entry);\n }\n return entry;\n }\n\n clear(): void {\n this.entries.clear();\n }\n}\n\n@Injectable()\nexport class FlowCatalogStore {\n private readonly api = inject(FlowBuilderApi);\n\n private readonly objectsCache = new AsyncCache<FlowObjectSummary[]>();\n private readonly fieldsCache = new AsyncCache<FlowFieldDescription[]>();\n private readonly fieldValuesCache = new AsyncCache<Array<{ value: string; label?: string | null }>>();\n private readonly entriesCache = new AsyncCache<FlowCatalogEntry[]>();\n private readonly parametersCache = new AsyncCache<FlowCatalogParameter[]>();\n\n /**\n * Una lista vuota significa \"non lo so\", non \"nessuno\": con il catalogo non popolato la\n * validazione salta i controlli invece di produrre falsi allarmi (§7). L'editor fa lo\n * stesso: se la lista e' vuota, lascia il campo libero invece di bloccarlo.\n */\n listObjects(): Promise<FlowObjectSummary[]> {\n return this.objectsCache.get('objects', () => this.api.listObjects().then((list) => list ?? []));\n }\n\n listFields(object: string, usage: FlowFieldUsage = 'any'): Promise<FlowFieldDescription[]> {\n if (!object) {\n return Promise.resolve([]);\n }\n return this.fieldsCache.get(`${object}|${usage}`, () =>\n this.api.listFields(object, usage).then((list) => list ?? []),\n );\n }\n\n listFieldValues(object: string, field: string): Promise<Array<{ value: string; label?: string | null }>> {\n if (!object || !field) {\n return Promise.resolve([]);\n }\n return this.fieldValuesCache.get(`${object}|${field}`, () =>\n this.api.listFieldValues(object, field).catch(() => []),\n );\n }\n\n listActionTypes(): Promise<FlowCatalogEntry[]> {\n return this.entriesCache.get('action-types', () => this.api.listActionTypes().then((list) => list ?? []));\n }\n\n listActions(actionType?: string): Promise<FlowCatalogEntry[]> {\n return this.entriesCache.get(`actions|${actionType ?? ''}`, () =>\n this.api.listActions(actionType).then((list) => list ?? []),\n );\n }\n\n listActionParameters(actionType: string, actionName: string): Promise<FlowCatalogParameter[]> {\n if (!actionType || !actionName) {\n return Promise.resolve([]);\n }\n return this.parametersCache.get(`action|${actionType}|${actionName}`, () =>\n this.api.listActionParameters(actionType, actionName).catch(() => []),\n );\n }\n\n listScripts(): Promise<FlowCatalogEntry[]> {\n return this.entriesCache.get('scripts', () => this.api.listScripts().then((list) => list ?? []));\n }\n\n listScriptParameters(scriptName: string): Promise<FlowCatalogParameter[]> {\n if (!scriptName) {\n return Promise.resolve([]);\n }\n return this.parametersCache.get(`script|${scriptName}`, () =>\n this.api.listScriptParameters(scriptName).catch(() => []),\n );\n }\n\n listForms(): Promise<FlowCatalogEntry[]> {\n return this.entriesCache.get('forms', () => this.api.listForms().then((list) => list ?? []));\n }\n\n listFormParameters(formName: string): Promise<FlowCatalogParameter[]> {\n if (!formName) {\n return Promise.resolve([]);\n }\n return this.parametersCache.get(`form|${formName}`, () =>\n this.api.listFormParameters(formName).catch(() => []),\n );\n }\n\n listEnumTypes(): Promise<FlowCatalogEntry[]> {\n return this.entriesCache.get('enum-types', () => this.api.listEnumTypes().then((list) => list ?? []));\n }\n\n listEvents(): Promise<FlowCatalogEntry[]> {\n return this.entriesCache.get('events', () => this.api.listEvents().then((list) => list ?? []));\n }\n\n /** Da chiamare se lo schema cambia sotto i piedi (raro, ma il comando esiste). */\n clear(): void {\n this.objectsCache.clear();\n this.fieldsCache.clear();\n this.fieldValuesCache.clear();\n this.entriesCache.clear();\n this.parametersCache.clear();\n }\n}\n","/**\n * Il pannello dei problemi — FRONTEND.md §7, §11.\n *\n * La validazione e' un servizio separato dal salvataggio, e questo e' deliberato: si\n * salva quando si vuole, i problemi si guardano a parte. Qui vive il debounce (300–500 ms\n * su pausa di digitazione, §11.4) e l'indicizzazione dei rilievi per `elementName` e\n * `path`, che e' cio' che permette di evidenziare l'elemento sul canvas e il campo\n * dentro l'inspector.\n *\n * `code` e' stabile e si usa per decidere il comportamento; `message` e' testo per\n * l'utente e non va interpretato (§7).\n */\n\nimport { DestroyRef, Injectable, computed, inject, signal } from '@angular/core';\n\nimport { FlowBuilderApi } from '../api/flow-builder-api';\nimport { FlowValidationIssue, FlowValidationResult } from '../model/api.model';\nimport { FlowDefinition } from '../model/flow.model';\nimport { FlowApiError } from '../model/error.model';\n\nconst DEBOUNCE_MS = 400;\n\n@Injectable()\nexport class FlowValidationStore {\n private readonly api = inject(FlowBuilderApi);\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly _result = signal<FlowValidationResult | null>(null);\n private readonly _isRunning = signal(false);\n private readonly _lastError = signal<string | null>(null);\n\n private timer?: ReturnType<typeof setTimeout>;\n /** Cresce a ogni richiesta: scarta le risposte di validazioni superate. */\n private sequence = 0;\n\n readonly result = this._result.asReadonly();\n readonly isRunning = this._isRunning.asReadonly();\n readonly lastError = this._lastError.asReadonly();\n\n readonly issues = computed<FlowValidationIssue[]>(() => this._result()?.issues ?? []);\n readonly errorCount = computed(() => this._result()?.errorCount ?? 0);\n readonly warningCount = computed(() => this._result()?.warningCount ?? 0);\n readonly infoCount = computed(\n () => this.issues().filter((issue) => issue.severity === 'Info').length,\n );\n\n /**\n * `false` finche' non e' arrivata una validazione: non presentare l'assenza di rilievi\n * come garanzia di correttezza (§7, ultimo capoverso).\n */\n readonly hasResult = computed(() => this._result() !== null);\n\n /** Zero errori: e' la condizione che l'attivazione esige (§8.3). */\n readonly canActivate = computed(() => this.hasResult() && this.errorCount() === 0);\n\n /** Rilievi raggruppati per elemento, per l'evidenziazione sul canvas. */\n readonly issuesByElement = computed<Map<string, FlowValidationIssue[]>>(() => {\n const map = new Map<string, FlowValidationIssue[]>();\n for (const issue of this.issues()) {\n const key = issue.elementName ?? '';\n const list = map.get(key) ?? [];\n list.push(issue);\n map.set(key, list);\n }\n return map;\n });\n\n /** I rilievi non ancorati a un elemento: riguardano il documento (§7, famiglia Definizione). */\n readonly documentIssues = computed(() => this.issuesByElement().get('') ?? []);\n\n constructor() {\n this.destroyRef.onDestroy(() => this.cancel());\n }\n\n /** La gravita' peggiore su un elemento, per decidere il colore del node sul canvas. */\n severityOf(elementName: string): 'Error' | 'Warning' | 'Info' | null {\n const issues = this.issuesByElement().get(elementName);\n if (!issues?.length) {\n return null;\n }\n if (issues.some((issue) => issue.severity === 'Error')) {\n return 'Error';\n }\n if (issues.some((issue) => issue.severity === 'Warning')) {\n return 'Warning';\n }\n return 'Info';\n }\n\n /**\n * I rilievi che riguardano un campo dentro un elemento.\n * `path` e' del tipo `rules[Approvato].connector.targetReference`: il confronto e' per\n * prefisso, così `rules[Approvato]` cattura anche i rilievi piu' profondi.\n */\n issuesAt(elementName: string | null, pathPrefix: string): FlowValidationIssue[] {\n const issues = this.issuesByElement().get(elementName ?? '') ?? [];\n return issues.filter((issue) => issue.path?.startsWith(pathPrefix));\n }\n\n /** Programma una validazione dopo la pausa di digitazione (§11.4). */\n schedule(definition: FlowDefinition): void {\n this.cancel();\n this.timer = setTimeout(() => {\n this.timer = undefined;\n void this.run(definition);\n }, DEBOUNCE_MS);\n }\n\n /** Valida subito, saltando il debounce: prima di attivare, o su richiesta esplicita. */\n async run(definition: FlowDefinition): Promise<FlowValidationResult | null> {\n const token = ++this.sequence;\n this._isRunning.set(true);\n this._lastError.set(null);\n try {\n const result = await this.api.validateDefinition(definition);\n if (token !== this.sequence) {\n // Una validazione piu' recente e' già partita: questa risposta e' superata.\n return null;\n }\n this._result.set(result);\n return result;\n } catch (error) {\n if (token !== this.sequence) {\n return null;\n }\n const message = FlowApiError.is(error) ? error.message : String(error);\n this._lastError.set(message);\n return null;\n } finally {\n if (token === this.sequence) {\n this._isRunning.set(false);\n }\n }\n }\n\n /**\n * Sostituisce il risultato con quello arrivato da un'altra primitiva: il salvataggio\n * restituisce `validation` (§6.2) e l'attivazione fallita lo porta nel payload\n * dell'errore (§8.3). In entrambi i casi e' il risultato piu' fresco che esista.\n */\n adopt(result: FlowValidationResult | undefined | null): void {\n if (!result) {\n return;\n }\n this.sequence += 1;\n this._result.set(result);\n this._isRunning.set(false);\n }\n\n clear(): void {\n this.cancel();\n this.sequence += 1;\n this._result.set(null);\n this._lastError.set(null);\n this._isRunning.set(false);\n }\n\n private cancel(): void {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = undefined;\n }\n }\n}\n","/**\n * Auto-layout con dagre.\n *\n * Il modello conserva soltanto `locationX`/`locationY` (§3.5): non c'e' nessuna nozione di\n * layout automatico da persistere. Il comando \"riordina\" calcola un layout gerarchico e\n * **scrive le coordinate risultanti** nel documento, come chiede la specifica (\"se usi un\n * auto-layout, scrivi comunque valori coerenti\").\n *\n * L'ordine delle uscite conta: i rami di una Decision escono nell'ordine delle regole, e\n * il ramo di fault viene tenuto a destra, così la lettura del grafo rispecchia la\n * semantica invece dell'ordine di inserimento nel JSON.\n */\n\nimport { Injectable } from '@angular/core';\nimport dagre from 'dagre';\n\nimport { FlowEdge } from './flow-document.store';\nimport { START_NODE_NAME } from './element-outlets';\n\nexport interface FlowLayoutNodeInput {\n name: string;\n width: number;\n height: number;\n}\n\nexport interface FlowLayoutResult {\n positions: Map<string, { x: number; y: number }>;\n}\n\nexport type FlowLayoutDirection = 'TB' | 'LR';\n\nexport interface FlowLayoutOptions {\n direction?: FlowLayoutDirection;\n /** Distanza fra i livelli. */\n rankSeparation?: number;\n /** Distanza fra i node dello stesso livello. */\n nodeSeparation?: number;\n origin?: { x: number; y: number };\n}\n\n@Injectable()\nexport class FlowLayoutService {\n /**\n * Calcola le posizioni. Restituisce l'angolo in alto a sinistra di ogni node, perche'\n * e' cio' che `locationX`/`locationY` significano nel modello, mentre dagre ragiona in\n * centri.\n */\n layout(\n nodes: FlowLayoutNodeInput[],\n edges: FlowEdge[],\n options?: FlowLayoutOptions,\n ): FlowLayoutResult {\n const direction = options?.direction ?? 'TB';\n const origin = options?.origin ?? { x: 60, y: 60 };\n\n const graph = new dagre.graphlib.Graph({ multigraph: true, compound: false });\n graph.setGraph({\n rankdir: direction,\n ranksep: options?.rankSeparation ?? 90,\n nodesep: options?.nodeSeparation ?? 60,\n marginx: 0,\n marginy: 0,\n });\n graph.setDefaultEdgeLabel(() => ({}));\n\n const known = new Set<string>();\n for (const node of nodes) {\n graph.setNode(node.name, { width: node.width, height: node.height });\n known.add(node.name);\n }\n\n for (const edge of edges) {\n // Un ramo senza destinazione non vincola il layout.\n if (!edge.to || !known.has(edge.from) || !known.has(edge.to)) {\n continue;\n }\n // `isGoTo` marca gli archi di ritorno: includerli creerebbe un ciclo che dagre\n // spezzerebbe arbitrariamente, allungando il grafo. Il corpo di un Loop si richiude\n // sul Loop, quindi questo caso e' la norma, non l'eccezione (§5.4).\n if (edge.isGoTo) {\n continue;\n }\n graph.setEdge(edge.from, edge.to, { weight: FlowLayoutService.weightOf(edge) }, edge.id);\n }\n\n dagre.layout(graph);\n\n const positions = new Map<string, { x: number; y: number }>();\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n\n for (const node of nodes) {\n const laid = graph.node(node.name) as { x?: number; y?: number } | undefined;\n if (!laid || laid.x === undefined || laid.y === undefined) {\n continue;\n }\n const x = laid.x - node.width / 2;\n const y = laid.y - node.height / 2;\n positions.set(node.name, { x, y });\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n }\n\n // Trasla in modo che il grafo cominci dall'origine scelta, con coordinate positive.\n if (Number.isFinite(minX) && Number.isFinite(minY)) {\n const deltaX = origin.x - minX;\n const deltaY = origin.y - minY;\n for (const [name, position] of positions) {\n positions.set(name, {\n x: Math.round(position.x + deltaX),\n y: Math.round(position.y + deltaY),\n });\n }\n }\n\n return { positions };\n }\n\n /**\n * Peso dell'arco: piu' alto = piu' dritto. Il percorso principale resta in colonna,\n * i rami di errore e di timeout si spostano di lato.\n */\n private static weightOf(edge: FlowEdge): number {\n switch (edge.kind) {\n case 'Start':\n case 'Next':\n case 'LoopNext':\n return 10;\n case 'Rule':\n case 'WaitEvent':\n case 'LoopEnd':\n case 'Default':\n return 4;\n case 'Fault':\n case 'Timeout':\n case 'ScheduledPath':\n return 1;\n default:\n return 3;\n }\n }\n\n /** Lo Start apre sempre il grafo: utile per ordinare i node prima del layout. */\n static isStart(name: string): boolean {\n return name === START_NODE_NAME;\n }\n}\n","/**\n * La sessione di editing: quale flow, quale versione, cosa e' permesso farci.\n * FRONTEND.md §6.2, §8, §9, §11.\n *\n * Tre responsabilita' che stanno bene insieme perche' condividono lo stesso stato:\n * - il ciclo di vita: si modifica una bozza; su una versione non modificabile il comando\n * e' \"Nuova versione\", non \"Salva\" (§8.1);\n * - la concorrenza ottimistica: `updatedAt` conservato al caricamento e rimandato come\n * `expectedUpdatedAt` al salvataggio (§9);\n * - la distinzione fra \"salvato\" e \"sano\": il salvataggio riesce anche con errori, e\n * l'esito si legge in `validation` (§6.2).\n */\n\nimport { Injectable, computed, inject, signal } from '@angular/core';\n\nimport { FlowBuilderApi } from '../api/flow-builder-api';\nimport { FlowSaveResult, FlowValidationResult, FlowVersionSummary } from '../model/api.model';\nimport { FlowDefinition } from '../model/flow.model';\nimport { FlowApiError } from '../model/error.model';\nimport { FlowDocumentStore, emptyFlowDefinition } from './flow-document.store';\nimport { FlowValidationStore } from './flow-validation.store';\n\n/** Cosa mostrare quando il salvataggio incontra una versione modificata da altri (§9). */\nexport interface FlowConflictState {\n message: string;\n conflictingAuthor?: string;\n}\n\n@Injectable()\nexport class FlowEditorSession {\n private readonly api = inject(FlowBuilderApi);\n private readonly documentStore = inject(FlowDocumentStore);\n private readonly validation = inject(FlowValidationStore);\n\n private readonly _flowName = signal<string | null>(null);\n private readonly _version = signal<number | null>(null);\n private readonly _versions = signal<FlowVersionSummary[]>([]);\n /** Conservato al caricamento, rimandato al salvataggio (§9.1, §9.2). */\n private readonly _expectedUpdatedAt = signal<string | undefined>(undefined);\n private readonly _isBusy = signal(false);\n private readonly _lastSaveResult = signal<FlowSaveResult | null>(null);\n private readonly _conflict = signal<FlowConflictState | null>(null);\n private readonly _author = signal<string | undefined>(undefined);\n\n readonly flowName = this._flowName.asReadonly();\n readonly version = this._version.asReadonly();\n readonly versions = this._versions.asReadonly();\n readonly isBusy = this._isBusy.asReadonly();\n readonly lastSaveResult = this._lastSaveResult.asReadonly();\n readonly conflict = this._conflict.asReadonly();\n readonly expectedUpdatedAt = this._expectedUpdatedAt.asReadonly();\n\n /** `true` finche' il flow non e' mai stato salvato: il comando e' \"Crea\", non \"Salva\". */\n readonly isNew = computed(() => this._version() === null);\n\n readonly currentVersionSummary = computed<FlowVersionSummary | undefined>(() => {\n const version = this._version();\n return version === null ? undefined : this._versions().find((entry) => entry.version === version);\n });\n\n /**\n * `isEditable` arriva dal backend e non va ricalcolato lato client (§6.1). Un flow nuovo,\n * non ancora salvato, e' modificabile per definizione.\n */\n readonly isEditable = computed(() => {\n if (this.isNew()) {\n return true;\n }\n return this.currentVersionSummary()?.isEditable ?? false;\n });\n\n /** Su una versione non modificabile il comando primario diventa \"Nuova versione\" (§8.1). */\n readonly primaryCommand = computed<'create' | 'save' | 'newVersion'>(() => {\n if (this.isNew()) {\n return 'create';\n }\n return this.isEditable() ? 'save' : 'newVersion';\n });\n\n readonly isActiveVersion = computed(() => this.currentVersionSummary()?.isActive ?? false);\n\n /** Attivare esige zero errori (§8.3): il comando resta disabilitato finche' ce ne sono. */\n readonly canActivate = computed(\n () => !this.isNew() && !this.isActiveVersion() && this.validation.canActivate(),\n );\n\n setAuthor(author: string | undefined): void {\n this._author.set(author);\n }\n\n /** Prepara un flow nuovo, non ancora salvato (§11, \"Creare un flow\"). */\n startNew(fullName: string, label: string, processType: string): void {\n this.documentStore.load(emptyFlowDefinition(fullName, label, processType));\n this._flowName.set(fullName || null);\n this._version.set(null);\n this._versions.set([]);\n this._expectedUpdatedAt.set(undefined);\n this._lastSaveResult.set(null);\n this._conflict.set(null);\n this.validation.clear();\n }\n\n /**\n * Carica una versione e conserva il suo `updatedAt` (§11, \"Modificare\", passo 1).\n * `version` assente → la versione attiva se c'e', altrimenti l'ultima.\n */\n async open(flowName: string, version?: number): Promise<void> {\n this._isBusy.set(true);\n this._conflict.set(null);\n try {\n const [definition, versions] = await Promise.all([\n this.api.loadFlow(flowName, version),\n this.api.listVersions(flowName).catch(() => [] as FlowVersionSummary[]),\n ]);\n this.documentStore.load(definition);\n this._flowName.set(flowName);\n this._versions.set(versions);\n\n // La versione effettivamente caricata: il documento porta `status` ma non il numero,\n // quindi si deduce dal parametro o dall'elenco versioni.\n const resolved = version ?? FlowEditorSession.pickVersion(versions);\n this._version.set(resolved ?? null);\n this._expectedUpdatedAt.set(versions.find((entry) => entry.version === resolved)?.updatedAt);\n this._lastSaveResult.set(null);\n this.validation.clear();\n await this.validation.run(this.documentStore.document());\n } finally {\n this._isBusy.set(false);\n }\n }\n\n /** Senza `version` il backend restituisce la versione attiva, altrimenti l'ultima (§6.1). */\n private static pickVersion(versions: FlowVersionSummary[]): number | undefined {\n const active = versions.find((entry) => entry.isActive);\n if (active) {\n return active.version;\n }\n return versions[0]?.version;\n }\n\n /** Ricarica l'elenco versioni: dopo un'attivazione la precedente e' `Obsolete` (§8.4). */\n async refreshVersions(): Promise<void> {\n const flowName = this._flowName();\n if (!flowName) {\n return;\n }\n const versions = await this.api.listVersions(flowName);\n this._versions.set(versions);\n const current = this._version();\n if (current !== null) {\n this._expectedUpdatedAt.set(versions.find((entry) => entry.version === current)?.updatedAt);\n }\n }\n\n /**\n * Crea o salva, a seconda dello stato. Non lancia su definizione invalida: il\n * salvataggio riesce anche con errori e il chiamante legge `validation` (§8.2).\n *\n * Rilancia `VersionConflict` dopo aver popolato {@link conflict}, perche' la UI deve\n * offrire \"ricarica\" o \"salva come nuova versione\" (§9.3).\n */\n async save(options?: { activate?: boolean; flowName?: string }): Promise<FlowSaveResult> {\n const definition = this.documentStore.document();\n const targetName = options?.flowName ?? this._flowName() ?? definition.fullName ?? '';\n if (!targetName) {\n throw new FlowApiError('InvalidRequest', 'Il flow non ha un nome tecnico.');\n }\n this._isBusy.set(true);\n this._conflict.set(null);\n try {\n const result = this.isNew()\n ? await this.api.createFlow({\n definition,\n flowName: targetName,\n author: this._author(),\n })\n : await this.api.saveFlow(this._flowName() as string, {\n definition,\n // Se indicato vince sul `fullName` del documento: e' così che si rinomina (§6.2).\n flowName: options?.flowName,\n // Mandare sempre la versione caricata rende prevedibile cosa viene toccato (§8).\n version: this._version() ?? undefined,\n expectedUpdatedAt: this._expectedUpdatedAt(),\n author: this._author(),\n activate: options?.activate,\n });\n this.applySaveResult(result);\n return result;\n } catch (error) {\n if (FlowApiError.is(error) && error.category === 'VersionConflict') {\n this._conflict.set({\n message: error.message,\n conflictingAuthor: error.conflictingAuthor,\n });\n }\n if (FlowApiError.is(error) && error.validation) {\n // `activate: true` fallisce senza scrivere nulla se ci sono errori (§6.2).\n this.validation.adopt(error.validation);\n }\n throw error;\n } finally {\n this._isBusy.set(false);\n }\n }\n\n private applySaveResult(result: FlowSaveResult): void {\n this._flowName.set(result.flowName);\n this._version.set(result.version);\n // Da conservare per il salvataggio successivo (§6.2, ultimo capoverso).\n this._expectedUpdatedAt.set(result.updatedAt);\n this._lastSaveResult.set(result);\n // Riflette nel documento cio' che il backend ha deciso, senza sporcare lo storico:\n // `fullName` e `status` sono riempiti dal record di versione, non dall'editor (§2).\n this.documentStore.updateHeader((definition) => {\n definition.fullName = result.flowName;\n definition.status = result.status;\n }, { silent: true });\n this.documentStore.markSaved();\n this.validation.adopt(result.validation);\n void this.refreshVersions();\n }\n\n /** Copia la versione corrente in una nuova bozza (§8.1): il comando delle versioni chiuse. */\n async createNewVersion(): Promise<FlowSaveResult> {\n const flowName = this._flowName();\n if (!flowName) {\n throw new FlowApiError('InvalidRequest', 'Nessun flow aperto.');\n }\n this._isBusy.set(true);\n try {\n const result = await this.api.createVersion(flowName, {\n from: this._version() ?? undefined,\n author: this._author(),\n });\n await this.open(flowName, result.version);\n return result;\n } finally {\n this._isBusy.set(false);\n }\n }\n\n /**\n * Attiva la versione corrente (§11, \"Attivare\").\n * Valida prima in locale per un feedback immediato: se ci sono errori non chiama\n * l'attivazione, perche' fallirebbe comunque.\n */\n async activate(): Promise<FlowSaveResult> {\n const flowName = this._flowName();\n const version = this._version();\n if (!flowName || version === null) {\n throw new FlowApiError('InvalidRequest', 'Salva il flow prima di attivarlo.');\n }\n const local = await this.validation.run(this.documentStore.document());\n if (local && local.errorCount > 0) {\n throw new FlowApiError(\n 'ValidationFailed',\n 'La definizione contiene errori: correggili prima di attivare.',\n local,\n );\n }\n this._isBusy.set(true);\n try {\n const result = await this.api.activateVersion(flowName, version);\n this.applySaveResult(result);\n return result;\n } catch (error) {\n // Qualcosa e' cambiato nel frattempo (per esempio un oggetto rinominato nello\n // schema): il payload porta l'elenco, che va aperto nel pannello (§11, passo 3).\n if (FlowApiError.is(error) && error.validation) {\n this.validation.adopt(error.validation);\n }\n throw error;\n } finally {\n this._isBusy.set(false);\n }\n }\n\n async deactivate(): Promise<void> {\n const flowName = this._flowName();\n if (!flowName) {\n return;\n }\n this._isBusy.set(true);\n try {\n await this.api.deactivateFlow(flowName);\n await this.refreshVersions();\n } finally {\n this._isBusy.set(false);\n }\n }\n\n /**\n * Elimina una versione. Da mettere dietro una conferma esplicita: il numero della versione\n * piu' alta viene riassegnato dopo un'eliminazione, e un'esecuzione sospesa nata su quel\n * numero riprenderebbe su una definizione diversa (§8, ultimo capoverso).\n */\n async deleteVersion(version: number): Promise<void> {\n const flowName = this._flowName();\n if (!flowName) {\n return;\n }\n this._isBusy.set(true);\n try {\n await this.api.deleteVersion(flowName, version);\n await this.refreshVersions();\n // Se e' stata eliminata la versione aperta, si riapre quella piu' recente.\n if (this._version() === version) {\n const next = this._versions()[0]?.version;\n if (next !== undefined) {\n await this.open(flowName, next);\n } else {\n this._version.set(null);\n }\n }\n } finally {\n this._isBusy.set(false);\n }\n }\n\n /** Risoluzione del conflitto, prima opzione: ricarica e perde le modifiche locali (§9.3). */\n async reloadAfterConflict(): Promise<void> {\n const flowName = this._flowName();\n const version = this._version();\n if (!flowName) {\n return;\n }\n this._conflict.set(null);\n await this.open(flowName, version ?? undefined);\n }\n\n /**\n * Risoluzione del conflitto, seconda opzione: salva come nuova versione, conservando\n * le modifiche locali (§9.3). Il salvataggio senza `expectedUpdatedAt` e senza `version`\n * lascia scegliere al backend, che crea una nuova versione se l'ultima non e' toccabile.\n */\n async saveAsNewVersionAfterConflict(): Promise<FlowSaveResult> {\n const flowName = this._flowName();\n if (!flowName) {\n throw new FlowApiError('InvalidRequest', 'Nessun flow aperto.');\n }\n this._isBusy.set(true);\n this._conflict.set(null);\n try {\n const created = await this.api.createVersion(flowName, { author: this._author() });\n const result = await this.api.saveFlow(flowName, {\n definition: this.documentStore.document(),\n version: created.version,\n expectedUpdatedAt: created.updatedAt,\n author: this._author(),\n });\n this.applySaveResult(result);\n return result;\n } finally {\n this._isBusy.set(false);\n }\n }\n\n dismissConflict(): void {\n this._conflict.set(null);\n }\n\n /** L'ultima validazione conosciuta, da qualunque primitiva arrivi. */\n get validationResult(): FlowValidationResult | null {\n return this.validation.result();\n }\n\n /** Il documento corrente, per chi deve mandarlo a una primitiva. */\n get definition(): FlowDefinition {\n return this.documentStore.document();\n }\n}\n","/**\n * Il view model del canvas.\n *\n * Gli id dei connettori sono stringhe costruite qui e in nessun altro posto: un mismatch\n * fra l'id dichiarato su un connettore e quello usato da una connessione fa sparire l'arco\n * **senza errori** — e' il fallimento silenzioso numero uno di @foblex/flow.\n */\n\nimport { FlowElementType } from '../../model/flow.model';\nimport { FlowIssueSeverity } from '../../model/api.model';\nimport { FlowOutlet } from '../../core/element-outlets';\n\n/** Il connettore di ingresso di un node. Lo Start non ne ha. */\nexport function targetConnectorId(nodeName: string): string {\n return `in:${nodeName}`;\n}\n\n/** Il connettore di uscita di un node, uno per ramo (§3.5). */\nexport function sourceConnectorId(nodeName: string, outletKey: string): string {\n return `out:${nodeName}:${outletKey}`;\n}\n\n/** Inverso di {@link sourceConnectorId}. */\nexport function parseSourceConnectorId(id: string): { nodeName: string; outletKey: string } | null {\n if (!id.startsWith('out:')) {\n return null;\n }\n const rest = id.slice(4);\n const separator = rest.indexOf(':');\n if (separator < 0) {\n return null;\n }\n return { nodeName: rest.slice(0, separator), outletKey: rest.slice(separator + 1) };\n}\n\n/** Inverso di {@link targetConnectorId}. */\nexport function parseTargetConnectorId(id: string): string | null {\n return id.startsWith('in:') ? id.slice(3) : null;\n}\n\n/** L'id del node sul canvas: prefissato per non collidere con quello dei connettori. */\nexport function canvasNodeId(nodeName: string): string {\n return `node:${nodeName}`;\n}\n\nexport function parseCanvasNodeId(id: string): string | null {\n return id.startsWith('node:') ? id.slice(5) : null;\n}\n\nexport interface FlowCanvasNode {\n /** Nome nel documento; `$start` per lo Start, che nel modello non ha nome. */\n name: string;\n /** Id per il canvas. */\n id: string;\n /** `'Start'` oppure il discriminatore di `elementTypes`. */\n type: FlowElementType | 'Start';\n typeLabel: string;\n label: string;\n description?: string | null;\n position: { x: number; y: number };\n outlets: FlowOutlet[];\n isStart: boolean;\n /** Categoria del dizionario: decide il colore dell'icona del node. */\n category?: string | null;\n /** Glifo mostrato nel badge dell'icona: dipende dal tipo, non dalla categoria. */\n icon: string;\n /**\n * La classe che porta la larghezza del node. Non e' costante: le uscite stanno in fila sul\n * bordo inferiore, quindi un elemento con molti rami ha bisogno di piu' spazio perche' le\n * etichette restino leggibili. E' una classe e non uno stile inline perche' @foblex/flow\n * riscrive l'attributo `style` del node per posizionarlo.\n */\n widthClass: string;\n /**\n * Le etichette dei rami si mostrano solo quando i rami sono piu' di uno: su un `next`\n * unico l'etichetta direbbe soltanto «Successivo».\n */\n showsOutletLabels: boolean;\n /** `false` → nessun percorso lo raggiunge dallo Start: va reso \"scollegato\" (§6.4). */\n isReachable: boolean;\n /** La gravita' peggiore dei rilievi sull'elemento (§7). */\n severity: FlowIssueSeverity | null;\n /** Numero di rilievi, per il badge. */\n issueCount: number;\n /** L'elemento espone il proprio risultato sotto il proprio nome (§4.5). */\n hasAutomaticOutput: boolean;\n /** Sintesi di una riga mostrata sul node (l'oggetto letto, il form mostrato, …). */\n subtitle?: string | null;\n /** Rami dichiarati ma senza destinazione: mostrati come tali, non come archi (§6.4). */\n danglingOutlets: FlowOutlet[];\n}\n\nexport interface FlowCanvasEdge {\n id: string;\n sourceId: string;\n targetId: string;\n kind: string;\n label?: string | null;\n isGoTo: boolean;\n}\n","/**\n * Il canvas del grafo.\n *\n * Il documento e' la fonte di verita': node, archi e raggiungibilita' sono signal derivati\n * da {@link FlowDocumentStore}, e ogni gesto dell'utente diventa una mutazione del\n * documento. @foblex/flow e' usato in \"classic mode\": la libreria disegna e riconosce i\n * gesti, lo stato resta nostro.\n *\n * Scelta di progetto sulla raggiungibilita': gli archi e la reachability sono calcolati\n * **in locale** per il disegno, così trascinare un arco si riflette subito; `isReachable`\n * di `POST /flows/outline` (§6.4) resta la fonte autoritativa e, quando arriva, sovrascrive\n * il calcolo locale. Chiedere l'outline a ogni movimento del mouse renderebbe il canvas\n * dipendente dalla latenza.\n */\n\nimport { ChangeDetectionStrategy, Component, computed, inject, input, output } from '@angular/core';\nimport { EFConnectableSide, EFMarkerType, FFlowModule } from '@foblex/flow';\n\nimport { FlowDocumentStore } from '../../core/flow-document.store';\nimport { FlowDictionaryStore } from '../../core/flow-dictionary.store';\nimport { FlowValidationStore } from '../../core/flow-validation.store';\nimport { START_NODE_NAME, outletsOf } from '../../core/element-outlets';\nimport { elementIcon } from '../../core/element-icons';\nimport { FlowAnyNode, FlowElementType } from '../../model/flow.model';\nimport { FlowOutline } from '../../model/api.model';\nimport {\n FlowCanvasEdge,\n FlowCanvasNode,\n canvasNodeId,\n parseCanvasNodeId,\n parseSourceConnectorId,\n parseTargetConnectorId,\n sourceConnectorId,\n targetConnectorId,\n} from './flow-canvas.model';\n\n/**\n * Dimensioni nominali di un node, usate dal layout automatico.\n *\n * Le uscite stanno in fila sul bordo **inferiore**: e' la larghezza a dipendere dal numero\n * di rami, non l'altezza. L'altezza resta quella della card (intestazione, riga del nome\n * tecnico e badge, striscia delle uscite) e non cambia con i rami.\n */\nexport const FLOW_NODE_WIDTH = 240;\nexport const FLOW_NODE_HEIGHT = 116;\n\n/**\n * La larghezza del node per numero di rami: le uscite stanno in fila sul bordo inferiore,\n * quindi una Decision con quattro regole ha bisogno di piu' spazio di un Assignment.\n *\n * E' una tabella a scaglioni, non una formula, perche' la larghezza si applica con una\n * **classe** e non con uno stile inline: @foblex/flow riscrive l'attributo `style` del node\n * per posizionarlo, e qualunque `[style.width]` di Angular verrebbe cancellato al primo\n * spostamento. I valori qui e quelli delle classi `.fb-node--outlets-N` nel CSS devono\n * restare uguali: la stessa misura serve a disegnare il node e a stimarlo per dagre.\n */\nconst OUTLET_WIDTHS = [240, 240, 240, 304, 380, 456, 520];\n\n/** Oltre questo numero di rami il node non cresce piu': le etichette si troncano. */\nconst MAX_OUTLET_BUCKET = OUTLET_WIDTHS.length - 1;\n\nfunction outletBucket(outletCount: number): number {\n return Math.min(Math.max(outletCount, 0), MAX_OUTLET_BUCKET);\n}\n\nexport function flowNodeWidth(outletCount: number): number {\n return OUTLET_WIDTHS[outletBucket(outletCount)];\n}\n\n/** La classe che porta quella larghezza: unico modo di sopravvivere ai riposizionamenti. */\nexport function flowNodeWidthClass(outletCount: number): string {\n return `fb-node--outlets-${outletBucket(outletCount)}`;\n}\n\n\n@Component({\n selector: 'fb-flow-canvas',\n standalone: true,\n imports: [FFlowModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './flow-canvas.component.html',\n styleUrl: './flow-canvas.component.css',\n})\nexport class FlowCanvasComponent {\n private readonly store = inject(FlowDocumentStore);\n private readonly dictionaries = inject(FlowDictionaryStore);\n private readonly validation = inject(FlowValidationStore);\n\n /**\n * Marker di fine arco: la variante \"all states\" crea sia quello normale sia quello\n * selezionato, evitando che l'arco selezionato perda la punta.\n */\n readonly markerEnd = EFMarkerType.END_ALL_STATES;\n\n /**\n * I lati da cui gli archi partono e arrivano: uscite in basso, ingresso in alto.\n * Dichiararli e' quello che rende il grafo leggibile dall'alto verso il basso; lasciando\n * fare a foblex, il lato viene calcolato dalla posizione relativa e un ramo che risale\n * uscirebbe di fianco.\n */\n readonly sides = EFConnectableSide;\n\n /** Il nome dell'elemento selezionato, `$start` per lo Start. */\n readonly selectedName = input<string | null>(null);\n\n /**\n * L'outline del backend, quando disponibile: da' la raggiungibilita' autoritativa (§6.4).\n * Assente → si usa il calcolo locale.\n */\n readonly outline = input<FlowOutline | null>(null);\n\n readonly selectionChange = output<string | null>();\n readonly nodeOpened = output<string>();\n readonly nodeRemoveRequested = output<string>();\n readonly nodeDuplicateRequested = output<string>();\n /** Rilascio di un elemento dalla palette: tipo + punto nel sistema del canvas. */\n readonly elementDropped = output<{ type: FlowElementType; x: number; y: number }>();\n\n /** Raggiungibilita': backend se c'e', locale altrimenti. */\n private readonly reachability = computed<ReadonlySet<string>>(() => {\n const outline = this.outline();\n if (outline?.nodes?.length) {\n const unreachable = new Set(\n outline.nodes.filter((node) => node.isReachable === false).map((node) => node.name),\n );\n const names = new Set(this.store.nodes().map((reference) => reference.name));\n for (const name of unreachable) {\n names.delete(name);\n }\n return names;\n }\n return this.store.reachableNames();\n });\n\n readonly nodes = computed<FlowCanvasNode[]>(() => {\n const result: FlowCanvasNode[] = [];\n const reachable = this.reachability();\n\n const start = this.store.start() as FlowAnyNode;\n result.push(\n this.toCanvasNode({\n name: START_NODE_NAME,\n type: 'Start',\n node: start,\n label: 'Start',\n typeLabel: 'Avvio',\n category: 'Avvio',\n isStart: true,\n // Lo Start e' raggiungibile per definizione: e' il punto di ingresso.\n isReachable: true,\n subtitle: this.startSubtitle(),\n }),\n );\n\n for (const reference of this.store.nodes()) {\n result.push(\n this.toCanvasNode({\n name: reference.name,\n type: reference.type,\n node: reference.node,\n label: reference.node.label || reference.name,\n typeLabel: this.dictionaries.labelOf(reference.type),\n category: this.dictionaries.elementType(reference.type)?.category ?? null,\n isStart: false,\n isReachable: reachable.has(reference.name),\n subtitle: this.subtitleOf(reference.type, reference.node),\n }),\n );\n }\n return result;\n });\n\n private toCanvasNode(input: {\n name: string;\n type: FlowElementType | 'Start';\n node: FlowAnyNode;\n label: string;\n typeLabel: string;\n category: string | null;\n isStart: boolean;\n isReachable: boolean;\n subtitle: string | null;\n }): FlowCanvasNode {\n const outlets = outletsOf(input.type, input.node);\n const issues = this.validation.issuesByElement().get(input.isStart ? '' : input.name) ?? [];\n return {\n icon: elementIcon(input.type, input.typeLabel),\n widthClass: flowNodeWidthClass(outlets.length),\n showsOutletLabels: outlets.length > 1,\n name: input.name,\n id: canvasNodeId(input.name),\n type: input.type,\n typeLabel: input.typeLabel,\n label: input.label,\n description: (input.node.description as string | undefined) ?? null,\n position: { x: input.node.locationX ?? 0, y: input.node.locationY ?? 0 },\n outlets,\n isStart: input.isStart,\n category: input.category,\n isReachable: input.isReachable,\n severity: input.isStart ? null : this.validation.severityOf(input.name),\n issueCount: input.isStart ? 0 : issues.length,\n hasAutomaticOutput: !input.isStart && this.dictionaries.hasAutomaticOutput(input.type as string),\n subtitle: input.subtitle,\n // Un ramo dichiarato senza destinazione non e' un arco: si mostra sul node, perche'\n // un arco che non arriva da nessuna parte non e' disegnabile (§6.4, `to: null`).\n danglingOutlets: outlets.filter((outlet) => {\n const connector = outlet.read(input.node);\n return !!connector && !connector.targetReference;\n }),\n };\n }\n\n /** Gli archi con destinazione: solo questi diventano `<f-connection>`. */\n readonly edges = computed<FlowCanvasEdge[]>(() => {\n const known = new Set(this.nodes().map((node) => node.name));\n return this.store\n .edges()\n .filter((edge) => !!edge.to && known.has(edge.to))\n .map((edge) => ({\n id: edge.id,\n sourceId: sourceConnectorId(edge.from, edge.outletKey),\n targetId: targetConnectorId(edge.to as string),\n kind: edge.kind,\n label: edge.label,\n isGoTo: !!edge.isGoTo,\n }));\n });\n\n /** Sintesi mostrata sul node: la cosa che serve sapere senza aprire l'inspector. */\n private subtitleOf(type: FlowElementType, node: FlowAnyNode): string | null {\n switch (type) {\n case 'Screen':\n return (node['formName'] as string) || null;\n case 'RecordLookup':\n case 'RecordCreate':\n case 'RecordUpdate':\n case 'RecordDelete':\n return (node['object'] as string) || (node['inputReference'] as string) || null;\n case 'Loop':\n return (node['collectionReference'] as string) || null;\n case 'CollectionProcessor': {\n const kind = node['collectionProcessorType'] as string | undefined;\n const collection = node['collectionReference'] as string | undefined;\n return [kind, collection].filter(Boolean).join(' · ') || null;\n }\n case 'Decision': {\n const rules = (node['rules'] as unknown[] | undefined)?.length ?? 0;\n return rules ? `${rules} ${rules === 1 ? 'regola' : 'regole'}` : null;\n }\n case 'Assignment': {\n const items = (node['assignmentItems'] as unknown[] | undefined)?.length ?? 0;\n return items ? `${items} ${items === 1 ? 'operazione' : 'operazioni'}` : null;\n }\n case 'ActionCall': {\n const actionType = node['actionType'] as string | undefined;\n const actionName = node['actionName'] as string | undefined;\n return [actionType, actionName].filter(Boolean).join(' · ') || null;\n }\n case 'ScriptCall':\n return (node['scriptName'] as string) || null;\n case 'Subflow':\n return (node['flowName'] as string) || null;\n case 'Wait': {\n const events = (node['waitEvents'] as unknown[] | undefined)?.length ?? 0;\n return events ? `${events} ${events === 1 ? 'evento' : 'eventi'}` : null;\n }\n case 'Transform':\n return (node['objectType'] as string) || null;\n case 'CustomError': {\n const messages = (node['customErrorMessages'] as unknown[] | undefined)?.length ?? 0;\n return messages ? `${messages} ${messages === 1 ? 'messaggio' : 'messaggi'}` : null;\n }\n default:\n return null;\n }\n }\n\n /** Sullo Start conta il trigger: e' cio' che decide quando il flow parte (§3.4). */\n private startSubtitle(): string | null {\n const start = this.store.start();\n const triggerType = start.triggerType ?? 'None';\n const label = FlowDictionaryStore.labelIn(this.dictionaries.triggerTypes(), triggerType);\n if (triggerType === 'None') {\n return label || 'Su richiesta';\n }\n return [label, start.object].filter(Boolean).join(' · ');\n }\n\n // -------------------------------------------------------------------------\n // Gesti\n // -------------------------------------------------------------------------\n\n /**\n * Creazione di un arco. `targetId` assente significa rilascio nel vuoto: si lascia il\n * ramo dichiarato ma senza destinazione, che e' esattamente il \"ramo incompleto\" del\n * modello, invece di scartare il gesto.\n */\n onCreateConnection(event: { sourceId: string; targetId?: string }): void {\n const source = parseSourceConnectorId(event.sourceId);\n if (!source) {\n return;\n }\n const target = event.targetId ? parseTargetConnectorId(event.targetId) : null;\n if (target === source.nodeName) {\n // `CONNECTOR_SELF_LOOP`: un node che punta a se stesso non e' mai voluto.\n return;\n }\n this.store.setConnector(source.nodeName, source.outletKey, target ?? undefined);\n }\n\n /** Riassegnazione di un arco già disegnato, da un capo o dall'altro. */\n onReassignConnection(event: {\n endpoint: string;\n previousSourceId: string;\n nextSourceId?: string;\n previousTargetId: string;\n nextTargetId?: string;\n }): void {\n const previousSource = parseSourceConnectorId(event.previousSourceId);\n if (!previousSource) {\n return;\n }\n if (event.endpoint === 'target') {\n const nextTarget = event.nextTargetId ? parseTargetConnectorId(event.nextTargetId) : null;\n this.store.setConnector(previousSource.nodeName, previousSource.outletKey, nextTarget ?? undefined);\n return;\n }\n // Capo sorgente spostato: l'arco cambia uscita, la destinazione resta.\n const nextSource = event.nextSourceId ? parseSourceConnectorId(event.nextSourceId) : null;\n const target = parseTargetConnectorId(event.previousTargetId);\n if (!nextSource || !target) {\n return;\n }\n this.store.removeConnector(previousSource.nodeName, previousSource.outletKey);\n this.store.setConnector(nextSource.nodeName, nextSource.outletKey, target);\n }\n\n /**\n * Spostamento dei node. Un solo passo di storico per l'intero gesto: le posizioni\n * intermedie non sono modifiche che l'utente vuole annullare una per una.\n */\n onMoveNodes(event: { nodes: Array<{ id: string; position: { x: number; y: number } }> }): void {\n const moves = event.nodes\n .map((moved) => ({ name: parseCanvasNodeId(moved.id), position: moved.position }))\n .filter((moved): moved is { name: string; position: { x: number; y: number } } => !!moved.name);\n if (!moves.length) {\n return;\n }\n moves.forEach((moved, index) => {\n this.store.moveNode(moved.name, moved.position.x, moved.position.y, { silent: index > 0 });\n });\n }\n\n onSelectionChange(event: { nodeIds: string[] }): void {\n const first = event.nodeIds[0];\n this.selectionChange.emit(first ? parseCanvasNodeId(first) : null);\n }\n\n /** `Delete` sulla selezione: lo Start non e' cancellabile, e' uno per flow (§3.4). */\n onDeleteSelected(event: { nodeIds: string[] }): void {\n for (const id of event.nodeIds) {\n const name = parseCanvasNodeId(id);\n if (name && name !== START_NODE_NAME) {\n this.nodeRemoveRequested.emit(name);\n }\n }\n }\n\n /** Rilascio di un elemento trascinato dalla palette. */\n onCreateNode(event: { data: unknown; externalItemRect: { x: number; y: number } }): void {\n const type = typeof event.data === 'string' ? event.data : (event.data as { type?: string })?.type;\n if (!type) {\n return;\n }\n this.elementDropped.emit({\n type,\n x: Math.round(event.externalItemRect.x),\n y: Math.round(event.externalItemRect.y),\n });\n }\n\n onNodeDoubleClick(name: string): void {\n this.nodeOpened.emit(name);\n }\n\n /**\n * Il bottone «✎» sul node: apre il dettaglio senza aspettare il doppio click, che e' un\n * gesto che non si vede. `stopPropagation` evita che il click valga anche come selezione\n * dell'area sottostante.\n */\n onEditClick(event: Event, name: string): void {\n event.stopPropagation();\n this.nodeOpened.emit(name);\n }\n\n connectorIdOf(node: FlowCanvasNode, outletKey: string): string {\n return sourceConnectorId(node.name, outletKey);\n }\n\n targetIdOf(node: FlowCanvasNode): string {\n return targetConnectorId(node.name);\n }\n\n isSelected(node: FlowCanvasNode): boolean {\n return this.selectedName() === node.name;\n }\n\n /** Etichette dei rami dichiarati senza destinazione, per il tooltip del badge. */\n danglingLabels(node: FlowCanvasNode): string {\n return node.danglingOutlets.map((outlet) => outlet.label).join(', ');\n }\n\n /** Classe della fascia colorata, per categoria del dizionario. */\n categoryClass(node: FlowCanvasNode): string {\n const category = (node.category ?? '').toLowerCase();\n if (node.isStart) {\n return 'cat-start';\n }\n if (category.startsWith('inter')) {\n return 'cat-screen';\n }\n if (category.startsWith('log')) {\n return 'cat-logic';\n }\n if (category.startsWith('dat')) {\n return 'cat-data';\n }\n if (category.startsWith('az')) {\n return 'cat-action';\n }\n if (category.startsWith('flow')) {\n return 'cat-flow';\n }\n return 'cat-other';\n }\n}\n","<!--\n Gerarchia obbligatoria: f-flow > f-canvas > fNode / f-connection.\n I `@for` sono direttamente dentro <f-canvas>: nessun wrapper, quindi non serve\n `ngProjectAs` (che sarebbe indispensabile con blocchi annidati).\n-->\n<f-flow\n fDraggable\n (fCreateConnection)=\"onCreateConnection($event)\"\n (fReassignConnection)=\"onReassignConnection($event)\"\n (fMoveNodes)=\"onMoveNodes($event)\"\n (fSelectionChange)=\"onSelectionChange($event)\"\n (fDeleteSelected)=\"onDeleteSelected($event)\"\n (fCreateNode)=\"onCreateNode($event)\"\n>\n <f-canvas fZoom>\n <f-background>\n <f-circle-pattern />\n </f-background>\n\n @for (edge of edges(); track edge.id) {\n <f-connection\n [fConnectionId]=\"edge.id\"\n [fSourceId]=\"edge.sourceId\"\n [fTargetId]=\"edge.targetId\"\n fBehavior=\"floating\"\n [fType]=\"edge.isGoTo ? 'segment' : 'bezier'\"\n [class]=\"'fb-edge fb-edge--' + edge.kind + (edge.isGoTo ? ' fb-edge--goto' : '')\"\n >\n <f-connection-marker-arrow [type]=\"markerEnd\" />\n @if (edge.label) {\n <div fConnectionContent class=\"fb-edge-label\">{{ edge.label }}</div>\n }\n </f-connection>\n }\n\n @for (node of nodes(); track node.id) {\n <div\n fNode\n fDragHandle\n [fNodeId]=\"node.id\"\n [fNodePosition]=\"node.position\"\n [class]=\"'fb-node ' + categoryClass(node) + ' ' + node.widthClass\"\n [class.fb-node--start]=\"node.isStart\"\n [class.fb-node--selected]=\"isSelected(node)\"\n [class.fb-node--unreachable]=\"!node.isReachable\"\n [class.fb-node--error]=\"node.severity === 'Error'\"\n [class.fb-node--warning]=\"node.severity === 'Warning'\"\n (dblclick)=\"onNodeDoubleClick(node.name)\"\n >\n <!--\n Lo Start non ha ingresso: e' il punto di partenza (§3.4).\n `fConnectorConnectableSide` e' cio' che fa entrare l'arco dall'alto: senza, foblex\n calcola il lato e un arco che scende dal node sopra potrebbe agganciarsi di fianco.\n -->\n @if (!node.isStart) {\n <div\n fConnector\n fConnectorType=\"target\"\n [fConnectorId]=\"targetIdOf(node)\"\n [fConnectorConnectableSide]=\"sides.TOP\"\n fConnectorMultiple=\"true\"\n class=\"fb-connector fb-connector--in\"\n title=\"Ingresso\"\n ></div>\n }\n\n <div class=\"fb-node__head\">\n <span class=\"fb-node__icon\" aria-hidden=\"true\">{{ node.icon }}</span>\n <div class=\"fb-node__text\">\n <span class=\"fb-node__title\" [title]=\"node.description || node.label\">{{ node.label }}</span>\n <span class=\"fb-node__sub\">\n {{ node.typeLabel }}\n @if (node.subtitle) {\n <span class=\"fb-node__sub-dot\">·</span>{{ node.subtitle }}\n }\n </span>\n </div>\n @if (node.hasAutomaticOutput) {\n <!-- L'elemento espone il proprio risultato sotto il proprio nome (§4.5). -->\n <span class=\"fb-node__auto\" title=\"Espone un output automatico referenziabile come «{{ node.name }}»\">\n ƒ\n </span>\n }\n <!--\n `fDragBlocker` impedisce che il pointerdown sul bottone diventi un trascinamento\n del node: senza, aprire il dettaglio sposterebbe l'elemento di qualche pixel.\n -->\n <button\n type=\"button\"\n fDragBlocker\n class=\"fb-node__edit\"\n [attr.aria-label]=\"'Apri il dettaglio di ' + node.label\"\n title=\"Apri il dettaglio\"\n (click)=\"onEditClick($event, node.name)\"\n >\n ✎\n </button>\n </div>\n\n <div class=\"fb-node__meta\">\n @if (!node.isStart) {\n <span class=\"fb-node__name\" [title]=\"'Nome tecnico: ' + node.name\">{{ node.name }}</span>\n }\n @if (!node.isReachable) {\n <span class=\"fb-badge fb-badge--unreachable\" title=\"Nessun percorso raggiunge questo elemento dallo Start\">\n scollegato\n </span>\n }\n @if (node.issueCount > 0) {\n <span\n class=\"fb-badge\"\n [class.fb-badge--error]=\"node.severity === 'Error'\"\n [class.fb-badge--warning]=\"node.severity === 'Warning'\"\n [class.fb-badge--info]=\"node.severity === 'Info'\"\n [title]=\"node.issueCount + ' rilievi di validazione'\"\n >\n {{ node.issueCount }}\n </span>\n }\n @if (node.danglingOutlets.length > 0) {\n <span\n class=\"fb-badge fb-badge--dangling\"\n [title]=\"'Rami dichiarati senza destinazione: ' + danglingLabels(node)\"\n >\n ramo incompleto\n </span>\n }\n </div>\n\n <!--\n Le uscite stanno sul bordo **inferiore**, una per ramo, nell'ordine in cui il modello\n le dichiara: per una Decision e' l'ordine di valutazione delle regole, che e'\n semantico (§5.3), e da sinistra a destra si legge come la lista nell'inspector.\n L'etichetta si mostra solo quando i rami sono piu' di uno: su un `next` unico\n direbbe soltanto «Successivo».\n -->\n <div class=\"fb-node__outlets\" [class.fb-node__outlets--labelled]=\"node.showsOutletLabels\">\n @for (outlet of node.outlets; track outlet.key) {\n <div class=\"fb-outlet\">\n @if (node.showsOutletLabels) {\n <span class=\"fb-outlet__label\" [title]=\"outlet.label\">{{ outlet.label }}</span>\n }\n <div\n fConnector\n fConnectorType=\"source\"\n [fConnectorId]=\"connectorIdOf(node, outlet.key)\"\n [fConnectorConnectableSide]=\"sides.BOTTOM\"\n [class]=\"'fb-connector fb-connector--out fb-connector--' + outlet.kind\"\n [title]=\"outlet.label\"\n ></div>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Anteprima dell'arco durante il trascinamento. -->\n <f-connection-for-create fBehavior=\"floating\" fType=\"bezier\" class=\"fb-edge fb-edge--creating\">\n <f-connection-marker-arrow [type]=\"markerEnd\" />\n </f-connection-for-create>\n\n <f-selection-area />\n </f-canvas>\n\n <f-minimap [fMinSize]=\"1200\" class=\"fb-minimap\" />\n</f-flow>\n","/**\n * La palette degli elementi — FRONTEND.md §3.2, §11 (\"Aggiungere un elemento\").\n *\n * L'elenco arriva dal dizionario `elementTypes`: nessun tipo e' cablato qui. I tipi con\n * `isSupported: false` sono nascosti, perche' il motore li rifiuta e la validazione li\n * segnala come `ELEMENT_NOT_SUPPORTED`: lasciarli disegnare produce un flow che non parte.\n *\n * Ogni voce e' un `fExternalItem`: si trascina sul canvas e il punto di rilascio diventa\n * `locationX`/`locationY`. Il click aggiunge l'elemento al centro della vista.\n */\n\nimport { ChangeDetectionStrategy, Component, computed, inject, input, output, signal } from '@angular/core';\nimport { FFlowModule } from '@foblex/flow';\n\nimport { FlowDictionaryStore } from '../../core/flow-dictionary.store';\nimport { elementIcon } from '../../core/element-icons';\nimport { FlowElementTypeEntry } from '../../model/dictionary.model';\nimport { FlowElementType } from '../../model/flow.model';\n\ninterface PaletteGroup {\n category: string;\n entries: FlowElementTypeEntry[];\n}\n\n@Component({\n selector: 'fb-element-palette',\n standalone: true,\n imports: [FFlowModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './element-palette.component.html',\n styleUrl: './element-palette.component.css',\n})\nexport class ElementPaletteComponent {\n private readonly dictionaries = inject(FlowDictionaryStore);\n\n /**\n * Il `processType` del flow: un flow `AutoLaunched` che contiene screen e' un errore di\n * validazione, perche' non c'e' nessuno a cui mostrarli (§3.1). La palette lo segnala\n * prima che l'utente lo scopra dal pannello dei problemi.\n */\n readonly processType = input<string | undefined>(undefined);\n\n readonly elementPicked = output<FlowElementType>();\n\n private readonly filter = signal('');\n\n readonly groups = computed<PaletteGroup[]>(() => {\n const needle = this.filter().trim().toLowerCase();\n const groups: PaletteGroup[] = [];\n for (const entry of this.dictionaries.paletteTypes()) {\n if (needle && !`${entry.label} ${entry.value}`.toLowerCase().includes(needle)) {\n continue;\n }\n const category = entry.category ?? 'Altro';\n let group = groups.find((candidate) => candidate.category === category);\n if (!group) {\n group = { category, entries: [] };\n groups.push(group);\n }\n group.entries.push(entry);\n }\n return groups;\n });\n\n readonly isEmpty = computed(() => this.dictionaries.paletteTypes().length === 0);\n\n onFilter(value: string): void {\n this.filter.set(value);\n }\n\n pick(entry: FlowElementTypeEntry): void {\n this.elementPicked.emit(entry.value);\n }\n\n /** Uno screen in un flow che non mostra nulla: si segnala, non si nasconde (§3.1). */\n isIncompatible(entry: FlowElementTypeEntry): boolean {\n return entry.value === 'Screen' && this.processType() === 'AutoLaunched';\n }\n\n incompatibleHint(entry: FlowElementTypeEntry): string | null {\n if (!this.isIncompatible(entry)) {\n return null;\n }\n return 'In un flow AutoLaunched non c’e’ nessuno a cui mostrare uno screen: sarebbe un errore di validazione.';\n }\n\n /** Lo stesso glifo che l'elemento avra' sul canvas, così il trascinamento e' prevedibile. */\n iconOf(entry: FlowElementTypeEntry): string {\n return elementIcon(entry.value, entry.label);\n }\n\n categoryClass(category: string): string {\n const normalized = category.toLowerCase();\n if (normalized.startsWith('inter')) {\n return 'cat-screen';\n }\n if (normalized.startsWith('log')) {\n return 'cat-logic';\n }\n if (normalized.startsWith('dat')) {\n return 'cat-data';\n }\n if (normalized.startsWith('az')) {\n return 'cat-action';\n }\n if (normalized.startsWith('flow')) {\n return 'cat-flow';\n }\n return 'cat-other';\n }\n}\n","<div class=\"fb-palette__search\">\n <input\n type=\"search\"\n placeholder=\"Cerca un elemento\"\n aria-label=\"Cerca un elemento\"\n (input)=\"onFilter($any($event.target).value)\"\n />\n</div>\n\n@if (isEmpty()) {\n <p class=\"fb-palette__empty\">\n Il dizionario degli elementi non e’ ancora disponibile.\n </p>\n}\n\n<div class=\"fb-palette__groups\">\n @for (group of groups(); track group.category) {\n <section class=\"fb-palette__group\">\n <h3 class=\"fb-palette__category\">{{ group.category }}</h3>\n @for (entry of group.entries; track entry.value) {\n <!--\n `fExternalItem` rende la voce trascinabile sul canvas: il rilascio emette\n `fCreateNode` con questo `fData` e la posizione, che diventa locationX/locationY.\n -->\n <button\n type=\"button\"\n class=\"fb-palette__item\"\n fExternalItem\n [fExternalItemId]=\"entry.value\"\n [fData]=\"entry.value\"\n [class.fb-palette__item--warn]=\"isIncompatible(entry)\"\n [title]=\"incompatibleHint(entry) || entry.description || entry.label\"\n (click)=\"pick(entry)\"\n >\n <span class=\"fb-palette__icon\" [class]=\"'fb-palette__icon ' + categoryClass(group.category)\">\n {{ iconOf(entry) }}\n </span>\n <span class=\"fb-palette__text\">\n <span class=\"fb-palette__label\">{{ entry.label }}</span>\n @if (entry.hasAutomaticOutput) {\n <span class=\"fb-palette__flag\" title=\"Espone un output automatico sotto il nome dell’elemento\">\n output automatico\n </span>\n }\n @if (entry.hasFaultConnector) {\n <span class=\"fb-palette__flag\" title=\"Ha un ramo di errore che l’autore puo’ prevedere\">\n ramo di errore\n </span>\n }\n </span>\n @if (isIncompatible(entry)) {\n <span class=\"fb-palette__warn\" aria-hidden=\"true\">!</span>\n }\n </button>\n }\n </section>\n }\n</div>\n","/**\n * Selettore di riferimento — FRONTEND.md §4.1, §4.5, §6.4, §13.3.\n *\n * Un riferimento e' testo libero, e un nome sbagliato e' indistinguibile da uno giusto se\n * non si conosce l'insieme dei nomi definiti. Questo componente chiede l'insieme a\n * `POST /flows/references` (o `.../writable` per le destinazioni) invece di far digitare:\n * e' l'unico modo di evitare `REFERENCE_UNKNOWN` prima di scoprirlo dalla validazione.\n *\n * Include gli **output automatici** (`Leggi_Ordine.Numero`), che sono riferimenti validi\n * pur non essendo dichiarati in nessuna collection di risorse: la primitiva li restituisce\n * già, ed e' il motivo per cui non si ricostruisce l'elenco lato client.\n *\n * Resta possibile scrivere a mano: i percorsi di relazione e i campi di un record non\n * sono enumerabili, e gli scope dell'host (`$User.X`) non sono verificabili affatto.\n */\n\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\n\nimport { FlowBuilderApi } from '../../api/flow-builder-api';\nimport { FlowDocumentStore } from '../../core/flow-document.store';\nimport { FlowDictionaryStore } from '../../core/flow-dictionary.store';\nimport { FlowReference } from '../../model/api.model';\nimport { FlowDataType } from '../../model/flow.model';\nimport { referenceRoot } from '../../core/flow-name.util';\n\n@Component({\n selector: 'fb-reference-picker',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './reference-picker.component.html',\n styleUrl: './reference-picker.component.css',\n})\nexport class ReferencePickerComponent {\n private readonly api = inject(FlowBuilderApi);\n private readonly store = inject(FlowDocumentStore);\n private readonly dictionaries = inject(FlowDictionaryStore);\n\n readonly value = input<string | undefined>(undefined);\n readonly label = input<string>('Riferimento');\n readonly placeholder = input<string>('Scegli o scrivi un riferimento');\n readonly disabled = input(false);\n\n /** Filtra i riferimenti compatibili col campo che si sta compilando (§6.4). */\n readonly dataType = input<FlowDataType | undefined>(undefined);\n readonly isCollection = input<boolean | undefined>(undefined);\n readonly objectType = input<string | undefined>(undefined);\n\n /**\n * `true` → propone solo destinazioni scrivibili. Assegnare a una costante o a una\n * formula e' `TARGET_NOT_WRITABLE` (§4.6).\n */\n readonly writableOnly = input(false);\n\n /**\n * `true` → aggiunge `$Flow.CurrentStage` e `$Flow.ActiveStages` alle destinazioni.\n * Sono le sole variabili globali scrivibili, e solo se il flow dichiara stage (§5.2).\n */\n readonly allowStageTargets = input(false);\n\n /**\n * `true` → a sinistra ci va il nome di un **node**, non di una risorsa: e' il caso di\n * `WasVisited` e `HasError` (§4.3).\n */\n readonly elementsOnly = input(false);\n\n readonly valueChange = output<string | undefined>();\n\n private readonly references = signal<FlowReference[]>([]);\n private readonly isLoading = signal(false);\n private readonly loadError = signal<string | null>(null);\n\n readonly isOpen = signal(false);\n readonly query = signal('');\n\n constructor() {\n // Le proposte dipendono dal documento in lavorazione: cambia il documento, cambia\n // l'elenco (un elemento appena aggiunto espone subito il suo output automatico).\n effect(() => {\n const definition = this.store.document();\n const writable = this.writableOnly();\n const dataType = this.dataType();\n const isCollection = this.isCollection();\n const objectType = this.objectType();\n if (this.elementsOnly()) {\n // I node li conosce già il documento: nessuna richiesta necessaria.\n this.references.set(\n this.store.nodes().map((reference) => ({\n name: reference.name,\n label: (reference.node.label as string) ?? null,\n kind: 'ElementOutput',\n description: this.dictionaries.labelOf(reference.type),\n isWritable: false,\n })),\n );\n return;\n }\n const query = { definition, dataType, isCollection, objectType };\n this.isLoading.set(true);\n this.loadError.set(null);\n const request = writable ? this.api.getWritableReferences(query) : this.api.getReferences(query);\n void request\n .then((list) => this.references.set(list ?? []))\n .catch((error: unknown) => {\n // Senza l'elenco il campo resta scrivibile a mano: e' meglio di un campo bloccato.\n this.loadError.set(error instanceof Error ? error.message : String(error));\n this.references.set([]);\n })\n .finally(() => this.isLoading.set(false));\n });\n }\n\n /** Le due globali di stage, aggiunte alle destinazioni quando il flow dichiara stage. */\n private readonly stageTargets = computed<FlowReference[]>(() => {\n if (!this.allowStageTargets() || !(this.store.document().stages?.length ?? 0)) {\n return [];\n }\n return [\n {\n name: '$Flow.CurrentStage',\n kind: 'Global',\n isWritable: true,\n description: 'Lo stage corrente: si fa avanzare con un Assignment.',\n },\n {\n name: '$Flow.ActiveStages',\n kind: 'Global',\n isCollection: true,\n isWritable: true,\n description: 'La collection degli stage attivi.',\n },\n ];\n });\n\n readonly options = computed<FlowReference[]>(() => {\n const needle = this.query().trim().toLowerCase();\n const all = [...this.stageTargets(), ...this.references()];\n if (!needle) {\n return all;\n }\n return all.filter((reference) =>\n `${reference.name} ${reference.label ?? ''} ${reference.description ?? ''}`\n .toLowerCase()\n .includes(needle),\n );\n });\n\n /** Le opzioni raggruppate per `kind`, così gli output automatici si distinguono. */\n readonly groups = computed<Array<{ kind: string; label: string; items: FlowReference[] }>>(() => {\n const groups: Array<{ kind: string; label: string; items: FlowReference[] }> = [];\n for (const reference of this.options()) {\n const kind = reference.kind ?? 'Variable';\n let group = groups.find((candidate) => candidate.kind === kind);\n if (!group) {\n group = { kind, label: ReferencePickerComponent.kindLabel(kind), items: [] };\n groups.push(group);\n }\n group.items.push(reference);\n }\n return groups;\n });\n\n private static kindLabel(kind: string): string {\n switch (kind) {\n case 'Variable':\n return 'Variabili';\n case 'Constant':\n return 'Costanti';\n case 'Formula':\n return 'Formule';\n case 'TextTemplate':\n return 'Text template';\n case 'Choice':\n return 'Choice';\n case 'DynamicChoiceSet':\n return 'Dynamic choice set';\n case 'Stage':\n return 'Stage';\n case 'ElementOutput':\n return 'Output di elementi';\n case 'Global':\n return 'Variabili globali';\n default:\n return kind;\n }\n }\n\n /**\n * Stato del valore corrente rispetto all'elenco.\n * - `known`: presente nell'elenco;\n * - `navigated`: la radice e' nota ma c'e' un percorso dopo il punto (campo di record,\n * output automatico navigato): la validazione non verifica i percorsi con il punto,\n * quindi si accetta senza segnalare;\n * - `host`: scope dell'host, non verificabile per costruzione (§4.1);\n * - `unknown`: nessuna corrispondenza: si avvisa, senza bloccare.\n */\n readonly valueState = computed<'empty' | 'known' | 'navigated' | 'host' | 'unknown'>(() => {\n const value = (this.value() ?? '').trim();\n if (!value) {\n return 'empty';\n }\n const all = [...this.stageTargets(), ...this.references()];\n if (all.some((reference) => reference.name === value)) {\n return 'known';\n }\n const root = referenceRoot(value);\n const global = this.dictionaries\n .globalVariables()\n .find((entry) => entry.scope === root || entry.value === root);\n if (global?.isResolvedByHost) {\n return 'host';\n }\n if (all.some((reference) => reference.name === root)) {\n return 'navigated';\n }\n // Se l'elenco non e' arrivato, non si accusa nessuno.\n return this.references().length === 0 && this.isLoading() ? 'empty' : 'unknown';\n });\n\n readonly hint = computed<string | null>(() => {\n switch (this.valueState()) {\n case 'host':\n return 'Scope risolto dal sistema ospite: il backend non puo’ verificarne il percorso.';\n case 'navigated':\n return 'Percorso su un riferimento noto: la validazione non verifica i campi dopo il punto.';\n case 'unknown':\n return 'Questo nome non e’ fra i riferimenti disponibili: la validazione lo segnalerebbe.';\n default:\n return null;\n }\n });\n\n readonly errorMessage = computed(() => this.loadError());\n\n open(): void {\n if (this.disabled()) {\n return;\n }\n this.isOpen.set(true);\n }\n\n close(): void {\n this.isOpen.set(false);\n this.query.set('');\n }\n\n toggle(): void {\n this.isOpen() ? this.close() : this.open();\n }\n\n onQuery(value: string): void {\n this.query.set(value);\n }\n\n choose(reference: FlowReference): void {\n this.valueChange.emit(reference.name);\n this.close();\n }\n\n /** Scrittura libera: indispensabile per i campi di un record e per gli scope dell'host. */\n onManualInput(value: string): void {\n this.valueChange.emit(value.trim() ? value.trim() : undefined);\n }\n\n clear(): void {\n this.valueChange.emit(undefined);\n }\n\n describe(reference: FlowReference): string {\n const parts: string[] = [];\n if (reference.dataType) {\n parts.push(reference.isCollection ? `${reference.dataType}[]` : reference.dataType);\n }\n if (reference.objectType) {\n parts.push(reference.objectType);\n }\n if (reference.description) {\n parts.push(reference.description);\n }\n return parts.join(' · ');\n }\n}\n","<div class=\"fb-ref\" [class.fb-ref--open]=\"isOpen()\">\n <div class=\"fb-ref__control\">\n <input\n class=\"fb-ref__input\"\n type=\"text\"\n [value]=\"value() || ''\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"label()\"\n (input)=\"onManualInput($any($event.target).value)\"\n (focus)=\"open()\"\n />\n <button\n type=\"button\"\n class=\"fb-ref__toggle\"\n [disabled]=\"disabled()\"\n [attr.aria-expanded]=\"isOpen()\"\n aria-label=\"Mostra i riferimenti disponibili\"\n (click)=\"toggle()\"\n >\n ▾\n </button>\n @if (value()) {\n <button type=\"button\" class=\"fb-ref__clear\" aria-label=\"Svuota\" (click)=\"clear()\">×</button>\n }\n </div>\n\n @if (hint()) {\n <p class=\"fb-ref__hint\" [class.fb-ref__hint--warn]=\"valueState() === 'unknown'\">{{ hint() }}</p>\n }\n @if (errorMessage()) {\n <p class=\"fb-ref__hint fb-ref__hint--warn\">\n Elenco dei riferimenti non disponibile: puoi scrivere il nome a mano.\n </p>\n }\n\n @if (isOpen()) {\n <div class=\"fb-ref__panel\" role=\"listbox\">\n <input\n class=\"fb-ref__search\"\n type=\"search\"\n placeholder=\"Filtra\"\n aria-label=\"Filtra i riferimenti\"\n (input)=\"onQuery($any($event.target).value)\"\n />\n @if (groups().length === 0) {\n <p class=\"fb-ref__empty\">Nessun riferimento compatibile.</p>\n }\n @for (group of groups(); track group.kind) {\n <div class=\"fb-ref__group\">\n <span class=\"fb-ref__group-label\">{{ group.label }}</span>\n @for (item of group.items; track item.name) {\n <button\n type=\"button\"\n class=\"fb-ref__option\"\n role=\"option\"\n [attr.aria-selected]=\"item.name === value()\"\n (click)=\"choose(item)\"\n >\n <span class=\"fb-ref__name\">{{ item.name }}</span>\n <span class=\"fb-ref__meta\">{{ describe(item) }}</span>\n </button>\n }\n </div>\n }\n <button type=\"button\" class=\"fb-ref__close\" (click)=\"close()\">Chiudi</button>\n </div>\n }\n</div>\n","/**\n * `[fbValue]` su un `<select>`.\n *\n * Perche' esiste: quasi tutte le tendine dell'editor hanno opzioni che arrivano dopo il\n * primo render — dizionari, cataloghi, destinazioni dei connector, campi di un oggetto.\n * Un `[value]` normale viene applicato quando le `<option>` non esistono ancora, il browser\n * lo scarta, e Angular non lo riapplica perche' il valore del binding non e' cambiato: il\n * risultato e' una tendina che mostra «— scegli —» su un campo che nel documento ha un\n * valore. Succedeva, per esempio, sulla destinazione dello Start.\n *\n * La direttiva riallinea l'elemento al valore dichiarato a ogni giro di change detection,\n * così quando le opzioni compaiono la selezione si sistema da se'.\n */\n\nimport { AfterViewChecked, Directive, ElementRef, inject, input } from '@angular/core';\n\n@Directive({\n selector: 'select[fbValue]',\n standalone: true,\n})\nexport class SelectValueDirective implements AfterViewChecked {\n private readonly element = inject<ElementRef<HTMLSelectElement>>(ElementRef);\n\n readonly fbValue = input<string | number | null | undefined>('');\n\n ngAfterViewChecked(): void {\n const select = this.element.nativeElement;\n const value = this.fbValue();\n const normalized = value === null || value === undefined ? '' : String(value);\n if (select.value !== normalized) {\n select.value = normalized;\n }\n }\n}\n","/**\r\n * `FlowElementReferenceOrValue` — FRONTEND.md §4.2.\r\n *\r\n * La struttura accetta \"un riferimento **oppure** un valore letterale\", e va valorizzato\r\n * **uno e un solo** campo. Valorizzarne piu' di uno e' `VALUE_AMBIGUOUS`: non e' un errore\r\n * bloccante, ma rende il comportamento a runtime dipendente dall'ordine di lettura.\r\n *\r\n * Questo editor rende quella regola strutturale invece che sperata: ogni scrittura\r\n * costruisce un oggetto nuovo con **una** chiave. `formulaExpression` e' l'unico caso a\r\n * due campi (espressione + tipo atteso del risultato) e viene trattato come tale.\r\n *\r\n * Il tipo del letterale deve corrispondere al tipo della destinazione: quando il tipo e'\r\n * noto, l'editor mostra il controllo giusto e propone quella modalita' per default.\r\n */\r\n\r\nimport { ChangeDetectionStrategy, Component, computed, inject, input, output } from '@angular/core';\r\n\r\nimport { FlowDictionaryStore } from '../../core/flow-dictionary.store';\r\nimport { FlowDataType, FlowValue } from '../../model/flow.model';\r\nimport { ReferencePickerComponent } from './reference-picker.component';\r\nimport { SelectValueDirective } from './select-value.directive';\r\n\r\n/** Le modalita' offerte: una per campo del modello. */\r\nexport type ValueMode = 'reference' | 'literal' | 'formula' | 'globalConstant' | 'empty';\r\n\r\n@Component({\r\n selector: 'fb-value-editor',\r\n standalone: true,\r\n imports: [ReferencePickerComponent, SelectValueDirective],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './value-editor.component.html',\r\n styleUrl: './value-editor.component.css',\r\n})\r\nexport class ValueEditorComponent {\r\n private readonly dictionaries = inject(FlowDictionaryStore);\r\n\r\n readonly value = input<FlowValue | undefined>(undefined);\r\n readonly label = input<string>('Valore');\r\n /** Il tipo atteso dalla destinazione: guida il controllo del letterale. */\r\n readonly dataType = input<FlowDataType | undefined>(undefined);\r\n readonly objectType = input<string | undefined>(undefined);\r\n readonly isCollection = input<boolean | undefined>(undefined);\r\n readonly disabled = input(false);\r\n /** Nasconde la modalita' formula dove il modello non la prevede. */\r\n readonly allowFormula = input(true);\r\n\r\n readonly valueChange = output<FlowValue | undefined>();\r\n\r\n /** La modalita' dedotta dal campo effettivamente valorizzato. */\r\n readonly mode = computed<ValueMode>(() => {\r\n const value = this.value();\r\n if (!value) {\r\n return this.dataType() ? 'literal' : 'reference';\r\n }\r\n if (value.formulaExpression !== undefined) {\r\n return 'formula';\r\n }\r\n if (value.elementReference !== undefined) {\r\n return value.elementReference.startsWith('$GlobalConstant.') ? 'globalConstant' : 'reference';\r\n }\r\n if (\r\n value.stringValue !== undefined ||\r\n value.integerValue !== undefined ||\r\n value.numberValue !== undefined ||\r\n value.dateValue !== undefined ||\r\n value.booleanValue !== undefined ||\r\n value.enumValue !== undefined\r\n ) {\r\n return 'literal';\r\n }\r\n return 'empty';\r\n });\r\n\r\n /**\r\n * Quanti campi di valore sono valorizzati: piu' di uno e' `VALUE_AMBIGUOUS` (§4.2).\r\n * Puo' capitare su un documento arrivato da un altro editor: si segnala e si offre\r\n * di normalizzarlo, invece di nasconderlo.\r\n */\r\n readonly filledFieldCount = computed(() => {\r\n const value = this.value();\r\n if (!value) {\r\n return 0;\r\n }\r\n const keys: Array<keyof FlowValue> = [\r\n 'elementReference',\r\n 'stringValue',\r\n 'integerValue',\r\n 'numberValue',\r\n 'dateValue',\r\n 'booleanValue',\r\n 'enumValue',\r\n 'formulaExpression',\r\n ];\r\n return keys.filter((key) => value[key] !== undefined).length;\r\n });\r\n\r\n readonly isAmbiguous = computed(() => this.filledFieldCount() > 1);\r\n\r\n /** Il campo del valore che corrisponde al `dataType` (§4.2, tabella dei sette tipi). */\r\n readonly literalField = computed<keyof FlowValue>(() => {\r\n switch (this.dataType()) {\r\n case 'Integer':\r\n return 'integerValue';\r\n case 'Number':\r\n return 'numberValue';\r\n case 'Date':\r\n return 'dateValue';\r\n case 'Boolean':\r\n return 'booleanValue';\r\n case 'Enum':\r\n return 'enumValue';\r\n case 'String':\r\n return 'stringValue';\r\n default:\r\n return 'stringValue';\r\n }\r\n });\r\n\r\n /**\r\n * `Object` non ha un campo letterale: un record si passa per riferimento (§4.2).\r\n * Lo stesso vale per una collection.\r\n */\r\n readonly literalAllowed = computed(() => {\r\n if (this.isCollection()) {\r\n return false;\r\n }\r\n return this.dataType() !== 'Object';\r\n });\r\n\r\n readonly literalInputType = computed<string>(() => {\r\n switch (this.dataType()) {\r\n case 'Integer':\r\n case 'Number':\r\n return 'number';\r\n case 'Date':\r\n // `Date` porta data **e** ora insieme: non esiste un tipo \"ora\" separato (§4.2).\r\n return 'datetime-local';\r\n default:\r\n return 'text';\r\n }\r\n });\r\n\r\n readonly literalText = computed<string>(() => {\r\n const value = this.value();\r\n if (!value) {\r\n return '';\r\n }\r\n const field = this.literalField();\r\n const raw = value[field];\r\n if (raw === undefined || raw === null) {\r\n // Se il documento porta un tipo diverso da quello atteso, mostralo comunque:\r\n // nasconderlo farebbe sparire un valore che esiste.\r\n const fallback =\r\n value.stringValue ??\r\n value.integerValue ??\r\n value.numberValue ??\r\n value.dateValue ??\r\n value.enumValue;\r\n return fallback === undefined || fallback === null ? '' : String(fallback);\r\n }\r\n return String(raw);\r\n });\r\n\r\n readonly booleanValue = computed(() => this.value()?.booleanValue === true);\r\n\r\n readonly globalConstants = computed(() => {\r\n const entry = this.dictionaries\r\n .globalVariables()\r\n .find((candidate) => candidate.scope === '$GlobalConstant' || candidate.value === '$GlobalConstant');\r\n // Fuori dai quattro percorsi noti e' un errore di validazione: si propongono, non si\r\n // fanno digitare (§4.1).\r\n return (entry?.paths ?? []).map((path) => `$GlobalConstant.${path}`);\r\n });\r\n\r\n readonly numericScaleHint = computed(() =>\r\n this.dataType() === 'Number' ? 'Usa Number per importi e quantita’: Integer troncherebbe i decimali.' : null,\r\n );\r\n\r\n setMode(mode: ValueMode): void {\r\n switch (mode) {\r\n case 'reference':\r\n this.emit({ elementReference: '' });\r\n break;\r\n case 'literal':\r\n this.emit(this.dataType() === 'Boolean' ? { booleanValue: false } : { [this.literalField()]: '' });\r\n break;\r\n case 'formula':\r\n // L'unico caso con due campi: espressione + tipo atteso del risultato.\r\n this.emit({ formulaExpression: '', formulaDataType: this.dataType() ?? 'String' });\r\n break;\r\n case 'globalConstant':\r\n this.emit({ elementReference: this.globalConstants()[0] ?? '$GlobalConstant.Null' });\r\n break;\r\n case 'empty':\r\n this.emit(undefined);\r\n break;\r\n }\r\n }\r\n\r\n onReferenceChange(reference: string | undefined): void {\r\n this.emit(reference === undefined ? undefined : { elementReference: reference });\r\n }\r\n\r\n onLiteralChange(raw: string): void {\r\n const field = this.literalField();\r\n if (raw === '') {\r\n this.emit(undefined);\r\n return;\r\n }\r\n switch (field) {\r\n case 'integerValue': {\r\n const parsed = Number.parseInt(raw, 10);\r\n this.emit(Number.isNaN(parsed) ? undefined : { integerValue: parsed });\r\n return;\r\n }\r\n case 'numberValue': {\r\n const parsed = Number.parseFloat(raw);\r\n this.emit(Number.isNaN(parsed) ? undefined : { numberValue: parsed });\r\n return;\r\n }\r\n case 'dateValue':\r\n // Formato roundtrip senza fuso, come chiede il contratto (§2): l'input\r\n // `datetime-local` produce già `2026-08-15T00:00`, si completano i secondi.\r\n this.emit({ dateValue: raw.length === 16 ? `${raw}:00` : raw });\r\n return;\r\n case 'enumValue':\r\n this.emit({ enumValue: raw });\r\n return;\r\n default:\r\n this.emit({ stringValue: raw });\r\n }\r\n }\r\n\r\n onBooleanChange(checked: boolean): void {\r\n this.emit({ booleanValue: checked });\r\n }\r\n\r\n onFormulaChange(expression: string): void {\r\n this.emit({\r\n formulaExpression: expression,\r\n formulaDataType: this.value()?.formulaDataType ?? this.dataType() ?? 'String',\r\n });\r\n }\r\n\r\n onFormulaTypeChange(dataType: string): void {\r\n this.emit({\r\n formulaExpression: this.value()?.formulaExpression ?? '',\r\n formulaDataType: dataType,\r\n });\r\n }\r\n\r\n onGlobalConstantChange(value: string): void {\r\n this.emit({ elementReference: value });\r\n }\r\n\r\n /** Normalizza un valore ambiguo tenendo il campo della modalita' corrente. */\r\n normalize(): void {\r\n const value = this.value();\r\n if (!value) {\r\n return;\r\n }\r\n switch (this.mode()) {\r\n case 'formula':\r\n this.emit({\r\n formulaExpression: value.formulaExpression,\r\n formulaDataType: value.formulaDataType ?? this.dataType() ?? 'String',\r\n });\r\n return;\r\n case 'reference':\r\n case 'globalConstant':\r\n this.emit({ elementReference: value.elementReference });\r\n return;\r\n default: {\r\n const field = this.literalField();\r\n this.emit({ [field]: value[field] } as FlowValue);\r\n }\r\n }\r\n }\r\n\r\n private emit(value: FlowValue | undefined): void {\r\n this.valueChange.emit(value);\r\n }\r\n\r\n readonly dataTypeOptions = computed(() => this.dictionaries.dataTypes());\r\n}\r\n","<div class=\"fb-value\">\r\n <div class=\"fb-value__modes\" role=\"group\" [attr.aria-label]=\"label() + ': modalita’'\">\r\n <button\r\n type=\"button\"\r\n class=\"fb-value__mode\"\r\n [class.fb-value__mode--active]=\"mode() === 'reference'\"\r\n [disabled]=\"disabled()\"\r\n title=\"Riferimento a una risorsa o all’output di un elemento\"\r\n (click)=\"setMode('reference')\"\r\n >\r\n Riferimento\r\n </button>\r\n @if (literalAllowed()) {\r\n <button\r\n type=\"button\"\r\n class=\"fb-value__mode\"\r\n [class.fb-value__mode--active]=\"mode() === 'literal'\"\r\n [disabled]=\"disabled()\"\r\n title=\"Valore letterale del tipo della destinazione\"\r\n (click)=\"setMode('literal')\"\r\n >\r\n Valore\r\n </button>\r\n }\r\n @if (allowFormula()) {\r\n <button\r\n type=\"button\"\r\n class=\"fb-value__mode\"\r\n [class.fb-value__mode--active]=\"mode() === 'formula'\"\r\n [disabled]=\"disabled()\"\r\n title=\"Espressione calcolata dal motore di regole\"\r\n (click)=\"setMode('formula')\"\r\n >\r\n Formula\r\n </button>\r\n }\r\n @if (globalConstants().length) {\r\n <button\r\n type=\"button\"\r\n class=\"fb-value__mode\"\r\n [class.fb-value__mode--active]=\"mode() === 'globalConstant'\"\r\n [disabled]=\"disabled()\"\r\n title=\"Costante globale\"\r\n (click)=\"setMode('globalConstant')\"\r\n >\r\n Costante globale\r\n </button>\r\n }\r\n @if (mode() !== 'empty') {\r\n <button\r\n type=\"button\"\r\n class=\"fb-value__mode fb-value__mode--clear\"\r\n [disabled]=\"disabled()\"\r\n title=\"Nessun valore\"\r\n (click)=\"setMode('empty')\"\r\n >\r\n ×\r\n </button>\r\n }\r\n </div>\r\n\r\n @if (isAmbiguous()) {\r\n <!-- Piu' campi di valore insieme: il comportamento a runtime dipende dall'ordine di lettura. -->\r\n <p class=\"fb-callout fb-callout--warn\">\r\n Questo valore ha {{ filledFieldCount() }} campi valorizzati insieme: a runtime conta l’ordine di lettura.\r\n <button type=\"button\" class=\"fb-btn fb-btn--ghost fb-btn--icon\" (click)=\"normalize()\">\r\n Tieni solo «{{ mode() === 'formula' ? 'formula' : mode() === 'literal' ? 'valore' : 'riferimento' }}»\r\n </button>\r\n </p>\r\n }\r\n\r\n @switch (mode()) {\r\n @case ('reference') {\r\n <fb-reference-picker\r\n [value]=\"value()?.elementReference\"\r\n [label]=\"label()\"\r\n [dataType]=\"dataType()\"\r\n [isCollection]=\"isCollection()\"\r\n [objectType]=\"objectType()\"\r\n [disabled]=\"disabled()\"\r\n (valueChange)=\"onReferenceChange($event)\"\r\n />\r\n }\r\n\r\n @case ('globalConstant') {\r\n <select\r\n class=\"fb-select\"\r\n [disabled]=\"disabled()\"\r\n [fbValue]=\"value()?.elementReference || ''\"\r\n (change)=\"onGlobalConstantChange($any($event.target).value)\"\r\n >\r\n @for (constant of globalConstants(); track constant) {\r\n <option [value]=\"constant\">{{ constant }}</option>\r\n }\r\n </select>\r\n }\r\n\r\n @case ('literal') {\r\n @if (dataType() === 'Boolean') {\r\n <label class=\"fb-check\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"booleanValue()\"\r\n [disabled]=\"disabled()\"\r\n (change)=\"onBooleanChange($any($event.target).checked)\"\r\n />\r\n {{ booleanValue() ? 'vero' : 'falso' }}\r\n </label>\r\n } @else {\r\n <input\r\n class=\"fb-input\"\r\n [type]=\"literalInputType()\"\r\n [value]=\"literalText()\"\r\n [disabled]=\"disabled()\"\r\n [attr.aria-label]=\"label()\"\r\n [placeholder]=\"dataType() === 'Enum' ? 'Nome del valore di enum' : ''\"\r\n (input)=\"onLiteralChange($any($event.target).value)\"\r\n />\r\n @if (numericScaleHint()) {\r\n <p class=\"fb-field__hint\">{{ numericScaleHint() }}</p>\r\n }\r\n @if (dataType() === 'Date') {\r\n <p class=\"fb-field__hint\">\r\n Data e ora insieme. Il backend non converte i fusi: scrivi il valore che il motore deve vedere.\r\n </p>\r\n }\r\n }\r\n }\r\n\r\n @case ('formula') {\r\n <textarea\r\n class=\"fb-textarea fb-input--mono\"\r\n [value]=\"value()?.formulaExpression || ''\"\r\n [disabled]=\"disabled()\"\r\n placeholder=\"Importo * 1.22\"\r\n [attr.aria-label]=\"label() + ': espressione'\"\r\n (input)=\"onFormulaChange($any($event.target).value)\"\r\n ></textarea>\r\n <div class=\"fb-field__row\">\r\n <label class=\"fb-field__hint\">Tipo del risultato</label>\r\n <select\r\n class=\"fb-select\"\r\n [fbValue]=\"value()?.formulaDataType || ''\"\r\n [disabled]=\"disabled()\"\r\n (change)=\"onFormulaTypeChange($any($event.target).value)\"\r\n >\r\n @for (type of dataTypeOptions(); track type.value) {\r\n <option [value]=\"type.value\">{{ type.label }}</option>\r\n }\r\n </select>\r\n </div>\r\n <p class=\"fb-field__hint\">\r\n L’espressione va al motore di regole: il backend non ne verifica la sintassi.\r\n </p>\r\n }\r\n\r\n @case ('empty') {\r\n <p class=\"fb-field__hint\">Nessun valore.</p>\r\n }\r\n }\r\n</div>\r\n","/**\r\n * Editor delle condizioni — FRONTEND.md §4.3 e trappole §13.1, §13.4.\r\n *\r\n * Due cose che questo componente fa deliberatamente, perche' un editor che non le fa\r\n * produce condizioni che fanno il contrario di quello che l'utente crede:\r\n *\r\n * 1. **Operatori unari.** Sette operatori non confrontano due valori: per loro\r\n * `rightValue` e' l'**esito atteso**, non il termine di confronto. Qui il lato destro\r\n * diventa un selettore \"è / non è\", e il testo mostrato dice esplicitamente cosa\r\n * verra' scritto. Il flag arriva da `isUnary` del dizionario, non da una lista cablata.\r\n *\r\n * 2. **`conditionLogic`.** Cancellare o spostare una condizione riscrive l'espressione,\r\n * perche' gli indici sono 1-based e scalano. La riscrittura sta in\r\n * {@link removeCondition} / {@link moveCondition}.\r\n *\r\n * Inoltre: `WasVisited` e `HasError` vogliono a sinistra il nome di un **node**, non di una\r\n * risorsa (`appliesToElements`), e il selettore cambia di conseguenza.\r\n */\r\n\r\nimport { ChangeDetectionStrategy, Component, computed, inject, input, output } from '@angular/core';\r\n\r\nimport { FlowDictionaryStore } from '../../core/flow-dictionary.store';\r\nimport { FlowCondition, FlowConditionHolder, FlowValue } from '../../model/flow.model';\r\nimport {\r\n checkConditionLogic,\r\n isCustomConditionLogic,\r\n moveCondition as moveConditionInPlace,\r\n removeCondition as removeConditionInPlace,\r\n} from '../../core/condition-logic.util';\r\nimport { ReferencePickerComponent } from './reference-picker.component';\r\nimport { ValueEditorComponent } from './value-editor.component';\r\nimport { SelectValueDirective } from './select-value.directive';\r\n\r\n@Component({\r\n selector: 'fb-condition-editor',\r\n standalone: true,\r\n imports: [ReferencePickerComponent, ValueEditorComponent, SelectValueDirective],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './condition-editor.component.html',\r\n styleUrl: './condition-editor.component.css',\r\n})\r\nexport class ConditionEditorComponent {\r\n private readonly dictionaries = inject(FlowDictionaryStore);\r\n\r\n /** Il contenitore: porta `conditions`, `conditionLogic` e, se serve, `formula`. */\r\n readonly holder = input.required<FlowConditionHolder>();\r\n readonly title = input<string>('Condizioni');\r\n /** `false` dove il modello non prevede la modalita' formula sull'elemento. */\r\n readonly allowFormula = input(true);\r\n /** Path per ancorare i rilievi di validazione, es. `rules[Approvato]`. */\r\n readonly issuePath = input<string>('');\r\n\r\n /** Emesso a ogni modifica: il chiamante applica la mutazione allo store. */\r\n readonly changed = output<(holder: FlowConditionHolder) => void>();\r\n\r\n readonly conditions = computed<FlowCondition[]>(() => this.holder().conditions ?? []);\r\n\r\n readonly logicMode = computed<'and' | 'or' | 'custom' | 'formula'>(() => {\r\n const logic = this.holder().conditionLogic;\r\n if (!logic) {\r\n // Assente = tutte le condizioni devono essere vere (§4.3).\r\n return 'and';\r\n }\r\n const normalized = logic.trim().toLowerCase();\r\n if (normalized === 'and') {\r\n return 'and';\r\n }\r\n if (normalized === 'or') {\r\n return 'or';\r\n }\r\n if (normalized === 'formula') {\r\n return 'formula';\r\n }\r\n return 'custom';\r\n });\r\n\r\n readonly customLogic = computed(() =>\r\n isCustomConditionLogic(this.holder().conditionLogic) ? (this.holder().conditionLogic as string) : '',\r\n );\r\n\r\n /** Feedback immediato sull'espressione: la verita' resta della validazione backend. */\r\n readonly customLogicError = computed(() => {\r\n const logic = this.customLogic();\r\n return logic ? checkConditionLogic(logic, this.conditions().length) : null;\r\n });\r\n\r\n /** Con `Formula` il campo `conditions` viene **ignorato** dal motore (§4.3). */\r\n readonly conditionsIgnored = computed(() => this.logicMode() === 'formula');\r\n\r\n readonly operators = computed(() => this.dictionaries.comparisonOperators());\r\n\r\n isUnary(condition: FlowCondition): boolean {\r\n return this.dictionaries.isUnaryOperator(condition.operator);\r\n }\r\n\r\n appliesToElements(condition: FlowCondition): boolean {\r\n return this.dictionaries.operatorAppliesToElements(condition.operator);\r\n }\r\n\r\n /** L'esito atteso di un operatore unario: assente equivale a `true` (§4.3). */\r\n unaryExpectation(condition: FlowCondition): boolean {\r\n return condition.rightValue?.booleanValue !== false;\r\n }\r\n\r\n /**\r\n * Testo che dice cosa e' stato scritto, in italiano. Serve perche' la differenza fra\r\n * `IsNull` + `true` e `IsNull` + `false` e' invisibile nel JSON e capitale a runtime.\r\n */\r\n unarySummary(condition: FlowCondition): string {\r\n const label = this.operatorLabel(condition.operator).toLowerCase();\r\n const left = condition.leftValueReference || '…';\r\n return this.unaryExpectation(condition) ? `${left} ${label}` : `${left} NON ${label}`;\r\n }\r\n\r\n operatorLabel(operator: string | undefined): string {\r\n if (!operator) {\r\n return '';\r\n }\r\n return this.dictionaries.operator(operator)?.label ?? operator;\r\n }\r\n\r\n operatorDescription(operator: string | undefined): string | null {\r\n return this.dictionaries.operator(operator)?.description ?? null;\r\n }\r\n\r\n /** `None` consente di salvare una condizione incompleta: a runtime vale sempre falso. */\r\n isPlaceholderOperator(condition: FlowCondition): boolean {\r\n return condition.operator === 'None';\r\n }\r\n\r\n // -------------------------------------------------------------------------\r\n // Mutazioni\r\n // -------------------------------------------------------------------------\r\n\r\n addCondition(): void {\r\n this.changed.emit((holder) => {\r\n holder.conditions ??= [];\r\n holder.conditions.push({ operator: 'EqualTo' });\r\n });\r\n }\r\n\r\n removeCondition(index: number): void {\r\n this.changed.emit((holder) => {\r\n // Riscrive `conditionLogic`: gli indici sono 1-based e scalano (§13.4).\r\n removeConditionInPlace(holder, index);\r\n });\r\n }\r\n\r\n moveCondition(index: number, direction: -1 | 1): void {\r\n const target = index + direction;\r\n if (target < 0 || target >= this.conditions().length) {\r\n return;\r\n }\r\n this.changed.emit((holder) => moveConditionInPlace(holder, index, target));\r\n }\r\n\r\n setLogicMode(mode: 'and' | 'or' | 'custom' | 'formula'): void {\r\n this.changed.emit((holder) => {\r\n switch (mode) {\r\n case 'and':\r\n holder.conditionLogic = 'and';\r\n break;\r\n case 'or':\r\n holder.conditionLogic = 'or';\r\n break;\r\n case 'custom': {\r\n // Espressione iniziale che riproduce l'AND corrente: cambiarla e' un passo\r\n // esplicito dell'utente, non un effetto collaterale del cambio di modalita'.\r\n const count = holder.conditions?.length ?? 0;\r\n holder.conditionLogic = count\r\n ? Array.from({ length: count }, (_, index) => index + 1).join(' AND ')\r\n : '1';\r\n break;\r\n }\r\n case 'formula':\r\n holder.conditionLogic = 'Formula';\r\n holder.formula ??= '';\r\n break;\r\n }\r\n });\r\n }\r\n\r\n setCustomLogic(logic: string): void {\r\n this.changed.emit((holder) => {\r\n holder.conditionLogic = logic;\r\n });\r\n }\r\n\r\n setFormula(formula: string): void {\r\n this.changed.emit((holder) => {\r\n holder.formula = formula;\r\n });\r\n }\r\n\r\n setLeft(index: number, reference: string | undefined): void {\r\n this.changed.emit((holder) => {\r\n const condition = holder.conditions?.[index];\r\n if (condition) {\r\n condition.leftValueReference = reference;\r\n }\r\n });\r\n }\r\n\r\n setOperator(index: number, operator: string): void {\r\n const becomesUnary = this.dictionaries.isUnaryOperator(operator);\r\n this.changed.emit((holder) => {\r\n const condition = holder.conditions?.[index];\r\n if (!condition) {\r\n return;\r\n }\r\n condition.operator = operator;\r\n if (becomesUnary) {\r\n // Passando a un unario, il vecchio termine di confronto non significa piu'\r\n // \"confronta con questo\" ma \"l'esito atteso e' questo\": va riscritto, non tenuto.\r\n condition.rightValue = { booleanValue: true };\r\n } else if (condition.rightValue?.booleanValue !== undefined && operator !== 'EqualTo') {\r\n condition.rightValue = undefined;\r\n }\r\n });\r\n }\r\n\r\n setRightValue(index: number, value: FlowValue | undefined): void {\r\n this.changed.emit((holder) => {\r\n const condition = holder.conditions?.[index];\r\n if (condition) {\r\n condition.rightValue = value;\r\n }\r\n });\r\n }\r\n\r\n setUnaryExpectation(index: number, expectation: boolean): void {\r\n this.changed.emit((holder) => {\r\n const condition = holder.conditions?.[index];\r\n if (condition) {\r\n // Esplicito in entrambi i casi: `false` significa \"non è\", e omettere il campo\r\n // significherebbe \"è\".\r\n condition.rightValue = { booleanValue: expectation };\r\n }\r\n });\r\n }\r\n}\r\n","<fieldset class=\"fb-section\">\r\n <legend class=\"fb-section__title\">{{ title() }}</legend>\r\n\r\n <div class=\"fb-cond__logic\">\r\n <label class=\"fb-field__label\">Come si combinano</label>\r\n <div class=\"fb-cond__modes\" role=\"group\" aria-label=\"Logica delle condizioni\">\r\n <button\r\n type=\"button\"\r\n class=\"fb-cond__mode\"\r\n [class.fb-cond__mode--active]=\"logicMode() === 'and'\"\r\n title=\"Tutte le condizioni devono essere vere\"\r\n (click)=\"setLogicMode('and')\"\r\n >\r\n Tutte (AND)\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"fb-cond__mode\"\r\n [class.fb-cond__mode--active]=\"logicMode() === 'or'\"\r\n title=\"Almeno una condizione deve essere vera\"\r\n (click)=\"setLogicMode('or')\"\r\n >\r\n Almeno una (OR)\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"fb-cond__mode\"\r\n [class.fb-cond__mode--active]=\"logicMode() === 'custom'\"\r\n title=\"Espressione sugli indici delle condizioni, es. 1 AND (2 OR 3)\"\r\n (click)=\"setLogicMode('custom')\"\r\n >\r\n Espressione\r\n </button>\r\n @if (allowFormula()) {\r\n <button\r\n type=\"button\"\r\n class=\"fb-cond__mode\"\r\n [class.fb-cond__mode--active]=\"logicMode() === 'formula'\"\r\n title=\"L’esito lo determina una formula: le condizioni vengono ignorate\"\r\n (click)=\"setLogicMode('formula')\"\r\n >\r\n Formula\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (logicMode() === 'custom') {\r\n <div class=\"fb-field\">\r\n <input\r\n class=\"fb-input fb-input--mono\"\r\n [class.fb-input--invalid]=\"!!customLogicError()\"\r\n [value]=\"customLogic()\"\r\n placeholder=\"1 AND (2 OR 3)\"\r\n aria-label=\"Espressione sugli indici delle condizioni\"\r\n (input)=\"setCustomLogic($any($event.target).value)\"\r\n />\r\n @if (customLogicError()) {\r\n <p class=\"fb-field__error\">{{ customLogicError() }}</p>\r\n } @else {\r\n <p class=\"fb-field__hint\">\r\n Gli indici sono 1-based e si riferiscono all’ordine sotto. Cancellare una condizione riscrive\r\n l’espressione automaticamente.\r\n </p>\r\n }\r\n </div>\r\n }\r\n\r\n @if (logicMode() === 'formula') {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Formula</label>\r\n <textarea\r\n class=\"fb-textarea fb-input--mono\"\r\n [value]=\"holder().formula || ''\"\r\n placeholder=\"AND(Esito = 'KO', Importo > 1000)\"\r\n (input)=\"setFormula($any($event.target).value)\"\r\n ></textarea>\r\n <p class=\"fb-field__hint\">\r\n Con la modalita’ Formula le condizioni sotto vengono ignorate dal motore.\r\n </p>\r\n </div>\r\n }\r\n\r\n @if (conditionsIgnored() && conditions().length) {\r\n <p class=\"fb-callout fb-callout--warn\">\r\n Ci sono {{ conditions().length }} condizioni ma la logica e’ «Formula»: il motore le ignora.\r\n </p>\r\n }\r\n\r\n <div class=\"fb-list\">\r\n @for (condition of conditions(); track $index) {\r\n <div class=\"fb-list__item\">\r\n <div class=\"fb-list__header\">\r\n <!-- L'indice e' 1-based perche' e' quello che l'espressione referenzia. -->\r\n <span class=\"fb-list__index\" [title]=\"'Indice ' + ($index + 1) + ' nell’espressione'\">\r\n {{ $index + 1 }}\r\n </span>\r\n @if (isPlaceholderOperator(condition)) {\r\n <span class=\"fb-cond__placeholder\" title=\"A runtime vale sempre falso: e’ un segnaposto\">\r\n incompleta\r\n </span>\r\n }\r\n <span class=\"fb-list__spacer\"></span>\r\n <button\r\n type=\"button\"\r\n class=\"fb-btn fb-btn--ghost fb-btn--icon\"\r\n aria-label=\"Sposta su\"\r\n [disabled]=\"$first\"\r\n (click)=\"moveCondition($index, -1)\"\r\n >\r\n ↑\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"fb-btn fb-btn--ghost fb-btn--icon\"\r\n aria-label=\"Sposta giu’\"\r\n [disabled]=\"$last\"\r\n (click)=\"moveCondition($index, 1)\"\r\n >\r\n ↓\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"fb-btn fb-btn--ghost fb-btn--icon\"\r\n aria-label=\"Rimuovi la condizione\"\r\n (click)=\"removeCondition($index)\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">\r\n {{ appliesToElements(condition) ? 'Elemento' : 'Risorsa' }}\r\n </label>\r\n <fb-reference-picker\r\n [value]=\"condition.leftValueReference\"\r\n [elementsOnly]=\"appliesToElements(condition)\"\r\n [placeholder]=\"appliesToElements(condition) ? 'Scegli un elemento del flow' : 'Scegli una risorsa'\"\r\n (valueChange)=\"setLeft($index, $event)\"\r\n />\r\n @if (appliesToElements(condition)) {\r\n <p class=\"fb-field__hint\">\r\n Questo operatore si applica a un elemento del flow, non a una risorsa.\r\n </p>\r\n }\r\n </div>\r\n\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Operatore</label>\r\n <select\r\n class=\"fb-select\"\r\n [fbValue]=\"condition.operator || ''\"\r\n (change)=\"setOperator($index, $any($event.target).value)\"\r\n >\r\n @for (operator of operators(); track operator.value) {\r\n <option [value]=\"operator.value\">{{ operator.label }}</option>\r\n }\r\n </select>\r\n @if (operatorDescription(condition.operator)) {\r\n <p class=\"fb-field__hint\">{{ operatorDescription(condition.operator) }}</p>\r\n }\r\n </div>\r\n\r\n @if (isUnary(condition)) {\r\n <!--\r\n Trappola numero uno: per gli operatori unari `rightValue` non e' il termine di\r\n confronto ma l'esito atteso. Qui non c'e' un campo \"valore da confrontare\":\r\n c'e' un selettore che dice quale delle due cose si sta chiedendo.\r\n -->\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Esito atteso</label>\r\n <div class=\"fb-cond__unary\" role=\"group\" aria-label=\"Esito atteso\">\r\n <button\r\n type=\"button\"\r\n class=\"fb-cond__mode\"\r\n [class.fb-cond__mode--active]=\"unaryExpectation(condition)\"\r\n (click)=\"setUnaryExpectation($index, true)\"\r\n >\r\n {{ operatorLabel(condition.operator) }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"fb-cond__mode\"\r\n [class.fb-cond__mode--active]=\"!unaryExpectation(condition)\"\r\n (click)=\"setUnaryExpectation($index, false)\"\r\n >\r\n NON {{ operatorLabel(condition.operator) }}\r\n </button>\r\n </div>\r\n <p class=\"fb-field__hint\">\r\n Questa condizione e’ vera quando: <strong>{{ unarySummary(condition) }}</strong>.\r\n </p>\r\n </div>\r\n } @else {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Confronta con</label>\r\n <fb-value-editor\r\n [value]=\"condition.rightValue\"\r\n label=\"Valore di confronto\"\r\n (valueChange)=\"setRightValue($index, $event)\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n } @empty {\r\n <p class=\"fb-empty\">Nessuna condizione.</p>\r\n }\r\n </div>\r\n\r\n <button type=\"button\" class=\"fb-btn\" (click)=\"addCondition()\">Aggiungi condizione</button>\r\n</fieldset>\r\n","/**\r\n * Editor dei filtri sui record — FRONTEND.md §4.4.\r\n *\r\n * I filtri sono una struttura **diversa** dalle condizioni: agiscono su campi di un'entita',\r\n * non su risorse, e il loro operatore e' un altro enum (`recordFilterOperators`).\r\n *\r\n * Due dettagli che il modello impone e che qui sono espliciti:\r\n *\r\n * - **`filterLogic` non esiste su tutti gli elementi che hanno `filters`.** C'e' su Get\r\n * Records, Create Records, Start e sugli eventi di un Wait; **non** c'e' su Update\r\n * Records, Delete Records e sui dynamic choice set, dove i filtri sono sempre in AND.\r\n * Inviarlo dove non esiste significa perderlo silenziosamente al primo salvataggio:\r\n * l'input `supportsLogic` decide se il controllo viene mostrato.\r\n *\r\n * - I campi proposti passano da `GET /schema/{object}/fields?usage=filterable`, così un\r\n * campo non filtrabile non arriva nemmeno alla validazione (`FIELD_NOT_FILTERABLE`).\r\n * La scrittura libera resta possibile, perche' i percorsi di relazione\r\n * (`Cliente.Citta`) non sono enumerabili — e la validazione non li verifica.\r\n */\r\n\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\n\r\nimport { FlowCatalogStore, FlowDictionaryStore } from '../../core/flow-dictionary.store';\r\nimport { FlowFieldDescription, FlowFieldUsage } from '../../model/dictionary.model';\r\nimport { FlowRecordFilter, FlowValue } from '../../model/flow.model';\r\nimport { ValueEditorComponent } from './value-editor.component';\r\nimport { SelectValueDirective } from './select-value.directive';\r\n\r\n/** Il contenitore dei filtri, qualunque elemento sia. */\r\nexport interface FilterHolder {\r\n filters?: FlowRecordFilter[];\r\n filterLogic?: string;\r\n filterFormula?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'fb-record-filter-editor',\r\n standalone: true,\r\n imports: [ValueEditorComponent, SelectValueDirective],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './record-filter-editor.component.html',\r\n styleUrl: './record-filter-editor.component.css',\r\n})\r\nexport class RecordFilterEditorComponent {\r\n private readonly catalog = inject(FlowCatalogStore);\r\n private readonly dictionaries = inject(FlowDictionaryStore);\r\n\r\n readonly holder = input.required<FilterHolder>();\r\n readonly object = input<string | undefined>(undefined);\r\n readonly title = input<string>('Filtri');\r\n /** L'uso con cui chiedere i campi: `filterable` per i filtri, `updateable` altrove. */\r\n readonly usage = input<FlowFieldUsage>('filterable');\r\n\r\n /** `false` dove il modello non ha `filterLogic`: i filtri sono sempre in AND (§4.4). */\r\n readonly supportsLogic = input(true);\r\n /** `true` dove esiste `filterFormula` come alternativa ai filtri. */\r\n readonly supportsFormula = input(false);\r\n\r\n /**\r\n * Avviso da mostrare quando la lista e' vuota. Un Delete senza filtri e' un **errore**,\r\n * un Update senza filtri e' solo un avviso — ma aggiorna tutti i record dell'entita'\r\n * (§5.7, §13.10).\r\n */\r\n readonly emptyWarning = input<string | null>(null);\r\n readonly emptyWarningSeverity = input<'warn' | 'error'>('warn');\r\n\r\n readonly changed = output<(holder: FilterHolder) => void>();\r\n\r\n private readonly fields = signal<FlowFieldDescription[]>([]);\r\n\r\n readonly filters = computed<FlowRecordFilter[]>(() => this.holder().filters ?? []);\r\n readonly operators = computed(() => this.dictionaries.recordFilterOperators());\r\n\r\n constructor() {\r\n effect(() => {\r\n const object = this.object();\r\n const usage = this.usage();\r\n if (!object) {\r\n this.fields.set([]);\r\n return;\r\n }\r\n void this.catalog\r\n .listFields(object, usage)\r\n .then((list) => this.fields.set(list ?? []))\r\n // Catalogo non disponibile: il campo resta scrivibile a mano.\r\n .catch(() => this.fields.set([]));\r\n });\r\n }\r\n\r\n readonly fieldOptions = computed(() => this.fields());\r\n\r\n /** Catalogo vuoto = \"non lo so\": si lascia il campo libero, non si blocca (§7). */\r\n readonly hasFieldCatalog = computed(() => this.fields().length > 0);\r\n\r\n readonly logicMode = computed<'and' | 'or' | 'custom' | 'formula'>(() => {\r\n const logic = this.holder().filterLogic;\r\n if (!logic) {\r\n return 'and';\r\n }\r\n const normalized = logic.trim().toLowerCase();\r\n if (normalized === 'and') {\r\n return 'and';\r\n }\r\n if (normalized === 'or') {\r\n return 'or';\r\n }\r\n if (normalized === 'formula') {\r\n return 'formula';\r\n }\r\n return 'custom';\r\n });\r\n\r\n readonly customLogic = computed(() => {\r\n const mode = this.logicMode();\r\n return mode === 'custom' ? (this.holder().filterLogic as string) : '';\r\n });\r\n\r\n readonly showEmptyWarning = computed(() => !!this.emptyWarning() && this.filters().length === 0);\r\n\r\n addFilter(): void {\r\n this.changed.emit((holder) => {\r\n holder.filters ??= [];\r\n holder.filters.push({ operator: 'EqualTo' });\r\n });\r\n }\r\n\r\n removeFilter(index: number): void {\r\n this.changed.emit((holder) => {\r\n holder.filters?.splice(index, 1);\r\n if (holder.filters && holder.filters.length === 0) {\r\n // Lista vuota dichiarata vs assente: il backend le distingue, ma per un diff\r\n // pulito conviene omettere le liste vuote (§2).\r\n delete holder.filters;\r\n }\r\n });\r\n }\r\n\r\n setField(index: number, field: string): void {\r\n this.changed.emit((holder) => {\r\n const filter = holder.filters?.[index];\r\n if (filter) {\r\n filter.field = field || undefined;\r\n }\r\n });\r\n }\r\n\r\n setOperator(index: number, operator: string): void {\r\n this.changed.emit((holder) => {\r\n const filter = holder.filters?.[index];\r\n if (!filter) {\r\n return;\r\n }\r\n filter.operator = operator;\r\n if (operator === 'IsNull') {\r\n // `IsNull` fra i filtri sui record e' l'unico unario: `value` e' l'esito atteso.\r\n filter.value = { booleanValue: true };\r\n }\r\n });\r\n }\r\n\r\n setValue(index: number, value: FlowValue | undefined): void {\r\n this.changed.emit((holder) => {\r\n const filter = holder.filters?.[index];\r\n if (filter) {\r\n filter.value = value;\r\n }\r\n });\r\n }\r\n\r\n isNullOperator(filter: FlowRecordFilter): boolean {\r\n return filter.operator === 'IsNull';\r\n }\r\n\r\n nullExpectation(filter: FlowRecordFilter): boolean {\r\n return filter.value?.booleanValue !== false;\r\n }\r\n\r\n setNullExpectation(index: number, expectation: boolean): void {\r\n this.changed.emit((holder) => {\r\n const filter = holder.filters?.[index];\r\n if (filter) {\r\n filter.value = { booleanValue: expectation };\r\n }\r\n });\r\n }\r\n\r\n setLogicMode(mode: 'and' | 'or' | 'custom' | 'formula'): void {\r\n this.changed.emit((holder) => {\r\n switch (mode) {\r\n case 'and':\r\n holder.filterLogic = 'and';\r\n break;\r\n case 'or':\r\n holder.filterLogic = 'or';\r\n break;\r\n case 'custom': {\r\n const count = holder.filters?.length ?? 0;\r\n holder.filterLogic = count\r\n ? Array.from({ length: count }, (_, index) => index + 1).join(' AND ')\r\n : '1';\r\n break;\r\n }\r\n case 'formula':\r\n holder.filterLogic = 'Formula';\r\n holder.filterFormula ??= '';\r\n break;\r\n }\r\n });\r\n }\r\n\r\n setCustomLogic(logic: string): void {\r\n this.changed.emit((holder) => {\r\n holder.filterLogic = logic;\r\n });\r\n }\r\n\r\n setFormula(formula: string): void {\r\n this.changed.emit((holder) => {\r\n holder.filterFormula = formula;\r\n });\r\n }\r\n\r\n /** Il tipo del campo, per proporre il controllo giusto sul valore. */\r\n fieldDataType(filter: FlowRecordFilter): string | undefined {\r\n return this.fields().find((field) => field.name === filter.field)?.dataType;\r\n }\r\n\r\n /** `true` se il campo referenzia una relazione: la validazione non lo verifica (§4.4). */\r\n isRelationPath(filter: FlowRecordFilter): boolean {\r\n return !!filter.field?.includes('.');\r\n }\r\n}\r\n","<fieldset class=\"fb-section\">\r\n <legend class=\"fb-section__title\">{{ title() }}</legend>\r\n\r\n @if (!object()) {\r\n <p class=\"fb-field__hint\">Scegli prima un oggetto per poter filtrare sui suoi campi.</p>\r\n }\r\n\r\n @if (supportsLogic()) {\r\n <div class=\"fb-filter__modes\" role=\"group\" aria-label=\"Logica dei filtri\">\r\n <button\r\n type=\"button\"\r\n class=\"fb-filter__mode\"\r\n [class.fb-filter__mode--active]=\"logicMode() === 'and'\"\r\n (click)=\"setLogicMode('and')\"\r\n >\r\n Tutti (AND)\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"fb-filter__mode\"\r\n [class.fb-filter__mode--active]=\"logicMode() === 'or'\"\r\n (click)=\"setLogicMode('or')\"\r\n >\r\n Almeno uno (OR)\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"fb-filter__mode\"\r\n [class.fb-filter__mode--active]=\"logicMode() === 'custom'\"\r\n (click)=\"setLogicMode('custom')\"\r\n >\r\n Espressione\r\n </button>\r\n @if (supportsFormula()) {\r\n <button\r\n type=\"button\"\r\n class=\"fb-filter__mode\"\r\n [class.fb-filter__mode--active]=\"logicMode() === 'formula'\"\r\n (click)=\"setLogicMode('formula')\"\r\n >\r\n Formula\r\n </button>\r\n }\r\n </div>\r\n } @else {\r\n <!-- Qui il modello non ha `filterLogic`: mostrarlo lo farebbe perdere al salvataggio. -->\r\n <p class=\"fb-field__hint\">Su questo elemento i filtri sono sempre combinati in AND.</p>\r\n }\r\n\r\n @if (supportsLogic() && logicMode() === 'custom') {\r\n <div class=\"fb-field\">\r\n <input\r\n class=\"fb-input fb-input--mono\"\r\n [value]=\"customLogic()\"\r\n placeholder=\"1 AND (2 OR 3)\"\r\n aria-label=\"Espressione sugli indici dei filtri\"\r\n (input)=\"setCustomLogic($any($event.target).value)\"\r\n />\r\n </div>\r\n }\r\n\r\n @if (supportsFormula() && logicMode() === 'formula') {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Formula di filtro</label>\r\n <textarea\r\n class=\"fb-textarea fb-input--mono\"\r\n [value]=\"holder().filterFormula || ''\"\r\n (input)=\"setFormula($any($event.target).value)\"\r\n ></textarea>\r\n <p class=\"fb-field__hint\">Valutata dal motore di regole, in alternativa ai filtri.</p>\r\n </div>\r\n }\r\n\r\n @if (showEmptyWarning()) {\r\n <p\r\n class=\"fb-callout\"\r\n [class.fb-callout--warn]=\"emptyWarningSeverity() === 'warn'\"\r\n [class.fb-callout--error]=\"emptyWarningSeverity() === 'error'\"\r\n >\r\n {{ emptyWarning() }}\r\n </p>\r\n }\r\n\r\n <div class=\"fb-list\">\r\n @for (filter of filters(); track $index) {\r\n <div class=\"fb-list__item\">\r\n <div class=\"fb-list__header\">\r\n <span class=\"fb-list__index\">{{ $index + 1 }}</span>\r\n <span class=\"fb-list__spacer\"></span>\r\n <button\r\n type=\"button\"\r\n class=\"fb-btn fb-btn--ghost fb-btn--icon\"\r\n aria-label=\"Rimuovi il filtro\"\r\n (click)=\"removeFilter($index)\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Campo</label>\r\n @if (hasFieldCatalog()) {\r\n <input\r\n class=\"fb-input\"\r\n [attr.list]=\"'fb-fields-' + object() + '-' + usage()\"\r\n [value]=\"filter.field || ''\"\r\n placeholder=\"Nome del campo\"\r\n (input)=\"setField($index, $any($event.target).value)\"\r\n />\r\n <datalist id=\"fb-fields-{{ object() }}-{{ usage() }}\">\r\n @for (field of fieldOptions(); track field.name) {\r\n <option [value]=\"field.name\">{{ field.label || field.name }}</option>\r\n }\r\n </datalist>\r\n } @else {\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"filter.field || ''\"\r\n placeholder=\"Nome del campo\"\r\n (input)=\"setField($index, $any($event.target).value)\"\r\n />\r\n }\r\n @if (isRelationPath(filter)) {\r\n <p class=\"fb-field__hint fb-field__hint--warn\">\r\n Percorso di relazione: la validazione non lo verifica, un errore si scopre solo eseguendo.\r\n </p>\r\n }\r\n </div>\r\n\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Operatore</label>\r\n <select\r\n class=\"fb-select\"\r\n [fbValue]=\"filter.operator || ''\"\r\n (change)=\"setOperator($index, $any($event.target).value)\"\r\n >\r\n @for (operator of operators(); track operator.value) {\r\n <option [value]=\"operator.value\">{{ operator.label }}</option>\r\n }\r\n </select>\r\n </div>\r\n\r\n @if (isNullOperator(filter)) {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Esito atteso</label>\r\n <div class=\"fb-filter__modes\">\r\n <button\r\n type=\"button\"\r\n class=\"fb-filter__mode\"\r\n [class.fb-filter__mode--active]=\"nullExpectation(filter)\"\r\n (click)=\"setNullExpectation($index, true)\"\r\n >\r\n è vuoto\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"fb-filter__mode\"\r\n [class.fb-filter__mode--active]=\"!nullExpectation(filter)\"\r\n (click)=\"setNullExpectation($index, false)\"\r\n >\r\n non è vuoto\r\n </button>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Valore</label>\r\n <fb-value-editor\r\n [value]=\"filter.value\"\r\n [dataType]=\"fieldDataType(filter)\"\r\n label=\"Valore del filtro\"\r\n [allowFormula]=\"false\"\r\n (valueChange)=\"setValue($index, $event)\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n } @empty {\r\n <p class=\"fb-empty\">Nessun filtro.</p>\r\n }\r\n </div>\r\n\r\n <button type=\"button\" class=\"fb-btn\" (click)=\"addFilter()\">Aggiungi filtro</button>\r\n</fieldset>\r\n","/**\r\n * Editor dei parametri di input e output — FRONTEND.md §5.1, §5.8, §5.9.\r\n *\r\n * I nomi dei parametri sono quelli che il form, l'action o lo script si aspettano. Quando\r\n * il catalogo li espone (`.../parameters`) vengono proposti, e con il catalogo popolato un\r\n * nome inesistente e' un **errore** di validazione (`PARAMETER_UNKNOWN`). Con il catalogo\r\n * vuoto — che significa \"non lo so\", non \"nessuno\" — la scrittura resta libera.\r\n *\r\n * Gli output vanno in `assignToReference`, che deve essere una destinazione **scrivibile**:\r\n * il selettore chiede `POST /flows/references/writable`, così una costante o una formula\r\n * non sono nemmeno proponibili (`TARGET_NOT_WRITABLE`).\r\n */\r\n\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n input,\r\n output,\r\n} from '@angular/core';\r\n\r\nimport { FlowCatalogParameter } from '../../model/dictionary.model';\r\nimport { FlowInputParameter, FlowOutputParameter, FlowValue } from '../../model/flow.model';\r\nimport { ReferencePickerComponent } from './reference-picker.component';\r\nimport { ValueEditorComponent } from './value-editor.component';\r\nimport { SelectValueDirective } from './select-value.directive';\r\n\r\n/** Contenitore generico: gli input hanno `value`, gli output `assignToReference`. */\r\nexport interface ParameterHolder {\r\n inputParameters?: FlowInputParameter[];\r\n outputParameters?: FlowOutputParameter[];\r\n}\r\n\r\n@Component({\r\n selector: 'fb-parameter-editor',\r\n standalone: true,\r\n imports: [ReferencePickerComponent, ValueEditorComponent, SelectValueDirective],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './parameter-editor.component.html',\r\n styleUrl: './parameter-editor.component.css',\r\n})\r\nexport class ParameterEditorComponent {\r\n readonly holder = input.required<ParameterHolder>();\r\n /** Parametri dichiarati dal catalogo; vuoto = catalogo non popolato. */\r\n readonly catalogParameters = input<FlowCatalogParameter[]>([]);\r\n readonly inputTitle = input<string>('Parametri di ingresso');\r\n readonly outputTitle = input<string>('Parametri di uscita');\r\n readonly showInputs = input(true);\r\n readonly showOutputs = input(true);\r\n /** `true` → gli output vanno all'output automatico, e i parametri sono ignorati. */\r\n readonly outputsDisabledReason = input<string | null>(null);\r\n\r\n readonly changed = output<(holder: ParameterHolder) => void>();\r\n\r\n readonly inputs = computed<FlowInputParameter[]>(() => this.holder().inputParameters ?? []);\r\n readonly outputs = computed<FlowOutputParameter[]>(() => this.holder().outputParameters ?? []);\r\n\r\n readonly hasCatalog = computed(() => this.catalogParameters().length > 0);\r\n\r\n readonly inputCatalog = computed(() =>\r\n this.catalogParameters().filter((parameter) => parameter.isOutput !== true),\r\n );\r\n readonly outputCatalog = computed(() =>\r\n this.catalogParameters().filter((parameter) => parameter.isOutput === true),\r\n );\r\n\r\n /** Parametri obbligatori dichiarati dal catalogo e non ancora presenti. */\r\n readonly missingRequired = computed<FlowCatalogParameter[]>(() => {\r\n if (!this.hasCatalog()) {\r\n return [];\r\n }\r\n const present = new Set(this.inputs().map((parameter) => parameter.name));\r\n return this.inputCatalog().filter((parameter) => parameter.isRequired && !present.has(parameter.name));\r\n });\r\n\r\n /** Parametri presenti che il catalogo non conosce: sarebbero `PARAMETER_UNKNOWN`. */\r\n unknownInput(parameter: FlowInputParameter): boolean {\r\n if (!this.hasCatalog() || !parameter.name) {\r\n return false;\r\n }\r\n return !this.inputCatalog().some((candidate) => candidate.name === parameter.name);\r\n }\r\n\r\n unknownOutput(parameter: FlowOutputParameter): boolean {\r\n if (!this.hasCatalog() || !parameter.name) {\r\n return false;\r\n }\r\n return !this.outputCatalog().some((candidate) => candidate.name === parameter.name);\r\n }\r\n\r\n describe(name: string | undefined): FlowCatalogParameter | undefined {\r\n return this.catalogParameters().find((parameter) => parameter.name === name);\r\n }\r\n\r\n addInput(name?: string): void {\r\n this.changed.emit((holder) => {\r\n holder.inputParameters ??= [];\r\n holder.inputParameters.push({ name: name ?? '' });\r\n });\r\n }\r\n\r\n addOutput(name?: string): void {\r\n this.changed.emit((holder) => {\r\n holder.outputParameters ??= [];\r\n holder.outputParameters.push({ name: name ?? '' });\r\n });\r\n }\r\n\r\n removeInput(index: number): void {\r\n this.changed.emit((holder) => {\r\n holder.inputParameters?.splice(index, 1);\r\n if (holder.inputParameters?.length === 0) {\r\n delete holder.inputParameters;\r\n }\r\n });\r\n }\r\n\r\n removeOutput(index: number): void {\r\n this.changed.emit((holder) => {\r\n holder.outputParameters?.splice(index, 1);\r\n if (holder.outputParameters?.length === 0) {\r\n delete holder.outputParameters;\r\n }\r\n });\r\n }\r\n\r\n setInputName(index: number, name: string): void {\r\n this.changed.emit((holder) => {\r\n const parameter = holder.inputParameters?.[index];\r\n if (parameter) {\r\n parameter.name = name;\r\n }\r\n });\r\n }\r\n\r\n setInputValue(index: number, value: FlowValue | undefined): void {\r\n this.changed.emit((holder) => {\r\n const parameter = holder.inputParameters?.[index];\r\n if (parameter) {\r\n parameter.value = value;\r\n }\r\n });\r\n }\r\n\r\n setOutputName(index: number, name: string): void {\r\n this.changed.emit((holder) => {\r\n const parameter = holder.outputParameters?.[index];\r\n if (parameter) {\r\n parameter.name = name;\r\n }\r\n });\r\n }\r\n\r\n setOutputTarget(index: number, reference: string | undefined): void {\r\n this.changed.emit((holder) => {\r\n const parameter = holder.outputParameters?.[index];\r\n if (parameter) {\r\n parameter.assignToReference = reference;\r\n }\r\n });\r\n }\r\n}\r\n","@if (showInputs()) {\r\n <fieldset class=\"fb-section\">\r\n <legend class=\"fb-section__title\">{{ inputTitle() }}</legend>\r\n\r\n @if (missingRequired().length) {\r\n <p class=\"fb-callout fb-callout--warn\">\r\n Parametri obbligatori non ancora impostati:\r\n @for (parameter of missingRequired(); track parameter.name) {\r\n <button type=\"button\" class=\"fb-btn fb-btn--ghost fb-btn--icon\" (click)=\"addInput(parameter.name)\">\r\n + {{ parameter.name }}\r\n </button>\r\n }\r\n </p>\r\n }\r\n\r\n <div class=\"fb-list\">\r\n @for (parameter of inputs(); track $index) {\r\n <div class=\"fb-list__item\">\r\n <div class=\"fb-list__header\">\r\n @if (hasCatalog()) {\r\n <select\r\n class=\"fb-select\"\r\n [fbValue]=\"parameter.name || ''\"\r\n aria-label=\"Nome del parametro\"\r\n (change)=\"setInputName($index, $any($event.target).value)\"\r\n >\r\n <option value=\"\">— scegli —</option>\r\n @for (candidate of inputCatalog(); track candidate.name) {\r\n <option [value]=\"candidate.name\">\r\n {{ candidate.label || candidate.name }}{{ candidate.isRequired ? ' *' : '' }}\r\n </option>\r\n }\r\n @if (unknownInput(parameter)) {\r\n <option [value]=\"parameter.name\">{{ parameter.name }} (non nel catalogo)</option>\r\n }\r\n </select>\r\n } @else {\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"parameter.name || ''\"\r\n placeholder=\"Nome del parametro\"\r\n aria-label=\"Nome del parametro\"\r\n (input)=\"setInputName($index, $any($event.target).value)\"\r\n />\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"fb-btn fb-btn--ghost fb-btn--icon\"\r\n aria-label=\"Rimuovi il parametro\"\r\n (click)=\"removeInput($index)\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n\r\n @if (unknownInput(parameter)) {\r\n <p class=\"fb-field__hint fb-field__hint--warn\">\r\n Il catalogo non dichiara questo parametro: la validazione lo segnalerebbe come errore.\r\n </p>\r\n }\r\n @if (describe(parameter.name)?.description) {\r\n <p class=\"fb-field__hint\">{{ describe(parameter.name)?.description }}</p>\r\n }\r\n\r\n <fb-value-editor\r\n [value]=\"parameter.value\"\r\n [dataType]=\"describe(parameter.name)?.dataType\"\r\n [objectType]=\"describe(parameter.name)?.objectType || undefined\"\r\n [isCollection]=\"describe(parameter.name)?.isCollection\"\r\n label=\"Valore del parametro\"\r\n (valueChange)=\"setInputValue($index, $event)\"\r\n />\r\n </div>\r\n } @empty {\r\n <p class=\"fb-empty\">Nessun parametro di ingresso.</p>\r\n }\r\n </div>\r\n\r\n <button type=\"button\" class=\"fb-btn\" (click)=\"addInput()\">Aggiungi parametro</button>\r\n </fieldset>\r\n}\r\n\r\n@if (showOutputs()) {\r\n <fieldset class=\"fb-section\">\r\n <legend class=\"fb-section__title\">{{ outputTitle() }}</legend>\r\n\r\n @if (outputsDisabledReason()) {\r\n <p class=\"fb-callout\">{{ outputsDisabledReason() }}</p>\r\n }\r\n\r\n <div class=\"fb-list\">\r\n @for (parameter of outputs(); track $index) {\r\n <div class=\"fb-list__item\">\r\n <div class=\"fb-list__header\">\r\n @if (hasCatalog()) {\r\n <select\r\n class=\"fb-select\"\r\n [fbValue]=\"parameter.name || ''\"\r\n aria-label=\"Nome del parametro di uscita\"\r\n (change)=\"setOutputName($index, $any($event.target).value)\"\r\n >\r\n <option value=\"\">— scegli —</option>\r\n @for (candidate of outputCatalog(); track candidate.name) {\r\n <option [value]=\"candidate.name\">{{ candidate.label || candidate.name }}</option>\r\n }\r\n @if (unknownOutput(parameter)) {\r\n <option [value]=\"parameter.name\">{{ parameter.name }} (non nel catalogo)</option>\r\n }\r\n </select>\r\n } @else {\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"parameter.name || ''\"\r\n placeholder=\"Nome del parametro\"\r\n aria-label=\"Nome del parametro di uscita\"\r\n (input)=\"setOutputName($index, $any($event.target).value)\"\r\n />\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"fb-btn fb-btn--ghost fb-btn--icon\"\r\n aria-label=\"Rimuovi il parametro\"\r\n (click)=\"removeOutput($index)\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n\r\n @if (unknownOutput(parameter)) {\r\n <p class=\"fb-field__hint fb-field__hint--warn\">\r\n Il catalogo non dichiara questo parametro di uscita.\r\n </p>\r\n }\r\n\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Assegna a</label>\r\n <!-- Solo variabili: assegnare a una costante o a una formula e' un errore. -->\r\n <fb-reference-picker\r\n [value]=\"parameter.assignToReference\"\r\n [writableOnly]=\"true\"\r\n [dataType]=\"describe(parameter.name)?.dataType\"\r\n [isCollection]=\"describe(parameter.name)?.isCollection\"\r\n placeholder=\"Scegli una variabile\"\r\n (valueChange)=\"setOutputTarget($index, $event)\"\r\n />\r\n </div>\r\n </div>\r\n } @empty {\r\n <p class=\"fb-empty\">Nessun parametro di uscita.</p>\r\n }\r\n </div>\r\n\r\n <button type=\"button\" class=\"fb-btn\" (click)=\"addOutput()\">Aggiungi parametro</button>\r\n </fieldset>\r\n}\r\n","/**\n * Editor di `inputAssignments` — FRONTEND.md §5.7.\n *\n * Campo dell'entita' → valore. I campi proposti passano da\n * `GET /schema/{object}/fields?usage=updateable`, perche' scrivere su un campo non\n * aggiornabile e' `FIELD_NOT_UPDATEABLE`.\n */\n\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\n\nimport { FlowCatalogStore } from '../../core/flow-dictionary.store';\nimport { FlowFieldDescription } from '../../model/dictionary.model';\nimport { FlowInputFieldAssignment, FlowValue } from '../../model/flow.model';\nimport { ValueEditorComponent } from './value-editor.component';\n\nexport interface FieldAssignmentHolder {\n inputAssignments?: FlowInputFieldAssignment[];\n}\n\n@Component({\n selector: 'fb-field-assignment-editor',\n standalone: true,\n imports: [ValueEditorComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './field-assignment-editor.component.html',\n styleUrl: './field-assignment-editor.component.css',\n})\nexport class FieldAssignmentEditorComponent {\n private readonly catalog = inject(FlowCatalogStore);\n\n readonly holder = input.required<FieldAssignmentHolder>();\n readonly object = input<string | undefined>(undefined);\n readonly title = input<string>('Valori dei campi');\n readonly disabledReason = input<string | null>(null);\n\n readonly changed = output<(holder: FieldAssignmentHolder) => void>();\n\n private readonly fields = signal<FlowFieldDescription[]>([]);\n\n readonly assignments = computed<FlowInputFieldAssignment[]>(() => this.holder().inputAssignments ?? []);\n readonly fieldOptions = computed(() => this.fields());\n readonly hasCatalog = computed(() => this.fields().length > 0);\n\n /** Campi obbligatori dell'entita' non ancora valorizzati. */\n readonly missingRequired = computed<FlowFieldDescription[]>(() => {\n if (!this.hasCatalog()) {\n return [];\n }\n const present = new Set(this.assignments().map((assignment) => assignment.field));\n return this.fields().filter((field) => field.isRequired && !present.has(field.name));\n });\n\n constructor() {\n effect(() => {\n const object = this.object();\n if (!object) {\n this.fields.set([]);\n return;\n }\n void this.catalog\n .listFields(object, 'updateable')\n .then((list) => this.fields.set(list ?? []))\n .catch(() => this.fields.set([]));\n });\n }\n\n add(field?: string): void {\n this.changed.emit((holder) => {\n holder.inputAssignments ??= [];\n holder.inputAssignments.push({ field: field ?? '' });\n });\n }\n\n remove(index: number): void {\n this.changed.emit((holder) => {\n holder.inputAssignments?.splice(index, 1);\n if (holder.inputAssignments?.length === 0) {\n delete holder.inputAssignments;\n }\n });\n }\n\n setField(index: number, field: string): void {\n this.changed.emit((holder) => {\n const assignment = holder.inputAssignments?.[index];\n if (assignment) {\n assignment.field = field || undefined;\n }\n });\n }\n\n setValue(index: number, value: FlowValue | undefined): void {\n this.changed.emit((holder) => {\n const assignment = holder.inputAssignments?.[index];\n if (assignment) {\n assignment.value = value;\n }\n });\n }\n\n describe(name: string | undefined): FlowFieldDescription | undefined {\n return this.fields().find((field) => field.name === name);\n }\n\n /** Il catalogo e' popolato ma non conosce questo campo: sarebbe `FIELD_UNKNOWN`. */\n isUnknown(assignment: FlowInputFieldAssignment): boolean {\n if (!this.hasCatalog() || !assignment.field || assignment.field.includes('.')) {\n return false;\n }\n return !this.fields().some((field) => field.name === assignment.field);\n }\n}\n","<fieldset class=\"fb-section\">\n <legend class=\"fb-section__title\">{{ title() }}</legend>\n\n @if (disabledReason()) {\n <p class=\"fb-callout\">{{ disabledReason() }}</p>\n }\n @if (!object()) {\n <p class=\"fb-field__hint\">Scegli prima un oggetto per poterne valorizzare i campi.</p>\n }\n @if (missingRequired().length) {\n <p class=\"fb-callout fb-callout--warn\">\n Campi obbligatori non valorizzati:\n @for (field of missingRequired(); track field.name) {\n <button type=\"button\" class=\"fb-btn fb-btn--ghost fb-btn--icon\" (click)=\"add(field.name)\">\n + {{ field.label || field.name }}\n </button>\n }\n </p>\n }\n\n <div class=\"fb-list\">\n @for (assignment of assignments(); track $index) {\n <div class=\"fb-list__item\">\n <div class=\"fb-list__header\">\n @if (hasCatalog()) {\n <input\n class=\"fb-input\"\n [attr.list]=\"'fb-updateable-' + object()\"\n [value]=\"assignment.field || ''\"\n placeholder=\"Nome del campo\"\n aria-label=\"Campo\"\n (input)=\"setField($index, $any($event.target).value)\"\n />\n <datalist id=\"fb-updateable-{{ object() }}\">\n @for (field of fieldOptions(); track field.name) {\n <option [value]=\"field.name\">{{ field.label || field.name }}</option>\n }\n </datalist>\n } @else {\n <input\n class=\"fb-input\"\n [value]=\"assignment.field || ''\"\n placeholder=\"Nome del campo\"\n aria-label=\"Campo\"\n (input)=\"setField($index, $any($event.target).value)\"\n />\n }\n <button\n type=\"button\"\n class=\"fb-btn fb-btn--ghost fb-btn--icon\"\n aria-label=\"Rimuovi\"\n (click)=\"remove($index)\"\n >\n ×\n </button>\n </div>\n\n @if (isUnknown(assignment)) {\n <p class=\"fb-field__hint fb-field__hint--warn\">\n Questo campo non e’ fra quelli aggiornabili dell’oggetto.\n </p>\n }\n\n <fb-value-editor\n [value]=\"assignment.value\"\n [dataType]=\"describe(assignment.field)?.dataType\"\n [objectType]=\"describe(assignment.field)?.objectType || undefined\"\n label=\"Valore del campo\"\n (valueChange)=\"setValue($index, $event)\"\n />\n </div>\n } @empty {\n <p class=\"fb-empty\">Nessun campo valorizzato.</p>\n }\n </div>\n\n <button type=\"button\" class=\"fb-btn\" (click)=\"add()\">Aggiungi campo</button>\n</fieldset>\n","/**\r\n * Editor delle uscite di un elemento — FRONTEND.md §3.5.\r\n *\r\n * Le destinazioni arrivano da `POST /flows/connector-targets?excluding={nome del node}`:\r\n * escludendo l'elemento stesso si evita `CONNECTOR_SELF_LOOP` senza dover ricordare la\r\n * regola in dieci form diversi.\r\n *\r\n * Tre cose che questo editor dice a voce alta, perche' nel JSON non si vedono:\r\n * - un connector assente e' **legittimo**: il percorso finisce lì (Info, non errore);\r\n * - tranne dove il ramo e' strutturale, come il corpo di un Loop;\r\n * - `isGoTo` e' solo un suggerimento di disegno: la semantica di esecuzione e' identica.\r\n */\r\n\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\n\r\nimport { FlowBuilderApi } from '../../api/flow-builder-api';\r\nimport { FlowDocumentStore } from '../../core/flow-document.store';\r\nimport { FlowOutlet } from '../../core/element-outlets';\r\nimport { FlowConnectorTarget } from '../../model/api.model';\r\nimport { FlowAnyNode } from '../../model/flow.model';\r\nimport { SelectValueDirective } from './select-value.directive';\r\n\r\n@Component({\r\n selector: 'fb-connector-editor',\r\n standalone: true,\r\n imports: [SelectValueDirective],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './connector-editor.component.html',\r\n styleUrl: './connector-editor.component.css',\r\n})\r\nexport class ConnectorEditorComponent {\r\n private readonly api = inject(FlowBuilderApi);\r\n private readonly store = inject(FlowDocumentStore);\r\n\r\n /** Il node di cui si editano le uscite; per lo Start passa il nome fittizio. */\r\n readonly nodeName = input.required<string>();\r\n readonly node = input.required<FlowAnyNode>();\r\n readonly outlets = input.required<FlowOutlet[]>();\r\n readonly title = input<string>('Uscite');\r\n\r\n readonly connectorChanged = output<{ outletKey: string; target?: string; isGoTo?: boolean }>();\r\n\r\n private readonly targets = signal<FlowConnectorTarget[]>([]);\r\n\r\n constructor() {\r\n effect(() => {\r\n const definition = this.store.document();\r\n const excluding = this.nodeName();\r\n void this.api\r\n .getConnectorTargets(definition, excluding)\r\n .then((list) => this.targets.set(list ?? []))\r\n .catch(() => {\r\n // Senza la primitiva si ripiega sui node del documento, che il client conosce.\r\n this.targets.set(\r\n this.store\r\n .nodes()\r\n .filter((reference) => reference.name !== excluding)\r\n .map((reference) => ({ name: reference.name, label: (reference.node.label as string) ?? null })),\r\n );\r\n });\r\n });\r\n }\r\n\r\n readonly targetOptions = computed(() => this.targets());\r\n\r\n currentTarget(outlet: FlowOutlet): string {\r\n return outlet.read(this.node())?.targetReference ?? '';\r\n }\r\n\r\n isGoTo(outlet: FlowOutlet): boolean {\r\n return outlet.read(this.node())?.isGoTo === true;\r\n }\r\n\r\n /** Il connector esiste ma non ha destinazione: ramo incompleto, da mostrare come tale. */\r\n isDangling(outlet: FlowOutlet): boolean {\r\n const connector = outlet.read(this.node());\r\n return !!connector && !connector.targetReference;\r\n }\r\n\r\n /** Nessun connector: il percorso finisce lì. Legittimo, tranne sui rami strutturali. */\r\n isTerminal(outlet: FlowOutlet): boolean {\r\n return !outlet.read(this.node());\r\n }\r\n\r\n hintFor(outlet: FlowOutlet): string | null {\r\n if (this.isDangling(outlet)) {\r\n return 'Ramo dichiarato senza destinazione: scegline una o rimuovi il ramo.';\r\n }\r\n if (this.isTerminal(outlet)) {\r\n return outlet.isStructural\r\n ? 'Questo ramo e’ strutturale: senza destinazione l’elemento non funziona.'\r\n : 'Nessuna destinazione: il percorso finisce qui, e l’esecuzione termina.';\r\n }\r\n return null;\r\n }\r\n\r\n setTarget(outlet: FlowOutlet, target: string): void {\r\n this.connectorChanged.emit({ outletKey: outlet.key, target: target || undefined });\r\n }\r\n\r\n setGoTo(outlet: FlowOutlet, isGoTo: boolean): void {\r\n this.connectorChanged.emit({\r\n outletKey: outlet.key,\r\n target: this.currentTarget(outlet) || undefined,\r\n isGoTo,\r\n });\r\n }\r\n\r\n clear(outlet: FlowOutlet): void {\r\n this.connectorChanged.emit({ outletKey: outlet.key, target: undefined, isGoTo: false });\r\n }\r\n}\r\n","<fieldset class=\"fb-section\">\r\n <legend class=\"fb-section__title\">{{ title() }}</legend>\r\n\r\n @for (outlet of outlets(); track outlet.key) {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\" [class.fb-field__label--required]=\"outlet.isStructural\">\r\n {{ outlet.label }}\r\n <span class=\"fb-conn__kind\" [attr.data-kind]=\"outlet.kind\">{{ outlet.kind }}</span>\r\n </label>\r\n\r\n <div class=\"fb-field__row\">\r\n <select\r\n class=\"fb-select\"\r\n [fbValue]=\"currentTarget(outlet)\"\r\n [attr.aria-label]=\"'Destinazione di ' + outlet.label\"\r\n (change)=\"setTarget(outlet, $any($event.target).value)\"\r\n >\r\n <option value=\"\">— nessuna destinazione —</option>\r\n @for (target of targetOptions(); track target.name) {\r\n <option [value]=\"target.name\">{{ target.label || target.name }}</option>\r\n }\r\n </select>\r\n @if (!isTerminal(outlet)) {\r\n <button\r\n type=\"button\"\r\n class=\"fb-btn fb-btn--ghost fb-btn--icon\"\r\n aria-label=\"Rimuovi il ramo\"\r\n title=\"Rimuove il ramo: il percorso finira’ qui\"\r\n (click)=\"clear(outlet)\"\r\n >\r\n ×\r\n </button>\r\n }\r\n </div>\r\n\r\n @if (currentTarget(outlet)) {\r\n <label class=\"fb-check\">\r\n <input type=\"checkbox\" [checked]=\"isGoTo(outlet)\" (change)=\"setGoTo(outlet, $any($event.target).checked)\" />\r\n Disegna come salto indietro (isGoTo)\r\n </label>\r\n }\r\n\r\n @if (hintFor(outlet)) {\r\n <p\r\n class=\"fb-field__hint\"\r\n [class.fb-field__hint--warn]=\"isDangling(outlet) || (isTerminal(outlet) && outlet.isStructural)\"\r\n >\r\n {{ hintFor(outlet) }}\r\n </p>\r\n }\r\n </div>\r\n } @empty {\r\n <p class=\"fb-field__hint\">Questo elemento non ha uscite: interrompe l’esecuzione.</p>\r\n }\r\n</fieldset>\r\n","/**\n * Base comune degli inspector.\n *\n * Ogni inspector riceve il nome dell'elemento e il node, e scrive nel documento attraverso\n * {@link FlowDocumentStore}: il node passato in input e' una vista di sola lettura sulla\n * copia corrente, e le mutazioni passano sempre per `patch()`, che lavora sulla copia di\n * lavoro dello store. Nessun inspector modifica l'oggetto che riceve.\n */\n\nimport { Directive, computed, inject, input } from '@angular/core';\n\nimport { FlowDocumentStore } from '../../core/flow-document.store';\nimport { FlowDictionaryStore } from '../../core/flow-dictionary.store';\nimport { FlowValidationStore } from '../../core/flow-validation.store';\nimport { FlowOutlet, outletsOf } from '../../core/element-outlets';\nimport { FlowAnyNode, FlowElementType } from '../../model/flow.model';\nimport { FlowValidationIssue } from '../../model/api.model';\n\n/**\n * `@Directive()` senza selettore: e' il modo in cui Angular riconosce come input quelli\n * dichiarati su una classe base ereditata da piu' componenti.\n */\n@Directive()\nexport abstract class NodeInspectorBase {\n protected readonly store = inject(FlowDocumentStore);\n protected readonly dictionaries = inject(FlowDictionaryStore);\n protected readonly validation = inject(FlowValidationStore);\n\n readonly name = input.required<string>();\n readonly node = input.required<FlowAnyNode>();\n\n /** Il tipo dell'elemento: ogni inspector sa il proprio, ma serve alle uscite. */\n abstract readonly elementType: FlowElementType;\n\n readonly outlets = computed<FlowOutlet[]>(() => outletsOf(this.elementType, this.node()));\n\n /** I rilievi ancorati a questo elemento (§7). */\n readonly issues = computed<FlowValidationIssue[]>(\n () => this.validation.issuesByElement().get(this.name()) ?? [],\n );\n\n /** I rilievi su un campo preciso, per evidenziarlo nel form. */\n issuesAt(pathPrefix: string): FlowValidationIssue[] {\n return this.validation.issuesAt(this.name(), pathPrefix);\n }\n\n hasIssueCode(code: string): boolean {\n return this.issues().some((issue) => issue.code === code);\n }\n\n /** Applica una modifica al node. */\n protected patch(mutate: (node: FlowAnyNode) => void): void {\n this.store.updateNode(this.name(), mutate);\n }\n\n /** Scorciatoia per i campi semplici: valore vuoto → chiave omessa (§2). */\n protected setField(field: string, value: unknown): void {\n this.patch((node) => {\n if (value === undefined || value === null || value === '') {\n delete node[field];\n } else {\n node[field] = value;\n }\n });\n }\n\n /** Scrive la destinazione di un'uscita. */\n onConnectorChanged(event: { outletKey: string; target?: string; isGoTo?: boolean }): void {\n this.store.setConnector(this.name(), event.outletKey, event.target, event.isGoTo);\n }\n}\n","/**\r\n * Action — FRONTEND.md §5.8.\r\n *\r\n * `actionType` + `actionName` identificano l'action, e i parametri arrivano dal catalogo:\r\n * con il catalogo popolato, un nome inesistente o un parametro inesistente sono **errori**.\r\n *\r\n * L'Action ha **tre uscite**: `connector`, `faultConnector`, `timeoutConnector`. Il ramo di\r\n * timeout esiste solo se `timeoutPathUsage: 'EnableTimeoutPath'`, e dichiararne uno senza\r\n * l'altro e' un avviso: qui i due controlli sono legati, come chiede la specifica.\r\n */\r\n\r\nimport { ChangeDetectionStrategy, Component, computed, effect, inject, signal } from '@angular/core';\r\n\r\nimport { NodeInspectorBase } from './node-inspector-base';\r\nimport { FlowCatalogStore } from '../../core/flow-dictionary.store';\r\nimport { FlowCatalogEntry, FlowCatalogParameter } from '../../model/dictionary.model';\r\nimport { FlowActionCall, FlowElementType } from '../../model/flow.model';\r\nimport { ConnectorEditorComponent } from '../shared/connector-editor.component';\r\nimport { ParameterEditorComponent, ParameterHolder } from '../shared/parameter-editor.component';\r\nimport { SelectValueDirective } from '../shared/select-value.directive';\r\n\r\n@Component({\r\n selector: 'fb-action-call-inspector',\r\n standalone: true,\r\n imports: [ConnectorEditorComponent, ParameterEditorComponent, SelectValueDirective],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './action-call-inspector.component.html',\r\n})\r\nexport class ActionCallInspectorComponent extends NodeInspectorBase {\r\n private readonly catalog = inject(FlowCatalogStore);\r\n\r\n readonly elementType: FlowElementType = 'ActionCall';\r\n\r\n readonly action = computed<FlowActionCall>(() => this.node() as FlowActionCall);\r\n readonly transactionModels = computed(() => this.dictionaries.transactionModels());\r\n readonly offsetUnits = computed(() => this.dictionaries.offsetUnits());\r\n\r\n private readonly actionTypes = signal<FlowCatalogEntry[]>([]);\r\n private readonly actions = signal<FlowCatalogEntry[]>([]);\r\n private readonly parameters = signal<FlowCatalogParameter[]>([]);\r\n\r\n constructor() {\r\n super();\r\n void this.catalog\r\n .listActionTypes()\r\n .then((list) => this.actionTypes.set(list ?? []))\r\n .catch(() => this.actionTypes.set([]));\r\n\r\n effect(() => {\r\n const actionType = this.action().actionType;\r\n if (!actionType) {\r\n this.actions.set([]);\r\n return;\r\n }\r\n void this.catalog\r\n .listActions(actionType)\r\n .then((list) => this.actions.set(list ?? []))\r\n .catch(() => this.actions.set([]));\r\n });\r\n\r\n effect(() => {\r\n const action = this.action();\r\n if (!action.actionType || !action.actionName) {\r\n this.parameters.set([]);\r\n return;\r\n }\r\n void this.catalog\r\n .listActionParameters(action.actionType, action.actionName)\r\n .then((list) => this.parameters.set(list ?? []))\r\n .catch(() => this.parameters.set([]));\r\n });\r\n }\r\n\r\n readonly actionTypeOptions = computed(() => this.actionTypes());\r\n readonly actionOptions = computed(() => this.actions());\r\n readonly parameterCatalog = computed(() => this.parameters());\r\n readonly hasTypeCatalog = computed(() => this.actionTypes().length > 0);\r\n readonly hasActionCatalog = computed(() => this.actions().length > 0);\r\n\r\n /** Con il catalogo popolato, un'action inesistente e' un errore (`ACTION_UNKNOWN`). */\r\n readonly isUnknownAction = computed(() => {\r\n const name = this.action().actionName;\r\n if (!name || !this.hasActionCatalog()) {\r\n return false;\r\n }\r\n return !this.actions().some((entry) => entry.name === name);\r\n });\r\n\r\n readonly timeoutEnabled = computed(() => this.action().timeoutPathUsage === 'EnableTimeoutPath');\r\n\r\n /** Un ramo di timeout senza il flag, o il flag senza il ramo: avviso da segnalare (§5.8). */\r\n readonly timeoutMismatch = computed(() => {\r\n const action = this.action();\r\n const hasBranch = !!action.timeoutConnector?.targetReference;\r\n return hasBranch !== this.timeoutEnabled();\r\n });\r\n\r\n readonly storeOutputAutomatically = computed(() => this.action().storeOutputAutomatically === true);\r\n\r\n setActionType(value: string): void {\r\n this.patch((node) => {\r\n const action = node as FlowActionCall;\r\n if (action.actionType === value) {\r\n return;\r\n }\r\n action.actionType = value || undefined;\r\n // Cambiare tipo cambia l'insieme delle action e dei loro parametri.\r\n delete action.actionName;\r\n delete action.inputParameters;\r\n delete action.outputParameters;\r\n });\r\n }\r\n\r\n setActionName(value: string): void {\r\n this.patch((node) => {\r\n const action = node as FlowActionCall;\r\n if (action.actionName === value) {\r\n return;\r\n }\r\n action.actionName = value || undefined;\r\n delete action.inputParameters;\r\n delete action.outputParameters;\r\n });\r\n }\r\n\r\n setTransactionModel(value: string): void {\r\n this.setField('flowTransactionModel', value);\r\n }\r\n\r\n setWaitUntilCompleted(value: boolean): void {\r\n this.patch((node) => {\r\n const action = node as FlowActionCall;\r\n if (value) {\r\n action.isWaitUntilCompleted = true;\r\n } else {\r\n delete action.isWaitUntilCompleted;\r\n }\r\n });\r\n }\r\n\r\n setOffset(value: string): void {\r\n const parsed = Number.parseInt(value, 10);\r\n this.setField('offset', Number.isNaN(parsed) ? undefined : parsed);\r\n }\r\n\r\n setOffsetUnit(value: string): void {\r\n this.setField('offsetUnit', value);\r\n }\r\n\r\n /** Il flag e il ramo si accendono insieme: sono la stessa decisione. */\r\n setTimeoutEnabled(enabled: boolean): void {\r\n this.patch((node) => {\r\n const action = node as FlowActionCall;\r\n if (enabled) {\r\n action.timeoutPathUsage = 'EnableTimeoutPath';\r\n } else {\r\n delete action.timeoutPathUsage;\r\n // Spegnere il ramo di timeout rimuove anche la destinazione: lasciarla darebbe un\r\n // connector che il motore non percorrera' mai.\r\n delete action.timeoutConnector;\r\n }\r\n });\r\n }\r\n\r\n setStoreOutputAutomatically(value: boolean): void {\r\n this.patch((node) => {\r\n const action = node as FlowActionCall;\r\n if (value) {\r\n action.storeOutputAutomatically = true;\r\n delete action.outputParameters;\r\n } else {\r\n delete action.storeOutputAutomatically;\r\n }\r\n });\r\n }\r\n\r\n onParametersChanged(mutate: (holder: ParameterHolder) => void): void {\r\n this.patch((node) => mutate(node as ParameterHolder));\r\n }\r\n}\r\n","<div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Tipo di action</label>\r\n @if (hasTypeCatalog()) {\r\n <select\r\n class=\"fb-select\"\r\n [fbValue]=\"action().actionType || ''\"\r\n (change)=\"setActionType($any($event.target).value)\"\r\n >\r\n <option value=\"\">— scegli —</option>\r\n @for (type of actionTypeOptions(); track type.name) {\r\n <option [value]=\"type.name\">{{ type.label || type.name }}</option>\r\n }\r\n </select>\r\n } @else {\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"action().actionType || ''\"\r\n (input)=\"setActionType($any($event.target).value)\"\r\n />\r\n }\r\n</div>\r\n\r\n<div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Action</label>\r\n @if (hasActionCatalog()) {\r\n <select\r\n class=\"fb-select\"\r\n [class.fb-select--invalid]=\"isUnknownAction()\"\r\n [fbValue]=\"action().actionName || ''\"\r\n (change)=\"setActionName($any($event.target).value)\"\r\n >\r\n <option value=\"\">— scegli —</option>\r\n @for (entry of actionOptions(); track entry.name) {\r\n <option [value]=\"entry.name\">{{ entry.label || entry.name }}</option>\r\n }\r\n @if (isUnknownAction()) {\r\n <option [value]=\"action().actionName\">{{ action().actionName }} (non nel catalogo)</option>\r\n }\r\n </select>\r\n } @else {\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"action().actionName || ''\"\r\n (input)=\"setActionName($any($event.target).value)\"\r\n />\r\n }\r\n @if (isUnknownAction()) {\r\n <p class=\"fb-field__error\">\r\n Questa action non esiste nel catalogo del tipo scelto: la validazione la segnala come errore.\r\n </p>\r\n }\r\n</div>\r\n\r\n<fieldset class=\"fb-section\">\r\n <legend class=\"fb-section__title\">Esecuzione</legend>\r\n\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Modello transazionale</label>\r\n <select\r\n class=\"fb-select\"\r\n [fbValue]=\"action().flowTransactionModel || ''\"\r\n (change)=\"setTransactionModel($any($event.target).value)\"\r\n >\r\n <option value=\"\">— predefinito —</option>\r\n @for (model of transactionModels(); track model.value) {\r\n <option [value]=\"model.value\">{{ model.label }}</option>\r\n }\r\n </select>\r\n </div>\r\n\r\n <label class=\"fb-check\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"action().isWaitUntilCompleted === true\"\r\n (change)=\"setWaitUntilCompleted($any($event.target).checked)\"\r\n />\r\n Attendi il completamento\r\n </label>\r\n\r\n <div class=\"fb-field__row\">\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Attesa</label>\r\n <input\r\n class=\"fb-input\"\r\n type=\"number\"\r\n min=\"0\"\r\n [value]=\"action().offset ?? ''\"\r\n (input)=\"setOffset($any($event.target).value)\"\r\n />\r\n </div>\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Unita’</label>\r\n <select\r\n class=\"fb-select\"\r\n [fbValue]=\"action().offsetUnit || ''\"\r\n (change)=\"setOffsetUnit($any($event.target).value)\"\r\n >\r\n <option value=\"\">—</option>\r\n @for (unit of offsetUnits(); track unit.value) {\r\n <option [value]=\"unit.value\">{{ unit.label }}</option>\r\n }\r\n </select>\r\n </div>\r\n </div>\r\n <p class=\"fb-field__hint\">Definiscono l’attesa di un’action asincrona.</p>\r\n</fieldset>\r\n\r\n<fieldset class=\"fb-section\">\r\n <legend class=\"fb-section__title\">Ramo di timeout</legend>\r\n <label class=\"fb-check\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"timeoutEnabled()\"\r\n (change)=\"setTimeoutEnabled($any($event.target).checked)\"\r\n />\r\n Abilita il ramo di timeout\r\n </label>\r\n <p class=\"fb-field__hint\">\r\n Il ramo esiste solo con questo flag: qui il flag e la destinazione sono legati, così non possono\r\n contraddirsi.\r\n </p>\r\n @if (timeoutMismatch()) {\r\n <p class=\"fb-callout fb-callout--warn\">\r\n Il flag e il ramo di timeout non sono coerenti fra loro.\r\n </p>\r\n }\r\n</fieldset>\r\n\r\n<fieldset class=\"fb-section\">\r\n <legend class=\"fb-section__title\">Output</legend>\r\n <label class=\"fb-check\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"storeOutputAutomatically()\"\r\n (change)=\"setStoreOutputAutomatically($any($event.target).checked)\"\r\n />\r\n Output automatico\r\n </label>\r\n @if (storeOutputAutomatically()) {\r\n <p class=\"fb-field__hint\">\r\n Gli output dell’action si referenziano col nome dell’elemento: <code>{{ name() }}.NomeOutput</code>.\r\n </p>\r\n }\r\n</fieldset>\r\n\r\n<fb-parameter-editor\r\n [holder]=\"action()\"\r\n [catalogParameters]=\"parameterCatalog()\"\r\n [showOutputs]=\"!storeOutputAutomatically()\"\r\n [outputsDisabledReason]=\"\r\n storeOutputAutomatically() ? 'Con l’output automatico i parametri di uscita non servono.' : null\r\n \"\r\n (changed)=\"onParametersChanged($event)\"\r\n/>\r\n\r\n<fb-connector-editor\r\n [nodeName]=\"name()\"\r\n [node]=\"node()\"\r\n [outlets]=\"outlets()\"\r\n title=\"Le tre uscite\"\r\n (connectorChanged)=\"onConnectorChanged($event)\"\r\n/>\r\n","/**\r\n * Assignment — FRONTEND.md §5.2.\r\n *\r\n * Tre cose che il modello impone e che questo form rende visibili:\r\n *\r\n * 1. **Le operazioni sono eseguite nell'ordine dichiarato**, quindi devono essere\r\n * riordinabili: un'interfaccia che le presenta come un insieme nasconde la semantica.\r\n * 2. **Cosa puo' stare in `assignToReference`**: una variabile, un campo di una variabile\r\n * record, un campo di `$Record` e — sole eccezioni fra le globali —\r\n * `$Flow.CurrentStage` e `$Flow.ActiveStages`. Tutto il resto e' di sola lettura.\r\n * 3. Gli operatori marcati `expectsCollection` hanno senso **solo** su destinazioni\r\n * collection: su una variabile singola non falliscono, non fanno nulla.\r\n */\r\n\r\nimport { ChangeDetectionStrategy, Component, computed } from '@angular/core';\r\n\r\nimport { NodeInspectorBase } from './node-inspector-base';\r\nimport { FlowAssignment, FlowAssignmentItem, FlowElementType, FlowValue } from '../../model/flow.model';\r\nimport { ConnectorEditorComponent } from '../shared/connector-editor.component';\r\nimport { ReferencePickerComponent } from '../shared/reference-picker.component';\r\nimport { ValueEditorComponent } from '../shared/value-editor.component';\r\nimport { SelectValueDirective } from '../shared/select-value.directive';\r\n\r\n@Component({\r\n selector: 'fb-assignment-inspector',\r\n standalone: true,\r\n imports: [ConnectorEditorComponent, ReferencePickerComponent, ValueEditorComponent, SelectValueDirective],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './assignment-inspector.component.html',\r\n})\r\nexport class AssignmentInspectorComponent extends NodeInspectorBase {\r\n readonly elementType: FlowElementType = 'Assignment';\r\n\r\n readonly assignment = computed<FlowAssignment>(() => this.node() as FlowAssignment);\r\n readonly items = computed<FlowAssignmentItem[]>(() => this.assignment().assignmentItems ?? []);\r\n readonly operators = computed(() => this.dictionaries.assignmentOperators());\r\n\r\n /** Il flow dichiara stage: solo allora le due globali di stage sono proponibili (§5.2). */\r\n readonly hasStages = computed(() => (this.store.document().stages?.length ?? 0) > 0);\r\n\r\n operatorLabel(value: string | undefined): string {\r\n if (!value) {\r\n return '';\r\n }\r\n return this.operators().find((entry) => entry.value === value)?.label ?? value;\r\n }\r\n\r\n operatorDescription(value: string | undefined): string | null {\r\n return this.operators().find((entry) => entry.value === value)?.description ?? null;\r\n }\r\n\r\n expectsCollection(item: FlowAssignmentItem): boolean {\r\n return this.dictionaries.assignmentExpectsCollection(item.operator);\r\n }\r\n\r\n /**\r\n * `Add` cambia significato col tipo della destinazione: numero → somma, data → giorni,\r\n * testo → concatena, collection → accoda. Vale la pena dirlo accanto al campo.\r\n */\r\n addSemanticsHint(item: FlowAssignmentItem): string | null {\r\n if (item.operator !== 'Add') {\r\n return null;\r\n }\r\n return 'Su un numero somma, su una data aggiunge giorni, su un testo concatena, su una collection accoda.';\r\n }\r\n\r\n addItem(): void {\r\n this.patch((node) => {\r\n const assignment = node as FlowAssignment;\r\n assignment.assignmentItems ??= [];\r\n assignment.assignmentItems.push({ operator: 'Assign' });\r\n });\r\n }\r\n\r\n removeItem(index: number): void {\r\n this.patch((node) => {\r\n const assignment = node as FlowAssignment;\r\n assignment.assignmentItems?.splice(index, 1);\r\n if (assignment.assignmentItems?.length === 0) {\r\n delete assignment.assignmentItems;\r\n }\r\n });\r\n }\r\n\r\n /** L'ordine e' semantico: spostare un'operazione cambia il risultato. */\r\n moveItem(index: number, direction: -1 | 1): void {\r\n const target = index + direction;\r\n if (target < 0 || target >= this.items().length) {\r\n return;\r\n }\r\n this.patch((node) => {\r\n const items = (node as FlowAssignment).assignmentItems;\r\n if (!items) {\r\n return;\r\n }\r\n const [moved] = items.splice(index, 1);\r\n items.splice(target, 0, moved);\r\n });\r\n }\r\n\r\n setTarget(index: number, reference: string | undefined): void {\r\n this.patch((node) => {\r\n const item = (node as FlowAssignment).assignmentItems?.[index];\r\n if (item) {\r\n item.assignToReference = reference;\r\n }\r\n });\r\n }\r\n\r\n setOperator(index: number, operator: string): void {\r\n this.patch((node) => {\r\n const item = (node as FlowAssignment).assignmentItems?.[index];\r\n if (item) {\r\n item.operator = operator;\r\n }\r\n });\r\n }\r\n\r\n setValue(index: number, value: FlowValue | undefined): void {\r\n this.patch((node) => {\r\n const item = (node as FlowAssignment).assignmentItems?.[index];\r\n if (item) {\r\n item.value = value;\r\n }\r\n });\r\n }\r\n\r\n /** Gli operatori di rimozione non prendono un valore da assegnare. */\r\n needsValue(item: FlowAssignmentItem): boolean {\r\n const operator = item.operator ?? '';\r\n return !operator.startsWith('Remove') || operator === 'RemovePosition' || operator === 'RemoveUncommon';\r\n }\r\n}\r\n","<fieldset class=\"fb-section\">\r\n <legend class=\"fb-section__title\">Operazioni</legend>\r\n <p class=\"fb-section__note\">\r\n Le operazioni sono eseguite <strong>nell’ordine in cui compaiono</strong>: spostarne una cambia il\r\n risultato.\r\n </p>\r\n\r\n <div class=\"fb-list\">\r\n @for (item of items(); track $index) {\r\n <div class=\"fb-list__item\">\r\n <div class=\"fb-list__header\">\r\n <span class=\"fb-list__index\">{{ $index + 1 }}</span>\r\n <span class=\"fb-list__spacer\"></span>\r\n <button\r\n type=\"button\"\r\n class=\"fb-btn fb-btn--ghost fb-btn--icon\"\r\n aria-label=\"Sposta su\"\r\n [disabled]=\"$first\"\r\n (click)=\"moveItem($index, -1)\"\r\n >\r\n ↑\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"fb-btn fb-btn--ghost fb-btn--icon\"\r\n aria-label=\"Sposta giu’\"\r\n [disabled]=\"$last\"\r\n (click)=\"moveItem($index, 1)\"\r\n >\r\n ↓\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"fb-btn fb-btn--ghost fb-btn--icon\"\r\n aria-label=\"Rimuovi l’operazione\"\r\n (click)=\"removeItem($index)\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Destinazione</label>\r\n <!--\r\n Solo destinazioni scrivibili: una costante o una formula produrrebbero\r\n TARGET_NOT_WRITABLE. Le due globali di stage si aggiungono solo se il flow\r\n dichiara stage.\r\n -->\r\n <fb-reference-picker\r\n [value]=\"item.assignToReference\"\r\n [writableOnly]=\"true\"\r\n [allowStageTargets]=\"hasStages()\"\r\n placeholder=\"Scegli una variabile\"\r\n (valueChange)=\"setTarget($index, $event)\"\r\n />\r\n <p class=\"fb-field__hint\">\r\n Puoi scrivere anche un campo di un record: <code>Cliente.Email</code>, <code>$Record.Stato</code>.\r\n </p>\r\n </div>\r\n\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Operazione</label>\r\n <select\r\n class=\"fb-select\"\r\n [fbValue]=\"item.operator || ''\"\r\n (change)=\"setOperator($index, $any($event.target).value)\"\r\n >\r\n @for (operator of operators(); track operator.value) {\r\n <option [value]=\"operator.value\">{{ operator.label }}</option>\r\n }\r\n </select>\r\n @if (operatorDescription(item.operator)) {\r\n <p class=\"fb-field__hint\">{{ operatorDescription(item.operator) }}</p>\r\n }\r\n @if (addSemanticsHint(item)) {\r\n <p class=\"fb-field__hint\">{{ addSemanticsHint(item) }}</p>\r\n }\r\n @if (expectsCollection(item)) {\r\n <p class=\"fb-field__hint fb-field__hint--warn\">\r\n Questa operazione ha senso solo su una destinazione collection: su una variabile singola non\r\n fallisce, semplicemente non fa nulla.\r\n </p>\r\n }\r\n </div>\r\n\r\n @if (needsValue(item)) {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Valore</label>\r\n <fb-value-editor [value]=\"item.value\" label=\"Valore\" (valueChange)=\"setValue($index, $event)\" />\r\n </div>\r\n }\r\n </div>\r\n } @empty {\r\n <p class=\"fb-empty\">\r\n Nessuna operazione: un Assignment senza operazioni non fa nulla (ASSIGNMENT_WITHOUT_ITEMS).\r\n </p>\r\n }\r\n </div>\r\n\r\n <button type=\"button\" class=\"fb-btn\" (click)=\"addItem()\">Aggiungi operazione</button>\r\n</fieldset>\r\n\r\n<fb-connector-editor\r\n [nodeName]=\"name()\"\r\n [node]=\"node()\"\r\n [outlets]=\"outlets()\"\r\n (connectorChanged)=\"onConnectorChanged($event)\"\r\n/>\r\n","/**\r\n * Collection Processor — FRONTEND.md §5.5 e trappola §13.2.\r\n *\r\n * Un solo tipo di node con un discriminatore: `collectionProcessorType` vale `Sort` o\r\n * `Filter`, e i campi rilevanti cambiano.\r\n *\r\n * La trappola: **`assignNextValueToReference` non e' la destinazione del risultato.** È la\r\n * variabile che espone alle condizioni l'elemento in esame, come nel Loop. Il risultato e'\r\n * l'output automatico dell'elemento, cioe' il suo nome. Confonderle e' un errore classico,\r\n * e l'unico rimedio e' etichettare quel campo per quello che e': \"elemento in esame\".\r\n */\r\n\r\nimport { ChangeDetectionStrategy, Component, computed } from '@angular/core';\r\n\r\nimport { NodeInspectorBase } from './node-inspector-base';\r\nimport {\r\n FlowCollectionProcessor,\r\n FlowConditionHolder,\r\n FlowElementType,\r\n FlowSortOption,\r\n} from '../../model/flow.model';\r\nimport { ConditionEditorComponent } from '../shared/condition-editor.component';\r\nimport { ConnectorEditorComponent } from '../shared/connector-editor.component';\r\nimport { ReferencePickerComponent } from '../shared/reference-picker.component';\r\nimport { SelectValueDirective } from '../shared/select-value.directive';\r\n\r\n@Component({\r\n selector: 'fb-collection-processor-inspector',\r\n standalone: true,\r\n imports: [ConditionEditorComponent, ConnectorEditorComponent, ReferencePickerComponent, SelectValueDirective],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './collection-processor-inspector.component.html',\r\n})\r\nexport class CollectionProcessorInspectorComponent extends NodeInspectorBase {\r\n readonly elementType: FlowElementType = 'CollectionProcessor';\r\n\r\n readonly processor = computed<FlowCollectionProcessor>(() => this.node() as FlowCollectionProcessor);\r\n readonly kinds = computed(() => this.dictionaries.collectionProcessorTypes());\r\n readonly sortOrders = computed(() => this.dictionaries.sortOrders());\r\n\r\n readonly isSort = computed(() => this.processor().collectionProcessorType === 'Sort');\r\n readonly isFilter = computed(() => this.processor().collectionProcessorType === 'Filter');\r\n readonly hasKind = computed(() => !!this.processor().collectionProcessorType);\r\n\r\n readonly sortOptions = computed<FlowSortOption[]>(() => this.processor().sortOptions ?? []);\r\n\r\n /** Il tipo degli elementi: serve alla variabile dell'elemento in esame. */\r\n readonly elementDataType = computed(() => {\r\n const reference = this.processor().collectionReference;\r\n return this.store.document().variables?.find((candidate) => candidate.name === reference)?.dataType;\r\n });\r\n\r\n readonly elementObjectType = computed(() => {\r\n const reference = this.processor().collectionReference;\r\n return this.store.document().variables?.find((candidate) => candidate.name === reference)?.objectType;\r\n });\r\n\r\n setKind(kind: string): void {\r\n this.patch((node) => {\r\n const processor = node as FlowCollectionProcessor;\r\n processor.collectionProcessorType = kind;\r\n // Cambiare tipo lascia campi che il nuovo tipo non usa: si rimuovono, perche'\r\n // un `Sort` con `conditions` non e' un documento che qualcuno voglia salvare.\r\n if (kind === 'Sort') {\r\n delete processor.conditions;\r\n delete processor.conditionLogic;\r\n delete processor.formula;\r\n delete processor.assignNextValueToReference;\r\n } else if (kind === 'Filter') {\r\n delete processor.sortOptions;\r\n }\r\n });\r\n }\r\n\r\n setCollection(reference: string | undefined): void {\r\n this.setField('collectionReference', reference);\r\n }\r\n\r\n setCurrentElementVariable(reference: string | undefined): void {\r\n this.setField('assignNextValueToReference', reference);\r\n }\r\n\r\n setLimit(value: string): void {\r\n const parsed = Number.parseInt(value, 10);\r\n this.setField('limit', Number.isNaN(parsed) ? undefined : parsed);\r\n }\r\n\r\n addSortOption(): void {\r\n this.patch((node) => {\r\n const processor = node as FlowCollectionProcessor;\r\n processor.sortOptions ??= [];\r\n processor.sortOptions.push({ sortOrder: 'Asc' });\r\n });\r\n }\r\n\r\n removeSortOption(index: number): void {\r\n this.patch((node) => {\r\n const processor = node as FlowCollectionProcessor;\r\n processor.sortOptions?.splice(index, 1);\r\n if (processor.sortOptions?.length === 0) {\r\n delete processor.sortOptions;\r\n }\r\n });\r\n }\r\n\r\n moveSortOption(index: number, direction: -1 | 1): void {\r\n const target = index + direction;\r\n if (target < 0 || target >= this.sortOptions().length) {\r\n return;\r\n }\r\n this.patch((node) => {\r\n const options = (node as FlowCollectionProcessor).sortOptions;\r\n if (!options) {\r\n return;\r\n }\r\n const [moved] = options.splice(index, 1);\r\n options.splice(target, 0, moved);\r\n });\r\n }\r\n\r\n setSortField(index: number, field: string): void {\r\n this.patch((node) => {\r\n const option = (node as FlowCollectionProcessor).sortOptions?.[index];\r\n if (option) {\r\n option.sortField = field || undefined;\r\n }\r\n });\r\n }\r\n\r\n setSortOrder(index: number, order: string): void {\r\n this.patch((node) => {\r\n const option = (node as FlowCollectionProcessor).sortOptions?.[index];\r\n if (option) {\r\n option.sortOrder = order;\r\n }\r\n });\r\n }\r\n\r\n setEmptyFirst(index: number, value: boolean): void {\r\n this.patch((node) => {\r\n const option = (node as FlowCollectionProcessor).sortOptions?.[index];\r\n if (option) {\r\n option.doesPutEmptyStringAndNullFirst = value;\r\n }\r\n });\r\n }\r\n\r\n onConditionsChanged(mutate: (holder: FlowConditionHolder) => void): void {\r\n this.patch((node) => mutate(node as FlowConditionHolder));\r\n }\r\n}\r\n","<div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Cosa fa</label>\r\n <select\r\n class=\"fb-select\"\r\n [fbValue]=\"processor().collectionProcessorType || ''\"\r\n (change)=\"setKind($any($event.target).value)\"\r\n >\r\n <option value=\"\">— scegli —</option>\r\n @for (kind of kinds(); track kind.value) {\r\n <option [value]=\"kind.value\">{{ kind.label }}</option>\r\n }\r\n </select>\r\n @if (!hasKind()) {\r\n <p class=\"fb-field__error\">Senza questo valore l’elemento non e’ eseguibile (PROCESSOR_TYPE_MISSING).</p>\r\n }\r\n</div>\r\n\r\n<div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Collection di partenza</label>\r\n <fb-reference-picker\r\n [value]=\"processor().collectionReference\"\r\n [isCollection]=\"true\"\r\n placeholder=\"Scegli una collection\"\r\n (valueChange)=\"setCollection($event)\"\r\n />\r\n</div>\r\n\r\n<p class=\"fb-callout\">\r\n Il risultato non si assegna a una variabile: e’ l’<strong>output automatico</strong> dell’elemento, e si\r\n referenzia col suo nome — <code>{{ name() }}</code>.\r\n</p>\r\n\r\n@if (isSort()) {\r\n <fieldset class=\"fb-section\">\r\n <legend class=\"fb-section__title\">Ordinamento</legend>\r\n <div class=\"fb-list\">\r\n @for (option of sortOptions(); track $index) {\r\n <div class=\"fb-list__item\">\r\n <div class=\"fb-list__header\">\r\n <span class=\"fb-list__index\">{{ $index + 1 }}</span>\r\n <span class=\"fb-list__spacer\"></span>\r\n <button\r\n type=\"button\"\r\n class=\"fb-btn fb-btn--ghost fb-btn--icon\"\r\n aria-label=\"Sposta su\"\r\n [disabled]=\"$first\"\r\n (click)=\"moveSortOption($index, -1)\"\r\n >\r\n ↑\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"fb-btn fb-btn--ghost fb-btn--icon\"\r\n aria-label=\"Sposta giu’\"\r\n [disabled]=\"$last\"\r\n (click)=\"moveSortOption($index, 1)\"\r\n >\r\n ↓\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"fb-btn fb-btn--ghost fb-btn--icon\"\r\n aria-label=\"Rimuovi\"\r\n (click)=\"removeSortOption($index)\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Campo</label>\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"option.sortField || ''\"\r\n placeholder=\"Nome del campo degli elementi\"\r\n (input)=\"setSortField($index, $any($event.target).value)\"\r\n />\r\n </div>\r\n\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Direzione</label>\r\n <select\r\n class=\"fb-select\"\r\n [fbValue]=\"option.sortOrder || ''\"\r\n (change)=\"setSortOrder($index, $any($event.target).value)\"\r\n >\r\n @for (order of sortOrders(); track order.value) {\r\n <option [value]=\"order.value\">{{ order.label }}</option>\r\n }\r\n </select>\r\n </div>\r\n\r\n <label class=\"fb-check\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"option.doesPutEmptyStringAndNullFirst === true\"\r\n (change)=\"setEmptyFirst($index, $any($event.target).checked)\"\r\n />\r\n Metti prima i valori vuoti e nulli\r\n </label>\r\n </div>\r\n } @empty {\r\n <p class=\"fb-empty\">Un Sort senza criteri di ordinamento e’ un errore (SORT_OPTIONS_MISSING).</p>\r\n }\r\n </div>\r\n <button type=\"button\" class=\"fb-btn\" (click)=\"addSortOption()\">Aggiungi criterio</button>\r\n </fieldset>\r\n\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Numero massimo di elementi</label>\r\n <input\r\n class=\"fb-input\"\r\n type=\"number\"\r\n min=\"1\"\r\n [value]=\"processor().limit ?? ''\"\r\n (input)=\"setLimit($any($event.target).value)\"\r\n />\r\n </div>\r\n}\r\n\r\n@if (isFilter()) {\r\n <div class=\"fb-field\">\r\n <!--\r\n Trappola: questo NON e' dove finisce il risultato. È la variabile che espone alle\r\n condizioni l'elemento che si sta esaminando, esattamente come nel Loop.\r\n -->\r\n <label class=\"fb-field__label fb-field__label--required\">Elemento in esame</label>\r\n <fb-reference-picker\r\n [value]=\"processor().assignNextValueToReference\"\r\n [writableOnly]=\"true\"\r\n [dataType]=\"elementDataType()\"\r\n [objectType]=\"elementObjectType()\"\r\n [isCollection]=\"false\"\r\n placeholder=\"Variabile che espone l’elemento alle condizioni\"\r\n (valueChange)=\"setCurrentElementVariable($event)\"\r\n />\r\n <p class=\"fb-field__hint\">\r\n Questa variabile serve <strong>a scrivere le condizioni</strong> qui sotto: non e’ la destinazione del\r\n risultato.\r\n </p>\r\n </div>\r\n\r\n <fb-condition-editor\r\n [holder]=\"processor()\"\r\n title=\"Tieni gli elementi per cui\"\r\n (changed)=\"onConditionsChanged($event)\"\r\n />\r\n}\r\n\r\n<fb-connector-editor\r\n [nodeName]=\"name()\"\r\n [node]=\"node()\"\r\n [outlets]=\"outlets()\"\r\n (connectorChanged)=\"onConnectorChanged($event)\"\r\n/>\r\n","/**\n * Custom Error — FRONTEND.md §5.11.\n *\n * Il Custom Error **interrompe** l'esecuzione e restituisce i messaggi al chiamante: sono il\n * suo prodotto principale, e almeno uno e' obbligatorio (`CUSTOM_ERROR_WITHOUT_MESSAGES`).\n * Non ha uscite: per questo il form non mostra nessun connector.\n */\n\nimport { ChangeDetectionStrategy, Component, computed } from '@angular/core';\n\nimport { NodeInspectorBase } from './node-inspector-base';\nimport { FlowCustomError, FlowCustomErrorMessage, FlowElementType } from '../../model/flow.model';\n\n@Component({\n selector: 'fb-custom-error-inspector',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './custom-error-inspector.component.html',\n})\nexport class CustomErrorInspectorComponent extends NodeInspectorBase {\n readonly elementType: FlowElementType = 'CustomError';\n\n readonly customError = computed<FlowCustomError>(() => this.node() as FlowCustomError);\n readonly messages = computed<FlowCustomErrorMessage[]>(() => this.customError().customErrorMessages ?? []);\n\n addMessage(): void {\n this.patch((node) => {\n const customError = node as FlowCustomError;\n customError.customErrorMessages ??= [];\n customError.customErrorMessages.push({ errorMessage: '' });\n });\n }\n\n removeMessage(index: number): void {\n this.patch((node) => {\n const customError = node as FlowCustomError;\n customError.customErrorMessages?.splice(index, 1);\n if (customError.customErrorMessages?.length === 0) {\n delete customError.customErrorMessages;\n }\n });\n }\n\n setMessage(index: number, message: string): void {\n this.patch((node) => {\n const entry = (node as FlowCustomError).customErrorMessages?.[index];\n if (entry) {\n entry.errorMessage = message;\n }\n });\n }\n\n setIsFieldError(index: number, value: boolean): void {\n this.patch((node) => {\n const entry = (node as FlowCustomError).customErrorMessages?.[index];\n if (!entry) {\n return;\n }\n if (value) {\n entry.isFieldError = true;\n } else {\n delete entry.isFieldError;\n // Senza `isFieldError` il campo indicato non ha significato.\n delete entry.fieldSelection;\n }\n });\n }\n\n setFieldSelection(index: number, field: string): void {\n this.patch((node) => {\n const entry = (node as FlowCustomError).customErrorMessages?.[index];\n if (entry) {\n entry.fieldSelection = field || undefined;\n }\n });\n }\n}\n","<p class=\"fb-callout\">\n Questo elemento <strong>interrompe</strong> l’esecuzione e restituisce i messaggi al chiamante. Non ha\n uscite: quello che c’e’ dopo non verra’ eseguito.\n</p>\n\n<div class=\"fb-list\">\n @for (message of messages(); track $index) {\n <div class=\"fb-list__item\">\n <div class=\"fb-list__header\">\n <span class=\"fb-list__index\">{{ $index + 1 }}</span>\n <span class=\"fb-list__spacer\"></span>\n <button\n type=\"button\"\n class=\"fb-btn fb-btn--ghost fb-btn--icon\"\n aria-label=\"Rimuovi il messaggio\"\n (click)=\"removeMessage($index)\"\n >\n ×\n </button>\n </div>\n\n <div class=\"fb-field\">\n <label class=\"fb-field__label fb-field__label--required\">Messaggio</label>\n <textarea\n class=\"fb-textarea\"\n [value]=\"message.errorMessage || ''\"\n placeholder=\"L’importo supera il limite consentito.\"\n (input)=\"setMessage($index, $any($event.target).value)\"\n ></textarea>\n </div>\n\n <label class=\"fb-check\">\n <input\n type=\"checkbox\"\n [checked]=\"message.isFieldError === true\"\n (change)=\"setIsFieldError($index, $any($event.target).checked)\"\n />\n Mostra accanto a un campo\n </label>\n\n @if (message.isFieldError) {\n <div class=\"fb-field\">\n <label class=\"fb-field__label fb-field__label--required\">Campo</label>\n <input\n class=\"fb-input\"\n [value]=\"message.fieldSelection || ''\"\n placeholder=\"Importo\"\n (input)=\"setFieldSelection($index, $any($event.target).value)\"\n />\n </div>\n }\n </div>\n } @empty {\n <p class=\"fb-empty\">\n Almeno un messaggio e’ obbligatorio: sono il prodotto di questo elemento\n (CUSTOM_ERROR_WITHOUT_MESSAGES).\n </p>\n }\n</div>\n\n<button type=\"button\" class=\"fb-btn\" (click)=\"addMessage()\">Aggiungi messaggio</button>\n","/**\n * Decision — FRONTEND.md §5.3 e trappola §13.7.\n *\n * **Le regole sono valutate in ordine e ci si ferma alla prima vera.** L'ordine e' quindi\n * semantico, e questo form lo rende evidente: le regole sono numerate, riordinabili, e il\n * testo dice cosa accade quando nessuna e' vera. Un'interfaccia che le presenta come un\n * insieme non ordinato nasconde una parte del significato del flow.\n *\n * `label` di una regola e' l'etichetta del ramo sul canvas: senza, l'arco resta senza nome.\n */\n\nimport { ChangeDetectionStrategy, Component, computed } from '@angular/core';\n\nimport { NodeInspectorBase } from './node-inspector-base';\nimport { FlowConditionHolder, FlowDecision, FlowDecisionRule, FlowElementType } from '../../model/flow.model';\nimport { checkFlowName, slugifyFlowName, uniqueFlowName } from '../../core/flow-name.util';\nimport { ConditionEditorComponent } from '../shared/condition-editor.component';\nimport { ConnectorEditorComponent } from '../shared/connector-editor.component';\n\n@Component({\n selector: 'fb-decision-inspector',\n standalone: true,\n imports: [ConditionEditorComponent, ConnectorEditorComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './decision-inspector.component.html',\n})\nexport class DecisionInspectorComponent extends NodeInspectorBase {\n readonly elementType: FlowElementType = 'Decision';\n\n readonly decision = computed<FlowDecision>(() => this.node() as FlowDecision);\n readonly rules = computed<FlowDecisionRule[]>(() => this.decision().rules ?? []);\n\n /** Se nessuna regola e' vera si prende il ramo di default; se manca, l'esecuzione finisce. */\n readonly defaultLabel = computed(() => this.decision().defaultConnectorLabel ?? '');\n readonly hasDefaultTarget = computed(() => !!this.decision().defaultConnector?.targetReference);\n\n /** I nomi delle regole vivono nello spazio dei nomi delle regole, non del flow. */\n ruleNameError(index: number): string | null {\n const rules = this.rules();\n const rule = rules[index];\n if (!rule?.name) {\n return 'Il nome della regola e’ obbligatorio.';\n }\n const others = rules.filter((_, position) => position !== index).map((candidate) => candidate.name ?? '');\n const check = checkFlowName(rule.name, others);\n return check.isValid ? null : (check.message ?? 'Nome non valido.');\n }\n\n addRule(): void {\n this.patch((node) => {\n const decision = node as FlowDecision;\n decision.rules ??= [];\n const existing = decision.rules.map((rule) => rule.name ?? '');\n const name = uniqueFlowName('Regola', existing);\n decision.rules.push({\n name,\n label: `Regola ${decision.rules.length + 1}`,\n conditionLogic: 'and',\n conditions: [{ operator: 'EqualTo' }],\n });\n });\n }\n\n removeRule(index: number): void {\n this.patch((node) => {\n const decision = node as FlowDecision;\n decision.rules?.splice(index, 1);\n if (decision.rules?.length === 0) {\n delete decision.rules;\n }\n });\n }\n\n /**\n * Sposta una regola. L'ordine e' l'ordine di valutazione: la prima vera vince, quindi\n * spostare una regola piu' in alto puo' cambiare quale ramo viene preso.\n */\n moveRule(index: number, direction: -1 | 1): void {\n const target = index + direction;\n if (target < 0 || target >= this.rules().length) {\n return;\n }\n this.patch((node) => {\n const rules = (node as FlowDecision).rules;\n if (!rules) {\n return;\n }\n const [moved] = rules.splice(index, 1);\n rules.splice(target, 0, moved);\n });\n }\n\n setRuleLabel(index: number, label: string): void {\n this.patch((node) => {\n const rule = (node as FlowDecision).rules?.[index];\n if (!rule) {\n return;\n }\n rule.label = label || undefined;\n // Il nome tecnico si genera dalla label solo se non e' ancora stato personalizzato.\n if (!rule.name && label) {\n rule.name = slugifyFlowName(label);\n }\n });\n }\n\n setRuleName(index: number, name: string): void {\n this.patch((node) => {\n const rule = (node as FlowDecision).rules?.[index];\n if (rule) {\n rule.name = name;\n }\n });\n }\n\n onRuleConditionsChanged(index: number, mutate: (holder: FlowConditionHolder) => void): void {\n this.patch((node) => {\n const rule = (node as FlowDecision).rules?.[index];\n if (rule) {\n mutate(rule);\n }\n });\n }\n\n setDefaultLabel(label: string): void {\n this.setField('defaultConnectorLabel', label);\n }\n}\n","<p class=\"fb-callout\">\n Le regole sono valutate <strong>dall’alto verso il basso</strong> e si ferma alla prima vera. L’ordine e’\n parte del significato del flow: usa le frecce per cambiarlo.\n</p>\n\n<div class=\"fb-list\">\n @for (rule of rules(); track $index) {\n <div class=\"fb-list__item\">\n <div class=\"fb-list__header\">\n <span class=\"fb-list__index\" [title]=\"'Valutata per ' + ($index + 1) + 'ª'\">{{ $index + 1 }}</span>\n <span class=\"fb-list__spacer\"></span>\n <button\n type=\"button\"\n class=\"fb-btn fb-btn--ghost fb-btn--icon\"\n aria-label=\"Valuta prima\"\n [disabled]=\"$first\"\n (click)=\"moveRule($index, -1)\"\n >\n ↑\n </button>\n <button\n type=\"button\"\n class=\"fb-btn fb-btn--ghost fb-btn--icon\"\n aria-label=\"Valuta dopo\"\n [disabled]=\"$last\"\n (click)=\"moveRule($index, 1)\"\n >\n ↓\n </button>\n <button\n type=\"button\"\n class=\"fb-btn fb-btn--ghost fb-btn--icon\"\n aria-label=\"Rimuovi la regola\"\n (click)=\"removeRule($index)\"\n >\n ×\n </button>\n </div>\n\n <div class=\"fb-field\">\n <label class=\"fb-field__label\">Etichetta del ramo</label>\n <input\n class=\"fb-input\"\n [value]=\"rule.label || ''\"\n placeholder=\"Approvato\"\n (input)=\"setRuleLabel($index, $any($event.target).value)\"\n />\n @if (!rule.label) {\n <p class=\"fb-field__hint\">Senza etichetta l’arco resta senza nome sul canvas.</p>\n }\n </div>\n\n <div class=\"fb-field\">\n <label class=\"fb-field__label fb-field__label--required\">Nome tecnico</label>\n <input\n class=\"fb-input fb-input--mono\"\n [class.fb-input--invalid]=\"!!ruleNameError($index)\"\n [value]=\"rule.name || ''\"\n (input)=\"setRuleName($index, $any($event.target).value)\"\n />\n @if (ruleNameError($index)) {\n <p class=\"fb-field__error\">{{ ruleNameError($index) }}</p>\n }\n </div>\n\n <fb-condition-editor\n [holder]=\"rule\"\n title=\"Quando prendere questo ramo\"\n [issuePath]=\"'rules[' + (rule.name || $index) + ']'\"\n (changed)=\"onRuleConditionsChanged($index, $event)\"\n />\n </div>\n } @empty {\n <p class=\"fb-empty\">\n Nessuna regola: una Decision senza regole prende sempre il ramo di default\n (DECISION_WITHOUT_RULES).\n </p>\n }\n</div>\n\n<button type=\"button\" class=\"fb-btn\" (click)=\"addRule()\">Aggiungi regola</button>\n\n<fieldset class=\"fb-section\">\n <legend class=\"fb-section__title\">Se nessuna regola e’ vera</legend>\n <div class=\"fb-field\">\n <label class=\"fb-field__label\">Etichetta del ramo di default</label>\n <input\n class=\"fb-input\"\n [value]=\"defaultLabel()\"\n placeholder=\"Rifiutato\"\n (input)=\"setDefaultLabel($any($event.target).value)\"\n />\n </div>\n @if (!hasDefaultTarget()) {\n <p class=\"fb-field__hint\">\n Nessuna destinazione di default: se nessuna regola e’ vera l’esecuzione finisce qui.\n </p>\n }\n</fieldset>\n\n<fb-connector-editor\n [nodeName]=\"name()\"\n [node]=\"node()\"\n [outlets]=\"outlets()\"\n title=\"Rami\"\n (connectorChanged)=\"onConnectorChanged($event)\"\n/>\n","/**\r\n * Loop — FRONTEND.md §5.4.\r\n *\r\n * - `collectionReference` deve puntare a una **collection**: il selettore filtra su\r\n * `isCollection`, così una variabile singola non e' nemmeno proponibile.\r\n * - `assignNextValueToReference` e' la variabile che riceve l'elemento corrente: senza,\r\n * il corpo del ciclo non ha modo di leggerlo.\r\n * - il corpo deve **richiudersi sul Loop** perche' il ciclo prosegua. Nel disegno e' l'arco\r\n * di ritorno, tipicamente marcato `isGoTo`: il form lo verifica e lo dice.\r\n */\r\n\r\nimport { ChangeDetectionStrategy, Component, computed } from '@angular/core';\r\n\r\nimport { NodeInspectorBase } from './node-inspector-base';\r\nimport { FlowElementType, FlowLoop } from '../../model/flow.model';\r\nimport { ConnectorEditorComponent } from '../shared/connector-editor.component';\r\nimport { ReferencePickerComponent } from '../shared/reference-picker.component';\r\nimport { SelectValueDirective } from '../shared/select-value.directive';\r\n\r\n@Component({\r\n selector: 'fb-loop-inspector',\r\n standalone: true,\r\n imports: [ConnectorEditorComponent, ReferencePickerComponent, SelectValueDirective],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './loop-inspector.component.html',\r\n})\r\nexport class LoopInspectorComponent extends NodeInspectorBase {\r\n readonly elementType: FlowElementType = 'Loop';\r\n\r\n readonly loop = computed<FlowLoop>(() => this.node() as FlowLoop);\r\n readonly sortOrders = computed(() => this.dictionaries.sortOrders());\r\n\r\n /** Il tipo degli elementi della collection: guida il tipo della variabile del ciclo. */\r\n readonly collectionType = computed(() => {\r\n const reference = this.loop().collectionReference;\r\n if (!reference) {\r\n return undefined;\r\n }\r\n const variable = this.store.document().variables?.find((candidate) => candidate.name === reference);\r\n return variable?.dataType;\r\n });\r\n\r\n readonly collectionObjectType = computed(() => {\r\n const reference = this.loop().collectionReference;\r\n if (!reference) {\r\n return undefined;\r\n }\r\n return this.store.document().variables?.find((candidate) => candidate.name === reference)?.objectType;\r\n });\r\n\r\n /**\r\n * Verifica che il corpo si richiuda sul Loop. Il cursore si azzera all'uscita, quindi un\r\n * corpo che non torna indietro esegue una sola iterazione: e' un errore logico che la\r\n * validazione non puo' distinguere da una scelta.\r\n */\r\n readonly bodyReturnsToLoop = computed(() => {\r\n const bodyStart = this.loop().nextValueConnector?.targetReference;\r\n if (!bodyStart) {\r\n return false;\r\n }\r\n const edges = this.store.edges();\r\n const visited = new Set<string>();\r\n const queue = [bodyStart];\r\n while (queue.length) {\r\n const current = queue.shift() as string;\r\n if (current === this.name()) {\r\n return true;\r\n }\r\n if (visited.has(current)) {\r\n continue;\r\n }\r\n visited.add(current);\r\n for (const edge of edges) {\r\n if (edge.from === current && edge.to) {\r\n queue.push(edge.to);\r\n }\r\n }\r\n }\r\n return false;\r\n });\r\n\r\n readonly hasBody = computed(() => !!this.loop().nextValueConnector?.targetReference);\r\n\r\n setCollection(reference: string | undefined): void {\r\n this.setField('collectionReference', reference);\r\n }\r\n\r\n setCurrentValueVariable(reference: string | undefined): void {\r\n this.setField('assignNextValueToReference', reference);\r\n }\r\n\r\n setIterationOrder(order: string): void {\r\n this.setField('iterationOrder', order);\r\n }\r\n}\r\n","<div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Collection da iterare</label>\r\n <!-- Solo collection: iterare una variabile singola e' un errore (LOOP_COLLECTION_MISSING). -->\r\n <fb-reference-picker\r\n [value]=\"loop().collectionReference\"\r\n [isCollection]=\"true\"\r\n placeholder=\"Scegli una collection\"\r\n (valueChange)=\"setCollection($event)\"\r\n />\r\n <p class=\"fb-field__hint\">\r\n Anche l’output automatico di un Get Records senza «solo il primo record» e’ iterabile.\r\n </p>\r\n</div>\r\n\r\n<div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Elemento corrente</label>\r\n <fb-reference-picker\r\n [value]=\"loop().assignNextValueToReference\"\r\n [writableOnly]=\"true\"\r\n [dataType]=\"collectionType()\"\r\n [objectType]=\"collectionObjectType()\"\r\n [isCollection]=\"false\"\r\n placeholder=\"Variabile che riceve l’elemento\"\r\n (valueChange)=\"setCurrentValueVariable($event)\"\r\n />\r\n <p class=\"fb-field__hint\">\r\n Deve essere una variabile <strong>singola</strong> dello stesso tipo degli elementi: senza, il corpo del\r\n ciclo non ha modo di leggere l’elemento corrente.\r\n </p>\r\n</div>\r\n\r\n<div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Ordine di iterazione</label>\r\n <select\r\n class=\"fb-select\"\r\n [fbValue]=\"loop().iterationOrder || ''\"\r\n (change)=\"setIterationOrder($any($event.target).value)\"\r\n >\r\n <option value=\"\">— predefinito —</option>\r\n @for (order of sortOrders(); track order.value) {\r\n <option [value]=\"order.value\">{{ order.label }}</option>\r\n }\r\n </select>\r\n</div>\r\n\r\n@if (hasBody() && !bodyReturnsToLoop()) {\r\n <p class=\"fb-callout fb-callout--warn\">\r\n Il corpo del ciclo non torna sul Loop: nessun percorso dal ramo «per ogni valore» rientra qui, quindi\r\n verrebbe eseguita una sola iterazione. Collega l’ultimo elemento del corpo di nuovo al Loop, marcando\r\n l’arco come salto indietro.\r\n </p>\r\n}\r\n@if (!hasBody()) {\r\n <p class=\"fb-callout fb-callout--error\">\r\n Il ramo «per ogni valore» non ha destinazione: il ciclo non ha corpo.\r\n </p>\r\n}\r\n\r\n<fb-connector-editor\r\n [nodeName]=\"name()\"\r\n [node]=\"node()\"\r\n [outlets]=\"outlets()\"\r\n title=\"Rami del ciclo\"\r\n (connectorChanged)=\"onConnectorChanged($event)\"\r\n/>\r\n\r\n<p class=\"fb-field__hint\">\r\n Il cursore si azzera all’uscita: rientrare nello stesso Loop ricomincia da capo.\r\n</p>\r\n","/**\r\n * Get Records — FRONTEND.md §5.6.\r\n *\r\n * Due modi di raccogliere il risultato, **alternativi**:\r\n * 1. `storeOutputAutomatically: true` → il risultato e' l'output automatico\r\n * (`Leggi_Ordine.Numero`). È il modo consigliato, e quello proposto per default.\r\n * 2. `outputReference` (una variabile) oppure `outputAssignments` (campo → variabile).\r\n *\r\n * Dichiarare entrambi e' `OUTPUT_CONFIGURATION_CONFLICT`; non dichiarare nessuno dei due e'\r\n * `LOOKUP_RESULT_DISCARDED`, cioe' interrogare il database e buttare via il risultato.\r\n * Il form modella le tre modalita' come mutuamente esclusive, così il conflitto non e'\r\n * rappresentabile.\r\n *\r\n * `getFirstRecordOnly` decide se il risultato e' un record singolo o una collection:\r\n * e' l'informazione che dice se questo elemento e' iterabile da un Loop.\r\n */\r\n\r\nimport { ChangeDetectionStrategy, Component, computed, effect, inject, signal } from '@angular/core';\r\n\r\nimport { NodeInspectorBase } from './node-inspector-base';\r\nimport { FlowCatalogStore } from '../../core/flow-dictionary.store';\r\nimport { FlowFieldDescription, FlowObjectSummary } from '../../model/dictionary.model';\r\nimport { FlowElementType, FlowRecordLookup } from '../../model/flow.model';\r\nimport { ConnectorEditorComponent } from '../shared/connector-editor.component';\r\nimport { FilterHolder, RecordFilterEditorComponent } from '../shared/record-filter-editor.component';\r\nimport { ReferencePickerComponent } from '../shared/reference-picker.component';\r\nimport { SelectValueDirective } from '../shared/select-value.directive';\r\n\r\ntype OutputMode = 'automatic' | 'variable' | 'assignments' | 'discard';\r\n\r\n@Component({\r\n selector: 'fb-record-lookup-inspector',\r\n standalone: true,\r\n imports: [ConnectorEditorComponent, RecordFilterEditorComponent, ReferencePickerComponent, SelectValueDirective],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './record-lookup-inspector.component.html',\r\n})\r\nexport class RecordLookupInspectorComponent extends NodeInspectorBase {\r\n private readonly catalog = inject(FlowCatalogStore);\r\n\r\n readonly elementType: FlowElementType = 'RecordLookup';\r\n\r\n readonly lookup = computed<FlowRecordLookup>(() => this.node() as FlowRecordLookup);\r\n readonly sortOrders = computed(() => this.dictionaries.sortOrders());\r\n\r\n private readonly objects = signal<FlowObjectSummary[]>([]);\r\n private readonly allFields = signal<FlowFieldDescription[]>([]);\r\n private readonly sortableFields = signal<FlowFieldDescription[]>([]);\r\n\r\n constructor() {\r\n super();\r\n void this.catalog\r\n .listObjects()\r\n .then((list) => this.objects.set(list ?? []))\r\n .catch(() => this.objects.set([]));\r\n\r\n effect(() => {\r\n const object = this.lookup().object;\r\n if (!object) {\r\n this.allFields.set([]);\r\n this.sortableFields.set([]);\r\n return;\r\n }\r\n void this.catalog.listFields(object, 'any').then((list) => this.allFields.set(list ?? []));\r\n void this.catalog.listFields(object, 'sortable').then((list) => this.sortableFields.set(list ?? []));\r\n });\r\n }\r\n\r\n readonly objectOptions = computed(() => this.objects());\r\n readonly fieldOptions = computed(() => this.allFields());\r\n readonly sortableOptions = computed(() => this.sortableFields());\r\n readonly hasObjectCatalog = computed(() => this.objects().length > 0);\r\n\r\n readonly queriedFields = computed<string[]>(() => this.lookup().queriedFields ?? []);\r\n\r\n /** La modalita' di output dedotta dai campi valorizzati. */\r\n readonly outputMode = computed<OutputMode>(() => {\r\n const lookup = this.lookup();\r\n if (lookup.storeOutputAutomatically) {\r\n return 'automatic';\r\n }\r\n if (lookup.outputAssignments?.length) {\r\n return 'assignments';\r\n }\r\n if (lookup.outputReference) {\r\n return 'variable';\r\n }\r\n return 'discard';\r\n });\r\n\r\n /** Entrambi dichiarati: capita su documenti arrivati da altri editor. */\r\n readonly hasOutputConflict = computed(() => {\r\n const lookup = this.lookup();\r\n return (\r\n lookup.storeOutputAutomatically === true &&\r\n (!!lookup.outputReference || (lookup.outputAssignments?.length ?? 0) > 0)\r\n );\r\n });\r\n\r\n readonly returnsCollection = computed(() => this.lookup().getFirstRecordOnly !== true);\r\n\r\n readonly outputAssignments = computed(() => this.lookup().outputAssignments ?? []);\r\n\r\n setObject(object: string): void {\r\n this.patch((node) => {\r\n const lookup = node as FlowRecordLookup;\r\n if (lookup.object === object) {\r\n return;\r\n }\r\n lookup.object = object || undefined;\r\n // Cambiare oggetto invalida campi, filtri e ordinamento: tenerli produrrebbe\r\n // FIELD_UNKNOWN su ogni riga.\r\n delete lookup.queriedFields;\r\n delete lookup.filters;\r\n delete lookup.sortField;\r\n delete lookup.outputAssignments;\r\n });\r\n }\r\n\r\n setFirstOnly(value: boolean): void {\r\n this.patch((node) => {\r\n const lookup = node as FlowRecordLookup;\r\n if (value) {\r\n lookup.getFirstRecordOnly = true;\r\n } else {\r\n delete lookup.getFirstRecordOnly;\r\n }\r\n });\r\n }\r\n\r\n setSortField(field: string): void {\r\n this.setField('sortField', field);\r\n }\r\n\r\n setSortOrder(order: string): void {\r\n this.setField('sortOrder', order);\r\n }\r\n\r\n setLimit(value: string): void {\r\n const parsed = Number.parseInt(value, 10);\r\n this.setField('limit', Number.isNaN(parsed) ? undefined : parsed);\r\n }\r\n\r\n toggleQueriedField(field: string, checked: boolean): void {\r\n this.patch((node) => {\r\n const lookup = node as FlowRecordLookup;\r\n const fields = new Set(lookup.queriedFields ?? []);\r\n if (checked) {\r\n fields.add(field);\r\n } else {\r\n fields.delete(field);\r\n }\r\n if (fields.size) {\r\n lookup.queriedFields = Array.from(fields);\r\n } else {\r\n delete lookup.queriedFields;\r\n }\r\n });\r\n }\r\n\r\n isQueried(field: string): boolean {\r\n return this.queriedFields().includes(field);\r\n }\r\n\r\n /** Il passaggio fra modalita' azzera i campi delle altre: il conflitto non e' scrivibile. */\r\n setOutputMode(mode: OutputMode): void {\r\n this.patch((node) => {\r\n const lookup = node as FlowRecordLookup;\r\n delete lookup.storeOutputAutomatically;\r\n delete lookup.outputReference;\r\n delete lookup.outputAssignments;\r\n switch (mode) {\r\n case 'automatic':\r\n lookup.storeOutputAutomatically = true;\r\n break;\r\n case 'variable':\r\n lookup.outputReference = '';\r\n break;\r\n case 'assignments':\r\n lookup.outputAssignments = [{}];\r\n break;\r\n case 'discard':\r\n break;\r\n }\r\n });\r\n }\r\n\r\n setOutputReference(reference: string | undefined): void {\r\n this.setField('outputReference', reference);\r\n }\r\n\r\n addOutputAssignment(): void {\r\n this.patch((node) => {\r\n const lookup = node as FlowRecordLookup;\r\n lookup.outputAssignments ??= [];\r\n lookup.outputAssignments.push({});\r\n });\r\n }\r\n\r\n removeOutputAssignment(index: number): void {\r\n this.patch((node) => {\r\n const lookup = node as FlowRecordLookup;\r\n lookup.outputAssignments?.splice(index, 1);\r\n if (lookup.outputAssignments?.length === 0) {\r\n delete lookup.outputAssignments;\r\n }\r\n });\r\n }\r\n\r\n setOutputAssignmentField(index: number, field: string): void {\r\n this.patch((node) => {\r\n const assignment = (node as FlowRecordLookup).outputAssignments?.[index];\r\n if (assignment) {\r\n assignment.field = field || undefined;\r\n }\r\n });\r\n }\r\n\r\n setOutputAssignmentTarget(index: number, reference: string | undefined): void {\r\n this.patch((node) => {\r\n const assignment = (node as FlowRecordLookup).outputAssignments?.[index];\r\n if (assignment) {\r\n assignment.assignToReference = reference;\r\n }\r\n });\r\n }\r\n\r\n onFiltersChanged(mutate: (holder: FilterHolder) => void): void {\r\n this.patch((node) => mutate(node as FilterHolder));\r\n }\r\n\r\n /** `relatedRecords` e' modellato ma non tradotto in query: se c'e', si avvisa (§5.6). */\r\n readonly hasRelatedRecords = computed(() => (this.lookup().relatedRecords?.length ?? 0) > 0);\r\n}\r\n","<div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Oggetto</label>\r\n @if (hasObjectCatalog()) {\r\n <select class=\"fb-select\" [fbValue]=\"lookup().object || ''\" (change)=\"setObject($any($event.target).value)\">\r\n <option value=\"\">— scegli un oggetto —</option>\r\n @for (object of objectOptions(); track object.name) {\r\n <option [value]=\"object.name\">{{ object.label || object.name }}</option>\r\n }\r\n </select>\r\n } @else {\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"lookup().object || ''\"\r\n placeholder=\"Nome dell’entita’\"\r\n (input)=\"setObject($any($event.target).value)\"\r\n />\r\n }\r\n</div>\r\n\r\n<fb-record-filter-editor\r\n [holder]=\"lookup()\"\r\n [object]=\"lookup().object\"\r\n title=\"Quali record leggere\"\r\n usage=\"filterable\"\r\n [supportsLogic]=\"true\"\r\n [supportsFormula]=\"true\"\r\n emptyWarning=\"Senza filtri legge tutti i record dell’oggetto.\"\r\n (changed)=\"onFiltersChanged($event)\"\r\n/>\r\n\r\n<fieldset class=\"fb-section\">\r\n <legend class=\"fb-section__title\">Quanti e in che ordine</legend>\r\n\r\n <label class=\"fb-check\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"lookup().getFirstRecordOnly === true\"\r\n (change)=\"setFirstOnly($any($event.target).checked)\"\r\n />\r\n Solo il primo record\r\n </label>\r\n <p class=\"fb-field__hint\">\r\n @if (returnsCollection()) {\r\n Il risultato e’ una <strong>collection</strong>: puo’ essere iterata da un Loop.\r\n } @else {\r\n Il risultato e’ un <strong>record singolo</strong>: non e’ iterabile da un Loop.\r\n }\r\n </p>\r\n\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Ordina per</label>\r\n <select class=\"fb-select\" [fbValue]=\"lookup().sortField || ''\" (change)=\"setSortField($any($event.target).value)\">\r\n <option value=\"\">— nessun ordinamento —</option>\r\n @for (field of sortableOptions(); track field.name) {\r\n <option [value]=\"field.name\">{{ field.label || field.name }}</option>\r\n }\r\n </select>\r\n </div>\r\n\r\n @if (lookup().sortField) {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Direzione</label>\r\n <select class=\"fb-select\" [fbValue]=\"lookup().sortOrder || ''\" (change)=\"setSortOrder($any($event.target).value)\">\r\n @for (order of sortOrders(); track order.value) {\r\n <option [value]=\"order.value\">{{ order.label }}</option>\r\n }\r\n </select>\r\n </div>\r\n }\r\n\r\n @if (returnsCollection()) {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Numero massimo di record</label>\r\n <input\r\n class=\"fb-input\"\r\n type=\"number\"\r\n min=\"1\"\r\n [value]=\"lookup().limit ?? ''\"\r\n (input)=\"setLimit($any($event.target).value)\"\r\n />\r\n </div>\r\n }\r\n</fieldset>\r\n\r\n@if (fieldOptions().length) {\r\n <fieldset class=\"fb-section\">\r\n <legend class=\"fb-section__title\">Campi da leggere</legend>\r\n <p class=\"fb-section__note\">Nessuna selezione = tutti i campi disponibili.</p>\r\n <div class=\"fb-fields-grid\">\r\n @for (field of fieldOptions(); track field.name) {\r\n <label class=\"fb-check\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"isQueried(field.name)\"\r\n (change)=\"toggleQueriedField(field.name, $any($event.target).checked)\"\r\n />\r\n {{ field.label || field.name }}\r\n </label>\r\n }\r\n </div>\r\n </fieldset>\r\n}\r\n\r\n<fieldset class=\"fb-section\">\r\n <legend class=\"fb-section__title\">Dove finisce il risultato</legend>\r\n\r\n @if (hasOutputConflict()) {\r\n <p class=\"fb-callout fb-callout--error\">\r\n Sono dichiarati insieme l’output automatico e una destinazione esplicita: e’ un conflitto\r\n (OUTPUT_CONFIGURATION_CONFLICT). Scegli una sola modalita’ qui sotto.\r\n </p>\r\n }\r\n\r\n <div class=\"fb-field\">\r\n <label class=\"fb-check\">\r\n <input\r\n type=\"radio\"\r\n name=\"output-mode\"\r\n [checked]=\"outputMode() === 'automatic'\"\r\n (change)=\"setOutputMode('automatic')\"\r\n />\r\n Output automatico <em>(consigliato)</em>\r\n </label>\r\n @if (outputMode() === 'automatic') {\r\n <p class=\"fb-field__hint\">\r\n Il risultato si referenzia con il nome dell’elemento: <code>{{ name() }}</code>,\r\n <code>{{ name() }}.Campo</code>. Non serve dichiarare nessuna variabile.\r\n </p>\r\n }\r\n\r\n <label class=\"fb-check\">\r\n <input\r\n type=\"radio\"\r\n name=\"output-mode\"\r\n [checked]=\"outputMode() === 'variable'\"\r\n (change)=\"setOutputMode('variable')\"\r\n />\r\n In una variabile\r\n </label>\r\n <label class=\"fb-check\">\r\n <input\r\n type=\"radio\"\r\n name=\"output-mode\"\r\n [checked]=\"outputMode() === 'assignments'\"\r\n (change)=\"setOutputMode('assignments')\"\r\n />\r\n Campo per campo\r\n </label>\r\n <label class=\"fb-check\">\r\n <input\r\n type=\"radio\"\r\n name=\"output-mode\"\r\n [checked]=\"outputMode() === 'discard'\"\r\n (change)=\"setOutputMode('discard')\"\r\n />\r\n Scarta il risultato\r\n </label>\r\n </div>\r\n\r\n @if (outputMode() === 'variable') {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Variabile di destinazione</label>\r\n <fb-reference-picker\r\n [value]=\"lookup().outputReference\"\r\n [writableOnly]=\"true\"\r\n [isCollection]=\"returnsCollection()\"\r\n [objectType]=\"lookup().object\"\r\n placeholder=\"Scegli una variabile\"\r\n (valueChange)=\"setOutputReference($event)\"\r\n />\r\n </div>\r\n }\r\n\r\n @if (outputMode() === 'assignments') {\r\n <div class=\"fb-list\">\r\n @for (assignment of outputAssignments(); track $index) {\r\n <div class=\"fb-list__item\">\r\n <div class=\"fb-list__header\">\r\n <span class=\"fb-list__index\">{{ $index + 1 }}</span>\r\n <span class=\"fb-list__spacer\"></span>\r\n <button\r\n type=\"button\"\r\n class=\"fb-btn fb-btn--ghost fb-btn--icon\"\r\n aria-label=\"Rimuovi\"\r\n (click)=\"removeOutputAssignment($index)\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Campo del record</label>\r\n <select\r\n class=\"fb-select\"\r\n [fbValue]=\"assignment.field || ''\"\r\n (change)=\"setOutputAssignmentField($index, $any($event.target).value)\"\r\n >\r\n <option value=\"\">— scegli —</option>\r\n @for (field of fieldOptions(); track field.name) {\r\n <option [value]=\"field.name\">{{ field.label || field.name }}</option>\r\n }\r\n </select>\r\n </div>\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Assegna a</label>\r\n <fb-reference-picker\r\n [value]=\"assignment.assignToReference\"\r\n [writableOnly]=\"true\"\r\n placeholder=\"Scegli una variabile\"\r\n (valueChange)=\"setOutputAssignmentTarget($index, $event)\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n <button type=\"button\" class=\"fb-btn\" (click)=\"addOutputAssignment()\">Aggiungi campo</button>\r\n }\r\n\r\n @if (outputMode() === 'discard') {\r\n <p class=\"fb-callout fb-callout--warn\">\r\n L’elemento interroga il database e butta via il risultato (LOOKUP_RESULT_DISCARDED).\r\n </p>\r\n }\r\n</fieldset>\r\n\r\n@if (hasRelatedRecords()) {\r\n <p class=\"fb-callout fb-callout--warn\">\r\n Questo elemento dichiara <code>relatedRecords</code>: il campo e’ modellato ma non viene tradotto in\r\n query, quindi non ha effetto.\r\n </p>\r\n}\r\n\r\n<fb-connector-editor\r\n [nodeName]=\"name()\"\r\n [node]=\"node()\"\r\n [outlets]=\"outlets()\"\r\n (connectorChanged)=\"onConnectorChanged($event)\"\r\n/>\r\n","/**\n * Roll Back Records — FRONTEND.md §5.11, ultimo capoverso.\n *\n * Non ha campi oltre a `connector`: annulla le modifiche pendenti. Ha senso solo in uno\n * screen flow, dove esiste una transazione aperta fra due schermate — e il form lo dice,\n * perche' altrove non annulla nulla senza segnalare niente.\n */\n\nimport { ChangeDetectionStrategy, Component, computed } from '@angular/core';\n\nimport { NodeInspectorBase } from './node-inspector-base';\nimport { FlowElementType } from '../../model/flow.model';\nimport { ConnectorEditorComponent } from '../shared/connector-editor.component';\n\n@Component({\n selector: 'fb-record-rollback-inspector',\n standalone: true,\n imports: [ConnectorEditorComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './record-rollback-inspector.component.html',\n})\nexport class RecordRollbackInspectorComponent extends NodeInspectorBase {\n readonly elementType: FlowElementType = 'RecordRollback';\n\n /** Fuori da uno screen flow non c'e' una transazione aperta da annullare. */\n readonly isScreenFlow = computed(() => this.store.document().processType === 'Screen');\n}\n","<p class=\"fb-callout\">\n Annulla le modifiche ai record ancora pendenti. Non ha altri campi da configurare.\n</p>\n\n@if (!isScreenFlow()) {\n <p class=\"fb-callout fb-callout--warn\">\n Questo elemento ha senso in uno screen flow, dove esiste una transazione aperta fra due schermate. In un\n flow «{{ store.document().processType }}» non c’e’ nulla da annullare.\n </p>\n}\n\n<fb-connector-editor\n [nodeName]=\"name()\"\n [node]=\"node()\"\n [outlets]=\"outlets()\"\n (connectorChanged)=\"onConnectorChanged($event)\"\n/>\n","/**\r\n * Create / Update / Delete Records — FRONTEND.md §5.7 e trappola §13.10.\r\n *\r\n * Un solo componente per i tre, perche' condividono la stessa scelta di fondo — un record\r\n * già in memoria (`inputReference`) **oppure** oggetto piu' campi — e differiscono su tre\r\n * punti precisi, che qui sono espliciti invece di essere dedotti:\r\n *\r\n * - **Create**: serve `inputReference` oppure `object` + `inputAssignments`. Con\r\n * `doesUpsert` serve `upsertExternalIdField` **o** `upsertStandardIdField`, mai entrambi.\r\n * - **Update**: serve `inputReference` oppure `object` + `filters` + `inputAssignments`.\r\n * Un update per filtro **senza filtri** aggiornerebbe tutti i record dell'entita': e' un\r\n * avviso, e l'editor chiede una conferma esplicita.\r\n * - **Delete**: serve `inputReference` oppure `object` + `filters`. Senza filtri e' un\r\n * **errore**: cancellare un'intera tabella non e' un'operazione che si fa per distrazione.\r\n *\r\n * Inoltre Update e Delete **non hanno `filterLogic`**: i filtri sono sempre in AND, e\r\n * mostrare il controllo lo farebbe perdere silenziosamente al primo salvataggio (§4.4).\r\n */\r\n\r\nimport { ChangeDetectionStrategy, Component, computed, inject, input, signal } from '@angular/core';\r\n\r\nimport { NodeInspectorBase } from './node-inspector-base';\r\nimport { FlowCatalogStore } from '../../core/flow-dictionary.store';\r\nimport { FlowObjectSummary } from '../../model/dictionary.model';\r\nimport { FlowElementType } from '../../model/flow.model';\r\nimport { ConnectorEditorComponent } from '../shared/connector-editor.component';\r\nimport {\r\n FieldAssignmentEditorComponent,\r\n FieldAssignmentHolder,\r\n} from '../shared/field-assignment-editor.component';\r\nimport { FilterHolder, RecordFilterEditorComponent } from '../shared/record-filter-editor.component';\r\nimport { ReferencePickerComponent } from '../shared/reference-picker.component';\r\nimport { SelectValueDirective } from '../shared/select-value.directive';\r\n\r\ntype RecordWriteType = 'RecordCreate' | 'RecordUpdate' | 'RecordDelete';\r\n\r\n/** Vista unificata sui tre node: i campi assenti su un tipo restano semplicemente vuoti. */\r\ninterface RecordWriteNode {\r\n object?: string;\r\n inputReference?: string;\r\n inputAssignments?: unknown[];\r\n filters?: unknown[];\r\n doesUpsert?: boolean;\r\n upsertExternalIdField?: string;\r\n upsertStandardIdField?: string;\r\n storeOutputAutomatically?: boolean;\r\n assignRecordIdToReference?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'fb-record-write-inspector',\r\n standalone: true,\r\n imports: [ConnectorEditorComponent,\r\n FieldAssignmentEditorComponent,\r\n RecordFilterEditorComponent,\r\n ReferencePickerComponent, SelectValueDirective],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './record-write-inspector.component.html',\r\n})\r\nexport class RecordWriteInspectorComponent extends NodeInspectorBase {\r\n private readonly catalog = inject(FlowCatalogStore);\r\n\r\n /** Passato dall'host: distingue Create, Update e Delete. */\r\n readonly type = input.required<RecordWriteType>();\r\n\r\n get elementType(): FlowElementType {\r\n return this.type();\r\n }\r\n\r\n readonly record = computed<RecordWriteNode>(() => this.node() as RecordWriteNode);\r\n\r\n private readonly objects = signal<FlowObjectSummary[]>([]);\r\n\r\n constructor() {\r\n super();\r\n void this.catalog\r\n .listObjects()\r\n .then((list) => this.objects.set(list ?? []))\r\n .catch(() => this.objects.set([]));\r\n }\r\n\r\n readonly objectOptions = computed(() => this.objects());\r\n readonly hasObjectCatalog = computed(() => this.objects().length > 0);\r\n\r\n readonly isCreate = computed(() => this.type() === 'RecordCreate');\r\n readonly isUpdate = computed(() => this.type() === 'RecordUpdate');\r\n readonly isDelete = computed(() => this.type() === 'RecordDelete');\r\n\r\n /** Le due modalita' alternative del modello. */\r\n readonly mode = computed<'reference' | 'object'>(() =>\r\n this.record().inputReference ? 'reference' : 'object',\r\n );\r\n\r\n /** Update e Delete non hanno `filterLogic`: i filtri sono sempre in AND (§4.4). */\r\n readonly supportsFilterLogic = computed(() => this.isCreate());\r\n\r\n readonly needsFilters = computed(() => this.isUpdate() || this.isDelete());\r\n\r\n readonly filterCount = computed(() => this.record().filters?.length ?? 0);\r\n\r\n /** Un Delete senza filtri e' un errore; un Update senza filtri e' un avviso (§13.10). */\r\n readonly emptyFilterWarning = computed<string | null>(() => {\r\n if (this.mode() === 'reference' || !this.needsFilters()) {\r\n return null;\r\n }\r\n if (this.isDelete()) {\r\n return 'Un Delete senza filtri cancellerebbe tutti i record dell’oggetto: e’ un errore e blocca l’attivazione.';\r\n }\r\n return 'Un Update senza filtri aggiornerebbe tutti i record dell’oggetto. Se e’ quello che vuoi, confermalo qui sotto.';\r\n });\r\n\r\n readonly emptyFilterSeverity = computed<'warn' | 'error'>(() => (this.isDelete() ? 'error' : 'warn'));\r\n\r\n /** Conferma esplicita per l'update di massa: locale al form, non finisce nel documento. */\r\n readonly bulkUpdateConfirmed = signal(false);\r\n\r\n readonly showsBulkConfirm = computed(\r\n () => this.isUpdate() && this.mode() === 'object' && this.filterCount() === 0,\r\n );\r\n\r\n readonly upsertMode = computed<'none' | 'external' | 'standard'>(() => {\r\n const record = this.record();\r\n if (!record.doesUpsert) {\r\n return 'none';\r\n }\r\n return record.upsertStandardIdField ? 'standard' : 'external';\r\n });\r\n\r\n /** Entrambi i campi di upsert insieme e' `UPSERT_CONFIGURATION_INVALID`. */\r\n readonly hasUpsertConflict = computed(() => {\r\n const record = this.record();\r\n return !!record.upsertExternalIdField && !!record.upsertStandardIdField;\r\n });\r\n\r\n readonly title = computed(() => {\r\n switch (this.type()) {\r\n case 'RecordCreate':\r\n return 'record da creare';\r\n case 'RecordUpdate':\r\n return 'record da aggiornare';\r\n default:\r\n return 'record da cancellare';\r\n }\r\n });\r\n\r\n setMode(mode: 'reference' | 'object'): void {\r\n this.patch((node) => {\r\n const record = node as RecordWriteNode;\r\n if (mode === 'reference') {\r\n // Le due modalita' sono alternative: tenere entrambe rende ambiguo cosa fara'.\r\n delete record.object;\r\n delete record.inputAssignments;\r\n delete record.filters;\r\n record.inputReference = '';\r\n } else {\r\n delete record.inputReference;\r\n }\r\n });\r\n }\r\n\r\n setInputReference(reference: string | undefined): void {\r\n this.setField('inputReference', reference);\r\n }\r\n\r\n setObject(object: string): void {\r\n this.patch((node) => {\r\n const record = node as RecordWriteNode;\r\n if (record.object === object) {\r\n return;\r\n }\r\n record.object = object || undefined;\r\n delete record.inputAssignments;\r\n delete record.filters;\r\n delete record.upsertExternalIdField;\r\n delete record.upsertStandardIdField;\r\n });\r\n }\r\n\r\n setDoesUpsert(value: boolean): void {\r\n this.patch((node) => {\r\n const record = node as RecordWriteNode;\r\n if (value) {\r\n record.doesUpsert = true;\r\n } else {\r\n delete record.doesUpsert;\r\n delete record.upsertExternalIdField;\r\n delete record.upsertStandardIdField;\r\n }\r\n });\r\n }\r\n\r\n setUpsertMode(mode: 'external' | 'standard'): void {\r\n this.patch((node) => {\r\n const record = node as RecordWriteNode;\r\n record.doesUpsert = true;\r\n // Mai entrambi: scegliere l'uno cancella l'altro.\r\n if (mode === 'external') {\r\n delete record.upsertStandardIdField;\r\n record.upsertExternalIdField ??= '';\r\n } else {\r\n delete record.upsertExternalIdField;\r\n record.upsertStandardIdField ??= '';\r\n }\r\n });\r\n }\r\n\r\n setUpsertExternalField(value: string): void {\r\n this.setField('upsertExternalIdField', value);\r\n }\r\n\r\n setUpsertStandardField(value: string): void {\r\n this.setField('upsertStandardIdField', value);\r\n }\r\n\r\n setStoreOutputAutomatically(value: boolean): void {\r\n this.patch((node) => {\r\n const record = node as RecordWriteNode;\r\n if (value) {\r\n record.storeOutputAutomatically = true;\r\n delete record.assignRecordIdToReference;\r\n } else {\r\n delete record.storeOutputAutomatically;\r\n }\r\n });\r\n }\r\n\r\n setAssignRecordId(reference: string | undefined): void {\r\n this.patch((node) => {\r\n const record = node as RecordWriteNode;\r\n record.assignRecordIdToReference = reference;\r\n if (reference) {\r\n delete record.storeOutputAutomatically;\r\n }\r\n });\r\n }\r\n\r\n confirmBulkUpdate(value: boolean): void {\r\n this.bulkUpdateConfirmed.set(value);\r\n }\r\n\r\n onFiltersChanged(mutate: (holder: FilterHolder) => void): void {\r\n this.patch((node) => mutate(node as FilterHolder));\r\n }\r\n\r\n onAssignmentsChanged(mutate: (holder: FieldAssignmentHolder) => void): void {\r\n this.patch((node) => mutate(node as FieldAssignmentHolder));\r\n }\r\n}\r\n","<fieldset class=\"fb-section\">\r\n <legend class=\"fb-section__title\">Come indicare i {{ title() }}</legend>\r\n <label class=\"fb-check\">\r\n <input type=\"radio\" name=\"write-mode\" [checked]=\"mode() === 'object'\" (change)=\"setMode('object')\" />\r\n Per oggetto{{ needsFilters() ? ' e filtri' : ' e valori' }}\r\n </label>\r\n <label class=\"fb-check\">\r\n <input type=\"radio\" name=\"write-mode\" [checked]=\"mode() === 'reference'\" (change)=\"setMode('reference')\" />\r\n Un record già in memoria\r\n </label>\r\n</fieldset>\r\n\r\n@if (mode() === 'reference') {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Record</label>\r\n <fb-reference-picker\r\n [value]=\"record().inputReference\"\r\n dataType=\"Object\"\r\n placeholder=\"Variabile di tipo record\"\r\n (valueChange)=\"setInputReference($event)\"\r\n />\r\n <p class=\"fb-field__hint\">\r\n Il record porta con se’ i propri valori: non serve indicare oggetto ne’ campi.\r\n </p>\r\n </div>\r\n} @else {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Oggetto</label>\r\n @if (hasObjectCatalog()) {\r\n <select class=\"fb-select\" [fbValue]=\"record().object || ''\" (change)=\"setObject($any($event.target).value)\">\r\n <option value=\"\">— scegli un oggetto —</option>\r\n @for (object of objectOptions(); track object.name) {\r\n <option [value]=\"object.name\">{{ object.label || object.name }}</option>\r\n }\r\n </select>\r\n } @else {\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"record().object || ''\"\r\n placeholder=\"Nome dell’entita’\"\r\n (input)=\"setObject($any($event.target).value)\"\r\n />\r\n }\r\n </div>\r\n\r\n @if (needsFilters()) {\r\n <fb-record-filter-editor\r\n [holder]=\"$any(record())\"\r\n [object]=\"record().object\"\r\n [title]=\"isDelete() ? 'Quali record cancellare' : 'Quali record aggiornare'\"\r\n usage=\"filterable\"\r\n [supportsLogic]=\"supportsFilterLogic()\"\r\n [emptyWarning]=\"emptyFilterWarning()\"\r\n [emptyWarningSeverity]=\"emptyFilterSeverity()\"\r\n (changed)=\"onFiltersChanged($event)\"\r\n />\r\n\r\n @if (showsBulkConfirm()) {\r\n <label class=\"fb-check fb-confirm\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"bulkUpdateConfirmed()\"\r\n (change)=\"confirmBulkUpdate($any($event.target).checked)\"\r\n />\r\n Confermo di voler aggiornare <strong>tutti</strong> i record di «{{ record().object || 'questo oggetto' }}»\r\n </label>\r\n }\r\n }\r\n\r\n @if (!isDelete()) {\r\n <fb-field-assignment-editor\r\n [holder]=\"$any(record())\"\r\n [object]=\"record().object\"\r\n [title]=\"isCreate() ? 'Valori del nuovo record' : 'Valori da scrivere'\"\r\n (changed)=\"onAssignmentsChanged($event)\"\r\n />\r\n }\r\n}\r\n\r\n@if (isCreate()) {\r\n <fieldset class=\"fb-section\">\r\n <legend class=\"fb-section__title\">Upsert</legend>\r\n <label class=\"fb-check\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"record().doesUpsert === true\"\r\n (change)=\"setDoesUpsert($any($event.target).checked)\"\r\n />\r\n Aggiorna il record se esiste già\r\n </label>\r\n\r\n @if (record().doesUpsert) {\r\n @if (hasUpsertConflict()) {\r\n <p class=\"fb-callout fb-callout--error\">\r\n Sono indicati insieme il campo di id esterno e quello standard: va scelto uno solo\r\n (UPSERT_CONFIGURATION_INVALID).\r\n </p>\r\n }\r\n <label class=\"fb-check\">\r\n <input\r\n type=\"radio\"\r\n name=\"upsert-mode\"\r\n [checked]=\"upsertMode() === 'external'\"\r\n (change)=\"setUpsertMode('external')\"\r\n />\r\n Riconosci il record da un id esterno\r\n </label>\r\n <label class=\"fb-check\">\r\n <input\r\n type=\"radio\"\r\n name=\"upsert-mode\"\r\n [checked]=\"upsertMode() === 'standard'\"\r\n (change)=\"setUpsertMode('standard')\"\r\n />\r\n Riconosci il record dall’id standard\r\n </label>\r\n\r\n @if (upsertMode() === 'external') {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Campo id esterno</label>\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"record().upsertExternalIdField || ''\"\r\n (input)=\"setUpsertExternalField($any($event.target).value)\"\r\n />\r\n </div>\r\n } @else {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Campo id standard</label>\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"record().upsertStandardIdField || ''\"\r\n (input)=\"setUpsertStandardField($any($event.target).value)\"\r\n />\r\n </div>\r\n }\r\n }\r\n </fieldset>\r\n\r\n <fieldset class=\"fb-section\">\r\n <legend class=\"fb-section__title\">Identificativo creato</legend>\r\n <label class=\"fb-check\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"record().storeOutputAutomatically === true\"\r\n (change)=\"setStoreOutputAutomatically($any($event.target).checked)\"\r\n />\r\n Output automatico\r\n </label>\r\n @if (record().storeOutputAutomatically) {\r\n <p class=\"fb-field__hint\">\r\n L’identificativo creato si referenzia col nome dell’elemento: <code>{{ name() }}</code>.\r\n </p>\r\n } @else {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Assegna l’identificativo a</label>\r\n <fb-reference-picker\r\n [value]=\"record().assignRecordIdToReference\"\r\n [writableOnly]=\"true\"\r\n placeholder=\"Scegli una variabile\"\r\n (valueChange)=\"setAssignRecordId($event)\"\r\n />\r\n </div>\r\n }\r\n </fieldset>\r\n}\r\n\r\n<fb-connector-editor\r\n [nodeName]=\"name()\"\r\n [node]=\"node()\"\r\n [outlets]=\"outlets()\"\r\n (connectorChanged)=\"onConnectorChanged($event)\"\r\n/>\r\n","/**\r\n * Screen — FRONTEND.md §5.1.\r\n *\r\n * Lo screen **non descrive i propri campi**: dichiara *quale* form mostrare e il contratto\r\n * di dati con cui parlarci. Il form e' un componente scritto a mano nel frontend\r\n * applicativo, e il flow lo referenzia per nome esattamente come referenzia un'action.\r\n * Non c'e' un albero di componenti da disegnare, e non serve.\r\n */\r\n\r\nimport { ChangeDetectionStrategy, Component, computed, effect, inject, signal } from '@angular/core';\r\n\r\nimport { NodeInspectorBase } from './node-inspector-base';\r\nimport { FlowCatalogStore } from '../../core/flow-dictionary.store';\r\nimport { FlowCatalogEntry, FlowCatalogParameter } from '../../model/dictionary.model';\r\nimport { FlowElementType, FlowScreen } from '../../model/flow.model';\r\nimport { ConnectorEditorComponent } from '../shared/connector-editor.component';\r\nimport { ParameterEditorComponent, ParameterHolder } from '../shared/parameter-editor.component';\r\nimport { SelectValueDirective } from '../shared/select-value.directive';\r\n\r\n@Component({\r\n selector: 'fb-screen-inspector',\r\n standalone: true,\r\n imports: [ConnectorEditorComponent, ParameterEditorComponent, SelectValueDirective],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './screen-inspector.component.html',\r\n})\r\nexport class ScreenInspectorComponent extends NodeInspectorBase {\r\n private readonly catalog = inject(FlowCatalogStore);\r\n\r\n readonly elementType: FlowElementType = 'Screen';\r\n\r\n readonly screen = computed<FlowScreen>(() => this.node() as FlowScreen);\r\n\r\n private readonly forms = signal<FlowCatalogEntry[]>([]);\r\n private readonly formParameters = signal<FlowCatalogParameter[]>([]);\r\n\r\n constructor() {\r\n super();\r\n void this.catalog\r\n .listForms()\r\n .then((list) => this.forms.set(list ?? []))\r\n .catch(() => this.forms.set([]));\r\n\r\n effect(() => {\r\n const formName = this.screen().formName;\r\n if (!formName) {\r\n this.formParameters.set([]);\r\n return;\r\n }\r\n void this.catalog\r\n .listFormParameters(formName)\r\n .then((list) => this.formParameters.set(list ?? []))\r\n .catch(() => this.formParameters.set([]));\r\n });\r\n }\r\n\r\n readonly formOptions = computed(() => this.forms());\r\n /** Catalogo vuoto = \"non lo so\": nessun controllo, nessun falso allarme (§7). */\r\n readonly hasFormCatalog = computed(() => this.forms().length > 0);\r\n readonly parameters = computed(() => this.formParameters());\r\n\r\n /** Con il catalogo popolato, un form non presente e' un errore (`FORM_UNKNOWN`). */\r\n readonly isUnknownForm = computed(() => {\r\n const formName = this.screen().formName;\r\n if (!formName || !this.hasFormCatalog()) {\r\n return false;\r\n }\r\n return !this.forms().some((form) => form.name === formName);\r\n });\r\n\r\n /**\r\n * `allowBack`, `allowFinish`, `allowPause` hanno default `true`: un valore assente\r\n * significa concesso, non negato.\r\n */\r\n allowBack = computed(() => this.screen().allowBack !== false);\r\n allowFinish = computed(() => this.screen().allowFinish !== false);\r\n allowPause = computed(() => this.screen().allowPause !== false);\r\n\r\n /**\r\n * Uno screen senza `connector` e con `allowFinish: false` e' un vicolo cieco:\r\n * `SCREEN_DEAD_END`. Vale la pena dirlo prima che lo dica la validazione.\r\n */\r\n readonly isDeadEnd = computed(() => {\r\n const screen = this.screen();\r\n return !screen.connector?.targetReference && screen.allowFinish === false;\r\n });\r\n\r\n setFormName(value: string): void {\r\n this.setField('formName', value);\r\n }\r\n\r\n setHelpText(value: string): void {\r\n this.setField('helpText', value);\r\n }\r\n\r\n setPausedText(value: string): void {\r\n this.setField('pausedText', value);\r\n }\r\n\r\n setFlag(flag: 'allowBack' | 'allowFinish' | 'allowPause', value: boolean): void {\r\n this.patch((node) => {\r\n // Il default e' `true`: si scrive solo quando si nega, per non sporcare il diff.\r\n if (value) {\r\n delete node[flag];\r\n } else {\r\n node[flag] = false;\r\n }\r\n });\r\n }\r\n\r\n onParametersChanged(mutate: (holder: ParameterHolder) => void): void {\r\n this.patch((node) => mutate(node as ParameterHolder));\r\n }\r\n}\r\n","<p class=\"fb-callout\">\r\n Lo screen dichiara <strong>quale form</strong> mostrare, non i suoi campi: il form e’ un componente del\r\n frontend applicativo, e qui si definisce solo il contratto di dati.\r\n</p>\r\n\r\n<div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Form</label>\r\n @if (hasFormCatalog()) {\r\n <select\r\n class=\"fb-select\"\r\n [class.fb-select--invalid]=\"isUnknownForm()\"\r\n [fbValue]=\"screen().formName || ''\"\r\n (change)=\"setFormName($any($event.target).value)\"\r\n >\r\n <option value=\"\">— scegli un form —</option>\r\n @for (form of formOptions(); track form.name) {\r\n <option [value]=\"form.name\">{{ form.label || form.name }}</option>\r\n }\r\n @if (isUnknownForm()) {\r\n <option [value]=\"screen().formName\">{{ screen().formName }} (non nel catalogo)</option>\r\n }\r\n </select>\r\n } @else {\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"screen().formName || ''\"\r\n placeholder=\"Nome del form\"\r\n (input)=\"setFormName($any($event.target).value)\"\r\n />\r\n <p class=\"fb-field__hint\">\r\n Il catalogo dei form non e’ popolato: il nome non viene verificato.\r\n </p>\r\n }\r\n @if (isUnknownForm()) {\r\n <p class=\"fb-field__error\">Questo form non esiste nel catalogo: la validazione lo segnala come errore.</p>\r\n }\r\n</div>\r\n\r\n<div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Testo di aiuto</label>\r\n <textarea\r\n class=\"fb-textarea\"\r\n [value]=\"screen().helpText || ''\"\r\n (input)=\"setHelpText($any($event.target).value)\"\r\n ></textarea>\r\n</div>\r\n\r\n<fieldset class=\"fb-section\">\r\n <legend class=\"fb-section__title\">Navigazione</legend>\r\n <p class=\"fb-section__note\">\r\n Questi flag sono un’intenzione, non la verita’ finale: a runtime il motore comunica\r\n <code>canGoBack</code>, <code>canFinish</code> e <code>canPause</code> nella richiesta del form —\r\n per esempio «indietro» conta solo se esiste uno screen precedente nel percorso.\r\n </p>\r\n <label class=\"fb-check\">\r\n <input type=\"checkbox\" [checked]=\"allowBack()\" (change)=\"setFlag('allowBack', $any($event.target).checked)\" />\r\n Consenti «indietro»\r\n </label>\r\n <label class=\"fb-check\">\r\n <input type=\"checkbox\" [checked]=\"allowFinish()\" (change)=\"setFlag('allowFinish', $any($event.target).checked)\" />\r\n Consenti «fine»\r\n </label>\r\n <label class=\"fb-check\">\r\n <input type=\"checkbox\" [checked]=\"allowPause()\" (change)=\"setFlag('allowPause', $any($event.target).checked)\" />\r\n Consenti «pausa»\r\n </label>\r\n\r\n @if (allowPause()) {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Testo mostrato alla pausa</label>\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"screen().pausedText || ''\"\r\n (input)=\"setPausedText($any($event.target).value)\"\r\n />\r\n </div>\r\n }\r\n\r\n @if (isDeadEnd()) {\r\n <p class=\"fb-callout fb-callout--error\">\r\n Questo screen non ha una destinazione e non consente «fine»: e’ un vicolo cieco, e l’utente resterebbe\r\n bloccato.\r\n </p>\r\n }\r\n</fieldset>\r\n\r\n<fb-parameter-editor\r\n [holder]=\"screen()\"\r\n [catalogParameters]=\"parameters()\"\r\n inputTitle=\"Valori passati al form\"\r\n outputTitle=\"Valori raccolti dal form\"\r\n (changed)=\"onParametersChanged($event)\"\r\n/>\r\n\r\n<fb-connector-editor\r\n [nodeName]=\"name()\"\r\n [node]=\"node()\"\r\n [outlets]=\"outlets()\"\r\n (connectorChanged)=\"onConnectorChanged($event)\"\r\n/>\r\n","/**\r\n * Script — FRONTEND.md §5.8, ultimo capoverso.\r\n *\r\n * Piu' semplice dell'Action: `scriptName`, parametri, `connector`, `faultConnector`.\r\n * Nessun timeout, nessun modello transazionale.\r\n */\r\n\r\nimport { ChangeDetectionStrategy, Component, computed, effect, inject, signal } from '@angular/core';\r\n\r\nimport { NodeInspectorBase } from './node-inspector-base';\r\nimport { FlowCatalogStore } from '../../core/flow-dictionary.store';\r\nimport { FlowCatalogEntry, FlowCatalogParameter } from '../../model/dictionary.model';\r\nimport { FlowElementType, FlowScriptPluginCall } from '../../model/flow.model';\r\nimport { ConnectorEditorComponent } from '../shared/connector-editor.component';\r\nimport { ParameterEditorComponent, ParameterHolder } from '../shared/parameter-editor.component';\r\nimport { SelectValueDirective } from '../shared/select-value.directive';\r\n\r\n@Component({\r\n selector: 'fb-script-call-inspector',\r\n standalone: true,\r\n imports: [ConnectorEditorComponent, ParameterEditorComponent, SelectValueDirective],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './script-call-inspector.component.html',\r\n})\r\nexport class ScriptCallInspectorComponent extends NodeInspectorBase {\r\n private readonly catalog = inject(FlowCatalogStore);\r\n\r\n readonly elementType: FlowElementType = 'ScriptCall';\r\n\r\n readonly script = computed<FlowScriptPluginCall>(() => this.node() as FlowScriptPluginCall);\r\n\r\n private readonly scripts = signal<FlowCatalogEntry[]>([]);\r\n private readonly parameters = signal<FlowCatalogParameter[]>([]);\r\n\r\n constructor() {\r\n super();\r\n void this.catalog\r\n .listScripts()\r\n .then((list) => this.scripts.set(list ?? []))\r\n .catch(() => this.scripts.set([]));\r\n\r\n effect(() => {\r\n const scriptName = this.script().scriptName;\r\n if (!scriptName) {\r\n this.parameters.set([]);\r\n return;\r\n }\r\n void this.catalog\r\n .listScriptParameters(scriptName)\r\n .then((list) => this.parameters.set(list ?? []))\r\n .catch(() => this.parameters.set([]));\r\n });\r\n }\r\n\r\n readonly scriptOptions = computed(() => this.scripts());\r\n readonly hasCatalog = computed(() => this.scripts().length > 0);\r\n readonly parameterCatalog = computed(() => this.parameters());\r\n\r\n readonly isUnknownScript = computed(() => {\r\n const name = this.script().scriptName;\r\n if (!name || !this.hasCatalog()) {\r\n return false;\r\n }\r\n return !this.scripts().some((entry) => entry.name === name);\r\n });\r\n\r\n readonly storeOutputAutomatically = computed(() => this.script().storeOutputAutomatically === true);\r\n\r\n setScriptName(value: string): void {\r\n this.patch((node) => {\r\n const script = node as FlowScriptPluginCall;\r\n if (script.scriptName === value) {\r\n return;\r\n }\r\n script.scriptName = value || undefined;\r\n delete script.inputParameters;\r\n delete script.outputParameters;\r\n });\r\n }\r\n\r\n setStoreOutputAutomatically(value: boolean): void {\r\n this.patch((node) => {\r\n const script = node as FlowScriptPluginCall;\r\n if (value) {\r\n script.storeOutputAutomatically = true;\r\n delete script.outputParameters;\r\n } else {\r\n delete script.storeOutputAutomatically;\r\n }\r\n });\r\n }\r\n\r\n onParametersChanged(mutate: (holder: ParameterHolder) => void): void {\r\n this.patch((node) => mutate(node as ParameterHolder));\r\n }\r\n}\r\n","<div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Script</label>\r\n @if (hasCatalog()) {\r\n <select\r\n class=\"fb-select\"\r\n [class.fb-select--invalid]=\"isUnknownScript()\"\r\n [fbValue]=\"script().scriptName || ''\"\r\n (change)=\"setScriptName($any($event.target).value)\"\r\n >\r\n <option value=\"\">— scegli —</option>\r\n @for (entry of scriptOptions(); track entry.name) {\r\n <option [value]=\"entry.name\">{{ entry.label || entry.name }}</option>\r\n }\r\n @if (isUnknownScript()) {\r\n <option [value]=\"script().scriptName\">{{ script().scriptName }} (non nel catalogo)</option>\r\n }\r\n </select>\r\n } @else {\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"script().scriptName || ''\"\r\n (input)=\"setScriptName($any($event.target).value)\"\r\n />\r\n }\r\n @if (isUnknownScript()) {\r\n <p class=\"fb-field__error\">Questo script non esiste nel catalogo.</p>\r\n }\r\n</div>\r\n\r\n<label class=\"fb-check\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"storeOutputAutomatically()\"\r\n (change)=\"setStoreOutputAutomatically($any($event.target).checked)\"\r\n />\r\n Output automatico\r\n</label>\r\n\r\n<fb-parameter-editor\r\n [holder]=\"script()\"\r\n [catalogParameters]=\"parameterCatalog()\"\r\n [showOutputs]=\"!storeOutputAutomatically()\"\r\n (changed)=\"onParametersChanged($event)\"\r\n/>\r\n\r\n<fb-connector-editor\r\n [nodeName]=\"name()\"\r\n [node]=\"node()\"\r\n [outlets]=\"outlets()\"\r\n (connectorChanged)=\"onConnectorChanged($event)\"\r\n/>\r\n","/**\r\n * L'elemento Start — FRONTEND.md §3.4.\r\n *\r\n * Dice **quando** il flow parte e **da dove** comincia. I campi obbligatori dipendono dal\r\n * trigger, e il form li mostra di conseguenza:\r\n * - `object` e' obbligatorio con i trigger su record (`START_OBJECT_MISSING`);\r\n * - `schedule` e' obbligatorio con `Scheduled` (`START_SCHEDULE_MISSING`);\r\n * - `connector.targetReference` serve **sempre**: senza, `START_NO_ENTRY_POINT`.\r\n *\r\n * Con un trigger su record il flow espone `$Record` e `$Record__Prior`; senza, quei\r\n * riferimenti non sono disponibili e la validazione lo segnala. Il form lo dice, perche' e'\r\n * la differenza fra un riferimento che funziona e uno che no.\r\n */\r\n\r\nimport { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\r\n\r\nimport { FlowCatalogStore, FlowDictionaryStore } from '../../core/flow-dictionary.store';\r\nimport { FlowDocumentStore } from '../../core/flow-document.store';\r\nimport { FlowValidationStore } from '../../core/flow-validation.store';\r\nimport { FlowObjectSummary } from '../../model/dictionary.model';\r\nimport { FlowAnyNode, FlowScheduledPath, FlowStart } from '../../model/flow.model';\r\nimport { outletsOf } from '../../core/element-outlets';\r\nimport { uniqueFlowName } from '../../core/flow-name.util';\r\nimport { ConnectorEditorComponent } from '../shared/connector-editor.component';\r\nimport { FilterHolder, RecordFilterEditorComponent } from '../shared/record-filter-editor.component';\r\nimport { SelectValueDirective } from '../shared/select-value.directive';\r\n\r\n/** I trigger che lavorano su un record e abilitano `$Record`. */\r\nconst RECORD_TRIGGERS = new Set(['RecordBeforeSave', 'RecordAfterSave', 'RecordBeforeDelete']);\r\n\r\n@Component({\r\n selector: 'fb-start-inspector',\r\n standalone: true,\r\n imports: [ConnectorEditorComponent, RecordFilterEditorComponent, SelectValueDirective],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './start-inspector.component.html',\r\n})\r\nexport class StartInspectorComponent {\r\n private readonly store = inject(FlowDocumentStore);\r\n private readonly dictionaries = inject(FlowDictionaryStore);\r\n private readonly catalog = inject(FlowCatalogStore);\r\n private readonly validation = inject(FlowValidationStore);\r\n\r\n readonly start = computed<FlowStart>(() => this.store.start());\r\n readonly startNode = computed<FlowAnyNode>(() => this.start() as FlowAnyNode);\r\n readonly outlets = computed(() => outletsOf('Start', this.startNode()));\r\n\r\n readonly triggerTypes = computed(() => this.dictionaries.triggerTypes());\r\n readonly recordTriggerTypes = computed(() => this.dictionaries.recordTriggerTypes());\r\n readonly frequencies = computed(() => this.dictionaries.startFrequencies());\r\n readonly offsetUnits = computed(() => this.dictionaries.offsetUnits());\r\n\r\n private readonly objects = signal<FlowObjectSummary[]>([]);\r\n\r\n constructor() {\r\n void this.catalog\r\n .listObjects()\r\n .then((list) => this.objects.set(list ?? []))\r\n .catch(() => this.objects.set([]));\r\n }\r\n\r\n readonly objectOptions = computed(() => this.objects());\r\n readonly hasObjectCatalog = computed(() => this.objects().length > 0);\r\n\r\n readonly triggerType = computed(() => this.start().triggerType ?? 'None');\r\n readonly isRecordTrigger = computed(() => RECORD_TRIGGERS.has(this.triggerType()));\r\n readonly isScheduled = computed(() => this.triggerType() === 'Scheduled');\r\n readonly isEvent = computed(() => this.triggerType() === 'Event');\r\n\r\n readonly hasEntryPoint = computed(() => !!this.start().connector?.targetReference);\r\n\r\n readonly scheduledPaths = computed<FlowScheduledPath[]>(() => this.start().scheduledPaths ?? []);\r\n\r\n /** I rilievi sul documento, che e' dove finiscono quelli dello Start (§7). */\r\n readonly issues = computed(() => this.validation.documentIssues());\r\n\r\n setTriggerType(value: string): void {\r\n this.store.updateStart((start) => {\r\n start.triggerType = value === 'None' ? undefined : value;\r\n if (!RECORD_TRIGGERS.has(value)) {\r\n // Campi che appartengono ai soli trigger su record: tenerli sarebbe rumore che il\r\n // motore ignora e che sporca il diff.\r\n delete start.object;\r\n delete start.recordTriggerType;\r\n delete start.filters;\r\n delete start.filterLogic;\r\n delete start.filterFormula;\r\n delete start.doesRequireRecordChangedToMeetCriteria;\r\n }\r\n if (value !== 'Scheduled') {\r\n delete start.schedule;\r\n delete start.scheduledPaths;\r\n } else {\r\n start.schedule ??= { frequency: this.frequencies()[0]?.value ?? 'Once' };\r\n }\r\n });\r\n }\r\n\r\n setObject(value: string): void {\r\n this.store.updateStart((start) => {\r\n if (start.object === value) {\r\n return;\r\n }\r\n start.object = value || undefined;\r\n delete start.filters;\r\n });\r\n }\r\n\r\n setRecordTriggerType(value: string): void {\r\n this.store.updateStart((start) => {\r\n start.recordTriggerType = value || undefined;\r\n });\r\n }\r\n\r\n setRequireChanged(value: boolean): void {\r\n this.store.updateStart((start) => {\r\n if (value) {\r\n start.doesRequireRecordChangedToMeetCriteria = true;\r\n } else {\r\n delete start.doesRequireRecordChangedToMeetCriteria;\r\n }\r\n });\r\n }\r\n\r\n setFrequency(value: string): void {\r\n this.store.updateStart((start) => {\r\n start.schedule ??= {};\r\n start.schedule.frequency = value || undefined;\r\n });\r\n }\r\n\r\n setStartDate(value: string): void {\r\n this.store.updateStart((start) => {\r\n start.schedule ??= {};\r\n // Data senza fuso, come chiede il contratto: `2026-08-01T00:00:00`.\r\n start.schedule.startDate = value ? `${value}T00:00:00` : undefined;\r\n });\r\n }\r\n\r\n setStartTime(value: string): void {\r\n this.store.updateStart((start) => {\r\n start.schedule ??= {};\r\n start.schedule.startTime = value ? (value.length === 5 ? `${value}:00` : value) : undefined;\r\n });\r\n }\r\n\r\n /** La data arriva come `2026-08-01T00:00:00`; l'input `date` vuole solo la parte data. */\r\n readonly startDateValue = computed(() => (this.start().schedule?.startDate ?? '').slice(0, 10));\r\n readonly startTimeValue = computed(() => (this.start().schedule?.startTime ?? '').slice(0, 5));\r\n\r\n addScheduledPath(): void {\r\n this.store.updateStart((start) => {\r\n start.scheduledPaths ??= [];\r\n const existing = start.scheduledPaths.map((path) => path.name ?? '');\r\n start.scheduledPaths.push({\r\n name: uniqueFlowName('Percorso', existing),\r\n label: `Percorso differito ${start.scheduledPaths.length + 1}`,\r\n offsetNumber: 1,\r\n offsetUnit: 'Days',\r\n });\r\n });\r\n }\r\n\r\n removeScheduledPath(index: number): void {\r\n this.store.updateStart((start) => {\r\n start.scheduledPaths?.splice(index, 1);\r\n if (start.scheduledPaths?.length === 0) {\r\n delete start.scheduledPaths;\r\n }\r\n });\r\n }\r\n\r\n setPathField(index: number, field: keyof FlowScheduledPath, value: unknown): void {\r\n this.store.updateStart((start) => {\r\n const path = start.scheduledPaths?.[index] as Record<string, unknown> | undefined;\r\n if (!path) {\r\n return;\r\n }\r\n if (value === undefined || value === null || value === '') {\r\n delete path[field as string];\r\n } else {\r\n path[field as string] = value;\r\n }\r\n });\r\n }\r\n\r\n setPathOffsetNumber(index: number, value: string): void {\r\n const parsed = Number.parseInt(value, 10);\r\n this.setPathField(index, 'offsetNumber', Number.isNaN(parsed) ? undefined : parsed);\r\n }\r\n\r\n onFiltersChanged(mutate: (holder: FilterHolder) => void): void {\r\n this.store.updateStart((start) => mutate(start as FilterHolder));\r\n }\r\n\r\n onConnectorChanged(event: { outletKey: string; target?: string; isGoTo?: boolean }): void {\r\n this.store.setConnector('$start', event.outletKey, event.target, event.isGoTo);\r\n }\r\n}\r\n","@if (!hasEntryPoint()) {\r\n <p class=\"fb-callout fb-callout--error\">\r\n Lo Start non punta a nessun elemento: il flow non ha un punto di ingresso e non e’ eseguibile\r\n (START_NO_ENTRY_POINT).\r\n </p>\r\n}\r\n\r\n<div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Quando parte</label>\r\n <select class=\"fb-select\" [fbValue]=\"triggerType()\" (change)=\"setTriggerType($any($event.target).value)\">\r\n @for (trigger of triggerTypes(); track trigger.value) {\r\n <option [value]=\"trigger.value\">{{ trigger.label }}</option>\r\n }\r\n </select>\r\n</div>\r\n\r\n@if (isRecordTrigger()) {\r\n <p class=\"fb-callout\">\r\n Con un trigger su record il flow espone <code>$Record</code> e <code>$Record__Prior</code>.\r\n </p>\r\n\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Oggetto che innesca</label>\r\n @if (hasObjectCatalog()) {\r\n <select class=\"fb-select\" [fbValue]=\"start().object || ''\" (change)=\"setObject($any($event.target).value)\">\r\n <option value=\"\">— scegli un oggetto —</option>\r\n @for (object of objectOptions(); track object.name) {\r\n <option [value]=\"object.name\">{{ object.label || object.name }}</option>\r\n }\r\n </select>\r\n } @else {\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"start().object || ''\"\r\n (input)=\"setObject($any($event.target).value)\"\r\n />\r\n }\r\n @if (!start().object) {\r\n <p class=\"fb-field__error\">Obbligatorio con i trigger su record (START_OBJECT_MISSING).</p>\r\n }\r\n </div>\r\n\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Su quale operazione</label>\r\n <select\r\n class=\"fb-select\"\r\n [fbValue]=\"start().recordTriggerType || ''\"\r\n (change)=\"setRecordTriggerType($any($event.target).value)\"\r\n >\r\n <option value=\"\">— scegli —</option>\r\n @for (type of recordTriggerTypes(); track type.value) {\r\n <option [value]=\"type.value\">{{ type.label }}</option>\r\n }\r\n </select>\r\n </div>\r\n\r\n <fb-record-filter-editor\r\n [holder]=\"$any(start())\"\r\n [object]=\"start().object\"\r\n title=\"Criteri di ingresso\"\r\n usage=\"filterable\"\r\n [supportsLogic]=\"true\"\r\n [supportsFormula]=\"true\"\r\n emptyWarning=\"Senza criteri il flow parte su ogni record.\"\r\n (changed)=\"onFiltersChanged($event)\"\r\n />\r\n\r\n <label class=\"fb-check\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"start().doesRequireRecordChangedToMeetCriteria === true\"\r\n (change)=\"setRequireChanged($any($event.target).checked)\"\r\n />\r\n Solo se il record <em>non</em> soddisfaceva i criteri prima del salvataggio\r\n </label>\r\n}\r\n\r\n@if (isScheduled()) {\r\n <fieldset class=\"fb-section\">\r\n <legend class=\"fb-section__title\">Pianificazione</legend>\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Frequenza</label>\r\n <select\r\n class=\"fb-select\"\r\n [fbValue]=\"start().schedule?.frequency || ''\"\r\n (change)=\"setFrequency($any($event.target).value)\"\r\n >\r\n <option value=\"\">— scegli —</option>\r\n @for (frequency of frequencies(); track frequency.value) {\r\n <option [value]=\"frequency.value\">{{ frequency.label }}</option>\r\n }\r\n </select>\r\n </div>\r\n <div class=\"fb-field__row\">\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Data di inizio</label>\r\n <input\r\n class=\"fb-input\"\r\n type=\"date\"\r\n [value]=\"startDateValue()\"\r\n (input)=\"setStartDate($any($event.target).value)\"\r\n />\r\n </div>\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Ora</label>\r\n <input\r\n class=\"fb-input\"\r\n type=\"time\"\r\n [value]=\"startTimeValue()\"\r\n (input)=\"setStartTime($any($event.target).value)\"\r\n />\r\n </div>\r\n </div>\r\n @if (!start().schedule?.frequency) {\r\n <p class=\"fb-field__error\">La pianificazione e’ obbligatoria con questo trigger (START_SCHEDULE_MISSING).</p>\r\n }\r\n </fieldset>\r\n\r\n <fieldset class=\"fb-section\">\r\n <legend class=\"fb-section__title\">Percorsi differiti</legend>\r\n <p class=\"fb-section__note\">\r\n Ogni percorso e’ un ramo che parte dopo un intervallo, calcolato da un istante di riferimento.\r\n </p>\r\n\r\n <div class=\"fb-list\">\r\n @for (path of scheduledPaths(); track $index) {\r\n <div class=\"fb-list__item\">\r\n <div class=\"fb-list__header\">\r\n <span class=\"fb-list__index\">{{ $index + 1 }}</span>\r\n <span class=\"fb-list__spacer\"></span>\r\n <button\r\n type=\"button\"\r\n class=\"fb-btn fb-btn--ghost fb-btn--icon\"\r\n aria-label=\"Rimuovi il percorso\"\r\n (click)=\"removeScheduledPath($index)\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Etichetta</label>\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"path.label || ''\"\r\n (input)=\"setPathField($index, 'label', $any($event.target).value)\"\r\n />\r\n </div>\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Nome tecnico</label>\r\n <input\r\n class=\"fb-input fb-input--mono\"\r\n [value]=\"path.name || ''\"\r\n (input)=\"setPathField($index, 'name', $any($event.target).value)\"\r\n />\r\n </div>\r\n <div class=\"fb-field__row\">\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Dopo</label>\r\n <input\r\n class=\"fb-input\"\r\n type=\"number\"\r\n [value]=\"path.offsetNumber ?? ''\"\r\n (input)=\"setPathOffsetNumber($index, $any($event.target).value)\"\r\n />\r\n </div>\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Unita’</label>\r\n <select\r\n class=\"fb-select\"\r\n [fbValue]=\"path.offsetUnit || ''\"\r\n (change)=\"setPathField($index, 'offsetUnit', $any($event.target).value)\"\r\n >\r\n <option value=\"\">—</option>\r\n @for (unit of offsetUnits(); track unit.value) {\r\n <option [value]=\"unit.value\">{{ unit.label }}</option>\r\n }\r\n </select>\r\n </div>\r\n </div>\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Istante di riferimento</label>\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"path.timeSource || ''\"\r\n placeholder=\"Es. RecordTriggerEvent\"\r\n (input)=\"setPathField($index, 'timeSource', $any($event.target).value)\"\r\n />\r\n </div>\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Campo data del record</label>\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"path.recordField || ''\"\r\n (input)=\"setPathField($index, 'recordField', $any($event.target).value)\"\r\n />\r\n </div>\r\n </div>\r\n } @empty {\r\n <p class=\"fb-empty\">Nessun percorso differito.</p>\r\n }\r\n </div>\r\n <button type=\"button\" class=\"fb-btn\" (click)=\"addScheduledPath()\">Aggiungi percorso</button>\r\n </fieldset>\r\n}\r\n\r\n@if (triggerType() === 'None') {\r\n <p class=\"fb-field__hint\">\r\n Il flow parte solo su richiesta. I valori iniziali si passano nelle variabili di input.\r\n </p>\r\n}\r\n\r\n@if (isEvent()) {\r\n <p class=\"fb-field__hint\">Il flow parte alla ricezione di un evento.</p>\r\n}\r\n\r\n<fb-connector-editor\r\n [nodeName]=\"'$start'\"\r\n [node]=\"startNode()\"\r\n [outlets]=\"outlets()\"\r\n title=\"Da dove comincia\"\r\n (connectorChanged)=\"onConnectorChanged($event)\"\r\n/>\r\n","/**\r\n * Subflow — FRONTEND.md §5.9.\r\n *\r\n * `flowName` e' l'API name di un altro flow, proposto da `GET /flows/subflow-candidates`,\r\n * che restituisce **solo i flow con una versione attiva** ed esclude quello corrente: un\r\n * subflow che invoca il flow che lo contiene e' `SUBFLOW_RECURSIVE`.\r\n *\r\n * I nomi degli input e degli output sono quelli delle variabili `isInput`/`isOutput` **del\r\n * flow invocato**: per proporli si carica la definizione attiva di quel flow e se ne leggono\r\n * le variabili, che e' esattamente quello che fa questo componente.\r\n */\r\n\r\nimport { ChangeDetectionStrategy, Component, computed, effect, inject, signal } from '@angular/core';\r\n\r\nimport { NodeInspectorBase } from './node-inspector-base';\r\nimport { FlowBuilderApi } from '../../api/flow-builder-api';\r\nimport { FlowSummary } from '../../model/api.model';\r\nimport { FlowElementType, FlowSubflow, FlowValue, FlowVariable } from '../../model/flow.model';\r\nimport { ConnectorEditorComponent } from '../shared/connector-editor.component';\r\nimport { ReferencePickerComponent } from '../shared/reference-picker.component';\r\nimport { ValueEditorComponent } from '../shared/value-editor.component';\r\nimport { SelectValueDirective } from '../shared/select-value.directive';\r\n\r\n@Component({\r\n selector: 'fb-subflow-inspector',\r\n standalone: true,\r\n imports: [ConnectorEditorComponent, ReferencePickerComponent, ValueEditorComponent, SelectValueDirective],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './subflow-inspector.component.html',\r\n})\r\nexport class SubflowInspectorComponent extends NodeInspectorBase {\r\n private readonly api = inject(FlowBuilderApi);\r\n\r\n readonly elementType: FlowElementType = 'Subflow';\r\n\r\n readonly subflow = computed<FlowSubflow>(() => this.node() as FlowSubflow);\r\n\r\n private readonly candidates = signal<FlowSummary[]>([]);\r\n /** Le variabili del flow invocato: il contratto verso cui si passano i valori. */\r\n private readonly targetVariables = signal<FlowVariable[]>([]);\r\n private readonly targetLoadFailed = signal(false);\r\n\r\n constructor() {\r\n super();\r\n effect(() => {\r\n const current = this.store.document().fullName;\r\n void this.api\r\n .listSubflowCandidates(current)\r\n .then((list) => this.candidates.set(list ?? []))\r\n .catch(() => this.candidates.set([]));\r\n });\r\n\r\n effect(() => {\r\n const flowName = this.subflow().flowName;\r\n if (!flowName) {\r\n this.targetVariables.set([]);\r\n this.targetLoadFailed.set(false);\r\n return;\r\n }\r\n this.targetLoadFailed.set(false);\r\n void this.api\r\n // Senza `version` si ottiene la versione attiva, che e' quella che verra' eseguita.\r\n .loadFlow(flowName)\r\n .then((definition) => this.targetVariables.set(definition.variables ?? []))\r\n .catch(() => {\r\n this.targetVariables.set([]);\r\n this.targetLoadFailed.set(true);\r\n });\r\n });\r\n }\r\n\r\n readonly candidateOptions = computed(() => this.candidates());\r\n readonly hasCandidates = computed(() => this.candidates().length > 0);\r\n readonly couldNotLoadTarget = computed(() => this.targetLoadFailed());\r\n\r\n readonly inputVariables = computed(() => this.targetVariables().filter((variable) => variable.isInput));\r\n readonly outputVariables = computed(() => this.targetVariables().filter((variable) => variable.isOutput));\r\n\r\n readonly inputAssignments = computed(() => this.subflow().inputAssignments ?? []);\r\n readonly outputAssignments = computed(() => this.subflow().outputAssignments ?? []);\r\n\r\n /** Il flow invocato coincide con questo: `SUBFLOW_RECURSIVE`. */\r\n readonly isRecursive = computed(() => {\r\n const flowName = this.subflow().flowName;\r\n return !!flowName && flowName === this.store.document().fullName;\r\n });\r\n\r\n readonly storeOutputAutomatically = computed(() => this.subflow().storeOutputAutomatically === true);\r\n\r\n variableOf(name: string | undefined): FlowVariable | undefined {\r\n return this.targetVariables().find((variable) => variable.name === name);\r\n }\r\n\r\n setFlowName(value: string): void {\r\n this.patch((node) => {\r\n const subflow = node as FlowSubflow;\r\n if (subflow.flowName === value) {\r\n return;\r\n }\r\n subflow.flowName = value || undefined;\r\n // Il contratto cambia con il flow invocato: gli assegnamenti vecchi non valgono piu'.\r\n delete subflow.inputAssignments;\r\n delete subflow.outputAssignments;\r\n });\r\n }\r\n\r\n setStoreOutputAutomatically(value: boolean): void {\r\n this.patch((node) => {\r\n const subflow = node as FlowSubflow;\r\n if (value) {\r\n subflow.storeOutputAutomatically = true;\r\n delete subflow.outputAssignments;\r\n } else {\r\n delete subflow.storeOutputAutomatically;\r\n }\r\n });\r\n }\r\n\r\n addInput(name?: string): void {\r\n this.patch((node) => {\r\n const subflow = node as FlowSubflow;\r\n subflow.inputAssignments ??= [];\r\n subflow.inputAssignments.push({ name: name ?? '' });\r\n });\r\n }\r\n\r\n removeInput(index: number): void {\r\n this.patch((node) => {\r\n const subflow = node as FlowSubflow;\r\n subflow.inputAssignments?.splice(index, 1);\r\n if (subflow.inputAssignments?.length === 0) {\r\n delete subflow.inputAssignments;\r\n }\r\n });\r\n }\r\n\r\n setInputName(index: number, name: string): void {\r\n this.patch((node) => {\r\n const assignment = (node as FlowSubflow).inputAssignments?.[index];\r\n if (assignment) {\r\n assignment.name = name;\r\n }\r\n });\r\n }\r\n\r\n setInputValue(index: number, value: FlowValue | undefined): void {\r\n this.patch((node) => {\r\n const assignment = (node as FlowSubflow).inputAssignments?.[index];\r\n if (assignment) {\r\n assignment.value = value;\r\n }\r\n });\r\n }\r\n\r\n addOutput(name?: string): void {\r\n this.patch((node) => {\r\n const subflow = node as FlowSubflow;\r\n subflow.outputAssignments ??= [];\r\n subflow.outputAssignments.push({ name: name ?? '' });\r\n });\r\n }\r\n\r\n removeOutput(index: number): void {\r\n this.patch((node) => {\r\n const subflow = node as FlowSubflow;\r\n subflow.outputAssignments?.splice(index, 1);\r\n if (subflow.outputAssignments?.length === 0) {\r\n delete subflow.outputAssignments;\r\n }\r\n });\r\n }\r\n\r\n setOutputName(index: number, name: string): void {\r\n this.patch((node) => {\r\n const assignment = (node as FlowSubflow).outputAssignments?.[index];\r\n if (assignment) {\r\n assignment.name = name;\r\n }\r\n });\r\n }\r\n\r\n setOutputTarget(index: number, reference: string | undefined): void {\r\n this.patch((node) => {\r\n const assignment = (node as FlowSubflow).outputAssignments?.[index];\r\n if (assignment) {\r\n assignment.assignToReference = reference;\r\n }\r\n });\r\n }\r\n}\r\n","<div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Flow da invocare</label>\r\n @if (hasCandidates()) {\r\n <select\r\n class=\"fb-select\"\r\n [class.fb-select--invalid]=\"isRecursive()\"\r\n [fbValue]=\"subflow().flowName || ''\"\r\n (change)=\"setFlowName($any($event.target).value)\"\r\n >\r\n <option value=\"\">— scegli —</option>\r\n @for (candidate of candidateOptions(); track candidate.flowName) {\r\n <option [value]=\"candidate.flowName\">{{ candidate.label || candidate.flowName }}</option>\r\n }\r\n </select>\r\n <p class=\"fb-field__hint\">Solo i flow con una versione attiva possono essere invocati.</p>\r\n } @else {\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"subflow().flowName || ''\"\r\n placeholder=\"API name del flow\"\r\n (input)=\"setFlowName($any($event.target).value)\"\r\n />\r\n <p class=\"fb-field__hint\">\r\n Nessun flow attivo disponibile come subflow: attivane uno, oppure scrivi il nome a mano.\r\n </p>\r\n }\r\n @if (isRecursive()) {\r\n <p class=\"fb-field__error\">Un flow non puo’ invocare se stesso (SUBFLOW_RECURSIVE).</p>\r\n }\r\n</div>\r\n\r\n@if (couldNotLoadTarget()) {\r\n <p class=\"fb-callout fb-callout--warn\">\r\n Non e’ stato possibile leggere la definizione del flow invocato: i nomi di input e output non vengono\r\n proposti, ma puoi scriverli a mano.\r\n </p>\r\n}\r\n\r\n<p class=\"fb-callout\">\r\n Un subflow che si sospende — cioe’ che contiene screen o Wait — non e’ supportato dal motore.\r\n</p>\r\n\r\n<fieldset class=\"fb-section\">\r\n <legend class=\"fb-section__title\">Valori passati al subflow</legend>\r\n @if (inputVariables().length) {\r\n <p class=\"fb-section__note\">\r\n Sono le variabili di input del flow invocato: {{ inputVariables().length }} disponibili.\r\n </p>\r\n }\r\n\r\n <div class=\"fb-list\">\r\n @for (assignment of inputAssignments(); track $index) {\r\n <div class=\"fb-list__item\">\r\n <div class=\"fb-list__header\">\r\n @if (inputVariables().length) {\r\n <select\r\n class=\"fb-select\"\r\n [fbValue]=\"assignment.name || ''\"\r\n aria-label=\"Variabile del subflow\"\r\n (change)=\"setInputName($index, $any($event.target).value)\"\r\n >\r\n <option value=\"\">— scegli —</option>\r\n @for (variable of inputVariables(); track variable.name) {\r\n <option [value]=\"variable.name\">{{ variable.name }}</option>\r\n }\r\n </select>\r\n } @else {\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"assignment.name || ''\"\r\n placeholder=\"Nome della variabile di input\"\r\n aria-label=\"Variabile del subflow\"\r\n (input)=\"setInputName($index, $any($event.target).value)\"\r\n />\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"fb-btn fb-btn--ghost fb-btn--icon\"\r\n aria-label=\"Rimuovi\"\r\n (click)=\"removeInput($index)\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n <fb-value-editor\r\n [value]=\"assignment.value\"\r\n [dataType]=\"variableOf(assignment.name)?.dataType\"\r\n [objectType]=\"variableOf(assignment.name)?.objectType\"\r\n [isCollection]=\"variableOf(assignment.name)?.isCollection\"\r\n label=\"Valore\"\r\n (valueChange)=\"setInputValue($index, $event)\"\r\n />\r\n </div>\r\n } @empty {\r\n <p class=\"fb-empty\">Nessun valore passato.</p>\r\n }\r\n </div>\r\n <button type=\"button\" class=\"fb-btn\" (click)=\"addInput()\">Aggiungi valore</button>\r\n</fieldset>\r\n\r\n<fieldset class=\"fb-section\">\r\n <legend class=\"fb-section__title\">Valori restituiti</legend>\r\n <label class=\"fb-check\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"storeOutputAutomatically()\"\r\n (change)=\"setStoreOutputAutomatically($any($event.target).checked)\"\r\n />\r\n Output automatico\r\n </label>\r\n @if (storeOutputAutomatically()) {\r\n <p class=\"fb-field__hint\">\r\n Le variabili di output del subflow si referenziano col nome dell’elemento:\r\n <code>{{ name() }}.NomeVariabile</code>.\r\n </p>\r\n } @else {\r\n <div class=\"fb-list\">\r\n @for (assignment of outputAssignments(); track $index) {\r\n <div class=\"fb-list__item\">\r\n <div class=\"fb-list__header\">\r\n @if (outputVariables().length) {\r\n <select\r\n class=\"fb-select\"\r\n [fbValue]=\"assignment.name || ''\"\r\n aria-label=\"Variabile di output del subflow\"\r\n (change)=\"setOutputName($index, $any($event.target).value)\"\r\n >\r\n <option value=\"\">— scegli —</option>\r\n @for (variable of outputVariables(); track variable.name) {\r\n <option [value]=\"variable.name\">{{ variable.name }}</option>\r\n }\r\n </select>\r\n } @else {\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"assignment.name || ''\"\r\n placeholder=\"Nome della variabile di output\"\r\n aria-label=\"Variabile di output del subflow\"\r\n (input)=\"setOutputName($index, $any($event.target).value)\"\r\n />\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"fb-btn fb-btn--ghost fb-btn--icon\"\r\n aria-label=\"Rimuovi\"\r\n (click)=\"removeOutput($index)\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Assegna a</label>\r\n <fb-reference-picker\r\n [value]=\"assignment.assignToReference\"\r\n [writableOnly]=\"true\"\r\n [dataType]=\"variableOf(assignment.name)?.dataType\"\r\n [isCollection]=\"variableOf(assignment.name)?.isCollection\"\r\n placeholder=\"Scegli una variabile\"\r\n (valueChange)=\"setOutputTarget($index, $event)\"\r\n />\r\n </div>\r\n </div>\r\n } @empty {\r\n <p class=\"fb-empty\">Nessun valore raccolto.</p>\r\n }\r\n </div>\r\n <button type=\"button\" class=\"fb-btn\" (click)=\"addOutput()\">Aggiungi valore</button>\r\n }\r\n</fieldset>\r\n\r\n<fb-connector-editor\r\n [nodeName]=\"name()\"\r\n [node]=\"node()\"\r\n [outlets]=\"outlets()\"\r\n (connectorChanged)=\"onConnectorChanged($event)\"\r\n/>\r\n","/**\r\n * Transform — FRONTEND.md §5.12.\r\n *\r\n * Tre tipi di trasformazione: `Map` (assegna un valore), `Sum` (somma un campo degli\r\n * elementi di una collection), `Count` (conta gli elementi). `Sum` e `Count` richiedono\r\n * l'input `aggregationValues`; `Sum` anche `aggregationField`. Il form li gestisce come\r\n * campi propri, invece di lasciare all'utente il compito di indovinare i nomi dei parametri.\r\n *\r\n * Nota: `connector` qui e' un **array** — la mappa delle uscite lo nasconde al resto.\r\n */\r\n\r\nimport { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\r\n\r\nimport { NodeInspectorBase } from './node-inspector-base';\r\nimport { FlowCatalogStore } from '../../core/flow-dictionary.store';\r\nimport { FlowCatalogEntry, FlowObjectSummary } from '../../model/dictionary.model';\r\nimport {\r\n FlowElementType,\r\n FlowTransform,\r\n FlowTransformValueAction,\r\n FlowValue,\r\n} from '../../model/flow.model';\r\nimport { ConnectorEditorComponent } from '../shared/connector-editor.component';\r\nimport { ReferencePickerComponent } from '../shared/reference-picker.component';\r\nimport { ValueEditorComponent } from '../shared/value-editor.component';\r\nimport { SelectValueDirective } from '../shared/select-value.directive';\r\n\r\n/** I nomi dei parametri che le aggregazioni richiedono, fissati dal modello. */\r\nconst AGGREGATION_VALUES = 'aggregationValues';\r\nconst AGGREGATION_FIELD = 'aggregationField';\r\n\r\n@Component({\r\n selector: 'fb-transform-inspector',\r\n standalone: true,\r\n imports: [ConnectorEditorComponent, ReferencePickerComponent, ValueEditorComponent, SelectValueDirective],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './transform-inspector.component.html',\r\n})\r\nexport class TransformInspectorComponent extends NodeInspectorBase {\r\n private readonly catalog = inject(FlowCatalogStore);\r\n\r\n readonly elementType: FlowElementType = 'Transform';\r\n\r\n readonly transform = computed<FlowTransform>(() => this.node() as FlowTransform);\r\n readonly transformTypes = computed(() => this.dictionaries.transformTypes());\r\n readonly dataTypes = computed(() => this.dictionaries.dataTypes());\r\n\r\n private readonly objects = signal<FlowObjectSummary[]>([]);\r\n private readonly enumTypes = signal<FlowCatalogEntry[]>([]);\r\n\r\n constructor() {\r\n super();\r\n void this.catalog.listObjects().then((list) => this.objects.set(list ?? []));\r\n void this.catalog.listEnumTypes().then((list) => this.enumTypes.set(list ?? []));\r\n }\r\n\r\n readonly objectOptions = computed(() => this.objects());\r\n readonly enumOptions = computed(() => this.enumTypes());\r\n\r\n readonly requiresObjectType = computed(() => this.dictionaries.requiresObjectType(this.transform().dataType));\r\n\r\n /** Il modello prevede una lista di liste; l'editor lavora sulla prima, che e' il caso d'uso. */\r\n readonly actions = computed<FlowTransformValueAction[]>(\r\n () => this.transform().transformValues?.[0]?.transformValueActions ?? [],\r\n );\r\n\r\n setDataType(dataType: string): void {\r\n this.patch((node) => {\r\n const transform = node as FlowTransform;\r\n transform.dataType = dataType || undefined;\r\n if (!this.dictionaries.requiresObjectType(dataType)) {\r\n delete transform.objectType;\r\n }\r\n });\r\n }\r\n\r\n setObjectType(objectType: string): void {\r\n this.setField('objectType', objectType);\r\n }\r\n\r\n setIsCollection(value: boolean): void {\r\n this.patch((node) => {\r\n const transform = node as FlowTransform;\r\n if (value) {\r\n transform.isCollection = true;\r\n } else {\r\n delete transform.isCollection;\r\n }\r\n });\r\n }\r\n\r\n addAction(): void {\r\n this.patch((node) => {\r\n const transform = node as FlowTransform;\r\n transform.transformValues ??= [{}];\r\n const first = transform.transformValues[0];\r\n first.transformValueActions ??= [];\r\n first.transformValueActions.push({ transformType: 'Map' });\r\n });\r\n }\r\n\r\n removeAction(index: number): void {\r\n this.patch((node) => {\r\n const transform = node as FlowTransform;\r\n const actions = transform.transformValues?.[0]?.transformValueActions;\r\n actions?.splice(index, 1);\r\n if (actions?.length === 0) {\r\n delete transform.transformValues;\r\n }\r\n });\r\n }\r\n\r\n private mutateAction(index: number, mutate: (action: FlowTransformValueAction) => void): void {\r\n this.patch((node) => {\r\n const action = (node as FlowTransform).transformValues?.[0]?.transformValueActions?.[index];\r\n if (action) {\r\n mutate(action);\r\n }\r\n });\r\n }\r\n\r\n setActionType(index: number, transformType: string): void {\r\n this.mutateAction(index, (action) => {\r\n action.transformType = transformType;\r\n // Map usa `value`, Sum e Count usano `inputParameters`: tenere entrambi renderebbe\r\n // ambiguo cosa viene applicato.\r\n if (transformType === 'Map') {\r\n delete action.inputParameters;\r\n } else {\r\n delete action.value;\r\n action.inputParameters ??= [{ name: AGGREGATION_VALUES }];\r\n if (transformType === 'Sum' && !action.inputParameters.some((p) => p.name === AGGREGATION_FIELD)) {\r\n action.inputParameters.push({ name: AGGREGATION_FIELD });\r\n }\r\n if (transformType === 'Count') {\r\n action.inputParameters = action.inputParameters.filter((p) => p.name === AGGREGATION_VALUES);\r\n }\r\n }\r\n });\r\n }\r\n\r\n setOutputField(index: number, field: string): void {\r\n this.mutateAction(index, (action) => {\r\n action.outputFieldApiName = field || undefined;\r\n });\r\n }\r\n\r\n setMapValue(index: number, value: FlowValue | undefined): void {\r\n this.mutateAction(index, (action) => {\r\n action.value = value;\r\n });\r\n }\r\n\r\n aggregationCollection(action: FlowTransformValueAction): string | undefined {\r\n return action.inputParameters?.find((parameter) => parameter.name === AGGREGATION_VALUES)?.value\r\n ?.elementReference;\r\n }\r\n\r\n aggregationField(action: FlowTransformValueAction): string {\r\n return (\r\n action.inputParameters?.find((parameter) => parameter.name === AGGREGATION_FIELD)?.value?.stringValue ?? ''\r\n );\r\n }\r\n\r\n setAggregationCollection(index: number, reference: string | undefined): void {\r\n this.mutateAction(index, (action) => {\r\n action.inputParameters ??= [];\r\n const existing = action.inputParameters.find((parameter) => parameter.name === AGGREGATION_VALUES);\r\n if (existing) {\r\n existing.value = reference ? { elementReference: reference } : undefined;\r\n } else {\r\n action.inputParameters.push({\r\n name: AGGREGATION_VALUES,\r\n value: reference ? { elementReference: reference } : undefined,\r\n });\r\n }\r\n });\r\n }\r\n\r\n setAggregationField(index: number, field: string): void {\r\n this.mutateAction(index, (action) => {\r\n action.inputParameters ??= [];\r\n const existing = action.inputParameters.find((parameter) => parameter.name === AGGREGATION_FIELD);\r\n if (existing) {\r\n existing.value = field ? { stringValue: field } : undefined;\r\n } else {\r\n action.inputParameters.push({\r\n name: AGGREGATION_FIELD,\r\n value: field ? { stringValue: field } : undefined,\r\n });\r\n }\r\n });\r\n }\r\n\r\n isMap(action: FlowTransformValueAction): boolean {\r\n return (action.transformType ?? 'Map') === 'Map';\r\n }\r\n\r\n needsAggregationField(action: FlowTransformValueAction): boolean {\r\n return action.transformType === 'Sum';\r\n }\r\n\r\n needsAggregationValues(action: FlowTransformValueAction): boolean {\r\n return action.transformType === 'Sum' || action.transformType === 'Count';\r\n }\r\n}\r\n","<div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Tipo del risultato</label>\r\n <select class=\"fb-select\" [fbValue]=\"transform().dataType || ''\" (change)=\"setDataType($any($event.target).value)\">\r\n <option value=\"\">— scegli —</option>\r\n @for (type of dataTypes(); track type.value) {\r\n <option [value]=\"type.value\">{{ type.label }}</option>\r\n }\r\n </select>\r\n @if (!transform().dataType) {\r\n <p class=\"fb-field__error\">Obbligatorio (TRANSFORM_DATA_TYPE_MISSING).</p>\r\n }\r\n</div>\r\n\r\n@if (requiresObjectType()) {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Tipo dell’oggetto</label>\r\n <select\r\n class=\"fb-select\"\r\n [fbValue]=\"transform().objectType || ''\"\r\n (change)=\"setObjectType($any($event.target).value)\"\r\n >\r\n <option value=\"\">— scegli —</option>\r\n @if (transform().dataType === 'Enum') {\r\n @for (entry of enumOptions(); track entry.name) {\r\n <option [value]=\"entry.name\">{{ entry.label || entry.name }}</option>\r\n }\r\n } @else {\r\n @for (object of objectOptions(); track object.name) {\r\n <option [value]=\"object.name\">{{ object.label || object.name }}</option>\r\n }\r\n }\r\n </select>\r\n </div>\r\n}\r\n\r\n<label class=\"fb-check\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"transform().isCollection === true\"\r\n (change)=\"setIsCollection($any($event.target).checked)\"\r\n />\r\n Il risultato e’ una collection\r\n</label>\r\n\r\n<p class=\"fb-callout\">\r\n Il risultato e’ l’<strong>output automatico</strong> dell’elemento: si referenzia con\r\n <code>{{ name() }}</code>.\r\n</p>\r\n\r\n<fieldset class=\"fb-section\">\r\n <legend class=\"fb-section__title\">Trasformazioni</legend>\r\n\r\n <div class=\"fb-list\">\r\n @for (action of actions(); track $index) {\r\n <div class=\"fb-list__item\">\r\n <div class=\"fb-list__header\">\r\n <span class=\"fb-list__index\">{{ $index + 1 }}</span>\r\n <span class=\"fb-list__spacer\"></span>\r\n <button\r\n type=\"button\"\r\n class=\"fb-btn fb-btn--ghost fb-btn--icon\"\r\n aria-label=\"Rimuovi\"\r\n (click)=\"removeAction($index)\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Operazione</label>\r\n <select\r\n class=\"fb-select\"\r\n [fbValue]=\"action.transformType || 'Map'\"\r\n (change)=\"setActionType($index, $any($event.target).value)\"\r\n >\r\n @for (type of transformTypes(); track type.value) {\r\n <option [value]=\"type.value\">{{ type.label }}</option>\r\n }\r\n </select>\r\n </div>\r\n\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Campo di destinazione</label>\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"action.outputFieldApiName || ''\"\r\n placeholder=\"Totale\"\r\n (input)=\"setOutputField($index, $any($event.target).value)\"\r\n />\r\n </div>\r\n\r\n @if (isMap(action)) {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Valore</label>\r\n <fb-value-editor\r\n [value]=\"action.value\"\r\n label=\"Valore\"\r\n (valueChange)=\"setMapValue($index, $event)\"\r\n />\r\n </div>\r\n }\r\n\r\n @if (needsAggregationValues(action)) {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Collection su cui aggregare</label>\r\n <fb-reference-picker\r\n [value]=\"aggregationCollection(action)\"\r\n [isCollection]=\"true\"\r\n placeholder=\"Scegli una collection\"\r\n (valueChange)=\"setAggregationCollection($index, $event)\"\r\n />\r\n </div>\r\n }\r\n\r\n @if (needsAggregationField(action)) {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Campo da sommare</label>\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"aggregationField(action)\"\r\n placeholder=\"Importo\"\r\n (input)=\"setAggregationField($index, $any($event.target).value)\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n } @empty {\r\n <p class=\"fb-empty\">Nessuna trasformazione: l’elemento non produce nulla (TRANSFORM_WITHOUT_VALUES).</p>\r\n }\r\n </div>\r\n\r\n <button type=\"button\" class=\"fb-btn\" (click)=\"addAction()\">Aggiungi trasformazione</button>\r\n</fieldset>\r\n\r\n<fb-connector-editor\r\n [nodeName]=\"name()\"\r\n [node]=\"node()\"\r\n [outlets]=\"outlets()\"\r\n (connectorChanged)=\"onConnectorChanged($event)\"\r\n/>\r\n","/**\r\n * Wait — FRONTEND.md §5.10.\r\n *\r\n * - almeno un evento e' obbligatorio (`WAIT_WITHOUT_EVENTS`); ogni evento vuole `eventType`\r\n * e una `label`, che e' l'etichetta del ramo sul canvas;\r\n * - `defaultConnector` e' il ramo percorso se le condizioni di **tutti** gli eventi sono\r\n * false;\r\n * - ogni evento puo' avere condizioni, filtri e parametri.\r\n */\r\n\r\nimport { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\r\n\r\nimport { NodeInspectorBase } from './node-inspector-base';\r\nimport { FlowCatalogStore } from '../../core/flow-dictionary.store';\r\nimport { FlowCatalogEntry } from '../../model/dictionary.model';\r\nimport { FlowConditionHolder, FlowElementType, FlowWait, FlowWaitEvent } from '../../model/flow.model';\r\nimport { slugifyFlowName, uniqueFlowName } from '../../core/flow-name.util';\r\nimport { ConditionEditorComponent } from '../shared/condition-editor.component';\r\nimport { ConnectorEditorComponent } from '../shared/connector-editor.component';\r\nimport { ParameterEditorComponent, ParameterHolder } from '../shared/parameter-editor.component';\r\nimport { SelectValueDirective } from '../shared/select-value.directive';\r\n\r\n@Component({\r\n selector: 'fb-wait-inspector',\r\n standalone: true,\r\n imports: [ConditionEditorComponent, ConnectorEditorComponent, ParameterEditorComponent, SelectValueDirective],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './wait-inspector.component.html',\r\n})\r\nexport class WaitInspectorComponent extends NodeInspectorBase {\r\n private readonly catalog = inject(FlowCatalogStore);\r\n\r\n readonly elementType: FlowElementType = 'Wait';\r\n\r\n readonly wait = computed<FlowWait>(() => this.node() as FlowWait);\r\n readonly events = computed<FlowWaitEvent[]>(() => this.wait().waitEvents ?? []);\r\n /** I tipi noti al motore: `AlarmEvent` per un istante, `DateRefAlarmEvent` per un campo. */\r\n readonly eventTypes = computed(() => this.dictionaries.waitEventTypes());\r\n\r\n private readonly catalogEvents = signal<FlowCatalogEntry[]>([]);\r\n\r\n constructor() {\r\n super();\r\n void this.catalog\r\n .listEvents()\r\n .then((list) => this.catalogEvents.set(list ?? []))\r\n .catch(() => this.catalogEvents.set([]));\r\n }\r\n\r\n readonly catalogEventOptions = computed(() => this.catalogEvents());\r\n\r\n addEvent(): void {\r\n this.patch((node) => {\r\n const wait = node as FlowWait;\r\n wait.waitEvents ??= [];\r\n const existing = wait.waitEvents.map((event) => event.name ?? '');\r\n wait.waitEvents.push({\r\n name: uniqueFlowName('Evento', existing),\r\n label: `Evento ${wait.waitEvents.length + 1}`,\r\n eventType: this.eventTypes()[0]?.value,\r\n });\r\n });\r\n }\r\n\r\n removeEvent(index: number): void {\r\n this.patch((node) => {\r\n const wait = node as FlowWait;\r\n wait.waitEvents?.splice(index, 1);\r\n if (wait.waitEvents?.length === 0) {\r\n delete wait.waitEvents;\r\n }\r\n });\r\n }\r\n\r\n moveEvent(index: number, direction: -1 | 1): void {\r\n const target = index + direction;\r\n if (target < 0 || target >= this.events().length) {\r\n return;\r\n }\r\n this.patch((node) => {\r\n const events = (node as FlowWait).waitEvents;\r\n if (!events) {\r\n return;\r\n }\r\n const [moved] = events.splice(index, 1);\r\n events.splice(target, 0, moved);\r\n });\r\n }\r\n\r\n setEventLabel(index: number, label: string): void {\r\n this.patch((node) => {\r\n const event = (node as FlowWait).waitEvents?.[index];\r\n if (!event) {\r\n return;\r\n }\r\n event.label = label || undefined;\r\n if (!event.name && label) {\r\n event.name = slugifyFlowName(label);\r\n }\r\n });\r\n }\r\n\r\n setEventName(index: number, name: string): void {\r\n this.patch((node) => {\r\n const event = (node as FlowWait).waitEvents?.[index];\r\n if (event) {\r\n event.name = name;\r\n }\r\n });\r\n }\r\n\r\n setEventType(index: number, eventType: string): void {\r\n this.patch((node) => {\r\n const event = (node as FlowWait).waitEvents?.[index];\r\n if (event) {\r\n event.eventType = eventType || undefined;\r\n }\r\n });\r\n }\r\n\r\n onEventConditionsChanged(index: number, mutate: (holder: FlowConditionHolder) => void): void {\r\n this.patch((node) => {\r\n const event = (node as FlowWait).waitEvents?.[index];\r\n if (event) {\r\n mutate(event);\r\n }\r\n });\r\n }\r\n\r\n onEventParametersChanged(index: number, mutate: (holder: ParameterHolder) => void): void {\r\n this.patch((node) => {\r\n const event = (node as FlowWait).waitEvents?.[index];\r\n if (event) {\r\n mutate(event);\r\n }\r\n });\r\n }\r\n\r\n setDefaultLabel(label: string): void {\r\n this.setField('defaultConnectorLabel', label);\r\n }\r\n}\r\n","<div class=\"fb-list\">\r\n @for (event of events(); track $index) {\r\n <div class=\"fb-list__item\">\r\n <div class=\"fb-list__header\">\r\n <span class=\"fb-list__index\">{{ $index + 1 }}</span>\r\n <span class=\"fb-list__spacer\"></span>\r\n <button\r\n type=\"button\"\r\n class=\"fb-btn fb-btn--ghost fb-btn--icon\"\r\n aria-label=\"Sposta su\"\r\n [disabled]=\"$first\"\r\n (click)=\"moveEvent($index, -1)\"\r\n >\r\n ↑\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"fb-btn fb-btn--ghost fb-btn--icon\"\r\n aria-label=\"Sposta giu’\"\r\n [disabled]=\"$last\"\r\n (click)=\"moveEvent($index, 1)\"\r\n >\r\n ↓\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"fb-btn fb-btn--ghost fb-btn--icon\"\r\n aria-label=\"Rimuovi l’evento\"\r\n (click)=\"removeEvent($index)\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Etichetta del ramo</label>\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"event.label || ''\"\r\n placeholder=\"Alla scadenza\"\r\n (input)=\"setEventLabel($index, $any($event.target).value)\"\r\n />\r\n </div>\r\n\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Nome tecnico</label>\r\n <input\r\n class=\"fb-input fb-input--mono\"\r\n [value]=\"event.name || ''\"\r\n (input)=\"setEventName($index, $any($event.target).value)\"\r\n />\r\n </div>\r\n\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Tipo di evento</label>\r\n <select\r\n class=\"fb-select\"\r\n [fbValue]=\"event.eventType || ''\"\r\n (change)=\"setEventType($index, $any($event.target).value)\"\r\n >\r\n <option value=\"\">— scegli —</option>\r\n @for (type of eventTypes(); track type.value) {\r\n <option [value]=\"type.value\">{{ type.label }}</option>\r\n }\r\n @for (entry of catalogEventOptions(); track entry.name) {\r\n <option [value]=\"entry.name\">{{ entry.label || entry.name }}</option>\r\n }\r\n </select>\r\n @if (!event.eventType) {\r\n <p class=\"fb-field__error\">Senza tipo l’evento non e’ valido (WAIT_EVENT_TYPE_MISSING).</p>\r\n }\r\n </div>\r\n\r\n <fb-parameter-editor\r\n [holder]=\"event\"\r\n inputTitle=\"Parametri dell’evento\"\r\n [showOutputs]=\"true\"\r\n outputTitle=\"Valori prodotti dall’evento\"\r\n (changed)=\"onEventParametersChanged($index, $event)\"\r\n />\r\n\r\n <fb-condition-editor\r\n [holder]=\"event\"\r\n title=\"Condizioni dell’evento\"\r\n (changed)=\"onEventConditionsChanged($index, $event)\"\r\n />\r\n </div>\r\n } @empty {\r\n <p class=\"fb-empty\">\r\n Almeno un evento e’ obbligatorio: un Wait senza eventi non e’ eseguibile (WAIT_WITHOUT_EVENTS).\r\n </p>\r\n }\r\n</div>\r\n\r\n<button type=\"button\" class=\"fb-btn\" (click)=\"addEvent()\">Aggiungi evento</button>\r\n\r\n<fieldset class=\"fb-section\">\r\n <legend class=\"fb-section__title\">Se nessun evento si verifica</legend>\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Etichetta del ramo di default</label>\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"wait().defaultConnectorLabel || ''\"\r\n (input)=\"setDefaultLabel($any($event.target).value)\"\r\n />\r\n <p class=\"fb-field__hint\">\r\n È il ramo percorso quando le condizioni di <strong>tutti</strong> gli eventi sono false.\r\n </p>\r\n </div>\r\n</fieldset>\r\n\r\n<fb-connector-editor\r\n [nodeName]=\"name()\"\r\n [node]=\"node()\"\r\n [outlets]=\"outlets()\"\r\n title=\"Rami\"\r\n (connectorChanged)=\"onConnectorChanged($event)\"\r\n/>\r\n","/**\n * L'inspector: intestazione comune piu' il form del tipo selezionato.\n *\n * L'intestazione tiene i campi comuni a ogni node (`label`, `name`, `description`) e la\n * rinomina, che e' il punto delicato: **rinominare un elemento non aggiorna i riferimenti**,\n * e nessuna primitiva del backend lo fa (§13.8). Qui la riscrittura la fa il client, tramite\n * `FlowDocumentStore.renameNode`, e il form dice quanti riferimenti verranno riscritti prima\n * di farlo.\n *\n * Il corpo e' scelto per tipo. I tipi non supportati (`Step`, `Experiment`,\n * `OrchestratedStage`) non sono creabili dalla palette, ma possono arrivare da un documento\n * importato: in quel caso l'inspector li mostra in sola lettura, dicendo perche'.\n */\n\nimport { ChangeDetectionStrategy, Component, computed, inject, input, output, signal } from '@angular/core';\n\nimport { FlowDocumentStore } from '../../core/flow-document.store';\nimport { FlowDictionaryStore } from '../../core/flow-dictionary.store';\nimport { FlowValidationStore } from '../../core/flow-validation.store';\nimport { START_NODE_NAME, UNSUPPORTED_TYPES } from '../../core/element-outlets';\nimport { checkFlowName, slugifyFlowName } from '../../core/flow-name.util';\nimport { FlowAnyNode } from '../../model/flow.model';\nimport { ActionCallInspectorComponent } from './action-call-inspector.component';\nimport { AssignmentInspectorComponent } from './assignment-inspector.component';\nimport { CollectionProcessorInspectorComponent } from './collection-processor-inspector.component';\nimport { CustomErrorInspectorComponent } from './custom-error-inspector.component';\nimport { DecisionInspectorComponent } from './decision-inspector.component';\nimport { LoopInspectorComponent } from './loop-inspector.component';\nimport { RecordLookupInspectorComponent } from './record-lookup-inspector.component';\nimport { RecordRollbackInspectorComponent } from './record-rollback-inspector.component';\nimport { RecordWriteInspectorComponent } from './record-write-inspector.component';\nimport { ScreenInspectorComponent } from './screen-inspector.component';\nimport { ScriptCallInspectorComponent } from './script-call-inspector.component';\nimport { StartInspectorComponent } from './start-inspector.component';\nimport { SubflowInspectorComponent } from './subflow-inspector.component';\nimport { TransformInspectorComponent } from './transform-inspector.component';\nimport { WaitInspectorComponent } from './wait-inspector.component';\n\n@Component({\n selector: 'fb-element-inspector',\n standalone: true,\n imports: [\n ActionCallInspectorComponent,\n AssignmentInspectorComponent,\n CollectionProcessorInspectorComponent,\n CustomErrorInspectorComponent,\n DecisionInspectorComponent,\n LoopInspectorComponent,\n RecordLookupInspectorComponent,\n RecordRollbackInspectorComponent,\n RecordWriteInspectorComponent,\n ScreenInspectorComponent,\n ScriptCallInspectorComponent,\n StartInspectorComponent,\n SubflowInspectorComponent,\n TransformInspectorComponent,\n WaitInspectorComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './element-inspector.component.html',\n styleUrl: './element-inspector.component.css',\n})\nexport class ElementInspectorComponent {\n private readonly store = inject(FlowDocumentStore);\n private readonly dictionaries = inject(FlowDictionaryStore);\n private readonly validation = inject(FlowValidationStore);\n\n /** Il nome dell'elemento selezionato; `$start` per lo Start. */\n readonly selectedName = input<string | null>(null);\n\n /**\n * `false` quando l'inspector e' dentro la dialog: lì il tipo e il titolo sono già\n * nell'intestazione della dialog, e ripeterli sprecherebbe la riga piu' preziosa.\n */\n readonly showHeader = input(true);\n\n readonly closed = output<void>();\n readonly removeRequested = output<string>();\n readonly duplicateRequested = output<string>();\n\n readonly isStart = computed(() => this.selectedName() === START_NODE_NAME);\n\n readonly reference = computed(() => {\n const name = this.selectedName();\n return name && name !== START_NODE_NAME ? this.store.nodeByName().get(name) : undefined;\n });\n\n readonly node = computed<FlowAnyNode | undefined>(() => this.reference()?.node);\n readonly type = computed(() => this.reference()?.type ?? '');\n readonly typeLabel = computed(() => (this.isStart() ? 'Avvio' : this.dictionaries.labelOf(this.type())));\n\n readonly isUnsupported = computed(() => {\n const type = this.type();\n if (!type) {\n return false;\n }\n const entry = this.dictionaries.elementType(type);\n if (entry?.isSupported === false) {\n return true;\n }\n return entry?.isSupported === undefined && UNSUPPORTED_TYPES.has(type);\n });\n\n /** I rilievi ancorati all'elemento (§7). */\n readonly issues = computed(() => {\n const name = this.selectedName();\n if (!name) {\n return [];\n }\n return this.validation.issuesByElement().get(this.isStart() ? '' : name) ?? [];\n });\n\n /** Il nome tecnico in modifica: si applica con un comando esplicito, non a ogni tasto. */\n readonly pendingName = signal<string | null>(null);\n\n readonly nameError = computed(() => {\n const pending = this.pendingName();\n if (pending === null) {\n return null;\n }\n const check = checkFlowName(pending, this.store.usedNames(), this.selectedName());\n return check.isValid ? null : (check.message ?? 'Nome non valido.');\n });\n\n /**\n * Quanti riferimenti verrebbero riscritti dalla rinomina. Serve a rendere visibile che\n * l'operazione tocca il resto del documento, non solo questo elemento.\n */\n readonly referenceCount = computed(() => {\n const name = this.selectedName();\n if (!name || this.isStart()) {\n return 0;\n }\n const serialized = JSON.stringify(this.store.document());\n // Conta le occorrenze del nome come valore di un campo di riferimento, incluso il caso\n // navigato (`Nome.Campo`).\n const pattern = new RegExp(`\"(${name})(\\\\.[A-Za-z0-9_.]+)?\"`, 'g');\n return (serialized.match(pattern) ?? []).length;\n });\n\n readonly canRename = computed(() => {\n const pending = this.pendingName();\n return pending !== null && pending !== this.selectedName() && !this.nameError();\n });\n\n startRename(): void {\n this.pendingName.set(this.selectedName());\n }\n\n onPendingNameInput(value: string): void {\n this.pendingName.set(value);\n }\n\n cancelRename(): void {\n this.pendingName.set(null);\n }\n\n /** Applica la rinomina riscrivendo tutti i riferimenti che raggiungono l'elemento. */\n applyRename(): void {\n const pending = this.pendingName();\n const current = this.selectedName();\n if (!pending || !current || !this.canRename()) {\n return;\n }\n this.store.renameNode(current, pending);\n this.pendingName.set(null);\n }\n\n setLabel(value: string): void {\n const name = this.selectedName();\n if (!name || this.isStart()) {\n return;\n }\n this.store.updateNode(name, (node) => {\n node.label = value || undefined;\n });\n }\n\n setDescription(value: string): void {\n const name = this.selectedName();\n if (!name || this.isStart()) {\n return;\n }\n this.store.updateNode(name, (node) => {\n node.description = value || undefined;\n });\n }\n\n /** Suggerisce il nome tecnico dalla label, come fa la creazione. */\n suggestNameFromLabel(): void {\n const node = this.node();\n if (!node?.label) {\n return;\n }\n this.pendingName.set(slugifyFlowName(node.label as string));\n }\n\n requestRemove(): void {\n const name = this.selectedName();\n if (name && !this.isStart()) {\n this.removeRequested.emit(name);\n }\n }\n\n requestDuplicate(): void {\n const name = this.selectedName();\n if (name && !this.isStart()) {\n this.duplicateRequested.emit(name);\n }\n }\n\n close(): void {\n this.closed.emit();\n }\n\n /** Le coordinate sono l'unica informazione di layout che il modello conserva (§3.5). */\n readonly position = computed(() => {\n const node = this.isStart() ? (this.store.start() as FlowAnyNode) : this.node();\n return { x: node?.locationX ?? 0, y: node?.locationY ?? 0 };\n });\n}\n","@if (!selectedName()) {\n <p class=\"fb-inspector__empty\">\n Seleziona un elemento sul canvas per modificarlo, oppure trascina un elemento dalla palette.\n </p>\n} @else {\n @if (showHeader()) {\n <header class=\"fb-inspector__header\">\n <div>\n <span class=\"fb-inspector__type\">{{ typeLabel() }}</span>\n <h2 class=\"fb-inspector__title\">\n {{ isStart() ? 'Avvio del flow' : node()?.label || selectedName() }}\n </h2>\n </div>\n <button type=\"button\" class=\"fb-btn fb-btn--ghost fb-btn--icon\" aria-label=\"Chiudi\" (click)=\"close()\">\n ×\n </button>\n </header>\n }\n\n <div class=\"fb-inspector__body\">\n @if (issues().length) {\n <ul class=\"fb-inspector__issues\">\n <!-- `$index`: due rilievi con lo stesso codice e lo stesso path sono possibili. -->\n @for (issue of issues(); track $index) {\n <li\n class=\"fb-inspector__issue\"\n [class.fb-inspector__issue--error]=\"issue.severity === 'Error'\"\n [class.fb-inspector__issue--warning]=\"issue.severity === 'Warning'\"\n >\n <span class=\"fb-inspector__issue-code\">{{ issue.code }}</span>\n {{ issue.message }}\n @if (issue.path) {\n <span class=\"fb-inspector__issue-path\">{{ issue.path }}</span>\n }\n </li>\n }\n </ul>\n }\n\n @if (isUnsupported()) {\n <p class=\"fb-callout fb-callout--error\">\n Questo tipo di elemento non e’ supportato dal motore: il flow che lo contiene non parte\n (ELEMENT_NOT_SUPPORTED). Non e’ creabile dalla palette; se e’ arrivato da un documento importato,\n va rimosso.\n </p>\n }\n\n @if (!isStart()) {\n <div class=\"fb-field\">\n <label class=\"fb-field__label\">Etichetta</label>\n <input\n class=\"fb-input\"\n [value]=\"$any(node()?.label) || ''\"\n placeholder=\"Nome mostrato sul canvas\"\n (input)=\"setLabel($any($event.target).value)\"\n />\n </div>\n\n <div class=\"fb-field\">\n <label class=\"fb-field__label\">Nome tecnico</label>\n @if (pendingName() === null) {\n <div class=\"fb-field__row\">\n <input class=\"fb-input fb-input--mono\" [value]=\"selectedName() || ''\" readonly />\n <button type=\"button\" class=\"fb-btn\" (click)=\"startRename()\">Rinomina</button>\n </div>\n <p class=\"fb-field__hint\">\n È l’identificatore con cui i riferimenti raggiungono questo elemento.\n @if (referenceCount() > 1) {\n Compare {{ referenceCount() }} volte nel documento.\n }\n </p>\n } @else {\n <input\n class=\"fb-input fb-input--mono\"\n [class.fb-input--invalid]=\"!!nameError()\"\n [value]=\"pendingName() || ''\"\n (input)=\"onPendingNameInput($any($event.target).value)\"\n />\n @if (nameError()) {\n <p class=\"fb-field__error\">{{ nameError() }}</p>\n } @else {\n <p class=\"fb-field__hint fb-field__hint--warn\">\n La rinomina riscrive tutti i riferimenti che puntano a questo elemento\n ({{ referenceCount() }} occorrenze): nessuna primitiva del backend lo fa, lo fa l’editor.\n </p>\n }\n <div class=\"fb-field__row\">\n <button type=\"button\" class=\"fb-btn fb-btn--primary\" [disabled]=\"!canRename()\" (click)=\"applyRename()\">\n Applica\n </button>\n <button type=\"button\" class=\"fb-btn\" (click)=\"suggestNameFromLabel()\">Genera dalla label</button>\n <button type=\"button\" class=\"fb-btn fb-btn--ghost\" (click)=\"cancelRename()\">Annulla</button>\n </div>\n }\n </div>\n\n <div class=\"fb-field\">\n <label class=\"fb-field__label\">Descrizione</label>\n <textarea\n class=\"fb-textarea\"\n [value]=\"$any(node()?.description) || ''\"\n (input)=\"setDescription($any($event.target).value)\"\n ></textarea>\n </div>\n }\n\n <p class=\"fb-inspector__position\">\n Posizione sul canvas: {{ position().x }}, {{ position().y }}\n </p>\n\n <hr class=\"fb-inspector__divider\" />\n\n @if (isStart()) {\n <fb-start-inspector />\n } @else if (node()) {\n @switch (type()) {\n @case ('Screen') {\n <fb-screen-inspector [name]=\"selectedName()!\" [node]=\"node()!\" />\n }\n @case ('Assignment') {\n <fb-assignment-inspector [name]=\"selectedName()!\" [node]=\"node()!\" />\n }\n @case ('Decision') {\n <fb-decision-inspector [name]=\"selectedName()!\" [node]=\"node()!\" />\n }\n @case ('Loop') {\n <fb-loop-inspector [name]=\"selectedName()!\" [node]=\"node()!\" />\n }\n @case ('CollectionProcessor') {\n <fb-collection-processor-inspector [name]=\"selectedName()!\" [node]=\"node()!\" />\n }\n @case ('CustomError') {\n <fb-custom-error-inspector [name]=\"selectedName()!\" [node]=\"node()!\" />\n }\n @case ('Wait') {\n <fb-wait-inspector [name]=\"selectedName()!\" [node]=\"node()!\" />\n }\n @case ('RecordLookup') {\n <fb-record-lookup-inspector [name]=\"selectedName()!\" [node]=\"node()!\" />\n }\n @case ('RecordCreate') {\n <fb-record-write-inspector [name]=\"selectedName()!\" [node]=\"node()!\" type=\"RecordCreate\" />\n }\n @case ('RecordUpdate') {\n <fb-record-write-inspector [name]=\"selectedName()!\" [node]=\"node()!\" type=\"RecordUpdate\" />\n }\n @case ('RecordDelete') {\n <fb-record-write-inspector [name]=\"selectedName()!\" [node]=\"node()!\" type=\"RecordDelete\" />\n }\n @case ('RecordRollback') {\n <fb-record-rollback-inspector [name]=\"selectedName()!\" [node]=\"node()!\" />\n }\n @case ('ActionCall') {\n <fb-action-call-inspector [name]=\"selectedName()!\" [node]=\"node()!\" />\n }\n @case ('ScriptCall') {\n <fb-script-call-inspector [name]=\"selectedName()!\" [node]=\"node()!\" />\n }\n @case ('Subflow') {\n <fb-subflow-inspector [name]=\"selectedName()!\" [node]=\"node()!\" />\n }\n @case ('Transform') {\n <fb-transform-inspector [name]=\"selectedName()!\" [node]=\"node()!\" />\n }\n @default {\n <p class=\"fb-callout fb-callout--warn\">\n Nessun form specifico per il tipo «{{ type() }}»: i campi comuni sono modificabili qui sopra.\n </p>\n }\n }\n }\n\n @if (!isStart()) {\n <hr class=\"fb-inspector__divider\" />\n <div class=\"fb-field__row\">\n <button type=\"button\" class=\"fb-btn\" (click)=\"requestDuplicate()\">Duplica</button>\n <button type=\"button\" class=\"fb-btn fb-btn--danger\" (click)=\"requestRemove()\">Elimina</button>\n </div>\n }\n </div>\n}\n","/**\n * Il dettaglio dell'elemento in una dialog, come nel flow builder di Salesforce.\n *\n * Perche' una dialog e non solo il pannello laterale: i form degli elementi non hanno tutti\n * la stessa taglia. Uno Screen, una Decision con quattro regole o un Get Records con filtri\n * e ordinamento occupano piu' spazio di quanto ne abbia una colonna da 340px, e nel pannello\n * si scorreva molto. La dialog da' la larghezza necessaria e, mentre e' aperta, dichiara che\n * si sta configurando **quell'** elemento.\n *\n * Non c'e' un «Annulla»: le modifiche entrano nel documento mentre si digita, esattamente\n * come nel pannello, e tornare indietro e' compito dell'annulla generale dell'editor. Un\n * bottone che promettesse di scartare le modifiche solo di questa dialog mentirebbe, perche'\n * il documento e' uno e le modifiche sono già dentro.\n *\n * La dialog vive **dentro** il componente builder, non in fondo al `body`: la libreria e'\n * innestabile in una pagina qualsiasi e appropriarsi del `body` sarebbe una sorpresa per\n * l'applicazione ospite (dialog dell'ospite, `overflow`, stacking context).\n */\n\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n effect,\n inject,\n input,\n output,\n viewChild,\n} from '@angular/core';\n\nimport { FlowDictionaryStore } from '../../core/flow-dictionary.store';\nimport { FlowDocumentStore } from '../../core/flow-document.store';\nimport { START_NODE_NAME } from '../../core/element-outlets';\nimport { ElementInspectorComponent } from './element-inspector.component';\n\n@Component({\n selector: 'fb-element-dialog',\n standalone: true,\n imports: [ElementInspectorComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './element-dialog.component.html',\n styleUrl: './element-dialog.component.css',\n})\nexport class ElementDialogComponent {\n private readonly store = inject(FlowDocumentStore);\n private readonly dictionaries = inject(FlowDictionaryStore);\n\n /** L'elemento da configurare; `$start` per lo Start. */\n readonly selectedName = input<string | null>(null);\n\n readonly closed = output<void>();\n readonly removeRequested = output<string>();\n readonly duplicateRequested = output<string>();\n\n private readonly panel = viewChild<ElementRef<HTMLElement>>('panel');\n\n readonly isStart = computed(() => this.selectedName() === START_NODE_NAME);\n\n private readonly reference = computed(() => {\n const name = this.selectedName();\n return name && !this.isStart() ? this.store.nodeByName().get(name) : undefined;\n });\n\n readonly typeLabel = computed(() =>\n this.isStart() ? 'Avvio del flow' : this.dictionaries.labelOf(this.reference()?.type ?? ''),\n );\n\n readonly title = computed(() => {\n if (this.isStart()) {\n return 'Avvio del flow';\n }\n const node = this.reference()?.node;\n return (node?.label as string) || this.selectedName() || '';\n });\n\n constructor() {\n // Il focus entra nella dialog quando cambia elemento: da tastiera si arriva subito ai\n // campi, e `Esc` chiude senza dover prima cliccare dentro.\n effect(() => {\n const name = this.selectedName();\n const panel = this.panel()?.nativeElement;\n if (name && panel) {\n panel.focus({ preventScroll: true });\n }\n });\n }\n\n close(): void {\n this.closed.emit();\n }\n\n onRemoveRequested(name: string): void {\n this.removeRequested.emit(name);\n }\n\n onDuplicateRequested(name: string): void {\n this.duplicateRequested.emit(name);\n }\n}\n","<!--\n Il backdrop chiude: e' il gesto che tutti si aspettano. Il pannello ferma la propagazione\n del click, altrimenti configurare un campo chiuderebbe la dialog.\n-->\n<div class=\"fb-dialog__backdrop\" (click)=\"close()\"></div>\n\n<div\n #panel\n class=\"fb-dialog__panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"typeLabel() + ': ' + title()\"\n tabindex=\"-1\"\n (click)=\"$event.stopPropagation()\"\n (keydown.escape)=\"close()\"\n>\n <header class=\"fb-dialog__head\">\n <div class=\"fb-dialog__identity\">\n <span class=\"fb-dialog__type\">{{ typeLabel() }}</span>\n <h2 class=\"fb-dialog__title\">{{ title() }}</h2>\n </div>\n <button type=\"button\" class=\"fb-btn fb-btn--ghost fb-btn--icon\" aria-label=\"Chiudi\" (click)=\"close()\">×</button>\n </header>\n\n <div class=\"fb-dialog__body\">\n <!-- L'intestazione dell'inspector qui e' quella della dialog: non si ripete. -->\n <fb-element-inspector\n [selectedName]=\"selectedName()\"\n [showHeader]=\"false\"\n (removeRequested)=\"onRemoveRequested($event)\"\n (duplicateRequested)=\"onDuplicateRequested($event)\"\n (closed)=\"close()\"\n />\n </div>\n\n <footer class=\"fb-dialog__foot\">\n <span class=\"fb-dialog__note\">\n Le modifiche sono già nel documento: per tornare indietro c’è l’annulla dell’editor.\n </span>\n <button type=\"button\" class=\"fb-btn fb-btn--primary\" (click)=\"close()\">Fatto</button>\n </footer>\n</div>\n","/**\r\n * Le risorse — FRONTEND.md §4.6.\r\n *\r\n * Sette tipi, ognuno nella propria collection. **Solo le variabili sono scrivibili**:\r\n * assegnare a una costante o a una formula e' `TARGET_NOT_WRITABLE`, e per questo il\r\n * pannello mostra quali risorse possono comparire come destinazione e quali no.\r\n *\r\n * Il nome vive nello stesso spazio dei nomi dei node (§3.3): una variabile chiamata come un\r\n * elemento e' un errore, non una stranezza tollerata, e il controllo qui guarda **entrambi**\r\n * gli insiemi — e' la trappola §13.5.\r\n */\r\n\r\nimport { ChangeDetectionStrategy, Component, computed, inject, output, signal } from '@angular/core';\r\n\r\nimport { FlowCatalogStore, FlowDictionaryStore } from '../../core/flow-dictionary.store';\r\nimport { FlowDocumentStore, FlowResourceRef } from '../../core/flow-document.store';\r\nimport { checkFlowName, uniqueFlowName } from '../../core/flow-name.util';\r\nimport { FlowCatalogEntry, FlowObjectSummary } from '../../model/dictionary.model';\r\nimport { FlowResourceCollection, FlowValue } from '../../model/flow.model';\r\nimport { ValueEditorComponent } from '../shared/value-editor.component';\r\nimport { SelectValueDirective } from '../shared/select-value.directive';\r\n\r\ninterface ResourceKindDescriptor {\r\n collection: FlowResourceCollection;\r\n label: string;\r\n singular: string;\r\n isWritable: boolean;\r\n /** Cosa serve dichiarare, in una riga. */\r\n note: string;\r\n}\r\n\r\n/**\r\n * Le sette collection. `resourceKinds` del dizionario le descrive, ma la mappa\r\n * collection → comportamento del form resta qui perche' i campi cambiano per tipo.\r\n */\r\nconst RESOURCE_KINDS: ResourceKindDescriptor[] = [\r\n {\r\n collection: 'variables',\r\n label: 'Variabili',\r\n singular: 'variabile',\r\n isWritable: true,\r\n note: 'Le sole risorse scrivibili: solo queste possono essere una destinazione.',\r\n },\r\n {\r\n collection: 'constants',\r\n label: 'Costanti',\r\n singular: 'costante',\r\n isWritable: false,\r\n note: 'Valore fisso: una costante non puo’ referenziare altre risorse.',\r\n },\r\n {\r\n collection: 'formulas',\r\n label: 'Formule',\r\n singular: 'formula',\r\n isWritable: false,\r\n note: 'L’espressione va al motore di regole: il backend non ne verifica la sintassi.',\r\n },\r\n {\r\n collection: 'textTemplates',\r\n label: 'Text template',\r\n singular: 'text template',\r\n isWritable: false,\r\n note: 'Testo con segnaposto, es. «Gentile {!Cliente.Nome},».',\r\n },\r\n {\r\n collection: 'choices',\r\n label: 'Choice',\r\n singular: 'choice',\r\n isWritable: false,\r\n note: 'Una singola scelta: testo mostrato piu’ valore.',\r\n },\r\n {\r\n collection: 'dynamicChoiceSets',\r\n label: 'Dynamic choice set',\r\n singular: 'dynamic choice set',\r\n isWritable: false,\r\n note: 'Scelte lette dal database. I filtri sono sempre in AND.',\r\n },\r\n {\r\n collection: 'stages',\r\n label: 'Stage',\r\n singular: 'stage',\r\n isWritable: false,\r\n note: 'Gli stage si fanno avanzare con un Assignment su $Flow.CurrentStage.',\r\n },\r\n];\r\n\r\n@Component({\r\n selector: 'fb-resource-panel',\r\n standalone: true,\r\n imports: [ValueEditorComponent, SelectValueDirective],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './resource-panel.component.html',\r\n styleUrl: './resource-panel.component.css',\r\n})\r\nexport class ResourcePanelComponent {\r\n private readonly store = inject(FlowDocumentStore);\r\n private readonly dictionaries = inject(FlowDictionaryStore);\r\n private readonly catalog = inject(FlowCatalogStore);\r\n\r\n readonly closed = output<void>();\r\n\r\n readonly kinds = RESOURCE_KINDS;\r\n readonly dataTypes = computed(() => this.dictionaries.dataTypes());\r\n readonly sortOrders = computed(() => this.dictionaries.sortOrders());\r\n\r\n private readonly objects = signal<FlowObjectSummary[]>([]);\r\n private readonly enumTypes = signal<FlowCatalogEntry[]>([]);\r\n\r\n /** La collection aperta nel pannello. */\r\n readonly activeCollection = signal<FlowResourceCollection>('variables');\r\n /** L'indice della risorsa in modifica, o `null`. */\r\n readonly editingIndex = signal<number | null>(null);\r\n\r\n constructor() {\r\n void this.catalog.listObjects().then((list) => this.objects.set(list ?? []));\r\n void this.catalog.listEnumTypes().then((list) => this.enumTypes.set(list ?? []));\r\n }\r\n\r\n readonly objectOptions = computed(() => this.objects());\r\n readonly enumOptions = computed(() => this.enumTypes());\r\n\r\n readonly activeKind = computed<ResourceKindDescriptor>(\r\n () => RESOURCE_KINDS.find((kind) => kind.collection === this.activeCollection()) ?? RESOURCE_KINDS[0],\r\n );\r\n\r\n readonly items = computed<FlowResourceRef[]>(() =>\r\n this.store.resources().filter((reference) => reference.collection === this.activeCollection()),\r\n );\r\n\r\n countOf(collection: FlowResourceCollection): number {\r\n return this.store.resources().filter((reference) => reference.collection === collection).length;\r\n }\r\n\r\n select(collection: FlowResourceCollection): void {\r\n this.activeCollection.set(collection);\r\n this.editingIndex.set(null);\r\n }\r\n\r\n toggleEdit(index: number): void {\r\n this.editingIndex.set(this.editingIndex() === index ? null : index);\r\n }\r\n\r\n /** Nome valido e libero nello spazio dei nomi condiviso con i node (§3.3, §13.5). */\r\n nameError(reference: FlowResourceRef): string | null {\r\n const check = checkFlowName(reference.name, this.store.usedNames(), reference.name);\r\n if (!check.isValid) {\r\n return check.message ?? 'Nome non valido.';\r\n }\r\n // Un omonimo di un node: il controllo di unicita' che guarda solo le risorse lo manca.\r\n const clashes = this.store\r\n .usedNames()\r\n .filter((name) => name.toLowerCase() === reference.name.toLowerCase());\r\n return clashes.length > 1 ? 'Questo nome e’ usato anche da un altro elemento o risorsa.' : null;\r\n }\r\n\r\n add(): void {\r\n const kind = this.activeKind();\r\n const name = uniqueFlowName(kind.singular.replace(/\\s+/g, '_'), this.store.usedNames());\r\n const resource: Record<string, unknown> = { name };\r\n // `dataType` e' obbligatorio su variabili, costanti, formule, choice e choice set (§4.6).\r\n if (kind.collection !== 'textTemplates' && kind.collection !== 'stages') {\r\n resource['dataType'] = 'String';\r\n }\r\n if (kind.collection === 'stages') {\r\n // Gli `stageOrder` devono essere distinti: si parte dal primo libero.\r\n const used = new Set(\r\n this.store\r\n .resources()\r\n .filter((entry) => entry.collection === 'stages')\r\n .map((entry) => entry.resource['stageOrder'] as number),\r\n );\r\n let order = 1;\r\n while (used.has(order)) {\r\n order += 1;\r\n }\r\n resource['stageOrder'] = order;\r\n resource['isActive'] = true;\r\n resource['label'] = name;\r\n }\r\n this.store.addResource(kind.collection, resource);\r\n this.editingIndex.set(this.items().length);\r\n }\r\n\r\n remove(reference: FlowResourceRef): void {\r\n this.store.removeResource(reference.collection, reference.index);\r\n this.editingIndex.set(null);\r\n }\r\n\r\n rename(reference: FlowResourceRef, name: string): void {\r\n // Rinominare riscrive i riferimenti: nessuna primitiva lo fa per noi (§13.8).\r\n this.store.renameResource(reference.collection, reference.index, name);\r\n }\r\n\r\n setField(reference: FlowResourceRef, field: string, value: unknown): void {\r\n this.store.updateResource(reference.collection, reference.index, (resource) => {\r\n if (value === undefined || value === null || value === '') {\r\n delete resource[field];\r\n } else {\r\n resource[field] = value;\r\n }\r\n });\r\n }\r\n\r\n setNumberField(reference: FlowResourceRef, field: string, raw: string): void {\r\n const parsed = Number.parseInt(raw, 10);\r\n this.setField(reference, field, Number.isNaN(parsed) ? undefined : parsed);\r\n }\r\n\r\n setBooleanField(reference: FlowResourceRef, field: string, value: boolean): void {\r\n this.store.updateResource(reference.collection, reference.index, (resource) => {\r\n if (value) {\r\n resource[field] = true;\r\n } else {\r\n delete resource[field];\r\n }\r\n });\r\n }\r\n\r\n setValue(reference: FlowResourceRef, value: FlowValue | undefined): void {\r\n this.store.updateResource(reference.collection, reference.index, (resource) => {\r\n if (value) {\r\n resource['value'] = value;\r\n } else {\r\n delete resource['value'];\r\n }\r\n });\r\n }\r\n\r\n setDataType(reference: FlowResourceRef, dataType: string): void {\r\n this.store.updateResource(reference.collection, reference.index, (resource) => {\r\n resource['dataType'] = dataType;\r\n if (!this.dictionaries.requiresObjectType(dataType)) {\r\n delete resource['objectType'];\r\n }\r\n // `scale` si applica solo ai numerici: altrove e' `SCALE_NOT_APPLICABLE`.\r\n if (!this.dictionaries.supportsScale(dataType)) {\r\n delete resource['scale'];\r\n }\r\n });\r\n }\r\n\r\n requiresObjectType(reference: FlowResourceRef): boolean {\r\n return this.dictionaries.requiresObjectType(reference.resource['dataType'] as string);\r\n }\r\n\r\n supportsScale(reference: FlowResourceRef): boolean {\r\n return this.dictionaries.supportsScale(reference.resource['dataType'] as string);\r\n }\r\n\r\n isEnum(reference: FlowResourceRef): boolean {\r\n return reference.resource['dataType'] === 'Enum';\r\n }\r\n\r\n /** Una costante che referenzia una risorsa e' `CONSTANT_REFERENCES_RESOURCE`. */\r\n constantReferencesResource(reference: FlowResourceRef): boolean {\r\n if (reference.collection !== 'constants') {\r\n return false;\r\n }\r\n const value = reference.resource['value'] as FlowValue | undefined;\r\n return !!value?.elementReference || !!value?.formulaExpression;\r\n }\r\n\r\n /** `stageOrder` duplicati: quale stage sia il corrente all'avvio diventa arbitrario. */\r\n duplicateStageOrder(reference: FlowResourceRef): boolean {\r\n if (reference.collection !== 'stages') {\r\n return false;\r\n }\r\n const order = reference.resource['stageOrder'];\r\n if (order === undefined) {\r\n return false;\r\n }\r\n return (\r\n this.store\r\n .resources()\r\n .filter((entry) => entry.collection === 'stages' && entry.resource['stageOrder'] === order).length > 1\r\n );\r\n }\r\n\r\n string(reference: FlowResourceRef, field: string): string {\r\n const value = reference.resource[field];\r\n return value === undefined || value === null ? '' : String(value);\r\n }\r\n\r\n boolean(reference: FlowResourceRef, field: string): boolean {\r\n return reference.resource[field] === true;\r\n }\r\n\r\n value(reference: FlowResourceRef): FlowValue | undefined {\r\n return reference.resource['value'] as FlowValue | undefined;\r\n }\r\n\r\n close(): void {\r\n this.closed.emit();\r\n }\r\n}\r\n","<header class=\"fb-res__header\">\r\n <h2 class=\"fb-res__title\">Risorse</h2>\r\n <button type=\"button\" class=\"fb-btn fb-btn--ghost fb-btn--icon\" aria-label=\"Chiudi\" (click)=\"close()\">×</button>\r\n</header>\r\n\r\n<nav class=\"fb-res__tabs\" aria-label=\"Tipi di risorsa\">\r\n @for (kind of kinds; track kind.collection) {\r\n <button\r\n type=\"button\"\r\n class=\"fb-res__tab\"\r\n [class.fb-res__tab--active]=\"activeCollection() === kind.collection\"\r\n (click)=\"select(kind.collection)\"\r\n >\r\n {{ kind.label }}\r\n <span class=\"fb-res__count\">{{ countOf(kind.collection) }}</span>\r\n </button>\r\n }\r\n</nav>\r\n\r\n<div class=\"fb-res__body\">\r\n <p class=\"fb-section__note\">{{ activeKind().note }}</p>\r\n\r\n <div class=\"fb-list\">\r\n @for (item of items(); track item.collection + ':' + item.index) {\r\n <div class=\"fb-list__item\">\r\n <div class=\"fb-list__header\">\r\n <button type=\"button\" class=\"fb-res__name\" (click)=\"toggleEdit($index)\">\r\n <span class=\"fb-res__name-text\">{{ item.name || '(senza nome)' }}</span>\r\n <span class=\"fb-res__meta\">\r\n {{ string(item, 'dataType') }}{{ boolean(item, 'isCollection') ? '[]' : '' }}\r\n @if (boolean(item, 'isInput')) {\r\n · input\r\n }\r\n @if (boolean(item, 'isOutput')) {\r\n · output\r\n }\r\n </span>\r\n </button>\r\n <span class=\"fb-list__spacer\"></span>\r\n <button\r\n type=\"button\"\r\n class=\"fb-btn fb-btn--ghost fb-btn--icon\"\r\n aria-label=\"Rimuovi la risorsa\"\r\n (click)=\"remove(item)\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n\r\n @if (nameError(item)) {\r\n <p class=\"fb-field__error\">{{ nameError(item) }}</p>\r\n }\r\n @if (constantReferencesResource(item)) {\r\n <p class=\"fb-callout fb-callout--error\">\r\n Una costante deve essere un valore fisso: non puo’ referenziare altre risorse\r\n (CONSTANT_REFERENCES_RESOURCE).\r\n </p>\r\n }\r\n @if (duplicateStageOrder(item)) {\r\n <p class=\"fb-callout fb-callout--warn\">\r\n Due stage con lo stesso ordine: quale sia il corrente all’avvio diventa arbitrario\r\n (STAGE_ORDER_DUPLICATED).\r\n </p>\r\n }\r\n\r\n @if (editingIndex() === $index) {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Nome</label>\r\n <input\r\n class=\"fb-input fb-input--mono\"\r\n [value]=\"item.name\"\r\n (change)=\"rename(item, $any($event.target).value)\"\r\n />\r\n <p class=\"fb-field__hint\">\r\n Il nome vive nello stesso spazio dei nomi degli elementi. Rinominare riscrive i riferimenti.\r\n </p>\r\n </div>\r\n\r\n @if (item.collection === 'stages') {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Etichetta</label>\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"string(item, 'label')\"\r\n (input)=\"setField(item, 'label', $any($event.target).value)\"\r\n />\r\n </div>\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Ordine</label>\r\n <input\r\n class=\"fb-input\"\r\n type=\"number\"\r\n min=\"1\"\r\n [value]=\"string(item, 'stageOrder')\"\r\n (input)=\"setNumberField(item, 'stageOrder', $any($event.target).value)\"\r\n />\r\n </div>\r\n <label class=\"fb-check\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"boolean(item, 'isActive')\"\r\n (change)=\"setBooleanField(item, 'isActive', $any($event.target).checked)\"\r\n />\r\n Attivo all’avvio\r\n </label>\r\n <p class=\"fb-field__hint\">\r\n All’avvio lo stage corrente e’ il primo attivo per ordine. Si avanza con un Assignment su\r\n <code>$Flow.CurrentStage</code>.\r\n </p>\r\n }\r\n\r\n @if (item.collection === 'textTemplates') {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Testo</label>\r\n <textarea\r\n class=\"fb-textarea\"\r\n [value]=\"string(item, 'text')\"\r\n placeholder=\"Gentile {!Cliente.Nome},\"\r\n (input)=\"setField(item, 'text', $any($event.target).value)\"\r\n ></textarea>\r\n </div>\r\n <label class=\"fb-check\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"boolean(item, 'isViewedAsPlainText')\"\r\n (change)=\"setBooleanField(item, 'isViewedAsPlainText', $any($event.target).checked)\"\r\n />\r\n Testo semplice\r\n </label>\r\n }\r\n\r\n @if (item.collection !== 'textTemplates' && item.collection !== 'stages') {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Tipo</label>\r\n <select\r\n class=\"fb-select\"\r\n [fbValue]=\"string(item, 'dataType')\"\r\n (change)=\"setDataType(item, $any($event.target).value)\"\r\n >\r\n @for (type of dataTypes(); track type.value) {\r\n <option [value]=\"type.value\">{{ type.label }}</option>\r\n }\r\n </select>\r\n </div>\r\n\r\n @if (requiresObjectType(item)) {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">\r\n {{ isEnum(item) ? 'Tipo di enumerazione' : 'Oggetto' }}\r\n </label>\r\n <select\r\n class=\"fb-select\"\r\n [fbValue]=\"string(item, 'objectType')\"\r\n (change)=\"setField(item, 'objectType', $any($event.target).value)\"\r\n >\r\n <option value=\"\">— scegli —</option>\r\n @if (isEnum(item)) {\r\n @for (entry of enumOptions(); track entry.name) {\r\n <option [value]=\"entry.name\">{{ entry.label || entry.name }}</option>\r\n }\r\n } @else {\r\n @for (object of objectOptions(); track object.name) {\r\n <option [value]=\"object.name\">{{ object.label || object.name }}</option>\r\n }\r\n }\r\n </select>\r\n <p class=\"fb-field__hint\">Obbligatorio per Object ed Enum (OBJECT_TYPE_MISSING).</p>\r\n </div>\r\n }\r\n\r\n @if (supportsScale(item)) {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Decimali</label>\r\n <input\r\n class=\"fb-input\"\r\n type=\"number\"\r\n min=\"0\"\r\n [value]=\"string(item, 'scale')\"\r\n (input)=\"setNumberField(item, 'scale', $any($event.target).value)\"\r\n />\r\n </div>\r\n }\r\n }\r\n\r\n @if (item.collection === 'variables') {\r\n <label class=\"fb-check\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"boolean(item, 'isCollection')\"\r\n (change)=\"setBooleanField(item, 'isCollection', $any($event.target).checked)\"\r\n />\r\n È una collection\r\n </label>\r\n <p class=\"fb-field__hint\">Solo una collection puo’ essere iterata da un Loop.</p>\r\n\r\n <label class=\"fb-check\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"boolean(item, 'isInput')\"\r\n (change)=\"setBooleanField(item, 'isInput', $any($event.target).checked)\"\r\n />\r\n Valorizzabile all’avvio (input)\r\n </label>\r\n <label class=\"fb-check\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"boolean(item, 'isOutput')\"\r\n (change)=\"setBooleanField(item, 'isOutput', $any($event.target).checked)\"\r\n />\r\n Leggibile alla fine (output)\r\n </label>\r\n <p class=\"fb-field__hint\">\r\n Input e output sono il contratto del flow verso chi lo invoca, subflow compresi.\r\n </p>\r\n }\r\n\r\n @if (item.collection === 'formulas') {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Espressione</label>\r\n <textarea\r\n class=\"fb-textarea fb-input--mono\"\r\n [value]=\"string(item, 'expression')\"\r\n placeholder=\"Importo * 1.22\"\r\n (input)=\"setField(item, 'expression', $any($event.target).value)\"\r\n ></textarea>\r\n <p class=\"fb-field__hint\">\r\n Passata verbatim al motore di regole: il backend non la valida.\r\n </p>\r\n </div>\r\n }\r\n\r\n @if (item.collection === 'choices') {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Testo mostrato</label>\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"string(item, 'choiceText')\"\r\n (input)=\"setField(item, 'choiceText', $any($event.target).value)\"\r\n />\r\n </div>\r\n }\r\n\r\n @if (item.collection === 'dynamicChoiceSets') {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Oggetto</label>\r\n <select\r\n class=\"fb-select\"\r\n [fbValue]=\"string(item, 'object')\"\r\n (change)=\"setField(item, 'object', $any($event.target).value)\"\r\n >\r\n <option value=\"\">— scegli —</option>\r\n @for (object of objectOptions(); track object.name) {\r\n <option [value]=\"object.name\">{{ object.label || object.name }}</option>\r\n }\r\n </select>\r\n </div>\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Campo mostrato</label>\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"string(item, 'displayField')\"\r\n (input)=\"setField(item, 'displayField', $any($event.target).value)\"\r\n />\r\n </div>\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label fb-field__label--required\">Campo del valore</label>\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"string(item, 'valueField')\"\r\n (input)=\"setField(item, 'valueField', $any($event.target).value)\"\r\n />\r\n </div>\r\n <div class=\"fb-field__row\">\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Ordina per</label>\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"string(item, 'sortField')\"\r\n (input)=\"setField(item, 'sortField', $any($event.target).value)\"\r\n />\r\n </div>\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Direzione</label>\r\n <select\r\n class=\"fb-select\"\r\n [fbValue]=\"string(item, 'sortOrder')\"\r\n (change)=\"setField(item, 'sortOrder', $any($event.target).value)\"\r\n >\r\n <option value=\"\">—</option>\r\n @for (order of sortOrders(); track order.value) {\r\n <option [value]=\"order.value\">{{ order.label }}</option>\r\n }\r\n </select>\r\n </div>\r\n </div>\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Numero massimo</label>\r\n <input\r\n class=\"fb-input\"\r\n type=\"number\"\r\n min=\"1\"\r\n [value]=\"string(item, 'limit')\"\r\n (input)=\"setNumberField(item, 'limit', $any($event.target).value)\"\r\n />\r\n </div>\r\n <p class=\"fb-field__hint\">\r\n I filtri di un dynamic choice set sono sempre in AND: non c’e’ logica personalizzata.\r\n </p>\r\n }\r\n\r\n @if (\r\n item.collection === 'variables' || item.collection === 'constants' || item.collection === 'choices'\r\n ) {\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">\r\n {{ item.collection === 'variables' ? 'Valore iniziale' : 'Valore' }}\r\n </label>\r\n <fb-value-editor\r\n [value]=\"value(item)\"\r\n [dataType]=\"$any(item.resource['dataType'])\"\r\n [objectType]=\"$any(item.resource['objectType'])\"\r\n [isCollection]=\"boolean(item, 'isCollection')\"\r\n [allowFormula]=\"item.collection !== 'constants'\"\r\n label=\"Valore\"\r\n (valueChange)=\"setValue(item, $event)\"\r\n />\r\n </div>\r\n }\r\n\r\n <div class=\"fb-field\">\r\n <label class=\"fb-field__label\">Descrizione</label>\r\n <input\r\n class=\"fb-input\"\r\n [value]=\"string(item, 'description')\"\r\n (input)=\"setField(item, 'description', $any($event.target).value)\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n } @empty {\r\n <p class=\"fb-empty\">Nessuna risorsa di questo tipo.</p>\r\n }\r\n </div>\r\n\r\n <button type=\"button\" class=\"fb-btn fb-btn--primary\" (click)=\"add()\">\r\n Aggiungi {{ activeKind().singular }}\r\n </button>\r\n</div>\r\n","/**\n * Il pannello dei problemi — FRONTEND.md §7.\n *\n * I rilievi arrivano ordinati per gravita' decrescente. `code` e' stabile e si usa per\n * raggruppare e per decidere il comportamento; `message` e' testo per l'utente e non va\n * interpretato. `elementName` e' l'ancora per portare l'utente sull'elemento con un clic.\n *\n * Tre effetti che l'interfaccia deve rispettare:\n * - `Error` blocca l'**attivazione**, non il salvataggio;\n * - `Warning` non blocca nulla, ma dice che qualcosa non fara' cio' che sembra;\n * - l'assenza di rilievi **non** e' una garanzia di correttezza: la validazione non verifica\n * i percorsi di relazione, la sintassi delle formule, ne' i cataloghi non popolati.\n */\n\nimport { ChangeDetectionStrategy, Component, computed, inject, output, signal } from '@angular/core';\n\nimport { FlowValidationStore } from '../../core/flow-validation.store';\nimport { FlowValidationIssue } from '../../model/api.model';\nimport { START_NODE_NAME } from '../../core/element-outlets';\n\ntype SeverityFilter = 'all' | 'Error' | 'Warning' | 'Info';\n\n@Component({\n selector: 'fb-problems-panel',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './problems-panel.component.html',\n styleUrl: './problems-panel.component.css',\n})\nexport class ProblemsPanelComponent {\n private readonly validation = inject(FlowValidationStore);\n\n /** Chiede di selezionare l'elemento: `$start` per i rilievi sul documento. */\n readonly elementFocused = output<string>();\n readonly closed = output<void>();\n\n readonly filter = signal<SeverityFilter>('all');\n\n readonly isRunning = computed(() => this.validation.isRunning());\n readonly hasResult = computed(() => this.validation.hasResult());\n readonly lastError = computed(() => this.validation.lastError());\n readonly errorCount = computed(() => this.validation.errorCount());\n readonly warningCount = computed(() => this.validation.warningCount());\n readonly infoCount = computed(() => this.validation.infoCount());\n\n readonly issues = computed<FlowValidationIssue[]>(() => {\n const filter = this.filter();\n const issues = this.validation.issues();\n return filter === 'all' ? issues : issues.filter((issue) => issue.severity === filter);\n });\n\n readonly isClean = computed(() => this.hasResult() && this.validation.issues().length === 0);\n\n setFilter(filter: SeverityFilter): void {\n this.filter.set(filter);\n }\n\n focus(issue: FlowValidationIssue): void {\n // Un rilievo senza `elementName` riguarda il documento: l'ancora piu' vicina e' lo Start.\n this.elementFocused.emit(issue.elementName || START_NODE_NAME);\n }\n\n close(): void {\n this.closed.emit();\n }\n}\n","<header class=\"fb-prob__header\">\n <h2 class=\"fb-prob__title\">\n Problemi\n @if (isRunning()) {\n <span class=\"fb-prob__running\">validazione in corso…</span>\n }\n </h2>\n <button type=\"button\" class=\"fb-btn fb-btn--ghost fb-btn--icon\" aria-label=\"Chiudi\" (click)=\"close()\">×</button>\n</header>\n\n<nav class=\"fb-prob__filters\" aria-label=\"Filtra per gravita’\">\n <button\n type=\"button\"\n class=\"fb-prob__filter\"\n [class.fb-prob__filter--active]=\"filter() === 'all'\"\n (click)=\"setFilter('all')\"\n >\n Tutti\n </button>\n <button\n type=\"button\"\n class=\"fb-prob__filter fb-prob__filter--error\"\n [class.fb-prob__filter--active]=\"filter() === 'Error'\"\n (click)=\"setFilter('Error')\"\n >\n Errori <span class=\"fb-prob__count\">{{ errorCount() }}</span>\n </button>\n <button\n type=\"button\"\n class=\"fb-prob__filter fb-prob__filter--warning\"\n [class.fb-prob__filter--active]=\"filter() === 'Warning'\"\n (click)=\"setFilter('Warning')\"\n >\n Avvisi <span class=\"fb-prob__count\">{{ warningCount() }}</span>\n </button>\n <button\n type=\"button\"\n class=\"fb-prob__filter\"\n [class.fb-prob__filter--active]=\"filter() === 'Info'\"\n (click)=\"setFilter('Info')\"\n >\n Note <span class=\"fb-prob__count\">{{ infoCount() }}</span>\n </button>\n</nav>\n\n<div class=\"fb-prob__body\">\n @if (lastError()) {\n <p class=\"fb-callout fb-callout--warn\">\n Non e’ stato possibile validare: {{ lastError() }}\n </p>\n }\n\n @if (!hasResult() && !isRunning()) {\n <p class=\"fb-empty\">La validazione non e’ ancora stata eseguita.</p>\n }\n\n @if (isClean()) {\n <p class=\"fb-empty\">\n Nessun rilievo. Attenzione: non e’ una garanzia di correttezza — la validazione non verifica i percorsi\n di relazione nei campi, la sintassi delle formule, ne’ action, form e parametri quando il catalogo\n corrispondente non e’ popolato.\n </p>\n }\n\n <ul class=\"fb-prob__list\">\n <!-- `$index`: due rilievi possono avere codice, elemento e path identici (due condizioni\n incomplete nella stessa regola), e una chiave duplicata e' un errore di Angular. -->\n @for (issue of issues(); track $index) {\n <li\n class=\"fb-prob__item\"\n [class.fb-prob__item--error]=\"issue.severity === 'Error'\"\n [class.fb-prob__item--warning]=\"issue.severity === 'Warning'\"\n >\n <button type=\"button\" class=\"fb-prob__link\" (click)=\"focus(issue)\">\n <span class=\"fb-prob__message\">{{ issue.message }}</span>\n <span class=\"fb-prob__meta\">\n <code>{{ issue.code }}</code>\n @if (issue.elementName) {\n · {{ issue.elementName }}\n }\n @if (issue.path) {\n · {{ issue.path }}\n }\n </span>\n </button>\n </li>\n }\n </ul>\n\n @if (errorCount() > 0) {\n <p class=\"fb-prob__note\">\n Gli errori bloccano l’<strong>attivazione</strong>, non il salvataggio: puoi interrompere il lavoro a\n metà e riprenderlo.\n </p>\n }\n</div>\n","/**\n * Versioni e ciclo di vita — FRONTEND.md §8, §9.\n *\n * Le quattro regole che l'interfaccia deve rispettare, tutte visibili qui:\n * 1. **si modifica una bozza**: su una versione non modificabile il comando e' \"Nuova\n * versione\", non \"Salva\" — `isEditable` arriva dal backend e non si ricalcola;\n * 2. una bozza si salva anche con errori, e finisce in `InvalidDraft`;\n * 3. **attivare esige zero errori**;\n * 4. una sola versione attiva: attivarne una rende `Obsolete` la precedente.\n *\n * L'eliminazione di una versione e' offerta dietro conferma esplicita, perche' il numero\n * piu' alto viene riassegnato e un'esecuzione sospesa nata su quel numero riprenderebbe su\n * una definizione diversa (§8, ultimo capoverso).\n */\n\nimport { ChangeDetectionStrategy, Component, computed, inject, output, signal } from '@angular/core';\n\nimport { FlowEditorSession } from '../../core/flow-editor-session';\nimport { FlowVersionSummary } from '../../model/api.model';\n\n@Component({\n selector: 'fb-version-panel',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './version-panel.component.html',\n styleUrl: './version-panel.component.css',\n})\nexport class VersionPanelComponent {\n private readonly session = inject(FlowEditorSession);\n\n readonly closed = output<void>();\n readonly versionOpened = output<number>();\n /** Comunica un esito all'host, che lo mostra come notifica. */\n readonly notice = output<{ kind: 'info' | 'error'; message: string }>();\n\n readonly versions = computed(() => this.session.versions());\n readonly currentVersion = computed(() => this.session.version());\n readonly isBusy = computed(() => this.session.isBusy());\n readonly canActivate = computed(() => this.session.canActivate());\n\n /** La versione per cui e' stata chiesta l'eliminazione: conferma in due passi. */\n readonly pendingDelete = signal<number | null>(null);\n\n isCurrent(version: FlowVersionSummary): boolean {\n return version.version === this.currentVersion();\n }\n\n statusLabel(version: FlowVersionSummary): string {\n switch (version.status) {\n case 'Draft':\n return 'Bozza';\n case 'InvalidDraft':\n return 'Bozza con errori';\n case 'UnderReview':\n return 'In approvazione';\n case 'Active':\n return 'Attiva';\n case 'Obsolete':\n return 'Superata';\n default:\n return version.status ?? '';\n }\n }\n\n open(version: FlowVersionSummary): void {\n this.versionOpened.emit(version.version);\n }\n\n async activate(version: FlowVersionSummary): Promise<void> {\n if (version.version !== this.currentVersion()) {\n // L'attivazione agisce sulla versione caricata: prima la si apre.\n this.versionOpened.emit(version.version);\n return;\n }\n try {\n const result = await this.session.activate();\n this.notice.emit({ kind: 'info', message: `Versione ${result.version} attivata.` });\n } catch (error) {\n this.notice.emit({\n kind: 'error',\n message: error instanceof Error ? error.message : 'Attivazione non riuscita.',\n });\n }\n }\n\n async deactivate(): Promise<void> {\n try {\n await this.session.deactivate();\n this.notice.emit({ kind: 'info', message: 'Flow disattivato: non e’ piu’ eseguibile.' });\n } catch (error) {\n this.notice.emit({\n kind: 'error',\n message: error instanceof Error ? error.message : 'Disattivazione non riuscita.',\n });\n }\n }\n\n async createNewVersion(): Promise<void> {\n try {\n const result = await this.session.createNewVersion();\n this.notice.emit({ kind: 'info', message: `Creata la versione ${result.version}.` });\n } catch (error) {\n this.notice.emit({\n kind: 'error',\n message: error instanceof Error ? error.message : 'Creazione della versione non riuscita.',\n });\n }\n }\n\n requestDelete(version: FlowVersionSummary): void {\n this.pendingDelete.set(version.version);\n }\n\n cancelDelete(): void {\n this.pendingDelete.set(null);\n }\n\n async confirmDelete(version: number): Promise<void> {\n this.pendingDelete.set(null);\n try {\n await this.session.deleteVersion(version);\n this.notice.emit({ kind: 'info', message: `Versione ${version} eliminata.` });\n } catch (error) {\n this.notice.emit({\n kind: 'error',\n message: error instanceof Error ? error.message : 'Eliminazione non riuscita.',\n });\n }\n }\n\n readonly hasActiveVersion = computed(() => this.versions().some((version) => version.isActive));\n\n close(): void {\n this.closed.emit();\n }\n}\n","<header class=\"fb-ver__header\">\n <h2 class=\"fb-ver__title\">Versioni</h2>\n <button type=\"button\" class=\"fb-btn fb-btn--ghost fb-btn--icon\" aria-label=\"Chiudi\" (click)=\"close()\">×</button>\n</header>\n\n<div class=\"fb-ver__body\">\n <div class=\"fb-field__row\">\n <button type=\"button\" class=\"fb-btn\" [disabled]=\"isBusy()\" (click)=\"createNewVersion()\">\n Nuova versione dalla corrente\n </button>\n @if (hasActiveVersion()) {\n <button type=\"button\" class=\"fb-btn fb-btn--danger\" [disabled]=\"isBusy()\" (click)=\"deactivate()\">\n Disattiva\n </button>\n }\n </div>\n\n <ul class=\"fb-ver__list\">\n @for (version of versions(); track version.version) {\n <li class=\"fb-ver__item\" [class.fb-ver__item--current]=\"isCurrent(version)\">\n <div class=\"fb-ver__row\">\n <button type=\"button\" class=\"fb-ver__open\" (click)=\"open(version)\">\n <span class=\"fb-ver__number\">v{{ version.version }}</span>\n <span\n class=\"fb-ver__status\"\n [class.fb-ver__status--active]=\"version.isActive\"\n [class.fb-ver__status--invalid]=\"version.status === 'InvalidDraft'\"\n >\n {{ statusLabel(version) }}\n </span>\n @if (isCurrent(version)) {\n <span class=\"fb-ver__badge\">aperta</span>\n }\n </button>\n </div>\n\n <p class=\"fb-ver__meta\">\n @if (version.updatedAt) {\n aggiornata {{ version.updatedAt }}\n }\n @if (version.updatedBy) {\n da {{ version.updatedBy }}\n }\n </p>\n\n <div class=\"fb-ver__actions\">\n @if (version.isEditable) {\n <span class=\"fb-ver__hint\">Modificabile</span>\n } @else {\n <!-- Salvare su una versione Active o Obsolete verrebbe rifiutato con NotEditable. -->\n <span class=\"fb-ver__hint\">Sola lettura: per modificarla, creane una nuova</span>\n }\n\n @if (!version.isActive && isCurrent(version)) {\n <button\n type=\"button\"\n class=\"fb-btn fb-btn--primary fb-btn--icon\"\n [disabled]=\"isBusy() || !canActivate()\"\n [title]=\"canActivate() ? 'Attiva questa versione' : 'Ci sono errori da correggere prima di attivare'\"\n (click)=\"activate(version)\"\n >\n Attiva\n </button>\n }\n\n @if (!version.isActive) {\n @if (pendingDelete() === version.version) {\n <span class=\"fb-ver__confirm\">\n Le esecuzioni sospese nate su questo numero riprenderebbero su una definizione diversa.\n <button type=\"button\" class=\"fb-btn fb-btn--danger fb-btn--icon\" (click)=\"confirmDelete(version.version)\">\n Elimina comunque\n </button>\n <button type=\"button\" class=\"fb-btn fb-btn--ghost fb-btn--icon\" (click)=\"cancelDelete()\">\n Annulla\n </button>\n </span>\n } @else {\n <button\n type=\"button\"\n class=\"fb-btn fb-btn--ghost fb-btn--icon\"\n [disabled]=\"isBusy()\"\n (click)=\"requestDelete(version)\"\n >\n Elimina\n </button>\n }\n }\n </div>\n </li>\n } @empty {\n <li class=\"fb-empty\">Nessuna versione: il flow non e’ ancora stato salvato.</li>\n }\n </ul>\n\n <p class=\"fb-ver__note\">\n Una sola versione e’ attiva: attivarne una rende superata la precedente, senza doverla disattivare prima.\n Le versioni superate costano poco — lo stato «Superata» esiste per questo.\n </p>\n</div>\n","/**\n * Provare un flow dall'editor — FRONTEND.md §6.5, §11 (\"Provare\").\n *\n * Cinque cose che questo pannello tratta come dette:\n * 1. `status: 'Failed'` **non** e' un errore di trasporto: la richiesta e' riuscita, il flow\n * e' fallito. E `NotStarted` significa che i criteri dello Start non erano soddisfatti,\n * che non e' un errore.\n * 2. il `continuationToken` va rimandato **tale e quale**: e' opaco, non viene letto ne'\n * modificato, e non finisce in nessun URL.\n * 3. `canGoBack`/`canFinish`/`canPause` di `pendingScreen` sono la verita' su cosa\n * abilitare, piu' precisa dei flag del metadata.\n * 4. con `Previous` e `Pause` gli output **non** vengono memorizzati: i valori inseriti non\n * sono definitivi, e il pannello lo dice.\n * 5. `debug: true` popola `trace` e `resources` — **e riporta anche i dati personali**:\n * l'avviso e' in chiaro, non nascosto in una tooltip.\n */\n\nimport { ChangeDetectionStrategy, Component, computed, inject, output, signal } from '@angular/core';\n\nimport { FlowBuilderApi } from '../../api/flow-builder-api';\nimport { FlowDocumentStore } from '../../core/flow-document.store';\nimport { FlowEditorSession } from '../../core/flow-editor-session';\nimport { FlowInterviewResult, FlowScreenNavigation, FlowTypedValue } from '../../model/api.model';\nimport { FlowApiError } from '../../model/error.model';\nimport { FlowVariable } from '../../model/flow.model';\n\n@Component({\n selector: 'fb-debug-panel',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './debug-panel.component.html',\n styleUrl: './debug-panel.component.css',\n})\nexport class DebugPanelComponent {\n private readonly api = inject(FlowBuilderApi);\n private readonly store = inject(FlowDocumentStore);\n private readonly session = inject(FlowEditorSession);\n\n readonly closed = output<void>();\n /** Chiede all'host di evidenziare l'elemento corrente dell'esecuzione. */\n readonly elementFocused = output<string>();\n\n readonly result = signal<FlowInterviewResult | null>(null);\n readonly isRunning = signal(false);\n readonly errorMessage = signal<string | null>(null);\n readonly debugEnabled = signal(true);\n\n /** I valori che l'utente compila nel piccolo form generato dalle variabili di input. */\n readonly inputValues = signal<Record<string, string>>({});\n /** I valori raccolti per lo screen corrente, per nome di `outputParameters`. */\n readonly screenOutputs = signal<Record<string, string>>({});\n\n /** Le variabili `isInput` del flow: il contratto verso chi lo invoca (§4.6). */\n readonly inputVariables = computed<FlowVariable[]>(\n () => this.store.document().variables?.filter((variable) => variable.isInput) ?? [],\n );\n\n readonly canRun = computed(() => !this.session.isNew() && !this.isRunning());\n\n readonly status = computed(() => this.result()?.status ?? null);\n readonly pendingScreen = computed(() => this.result()?.pendingScreen ?? null);\n readonly isWaitingForScreen = computed(() => this.status() === 'WaitingForScreen');\n\n readonly trace = computed(() => this.result()?.trace ?? []);\n\n /** Le risorse come righe ordinate: il tipo dichiarato vince in lettura (§6.5). */\n readonly resourceRows = computed<Array<{ name: string; type: string; value: string }>>(() => {\n const resources = this.result()?.resources ?? {};\n return Object.entries(resources)\n .map(([name, typed]) => ({\n name,\n type: typed?.type ?? '',\n value: DebugPanelComponent.render(typed),\n }))\n .sort((left, right) => left.name.localeCompare(right.name));\n });\n\n readonly outputRows = computed<Array<{ name: string; type: string; value: string }>>(() => {\n const outputs = this.result()?.outputs ?? {};\n return Object.entries(outputs).map(([name, typed]) => ({\n name,\n type: typed?.type ?? '',\n value: DebugPanelComponent.render(typed),\n }));\n });\n\n /** Gli input che lo screen corrente riceve, per mostrarli accanto al form generico. */\n readonly screenInputRows = computed<Array<{ name: string; type: string; value: string }>>(() => {\n const inputs = this.pendingScreen()?.inputs ?? {};\n return Object.entries(inputs).map(([name, typed]) => ({\n name,\n type: typed?.type ?? '',\n value: DebugPanelComponent.render(typed),\n }));\n });\n\n /** I nomi degli output dichiarati dallo screen, per generare i campi da compilare. */\n readonly screenOutputNames = computed<string[]>(() => {\n const elementName = this.pendingScreen()?.elementName;\n if (!elementName) {\n return [];\n }\n const screen = this.store.document().screens?.find((candidate) => candidate.name === elementName);\n return (screen?.outputParameters ?? []).map((parameter) => parameter.name ?? '').filter(Boolean);\n });\n\n private static render(typed: FlowTypedValue | undefined): string {\n if (!typed || typed.value === undefined || typed.value === null) {\n return '—';\n }\n if (typeof typed.value === 'object') {\n return JSON.stringify(typed.value);\n }\n return String(typed.value);\n }\n\n setDebugEnabled(value: boolean): void {\n this.debugEnabled.set(value);\n }\n\n setInputValue(name: string, value: string): void {\n this.inputValues.update((values) => ({ ...values, [name]: value }));\n }\n\n setScreenOutput(name: string, value: string): void {\n this.screenOutputs.update((values) => ({ ...values, [name]: value }));\n }\n\n /** Converte i valori del form nel tipo dichiarato dalla variabile. */\n private coerceInputs(): Record<string, unknown> {\n const values = this.inputValues();\n const result: Record<string, unknown> = {};\n for (const variable of this.inputVariables()) {\n const name = variable.name;\n if (!name) {\n continue;\n }\n const raw = values[name];\n if (raw === undefined || raw === '') {\n continue;\n }\n switch (variable.dataType) {\n case 'Integer': {\n const parsed = Number.parseInt(raw, 10);\n if (!Number.isNaN(parsed)) {\n result[name] = parsed;\n }\n break;\n }\n case 'Number': {\n const parsed = Number.parseFloat(raw);\n if (!Number.isNaN(parsed)) {\n result[name] = parsed;\n }\n break;\n }\n case 'Boolean':\n result[name] = raw === 'true';\n break;\n default:\n result[name] = raw;\n }\n }\n return result;\n }\n\n async start(): Promise<void> {\n const flowName = this.session.flowName();\n if (!flowName) {\n this.errorMessage.set('Salva il flow prima di provarlo.');\n return;\n }\n this.isRunning.set(true);\n this.errorMessage.set(null);\n this.screenOutputs.set({});\n try {\n const result = await this.api.startInterview({\n flowName,\n version: this.session.version() ?? undefined,\n inputs: this.coerceInputs(),\n debug: this.debugEnabled(),\n });\n this.apply(result);\n } catch (error) {\n this.handleError(error);\n } finally {\n this.isRunning.set(false);\n }\n }\n\n async respond(navigation: FlowScreenNavigation): Promise<void> {\n const current = this.result();\n // Opaco: si rimanda tale e quale, senza leggerlo.\n const token = current?.continuationToken;\n if (!token) {\n return;\n }\n this.isRunning.set(true);\n this.errorMessage.set(null);\n try {\n const result = await this.api.respondToScreen({\n continuationToken: token,\n screenElementName: current?.pendingScreen?.elementName,\n navigation,\n // Con `Previous` e `Pause` il motore non memorizza gli output: si mandano comunque,\n // ma il pannello avverte che non sono definitivi.\n outputs: this.screenOutputs(),\n debug: this.debugEnabled(),\n });\n this.screenOutputs.set({});\n this.apply(result);\n } catch (error) {\n this.handleError(error);\n } finally {\n this.isRunning.set(false);\n }\n }\n\n private apply(result: FlowInterviewResult): void {\n this.result.set(result);\n if (result.currentElementName) {\n this.elementFocused.emit(result.currentElementName);\n }\n }\n\n private handleError(error: unknown): void {\n if (FlowApiError.is(error)) {\n // `InvalidToken` significa che la sessione di prova non e' piu' valida: si riavvia.\n this.errorMessage.set(error.message);\n return;\n }\n this.errorMessage.set(error instanceof Error ? error.message : String(error));\n }\n\n reset(): void {\n this.result.set(null);\n this.errorMessage.set(null);\n this.screenOutputs.set({});\n }\n\n close(): void {\n this.closed.emit();\n }\n\n /** L'etichetta dello stato, che non e' un errore anche quando dice \"Failed\" (§6.5). */\n statusLabel(): string {\n switch (this.status()) {\n case 'Completed':\n return 'Completata';\n case 'WaitingForScreen':\n return 'In attesa di un form';\n case 'Paused':\n return 'In pausa';\n case 'Suspended':\n return 'Sospesa';\n case 'Failed':\n return 'Fallita';\n case 'NotStarted':\n return 'Non avviata';\n default:\n return '';\n }\n }\n\n statusNote(): string | null {\n switch (this.status()) {\n case 'Failed':\n return 'Il flow e’ fallito: la richiesta e’ andata a buon fine, l’esecuzione no.';\n case 'NotStarted':\n return 'I criteri dello Start non erano soddisfatti: non e’ un errore.';\n case 'Paused':\n case 'Suspended':\n return 'L’esecuzione e’ sospesa: puo’ essere ripresa dalla sua chiave.';\n default:\n return null;\n }\n }\n\n canGoBack(): boolean {\n return this.pendingScreen()?.canGoBack === true;\n }\n\n canFinish(): boolean {\n return this.pendingScreen()?.canFinish === true;\n }\n\n canPause(): boolean {\n return this.pendingScreen()?.canPause === true;\n }\n}\n","<header class=\"fb-dbg__header\">\n <h2 class=\"fb-dbg__title\">Prova</h2>\n <button type=\"button\" class=\"fb-btn fb-btn--ghost fb-btn--icon\" aria-label=\"Chiudi\" (click)=\"close()\">×</button>\n</header>\n\n<div class=\"fb-dbg__body\">\n @if (errorMessage()) {\n <p class=\"fb-callout fb-callout--error\">{{ errorMessage() }}</p>\n }\n\n @if (!result()) {\n <fieldset class=\"fb-section\">\n <legend class=\"fb-section__title\">Valori iniziali</legend>\n @if (inputVariables().length) {\n @for (variable of inputVariables(); track variable.name) {\n <div class=\"fb-field\">\n <label class=\"fb-field__label\">\n {{ variable.name }}\n <span class=\"fb-dbg__type\">{{ variable.dataType }}{{ variable.isCollection ? '[]' : '' }}</span>\n </label>\n @if (variable.dataType === 'Boolean') {\n <select class=\"fb-select\" (change)=\"setInputValue(variable.name!, $any($event.target).value)\">\n <option value=\"\">—</option>\n <option value=\"true\">vero</option>\n <option value=\"false\">falso</option>\n </select>\n } @else {\n <input\n class=\"fb-input\"\n [type]=\"variable.dataType === 'Number' || variable.dataType === 'Integer' ? 'number' : 'text'\"\n (input)=\"setInputValue(variable.name!, $any($event.target).value)\"\n />\n }\n </div>\n }\n } @else {\n <p class=\"fb-field__hint\">Il flow non dichiara variabili di input.</p>\n }\n </fieldset>\n\n <label class=\"fb-check\">\n <input\n type=\"checkbox\"\n [checked]=\"debugEnabled()\"\n (change)=\"setDebugEnabled($any($event.target).checked)\"\n />\n Traccia di debug\n </label>\n @if (debugEnabled()) {\n <p class=\"fb-callout fb-callout--warn\">\n La traccia riporta i valori di <strong>tutte</strong> le risorse, dati personali compresi: non usarla\n su dati reali.\n </p>\n }\n\n <button type=\"button\" class=\"fb-btn fb-btn--primary\" [disabled]=\"!canRun()\" (click)=\"start()\">\n Avvia\n </button>\n @if (!canRun() && !isRunning()) {\n <p class=\"fb-field__hint\">Salva il flow prima di provarlo.</p>\n }\n }\n\n @if (result()) {\n <div class=\"fb-dbg__status\">\n <span\n class=\"fb-dbg__badge\"\n [class.fb-dbg__badge--ok]=\"status() === 'Completed'\"\n [class.fb-dbg__badge--fail]=\"status() === 'Failed'\"\n [class.fb-dbg__badge--wait]=\"isWaitingForScreen()\"\n >\n {{ statusLabel() }}\n </span>\n @if (result()?.currentElementName) {\n <span class=\"fb-dbg__current\">su {{ result()?.currentElementName }}</span>\n }\n <span class=\"fb-dbg__steps\">{{ result()?.steps || 0 }} passi</span>\n <span class=\"fb-list__spacer\"></span>\n <button type=\"button\" class=\"fb-btn fb-btn--ghost fb-btn--icon\" (click)=\"reset()\">Riavvia</button>\n </div>\n\n @if (statusNote()) {\n <p class=\"fb-callout\">{{ statusNote() }}</p>\n }\n\n @if (result()?.fault) {\n <p class=\"fb-callout fb-callout--error\">{{ result()?.fault }}</p>\n }\n @for (message of result()?.errors || []; track message) {\n <p class=\"fb-callout fb-callout--error\">{{ message }}</p>\n }\n\n @if (isWaitingForScreen() && pendingScreen()) {\n <fieldset class=\"fb-section\">\n <legend class=\"fb-section__title\">\n Form «{{ pendingScreen()?.formName }}»\n </legend>\n <p class=\"fb-section__note\">\n Nell’editor basta un form generico: qui vedi i valori che il form riceve e puoi compilare quelli\n che dichiara di restituire.\n </p>\n\n @if (pendingScreen()?.label) {\n <p class=\"fb-dbg__screen-label\">{{ pendingScreen()?.label }}</p>\n }\n @if (pendingScreen()?.helpText) {\n <p class=\"fb-field__hint\">{{ pendingScreen()?.helpText }}</p>\n }\n\n @if (screenInputRows().length) {\n <table class=\"fb-dbg__table\">\n <caption>\n Valori in ingresso\n </caption>\n <tbody>\n @for (row of screenInputRows(); track row.name) {\n <tr>\n <th scope=\"row\">{{ row.name }}</th>\n <td class=\"fb-dbg__type\">{{ row.type }}</td>\n <td>{{ row.value }}</td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n @for (output of screenOutputNames(); track output) {\n <div class=\"fb-field\">\n <label class=\"fb-field__label\">{{ output }}</label>\n <input class=\"fb-input\" (input)=\"setScreenOutput(output, $any($event.target).value)\" />\n </div>\n }\n @if (!screenOutputNames().length) {\n <p class=\"fb-field__hint\">Lo screen non dichiara parametri di uscita.</p>\n }\n\n <div class=\"fb-field__row\">\n <button\n type=\"button\"\n class=\"fb-btn fb-btn--primary\"\n [disabled]=\"isRunning()\"\n (click)=\"respond('Next')\"\n >\n Avanti\n </button>\n <!-- canGoBack/canFinish/canPause sono la verita', piu' precisa dei flag del metadata. -->\n <button\n type=\"button\"\n class=\"fb-btn\"\n [disabled]=\"isRunning() || !canGoBack()\"\n title=\"Con «indietro» gli output non vengono memorizzati\"\n (click)=\"respond('Previous')\"\n >\n Indietro\n </button>\n <button type=\"button\" class=\"fb-btn\" [disabled]=\"isRunning() || !canFinish()\" (click)=\"respond('Finish')\">\n Fine\n </button>\n <button\n type=\"button\"\n class=\"fb-btn\"\n [disabled]=\"isRunning() || !canPause()\"\n title=\"Con «pausa» gli output non vengono memorizzati\"\n (click)=\"respond('Pause')\"\n >\n Pausa\n </button>\n </div>\n <p class=\"fb-field__hint\">\n Con «indietro» e «pausa» i valori inseriti <strong>non</strong> vengono memorizzati.\n </p>\n </fieldset>\n }\n\n @if (outputRows().length) {\n <fieldset class=\"fb-section\">\n <legend class=\"fb-section__title\">Output del flow</legend>\n <table class=\"fb-dbg__table\">\n <tbody>\n @for (row of outputRows(); track row.name) {\n <tr>\n <th scope=\"row\">{{ row.name }}</th>\n <td class=\"fb-dbg__type\">{{ row.type }}</td>\n <td>{{ row.value }}</td>\n </tr>\n }\n </tbody>\n </table>\n </fieldset>\n }\n\n @if (trace().length) {\n <fieldset class=\"fb-section\">\n <legend class=\"fb-section__title\">Traccia</legend>\n <ol class=\"fb-dbg__trace\">\n @for (entry of trace(); track entry.sequence) {\n <li class=\"fb-dbg__trace-item\">\n <span class=\"fb-dbg__trace-seq\">{{ entry.sequence }}</span>\n @if (entry.elementName) {\n <button type=\"button\" class=\"fb-dbg__trace-el\" (click)=\"elementFocused.emit(entry.elementName!)\">\n {{ entry.elementName }}\n </button>\n }\n <span class=\"fb-dbg__trace-msg\">{{ entry.message }}</span>\n </li>\n }\n </ol>\n </fieldset>\n }\n\n @if (resourceRows().length) {\n <fieldset class=\"fb-section\">\n <legend class=\"fb-section__title\">Risorse</legend>\n <table class=\"fb-dbg__table\">\n <tbody>\n @for (row of resourceRows(); track row.name) {\n <tr>\n <th scope=\"row\">{{ row.name }}</th>\n <td class=\"fb-dbg__type\">{{ row.type }}</td>\n <td>{{ row.value }}</td>\n </tr>\n }\n </tbody>\n </table>\n </fieldset>\n }\n\n @if (result()?.interviewKey) {\n <p class=\"fb-field__hint\">\n Chiave dell’esecuzione sospesa: <code>{{ result()?.interviewKey }}</code>\n </p>\n }\n }\n</div>\n","/**\r\n * Il builder: il componente standalone da innestare nell'applicazione ospite.\r\n *\r\n * Uso minimo:\r\n *\r\n * ```html\r\n * <fb-flow-builder [flowName]=\"'ApprovazioneOrdine'\" [author]=\"utente\" />\r\n * ```\r\n *\r\n * L'unica dipendenza da fornire e' {@link FlowBuilderApi}: tutto il traffico da e verso il\r\n * backend passa da lì.\r\n *\r\n * ```ts\r\n * providers: [{ provide: FlowBuilderApi, useClass: HttpFlowBuilderApi }]\r\n * ```\r\n *\r\n * Gli store del documento e della sessione sono provider **del componente**, non della\r\n * radice: due builder sulla stessa pagina editano due flow indipendenti.\r\n *\r\n * Il ciclo di lavoro della §11 e' implementato qui: carica, disegna, valida su pausa di\r\n * digitazione, salva con `expectedUpdatedAt`, aggiorna `updatedAt` dalla risposta.\r\n */\r\n\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\n\r\nimport { FlowBuilderApi } from '../api/flow-builder-api';\r\nimport { FlowCatalogStore, FlowDictionaryStore } from '../core/flow-dictionary.store';\r\nimport { FlowDocumentStore } from '../core/flow-document.store';\r\nimport { FlowEditorSession } from '../core/flow-editor-session';\r\nimport { FlowLayoutService } from '../core/flow-layout.service';\r\nimport { FlowValidationStore } from '../core/flow-validation.store';\r\nimport { START_NODE_NAME, outletsOf } from '../core/element-outlets';\r\nimport { uniqueFlowName } from '../core/flow-name.util';\r\nimport { FlowOutline, FlowSaveResult } from '../model/api.model';\r\nimport { FlowApiError } from '../model/error.model';\r\nimport { FlowAnyNode, FlowDefinition, FlowElementType } from '../model/flow.model';\r\nimport { DebugPanelComponent } from './debug/debug-panel.component';\r\nimport { ElementDialogComponent } from './inspector/element-dialog.component';\r\nimport { ElementInspectorComponent } from './inspector/element-inspector.component';\r\nimport { ElementPaletteComponent } from './palette/element-palette.component';\r\nimport { ProblemsPanelComponent } from './problems/problems-panel.component';\r\nimport { ResourcePanelComponent } from './resources/resource-panel.component';\r\nimport { VersionPanelComponent } from './versions/version-panel.component';\r\nimport { FLOW_NODE_HEIGHT, FlowCanvasComponent, flowNodeWidth } from './canvas/flow-canvas.component';\r\nimport { SelectValueDirective } from './shared/select-value.directive';\r\n\r\ntype SidePanel = 'inspector' | 'resources' | 'versions' | 'debug';\r\n\r\ninterface Notice {\r\n kind: 'info' | 'error';\r\n message: string;\r\n}\r\n\r\n@Component({\r\n selector: 'fb-flow-builder',\r\n standalone: true,\r\n imports: [DebugPanelComponent,\r\n ElementDialogComponent,\r\n ElementInspectorComponent,\r\n ElementPaletteComponent,\r\n FlowCanvasComponent,\r\n ProblemsPanelComponent,\r\n ResourcePanelComponent,\r\n VersionPanelComponent, SelectValueDirective],\r\n // Gli store sono per-istanza: due builder editano due documenti indipendenti.\r\n providers: [\r\n FlowDocumentStore,\r\n FlowDictionaryStore,\r\n FlowCatalogStore,\r\n FlowValidationStore,\r\n FlowEditorSession,\r\n FlowLayoutService,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './flow-builder.component.html',\r\n styleUrl: './flow-builder.component.css',\r\n})\r\nexport class FlowBuilderComponent {\r\n private readonly api = inject(FlowBuilderApi);\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n protected readonly store = inject(FlowDocumentStore);\r\n protected readonly dictionaries = inject(FlowDictionaryStore);\r\n protected readonly session = inject(FlowEditorSession);\r\n protected readonly validation = inject(FlowValidationStore);\r\n private readonly layout = inject(FlowLayoutService);\r\n\r\n /** Il flow da aprire. Assente → si parte da un flow nuovo. */\r\n readonly flowName = input<string | null>(null);\r\n /** La versione da aprire; assente → l'attiva se c'e', altrimenti l'ultima (§6.1). */\r\n readonly version = input<number | null>(null);\r\n /** Registrato sulla versione e mostrato nell'elenco (§6.2). */\r\n readonly author = input<string | undefined>(undefined);\r\n /** `processType` iniziale di un flow nuovo. */\r\n readonly defaultProcessType = input<string>('Screen');\r\n\r\n /**\r\n * Dove si configura l'elemento selezionato.\r\n *\r\n * `dialog` (predefinito) apre il form in una finestra sopra il canvas, come il flow builder\r\n * di Salesforce: i form degli elementi sono grandi e in una colonna da 340px si scorreva\r\n * troppo. `panel` tiene il form nel pannello laterale, che e' piu' comodo quando si\r\n * modificano molti elementi di fila perche' non c'e' niente da aprire e chiudere.\r\n */\r\n readonly inspectorMode = input<'dialog' | 'panel'>('dialog');\r\n\r\n readonly saved = output<FlowSaveResult>();\r\n readonly activated = output<FlowSaveResult>();\r\n readonly closeRequested = output<void>();\r\n\r\n readonly selectedName = signal<string | null>(START_NODE_NAME);\r\n readonly activePanel = signal<SidePanel>('inspector');\r\n /** La dialog del dettaglio e' aperta. Vale solo con `inspectorMode = 'dialog'`. */\r\n readonly isDialogOpen = signal(false);\r\n readonly showProblems = signal(true);\r\n readonly notice = signal<Notice | null>(null);\r\n readonly outline = signal<FlowOutline | null>(null);\r\n readonly isLoading = signal(false);\r\n\r\n /** Il documento e' cambiato: usato per riscadenzare validazione e outline. */\r\n private lastDocument?: FlowDefinition;\r\n private outlineTimer?: ReturnType<typeof setTimeout>;\r\n\r\n readonly isDialogMode = computed(() => this.inspectorMode() === 'dialog');\r\n\r\n /**\r\n * Il pannello effettivamente mostrato a lato. Con la dialog il tab «Elemento» non esiste:\r\n * avere lo stesso form in due posti confonde su quale dei due sia quello vero.\r\n */\r\n readonly sidePanel = computed<SidePanel>(() => {\r\n const panel = this.activePanel();\r\n return this.isDialogMode() && panel === 'inspector' ? 'resources' : panel;\r\n });\r\n\r\n readonly document = computed(() => this.store.document());\r\n readonly isDirty = computed(() => this.store.isDirty());\r\n readonly canUndo = computed(() => this.store.canUndo());\r\n readonly canRedo = computed(() => this.store.canRedo());\r\n readonly primaryCommand = computed(() => this.session.primaryCommand());\r\n readonly isEditable = computed(() => this.session.isEditable());\r\n readonly conflict = computed(() => this.session.conflict());\r\n readonly errorCount = computed(() => this.validation.errorCount());\r\n readonly warningCount = computed(() => this.validation.warningCount());\r\n readonly canActivate = computed(() => this.session.canActivate());\r\n readonly isBusy = computed(() => this.session.isBusy() || this.isLoading());\r\n\r\n readonly statusLabel = computed(() => {\r\n const summary = this.session.currentVersionSummary();\r\n if (!summary) {\r\n return 'Nuovo';\r\n }\r\n switch (summary.status) {\r\n case 'Draft':\r\n return 'Bozza';\r\n case 'InvalidDraft':\r\n return 'Bozza con errori';\r\n case 'UnderReview':\r\n return 'In approvazione';\r\n case 'Active':\r\n return 'Attiva';\r\n case 'Obsolete':\r\n return 'Superata';\r\n default:\r\n return summary.status ?? '';\r\n }\r\n });\r\n\r\n constructor() {\r\n // I dizionari sono statici: una volta sola, in cache (§6.4).\r\n void this.dictionaries.load();\r\n\r\n effect(() => {\r\n this.session.setAuthor(this.author());\r\n });\r\n\r\n // Apertura: reagisce ai parametri di ingresso.\r\n effect(() => {\r\n const flowName = this.flowName();\r\n const version = this.version();\r\n void this.openOrCreate(flowName, version);\r\n });\r\n\r\n /**\r\n * §11 — a ogni modifica: validazione su pausa di digitazione, e outline rilanciato per\r\n * riflettere archi e raggiungibilita' autorevoli. L'outline e' debounced insieme alla\r\n * validazione: il canvas nel frattempo usa il calcolo locale, così il disegno non\r\n * dipende dalla latenza.\r\n */\r\n effect(() => {\r\n const document = this.store.document();\r\n if (document === this.lastDocument) {\r\n return;\r\n }\r\n this.lastDocument = document;\r\n this.validation.schedule(document);\r\n this.scheduleOutline(document);\r\n });\r\n\r\n this.destroyRef.onDestroy(() => {\r\n if (this.outlineTimer) {\r\n clearTimeout(this.outlineTimer);\r\n }\r\n });\r\n }\r\n\r\n private async openOrCreate(flowName: string | null, version: number | null): Promise<void> {\r\n this.isLoading.set(true);\r\n this.notice.set(null);\r\n // Si sta cambiando documento: una dialog aperta guarderebbe un elemento di un altro flow.\r\n this.isDialogOpen.set(false);\r\n try {\r\n if (flowName) {\r\n await this.session.open(flowName, version ?? undefined);\r\n } else {\r\n // Un flow appena creato ha errori — manca il primo node — ed e' normale (§11).\r\n this.session.startNew('', '', this.defaultProcessType());\r\n }\r\n this.selectedName.set(START_NODE_NAME);\r\n } catch (error) {\r\n this.showError(error);\r\n } finally {\r\n this.isLoading.set(false);\r\n }\r\n }\r\n\r\n private scheduleOutline(definition: FlowDefinition): void {\r\n if (this.outlineTimer) {\r\n clearTimeout(this.outlineTimer);\r\n }\r\n this.outlineTimer = setTimeout(() => {\r\n this.outlineTimer = undefined;\r\n void this.api\r\n .getOutline(definition)\r\n .then((outline) => this.outline.set(outline))\r\n // L'outline e' un arricchimento: senza, il canvas usa il calcolo locale.\r\n .catch(() => this.outline.set(null));\r\n }, 500);\r\n }\r\n\r\n // -------------------------------------------------------------------------\r\n // Intestazione del documento\r\n // -------------------------------------------------------------------------\r\n\r\n setLabel(value: string): void {\r\n this.store.updateHeader((definition) => {\r\n definition.label = value || undefined;\r\n });\r\n }\r\n\r\n setFullName(value: string): void {\r\n // `fullName` nel documento non rinomina il flow: la rinomina passa da `flowName` nella\r\n // richiesta di salvataggio (§2, §6.2). Qui si scrive il documento; al salvataggio si\r\n // manda anche `flowName`, ed e' quello a vincere.\r\n this.store.updateHeader((definition) => {\r\n definition.fullName = value || undefined;\r\n });\r\n }\r\n\r\n setDescription(value: string): void {\r\n this.store.updateHeader((definition) => {\r\n definition.description = value || undefined;\r\n });\r\n }\r\n\r\n setInterviewLabel(value: string): void {\r\n this.store.updateHeader((definition) => {\r\n definition.interviewLabel = value || undefined;\r\n });\r\n }\r\n\r\n setProcessType(value: string): void {\r\n this.store.updateHeader((definition) => {\r\n definition.processType = value;\r\n });\r\n }\r\n\r\n readonly processTypes = computed(() => this.dictionaries.processTypes());\r\n\r\n /** `AutoLaunched` + screen e' un errore di validazione: si segnala subito (§13.6). */\r\n readonly hasScreensInAutoLaunched = computed(\r\n () =>\r\n this.store.document().processType === 'AutoLaunched' &&\r\n (this.store.document().screens?.length ?? 0) > 0,\r\n );\r\n\r\n /** Un flow `Screen` senza screen e' `SCREEN_FLOW_WITHOUT_SCREENS`. */\r\n readonly hasNoScreensInScreenFlow = computed(\r\n () =>\r\n this.store.document().processType === 'Screen' && (this.store.document().screens?.length ?? 0) === 0,\r\n );\r\n\r\n /** `Orchestration` non e' eseguibile dal motore. */\r\n readonly isOrchestration = computed(() => this.store.document().processType === 'Orchestration');\r\n\r\n // -------------------------------------------------------------------------\r\n // Canvas\r\n // -------------------------------------------------------------------------\r\n\r\n /**\r\n * Click singolo sul canvas: seleziona. Con la dialog il form **non** si apre qui: un click\r\n * capita anche solo per spostare un node, e una finestra che si apre a ogni click sarebbe\r\n * insopportabile. Nel pannello laterale, invece, mostrare subito il form non costa nulla.\r\n */\r\n onSelectionChange(name: string | null): void {\r\n this.selectedName.set(name);\r\n if (name && !this.isDialogMode()) {\r\n this.activePanel.set('inspector');\r\n }\r\n }\r\n\r\n /** Doppio click o bottone «✎» sul node: qui il dettaglio si apre. */\r\n onNodeOpened(name: string): void {\r\n this.openElement(name);\r\n }\r\n\r\n /** Porta l'utente sull'elemento **e** ne apre il form: e' l'ancora dei problemi (§7). */\r\n focusElement(name: string): void {\r\n this.openElement(name);\r\n }\r\n\r\n /** Apre il dettaglio dell'elemento, nella dialog o nel pannello secondo la modalita'. */\r\n openElement(name: string): void {\r\n this.selectedName.set(name);\r\n if (this.isDialogMode()) {\r\n this.isDialogOpen.set(true);\r\n return;\r\n }\r\n this.activePanel.set('inspector');\r\n }\r\n\r\n /** Il comando della top bar: apre il dettaglio di cio' che e' selezionato. */\r\n openSelectedElement(): void {\r\n const name = this.selectedName();\r\n if (name) {\r\n this.openElement(name);\r\n }\r\n }\r\n\r\n closeDialog(): void {\r\n this.isDialogOpen.set(false);\r\n }\r\n\r\n /**\r\n * Evidenzia l'elemento sul canvas senza cambiare pannello.\r\n * Serve durante la prova: l'esecuzione segnala su quale elemento e' ferma, ma sostituire\r\n * il pannello con l'inspector farebbe sparire il form da compilare a metà interview.\r\n */\r\n highlightElement(name: string): void {\r\n this.selectedName.set(name);\r\n }\r\n\r\n /** Rilascio dalla palette: il punto di rilascio diventa `locationX`/`locationY` (§11). */\r\n onElementDropped(event: { type: FlowElementType; x: number; y: number }): void {\r\n this.createElement(event.type, event.x, event.y);\r\n }\r\n\r\n /** Click sulla palette: l'elemento si posiziona in una zona libera. */\r\n onElementPicked(type: FlowElementType): void {\r\n const nodes = this.store.nodes();\r\n const lowest = nodes.reduce((max, reference) => Math.max(max, reference.node.locationY ?? 0), 60);\r\n this.createElement(type, 60, lowest + 120);\r\n }\r\n\r\n private createElement(type: FlowElementType, x: number, y: number): void {\r\n const collection = this.dictionaries.collectionOf(type);\r\n if (!collection) {\r\n this.notice.set({ kind: 'error', message: `Tipo di elemento non riconosciuto: ${type}.` });\r\n return;\r\n }\r\n const label = this.dictionaries.labelOf(type);\r\n // Il nome si genera dalla label e si verifica contro node **e** risorse (§3.3, §11).\r\n const name = uniqueFlowName(label, this.store.usedNames());\r\n const node: FlowAnyNode = {\r\n name,\r\n label,\r\n locationX: Math.round(x),\r\n locationY: Math.round(y),\r\n };\r\n // Default che rendono l'elemento sensato appena creato, senza inventare configurazione.\r\n if (type === 'RecordLookup' || type === 'RecordCreate') {\r\n node['storeOutputAutomatically'] = true;\r\n }\r\n if (type === 'CollectionProcessor') {\r\n node['collectionProcessorType'] = 'Sort';\r\n }\r\n if (type === 'Decision') {\r\n node['rules'] = [\r\n { name: 'Regola', label: 'Regola 1', conditionLogic: 'and', conditions: [{ operator: 'EqualTo' }] },\r\n ];\r\n }\r\n if (type === 'CustomError') {\r\n node['customErrorMessages'] = [{ errorMessage: '' }];\r\n }\r\n if (type === 'Wait') {\r\n node['waitEvents'] = [{ name: 'Evento', label: 'Evento 1' }];\r\n }\r\n this.store.addNode(collection, node);\r\n // Un elemento appena creato e' vuoto: il posto giusto in cui finire e' il suo form.\r\n this.openElement(name);\r\n }\r\n\r\n onRemoveNode(name: string): void {\r\n // Rimuove anche i connector che lo referenziavano: un target orfano bloccherebbe\r\n // l'attivazione con CONNECTOR_TARGET_UNKNOWN.\r\n this.store.removeNode(name);\r\n if (this.selectedName() === name) {\r\n this.selectedName.set(START_NODE_NAME);\r\n // L'elemento non c'e' piu': una dialog aperta sul vuoto non ha senso.\r\n this.isDialogOpen.set(false);\r\n }\r\n }\r\n\r\n onDuplicateNode(name: string): void {\r\n const newName = uniqueFlowName(`${name}_copia`, this.store.usedNames());\r\n this.store.duplicateNode(name, newName);\r\n this.selectedName.set(newName);\r\n }\r\n\r\n /** Riordina il grafo e **scrive** le coordinate nel documento (§3.5). */\r\n autoLayout(): void {\r\n // La larghezza dipende dal numero di rami, perche' le uscite stanno in fila sul bordo\r\n // inferiore: passare a dagre una larghezza fissa lascerebbe i node larghi sovrapposti.\r\n const nodes = [\r\n {\r\n name: START_NODE_NAME,\r\n width: flowNodeWidth(outletsOf('Start', this.store.start() as FlowAnyNode).length),\r\n height: FLOW_NODE_HEIGHT,\r\n },\r\n ...this.store.nodes().map((reference) => ({\r\n name: reference.name,\r\n width: flowNodeWidth(outletsOf(reference.type, reference.node).length),\r\n height: FLOW_NODE_HEIGHT,\r\n })),\r\n ];\r\n const result = this.layout.layout(nodes, this.store.edges(), { direction: 'TB' });\r\n if (!result.positions.size) {\r\n return;\r\n }\r\n let first = true;\r\n for (const [name, position] of result.positions) {\r\n this.store.moveNode(name, position.x, position.y, { silent: !first });\r\n first = false;\r\n }\r\n }\r\n\r\n undo(): void {\r\n this.store.undo();\r\n }\r\n\r\n redo(): void {\r\n this.store.redo();\r\n }\r\n\r\n // -------------------------------------------------------------------------\r\n // Salvataggio e ciclo di vita\r\n // -------------------------------------------------------------------------\r\n\r\n async save(): Promise<void> {\r\n const definition = this.store.document();\r\n if (!definition.fullName) {\r\n this.notice.set({ kind: 'error', message: 'Dai un nome tecnico al flow prima di salvare.' });\r\n return;\r\n }\r\n try {\r\n const result = await this.session.save({ flowName: definition.fullName });\r\n this.saved.emit(result);\r\n // Il salvataggio riesce anche con errori: l'esito sano si legge in `validation` (§6.2).\r\n const errors = result.validation?.errorCount ?? 0;\r\n this.notice.set({\r\n kind: 'info',\r\n message: errors\r\n ? `Salvato come versione ${result.version}, con ${errors} ${errors === 1 ? 'errore' : 'errori'} da correggere.`\r\n : `Salvato come versione ${result.version}.`,\r\n });\r\n } catch (error) {\r\n this.showError(error);\r\n }\r\n }\r\n\r\n async createNewVersion(): Promise<void> {\r\n try {\r\n const result = await this.session.createNewVersion();\r\n this.notice.set({ kind: 'info', message: `Creata la versione ${result.version}.` });\r\n } catch (error) {\r\n this.showError(error);\r\n }\r\n }\r\n\r\n async activate(): Promise<void> {\r\n try {\r\n const result = await this.session.activate();\r\n this.activated.emit(result);\r\n this.notice.set({ kind: 'info', message: `Versione ${result.version} attivata.` });\r\n } catch (error) {\r\n // Con `ValidationFailed` il payload porta l'elenco: si apre il pannello (§11).\r\n if (FlowApiError.is(error) && error.category === 'ValidationFailed') {\r\n this.showProblems.set(true);\r\n }\r\n this.showError(error);\r\n }\r\n }\r\n\r\n /** §9.3 — prima opzione davanti a un conflitto. */\r\n async reloadAfterConflict(): Promise<void> {\r\n try {\r\n await this.session.reloadAfterConflict();\r\n this.notice.set({ kind: 'info', message: 'Ricaricata la versione salvata da altri.' });\r\n } catch (error) {\r\n this.showError(error);\r\n }\r\n }\r\n\r\n /** §9.3 — seconda opzione: conserva le modifiche locali in una nuova versione. */\r\n async saveAsNewVersionAfterConflict(): Promise<void> {\r\n try {\r\n const result = await this.session.saveAsNewVersionAfterConflict();\r\n this.notice.set({\r\n kind: 'info',\r\n message: `Le tue modifiche sono nella nuova versione ${result.version}.`,\r\n });\r\n } catch (error) {\r\n this.showError(error);\r\n }\r\n }\r\n\r\n dismissConflict(): void {\r\n this.session.dismissConflict();\r\n }\r\n\r\n /** Esporta il documento come JSON indentato, per un salvataggio fuori dal backend. */\r\n exportJson(): string {\r\n return JSON.stringify(this.store.document(), null, 2);\r\n }\r\n\r\n /**\r\n * Importa un documento. Passa da `POST /flows/parse`, che lo normalizza o lo rifiuta con\r\n * `InvalidDefinition`: e' l'unico modo di sapere se il file e' leggibile prima di caricarlo.\r\n */\r\n async importJson(raw: string): Promise<void> {\r\n let parsed: unknown;\r\n try {\r\n parsed = JSON.parse(raw);\r\n } catch {\r\n this.notice.set({ kind: 'error', message: 'Il file non e’ JSON valido.' });\r\n return;\r\n }\r\n try {\r\n const definition = await this.api.parseFlow(parsed);\r\n this.store.load(definition);\r\n this.notice.set({ kind: 'info', message: 'Documento importato.' });\r\n } catch (error) {\r\n if (FlowApiError.is(error) && error.category === 'MissingService') {\r\n // Senza la primitiva si carica il JSON così com'e': la validazione dira' cosa non torna.\r\n this.store.load(parsed as FlowDefinition);\r\n this.notice.set({\r\n kind: 'info',\r\n message: 'Documento importato senza normalizzazione: il backend non espone la primitiva.',\r\n });\r\n return;\r\n }\r\n this.showError(error);\r\n }\r\n }\r\n\r\n onFileSelected(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n const file = input.files?.[0];\r\n if (!file) {\r\n return;\r\n }\r\n void file.text().then((raw) => this.importJson(raw));\r\n input.value = '';\r\n }\r\n\r\n async openVersion(version: number): Promise<void> {\r\n const flowName = this.session.flowName();\r\n if (!flowName) {\r\n return;\r\n }\r\n this.isLoading.set(true);\r\n this.isDialogOpen.set(false);\r\n try {\r\n await this.session.open(flowName, version);\r\n this.selectedName.set(START_NODE_NAME);\r\n } catch (error) {\r\n this.showError(error);\r\n } finally {\r\n this.isLoading.set(false);\r\n }\r\n }\r\n\r\n /** Valida subito, senza attendere la pausa di digitazione. */\r\n async validateNow(): Promise<void> {\r\n await this.validation.run(this.store.document());\r\n this.showProblems.set(true);\r\n }\r\n\r\n setPanel(panel: SidePanel): void {\r\n this.activePanel.set(panel);\r\n }\r\n\r\n toggleProblems(): void {\r\n this.showProblems.update((value) => !value);\r\n }\r\n\r\n showNotice(notice: Notice): void {\r\n this.notice.set(notice);\r\n }\r\n\r\n dismissNotice(): void {\r\n this.notice.set(null);\r\n }\r\n\r\n private showError(error: unknown): void {\r\n if (FlowApiError.is(error)) {\r\n this.notice.set({ kind: 'error', message: error.message });\r\n return;\r\n }\r\n this.notice.set({\r\n kind: 'error',\r\n message: error instanceof Error ? error.message : String(error),\r\n });\r\n }\r\n}\r\n","<div class=\"fb-builder\" [attr.data-fb-theme]=\"null\">\r\n <header class=\"fb-top\">\r\n <div class=\"fb-top__identity\">\r\n <input\r\n class=\"fb-top__label\"\r\n [value]=\"document().label || ''\"\r\n placeholder=\"Nome del flow\"\r\n aria-label=\"Nome del flow\"\r\n [disabled]=\"!isEditable()\"\r\n (input)=\"setLabel($any($event.target).value)\"\r\n />\r\n <div class=\"fb-top__meta\">\r\n <input\r\n class=\"fb-top__name\"\r\n [value]=\"document().fullName || ''\"\r\n placeholder=\"NomeTecnico\"\r\n aria-label=\"Nome tecnico del flow\"\r\n [disabled]=\"!isEditable()\"\r\n (input)=\"setFullName($any($event.target).value)\"\r\n />\r\n <select\r\n class=\"fb-top__process\"\r\n [fbValue]=\"document().processType || ''\"\r\n aria-label=\"Tipo di flow\"\r\n [disabled]=\"!isEditable()\"\r\n (change)=\"setProcessType($any($event.target).value)\"\r\n >\r\n @for (type of processTypes(); track type.value) {\r\n <option [value]=\"type.value\">{{ type.label }}</option>\r\n }\r\n </select>\r\n <span class=\"fb-top__status\">{{ statusLabel() }}</span>\r\n @if (session.version() !== null) {\r\n <span class=\"fb-top__version\">v{{ session.version() }}</span>\r\n }\r\n @if (isDirty()) {\r\n <span class=\"fb-top__dirty\" title=\"Ci sono modifiche non salvate\">modificato</span>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div class=\"fb-top__actions\">\r\n <button type=\"button\" class=\"fb-btn\" [disabled]=\"!canUndo()\" aria-label=\"Annulla\" (click)=\"undo()\">↶</button>\r\n <button type=\"button\" class=\"fb-btn\" [disabled]=\"!canRedo()\" aria-label=\"Ripeti\" (click)=\"redo()\">↷</button>\r\n <button type=\"button\" class=\"fb-btn\" title=\"Ricalcola le posizioni\" (click)=\"autoLayout()\">Riordina</button>\r\n @if (isDialogMode()) {\r\n <!-- Il doppio click sul node fa la stessa cosa, ma non si vede: questo comando sì. -->\r\n <button\r\n type=\"button\"\r\n class=\"fb-btn\"\r\n [disabled]=\"!selectedName()\"\r\n title=\"Apri il dettaglio dell’elemento selezionato\"\r\n (click)=\"openSelectedElement()\"\r\n >\r\n Dettaglio\r\n </button>\r\n }\r\n <button type=\"button\" class=\"fb-btn\" [disabled]=\"isBusy()\" (click)=\"validateNow()\">Valida</button>\r\n\r\n @switch (primaryCommand()) {\r\n @case ('newVersion') {\r\n <!-- Su una versione non modificabile il comando primario e' \"Nuova versione\" (§8.1). -->\r\n <button type=\"button\" class=\"fb-btn fb-btn--primary\" [disabled]=\"isBusy()\" (click)=\"createNewVersion()\">\r\n Nuova versione\r\n </button>\r\n }\r\n @case ('create') {\r\n <button type=\"button\" class=\"fb-btn fb-btn--primary\" [disabled]=\"isBusy()\" (click)=\"save()\">\r\n Crea\r\n </button>\r\n }\r\n @default {\r\n <button type=\"button\" class=\"fb-btn fb-btn--primary\" [disabled]=\"isBusy()\" (click)=\"save()\">\r\n Salva\r\n </button>\r\n }\r\n }\r\n\r\n <button\r\n type=\"button\"\r\n class=\"fb-btn\"\r\n [disabled]=\"isBusy() || !canActivate()\"\r\n [title]=\"\r\n canActivate()\r\n ? 'Attiva questa versione'\r\n : 'L’attivazione esige zero errori: correggili nel pannello dei problemi'\r\n \"\r\n (click)=\"activate()\"\r\n >\r\n Attiva\r\n </button>\r\n </div>\r\n </header>\r\n\r\n @if (conflict()) {\r\n <!-- §9.3: qualcun altro ha salvato. Due strade, entrambe offerte. -->\r\n <div class=\"fb-banner fb-banner--warn\" role=\"alert\">\r\n <span>\r\n {{ conflict()?.message }}\r\n @if (conflict()?.conflictingAuthor) {\r\n Ha salvato {{ conflict()?.conflictingAuthor }}.\r\n }\r\n </span>\r\n <button type=\"button\" class=\"fb-btn fb-btn--icon\" (click)=\"reloadAfterConflict()\">Ricarica</button>\r\n <button type=\"button\" class=\"fb-btn fb-btn--icon\" (click)=\"saveAsNewVersionAfterConflict()\">\r\n Salva come nuova versione\r\n </button>\r\n <button type=\"button\" class=\"fb-btn fb-btn--ghost fb-btn--icon\" (click)=\"dismissConflict()\">×</button>\r\n </div>\r\n }\r\n\r\n @if (notice()) {\r\n <div\r\n class=\"fb-banner\"\r\n [class.fb-banner--error]=\"notice()?.kind === 'error'\"\r\n role=\"status\"\r\n >\r\n <span>{{ notice()?.message }}</span>\r\n <button type=\"button\" class=\"fb-btn fb-btn--ghost fb-btn--icon\" aria-label=\"Chiudi\" (click)=\"dismissNotice()\">\r\n ×\r\n </button>\r\n </div>\r\n }\r\n\r\n @if (hasScreensInAutoLaunched()) {\r\n <div class=\"fb-banner fb-banner--error\">\r\n Un flow AutoLaunched che contiene screen e’ un errore di validazione: non c’e’ nessuno a cui mostrarli.\r\n </div>\r\n }\r\n @if (isOrchestration()) {\r\n <div class=\"fb-banner fb-banner--warn\">Un flow Orchestration non e’ eseguibile dal motore.</div>\r\n }\r\n @if (hasNoScreensInScreenFlow()) {\r\n <div class=\"fb-banner fb-banner--warn\">\r\n Un flow di tipo Screen senza nessuno screen viene segnalato dalla validazione.\r\n </div>\r\n }\r\n @if (!isEditable()) {\r\n <div class=\"fb-banner\">\r\n Questa versione e’ in sola lettura: per modificarla creane una nuova.\r\n </div>\r\n }\r\n\r\n <div class=\"fb-main\">\r\n <aside class=\"fb-main__palette\">\r\n <fb-element-palette [processType]=\"document().processType\" (elementPicked)=\"onElementPicked($event)\" />\r\n </aside>\r\n\r\n <div class=\"fb-main__center\">\r\n <fb-flow-canvas\r\n class=\"fb-main__canvas\"\r\n [selectedName]=\"selectedName()\"\r\n [outline]=\"outline()\"\r\n (selectionChange)=\"onSelectionChange($event)\"\r\n (nodeOpened)=\"onNodeOpened($event)\"\r\n (nodeRemoveRequested)=\"onRemoveNode($event)\"\r\n (nodeDuplicateRequested)=\"onDuplicateNode($event)\"\r\n (elementDropped)=\"onElementDropped($event)\"\r\n />\r\n\r\n @if (showProblems()) {\r\n <fb-problems-panel\r\n class=\"fb-main__problems\"\r\n (elementFocused)=\"focusElement($event)\"\r\n (closed)=\"toggleProblems()\"\r\n />\r\n } @else {\r\n <button type=\"button\" class=\"fb-main__problems-toggle\" (click)=\"toggleProblems()\">\r\n Problemi\r\n @if (errorCount()) {\r\n <span class=\"fb-main__count fb-main__count--error\">{{ errorCount() }}</span>\r\n }\r\n @if (warningCount()) {\r\n <span class=\"fb-main__count fb-main__count--warn\">{{ warningCount() }}</span>\r\n }\r\n </button>\r\n }\r\n </div>\r\n\r\n <aside class=\"fb-main__side\">\r\n <nav class=\"fb-side__tabs\" aria-label=\"Pannelli\">\r\n @if (!isDialogMode()) {\r\n <button\r\n type=\"button\"\r\n class=\"fb-side__tab\"\r\n [class.fb-side__tab--active]=\"sidePanel() === 'inspector'\"\r\n (click)=\"setPanel('inspector')\"\r\n >\r\n Elemento\r\n </button>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"fb-side__tab\"\r\n [class.fb-side__tab--active]=\"sidePanel() === 'resources'\"\r\n (click)=\"setPanel('resources')\"\r\n >\r\n Risorse\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"fb-side__tab\"\r\n [class.fb-side__tab--active]=\"sidePanel() === 'versions'\"\r\n (click)=\"setPanel('versions')\"\r\n >\r\n Versioni\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"fb-side__tab\"\r\n [class.fb-side__tab--active]=\"sidePanel() === 'debug'\"\r\n (click)=\"setPanel('debug')\"\r\n >\r\n Prova\r\n </button>\r\n </nav>\r\n\r\n <div class=\"fb-side__content\">\r\n @switch (sidePanel()) {\r\n @case ('inspector') {\r\n <fb-element-inspector\r\n [selectedName]=\"selectedName()\"\r\n (removeRequested)=\"onRemoveNode($event)\"\r\n (duplicateRequested)=\"onDuplicateNode($event)\"\r\n (closed)=\"setPanel('resources')\"\r\n />\r\n }\r\n @case ('resources') {\r\n <fb-resource-panel (closed)=\"setPanel('inspector')\" />\r\n }\r\n @case ('versions') {\r\n <fb-version-panel\r\n (versionOpened)=\"openVersion($event)\"\r\n (notice)=\"showNotice($event)\"\r\n (closed)=\"setPanel('inspector')\"\r\n />\r\n }\r\n @case ('debug') {\r\n <!-- Evidenzia sul canvas senza rubare il pannello: l'interview e’ in corso. -->\r\n <fb-debug-panel (elementFocused)=\"highlightElement($event)\" (closed)=\"setPanel('inspector')\" />\r\n }\r\n }\r\n </div>\r\n\r\n <footer class=\"fb-side__footer\">\r\n <label class=\"fb-btn fb-btn--icon\">\r\n Importa JSON\r\n <input type=\"file\" accept=\"application/json,.json\" hidden (change)=\"onFileSelected($event)\" />\r\n </label>\r\n </footer>\r\n </aside>\r\n </div>\r\n\r\n @if (isDialogMode() && isDialogOpen() && selectedName()) {\r\n <!-- La dialog sta dentro il builder, non nel body: la libreria e’ innestabile. -->\r\n <fb-element-dialog\r\n [selectedName]=\"selectedName()\"\r\n (closed)=\"closeDialog()\"\r\n (removeRequested)=\"onRemoveNode($event)\"\r\n (duplicateRequested)=\"onDuplicateNode($event)\"\r\n />\r\n }\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["removeConditionInPlace","moveConditionInPlace"],"mappings":"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"}
|