@epistola.app/valtimo-plugin 0.10.0 → 0.11.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/fesm2022/epistola.app-valtimo-plugin.mjs +1931 -228
- package/fesm2022/epistola.app-valtimo-plugin.mjs.map +1 -1
- package/lib/components/check-job-status-configuration/check-job-status-configuration.component.d.ts +2 -2
- package/lib/components/download-document-configuration/download-document-configuration.component.d.ts +2 -2
- package/lib/components/epistola-admin-page/epistola-admin-page.component.d.ts +8 -1
- package/lib/components/epistola-configuration/epistola-configuration.component.d.ts +2 -2
- package/lib/components/epistola-document-preview/epistola-document-preview.component.d.ts +39 -7
- package/lib/components/epistola-document-preview/preview-utils.d.ts +19 -8
- package/lib/components/generate-document-configuration/generate-document-configuration.component.d.ts +4 -2
- package/lib/components/jsonata-editor/jsonata-editor.component.d.ts +11 -3
- package/lib/components/override-builder/legacy-override-converter.d.ts +23 -0
- package/lib/components/override-builder/override-builder.component.d.ts +52 -20
- package/lib/components/override-builder/override-jsonata.d.ts +25 -0
- package/lib/models/admin.d.ts +19 -0
- package/lib/models/config.d.ts +9 -0
- package/lib/services/epistola-admin.service.d.ts +3 -1
- package/lib/services/epistola-plugin.service.d.ts +7 -1
- package/lib/utils/extract-referenced-paths.d.ts +19 -0
- package/lib/utils/jsonata-monaco.d.ts +2 -2
- package/package.json +2 -1
- package/sbom.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"epistola.app-valtimo-plugin.mjs","sources":["../../src/lib/models/async-resource.ts","../../src/lib/services/epistola-admin.service.ts","../../src/lib/services/epistola-menu.service.ts","../../src/lib/services/epistola-plugin.service.ts","../../src/lib/services/prefilled-task-id.ts","../../src/lib/components/epistola-configuration/epistola-configuration.component.ts","../../src/lib/components/epistola-configuration/epistola-configuration.component.html","../../src/lib/utils/jsonata-monaco.ts","../../src/lib/components/jsonata-editor/jsonata-editor.component.ts","../../src/lib/components/expected-structure/expected-structure.component.ts","../../src/lib/components/mapping-builder/builder-field/builder-field.component.ts","../../src/lib/utils/jsonata-converter.ts","../../src/lib/components/mapping-builder/mapping-builder.component.ts","../../src/lib/components/mapping-preview/mapping-preview.component.ts","../../src/lib/components/epistola-document-preview/preview-utils.ts","../../src/lib/components/generate-document-configuration/generate-document-configuration.component.ts","../../src/lib/components/generate-document-configuration/generate-document-configuration.component.html","../../src/lib/components/check-job-status-configuration/check-job-status-configuration.component.ts","../../src/lib/components/check-job-status-configuration/check-job-status-configuration.component.html","../../src/lib/components/download-document-configuration/download-document-config.util.ts","../../src/lib/components/download-document-configuration/download-document-configuration.component.ts","../../src/lib/components/download-document-configuration/download-document-configuration.component.html","../../src/lib/components/epistola-document/epistola-document.component.ts","../../src/lib/components/epistola-retry-form/epistola-retry-form.component.ts","../../src/lib/components/epistola-document-preview/epistola-document-preview.component.ts","../../src/lib/components/epistola-admin-page/epistola-admin-page.component.ts","../../src/lib/components/epistola-admin-page/epistola-admin-page.component.html","../../src/lib/epistola-runtime-config.ts","../../src/lib/epistola-enabled.guard.ts","../../src/lib/epistola-admin-routing.module.ts","../../src/lib/components/epistola-document/epistola-document.formio.ts","../../src/lib/components/formio-builder-utils.ts","../../src/lib/components/epistola-retry-form/epistola-retry-form.formio.ts","../../src/lib/components/epistola-document-preview/epistola-document-preview.formio.ts","../../src/lib/components/override-builder/override-builder.component.ts","../../src/lib/components/override-builder/override-builder.formio.ts","../../src/lib/components/process-link-selector/process-link-selector.util.ts","../../src/lib/components/process-link-selector/process-link-selector.component.ts","../../src/lib/components/process-link-selector/process-link-selector.formio.ts","../../src/lib/epistola.module.ts","../../src/lib/assets/epistola-logo.ts","../../src/lib/epistola.specification.ts","../../src/public_api.ts","../../src/epistola.app-valtimo-plugin.ts"],"sourcesContent":["export interface AsyncResource<T> {\n data: T;\n loading: boolean;\n error: string | null;\n}\n\nexport function initialResource<T>(empty: T): AsyncResource<T> {\n return { data: empty, loading: false, error: null };\n}\n\nexport function loadingResource<T>(current: T): AsyncResource<T> {\n return { data: current, loading: true, error: null };\n}\n\nexport function successResource<T>(data: T): AsyncResource<T> {\n return { data, loading: false, error: null };\n}\n\nexport function errorResource<T>(current: T, error: string): AsyncResource<T> {\n return { data: current, loading: false, error };\n}\n","import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { ConfigService } from '@valtimo/shared';\nimport { Observable } from 'rxjs';\nimport {\n BpmnValidationReport,\n CatalogRedeployResult,\n ChangelogRelease,\n ClasspathCatalog,\n ConnectionStatus,\n FormCarrierIssue,\n FormCarrierRepairResult,\n FormCarrierRepairSummary,\n PendingJob,\n PluginUsageEntry,\n ReconcileResult,\n VersionInfo,\n} from '../models';\n\n/**\n * Service for Epistola plugin administrative operations.\n * Provides health checks, version info, and usage overview.\n */\n@Injectable()\nexport class EpistolaAdminService {\n private readonly apiEndpoint: string;\n\n constructor(\n private readonly http: HttpClient,\n private readonly configService: ConfigService,\n ) {\n this.apiEndpoint = `${this.configService.config.valtimoApi.endpointUri}v1/plugin/epistola/admin`;\n }\n\n /**\n * Check connectivity to Epistola for all plugin configurations.\n */\n getConnectionStatus(): Observable<ConnectionStatus[]> {\n return this.http.get<ConnectionStatus[]>(`${this.apiEndpoint}/health`);\n }\n\n /**\n * Get version information for the plugin and connected Epistola server.\n */\n getVersions(): Observable<VersionInfo> {\n return this.http.get<VersionInfo>(`${this.apiEndpoint}/versions`);\n }\n\n /**\n * Get an overview of all Epistola plugin usages across process definitions.\n */\n getPluginUsage(): Observable<PluginUsageEntry[]> {\n return this.http.get<PluginUsageEntry[]>(`${this.apiEndpoint}/usage`);\n }\n\n /**\n * Get all process instances currently waiting for an Epistola document generation result.\n */\n getPendingJobs(): Observable<PendingJob[]> {\n return this.http.get<PendingJob[]>(`${this.apiEndpoint}/pending`);\n }\n\n /**\n * Manually reconcile a stuck Epistola catch event by querying Epistola for the\n * job's current status and re-running message correlation. Returns 200 with\n * `correlated=true` on success, 409 with `correlated=false` when the job is\n * still in flight, or surfaces a validation error when the execution can't be\n * recovered (no subscription, missing variable, unknown tenant).\n */\n reconcilePending(executionId: string): Observable<ReconcileResult> {\n return this.http.post<ReconcileResult>(\n `${this.apiEndpoint}/pending/${encodeURIComponent(executionId)}/reconcile`,\n null,\n );\n }\n\n /**\n * Get the latest BPMN race-safety validation report across deployed process\n * definitions: the violations (empty = healthy) plus when it was last checked\n * and how often it refreshes.\n */\n getValidationReport(): Observable<BpmnValidationReport> {\n return this.http.get<BpmnValidationReport>(`${this.apiEndpoint}/validations`);\n }\n\n /**\n * List the classpath catalogs available to manually redeploy for a plugin\n * configuration, each annotated with the version last deployed in this\n * backend process.\n */\n getClasspathCatalogs(configurationId: string): Observable<ClasspathCatalog[]> {\n return this.http.get<ClasspathCatalog[]>(\n `${this.apiEndpoint}/configurations/${encodeURIComponent(configurationId)}/catalogs`,\n );\n }\n\n /**\n * Force-redeploy a single classpath catalog to the configuration's Epistola\n * installation. Explicit operator action — bypasses the templateSyncEnabled\n * gate and the version-skip check. Returns 200 with per-resource counts on\n * success, or 502 (error callback, body carries `errorMessage`) on failure.\n */\n redeployCatalog(configurationId: string, slug: string): Observable<CatalogRedeployResult> {\n return this.http.post<CatalogRedeployResult>(\n `${this.apiEndpoint}/configurations/${encodeURIComponent(configurationId)}/catalogs/${encodeURIComponent(slug)}/redeploy`,\n null,\n );\n }\n\n /**\n * Get the plugin CHANGELOG parsed (server-side) into structured releases for\n * the admin Changelog tab — no markdown renderer needed on the client.\n */\n getChangelog(): Observable<ChangelogRelease[]> {\n return this.http.get<ChangelogRelease[]>(`${this.apiEndpoint}/changelog`);\n }\n\n /**\n * Export a single process link as a .process-link.json file.\n */\n exportProcessLink(processLinkId: string): Observable<Blob> {\n return this.http.get(`${this.apiEndpoint}/export/${encodeURIComponent(processLinkId)}`, {\n responseType: 'blob',\n });\n }\n\n // ---- TEMPORARY (removed in 1.0.0): task-id carrier detection + repair ----\n\n /** Forms whose Epistola components are missing the task-id carrier. */\n getFormCarrierIssues(): Observable<FormCarrierIssue[]> {\n return this.http.get<FormCarrierIssue[]>(`${this.apiEndpoint}/forms/carrier-issues`);\n }\n\n /** Inject the task-id carrier into a single form's Epistola components. */\n repairFormCarrier(formId: string): Observable<FormCarrierRepairResult> {\n return this.http.post<FormCarrierRepairResult>(\n `${this.apiEndpoint}/forms/${encodeURIComponent(formId)}/repair-carrier`,\n null,\n );\n }\n\n /** Repair every flagged form. */\n repairAllFormCarriers(): Observable<FormCarrierRepairSummary> {\n return this.http.post<FormCarrierRepairSummary>(\n `${this.apiEndpoint}/forms/repair-carrier`,\n null,\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { MenuService } from '@valtimo/components';\nimport { MenuItem, ROLE_ADMIN } from '@valtimo/shared';\nimport { Observable, of } from 'rxjs';\n\n/**\n * Registers the Epistola admin page menu item under the Admin > Other section.\n * Instantiated eagerly via ENVIRONMENT_INITIALIZER so the menu item\n * appears without any manual configuration in the host application.\n */\n@Injectable()\nexport class EpistolaMenuService {\n constructor(private readonly menuService: MenuService) {\n this.menuService.registerAppendMenuItemsFunction(\n (items: MenuItem[]): Observable<MenuItem[]> => {\n return of(\n items.map((item) => {\n const isAdminMenu = item.roles?.includes(ROLE_ADMIN) && item.children;\n if (!isAdminMenu) {\n return item;\n }\n return {\n ...item,\n children: [\n ...item.children!,\n {\n link: ['/epistola'],\n title: 'Epistola',\n sequence: 18,\n },\n ],\n };\n }),\n );\n },\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { ConfigService } from '@valtimo/shared';\nimport { Observable } from 'rxjs';\nimport {\n AttributeDefinition,\n CatalogInfo,\n EnvironmentInfo,\n ExpressionFunctionInfo,\n JsonataValidationResult,\n TemplateDetails,\n TemplateInfo,\n EvaluationResult,\n ValidateJsonataRequest,\n VariableSuggestions,\n VariantInfo,\n} from '../models';\n\n/**\n * Body of a {@link EpistolaPluginService.previewToBlob} call. Mirrors the\n * backend {@code PreviewRequest} record. The backend derives the process\n * instance and case document from the authorized task, so only {@code taskId}\n * and {@code sourceActivityId} (which identifies the {@code generate-document}\n * process link) are sent; {@code overrides} and {@code inputOverrides} let the\n * caller substitute data before the JSONata mapping runs.\n */\nexport interface PreviewBlobRequest {\n taskId: string;\n sourceActivityId?: string | null;\n inputOverrides?: Record<string, unknown> | null;\n overrides?: Record<string, unknown> | null;\n}\n\n/**\n * Query-string parameters for {@link EpistolaPluginService.downloadDocumentBlob}.\n * The backend resolves the Epistola PDF id and tenant id from the named process\n * variables on the caller's task — no raw PDF id is sent on the wire.\n */\nexport interface DownloadDocumentRequest {\n taskId: string;\n caseDocumentId: string;\n documentVariable: string;\n tenantIdVariable: string;\n filename: string;\n disposition: 'attachment' | 'inline';\n}\n\n/**\n * Service for interacting with Epistola plugin API endpoints.\n * Provides methods to fetch templates, environments, variants,\n * process variables, and validate mappings.\n */\n@Injectable()\nexport class EpistolaPluginService {\n private readonly apiEndpoint: string;\n\n constructor(\n private readonly http: HttpClient,\n private readonly configService: ConfigService,\n ) {\n this.apiEndpoint = `${this.configService.config.valtimoApi.endpointUri}v1/plugin/epistola`;\n }\n\n /**\n * Get all available catalogs for a plugin configuration.\n */\n getCatalogs(pluginConfigurationId: string): Observable<CatalogInfo[]> {\n return this.http.get<CatalogInfo[]>(\n `${this.apiEndpoint}/configurations/${pluginConfigurationId}/catalogs`,\n );\n }\n\n /**\n * Get all available templates for a plugin configuration and catalog.\n */\n getTemplates(pluginConfigurationId: string, catalogId?: string): Observable<TemplateInfo[]> {\n const params: Record<string, string> = {};\n if (catalogId) params['catalogId'] = catalogId;\n return this.http.get<TemplateInfo[]>(\n `${this.apiEndpoint}/configurations/${pluginConfigurationId}/templates`,\n { params },\n );\n }\n\n /**\n * Get template details including its fields.\n */\n getTemplateDetails(\n pluginConfigurationId: string,\n templateId: string,\n catalogId: string,\n ): Observable<TemplateDetails> {\n return this.http.get<TemplateDetails>(\n `${this.apiEndpoint}/configurations/${pluginConfigurationId}/templates/${templateId}`,\n { params: { catalogId } },\n );\n }\n\n /**\n * Get all attribute definitions for a plugin configuration's tenant and catalog.\n */\n getAttributes(\n pluginConfigurationId: string,\n catalogId: string,\n ): Observable<AttributeDefinition[]> {\n const params: Record<string, string> = {};\n if (catalogId) params['catalogId'] = catalogId;\n return this.http.get<AttributeDefinition[]>(\n `${this.apiEndpoint}/configurations/${pluginConfigurationId}/attributes`,\n { params },\n );\n }\n\n /**\n * Get all available environments for a plugin configuration.\n */\n getEnvironments(pluginConfigurationId: string): Observable<EnvironmentInfo[]> {\n return this.http.get<EnvironmentInfo[]>(\n `${this.apiEndpoint}/configurations/${pluginConfigurationId}/environments`,\n );\n }\n\n /**\n * Get all variants for a specific template.\n */\n getVariants(\n pluginConfigurationId: string,\n templateId: string,\n catalogId: string,\n ): Observable<VariantInfo[]> {\n const params: Record<string, string> = {};\n if (catalogId) params['catalogId'] = catalogId;\n return this.http.get<VariantInfo[]>(\n `${this.apiEndpoint}/configurations/${pluginConfigurationId}/templates/${templateId}/variants`,\n { params },\n );\n }\n\n /**\n * Discover process variable names for a given process definition.\n */\n getProcessVariables(processDefinitionKey: string): Observable<string[]> {\n return this.http.get<string[]>(`${this.apiEndpoint}/process-variables`, {\n params: { processDefinitionKey },\n });\n }\n\n /**\n * Get variable suggestions for JSONata autocompletion.\n */\n getVariableSuggestions(\n caseDefinitionKey?: string,\n processDefinitionKey?: string,\n ): Observable<VariableSuggestions> {\n const params: Record<string, string> = {};\n if (caseDefinitionKey) params['caseDefinitionKey'] = caseDefinitionKey;\n if (processDefinitionKey) params['processDefinitionKey'] = processDefinitionKey;\n return this.http.get<VariableSuggestions>(`${this.apiEndpoint}/variable-suggestions`, {\n params,\n });\n }\n\n /**\n * Evaluate a JSONata expression against a real document.\n */\n evaluateMapping(\n expression: string,\n documentId: string,\n processInstanceId?: string,\n ): Observable<EvaluationResult> {\n return this.http.post<EvaluationResult>(`${this.apiEndpoint}/evaluate-mapping`, {\n expression,\n documentId,\n processInstanceId: processInstanceId ?? null,\n });\n }\n\n /**\n * Get a dynamically generated Formio form for retrying a failed document generation.\n *\n * The backend derives the process instance and case document from the authorized task,\n * so only the task id (and optionally the source activity) is sent.\n *\n * @param taskId Operaton user task id (required — backend authorizes via OperatonTask:VIEW)\n */\n getRetryForm(taskId: string, sourceActivityId?: string): Observable<any> {\n const params: Record<string, string> = { taskId };\n if (sourceActivityId) {\n params['sourceActivityId'] = sourceActivityId;\n }\n return this.http.get<any>(`${this.apiEndpoint}/retry-form`, { params });\n }\n\n /**\n * List all available expression functions for expr: data mapping values.\n */\n getExpressionFunctions(): Observable<ExpressionFunctionInfo[]> {\n return this.http.get<ExpressionFunctionInfo[]>(`${this.apiEndpoint}/expression-functions`);\n }\n\n /**\n * Validate the JSONata syntax of action-config expressions before save.\n * Parse-only; runtime errors (missing variables, type mismatches) are not detected.\n */\n validateJsonata(request: ValidateJsonataRequest): Observable<JsonataValidationResult> {\n return this.http.post<JsonataValidationResult>(`${this.apiEndpoint}/validate-jsonata`, request);\n }\n\n /**\n * Preview a document by dry-running the {@code generate-document} process\n * link. Returns the rendered PDF as a {@link Blob}.\n *\n * <p>The {@code X-Skip-Interceptor: 422} header tells the global Valtimo\n * error interceptor to skip its toast for validation failures so the\n * caller can render an inline error message.\n */\n previewToBlob(request: PreviewBlobRequest): Observable<Blob> {\n return this.http.post(`${this.apiEndpoint}/preview`, request, {\n responseType: 'blob',\n headers: new HttpHeaders().set('X-Skip-Interceptor', '422'),\n });\n }\n\n /**\n * Stream an already-generated Epistola PDF for the caller's task. The\n * backend resolves the Epistola document id and tenant id from the named\n * process variables on the task's process instance, so the wire never\n * carries a raw PDF id.\n */\n downloadDocumentBlob(request: DownloadDocumentRequest): Observable<Blob> {\n const params = new URLSearchParams({\n taskId: request.taskId,\n caseDocumentId: request.caseDocumentId,\n documentVariable: request.documentVariable,\n tenantIdVariable: request.tenantIdVariable,\n filename: request.filename,\n disposition: request.disposition,\n });\n return this.http.get(`${this.apiEndpoint}/documents/download?${params.toString()}`, {\n responseType: 'blob',\n });\n }\n}\n","/**\n * Helpers for reading the active user task's id out of a Valtimo task form that was\n * prefilled server-side by the {@code epistola:} value resolver (see the backend\n * {@code EpistolaTaskValueResolverFactory}).\n *\n * <p>Background: the Epistola Formio components need the id of the user task whose form\n * they're rendered in, to authorize their backend requests ({@code OperatonTask:VIEW}).\n * Valtimo exposes no service that carries the task id to a custom Formio component at\n * runtime, and earlier URL-sniffing only worked in the direct task-open flow (the\n * task-list / case-detail flow bulk-fetches process links and never fires the per-task\n * call).\n *\n * <p>Form prefill, however, runs server-side in every flow. A form field with\n * {@code properties.sourceKey = \"epistola:taskId\"} is filled with the task id at prefill\n * time (by the backend {@code EpistolaTaskValueResolverFactory}); this helper reads it back\n * from the Formio root — robustly, regardless of how the task was opened.\n */\n\n/** The value-resolver source key that yields the current task id at prefill time. */\nexport const PREFILLED_TASK_ID_SOURCE_KEY = 'epistola:taskId';\n\n/** Conventional key of the hidden carrier field that holds the prefilled task id. */\nexport const PREFILLED_TASK_ID_DATA_KEY = 'epistolaTaskId';\n\n/**\n * Hidden Formio child component that carries the prefilled task id. It is embedded as a\n * nested component inside each Epistola task component's schema, so dropping that component\n * brings the carrier with it — the form author never adds a separate field. Valtimo's\n * server-side prefill fills its {@code defaultValue} from the {@code epistola:taskId}\n * value resolver; {@link readPrefilledTaskId} reads it back from the form definition.\n *\n * {@code persistent: false} keeps the value out of the submission, so the task id never\n * lands in the case document / process variables.\n */\nexport const PREFILLED_TASK_ID_CARRIER = {\n type: 'hidden',\n key: PREFILLED_TASK_ID_DATA_KEY,\n input: true,\n persistent: false,\n label: 'Epistola Task Id',\n properties: { sourceKey: PREFILLED_TASK_ID_SOURCE_KEY },\n};\n\n/**\n * Reads the prefilled task id from a Formio webform/wizard root, or null when absent.\n *\n * Looks in two places, in order:\n * 1. The (prefilled) form definition — any component whose {@code properties.sourceKey}\n * is {@code epistola:taskId} carries the task id in its {@code defaultValue}. This works\n * even when the carrier is a hidden field that Formio doesn't surface into submission data.\n * 2. The submission data under {@link PREFILLED_TASK_ID_DATA_KEY}, for a rendered sibling\n * hidden field whose value Formio copied into {@code root.data}.\n */\nexport function readPrefilledTaskId(root: any): string | null {\n if (!root) {\n return null;\n }\n\n const fromForm = findSourceKeyDefaultValue(root.form, PREFILLED_TASK_ID_SOURCE_KEY);\n if (typeof fromForm === 'string' && fromForm.length > 0) {\n return fromForm;\n }\n\n const fromData = root.data?.[PREFILLED_TASK_ID_DATA_KEY];\n if (typeof fromData === 'string' && fromData.length > 0) {\n return fromData;\n }\n\n return null;\n}\n\n/**\n * Deep-walks a form definition node looking for a component whose\n * {@code properties.sourceKey} equals {@code sourceKey}, and returns its\n * {@code defaultValue} (the prefilled value). Returns null when not found.\n */\nfunction findSourceKeyDefaultValue(node: any, sourceKey: string): string | null {\n if (Array.isArray(node)) {\n for (const item of node) {\n const found = findSourceKeyDefaultValue(item, sourceKey);\n if (found != null) {\n return found;\n }\n }\n return null;\n }\n\n if (node && typeof node === 'object') {\n if (node.properties?.sourceKey === sourceKey && typeof node.defaultValue === 'string') {\n return node.defaultValue;\n }\n for (const key of Object.keys(node)) {\n const found = findSourceKeyDefaultValue(node[key], sourceKey);\n if (found != null) {\n return found;\n }\n }\n }\n\n return null;\n}\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PluginConfigurationComponent, PluginTranslatePipeModule } from '@valtimo/plugin';\nimport { FormModule, FormOutput, InputModule } from '@valtimo/components';\nimport { BehaviorSubject, combineLatest, Observable, Subscription, take } from 'rxjs';\nimport { delay, startWith } from 'rxjs/operators';\nimport { EpistolaPluginConfig } from '../../models';\n\n@Component({\n selector: 'epistola-configuration',\n templateUrl: './epistola-configuration.component.html',\n styleUrls: ['./epistola-configuration.component.scss'],\n standalone: true,\n imports: [CommonModule, PluginTranslatePipeModule, FormModule, InputModule],\n})\nexport class EpistolaConfigurationComponent\n implements PluginConfigurationComponent, OnInit, OnDestroy\n{\n @Input() save$!: Observable<void>;\n @Input() disabled$!: Observable<boolean>;\n @Input() pluginId!: string;\n @Input() prefillConfiguration$!: Observable<EpistolaPluginConfig>;\n\n @Output() valid: EventEmitter<boolean> = new EventEmitter<boolean>();\n @Output() configuration: EventEmitter<EpistolaPluginConfig> =\n new EventEmitter<EpistolaPluginConfig>();\n\n /** Epistola slug pattern: lowercase alphanumeric with hyphens, no leading/trailing hyphens. */\n private static readonly SLUG_PATTERN = /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/;\n\n private saveSubscription!: Subscription;\n private readonly formValue$ = new BehaviorSubject<EpistolaPluginConfig | null>(null);\n private readonly valid$ = new BehaviorSubject<boolean>(false);\n\n safeDisabled$!: Observable<boolean>;\n\n ngOnInit(): void {\n // Wrap disabled$ with startWith and delay to prevent NG0100 ExpressionChangedAfterItHasBeenCheckedError\n // The disabled$ observable from Valtimo's plugin framework can emit value changes after Angular's\n // change detection cycle completes, causing the error.\n this.safeDisabled$ = this.disabled$.pipe(startWith(true), delay(0));\n this.openSaveSubscription();\n }\n\n ngOnDestroy() {\n this.saveSubscription?.unsubscribe();\n }\n\n formValueChange(formOutput: FormOutput): void {\n const formValue = formOutput as unknown as EpistolaPluginConfig;\n this.formValue$.next(formValue);\n this.handleValid(formValue);\n }\n\n private handleValid(formValue: EpistolaPluginConfig): void {\n const valid = !!(\n formValue?.configurationTitle &&\n formValue?.baseUrl &&\n formValue?.apiKey &&\n formValue?.tenantId &&\n this.isValidSlug(formValue.tenantId, 3, 63) &&\n this.isValidOptionalSlug(formValue.defaultEnvironmentId, 3, 30)\n );\n this.valid$.next(valid);\n this.valid.emit(valid);\n }\n\n private isValidSlug(value: string, minLength: number, maxLength: number): boolean {\n return (\n value.length >= minLength &&\n value.length <= maxLength &&\n EpistolaConfigurationComponent.SLUG_PATTERN.test(value)\n );\n }\n\n private isValidOptionalSlug(\n value: string | undefined,\n minLength: number,\n maxLength: number,\n ): boolean {\n if (!value) {\n return true;\n }\n return this.isValidSlug(value, minLength, maxLength);\n }\n\n private openSaveSubscription(): void {\n this.saveSubscription = this.save$?.subscribe(() => {\n combineLatest([this.formValue$, this.valid$])\n .pipe(take(1))\n .subscribe(([formValue, valid]) => {\n if (valid) {\n this.configuration.emit(formValue);\n }\n });\n });\n }\n}\n","<v-form\n (valueChange)=\"formValueChange($event)\"\n *ngIf=\"{\n disabled: safeDisabled$ | async,\n prefill: prefillConfiguration$ ? (prefillConfiguration$ | async) : null,\n } as obs\"\n>\n <v-input\n name=\"configurationTitle\"\n [title]=\"'configurationTitle' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"obs.prefill?.configurationTitle\"\n [disabled]=\"obs.disabled\"\n [required]=\"true\"\n >\n </v-input>\n\n <v-input\n name=\"baseUrl\"\n [title]=\"'baseUrl' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'baseUrlTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"obs.prefill?.baseUrl\"\n [disabled]=\"obs.disabled\"\n [required]=\"true\"\n >\n </v-input>\n\n <v-input\n name=\"apiKey\"\n [title]=\"'apiKey' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'apiKeyTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"obs.prefill?.apiKey\"\n [disabled]=\"obs.disabled\"\n [required]=\"true\"\n type=\"password\"\n >\n </v-input>\n\n <v-input\n name=\"tenantId\"\n [title]=\"'tenantId' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'tenantIdTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"obs.prefill?.tenantId\"\n [disabled]=\"obs.disabled\"\n [required]=\"true\"\n >\n </v-input>\n\n <v-input\n name=\"defaultEnvironmentId\"\n [title]=\"'defaultEnvironmentId' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'defaultEnvironmentIdTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"obs.prefill?.defaultEnvironmentId\"\n [disabled]=\"obs.disabled\"\n [required]=\"false\"\n >\n </v-input>\n\n <v-input\n name=\"templateSyncEnabled\"\n type=\"checkbox\"\n [title]=\"'templateSyncEnabled' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'templateSyncEnabledTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"obs.prefill?.templateSyncEnabled ? 'true' : ''\"\n [disabled]=\"obs.disabled\"\n [required]=\"false\"\n >\n </v-input>\n</v-form>\n","import { ExpressionFunctionInfo, VariableSuggestions } from '../models';\n\n/**\n * Shared state for the JSONata completion provider.\n * Updated by the editor component when suggestions/functions change.\n */\nexport const jsonataCompletionData = {\n suggestions: null as VariableSuggestions | null,\n functions: [] as ExpressionFunctionInfo[],\n};\n\n/**\n * Register the JSONata language in Monaco editor.\n * Call this once when Monaco is available (e.g., in editor component OnInit).\n */\nexport function registerJsonataLanguage(monaco: any): void {\n // Only register once\n if (monaco.languages.getLanguages().some((lang: any) => lang.id === 'jsonata')) {\n return;\n }\n\n monaco.languages.register({ id: 'jsonata' });\n\n // Syntax highlighting via Monarch tokenizer\n monaco.languages.setMonarchTokensProvider('jsonata', {\n defaultToken: '',\n tokenPostfix: '.jsonata',\n\n keywords: ['true', 'false', 'null', 'in', 'and', 'or', 'not'],\n\n operators: ['&', '?', ':', '=', '!=', '>', '<', '>=', '<=', '+', '-', '*', '/', '%', '~>'],\n\n symbols: /[=><!~?:&|+\\-*/^%]+/,\n\n tokenizer: {\n root: [\n // Variables: $identifier\n [/\\$[a-zA-Z_]\\w*/, 'variable'],\n\n // Identifiers and keywords\n [\n /[a-zA-Z_]\\w*/,\n {\n cases: {\n '@keywords': 'keyword',\n '@default': 'identifier',\n },\n },\n ],\n\n // Whitespace\n { include: '@whitespace' },\n\n // Strings\n [/\"([^\"\\\\]|\\\\.)*$/, 'string.invalid'],\n [/\"/, 'string', '@string_double'],\n [/'([^'\\\\]|\\\\.)*$/, 'string.invalid'],\n [/'/, 'string', '@string_single'],\n\n // Numbers\n [/\\d+(\\.\\d+)?([eE][-+]?\\d+)?/, 'number'],\n\n // Delimiters and operators\n [/[{}()\\[\\]]/, '@brackets'],\n [/[,;.]/, 'delimiter'],\n [\n /@symbols/,\n {\n cases: {\n '@operators': 'operator',\n '@default': '',\n },\n },\n ],\n ],\n\n string_double: [\n [/[^\\\\\"]+/, 'string'],\n [/\\\\./, 'string.escape'],\n [/\"/, 'string', '@pop'],\n ],\n\n string_single: [\n [/[^\\\\']+/, 'string'],\n [/\\\\./, 'string.escape'],\n [/'/, 'string', '@pop'],\n ],\n\n whitespace: [[/[ \\t\\r\\n]+/, 'white']],\n },\n });\n\n // Autocomplete provider\n monaco.languages.registerCompletionItemProvider('jsonata', {\n triggerCharacters: ['$', '.'],\n\n provideCompletionItems: (model: any, position: any) => {\n const textUntilPosition = model.getValueInRange({\n startLineNumber: position.lineNumber,\n startColumn: 1,\n endLineNumber: position.lineNumber,\n endColumn: position.column,\n });\n\n const suggestions: any[] = [];\n const CompletionItemKind = monaco.languages.CompletionItemKind;\n\n // After \"$\" — suggest variables and functions\n if (textUntilPosition.endsWith('$')) {\n suggestions.push(\n ...['doc', 'pv', 'case'].map((v) => ({\n label: `$${v}`,\n kind: CompletionItemKind.Variable,\n insertText: v,\n detail: `Context variable`,\n })),\n );\n\n // Custom functions\n for (const func of jsonataCompletionData.functions) {\n suggestions.push({\n label: `$${func.name}`,\n kind: CompletionItemKind.Function,\n insertText: `${func.name}($0)`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n detail: func.description || 'Custom function',\n });\n }\n\n // Built-in JSONata functions\n const builtins = [\n 'string',\n 'number',\n 'boolean',\n 'length',\n 'substring',\n 'uppercase',\n 'lowercase',\n 'trim',\n 'contains',\n 'split',\n 'join',\n 'sum',\n 'count',\n 'max',\n 'min',\n 'average',\n 'append',\n 'sort',\n 'reverse',\n 'keys',\n 'values',\n 'lookup',\n 'now',\n 'exists',\n 'type',\n 'not',\n ];\n for (const fn of builtins) {\n suggestions.push({\n label: `$${fn}`,\n kind: CompletionItemKind.Function,\n insertText: `${fn}($0)`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n detail: 'Built-in JSONata function',\n });\n }\n }\n\n // After \"$doc.\" — suggest document paths\n if (/\\$doc\\.\\s*$/.test(textUntilPosition) || /\\$doc\\.[a-zA-Z_]*$/.test(textUntilPosition)) {\n const docPaths = jsonataCompletionData.suggestions?.doc || [];\n for (const path of docPaths) {\n suggestions.push({\n label: path,\n kind: CompletionItemKind.Field,\n insertText: path,\n detail: 'Document field',\n });\n }\n }\n\n // After \"$pv.\" — suggest process variables\n if (/\\$pv\\.\\s*$/.test(textUntilPosition) || /\\$pv\\.[a-zA-Z_]*$/.test(textUntilPosition)) {\n const pvNames = jsonataCompletionData.suggestions?.pv || [];\n for (const name of pvNames) {\n suggestions.push({\n label: name,\n kind: CompletionItemKind.Variable,\n insertText: name,\n detail: 'Process variable',\n });\n }\n }\n\n return { suggestions };\n },\n });\n}\n","import {\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PluginTranslatePipeModule } from '@valtimo/plugin';\nimport { EditorModule } from '@valtimo/components';\nimport { Subject, debounceTime, takeUntil } from 'rxjs';\nimport { ExpressionFunctionInfo, VariableSuggestions } from '../../models';\nimport { jsonataCompletionData, registerJsonataLanguage } from '../../utils/jsonata-monaco';\n\nimport * as _jsonata from 'jsonata';\nconst jsonata = (_jsonata as any).default || _jsonata;\n\n@Component({\n selector: 'epistola-jsonata-editor',\n standalone: true,\n imports: [CommonModule, PluginTranslatePipeModule, EditorModule],\n template: `\n <div class=\"jsonata-editor\">\n <valtimo-editor\n [model]=\"editorModel\"\n [editorOptions]=\"editorOptions\"\n [disabled]=\"disabled\"\n [heightPx]=\"250\"\n [formatOnLoad]=\"false\"\n (valueChangeEvent)=\"onEditorValueChange($event)\"\n ></valtimo-editor>\n <div class=\"jsonata-editor__footer\">\n <span *ngIf=\"error\" class=\"jsonata-editor__error\">{{ error }}</span>\n <span *ngIf=\"!error && expression\" class=\"jsonata-editor__valid\">✓</span>\n <span class=\"jsonata-editor__variables\">$doc · $pv · $case</span>\n </div>\n </div>\n `,\n styles: [\n `\n .jsonata-editor__footer {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 4px;\n font-size: 0.8em;\n }\n .jsonata-editor__error {\n color: #da1e28;\n }\n .jsonata-editor__valid {\n color: #198038;\n }\n .jsonata-editor__variables {\n margin-left: auto;\n color: #8d8d8d;\n font-family: monospace;\n }\n `,\n ],\n})\nexport class JsonataEditorComponent implements OnChanges, OnDestroy {\n @Input() expression: string = '';\n @Input() disabled: boolean = false;\n @Input() suggestions: VariableSuggestions | null = null;\n @Input() functions: ExpressionFunctionInfo[] = [];\n @Output() expressionChange = new EventEmitter<string>();\n @Output() validChange = new EventEmitter<boolean>();\n\n editorModel: { value: string; language: string } = { value: '', language: 'jsonata' };\n editorOptions: Record<string, any> = {\n minimap: { enabled: false },\n lineNumbers: 'on',\n scrollBeyondLastLine: false,\n fontSize: 13,\n tabSize: 2,\n wordWrap: 'on',\n renderWhitespace: 'none',\n };\n\n error: string | null = null;\n\n private destroy$ = new Subject<void>();\n private validate$ = new Subject<string>();\n private suppressChange = false;\n private languageRegistered = false;\n\n constructor() {\n this.validate$.pipe(debounceTime(300), takeUntil(this.destroy$)).subscribe((value) => {\n this.validateExpression(value);\n });\n\n // Try to register language eagerly if Monaco is already loaded\n this.tryRegisterLanguage();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['expression'] && !this.suppressChange) {\n this.editorModel = { value: this.expression || '', language: 'jsonata' };\n this.validate$.next(this.expression);\n }\n if (changes['suggestions']) {\n jsonataCompletionData.suggestions = this.suggestions;\n }\n if (changes['functions']) {\n jsonataCompletionData.functions = this.functions;\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n onEditorValueChange(value: string): void {\n // Register language on first editor event (Monaco is now loaded)\n if (!this.languageRegistered) {\n this.tryRegisterLanguage();\n }\n\n if (this.suppressChange) return;\n this.suppressChange = true;\n this.expression = value;\n this.expressionChange.emit(value);\n this.validate$.next(value);\n setTimeout(() => (this.suppressChange = false));\n }\n\n private tryRegisterLanguage(): void {\n const m = (window as any).monaco;\n if (m) {\n registerJsonataLanguage(m);\n this.languageRegistered = true;\n jsonataCompletionData.suggestions = this.suggestions;\n jsonataCompletionData.functions = this.functions;\n }\n }\n\n private validateExpression(value: string): void {\n if (!value || !value.trim()) {\n this.error = null;\n this.validChange.emit(true);\n return;\n }\n try {\n jsonata(value);\n this.error = null;\n this.validChange.emit(true);\n } catch (e: any) {\n this.error = e.message || 'Invalid expression';\n this.validChange.emit(false);\n }\n }\n}\n","import { Component, Input, OnChanges, SimpleChanges } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PluginTranslatePipeModule } from '@valtimo/plugin';\nimport { TemplateField } from '../../models';\n\n@Component({\n selector: 'epistola-expected-structure',\n standalone: true,\n imports: [CommonModule, PluginTranslatePipeModule],\n template: `\n <div class=\"expected\">\n <div class=\"expected__header\">\n {{ 'expectedStructure' | pluginTranslate: 'epistola' | async }}\n </div>\n <div *ngIf=\"!templateFields || templateFields.length === 0\" class=\"expected__empty\">\n {{ 'expectedStructureLoading' | pluginTranslate: 'epistola' | async }}\n </div>\n <pre *ngIf=\"templateFields && templateFields.length > 0\" class=\"expected__code\">{{\n structureText\n }}</pre>\n </div>\n `,\n styles: [\n `\n .expected {\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n overflow: hidden;\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n .expected__header {\n padding: 6px 12px;\n background: #f4f4f4;\n border-bottom: 1px solid #e0e0e0;\n font-size: 0.75em;\n color: #6f6f6f;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n .expected__code {\n flex: 1;\n font-family: 'IBM Plex Mono', monospace;\n font-size: 0.8em;\n line-height: 1.5;\n margin: 0;\n padding: 8px 12px;\n white-space: pre-wrap;\n overflow-y: auto;\n }\n .expected__empty {\n padding: 8px 12px;\n color: #8d8d8d;\n font-size: 0.85em;\n font-style: italic;\n }\n `,\n ],\n})\nexport class ExpectedStructureComponent implements OnChanges {\n @Input() templateFields: TemplateField[] = [];\n\n structureText: string = '{}';\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['templateFields']) {\n this.structureText = this.buildStructure(this.templateFields, 0);\n }\n }\n\n private buildStructure(fields: TemplateField[], depth: number): string {\n if (!fields || fields.length === 0) return '{}';\n const indent = ' '.repeat(depth + 1);\n const closing = ' '.repeat(depth);\n\n const lines = fields.map((f) => {\n const req = f.required ? ' (required)' : '';\n if (f.fieldType === 'OBJECT' && f.children?.length) {\n const nested = this.buildStructure(f.children, depth + 1);\n return `${indent}\"${f.name}\": ${nested}${req}`;\n }\n if (f.fieldType === 'ARRAY') {\n if (f.children?.length) {\n const itemStructure = this.buildStructure(f.children, depth + 2);\n return `${indent}\"${f.name}\": [${itemStructure}]${req}`;\n }\n return `${indent}\"${f.name}\": array${req}`;\n }\n return `${indent}\"${f.name}\": ${f.type || 'any'}${req}`;\n });\n\n return `{\\n${lines.join(',\\n')}\\n${closing}}`;\n }\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { BuilderField } from '../../../utils/jsonata-converter';\n\n@Component({\n selector: 'epistola-builder-field',\n standalone: true,\n imports: [CommonModule, FormsModule],\n template: `\n <div class=\"builder-field\">\n <div\n class=\"builder-field__name\"\n [class.builder-field__name--clickable]=\"field.children\"\n (click)=\"field.children && collapseToggle.emit(path)\"\n >\n <span *ngIf=\"field.children\" class=\"builder-field__chevron\">{{\n collapsed ? '▶' : '▼'\n }}</span>\n <span class=\"builder-field__label\">{{ field.name }}</span>\n <span *ngIf=\"required\" class=\"builder-field__required\">*</span>\n <span *ngIf=\"field.children\" class=\"builder-field__type\">(object)</span>\n </div>\n\n <div class=\"builder-field__value\" *ngIf=\"!field.children\">\n <input\n *ngIf=\"field.mode === 'ref'\"\n type=\"text\"\n class=\"builder-field__input\"\n [ngModel]=\"field.value\"\n (ngModelChange)=\"valueChange.emit({ path: path, value: $event })\"\n [disabled]=\"disabled\"\n placeholder=\"$doc.path.to.field\"\n [attr.list]=\"'suggestions-' + path.join('-')\"\n />\n <datalist *ngIf=\"field.mode === 'ref'\" [id]=\"'suggestions-' + path.join('-')\">\n <option *ngFor=\"let s of suggestions\" [value]=\"s\"></option>\n </datalist>\n <input\n *ngIf=\"field.mode === 'raw'\"\n type=\"text\"\n class=\"builder-field__input builder-field__input--raw\"\n [ngModel]=\"field.value\"\n (ngModelChange)=\"valueChange.emit({ path: path, value: $event })\"\n [disabled]=\"disabled\"\n placeholder=\"JSONata expression\"\n />\n <button\n class=\"builder-field__mode-toggle\"\n (click)=\"modeToggle.emit(path)\"\n [disabled]=\"disabled\"\n [title]=\"field.mode === 'ref' ? 'Switch to raw JSONata' : 'Switch to reference'\"\n >\n {{ field.mode === 'ref' ? 'fx' : '·' }}\n </button>\n </div>\n\n <div *ngIf=\"field.children && !collapsed\" class=\"builder-field__children\">\n <epistola-builder-field\n *ngFor=\"let child of field.children; let j = index\"\n [field]=\"child\"\n [path]=\"path.concat(j)\"\n [suggestions]=\"suggestions\"\n [disabled]=\"disabled\"\n [collapsed]=\"isChildCollapsed(j)\"\n [collapsedPaths]=\"collapsedPaths\"\n [required]=\"false\"\n (valueChange)=\"valueChange.emit($event)\"\n (modeToggle)=\"modeToggle.emit($event)\"\n (collapseToggle)=\"collapseToggle.emit($event)\"\n ></epistola-builder-field>\n </div>\n </div>\n `,\n styles: [\n `\n .builder-field {\n margin-bottom: 4px;\n }\n .builder-field__name {\n margin-bottom: 2px;\n }\n .builder-field__name--clickable {\n cursor: pointer;\n user-select: none;\n }\n .builder-field__name--clickable:hover {\n color: #0f62fe;\n }\n .builder-field__chevron {\n font-size: 0.7em;\n margin-right: 4px;\n }\n .builder-field__label {\n font-weight: 500;\n font-size: 0.9em;\n }\n .builder-field__required {\n color: #da1e28;\n margin-left: 2px;\n }\n .builder-field__type {\n color: #8d8d8d;\n font-size: 0.8em;\n margin-left: 4px;\n }\n .builder-field__value {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n .builder-field__input {\n flex: 1;\n padding: 6px 8px;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n font-size: 0.85em;\n font-family: 'IBM Plex Mono', monospace;\n }\n .builder-field__input:focus {\n outline: 2px solid #0f62fe;\n border-color: #0f62fe;\n }\n .builder-field__input--raw {\n background: #f4f4f4;\n }\n .builder-field__mode-toggle {\n width: 28px;\n height: 28px;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n background: #fff;\n cursor: pointer;\n font-family: monospace;\n font-size: 0.8em;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .builder-field__mode-toggle:hover {\n background: #f4f4f4;\n }\n .builder-field__children {\n border-left: 2px solid #e0e0e0;\n padding-left: 12px;\n margin-top: 4px;\n }\n `,\n ],\n})\nexport class BuilderFieldComponent {\n @Input() field!: BuilderField;\n @Input() path: number[] = [];\n @Input() suggestions: string[] = [];\n @Input() disabled = false;\n @Input() collapsed = false;\n @Input() required = false;\n @Input() collapsedPaths: Set<string> = new Set();\n @Output() valueChange = new EventEmitter<{ path: number[]; value: string }>();\n @Output() modeToggle = new EventEmitter<number[]>();\n @Output() collapseToggle = new EventEmitter<number[]>();\n\n isChildCollapsed(childIndex: number): boolean {\n return this.collapsedPaths.has(this.path.concat(childIndex).join('.'));\n }\n}\n","import * as _jsonata from 'jsonata';\nconst jsonata = (_jsonata as any).default || _jsonata;\n\n/**\n * Represents a field in the visual builder.\n * - mode 'ref': a simple $doc/$pv/$case path reference\n * - mode 'raw': raw JSONata text the builder can't represent visually\n */\nexport interface BuilderField {\n name: string;\n mode: 'ref' | 'raw';\n value: string;\n children?: BuilderField[];\n}\n\n/**\n * Parse a JSONata expression into BuilderField array.\n * Only supports top-level object literals with simple path references or nested objects.\n * Anything else is stored as raw JSONata text.\n */\nexport function parseJsonataToBuilder(expression: string): BuilderField[] {\n if (!expression || !expression.trim()) {\n return [];\n }\n\n try {\n const ast = (jsonata(expression) as any).ast();\n if (ast.type === 'unary' && ast.value === '{') {\n return parseObjectEntries(ast.lhs, expression);\n }\n // Not a top-level object — can't represent in builder\n return [{ name: '_root', mode: 'raw', value: expression }];\n } catch {\n // Invalid JSONata — return as single raw field\n return [{ name: '_root', mode: 'raw', value: expression }];\n }\n}\n\n/**\n * Convert BuilderField array back to a JSONata expression string.\n */\nexport function builderToJsonata(fields: BuilderField[]): string {\n if (fields.length === 0) {\n return '';\n }\n // Special case: single _root raw field means the whole expression is raw\n if (fields.length === 1 && fields[0].name === '_root' && fields[0].mode === 'raw') {\n return fields[0].value;\n }\n\n const entries = fields.map((field) => formatFieldEntry(field)).filter(Boolean);\n return `{\\n${entries.join(',\\n')}\\n}`;\n}\n\n/**\n * Check if a JSONata expression can be fully represented by the builder\n * (i.e., all fields are simple refs or nested objects of simple refs).\n */\nexport function isBuilderCompatible(expression: string): boolean {\n const fields = parseJsonataToBuilder(expression);\n return fields.every((f) => f.mode === 'ref' || (f.children && f.children.every(isFieldSimple)));\n}\n\nfunction isFieldSimple(field: BuilderField): boolean {\n if (field.mode === 'raw') return false;\n if (field.children) return field.children.every(isFieldSimple);\n return true;\n}\n\nfunction parseObjectEntries(entries: any[][], source: string): BuilderField[] {\n return entries.map(([keyNode, valueNode]) => {\n const name = keyNode.value as string;\n return classifyValue(name, valueNode, source);\n });\n}\n\nfunction classifyValue(name: string, node: any, source: string): BuilderField {\n // Simple path reference: $doc.x.y, $pv.x, $case.x — store as JSONata directly\n if (node.type === 'path' && node.steps?.length > 0 && node.steps[0].type === 'variable') {\n const varName = node.steps[0].value; // doc, pv, case\n if (['doc', 'pv', 'case'].includes(varName)) {\n const path = node.steps\n .slice(1)\n .map((s: any) => s.value)\n .join('.');\n return { name, mode: 'ref', value: `$${varName}.${path}` };\n }\n }\n\n // String literal\n if (node.type === 'string') {\n return { name, mode: 'ref', value: `\"${node.value}\"` };\n }\n\n // Number literal\n if (node.type === 'number') {\n return { name, mode: 'ref', value: String(node.value) };\n }\n\n // Boolean literal (value node)\n if (node.type === 'value' && typeof node.value === 'boolean') {\n return { name, mode: 'ref', value: String(node.value) };\n }\n\n // Nested object\n if (node.type === 'unary' && node.value === '{' && node.lhs) {\n const children = parseObjectEntries(node.lhs, source);\n return { name, mode: 'ref', value: '', children };\n }\n\n // Anything else: extract raw source text\n const raw = extractSourceFragment(node, source);\n return { name, mode: 'raw', value: raw };\n}\n\n/**\n * Extract the source text for a node using position info.\n * Falls back to a generic representation if positions aren't useful.\n */\nfunction extractSourceFragment(node: any, source: string): string {\n // Try to reconstruct from AST for common patterns\n if (node.type === 'condition') {\n const cond = reconstructExpression(node.condition);\n const then = reconstructExpression(node.then);\n const els = reconstructExpression(node.else);\n return `${cond} ? ${then} : ${els}`;\n }\n if (node.type === 'binary') {\n const left = reconstructExpression(node.lhs);\n const right = reconstructExpression(node.rhs);\n return `${left} ${node.value} ${right}`;\n }\n if (node.type === 'function') {\n const name = reconstructExpression(node.procedure);\n const args = (node.arguments || []).map(reconstructExpression).join(', ');\n return `${name}(${args})`;\n }\n // Generic fallback\n return reconstructExpression(node);\n}\n\nfunction reconstructExpression(node: any): string {\n if (!node) return '';\n if (node.type === 'string') return `\"${node.value}\"`;\n if (node.type === 'number') return String(node.value);\n if (node.type === 'value') return String(node.value);\n if (node.type === 'path' && node.steps) {\n return node.steps.map((s: any) => (s.type === 'variable' ? `$${s.value}` : s.value)).join('.');\n }\n if (node.type === 'binary') {\n return `${reconstructExpression(node.lhs)} ${node.value} ${reconstructExpression(node.rhs)}`;\n }\n if (node.type === 'condition') {\n return `${reconstructExpression(node.condition)} ? ${reconstructExpression(node.then)} : ${reconstructExpression(node.else)}`;\n }\n if (node.type === 'function') {\n const proc = reconstructExpression(node.procedure);\n const args = (node.arguments || []).map(reconstructExpression).join(', ');\n return `${proc}(${args})`;\n }\n if (node.type === 'unary' && node.value === '{') {\n const entries = (node.lhs || [])\n .map(([k, v]: any[]) => `\"${k.value}\": ${reconstructExpression(v)}`)\n .join(', ');\n return `{${entries}}`;\n }\n return '...';\n}\n\nfunction formatFieldEntry(field: BuilderField, indent: string = ' '): string {\n if (field.children && field.children.length > 0) {\n const childEntries = field.children.map((c) => formatFieldEntry(c, indent + ' ')).join(',\\n');\n return `${indent}\"${field.name}\": {\\n${childEntries}\\n${indent}}`;\n }\n\n // Value is already valid JSONata (e.g. $doc.x.y, \"string\", 42, or raw expression)\n const value = field.value || 'null';\n return `${indent}\"${field.name}\": ${value}`;\n}\n","import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { PluginTranslatePipeModule } from '@valtimo/plugin';\nimport { TemplateField, VariableSuggestions } from '../../models';\nimport { BuilderFieldComponent } from './builder-field/builder-field.component';\nimport {\n BuilderField,\n builderToJsonata,\n parseJsonataToBuilder,\n} from '../../utils/jsonata-converter';\n\n@Component({\n selector: 'epistola-mapping-builder',\n standalone: true,\n imports: [CommonModule, FormsModule, PluginTranslatePipeModule, BuilderFieldComponent],\n template: `\n <div class=\"mapping-builder\">\n <div\n *ngIf=\"fields.length === 0 && (!templateFields || templateFields.length === 0)\"\n class=\"mapping-builder__empty\"\n >\n {{ 'noTemplateFields' | pluginTranslate: 'epistola' | async }}\n </div>\n\n <epistola-builder-field\n *ngFor=\"let field of fields; let i = index\"\n [field]=\"field\"\n [path]=\"[i]\"\n [suggestions]=\"allSuggestions\"\n [disabled]=\"disabled\"\n [collapsed]=\"isCollapsed([i])\"\n [collapsedPaths]=\"collapsedPaths\"\n [required]=\"isRequired(field.name)\"\n (valueChange)=\"onNestedValueChange($event.path, $event.value)\"\n (modeToggle)=\"onNestedModeToggle($event)\"\n (collapseToggle)=\"toggleCollapse($event)\"\n ></epistola-builder-field>\n </div>\n `,\n styles: [\n `\n .mapping-builder__empty {\n color: #6f6f6f;\n font-size: 0.9em;\n padding: 12px 0;\n }\n .mapping-builder__row {\n margin-bottom: 8px;\n }\n .mapping-builder__row--child {\n margin-left: 20px;\n margin-bottom: 4px;\n }\n .mapping-builder__name {\n margin-bottom: 2px;\n }\n .mapping-builder__name--clickable {\n cursor: pointer;\n user-select: none;\n }\n .mapping-builder__name--clickable:hover {\n color: #0f62fe;\n }\n .mapping-builder__chevron {\n font-size: 0.7em;\n margin-right: 4px;\n }\n .mapping-builder__field-name {\n font-weight: 500;\n font-size: 0.9em;\n }\n .mapping-builder__required {\n color: #da1e28;\n margin-left: 2px;\n }\n .mapping-builder__type {\n color: #8d8d8d;\n font-size: 0.8em;\n margin-left: 4px;\n }\n .mapping-builder__value {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n .mapping-builder__input {\n flex: 1;\n padding: 6px 8px;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n font-size: 0.85em;\n font-family: 'IBM Plex Mono', monospace;\n }\n .mapping-builder__input:focus {\n outline: 2px solid #0f62fe;\n border-color: #0f62fe;\n }\n .mapping-builder__input--raw {\n background: #f4f4f4;\n }\n .mapping-builder__mode-toggle {\n width: 28px;\n height: 28px;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n background: #fff;\n cursor: pointer;\n font-family: monospace;\n font-size: 0.8em;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .mapping-builder__mode-toggle:hover {\n background: #f4f4f4;\n }\n .mapping-builder__children {\n border-left: 2px solid #e0e0e0;\n padding-left: 12px;\n margin-top: 4px;\n }\n `,\n ],\n})\nexport class MappingBuilderComponent implements OnChanges {\n @Input() expression: string = '';\n @Input() templateFields: TemplateField[] = [];\n @Input() suggestions: VariableSuggestions | null = null;\n @Input() disabled: boolean = false;\n @Output() expressionChange = new EventEmitter<string>();\n\n fields: BuilderField[] = [];\n allSuggestions: string[] = [];\n collapsedPaths = new Set<string>();\n private initialCollapseApplied = false;\n\n ngOnChanges(changes: SimpleChanges): void {\n // Skip re-parse only when expression alone changed (from our own emit)\n const expressionChanged = !!changes['expression'];\n const templateFieldsChanged = !!changes['templateFields'];\n\n if (expressionChanged && !templateFieldsChanged && !changes['expression'].firstChange) {\n return; // Don't re-parse when we emit changes ourselves\n }\n if (expressionChanged || templateFieldsChanged) {\n this.rebuildFields();\n if (!this.initialCollapseApplied && this.fields.length > 0) {\n this.collapseAll();\n this.initialCollapseApplied = true;\n }\n }\n if (changes['suggestions']) {\n this.buildSuggestionList();\n }\n }\n\n onNestedValueChange(path: number[], value: string): void {\n const field = this.getFieldAtPath(path);\n if (field) {\n field.value = value;\n this.emit();\n }\n }\n\n onNestedModeToggle(path: number[]): void {\n const field = this.getFieldAtPath(path);\n if (field) {\n field.mode = field.mode === 'ref' ? 'raw' : 'ref';\n this.emit();\n }\n }\n\n isRequired(fieldName: string): boolean {\n return this.templateFields?.find((tf) => tf.name === fieldName)?.required ?? false;\n }\n\n isCollapsed(path: number[]): boolean {\n return this.collapsedPaths.has(path.join('.'));\n }\n\n toggleCollapse(path: number[]): void {\n const key = path.join('.');\n if (this.collapsedPaths.has(key)) {\n this.collapsedPaths.delete(key);\n } else {\n this.collapsedPaths.add(key);\n }\n }\n\n private collapseAll(): void {\n this.collapsedPaths.clear();\n this.fields.forEach((field, i) => {\n if (field.children) {\n this.collapsedPaths.add(String(i));\n this.collapseChildren(field.children, [i]);\n }\n });\n }\n\n private collapseChildren(children: BuilderField[], parentPath: number[]): void {\n children.forEach((child, j) => {\n if (child.children) {\n this.collapsedPaths.add([...parentPath, j].join('.'));\n this.collapseChildren(child.children, [...parentPath, j]);\n }\n });\n }\n\n private getFieldAtPath(path: number[]): BuilderField | null {\n if (path.length === 0) return null;\n let current: BuilderField = this.fields[path[0]];\n for (let i = 1; i < path.length; i++) {\n if (!current.children) return null;\n current = current.children[path[i]];\n }\n return current;\n }\n\n private emit(): void {\n const jsonata = builderToJsonata(this.fields);\n this.expressionChange.emit(jsonata);\n }\n\n /**\n * Ensure all template fields have a corresponding builder field.\n * Adds missing fields with empty values.\n */\n private buildSuggestionList(): void {\n if (!this.suggestions) {\n this.allSuggestions = [];\n return;\n }\n const docSuggestions = (this.suggestions.doc || []).map((p) => `$doc.${p}`);\n const pvSuggestions = (this.suggestions.pv || []).map((p) => `$pv.${p}`);\n this.allSuggestions = [...docSuggestions, ...pvSuggestions];\n }\n\n /**\n * Rebuild fields using template fields as the source of truth.\n * Expression values fill in where available; unmapped fields show empty.\n */\n private rebuildFields(): void {\n const parsed = parseJsonataToBuilder(this.expression);\n const parsedByName = new Map(parsed.map((f) => [f.name, f]));\n\n if (!this.templateFields || this.templateFields.length === 0) {\n // No template fields yet — use whatever we parsed\n this.fields = parsed;\n return;\n }\n\n // Template fields drive the structure\n this.fields = this.templateFields.map((tf) => {\n const existing = parsedByName.get(tf.name);\n if (existing) {\n return existing;\n }\n if (tf.fieldType === 'OBJECT' && tf.children?.length) {\n return {\n name: tf.name,\n mode: 'ref' as const,\n value: '',\n children: tf.children.map((c) => ({ name: c.name, mode: 'ref' as const, value: '' })),\n };\n }\n return { name: tf.name, mode: 'ref' as const, value: '' };\n });\n\n // Include extra fields from expression not in the template schema\n for (const p of parsed) {\n if (!this.templateFields.find((tf) => tf.name === p.name)) {\n this.fields.push(p);\n }\n }\n }\n}\n","import {\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { PluginTranslatePipeModule } from '@valtimo/plugin';\nimport { Subject, debounceTime, takeUntil } from 'rxjs';\nimport { EvaluationResult, TemplateField } from '../../models';\nimport { EpistolaPluginService } from '../../services';\n\n@Component({\n selector: 'epistola-mapping-preview',\n standalone: true,\n imports: [CommonModule, FormsModule, PluginTranslatePipeModule],\n template: `\n <div class=\"preview\">\n <div class=\"preview__header\">\n <span class=\"preview__title\">{{\n 'previewTitle' | pluginTranslate: 'epistola' | async\n }}</span>\n <div class=\"preview__controls\">\n <input\n type=\"text\"\n class=\"preview__doc-input\"\n [ngModel]=\"documentId\"\n (ngModelChange)=\"documentId = $event\"\n [placeholder]=\"'previewDocPlaceholder' | pluginTranslate: 'epistola' | async\"\n />\n <button\n class=\"preview__run-btn\"\n (click)=\"runPreview()\"\n [disabled]=\"!documentId || !expression || loading\"\n >\n ▶\n </button>\n </div>\n </div>\n\n <div class=\"preview__panels\">\n <!-- Expected structure -->\n <div class=\"preview__panel\">\n <div class=\"preview__panel-label\">\n {{ 'previewExpected' | pluginTranslate: 'epistola' | async }}\n </div>\n <pre class=\"preview__code\">{{ expectedJson }}</pre>\n </div>\n\n <!-- Produced output -->\n <div class=\"preview__panel\">\n <div class=\"preview__panel-label\">\n {{ 'previewProduced' | pluginTranslate: 'epistola' | async }}\n </div>\n <div *ngIf=\"loading\" class=\"preview__loading\">...</div>\n <pre *ngIf=\"!loading && result?.success\" class=\"preview__code\">{{\n result.result | json\n }}</pre>\n <div *ngIf=\"!loading && result && !result.success\" class=\"preview__error\">\n {{ result.error }}\n </div>\n <div *ngIf=\"!loading && !result\" class=\"preview__placeholder\">\n {{ 'previewRunHint' | pluginTranslate: 'epistola' | async }}\n </div>\n </div>\n </div>\n\n <!-- Missing fields warning -->\n <div *ngIf=\"missingRequired.length > 0\" class=\"preview__warnings\">\n <span class=\"preview__warning-icon\">⚠</span>\n {{ 'previewMissing' | pluginTranslate: 'epistola' | async }}:\n <strong>{{ missingRequired.join(', ') }}</strong>\n </div>\n </div>\n `,\n styles: [\n `\n .preview {\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n margin-top: 16px;\n overflow: hidden;\n }\n .preview__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n background: #f4f4f4;\n border-bottom: 1px solid #e0e0e0;\n }\n .preview__title {\n font-weight: 600;\n font-size: 0.85em;\n }\n .preview__controls {\n display: flex;\n gap: 4px;\n }\n .preview__doc-input {\n padding: 4px 8px;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n font-size: 0.8em;\n width: 220px;\n font-family: monospace;\n }\n .preview__run-btn {\n padding: 4px 10px;\n border: 1px solid #0f62fe;\n border-radius: 4px;\n background: #0f62fe;\n color: white;\n cursor: pointer;\n font-size: 0.8em;\n }\n .preview__run-btn:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n .preview__panels {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1px;\n background: #e0e0e0;\n }\n .preview__panel {\n background: white;\n padding: 8px 12px;\n min-height: 80px;\n }\n .preview__panel-label {\n font-size: 0.75em;\n color: #6f6f6f;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 4px;\n }\n .preview__code {\n font-family: 'IBM Plex Mono', monospace;\n font-size: 0.8em;\n line-height: 1.4;\n margin: 0;\n white-space: pre-wrap;\n word-break: break-word;\n }\n .preview__loading {\n color: #8d8d8d;\n }\n .preview__error {\n color: #da1e28;\n font-size: 0.85em;\n }\n .preview__placeholder {\n color: #8d8d8d;\n font-size: 0.85em;\n font-style: italic;\n }\n .preview__warnings {\n padding: 8px 12px;\n background: #fff8e1;\n border-top: 1px solid #e0e0e0;\n font-size: 0.85em;\n color: #663c00;\n }\n .preview__warning-icon {\n margin-right: 4px;\n }\n `,\n ],\n})\nexport class MappingPreviewComponent implements OnChanges, OnDestroy {\n @Input() expression: string = '';\n @Input() templateFields: TemplateField[] = [];\n @Input() caseDefinitionKey: string | null = null;\n\n documentId: string = '';\n loading = false;\n result: EvaluationResult | null = null;\n expectedJson: string = '';\n missingRequired: string[] = [];\n\n private destroy$ = new Subject<void>();\n private evaluate$ = new Subject<void>();\n\n constructor(private readonly epistolaPluginService: EpistolaPluginService) {\n this.evaluate$.pipe(debounceTime(300), takeUntil(this.destroy$)).subscribe(() => {\n this.doEvaluate();\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['templateFields']) {\n this.expectedJson = this.buildExpectedJson();\n }\n if (changes['expression'] || changes['templateFields']) {\n this.checkMissingRequired();\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n runPreview(): void {\n this.evaluate$.next();\n }\n\n private doEvaluate(): void {\n if (!this.documentId || !this.expression) return;\n this.loading = true;\n this.epistolaPluginService.evaluateMapping(this.expression, this.documentId).subscribe({\n next: (result) => {\n this.result = result;\n this.loading = false;\n if (result.success) {\n this.checkMissingRequired();\n }\n },\n error: (err) => {\n this.result = { success: false, result: null, error: err.message || 'Request failed' };\n this.loading = false;\n },\n });\n }\n\n private buildExpectedJson(): string {\n if (!this.templateFields || this.templateFields.length === 0) return '{}';\n const obj: Record<string, string> = {};\n for (const field of this.templateFields) {\n const type = field.type || 'any';\n obj[field.name] = field.required ? `${type} (required)` : type;\n }\n return JSON.stringify(obj, null, 2);\n }\n\n private checkMissingRequired(): void {\n if (!this.templateFields) {\n this.missingRequired = [];\n return;\n }\n const requiredFields = this.templateFields.filter((f) => f.required).map((f) => f.name);\n if (!this.result?.success || !this.result.result) {\n // If no evaluation result yet, check statically from expression\n this.missingRequired = requiredFields;\n return;\n }\n const producedKeys = new Set(Object.keys(this.result.result));\n this.missingRequired = requiredFields.filter((f) => !producedKeys.has(f));\n }\n}\n","import { OverrideMapping } from '../override-builder/override-builder.component';\n\nexport const FORM_REF_PREFIX = 'form:';\n\n/**\n * Detect if a string value is a JSONata expression (vs a plain literal).\n * Checks for characters that indicate JSONata operators: $, &, (, {, ?, [\n */\nexport function isExpression(value: string): boolean {\n return /[$&({?\\[]/.test(value);\n}\n\n/**\n * Expand dot-notation keys into nested objects.\n * e.g. { \"beslissing.tekst\": \"value\" } -> { beslissing: { tekst: \"value\" } }\n */\nexport function expandDotNotation(flat: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = {};\n for (const [key, value] of Object.entries(flat)) {\n const parts = key.split('.');\n let current = result;\n for (let i = 0; i < parts.length - 1; i++) {\n if (!current[parts[i]] || typeof current[parts[i]] !== 'object') {\n current[parts[i]] = {};\n }\n current = current[parts[i]];\n }\n current[parts[parts.length - 1]] = value;\n }\n return result;\n}\n\n/**\n * A preview is \"override-driven\" when it has a non-empty override mapping: its\n * input data comes from the form via the mapping, so it must wait for that data\n * before it can render. Previews without a mapping load straight from the base\n * doc/case data.\n */\nexport function isOverrideDriven(mapping?: OverrideMapping | null): boolean {\n return !!mapping && Object.keys(mapping).length > 0;\n}\n\n/**\n * Whether the computed input overrides carry any usable data yet.\n */\nexport function hasUsableOverrides(overrides?: Record<string, any> | null): boolean {\n return !!overrides && Object.keys(overrides).length > 0;\n}\n\n/**\n * Decide whether a preview request should fire given the configured override\n * mapping and the currently computed overrides.\n *\n * - Override-driven previews only load once the mapped form data is present;\n * before that they show a \"complete the form\" placeholder and fire nothing\n * (avoids a doomed request that Epistola rejects with a 400 for missing\n * required fields).\n * - Previews without a mapping always load (base data is the whole input).\n */\nexport function shouldLoadPreview(\n mapping?: OverrideMapping | null,\n overrides?: Record<string, any> | null,\n): boolean {\n if (isOverrideDriven(mapping)) {\n return hasUsableOverrides(overrides);\n }\n return true;\n}\n\n/**\n * Given an override mapping (scope -> { inputPath -> \"form:<componentKey>\" })\n * and form data, produce the inputOverrides object for the backend.\n * The \"form:\" prefix identifies form field references; the remainder is the Formio component key.\n */\nexport function computeInputOverrides(\n mapping: OverrideMapping,\n formData: Record<string, any>,\n): Record<string, any> {\n const result: Record<string, any> = {};\n for (const [scope, fields] of Object.entries(mapping)) {\n if (scope !== 'doc' && scope !== 'pv') continue;\n const flatOverrides: Record<string, any> = {};\n for (const [inputPath, ref] of Object.entries(fields)) {\n const formFieldKey = String(ref).startsWith(FORM_REF_PREFIX)\n ? String(ref).substring(FORM_REF_PREFIX.length)\n : String(ref);\n const value = formData[formFieldKey];\n if (value !== undefined) {\n flatOverrides[inputPath] = value;\n }\n }\n if (Object.keys(flatOverrides).length > 0) {\n result[scope] = expandDotNotation(flatOverrides);\n }\n }\n return result;\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport {\n FunctionConfigurationComponent,\n PluginConfigurationData,\n PluginTranslatePipeModule,\n} from '@valtimo/plugin';\nimport {\n FormModule,\n FormOutput,\n InputModule,\n SelectedValue,\n SelectItem,\n SelectModule,\n} from '@valtimo/components';\nimport { CaseManagementParams, ManagementContext } from '@valtimo/shared';\nimport { ProcessLinkStateService } from '@valtimo/process-link';\nimport { BehaviorSubject, combineLatest, merge, Observable, of, Subject, Subscription } from 'rxjs';\nimport {\n catchError,\n distinctUntilChanged,\n filter,\n map,\n shareReplay,\n switchMap,\n take,\n takeUntil,\n tap,\n} from 'rxjs/operators';\nimport {\n AsyncResource,\n errorResource,\n ExpressionFunctionInfo,\n GenerateDocumentConfig,\n initialResource,\n JsonataFieldError,\n loadingResource,\n successResource,\n TemplateField,\n ValidateJsonataRequest,\n VariableSuggestions,\n} from '../../models';\nimport { EpistolaPluginService } from '../../services';\nimport { JsonataEditorComponent } from '../jsonata-editor/jsonata-editor.component';\nimport { ExpectedStructureComponent } from '../expected-structure/expected-structure.component';\nimport { MappingBuilderComponent } from '../mapping-builder/mapping-builder.component';\nimport { MappingPreviewComponent } from '../mapping-preview/mapping-preview.component';\nimport { isExpression } from '../epistola-document-preview/preview-utils';\n\nexport type VariantSelectionMode = 'explicit' | 'attributes';\n\n@Component({\n selector: 'epistola-generate-document-configuration',\n templateUrl: './generate-document-configuration.component.html',\n styleUrls: ['./generate-document-configuration.component.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n FormsModule,\n PluginTranslatePipeModule,\n FormModule,\n InputModule,\n SelectModule,\n ExpectedStructureComponent,\n JsonataEditorComponent,\n MappingBuilderComponent,\n MappingPreviewComponent,\n ],\n})\nexport class GenerateDocumentConfigurationComponent\n implements FunctionConfigurationComponent, OnInit, OnDestroy\n{\n @Input() save$!: Observable<void>;\n @Input() disabled$!: Observable<boolean>;\n @Input() pluginId!: string;\n @Input() prefillConfiguration$!: Observable<GenerateDocumentConfig>;\n @Input() selectedPluginConfigurationData$?: Observable<PluginConfigurationData>;\n @Input() context$?: Observable<[ManagementContext, CaseManagementParams]>;\n\n @Output() valid: EventEmitter<boolean> = new EventEmitter<boolean>();\n @Output() configuration: EventEmitter<GenerateDocumentConfig> =\n new EventEmitter<GenerateDocumentConfig>();\n\n catalogs$ = new BehaviorSubject<AsyncResource<SelectItem[]>>(initialResource([]));\n templates$ = new BehaviorSubject<AsyncResource<SelectItem[]>>(initialResource([]));\n variants$ = new BehaviorSubject<AsyncResource<SelectItem[]>>(initialResource([]));\n environments$ = new BehaviorSubject<AsyncResource<SelectItem[]>>(initialResource([]));\n templateFields$ = new BehaviorSubject<AsyncResource<TemplateField[]>>(initialResource([]));\n\n dataMapping$ = new BehaviorSubject<string>('');\n mappingMode: 'simple' | 'advanced' = 'simple';\n toolsCollapsed = true;\n activeToolTab: 'schema' | 'preview' = 'preview';\n\n outputFormatOptions: SelectItem[] = [\n { id: 'PDF', text: 'PDF' },\n { id: 'HTML', text: 'HTML' },\n ];\n\n readonly selectedCatalogId$ = new BehaviorSubject<string>('');\n /** Composite ID: \"catalogId/templateId\" */\n readonly selectedTemplateId$ = new BehaviorSubject<string>('');\n\n /**\n * Force-clears the templateId v-select. Triggered when the catalog changes —\n * v-select's `setDefaultSelection` ignores empty-string defaults, so binding\n * `[defaultSelectionId]=\"\"` does NOT reset the dropdown. The `clearSelectionSubject$`\n * input is the supported escape hatch.\n */\n readonly clearTemplateId$ = new Subject<void>();\n /** Same pattern for the explicit-mode variantId v-select. */\n readonly clearVariantId$ = new Subject<void>();\n\n variantSelectionMode: VariantSelectionMode = 'explicit';\n variantIdExpressionMode = false;\n variantIdExpression = '';\n /**\n * Plain-mode variant id. Tracked outside `<v-form>` because the explicit\n * variant `<v-select>` lives inside `<div class=\"field-with-fx\">`, and\n * v-form's `@ContentChildren(SelectComponent)` query only sees direct\n * children (Angular defaults `descendants: false`).\n */\n variantIdValue = '';\n filenameExpressionMode = false;\n filenameExpression = '';\n /** Plain-mode filename. Tracked outside `<v-form>` for the same reason as `variantIdValue`. */\n filenameValue = '';\n variantAttributeEntries: {\n key: string;\n value: string;\n required: boolean;\n _customKey?: boolean;\n _expressionMode?: boolean;\n }[] = [];\n availableAttributeKeys: string[] = [];\n caseDefinitionKey: string | null = null;\n processVariables: string[] = [];\n expressionFunctions: ExpressionFunctionInfo[] = [];\n variableSuggestions: VariableSuggestions | null = null;\n prefillDataMapping: Record<string, any> = {};\n validationErrors$ = new BehaviorSubject<JsonataFieldError[]>([]);\n\n private readonly destroy$ = new Subject<void>();\n private saveSubscription!: Subscription;\n private readonly formValue$ = new BehaviorSubject<Partial<GenerateDocumentConfig> | null>(null);\n private readonly valid$ = new BehaviorSubject<boolean>(false);\n private pluginConfigurationId$ = new BehaviorSubject<string>('');\n\n /** Resolves once with the prefill config (or empty config if none). */\n private prefill$!: Observable<GenerateDocumentConfig | null>;\n\n constructor(\n private readonly epistolaPluginService: EpistolaPluginService,\n private readonly processLinkStateService: ProcessLinkStateService,\n private readonly cdr: ChangeDetectorRef,\n ) {}\n\n ngOnInit(): void {\n this.prefill$ = this.resolvePrefill$();\n\n this.initContext();\n this.initPluginConfiguration();\n this.initCascade();\n this.loadExpressionFunctions();\n this.openSaveSubscription();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n this.saveSubscription?.unsubscribe();\n }\n\n formValueChange(formOutput: FormOutput): void {\n const formValue = formOutput as unknown as Partial<\n GenerateDocumentConfig & { catalogId: string; templateId: string }\n >;\n this.formValue$.next(formValue);\n\n // When catalog changes, reset template and variant selection.\n // The clear$ subjects force-clear the v-selects' internal `selected$` state —\n // without them the dropdown keeps the previous id and the next v-form emission\n // re-applies it under the new catalog, causing 404s when the template doesn't exist\n // in the newly selected catalog.\n if (formValue.catalogId && formValue.catalogId !== this.selectedCatalogId$.getValue()) {\n this.selectedCatalogId$.next(formValue.catalogId);\n this.selectedTemplateId$.next('');\n this.variantIdValue = '';\n this.clearTemplateId$.next();\n this.clearVariantId$.next();\n return;\n }\n\n // templateId from v-select is the template ID within the selected catalog\n if (formValue.templateId && formValue.templateId !== this.selectedTemplateId$.getValue()) {\n this.selectedTemplateId$.next(formValue.templateId);\n this.variantIdValue = '';\n this.clearVariantId$.next();\n }\n\n this.handleValid(formValue);\n }\n\n onDataMappingChange(expression: string): void {\n this.dataMapping$.next(expression);\n this.revalidate();\n }\n\n onFilenameValueChange(value: string | undefined): void {\n this.filenameValue = value ?? '';\n this.revalidate();\n }\n\n onVariantIdValueChange(value: SelectedValue | undefined): void {\n // v-select is single-select here, so SelectedValue narrows to string | number;\n // our variant ids are always strings — coerce defensively.\n this.variantIdValue = value == null || Array.isArray(value) ? '' : String(value);\n this.revalidate();\n }\n\n toggleFilenameExpressionMode(): void {\n this.filenameExpressionMode = !this.filenameExpressionMode;\n this.revalidate();\n }\n\n toggleVariantIdExpressionMode(): void {\n this.variantIdExpressionMode = !this.variantIdExpressionMode;\n this.revalidate();\n }\n\n onVariantSelectionModeChange(mode: VariantSelectionMode): void {\n this.variantSelectionMode = mode;\n if (mode === 'attributes' && this.variantAttributeEntries.length === 0) {\n this.variantAttributeEntries = [{ key: '', value: '', required: true }];\n }\n this.revalidate();\n }\n\n addAttributeEntry(): void {\n this.variantAttributeEntries = [\n ...this.variantAttributeEntries,\n { key: '', value: '', required: true },\n ];\n this.revalidate();\n }\n\n removeAttributeEntry(index: number): void {\n this.variantAttributeEntries = this.variantAttributeEntries.filter((_, i) => i !== index);\n this.revalidate();\n }\n\n onAttributeEntryChange(): void {\n this.revalidate();\n }\n\n onVariantIdExpressionChange(): void {\n this.revalidate();\n }\n\n onFilenameExpressionChange(): void {\n this.revalidate();\n }\n\n onKeySelected(\n entry: { key: string; value: string; required: boolean; _customKey?: boolean },\n value: string,\n ): void {\n if (value === '__custom__') {\n entry._customKey = true;\n entry.key = '';\n } else {\n entry.key = value;\n }\n this.onAttributeEntryChange();\n }\n\n cancelCustomKey(entry: {\n key: string;\n value: string;\n required: boolean;\n _customKey?: boolean;\n }): void {\n entry._customKey = false;\n entry.key = '';\n this.onAttributeEntryChange();\n }\n\n private revalidate(): void {\n const currentFormValue = this.formValue$.getValue();\n if (currentFormValue) {\n this.handleValid(currentFormValue);\n }\n }\n\n private formatAttributes(attributes: Record<string, string>): string {\n const entries = Object.entries(attributes || {});\n if (entries.length === 0) return '';\n return ` (${entries.map(([k, v]) => `${k}=${v}`).join(', ')})`;\n }\n\n /**\n * Creates a shared observable that resolves once with the prefill config\n * (or null if no prefill is provided). This is used to seed the cascade\n * with initial selection values before any loading starts.\n */\n private resolvePrefill$(): Observable<GenerateDocumentConfig | null> {\n if (!this.prefillConfiguration$) {\n return of(null).pipe(shareReplay(1));\n }\n return this.prefillConfiguration$.pipe(take(1), shareReplay(1));\n }\n\n private initContext(): void {\n if (this.context$) {\n this.context$\n .pipe(\n takeUntil(this.destroy$),\n filter(([context]) => context === 'case'),\n )\n .subscribe(([, params]) => {\n this.caseDefinitionKey = params.caseDefinitionKey;\n this.cdr.markForCheck();\n });\n }\n }\n\n private initPluginConfiguration(): void {\n const sources: Observable<string>[] = [];\n\n if (this.selectedPluginConfigurationData$) {\n sources.push(\n this.selectedPluginConfigurationData$.pipe(\n filter((config) => !!config?.configurationId),\n map((config) => config.configurationId),\n ),\n );\n }\n\n sources.push(\n this.processLinkStateService.selectedProcessLink$.pipe(\n filter((processLink) => !!processLink?.pluginConfigurationId),\n map((processLink) => processLink.pluginConfigurationId!),\n ),\n );\n\n merge(...sources)\n .pipe(takeUntil(this.destroy$))\n .subscribe((configurationId) => {\n this.pluginConfigurationId$.next(configurationId);\n });\n }\n\n /**\n * Sets up the entire reactive cascade:\n *\n * pluginConfigurationId$ → catalogs (+ environments independently)\n * prefill + catalogs loaded → seed selectedCatalogId$\n * selectedCatalogId$ → templates (+ attributes)\n * prefill + templates loaded → seed selectedTemplateId$\n * selectedTemplateId$ → variants + templateFields\n * prefill + templateFields loaded → seed dataMapping\n */\n private initCascade(): void {\n const configId$ = this.pluginConfigurationId$.pipe(\n filter((id) => !!id),\n distinctUntilChanged(),\n );\n\n // ── Catalogs: load when pluginConfigurationId changes ──\n configId$\n .pipe(\n takeUntil(this.destroy$),\n tap(() => this.catalogs$.next(loadingResource(this.catalogs$.getValue().data))),\n switchMap((configurationId) =>\n this.epistolaPluginService.getCatalogs(configurationId).pipe(\n map((catalogs) => successResource(catalogs.map((c) => ({ id: c.id, text: c.name })))),\n catchError(() => of(errorResource<SelectItem[]>([], 'Failed to load catalogs'))),\n ),\n ),\n )\n .subscribe((resource) => this.catalogs$.next(resource));\n\n // ── Environments: load when pluginConfigurationId changes (independent) ──\n configId$\n .pipe(\n takeUntil(this.destroy$),\n tap(() => this.environments$.next(loadingResource(this.environments$.getValue().data))),\n switchMap((configurationId) =>\n this.epistolaPluginService.getEnvironments(configurationId).pipe(\n map((envs) => successResource(envs.map((e) => ({ id: e.id, text: e.name })))),\n catchError(() => of(errorResource<SelectItem[]>([], 'Failed to load environments'))),\n ),\n ),\n )\n .subscribe((resource) => this.environments$.next(resource));\n\n // ── Seed selectedCatalogId$ from prefill once catalogs are loaded ──\n combineLatest([\n this.prefill$.pipe(filter((config) => !!config?.catalogId)),\n this.catalogs$.pipe(filter((c) => !c.loading && c.data.length > 0)),\n ])\n .pipe(takeUntil(this.destroy$), take(1))\n .subscribe(([config]) => {\n this.selectedCatalogId$.next(config!.catalogId);\n });\n\n // ── Templates: load when catalogId changes ──\n const catalogId$ = this.selectedCatalogId$.pipe(\n filter((id) => !!id),\n distinctUntilChanged(),\n );\n\n combineLatest([configId$, catalogId$])\n .pipe(\n takeUntil(this.destroy$),\n tap(() => this.templates$.next(loadingResource(this.templates$.getValue().data))),\n switchMap(([configurationId, catalogId]) =>\n this.epistolaPluginService.getTemplates(configurationId, catalogId).pipe(\n map((templates) => successResource(templates.map((t) => ({ id: t.id, text: t.name })))),\n catchError(() => of(errorResource<SelectItem[]>([], 'Failed to load templates'))),\n ),\n ),\n )\n .subscribe((resource) => this.templates$.next(resource));\n\n // ── Attributes: load when catalogId changes ──\n combineLatest([configId$, catalogId$])\n .pipe(\n takeUntil(this.destroy$),\n switchMap(([configurationId, catalogId]) =>\n this.epistolaPluginService\n .getAttributes(configurationId, catalogId)\n .pipe(catchError(() => of([]))),\n ),\n )\n .subscribe((attributes) => {\n this.availableAttributeKeys = attributes.map((a) => a.key).sort();\n this.cdr.markForCheck();\n });\n\n // ── Seed selectedTemplateId$ from prefill once templates are loaded ──\n combineLatest([\n this.prefill$.pipe(filter((config) => !!config?.templateId)),\n this.templates$.pipe(filter((t) => !t.loading && t.data.length > 0)),\n ])\n .pipe(takeUntil(this.destroy$), take(1))\n .subscribe(([config]) => {\n this.selectedTemplateId$.next(config!.templateId);\n });\n\n // ── Variants: load when templateId changes ──\n const templateId$ = this.selectedTemplateId$.pipe(\n filter((id) => !!id),\n distinctUntilChanged(),\n );\n\n combineLatest([configId$, catalogId$, templateId$])\n .pipe(\n takeUntil(this.destroy$),\n tap(() => this.variants$.next(loadingResource(this.variants$.getValue().data))),\n switchMap(([configurationId, catalogId, templateId]) =>\n this.epistolaPluginService.getVariants(configurationId, templateId, catalogId).pipe(\n map((variants) =>\n successResource(\n variants.map((v) => ({\n id: v.id,\n text: v.name + this.formatAttributes(v.attributes),\n })),\n ),\n ),\n catchError(() => of(errorResource<SelectItem[]>([], 'Failed to load variants'))),\n ),\n ),\n )\n .subscribe((resource) => this.variants$.next(resource));\n\n // ── Template fields: load when templateId changes ──\n combineLatest([configId$, catalogId$, templateId$])\n .pipe(\n takeUntil(this.destroy$),\n tap(() => {\n this.templateFields$.next(loadingResource(this.templateFields$.getValue().data));\n this.loadProcessVariables();\n this.loadVariableSuggestions();\n }),\n switchMap(([configurationId, catalogId, templateId]) =>\n this.epistolaPluginService\n .getTemplateDetails(configurationId, templateId, catalogId)\n .pipe(\n map((details) => successResource(details.fields || [])),\n catchError(() =>\n of(errorResource<TemplateField[]>([], 'Failed to load template fields')),\n ),\n ),\n ),\n )\n .subscribe((resource) => this.templateFields$.next(resource));\n\n // ── Seed variant + dataMapping from prefill once templateFields are loaded ──\n combineLatest([\n this.prefill$.pipe(filter((config) => !!config?.templateId)),\n this.templateFields$.pipe(filter((tf) => !tf.loading && tf.data.length > 0)),\n ])\n .pipe(takeUntil(this.destroy$), take(1))\n .subscribe(([config]) => {\n if (!config) return;\n\n // Apply variant prefill\n if (\n config.variantAttributes &&\n (Array.isArray(config.variantAttributes)\n ? config.variantAttributes.length > 0\n : Object.keys(config.variantAttributes).length > 0)\n ) {\n this.variantSelectionMode = 'attributes';\n if (Array.isArray(config.variantAttributes)) {\n this.variantAttributeEntries = config.variantAttributes.map((e) => ({\n key: e.key,\n value: e.value,\n required: e.required !== false,\n _expressionMode: isExpression(e.value),\n }));\n } else {\n this.variantAttributeEntries = Object.entries(config.variantAttributes as any).map(\n ([key, value]) => ({ key, value: String(value), required: true }),\n );\n }\n } else if (config.variantId) {\n this.variantSelectionMode = 'explicit';\n if (isExpression(config.variantId)) {\n this.variantIdExpressionMode = true;\n this.variantIdExpression = config.variantId;\n } else {\n this.variantIdValue = config.variantId;\n }\n }\n\n // Detect expression mode for filename\n if (config.filename) {\n if (isExpression(config.filename)) {\n this.filenameExpressionMode = true;\n this.filenameExpression = config.filename;\n } else {\n this.filenameValue = config.filename;\n }\n }\n\n // Apply dataMapping prefill (JSONata expression string)\n if (config.dataMapping) {\n const expr = typeof config.dataMapping === 'string' ? config.dataMapping : '';\n this.dataMapping$.next(expr);\n } else {\n this.cdr.detectChanges();\n }\n });\n }\n\n private loadExpressionFunctions(): void {\n this.epistolaPluginService\n .getExpressionFunctions()\n .pipe(\n takeUntil(this.destroy$),\n catchError(() => of([])),\n )\n .subscribe((functions) => {\n this.expressionFunctions = functions;\n this.cdr.markForCheck();\n });\n }\n\n private loadProcessVariables(): void {\n if (this.caseDefinitionKey) {\n this.epistolaPluginService\n .getProcessVariables(this.caseDefinitionKey)\n .pipe(\n takeUntil(this.destroy$),\n catchError(() => of([])),\n )\n .subscribe((variables) => {\n this.processVariables = variables;\n this.cdr.markForCheck();\n });\n }\n }\n\n private loadVariableSuggestions(): void {\n this.epistolaPluginService\n .getVariableSuggestions(\n this.caseDefinitionKey ?? undefined,\n this.caseDefinitionKey ?? undefined,\n )\n .pipe(\n takeUntil(this.destroy$),\n catchError(() => of({ doc: [], pv: [] })),\n )\n .subscribe((suggestions) => {\n this.variableSuggestions = suggestions;\n this.cdr.markForCheck();\n });\n }\n\n private handleValid(formValue: Partial<GenerateDocumentConfig & { catalogId: string }>): void {\n const filenameProvided = this.filenameExpressionMode\n ? !!this.filenameExpression?.trim()\n : !!this.filenameValue?.trim();\n\n const baseComplete = !!(\n this.selectedCatalogId$.getValue() &&\n formValue?.templateId &&\n formValue?.outputFormat &&\n filenameProvided &&\n formValue?.resultProcessVariable\n );\n\n let variantValid = true;\n if (this.variantSelectionMode === 'attributes' && this.variantAttributeEntries.length > 0) {\n variantValid = this.variantAttributeEntries.every((e) => !!e.key && !!e.value);\n }\n\n const valid = baseComplete && variantValid;\n this.valid$.next(valid);\n this.valid.emit(valid);\n }\n\n private openSaveSubscription(): void {\n this.saveSubscription = this.save$?.subscribe(() => {\n combineLatest([this.formValue$, this.valid$, this.dataMapping$])\n .pipe(take(1))\n .subscribe(([formValue, valid, dataMapping]) => {\n if (valid && formValue) {\n const catalogId = this.selectedCatalogId$.getValue();\n const templateId = formValue.templateId!;\n\n const config: GenerateDocumentConfig = {\n catalogId,\n templateId,\n environmentId: formValue.environmentId || undefined,\n dataMapping: dataMapping,\n outputFormat: formValue.outputFormat as 'PDF' | 'HTML',\n filename: this.filenameExpressionMode ? this.filenameExpression : this.filenameValue,\n correlationId: formValue.correlationId || undefined,\n resultProcessVariable: formValue.resultProcessVariable!,\n };\n\n if (this.variantSelectionMode === 'explicit') {\n config.variantId = this.variantIdExpressionMode\n ? this.variantIdExpression\n : this.variantIdValue;\n } else {\n config.variantAttributes = this.variantAttributeEntries\n .filter((e) => e.key && e.value)\n .map((e) => ({ key: e.key, value: e.value, required: e.required }));\n }\n\n this.validateAndEmit(config);\n }\n });\n });\n }\n\n /**\n * Build a JSONata validation request from the config and call the backend.\n * Only fields that are JSONata expressions get validated:\n * - dataMapping is always JSONata\n * - filename / variantId only when their `fx` toggle is on\n * - variant attribute values only when isExpression() reports true\n * On invalid response, surface errors and abort the emit.\n * If the validator endpoint itself fails (network/server), proceed with the\n * emit — the validation is a quality-of-life check, not a hard gate.\n */\n private validateAndEmit(config: GenerateDocumentConfig): void {\n const variantAttributeValues: Record<string, string> = {};\n if (config.variantAttributes) {\n for (const attr of config.variantAttributes) {\n if (isExpression(attr.value)) {\n variantAttributeValues[attr.key] = attr.value;\n }\n }\n }\n\n const request: ValidateJsonataRequest = {\n dataMapping: config.dataMapping || null,\n filename: this.filenameExpressionMode ? config.filename : null,\n variantId: this.variantIdExpressionMode ? config.variantId || null : null,\n variantAttributeValues:\n Object.keys(variantAttributeValues).length > 0 ? variantAttributeValues : null,\n };\n\n this.epistolaPluginService\n .validateJsonata(request)\n .pipe(\n take(1),\n catchError(() => of({ valid: true, errors: [] as JsonataFieldError[] })),\n )\n .subscribe((result) => {\n if (result.valid) {\n this.validationErrors$.next([]);\n this.configuration.emit(config);\n } else {\n this.validationErrors$.next(result.errors);\n this.cdr.markForCheck();\n }\n });\n }\n}\n","<v-form\n (valueChange)=\"formValueChange($event)\"\n *ngIf=\"{\n disabled: disabled$ | async,\n prefill: prefillConfiguration$ ? (prefillConfiguration$ | async) : null,\n catalogs: catalogs$ | async,\n templates: templates$ | async,\n variants: variants$ | async,\n environments: environments$ | async,\n templateFields: templateFields$ | async,\n selectedCatalogId: selectedCatalogId$ | async,\n selectedTemplateId: selectedTemplateId$ | async,\n validationErrors: validationErrors$ | async,\n } as obs\"\n>\n <div\n *ngIf=\"obs.validationErrors && obs.validationErrors.length > 0\"\n class=\"jsonata-validation-errors\"\n >\n <strong>{{ 'jsonataValidationErrorsHeading' | pluginTranslate: pluginId | async }}</strong>\n <ul>\n <li *ngFor=\"let err of obs.validationErrors\">\n <code>{{ err.field }}</code\n >: {{ err.message }}\n </li>\n </ul>\n </div>\n <v-select\n name=\"catalogId\"\n [title]=\"'catalogId' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'catalogIdTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [items]=\"obs.catalogs.data\"\n [defaultSelectionId]=\"obs.prefill?.catalogId\"\n [disabled]=\"obs.disabled || obs.catalogs.loading\"\n [required]=\"true\"\n [loading]=\"obs.catalogs.loading\"\n >\n </v-select>\n <div *ngIf=\"obs.catalogs.error\" class=\"loading-error\">{{ obs.catalogs.error }}</div>\n\n <v-select\n name=\"templateId\"\n [title]=\"'templateId' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'templateIdTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [items]=\"obs.templates.data\"\n [defaultSelectionId]=\"obs.prefill?.templateId\"\n [clearSelectionSubject$]=\"clearTemplateId$\"\n [disabled]=\"obs.disabled || obs.templates.loading || !obs.selectedCatalogId\"\n [required]=\"true\"\n [loading]=\"obs.templates.loading\"\n >\n </v-select>\n <div *ngIf=\"obs.templates.error\" class=\"loading-error\">{{ obs.templates.error }}</div>\n\n <!-- Variant selection mode toggle -->\n <div class=\"variant-mode-toggle\" *ngIf=\"obs.selectedTemplateId\">\n <label class=\"variant-mode-label\">{{\n 'variantSelectionMode' | pluginTranslate: pluginId | async\n }}</label>\n <div class=\"variant-mode-buttons\">\n <button\n type=\"button\"\n class=\"variant-mode-btn\"\n [class.active]=\"variantSelectionMode === 'explicit'\"\n (click)=\"onVariantSelectionModeChange('explicit')\"\n [disabled]=\"obs.disabled\"\n >\n {{ 'selectByVariant' | pluginTranslate: pluginId | async }}\n </button>\n <button\n type=\"button\"\n class=\"variant-mode-btn\"\n [class.active]=\"variantSelectionMode === 'attributes'\"\n (click)=\"onVariantSelectionModeChange('attributes')\"\n [disabled]=\"obs.disabled\"\n >\n {{ 'selectByAttributes' | pluginTranslate: pluginId | async }}\n </button>\n </div>\n </div>\n\n <!-- Explicit variant selection (dropdown or expression) -->\n <!--\n The v-select / v-input here is intentionally NOT named into the v-form: v-form's\n @ContentChildren queries default to descendants:false and would skip anything nested\n in this `field-with-fx` wrapper. The value is tracked via (selectedChange)/(valueChange)\n on the component, see variantIdValue / filenameValue.\n -->\n <div *ngIf=\"variantSelectionMode === 'explicit'\" class=\"field-with-fx\">\n <v-select\n *ngIf=\"!variantIdExpressionMode\"\n [title]=\"'variantId' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'variantIdTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [items]=\"obs.variants.data\"\n [defaultSelectionId]=\"variantIdValue\"\n [clearSelectionSubject$]=\"clearVariantId$\"\n (selectedChange)=\"onVariantIdValueChange($event)\"\n [disabled]=\"obs.disabled || obs.variants.loading || !obs.selectedTemplateId\"\n [required]=\"false\"\n [loading]=\"obs.variants.loading\"\n >\n </v-select>\n <div *ngIf=\"variantIdExpressionMode\" class=\"fx-input-group\">\n <label class=\"fx-input-label\">{{ 'variantId' | pluginTranslate: pluginId | async }}</label>\n <input\n type=\"text\"\n class=\"fx-input\"\n [ngModel]=\"variantIdExpression\"\n (ngModelChange)=\"variantIdExpression = $event; onVariantIdExpressionChange()\"\n [disabled]=\"obs.disabled\"\n placeholder=\"$pv.letterType\"\n />\n </div>\n <button\n type=\"button\"\n class=\"fx-toggle\"\n (click)=\"toggleVariantIdExpressionMode()\"\n [disabled]=\"obs.disabled\"\n [title]=\"variantIdExpressionMode ? 'Switch to dropdown' : 'Switch to expression'\"\n >\n {{ variantIdExpressionMode ? '·' : 'fx' }}\n </button>\n </div>\n <div *ngIf=\"obs.variants.error\" class=\"loading-error\">{{ obs.variants.error }}</div>\n\n <!-- Attribute-based variant selection -->\n <div\n *ngIf=\"variantSelectionMode === 'attributes' && obs.selectedTemplateId\"\n class=\"variant-attributes-section\"\n >\n <label class=\"variant-attributes-label\">{{\n 'variantAttributes' | pluginTranslate: pluginId | async\n }}</label>\n <div class=\"variant-attributes-list\">\n <div\n *ngFor=\"let entry of variantAttributeEntries; let i = index\"\n class=\"variant-attribute-row\"\n >\n <select\n *ngIf=\"!entry._customKey\"\n class=\"variant-attribute-input\"\n [ngModel]=\"entry.key\"\n (ngModelChange)=\"onKeySelected(entry, $event)\"\n [disabled]=\"obs.disabled\"\n >\n <option value=\"\" disabled>\n {{ 'attributeKey' | pluginTranslate: pluginId | async }}\n </option>\n <option *ngFor=\"let key of availableAttributeKeys\" [value]=\"key\">{{ key }}</option>\n <option value=\"__custom__\">\n {{ 'attributeKeyCustom' | pluginTranslate: pluginId | async }}\n </option>\n </select>\n <div *ngIf=\"entry._customKey\" class=\"custom-key-input\">\n <input\n type=\"text\"\n class=\"variant-attribute-input\"\n [placeholder]=\"'attributeKey' | pluginTranslate: pluginId | async\"\n [(ngModel)]=\"entry.key\"\n (ngModelChange)=\"onAttributeEntryChange()\"\n [disabled]=\"obs.disabled\"\n />\n <button\n type=\"button\"\n class=\"custom-key-cancel\"\n (click)=\"cancelCustomKey(entry)\"\n [disabled]=\"obs.disabled\"\n >\n ×\n </button>\n </div>\n <div class=\"attribute-value-with-fx\">\n <input\n type=\"text\"\n class=\"variant-attribute-input\"\n [class.fx-input]=\"entry._expressionMode\"\n [placeholder]=\"\n entry._expressionMode\n ? '$pv.language'\n : ('attributeValue' | pluginTranslate: pluginId | async)\n \"\n [(ngModel)]=\"entry.value\"\n (ngModelChange)=\"onAttributeEntryChange()\"\n [disabled]=\"obs.disabled\"\n />\n <button\n type=\"button\"\n class=\"fx-toggle fx-toggle--inline\"\n (click)=\"entry._expressionMode = !entry._expressionMode\"\n [disabled]=\"obs.disabled\"\n [title]=\"entry._expressionMode ? 'Switch to plain value' : 'Switch to expression'\"\n >\n {{ entry._expressionMode ? '·' : 'fx' }}\n </button>\n </div>\n <label class=\"variant-attribute-required-toggle\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"entry.required\"\n (ngModelChange)=\"onAttributeEntryChange()\"\n [disabled]=\"obs.disabled\"\n />\n <span class=\"required-label\">{{\n (entry.required ? 'attributeRequired' : 'attributePreferred')\n | pluginTranslate: pluginId\n | async\n }}</span>\n </label>\n <button\n type=\"button\"\n class=\"variant-attribute-remove-btn\"\n (click)=\"removeAttributeEntry(i)\"\n [disabled]=\"obs.disabled\"\n title=\"{{ 'removeAttribute' | pluginTranslate: pluginId | async }}\"\n >\n ×\n </button>\n </div>\n </div>\n <button\n type=\"button\"\n class=\"variant-attribute-add-btn\"\n (click)=\"addAttributeEntry()\"\n [disabled]=\"obs.disabled\"\n >\n + {{ 'addAttribute' | pluginTranslate: pluginId | async }}\n </button>\n </div>\n\n <v-select\n name=\"environmentId\"\n [title]=\"'environmentId' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'environmentIdTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [items]=\"obs.environments.data\"\n [defaultSelectionId]=\"obs.prefill?.environmentId\"\n [disabled]=\"obs.disabled || obs.environments.loading\"\n [required]=\"false\"\n [loading]=\"obs.environments.loading\"\n >\n </v-select>\n <div *ngIf=\"obs.environments.error\" class=\"loading-error\">{{ obs.environments.error }}</div>\n\n <v-select\n name=\"outputFormat\"\n [title]=\"'outputFormat' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'outputFormatTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [items]=\"outputFormatOptions\"\n [defaultSelectionId]=\"obs.prefill?.outputFormat || 'PDF'\"\n [disabled]=\"obs.disabled\"\n [required]=\"true\"\n >\n </v-select>\n\n <div class=\"field-with-fx\">\n <v-input\n *ngIf=\"!filenameExpressionMode\"\n [title]=\"'filename' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'filenameTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"filenameValue\"\n (valueChange)=\"onFilenameValueChange($event)\"\n [disabled]=\"obs.disabled\"\n [required]=\"true\"\n >\n </v-input>\n <div *ngIf=\"filenameExpressionMode\" class=\"fx-input-group\">\n <label class=\"fx-input-label\">{{ 'filename' | pluginTranslate: pluginId | async }}</label>\n <input\n type=\"text\"\n class=\"fx-input\"\n [ngModel]=\"filenameExpression\"\n (ngModelChange)=\"filenameExpression = $event; onFilenameExpressionChange()\"\n [disabled]=\"obs.disabled\"\n placeholder='\"besluit-\" & $doc.name & \".pdf\"'\n />\n </div>\n <button\n type=\"button\"\n class=\"fx-toggle\"\n (click)=\"toggleFilenameExpressionMode()\"\n [disabled]=\"obs.disabled\"\n [title]=\"filenameExpressionMode ? 'Switch to plain input' : 'Switch to expression'\"\n >\n {{ filenameExpressionMode ? '·' : 'fx' }}\n </button>\n </div>\n\n <v-input\n name=\"correlationId\"\n [title]=\"'correlationId' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'correlationIdTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"obs.prefill?.correlationId\"\n [disabled]=\"obs.disabled\"\n [required]=\"false\"\n >\n </v-input>\n\n <v-input\n name=\"resultProcessVariable\"\n [title]=\"'resultProcessVariable' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'resultProcessVariableTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"obs.prefill?.resultProcessVariable\"\n [disabled]=\"obs.disabled\"\n [required]=\"true\"\n >\n </v-input>\n</v-form>\n\n<div *ngIf=\"(templateFields$ | async)?.error as templateFieldsError\" class=\"loading-error\">\n {{ templateFieldsError }}\n</div>\n\n<div *ngIf=\"selectedTemplateId$ | async\" class=\"mapping-section\">\n <h5 class=\"mapping-section__title\">\n {{ 'dataMappingTitle' | pluginTranslate: pluginId | async }}\n </h5>\n <p class=\"mapping-section__description\">\n {{ 'dataMappingDescription' | pluginTranslate: pluginId | async }}\n </p>\n <div class=\"mapping-mode-toggle\">\n <button\n class=\"mapping-mode-toggle__btn\"\n [class.mapping-mode-toggle__btn--active]=\"mappingMode === 'simple'\"\n (click)=\"mappingMode = 'simple'\"\n >\n {{ 'mappingModeSimple' | pluginTranslate: pluginId | async }}\n </button>\n <button\n class=\"mapping-mode-toggle__btn\"\n [class.mapping-mode-toggle__btn--active]=\"mappingMode === 'advanced'\"\n (click)=\"mappingMode = 'advanced'\"\n >\n {{ 'mappingModeAdvanced' | pluginTranslate: pluginId | async }}\n </button>\n </div>\n\n <!-- Editor area (full width) -->\n <epistola-mapping-builder\n *ngIf=\"mappingMode === 'simple'\"\n [expression]=\"dataMapping$ | async\"\n [templateFields]=\"(templateFields$ | async)?.data ?? []\"\n [suggestions]=\"variableSuggestions\"\n [disabled]=\"!!(disabled$ | async)\"\n (expressionChange)=\"onDataMappingChange($event)\"\n ></epistola-mapping-builder>\n\n <epistola-jsonata-editor\n *ngIf=\"mappingMode === 'advanced'\"\n [expression]=\"dataMapping$ | async\"\n [disabled]=\"!!(disabled$ | async)\"\n [suggestions]=\"variableSuggestions\"\n [functions]=\"expressionFunctions\"\n (expressionChange)=\"onDataMappingChange($event)\"\n ></epistola-jsonata-editor>\n\n <!-- Bottom tabs: Schema + Preview (collapsible) -->\n <div class=\"mapping-tools\" [class.mapping-tools--collapsed]=\"toolsCollapsed\">\n <div class=\"mapping-tools__header\" (click)=\"toolsCollapsed = !toolsCollapsed\">\n <span class=\"mapping-tools__chevron\">{{ toolsCollapsed ? '▶' : '▼' }}</span>\n <span>{{ 'mappingTools' | pluginTranslate: pluginId | async }}</span>\n </div>\n <div *ngIf=\"!toolsCollapsed\" class=\"mapping-tools__content\">\n <div class=\"mapping-tools__tabs\">\n <button\n class=\"mapping-tools__tab\"\n [class.mapping-tools__tab--active]=\"activeToolTab === 'schema'\"\n (click)=\"activeToolTab = 'schema'\"\n >\n {{ 'expectedStructure' | pluginTranslate: pluginId | async }}\n </button>\n <button\n class=\"mapping-tools__tab\"\n [class.mapping-tools__tab--active]=\"activeToolTab === 'preview'\"\n (click)=\"activeToolTab = 'preview'\"\n >\n {{ 'previewTitle' | pluginTranslate: pluginId | async }}\n </button>\n </div>\n\n <epistola-expected-structure\n *ngIf=\"activeToolTab === 'schema'\"\n [templateFields]=\"(templateFields$ | async)?.data ?? []\"\n ></epistola-expected-structure>\n\n <epistola-mapping-preview\n *ngIf=\"activeToolTab === 'preview'\"\n [expression]=\"dataMapping$ | async\"\n [templateFields]=\"(templateFields$ | async)?.data ?? []\"\n [caseDefinitionKey]=\"caseDefinitionKey\"\n ></epistola-mapping-preview>\n </div>\n </div>\n</div>\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FunctionConfigurationComponent, PluginTranslatePipeModule } from '@valtimo/plugin';\nimport { FormModule, FormOutput, InputModule } from '@valtimo/components';\nimport { BehaviorSubject, combineLatest, Observable, of, Subscription, take } from 'rxjs';\nimport { delay, startWith } from 'rxjs/operators';\nimport { CheckJobStatusConfig } from '../../models';\n\n@Component({\n selector: 'epistola-check-job-status-configuration',\n templateUrl: './check-job-status-configuration.component.html',\n styleUrls: ['./check-job-status-configuration.component.scss'],\n standalone: true,\n imports: [CommonModule, PluginTranslatePipeModule, FormModule, InputModule],\n})\nexport class CheckJobStatusConfigurationComponent\n implements FunctionConfigurationComponent, OnInit, OnDestroy\n{\n @Input() save$!: Observable<void>;\n @Input() disabled$!: Observable<boolean>;\n @Input() pluginId!: string;\n @Input() prefillConfiguration$!: Observable<CheckJobStatusConfig>;\n\n @Output() valid: EventEmitter<boolean> = new EventEmitter<boolean>();\n @Output() configuration: EventEmitter<CheckJobStatusConfig> =\n new EventEmitter<CheckJobStatusConfig>();\n\n private saveSubscription!: Subscription;\n private readonly formValue$ = new BehaviorSubject<CheckJobStatusConfig | null>(null);\n private readonly valid$ = new BehaviorSubject<boolean>(false);\n\n /** Resolved synchronously before the v-form renders — see download-document-configuration for the why. */\n resolvedPrefill: Partial<CheckJobStatusConfig> = {};\n readonly prefillResolved$ = new BehaviorSubject<boolean>(false);\n\n safeDisabled$!: Observable<boolean>;\n\n ngOnInit(): void {\n this.safeDisabled$ = this.disabled$.pipe(startWith(true), delay(0));\n const prefill$ = this.prefillConfiguration$ ?? of({} as CheckJobStatusConfig);\n prefill$.pipe(take(1)).subscribe((prefill) => {\n this.resolvedPrefill = prefill ?? {};\n this.prefillResolved$.next(true);\n });\n this.openSaveSubscription();\n }\n\n ngOnDestroy() {\n this.saveSubscription?.unsubscribe();\n }\n\n formValueChange(formOutput: FormOutput): void {\n const formValue = formOutput as unknown as CheckJobStatusConfig;\n this.formValue$.next(formValue);\n this.handleValid(formValue);\n }\n\n private handleValid(formValue: CheckJobStatusConfig): void {\n const valid = !!(formValue?.requestIdVariable && formValue?.statusVariable);\n this.valid$.next(valid);\n this.valid.emit(valid);\n }\n\n private openSaveSubscription(): void {\n this.saveSubscription = this.save$?.subscribe(() => {\n combineLatest([this.formValue$, this.valid$])\n .pipe(take(1))\n .subscribe(([formValue, valid]) => {\n if (valid && formValue) {\n this.configuration.emit(formValue);\n }\n });\n });\n }\n}\n","<v-form (valueChange)=\"formValueChange($event)\" *ngIf=\"prefillResolved$ | async\">\n <v-input\n name=\"requestIdVariable\"\n [title]=\"'requestIdVariable' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'requestIdVariableTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"resolvedPrefill?.requestIdVariable\"\n [disabled]=\"safeDisabled$ | async\"\n [required]=\"true\"\n >\n </v-input>\n\n <v-input\n name=\"statusVariable\"\n [title]=\"'statusVariable' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'statusVariableTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"resolvedPrefill?.statusVariable\"\n [disabled]=\"safeDisabled$ | async\"\n [required]=\"true\"\n >\n </v-input>\n\n <v-input\n name=\"documentIdVariable\"\n [title]=\"'documentIdVariable' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'documentIdVariableTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"resolvedPrefill?.documentIdVariable\"\n [disabled]=\"safeDisabled$ | async\"\n [required]=\"false\"\n >\n </v-input>\n\n <v-input\n name=\"errorMessageVariable\"\n [title]=\"'errorMessageVariable' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'errorMessageVariableTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"resolvedPrefill?.errorMessageVariable\"\n [disabled]=\"safeDisabled$ | async\"\n [required]=\"false\"\n >\n </v-input>\n</v-form>\n","import { DownloadDocumentConfig } from '../../models';\n\n/**\n * Pure helpers for the download-document configurator, extracted so they can be unit-tested\n * without the Angular component (mirrors the process-link-selector util pattern). See\n * `docs/adr/0001-download-document-content-storage.md`.\n */\n\nexport type StorageTarget = 'TEMPORARY_RESOURCE' | 'PROCESS_VARIABLE';\n\nexport const DEFAULT_STORAGE_TARGET: StorageTarget = 'TEMPORARY_RESOURCE';\n\n/** Normalize a (possibly undefined) storageTarget to a concrete target, applying the default. */\nexport function resolveStorageTarget(target?: string): StorageTarget {\n return target === 'PROCESS_VARIABLE' ? 'PROCESS_VARIABLE' : DEFAULT_STORAGE_TARGET;\n}\n\n/**\n * A config is valid when the input variable and the output variable that matches the chosen\n * storage target are both set.\n */\nexport function isDownloadDocumentConfigValid(\n config: Partial<DownloadDocumentConfig> | null | undefined,\n): boolean {\n if (!config?.documentVariable) {\n return false;\n }\n return resolveStorageTarget(config.storageTarget) === 'PROCESS_VARIABLE'\n ? !!config.contentVariable\n : !!config.resourceIdVariable;\n}\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FunctionConfigurationComponent, PluginTranslatePipeModule } from '@valtimo/plugin';\nimport { FormModule, FormOutput, InputModule, SelectItem, SelectModule } from '@valtimo/components';\nimport { BehaviorSubject, combineLatest, Observable, of, Subscription, take } from 'rxjs';\nimport { delay, startWith } from 'rxjs/operators';\nimport { DownloadDocumentConfig } from '../../models';\nimport {\n DEFAULT_STORAGE_TARGET,\n isDownloadDocumentConfigValid,\n resolveStorageTarget,\n} from './download-document-config.util';\n\n@Component({\n selector: 'epistola-download-document-configuration',\n templateUrl: './download-document-configuration.component.html',\n styleUrls: ['./download-document-configuration.component.scss'],\n standalone: true,\n imports: [CommonModule, PluginTranslatePipeModule, FormModule, InputModule, SelectModule],\n})\nexport class DownloadDocumentConfigurationComponent\n implements FunctionConfigurationComponent, OnInit, OnDestroy\n{\n @Input() save$!: Observable<void>;\n @Input() disabled$!: Observable<boolean>;\n @Input() pluginId!: string;\n @Input() prefillConfiguration$!: Observable<DownloadDocumentConfig>;\n\n @Output() valid: EventEmitter<boolean> = new EventEmitter<boolean>();\n @Output() configuration: EventEmitter<DownloadDocumentConfig> =\n new EventEmitter<DownloadDocumentConfig>();\n\n private saveSubscription!: Subscription;\n private readonly formValue$ = new BehaviorSubject<DownloadDocumentConfig | null>(null);\n private readonly valid$ = new BehaviorSubject<boolean>(false);\n\n /**\n * Resolved prefill — populated synchronously before the v-form renders. Avoids the\n * v-input `[defaultValue]` async-binding race that otherwise drops one of the\n * fields when prefill arrives after mount.\n */\n resolvedPrefill: Partial<DownloadDocumentConfig> = {};\n readonly prefillResolved$ = new BehaviorSubject<boolean>(false);\n\n safeDisabled$!: Observable<boolean>;\n\n /**\n * Static option set for the storage target. Values match the backend\n * {@code DocumentStorageTarget} enum constants; labels are explained further via the\n * translated field title/tooltip.\n */\n readonly storageTargetOptions: SelectItem[] = [\n { id: 'TEMPORARY_RESOURCE', text: 'Temporary resource storage' },\n { id: 'PROCESS_VARIABLE', text: 'Process variable (inline bytes)' },\n ];\n readonly defaultStorageTarget = DEFAULT_STORAGE_TARGET;\n\n /** Drives which output-variable field is shown (resource id vs inline content). */\n readonly selectedTarget$ = new BehaviorSubject<string>(this.defaultStorageTarget);\n\n ngOnInit(): void {\n this.safeDisabled$ = this.disabled$.pipe(startWith(true), delay(0));\n const prefill$ = this.prefillConfiguration$ ?? of({} as DownloadDocumentConfig);\n prefill$.pipe(take(1)).subscribe((prefill) => {\n this.resolvedPrefill = prefill ?? {};\n this.selectedTarget$.next(resolveStorageTarget(this.resolvedPrefill.storageTarget));\n this.prefillResolved$.next(true);\n });\n this.openSaveSubscription();\n }\n\n ngOnDestroy() {\n this.saveSubscription?.unsubscribe();\n }\n\n formValueChange(formOutput: FormOutput): void {\n const formValue = formOutput as unknown as DownloadDocumentConfig;\n if (formValue?.storageTarget) {\n this.selectedTarget$.next(formValue.storageTarget);\n }\n this.formValue$.next(formValue);\n this.handleValid(formValue);\n }\n\n private handleValid(formValue: DownloadDocumentConfig): void {\n const valid = isDownloadDocumentConfigValid(formValue);\n this.valid$.next(valid);\n this.valid.emit(valid);\n }\n\n private openSaveSubscription(): void {\n this.saveSubscription = this.save$?.subscribe(() => {\n combineLatest([this.formValue$, this.valid$])\n .pipe(take(1))\n .subscribe(([formValue, valid]) => {\n if (valid && formValue) {\n this.configuration.emit(formValue);\n }\n });\n });\n }\n}\n","<v-form (valueChange)=\"formValueChange($event)\" *ngIf=\"prefillResolved$ | async\">\n <v-input\n name=\"documentVariable\"\n [title]=\"'documentVariable' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'documentVariableTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"resolvedPrefill?.documentVariable\"\n [disabled]=\"safeDisabled$ | async\"\n [required]=\"true\"\n >\n </v-input>\n\n <v-select\n name=\"storageTarget\"\n [title]=\"'storageTarget' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'storageTargetTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [items]=\"storageTargetOptions\"\n [defaultSelectionId]=\"resolvedPrefill?.storageTarget || defaultStorageTarget\"\n [disabled]=\"safeDisabled$ | async\"\n [required]=\"true\"\n >\n </v-select>\n\n <v-input\n *ngIf=\"(selectedTarget$ | async) === 'TEMPORARY_RESOURCE'\"\n name=\"resourceIdVariable\"\n [title]=\"'resourceIdVariable' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'resourceIdVariableTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"resolvedPrefill?.resourceIdVariable\"\n [disabled]=\"safeDisabled$ | async\"\n [required]=\"true\"\n >\n </v-input>\n\n <v-input\n *ngIf=\"(selectedTarget$ | async) === 'PROCESS_VARIABLE'\"\n name=\"contentVariable\"\n [title]=\"'contentVariable' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'contentVariableTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"resolvedPrefill?.contentVariable\"\n [disabled]=\"safeDisabled$ | async\"\n [required]=\"true\"\n >\n </v-input>\n</v-form>\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport { FormioCustomComponent, FormIoStateService } from '@valtimo/components';\nimport { Subscription } from 'rxjs';\nimport { DownloadDocumentRequest, EpistolaPluginService } from '../../services';\n\nexport type EpistolaDocumentDisplay = 'inline' | 'button' | 'both';\n\n/**\n * Unified Formio component for the after-generation Epistola PDF UX. Reads\n * the PDF id and tenant id from named process variables on the caller's\n * task via the {@code /documents/download} endpoint.\n *\n * <p>Three presentations, all backed by the same backend call:\n * <ul>\n * <li>{@code display=\"inline\"} — render the PDF inline in a panel.</li>\n * <li>{@code display=\"button\"} — show a click-to-save download button only.</li>\n * <li>{@code display=\"both\"} (default) — inline panel with a download icon\n * in the header.</li>\n * </ul>\n *\n * <p>For the dry-run / what-would-be-generated UX use\n * {@code epistola-document-preview} instead.\n */\n@Component({\n standalone: true,\n imports: [CommonModule],\n selector: 'epistola-document-component',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <!-- Design-time placeholder -->\n <div *ngIf=\"designMode\" class=\"epistola-doc-panel\">\n <div class=\"doc-header\">\n <span>{{ label || 'Document' }}</span>\n <span class=\"design-tag\">design mode</span>\n </div>\n <div class=\"doc-body design-info\">\n <div class=\"design-section\">\n <div class=\"design-label\">Display</div>\n <div class=\"design-value\">{{ display }}</div>\n <div class=\"design-label\">Document variable</div>\n <div class=\"design-value\">{{ documentVariable }}</div>\n <div class=\"design-label\">Tenant ID variable</div>\n <div class=\"design-value\">{{ tenantIdVariable }}</div>\n </div>\n </div>\n </div>\n\n <!-- Button-only display -->\n <div *ngIf=\"!designMode && display === 'button'\">\n <button\n type=\"button\"\n class=\"btn btn-outline-primary\"\n [disabled]=\"disabled || downloading\"\n (click)=\"download()\"\n >\n <i class=\"mdi mdi-download mr-1\"></i>\n {{ downloading ? 'Downloading...' : label || 'Download PDF' }}\n </button>\n <span *ngIf=\"error\" class=\"text-danger ml-2\">{{ error }}</span>\n </div>\n\n <!-- Inline / both: panel with optional download icon -->\n <div *ngIf=\"!designMode && display !== 'button'\" class=\"epistola-doc-panel\">\n <div class=\"doc-header\">\n <span>{{ label || 'Document' }}</span>\n <div class=\"doc-controls\">\n <button\n *ngIf=\"display === 'both'\"\n type=\"button\"\n class=\"doc-icon-btn\"\n [disabled]=\"disabled || downloading\"\n (click)=\"download()\"\n [title]=\"downloading ? 'Downloading...' : 'Download'\"\n >\n <i class=\"mdi mdi-download\"></i>\n </button>\n <button\n type=\"button\"\n class=\"doc-icon-btn\"\n [disabled]=\"loading\"\n (click)=\"refresh()\"\n title=\"Refresh\"\n >\n <i class=\"mdi mdi-refresh\"></i>\n </button>\n </div>\n </div>\n <div class=\"doc-body\">\n <div *ngIf=\"loading\" class=\"doc-loading\">Loading document...</div>\n <div *ngIf=\"error && !loading\" class=\"doc-unavailable\">\n <i class=\"mdi mdi-information-outline\"></i>\n {{ error }}\n </div>\n <object\n *ngIf=\"previewUrl && !loading\"\n [data]=\"previewUrl\"\n type=\"application/pdf\"\n class=\"doc-pdf\"\n >\n PDF preview is not supported in this browser.\n </object>\n </div>\n </div>\n `,\n styles: [\n `\n .epistola-doc-panel {\n border: 1px solid #dee2e6;\n border-radius: 4px;\n background: #f8f9fa;\n display: flex;\n flex-direction: column;\n }\n .doc-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.5rem 1rem;\n border-bottom: 1px solid #dee2e6;\n font-weight: bold;\n color: #495057;\n }\n .doc-controls {\n display: flex;\n gap: 0.25rem;\n }\n .doc-icon-btn {\n background: none;\n border: 1px solid #6c757d;\n border-radius: 4px;\n color: #6c757d;\n padding: 0.25rem 0.5rem;\n font-size: 0.9rem;\n cursor: pointer;\n }\n .doc-icon-btn:hover:not(:disabled) {\n background: #e9ecef;\n }\n .doc-icon-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .doc-body {\n display: flex;\n flex-direction: column;\n min-height: 500px;\n }\n .doc-loading,\n .doc-unavailable {\n padding: 2rem;\n text-align: center;\n color: #6c757d;\n font-style: italic;\n }\n .doc-unavailable i {\n margin-right: 0.25rem;\n }\n .doc-pdf {\n width: 100%;\n flex: 1;\n min-height: 500px;\n }\n .design-info {\n padding: 1rem;\n min-height: auto;\n }\n .design-section {\n margin-bottom: 0.5rem;\n }\n .design-label {\n font-size: 0.7rem;\n text-transform: uppercase;\n color: #868e96;\n font-weight: 600;\n letter-spacing: 0.05em;\n }\n .design-value {\n font-family: monospace;\n font-size: 0.85rem;\n color: #212529;\n margin-bottom: 0.25rem;\n }\n .design-tag {\n font-size: 0.7rem;\n font-weight: normal;\n color: #6c757d;\n font-style: italic;\n }\n `,\n ],\n})\nexport class EpistolaDocumentComponent\n implements FormioCustomComponent<unknown>, OnChanges, OnDestroy\n{\n @Input() value: unknown;\n @Output() valueChange = new EventEmitter<unknown>();\n\n @Input() disabled = false;\n @Input() label = 'Document';\n\n /** How to present the document. `both` (default) shows an inline panel with a download icon. */\n @Input() display: EpistolaDocumentDisplay = 'both';\n\n /**\n * Process-variable name holding the Epistola result. Default: `epistolaResult`.\n *\n * Type-tolerant on the backend: if the named variable holds a rich result object\n * (`Map<String, Object>` written by `generate-document` and updated by the result\n * collector), the backend digs out the `documentId` key. If it holds a plain\n * String (custom flow that wrote a bare id), the backend uses it as-is.\n */\n @Input() documentVariable = 'epistolaResult';\n\n /** Process-variable name holding the Epistola tenant id. Default: `epistolaTenantId`. */\n @Input() tenantIdVariable = 'epistolaTenantId';\n\n /** Filename used for the download disposition. */\n @Input() filename = 'document.pdf';\n\n /**\n * Task id forwarded by the Formio wrapper from the server-prefilled form\n * ({@code epistola:taskId} value resolver), populated in every Valtimo task-open flow.\n */\n @Input() taskInstanceId?: string | null;\n\n loading = false;\n downloading = false;\n error: string | null = null;\n previewUrl: SafeResourceUrl | null = null;\n\n private currentBlobUrl: string | null = null;\n private subscription?: Subscription;\n\n get designMode(): boolean {\n return !this.formIoStateService.documentId;\n }\n\n constructor(\n private readonly epistolaPluginService: EpistolaPluginService,\n private readonly sanitizer: DomSanitizer,\n private readonly formIoStateService: FormIoStateService,\n private readonly cdr: ChangeDetectorRef,\n ) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (this.designMode || this.display === 'button') {\n return;\n }\n // The Formio wrapper sets taskInstanceId around attach, so it can arrive after the\n // first change — (re)load the inline document once it's available instead of leaving\n // the \"Document is alleen beschikbaar binnen een taak\" message until a manual refresh.\n // (For display=\"button\" the download() click reads the task id on demand.)\n if (changes['taskInstanceId'] && this.taskInstanceId) {\n this.loadInline();\n }\n }\n\n ngOnDestroy(): void {\n this.subscription?.unsubscribe();\n this.revokeBlobUrl();\n }\n\n refresh(): void {\n this.loadInline();\n }\n\n download(): void {\n if (this.designMode || this.downloading) {\n return;\n }\n const request = this.buildRequest('attachment');\n if (!request) return;\n this.downloading = true;\n this.error = null;\n this.cdr.markForCheck();\n\n this.epistolaPluginService.downloadDocumentBlob(request).subscribe({\n next: (blob) => {\n const objectUrl = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = objectUrl;\n anchor.download = this.filename;\n anchor.click();\n URL.revokeObjectURL(objectUrl);\n this.downloading = false;\n this.cdr.markForCheck();\n },\n error: (err) => {\n this.error = err.status === 404 ? 'Document is nog niet gegenereerd.' : 'Download mislukt.';\n this.downloading = false;\n this.cdr.markForCheck();\n },\n });\n }\n\n private loadInline(): void {\n const request = this.buildRequest('inline');\n if (!request) return;\n this.loading = true;\n this.error = null;\n this.cdr.markForCheck();\n this.revokeBlobUrl();\n\n this.subscription?.unsubscribe();\n this.subscription = this.epistolaPluginService.downloadDocumentBlob(request).subscribe({\n next: (blob) => {\n this.currentBlobUrl = URL.createObjectURL(blob);\n this.previewUrl = this.sanitizer.bypassSecurityTrustResourceUrl(this.currentBlobUrl);\n this.loading = false;\n this.cdr.markForCheck();\n },\n error: (err) => {\n this.previewUrl = null;\n this.error =\n err.status === 404\n ? 'Document is nog niet gegenereerd.'\n : 'Document kon niet geladen worden.';\n this.loading = false;\n this.cdr.markForCheck();\n },\n });\n }\n\n private buildRequest(disposition: 'inline' | 'attachment'): DownloadDocumentRequest | null {\n const taskId = this.taskInstanceId ?? null;\n const caseDocumentId = this.formIoStateService.documentId;\n if (!taskId || !caseDocumentId) {\n this.error = 'Document is alleen beschikbaar binnen een taak.';\n this.cdr.markForCheck();\n return null;\n }\n return {\n taskId,\n caseDocumentId,\n documentVariable: this.documentVariable,\n tenantIdVariable: this.tenantIdVariable,\n filename: this.filename,\n disposition,\n };\n }\n\n private revokeBlobUrl(): void {\n if (this.currentBlobUrl) {\n URL.revokeObjectURL(this.currentBlobUrl);\n this.currentBlobUrl = null;\n this.previewUrl = null;\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport { FormioCustomComponent } from '@valtimo/components';\nimport { FormioModule } from '@formio/angular';\nimport { Subject, Subscription } from 'rxjs';\nimport { debounceTime, switchMap } from 'rxjs/operators';\nimport { EpistolaPluginService } from '../../services';\n\n@Component({\n standalone: true,\n imports: [CommonModule, FormioModule],\n selector: 'epistola-retry-form-component',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div *ngIf=\"loading\" class=\"epistola-retry-loading\">Loading form...</div>\n <div *ngIf=\"error\" class=\"epistola-retry-error\">{{ error }}</div>\n <div\n *ngIf=\"formDefinition && !loading\"\n class=\"epistola-retry-container\"\n [class.preview-expanded]=\"previewExpanded\"\n >\n <div class=\"epistola-retry-form\" [hidden]=\"previewExpanded\">\n <formio\n [form]=\"formDefinition\"\n [submission]=\"submission\"\n (change)=\"onFormChange($event)\"\n [options]=\"formOptions\"\n ></formio>\n </div>\n <div class=\"epistola-retry-preview\">\n <div class=\"preview-header\">\n <span>Preview</span>\n <button type=\"button\" class=\"preview-toggle\" (click)=\"togglePreview()\">\n {{ previewExpanded ? 'Show form' : 'Expand' }}\n </button>\n </div>\n <div *ngIf=\"previewLoading\" class=\"preview-loading\">Generating preview...</div>\n <object\n *ngIf=\"previewUrl && !previewLoading\"\n [data]=\"previewUrl\"\n type=\"application/pdf\"\n class=\"preview-pdf\"\n >\n PDF preview not supported in this browser.\n </object>\n <div *ngIf=\"previewError\" class=\"preview-error\">{{ previewError }}</div>\n <div *ngIf=\"!previewUrl && !previewLoading && !previewError\" class=\"preview-empty\">\n Edit fields to see a preview\n </div>\n </div>\n </div>\n `,\n styles: [\n `\n .epistola-retry-loading {\n padding: 1rem;\n color: #6c757d;\n }\n .epistola-retry-error {\n padding: 0.5rem;\n color: #dc3545;\n }\n .epistola-retry-container {\n display: flex;\n gap: 1rem;\n }\n .epistola-retry-form {\n flex: 2;\n min-width: 0;\n }\n .epistola-retry-preview {\n flex: 1;\n min-width: 0;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n padding: 1rem;\n background: #f8f9fa;\n display: flex;\n flex-direction: column;\n }\n .preview-expanded .epistola-retry-preview {\n flex: 1;\n }\n .preview-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-weight: bold;\n margin-bottom: 0.5rem;\n color: #495057;\n }\n .preview-toggle {\n background: none;\n border: 1px solid #6c757d;\n border-radius: 4px;\n color: #6c757d;\n padding: 0.2rem 0.5rem;\n font-size: 0.75rem;\n cursor: pointer;\n }\n .preview-toggle:hover {\n background: #e9ecef;\n }\n .preview-loading {\n color: #6c757d;\n font-style: italic;\n }\n .preview-pdf {\n width: 100%;\n flex: 1;\n min-height: 500px;\n }\n .preview-expanded .preview-pdf {\n min-height: 80vh;\n }\n .preview-error {\n color: #dc3545;\n }\n .preview-empty {\n color: #6c757d;\n font-style: italic;\n }\n `,\n ],\n})\nexport class EpistolaRetryFormComponent\n implements FormioCustomComponent<string>, OnChanges, OnDestroy\n{\n @Input() value!: string;\n @Output() valueChange = new EventEmitter<string>();\n\n @Input() disabled = false;\n @Input() label = 'Document Data';\n @Input() sourceActivityId?: string;\n /**\n * Task id forwarded by the Formio wrapper from the server-prefilled form\n * ({@code epistola:taskId} value resolver), populated in every Valtimo task-open flow.\n */\n @Input() taskInstanceId?: string | null;\n\n formDefinition: any;\n submission: any;\n loading = true;\n error: string | null = null;\n previewUrl: SafeResourceUrl | null = null;\n previewLoading = false;\n previewError: string | null = null;\n previewExpanded = false;\n private loaded = false;\n private loadSubscription?: Subscription;\n private previewSubscription?: Subscription;\n private previewSubject = new Subject<any>();\n private currentBlobUrl: string | null = null;\n private resolvedSourceActivityId?: string;\n\n formOptions: any = {\n noAlerts: true,\n buttonSettings: { showCancel: false, showSubmit: false, showPrevious: false, showNext: false },\n };\n\n constructor(\n private readonly epistolaPluginService: EpistolaPluginService,\n private readonly cdr: ChangeDetectorRef,\n private readonly sanitizer: DomSanitizer,\n ) {\n // Debounce preview calls\n this.previewSubscription = this.previewSubject.pipe(debounceTime(1500)).subscribe((data) => {\n this.loadPreview(data);\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!this.loaded) {\n this.loaded = true;\n this.loadForm();\n return;\n }\n // The Formio wrapper sets taskInstanceId after attach, so it can land after the\n // first render — if the form failed to load for lack of a task id, retry once it\n // arrives instead of leaving the \"only available from within a user task\" message.\n if (changes['taskInstanceId'] && this.taskInstanceId && !this.formDefinition) {\n this.loadForm();\n }\n }\n\n ngOnDestroy(): void {\n this.loadSubscription?.unsubscribe();\n this.previewSubscription?.unsubscribe();\n if (this.currentBlobUrl) {\n URL.revokeObjectURL(this.currentBlobUrl);\n }\n }\n\n togglePreview(): void {\n this.previewExpanded = !this.previewExpanded;\n this.cdr.markForCheck();\n }\n\n onFormChange(event: any): void {\n if (event?.data) {\n const json = JSON.stringify(event.data);\n this.value = json; // Formio reads element.value on change event\n this.valueChange.emit(json);\n // Trigger debounced preview\n this.previewSubject.next(event.data);\n }\n }\n\n private loadPreview(formData: any): void {\n // The backend derives the process instance and case document from the task.\n const taskId = this.taskInstanceId ?? null;\n if (!taskId) {\n this.previewError = 'Preview is only available from within a user task.';\n this.cdr.markForCheck();\n return;\n }\n\n this.previewLoading = true;\n this.previewError = null;\n this.cdr.markForCheck();\n\n // Revoke previous blob URL to prevent memory leaks\n if (this.currentBlobUrl) {\n URL.revokeObjectURL(this.currentBlobUrl);\n this.currentBlobUrl = null;\n }\n\n this.epistolaPluginService\n .previewToBlob({\n taskId,\n sourceActivityId: this.sourceActivityId || null,\n overrides: formData,\n })\n .subscribe({\n next: (blob) => {\n this.currentBlobUrl = URL.createObjectURL(blob);\n this.previewUrl = this.sanitizer.bypassSecurityTrustResourceUrl(this.currentBlobUrl);\n this.previewError = null;\n this.previewLoading = false;\n this.cdr.markForCheck();\n },\n error: (err) => {\n this.previewUrl = null;\n // Try to extract error message from JSON response body\n if (err.error instanceof Blob) {\n err.error.text().then((text: string) => {\n try {\n const body = JSON.parse(text);\n this.previewError = body.details || body.error || 'Preview could not be generated';\n } catch {\n this.previewError = 'Preview could not be generated';\n }\n this.previewLoading = false;\n this.cdr.markForCheck();\n });\n } else {\n this.previewError = err.error?.error || 'Preview could not be generated';\n this.previewLoading = false;\n this.cdr.markForCheck();\n }\n },\n });\n }\n\n private loadForm(): void {\n // The backend derives the process instance and case document from the task.\n const taskId = this.taskInstanceId ?? null;\n if (!taskId) {\n this.error = 'Retry form is only available from within a user task.';\n this.loading = false;\n this.cdr.markForCheck();\n return;\n }\n\n this.loadSubscription = this.epistolaPluginService\n .getRetryForm(taskId, this.sourceActivityId)\n .subscribe({\n next: (form) => {\n this.formDefinition = form;\n if (this.value) {\n try {\n this.submission = { data: JSON.parse(this.value) };\n } catch {\n // value is not valid JSON, start fresh\n }\n }\n this.loading = false;\n this.cdr.markForCheck();\n },\n error: (err) => {\n console.error('Failed to load retry form', err);\n this.error = 'Failed to load the retry form. Please try again.';\n this.loading = false;\n this.cdr.markForCheck();\n },\n });\n }\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport { FormioCustomComponent, FormIoStateService } from '@valtimo/components';\nimport { Subscription } from 'rxjs';\nimport { EpistolaPluginService } from '../../services';\nimport { shouldLoadPreview } from './preview-utils';\n\n@Component({\n standalone: true,\n imports: [CommonModule],\n selector: 'epistola-document-preview-component',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <!-- Design-time view: show configuration summary when no runtime context -->\n <div *ngIf=\"designMode\" class=\"epistola-preview-panel\">\n <div class=\"preview-header\">\n <span>{{ label || 'Document Preview' }}</span>\n </div>\n <div class=\"preview-body design-info\">\n <div class=\"design-section\" *ngIf=\"sourceActivityId\">\n <div class=\"design-label\">Process</div>\n <div class=\"design-value\">{{ processDefinitionKey || '(any)' }}</div>\n <div class=\"design-label\">Activity</div>\n <div class=\"design-value\">{{ sourceActivityId }}</div>\n </div>\n <div class=\"design-section\" *ngIf=\"overrideMapping\">\n <div class=\"design-label\">Input Overrides</div>\n <div *ngFor=\"let scope of overrideMappingScopes\" class=\"design-mapping\">\n <div *ngFor=\"let entry of overrideMappingEntries(scope)\" class=\"design-entry\">\n <span class=\"design-scope\">{{ scope }}</span\n >.{{ entry.path }}\n <i class=\"mdi mdi-arrow-left\"></i>\n <span class=\"design-field\">{{ entry.field }}</span>\n </div>\n </div>\n </div>\n <div *ngIf=\"!sourceActivityId\" class=\"design-unconfigured\">\n Auto-discover mode (no process link configured)\n </div>\n </div>\n </div>\n\n <!-- Runtime view: actual preview -->\n <div *ngIf=\"!designMode\" class=\"epistola-preview-panel\">\n <div class=\"preview-header\">\n <span>{{ label || 'Document Preview' }}</span>\n <div class=\"preview-controls\">\n <button type=\"button\" class=\"preview-refresh\" [disabled]=\"loading\" (click)=\"refresh()\">\n <i class=\"mdi mdi-refresh mr-1\"></i>\n {{ loading ? 'Generating...' : 'Refresh' }}\n </button>\n </div>\n </div>\n <div class=\"preview-body\">\n <div *ngIf=\"loading\" class=\"preview-loading\">Generating preview...</div>\n <div *ngIf=\"error && !loading\" class=\"preview-unavailable\">\n <i class=\"mdi mdi-information-outline\"></i>\n {{ error }}\n </div>\n <object\n *ngIf=\"previewUrl && !loading\"\n [data]=\"previewUrl\"\n type=\"application/pdf\"\n class=\"preview-pdf\"\n >\n PDF preview is not supported in this browser.\n </object>\n </div>\n </div>\n `,\n styles: [\n `\n .epistola-preview-panel {\n border: 1px solid #dee2e6;\n border-radius: 4px;\n background: #f8f9fa;\n display: flex;\n flex-direction: column;\n }\n .preview-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.5rem 1rem;\n border-bottom: 1px solid #dee2e6;\n font-weight: bold;\n color: #495057;\n flex-wrap: wrap;\n gap: 0.5rem;\n }\n .preview-controls {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n .preview-select {\n border: 1px solid #ced4da;\n border-radius: 4px;\n padding: 0.25rem 0.5rem;\n font-size: 0.8rem;\n background: white;\n max-width: 300px;\n }\n .preview-refresh {\n background: none;\n border: 1px solid #6c757d;\n border-radius: 4px;\n color: #6c757d;\n padding: 0.25rem 0.75rem;\n font-size: 0.8rem;\n cursor: pointer;\n display: flex;\n align-items: center;\n white-space: nowrap;\n }\n .preview-refresh:hover:not(:disabled) {\n background: #e9ecef;\n }\n .preview-refresh:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .preview-body {\n display: flex;\n flex-direction: column;\n min-height: 500px;\n }\n .preview-loading {\n padding: 2rem;\n text-align: center;\n color: #6c757d;\n font-style: italic;\n }\n .preview-unavailable {\n padding: 1.5rem;\n text-align: center;\n color: #6c757d;\n font-style: italic;\n }\n .preview-unavailable i {\n margin-right: 0.25rem;\n }\n .preview-pdf {\n width: 100%;\n flex: 1;\n min-height: 500px;\n }\n .preview-empty {\n padding: 2rem;\n text-align: center;\n color: #6c757d;\n font-style: italic;\n }\n .design-info {\n padding: 1rem;\n min-height: auto;\n }\n .design-section {\n margin-bottom: 0.75rem;\n }\n .design-label {\n font-size: 0.7rem;\n text-transform: uppercase;\n color: #868e96;\n font-weight: 600;\n letter-spacing: 0.05em;\n }\n .design-value {\n font-family: monospace;\n font-size: 0.85rem;\n color: #212529;\n margin-bottom: 0.25rem;\n }\n .design-mapping {\n margin-top: 0.25rem;\n }\n .design-entry {\n font-family: monospace;\n font-size: 0.8rem;\n color: #495057;\n padding: 0.15rem 0;\n }\n .design-scope {\n color: #0d6efd;\n }\n .design-field {\n color: #198754;\n }\n .design-entry i {\n font-size: 0.7rem;\n margin: 0 0.25rem;\n color: #adb5bd;\n }\n .design-unconfigured {\n color: #6c757d;\n font-style: italic;\n font-size: 0.85rem;\n }\n `,\n ],\n})\nexport class EpistolaDocumentPreviewComponent\n implements FormioCustomComponent<Record<string, any> | null>, OnChanges, OnDestroy\n{\n @Input() value!: Record<string, any> | null;\n @Output() valueChange = new EventEmitter<Record<string, any> | null>();\n\n @Input() disabled = false;\n @Input() label = 'Document Preview';\n @Input() processDefinitionKey?: string;\n @Input() sourceActivityId?: string;\n @Input() overrideMapping?: Record<string, any>;\n /**\n * Task id forwarded by the Formio wrapper from the server-prefilled form\n * ({@code epistola:taskId} value resolver), populated in every Valtimo task-open flow.\n */\n @Input() taskInstanceId?: string | null;\n\n loading = false;\n error: string | null = null;\n previewUrl: SafeResourceUrl | null = null;\n designMode = false;\n private initialized = false;\n private currentBlobUrl: string | null = null;\n private previewSubscription?: Subscription;\n\n constructor(\n private readonly epistolaPluginService: EpistolaPluginService,\n private readonly sanitizer: DomSanitizer,\n private readonly formIoStateService: FormIoStateService,\n private readonly cdr: ChangeDetectorRef,\n ) {}\n\n /**\n * The active task id, forwarded by the Formio wrapper from the server-prefilled\n * form ({@code epistola:taskId} value resolver). Null outside a task context\n * (e.g. Formio builder), in which case the component fails closed.\n */\n private get currentTaskId(): string | null {\n return this.taskInstanceId ?? null;\n }\n\n get overrideMappingScopes(): string[] {\n return this.overrideMapping ? Object.keys(this.overrideMapping) : [];\n }\n\n overrideMappingEntries(scope: string): { path: string; field: string }[] {\n const fields = this.overrideMapping?.[scope];\n if (!fields || typeof fields !== 'object') return [];\n return Object.entries(fields).map(([path, field]) => ({ path, field: String(field) }));\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!this.initialized) {\n this.initialized = true;\n\n // Detect design mode: no runtime context (Formio builder)\n const documentId = this.formIoStateService.documentId;\n if (!documentId) {\n this.designMode = true;\n this.cdr.markForCheck();\n return;\n }\n\n if (!this.sourceActivityId) {\n this.error = 'Preview is not configured: set the source activity on the form component.';\n this.cdr.markForCheck();\n return;\n }\n\n this.triggerPreview();\n return;\n }\n\n if (this.designMode) return;\n\n // React to input-override changes, and to the task id arriving late: the Formio\n // wrapper sets taskInstanceId after attach, so it can land after the first render —\n // re-run the preview once it does, instead of leaving the \"only available from\n // within a user task\" message until a manual refresh.\n if (changes['value'] || changes['taskInstanceId']) {\n this.triggerPreview();\n }\n }\n\n ngOnDestroy(): void {\n this.previewSubscription?.unsubscribe();\n this.revokeBlobUrl();\n }\n\n refresh(): void {\n this.triggerPreview();\n }\n\n /**\n * Load the preview only when there is enough data for it. Override-driven\n * previews (those with an override mapping) wait until the mapped form data\n * has been computed; until then they show a placeholder rather than firing a\n * request that Epistola would reject with a 400 for missing required fields.\n */\n private triggerPreview(): void {\n if (!shouldLoadPreview(this.overrideMapping, this.value)) {\n this.showWaitingForInput();\n return;\n }\n this.loadPreview();\n }\n\n private showWaitingForInput(): void {\n this.revokeBlobUrl();\n this.previewSubscription?.unsubscribe();\n this.previewUrl = null;\n this.loading = false;\n this.error = 'Complete the form to generate a preview.';\n this.cdr.markForCheck();\n }\n\n /**\n * Preview using the explicitly configured process link + input overrides.\n * Requires a runtime task context — the backend authorizes the request against\n * the task's process instance and case document, so all three ids must match.\n */\n private loadPreview(): void {\n if (!this.sourceActivityId) {\n this.error = 'Preview is not configured: set the source activity on the form component.';\n this.cdr.markForCheck();\n return;\n }\n\n // The backend derives the process instance and case document from the task, so the\n // task id is the only runtime context the request carries.\n const taskId = this.currentTaskId;\n if (!taskId) {\n this.error = 'Preview is only available from within a user task.';\n this.cdr.markForCheck();\n return;\n }\n\n this.loading = true;\n this.error = null;\n this.cdr.markForCheck();\n this.revokeBlobUrl();\n\n this.previewSubscription?.unsubscribe();\n this.previewSubscription = this.epistolaPluginService\n .previewToBlob({\n taskId,\n sourceActivityId: this.sourceActivityId,\n inputOverrides: this.value || null,\n overrides: null,\n })\n .subscribe({\n next: (blob) => this.handlePreviewSuccess(blob),\n error: (err) => this.handlePreviewError(err),\n });\n }\n\n private handlePreviewSuccess(blob: Blob): void {\n this.currentBlobUrl = URL.createObjectURL(blob);\n this.previewUrl = this.sanitizer.bypassSecurityTrustResourceUrl(this.currentBlobUrl);\n this.error = null;\n this.loading = false;\n this.cdr.markForCheck();\n }\n\n private handlePreviewError(err: any): void {\n this.previewUrl = null;\n if (err.error instanceof Blob) {\n err.error.text().then((text: string) => {\n try {\n const body = JSON.parse(text);\n this.error = body.details || body.error || 'Preview could not be generated';\n } catch {\n this.error = 'Preview could not be generated';\n }\n this.loading = false;\n this.cdr.markForCheck();\n });\n } else {\n this.error = err.error?.error || 'Preview could not be generated';\n this.loading = false;\n this.cdr.markForCheck();\n }\n }\n\n private revokeBlobUrl(): void {\n if (this.currentBlobUrl) {\n URL.revokeObjectURL(this.currentBlobUrl);\n this.currentBlobUrl = null;\n this.previewUrl = null;\n }\n }\n}\n","import { Component, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ActivatedRoute, Router, RouterModule } from '@angular/router';\nimport { PluginTranslatePipeModule } from '@valtimo/plugin';\nimport { TabsModule } from 'carbon-components-angular/tabs';\nimport { TagModule } from 'carbon-components-angular/tag';\nimport { EpistolaAdminService } from '../../services/epistola-admin.service';\nimport {\n BpmnValidationReport,\n BpmnValidationViolation,\n CatalogRedeployResult,\n ChangelogRelease,\n ClasspathCatalog,\n ConnectionStatus,\n FormCarrierIssue,\n PendingJob,\n PluginUsageEntry,\n} from '../../models';\n\n/**\n * Combined view model for a single plugin configuration card.\n */\ninterface ConfigurationCard {\n configurationId: string;\n configurationTitle: string;\n tenantId: string;\n reachable: boolean;\n latencyMs: number;\n errorMessage?: string;\n serverVersion?: string;\n usageCount: number;\n problemCount: number;\n usageEntries: PluginUsageEntry[];\n pendingJobs: PendingJob[];\n}\n\n@Component({\n selector: 'epistola-admin-page',\n templateUrl: './epistola-admin-page.component.html',\n styleUrls: ['./epistola-admin-page.component.scss'],\n standalone: true,\n imports: [CommonModule, RouterModule, PluginTranslatePipeModule, TabsModule, TagModule],\n})\nexport class EpistolaAdminPageComponent implements OnInit {\n cards: ConfigurationCard[] = [];\n selectedCard: ConfigurationCard | null = null;\n activeTab: 'actions' | 'pending' | 'catalogs' = 'actions';\n // NOTE: the 'forms' tab is TEMPORARY (remove in 1.0.0) — see the carrier-repair block below.\n overviewTab: 'configurations' | 'validations' | 'changelog' | 'forms' = 'configurations';\n loading = false;\n pluginVersion: string | null = null;\n changelog: ChangelogRelease[] | null = null;\n changelogLoading = false;\n validationReport: BpmnValidationReport | null = null;\n reconcilingExecutionIds = new Set<string>();\n reconcileFeedback: {\n executionId: string;\n type: 'success' | 'pending' | 'error';\n message: string;\n } | null = null;\n\n catalogs: ClasspathCatalog[] = [];\n catalogsLoading = false;\n redeployingSlugs = new Set<string>();\n catalogFeedback: {\n slug: string;\n type: 'success' | 'error';\n message: string;\n } | null = null;\n\n // TEMPORARY (removed in 1.0.0): task-id carrier detection + repair.\n formIssues: FormCarrierIssue[] | null = null;\n formIssuesLoading = false;\n repairingFormIds = new Set<string>();\n repairingAll = false;\n formFeedback: {\n formId: string;\n type: 'success' | 'error';\n message: string;\n } | null = null;\n\n private connectionStatuses: ConnectionStatus[] = [];\n private usageEntries: PluginUsageEntry[] = [];\n private pendingJobs: PendingJob[] = [];\n private connectionLoaded = false;\n private usageLoaded = false;\n private pendingLoaded = false;\n private deepLinkConfigId: string | null = null;\n\n constructor(\n private readonly adminService: EpistolaAdminService,\n private readonly route: ActivatedRoute,\n private readonly router: Router,\n ) {}\n\n /** Violations from the latest report (empty when healthy or not yet loaded). */\n get validationViolations(): BpmnValidationViolation[] {\n return this.validationReport?.violations ?? [];\n }\n\n /** Scan cadence in whole minutes, for the \"refreshes every N min\" note. */\n get refreshIntervalMinutes(): number {\n return Math.round((this.validationReport?.refreshIntervalMs ?? 600000) / 60000);\n }\n\n ngOnInit(): void {\n this.deepLinkConfigId = this.route.snapshot.queryParamMap.get('configurationId');\n const tab = this.route.snapshot.queryParamMap.get('tab');\n if (tab === 'pending' || tab === 'actions' || tab === 'catalogs') {\n this.activeTab = tab;\n }\n this.loadData();\n this.loadPluginVersion();\n }\n\n selectConfiguration(card: ConfigurationCard): void {\n this.selectedCard = card;\n this.activeTab = 'actions';\n this.updateUrl(card.configurationId, this.activeTab);\n this.loadCatalogs(card.configurationId);\n }\n\n backToOverview(): void {\n this.selectedCard = null;\n this.activeTab = 'actions';\n this.catalogs = [];\n this.catalogFeedback = null;\n this.updateUrl(null, null);\n }\n\n setActiveTab(tab: 'actions' | 'pending' | 'catalogs'): void {\n this.activeTab = tab;\n this.updateUrl(this.selectedCard?.configurationId ?? null, tab);\n }\n\n // 'forms' is TEMPORARY (remove in 1.0.0).\n setOverviewTab(tab: 'configurations' | 'validations' | 'changelog' | 'forms'): void {\n this.overviewTab = tab;\n if (tab === 'changelog' && this.changelog === null && !this.changelogLoading) {\n this.loadChangelog();\n }\n if (tab === 'forms' && this.formIssues === null && !this.formIssuesLoading) {\n this.loadFormIssues();\n }\n }\n\n // ---- TEMPORARY (removed in 1.0.0): task-id carrier detection + repair ----\n\n private loadFormIssues(): void {\n this.formIssuesLoading = true;\n this.formFeedback = null;\n this.adminService.getFormCarrierIssues().subscribe({\n next: (issues) => {\n this.formIssues = issues;\n this.formIssuesLoading = false;\n },\n error: () => {\n this.formIssues = [];\n this.formIssuesLoading = false;\n },\n });\n }\n\n isRepairingForm(issue: FormCarrierIssue): boolean {\n return this.repairingFormIds.has(issue.formId);\n }\n\n repairForm(issue: FormCarrierIssue): void {\n if (this.repairingFormIds.has(issue.formId)) {\n return;\n }\n this.repairingFormIds.add(issue.formId);\n this.formFeedback = null;\n this.adminService.repairFormCarrier(issue.formId).subscribe({\n next: (result) => {\n this.repairingFormIds.delete(issue.formId);\n this.formFeedback = {\n formId: issue.formId,\n type: 'success',\n message: `OK — ${result.componentsPatched} component(s) patched`,\n };\n this.loadFormIssues();\n },\n error: (err) => {\n this.repairingFormIds.delete(issue.formId);\n const message =\n err?.error?.errorMessage ?? err?.error?.message ?? err?.message ?? 'unknown error';\n this.formFeedback = { formId: issue.formId, type: 'error', message };\n },\n });\n }\n\n repairAllForms(): void {\n if (this.repairingAll) {\n return;\n }\n this.repairingAll = true;\n this.formFeedback = null;\n this.adminService.repairAllFormCarriers().subscribe({\n next: (summary) => {\n this.repairingAll = false;\n this.formFeedback = {\n formId: 'all',\n type: summary.failed > 0 ? 'error' : 'success',\n message: `Repaired ${summary.formsRepaired} form(s), ${summary.componentsPatched} component(s)${\n summary.failed > 0 ? `, ${summary.failed} failed` : ''\n }`,\n };\n this.loadFormIssues();\n },\n error: (err) => {\n this.repairingAll = false;\n const message = err?.error?.message ?? err?.message ?? 'unknown error';\n this.formFeedback = { formId: 'all', type: 'error', message };\n },\n });\n }\n\n private loadChangelog(): void {\n this.changelogLoading = true;\n this.adminService.getChangelog().subscribe({\n next: (releases) => {\n this.changelog = releases;\n this.changelogLoading = false;\n },\n error: () => {\n this.changelog = [];\n this.changelogLoading = false;\n },\n });\n }\n\n refresh(): void {\n this.selectedCard = null;\n this.loadData();\n }\n\n exportProcessLink(entry: PluginUsageEntry): void {\n this.adminService.exportProcessLink(entry.processLinkId).subscribe({\n next: (blob) => {\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = `${entry.activityId}.process-link.json`;\n anchor.click();\n URL.revokeObjectURL(url);\n },\n });\n }\n\n /**\n * Manually reconcile a single stuck catch event. Pulls the current Epistola job\n * status and re-runs message correlation if the job is in a terminal state.\n * Refreshes the Pending list on success so the row drops out of the table.\n */\n reconcilePending(job: PendingJob): void {\n if (this.reconcilingExecutionIds.has(job.executionId)) {\n return;\n }\n this.reconcilingExecutionIds.add(job.executionId);\n this.reconcileFeedback = null;\n\n this.adminService.reconcilePending(job.executionId).subscribe({\n next: (result) => {\n this.reconcilingExecutionIds.delete(job.executionId);\n this.reconcileFeedback = {\n executionId: job.executionId,\n type: 'success',\n message: `OK (${result.epistolaStatus}, ${result.correlatedCount ?? 0} correlated)`,\n };\n this.loadData();\n },\n error: (err) => {\n this.reconcilingExecutionIds.delete(job.executionId);\n // 409 from the backend = job is still PENDING/IN_PROGRESS, surface as\n // informational rather than an error.\n if (err?.status === 409) {\n const status = err.error?.epistolaStatus ?? 'still pending';\n this.reconcileFeedback = {\n executionId: job.executionId,\n type: 'pending',\n message: `Epistola: ${status}. Try again in a moment.`,\n };\n } else {\n const message =\n err?.error?.detail ?? err?.error?.message ?? err?.message ?? 'unknown error';\n this.reconcileFeedback = {\n executionId: job.executionId,\n type: 'error',\n message,\n };\n }\n },\n });\n }\n\n isReconciling(job: PendingJob): boolean {\n return this.reconcilingExecutionIds.has(job.executionId);\n }\n\n /**\n * Load the classpath catalogs available to (re)deploy for the given\n * configuration. Lazy — only called when a configuration is opened, not for\n * every card in the overview.\n */\n private loadCatalogs(configurationId: string): void {\n this.catalogsLoading = true;\n this.catalogFeedback = null;\n this.adminService.getClasspathCatalogs(configurationId).subscribe({\n next: (catalogs) => {\n this.catalogs = catalogs;\n this.catalogsLoading = false;\n },\n error: () => {\n this.catalogs = [];\n this.catalogsLoading = false;\n },\n });\n }\n\n /**\n * Force-redeploy a single classpath catalog to the selected configuration's\n * Epistola installation. Explicit operator action — the backend bypasses the\n * templateSyncEnabled gate and the version-skip check. Reloads the catalog\n * list on success so the deployed version / up-to-date hint refreshes.\n */\n redeployCatalog(catalog: ClasspathCatalog): void {\n if (!this.selectedCard || this.redeployingSlugs.has(catalog.slug)) {\n return;\n }\n const configurationId = this.selectedCard.configurationId;\n this.redeployingSlugs.add(catalog.slug);\n this.catalogFeedback = null;\n\n this.adminService.redeployCatalog(configurationId, catalog.slug).subscribe({\n next: (result: CatalogRedeployResult) => {\n this.redeployingSlugs.delete(catalog.slug);\n this.catalogFeedback = {\n slug: catalog.slug,\n type: 'success',\n message: `OK — installed ${result.installed}, updated ${result.updated}, failed ${result.failed} (of ${result.total})`,\n };\n this.loadCatalogs(configurationId);\n },\n error: (err) => {\n this.redeployingSlugs.delete(catalog.slug);\n const message =\n err?.error?.errorMessage ??\n err?.error?.detail ??\n err?.error?.message ??\n err?.message ??\n 'unknown error';\n this.catalogFeedback = {\n slug: catalog.slug,\n type: 'error',\n message,\n };\n },\n });\n }\n\n isRedeploying(catalog: ClasspathCatalog): boolean {\n return this.redeployingSlugs.has(catalog.slug);\n }\n\n private updateUrl(configurationId: string | null, tab: string | null): void {\n this.router.navigate([], {\n relativeTo: this.route,\n queryParams: {\n configurationId: configurationId ?? null,\n tab: tab ?? null,\n },\n replaceUrl: true,\n });\n }\n\n private loadData(): void {\n this.loading = true;\n this.connectionLoaded = false;\n this.usageLoaded = false;\n this.pendingLoaded = false;\n\n this.adminService.getConnectionStatus().subscribe({\n next: (statuses) => {\n this.connectionStatuses = statuses;\n this.connectionLoaded = true;\n this.tryBuildCards();\n },\n error: () => {\n this.connectionStatuses = [];\n this.connectionLoaded = true;\n this.tryBuildCards();\n },\n });\n\n this.adminService.getPluginUsage().subscribe({\n next: (entries) => {\n this.usageEntries = entries;\n this.usageLoaded = true;\n this.tryBuildCards();\n },\n error: () => {\n this.usageEntries = [];\n this.usageLoaded = true;\n this.tryBuildCards();\n },\n });\n\n this.adminService.getPendingJobs().subscribe({\n next: (jobs) => {\n this.pendingJobs = jobs;\n this.pendingLoaded = true;\n this.tryBuildCards();\n },\n error: () => {\n this.pendingJobs = [];\n this.pendingLoaded = true;\n this.tryBuildCards();\n },\n });\n\n // Validation report is independent of cards — load alongside but don't\n // gate the loading flag on it.\n this.adminService.getValidationReport().subscribe({\n next: (report) => {\n this.validationReport = report;\n },\n error: () => {\n this.validationReport = null;\n },\n });\n }\n\n private tryBuildCards(): void {\n if (!this.connectionLoaded || !this.usageLoaded || !this.pendingLoaded) {\n return;\n }\n\n this.cards = this.connectionStatuses.map((status) => {\n const entries = this.usageEntries.filter((e) => e.configurationId === status.configurationId);\n const jobs = this.pendingJobs.filter((j) => j.tenantId === status.tenantId);\n const problemCount = entries.reduce((sum, e) => sum + e.problems.length, 0);\n\n return {\n configurationId: status.configurationId,\n configurationTitle: status.configurationTitle,\n tenantId: status.tenantId,\n reachable: status.reachable,\n latencyMs: status.latencyMs,\n errorMessage: status.errorMessage,\n serverVersion: status.serverVersion,\n usageCount: entries.length,\n problemCount,\n usageEntries: entries,\n pendingJobs: jobs,\n };\n });\n\n // Restore deep link selection\n if (this.deepLinkConfigId) {\n const match = this.cards.find((c) => c.configurationId === this.deepLinkConfigId);\n if (match) {\n this.selectedCard = match;\n this.loadCatalogs(match.configurationId);\n }\n this.deepLinkConfigId = null;\n }\n\n this.loading = false;\n }\n\n private loadPluginVersion(): void {\n this.adminService.getVersions().subscribe({\n next: (info) => {\n this.pluginVersion = info.pluginVersion;\n },\n });\n }\n}\n","<div class=\"epistola-admin\">\n <!-- Overview: tabs (no configuration selected) -->\n <ng-container *ngIf=\"!selectedCard\">\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\n <div class=\"d-flex align-items-center\">\n <h5 class=\"mb-0\">{{ 'epistolaAdminOverview' | pluginTranslate: 'epistola' | async }}</h5>\n <span *ngIf=\"pluginVersion\" class=\"version-badge ms-2\">v{{ pluginVersion }}</span>\n </div>\n <button class=\"btn btn-outline-primary btn-sm\" (click)=\"refresh()\" [disabled]=\"loading\">\n {{ 'epistolaAdminRefresh' | pluginTranslate: 'epistola' | async }}\n </button>\n </div>\n\n <ng-template #configurationsHeading>\n {{ 'epistolaAdminConfigurations' | pluginTranslate: 'epistola' | async }}\n <cds-tag size=\"sm\" type=\"gray\" class=\"ms-1\">{{ cards.length }}</cds-tag>\n </ng-template>\n\n <ng-template #validationsHeading>\n {{ 'epistolaAdminValidations' | pluginTranslate: 'epistola' | async }}\n <cds-tag size=\"sm\" [type]=\"validationViolations.length > 0 ? 'red' : 'gray'\" class=\"ms-1\">\n {{ validationViolations.length }}\n </cds-tag>\n </ng-template>\n\n <ng-template #changelogHeading>\n {{ 'epistolaAdminChangelog' | pluginTranslate: 'epistola' | async }}\n </ng-template>\n\n <!-- TEMPORARY (removed in 1.0.0): forms missing the task-id carrier -->\n <ng-template #formsHeading>\n {{ 'epistolaAdminForms' | pluginTranslate: 'epistola' | async }}\n <cds-tag\n *ngIf=\"formIssues\"\n size=\"sm\"\n [type]=\"formIssues.length > 0 ? 'red' : 'gray'\"\n class=\"ms-1\"\n >{{ formIssues.length }}</cds-tag\n >\n </ng-template>\n\n <cds-tabs [cacheActive]=\"true\" type=\"contained\">\n <cds-tab\n [heading]=\"configurationsHeading\"\n [active]=\"overviewTab === 'configurations'\"\n (selected)=\"setOverviewTab('configurations')\"\n >\n <div *ngIf=\"loading\" class=\"text-muted mt-3\">\n {{ 'epistolaAdminLoading' | pluginTranslate: 'epistola' | async }}\n </div>\n\n <div *ngIf=\"!loading && cards.length === 0\" class=\"text-muted mt-3\">\n {{ 'epistolaAdminNoConfigurations' | pluginTranslate: 'epistola' | async }}\n </div>\n\n <div *ngIf=\"!loading && cards.length > 0\" class=\"card-grid\">\n <div\n *ngFor=\"let card of cards\"\n class=\"config-card\"\n [class.config-card--ok]=\"card.reachable && card.problemCount === 0\"\n [class.config-card--warning]=\"card.reachable && card.problemCount > 0\"\n [class.config-card--error]=\"!card.reachable\"\n (click)=\"selectConfiguration(card)\"\n >\n <div class=\"config-card__header\">\n <span\n class=\"status-dot\"\n [class.status-dot--ok]=\"card.reachable\"\n [class.status-dot--error]=\"!card.reachable\"\n >\n </span>\n <h5 class=\"config-card__title\">{{ card.configurationTitle }}</h5>\n </div>\n\n <div class=\"config-card__body\">\n <div class=\"config-card__field\">\n <span class=\"config-card__label\">{{\n 'epistolaAdminTenantId' | pluginTranslate: 'epistola' | async\n }}</span>\n <code class=\"config-card__value\">{{ card.tenantId }}</code>\n </div>\n <div class=\"config-card__field\">\n <span class=\"config-card__label\">{{\n 'epistolaAdminStatus' | pluginTranslate: 'epistola' | async\n }}</span>\n <cds-tag size=\"sm\" [type]=\"card.reachable ? 'green' : 'red'\">\n {{\n card.reachable\n ? ('epistolaAdminConnected' | pluginTranslate: 'epistola' | async)\n : ('epistolaAdminUnreachable' | pluginTranslate: 'epistola' | async)\n }}\n </cds-tag>\n </div>\n <div *ngIf=\"card.serverVersion\" class=\"config-card__field\">\n <span class=\"config-card__label\">{{\n 'epistolaAdminServerVersion' | pluginTranslate: 'epistola' | async\n }}</span>\n <span class=\"config-card__value\">{{ card.serverVersion }}</span>\n </div>\n <div class=\"config-card__field\">\n <span class=\"config-card__label\">{{\n 'epistolaAdminPluginActions' | pluginTranslate: 'epistola' | async\n }}</span>\n <span class=\"config-card__value\">{{ card.usageCount }}</span>\n </div>\n <div *ngIf=\"card.pendingJobs.length > 0\" class=\"config-card__field\">\n <span class=\"config-card__label\">{{\n 'epistolaAdminPendingJobs' | pluginTranslate: 'epistola' | async\n }}</span>\n <cds-tag size=\"sm\" type=\"blue\">{{ card.pendingJobs.length }}</cds-tag>\n </div>\n <div *ngIf=\"card.problemCount > 0\" class=\"config-card__field\">\n <span class=\"config-card__label\">{{\n 'epistolaAdminProblems' | pluginTranslate: 'epistola' | async\n }}</span>\n <cds-tag size=\"sm\" type=\"red\">{{ card.problemCount }}</cds-tag>\n </div>\n </div>\n\n <div class=\"config-card__footer\">\n <span class=\"config-card__latency\">{{ card.latencyMs }} ms</span>\n </div>\n </div>\n </div>\n </cds-tab>\n\n <cds-tab\n [heading]=\"validationsHeading\"\n [active]=\"overviewTab === 'validations'\"\n (selected)=\"setOverviewTab('validations')\"\n >\n <div class=\"text-muted small mt-3\">\n <div>\n {{ 'epistolaAdminValidationLastChecked' | pluginTranslate: 'epistola' | async }}:\n <ng-container *ngIf=\"validationReport?.lastCheckedAt; else notYetRun\">\n {{ validationReport?.lastCheckedAt | date: 'medium' }}\n </ng-container>\n <ng-template #notYetRun>\n {{ 'epistolaAdminValidationNotYetRun' | pluginTranslate: 'epistola' | async }}\n </ng-template>\n · {{ 'epistolaAdminValidationAutoRefresh' | pluginTranslate: 'epistola' | async }}\n {{ refreshIntervalMinutes }} min.\n </div>\n <div>\n {{ 'epistolaAdminValidationLatestVersionNote' | pluginTranslate: 'epistola' | async }}\n </div>\n </div>\n\n <div *ngIf=\"validationViolations.length === 0\" class=\"text-muted mt-3 mb-3\">\n {{ 'epistolaAdminNoValidations' | pluginTranslate: 'epistola' | async }}\n </div>\n\n <div *ngIf=\"validationViolations.length > 0\" class=\"mt-3\">\n <p class=\"text-muted mb-3\">\n {{ 'epistolaAdminValidationWarningBody' | pluginTranslate: 'epistola' | async }}\n </p>\n <table class=\"table table-striped\">\n <thead>\n <tr>\n <th>{{ 'epistolaAdminProcess' | pluginTranslate: 'epistola' | async }}</th>\n <th>{{ 'epistolaAdminActivity' | pluginTranslate: 'epistola' | async }}</th>\n <th>{{ 'epistolaAdminValidationCode' | pluginTranslate: 'epistola' | async }}</th>\n <th>\n {{ 'epistolaAdminValidationMessage' | pluginTranslate: 'epistola' | async }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let v of validationViolations\">\n <td>\n {{ v.processDefinitionName || v.processDefinitionKey }}\n <div *ngIf=\"v.processDefinitionName\" class=\"text-muted small\">\n <code>{{ v.processDefinitionKey }}</code>\n </div>\n </td>\n <td>\n <code>{{ v.activityId }}</code>\n </td>\n <td>\n <cds-tag size=\"sm\" type=\"red\">{{ v.code }}</cds-tag>\n </td>\n <td>{{ v.message }}</td>\n </tr>\n </tbody>\n </table>\n </div>\n </cds-tab>\n\n <cds-tab\n [heading]=\"changelogHeading\"\n [active]=\"overviewTab === 'changelog'\"\n (selected)=\"setOverviewTab('changelog')\"\n >\n <div class=\"d-flex align-items-center mt-3 mb-3\">\n <span class=\"text-muted me-2\">{{\n 'epistolaAdminRunningVersion' | pluginTranslate: 'epistola' | async\n }}</span>\n <cds-tag size=\"sm\" type=\"blue\">v{{ pluginVersion || '—' }}</cds-tag>\n </div>\n\n <div *ngIf=\"changelogLoading\" class=\"text-muted mb-3\">\n {{ 'epistolaAdminLoading' | pluginTranslate: 'epistola' | async }}\n </div>\n\n <div\n *ngIf=\"!changelogLoading && changelog && changelog.length === 0\"\n class=\"text-muted mb-3\"\n >\n {{ 'epistolaAdminNoChangelog' | pluginTranslate: 'epistola' | async }}\n </div>\n\n <div\n *ngIf=\"!changelogLoading && changelog && changelog.length > 0\"\n class=\"epistola-changelog\"\n >\n <section *ngFor=\"let release of changelog\" class=\"changelog-release\">\n <div class=\"changelog-release__header\">\n <cds-tag size=\"sm\" type=\"purple\">{{ release.version }}</cds-tag>\n <span *ngIf=\"release.date\" class=\"text-muted ms-2\">{{ release.date }}</span>\n </div>\n <div *ngFor=\"let section of release.sections\" class=\"changelog-section\">\n <h6 class=\"changelog-section__title\">{{ section.title }}</h6>\n <ul class=\"changelog-section__items\">\n <li *ngFor=\"let item of section.items\">{{ item }}</li>\n </ul>\n </div>\n </section>\n </div>\n </cds-tab>\n\n <!-- TEMPORARY (removed in 1.0.0): forms missing the task-id carrier -->\n <cds-tab\n [heading]=\"formsHeading\"\n [active]=\"overviewTab === 'forms'\"\n (selected)=\"setOverviewTab('forms')\"\n >\n <p class=\"text-muted mt-3 mb-3\">\n {{ 'epistolaAdminFormsIntro' | pluginTranslate: 'epistola' | async }}\n </p>\n\n <div *ngIf=\"formIssuesLoading\" class=\"text-muted mb-3\">\n {{ 'epistolaAdminLoading' | pluginTranslate: 'epistola' | async }}\n </div>\n\n <div\n *ngIf=\"!formIssuesLoading && formIssues && formIssues.length === 0\"\n class=\"text-muted mb-3\"\n >\n {{ 'epistolaAdminNoFormIssues' | pluginTranslate: 'epistola' | async }}\n </div>\n\n <div *ngIf=\"!formIssuesLoading && formIssues && formIssues.length > 0\">\n <div class=\"mb-2\">\n <button\n class=\"btn btn-sm btn-primary\"\n (click)=\"repairAllForms()\"\n [disabled]=\"repairingAll\"\n >\n {{\n (repairingAll ? 'epistolaAdminRepairing' : 'epistolaAdminRepairAll')\n | pluginTranslate: 'epistola'\n | async\n }}\n </button>\n <span\n *ngIf=\"formFeedback && formFeedback.formId === 'all'\"\n class=\"small ms-2\"\n [class.text-success]=\"formFeedback.type === 'success'\"\n [class.text-danger]=\"formFeedback.type === 'error'\"\n >{{ formFeedback.message }}</span\n >\n </div>\n\n <table class=\"table table-striped\">\n <thead>\n <tr>\n <th>{{ 'epistolaAdminFormName' | pluginTranslate: 'epistola' | async }}</th>\n <th>{{ 'epistolaAdminFormMissing' | pluginTranslate: 'epistola' | async }}</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let issue of formIssues\">\n <td>\n <code>{{ issue.name }}</code>\n <cds-tag\n *ngIf=\"issue.readOnly\"\n size=\"sm\"\n type=\"warm-gray\"\n class=\"ms-1\"\n [title]=\"'epistolaAdminFormReadOnlyHint' | pluginTranslate: 'epistola' | async\"\n >{{\n 'epistolaAdminFormReadOnly' | pluginTranslate: 'epistola' | async\n }}</cds-tag\n >\n </td>\n <td>{{ issue.missingComponents }}</td>\n <td class=\"text-end\">\n <button\n class=\"btn btn-sm btn-outline-primary\"\n (click)=\"repairForm(issue)\"\n [disabled]=\"isRepairingForm(issue)\"\n [title]=\"'epistolaAdminRepairTooltip' | pluginTranslate: 'epistola' | async\"\n >\n {{\n (isRepairingForm(issue) ? 'epistolaAdminRepairing' : 'epistolaAdminRepair')\n | pluginTranslate: 'epistola'\n | async\n }}\n </button>\n <div\n *ngIf=\"formFeedback && formFeedback.formId === issue.formId\"\n class=\"small mt-1\"\n [class.text-success]=\"formFeedback.type === 'success'\"\n [class.text-danger]=\"formFeedback.type === 'error'\"\n >\n {{ formFeedback.message }}\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </cds-tab>\n </cds-tabs>\n </ng-container>\n\n <!-- Detail view: selected configuration -->\n <ng-container *ngIf=\"selectedCard\">\n <div class=\"detail-header mb-3\">\n <button class=\"btn btn-link btn-sm p-0\" (click)=\"backToOverview()\">\n ← {{ 'epistolaAdminBackToOverview' | pluginTranslate: 'epistola' | async }}\n </button>\n </div>\n\n <div class=\"detail-summary mb-4\">\n <h4>\n <span\n class=\"status-dot me-2\"\n [class.status-dot--ok]=\"selectedCard.reachable\"\n [class.status-dot--error]=\"!selectedCard.reachable\"\n >\n </span>\n {{ selectedCard.configurationTitle }}\n </h4>\n\n <table class=\"table table-sm detail-info-table\">\n <tbody>\n <tr>\n <th>{{ 'epistolaAdminTenantId' | pluginTranslate: 'epistola' | async }}</th>\n <td>\n <code>{{ selectedCard.tenantId }}</code>\n </td>\n </tr>\n <tr>\n <th>{{ 'epistolaAdminStatus' | pluginTranslate: 'epistola' | async }}</th>\n <td>\n <cds-tag size=\"sm\" [type]=\"selectedCard.reachable ? 'green' : 'red'\">\n {{\n selectedCard.reachable\n ? ('epistolaAdminConnected' | pluginTranslate: 'epistola' | async)\n : ('epistolaAdminUnreachable' | pluginTranslate: 'epistola' | async)\n }}\n </cds-tag>\n <span class=\"text-muted ms-2\">{{ selectedCard.latencyMs }} ms</span>\n </td>\n </tr>\n <tr *ngIf=\"selectedCard.serverVersion\">\n <th>{{ 'epistolaAdminServerVersion' | pluginTranslate: 'epistola' | async }}</th>\n <td>{{ selectedCard.serverVersion }}</td>\n </tr>\n <tr *ngIf=\"selectedCard.errorMessage\">\n <th>{{ 'epistolaAdminError' | pluginTranslate: 'epistola' | async }}</th>\n <td class=\"text-danger\">{{ selectedCard.errorMessage }}</td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <!-- Tabs -->\n <ng-template #actionsHeading>\n {{ 'epistolaAdminPluginActions' | pluginTranslate: 'epistola' | async }}\n <cds-tag size=\"sm\" type=\"gray\" class=\"ms-1\">{{ selectedCard.usageEntries.length }}</cds-tag>\n </ng-template>\n\n <ng-template #pendingHeading>\n {{ 'epistolaAdminPendingJobs' | pluginTranslate: 'epistola' | async }}\n <cds-tag\n size=\"sm\"\n [type]=\"selectedCard.pendingJobs.length > 0 ? 'blue' : 'gray'\"\n class=\"ms-1\"\n >\n {{ selectedCard.pendingJobs.length }}\n </cds-tag>\n </ng-template>\n\n <ng-template #catalogsHeading>\n {{ 'epistolaAdminCatalogs' | pluginTranslate: 'epistola' | async }}\n <cds-tag size=\"sm\" type=\"gray\" class=\"ms-1\">{{ catalogs.length }}</cds-tag>\n </ng-template>\n\n <cds-tabs [cacheActive]=\"true\" type=\"contained\">\n <cds-tab\n [heading]=\"actionsHeading\"\n [active]=\"activeTab === 'actions'\"\n (selected)=\"setActiveTab('actions')\"\n >\n <div *ngIf=\"selectedCard.usageEntries.length === 0\" class=\"text-muted mt-3 mb-3\">\n {{ 'epistolaAdminNoUsageForConfig' | pluginTranslate: 'epistola' | async }}\n </div>\n\n <table *ngIf=\"selectedCard.usageEntries.length > 0\" class=\"table table-striped mt-3\">\n <thead>\n <tr>\n <th>{{ 'epistolaAdminCase' | pluginTranslate: 'epistola' | async }}</th>\n <th>{{ 'epistolaAdminProcess' | pluginTranslate: 'epistola' | async }}</th>\n <th>{{ 'epistolaAdminActivity' | pluginTranslate: 'epistola' | async }}</th>\n <th>{{ 'epistolaAdminAction' | pluginTranslate: 'epistola' | async }}</th>\n <th>{{ 'epistolaAdminProblems' | pluginTranslate: 'epistola' | async }}</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr\n *ngFor=\"let entry of selectedCard.usageEntries\"\n [class.table-warning]=\"entry.problems.length > 0\"\n >\n <td>{{ entry.caseDefinitionKey || '-' }}</td>\n <td>\n <a\n *ngIf=\"entry.caseDefinitionKey && entry.caseDefinitionVersionTag\"\n [routerLink]=\"[\n '/case-management',\n 'case',\n entry.caseDefinitionKey,\n 'version',\n entry.caseDefinitionVersionTag,\n 'processes',\n entry.processDefinitionKey,\n ]\"\n class=\"usage-link\"\n >\n {{ entry.processDefinitionName }}\n </a>\n <span *ngIf=\"!entry.caseDefinitionKey || !entry.caseDefinitionVersionTag\">\n {{ entry.processDefinitionName }}\n </span>\n </td>\n <td>{{ entry.activityName }}</td>\n <td>\n <code>{{ entry.actionKey }}</code>\n </td>\n <td>\n <cds-tag *ngIf=\"entry.problems.length === 0\" size=\"sm\" type=\"green\">OK</cds-tag>\n <cds-tag\n *ngFor=\"let problem of entry.problems\"\n size=\"sm\"\n type=\"red\"\n class=\"d-block mb-1\"\n >\n {{ problem }}\n </cds-tag>\n </td>\n <td>\n <button\n class=\"btn btn-sm btn-outline-secondary\"\n (click)=\"exportProcessLink(entry)\"\n [title]=\"'epistolaAdminExport' | pluginTranslate: 'epistola' | async\"\n >\n ⤓\n </button>\n </td>\n </tr>\n </tbody>\n </table>\n </cds-tab>\n\n <cds-tab\n [heading]=\"pendingHeading\"\n [active]=\"activeTab === 'pending'\"\n (selected)=\"setActiveTab('pending')\"\n >\n <div *ngIf=\"selectedCard.pendingJobs.length === 0\" class=\"text-muted mt-3 mb-3\">\n {{ 'epistolaAdminNoPendingJobs' | pluginTranslate: 'epistola' | async }}\n </div>\n\n <table *ngIf=\"selectedCard.pendingJobs.length > 0\" class=\"table table-striped mt-3\">\n <thead>\n <tr>\n <th>{{ 'epistolaAdminProcess' | pluginTranslate: 'epistola' | async }}</th>\n <th>{{ 'epistolaAdminActivity' | pluginTranslate: 'epistola' | async }}</th>\n <th>{{ 'epistolaAdminRequestId' | pluginTranslate: 'epistola' | async }}</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let job of selectedCard.pendingJobs\">\n <td>{{ job.processDefinitionName }}</td>\n <td>{{ job.activityName }}</td>\n <td>\n <code>{{ job.requestId }}</code>\n </td>\n <td class=\"text-end\">\n <button\n class=\"btn btn-sm btn-outline-primary\"\n (click)=\"reconcilePending(job)\"\n [disabled]=\"isReconciling(job)\"\n [title]=\"'epistolaAdminReconcileTooltip' | pluginTranslate: 'epistola' | async\"\n >\n <span *ngIf=\"!isReconciling(job)\">\n {{ 'epistolaAdminReconcile' | pluginTranslate: 'epistola' | async }}\n </span>\n <span *ngIf=\"isReconciling(job)\">\n {{ 'epistolaAdminReconciling' | pluginTranslate: 'epistola' | async }}\n </span>\n </button>\n <div\n *ngIf=\"reconcileFeedback && reconcileFeedback.executionId === job.executionId\"\n class=\"reconcile-feedback small mt-1\"\n [class.text-success]=\"reconcileFeedback.type === 'success'\"\n [class.text-warning]=\"reconcileFeedback.type === 'pending'\"\n [class.text-danger]=\"reconcileFeedback.type === 'error'\"\n >\n {{ reconcileFeedback.message }}\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </cds-tab>\n\n <cds-tab\n [heading]=\"catalogsHeading\"\n [active]=\"activeTab === 'catalogs'\"\n (selected)=\"setActiveTab('catalogs')\"\n >\n <p class=\"text-muted mt-3 mb-3\">\n {{ 'epistolaAdminCatalogsIntro' | pluginTranslate: 'epistola' | async }}\n </p>\n\n <div *ngIf=\"catalogsLoading\" class=\"text-muted mb-3\">\n {{ 'epistolaAdminLoading' | pluginTranslate: 'epistola' | async }}\n </div>\n\n <div *ngIf=\"!catalogsLoading && catalogs.length === 0\" class=\"text-muted mb-3\">\n {{ 'epistolaAdminNoCatalogs' | pluginTranslate: 'epistola' | async }}\n </div>\n\n <table *ngIf=\"!catalogsLoading && catalogs.length > 0\" class=\"table table-striped\">\n <thead>\n <tr>\n <th>{{ 'epistolaAdminCatalogSlug' | pluginTranslate: 'epistola' | async }}</th>\n <th>{{ 'epistolaAdminCatalogVersion' | pluginTranslate: 'epistola' | async }}</th>\n <th>{{ 'epistolaAdminCatalogStatus' | pluginTranslate: 'epistola' | async }}</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let catalog of catalogs\">\n <td>\n <code>{{ catalog.slug }}</code>\n </td>\n <td>{{ catalog.version }}</td>\n <td>\n <cds-tag *ngIf=\"catalog.status === 'IN_EPISTOLA'\" size=\"sm\" type=\"green\">\n {{ 'epistolaAdminCatalogInEpistola' | pluginTranslate: 'epistola' | async }}\n </cds-tag>\n <cds-tag *ngIf=\"catalog.status === 'NOT_IN_EPISTOLA'\" size=\"sm\" type=\"red\">\n {{ 'epistolaAdminCatalogNotInEpistola' | pluginTranslate: 'epistola' | async }}\n </cds-tag>\n <cds-tag *ngIf=\"catalog.status === 'UNKNOWN'\" size=\"sm\" type=\"gray\">\n {{ 'epistolaAdminCatalogStatusUnknown' | pluginTranslate: 'epistola' | async }}\n </cds-tag>\n </td>\n <td class=\"text-end\">\n <button\n class=\"btn btn-sm btn-outline-primary\"\n (click)=\"redeployCatalog(catalog)\"\n [disabled]=\"isRedeploying(catalog)\"\n [title]=\"'epistolaAdminRedeployTooltip' | pluginTranslate: 'epistola' | async\"\n >\n <span *ngIf=\"!isRedeploying(catalog)\">\n {{ 'epistolaAdminRedeploy' | pluginTranslate: 'epistola' | async }}\n </span>\n <span *ngIf=\"isRedeploying(catalog)\">\n {{ 'epistolaAdminRedeploying' | pluginTranslate: 'epistola' | async }}\n </span>\n </button>\n <div\n *ngIf=\"catalogFeedback && catalogFeedback.slug === catalog.slug\"\n class=\"reconcile-feedback small mt-1\"\n [class.text-success]=\"catalogFeedback.type === 'success'\"\n [class.text-danger]=\"catalogFeedback.type === 'error'\"\n >\n {{ catalogFeedback.message }}\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </cds-tab>\n </cds-tabs>\n </ng-container>\n</div>\n","export interface EpistolaRuntimeEnv {\n epistolaEnabled?: boolean | string;\n}\n\ninterface EpistolaRuntimeWindow {\n env?: EpistolaRuntimeEnv;\n}\n\ndeclare global {\n interface Window extends EpistolaRuntimeWindow {}\n}\n\nfunction isRuntimeWindow(value: unknown): value is EpistolaRuntimeWindow {\n return typeof value === 'object' && value !== null;\n}\n\n/**\n * Reads the runtime feature flag that decides whether the Epistola plugin\n * surfaces (admin menu, /epistola route, plugin specification, Formio\n * components) should activate in the host Valtimo app.\n *\n * The flag is sourced from `window['env']['epistolaEnabled']`, populated at\n * container start by `envsubst` against `assets/config.template.js` (the\n * standard Valtimo runtime-config pattern). Defaults to enabled — only the\n * literal `false` or string `'false'` disables the plugin, matching the\n * backend's `epistola.enabled` `matchIfMissing = true` semantics.\n *\n * Exposed as a runtime helper rather than evaluated directly in `@NgModule`\n * decorator metadata because Angular's AOT compiler cannot statically resolve\n * `window` accesses (NG1010). Read from runtime code such as specification\n * property getters, route guards, or the environment initializer instead.\n */\nexport function isEpistolaEnabled(): boolean {\n const runtimeWindow = Reflect.get(globalThis, 'window');\n if (!runtimeWindow) return true;\n if (!isRuntimeWindow(runtimeWindow)) return true;\n const flag = runtimeWindow.env ? runtimeWindow.env.epistolaEnabled : undefined;\n return flag !== false && flag !== 'false';\n}\n","import { inject } from '@angular/core';\nimport { CanActivateFn, Router } from '@angular/router';\nimport { isEpistolaEnabled } from './epistola-runtime-config';\n\nexport const epistolaEnabledGuard: CanActivateFn = () => {\n if (isEpistolaEnabled()) return true;\n return inject(Router).parseUrl('/');\n};\n","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\nimport { AuthGuardService } from '@valtimo/security';\nimport { EpistolaAdminPageComponent } from './components/epistola-admin-page/epistola-admin-page.component';\nimport { epistolaEnabledGuard } from './epistola-enabled.guard';\n\nconst routes: Routes = [\n {\n path: 'epistola',\n component: EpistolaAdminPageComponent,\n canActivate: [epistolaEnabledGuard, AuthGuardService],\n data: { title: 'Epistola', roles: ['ROLE_ADMIN'] },\n },\n];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule],\n})\nexport class EpistolaAdminRoutingModule {}\n","import { Injector } from '@angular/core';\nimport { FormioCustomComponentInfo, registerCustomFormioComponent } from '@valtimo/components';\nimport { EpistolaDocumentComponent } from './epistola-document.component';\nimport { readPrefilledTaskId, PREFILLED_TASK_ID_CARRIER } from '../../services/prefilled-task-id';\n\nexport const EPISTOLA_DOCUMENT_OPTIONS: FormioCustomComponentInfo = {\n type: 'epistola-document',\n selector: 'epistola-document-element',\n title: 'Epistola Document',\n group: 'basic',\n icon: 'file-pdf-o',\n emptyValue: null,\n fieldOptions: ['label', 'display', 'documentVariable', 'tenantIdVariable', 'filename'],\n // Embed the hidden task-id carrier so dropping this component is enough — no separate\n // field for the author to add. Valtimo prefills it server-side via the epistola: resolver.\n schema: { components: [PREFILLED_TASK_ID_CARRIER] },\n};\n\nexport function registerEpistolaDocumentComponent(injector: Injector): void {\n if (customElements.get(EPISTOLA_DOCUMENT_OPTIONS.selector)) {\n return;\n }\n registerCustomFormioComponent(EPISTOLA_DOCUMENT_OPTIONS, EpistolaDocumentComponent, injector);\n\n // Extend the base class to forward the server-prefilled task id (epistola: value\n // resolver) to the Angular element, so the download authorizes against the exact task in\n // every Valtimo task-open flow.\n const Formio = (window as any).Formio;\n const BaseComponent = Formio?.Components?.components?.[EPISTOLA_DOCUMENT_OPTIONS.type];\n if (!BaseComponent) {\n return;\n }\n\n class EpistolaDocumentWithTaskContext extends BaseComponent {\n attach(element: HTMLElement) {\n const result = super.attach(element);\n if (this._customAngularElement) {\n const prefilledTaskId = readPrefilledTaskId(this.root);\n if (prefilledTaskId) {\n this._customAngularElement['taskInstanceId'] = prefilledTaskId;\n }\n }\n return result;\n }\n }\n\n Formio.Components.setComponent(EPISTOLA_DOCUMENT_OPTIONS.type, EpistolaDocumentWithTaskContext);\n}\n","/**\n * Hides a registered custom Formio component from the builder's component palette,\n * while keeping it fully usable inside other components' `editForm`s and at runtime.\n *\n * Formio's `WebformBuilder` only adds a component to the palette when\n * `component.builderInfo && component.builderInfo.schema` is truthy. Overriding the\n * registered class's static `builderInfo` getter to `false` therefore removes it from\n * the palette. Runtime instantiation and editForm usage don't consult `builderInfo`,\n * so they are unaffected.\n *\n * Call this AFTER the component is registered (and after any `setComponent` re-registration),\n * so it targets the final class in `Formio.Components.components[type]`.\n */\nexport function hideFormioComponentFromBuilder(type: string): void {\n const registered = (window as any).Formio?.Components?.components?.[type];\n if (registered) {\n Object.defineProperty(registered, 'builderInfo', {\n get: () => false,\n configurable: true,\n });\n }\n}\n","import { Injector } from '@angular/core';\nimport { FormioCustomComponentInfo, registerCustomFormioComponent } from '@valtimo/components';\nimport { EpistolaRetryFormComponent } from './epistola-retry-form.component';\nimport { readPrefilledTaskId, PREFILLED_TASK_ID_CARRIER } from '../../services/prefilled-task-id';\nimport { hideFormioComponentFromBuilder } from '../formio-builder-utils';\n\nexport const EPISTOLA_RETRY_FORM_OPTIONS: FormioCustomComponentInfo = {\n type: 'epistola-retry-form',\n selector: 'epistola-retry-form-element',\n title: 'Epistola Retry Form',\n group: 'basic',\n icon: 'refresh',\n emptyValue: null,\n fieldOptions: ['sourceActivityId', 'label'], // sourceActivityId is optional (set via BPMN input parameter)\n // Embed the hidden task-id carrier so dropping this component is enough — no separate\n // field for the author to add. Valtimo prefills it server-side via the epistola: resolver.\n schema: { components: [PREFILLED_TASK_ID_CARRIER] },\n};\n\nexport function registerEpistolaRetryFormComponent(injector: Injector): void {\n if (customElements.get(EPISTOLA_RETRY_FORM_OPTIONS.selector)) {\n return;\n }\n registerCustomFormioComponent(EPISTOLA_RETRY_FORM_OPTIONS, EpistolaRetryFormComponent, injector);\n\n // Extend the base class to forward the server-prefilled task id (epistola: value\n // resolver) to the Angular element, so the retry form authorizes against the exact task in\n // every Valtimo task-open flow.\n const Formio = (window as any).Formio;\n const BaseComponent = Formio?.Components?.components?.[EPISTOLA_RETRY_FORM_OPTIONS.type];\n if (!BaseComponent) {\n return;\n }\n\n class EpistolaRetryFormWithTaskContext extends BaseComponent {\n attach(element: HTMLElement) {\n const result = super.attach(element);\n if (this._customAngularElement) {\n const prefilledTaskId = readPrefilledTaskId(this.root);\n if (prefilledTaskId) {\n this._customAngularElement['taskInstanceId'] = prefilledTaskId;\n }\n }\n return result;\n }\n }\n\n Formio.Components.setComponent(\n EPISTOLA_RETRY_FORM_OPTIONS.type,\n EpistolaRetryFormWithTaskContext,\n );\n\n // Part of the plugin's auto-deployed retry form, not a drop-anywhere component — hide it\n // from the builder palette. It still renders wherever it's already present in a form.\n hideFormioComponentFromBuilder(EPISTOLA_RETRY_FORM_OPTIONS.type);\n}\n","import { Injector } from '@angular/core';\nimport { FormioCustomComponentInfo, registerCustomFormioComponent } from '@valtimo/components';\nimport { EpistolaDocumentPreviewComponent } from './epistola-document-preview.component';\nimport { computeInputOverrides } from './preview-utils';\nimport { readPrefilledTaskId, PREFILLED_TASK_ID_CARRIER } from '../../services/prefilled-task-id';\n\nexport const EPISTOLA_DOCUMENT_PREVIEW_OPTIONS: FormioCustomComponentInfo = {\n type: 'epistola-document-preview',\n selector: 'epistola-document-preview-element',\n title: 'Epistola Document Preview',\n group: 'basic',\n icon: 'file-pdf-o',\n emptyValue: null,\n fieldOptions: ['label', 'processDefinitionKey', 'sourceActivityId', 'overrideMapping'],\n // Embed the hidden task-id carrier so dropping this component is enough — no separate\n // field for the author to add. Valtimo prefills it server-side via the epistola: resolver.\n schema: { components: [PREFILLED_TASK_ID_CARRIER] },\n editForm: () => ({\n components: [\n {\n type: 'epistola-process-link-selector',\n key: 'processLinkSelection',\n label: 'Process Link',\n weight: 10,\n validate: { required: true },\n },\n {\n type: 'epistola-override-builder',\n key: 'overrideMapping',\n label: 'Input Overrides',\n weight: 20,\n },\n ],\n }),\n};\n\nexport function registerEpistolaDocumentPreviewComponent(injector: Injector): void {\n if (customElements.get(EPISTOLA_DOCUMENT_PREVIEW_OPTIONS.selector)) {\n return;\n }\n\n // Register the base component (Angular element + Formio component class)\n registerCustomFormioComponent(\n EPISTOLA_DOCUMENT_PREVIEW_OPTIONS,\n EpistolaDocumentPreviewComponent,\n injector,\n );\n\n // Get the Formio Components registry and the registered base class\n const Formio = (window as any).Formio;\n if (!Formio?.Components) return;\n\n const BasePreviewComponent = Formio.Components.components[EPISTOLA_DOCUMENT_PREVIEW_OPTIONS.type];\n if (!BasePreviewComponent) return;\n\n // Extend the base class to listen for form data changes and compute input overrides\n class PreviewWithOverrides extends BasePreviewComponent {\n private _debounceTimer: any = null;\n private _changeListenerAttached = false;\n private _changeHandler: (() => void) | null = null;\n private _destroyed = false;\n\n attach(element: HTMLElement) {\n // Formio detaches and re-attaches components on every redraw — not only at\n // teardown — so a re-attach means the component is alive again. Clear the\n // destroyed flag here; it only stays set when detach() is the final call\n // (genuine teardown, e.g. task completion), which is what suppresses the\n // post-submit preview.\n this._destroyed = false;\n\n // Bidirectional sync between processLinkSelection object and separate properties.\n // The editForm uses processLinkSelection (single field), while the component\n // config and Angular inputs use processDefinitionKey + sourceActivityId.\n if (this.component?.processLinkSelection) {\n const sel = this.component.processLinkSelection;\n this.component.processDefinitionKey = sel.processDefinitionKey || '';\n this.component.sourceActivityId = sel.sourceActivityId || '';\n } else if (this.component?.processDefinitionKey && this.component?.sourceActivityId) {\n this.component.processLinkSelection = {\n processDefinitionKey: this.component.processDefinitionKey,\n sourceActivityId: this.component.sourceActivityId,\n };\n }\n\n const result = super.attach(element);\n\n if (this._customAngularElement) {\n this._customAngularElement['processDefinitionKey'] =\n this.component.processDefinitionKey || '';\n this._customAngularElement['sourceActivityId'] = this.component.sourceActivityId || '';\n // Forward the server-prefilled task id (epistola: value resolver) so the\n // component authorizes against the exact task in every Valtimo task-open flow.\n const prefilledTaskId = readPrefilledTaskId(this.root);\n if (prefilledTaskId) {\n this._customAngularElement['taskInstanceId'] = prefilledTaskId;\n }\n }\n\n // Listen to form changes and compute input overrides from the mapping\n if (this.root && this.component?.overrideMapping && !this._changeListenerAttached) {\n this._changeListenerAttached = true;\n this._changeHandler = () => this._computeAndSetOverrides();\n this.root.on('change', this._changeHandler);\n // Compute the initial overrides immediately (no debounce) so a pre-filled\n // form paints its preview without the 1.5s delay.\n this._computeAndSetOverrides(true);\n }\n\n return result;\n }\n\n // Tear down the change listener and any pending debounce so a preview is never\n // fired after the form is unmounted (e.g. on task completion). Without this the\n // 1.5s debounce can outlive submit and POST /preview with reset/incomplete data,\n // which Epistola rejects with a 400.\n detach() {\n this._destroyed = true;\n if (this._debounceTimer) {\n clearTimeout(this._debounceTimer);\n this._debounceTimer = null;\n }\n if (this._changeHandler && this.root?.off) {\n this.root.off('change', this._changeHandler);\n this._changeHandler = null;\n }\n this._changeListenerAttached = false;\n return super.detach();\n }\n\n private _computeAndSetOverrides(immediate = false) {\n if (this._debounceTimer) {\n clearTimeout(this._debounceTimer);\n }\n this._debounceTimer = setTimeout(\n () => {\n // Skip if the form is being/has been submitted or the component is gone —\n // those previews would run with incomplete/reset data and 400 from Epistola.\n if (this._destroyed || this.root?.submitting || this.root?.submitted) {\n return;\n }\n const mapping = this.component?.overrideMapping;\n const formData = this.root?.data;\n if (!mapping || !formData) {\n return;\n }\n const overrides = computeInputOverrides(mapping, formData);\n // Push null when there's nothing usable yet so the component reverts to\n // its \"complete the form\" placeholder instead of keeping a stale preview.\n this.setValue(Object.keys(overrides).length > 0 ? overrides : null);\n },\n immediate ? 0 : 1500,\n );\n }\n }\n\n // Re-register with the extended class\n Formio.Components.setComponent(EPISTOLA_DOCUMENT_PREVIEW_OPTIONS.type, PreviewWithOverrides);\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n Output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { FormioCustomComponent } from '@valtimo/components';\n\nconst FORM_REF_PREFIX = 'form:';\n\ninterface OverrideRow {\n scope: 'doc' | 'pv';\n inputPath: string;\n formFieldKey: string;\n}\n\nexport interface FormFieldOption {\n key: string;\n label: string;\n}\n\n/**\n * Override mapping format: scope → { inputPath → \"form:<componentKey>\" }\n * The \"form:\" prefix identifies this as a reference to a Formio component.\n */\nexport type OverrideMapping = Record<string, Record<string, string>>;\n\n@Component({\n standalone: true,\n imports: [CommonModule, FormsModule],\n selector: 'epistola-override-builder-component',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"override-builder\">\n <div class=\"builder-header\">\n <span class=\"builder-label\">{{ label || 'Input Overrides' }}</span>\n <button type=\"button\" class=\"mode-toggle\" (click)=\"toggleMode()\">\n {{ advancedMode ? 'Simple' : 'Advanced' }}\n </button>\n </div>\n\n <!-- Simple mode: table -->\n <div *ngIf=\"!advancedMode\" class=\"builder-table\">\n <div *ngIf=\"rows.length > 0\" class=\"table-header\">\n <span class=\"col-scope\">Scope</span>\n <span class=\"col-path\">Input Path</span>\n <span class=\"col-field\">Form Field</span>\n <span class=\"col-action\"></span>\n </div>\n <div *ngFor=\"let row of rows; let i = index\" class=\"table-row\">\n <select class=\"col-scope\" [(ngModel)]=\"row.scope\" (ngModelChange)=\"emitChange()\">\n <option value=\"doc\">doc</option>\n <option value=\"pv\">pv</option>\n </select>\n <input\n class=\"col-path\"\n type=\"text\"\n [(ngModel)]=\"row.inputPath\"\n (ngModelChange)=\"emitChange()\"\n placeholder=\"e.g. beslissing.tekst\"\n />\n <!-- Dropdown when form fields are available, text input as fallback -->\n <select\n *ngIf=\"availableFields.length > 0\"\n class=\"col-field\"\n [(ngModel)]=\"row.formFieldKey\"\n (ngModelChange)=\"emitChange()\"\n >\n <option value=\"\">-- Select field --</option>\n <option *ngFor=\"let field of availableFields\" [value]=\"field.key\">\n {{ field.label }}\n </option>\n </select>\n <input\n *ngIf=\"availableFields.length === 0\"\n class=\"col-field\"\n type=\"text\"\n [(ngModel)]=\"row.formFieldKey\"\n (ngModelChange)=\"emitChange()\"\n placeholder=\"form field key\"\n />\n <button type=\"button\" class=\"col-action remove-btn\" (click)=\"removeRow(i)\">\n <i class=\"mdi mdi-close\"></i>\n </button>\n </div>\n <button type=\"button\" class=\"add-btn\" (click)=\"addRow()\">\n <i class=\"mdi mdi-plus mr-1\"></i> Add override\n </button>\n </div>\n\n <!-- Advanced mode: JSON editor -->\n <div *ngIf=\"advancedMode\" class=\"builder-advanced\">\n <textarea\n class=\"json-editor\"\n [ngModel]=\"jsonText\"\n (ngModelChange)=\"onJsonChange($event)\"\n placeholder='{ \"pv\": { \"motivation\": \"form:pv:motivation\" } }'\n rows=\"6\"\n ></textarea>\n <div *ngIf=\"jsonError\" class=\"json-error\">{{ jsonError }}</div>\n </div>\n </div>\n `,\n styles: [\n `\n .override-builder {\n border: 1px solid #dee2e6;\n border-radius: 4px;\n padding: 0.75rem;\n background: #f8f9fa;\n }\n .builder-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 0.5rem;\n }\n .builder-label {\n font-weight: 600;\n font-size: 0.85rem;\n color: #495057;\n }\n .mode-toggle {\n background: none;\n border: 1px solid #6c757d;\n border-radius: 4px;\n color: #6c757d;\n padding: 0.15rem 0.5rem;\n font-size: 0.75rem;\n cursor: pointer;\n }\n .mode-toggle:hover {\n background: #e9ecef;\n }\n .table-header {\n display: flex;\n gap: 0.5rem;\n padding: 0.25rem 0;\n font-size: 0.75rem;\n color: #6c757d;\n font-weight: 600;\n }\n .table-row {\n display: flex;\n gap: 0.5rem;\n margin-bottom: 0.25rem;\n align-items: center;\n }\n .col-scope {\n width: 70px;\n flex-shrink: 0;\n }\n .col-path {\n flex: 1;\n min-width: 0;\n }\n .col-field {\n flex: 1;\n min-width: 0;\n }\n .col-action {\n width: 30px;\n flex-shrink: 0;\n }\n .table-row select,\n .table-row input {\n border: 1px solid #ced4da;\n border-radius: 4px;\n padding: 0.25rem 0.4rem;\n font-size: 0.8rem;\n background: white;\n }\n .remove-btn {\n background: none;\n border: none;\n color: #dc3545;\n cursor: pointer;\n padding: 0.25rem;\n font-size: 0.9rem;\n }\n .remove-btn:hover {\n color: #a71d2a;\n }\n .add-btn {\n background: none;\n border: 1px dashed #6c757d;\n border-radius: 4px;\n color: #6c757d;\n padding: 0.25rem 0.75rem;\n font-size: 0.8rem;\n cursor: pointer;\n margin-top: 0.25rem;\n display: flex;\n align-items: center;\n }\n .add-btn:hover {\n background: #e9ecef;\n border-color: #495057;\n }\n .json-editor {\n width: 100%;\n border: 1px solid #ced4da;\n border-radius: 4px;\n padding: 0.5rem;\n font-family: monospace;\n font-size: 0.8rem;\n resize: vertical;\n background: white;\n }\n .json-error {\n color: #dc3545;\n font-size: 0.75rem;\n margin-top: 0.25rem;\n }\n `,\n ],\n})\nexport class EpistolaOverrideBuilderComponent implements FormioCustomComponent<OverrideMapping | null> {\n @Input() value!: OverrideMapping | null;\n @Output() valueChange = new EventEmitter<OverrideMapping | null>();\n\n @Input() disabled = false;\n @Input() label = 'Input Overrides';\n @Input() availableFields: FormFieldOption[] = [];\n\n rows: OverrideRow[] = [];\n advancedMode = false;\n jsonText = '';\n jsonError: string | null = null;\n\n private initialized = false;\n\n constructor(private readonly cdr: ChangeDetectorRef) {}\n\n ngOnChanges(): void {\n if (!this.initialized && this.value) {\n this.initialized = true;\n this.rows = this.mappingToRows(this.value);\n this.jsonText = JSON.stringify(this.value, null, 2);\n }\n this.cdr.markForCheck();\n }\n\n toggleMode(): void {\n this.advancedMode = !this.advancedMode;\n if (this.advancedMode) {\n const mapping = this.rowsToMapping();\n this.jsonText = Object.keys(mapping).length > 0 ? JSON.stringify(mapping, null, 2) : '';\n this.jsonError = null;\n } else {\n try {\n const parsed = this.jsonText.trim() ? JSON.parse(this.jsonText) : {};\n this.rows = this.mappingToRows(parsed);\n this.jsonError = null;\n } catch {\n // Keep current rows if JSON is invalid\n }\n }\n }\n\n addRow(): void {\n this.rows.push({ scope: 'doc', inputPath: '', formFieldKey: '' });\n }\n\n removeRow(index: number): void {\n this.rows.splice(index, 1);\n this.emitChange();\n }\n\n emitChange(): void {\n const mapping = this.rowsToMapping();\n this.value = Object.keys(mapping).length > 0 ? mapping : null;\n this.valueChange.emit(this.value);\n }\n\n onJsonChange(text: string): void {\n this.jsonText = text;\n if (!text.trim()) {\n this.jsonError = null;\n this.value = null;\n this.valueChange.emit(null);\n return;\n }\n try {\n const parsed = JSON.parse(text);\n this.jsonError = null;\n this.value = parsed;\n this.valueChange.emit(parsed);\n } catch (e) {\n this.jsonError = 'Invalid JSON';\n }\n }\n\n private rowsToMapping(): OverrideMapping {\n const mapping: OverrideMapping = {};\n for (const row of this.rows) {\n if (row.inputPath && row.formFieldKey) {\n if (!mapping[row.scope]) {\n mapping[row.scope] = {};\n }\n mapping[row.scope][row.inputPath] = FORM_REF_PREFIX + row.formFieldKey;\n }\n }\n return mapping;\n }\n\n private mappingToRows(mapping: OverrideMapping): OverrideRow[] {\n const rows: OverrideRow[] = [];\n for (const [scope, fields] of Object.entries(mapping)) {\n if (scope === 'doc' || scope === 'pv') {\n for (const [path, ref] of Object.entries(fields)) {\n const formFieldKey = String(ref).startsWith(FORM_REF_PREFIX)\n ? String(ref).substring(FORM_REF_PREFIX.length)\n : String(ref);\n rows.push({ scope, inputPath: path, formFieldKey });\n }\n }\n }\n return rows;\n }\n}\n","import { Injector } from '@angular/core';\nimport { FormioCustomComponentInfo, registerCustomFormioComponent } from '@valtimo/components';\nimport { EpistolaOverrideBuilderComponent } from './override-builder.component';\nimport { hideFormioComponentFromBuilder } from '../formio-builder-utils';\n\nexport const EPISTOLA_OVERRIDE_BUILDER_OPTIONS: FormioCustomComponentInfo = {\n type: 'epistola-override-builder',\n selector: 'epistola-override-builder-element',\n title: 'Epistola Override Builder',\n group: 'basic',\n icon: 'list',\n emptyValue: null,\n fieldOptions: ['label', 'availableFields'],\n};\n\n/**\n * Recursively collect input field keys and labels from a Formio component tree.\n * Skips epistola custom components (which are builder UI, not form fields).\n */\nfunction collectFormFields(components: any[]): { key: string; label: string }[] {\n const fields: { key: string; label: string }[] = [];\n for (const comp of components) {\n if (comp.input && comp.key && comp.type !== 'button' && !comp.type?.startsWith('epistola-')) {\n fields.push({ key: comp.key, label: comp.label || comp.key });\n }\n if (comp.components) {\n fields.push(...collectFormFields(comp.components));\n }\n if (comp.columns) {\n for (const col of comp.columns) {\n if (col.components) {\n fields.push(...collectFormFields(col.components));\n }\n }\n }\n }\n return fields;\n}\n\nexport function registerEpistolaOverrideBuilderComponent(injector: Injector): void {\n if (customElements.get(EPISTOLA_OVERRIDE_BUILDER_OPTIONS.selector)) {\n return;\n }\n\n // Register the base component (Angular element + Formio component class)\n registerCustomFormioComponent(\n EPISTOLA_OVERRIDE_BUILDER_OPTIONS,\n EpistolaOverrideBuilderComponent,\n injector,\n );\n\n // Get the Formio Components registry and the registered base class\n const Formio = (window as any).Formio;\n if (!Formio?.Components) return;\n\n const BaseComponent = Formio.Components.components[EPISTOLA_OVERRIDE_BUILDER_OPTIONS.type];\n if (!BaseComponent) return;\n\n // Extend the base class to pass available form fields to the Angular component\n class OverrideBuilderWithFields extends BaseComponent {\n attach(element: HTMLElement) {\n // Set form fields on the component BEFORE super.attach() reads fieldOptions\n this.component.availableFields = this._extractFormFields();\n return super.attach(element);\n }\n\n private _extractFormFields(): { key: string; label: string }[] {\n // The Formio builder passes the main form schema as options.editForm\n // when opening the edit dialog (editFormOptions.editForm = this.form).\n const components = this.options?.editForm?.components;\n if (Array.isArray(components)) {\n return collectFormFields(components);\n }\n return [];\n }\n }\n\n // Re-register with the extended class\n Formio.Components.setComponent(EPISTOLA_OVERRIDE_BUILDER_OPTIONS.type, OverrideBuilderWithFields);\n\n // Internal editForm widget — not a standalone form field. Hide it from the builder palette.\n hideFormioComponentFromBuilder(EPISTOLA_OVERRIDE_BUILDER_OPTIONS.type);\n}\n","import { PluginUsageEntry } from '../../models';\n\n/**\n * The plugin action definition key the backend serializes for generate-document\n * process links. It carries the `epistola-` prefix — see `EPISTOLA_ACTION_KEYS`\n * in `EpistolaAdminService` on the backend. The selector must match this exact\n * value; the un-prefixed `generate-document` never appears in the API response.\n */\nexport const GENERATE_DOCUMENT_ACTION_KEY = 'epistola-generate-document';\n\n/** Keeps only the generate-document process links from a usage overview. */\nexport function filterGenerateDocumentEntries(entries: PluginUsageEntry[]): PluginUsageEntry[] {\n return entries.filter((e) => e.actionKey === GENERATE_DOCUMENT_ACTION_KEY);\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { FormioCustomComponent } from '@valtimo/components';\nimport { EpistolaAdminService } from '../../services';\nimport { PluginUsageEntry } from '../../models';\nimport { Subscription } from 'rxjs';\nimport { filterGenerateDocumentEntries } from './process-link-selector.util';\n\nexport interface ProcessLinkSelection {\n processDefinitionKey: string;\n sourceActivityId: string;\n}\n\n@Component({\n standalone: true,\n imports: [CommonModule, FormsModule],\n selector: 'epistola-process-link-selector-component',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"process-link-selector\">\n <label class=\"selector-label\">{{ label || 'Process Link' }}</label>\n <select\n class=\"selector-dropdown\"\n [ngModel]=\"selectedKey\"\n (ngModelChange)=\"onSelect($event)\"\n [disabled]=\"disabled || loading\"\n >\n <option value=\"\">{{ loading ? 'Loading...' : '-- Select a process link --' }}</option>\n <option *ngFor=\"let entry of filteredEntries\" [value]=\"entryKey(entry)\">\n {{ entry.processDefinitionName }} / {{ entry.activityName }} ({{ entry.activityId }})\n </option>\n </select>\n <div *ngIf=\"error\" class=\"selector-error\">{{ error }}</div>\n </div>\n `,\n styles: [\n `\n .process-link-selector {\n margin-bottom: 0.5rem;\n }\n .selector-label {\n display: block;\n font-weight: 600;\n font-size: 0.85rem;\n color: #495057;\n margin-bottom: 0.25rem;\n }\n .selector-dropdown {\n width: 100%;\n border: 1px solid #ced4da;\n border-radius: 4px;\n padding: 0.4rem 0.5rem;\n font-size: 0.85rem;\n background: white;\n }\n .selector-error {\n color: #dc3545;\n font-size: 0.75rem;\n margin-top: 0.25rem;\n }\n `,\n ],\n})\nexport class EpistolaProcessLinkSelectorComponent\n implements FormioCustomComponent<ProcessLinkSelection | null>, OnChanges, OnDestroy\n{\n @Input() value!: ProcessLinkSelection | null;\n @Output() valueChange = new EventEmitter<ProcessLinkSelection | null>();\n\n @Input() disabled = false;\n @Input() label = 'Process Link';\n\n filteredEntries: PluginUsageEntry[] = [];\n selectedKey = '';\n loading = false;\n error: string | null = null;\n\n private initialized = false;\n private loadSubscription?: Subscription;\n\n constructor(\n private readonly adminService: EpistolaAdminService,\n private readonly cdr: ChangeDetectorRef,\n ) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!this.initialized) {\n this.initialized = true;\n this.loadEntries();\n }\n // Restore selection whenever value changes (Formio may set it after init)\n if (changes['value'] && this.value) {\n this.selectedKey = `${this.value.processDefinitionKey}::${this.value.sourceActivityId}`;\n this.cdr.markForCheck();\n }\n }\n\n ngOnDestroy(): void {\n this.loadSubscription?.unsubscribe();\n }\n\n onSelect(key: string): void {\n this.selectedKey = key;\n if (!key) {\n this.value = null;\n this.valueChange.emit(null);\n return;\n }\n const [processDefinitionKey, sourceActivityId] = key.split('::');\n this.value = { processDefinitionKey, sourceActivityId };\n this.valueChange.emit(this.value);\n }\n\n entryKey(entry: PluginUsageEntry): string {\n return `${entry.processDefinitionKey}::${entry.activityId}`;\n }\n\n private loadEntries(): void {\n this.loading = true;\n this.cdr.markForCheck();\n\n this.loadSubscription = this.adminService.getPluginUsage().subscribe({\n next: (entries) => {\n this.filteredEntries = filterGenerateDocumentEntries(entries);\n this.loading = false;\n\n // Restore selection from value\n if (this.value) {\n this.selectedKey = `${this.value.processDefinitionKey}::${this.value.sourceActivityId}`;\n }\n this.cdr.markForCheck();\n },\n error: (err) => {\n this.error = 'Failed to load process links';\n this.loading = false;\n this.cdr.markForCheck();\n },\n });\n }\n}\n","import { Injector } from '@angular/core';\nimport { FormioCustomComponentInfo, registerCustomFormioComponent } from '@valtimo/components';\nimport { EpistolaProcessLinkSelectorComponent } from './process-link-selector.component';\nimport { hideFormioComponentFromBuilder } from '../formio-builder-utils';\n\nexport const EPISTOLA_PROCESS_LINK_SELECTOR_OPTIONS: FormioCustomComponentInfo = {\n type: 'epistola-process-link-selector',\n selector: 'epistola-process-link-selector-element',\n title: 'Epistola Process Link Selector',\n group: 'basic',\n icon: 'link',\n emptyValue: null,\n fieldOptions: ['label'],\n};\n\nexport function registerEpistolaProcessLinkSelectorComponent(injector: Injector): void {\n if (!customElements.get(EPISTOLA_PROCESS_LINK_SELECTOR_OPTIONS.selector)) {\n registerCustomFormioComponent(\n EPISTOLA_PROCESS_LINK_SELECTOR_OPTIONS,\n EpistolaProcessLinkSelectorComponent,\n injector,\n );\n // Internal editForm widget — not a standalone form field. Hide it from the builder palette.\n hideFormioComponentFromBuilder(EPISTOLA_PROCESS_LINK_SELECTOR_OPTIONS.type);\n }\n}\n","import {\n ENVIRONMENT_INITIALIZER,\n inject,\n Injector,\n ModuleWithProviders,\n NgModule,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HttpClientModule } from '@angular/common/http';\nimport { PluginTranslatePipeModule } from '@valtimo/plugin';\nimport { FormModule, InputModule, SelectModule } from '@valtimo/components';\nimport { EpistolaConfigurationComponent } from './components/epistola-configuration/epistola-configuration.component';\nimport { GenerateDocumentConfigurationComponent } from './components/generate-document-configuration/generate-document-configuration.component';\nimport { CheckJobStatusConfigurationComponent } from './components/check-job-status-configuration/check-job-status-configuration.component';\nimport { DownloadDocumentConfigurationComponent } from './components/download-document-configuration/download-document-configuration.component';\nimport { EpistolaDocumentComponent } from './components/epistola-document/epistola-document.component';\nimport { EpistolaRetryFormComponent } from './components/epistola-retry-form/epistola-retry-form.component';\nimport { EpistolaDocumentPreviewComponent } from './components/epistola-document-preview/epistola-document-preview.component';\nimport { EpistolaAdminPageComponent } from './components/epistola-admin-page/epistola-admin-page.component';\nimport { EpistolaPluginService, EpistolaAdminService, EpistolaMenuService } from './services';\nimport { EpistolaAdminRoutingModule } from './epistola-admin-routing.module';\nimport { isEpistolaEnabled } from './epistola-runtime-config';\nimport { registerEpistolaDocumentComponent } from './components/epistola-document/epistola-document.formio';\nimport { registerEpistolaRetryFormComponent } from './components/epistola-retry-form/epistola-retry-form.formio';\nimport { registerEpistolaDocumentPreviewComponent } from './components/epistola-document-preview/epistola-document-preview.formio';\nimport { registerEpistolaOverrideBuilderComponent } from './components/override-builder/override-builder.formio';\nimport { registerEpistolaProcessLinkSelectorComponent } from './components/process-link-selector/process-link-selector.formio';\n\n@NgModule({\n imports: [\n CommonModule,\n HttpClientModule,\n PluginTranslatePipeModule,\n FormModule,\n InputModule,\n SelectModule,\n EpistolaAdminRoutingModule,\n EpistolaConfigurationComponent,\n GenerateDocumentConfigurationComponent,\n CheckJobStatusConfigurationComponent,\n DownloadDocumentConfigurationComponent,\n EpistolaDocumentComponent,\n EpistolaRetryFormComponent,\n EpistolaDocumentPreviewComponent,\n EpistolaAdminPageComponent,\n ],\n exports: [\n EpistolaConfigurationComponent,\n GenerateDocumentConfigurationComponent,\n CheckJobStatusConfigurationComponent,\n DownloadDocumentConfigurationComponent,\n EpistolaDocumentComponent,\n EpistolaRetryFormComponent,\n EpistolaDocumentPreviewComponent,\n EpistolaAdminPageComponent,\n ],\n providers: [\n EpistolaPluginService,\n EpistolaAdminService,\n EpistolaMenuService,\n {\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useValue: () => {\n if (!isEpistolaEnabled()) return;\n const injector = inject(Injector);\n registerEpistolaDocumentComponent(injector);\n registerEpistolaRetryFormComponent(injector);\n registerEpistolaOverrideBuilderComponent(injector);\n registerEpistolaProcessLinkSelectorComponent(injector);\n registerEpistolaDocumentPreviewComponent(injector);\n // Eagerly create EpistolaMenuService to trigger menu registration\n inject(EpistolaMenuService);\n },\n },\n ],\n})\nexport class EpistolaPluginModule {\n // Kept for back-compat with hosts that follow the README's `forRoot()`\n // setup. The providers above are now module-level so `imports: [EpistolaPluginModule]`\n // (what the Valtimo Configurator emits) wires everything on its own.\n static forRoot(): ModuleWithProviders<EpistolaPluginModule> {\n return { ngModule: EpistolaPluginModule };\n }\n}\n","export const EPISTOLA_PLUGIN_LOGO_BASE64 =\n 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjAgMTIwIiB3aWR0aD0iMTIwIiBoZWlnaHQ9IjEyMCI+CiAgPCEtLSBTdGFjayBiYXNlIC0tPgogIDxyZWN0IHg9IjM2IiB5PSIxNiIgd2lkdGg9IjU0IiBoZWlnaHQ9IjcwIiByeD0iMyIgZmlsbD0iI2U2YzJiMCIgc3Ryb2tlPSIjNGYyZjJiIiBzdHJva2Utd2lkdGg9IjIiIHRyYW5zZm9ybT0icm90YXRlKDUgNjMgNTEpIi8+CiAgPHJlY3QgeD0iMzIiIHk9IjIyIiB3aWR0aD0iNTQiIGhlaWdodD0iNzAiIHJ4PSIzIiBmaWxsPSIjZjBkOGM4IiBzdHJva2U9IiM0ZjJmMmIiIHN0cm9rZS13aWR0aD0iMiIvPgogIDxyZWN0IHg9IjI4IiB5PSIyOCIgd2lkdGg9IjU0IiBoZWlnaHQ9IjcwIiByeD0iMyIgZmlsbD0iI2Y1ZWJlMyIgc3Ryb2tlPSIjNGYyZjJiIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogIDxsaW5lIHgxPSIzOCIgeTE9IjQ0IiB4Mj0iNzIiIHkyPSI0NCIgc3Ryb2tlPSIjYzRhODgyIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgogIDxsaW5lIHgxPSIzOCIgeTE9IjU0IiB4Mj0iNzIiIHkyPSI1NCIgc3Ryb2tlPSIjYzRhODgyIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgogIDxsaW5lIHgxPSIzOCIgeTE9IjY0IiB4Mj0iNTgiIHkyPSI2NCIgc3Ryb2tlPSIjYzRhODgyIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgogIDwhLS0gV2F4IHNlYWwgd2l0aCBjaGVja21hcmsgLS0+CiAgPGNpcmNsZSBjeD0iNTUiIGN5PSI4NCIgcj0iMTUiIGZpbGw9IiNiODVjM2MiIHN0cm9rZT0iIzRmMmYyYiIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPGNpcmNsZSBjeD0iNTUiIGN5PSI4NCIgcj0iMTAuNSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZDQ4MzZhIiBzdHJva2Utd2lkdGg9IjEiLz4KICA8cG9seWxpbmUgcG9pbnRzPSI0OSw4NCA1Myw4OSA2Miw3OCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNGYyZjJiIiBzdHJva2Utd2lkdGg9IjIuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+Cjwvc3ZnPgo=';\n","import { PluginSpecification } from '@valtimo/plugin';\nimport { EpistolaConfigurationComponent } from './components/epistola-configuration/epistola-configuration.component';\nimport { GenerateDocumentConfigurationComponent } from './components/generate-document-configuration/generate-document-configuration.component';\nimport { CheckJobStatusConfigurationComponent } from './components/check-job-status-configuration/check-job-status-configuration.component';\nimport { DownloadDocumentConfigurationComponent } from './components/download-document-configuration/download-document-configuration.component';\nimport { EPISTOLA_PLUGIN_LOGO_BASE64 } from './assets';\nimport { isEpistolaEnabled } from './epistola-runtime-config';\n\nconst EPISTOLA_PLUGIN_ID = 'epistola';\nconst DISABLED_EPISTOLA_PLUGIN_ID = '__epistola_disabled__';\n\nconst epistolaPluginSpecification: PluginSpecification = {\n get pluginId(): string {\n return isEpistolaEnabled() ? EPISTOLA_PLUGIN_ID : DISABLED_EPISTOLA_PLUGIN_ID;\n },\n\n // Component for plugin-level configuration (tenantId)\n pluginConfigurationComponent: EpistolaConfigurationComponent,\n\n // Plugin logo\n pluginLogoBase64: EPISTOLA_PLUGIN_LOGO_BASE64,\n\n // Map action keys to their configuration components\n functionConfigurationComponents: {\n 'epistola-generate-document': GenerateDocumentConfigurationComponent,\n 'epistola-check-job-status': CheckJobStatusConfigurationComponent,\n 'epistola-download-document': DownloadDocumentConfigurationComponent,\n },\n\n // Translations\n pluginTranslations: {\n nl: {\n title: 'Epistola Document Suite',\n description: 'Documentgeneratie met Epistola',\n configurationTitle: 'Configuratienaam',\n baseUrl: 'Base URL',\n baseUrlTooltip: 'De basis URL van de Epistola API (bijv. https://api.epistola.app)',\n apiKey: 'API Key',\n apiKeyTooltip: 'De API sleutel voor authenticatie met Epistola',\n tenantId: 'Tenant ID',\n tenantIdTooltip:\n 'De tenant slug in Epistola (3-63 tekens, alleen kleine letters, cijfers en koppeltekens, bijv. \"mijn-tenant\")',\n defaultEnvironmentId: 'Standaard Omgeving',\n defaultEnvironmentIdTooltip:\n 'De standaard omgeving voor documentgeneratie (3-30 tekens, alleen kleine letters, cijfers en koppeltekens, bijv. \"productie\")',\n templateSyncEnabled: 'Template synchronisatie',\n templateSyncEnabledTooltip:\n 'Synchroniseer template definities automatisch van het classpath naar Epistola bij het opstarten',\n 'epistola-generate-document': 'Genereer Document',\n catalogId: 'Catalogus',\n catalogIdTooltip: 'Selecteer de catalogus waaruit een template gekozen wordt',\n templateId: 'Template',\n templateIdTooltip: 'Selecteer het template dat gebruikt wordt voor documentgeneratie',\n variantId: 'Variant',\n variantIdTooltip: 'Selecteer de template variant',\n variantSelectionMode: 'Variant selectie',\n variantSelectionModeTooltip: 'Kies hoe de variant geselecteerd wordt',\n selectByVariant: 'Selecteer variant',\n selectByAttributes: 'Selecteer op kenmerken',\n variantAttributes: 'Variant kenmerken',\n variantAttributesTooltip:\n 'Kenmerken voor automatische variant selectie. Waarden kunnen expressies zijn (doc:, pv:, case:).',\n attributeKey: 'Kenmerk',\n attributeKeyCustom: 'Aangepast...',\n attributeValue: 'Waarde',\n addAttribute: 'Kenmerk toevoegen',\n removeAttribute: 'Kenmerk verwijderen',\n attributeRequired: 'Verplicht',\n attributePreferred: 'Voorkeur',\n environmentId: 'Omgeving',\n environmentIdTooltip: 'Selecteer de doelomgeving (optioneel)',\n correlationId: 'Correlatie ID',\n correlationIdTooltip: 'Een optioneel correlatie ID voor het traceren van dit verzoek',\n dataMapping: 'Data Mapping',\n dataMappingTooltip: 'Koppeling van template velden naar data bronnen (doc:, pv:, case:)',\n outputFormat: 'Uitvoerformaat',\n outputFormatTooltip: 'Het gewenste formaat van het gegenereerde document',\n filename: 'Bestandsnaam',\n filenameTooltip: 'De bestandsnaam voor het gegenereerde document',\n resultProcessVariable: 'Resultaat Procesvariabele',\n resultProcessVariableTooltip:\n 'De naam van de procesvariabele waarin het request ID wordt opgeslagen',\n pdf: 'PDF',\n html: 'HTML',\n // Data mapping builder translations\n dataMappingTitle: 'Data Mapping',\n dataMappingDescription: 'Koppel template velden aan Valtimo data bronnen',\n jsonataDescription:\n 'JSONata expressie die de template data genereert. Gebruik $doc, $pv en $case voor toegang tot document-, procesvariabelen- en zaakdata.',\n mappingModeSimple: 'Eenvoudig',\n mappingModeAdvanced: 'Geavanceerd',\n mappingTools: 'Schema & Voorbeeld',\n expectedStructure: 'Verwacht schema',\n expectedStructureLoading: 'Schema laden...',\n previewTitle: 'Voorbeeld',\n previewDocPlaceholder: 'Document ID',\n previewExpected: 'Verwacht',\n previewProduced: 'Geproduceerd',\n previewRunHint: 'Voer een document ID in en klik ▶ om een voorbeeld te zien',\n previewMissing: 'Ontbrekende verplichte velden',\n templateField: 'Template veld',\n dataSource: 'Data bron',\n addMapping: 'Mapping toevoegen',\n noMappings: 'Nog geen mappings toegevoegd. Klik op \"Mapping toevoegen\" om te beginnen.',\n documentFields: 'Document velden',\n processVariables: 'Procesvariabelen',\n caseProperties: 'Zaak eigenschappen',\n sourceType: 'Brontype',\n sourceTypeDocument: 'Document veld',\n sourceTypeProcessVariable: 'Procesvariabele',\n sourceTypeManual: 'Handmatig',\n requiredFieldsMissing: 'Niet alle verplichte velden zijn gekoppeld',\n requiredFieldsComplete: 'Alle verplichte velden zijn gekoppeld',\n validationSummary: 'verplichte velden gekoppeld',\n jsonataValidationErrorsHeading: 'Ongeldige JSONata-expressies:',\n fieldRequired: 'Verplicht',\n fieldOptional: 'Optioneel',\n mapCollectionTo: 'Koppel collectie aan',\n browseMode: 'Bladermodus',\n pvMode: 'Procesvariabele modus',\n pvPlaceholder: 'Naam procesvariabele',\n expressionMode: 'Expressiemodus',\n availableFunctions: 'Beschikbare functies',\n itemFieldMapping: 'Veldnamen per item koppelen',\n itemFieldMappingTitle: 'Veldkoppeling per item:',\n sourceFieldPlaceholder: 'Bronveldnaam',\n noTemplateFields: 'Geen template velden beschikbaar',\n // Check job status action\n 'epistola-check-job-status': 'Controleer Taakstatus',\n requestIdVariable: 'Request ID Variabele',\n requestIdVariableTooltip: 'Naam van de procesvariabele met het Epistola request ID',\n statusVariable: 'Status Variabele',\n statusVariableTooltip: 'Naam van de procesvariabele waarin de status wordt opgeslagen',\n documentIdVariable: 'Document ID Variabele',\n documentIdVariableTooltip:\n 'Naam van de procesvariabele waarin het document ID wordt opgeslagen (bij voltooiing)',\n errorMessageVariable: 'Foutmelding Variabele',\n errorMessageVariableTooltip:\n 'Naam van de procesvariabele waarin de foutmelding wordt opgeslagen (bij fout)',\n // Download document action\n 'epistola-download-document': 'Download Document',\n documentVariable: 'Document Variabele',\n documentVariableTooltip:\n 'Naam van de procesvariabele met het Epistola resultaat. Mag een String document ID zijn (legacy) of een rich-result object met een documentId-veld; de actie haalt het document ID eruit.',\n storageTarget: 'Opslagdoel',\n storageTargetTooltip:\n 'Waar het gedownloade PDF wordt opgeslagen. \"Tijdelijke resource-opslag\" (aanbevolen) zet alleen een resource-id in de variabele — geschikt om door te geven aan documenten-api:store-temp-document. \"Procesvariabele\" zet de ruwe bytes inline in de variabele (alleen voor kleine, niet-gevoelige documenten; deze worden in de taakrespons meegestuurd).',\n resourceIdVariable: 'Resource-ID Variabele',\n resourceIdVariableTooltip:\n 'Naam van de procesvariabele waarin het tijdelijke resource-id wordt opgeslagen (geef deze door aan documenten-api:store-temp-document).',\n contentVariable: 'Inhoud Variabele',\n contentVariableTooltip:\n 'Naam van de procesvariabele waarin de ruwe PDF-bytes inline worden opgeslagen (alleen voor kleine, niet-gevoelige documenten).',\n // Admin page\n epistolaAdminOverview: 'Overzicht',\n epistolaAdminRefresh: 'Vernieuwen',\n epistolaAdminLoading: 'Laden...',\n epistolaAdminNoConfigurations: 'Geen Epistola plugin configuraties gevonden.',\n epistolaAdminTenantId: 'Tenant ID',\n epistolaAdminStatus: 'Status',\n epistolaAdminConnected: 'Verbonden',\n epistolaAdminUnreachable: 'Onbereikbaar',\n epistolaAdminError: 'Fout',\n epistolaAdminPluginActions: 'Plugin acties',\n epistolaAdminProblems: 'Problemen',\n epistolaAdminBackToOverview: 'Terug naar overzicht',\n epistolaAdminNoUsageForConfig: 'Geen procesacties geconfigureerd voor deze verbinding.',\n epistolaAdminCase: 'Zaak',\n epistolaAdminProcess: 'Proces',\n epistolaAdminActivity: 'Activiteit',\n epistolaAdminAction: 'Actie',\n epistolaAdminServerVersion: 'Server versie',\n epistolaAdminExport: 'Exporteren',\n epistolaAdminPendingJobs: 'Wachtende taken',\n epistolaAdminNoPendingJobs: 'Geen wachtende taken voor deze verbinding.',\n epistolaAdminConfiguration: 'Configuratie',\n epistolaAdminRequestId: 'Request ID',\n epistolaAdminReconcile: 'Hersynchroniseer',\n epistolaAdminReconciling: 'Bezig...',\n epistolaAdminReconcileTooltip:\n 'Vraag de huidige status op bij Epistola en hervat het wachtende proces als het klaar is.',\n epistolaAdminConfigurations: 'Configuraties',\n epistolaAdminValidations: 'BPMN-validatie',\n epistolaAdminNoValidations:\n 'Geen race-onveilige procesdefinities gevonden. Alles ziet er goed uit.',\n epistolaAdminValidationWarningTitle: 'BPMN configuratie waarschuwing',\n epistolaAdminValidationWarningBody:\n 'In deze procesdefinities is de grens tussen de generate-document service task en de EpistolaDocumentGenerated catch event niet synchroon. Resultaten kunnen verloren gaan; gebruik in dat geval de Hersynchroniseer-knop in de Wachtende taken-tab.',\n epistolaAdminValidationCode: 'Code',\n epistolaAdminValidationMessage: 'Bericht',\n epistolaAdminValidationLastChecked: 'Laatst gecontroleerd',\n epistolaAdminValidationNotYetRun: 'nog niet uitgevoerd',\n epistolaAdminValidationAutoRefresh: 'automatisch opnieuw gecontroleerd, ongeveer elke',\n epistolaAdminValidationLatestVersionNote:\n 'Alleen de meest recente versie van elke procesdefinitie wordt gecontroleerd; oudere versies met nog lopende instanties kunnen problemen hebben die hier niet worden getoond.',\n epistolaAdminCatalogs: 'Catalogi',\n epistolaAdminCatalogsIntro:\n 'Catalogi op het classpath van de applicatie. Deze worden bij het opstarten automatisch uitgerold; gebruik Opnieuw uitrollen om een catalogus handmatig (geforceerd) naar deze Epistola-omgeving te sturen, bijvoorbeeld als de automatische uitrol is mislukt.',\n epistolaAdminNoCatalogs: 'Geen catalogi gevonden op het classpath.',\n epistolaAdminCatalogSlug: 'Slug',\n epistolaAdminCatalogVersion: 'Versie',\n epistolaAdminCatalogStatus: 'Status in Epistola',\n epistolaAdminCatalogInEpistola: 'Aanwezig in Epistola',\n epistolaAdminCatalogNotInEpistola: 'Niet in Epistola',\n epistolaAdminCatalogStatusUnknown: 'Onbekend (Epistola niet bereikbaar)',\n epistolaAdminRedeploy: 'Opnieuw uitrollen',\n epistolaAdminRedeploying: 'Bezig...',\n epistolaAdminRedeployTooltip:\n 'Bouw deze catalogus opnieuw vanaf het classpath en stuur hem geforceerd naar Epistola, ongeacht de versie of de templateSyncEnabled-instelling.',\n epistolaAdminChangelog: 'Changelog',\n epistolaAdminRunningVersion: 'Actieve plugin-versie:',\n epistolaAdminNoChangelog: 'Geen changelog beschikbaar in deze build.',\n // TEMPORARY (remove in 1.0.0): task-id carrier repair (admin \"Forms\" tab)\n epistolaAdminForms: 'Formulieren',\n epistolaAdminFormsIntro:\n 'Formulieren met een Epistola-component dat het verborgen task-id veld mist. Zonder dat veld werkt het voorbeeld/downloaden/opnieuw genereren niet in elke taak-openflow. Herstel voegt het veld toe.',\n epistolaAdminFormName: 'Formulier',\n epistolaAdminFormMissing: 'Ontbrekende componenten',\n epistolaAdminFormReadOnly: 'Alleen-lezen',\n epistolaAdminFormReadOnlyHint:\n 'Dit formulier komt van het classpath en wordt bij de volgende herstart teruggezet naar de bron. Voeg het veld toe aan de bron (component opnieuw plaatsen) voor een blijvende oplossing.',\n epistolaAdminRepair: 'Herstellen',\n epistolaAdminRepairAll: 'Alles herstellen',\n epistolaAdminRepairing: 'Bezig...',\n epistolaAdminRepairTooltip:\n 'Voeg het verborgen task-id veld toe aan alle Epistola-componenten in dit formulier.',\n epistolaAdminNoFormIssues: 'Geen formulieren met een ontbrekend task-id veld gevonden.',\n },\n en: {\n title: 'Epistola Document Suite',\n description: 'Document generation using Epistola',\n configurationTitle: 'Configuration name',\n baseUrl: 'Base URL',\n baseUrlTooltip: 'The base URL of the Epistola API (e.g. https://api.epistola.app)',\n apiKey: 'API Key',\n apiKeyTooltip: 'The API key for authentication with Epistola',\n tenantId: 'Tenant ID',\n tenantIdTooltip:\n 'The tenant slug in Epistola (3-63 chars, lowercase letters, digits and hyphens only, e.g. \"my-tenant\")',\n defaultEnvironmentId: 'Default Environment',\n defaultEnvironmentIdTooltip:\n 'The default environment for document generation (3-30 chars, lowercase letters, digits and hyphens only, e.g. \"production\")',\n templateSyncEnabled: 'Template sync',\n templateSyncEnabledTooltip:\n 'Automatically synchronize template definitions from classpath to Epistola on startup',\n 'epistola-generate-document': 'Generate Document',\n catalogId: 'Catalog',\n catalogIdTooltip: 'Select the catalog to choose a template from',\n templateId: 'Template',\n templateIdTooltip: 'Select the template to use for document generation',\n variantId: 'Variant',\n variantIdTooltip: 'Select the template variant',\n variantSelectionMode: 'Variant selection',\n variantSelectionModeTooltip: 'Choose how the variant is selected',\n selectByVariant: 'Select variant',\n selectByAttributes: 'Select by attributes',\n variantAttributes: 'Variant attributes',\n variantAttributesTooltip:\n 'Attributes for automatic variant selection. Values can be expressions (doc:, pv:, case:).',\n attributeKey: 'Attribute',\n attributeKeyCustom: 'Custom...',\n attributeValue: 'Value',\n addAttribute: 'Add attribute',\n removeAttribute: 'Remove attribute',\n attributeRequired: 'Required',\n attributePreferred: 'Preferred',\n environmentId: 'Environment',\n environmentIdTooltip: 'Select the target environment (optional)',\n correlationId: 'Correlation ID',\n correlationIdTooltip: 'An optional correlation ID for tracking this request',\n dataMapping: 'Data Mapping',\n dataMappingTooltip: 'Mapping of template fields to data sources (doc:, pv:, case:)',\n outputFormat: 'Output Format',\n outputFormatTooltip: 'The desired format of the generated document',\n filename: 'Filename',\n filenameTooltip: 'The filename for the generated document',\n resultProcessVariable: 'Result Process Variable',\n resultProcessVariableTooltip: 'The name of the process variable to store the request ID in',\n pdf: 'PDF',\n html: 'HTML',\n // Data mapping builder translations\n dataMappingTitle: 'Data Mapping',\n dataMappingDescription: 'Map template fields to Valtimo data sources',\n mappingModeSimple: 'Simple',\n mappingModeAdvanced: 'Advanced',\n mappingTools: 'Schema & Preview',\n expectedStructure: 'Expected schema',\n expectedStructureLoading: 'Loading schema...',\n previewTitle: 'Preview',\n previewDocPlaceholder: 'Document ID',\n previewExpected: 'Expected',\n previewProduced: 'Produced',\n previewRunHint: 'Enter a document ID and click ▶ to preview the output',\n previewMissing: 'Missing required fields',\n jsonataDescription:\n 'JSONata expression that generates the template data. Use $doc, $pv and $case to access document, process variable and case data.',\n templateField: 'Template field',\n dataSource: 'Data source',\n addMapping: 'Add mapping',\n noMappings: 'No mappings added yet. Click \"Add mapping\" to start.',\n documentFields: 'Document fields',\n processVariables: 'Process variables',\n caseProperties: 'Case properties',\n sourceType: 'Source type',\n sourceTypeDocument: 'Document field',\n sourceTypeProcessVariable: 'Process variable',\n sourceTypeManual: 'Manual value',\n requiredFieldsMissing: 'Not all required fields are mapped',\n requiredFieldsComplete: 'All required fields are mapped',\n validationSummary: 'required fields mapped',\n jsonataValidationErrorsHeading: 'Invalid JSONata expressions:',\n fieldRequired: 'Required',\n fieldOptional: 'Optional',\n mapCollectionTo: 'Map collection to',\n browseMode: 'Browse mode',\n pvMode: 'Process variable mode',\n pvPlaceholder: 'Process variable name',\n expressionMode: 'Expression mode',\n availableFunctions: 'Available functions',\n itemFieldMapping: 'Map field names per item',\n itemFieldMappingTitle: 'Item field mapping:',\n sourceFieldPlaceholder: 'Source field name',\n noTemplateFields: 'No template fields available',\n // Check job status action\n 'epistola-check-job-status': 'Check Job Status',\n requestIdVariable: 'Request ID Variable',\n requestIdVariableTooltip: 'Name of the process variable containing the Epistola request ID',\n statusVariable: 'Status Variable',\n statusVariableTooltip: 'Name of the process variable to store the status in',\n documentIdVariable: 'Document ID Variable',\n documentIdVariableTooltip:\n 'Name of the process variable to store the document ID in (when completed)',\n errorMessageVariable: 'Error Message Variable',\n errorMessageVariableTooltip:\n 'Name of the process variable to store the error message in (when failed)',\n // Download document action\n 'epistola-download-document': 'Download Document',\n documentVariable: 'Document Variable',\n documentVariableTooltip:\n 'Name of the process variable holding the Epistola result. May be a String document id (legacy) or a rich result object with a `documentId` key — the action extracts the document id from it.',\n storageTarget: 'Storage Target',\n storageTargetTooltip:\n 'Where the downloaded PDF is stored. \"Temporary resource storage\" (recommended) writes only a resource id to the variable — ready to hand to documenten-api:store-temp-document. \"Process variable\" writes the raw bytes inline (small, non-sensitive documents only; they are included in the task response).',\n resourceIdVariable: 'Resource ID Variable',\n resourceIdVariableTooltip:\n 'Name of the process variable to store the temporary resource id in (hand this to documenten-api:store-temp-document).',\n contentVariable: 'Content Variable',\n contentVariableTooltip:\n 'Name of the process variable to store the raw PDF bytes inline in (small, non-sensitive documents only).',\n // Admin page\n epistolaAdminOverview: 'Overview',\n epistolaAdminRefresh: 'Refresh',\n epistolaAdminLoading: 'Loading...',\n epistolaAdminNoConfigurations: 'No Epistola plugin configurations found.',\n epistolaAdminTenantId: 'Tenant ID',\n epistolaAdminStatus: 'Status',\n epistolaAdminConnected: 'Connected',\n epistolaAdminUnreachable: 'Unreachable',\n epistolaAdminError: 'Error',\n epistolaAdminPluginActions: 'Plugin actions',\n epistolaAdminProblems: 'Problems',\n epistolaAdminBackToOverview: 'Back to overview',\n epistolaAdminNoUsageForConfig: 'No process actions configured for this connection.',\n epistolaAdminCase: 'Case',\n epistolaAdminProcess: 'Process',\n epistolaAdminActivity: 'Activity',\n epistolaAdminAction: 'Action',\n epistolaAdminServerVersion: 'Server version',\n epistolaAdminExport: 'Export',\n epistolaAdminPendingJobs: 'Pending jobs',\n epistolaAdminNoPendingJobs: 'No pending jobs for this connection.',\n epistolaAdminConfiguration: 'Configuration',\n epistolaAdminRequestId: 'Request ID',\n epistolaAdminReconcile: 'Reconcile',\n epistolaAdminReconciling: 'Reconciling...',\n epistolaAdminReconcileTooltip:\n \"Ask Epistola for this job's current status and resume the waiting process if it has finished.\",\n epistolaAdminConfigurations: 'Configurations',\n epistolaAdminValidations: 'BPMN validation',\n epistolaAdminNoValidations:\n 'No race-unsafe process definitions detected. Everything looks good.',\n epistolaAdminValidationWarningTitle: 'BPMN configuration warning',\n epistolaAdminValidationWarningBody:\n 'These process definitions have a non-synchronous boundary between the generate-document service task and the EpistolaDocumentGenerated catch event. Results can be missed; use the Reconcile button on the Pending Jobs tab to recover.',\n epistolaAdminValidationCode: 'Code',\n epistolaAdminValidationMessage: 'Message',\n epistolaAdminValidationLastChecked: 'Last checked',\n epistolaAdminValidationNotYetRun: 'not yet run',\n epistolaAdminValidationAutoRefresh: 'automatically re-checked roughly every',\n epistolaAdminValidationLatestVersionNote:\n \"Only the latest deployed version of each process definition is checked; older versions with running instances may have problems that aren't shown here.\",\n epistolaAdminCatalogs: 'Catalogs',\n epistolaAdminCatalogsIntro:\n 'Catalogs on the application classpath. These are deployed automatically on startup; use Redeploy to manually (force) push one to this Epistola installation — for example when the automatic startup deploy failed.',\n epistolaAdminNoCatalogs: 'No catalogs found on the classpath.',\n epistolaAdminCatalogSlug: 'Slug',\n epistolaAdminCatalogVersion: 'Version',\n epistolaAdminCatalogStatus: 'Status in Epistola',\n epistolaAdminCatalogInEpistola: 'Present in Epistola',\n epistolaAdminCatalogNotInEpistola: 'Not in Epistola',\n epistolaAdminCatalogStatusUnknown: 'Unknown (Epistola unreachable)',\n epistolaAdminRedeploy: 'Redeploy',\n epistolaAdminRedeploying: 'Redeploying...',\n epistolaAdminRedeployTooltip:\n 'Rebuild this catalog from the classpath and force-push it to Epistola, regardless of version or the templateSyncEnabled setting.',\n epistolaAdminChangelog: 'Changelog',\n epistolaAdminRunningVersion: 'Running plugin version:',\n epistolaAdminNoChangelog: 'No changelog available in this build.',\n // TEMPORARY (remove in 1.0.0): task-id carrier repair (admin \"Forms\" tab)\n epistolaAdminForms: 'Forms',\n epistolaAdminFormsIntro:\n 'Forms with an Epistola component that is missing the hidden task-id field. Without it, preview/download/retry do not work in every task-open flow. Repair adds the field.',\n epistolaAdminFormName: 'Form',\n epistolaAdminFormMissing: 'Missing components',\n epistolaAdminFormReadOnly: 'Read-only',\n epistolaAdminFormReadOnlyHint:\n 'This form is deployed from the classpath and is reconciled to its source on the next restart. Add the field to the source (re-drop the component) for a permanent fix.',\n epistolaAdminRepair: 'Repair',\n epistolaAdminRepairAll: 'Repair all',\n epistolaAdminRepairing: 'Working...',\n epistolaAdminRepairTooltip:\n 'Add the hidden task-id field to all Epistola components in this form.',\n epistolaAdminNoFormIssues: 'No forms with a missing task-id field found.',\n },\n },\n};\n\nexport { epistolaPluginSpecification };\n","/*\n * Public API Surface of epistola plugin\n */\n\nexport * from './lib/models';\nexport * from './lib/services';\nexport * from './lib/epistola.module';\nexport * from './lib/epistola.specification';\nexport * from './lib/epistola-runtime-config';\nexport * from './lib/epistola-admin-routing.module';\nexport * from './lib/components/epistola-admin-page/epistola-admin-page.component';\nexport * from './lib/components/epistola-configuration/epistola-configuration.component';\nexport * from './lib/components/generate-document-configuration/generate-document-configuration.component';\nexport * from './lib/components/check-job-status-configuration/check-job-status-configuration.component';\nexport * from './lib/components/download-document-configuration/download-document-configuration.component';\nexport * from './lib/components/jsonata-editor/jsonata-editor.component';\nexport * from './lib/components/mapping-builder/mapping-builder.component';\nexport * from './lib/components/epistola-document/epistola-document.component';\nexport * from './lib/components/epistola-document/epistola-document.formio';\nexport * from './lib/components/epistola-retry-form/epistola-retry-form.component';\nexport * from './lib/components/epistola-retry-form/epistola-retry-form.formio';\nexport * from './lib/components/epistola-document-preview/epistola-document-preview.component';\nexport * from './lib/components/epistola-document-preview/epistola-document-preview.formio';\nexport * from './lib/components/override-builder/override-builder.component';\nexport * from './lib/components/override-builder/override-builder.formio';\nexport * from './lib/components/process-link-selector/process-link-selector.component';\nexport * from './lib/components/process-link-selector/process-link-selector.formio';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1","i2","jsonata","i1.EpistolaPluginService","i3","i4","FORM_REF_PREFIX","take","takeUntil","i5","i6","debounceTime","i1.EpistolaAdminService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"epistola.app-valtimo-plugin.mjs","sources":["../../src/lib/models/admin.ts","../../src/lib/models/async-resource.ts","../../src/lib/models/config.ts","../../src/lib/models/expression.ts","../../src/lib/models/template.ts","../../src/lib/models/index.ts","../../src/lib/services/epistola-admin.service.ts","../../src/lib/services/epistola-menu.service.ts","../../src/lib/services/epistola-plugin.service.ts","../../src/lib/services/prefilled-task-id.ts","../../src/lib/services/index.ts","../../src/lib/components/epistola-configuration/epistola-configuration.component.ts","../../src/lib/components/epistola-configuration/epistola-configuration.component.html","../../src/lib/utils/jsonata-monaco.ts","../../src/lib/components/jsonata-editor/jsonata-editor.component.ts","../../src/lib/components/expected-structure/expected-structure.component.ts","../../src/lib/components/mapping-builder/builder-field/builder-field.component.ts","../../src/lib/utils/jsonata-converter.ts","../../src/lib/components/mapping-builder/mapping-builder.component.ts","../../src/lib/components/mapping-preview/mapping-preview.component.ts","../../src/lib/components/override-builder/override-jsonata.ts","../../src/lib/components/override-builder/legacy-override-converter.ts","../../src/lib/components/epistola-document-preview/preview-utils.ts","../../src/lib/components/generate-document-configuration/generate-document-configuration.component.ts","../../src/lib/components/generate-document-configuration/generate-document-configuration.component.html","../../src/lib/components/check-job-status-configuration/check-job-status-configuration.component.ts","../../src/lib/components/check-job-status-configuration/check-job-status-configuration.component.html","../../src/lib/components/download-document-configuration/download-document-config.util.ts","../../src/lib/components/download-document-configuration/download-document-configuration.component.ts","../../src/lib/components/download-document-configuration/download-document-configuration.component.html","../../src/lib/components/epistola-document/epistola-document.component.ts","../../src/lib/components/epistola-retry-form/epistola-retry-form.component.ts","../../src/lib/components/epistola-document-preview/epistola-document-preview.component.ts","../../src/lib/components/epistola-admin-page/epistola-admin-page.component.ts","../../src/lib/components/epistola-admin-page/epistola-admin-page.component.html","../../src/lib/epistola-runtime-config.ts","../../src/lib/epistola-enabled.guard.ts","../../src/lib/epistola-admin-routing.module.ts","../../src/lib/components/epistola-document/epistola-document.formio.ts","../../src/lib/components/formio-builder-utils.ts","../../src/lib/components/epistola-retry-form/epistola-retry-form.formio.ts","../../src/lib/components/epistola-document-preview/epistola-document-preview.formio.ts","../../src/lib/utils/extract-referenced-paths.ts","../../src/lib/components/override-builder/override-builder.component.ts","../../src/lib/components/override-builder/override-builder.formio.ts","../../src/lib/components/process-link-selector/process-link-selector.util.ts","../../src/lib/components/process-link-selector/process-link-selector.component.ts","../../src/lib/components/process-link-selector/process-link-selector.formio.ts","../../src/lib/epistola.module.ts","../../src/lib/assets/epistola-logo.ts","../../src/lib/assets/index.ts","../../src/lib/epistola.specification.ts","../../src/public_api.ts","../../src/epistola.app-valtimo-plugin.ts"],"sourcesContent":["/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\n/**\n * Connection health check result for a single Epistola plugin configuration.\n */\nexport interface ConnectionStatus {\n configurationId: string;\n configurationTitle: string;\n tenantId: string;\n reachable: boolean;\n latencyMs: number;\n errorMessage?: string;\n serverVersion?: string;\n}\n\n/**\n * Version information for the Epistola plugin and connected server.\n */\nexport interface VersionInfo {\n pluginVersion: string;\n epistolaServerVersion?: string;\n}\n\n/**\n * Describes a single usage of an Epistola plugin action within a process definition.\n */\n/**\n * A process instance currently waiting for an Epistola document generation result.\n */\nexport interface PendingJob {\n executionId: string;\n processInstanceId: string;\n processDefinitionKey: string;\n processDefinitionName: string;\n activityId: string;\n activityName: string;\n tenantId: string;\n requestId: string;\n configurationTitle: string;\n /**\n * 'WAITING' — has the epistolaWaitFor token; the collector can correlate it.\n * 'UNWIRED' — has the subscription but no token, so it can never be correlated (stuck); requestId is\n * absent and reconcile cannot recover it. Surfaced so operators can see and fix the process model.\n */\n status: 'WAITING' | 'UNWIRED';\n}\n\nexport interface PluginUsageEntry {\n processLinkId: string;\n caseDefinitionKey?: string;\n caseDefinitionVersionTag?: string;\n processDefinitionKey: string;\n processDefinitionName: string;\n activityId: string;\n activityName: string;\n actionKey: string;\n configurationId: string;\n configurationTitle: string;\n problems: string[];\n}\n\n/**\n * Outcome of a manual reconcile attempt for a stuck Epistola catch event.\n * `correlated=true` means the Epistola job is in a terminal state and message\n * correlation ran (count = how many process instances received it). `false`\n * means the job is still PENDING/IN_PROGRESS — the backend returns 409.\n */\nexport interface ReconcileResult {\n executionId: string;\n processInstanceId: string;\n tenantId: string;\n requestId: string;\n epistolaStatus: string;\n correlatedCount: number | null;\n correlated: boolean;\n}\n\n/**\n * A catalog discovered on the application classpath, with whether it currently\n * exists in the connected Epistola installation. `status` is resolved live by\n * querying Epistola at request time:\n * - `IN_EPISTOLA` — a catalog with this slug exists in Epistola.\n * - `NOT_IN_EPISTOLA` — Epistola was reached and has no such catalog (redeploy it).\n * - `UNKNOWN` — Epistola could not be reached, so existence is undetermined.\n */\nexport interface ClasspathCatalog {\n slug: string;\n version: string;\n status: 'IN_EPISTOLA' | 'NOT_IN_EPISTOLA' | 'UNKNOWN';\n}\n\n/**\n * Outcome of a manual single-catalog redeploy. `success=false` carries the\n * reason in `errorMessage`; the backend returns HTTP 502 in that case.\n */\nexport interface CatalogRedeployResult {\n slug: string;\n version: string;\n success: boolean;\n catalogKey: string | null;\n installed: number;\n updated: number;\n failed: number;\n total: number;\n errorMessage: string | null;\n}\n\n/**\n * A \"Keep a Changelog\" section within a release (e.g. \"Added\") and its items.\n */\nexport interface ChangelogSection {\n title: string;\n items: string[];\n}\n\n/**\n * One release block from the bundled CHANGELOG, parsed server-side (newest\n * first). `date` is null for the Unreleased block.\n */\nexport interface ChangelogRelease {\n version: string;\n date: string | null;\n sections: ChangelogSection[];\n}\n\n/**\n * A BPMN race-safety violation reported by the backend's deployment validator.\n * `code` is one of the constants in\n * `app.epistola.valtimo.web.rest.dto.BpmnValidationViolation` (kept stable so\n * the UI can render specific remediation copy per code).\n */\nexport interface BpmnValidationViolation {\n processDefinitionKey: string;\n processDefinitionName: string;\n activityId: string;\n code: string;\n message: string;\n}\n\n/**\n * The BPMN race-safety validation report from `GET /admin/validations`.\n * `lastCheckedAt` is an ISO-8601 timestamp of the last completed scan, or `null`\n * if no scan has run yet. `refreshIntervalMs` is the validator's scan cadence, used\n * to tell the operator how often the result refreshes. Only the latest deployed\n * version of each process definition is inspected.\n */\nexport interface BpmnValidationReport {\n lastCheckedAt: string | null;\n refreshIntervalMs: number;\n violations: BpmnValidationViolation[];\n}\n\n/**\n * TEMPORARY (removed in 1.0.0). A form whose Epistola components are missing the\n * task-id carrier field — surfaced on the admin page so it can be repaired.\n * `readOnly` flags classpath-deployed forms (a repair there is reverted on the next\n * boot; fix the source instead).\n */\nexport interface FormCarrierIssue {\n formId: string;\n name: string;\n missingComponents: number;\n readOnly: boolean;\n}\n\n/**\n * TEMPORARY. A form whose `epistola-document-preview` components still use the legacy\n * override-mapping object format (`{ scope: { path: \"form:key\" } }`) instead of the new\n * JSONata string over `$form`. Surfaced on the admin page so it can be re-saved in the\n * form builder, which migrates it. `readOnly` flags classpath-deployed forms (migrate\n * the source instead).\n */\nexport interface LegacyOverrideForm {\n formId: string;\n name: string;\n legacyComponents: number;\n readOnly: boolean;\n}\n\n/** TEMPORARY (removed in 1.0.0). Outcome of repairing one form's carrier. */\nexport interface FormCarrierRepairResult {\n formId: string;\n name: string | null;\n success: boolean;\n componentsPatched: number;\n errorMessage: string | null;\n}\n\n/** TEMPORARY (removed in 1.0.0). Aggregate outcome of repairing all flagged forms. */\nexport interface FormCarrierRepairSummary {\n formsRepaired: number;\n componentsPatched: number;\n failed: number;\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nexport interface AsyncResource<T> {\n data: T;\n loading: boolean;\n error: string | null;\n}\n\nexport function initialResource<T>(empty: T): AsyncResource<T> {\n return { data: empty, loading: false, error: null };\n}\n\nexport function loadingResource<T>(current: T): AsyncResource<T> {\n return { data: current, loading: true, error: null };\n}\n\nexport function successResource<T>(data: T): AsyncResource<T> {\n return { data, loading: false, error: null };\n}\n\nexport function errorResource<T>(current: T, error: string): AsyncResource<T> {\n return { data: current, loading: false, error };\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport { PluginConfigurationData } from '@valtimo/plugin';\n\n/**\n * Plugin-level configuration for Epistola.\n * Contains connection settings and defaults.\n */\nexport interface EpistolaPluginConfig extends PluginConfigurationData {\n baseUrl: string;\n apiKey: string;\n tenantId: string;\n defaultEnvironmentId?: string;\n templateSyncEnabled?: boolean;\n}\n\n/**\n * A single variant attribute entry for attribute-based variant selection.\n * When required is true, the variant MUST match this attribute.\n * When required is false, it is a preference (preferred but not mandatory).\n */\nexport interface VariantAttributeEntry {\n key: string;\n value: string;\n required: boolean;\n}\n\n/**\n * Action configuration for the generate-document action.\n * Contains all parameters needed to generate a document.\n *\n * Variant selection supports two modes:\n * - Explicit: set variantId directly\n * - By attributes: set variantAttributes with key-value pairs (values can be JSONata expressions)\n */\nexport interface GenerateDocumentConfig {\n catalogId: string;\n templateId: string;\n variantId?: string;\n variantAttributes?: VariantAttributeEntry[];\n environmentId?: string;\n dataMapping: string;\n outputFormat: 'PDF' | 'HTML';\n filename: string;\n correlationId?: string;\n resultProcessVariable: string;\n}\n\n/**\n * Action configuration for the check-job-status action.\n * Specifies which process variables to read from and write to.\n */\nexport interface CheckJobStatusConfig {\n requestIdVariable: string;\n statusVariable: string;\n documentIdVariable?: string;\n errorMessageVariable?: string;\n}\n\n/**\n * Action configuration for the download-document action.\n * Specifies which process variables to read from and write to.\n */\nexport interface DownloadDocumentConfig {\n /**\n * Name of the process variable that holds the result. May be a plain\n * String document id (legacy) or a `Map<String, Object>` rich result with\n * a `documentId` key (canonical, written by `generate-document` and\n * updated by the result collector). The action extracts the document id.\n */\n documentVariable: string;\n /**\n * Where the downloaded PDF is materialized (see\n * `docs/adr/0001-download-document-content-storage.md`). Defaults to `TEMPORARY_RESOURCE`. The\n * output variable used depends on this choice: `resourceIdVariable` or `contentVariable`.\n */\n storageTarget?: 'TEMPORARY_RESOURCE' | 'PROCESS_VARIABLE';\n /**\n * Output for `TEMPORARY_RESOURCE`: the process variable that receives the temporary resource id\n * (ready to hand to `documenten-api:store-temp-document`).\n */\n resourceIdVariable?: string;\n /**\n * Output for `PROCESS_VARIABLE`: the process variable that receives the raw PDF bytes inline\n * (best for small, non-sensitive documents).\n */\n contentVariable?: string;\n}\n\nexport interface VariableSuggestions {\n doc: string[];\n pv: string[];\n}\n\n/**\n * Raw `dataMapping` JSONata of a generate-document process link, keyed server-side by\n * `(processDefinitionKey, activityId)`. Empty when the link or its mapping can't be resolved.\n * The override builder statically extracts the referenced `$doc`/`$pv` paths from it to show\n * the author which inputs this template's mapping consumes.\n */\nexport interface ProcessLinkMapping {\n dataMapping: string;\n}\n\nexport interface EvaluationResult {\n success: boolean;\n result: Record<string, any> | null;\n error: string | null;\n}\n\n/**\n * Request body for the JSONata save-time validation endpoint.\n * All fields are optional; null/blank values are skipped.\n */\nexport interface ValidateJsonataRequest {\n dataMapping?: string | null;\n filename?: string | null;\n variantId?: string | null;\n variantAttributeValues?: Record<string, string> | null;\n}\n\nexport interface JsonataFieldError {\n field: string;\n expression: string;\n message: string;\n}\n\nexport interface JsonataValidationResult {\n valid: boolean;\n errors: JsonataFieldError[];\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nexport interface ExpressionFunctionInfo {\n name: string;\n description: string;\n overloads: OverloadInfo[];\n}\n\nexport interface OverloadInfo {\n arguments: ArgumentInfo[];\n returnType: string;\n}\n\nexport interface ArgumentInfo {\n name: string;\n type: string;\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\n/**\n * Basic information about an Epistola template.\n */\nexport interface TemplateInfo {\n id: string;\n name: string;\n description?: string;\n catalogId?: string;\n catalogName?: string;\n}\n\n/**\n * Detailed information about an Epistola template including its fields.\n */\nexport interface TemplateDetails {\n id: string;\n name: string;\n fields: TemplateField[];\n}\n\n/**\n * Represents a field in an Epistola template.\n * Supports nested structures through the children property.\n */\nexport interface TemplateField {\n name: string;\n path: string;\n type: string;\n fieldType: 'SCALAR' | 'OBJECT' | 'ARRAY';\n required: boolean;\n description?: string;\n children?: TemplateField[];\n}\n\n/**\n * Represents a single data mapping entry.\n */\nexport interface DataMappingEntry {\n templateField: string;\n dataSource: string;\n}\n\n/**\n * Source type for data mapping: how the value is provided.\n */\nexport type DataSourceType = 'document' | 'processVariable' | 'manual';\n\n/**\n/**\n * Information about an Epistola environment.\n */\nexport interface EnvironmentInfo {\n id: string;\n name: string;\n}\n\n/**\n * Information about an Epistola template variant.\n */\nexport interface VariantInfo {\n id: string;\n templateId: string;\n name: string;\n attributes: Record<string, string>;\n}\n\n/**\n * An attribute definition for variant selection within a tenant.\n */\nexport interface AttributeDefinition {\n key: string;\n description?: string;\n}\n\n/**\n * Information about an Epistola catalog.\n */\nexport interface CatalogInfo {\n id: string;\n name: string;\n type: string;\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nexport * from './admin';\nexport * from './async-resource';\nexport * from './config';\nexport * from './expression';\nexport * from './template';\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { ConfigService } from '@valtimo/shared';\nimport { Observable } from 'rxjs';\nimport {\n BpmnValidationReport,\n CatalogRedeployResult,\n ChangelogRelease,\n ClasspathCatalog,\n ConnectionStatus,\n FormCarrierIssue,\n FormCarrierRepairResult,\n FormCarrierRepairSummary,\n LegacyOverrideForm,\n PendingJob,\n PluginUsageEntry,\n ReconcileResult,\n VersionInfo,\n} from '../models';\n\n/**\n * Service for Epistola plugin administrative operations.\n * Provides health checks, version info, and usage overview.\n */\n@Injectable()\nexport class EpistolaAdminService {\n private readonly apiEndpoint: string;\n\n constructor(\n private readonly http: HttpClient,\n private readonly configService: ConfigService,\n ) {\n this.apiEndpoint = `${this.configService.config.valtimoApi.endpointUri}v1/plugin/epistola/admin`;\n }\n\n /**\n * Check connectivity to Epistola for all plugin configurations.\n */\n getConnectionStatus(): Observable<ConnectionStatus[]> {\n return this.http.get<ConnectionStatus[]>(`${this.apiEndpoint}/health`);\n }\n\n /**\n * Get version information for the plugin and connected Epistola server.\n */\n getVersions(): Observable<VersionInfo> {\n return this.http.get<VersionInfo>(`${this.apiEndpoint}/versions`);\n }\n\n /**\n * Get an overview of all Epistola plugin usages across process definitions.\n */\n getPluginUsage(): Observable<PluginUsageEntry[]> {\n return this.http.get<PluginUsageEntry[]>(`${this.apiEndpoint}/usage`);\n }\n\n /**\n * Get all process instances currently waiting for an Epistola document generation result.\n */\n getPendingJobs(): Observable<PendingJob[]> {\n return this.http.get<PendingJob[]>(`${this.apiEndpoint}/pending`);\n }\n\n /**\n * Manually reconcile a stuck Epistola catch event by querying Epistola for the\n * job's current status and re-running message correlation. Returns 200 with\n * `correlated=true` on success, 409 with `correlated=false` when the job is\n * still in flight, or surfaces a validation error when the execution can't be\n * recovered (no subscription, missing variable, unknown tenant).\n */\n reconcilePending(executionId: string): Observable<ReconcileResult> {\n return this.http.post<ReconcileResult>(\n `${this.apiEndpoint}/pending/${encodeURIComponent(executionId)}/reconcile`,\n null,\n );\n }\n\n /**\n * Get the latest BPMN race-safety validation report across deployed process\n * definitions: the violations (empty = healthy) plus when it was last checked\n * and how often it refreshes.\n */\n getValidationReport(): Observable<BpmnValidationReport> {\n return this.http.get<BpmnValidationReport>(`${this.apiEndpoint}/validations`);\n }\n\n /**\n * List the classpath catalogs available to manually redeploy for a plugin\n * configuration, each annotated with the version last deployed in this\n * backend process.\n */\n getClasspathCatalogs(configurationId: string): Observable<ClasspathCatalog[]> {\n return this.http.get<ClasspathCatalog[]>(\n `${this.apiEndpoint}/configurations/${encodeURIComponent(configurationId)}/catalogs`,\n );\n }\n\n /**\n * Force-redeploy a single classpath catalog to the configuration's Epistola\n * installation. Explicit operator action — bypasses the templateSyncEnabled\n * gate and the version-skip check. Returns 200 with per-resource counts on\n * success, or 502 (error callback, body carries `errorMessage`) on failure.\n */\n redeployCatalog(configurationId: string, slug: string): Observable<CatalogRedeployResult> {\n return this.http.post<CatalogRedeployResult>(\n `${this.apiEndpoint}/configurations/${encodeURIComponent(configurationId)}/catalogs/${encodeURIComponent(slug)}/redeploy`,\n null,\n );\n }\n\n /**\n * Get the plugin CHANGELOG parsed (server-side) into structured releases for\n * the admin Changelog tab — no markdown renderer needed on the client.\n */\n getChangelog(): Observable<ChangelogRelease[]> {\n return this.http.get<ChangelogRelease[]>(`${this.apiEndpoint}/changelog`);\n }\n\n /**\n * Export a single process link as a .process-link.json file.\n */\n exportProcessLink(processLinkId: string): Observable<Blob> {\n return this.http.get(`${this.apiEndpoint}/export/${encodeURIComponent(processLinkId)}`, {\n responseType: 'blob',\n });\n }\n\n // ---- TEMPORARY (removed in 1.0.0): task-id carrier detection + repair ----\n\n /** Forms whose Epistola components are missing the task-id carrier. */\n getFormCarrierIssues(): Observable<FormCarrierIssue[]> {\n return this.http.get<FormCarrierIssue[]>(`${this.apiEndpoint}/forms/carrier-issues`);\n }\n\n /** Inject the task-id carrier into a single form's Epistola components. */\n repairFormCarrier(formId: string): Observable<FormCarrierRepairResult> {\n return this.http.post<FormCarrierRepairResult>(\n `${this.apiEndpoint}/forms/${encodeURIComponent(formId)}/repair-carrier`,\n null,\n );\n }\n\n /** Repair every flagged form. */\n repairAllFormCarriers(): Observable<FormCarrierRepairSummary> {\n return this.http.post<FormCarrierRepairSummary>(\n `${this.apiEndpoint}/forms/repair-carrier`,\n null,\n );\n }\n\n // ---- TEMPORARY: legacy override-mapping format detection ----\n\n /** Forms whose preview components still use the legacy override-mapping object format. */\n getLegacyOverrideForms(): Observable<LegacyOverrideForm[]> {\n return this.http.get<LegacyOverrideForm[]>(`${this.apiEndpoint}/forms/legacy-override`);\n }\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport { Injectable } from '@angular/core';\nimport { MenuService } from '@valtimo/components';\nimport { MenuItem, ROLE_ADMIN } from '@valtimo/shared';\nimport { Observable, of } from 'rxjs';\n\n/**\n * Registers the Epistola admin page menu item under the Admin > Other section.\n * Instantiated eagerly via ENVIRONMENT_INITIALIZER so the menu item\n * appears without any manual configuration in the host application.\n */\n@Injectable()\nexport class EpistolaMenuService {\n constructor(private readonly menuService: MenuService) {\n this.menuService.registerAppendMenuItemsFunction(\n (items: MenuItem[]): Observable<MenuItem[]> => {\n return of(\n items.map((item) => {\n const isAdminMenu = item.roles?.includes(ROLE_ADMIN) && item.children;\n if (!isAdminMenu) {\n return item;\n }\n return {\n ...item,\n children: [\n ...item.children!,\n {\n link: ['/epistola'],\n title: 'Epistola',\n sequence: 18,\n },\n ],\n };\n }),\n );\n },\n );\n }\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport { Injectable } from '@angular/core';\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { ConfigService } from '@valtimo/shared';\nimport { Observable } from 'rxjs';\nimport {\n AttributeDefinition,\n CatalogInfo,\n EnvironmentInfo,\n ExpressionFunctionInfo,\n JsonataValidationResult,\n ProcessLinkMapping,\n TemplateDetails,\n TemplateInfo,\n EvaluationResult,\n ValidateJsonataRequest,\n VariableSuggestions,\n VariantInfo,\n} from '../models';\n\n/**\n * Body of a {@link EpistolaPluginService.previewToBlob} call. Mirrors the\n * backend {@code PreviewRequest} record. The backend derives the process\n * instance and case document from the authorized task, so only {@code taskId}\n * and {@code sourceActivityId} (which identifies the {@code generate-document}\n * process link) are sent; {@code overrides} and {@code inputOverrides} let the\n * caller substitute data before the JSONata mapping runs.\n */\nexport interface PreviewBlobRequest {\n taskId: string;\n sourceActivityId?: string | null;\n inputOverrides?: Record<string, unknown> | null;\n overrides?: Record<string, unknown> | null;\n}\n\n/**\n * Query-string parameters for {@link EpistolaPluginService.downloadDocumentBlob}.\n * The backend resolves the Epistola PDF id and tenant id from the named process\n * variables on the caller's task — no raw PDF id is sent on the wire.\n */\nexport interface DownloadDocumentRequest {\n taskId: string;\n caseDocumentId: string;\n documentVariable: string;\n tenantIdVariable: string;\n filename: string;\n disposition: 'attachment' | 'inline';\n}\n\n/**\n * Service for interacting with Epistola plugin API endpoints.\n * Provides methods to fetch templates, environments, variants,\n * process variables, and validate mappings.\n */\n@Injectable()\nexport class EpistolaPluginService {\n private readonly apiEndpoint: string;\n\n constructor(\n private readonly http: HttpClient,\n private readonly configService: ConfigService,\n ) {\n this.apiEndpoint = `${this.configService.config.valtimoApi.endpointUri}v1/plugin/epistola`;\n }\n\n /**\n * Get all available catalogs for a plugin configuration.\n */\n getCatalogs(pluginConfigurationId: string): Observable<CatalogInfo[]> {\n return this.http.get<CatalogInfo[]>(\n `${this.apiEndpoint}/configurations/${pluginConfigurationId}/catalogs`,\n );\n }\n\n /**\n * Get all available templates for a plugin configuration and catalog.\n */\n getTemplates(pluginConfigurationId: string, catalogId?: string): Observable<TemplateInfo[]> {\n const params: Record<string, string> = {};\n if (catalogId) params['catalogId'] = catalogId;\n return this.http.get<TemplateInfo[]>(\n `${this.apiEndpoint}/configurations/${pluginConfigurationId}/templates`,\n { params },\n );\n }\n\n /**\n * Get template details including its fields.\n */\n getTemplateDetails(\n pluginConfigurationId: string,\n templateId: string,\n catalogId: string,\n ): Observable<TemplateDetails> {\n return this.http.get<TemplateDetails>(\n `${this.apiEndpoint}/configurations/${pluginConfigurationId}/templates/${templateId}`,\n { params: { catalogId } },\n );\n }\n\n /**\n * Get all attribute definitions for a plugin configuration's tenant and catalog.\n */\n getAttributes(\n pluginConfigurationId: string,\n catalogId: string,\n ): Observable<AttributeDefinition[]> {\n const params: Record<string, string> = {};\n if (catalogId) params['catalogId'] = catalogId;\n return this.http.get<AttributeDefinition[]>(\n `${this.apiEndpoint}/configurations/${pluginConfigurationId}/attributes`,\n { params },\n );\n }\n\n /**\n * Get all available environments for a plugin configuration.\n */\n getEnvironments(pluginConfigurationId: string): Observable<EnvironmentInfo[]> {\n return this.http.get<EnvironmentInfo[]>(\n `${this.apiEndpoint}/configurations/${pluginConfigurationId}/environments`,\n );\n }\n\n /**\n * Get all variants for a specific template.\n */\n getVariants(\n pluginConfigurationId: string,\n templateId: string,\n catalogId: string,\n ): Observable<VariantInfo[]> {\n const params: Record<string, string> = {};\n if (catalogId) params['catalogId'] = catalogId;\n return this.http.get<VariantInfo[]>(\n `${this.apiEndpoint}/configurations/${pluginConfigurationId}/templates/${templateId}/variants`,\n { params },\n );\n }\n\n /**\n * Discover process variable names for a given process definition.\n */\n getProcessVariables(processDefinitionKey: string): Observable<string[]> {\n return this.http.get<string[]>(`${this.apiEndpoint}/process-variables`, {\n params: { processDefinitionKey },\n });\n }\n\n /**\n * Get the raw `dataMapping` JSONata of a generate-document process link, identified by its\n * process definition key and activity id. The override builder extracts the referenced\n * `$doc`/`$pv` paths from it to guide the author. Returns an empty mapping when unresolved.\n */\n getProcessLinkMapping(\n processDefinitionKey: string,\n activityId: string,\n ): Observable<ProcessLinkMapping> {\n return this.http.get<ProcessLinkMapping>(`${this.apiEndpoint}/process-link-mapping`, {\n params: { processDefinitionKey, activityId },\n });\n }\n\n /**\n * Get variable suggestions for JSONata autocompletion.\n */\n getVariableSuggestions(\n caseDefinitionKey?: string,\n processDefinitionKey?: string,\n ): Observable<VariableSuggestions> {\n const params: Record<string, string> = {};\n if (caseDefinitionKey) params['caseDefinitionKey'] = caseDefinitionKey;\n if (processDefinitionKey) params['processDefinitionKey'] = processDefinitionKey;\n return this.http.get<VariableSuggestions>(`${this.apiEndpoint}/variable-suggestions`, {\n params,\n });\n }\n\n /**\n * Evaluate a JSONata expression against a real document.\n */\n evaluateMapping(\n expression: string,\n documentId: string,\n processInstanceId?: string,\n ): Observable<EvaluationResult> {\n return this.http.post<EvaluationResult>(`${this.apiEndpoint}/evaluate-mapping`, {\n expression,\n documentId,\n processInstanceId: processInstanceId ?? null,\n });\n }\n\n /**\n * Get a dynamically generated Formio form for retrying a failed document generation.\n *\n * The backend derives the process instance and case document from the authorized task,\n * so only the task id (and optionally the source activity) is sent.\n *\n * @param taskId Operaton user task id (required — backend authorizes via OperatonTask:VIEW)\n */\n getRetryForm(taskId: string, sourceActivityId?: string): Observable<any> {\n const params: Record<string, string> = { taskId };\n if (sourceActivityId) {\n params['sourceActivityId'] = sourceActivityId;\n }\n return this.http.get<any>(`${this.apiEndpoint}/retry-form`, { params });\n }\n\n /**\n * List all available expression functions for expr: data mapping values.\n */\n getExpressionFunctions(): Observable<ExpressionFunctionInfo[]> {\n return this.http.get<ExpressionFunctionInfo[]>(`${this.apiEndpoint}/expression-functions`);\n }\n\n /**\n * Validate the JSONata syntax of action-config expressions before save.\n * Parse-only; runtime errors (missing variables, type mismatches) are not detected.\n */\n validateJsonata(request: ValidateJsonataRequest): Observable<JsonataValidationResult> {\n return this.http.post<JsonataValidationResult>(`${this.apiEndpoint}/validate-jsonata`, request);\n }\n\n /**\n * Preview a document by dry-running the {@code generate-document} process\n * link. Returns the rendered PDF as a {@link Blob}.\n *\n * <p>The {@code X-Skip-Interceptor: 422} header tells the global Valtimo\n * error interceptor to skip its toast for validation failures so the\n * caller can render an inline error message.\n */\n previewToBlob(request: PreviewBlobRequest): Observable<Blob> {\n return this.http.post(`${this.apiEndpoint}/preview`, request, {\n responseType: 'blob',\n headers: new HttpHeaders().set('X-Skip-Interceptor', '422'),\n });\n }\n\n /**\n * Stream an already-generated Epistola PDF for the caller's task. The\n * backend resolves the Epistola document id and tenant id from the named\n * process variables on the task's process instance, so the wire never\n * carries a raw PDF id.\n */\n downloadDocumentBlob(request: DownloadDocumentRequest): Observable<Blob> {\n const params = new URLSearchParams({\n taskId: request.taskId,\n caseDocumentId: request.caseDocumentId,\n documentVariable: request.documentVariable,\n tenantIdVariable: request.tenantIdVariable,\n filename: request.filename,\n disposition: request.disposition,\n });\n return this.http.get(`${this.apiEndpoint}/documents/download?${params.toString()}`, {\n responseType: 'blob',\n });\n }\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\n/**\n * Helpers for reading the active user task's id out of a Valtimo task form that was\n * prefilled server-side by the {@code epistola:} value resolver (see the backend\n * {@code EpistolaTaskValueResolverFactory}).\n *\n * <p>Background: the Epistola Formio components need the id of the user task whose form\n * they're rendered in, to authorize their backend requests ({@code OperatonTask:VIEW}).\n * Valtimo exposes no service that carries the task id to a custom Formio component at\n * runtime, and earlier URL-sniffing only worked in the direct task-open flow (the\n * task-list / case-detail flow bulk-fetches process links and never fires the per-task\n * call).\n *\n * <p>Form prefill, however, runs server-side in every flow. A form field with\n * {@code properties.sourceKey = \"epistola:taskId\"} is filled with the task id at prefill\n * time (by the backend {@code EpistolaTaskValueResolverFactory}); this helper reads it back\n * from the Formio root — robustly, regardless of how the task was opened.\n */\n\n/** The value-resolver source key that yields the current task id at prefill time. */\nexport const PREFILLED_TASK_ID_SOURCE_KEY = 'epistola:taskId';\n\n/** Conventional key of the hidden carrier field that holds the prefilled task id. */\nexport const PREFILLED_TASK_ID_DATA_KEY = 'epistolaTaskId';\n\n/**\n * Hidden Formio child component that carries the prefilled task id. It is embedded as a\n * nested component inside each Epistola task component's schema, so dropping that component\n * brings the carrier with it — the form author never adds a separate field. Valtimo's\n * server-side prefill fills its {@code defaultValue} from the {@code epistola:taskId}\n * value resolver; {@link readPrefilledTaskId} reads it back from the form definition.\n *\n * {@code persistent: false} keeps the value out of the submission, so the task id never\n * lands in the case document / process variables.\n */\nexport const PREFILLED_TASK_ID_CARRIER = {\n type: 'hidden',\n key: PREFILLED_TASK_ID_DATA_KEY,\n input: true,\n persistent: false,\n label: 'Epistola Task Id',\n properties: { sourceKey: PREFILLED_TASK_ID_SOURCE_KEY },\n};\n\n/**\n * Reads the prefilled task id from a Formio webform/wizard root, or null when absent.\n *\n * Looks in two places, in order:\n * 1. The (prefilled) form definition — any component whose {@code properties.sourceKey}\n * is {@code epistola:taskId} carries the task id in its {@code defaultValue}. This works\n * even when the carrier is a hidden field that Formio doesn't surface into submission data.\n * 2. The submission data under {@link PREFILLED_TASK_ID_DATA_KEY}, for a rendered sibling\n * hidden field whose value Formio copied into {@code root.data}.\n */\nexport function readPrefilledTaskId(root: any): string | null {\n if (!root) {\n return null;\n }\n\n const fromForm = findSourceKeyDefaultValue(root.form, PREFILLED_TASK_ID_SOURCE_KEY);\n if (typeof fromForm === 'string' && fromForm.length > 0) {\n return fromForm;\n }\n\n const fromData = root.data?.[PREFILLED_TASK_ID_DATA_KEY];\n if (typeof fromData === 'string' && fromData.length > 0) {\n return fromData;\n }\n\n return null;\n}\n\n/**\n * Deep-walks a form definition node looking for a component whose\n * {@code properties.sourceKey} equals {@code sourceKey}, and returns its\n * {@code defaultValue} (the prefilled value). Returns null when not found.\n */\nfunction findSourceKeyDefaultValue(node: any, sourceKey: string): string | null {\n if (Array.isArray(node)) {\n for (const item of node) {\n const found = findSourceKeyDefaultValue(item, sourceKey);\n if (found != null) {\n return found;\n }\n }\n return null;\n }\n\n if (node && typeof node === 'object') {\n if (node.properties?.sourceKey === sourceKey && typeof node.defaultValue === 'string') {\n return node.defaultValue;\n }\n for (const key of Object.keys(node)) {\n const found = findSourceKeyDefaultValue(node[key], sourceKey);\n if (found != null) {\n return found;\n }\n }\n }\n\n return null;\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nexport * from './epistola-admin.service';\nexport * from './epistola-menu.service';\nexport * from './epistola-plugin.service';\nexport * from './prefilled-task-id';\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n PluginConfigurationComponent,\n PluginConfigurationData,\n PluginTranslatePipeModule,\n} from '@valtimo/plugin';\nimport { FormModule, FormOutput, InputModule } from '@valtimo/components';\nimport { BehaviorSubject, combineLatest, Observable, Subscription, take } from 'rxjs';\nimport { delay, startWith } from 'rxjs/operators';\nimport { EpistolaPluginConfig } from '../../models';\n\n@Component({\n selector: 'epistola-configuration',\n templateUrl: './epistola-configuration.component.html',\n styleUrls: ['./epistola-configuration.component.scss'],\n standalone: true,\n imports: [CommonModule, PluginTranslatePipeModule, FormModule, InputModule],\n})\nexport class EpistolaConfigurationComponent\n implements PluginConfigurationComponent, OnInit, OnDestroy\n{\n @Input() save$!: Observable<void>;\n @Input() disabled$!: Observable<boolean>;\n @Input() pluginId!: string;\n @Input() prefillConfiguration$!: Observable<EpistolaPluginConfig>;\n\n @Output() valid: EventEmitter<boolean> = new EventEmitter<boolean>();\n // Framework's PluginConfigurationData (index type) to satisfy the invariant\n // EventEmitter contract under strict mode; emitted values remain the typed config.\n @Output() configuration: EventEmitter<PluginConfigurationData> =\n new EventEmitter<PluginConfigurationData>();\n\n /** Epistola slug pattern: lowercase alphanumeric with hyphens, no leading/trailing hyphens. */\n private static readonly SLUG_PATTERN = /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/;\n\n private saveSubscription!: Subscription;\n private readonly formValue$ = new BehaviorSubject<EpistolaPluginConfig | null>(null);\n private readonly valid$ = new BehaviorSubject<boolean>(false);\n\n safeDisabled$!: Observable<boolean>;\n\n ngOnInit(): void {\n // Wrap disabled$ with startWith and delay to prevent NG0100 ExpressionChangedAfterItHasBeenCheckedError\n // The disabled$ observable from Valtimo's plugin framework can emit value changes after Angular's\n // change detection cycle completes, causing the error.\n this.safeDisabled$ = this.disabled$.pipe(startWith(true), delay(0));\n this.openSaveSubscription();\n }\n\n ngOnDestroy() {\n this.saveSubscription?.unsubscribe();\n }\n\n formValueChange(formOutput: FormOutput): void {\n const formValue = formOutput as unknown as EpistolaPluginConfig;\n this.formValue$.next(formValue);\n this.handleValid(formValue);\n }\n\n private handleValid(formValue: EpistolaPluginConfig): void {\n const valid = !!(\n formValue?.configurationTitle &&\n formValue?.baseUrl &&\n formValue?.apiKey &&\n formValue?.tenantId &&\n this.isValidSlug(formValue.tenantId, 3, 63) &&\n this.isValidOptionalSlug(formValue.defaultEnvironmentId, 3, 30)\n );\n this.valid$.next(valid);\n this.valid.emit(valid);\n }\n\n private isValidSlug(value: string, minLength: number, maxLength: number): boolean {\n return (\n value.length >= minLength &&\n value.length <= maxLength &&\n EpistolaConfigurationComponent.SLUG_PATTERN.test(value)\n );\n }\n\n private isValidOptionalSlug(\n value: string | undefined,\n minLength: number,\n maxLength: number,\n ): boolean {\n if (!value) {\n return true;\n }\n return this.isValidSlug(value, minLength, maxLength);\n }\n\n private openSaveSubscription(): void {\n this.saveSubscription = this.save$?.subscribe(() => {\n combineLatest([this.formValue$, this.valid$])\n .pipe(take(1))\n .subscribe(([formValue, valid]) => {\n if (valid && formValue) {\n this.configuration.emit(formValue);\n }\n });\n });\n }\n}\n","<v-form\n (valueChange)=\"formValueChange($event)\"\n *ngIf=\"{\n disabled: safeDisabled$ | async,\n prefill: prefillConfiguration$ ? (prefillConfiguration$ | async) : null,\n } as obs\"\n>\n <v-input\n name=\"configurationTitle\"\n [title]=\"'configurationTitle' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"obs.prefill?.configurationTitle\"\n [disabled]=\"obs.disabled\"\n [required]=\"true\"\n >\n </v-input>\n\n <v-input\n name=\"baseUrl\"\n [title]=\"'baseUrl' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'baseUrlTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"obs.prefill?.baseUrl\"\n [disabled]=\"obs.disabled\"\n [required]=\"true\"\n >\n </v-input>\n\n <v-input\n name=\"apiKey\"\n [title]=\"'apiKey' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'apiKeyTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"obs.prefill?.apiKey\"\n [disabled]=\"obs.disabled\"\n [required]=\"true\"\n type=\"password\"\n >\n </v-input>\n\n <v-input\n name=\"tenantId\"\n [title]=\"'tenantId' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'tenantIdTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"obs.prefill?.tenantId\"\n [disabled]=\"obs.disabled\"\n [required]=\"true\"\n >\n </v-input>\n\n <v-input\n name=\"defaultEnvironmentId\"\n [title]=\"'defaultEnvironmentId' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'defaultEnvironmentIdTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"obs.prefill?.defaultEnvironmentId\"\n [disabled]=\"obs.disabled\"\n [required]=\"false\"\n >\n </v-input>\n\n <v-input\n name=\"templateSyncEnabled\"\n type=\"checkbox\"\n [title]=\"'templateSyncEnabled' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'templateSyncEnabledTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"obs.prefill?.templateSyncEnabled ? 'true' : ''\"\n [disabled]=\"obs.disabled\"\n [required]=\"false\"\n >\n </v-input>\n</v-form>\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport { ExpressionFunctionInfo } from '../models';\n\n/**\n * Shared state for the JSONata completion provider.\n * Updated by the editor component when suggestions/functions change.\n */\nexport const jsonataCompletionData = {\n // Context variables in scope, keyed by name (without the `$`), each mapping to\n // its known field/path suggestions. The completion provider derives both the\n // `$`-variable list and the `$<name>.` field list from this — adding a new\n // context variable needs no provider change, just another key here.\n // e.g. { doc: ['name', 'address.street'], pv: ['amount'], form: ['voornaam'] }\n variables: {} as Record<string, string[]>,\n functions: [] as ExpressionFunctionInfo[],\n};\n\n/**\n * Register the JSONata language in Monaco editor.\n * Call this once when Monaco is available (e.g., in editor component OnInit).\n */\nexport function registerJsonataLanguage(monaco: any): void {\n // Only register once\n if (monaco.languages.getLanguages().some((lang: any) => lang.id === 'jsonata')) {\n return;\n }\n\n monaco.languages.register({ id: 'jsonata' });\n\n // Syntax highlighting via Monarch tokenizer\n monaco.languages.setMonarchTokensProvider('jsonata', {\n defaultToken: '',\n tokenPostfix: '.jsonata',\n\n keywords: ['true', 'false', 'null', 'in', 'and', 'or', 'not'],\n\n operators: ['&', '?', ':', '=', '!=', '>', '<', '>=', '<=', '+', '-', '*', '/', '%', '~>'],\n\n symbols: /[=><!~?:&|+\\-*/^%]+/,\n\n tokenizer: {\n root: [\n // Variables: $identifier\n [/\\$[a-zA-Z_]\\w*/, 'variable'],\n\n // Identifiers and keywords\n [\n /[a-zA-Z_]\\w*/,\n {\n cases: {\n '@keywords': 'keyword',\n '@default': 'identifier',\n },\n },\n ],\n\n // Whitespace\n { include: '@whitespace' },\n\n // Strings\n [/\"([^\"\\\\]|\\\\.)*$/, 'string.invalid'],\n [/\"/, 'string', '@string_double'],\n [/'([^'\\\\]|\\\\.)*$/, 'string.invalid'],\n [/'/, 'string', '@string_single'],\n\n // Numbers\n [/\\d+(\\.\\d+)?([eE][-+]?\\d+)?/, 'number'],\n\n // Delimiters and operators\n [/[{}()\\[\\]]/, '@brackets'],\n [/[,;.]/, 'delimiter'],\n [\n /@symbols/,\n {\n cases: {\n '@operators': 'operator',\n '@default': '',\n },\n },\n ],\n ],\n\n string_double: [\n [/[^\\\\\"]+/, 'string'],\n [/\\\\./, 'string.escape'],\n [/\"/, 'string', '@pop'],\n ],\n\n string_single: [\n [/[^\\\\']+/, 'string'],\n [/\\\\./, 'string.escape'],\n [/'/, 'string', '@pop'],\n ],\n\n whitespace: [[/[ \\t\\r\\n]+/, 'white']],\n },\n });\n\n // Autocomplete provider\n monaco.languages.registerCompletionItemProvider('jsonata', {\n triggerCharacters: ['$', '.'],\n\n provideCompletionItems: (model: any, position: any) => {\n const textUntilPosition = model.getValueInRange({\n startLineNumber: position.lineNumber,\n startColumn: 1,\n endLineNumber: position.lineNumber,\n endColumn: position.column,\n });\n\n const suggestions: any[] = [];\n const CompletionItemKind = monaco.languages.CompletionItemKind;\n\n // After \"$\" — suggest variables and functions\n if (textUntilPosition.endsWith('$')) {\n // Variables are whatever the host put in scope (doc/pv/case/form/…).\n suggestions.push(\n ...Object.keys(jsonataCompletionData.variables).map((v) => ({\n label: `$${v}`,\n kind: CompletionItemKind.Variable,\n insertText: v,\n detail: `Context variable`,\n })),\n );\n\n // Custom functions\n for (const func of jsonataCompletionData.functions) {\n suggestions.push({\n label: `$${func.name}`,\n kind: CompletionItemKind.Function,\n insertText: `${func.name}($0)`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n detail: func.description || 'Custom function',\n });\n }\n\n // Built-in JSONata functions\n const builtins = [\n 'string',\n 'number',\n 'boolean',\n 'length',\n 'substring',\n 'uppercase',\n 'lowercase',\n 'trim',\n 'contains',\n 'split',\n 'join',\n 'sum',\n 'count',\n 'max',\n 'min',\n 'average',\n 'append',\n 'sort',\n 'reverse',\n 'keys',\n 'values',\n 'lookup',\n 'now',\n 'exists',\n 'type',\n 'not',\n ];\n for (const fn of builtins) {\n suggestions.push({\n label: `$${fn}`,\n kind: CompletionItemKind.Function,\n insertText: `${fn}($0)`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n detail: 'Built-in JSONata function',\n });\n }\n }\n\n // After \"$<name>.\" — suggest that variable's fields. The variable name is\n // captured generically, so doc/pv/case/form/… all work from one branch.\n const fieldMatch = textUntilPosition.match(/\\$([a-zA-Z_]\\w*)\\.[a-zA-Z_]*$/);\n if (fieldMatch) {\n const fields = jsonataCompletionData.variables[fieldMatch[1]] || [];\n for (const field of fields) {\n suggestions.push({\n label: field,\n kind: CompletionItemKind.Field,\n // Path-style suggestions (doc/pv: `a.b`, `a[].b`) insert as-is; keys\n // with characters invalid in a bare JSONata name (e.g. \"pv:motivation\")\n // are backtick-quoted so they resolve as a single property.\n insertText: /[^A-Za-z0-9_.[\\]]/.test(field) ? '`' + field + '`' : field,\n detail: `$${fieldMatch[1]} field`,\n });\n }\n }\n\n return { suggestions };\n },\n });\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport {\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PluginTranslatePipeModule } from '@valtimo/plugin';\nimport { EditorModule } from '@valtimo/components';\nimport { Subject, debounceTime, takeUntil } from 'rxjs';\nimport { ExpressionFunctionInfo } from '../../models';\nimport { jsonataCompletionData, registerJsonataLanguage } from '../../utils/jsonata-monaco';\n\nimport * as _jsonata from 'jsonata';\nconst jsonata = (_jsonata as any).default || _jsonata;\n\n@Component({\n selector: 'epistola-jsonata-editor',\n standalone: true,\n imports: [CommonModule, PluginTranslatePipeModule, EditorModule],\n template: `\n <div class=\"jsonata-editor\">\n <valtimo-editor\n [model]=\"editorModel\"\n [editorOptions]=\"editorOptions\"\n [disabled]=\"disabled\"\n [heightPx]=\"250\"\n [formatOnLoad]=\"false\"\n (valueChangeEvent)=\"onEditorValueChange($event)\"\n ></valtimo-editor>\n <div class=\"jsonata-editor__footer\">\n <span *ngIf=\"error\" class=\"jsonata-editor__error\">{{ error }}</span>\n <span *ngIf=\"!error && expression\" class=\"jsonata-editor__valid\">✓</span>\n <span class=\"jsonata-editor__variables\">{{ variablesHint }}</span>\n </div>\n </div>\n `,\n styles: [\n `\n .jsonata-editor__footer {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 4px;\n font-size: 0.8em;\n }\n .jsonata-editor__error {\n color: #da1e28;\n }\n .jsonata-editor__valid {\n color: #198038;\n }\n .jsonata-editor__variables {\n margin-left: auto;\n color: #8d8d8d;\n font-family: monospace;\n }\n `,\n ],\n})\nexport class JsonataEditorComponent implements OnChanges, OnDestroy {\n @Input() expression: string = '';\n @Input() disabled: boolean = false;\n /**\n * Context variables in scope, keyed by name (without `$`), each mapping to its\n * field/path suggestions — e.g. `{ doc: [...], pv: [...] }` for the data\n * mapping, `{ form: [...] }` for the override builder. Drives both the\n * `$`-variable list and `$<name>.` field completion.\n */\n @Input() contextVariables: Record<string, string[]> = {};\n @Input() functions: ExpressionFunctionInfo[] = [];\n /** Footer hint listing the context variables in scope. */\n @Input() variablesHint: string = '$doc · $pv · $case';\n @Output() expressionChange = new EventEmitter<string>();\n @Output() validChange = new EventEmitter<boolean>();\n\n editorModel: { value: string; language: string } = { value: '', language: 'jsonata' };\n editorOptions: Record<string, any> = {\n minimap: { enabled: false },\n lineNumbers: 'on',\n scrollBeyondLastLine: false,\n fontSize: 13,\n tabSize: 2,\n wordWrap: 'on',\n renderWhitespace: 'none',\n };\n\n error: string | null = null;\n\n private destroy$ = new Subject<void>();\n private validate$ = new Subject<string>();\n private suppressChange = false;\n private languageRegistered = false;\n\n constructor() {\n this.validate$.pipe(debounceTime(300), takeUntil(this.destroy$)).subscribe((value) => {\n this.validateExpression(value);\n });\n\n // Try to register language eagerly if Monaco is already loaded\n this.tryRegisterLanguage();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['expression'] && !this.suppressChange) {\n this.editorModel = { value: this.expression || '', language: 'jsonata' };\n this.validate$.next(this.expression);\n }\n if (changes['contextVariables']) {\n jsonataCompletionData.variables = this.contextVariables || {};\n }\n if (changes['functions']) {\n jsonataCompletionData.functions = this.functions;\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n onEditorValueChange(value: string): void {\n // Register language on first editor event (Monaco is now loaded)\n if (!this.languageRegistered) {\n this.tryRegisterLanguage();\n }\n\n if (this.suppressChange) return;\n this.suppressChange = true;\n this.expression = value;\n this.expressionChange.emit(value);\n this.validate$.next(value);\n setTimeout(() => (this.suppressChange = false));\n }\n\n private tryRegisterLanguage(): void {\n const m = (window as any).monaco;\n if (m) {\n registerJsonataLanguage(m);\n this.languageRegistered = true;\n jsonataCompletionData.variables = this.contextVariables || {};\n jsonataCompletionData.functions = this.functions;\n }\n }\n\n private validateExpression(value: string): void {\n if (!value || !value.trim()) {\n this.error = null;\n this.validChange.emit(true);\n return;\n }\n try {\n jsonata(value);\n this.error = null;\n this.validChange.emit(true);\n } catch (e: any) {\n this.error = e.message || 'Invalid expression';\n this.validChange.emit(false);\n }\n }\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport { Component, Input, OnChanges, SimpleChanges } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PluginTranslatePipeModule } from '@valtimo/plugin';\nimport { TemplateField } from '../../models';\n\n@Component({\n selector: 'epistola-expected-structure',\n standalone: true,\n imports: [CommonModule, PluginTranslatePipeModule],\n template: `\n <div class=\"expected\">\n <div class=\"expected__header\">\n {{ 'expectedStructure' | pluginTranslate: 'epistola' | async }}\n </div>\n <div *ngIf=\"!templateFields || templateFields.length === 0\" class=\"expected__empty\">\n {{ 'expectedStructureLoading' | pluginTranslate: 'epistola' | async }}\n </div>\n <pre *ngIf=\"templateFields && templateFields.length > 0\" class=\"expected__code\">{{\n structureText\n }}</pre>\n </div>\n `,\n styles: [\n `\n .expected {\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n overflow: hidden;\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n .expected__header {\n padding: 6px 12px;\n background: #f4f4f4;\n border-bottom: 1px solid #e0e0e0;\n font-size: 0.75em;\n color: #6f6f6f;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n .expected__code {\n flex: 1;\n font-family: 'IBM Plex Mono', monospace;\n font-size: 0.8em;\n line-height: 1.5;\n margin: 0;\n padding: 8px 12px;\n white-space: pre-wrap;\n overflow-y: auto;\n }\n .expected__empty {\n padding: 8px 12px;\n color: #8d8d8d;\n font-size: 0.85em;\n font-style: italic;\n }\n `,\n ],\n})\nexport class ExpectedStructureComponent implements OnChanges {\n @Input() templateFields: TemplateField[] = [];\n\n structureText: string = '{}';\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['templateFields']) {\n this.structureText = this.buildStructure(this.templateFields, 0);\n }\n }\n\n private buildStructure(fields: TemplateField[], depth: number): string {\n if (!fields || fields.length === 0) return '{}';\n const indent = ' '.repeat(depth + 1);\n const closing = ' '.repeat(depth);\n\n const lines = fields.map((f) => {\n const req = f.required ? ' (required)' : '';\n if (f.fieldType === 'OBJECT' && f.children?.length) {\n const nested = this.buildStructure(f.children, depth + 1);\n return `${indent}\"${f.name}\": ${nested}${req}`;\n }\n if (f.fieldType === 'ARRAY') {\n if (f.children?.length) {\n const itemStructure = this.buildStructure(f.children, depth + 2);\n return `${indent}\"${f.name}\": [${itemStructure}]${req}`;\n }\n return `${indent}\"${f.name}\": array${req}`;\n }\n return `${indent}\"${f.name}\": ${f.type || 'any'}${req}`;\n });\n\n return `{\\n${lines.join(',\\n')}\\n${closing}}`;\n }\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { BuilderField } from '../../../utils/jsonata-converter';\n\n@Component({\n selector: 'epistola-builder-field',\n standalone: true,\n imports: [CommonModule, FormsModule],\n template: `\n <div class=\"builder-field\">\n <div\n class=\"builder-field__name\"\n [class.builder-field__name--clickable]=\"field.children\"\n (click)=\"field.children && collapseToggle.emit(path)\"\n >\n <span *ngIf=\"field.children\" class=\"builder-field__chevron\">{{\n collapsed ? '▶' : '▼'\n }}</span>\n <span class=\"builder-field__label\">{{ field.name }}</span>\n <span *ngIf=\"required\" class=\"builder-field__required\">*</span>\n <span *ngIf=\"field.children\" class=\"builder-field__type\">(object)</span>\n </div>\n\n <div class=\"builder-field__value\" *ngIf=\"!field.children\">\n <input\n *ngIf=\"field.mode === 'ref'\"\n type=\"text\"\n class=\"builder-field__input\"\n [ngModel]=\"field.value\"\n (ngModelChange)=\"valueChange.emit({ path: path, value: $event })\"\n [disabled]=\"disabled\"\n placeholder=\"$doc.path.to.field\"\n [attr.list]=\"'suggestions-' + path.join('-')\"\n />\n <datalist *ngIf=\"field.mode === 'ref'\" [id]=\"'suggestions-' + path.join('-')\">\n <option *ngFor=\"let s of suggestions\" [value]=\"s\"></option>\n </datalist>\n <input\n *ngIf=\"field.mode === 'raw'\"\n type=\"text\"\n class=\"builder-field__input builder-field__input--raw\"\n [ngModel]=\"field.value\"\n (ngModelChange)=\"valueChange.emit({ path: path, value: $event })\"\n [disabled]=\"disabled\"\n placeholder=\"JSONata expression\"\n />\n <button\n class=\"builder-field__mode-toggle\"\n (click)=\"modeToggle.emit(path)\"\n [disabled]=\"disabled\"\n [title]=\"field.mode === 'ref' ? 'Switch to raw JSONata' : 'Switch to reference'\"\n >\n {{ field.mode === 'ref' ? 'fx' : '·' }}\n </button>\n </div>\n\n <div *ngIf=\"field.children && !collapsed\" class=\"builder-field__children\">\n <epistola-builder-field\n *ngFor=\"let child of field.children; let j = index\"\n [field]=\"child\"\n [path]=\"path.concat(j)\"\n [suggestions]=\"suggestions\"\n [disabled]=\"disabled\"\n [collapsed]=\"isChildCollapsed(j)\"\n [collapsedPaths]=\"collapsedPaths\"\n [required]=\"false\"\n (valueChange)=\"valueChange.emit($event)\"\n (modeToggle)=\"modeToggle.emit($event)\"\n (collapseToggle)=\"collapseToggle.emit($event)\"\n ></epistola-builder-field>\n </div>\n </div>\n `,\n styles: [\n `\n .builder-field {\n margin-bottom: 4px;\n }\n .builder-field__name {\n margin-bottom: 2px;\n }\n .builder-field__name--clickable {\n cursor: pointer;\n user-select: none;\n }\n .builder-field__name--clickable:hover {\n color: #0f62fe;\n }\n .builder-field__chevron {\n font-size: 0.7em;\n margin-right: 4px;\n }\n .builder-field__label {\n font-weight: 500;\n font-size: 0.9em;\n }\n .builder-field__required {\n color: #da1e28;\n margin-left: 2px;\n }\n .builder-field__type {\n color: #8d8d8d;\n font-size: 0.8em;\n margin-left: 4px;\n }\n .builder-field__value {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n .builder-field__input {\n flex: 1;\n padding: 6px 8px;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n font-size: 0.85em;\n font-family: 'IBM Plex Mono', monospace;\n }\n .builder-field__input:focus {\n outline: 2px solid #0f62fe;\n border-color: #0f62fe;\n }\n .builder-field__input--raw {\n background: #f4f4f4;\n }\n .builder-field__mode-toggle {\n width: 28px;\n height: 28px;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n background: #fff;\n cursor: pointer;\n font-family: monospace;\n font-size: 0.8em;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .builder-field__mode-toggle:hover {\n background: #f4f4f4;\n }\n .builder-field__children {\n border-left: 2px solid #e0e0e0;\n padding-left: 12px;\n margin-top: 4px;\n }\n `,\n ],\n})\nexport class BuilderFieldComponent {\n @Input() field!: BuilderField;\n @Input() path: number[] = [];\n @Input() suggestions: string[] = [];\n @Input() disabled = false;\n @Input() collapsed = false;\n @Input() required = false;\n @Input() collapsedPaths: Set<string> = new Set();\n @Output() valueChange = new EventEmitter<{ path: number[]; value: string }>();\n @Output() modeToggle = new EventEmitter<number[]>();\n @Output() collapseToggle = new EventEmitter<number[]>();\n\n isChildCollapsed(childIndex: number): boolean {\n return this.collapsedPaths.has(this.path.concat(childIndex).join('.'));\n }\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport * as _jsonata from 'jsonata';\nconst jsonata = (_jsonata as any).default || _jsonata;\n\n/**\n * Represents a field in the visual builder.\n * - mode 'ref': a simple $doc/$pv/$case path reference\n * - mode 'raw': raw JSONata text the builder can't represent visually\n */\nexport interface BuilderField {\n name: string;\n mode: 'ref' | 'raw';\n value: string;\n children?: BuilderField[];\n}\n\n/**\n * Parse a JSONata expression into BuilderField array.\n * Only supports top-level object literals with simple path references or nested objects.\n * Anything else is stored as raw JSONata text.\n */\nexport function parseJsonataToBuilder(expression: string): BuilderField[] {\n if (!expression || !expression.trim()) {\n return [];\n }\n\n try {\n const ast = (jsonata(expression) as any).ast();\n if (ast.type === 'unary' && ast.value === '{') {\n return parseObjectEntries(ast.lhs, expression);\n }\n // Not a top-level object — can't represent in builder\n return [{ name: '_root', mode: 'raw', value: expression }];\n } catch {\n // Invalid JSONata — return as single raw field\n return [{ name: '_root', mode: 'raw', value: expression }];\n }\n}\n\n/**\n * Convert BuilderField array back to a JSONata expression string.\n */\nexport function builderToJsonata(fields: BuilderField[]): string {\n if (fields.length === 0) {\n return '';\n }\n // Special case: single _root raw field means the whole expression is raw\n if (fields.length === 1 && fields[0].name === '_root' && fields[0].mode === 'raw') {\n return fields[0].value;\n }\n\n const entries = fields.map((field) => formatFieldEntry(field)).filter(Boolean);\n return `{\\n${entries.join(',\\n')}\\n}`;\n}\n\n/**\n * Check if a JSONata expression can be fully represented by the builder\n * (i.e., all fields are simple refs or nested objects of simple refs).\n */\nexport function isBuilderCompatible(expression: string): boolean {\n const fields = parseJsonataToBuilder(expression);\n return fields.every((f) => f.mode === 'ref' || (f.children && f.children.every(isFieldSimple)));\n}\n\nfunction isFieldSimple(field: BuilderField): boolean {\n if (field.mode === 'raw') return false;\n if (field.children) return field.children.every(isFieldSimple);\n return true;\n}\n\nfunction parseObjectEntries(entries: any[][], source: string): BuilderField[] {\n return entries.map(([keyNode, valueNode]) => {\n const name = keyNode.value as string;\n return classifyValue(name, valueNode, source);\n });\n}\n\nfunction classifyValue(name: string, node: any, source: string): BuilderField {\n // Simple path reference: $doc.x.y, $pv.x, $case.x — store as JSONata directly\n if (node.type === 'path' && node.steps?.length > 0 && node.steps[0].type === 'variable') {\n const varName = node.steps[0].value; // doc, pv, case\n if (['doc', 'pv', 'case'].includes(varName)) {\n const path = node.steps\n .slice(1)\n .map((s: any) => s.value)\n .join('.');\n return { name, mode: 'ref', value: `$${varName}.${path}` };\n }\n }\n\n // String literal\n if (node.type === 'string') {\n return { name, mode: 'ref', value: `\"${node.value}\"` };\n }\n\n // Number literal\n if (node.type === 'number') {\n return { name, mode: 'ref', value: String(node.value) };\n }\n\n // Boolean literal (value node)\n if (node.type === 'value' && typeof node.value === 'boolean') {\n return { name, mode: 'ref', value: String(node.value) };\n }\n\n // Nested object\n if (node.type === 'unary' && node.value === '{' && node.lhs) {\n const children = parseObjectEntries(node.lhs, source);\n return { name, mode: 'ref', value: '', children };\n }\n\n // Anything else: extract raw source text\n const raw = extractSourceFragment(node, source);\n return { name, mode: 'raw', value: raw };\n}\n\n/**\n * Extract the source text for a node using position info.\n * Falls back to a generic representation if positions aren't useful.\n */\nfunction extractSourceFragment(node: any, source: string): string {\n // Try to reconstruct from AST for common patterns\n if (node.type === 'condition') {\n const cond = reconstructExpression(node.condition);\n const then = reconstructExpression(node.then);\n const els = reconstructExpression(node.else);\n return `${cond} ? ${then} : ${els}`;\n }\n if (node.type === 'binary') {\n const left = reconstructExpression(node.lhs);\n const right = reconstructExpression(node.rhs);\n return `${left} ${node.value} ${right}`;\n }\n if (node.type === 'function') {\n const name = reconstructExpression(node.procedure);\n const args = (node.arguments || []).map(reconstructExpression).join(', ');\n return `${name}(${args})`;\n }\n // Generic fallback\n return reconstructExpression(node);\n}\n\nfunction reconstructExpression(node: any): string {\n if (!node) return '';\n if (node.type === 'string') return `\"${node.value}\"`;\n if (node.type === 'number') return String(node.value);\n if (node.type === 'value') return String(node.value);\n if (node.type === 'path' && node.steps) {\n return node.steps.map((s: any) => (s.type === 'variable' ? `$${s.value}` : s.value)).join('.');\n }\n if (node.type === 'binary') {\n return `${reconstructExpression(node.lhs)} ${node.value} ${reconstructExpression(node.rhs)}`;\n }\n if (node.type === 'condition') {\n return `${reconstructExpression(node.condition)} ? ${reconstructExpression(node.then)} : ${reconstructExpression(node.else)}`;\n }\n if (node.type === 'function') {\n const proc = reconstructExpression(node.procedure);\n const args = (node.arguments || []).map(reconstructExpression).join(', ');\n return `${proc}(${args})`;\n }\n if (node.type === 'unary' && node.value === '{') {\n const entries = (node.lhs || [])\n .map(([k, v]: any[]) => `\"${k.value}\": ${reconstructExpression(v)}`)\n .join(', ');\n return `{${entries}}`;\n }\n return '...';\n}\n\nfunction formatFieldEntry(field: BuilderField, indent: string = ' '): string {\n if (field.children && field.children.length > 0) {\n const childEntries = field.children.map((c) => formatFieldEntry(c, indent + ' ')).join(',\\n');\n return `${indent}\"${field.name}\": {\\n${childEntries}\\n${indent}}`;\n }\n\n // Value is already valid JSONata (e.g. $doc.x.y, \"string\", 42, or raw expression)\n const value = field.value || 'null';\n return `${indent}\"${field.name}\": ${value}`;\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { PluginTranslatePipeModule } from '@valtimo/plugin';\nimport { TemplateField, VariableSuggestions } from '../../models';\nimport { BuilderFieldComponent } from './builder-field/builder-field.component';\nimport {\n BuilderField,\n builderToJsonata,\n parseJsonataToBuilder,\n} from '../../utils/jsonata-converter';\n\n@Component({\n selector: 'epistola-mapping-builder',\n standalone: true,\n imports: [CommonModule, FormsModule, PluginTranslatePipeModule, BuilderFieldComponent],\n template: `\n <div class=\"mapping-builder\">\n <div\n *ngIf=\"fields.length === 0 && (!templateFields || templateFields.length === 0)\"\n class=\"mapping-builder__empty\"\n >\n {{ 'noTemplateFields' | pluginTranslate: 'epistola' | async }}\n </div>\n\n <epistola-builder-field\n *ngFor=\"let field of fields; let i = index\"\n [field]=\"field\"\n [path]=\"[i]\"\n [suggestions]=\"allSuggestions\"\n [disabled]=\"disabled\"\n [collapsed]=\"isCollapsed([i])\"\n [collapsedPaths]=\"collapsedPaths\"\n [required]=\"isRequired(field.name)\"\n (valueChange)=\"onNestedValueChange($event.path, $event.value)\"\n (modeToggle)=\"onNestedModeToggle($event)\"\n (collapseToggle)=\"toggleCollapse($event)\"\n ></epistola-builder-field>\n </div>\n `,\n styles: [\n `\n .mapping-builder__empty {\n color: #6f6f6f;\n font-size: 0.9em;\n padding: 12px 0;\n }\n .mapping-builder__row {\n margin-bottom: 8px;\n }\n .mapping-builder__row--child {\n margin-left: 20px;\n margin-bottom: 4px;\n }\n .mapping-builder__name {\n margin-bottom: 2px;\n }\n .mapping-builder__name--clickable {\n cursor: pointer;\n user-select: none;\n }\n .mapping-builder__name--clickable:hover {\n color: #0f62fe;\n }\n .mapping-builder__chevron {\n font-size: 0.7em;\n margin-right: 4px;\n }\n .mapping-builder__field-name {\n font-weight: 500;\n font-size: 0.9em;\n }\n .mapping-builder__required {\n color: #da1e28;\n margin-left: 2px;\n }\n .mapping-builder__type {\n color: #8d8d8d;\n font-size: 0.8em;\n margin-left: 4px;\n }\n .mapping-builder__value {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n .mapping-builder__input {\n flex: 1;\n padding: 6px 8px;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n font-size: 0.85em;\n font-family: 'IBM Plex Mono', monospace;\n }\n .mapping-builder__input:focus {\n outline: 2px solid #0f62fe;\n border-color: #0f62fe;\n }\n .mapping-builder__input--raw {\n background: #f4f4f4;\n }\n .mapping-builder__mode-toggle {\n width: 28px;\n height: 28px;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n background: #fff;\n cursor: pointer;\n font-family: monospace;\n font-size: 0.8em;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .mapping-builder__mode-toggle:hover {\n background: #f4f4f4;\n }\n .mapping-builder__children {\n border-left: 2px solid #e0e0e0;\n padding-left: 12px;\n margin-top: 4px;\n }\n `,\n ],\n})\nexport class MappingBuilderComponent implements OnChanges {\n @Input() expression: string = '';\n @Input() templateFields: TemplateField[] = [];\n @Input() suggestions: VariableSuggestions | null = null;\n @Input() disabled: boolean = false;\n @Output() expressionChange = new EventEmitter<string>();\n\n fields: BuilderField[] = [];\n allSuggestions: string[] = [];\n collapsedPaths = new Set<string>();\n private initialCollapseApplied = false;\n\n ngOnChanges(changes: SimpleChanges): void {\n // Skip re-parse only when expression alone changed (from our own emit)\n const expressionChanged = !!changes['expression'];\n const templateFieldsChanged = !!changes['templateFields'];\n\n if (expressionChanged && !templateFieldsChanged && !changes['expression'].firstChange) {\n return; // Don't re-parse when we emit changes ourselves\n }\n if (expressionChanged || templateFieldsChanged) {\n this.rebuildFields();\n if (!this.initialCollapseApplied && this.fields.length > 0) {\n this.collapseAll();\n this.initialCollapseApplied = true;\n }\n }\n if (changes['suggestions']) {\n this.buildSuggestionList();\n }\n }\n\n onNestedValueChange(path: number[], value: string): void {\n const field = this.getFieldAtPath(path);\n if (field) {\n field.value = value;\n this.emit();\n }\n }\n\n onNestedModeToggle(path: number[]): void {\n const field = this.getFieldAtPath(path);\n if (field) {\n field.mode = field.mode === 'ref' ? 'raw' : 'ref';\n this.emit();\n }\n }\n\n isRequired(fieldName: string): boolean {\n return this.templateFields?.find((tf) => tf.name === fieldName)?.required ?? false;\n }\n\n isCollapsed(path: number[]): boolean {\n return this.collapsedPaths.has(path.join('.'));\n }\n\n toggleCollapse(path: number[]): void {\n const key = path.join('.');\n if (this.collapsedPaths.has(key)) {\n this.collapsedPaths.delete(key);\n } else {\n this.collapsedPaths.add(key);\n }\n }\n\n private collapseAll(): void {\n this.collapsedPaths.clear();\n this.fields.forEach((field, i) => {\n if (field.children) {\n this.collapsedPaths.add(String(i));\n this.collapseChildren(field.children, [i]);\n }\n });\n }\n\n private collapseChildren(children: BuilderField[], parentPath: number[]): void {\n children.forEach((child, j) => {\n if (child.children) {\n this.collapsedPaths.add([...parentPath, j].join('.'));\n this.collapseChildren(child.children, [...parentPath, j]);\n }\n });\n }\n\n private getFieldAtPath(path: number[]): BuilderField | null {\n if (path.length === 0) return null;\n let current: BuilderField = this.fields[path[0]];\n for (let i = 1; i < path.length; i++) {\n if (!current.children) return null;\n current = current.children[path[i]];\n }\n return current;\n }\n\n private emit(): void {\n const jsonata = builderToJsonata(this.fields);\n this.expressionChange.emit(jsonata);\n }\n\n /**\n * Ensure all template fields have a corresponding builder field.\n * Adds missing fields with empty values.\n */\n private buildSuggestionList(): void {\n if (!this.suggestions) {\n this.allSuggestions = [];\n return;\n }\n const docSuggestions = (this.suggestions.doc || []).map((p) => `$doc.${p}`);\n const pvSuggestions = (this.suggestions.pv || []).map((p) => `$pv.${p}`);\n this.allSuggestions = [...docSuggestions, ...pvSuggestions];\n }\n\n /**\n * Rebuild fields using template fields as the source of truth.\n * Expression values fill in where available; unmapped fields show empty.\n */\n private rebuildFields(): void {\n const parsed = parseJsonataToBuilder(this.expression);\n const parsedByName = new Map(parsed.map((f) => [f.name, f]));\n\n if (!this.templateFields || this.templateFields.length === 0) {\n // No template fields yet — use whatever we parsed\n this.fields = parsed;\n return;\n }\n\n // Template fields drive the structure\n this.fields = this.templateFields.map((tf) => {\n const existing = parsedByName.get(tf.name);\n if (existing) {\n return existing;\n }\n if (tf.fieldType === 'OBJECT' && tf.children?.length) {\n return {\n name: tf.name,\n mode: 'ref' as const,\n value: '',\n children: tf.children.map((c) => ({ name: c.name, mode: 'ref' as const, value: '' })),\n };\n }\n return { name: tf.name, mode: 'ref' as const, value: '' };\n });\n\n // Include extra fields from expression not in the template schema\n for (const p of parsed) {\n if (!this.templateFields.find((tf) => tf.name === p.name)) {\n this.fields.push(p);\n }\n }\n }\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport {\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { PluginTranslatePipeModule } from '@valtimo/plugin';\nimport { Subject, debounceTime, takeUntil } from 'rxjs';\nimport { EvaluationResult, TemplateField } from '../../models';\nimport { EpistolaPluginService } from '../../services';\n\n@Component({\n selector: 'epistola-mapping-preview',\n standalone: true,\n imports: [CommonModule, FormsModule, PluginTranslatePipeModule],\n template: `\n <div class=\"preview\">\n <div class=\"preview__header\">\n <span class=\"preview__title\">{{\n 'previewTitle' | pluginTranslate: 'epistola' | async\n }}</span>\n <div class=\"preview__controls\">\n <input\n type=\"text\"\n class=\"preview__doc-input\"\n [ngModel]=\"documentId\"\n (ngModelChange)=\"documentId = $event\"\n [placeholder]=\"'previewDocPlaceholder' | pluginTranslate: 'epistola' | async\"\n />\n <button\n class=\"preview__run-btn\"\n (click)=\"runPreview()\"\n [disabled]=\"!documentId || !expression || loading\"\n >\n ▶\n </button>\n </div>\n </div>\n\n <div class=\"preview__panels\">\n <!-- Expected structure -->\n <div class=\"preview__panel\">\n <div class=\"preview__panel-label\">\n {{ 'previewExpected' | pluginTranslate: 'epistola' | async }}\n </div>\n <pre class=\"preview__code\">{{ expectedJson }}</pre>\n </div>\n\n <!-- Produced output -->\n <div class=\"preview__panel\">\n <div class=\"preview__panel-label\">\n {{ 'previewProduced' | pluginTranslate: 'epistola' | async }}\n </div>\n <div *ngIf=\"loading\" class=\"preview__loading\">...</div>\n <pre *ngIf=\"!loading && result?.success\" class=\"preview__code\">{{\n result.result | json\n }}</pre>\n <div *ngIf=\"!loading && result && !result.success\" class=\"preview__error\">\n {{ result.error }}\n </div>\n <div *ngIf=\"!loading && !result\" class=\"preview__placeholder\">\n {{ 'previewRunHint' | pluginTranslate: 'epistola' | async }}\n </div>\n </div>\n </div>\n\n <!-- Missing fields warning -->\n <div *ngIf=\"missingRequired.length > 0\" class=\"preview__warnings\">\n <span class=\"preview__warning-icon\">⚠</span>\n {{ 'previewMissing' | pluginTranslate: 'epistola' | async }}:\n <strong>{{ missingRequired.join(', ') }}</strong>\n </div>\n </div>\n `,\n styles: [\n `\n .preview {\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n margin-top: 16px;\n overflow: hidden;\n }\n .preview__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n background: #f4f4f4;\n border-bottom: 1px solid #e0e0e0;\n }\n .preview__title {\n font-weight: 600;\n font-size: 0.85em;\n }\n .preview__controls {\n display: flex;\n gap: 4px;\n }\n .preview__doc-input {\n padding: 4px 8px;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n font-size: 0.8em;\n width: 220px;\n font-family: monospace;\n }\n .preview__run-btn {\n padding: 4px 10px;\n border: 1px solid #0f62fe;\n border-radius: 4px;\n background: #0f62fe;\n color: white;\n cursor: pointer;\n font-size: 0.8em;\n }\n .preview__run-btn:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n .preview__panels {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1px;\n background: #e0e0e0;\n }\n .preview__panel {\n background: white;\n padding: 8px 12px;\n min-height: 80px;\n }\n .preview__panel-label {\n font-size: 0.75em;\n color: #6f6f6f;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 4px;\n }\n .preview__code {\n font-family: 'IBM Plex Mono', monospace;\n font-size: 0.8em;\n line-height: 1.4;\n margin: 0;\n white-space: pre-wrap;\n word-break: break-word;\n }\n .preview__loading {\n color: #8d8d8d;\n }\n .preview__error {\n color: #da1e28;\n font-size: 0.85em;\n }\n .preview__placeholder {\n color: #8d8d8d;\n font-size: 0.85em;\n font-style: italic;\n }\n .preview__warnings {\n padding: 8px 12px;\n background: #fff8e1;\n border-top: 1px solid #e0e0e0;\n font-size: 0.85em;\n color: #663c00;\n }\n .preview__warning-icon {\n margin-right: 4px;\n }\n `,\n ],\n})\nexport class MappingPreviewComponent implements OnChanges, OnDestroy {\n @Input() expression: string = '';\n @Input() templateFields: TemplateField[] = [];\n @Input() caseDefinitionKey: string | null = null;\n\n documentId: string = '';\n loading = false;\n result: EvaluationResult | null = null;\n expectedJson: string = '';\n missingRequired: string[] = [];\n\n private destroy$ = new Subject<void>();\n private evaluate$ = new Subject<void>();\n\n constructor(private readonly epistolaPluginService: EpistolaPluginService) {\n this.evaluate$.pipe(debounceTime(300), takeUntil(this.destroy$)).subscribe(() => {\n this.doEvaluate();\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['templateFields']) {\n this.expectedJson = this.buildExpectedJson();\n }\n if (changes['expression'] || changes['templateFields']) {\n this.checkMissingRequired();\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n runPreview(): void {\n this.evaluate$.next();\n }\n\n private doEvaluate(): void {\n if (!this.documentId || !this.expression) return;\n this.loading = true;\n this.epistolaPluginService.evaluateMapping(this.expression, this.documentId).subscribe({\n next: (result) => {\n this.result = result;\n this.loading = false;\n if (result.success) {\n this.checkMissingRequired();\n }\n },\n error: (err) => {\n this.result = { success: false, result: null, error: err.message || 'Request failed' };\n this.loading = false;\n },\n });\n }\n\n private buildExpectedJson(): string {\n if (!this.templateFields || this.templateFields.length === 0) return '{}';\n const obj: Record<string, string> = {};\n for (const field of this.templateFields) {\n const type = field.type || 'any';\n obj[field.name] = field.required ? `${type} (required)` : type;\n }\n return JSON.stringify(obj, null, 2);\n }\n\n private checkMissingRequired(): void {\n if (!this.templateFields) {\n this.missingRequired = [];\n return;\n }\n const requiredFields = this.templateFields.filter((f) => f.required).map((f) => f.name);\n if (!this.result?.success || !this.result.result) {\n // If no evaluation result yet, check statically from expression\n this.missingRequired = requiredFields;\n return;\n }\n const producedKeys = new Set(Object.keys(this.result.result));\n this.missingRequired = requiredFields.filter((f) => !producedKeys.has(f));\n }\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport * as _jsonata from 'jsonata';\nconst jsonata = (_jsonata as any).default || _jsonata;\n\n/**\n * A single row in the override builder's simple table: a form field feeding a\n * `doc`/`pv` input path during preview.\n */\nexport interface OverrideRow {\n scope: 'doc' | 'pv';\n inputPath: string;\n formFieldKey: string;\n}\n\nconst BARE_IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n/**\n * Render a `$form` reference for a form-field key. Keys that aren't bare\n * identifiers (e.g. `pv:motivation`) are backtick-quoted so JSONata treats the\n * whole key as a single property name — matching the old flat `formData[key]`\n * lookup rather than a nested path traversal.\n */\nfunction formRef(key: string): string {\n return BARE_IDENTIFIER.test(key) ? `$form.${key}` : '$form.`' + key + '`';\n}\n\n/** Branch node = nested object; leaf = a JSONata expression string. */\ntype Tree = { [segment: string]: string | Tree };\n\nfunction insert(tree: Tree, segments: string[], leaf: string): void {\n let node = tree;\n for (let i = 0; i < segments.length - 1; i++) {\n const seg = segments[i];\n if (typeof node[seg] !== 'object') {\n node[seg] = {};\n }\n node = node[seg] as Tree;\n }\n node[segments[segments.length - 1]] = leaf;\n}\n\nfunction emit(node: Tree | string, indent: string): string {\n if (typeof node === 'string') {\n return node;\n }\n const inner = indent + ' ';\n const entries = Object.entries(node).map(\n ([key, value]) => `${inner}\"${key}\": ${emit(value, inner)}`,\n );\n return `{\\n${entries.join(',\\n')}\\n${indent}}`;\n}\n\n/**\n * Serialize simple-table rows into a JSONata expression that maps `$form` onto\n * a `{ doc, pv }` overlay. Dot-notation input paths expand into nested object\n * literals (so `beslissing.tekst` becomes `{ \"beslissing\": { \"tekst\": ... } }`),\n * preserving the legacy override semantics.\n */\nexport function serializeOverrideRows(rows: OverrideRow[]): string {\n const scopes: Tree = {};\n for (const row of rows) {\n if (!row.inputPath || !row.formFieldKey) continue;\n if (row.scope !== 'doc' && row.scope !== 'pv') continue;\n if (typeof scopes[row.scope] !== 'object') {\n scopes[row.scope] = {};\n }\n insert(scopes[row.scope] as Tree, row.inputPath.split('.'), formRef(row.formFieldKey));\n }\n if (Object.keys(scopes).length === 0) {\n return '';\n }\n return emit(scopes, '');\n}\n\n/**\n * Parse a JSONata override expression back into simple-table rows, or `null`\n * when the expression is richer than the simple table can represent (anything\n * beyond `doc`/`pv` objects whose leaves are plain `$form.<key>` references).\n * A `null` result is the builder's signal to fall back to advanced mode.\n */\nexport function parseOverrideJsonata(expression: string): OverrideRow[] | null {\n if (!expression || !expression.trim()) {\n return [];\n }\n let ast: any;\n try {\n ast = (jsonata(expression) as any).ast();\n } catch {\n return null;\n }\n if (!(ast?.type === 'unary' && ast.value === '{')) {\n return null;\n }\n const rows: OverrideRow[] = [];\n for (const entry of ast.lhs || []) {\n const scope = entry?.[0]?.value;\n const valueNode = entry?.[1];\n if (scope !== 'doc' && scope !== 'pv') {\n return null;\n }\n if (!(valueNode?.type === 'unary' && valueNode.value === '{')) {\n return null;\n }\n if (!collectLeaves(valueNode.lhs || [], [], scope, rows)) {\n return null;\n }\n }\n return rows;\n}\n\nfunction collectLeaves(\n entries: any[][],\n prefix: string[],\n scope: 'doc' | 'pv',\n rows: OverrideRow[],\n): boolean {\n for (const [keyNode, valueNode] of entries) {\n const segment = keyNode?.value;\n if (typeof segment !== 'string') {\n return false;\n }\n const path = [...prefix, segment];\n if (valueNode?.type === 'unary' && valueNode.value === '{') {\n if (!collectLeaves(valueNode.lhs || [], path, scope, rows)) {\n return false;\n }\n } else {\n const formFieldKey = formKeyOf(valueNode);\n if (formFieldKey === null) {\n return false;\n }\n rows.push({ scope, inputPath: path.join('.'), formFieldKey });\n }\n }\n return true;\n}\n\n/** Extract the form-field key from a `$form.<key>` path node, or null. */\nfunction formKeyOf(node: any): string | null {\n if (\n node?.type === 'path' &&\n node.steps?.length === 2 &&\n node.steps[0].type === 'variable' &&\n node.steps[0].value === 'form' &&\n typeof node.steps[1]?.value === 'string'\n ) {\n return node.steps[1].value;\n }\n return null;\n}\n\n/** Whether the expression can be edited in the simple table (round-trippable). */\nexport function isRoundTrippable(expression: string): boolean {\n return parseOverrideJsonata(expression) !== null;\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport { OverrideRow, serializeOverrideRows } from './override-jsonata';\n\n/**\n * Prefix that marked a form-field reference in the legacy override-mapping\n * object format (e.g. `\"form:motivationField\"`).\n */\nexport const FORM_REF_PREFIX = 'form:';\n\n/**\n * Whether a stored override-mapping value is in the legacy **object** format\n * (`{ scope: { inputPath: \"form:fieldKey\" } }`) rather than the new JSONata\n * **string** format.\n */\nexport function isLegacyOverrideMapping(value: unknown): value is Record<string, any> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * TEMPORARY migration shim.\n *\n * Converts a legacy override-mapping object into the equivalent JSONata string\n * over `$form`. Funnelling every legacy value through this one function keeps\n * the rest of the codebase JSONata-only.\n *\n * @deprecated Remove once all deployed forms have been re-saved in the JSONata\n * format. The admin page's \"legacy override format\" warning tracks which\n * forms still need migrating.\n */\nexport function legacyOverrideToJsonata(mapping: Record<string, any>): string {\n const rows: OverrideRow[] = [];\n for (const [scope, fields] of Object.entries(mapping || {})) {\n if (scope !== 'doc' && scope !== 'pv') continue;\n if (!fields || typeof fields !== 'object') continue;\n for (const [inputPath, ref] of Object.entries(fields as Record<string, unknown>)) {\n const raw = String(ref);\n const formFieldKey = raw.startsWith(FORM_REF_PREFIX)\n ? raw.substring(FORM_REF_PREFIX.length)\n : raw;\n rows.push({ scope, inputPath, formFieldKey });\n }\n }\n return serializeOverrideRows(rows);\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport * as _jsonata from 'jsonata';\nimport {\n isLegacyOverrideMapping,\n legacyOverrideToJsonata,\n} from '../override-builder/legacy-override-converter';\n\nconst jsonata = (_jsonata as any).default || _jsonata;\n\n/** Re-exported for backward compatibility with existing imports/tests. */\nexport { FORM_REF_PREFIX } from '../override-builder/legacy-override-converter';\n\n/**\n * An override mapping is either the new JSONata expression **string** (over\n * `$form`) or — for not-yet-re-saved forms — the legacy `form:`-ref **object**.\n */\nexport type OverrideMappingValue = string | Record<string, any> | null | undefined;\n\n/**\n * Detect if a string value is a JSONata expression (vs a plain literal).\n * Checks for characters that indicate JSONata operators: $, &, (, {, ?, [\n */\nexport function isExpression(value: string): boolean {\n return /[$&({?\\[]/.test(value);\n}\n\n/**\n * Expand dot-notation keys into nested objects.\n * e.g. { \"beslissing.tekst\": \"value\" } -> { beslissing: { tekst: \"value\" } }\n */\nexport function expandDotNotation(flat: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = {};\n for (const [key, value] of Object.entries(flat)) {\n const parts = key.split('.');\n let current = result;\n for (let i = 0; i < parts.length - 1; i++) {\n if (!current[parts[i]] || typeof current[parts[i]] !== 'object') {\n current[parts[i]] = {};\n }\n current = current[parts[i]];\n }\n current[parts[parts.length - 1]] = value;\n }\n return result;\n}\n\n/**\n * A preview is \"override-driven\" when it has a non-empty override mapping: its\n * input data comes from the form via the mapping, so it must wait for that data\n * before it can render. Previews without a mapping load straight from the base\n * doc/case data.\n */\nexport function isOverrideDriven(mapping?: OverrideMappingValue): boolean {\n if (!mapping) return false;\n if (typeof mapping === 'string') return mapping.trim().length > 0;\n return Object.keys(mapping).length > 0;\n}\n\n/**\n * Whether the computed input overrides carry any usable data yet.\n */\nexport function hasUsableOverrides(overrides?: Record<string, any> | null): boolean {\n return !!overrides && Object.keys(overrides).length > 0;\n}\n\n/**\n * Decide whether a preview request should fire given the configured override\n * mapping and the currently computed overrides.\n *\n * - Override-driven previews only load once the mapped form data is present;\n * before that they show a \"complete the form\" placeholder and fire nothing\n * (avoids a doomed request that Epistola rejects with a 400 for missing\n * required fields).\n * - Previews without a mapping always load (base data is the whole input).\n */\nexport function shouldLoadPreview(\n mapping?: OverrideMappingValue,\n overrides?: Record<string, any> | null,\n): boolean {\n if (isOverrideDriven(mapping)) {\n return hasUsableOverrides(overrides);\n }\n return true;\n}\n\n/**\n * Given an override mapping and the live form data, produce the inputOverrides\n * object (`{ doc, pv }`) the backend overlays onto the real document / process\n * variables before the data mapping runs.\n *\n * The mapping is a JSONata expression over `$form`; legacy `form:`-ref objects\n * are converted on the fly via {@link legacyOverrideToJsonata}. Evaluation is\n * asynchronous because `jsonata().evaluate()` returns a Promise. Only `doc` and\n * `pv` scopes (with at least one resolved field) are kept — matching what the\n * backend consumes.\n */\nexport async function computeInputOverrides(\n mapping: OverrideMappingValue,\n formData: Record<string, any>,\n): Promise<Record<string, any>> {\n if (!mapping) {\n return {};\n }\n const expression = isLegacyOverrideMapping(mapping)\n ? legacyOverrideToJsonata(mapping)\n : String(mapping);\n if (!expression.trim()) {\n return {};\n }\n\n let evaluated: any;\n try {\n evaluated = await jsonata(expression).evaluate({}, { form: formData ?? {} });\n } catch {\n return {};\n }\n if (!evaluated || typeof evaluated !== 'object' || Array.isArray(evaluated)) {\n return {};\n }\n\n const result: Record<string, any> = {};\n for (const scope of ['doc', 'pv']) {\n const value = evaluated[scope];\n if (value && typeof value === 'object' && Object.keys(value).length > 0) {\n result[scope] = value;\n }\n }\n return result;\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport {\n FunctionConfigurationComponent,\n FunctionConfigurationData,\n PluginConfigurationData,\n PluginTranslatePipeModule,\n} from '@valtimo/plugin';\nimport {\n FormModule,\n FormOutput,\n InputModule,\n SelectedValue,\n SelectItem,\n SelectModule,\n} from '@valtimo/components';\nimport { CaseManagementParams, ManagementContext } from '@valtimo/shared';\nimport { ProcessLinkStateService } from '@valtimo/process-link';\nimport { BehaviorSubject, combineLatest, merge, Observable, of, Subject, Subscription } from 'rxjs';\nimport {\n catchError,\n distinctUntilChanged,\n filter,\n map,\n shareReplay,\n switchMap,\n take,\n takeUntil,\n tap,\n} from 'rxjs/operators';\nimport {\n AsyncResource,\n errorResource,\n ExpressionFunctionInfo,\n GenerateDocumentConfig,\n initialResource,\n JsonataFieldError,\n loadingResource,\n successResource,\n TemplateField,\n ValidateJsonataRequest,\n VariableSuggestions,\n} from '../../models';\nimport { EpistolaPluginService } from '../../services';\nimport { JsonataEditorComponent } from '../jsonata-editor/jsonata-editor.component';\nimport { ExpectedStructureComponent } from '../expected-structure/expected-structure.component';\nimport { MappingBuilderComponent } from '../mapping-builder/mapping-builder.component';\nimport { MappingPreviewComponent } from '../mapping-preview/mapping-preview.component';\nimport { isExpression } from '../epistola-document-preview/preview-utils';\n\nexport type VariantSelectionMode = 'explicit' | 'attributes';\n\n@Component({\n selector: 'epistola-generate-document-configuration',\n templateUrl: './generate-document-configuration.component.html',\n styleUrls: ['./generate-document-configuration.component.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n FormsModule,\n PluginTranslatePipeModule,\n FormModule,\n InputModule,\n SelectModule,\n ExpectedStructureComponent,\n JsonataEditorComponent,\n MappingBuilderComponent,\n MappingPreviewComponent,\n ],\n})\nexport class GenerateDocumentConfigurationComponent\n implements FunctionConfigurationComponent, OnInit, OnDestroy\n{\n @Input() save$!: Observable<void>;\n @Input() disabled$!: Observable<boolean>;\n @Input() pluginId!: string;\n @Input() prefillConfiguration$!: Observable<GenerateDocumentConfig>;\n @Input() selectedPluginConfigurationData$?: Observable<PluginConfigurationData>;\n @Input() context$?: Observable<[ManagementContext, CaseManagementParams]>;\n\n @Output() valid: EventEmitter<boolean> = new EventEmitter<boolean>();\n // Framework's FunctionConfigurationData (index type) to satisfy the invariant\n // EventEmitter contract under strict mode; emitted values remain the typed config.\n @Output() configuration: EventEmitter<FunctionConfigurationData> =\n new EventEmitter<FunctionConfigurationData>();\n\n catalogs$ = new BehaviorSubject<AsyncResource<SelectItem[]>>(initialResource([]));\n templates$ = new BehaviorSubject<AsyncResource<SelectItem[]>>(initialResource([]));\n variants$ = new BehaviorSubject<AsyncResource<SelectItem[]>>(initialResource([]));\n environments$ = new BehaviorSubject<AsyncResource<SelectItem[]>>(initialResource([]));\n templateFields$ = new BehaviorSubject<AsyncResource<TemplateField[]>>(initialResource([]));\n\n dataMapping$ = new BehaviorSubject<string>('');\n mappingMode: 'simple' | 'advanced' = 'simple';\n toolsCollapsed = true;\n activeToolTab: 'schema' | 'preview' = 'preview';\n\n outputFormatOptions: SelectItem[] = [\n { id: 'PDF', text: 'PDF' },\n { id: 'HTML', text: 'HTML' },\n ];\n\n readonly selectedCatalogId$ = new BehaviorSubject<string>('');\n /** Composite ID: \"catalogId/templateId\" */\n readonly selectedTemplateId$ = new BehaviorSubject<string>('');\n\n /**\n * Force-clears the templateId v-select. Triggered when the catalog changes —\n * v-select's `setDefaultSelection` ignores empty-string defaults, so binding\n * `[defaultSelectionId]=\"\"` does NOT reset the dropdown. The `clearSelectionSubject$`\n * input is the supported escape hatch.\n */\n readonly clearTemplateId$ = new Subject<void>();\n /** Same pattern for the explicit-mode variantId v-select. */\n readonly clearVariantId$ = new Subject<void>();\n\n variantSelectionMode: VariantSelectionMode = 'explicit';\n variantIdExpressionMode = false;\n variantIdExpression = '';\n /**\n * Plain-mode variant id. Tracked outside `<v-form>` because the explicit\n * variant `<v-select>` lives inside `<div class=\"field-with-fx\">`, and\n * v-form's `@ContentChildren(SelectComponent)` query only sees direct\n * children (Angular defaults `descendants: false`).\n */\n variantIdValue = '';\n filenameExpressionMode = false;\n filenameExpression = '';\n /** Plain-mode filename. Tracked outside `<v-form>` for the same reason as `variantIdValue`. */\n filenameValue = '';\n variantAttributeEntries: {\n key: string;\n value: string;\n required: boolean;\n _customKey?: boolean;\n _expressionMode?: boolean;\n }[] = [];\n availableAttributeKeys: string[] = [];\n caseDefinitionKey: string | null = null;\n processVariables: string[] = [];\n expressionFunctions: ExpressionFunctionInfo[] = [];\n variableSuggestions: VariableSuggestions | null = null;\n /** Context variables for the JSONata editor's autocomplete ($doc/$pv/$case). */\n editorContextVariables: Record<string, string[]> = { doc: [], pv: [], case: [] };\n prefillDataMapping: Record<string, any> = {};\n validationErrors$ = new BehaviorSubject<JsonataFieldError[]>([]);\n\n private readonly destroy$ = new Subject<void>();\n private saveSubscription!: Subscription;\n private readonly formValue$ = new BehaviorSubject<Partial<GenerateDocumentConfig> | null>(null);\n private readonly valid$ = new BehaviorSubject<boolean>(false);\n private pluginConfigurationId$ = new BehaviorSubject<string>('');\n\n /** Resolves once with the prefill config (or empty config if none). */\n private prefill$!: Observable<GenerateDocumentConfig | null>;\n\n constructor(\n private readonly epistolaPluginService: EpistolaPluginService,\n private readonly processLinkStateService: ProcessLinkStateService,\n private readonly cdr: ChangeDetectorRef,\n ) {}\n\n ngOnInit(): void {\n this.prefill$ = this.resolvePrefill$();\n\n this.initContext();\n this.initPluginConfiguration();\n this.initCascade();\n this.loadExpressionFunctions();\n this.openSaveSubscription();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n this.saveSubscription?.unsubscribe();\n }\n\n formValueChange(formOutput: FormOutput): void {\n const formValue = formOutput as unknown as Partial<\n GenerateDocumentConfig & { catalogId: string; templateId: string }\n >;\n this.formValue$.next(formValue);\n\n // When catalog changes, reset template and variant selection.\n // The clear$ subjects force-clear the v-selects' internal `selected$` state —\n // without them the dropdown keeps the previous id and the next v-form emission\n // re-applies it under the new catalog, causing 404s when the template doesn't exist\n // in the newly selected catalog.\n if (formValue.catalogId && formValue.catalogId !== this.selectedCatalogId$.getValue()) {\n this.selectedCatalogId$.next(formValue.catalogId);\n this.selectedTemplateId$.next('');\n this.variantIdValue = '';\n this.clearTemplateId$.next();\n this.clearVariantId$.next();\n return;\n }\n\n // templateId from v-select is the template ID within the selected catalog\n if (formValue.templateId && formValue.templateId !== this.selectedTemplateId$.getValue()) {\n this.selectedTemplateId$.next(formValue.templateId);\n this.variantIdValue = '';\n this.clearVariantId$.next();\n }\n\n this.handleValid(formValue);\n }\n\n onDataMappingChange(expression: string): void {\n this.dataMapping$.next(expression);\n this.revalidate();\n }\n\n onFilenameValueChange(value: string | undefined): void {\n this.filenameValue = value ?? '';\n this.revalidate();\n }\n\n onVariantIdValueChange(value: SelectedValue | undefined): void {\n // v-select is single-select here, so SelectedValue narrows to string | number;\n // our variant ids are always strings — coerce defensively.\n this.variantIdValue = value == null || Array.isArray(value) ? '' : String(value);\n this.revalidate();\n }\n\n toggleFilenameExpressionMode(): void {\n this.filenameExpressionMode = !this.filenameExpressionMode;\n this.revalidate();\n }\n\n toggleVariantIdExpressionMode(): void {\n this.variantIdExpressionMode = !this.variantIdExpressionMode;\n this.revalidate();\n }\n\n onVariantSelectionModeChange(mode: VariantSelectionMode): void {\n this.variantSelectionMode = mode;\n if (mode === 'attributes' && this.variantAttributeEntries.length === 0) {\n this.variantAttributeEntries = [{ key: '', value: '', required: true }];\n }\n this.revalidate();\n }\n\n addAttributeEntry(): void {\n this.variantAttributeEntries = [\n ...this.variantAttributeEntries,\n { key: '', value: '', required: true },\n ];\n this.revalidate();\n }\n\n removeAttributeEntry(index: number): void {\n this.variantAttributeEntries = this.variantAttributeEntries.filter((_, i) => i !== index);\n this.revalidate();\n }\n\n onAttributeEntryChange(): void {\n this.revalidate();\n }\n\n onVariantIdExpressionChange(): void {\n this.revalidate();\n }\n\n onFilenameExpressionChange(): void {\n this.revalidate();\n }\n\n onKeySelected(\n entry: { key: string; value: string; required: boolean; _customKey?: boolean },\n value: string,\n ): void {\n if (value === '__custom__') {\n entry._customKey = true;\n entry.key = '';\n } else {\n entry.key = value;\n }\n this.onAttributeEntryChange();\n }\n\n cancelCustomKey(entry: {\n key: string;\n value: string;\n required: boolean;\n _customKey?: boolean;\n }): void {\n entry._customKey = false;\n entry.key = '';\n this.onAttributeEntryChange();\n }\n\n private revalidate(): void {\n const currentFormValue = this.formValue$.getValue();\n if (currentFormValue) {\n this.handleValid(currentFormValue);\n }\n }\n\n private formatAttributes(attributes: Record<string, string>): string {\n const entries = Object.entries(attributes || {});\n if (entries.length === 0) return '';\n return ` (${entries.map(([k, v]) => `${k}=${v}`).join(', ')})`;\n }\n\n /**\n * Creates a shared observable that resolves once with the prefill config\n * (or null if no prefill is provided). This is used to seed the cascade\n * with initial selection values before any loading starts.\n */\n private resolvePrefill$(): Observable<GenerateDocumentConfig | null> {\n if (!this.prefillConfiguration$) {\n return of(null).pipe(shareReplay(1));\n }\n return this.prefillConfiguration$.pipe(take(1), shareReplay(1));\n }\n\n private initContext(): void {\n if (this.context$) {\n this.context$\n .pipe(\n takeUntil(this.destroy$),\n filter(([context]) => context === 'case'),\n )\n .subscribe(([, params]) => {\n this.caseDefinitionKey = params.caseDefinitionKey;\n this.cdr.markForCheck();\n });\n }\n }\n\n private initPluginConfiguration(): void {\n const sources: Observable<string>[] = [];\n\n if (this.selectedPluginConfigurationData$) {\n sources.push(\n this.selectedPluginConfigurationData$.pipe(\n filter((config) => !!config?.configurationId),\n map((config) => config.configurationId),\n ),\n );\n }\n\n sources.push(\n this.processLinkStateService.selectedProcessLink$.pipe(\n filter((processLink) => !!processLink?.pluginConfigurationId),\n map((processLink) => processLink.pluginConfigurationId!),\n ),\n );\n\n merge(...sources)\n .pipe(takeUntil(this.destroy$))\n .subscribe((configurationId) => {\n this.pluginConfigurationId$.next(configurationId);\n });\n }\n\n /**\n * Sets up the entire reactive cascade:\n *\n * pluginConfigurationId$ → catalogs (+ environments independently)\n * prefill + catalogs loaded → seed selectedCatalogId$\n * selectedCatalogId$ → templates (+ attributes)\n * prefill + templates loaded → seed selectedTemplateId$\n * selectedTemplateId$ → variants + templateFields\n * prefill + templateFields loaded → seed dataMapping\n */\n private initCascade(): void {\n const configId$ = this.pluginConfigurationId$.pipe(\n filter((id) => !!id),\n distinctUntilChanged(),\n );\n\n // ── Catalogs: load when pluginConfigurationId changes ──\n configId$\n .pipe(\n takeUntil(this.destroy$),\n tap(() => this.catalogs$.next(loadingResource(this.catalogs$.getValue().data))),\n switchMap((configurationId) =>\n this.epistolaPluginService.getCatalogs(configurationId).pipe(\n map((catalogs) => successResource(catalogs.map((c) => ({ id: c.id, text: c.name })))),\n catchError(() => of(errorResource<SelectItem[]>([], 'Failed to load catalogs'))),\n ),\n ),\n )\n .subscribe((resource) => this.catalogs$.next(resource));\n\n // ── Environments: load when pluginConfigurationId changes (independent) ──\n configId$\n .pipe(\n takeUntil(this.destroy$),\n tap(() => this.environments$.next(loadingResource(this.environments$.getValue().data))),\n switchMap((configurationId) =>\n this.epistolaPluginService.getEnvironments(configurationId).pipe(\n map((envs) => successResource(envs.map((e) => ({ id: e.id, text: e.name })))),\n catchError(() => of(errorResource<SelectItem[]>([], 'Failed to load environments'))),\n ),\n ),\n )\n .subscribe((resource) => this.environments$.next(resource));\n\n // ── Seed selectedCatalogId$ from prefill once catalogs are loaded ──\n combineLatest([\n this.prefill$.pipe(filter((config) => !!config?.catalogId)),\n this.catalogs$.pipe(filter((c) => !c.loading && c.data.length > 0)),\n ])\n .pipe(takeUntil(this.destroy$), take(1))\n .subscribe(([config]) => {\n this.selectedCatalogId$.next(config!.catalogId);\n });\n\n // ── Templates: load when catalogId changes ──\n const catalogId$ = this.selectedCatalogId$.pipe(\n filter((id) => !!id),\n distinctUntilChanged(),\n );\n\n combineLatest([configId$, catalogId$])\n .pipe(\n takeUntil(this.destroy$),\n tap(() => this.templates$.next(loadingResource(this.templates$.getValue().data))),\n switchMap(([configurationId, catalogId]) =>\n this.epistolaPluginService.getTemplates(configurationId, catalogId).pipe(\n map((templates) => successResource(templates.map((t) => ({ id: t.id, text: t.name })))),\n catchError(() => of(errorResource<SelectItem[]>([], 'Failed to load templates'))),\n ),\n ),\n )\n .subscribe((resource) => this.templates$.next(resource));\n\n // ── Attributes: load when catalogId changes ──\n combineLatest([configId$, catalogId$])\n .pipe(\n takeUntil(this.destroy$),\n switchMap(([configurationId, catalogId]) =>\n this.epistolaPluginService\n .getAttributes(configurationId, catalogId)\n .pipe(catchError(() => of([]))),\n ),\n )\n .subscribe((attributes) => {\n this.availableAttributeKeys = attributes.map((a) => a.key).sort();\n this.cdr.markForCheck();\n });\n\n // ── Seed selectedTemplateId$ from prefill once templates are loaded ──\n combineLatest([\n this.prefill$.pipe(filter((config) => !!config?.templateId)),\n this.templates$.pipe(filter((t) => !t.loading && t.data.length > 0)),\n ])\n .pipe(takeUntil(this.destroy$), take(1))\n .subscribe(([config]) => {\n this.selectedTemplateId$.next(config!.templateId);\n });\n\n // ── Variants: load when templateId changes ──\n const templateId$ = this.selectedTemplateId$.pipe(\n filter((id) => !!id),\n distinctUntilChanged(),\n );\n\n combineLatest([configId$, catalogId$, templateId$])\n .pipe(\n takeUntil(this.destroy$),\n tap(() => this.variants$.next(loadingResource(this.variants$.getValue().data))),\n switchMap(([configurationId, catalogId, templateId]) =>\n this.epistolaPluginService.getVariants(configurationId, templateId, catalogId).pipe(\n map((variants) =>\n successResource(\n variants.map((v) => ({\n id: v.id,\n text: v.name + this.formatAttributes(v.attributes),\n })),\n ),\n ),\n catchError(() => of(errorResource<SelectItem[]>([], 'Failed to load variants'))),\n ),\n ),\n )\n .subscribe((resource) => this.variants$.next(resource));\n\n // ── Template fields: load when templateId changes ──\n combineLatest([configId$, catalogId$, templateId$])\n .pipe(\n takeUntil(this.destroy$),\n tap(() => {\n this.templateFields$.next(loadingResource(this.templateFields$.getValue().data));\n this.loadProcessVariables();\n this.loadVariableSuggestions();\n }),\n switchMap(([configurationId, catalogId, templateId]) =>\n this.epistolaPluginService\n .getTemplateDetails(configurationId, templateId, catalogId)\n .pipe(\n map((details) => successResource(details.fields || [])),\n catchError(() =>\n of(errorResource<TemplateField[]>([], 'Failed to load template fields')),\n ),\n ),\n ),\n )\n .subscribe((resource) => this.templateFields$.next(resource));\n\n // ── Seed variant + dataMapping from prefill once templateFields are loaded ──\n combineLatest([\n this.prefill$.pipe(filter((config) => !!config?.templateId)),\n this.templateFields$.pipe(filter((tf) => !tf.loading && tf.data.length > 0)),\n ])\n .pipe(takeUntil(this.destroy$), take(1))\n .subscribe(([config]) => {\n if (!config) return;\n\n // Apply variant prefill\n if (\n config.variantAttributes &&\n (Array.isArray(config.variantAttributes)\n ? config.variantAttributes.length > 0\n : Object.keys(config.variantAttributes).length > 0)\n ) {\n this.variantSelectionMode = 'attributes';\n if (Array.isArray(config.variantAttributes)) {\n this.variantAttributeEntries = config.variantAttributes.map((e) => ({\n key: e.key,\n value: e.value,\n required: e.required !== false,\n _expressionMode: isExpression(e.value),\n }));\n } else {\n this.variantAttributeEntries = Object.entries(config.variantAttributes as any).map(\n ([key, value]) => ({ key, value: String(value), required: true }),\n );\n }\n } else if (config.variantId) {\n this.variantSelectionMode = 'explicit';\n if (isExpression(config.variantId)) {\n this.variantIdExpressionMode = true;\n this.variantIdExpression = config.variantId;\n } else {\n this.variantIdValue = config.variantId;\n }\n }\n\n // Detect expression mode for filename\n if (config.filename) {\n if (isExpression(config.filename)) {\n this.filenameExpressionMode = true;\n this.filenameExpression = config.filename;\n } else {\n this.filenameValue = config.filename;\n }\n }\n\n // Apply dataMapping prefill (JSONata expression string)\n if (config.dataMapping) {\n const expr = typeof config.dataMapping === 'string' ? config.dataMapping : '';\n this.dataMapping$.next(expr);\n } else {\n this.cdr.detectChanges();\n }\n });\n }\n\n private loadExpressionFunctions(): void {\n this.epistolaPluginService\n .getExpressionFunctions()\n .pipe(\n takeUntil(this.destroy$),\n catchError(() => of([])),\n )\n .subscribe((functions) => {\n this.expressionFunctions = functions;\n this.cdr.markForCheck();\n });\n }\n\n private loadProcessVariables(): void {\n if (this.caseDefinitionKey) {\n this.epistolaPluginService\n .getProcessVariables(this.caseDefinitionKey)\n .pipe(\n takeUntil(this.destroy$),\n catchError(() => of([])),\n )\n .subscribe((variables) => {\n this.processVariables = variables;\n this.cdr.markForCheck();\n });\n }\n }\n\n private loadVariableSuggestions(): void {\n this.epistolaPluginService\n .getVariableSuggestions(\n this.caseDefinitionKey ?? undefined,\n this.caseDefinitionKey ?? undefined,\n )\n .pipe(\n takeUntil(this.destroy$),\n catchError(() => of({ doc: [], pv: [] })),\n )\n .subscribe((suggestions) => {\n this.variableSuggestions = suggestions;\n // `$case` is a valid (currently-empty) binding — keep it offered.\n this.editorContextVariables = {\n doc: suggestions.doc || [],\n pv: suggestions.pv || [],\n case: [],\n };\n this.cdr.markForCheck();\n });\n }\n\n private handleValid(formValue: Partial<GenerateDocumentConfig & { catalogId: string }>): void {\n const filenameProvided = this.filenameExpressionMode\n ? !!this.filenameExpression?.trim()\n : !!this.filenameValue?.trim();\n\n const baseComplete = !!(\n this.selectedCatalogId$.getValue() &&\n formValue?.templateId &&\n formValue?.outputFormat &&\n filenameProvided &&\n formValue?.resultProcessVariable\n );\n\n let variantValid = true;\n if (this.variantSelectionMode === 'attributes' && this.variantAttributeEntries.length > 0) {\n variantValid = this.variantAttributeEntries.every((e) => !!e.key && !!e.value);\n }\n\n const valid = baseComplete && variantValid;\n this.valid$.next(valid);\n this.valid.emit(valid);\n }\n\n private openSaveSubscription(): void {\n this.saveSubscription = this.save$?.subscribe(() => {\n combineLatest([this.formValue$, this.valid$, this.dataMapping$])\n .pipe(take(1))\n .subscribe(([formValue, valid, dataMapping]) => {\n if (valid && formValue) {\n const catalogId = this.selectedCatalogId$.getValue();\n const templateId = formValue.templateId!;\n\n const config: GenerateDocumentConfig = {\n catalogId,\n templateId,\n environmentId: formValue.environmentId || undefined,\n dataMapping: dataMapping,\n outputFormat: formValue.outputFormat as 'PDF' | 'HTML',\n filename: this.filenameExpressionMode ? this.filenameExpression : this.filenameValue,\n correlationId: formValue.correlationId || undefined,\n resultProcessVariable: formValue.resultProcessVariable!,\n };\n\n if (this.variantSelectionMode === 'explicit') {\n config.variantId = this.variantIdExpressionMode\n ? this.variantIdExpression\n : this.variantIdValue;\n } else {\n config.variantAttributes = this.variantAttributeEntries\n .filter((e) => e.key && e.value)\n .map((e) => ({ key: e.key, value: e.value, required: e.required }));\n }\n\n this.validateAndEmit(config);\n }\n });\n });\n }\n\n /**\n * Build a JSONata validation request from the config and call the backend.\n * Only fields that are JSONata expressions get validated:\n * - dataMapping is always JSONata\n * - filename / variantId only when their `fx` toggle is on\n * - variant attribute values only when isExpression() reports true\n * On invalid response, surface errors and abort the emit.\n * If the validator endpoint itself fails (network/server), proceed with the\n * emit — the validation is a quality-of-life check, not a hard gate.\n */\n private validateAndEmit(config: GenerateDocumentConfig): void {\n const variantAttributeValues: Record<string, string> = {};\n if (config.variantAttributes) {\n for (const attr of config.variantAttributes) {\n if (isExpression(attr.value)) {\n variantAttributeValues[attr.key] = attr.value;\n }\n }\n }\n\n const request: ValidateJsonataRequest = {\n dataMapping: config.dataMapping || null,\n filename: this.filenameExpressionMode ? config.filename : null,\n variantId: this.variantIdExpressionMode ? config.variantId || null : null,\n variantAttributeValues:\n Object.keys(variantAttributeValues).length > 0 ? variantAttributeValues : null,\n };\n\n this.epistolaPluginService\n .validateJsonata(request)\n .pipe(\n take(1),\n catchError(() => of({ valid: true, errors: [] as JsonataFieldError[] })),\n )\n .subscribe((result) => {\n if (result.valid) {\n this.validationErrors$.next([]);\n this.configuration.emit(config);\n } else {\n this.validationErrors$.next(result.errors);\n this.cdr.markForCheck();\n }\n });\n }\n}\n","<v-form\n (valueChange)=\"formValueChange($event)\"\n *ngIf=\"{\n disabled: disabled$ | async,\n prefill: prefillConfiguration$ ? (prefillConfiguration$ | async) : null,\n catalogs: catalogs$ | async,\n templates: templates$ | async,\n variants: variants$ | async,\n environments: environments$ | async,\n templateFields: templateFields$ | async,\n selectedCatalogId: selectedCatalogId$ | async,\n selectedTemplateId: selectedTemplateId$ | async,\n validationErrors: validationErrors$ | async,\n } as obs\"\n>\n <div\n *ngIf=\"obs.validationErrors && obs.validationErrors.length > 0\"\n class=\"jsonata-validation-errors\"\n >\n <strong>{{ 'jsonataValidationErrorsHeading' | pluginTranslate: pluginId | async }}</strong>\n <ul>\n <li *ngFor=\"let err of obs.validationErrors\">\n <code>{{ err.field }}</code\n >: {{ err.message }}\n </li>\n </ul>\n </div>\n <v-select\n name=\"catalogId\"\n [title]=\"'catalogId' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'catalogIdTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [items]=\"obs.catalogs.data\"\n [defaultSelectionId]=\"obs.prefill?.catalogId\"\n [disabled]=\"obs.disabled || obs.catalogs.loading\"\n [required]=\"true\"\n [loading]=\"obs.catalogs.loading\"\n >\n </v-select>\n <div *ngIf=\"obs.catalogs.error\" class=\"loading-error\">{{ obs.catalogs.error }}</div>\n\n <v-select\n name=\"templateId\"\n [title]=\"'templateId' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'templateIdTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [items]=\"obs.templates.data\"\n [defaultSelectionId]=\"obs.prefill?.templateId\"\n [clearSelectionSubject$]=\"clearTemplateId$\"\n [disabled]=\"obs.disabled || obs.templates.loading || !obs.selectedCatalogId\"\n [required]=\"true\"\n [loading]=\"obs.templates.loading\"\n >\n </v-select>\n <div *ngIf=\"obs.templates.error\" class=\"loading-error\">{{ obs.templates.error }}</div>\n\n <!-- Variant selection mode toggle -->\n <div class=\"variant-mode-toggle\" *ngIf=\"obs.selectedTemplateId\">\n <label class=\"variant-mode-label\">{{\n 'variantSelectionMode' | pluginTranslate: pluginId | async\n }}</label>\n <div class=\"variant-mode-buttons\">\n <button\n type=\"button\"\n class=\"variant-mode-btn\"\n [class.active]=\"variantSelectionMode === 'explicit'\"\n (click)=\"onVariantSelectionModeChange('explicit')\"\n [disabled]=\"obs.disabled\"\n >\n {{ 'selectByVariant' | pluginTranslate: pluginId | async }}\n </button>\n <button\n type=\"button\"\n class=\"variant-mode-btn\"\n [class.active]=\"variantSelectionMode === 'attributes'\"\n (click)=\"onVariantSelectionModeChange('attributes')\"\n [disabled]=\"obs.disabled\"\n >\n {{ 'selectByAttributes' | pluginTranslate: pluginId | async }}\n </button>\n </div>\n </div>\n\n <!-- Explicit variant selection (dropdown or expression) -->\n <!--\n The v-select / v-input here is intentionally NOT named into the v-form: v-form's\n @ContentChildren queries default to descendants:false and would skip anything nested\n in this `field-with-fx` wrapper. The value is tracked via (selectedChange)/(valueChange)\n on the component, see variantIdValue / filenameValue.\n -->\n <div *ngIf=\"variantSelectionMode === 'explicit'\" class=\"field-with-fx\">\n <v-select\n *ngIf=\"!variantIdExpressionMode\"\n [title]=\"'variantId' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'variantIdTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [items]=\"obs.variants.data\"\n [defaultSelectionId]=\"variantIdValue\"\n [clearSelectionSubject$]=\"clearVariantId$\"\n (selectedChange)=\"onVariantIdValueChange($event)\"\n [disabled]=\"obs.disabled || obs.variants.loading || !obs.selectedTemplateId\"\n [required]=\"false\"\n [loading]=\"obs.variants.loading\"\n >\n </v-select>\n <div *ngIf=\"variantIdExpressionMode\" class=\"fx-input-group\">\n <label class=\"fx-input-label\">{{ 'variantId' | pluginTranslate: pluginId | async }}</label>\n <input\n type=\"text\"\n class=\"fx-input\"\n [ngModel]=\"variantIdExpression\"\n (ngModelChange)=\"variantIdExpression = $event; onVariantIdExpressionChange()\"\n [disabled]=\"obs.disabled\"\n placeholder=\"$pv.letterType\"\n />\n </div>\n <button\n type=\"button\"\n class=\"fx-toggle\"\n (click)=\"toggleVariantIdExpressionMode()\"\n [disabled]=\"obs.disabled\"\n [title]=\"variantIdExpressionMode ? 'Switch to dropdown' : 'Switch to expression'\"\n >\n {{ variantIdExpressionMode ? '·' : 'fx' }}\n </button>\n </div>\n <div *ngIf=\"obs.variants.error\" class=\"loading-error\">{{ obs.variants.error }}</div>\n\n <!-- Attribute-based variant selection -->\n <div\n *ngIf=\"variantSelectionMode === 'attributes' && obs.selectedTemplateId\"\n class=\"variant-attributes-section\"\n >\n <label class=\"variant-attributes-label\">{{\n 'variantAttributes' | pluginTranslate: pluginId | async\n }}</label>\n <div class=\"variant-attributes-list\">\n <div\n *ngFor=\"let entry of variantAttributeEntries; let i = index\"\n class=\"variant-attribute-row\"\n >\n <select\n *ngIf=\"!entry._customKey\"\n class=\"variant-attribute-input\"\n [ngModel]=\"entry.key\"\n (ngModelChange)=\"onKeySelected(entry, $event)\"\n [disabled]=\"obs.disabled\"\n >\n <option value=\"\" disabled>\n {{ 'attributeKey' | pluginTranslate: pluginId | async }}\n </option>\n <option *ngFor=\"let key of availableAttributeKeys\" [value]=\"key\">{{ key }}</option>\n <option value=\"__custom__\">\n {{ 'attributeKeyCustom' | pluginTranslate: pluginId | async }}\n </option>\n </select>\n <div *ngIf=\"entry._customKey\" class=\"custom-key-input\">\n <input\n type=\"text\"\n class=\"variant-attribute-input\"\n [placeholder]=\"'attributeKey' | pluginTranslate: pluginId | async\"\n [(ngModel)]=\"entry.key\"\n (ngModelChange)=\"onAttributeEntryChange()\"\n [disabled]=\"obs.disabled\"\n />\n <button\n type=\"button\"\n class=\"custom-key-cancel\"\n (click)=\"cancelCustomKey(entry)\"\n [disabled]=\"obs.disabled\"\n >\n ×\n </button>\n </div>\n <div class=\"attribute-value-with-fx\">\n <input\n type=\"text\"\n class=\"variant-attribute-input\"\n [class.fx-input]=\"entry._expressionMode\"\n [placeholder]=\"\n entry._expressionMode\n ? '$pv.language'\n : ('attributeValue' | pluginTranslate: pluginId | async)\n \"\n [(ngModel)]=\"entry.value\"\n (ngModelChange)=\"onAttributeEntryChange()\"\n [disabled]=\"obs.disabled\"\n />\n <button\n type=\"button\"\n class=\"fx-toggle fx-toggle--inline\"\n (click)=\"entry._expressionMode = !entry._expressionMode\"\n [disabled]=\"obs.disabled\"\n [title]=\"entry._expressionMode ? 'Switch to plain value' : 'Switch to expression'\"\n >\n {{ entry._expressionMode ? '·' : 'fx' }}\n </button>\n </div>\n <label class=\"variant-attribute-required-toggle\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"entry.required\"\n (ngModelChange)=\"onAttributeEntryChange()\"\n [disabled]=\"obs.disabled\"\n />\n <span class=\"required-label\">{{\n (entry.required ? 'attributeRequired' : 'attributePreferred')\n | pluginTranslate: pluginId\n | async\n }}</span>\n </label>\n <button\n type=\"button\"\n class=\"variant-attribute-remove-btn\"\n (click)=\"removeAttributeEntry(i)\"\n [disabled]=\"obs.disabled\"\n title=\"{{ 'removeAttribute' | pluginTranslate: pluginId | async }}\"\n >\n ×\n </button>\n </div>\n </div>\n <button\n type=\"button\"\n class=\"variant-attribute-add-btn\"\n (click)=\"addAttributeEntry()\"\n [disabled]=\"obs.disabled\"\n >\n + {{ 'addAttribute' | pluginTranslate: pluginId | async }}\n </button>\n </div>\n\n <v-select\n name=\"environmentId\"\n [title]=\"'environmentId' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'environmentIdTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [items]=\"obs.environments.data\"\n [defaultSelectionId]=\"obs.prefill?.environmentId\"\n [disabled]=\"obs.disabled || obs.environments.loading\"\n [required]=\"false\"\n [loading]=\"obs.environments.loading\"\n >\n </v-select>\n <div *ngIf=\"obs.environments.error\" class=\"loading-error\">{{ obs.environments.error }}</div>\n\n <v-select\n name=\"outputFormat\"\n [title]=\"'outputFormat' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'outputFormatTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [items]=\"outputFormatOptions\"\n [defaultSelectionId]=\"obs.prefill?.outputFormat || 'PDF'\"\n [disabled]=\"obs.disabled\"\n [required]=\"true\"\n >\n </v-select>\n\n <div class=\"field-with-fx\">\n <v-input\n *ngIf=\"!filenameExpressionMode\"\n [title]=\"'filename' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'filenameTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"filenameValue\"\n (valueChange)=\"onFilenameValueChange($event)\"\n [disabled]=\"obs.disabled\"\n [required]=\"true\"\n >\n </v-input>\n <div *ngIf=\"filenameExpressionMode\" class=\"fx-input-group\">\n <label class=\"fx-input-label\">{{ 'filename' | pluginTranslate: pluginId | async }}</label>\n <input\n type=\"text\"\n class=\"fx-input\"\n [ngModel]=\"filenameExpression\"\n (ngModelChange)=\"filenameExpression = $event; onFilenameExpressionChange()\"\n [disabled]=\"obs.disabled\"\n placeholder='\"besluit-\" & $doc.name & \".pdf\"'\n />\n </div>\n <button\n type=\"button\"\n class=\"fx-toggle\"\n (click)=\"toggleFilenameExpressionMode()\"\n [disabled]=\"obs.disabled\"\n [title]=\"filenameExpressionMode ? 'Switch to plain input' : 'Switch to expression'\"\n >\n {{ filenameExpressionMode ? '·' : 'fx' }}\n </button>\n </div>\n\n <v-input\n name=\"correlationId\"\n [title]=\"'correlationId' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'correlationIdTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"obs.prefill?.correlationId\"\n [disabled]=\"obs.disabled\"\n [required]=\"false\"\n >\n </v-input>\n\n <v-input\n name=\"resultProcessVariable\"\n [title]=\"'resultProcessVariable' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'resultProcessVariableTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"obs.prefill?.resultProcessVariable\"\n [disabled]=\"obs.disabled\"\n [required]=\"true\"\n >\n </v-input>\n</v-form>\n\n<div *ngIf=\"(templateFields$ | async)?.error as templateFieldsError\" class=\"loading-error\">\n {{ templateFieldsError }}\n</div>\n\n<div *ngIf=\"selectedTemplateId$ | async\" class=\"mapping-section\">\n <h5 class=\"mapping-section__title\">\n {{ 'dataMappingTitle' | pluginTranslate: pluginId | async }}\n </h5>\n <p class=\"mapping-section__description\">\n {{ 'dataMappingDescription' | pluginTranslate: pluginId | async }}\n </p>\n <div class=\"mapping-mode-toggle\">\n <button\n class=\"mapping-mode-toggle__btn\"\n [class.mapping-mode-toggle__btn--active]=\"mappingMode === 'simple'\"\n (click)=\"mappingMode = 'simple'\"\n >\n {{ 'mappingModeSimple' | pluginTranslate: pluginId | async }}\n </button>\n <button\n class=\"mapping-mode-toggle__btn\"\n [class.mapping-mode-toggle__btn--active]=\"mappingMode === 'advanced'\"\n (click)=\"mappingMode = 'advanced'\"\n >\n {{ 'mappingModeAdvanced' | pluginTranslate: pluginId | async }}\n </button>\n </div>\n\n <!-- Editor area (full width) -->\n <epistola-mapping-builder\n *ngIf=\"mappingMode === 'simple'\"\n [expression]=\"dataMapping$ | async\"\n [templateFields]=\"(templateFields$ | async)?.data ?? []\"\n [suggestions]=\"variableSuggestions\"\n [disabled]=\"!!(disabled$ | async)\"\n (expressionChange)=\"onDataMappingChange($event)\"\n ></epistola-mapping-builder>\n\n <epistola-jsonata-editor\n *ngIf=\"mappingMode === 'advanced'\"\n [expression]=\"dataMapping$ | async\"\n [disabled]=\"!!(disabled$ | async)\"\n [contextVariables]=\"editorContextVariables\"\n [functions]=\"expressionFunctions\"\n (expressionChange)=\"onDataMappingChange($event)\"\n ></epistola-jsonata-editor>\n\n <!-- Bottom tabs: Schema + Preview (collapsible) -->\n <div class=\"mapping-tools\" [class.mapping-tools--collapsed]=\"toolsCollapsed\">\n <div class=\"mapping-tools__header\" (click)=\"toolsCollapsed = !toolsCollapsed\">\n <span class=\"mapping-tools__chevron\">{{ toolsCollapsed ? '▶' : '▼' }}</span>\n <span>{{ 'mappingTools' | pluginTranslate: pluginId | async }}</span>\n </div>\n <div *ngIf=\"!toolsCollapsed\" class=\"mapping-tools__content\">\n <div class=\"mapping-tools__tabs\">\n <button\n class=\"mapping-tools__tab\"\n [class.mapping-tools__tab--active]=\"activeToolTab === 'schema'\"\n (click)=\"activeToolTab = 'schema'\"\n >\n {{ 'expectedStructure' | pluginTranslate: pluginId | async }}\n </button>\n <button\n class=\"mapping-tools__tab\"\n [class.mapping-tools__tab--active]=\"activeToolTab === 'preview'\"\n (click)=\"activeToolTab = 'preview'\"\n >\n {{ 'previewTitle' | pluginTranslate: pluginId | async }}\n </button>\n </div>\n\n <epistola-expected-structure\n *ngIf=\"activeToolTab === 'schema'\"\n [templateFields]=\"(templateFields$ | async)?.data ?? []\"\n ></epistola-expected-structure>\n\n <epistola-mapping-preview\n *ngIf=\"activeToolTab === 'preview'\"\n [expression]=\"dataMapping$ | async\"\n [templateFields]=\"(templateFields$ | async)?.data ?? []\"\n [caseDefinitionKey]=\"caseDefinitionKey\"\n ></epistola-mapping-preview>\n </div>\n </div>\n</div>\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n FunctionConfigurationComponent,\n FunctionConfigurationData,\n PluginTranslatePipeModule,\n} from '@valtimo/plugin';\nimport { FormModule, FormOutput, InputModule } from '@valtimo/components';\nimport { BehaviorSubject, combineLatest, Observable, of, Subscription, take } from 'rxjs';\nimport { delay, startWith } from 'rxjs/operators';\nimport { CheckJobStatusConfig } from '../../models';\n\n@Component({\n selector: 'epistola-check-job-status-configuration',\n templateUrl: './check-job-status-configuration.component.html',\n styleUrls: ['./check-job-status-configuration.component.scss'],\n standalone: true,\n imports: [CommonModule, PluginTranslatePipeModule, FormModule, InputModule],\n})\nexport class CheckJobStatusConfigurationComponent\n implements FunctionConfigurationComponent, OnInit, OnDestroy\n{\n @Input() save$!: Observable<void>;\n @Input() disabled$!: Observable<boolean>;\n @Input() pluginId!: string;\n @Input() prefillConfiguration$!: Observable<CheckJobStatusConfig>;\n\n @Output() valid: EventEmitter<boolean> = new EventEmitter<boolean>();\n // Typed as the framework's FunctionConfigurationData (an index type) to match the\n // FunctionConfigurationComponent contract under strict mode — EventEmitter is invariant,\n // so a narrower generic isn't assignable. Emitted values are still the typed config.\n @Output() configuration: EventEmitter<FunctionConfigurationData> =\n new EventEmitter<FunctionConfigurationData>();\n\n private saveSubscription!: Subscription;\n private readonly formValue$ = new BehaviorSubject<CheckJobStatusConfig | null>(null);\n private readonly valid$ = new BehaviorSubject<boolean>(false);\n\n /** Resolved synchronously before the v-form renders — see download-document-configuration for the why. */\n resolvedPrefill: Partial<CheckJobStatusConfig> = {};\n readonly prefillResolved$ = new BehaviorSubject<boolean>(false);\n\n safeDisabled$!: Observable<boolean>;\n\n ngOnInit(): void {\n this.safeDisabled$ = this.disabled$.pipe(startWith(true), delay(0));\n const prefill$ = this.prefillConfiguration$ ?? of({} as CheckJobStatusConfig);\n prefill$.pipe(take(1)).subscribe((prefill) => {\n this.resolvedPrefill = prefill ?? {};\n this.prefillResolved$.next(true);\n });\n this.openSaveSubscription();\n }\n\n ngOnDestroy() {\n this.saveSubscription?.unsubscribe();\n }\n\n formValueChange(formOutput: FormOutput): void {\n const formValue = formOutput as unknown as CheckJobStatusConfig;\n this.formValue$.next(formValue);\n this.handleValid(formValue);\n }\n\n private handleValid(formValue: CheckJobStatusConfig): void {\n const valid = !!(formValue?.requestIdVariable && formValue?.statusVariable);\n this.valid$.next(valid);\n this.valid.emit(valid);\n }\n\n private openSaveSubscription(): void {\n this.saveSubscription = this.save$?.subscribe(() => {\n combineLatest([this.formValue$, this.valid$])\n .pipe(take(1))\n .subscribe(([formValue, valid]) => {\n if (valid && formValue) {\n this.configuration.emit(formValue);\n }\n });\n });\n }\n}\n","<v-form (valueChange)=\"formValueChange($event)\" *ngIf=\"prefillResolved$ | async\">\n <v-input\n name=\"requestIdVariable\"\n [title]=\"'requestIdVariable' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'requestIdVariableTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"resolvedPrefill?.requestIdVariable\"\n [disabled]=\"safeDisabled$ | async\"\n [required]=\"true\"\n >\n </v-input>\n\n <v-input\n name=\"statusVariable\"\n [title]=\"'statusVariable' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'statusVariableTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"resolvedPrefill?.statusVariable\"\n [disabled]=\"safeDisabled$ | async\"\n [required]=\"true\"\n >\n </v-input>\n\n <v-input\n name=\"documentIdVariable\"\n [title]=\"'documentIdVariable' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'documentIdVariableTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"resolvedPrefill?.documentIdVariable\"\n [disabled]=\"safeDisabled$ | async\"\n [required]=\"false\"\n >\n </v-input>\n\n <v-input\n name=\"errorMessageVariable\"\n [title]=\"'errorMessageVariable' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'errorMessageVariableTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"resolvedPrefill?.errorMessageVariable\"\n [disabled]=\"safeDisabled$ | async\"\n [required]=\"false\"\n >\n </v-input>\n</v-form>\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport { DownloadDocumentConfig } from '../../models';\n\n/**\n * Pure helpers for the download-document configurator, extracted so they can be unit-tested\n * without the Angular component (mirrors the process-link-selector util pattern). See\n * `docs/adr/0001-download-document-content-storage.md`.\n */\n\nexport type StorageTarget = 'TEMPORARY_RESOURCE' | 'PROCESS_VARIABLE';\n\nexport const DEFAULT_STORAGE_TARGET: StorageTarget = 'TEMPORARY_RESOURCE';\n\n/** Normalize a (possibly undefined) storageTarget to a concrete target, applying the default. */\nexport function resolveStorageTarget(target?: string): StorageTarget {\n return target === 'PROCESS_VARIABLE' ? 'PROCESS_VARIABLE' : DEFAULT_STORAGE_TARGET;\n}\n\n/**\n * A config is valid when the input variable and the output variable that matches the chosen\n * storage target are both set.\n */\nexport function isDownloadDocumentConfigValid(\n config: Partial<DownloadDocumentConfig> | null | undefined,\n): boolean {\n if (!config?.documentVariable) {\n return false;\n }\n return resolveStorageTarget(config.storageTarget) === 'PROCESS_VARIABLE'\n ? !!config.contentVariable\n : !!config.resourceIdVariable;\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n FunctionConfigurationComponent,\n FunctionConfigurationData,\n PluginTranslatePipeModule,\n} from '@valtimo/plugin';\nimport { FormModule, FormOutput, InputModule, SelectItem, SelectModule } from '@valtimo/components';\nimport { BehaviorSubject, combineLatest, Observable, of, Subscription, take } from 'rxjs';\nimport { delay, startWith } from 'rxjs/operators';\nimport { DownloadDocumentConfig } from '../../models';\nimport {\n DEFAULT_STORAGE_TARGET,\n isDownloadDocumentConfigValid,\n resolveStorageTarget,\n} from './download-document-config.util';\n\n@Component({\n selector: 'epistola-download-document-configuration',\n templateUrl: './download-document-configuration.component.html',\n styleUrls: ['./download-document-configuration.component.scss'],\n standalone: true,\n imports: [CommonModule, PluginTranslatePipeModule, FormModule, InputModule, SelectModule],\n})\nexport class DownloadDocumentConfigurationComponent\n implements FunctionConfigurationComponent, OnInit, OnDestroy\n{\n @Input() save$!: Observable<void>;\n @Input() disabled$!: Observable<boolean>;\n @Input() pluginId!: string;\n @Input() prefillConfiguration$!: Observable<DownloadDocumentConfig>;\n\n @Output() valid: EventEmitter<boolean> = new EventEmitter<boolean>();\n // Framework's FunctionConfigurationData (index type) to satisfy the invariant\n // EventEmitter contract under strict mode; emitted values remain the typed config.\n @Output() configuration: EventEmitter<FunctionConfigurationData> =\n new EventEmitter<FunctionConfigurationData>();\n\n private saveSubscription!: Subscription;\n private readonly formValue$ = new BehaviorSubject<DownloadDocumentConfig | null>(null);\n private readonly valid$ = new BehaviorSubject<boolean>(false);\n\n /**\n * Resolved prefill — populated synchronously before the v-form renders. Avoids the\n * v-input `[defaultValue]` async-binding race that otherwise drops one of the\n * fields when prefill arrives after mount.\n */\n resolvedPrefill: Partial<DownloadDocumentConfig> = {};\n readonly prefillResolved$ = new BehaviorSubject<boolean>(false);\n\n safeDisabled$!: Observable<boolean>;\n\n /**\n * Static option set for the storage target. Values match the backend\n * {@code DocumentStorageTarget} enum constants; labels are explained further via the\n * translated field title/tooltip.\n */\n readonly storageTargetOptions: SelectItem[] = [\n { id: 'TEMPORARY_RESOURCE', text: 'Temporary resource storage' },\n { id: 'PROCESS_VARIABLE', text: 'Process variable (inline bytes)' },\n ];\n readonly defaultStorageTarget = DEFAULT_STORAGE_TARGET;\n\n /** Drives which output-variable field is shown (resource id vs inline content). */\n readonly selectedTarget$ = new BehaviorSubject<string>(this.defaultStorageTarget);\n\n ngOnInit(): void {\n this.safeDisabled$ = this.disabled$.pipe(startWith(true), delay(0));\n const prefill$ = this.prefillConfiguration$ ?? of({} as DownloadDocumentConfig);\n prefill$.pipe(take(1)).subscribe((prefill) => {\n this.resolvedPrefill = prefill ?? {};\n this.selectedTarget$.next(resolveStorageTarget(this.resolvedPrefill.storageTarget));\n this.prefillResolved$.next(true);\n });\n this.openSaveSubscription();\n }\n\n ngOnDestroy() {\n this.saveSubscription?.unsubscribe();\n }\n\n formValueChange(formOutput: FormOutput): void {\n const formValue = formOutput as unknown as DownloadDocumentConfig;\n if (formValue?.storageTarget) {\n this.selectedTarget$.next(formValue.storageTarget);\n }\n this.formValue$.next(formValue);\n this.handleValid(formValue);\n }\n\n private handleValid(formValue: DownloadDocumentConfig): void {\n const valid = isDownloadDocumentConfigValid(formValue);\n this.valid$.next(valid);\n this.valid.emit(valid);\n }\n\n private openSaveSubscription(): void {\n this.saveSubscription = this.save$?.subscribe(() => {\n combineLatest([this.formValue$, this.valid$])\n .pipe(take(1))\n .subscribe(([formValue, valid]) => {\n if (valid && formValue) {\n this.configuration.emit(formValue);\n }\n });\n });\n }\n}\n","<v-form (valueChange)=\"formValueChange($event)\" *ngIf=\"prefillResolved$ | async\">\n <v-input\n name=\"documentVariable\"\n [title]=\"'documentVariable' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'documentVariableTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"resolvedPrefill?.documentVariable\"\n [disabled]=\"safeDisabled$ | async\"\n [required]=\"true\"\n >\n </v-input>\n\n <v-select\n name=\"storageTarget\"\n [title]=\"'storageTarget' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'storageTargetTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [items]=\"storageTargetOptions\"\n [defaultSelectionId]=\"resolvedPrefill?.storageTarget || defaultStorageTarget\"\n [disabled]=\"safeDisabled$ | async\"\n [required]=\"true\"\n >\n </v-select>\n\n <v-input\n *ngIf=\"(selectedTarget$ | async) === 'TEMPORARY_RESOURCE'\"\n name=\"resourceIdVariable\"\n [title]=\"'resourceIdVariable' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'resourceIdVariableTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"resolvedPrefill?.resourceIdVariable\"\n [disabled]=\"safeDisabled$ | async\"\n [required]=\"true\"\n >\n </v-input>\n\n <v-input\n *ngIf=\"(selectedTarget$ | async) === 'PROCESS_VARIABLE'\"\n name=\"contentVariable\"\n [title]=\"'contentVariable' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'contentVariableTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"resolvedPrefill?.contentVariable\"\n [disabled]=\"safeDisabled$ | async\"\n [required]=\"true\"\n >\n </v-input>\n</v-form>\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport { FormioCustomComponent, FormIoStateService } from '@valtimo/components';\nimport { Subscription } from 'rxjs';\nimport { DownloadDocumentRequest, EpistolaPluginService } from '../../services';\n\nexport type EpistolaDocumentDisplay = 'inline' | 'button' | 'both';\n\n/**\n * Unified Formio component for the after-generation Epistola PDF UX. Reads\n * the PDF id and tenant id from named process variables on the caller's\n * task via the {@code /documents/download} endpoint.\n *\n * <p>Three presentations, all backed by the same backend call:\n * <ul>\n * <li>{@code display=\"inline\"} — render the PDF inline in a panel.</li>\n * <li>{@code display=\"button\"} — show a click-to-save download button only.</li>\n * <li>{@code display=\"both\"} (default) — inline panel with a download icon\n * in the header.</li>\n * </ul>\n *\n * <p>For the dry-run / what-would-be-generated UX use\n * {@code epistola-document-preview} instead.\n */\n@Component({\n standalone: true,\n imports: [CommonModule],\n selector: 'epistola-document-component',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <!-- Design-time placeholder -->\n <div *ngIf=\"designMode\" class=\"epistola-doc-panel\">\n <div class=\"doc-header\">\n <span>{{ label || 'Document' }}</span>\n <span class=\"design-tag\">design mode</span>\n </div>\n <div class=\"doc-body design-info\">\n <div class=\"design-section\">\n <div class=\"design-label\">Display</div>\n <div class=\"design-value\">{{ display }}</div>\n <div class=\"design-label\">Document variable</div>\n <div class=\"design-value\">{{ documentVariable }}</div>\n <div class=\"design-label\">Tenant ID variable</div>\n <div class=\"design-value\">{{ tenantIdVariable }}</div>\n </div>\n </div>\n </div>\n\n <!-- Button-only display -->\n <div *ngIf=\"!designMode && display === 'button'\">\n <button\n type=\"button\"\n class=\"btn btn-outline-primary\"\n [disabled]=\"disabled || downloading\"\n (click)=\"download()\"\n >\n <i class=\"mdi mdi-download mr-1\"></i>\n {{ downloading ? 'Downloading...' : label || 'Download PDF' }}\n </button>\n <span *ngIf=\"error\" class=\"text-danger ml-2\">{{ error }}</span>\n </div>\n\n <!-- Inline / both: panel with optional download icon -->\n <div *ngIf=\"!designMode && display !== 'button'\" class=\"epistola-doc-panel\">\n <div class=\"doc-header\">\n <span>{{ label || 'Document' }}</span>\n <div class=\"doc-controls\">\n <button\n *ngIf=\"display === 'both'\"\n type=\"button\"\n class=\"doc-icon-btn\"\n [disabled]=\"disabled || downloading\"\n (click)=\"download()\"\n [title]=\"downloading ? 'Downloading...' : 'Download'\"\n >\n <i class=\"mdi mdi-download\"></i>\n </button>\n <button\n type=\"button\"\n class=\"doc-icon-btn\"\n [disabled]=\"loading\"\n (click)=\"refresh()\"\n title=\"Refresh\"\n >\n <i class=\"mdi mdi-refresh\"></i>\n </button>\n </div>\n </div>\n <div class=\"doc-body\">\n <div *ngIf=\"loading\" class=\"doc-loading\">Loading document...</div>\n <div *ngIf=\"error && !loading\" class=\"doc-unavailable\">\n <i class=\"mdi mdi-information-outline\"></i>\n {{ error }}\n </div>\n <object\n *ngIf=\"previewUrl && !loading\"\n [data]=\"previewUrl\"\n type=\"application/pdf\"\n class=\"doc-pdf\"\n >\n PDF preview is not supported in this browser.\n </object>\n </div>\n </div>\n `,\n styles: [\n `\n .epistola-doc-panel {\n border: 1px solid #dee2e6;\n border-radius: 4px;\n background: #f8f9fa;\n display: flex;\n flex-direction: column;\n }\n .doc-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.5rem 1rem;\n border-bottom: 1px solid #dee2e6;\n font-weight: bold;\n color: #495057;\n }\n .doc-controls {\n display: flex;\n gap: 0.25rem;\n }\n .doc-icon-btn {\n background: none;\n border: 1px solid #6c757d;\n border-radius: 4px;\n color: #6c757d;\n padding: 0.25rem 0.5rem;\n font-size: 0.9rem;\n cursor: pointer;\n }\n .doc-icon-btn:hover:not(:disabled) {\n background: #e9ecef;\n }\n .doc-icon-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .doc-body {\n display: flex;\n flex-direction: column;\n min-height: 500px;\n }\n .doc-loading,\n .doc-unavailable {\n padding: 2rem;\n text-align: center;\n color: #6c757d;\n font-style: italic;\n }\n .doc-unavailable i {\n margin-right: 0.25rem;\n }\n .doc-pdf {\n width: 100%;\n flex: 1;\n min-height: 500px;\n }\n .design-info {\n padding: 1rem;\n min-height: auto;\n }\n .design-section {\n margin-bottom: 0.5rem;\n }\n .design-label {\n font-size: 0.7rem;\n text-transform: uppercase;\n color: #868e96;\n font-weight: 600;\n letter-spacing: 0.05em;\n }\n .design-value {\n font-family: monospace;\n font-size: 0.85rem;\n color: #212529;\n margin-bottom: 0.25rem;\n }\n .design-tag {\n font-size: 0.7rem;\n font-weight: normal;\n color: #6c757d;\n font-style: italic;\n }\n `,\n ],\n})\nexport class EpistolaDocumentComponent\n implements FormioCustomComponent<unknown>, OnChanges, OnDestroy\n{\n @Input() value: unknown;\n @Output() valueChange = new EventEmitter<unknown>();\n\n @Input() disabled = false;\n @Input() label = 'Document';\n\n /** How to present the document. `both` (default) shows an inline panel with a download icon. */\n @Input() display: EpistolaDocumentDisplay = 'both';\n\n /**\n * Process-variable name holding the Epistola result. Default: `epistolaResult`.\n *\n * Type-tolerant on the backend: if the named variable holds a rich result object\n * (`Map<String, Object>` written by `generate-document` and updated by the result\n * collector), the backend digs out the `documentId` key. If it holds a plain\n * String (custom flow that wrote a bare id), the backend uses it as-is.\n */\n @Input() documentVariable = 'epistolaResult';\n\n /** Process-variable name holding the Epistola tenant id. Default: `epistolaTenantId`. */\n @Input() tenantIdVariable = 'epistolaTenantId';\n\n /** Filename used for the download disposition. */\n @Input() filename = 'document.pdf';\n\n /**\n * Task id forwarded by the Formio wrapper from the server-prefilled form\n * ({@code epistola:taskId} value resolver), populated in every Valtimo task-open flow.\n */\n @Input() taskInstanceId?: string | null;\n\n loading = false;\n downloading = false;\n error: string | null = null;\n previewUrl: SafeResourceUrl | null = null;\n\n private currentBlobUrl: string | null = null;\n private subscription?: Subscription;\n\n get designMode(): boolean {\n return !this.formIoStateService.documentId;\n }\n\n constructor(\n private readonly epistolaPluginService: EpistolaPluginService,\n private readonly sanitizer: DomSanitizer,\n private readonly formIoStateService: FormIoStateService,\n private readonly cdr: ChangeDetectorRef,\n ) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (this.designMode || this.display === 'button') {\n return;\n }\n // The Formio wrapper sets taskInstanceId around attach, so it can arrive after the\n // first change — (re)load the inline document once it's available instead of leaving\n // the \"Document is alleen beschikbaar binnen een taak\" message until a manual refresh.\n // (For display=\"button\" the download() click reads the task id on demand.)\n if (changes['taskInstanceId'] && this.taskInstanceId) {\n this.loadInline();\n }\n }\n\n ngOnDestroy(): void {\n this.subscription?.unsubscribe();\n this.revokeBlobUrl();\n }\n\n refresh(): void {\n this.loadInline();\n }\n\n download(): void {\n if (this.designMode || this.downloading) {\n return;\n }\n const request = this.buildRequest('attachment');\n if (!request) return;\n this.downloading = true;\n this.error = null;\n this.cdr.markForCheck();\n\n this.epistolaPluginService.downloadDocumentBlob(request).subscribe({\n next: (blob) => {\n const objectUrl = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = objectUrl;\n anchor.download = this.filename;\n anchor.click();\n URL.revokeObjectURL(objectUrl);\n this.downloading = false;\n this.cdr.markForCheck();\n },\n error: (err) => {\n this.error = err.status === 404 ? 'Document is nog niet gegenereerd.' : 'Download mislukt.';\n this.downloading = false;\n this.cdr.markForCheck();\n },\n });\n }\n\n private loadInline(): void {\n const request = this.buildRequest('inline');\n if (!request) return;\n this.loading = true;\n this.error = null;\n this.cdr.markForCheck();\n this.revokeBlobUrl();\n\n this.subscription?.unsubscribe();\n this.subscription = this.epistolaPluginService.downloadDocumentBlob(request).subscribe({\n next: (blob) => {\n this.currentBlobUrl = URL.createObjectURL(blob);\n this.previewUrl = this.sanitizer.bypassSecurityTrustResourceUrl(this.currentBlobUrl);\n this.loading = false;\n this.cdr.markForCheck();\n },\n error: (err) => {\n this.previewUrl = null;\n this.error =\n err.status === 404\n ? 'Document is nog niet gegenereerd.'\n : 'Document kon niet geladen worden.';\n this.loading = false;\n this.cdr.markForCheck();\n },\n });\n }\n\n private buildRequest(disposition: 'inline' | 'attachment'): DownloadDocumentRequest | null {\n const taskId = this.taskInstanceId ?? null;\n const caseDocumentId = this.formIoStateService.documentId;\n if (!taskId || !caseDocumentId) {\n this.error = 'Document is alleen beschikbaar binnen een taak.';\n this.cdr.markForCheck();\n return null;\n }\n return {\n taskId,\n caseDocumentId,\n documentVariable: this.documentVariable,\n tenantIdVariable: this.tenantIdVariable,\n filename: this.filename,\n disposition,\n };\n }\n\n private revokeBlobUrl(): void {\n if (this.currentBlobUrl) {\n URL.revokeObjectURL(this.currentBlobUrl);\n this.currentBlobUrl = null;\n this.previewUrl = null;\n }\n }\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport { FormioCustomComponent } from '@valtimo/components';\nimport { FormioModule } from '@formio/angular';\nimport { Subject, Subscription } from 'rxjs';\nimport { debounceTime, switchMap } from 'rxjs/operators';\nimport { EpistolaPluginService } from '../../services';\n\n@Component({\n standalone: true,\n imports: [CommonModule, FormioModule],\n selector: 'epistola-retry-form-component',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div *ngIf=\"loading\" class=\"epistola-retry-loading\">Loading form...</div>\n <div *ngIf=\"error\" class=\"epistola-retry-error\">{{ error }}</div>\n <div\n *ngIf=\"formDefinition && !loading\"\n class=\"epistola-retry-container\"\n [class.preview-expanded]=\"previewExpanded\"\n >\n <div class=\"epistola-retry-form\" [hidden]=\"previewExpanded\">\n <formio\n [form]=\"formDefinition\"\n [submission]=\"submission\"\n (change)=\"onFormChange($event)\"\n [options]=\"formOptions\"\n ></formio>\n </div>\n <div class=\"epistola-retry-preview\">\n <div class=\"preview-header\">\n <span>Preview</span>\n <button type=\"button\" class=\"preview-toggle\" (click)=\"togglePreview()\">\n {{ previewExpanded ? 'Show form' : 'Expand' }}\n </button>\n </div>\n <div *ngIf=\"previewLoading\" class=\"preview-loading\">Generating preview...</div>\n <object\n *ngIf=\"previewUrl && !previewLoading\"\n [data]=\"previewUrl\"\n type=\"application/pdf\"\n class=\"preview-pdf\"\n >\n PDF preview not supported in this browser.\n </object>\n <div *ngIf=\"previewError\" class=\"preview-error\">{{ previewError }}</div>\n <div *ngIf=\"!previewUrl && !previewLoading && !previewError\" class=\"preview-empty\">\n Edit fields to see a preview\n </div>\n </div>\n </div>\n `,\n styles: [\n `\n .epistola-retry-loading {\n padding: 1rem;\n color: #6c757d;\n }\n .epistola-retry-error {\n padding: 0.5rem;\n color: #dc3545;\n }\n .epistola-retry-container {\n display: flex;\n gap: 1rem;\n }\n .epistola-retry-form {\n flex: 2;\n min-width: 0;\n }\n .epistola-retry-preview {\n flex: 1;\n min-width: 0;\n border: 1px solid #dee2e6;\n border-radius: 4px;\n padding: 1rem;\n background: #f8f9fa;\n display: flex;\n flex-direction: column;\n }\n .preview-expanded .epistola-retry-preview {\n flex: 1;\n }\n .preview-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-weight: bold;\n margin-bottom: 0.5rem;\n color: #495057;\n }\n .preview-toggle {\n background: none;\n border: 1px solid #6c757d;\n border-radius: 4px;\n color: #6c757d;\n padding: 0.2rem 0.5rem;\n font-size: 0.75rem;\n cursor: pointer;\n }\n .preview-toggle:hover {\n background: #e9ecef;\n }\n .preview-loading {\n color: #6c757d;\n font-style: italic;\n }\n .preview-pdf {\n width: 100%;\n flex: 1;\n min-height: 500px;\n }\n .preview-expanded .preview-pdf {\n min-height: 80vh;\n }\n .preview-error {\n color: #dc3545;\n }\n .preview-empty {\n color: #6c757d;\n font-style: italic;\n }\n `,\n ],\n})\nexport class EpistolaRetryFormComponent\n implements FormioCustomComponent<string>, OnChanges, OnDestroy\n{\n @Input() value!: string;\n @Output() valueChange = new EventEmitter<string>();\n\n @Input() disabled = false;\n @Input() label = 'Document Data';\n @Input() sourceActivityId?: string;\n /**\n * Task id forwarded by the Formio wrapper from the server-prefilled form\n * ({@code epistola:taskId} value resolver), populated in every Valtimo task-open flow.\n */\n @Input() taskInstanceId?: string | null;\n\n formDefinition: any;\n submission: any;\n loading = true;\n error: string | null = null;\n previewUrl: SafeResourceUrl | null = null;\n previewLoading = false;\n previewError: string | null = null;\n previewExpanded = false;\n private loaded = false;\n private loadSubscription?: Subscription;\n private previewSubscription?: Subscription;\n private previewSubject = new Subject<any>();\n private currentBlobUrl: string | null = null;\n private resolvedSourceActivityId?: string;\n\n formOptions: any = {\n noAlerts: true,\n buttonSettings: { showCancel: false, showSubmit: false, showPrevious: false, showNext: false },\n };\n\n constructor(\n private readonly epistolaPluginService: EpistolaPluginService,\n private readonly cdr: ChangeDetectorRef,\n private readonly sanitizer: DomSanitizer,\n ) {\n // Debounce preview calls\n this.previewSubscription = this.previewSubject.pipe(debounceTime(1500)).subscribe((data) => {\n this.loadPreview(data);\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!this.loaded) {\n this.loaded = true;\n this.loadForm();\n return;\n }\n // The Formio wrapper sets taskInstanceId after attach, so it can land after the\n // first render — if the form failed to load for lack of a task id, retry once it\n // arrives instead of leaving the \"only available from within a user task\" message.\n if (changes['taskInstanceId'] && this.taskInstanceId && !this.formDefinition) {\n this.loadForm();\n }\n }\n\n ngOnDestroy(): void {\n this.loadSubscription?.unsubscribe();\n this.previewSubscription?.unsubscribe();\n if (this.currentBlobUrl) {\n URL.revokeObjectURL(this.currentBlobUrl);\n }\n }\n\n togglePreview(): void {\n this.previewExpanded = !this.previewExpanded;\n this.cdr.markForCheck();\n }\n\n onFormChange(event: any): void {\n if (event?.data) {\n const json = JSON.stringify(event.data);\n this.value = json; // Formio reads element.value on change event\n this.valueChange.emit(json);\n // Trigger debounced preview\n this.previewSubject.next(event.data);\n }\n }\n\n private loadPreview(formData: any): void {\n // The backend derives the process instance and case document from the task.\n const taskId = this.taskInstanceId ?? null;\n if (!taskId) {\n this.previewError = 'Preview is only available from within a user task.';\n this.cdr.markForCheck();\n return;\n }\n\n this.previewLoading = true;\n this.previewError = null;\n this.cdr.markForCheck();\n\n // Revoke previous blob URL to prevent memory leaks\n if (this.currentBlobUrl) {\n URL.revokeObjectURL(this.currentBlobUrl);\n this.currentBlobUrl = null;\n }\n\n this.epistolaPluginService\n .previewToBlob({\n taskId,\n sourceActivityId: this.sourceActivityId || null,\n overrides: formData,\n })\n .subscribe({\n next: (blob) => {\n this.currentBlobUrl = URL.createObjectURL(blob);\n this.previewUrl = this.sanitizer.bypassSecurityTrustResourceUrl(this.currentBlobUrl);\n this.previewError = null;\n this.previewLoading = false;\n this.cdr.markForCheck();\n },\n error: (err) => {\n this.previewUrl = null;\n // Try to extract error message from JSON response body\n if (err.error instanceof Blob) {\n err.error.text().then((text: string) => {\n try {\n const body = JSON.parse(text);\n this.previewError = body.details || body.error || 'Preview could not be generated';\n } catch {\n this.previewError = 'Preview could not be generated';\n }\n this.previewLoading = false;\n this.cdr.markForCheck();\n });\n } else {\n this.previewError = err.error?.error || 'Preview could not be generated';\n this.previewLoading = false;\n this.cdr.markForCheck();\n }\n },\n });\n }\n\n private loadForm(): void {\n // The backend derives the process instance and case document from the task.\n const taskId = this.taskInstanceId ?? null;\n if (!taskId) {\n this.error = 'Retry form is only available from within a user task.';\n this.loading = false;\n this.cdr.markForCheck();\n return;\n }\n\n this.loadSubscription = this.epistolaPluginService\n .getRetryForm(taskId, this.sourceActivityId)\n .subscribe({\n next: (form) => {\n this.formDefinition = form;\n if (this.value) {\n try {\n this.submission = { data: JSON.parse(this.value) };\n } catch {\n // value is not valid JSON, start fresh\n }\n }\n this.loading = false;\n this.cdr.markForCheck();\n },\n error: (err) => {\n console.error('Failed to load retry form', err);\n this.error = 'Failed to load the retry form. Please try again.';\n this.loading = false;\n this.cdr.markForCheck();\n },\n });\n }\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport { FormioCustomComponent, FormIoStateService } from '@valtimo/components';\nimport { Subscription } from 'rxjs';\nimport { EpistolaPluginService } from '../../services';\nimport { shouldLoadPreview } from './preview-utils';\nimport {\n isLegacyOverrideMapping,\n legacyOverrideToJsonata,\n} from '../override-builder/legacy-override-converter';\n\n@Component({\n standalone: true,\n imports: [CommonModule],\n selector: 'epistola-document-preview-component',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <!-- Design-time view: show configuration summary when no runtime context -->\n <div *ngIf=\"designMode\" class=\"epistola-preview-panel\">\n <div class=\"preview-header\">\n <span>{{ label || 'Document Preview' }}</span>\n </div>\n <div class=\"preview-body design-info\">\n <div class=\"design-section\" *ngIf=\"sourceActivityId\">\n <div class=\"design-label\">Process</div>\n <div class=\"design-value\">{{ processDefinitionKey || '(any)' }}</div>\n <div class=\"design-label\">Activity</div>\n <div class=\"design-value\">{{ sourceActivityId }}</div>\n </div>\n <div class=\"design-section\" *ngIf=\"overrideExpression\">\n <div class=\"design-label\">Input Overrides ($form)</div>\n <pre class=\"design-expression\">{{ overrideExpression }}</pre>\n </div>\n <div *ngIf=\"!sourceActivityId\" class=\"design-unconfigured\">\n Auto-discover mode (no process link configured)\n </div>\n </div>\n </div>\n\n <!-- Runtime view: actual preview -->\n <div *ngIf=\"!designMode\" class=\"epistola-preview-panel\">\n <div class=\"preview-header\">\n <span>{{ label || 'Document Preview' }}</span>\n <div class=\"preview-controls\">\n <label\n *ngIf=\"overrideMapping\"\n class=\"preview-autorefresh\"\n title=\"Automatically refresh the preview as you fill in the form\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"autoRefreshEnabled\"\n (change)=\"onToggleAutoRefresh($event)\"\n />\n Auto-refresh\n </label>\n <button type=\"button\" class=\"preview-refresh\" [disabled]=\"loading\" (click)=\"refresh()\">\n <i class=\"mdi mdi-refresh mr-1\"></i>\n {{ loading ? 'Generating...' : 'Refresh' }}\n </button>\n </div>\n </div>\n <div class=\"preview-body\">\n <div *ngIf=\"loading\" class=\"preview-loading\">Generating preview...</div>\n <div *ngIf=\"error && !loading\" class=\"preview-unavailable\">\n <i class=\"mdi mdi-information-outline\"></i>\n {{ error }}\n </div>\n <object\n *ngIf=\"previewUrl && !loading\"\n [data]=\"previewUrl\"\n type=\"application/pdf\"\n class=\"preview-pdf\"\n >\n PDF preview is not supported in this browser.\n </object>\n </div>\n </div>\n `,\n styles: [\n `\n .epistola-preview-panel {\n border: 1px solid #dee2e6;\n border-radius: 4px;\n background: #f8f9fa;\n display: flex;\n flex-direction: column;\n }\n .preview-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.5rem 1rem;\n border-bottom: 1px solid #dee2e6;\n font-weight: bold;\n color: #495057;\n flex-wrap: wrap;\n gap: 0.5rem;\n }\n .preview-controls {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n }\n .preview-autorefresh {\n display: flex;\n align-items: center;\n gap: 0.3rem;\n font-size: 0.8rem;\n font-weight: normal;\n color: #495057;\n cursor: pointer;\n margin: 0;\n white-space: nowrap;\n }\n .preview-autorefresh input {\n cursor: pointer;\n margin: 0;\n }\n .preview-select {\n border: 1px solid #ced4da;\n border-radius: 4px;\n padding: 0.25rem 0.5rem;\n font-size: 0.8rem;\n background: white;\n max-width: 300px;\n }\n .preview-refresh {\n background: none;\n border: 1px solid #6c757d;\n border-radius: 4px;\n color: #6c757d;\n padding: 0.25rem 0.75rem;\n font-size: 0.8rem;\n cursor: pointer;\n display: flex;\n align-items: center;\n white-space: nowrap;\n }\n .preview-refresh:hover:not(:disabled) {\n background: #e9ecef;\n }\n .preview-refresh:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .preview-body {\n display: flex;\n flex-direction: column;\n min-height: 500px;\n }\n .preview-loading {\n padding: 2rem;\n text-align: center;\n color: #6c757d;\n font-style: italic;\n }\n .preview-unavailable {\n padding: 1.5rem;\n text-align: center;\n color: #6c757d;\n font-style: italic;\n }\n .preview-unavailable i {\n margin-right: 0.25rem;\n }\n .preview-pdf {\n width: 100%;\n flex: 1;\n min-height: 500px;\n }\n .preview-empty {\n padding: 2rem;\n text-align: center;\n color: #6c757d;\n font-style: italic;\n }\n .design-info {\n padding: 1rem;\n min-height: auto;\n }\n .design-section {\n margin-bottom: 0.75rem;\n }\n .design-label {\n font-size: 0.7rem;\n text-transform: uppercase;\n color: #868e96;\n font-weight: 600;\n letter-spacing: 0.05em;\n }\n .design-value {\n font-family: monospace;\n font-size: 0.85rem;\n color: #212529;\n margin-bottom: 0.25rem;\n }\n .design-expression {\n font-family: monospace;\n font-size: 0.8rem;\n color: #212529;\n background: #eef0f2;\n border-radius: 4px;\n padding: 0.5rem;\n margin: 0.25rem 0 0;\n white-space: pre-wrap;\n word-break: break-word;\n }\n .design-unconfigured {\n color: #6c757d;\n font-style: italic;\n font-size: 0.85rem;\n }\n `,\n ],\n})\nexport class EpistolaDocumentPreviewComponent\n implements FormioCustomComponent<Record<string, any> | null>, OnChanges, OnDestroy\n{\n @Input() value!: Record<string, any> | null;\n @Output() valueChange = new EventEmitter<Record<string, any> | null>();\n\n @Input() disabled = false;\n @Input() label = 'Document Preview';\n @Input() processDefinitionKey?: string;\n @Input() sourceActivityId?: string;\n /**\n * The override mapping: a JSONata expression string over `$form`, or — for\n * not-yet-re-saved forms — the legacy `form:`-ref object.\n */\n @Input() overrideMapping?: string | Record<string, any>;\n /**\n * Task id forwarded by the Formio wrapper from the server-prefilled form\n * ({@code epistola:taskId} value resolver), populated in every Valtimo task-open flow.\n */\n @Input() taskInstanceId?: string | null;\n /**\n * The computed input overrides (`{ doc, pv }`) the preview renders with, pushed\n * by the Formio wrapper. Kept separate from the Formio `value`: Valtimo's custom\n * component bridge only mirrors `value` to the DOM (never to Formio's data\n * model), so Formio resets it to `emptyValue` on every redraw — which would\n * cancel the preview. This dedicated input is never touched by Formio.\n */\n @Input() inputOverrides?: Record<string, any> | null;\n /**\n * Forces the Formio wrapper to recompute the input overrides from the live form\n * data. Set by the wrapper for override-driven previews; lets the Refresh button\n * work before the first change (e.g. on initial load with pre-filled fields).\n */\n @Input() requestOverrides?: () => void;\n /**\n * Current auto-refresh state, forwarded by the wrapper (seeded from the builder's\n * `autoRefresh` option, default on). Seeds the header toggle's initial state.\n */\n @Input() autoRefresh?: boolean;\n /**\n * Tells the wrapper to enable/disable auto-refresh (recompute on change/blur).\n * Set by the wrapper for override-driven previews; called by the header toggle.\n */\n @Input() setAutoRefresh?: (enabled: boolean) => void;\n\n /** Runtime state of the header auto-refresh toggle. */\n autoRefreshEnabled = true;\n\n loading = false;\n error: string | null = null;\n previewUrl: SafeResourceUrl | null = null;\n designMode = false;\n private initialized = false;\n private currentBlobUrl: string | null = null;\n private previewSubscription?: Subscription;\n\n constructor(\n private readonly epistolaPluginService: EpistolaPluginService,\n private readonly sanitizer: DomSanitizer,\n private readonly formIoStateService: FormIoStateService,\n private readonly cdr: ChangeDetectorRef,\n ) {}\n\n /**\n * The active task id, forwarded by the Formio wrapper from the server-prefilled\n * form ({@code epistola:taskId} value resolver). Null outside a task context\n * (e.g. Formio builder), in which case the component fails closed.\n */\n private get currentTaskId(): string | null {\n return this.taskInstanceId ?? null;\n }\n\n /**\n * The override mapping as a JSONata expression for the design-mode summary.\n * Legacy `form:`-ref objects are converted on the fly for display.\n */\n get overrideExpression(): string {\n const mapping = this.overrideMapping;\n if (!mapping) return '';\n return isLegacyOverrideMapping(mapping) ? legacyOverrideToJsonata(mapping) : String(mapping);\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n // Seed the runtime auto-refresh toggle from the wrapper-forwarded state.\n if (changes['autoRefresh']) {\n this.autoRefreshEnabled = this.autoRefresh !== false;\n }\n if (!this.initialized) {\n this.initialized = true;\n\n // Detect design mode: no runtime context (Formio builder)\n const documentId = this.formIoStateService.documentId;\n if (!documentId) {\n this.designMode = true;\n this.cdr.markForCheck();\n return;\n }\n\n if (!this.sourceActivityId) {\n this.error = 'Preview is not configured: set the source activity on the form component.';\n this.cdr.markForCheck();\n return;\n }\n\n this.triggerPreview();\n return;\n }\n\n if (this.designMode) return;\n\n // React to input-override changes, and to the task id arriving late: the Formio\n // wrapper sets taskInstanceId after attach, so it can land after the first render —\n // re-run the preview once it does, instead of leaving the \"only available from\n // within a user task\" message until a manual refresh.\n if (changes['inputOverrides'] || changes['taskInstanceId']) {\n this.triggerPreview();\n }\n }\n\n ngOnDestroy(): void {\n this.previewSubscription?.unsubscribe();\n this.revokeBlobUrl();\n }\n\n refresh(): void {\n // For an override-driven preview whose value isn't ready yet (e.g. initial load\n // before the overrides have been computed), recompute from the live form data;\n // the resulting value change drives the preview. Otherwise re-fetch directly.\n if (this.requestOverrides && !shouldLoadPreview(this.overrideMapping, this.inputOverrides)) {\n this.requestOverrides();\n return;\n }\n this.triggerPreview();\n }\n\n /** Toggle auto-refresh for this session; flipping it on triggers an immediate refresh. */\n onToggleAutoRefresh(event: Event): void {\n const enabled = (event.target as HTMLInputElement).checked;\n this.autoRefreshEnabled = enabled;\n // The wrapper owns the change/blur listeners, so it must learn about the flip;\n // turning it on recomputes immediately (handled wrapper-side).\n this.setAutoRefresh?.(enabled);\n this.cdr.markForCheck();\n }\n\n /**\n * Load the preview only when there is enough data for it. Override-driven\n * previews (those with an override mapping) wait until the mapped form data\n * has been computed; until then they show a placeholder rather than firing a\n * request that Epistola would reject with a 400 for missing required fields.\n */\n private triggerPreview(): void {\n if (!shouldLoadPreview(this.overrideMapping, this.inputOverrides)) {\n this.showWaitingForInput();\n return;\n }\n this.loadPreview();\n }\n\n private showWaitingForInput(): void {\n this.revokeBlobUrl();\n this.previewSubscription?.unsubscribe();\n this.previewUrl = null;\n this.loading = false;\n this.error = 'Complete the form to generate a preview.';\n this.cdr.markForCheck();\n }\n\n /**\n * Preview using the explicitly configured process link + input overrides.\n * Requires a runtime task context — the backend authorizes the request against\n * the task's process instance and case document, so all three ids must match.\n */\n private loadPreview(): void {\n if (!this.sourceActivityId) {\n this.error = 'Preview is not configured: set the source activity on the form component.';\n this.cdr.markForCheck();\n return;\n }\n\n // The backend derives the process instance and case document from the task, so the\n // task id is the only runtime context the request carries.\n const taskId = this.currentTaskId;\n if (!taskId) {\n this.error = 'Preview is only available from within a user task.';\n this.cdr.markForCheck();\n return;\n }\n\n this.loading = true;\n this.error = null;\n this.cdr.markForCheck();\n this.revokeBlobUrl();\n\n this.previewSubscription?.unsubscribe();\n this.previewSubscription = this.epistolaPluginService\n .previewToBlob({\n taskId,\n sourceActivityId: this.sourceActivityId,\n inputOverrides: this.inputOverrides || null,\n overrides: null,\n })\n .subscribe({\n next: (blob) => this.handlePreviewSuccess(blob),\n error: (err) => this.handlePreviewError(err),\n });\n }\n\n private handlePreviewSuccess(blob: Blob): void {\n this.currentBlobUrl = URL.createObjectURL(blob);\n this.previewUrl = this.sanitizer.bypassSecurityTrustResourceUrl(this.currentBlobUrl);\n this.error = null;\n this.loading = false;\n this.cdr.markForCheck();\n }\n\n private handlePreviewError(err: any): void {\n this.previewUrl = null;\n if (err.error instanceof Blob) {\n err.error.text().then((text: string) => {\n try {\n const body = JSON.parse(text);\n this.error = body.details || body.error || 'Preview could not be generated';\n } catch {\n this.error = 'Preview could not be generated';\n }\n this.loading = false;\n this.cdr.markForCheck();\n });\n } else {\n this.error = err.error?.error || 'Preview could not be generated';\n this.loading = false;\n this.cdr.markForCheck();\n }\n }\n\n private revokeBlobUrl(): void {\n if (this.currentBlobUrl) {\n URL.revokeObjectURL(this.currentBlobUrl);\n this.currentBlobUrl = null;\n this.previewUrl = null;\n }\n }\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport { Component, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ActivatedRoute, Router, RouterModule } from '@angular/router';\nimport { PluginTranslatePipeModule } from '@valtimo/plugin';\nimport { TabsModule } from 'carbon-components-angular/tabs';\nimport { TagModule } from 'carbon-components-angular/tag';\nimport { EpistolaAdminService } from '../../services/epistola-admin.service';\nimport {\n BpmnValidationReport,\n BpmnValidationViolation,\n CatalogRedeployResult,\n ChangelogRelease,\n ClasspathCatalog,\n ConnectionStatus,\n FormCarrierIssue,\n LegacyOverrideForm,\n PendingJob,\n PluginUsageEntry,\n} from '../../models';\n\n/**\n * Combined view model for a single plugin configuration card.\n */\ninterface ConfigurationCard {\n configurationId: string;\n configurationTitle: string;\n tenantId: string;\n reachable: boolean;\n latencyMs: number;\n errorMessage?: string;\n serverVersion?: string;\n usageCount: number;\n problemCount: number;\n usageEntries: PluginUsageEntry[];\n pendingJobs: PendingJob[];\n}\n\n@Component({\n selector: 'epistola-admin-page',\n templateUrl: './epistola-admin-page.component.html',\n styleUrls: ['./epistola-admin-page.component.scss'],\n standalone: true,\n imports: [CommonModule, RouterModule, PluginTranslatePipeModule, TabsModule, TagModule],\n})\nexport class EpistolaAdminPageComponent implements OnInit {\n cards: ConfigurationCard[] = [];\n selectedCard: ConfigurationCard | null = null;\n activeTab: 'actions' | 'pending' | 'catalogs' = 'actions';\n // NOTE: the 'forms' tab is TEMPORARY (remove in 1.0.0) — see the carrier-repair block below.\n overviewTab: 'configurations' | 'validations' | 'changelog' | 'forms' = 'configurations';\n loading = false;\n pluginVersion: string | null = null;\n changelog: ChangelogRelease[] | null = null;\n changelogLoading = false;\n validationReport: BpmnValidationReport | null = null;\n reconcilingExecutionIds = new Set<string>();\n reconcileFeedback: {\n executionId: string;\n type: 'success' | 'pending' | 'error';\n message: string;\n } | null = null;\n\n catalogs: ClasspathCatalog[] = [];\n catalogsLoading = false;\n redeployingSlugs = new Set<string>();\n catalogFeedback: {\n slug: string;\n type: 'success' | 'error';\n message: string;\n } | null = null;\n\n // TEMPORARY (removed in 1.0.0): task-id carrier detection + repair.\n formIssues: FormCarrierIssue[] | null = null;\n formIssuesLoading = false;\n repairingFormIds = new Set<string>();\n repairingAll = false;\n formFeedback: {\n formId: string;\n type: 'success' | 'error';\n message: string;\n } | null = null;\n\n // TEMPORARY: forms still using the legacy override-mapping object format.\n legacyOverrideForms: LegacyOverrideForm[] | null = null;\n legacyOverrideLoading = false;\n\n private connectionStatuses: ConnectionStatus[] = [];\n private usageEntries: PluginUsageEntry[] = [];\n private pendingJobs: PendingJob[] = [];\n private connectionLoaded = false;\n private usageLoaded = false;\n private pendingLoaded = false;\n private deepLinkConfigId: string | null = null;\n\n constructor(\n private readonly adminService: EpistolaAdminService,\n private readonly route: ActivatedRoute,\n private readonly router: Router,\n ) {}\n\n /** Violations from the latest report (empty when healthy or not yet loaded). */\n get validationViolations(): BpmnValidationViolation[] {\n return this.validationReport?.violations ?? [];\n }\n\n /** Scan cadence in whole minutes, for the \"refreshes every N min\" note. */\n get refreshIntervalMinutes(): number {\n return Math.round((this.validationReport?.refreshIntervalMs ?? 600000) / 60000);\n }\n\n /** Combined \"forms needing attention\" count for the tab badge (carrier + legacy override). */\n get formsAttentionCount(): number {\n return (this.formIssues?.length ?? 0) + (this.legacyOverrideForms?.length ?? 0);\n }\n\n /** Whether the forms tab has loaded at least one of its two scans. */\n get formsScanLoaded(): boolean {\n return this.formIssues !== null || this.legacyOverrideForms !== null;\n }\n\n ngOnInit(): void {\n this.deepLinkConfigId = this.route.snapshot.queryParamMap.get('configurationId');\n const tab = this.route.snapshot.queryParamMap.get('tab');\n if (tab === 'pending' || tab === 'actions' || tab === 'catalogs') {\n this.activeTab = tab;\n }\n this.loadData();\n this.loadPluginVersion();\n }\n\n selectConfiguration(card: ConfigurationCard): void {\n this.selectedCard = card;\n this.activeTab = 'actions';\n this.updateUrl(card.configurationId, this.activeTab);\n this.loadCatalogs(card.configurationId);\n }\n\n backToOverview(): void {\n this.selectedCard = null;\n this.activeTab = 'actions';\n this.catalogs = [];\n this.catalogFeedback = null;\n this.updateUrl(null, null);\n }\n\n setActiveTab(tab: 'actions' | 'pending' | 'catalogs'): void {\n this.activeTab = tab;\n this.updateUrl(this.selectedCard?.configurationId ?? null, tab);\n }\n\n // 'forms' is TEMPORARY (remove in 1.0.0).\n setOverviewTab(tab: 'configurations' | 'validations' | 'changelog' | 'forms'): void {\n this.overviewTab = tab;\n if (tab === 'changelog' && this.changelog === null && !this.changelogLoading) {\n this.loadChangelog();\n }\n if (tab === 'forms' && this.formIssues === null && !this.formIssuesLoading) {\n this.loadFormIssues();\n }\n if (tab === 'forms' && this.legacyOverrideForms === null && !this.legacyOverrideLoading) {\n this.loadLegacyOverrideForms();\n }\n }\n\n // ---- TEMPORARY: legacy override-mapping format detection ----\n\n private loadLegacyOverrideForms(): void {\n this.legacyOverrideLoading = true;\n this.adminService.getLegacyOverrideForms().subscribe({\n next: (forms) => {\n this.legacyOverrideForms = forms;\n this.legacyOverrideLoading = false;\n },\n error: () => {\n this.legacyOverrideForms = [];\n this.legacyOverrideLoading = false;\n },\n });\n }\n\n // ---- TEMPORARY (removed in 1.0.0): task-id carrier detection + repair ----\n\n private loadFormIssues(): void {\n this.formIssuesLoading = true;\n this.formFeedback = null;\n this.adminService.getFormCarrierIssues().subscribe({\n next: (issues) => {\n this.formIssues = issues;\n this.formIssuesLoading = false;\n },\n error: () => {\n this.formIssues = [];\n this.formIssuesLoading = false;\n },\n });\n }\n\n isRepairingForm(issue: FormCarrierIssue): boolean {\n return this.repairingFormIds.has(issue.formId);\n }\n\n repairForm(issue: FormCarrierIssue): void {\n if (this.repairingFormIds.has(issue.formId)) {\n return;\n }\n this.repairingFormIds.add(issue.formId);\n this.formFeedback = null;\n this.adminService.repairFormCarrier(issue.formId).subscribe({\n next: (result) => {\n this.repairingFormIds.delete(issue.formId);\n this.formFeedback = {\n formId: issue.formId,\n type: 'success',\n message: `OK — ${result.componentsPatched} component(s) patched`,\n };\n this.loadFormIssues();\n },\n error: (err) => {\n this.repairingFormIds.delete(issue.formId);\n const message =\n err?.error?.errorMessage ?? err?.error?.message ?? err?.message ?? 'unknown error';\n this.formFeedback = { formId: issue.formId, type: 'error', message };\n },\n });\n }\n\n repairAllForms(): void {\n if (this.repairingAll) {\n return;\n }\n this.repairingAll = true;\n this.formFeedback = null;\n this.adminService.repairAllFormCarriers().subscribe({\n next: (summary) => {\n this.repairingAll = false;\n this.formFeedback = {\n formId: 'all',\n type: summary.failed > 0 ? 'error' : 'success',\n message: `Repaired ${summary.formsRepaired} form(s), ${summary.componentsPatched} component(s)${\n summary.failed > 0 ? `, ${summary.failed} failed` : ''\n }`,\n };\n this.loadFormIssues();\n },\n error: (err) => {\n this.repairingAll = false;\n const message = err?.error?.message ?? err?.message ?? 'unknown error';\n this.formFeedback = { formId: 'all', type: 'error', message };\n },\n });\n }\n\n private loadChangelog(): void {\n this.changelogLoading = true;\n this.adminService.getChangelog().subscribe({\n next: (releases) => {\n this.changelog = releases;\n this.changelogLoading = false;\n },\n error: () => {\n this.changelog = [];\n this.changelogLoading = false;\n },\n });\n }\n\n refresh(): void {\n this.selectedCard = null;\n this.loadData();\n }\n\n exportProcessLink(entry: PluginUsageEntry): void {\n this.adminService.exportProcessLink(entry.processLinkId).subscribe({\n next: (blob) => {\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = `${entry.activityId}.process-link.json`;\n anchor.click();\n URL.revokeObjectURL(url);\n },\n });\n }\n\n /**\n * Manually reconcile a single stuck catch event. Pulls the current Epistola job\n * status and re-runs message correlation if the job is in a terminal state.\n * Refreshes the Pending list on success so the row drops out of the table.\n */\n reconcilePending(job: PendingJob): void {\n if (this.reconcilingExecutionIds.has(job.executionId)) {\n return;\n }\n this.reconcilingExecutionIds.add(job.executionId);\n this.reconcileFeedback = null;\n\n this.adminService.reconcilePending(job.executionId).subscribe({\n next: (result) => {\n this.reconcilingExecutionIds.delete(job.executionId);\n this.reconcileFeedback = {\n executionId: job.executionId,\n type: 'success',\n message: `OK (${result.epistolaStatus}, ${result.correlatedCount ?? 0} correlated)`,\n };\n this.loadData();\n },\n error: (err) => {\n this.reconcilingExecutionIds.delete(job.executionId);\n // 409 from the backend = job is still PENDING/IN_PROGRESS, surface as\n // informational rather than an error.\n if (err?.status === 409) {\n const status = err.error?.epistolaStatus ?? 'still pending';\n this.reconcileFeedback = {\n executionId: job.executionId,\n type: 'pending',\n message: `Epistola: ${status}. Try again in a moment.`,\n };\n } else {\n const message =\n err?.error?.detail ?? err?.error?.message ?? err?.message ?? 'unknown error';\n this.reconcileFeedback = {\n executionId: job.executionId,\n type: 'error',\n message,\n };\n }\n },\n });\n }\n\n isReconciling(job: PendingJob): boolean {\n return this.reconcilingExecutionIds.has(job.executionId);\n }\n\n /**\n * Load the classpath catalogs available to (re)deploy for the given\n * configuration. Lazy — only called when a configuration is opened, not for\n * every card in the overview.\n */\n private loadCatalogs(configurationId: string): void {\n this.catalogsLoading = true;\n this.catalogFeedback = null;\n this.adminService.getClasspathCatalogs(configurationId).subscribe({\n next: (catalogs) => {\n this.catalogs = catalogs;\n this.catalogsLoading = false;\n },\n error: () => {\n this.catalogs = [];\n this.catalogsLoading = false;\n },\n });\n }\n\n /**\n * Force-redeploy a single classpath catalog to the selected configuration's\n * Epistola installation. Explicit operator action — the backend bypasses the\n * templateSyncEnabled gate and the version-skip check. Reloads the catalog\n * list on success so the deployed version / up-to-date hint refreshes.\n */\n redeployCatalog(catalog: ClasspathCatalog): void {\n if (!this.selectedCard || this.redeployingSlugs.has(catalog.slug)) {\n return;\n }\n const configurationId = this.selectedCard.configurationId;\n this.redeployingSlugs.add(catalog.slug);\n this.catalogFeedback = null;\n\n this.adminService.redeployCatalog(configurationId, catalog.slug).subscribe({\n next: (result: CatalogRedeployResult) => {\n this.redeployingSlugs.delete(catalog.slug);\n this.catalogFeedback = {\n slug: catalog.slug,\n type: 'success',\n message: `OK — installed ${result.installed}, updated ${result.updated}, failed ${result.failed} (of ${result.total})`,\n };\n this.loadCatalogs(configurationId);\n },\n error: (err) => {\n this.redeployingSlugs.delete(catalog.slug);\n const message =\n err?.error?.errorMessage ??\n err?.error?.detail ??\n err?.error?.message ??\n err?.message ??\n 'unknown error';\n this.catalogFeedback = {\n slug: catalog.slug,\n type: 'error',\n message,\n };\n },\n });\n }\n\n isRedeploying(catalog: ClasspathCatalog): boolean {\n return this.redeployingSlugs.has(catalog.slug);\n }\n\n private updateUrl(configurationId: string | null, tab: string | null): void {\n this.router.navigate([], {\n relativeTo: this.route,\n queryParams: {\n configurationId: configurationId ?? null,\n tab: tab ?? null,\n },\n replaceUrl: true,\n });\n }\n\n private loadData(): void {\n this.loading = true;\n this.connectionLoaded = false;\n this.usageLoaded = false;\n this.pendingLoaded = false;\n\n this.adminService.getConnectionStatus().subscribe({\n next: (statuses) => {\n this.connectionStatuses = statuses;\n this.connectionLoaded = true;\n this.tryBuildCards();\n },\n error: () => {\n this.connectionStatuses = [];\n this.connectionLoaded = true;\n this.tryBuildCards();\n },\n });\n\n this.adminService.getPluginUsage().subscribe({\n next: (entries) => {\n this.usageEntries = entries;\n this.usageLoaded = true;\n this.tryBuildCards();\n },\n error: () => {\n this.usageEntries = [];\n this.usageLoaded = true;\n this.tryBuildCards();\n },\n });\n\n this.adminService.getPendingJobs().subscribe({\n next: (jobs) => {\n this.pendingJobs = jobs;\n this.pendingLoaded = true;\n this.tryBuildCards();\n },\n error: () => {\n this.pendingJobs = [];\n this.pendingLoaded = true;\n this.tryBuildCards();\n },\n });\n\n // Validation report is independent of cards — load alongside but don't\n // gate the loading flag on it.\n this.adminService.getValidationReport().subscribe({\n next: (report) => {\n this.validationReport = report;\n },\n error: () => {\n this.validationReport = null;\n },\n });\n }\n\n private tryBuildCards(): void {\n if (!this.connectionLoaded || !this.usageLoaded || !this.pendingLoaded) {\n return;\n }\n\n this.cards = this.connectionStatuses.map((status) => {\n const entries = this.usageEntries.filter((e) => e.configurationId === status.configurationId);\n const jobs = this.pendingJobs.filter((j) => j.tenantId === status.tenantId);\n const problemCount = entries.reduce((sum, e) => sum + e.problems.length, 0);\n\n return {\n configurationId: status.configurationId,\n configurationTitle: status.configurationTitle,\n tenantId: status.tenantId,\n reachable: status.reachable,\n latencyMs: status.latencyMs,\n errorMessage: status.errorMessage,\n serverVersion: status.serverVersion,\n usageCount: entries.length,\n problemCount,\n usageEntries: entries,\n pendingJobs: jobs,\n };\n });\n\n // Restore deep link selection\n if (this.deepLinkConfigId) {\n const match = this.cards.find((c) => c.configurationId === this.deepLinkConfigId);\n if (match) {\n this.selectedCard = match;\n this.loadCatalogs(match.configurationId);\n }\n this.deepLinkConfigId = null;\n }\n\n this.loading = false;\n }\n\n private loadPluginVersion(): void {\n this.adminService.getVersions().subscribe({\n next: (info) => {\n this.pluginVersion = info.pluginVersion;\n },\n });\n }\n}\n","<div class=\"epistola-admin\">\n <!-- Overview: tabs (no configuration selected) -->\n <ng-container *ngIf=\"!selectedCard\">\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\n <div class=\"d-flex align-items-center\">\n <h5 class=\"mb-0\">{{ 'epistolaAdminOverview' | pluginTranslate: 'epistola' | async }}</h5>\n <span *ngIf=\"pluginVersion\" class=\"version-badge ms-2\">v{{ pluginVersion }}</span>\n </div>\n <button class=\"btn btn-outline-primary btn-sm\" (click)=\"refresh()\" [disabled]=\"loading\">\n {{ 'epistolaAdminRefresh' | pluginTranslate: 'epistola' | async }}\n </button>\n </div>\n\n <ng-template #configurationsHeading>\n {{ 'epistolaAdminConfigurations' | pluginTranslate: 'epistola' | async }}\n <cds-tag size=\"sm\" type=\"gray\" class=\"ms-1\">{{ cards.length }}</cds-tag>\n </ng-template>\n\n <ng-template #validationsHeading>\n {{ 'epistolaAdminValidations' | pluginTranslate: 'epistola' | async }}\n <cds-tag size=\"sm\" [type]=\"validationViolations.length > 0 ? 'red' : 'gray'\" class=\"ms-1\">\n {{ validationViolations.length }}\n </cds-tag>\n </ng-template>\n\n <ng-template #changelogHeading>\n {{ 'epistolaAdminChangelog' | pluginTranslate: 'epistola' | async }}\n </ng-template>\n\n <!-- TEMPORARY (removed in 1.0.0): forms missing the task-id carrier -->\n <ng-template #formsHeading>\n {{ 'epistolaAdminForms' | pluginTranslate: 'epistola' | async }}\n <cds-tag\n *ngIf=\"formsScanLoaded\"\n size=\"sm\"\n [type]=\"formsAttentionCount > 0 ? 'red' : 'gray'\"\n class=\"ms-1\"\n >{{ formsAttentionCount }}</cds-tag\n >\n </ng-template>\n\n <cds-tabs [cacheActive]=\"true\" type=\"contained\">\n <cds-tab\n [heading]=\"configurationsHeading\"\n [active]=\"overviewTab === 'configurations'\"\n (selected)=\"setOverviewTab('configurations')\"\n >\n <div *ngIf=\"loading\" class=\"text-muted mt-3\">\n {{ 'epistolaAdminLoading' | pluginTranslate: 'epistola' | async }}\n </div>\n\n <div *ngIf=\"!loading && cards.length === 0\" class=\"text-muted mt-3\">\n {{ 'epistolaAdminNoConfigurations' | pluginTranslate: 'epistola' | async }}\n </div>\n\n <div *ngIf=\"!loading && cards.length > 0\" class=\"card-grid\">\n <div\n *ngFor=\"let card of cards\"\n class=\"config-card\"\n [class.config-card--ok]=\"card.reachable && card.problemCount === 0\"\n [class.config-card--warning]=\"card.reachable && card.problemCount > 0\"\n [class.config-card--error]=\"!card.reachable\"\n (click)=\"selectConfiguration(card)\"\n >\n <div class=\"config-card__header\">\n <span\n class=\"status-dot\"\n [class.status-dot--ok]=\"card.reachable\"\n [class.status-dot--error]=\"!card.reachable\"\n >\n </span>\n <h5 class=\"config-card__title\">{{ card.configurationTitle }}</h5>\n </div>\n\n <div class=\"config-card__body\">\n <div class=\"config-card__field\">\n <span class=\"config-card__label\">{{\n 'epistolaAdminTenantId' | pluginTranslate: 'epistola' | async\n }}</span>\n <code class=\"config-card__value\">{{ card.tenantId }}</code>\n </div>\n <div class=\"config-card__field\">\n <span class=\"config-card__label\">{{\n 'epistolaAdminStatus' | pluginTranslate: 'epistola' | async\n }}</span>\n <cds-tag size=\"sm\" [type]=\"card.reachable ? 'green' : 'red'\">\n {{\n card.reachable\n ? ('epistolaAdminConnected' | pluginTranslate: 'epistola' | async)\n : ('epistolaAdminUnreachable' | pluginTranslate: 'epistola' | async)\n }}\n </cds-tag>\n </div>\n <div *ngIf=\"card.serverVersion\" class=\"config-card__field\">\n <span class=\"config-card__label\">{{\n 'epistolaAdminServerVersion' | pluginTranslate: 'epistola' | async\n }}</span>\n <span class=\"config-card__value\">{{ card.serverVersion }}</span>\n </div>\n <div class=\"config-card__field\">\n <span class=\"config-card__label\">{{\n 'epistolaAdminPluginActions' | pluginTranslate: 'epistola' | async\n }}</span>\n <span class=\"config-card__value\">{{ card.usageCount }}</span>\n </div>\n <div *ngIf=\"card.pendingJobs.length > 0\" class=\"config-card__field\">\n <span class=\"config-card__label\">{{\n 'epistolaAdminPendingJobs' | pluginTranslate: 'epistola' | async\n }}</span>\n <cds-tag size=\"sm\" type=\"blue\">{{ card.pendingJobs.length }}</cds-tag>\n </div>\n <div *ngIf=\"card.problemCount > 0\" class=\"config-card__field\">\n <span class=\"config-card__label\">{{\n 'epistolaAdminProblems' | pluginTranslate: 'epistola' | async\n }}</span>\n <cds-tag size=\"sm\" type=\"red\">{{ card.problemCount }}</cds-tag>\n </div>\n </div>\n\n <div class=\"config-card__footer\">\n <span class=\"config-card__latency\">{{ card.latencyMs }} ms</span>\n </div>\n </div>\n </div>\n </cds-tab>\n\n <cds-tab\n [heading]=\"validationsHeading\"\n [active]=\"overviewTab === 'validations'\"\n (selected)=\"setOverviewTab('validations')\"\n >\n <div class=\"text-muted small mt-3\">\n <div>\n {{ 'epistolaAdminValidationLastChecked' | pluginTranslate: 'epistola' | async }}:\n <ng-container *ngIf=\"validationReport?.lastCheckedAt; else notYetRun\">\n {{ validationReport?.lastCheckedAt | date: 'medium' }}\n </ng-container>\n <ng-template #notYetRun>\n {{ 'epistolaAdminValidationNotYetRun' | pluginTranslate: 'epistola' | async }}\n </ng-template>\n · {{ 'epistolaAdminValidationAutoRefresh' | pluginTranslate: 'epistola' | async }}\n {{ refreshIntervalMinutes }} min.\n </div>\n <div>\n {{ 'epistolaAdminValidationLatestVersionNote' | pluginTranslate: 'epistola' | async }}\n </div>\n </div>\n\n <div *ngIf=\"validationViolations.length === 0\" class=\"text-muted mt-3 mb-3\">\n {{ 'epistolaAdminNoValidations' | pluginTranslate: 'epistola' | async }}\n </div>\n\n <div *ngIf=\"validationViolations.length > 0\" class=\"mt-3\">\n <p class=\"text-muted mb-3\">\n {{ 'epistolaAdminValidationWarningBody' | pluginTranslate: 'epistola' | async }}\n </p>\n <table class=\"table table-striped\">\n <thead>\n <tr>\n <th>{{ 'epistolaAdminProcess' | pluginTranslate: 'epistola' | async }}</th>\n <th>{{ 'epistolaAdminActivity' | pluginTranslate: 'epistola' | async }}</th>\n <th>{{ 'epistolaAdminValidationCode' | pluginTranslate: 'epistola' | async }}</th>\n <th>\n {{ 'epistolaAdminValidationMessage' | pluginTranslate: 'epistola' | async }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let v of validationViolations\">\n <td>\n {{ v.processDefinitionName || v.processDefinitionKey }}\n <div *ngIf=\"v.processDefinitionName\" class=\"text-muted small\">\n <code>{{ v.processDefinitionKey }}</code>\n </div>\n </td>\n <td>\n <code>{{ v.activityId }}</code>\n </td>\n <td>\n <cds-tag size=\"sm\" type=\"red\">{{ v.code }}</cds-tag>\n </td>\n <td>{{ v.message }}</td>\n </tr>\n </tbody>\n </table>\n </div>\n </cds-tab>\n\n <cds-tab\n [heading]=\"changelogHeading\"\n [active]=\"overviewTab === 'changelog'\"\n (selected)=\"setOverviewTab('changelog')\"\n >\n <div class=\"d-flex align-items-center mt-3 mb-3\">\n <span class=\"text-muted me-2\">{{\n 'epistolaAdminRunningVersion' | pluginTranslate: 'epistola' | async\n }}</span>\n <cds-tag size=\"sm\" type=\"blue\">v{{ pluginVersion || '—' }}</cds-tag>\n </div>\n\n <div *ngIf=\"changelogLoading\" class=\"text-muted mb-3\">\n {{ 'epistolaAdminLoading' | pluginTranslate: 'epistola' | async }}\n </div>\n\n <div\n *ngIf=\"!changelogLoading && changelog && changelog.length === 0\"\n class=\"text-muted mb-3\"\n >\n {{ 'epistolaAdminNoChangelog' | pluginTranslate: 'epistola' | async }}\n </div>\n\n <div\n *ngIf=\"!changelogLoading && changelog && changelog.length > 0\"\n class=\"epistola-changelog\"\n >\n <section *ngFor=\"let release of changelog\" class=\"changelog-release\">\n <div class=\"changelog-release__header\">\n <cds-tag size=\"sm\" type=\"purple\">{{ release.version }}</cds-tag>\n <span *ngIf=\"release.date\" class=\"text-muted ms-2\">{{ release.date }}</span>\n </div>\n <div *ngFor=\"let section of release.sections\" class=\"changelog-section\">\n <h6 class=\"changelog-section__title\">{{ section.title }}</h6>\n <ul class=\"changelog-section__items\">\n <li *ngFor=\"let item of section.items\">{{ item }}</li>\n </ul>\n </div>\n </section>\n </div>\n </cds-tab>\n\n <!-- TEMPORARY (removed in 1.0.0): forms missing the task-id carrier -->\n <cds-tab\n [heading]=\"formsHeading\"\n [active]=\"overviewTab === 'forms'\"\n (selected)=\"setOverviewTab('forms')\"\n >\n <p class=\"text-muted mt-3 mb-3\">\n {{ 'epistolaAdminFormsIntro' | pluginTranslate: 'epistola' | async }}\n </p>\n\n <div *ngIf=\"formIssuesLoading\" class=\"text-muted mb-3\">\n {{ 'epistolaAdminLoading' | pluginTranslate: 'epistola' | async }}\n </div>\n\n <div\n *ngIf=\"!formIssuesLoading && formIssues && formIssues.length === 0\"\n class=\"text-muted mb-3\"\n >\n {{ 'epistolaAdminNoFormIssues' | pluginTranslate: 'epistola' | async }}\n </div>\n\n <div *ngIf=\"!formIssuesLoading && formIssues && formIssues.length > 0\">\n <div class=\"mb-2\">\n <button\n class=\"btn btn-sm btn-primary\"\n (click)=\"repairAllForms()\"\n [disabled]=\"repairingAll\"\n >\n {{\n (repairingAll ? 'epistolaAdminRepairing' : 'epistolaAdminRepairAll')\n | pluginTranslate: 'epistola'\n | async\n }}\n </button>\n <span\n *ngIf=\"formFeedback && formFeedback.formId === 'all'\"\n class=\"small ms-2\"\n [class.text-success]=\"formFeedback.type === 'success'\"\n [class.text-danger]=\"formFeedback.type === 'error'\"\n >{{ formFeedback.message }}</span\n >\n </div>\n\n <table class=\"table table-striped\">\n <thead>\n <tr>\n <th>{{ 'epistolaAdminFormName' | pluginTranslate: 'epistola' | async }}</th>\n <th>{{ 'epistolaAdminFormMissing' | pluginTranslate: 'epistola' | async }}</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let issue of formIssues\">\n <td>\n <code>{{ issue.name }}</code>\n <cds-tag\n *ngIf=\"issue.readOnly\"\n size=\"sm\"\n type=\"warm-gray\"\n class=\"ms-1\"\n [title]=\"'epistolaAdminFormReadOnlyHint' | pluginTranslate: 'epistola' | async\"\n >{{\n 'epistolaAdminFormReadOnly' | pluginTranslate: 'epistola' | async\n }}</cds-tag\n >\n </td>\n <td>{{ issue.missingComponents }}</td>\n <td class=\"text-end\">\n <button\n class=\"btn btn-sm btn-outline-primary\"\n (click)=\"repairForm(issue)\"\n [disabled]=\"isRepairingForm(issue)\"\n [title]=\"'epistolaAdminRepairTooltip' | pluginTranslate: 'epistola' | async\"\n >\n {{\n (isRepairingForm(issue) ? 'epistolaAdminRepairing' : 'epistolaAdminRepair')\n | pluginTranslate: 'epistola'\n | async\n }}\n </button>\n <div\n *ngIf=\"formFeedback && formFeedback.formId === issue.formId\"\n class=\"small mt-1\"\n [class.text-success]=\"formFeedback.type === 'success'\"\n [class.text-danger]=\"formFeedback.type === 'error'\"\n >\n {{ formFeedback.message }}\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <!-- TEMPORARY: forms still using the legacy override-mapping object format -->\n <hr class=\"my-4\" />\n <h5 class=\"mb-1\">\n {{ 'epistolaAdminLegacyOverrideTitle' | pluginTranslate: 'epistola' | async }}\n </h5>\n <p class=\"text-muted mb-3\">\n {{ 'epistolaAdminLegacyOverrideIntro' | pluginTranslate: 'epistola' | async }}\n </p>\n\n <div *ngIf=\"legacyOverrideLoading\" class=\"text-muted mb-3\">\n {{ 'epistolaAdminLoading' | pluginTranslate: 'epistola' | async }}\n </div>\n\n <div\n *ngIf=\"!legacyOverrideLoading && legacyOverrideForms && legacyOverrideForms.length === 0\"\n class=\"text-muted mb-3\"\n >\n {{ 'epistolaAdminNoLegacyOverride' | pluginTranslate: 'epistola' | async }}\n </div>\n\n <table\n *ngIf=\"!legacyOverrideLoading && legacyOverrideForms && legacyOverrideForms.length > 0\"\n class=\"table table-striped\"\n >\n <thead>\n <tr>\n <th>{{ 'epistolaAdminFormName' | pluginTranslate: 'epistola' | async }}</th>\n <th>\n {{ 'epistolaAdminLegacyOverrideComponents' | pluginTranslate: 'epistola' | async }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let form of legacyOverrideForms\">\n <td>\n <code>{{ form.name }}</code>\n <cds-tag\n *ngIf=\"form.readOnly\"\n size=\"sm\"\n type=\"warm-gray\"\n class=\"ms-1\"\n [title]=\"'epistolaAdminFormReadOnlyHint' | pluginTranslate: 'epistola' | async\"\n >{{ 'epistolaAdminFormReadOnly' | pluginTranslate: 'epistola' | async }}</cds-tag\n >\n </td>\n <td>{{ form.legacyComponents }}</td>\n </tr>\n </tbody>\n </table>\n </cds-tab>\n </cds-tabs>\n </ng-container>\n\n <!-- Detail view: selected configuration -->\n <ng-container *ngIf=\"selectedCard\">\n <div class=\"detail-header mb-3\">\n <button class=\"btn btn-link btn-sm p-0\" (click)=\"backToOverview()\">\n ← {{ 'epistolaAdminBackToOverview' | pluginTranslate: 'epistola' | async }}\n </button>\n </div>\n\n <div class=\"detail-summary mb-4\">\n <h4>\n <span\n class=\"status-dot me-2\"\n [class.status-dot--ok]=\"selectedCard.reachable\"\n [class.status-dot--error]=\"!selectedCard.reachable\"\n >\n </span>\n {{ selectedCard.configurationTitle }}\n </h4>\n\n <table class=\"table table-sm detail-info-table\">\n <tbody>\n <tr>\n <th>{{ 'epistolaAdminTenantId' | pluginTranslate: 'epistola' | async }}</th>\n <td>\n <code>{{ selectedCard.tenantId }}</code>\n </td>\n </tr>\n <tr>\n <th>{{ 'epistolaAdminStatus' | pluginTranslate: 'epistola' | async }}</th>\n <td>\n <cds-tag size=\"sm\" [type]=\"selectedCard.reachable ? 'green' : 'red'\">\n {{\n selectedCard.reachable\n ? ('epistolaAdminConnected' | pluginTranslate: 'epistola' | async)\n : ('epistolaAdminUnreachable' | pluginTranslate: 'epistola' | async)\n }}\n </cds-tag>\n <span class=\"text-muted ms-2\">{{ selectedCard.latencyMs }} ms</span>\n </td>\n </tr>\n <tr *ngIf=\"selectedCard.serverVersion\">\n <th>{{ 'epistolaAdminServerVersion' | pluginTranslate: 'epistola' | async }}</th>\n <td>{{ selectedCard.serverVersion }}</td>\n </tr>\n <tr *ngIf=\"selectedCard.errorMessage\">\n <th>{{ 'epistolaAdminError' | pluginTranslate: 'epistola' | async }}</th>\n <td class=\"text-danger\">{{ selectedCard.errorMessage }}</td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <!-- Tabs -->\n <ng-template #actionsHeading>\n {{ 'epistolaAdminPluginActions' | pluginTranslate: 'epistola' | async }}\n <cds-tag size=\"sm\" type=\"gray\" class=\"ms-1\">{{ selectedCard.usageEntries.length }}</cds-tag>\n </ng-template>\n\n <ng-template #pendingHeading>\n {{ 'epistolaAdminPendingJobs' | pluginTranslate: 'epistola' | async }}\n <cds-tag\n size=\"sm\"\n [type]=\"selectedCard.pendingJobs.length > 0 ? 'blue' : 'gray'\"\n class=\"ms-1\"\n >\n {{ selectedCard.pendingJobs.length }}\n </cds-tag>\n </ng-template>\n\n <ng-template #catalogsHeading>\n {{ 'epistolaAdminCatalogs' | pluginTranslate: 'epistola' | async }}\n <cds-tag size=\"sm\" type=\"gray\" class=\"ms-1\">{{ catalogs.length }}</cds-tag>\n </ng-template>\n\n <cds-tabs [cacheActive]=\"true\" type=\"contained\">\n <cds-tab\n [heading]=\"actionsHeading\"\n [active]=\"activeTab === 'actions'\"\n (selected)=\"setActiveTab('actions')\"\n >\n <div *ngIf=\"selectedCard.usageEntries.length === 0\" class=\"text-muted mt-3 mb-3\">\n {{ 'epistolaAdminNoUsageForConfig' | pluginTranslate: 'epistola' | async }}\n </div>\n\n <table *ngIf=\"selectedCard.usageEntries.length > 0\" class=\"table table-striped mt-3\">\n <thead>\n <tr>\n <th>{{ 'epistolaAdminCase' | pluginTranslate: 'epistola' | async }}</th>\n <th>{{ 'epistolaAdminProcess' | pluginTranslate: 'epistola' | async }}</th>\n <th>{{ 'epistolaAdminActivity' | pluginTranslate: 'epistola' | async }}</th>\n <th>{{ 'epistolaAdminAction' | pluginTranslate: 'epistola' | async }}</th>\n <th>{{ 'epistolaAdminProblems' | pluginTranslate: 'epistola' | async }}</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr\n *ngFor=\"let entry of selectedCard.usageEntries\"\n [class.table-warning]=\"entry.problems.length > 0\"\n >\n <td>{{ entry.caseDefinitionKey || '-' }}</td>\n <td>\n <a\n *ngIf=\"entry.caseDefinitionKey && entry.caseDefinitionVersionTag\"\n [routerLink]=\"[\n '/case-management',\n 'case',\n entry.caseDefinitionKey,\n 'version',\n entry.caseDefinitionVersionTag,\n 'processes',\n entry.processDefinitionKey,\n ]\"\n class=\"usage-link\"\n >\n {{ entry.processDefinitionName }}\n </a>\n <span *ngIf=\"!entry.caseDefinitionKey || !entry.caseDefinitionVersionTag\">\n {{ entry.processDefinitionName }}\n </span>\n </td>\n <td>{{ entry.activityName }}</td>\n <td>\n <code>{{ entry.actionKey }}</code>\n </td>\n <td>\n <cds-tag *ngIf=\"entry.problems.length === 0\" size=\"sm\" type=\"green\">OK</cds-tag>\n <cds-tag\n *ngFor=\"let problem of entry.problems\"\n size=\"sm\"\n type=\"red\"\n class=\"d-block mb-1\"\n >\n {{ problem }}\n </cds-tag>\n </td>\n <td>\n <button\n class=\"btn btn-sm btn-outline-secondary\"\n (click)=\"exportProcessLink(entry)\"\n [title]=\"'epistolaAdminExport' | pluginTranslate: 'epistola' | async\"\n >\n ⤓\n </button>\n </td>\n </tr>\n </tbody>\n </table>\n </cds-tab>\n\n <cds-tab\n [heading]=\"pendingHeading\"\n [active]=\"activeTab === 'pending'\"\n (selected)=\"setActiveTab('pending')\"\n >\n <div *ngIf=\"selectedCard.pendingJobs.length === 0\" class=\"text-muted mt-3 mb-3\">\n {{ 'epistolaAdminNoPendingJobs' | pluginTranslate: 'epistola' | async }}\n </div>\n\n <table *ngIf=\"selectedCard.pendingJobs.length > 0\" class=\"table table-striped mt-3\">\n <thead>\n <tr>\n <th>{{ 'epistolaAdminProcess' | pluginTranslate: 'epistola' | async }}</th>\n <th>{{ 'epistolaAdminActivity' | pluginTranslate: 'epistola' | async }}</th>\n <th>{{ 'epistolaAdminStatus' | pluginTranslate: 'epistola' | async }}</th>\n <th>{{ 'epistolaAdminRequestId' | pluginTranslate: 'epistola' | async }}</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let job of selectedCard.pendingJobs\">\n <td>{{ job.processDefinitionName }}</td>\n <td>{{ job.activityName }}</td>\n <td>\n <cds-tag\n *ngIf=\"job.status === 'UNWIRED'; else waitingTag\"\n size=\"sm\"\n type=\"red\"\n [title]=\"'epistolaAdminUnwiredTooltip' | pluginTranslate: 'epistola' | async\"\n >\n {{ 'epistolaAdminStatusUnwired' | pluginTranslate: 'epistola' | async }}\n </cds-tag>\n <ng-template #waitingTag>\n <cds-tag size=\"sm\" type=\"blue\">\n {{ 'epistolaAdminStatusWaiting' | pluginTranslate: 'epistola' | async }}\n </cds-tag>\n </ng-template>\n </td>\n <td>\n <code *ngIf=\"job.status !== 'UNWIRED'\">{{ job.requestId }}</code>\n <span *ngIf=\"job.status === 'UNWIRED'\" class=\"text-muted\">—</span>\n </td>\n <td class=\"text-end\">\n <button\n *ngIf=\"job.status !== 'UNWIRED'\"\n class=\"btn btn-sm btn-outline-primary\"\n (click)=\"reconcilePending(job)\"\n [disabled]=\"isReconciling(job)\"\n [title]=\"'epistolaAdminReconcileTooltip' | pluginTranslate: 'epistola' | async\"\n >\n <span *ngIf=\"!isReconciling(job)\">\n {{ 'epistolaAdminReconcile' | pluginTranslate: 'epistola' | async }}\n </span>\n <span *ngIf=\"isReconciling(job)\">\n {{ 'epistolaAdminReconciling' | pluginTranslate: 'epistola' | async }}\n </span>\n </button>\n <span\n *ngIf=\"job.status === 'UNWIRED'\"\n class=\"text-muted small\"\n [title]=\"'epistolaAdminUnwiredTooltip' | pluginTranslate: 'epistola' | async\"\n >\n {{ 'epistolaAdminUnwiredHint' | pluginTranslate: 'epistola' | async }}\n </span>\n <div\n *ngIf=\"reconcileFeedback && reconcileFeedback.executionId === job.executionId\"\n class=\"reconcile-feedback small mt-1\"\n [class.text-success]=\"reconcileFeedback.type === 'success'\"\n [class.text-warning]=\"reconcileFeedback.type === 'pending'\"\n [class.text-danger]=\"reconcileFeedback.type === 'error'\"\n >\n {{ reconcileFeedback.message }}\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </cds-tab>\n\n <cds-tab\n [heading]=\"catalogsHeading\"\n [active]=\"activeTab === 'catalogs'\"\n (selected)=\"setActiveTab('catalogs')\"\n >\n <p class=\"text-muted mt-3 mb-3\">\n {{ 'epistolaAdminCatalogsIntro' | pluginTranslate: 'epistola' | async }}\n </p>\n\n <div *ngIf=\"catalogsLoading\" class=\"text-muted mb-3\">\n {{ 'epistolaAdminLoading' | pluginTranslate: 'epistola' | async }}\n </div>\n\n <div *ngIf=\"!catalogsLoading && catalogs.length === 0\" class=\"text-muted mb-3\">\n {{ 'epistolaAdminNoCatalogs' | pluginTranslate: 'epistola' | async }}\n </div>\n\n <table *ngIf=\"!catalogsLoading && catalogs.length > 0\" class=\"table table-striped\">\n <thead>\n <tr>\n <th>{{ 'epistolaAdminCatalogSlug' | pluginTranslate: 'epistola' | async }}</th>\n <th>{{ 'epistolaAdminCatalogVersion' | pluginTranslate: 'epistola' | async }}</th>\n <th>{{ 'epistolaAdminCatalogStatus' | pluginTranslate: 'epistola' | async }}</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let catalog of catalogs\">\n <td>\n <code>{{ catalog.slug }}</code>\n </td>\n <td>{{ catalog.version }}</td>\n <td>\n <cds-tag *ngIf=\"catalog.status === 'IN_EPISTOLA'\" size=\"sm\" type=\"green\">\n {{ 'epistolaAdminCatalogInEpistola' | pluginTranslate: 'epistola' | async }}\n </cds-tag>\n <cds-tag *ngIf=\"catalog.status === 'NOT_IN_EPISTOLA'\" size=\"sm\" type=\"red\">\n {{ 'epistolaAdminCatalogNotInEpistola' | pluginTranslate: 'epistola' | async }}\n </cds-tag>\n <cds-tag *ngIf=\"catalog.status === 'UNKNOWN'\" size=\"sm\" type=\"gray\">\n {{ 'epistolaAdminCatalogStatusUnknown' | pluginTranslate: 'epistola' | async }}\n </cds-tag>\n </td>\n <td class=\"text-end\">\n <button\n class=\"btn btn-sm btn-outline-primary\"\n (click)=\"redeployCatalog(catalog)\"\n [disabled]=\"isRedeploying(catalog)\"\n [title]=\"'epistolaAdminRedeployTooltip' | pluginTranslate: 'epistola' | async\"\n >\n <span *ngIf=\"!isRedeploying(catalog)\">\n {{ 'epistolaAdminRedeploy' | pluginTranslate: 'epistola' | async }}\n </span>\n <span *ngIf=\"isRedeploying(catalog)\">\n {{ 'epistolaAdminRedeploying' | pluginTranslate: 'epistola' | async }}\n </span>\n </button>\n <div\n *ngIf=\"catalogFeedback && catalogFeedback.slug === catalog.slug\"\n class=\"reconcile-feedback small mt-1\"\n [class.text-success]=\"catalogFeedback.type === 'success'\"\n [class.text-danger]=\"catalogFeedback.type === 'error'\"\n >\n {{ catalogFeedback.message }}\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </cds-tab>\n </cds-tabs>\n </ng-container>\n</div>\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nexport interface EpistolaRuntimeEnv {\n epistolaEnabled?: boolean | string;\n}\n\ninterface EpistolaRuntimeWindow {\n env?: EpistolaRuntimeEnv;\n}\n\ndeclare global {\n interface Window extends EpistolaRuntimeWindow {}\n}\n\nfunction isRuntimeWindow(value: unknown): value is EpistolaRuntimeWindow {\n return typeof value === 'object' && value !== null;\n}\n\n/**\n * Reads the runtime feature flag that decides whether the Epistola plugin\n * surfaces (admin menu, /epistola route, plugin specification, Formio\n * components) should activate in the host Valtimo app.\n *\n * The flag is sourced from `window['env']['epistolaEnabled']`, populated at\n * container start by `envsubst` against `assets/config.template.js` (the\n * standard Valtimo runtime-config pattern). Defaults to enabled — only the\n * literal `false` or string `'false'` disables the plugin, matching the\n * backend's `epistola.enabled` `matchIfMissing = true` semantics.\n *\n * Exposed as a runtime helper rather than evaluated directly in `@NgModule`\n * decorator metadata because Angular's AOT compiler cannot statically resolve\n * `window` accesses (NG1010). Read from runtime code such as specification\n * property getters, route guards, or the environment initializer instead.\n */\nexport function isEpistolaEnabled(): boolean {\n const runtimeWindow = Reflect.get(globalThis, 'window');\n if (!runtimeWindow) return true;\n if (!isRuntimeWindow(runtimeWindow)) return true;\n const flag = runtimeWindow.env ? runtimeWindow.env.epistolaEnabled : undefined;\n return flag !== false && flag !== 'false';\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport { inject } from '@angular/core';\nimport { CanActivateFn, Router } from '@angular/router';\nimport { isEpistolaEnabled } from './epistola-runtime-config';\n\nexport const epistolaEnabledGuard: CanActivateFn = () => {\n if (isEpistolaEnabled()) return true;\n return inject(Router).parseUrl('/');\n};\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\nimport { AuthGuardService } from '@valtimo/security';\nimport { EpistolaAdminPageComponent } from './components/epistola-admin-page/epistola-admin-page.component';\nimport { epistolaEnabledGuard } from './epistola-enabled.guard';\n\nconst routes: Routes = [\n {\n path: 'epistola',\n component: EpistolaAdminPageComponent,\n canActivate: [epistolaEnabledGuard, AuthGuardService],\n data: { title: 'Epistola', roles: ['ROLE_ADMIN'] },\n },\n];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule],\n})\nexport class EpistolaAdminRoutingModule {}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport { Injector } from '@angular/core';\nimport { FormioCustomComponentInfo, registerCustomFormioComponent } from '@valtimo/components';\nimport { EpistolaDocumentComponent } from './epistola-document.component';\nimport { readPrefilledTaskId, PREFILLED_TASK_ID_CARRIER } from '../../services/prefilled-task-id';\n\nexport const EPISTOLA_DOCUMENT_OPTIONS: FormioCustomComponentInfo = {\n type: 'epistola-document',\n selector: 'epistola-document-element',\n title: 'Epistola Document',\n group: 'basic',\n icon: 'file-pdf-o',\n emptyValue: null,\n // tenantIdVariable is intentionally absent: it is not author-configurable in the builder\n // (the tenant is process-wide, always the default), and Valtimo copies every fieldOptions\n // key onto the element unconditionally — listing it would overwrite the component's\n // `epistolaTenantId` @Input() default with `undefined` and break the download.\n fieldOptions: ['label', 'display', 'documentVariable', 'filename'],\n // Embed the hidden task-id carrier so dropping this component is enough — no separate\n // field for the author to add. Valtimo prefills it server-side via the epistola: resolver.\n schema: { components: [PREFILLED_TASK_ID_CARRIER] },\n // Minimal edit form: only the five properties this component actually reads (its\n // @Input()s / fieldOptions). A flat `components` array (no `tabs` wrapper) replaces the\n // inherited stock text-field dialog (Display/Data/Validation/API/Conditional/Logic/Layout)\n // entirely. Keys must match the @Input() names verbatim so the fieldOptions copy works.\n editForm: () => ({\n components: [\n {\n type: 'textfield',\n key: 'label',\n label: 'Label',\n weight: 10,\n defaultValue: 'Document',\n },\n {\n type: 'select',\n key: 'display',\n label: 'Display',\n weight: 20,\n defaultValue: 'both',\n dataSrc: 'values',\n data: {\n values: [\n { label: 'Inline preview', value: 'inline' },\n { label: 'Download button', value: 'button' },\n { label: 'Both', value: 'both' },\n ],\n },\n },\n {\n type: 'textfield',\n key: 'documentVariable',\n label: 'Document variable',\n weight: 30,\n defaultValue: 'epistolaResult',\n tooltip: 'Name of the process variable holding the Epistola result (PDF id).',\n },\n {\n type: 'textfield',\n key: 'filename',\n label: 'Filename',\n weight: 40,\n defaultValue: 'document.pdf',\n tooltip: 'Filename used for the download (Content-Disposition).',\n },\n ],\n }),\n};\n\nexport function registerEpistolaDocumentComponent(injector: Injector): void {\n if (customElements.get(EPISTOLA_DOCUMENT_OPTIONS.selector)) {\n return;\n }\n registerCustomFormioComponent(EPISTOLA_DOCUMENT_OPTIONS, EpistolaDocumentComponent, injector);\n\n // Extend the base class to forward the server-prefilled task id (epistola: value\n // resolver) to the Angular element, so the download authorizes against the exact task in\n // every Valtimo task-open flow.\n const Formio = (window as any).Formio;\n const BaseComponent = Formio?.Components?.components?.[EPISTOLA_DOCUMENT_OPTIONS.type];\n if (!BaseComponent) {\n return;\n }\n\n class EpistolaDocumentWithTaskContext extends BaseComponent {\n attach(element: HTMLElement) {\n const result = super.attach(element);\n if (this._customAngularElement) {\n const prefilledTaskId = readPrefilledTaskId(this.root);\n if (prefilledTaskId) {\n this._customAngularElement['taskInstanceId'] = prefilledTaskId;\n }\n }\n return result;\n }\n }\n\n Formio.Components.setComponent(EPISTOLA_DOCUMENT_OPTIONS.type, EpistolaDocumentWithTaskContext);\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\n/**\n * Hides a registered custom Formio component from the builder's component palette,\n * while keeping it fully usable inside other components' `editForm`s and at runtime.\n *\n * Formio's `WebformBuilder` only adds a component to the palette when\n * `component.builderInfo && component.builderInfo.schema` is truthy. Overriding the\n * registered class's static `builderInfo` getter to `false` therefore removes it from\n * the palette. Runtime instantiation and editForm usage don't consult `builderInfo`,\n * so they are unaffected.\n *\n * Call this AFTER the component is registered (and after any `setComponent` re-registration),\n * so it targets the final class in `Formio.Components.components[type]`.\n */\nexport function hideFormioComponentFromBuilder(type: string): void {\n const registered = (window as any).Formio?.Components?.components?.[type];\n if (registered) {\n Object.defineProperty(registered, 'builderInfo', {\n get: () => false,\n configurable: true,\n });\n }\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport { Injector } from '@angular/core';\nimport { FormioCustomComponentInfo, registerCustomFormioComponent } from '@valtimo/components';\nimport { EpistolaRetryFormComponent } from './epistola-retry-form.component';\nimport { readPrefilledTaskId, PREFILLED_TASK_ID_CARRIER } from '../../services/prefilled-task-id';\nimport { hideFormioComponentFromBuilder } from '../formio-builder-utils';\n\nexport const EPISTOLA_RETRY_FORM_OPTIONS: FormioCustomComponentInfo = {\n type: 'epistola-retry-form',\n selector: 'epistola-retry-form-element',\n title: 'Epistola Retry Form',\n group: 'basic',\n icon: 'refresh',\n emptyValue: null,\n fieldOptions: ['sourceActivityId', 'label'], // sourceActivityId is optional (set via BPMN input parameter)\n // Embed the hidden task-id carrier so dropping this component is enough — no separate\n // field for the author to add. Valtimo prefills it server-side via the epistola: resolver.\n schema: { components: [PREFILLED_TASK_ID_CARRIER] },\n};\n\nexport function registerEpistolaRetryFormComponent(injector: Injector): void {\n if (customElements.get(EPISTOLA_RETRY_FORM_OPTIONS.selector)) {\n return;\n }\n registerCustomFormioComponent(EPISTOLA_RETRY_FORM_OPTIONS, EpistolaRetryFormComponent, injector);\n\n // Extend the base class to forward the server-prefilled task id (epistola: value\n // resolver) to the Angular element, so the retry form authorizes against the exact task in\n // every Valtimo task-open flow.\n const Formio = (window as any).Formio;\n const BaseComponent = Formio?.Components?.components?.[EPISTOLA_RETRY_FORM_OPTIONS.type];\n if (!BaseComponent) {\n return;\n }\n\n class EpistolaRetryFormWithTaskContext extends BaseComponent {\n attach(element: HTMLElement) {\n const result = super.attach(element);\n if (this._customAngularElement) {\n const prefilledTaskId = readPrefilledTaskId(this.root);\n if (prefilledTaskId) {\n this._customAngularElement['taskInstanceId'] = prefilledTaskId;\n }\n }\n return result;\n }\n }\n\n Formio.Components.setComponent(\n EPISTOLA_RETRY_FORM_OPTIONS.type,\n EpistolaRetryFormWithTaskContext,\n );\n\n // Part of the plugin's auto-deployed retry form, not a drop-anywhere component — hide it\n // from the builder palette. It still renders wherever it's already present in a form.\n hideFormioComponentFromBuilder(EPISTOLA_RETRY_FORM_OPTIONS.type);\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport { Injector } from '@angular/core';\nimport { FormioCustomComponentInfo, registerCustomFormioComponent } from '@valtimo/components';\nimport { EpistolaDocumentPreviewComponent } from './epistola-document-preview.component';\nimport { computeInputOverrides } from './preview-utils';\nimport { readPrefilledTaskId, PREFILLED_TASK_ID_CARRIER } from '../../services/prefilled-task-id';\n\n/** Default debounce for the auto-refresh, in milliseconds. */\nconst DEFAULT_REFRESH_DEBOUNCE_MS = 1500;\n\nexport const EPISTOLA_DOCUMENT_PREVIEW_OPTIONS: FormioCustomComponentInfo = {\n type: 'epistola-document-preview',\n selector: 'epistola-document-preview-element',\n title: 'Epistola Document Preview',\n group: 'basic',\n icon: 'file-pdf-o',\n emptyValue: null,\n fieldOptions: ['label', 'processDefinitionKey', 'sourceActivityId', 'overrideMapping'],\n // Embed the hidden task-id carrier so dropping this component is enough — no separate\n // field for the author to add. Valtimo prefills it server-side via the epistola: resolver.\n schema: { components: [PREFILLED_TASK_ID_CARRIER] },\n editForm: () => ({\n components: [\n {\n type: 'epistola-process-link-selector',\n key: 'processLinkSelection',\n label: 'Process Link',\n weight: 10,\n validate: { required: true },\n },\n {\n type: 'epistola-override-builder',\n key: 'overrideMapping',\n label: 'Input Overrides',\n weight: 20,\n },\n {\n type: 'checkbox',\n key: 'autoRefresh',\n label: 'Auto-refresh preview as the form is filled in',\n tooltip:\n 'When on, the preview refreshes automatically while the form is edited — debounced, and only when a field loses focus, not on every keystroke. Turn off to refresh only with the Refresh button.',\n defaultValue: true,\n weight: 30,\n },\n {\n type: 'number',\n key: 'refreshDebounceMs',\n label: 'Auto-refresh debounce (ms)',\n tooltip:\n 'How long to wait after the last change before refreshing. Higher values feel calmer; lower values feel more responsive.',\n defaultValue: DEFAULT_REFRESH_DEBOUNCE_MS,\n weight: 40,\n conditional: { show: true, when: 'autoRefresh', eq: 'true' },\n },\n ],\n }),\n};\n\nexport function registerEpistolaDocumentPreviewComponent(injector: Injector): void {\n if (customElements.get(EPISTOLA_DOCUMENT_PREVIEW_OPTIONS.selector)) {\n return;\n }\n\n // Register the base component (Angular element + Formio component class)\n registerCustomFormioComponent(\n EPISTOLA_DOCUMENT_PREVIEW_OPTIONS,\n EpistolaDocumentPreviewComponent,\n injector,\n );\n\n // Get the Formio Components registry and the registered base class\n const Formio = (window as any).Formio;\n if (!Formio?.Components) return;\n\n const BasePreviewComponent = Formio.Components.components[EPISTOLA_DOCUMENT_PREVIEW_OPTIONS.type];\n if (!BasePreviewComponent) return;\n\n // Extend the base class to listen for form data changes and compute input overrides\n class PreviewWithOverrides extends BasePreviewComponent {\n private _debounceTimer: any = null;\n private _changeListenerAttached = false;\n private _changeHandler: (() => void) | null = null;\n private _blurHandler: (() => void) | null = null;\n private _blurTarget: HTMLElement | null = null;\n private _destroyed = false;\n private _debounceMs = DEFAULT_REFRESH_DEBOUNCE_MS;\n // Serialized form of the last value pushed, so we skip re-rendering the preview\n // when a change recomputes to the same overrides (e.g. typing in a field that\n // isn't part of the mapping). undefined = nothing pushed yet.\n private _lastPushedJson: string | undefined = undefined;\n // Whether the last compute produced usable overrides. Drives the initial-paint\n // retry below: it stops once the form data is present.\n private _hasUsableValue = false;\n // Timers for the initial-paint retry — Valtimo can prefill form data\n // asynchronously after the component mounts, sometimes without a change event.\n private _initialPaintTimers: any[] = [];\n // Whether auto-refresh (recompute on change/blur) is currently active. Seeded\n // once from the builder's autoRefresh option, then toggled at runtime by the\n // end-user via the preview header. Persisted across redraws (only seeded once).\n private _autoRefreshEnabled = true;\n private _autoRefreshInitialized = false;\n\n attach(element: HTMLElement) {\n // Formio detaches and re-attaches components on every redraw — not only at\n // teardown — so a re-attach means the component is alive again. Clear the\n // destroyed flag here; it only stays set when detach() is the final call\n // (genuine teardown, e.g. task completion), which is what suppresses the\n // post-submit preview.\n this._destroyed = false;\n\n // Seed the runtime auto-refresh state from the builder option, once. Re-attach\n // (redraw) must not clobber a choice the end-user made via the header toggle.\n if (!this._autoRefreshInitialized) {\n this._autoRefreshEnabled = this.component?.autoRefresh !== false;\n this._autoRefreshInitialized = true;\n }\n\n // Bidirectional sync between processLinkSelection object and separate properties.\n // The editForm uses processLinkSelection (single field), while the component\n // config and Angular inputs use processDefinitionKey + sourceActivityId.\n if (this.component?.processLinkSelection) {\n const sel = this.component.processLinkSelection;\n this.component.processDefinitionKey = sel.processDefinitionKey || '';\n this.component.sourceActivityId = sel.sourceActivityId || '';\n } else if (this.component?.processDefinitionKey && this.component?.sourceActivityId) {\n this.component.processLinkSelection = {\n processDefinitionKey: this.component.processDefinitionKey,\n sourceActivityId: this.component.sourceActivityId,\n };\n }\n\n const result = super.attach(element);\n\n if (this._customAngularElement) {\n this._customAngularElement['processDefinitionKey'] =\n this.component.processDefinitionKey || '';\n this._customAngularElement['sourceActivityId'] = this.component.sourceActivityId || '';\n // Forward the server-prefilled task id (epistola: value resolver) so the\n // component authorizes against the exact task in every Valtimo task-open flow.\n const prefilledTaskId = readPrefilledTaskId(this.root);\n if (prefilledTaskId) {\n this._customAngularElement['taskInstanceId'] = prefilledTaskId;\n }\n if (this.component?.overrideMapping) {\n // Let the component's Refresh button force a recompute from the live form\n // data, so it works before the first change (e.g. on initial load with\n // pre-filled fields) rather than reading a not-yet-populated value.\n this._customAngularElement['requestOverrides'] = () => this._computeAndSetOverrides(true);\n // Reflect the current auto-refresh state to the header toggle (current\n // state, not the builder default — so a redraw keeps the user's choice),\n // and let the toggle flip it. Turning it on does an immediate refresh.\n this._customAngularElement['autoRefresh'] = this._autoRefreshEnabled;\n this._customAngularElement['setAutoRefresh'] = (enabled: boolean) => {\n this._autoRefreshEnabled = enabled;\n if (enabled) {\n this._computeAndSetOverrides(true);\n }\n };\n }\n }\n\n // Compute input overrides from the mapping and wire up the live listeners.\n if (this.root && this.component?.overrideMapping && !this._changeListenerAttached) {\n this._changeListenerAttached = true;\n this._debounceMs = this._resolveDebounceMs();\n\n // Compute the initial overrides immediately (no debounce) so a pre-filled\n // form paints its preview without the debounce delay. This runs regardless\n // of the auto-refresh state, so the preview still shows once on open.\n this._computeAndSetOverrides(true);\n\n // Valtimo can prefill the form data asynchronously after the component\n // mounts, sometimes without a change event we can hook — so the single\n // compute above may see empty data. Re-attempt a few times over ~2s until\n // usable overrides appear, so a pre-filled form previews itself without a\n // manual edit or Refresh click. Each attempt is skipped once the data is in.\n this._initialPaintTimers = [400, 1000, 2000].map((ms) =>\n setTimeout(() => {\n if (!this._hasUsableValue && !this._destroyed) {\n void this._runCompute();\n }\n }, ms),\n );\n\n // Always wire the change + blur listeners; the runtime auto-refresh toggle\n // (_autoRefreshEnabled) gates whether they actually recompute, so the\n // end-user can switch it on/off live without re-attaching anything.\n //\n // Debounced recompute on any form change — collapses bursts of edits and,\n // together with the dedup, only re-renders when the mapped data changes.\n this._changeHandler = () => {\n if (this._autoRefreshEnabled) this._computeAndSetOverrides();\n };\n this.root.on('change', this._changeHandler);\n\n // Flush immediately when a field loses focus. `focusout` bubbles (unlike\n // `blur`), so one listener on the form root catches every input — and it\n // fires on blur rather than on each keystroke, which keeps the refresh from\n // feeling hectic.\n const formEl: HTMLElement | undefined = this.root?.element;\n if (formEl?.addEventListener) {\n this._blurHandler = () => {\n if (this._autoRefreshEnabled) this._computeAndSetOverrides(true);\n };\n formEl.addEventListener('focusout', this._blurHandler);\n this._blurTarget = formEl;\n }\n }\n\n return result;\n }\n\n // Tear down the change listener and any pending debounce so a preview is never\n // fired after the form is unmounted (e.g. on task completion). Without this the\n // 1.5s debounce can outlive submit and POST /preview with reset/incomplete data,\n // which Epistola rejects with a 400.\n detach() {\n this._destroyed = true;\n if (this._debounceTimer) {\n clearTimeout(this._debounceTimer);\n this._debounceTimer = null;\n }\n this._initialPaintTimers.forEach((t) => clearTimeout(t));\n this._initialPaintTimers = [];\n this._hasUsableValue = false;\n if (this._changeHandler && this.root?.off) {\n this.root.off('change', this._changeHandler);\n this._changeHandler = null;\n }\n if (this._blurHandler && this._blurTarget?.removeEventListener) {\n this._blurTarget.removeEventListener('focusout', this._blurHandler);\n this._blurHandler = null;\n this._blurTarget = null;\n }\n this._changeListenerAttached = false;\n this._lastPushedJson = undefined;\n return super.detach();\n }\n\n private _computeAndSetOverrides(immediate = false) {\n if (this._debounceTimer) {\n clearTimeout(this._debounceTimer);\n }\n this._debounceTimer = setTimeout(\n () => void this._runCompute(),\n immediate ? 0 : this._debounceMs,\n );\n }\n\n // Compute the input overrides from the live form data and push them to the\n // component (deduped). Separated from the debounce scheduling so the\n // initial-paint retry can invoke it directly without another timer hop.\n private async _runCompute() {\n // Skip if the form is being/has been submitted or the component is gone —\n // those previews would run with incomplete/reset data and 400 from Epistola.\n if (this._destroyed || this.root?.submitting || this.root?.submitted) {\n return;\n }\n const mapping = this.component?.overrideMapping;\n const formData = this.root?.data;\n if (!mapping || !formData) {\n return;\n }\n // computeInputOverrides evaluates a JSONata expression (async). Re-check\n // the submit/teardown guards after the await — they can flip while the\n // promise is in flight.\n const overrides = await computeInputOverrides(mapping, formData);\n if (this._destroyed || this.root?.submitting || this.root?.submitted) {\n return;\n }\n // Push null when there's nothing usable yet so the component reverts to\n // its \"complete the form\" placeholder instead of keeping a stale preview.\n const next = Object.keys(overrides).length > 0 ? overrides : null;\n // Track whether the data is in yet (stops the initial-paint retry).\n this._hasUsableValue = next !== null;\n // Dedup: only push (and re-render) when the computed overrides actually\n // changed since the last push. A change/blur that doesn't affect the\n // mapped data recomputes to the same value and is dropped here.\n const nextJson = JSON.stringify(next);\n if (nextJson === this._lastPushedJson) {\n return;\n }\n this._lastPushedJson = nextJson;\n this._pushOverrides(next);\n }\n\n // Push the computed overrides to the Angular component via a dedicated input.\n // NOT Formio's setValue: Valtimo's bridge only mirrors `value` to the DOM and\n // never to Formio's data model, so Formio resets it to emptyValue on the next\n // redraw — which would cancel the preview. A plain element property is left\n // untouched by Formio and so sticks.\n private _pushOverrides(value: Record<string, any> | null) {\n if (this._customAngularElement) {\n this._customAngularElement['inputOverrides'] = value;\n }\n }\n\n /**\n * Resolve the configured auto-refresh debounce (ms), falling back to the\n * default for missing or non-numeric/negative values.\n */\n private _resolveDebounceMs(): number {\n const configured = Number(this.component?.refreshDebounceMs);\n return Number.isFinite(configured) && configured >= 0\n ? configured\n : DEFAULT_REFRESH_DEBOUNCE_MS;\n }\n }\n\n // Re-register with the extended class\n Formio.Components.setComponent(EPISTOLA_DOCUMENT_PREVIEW_OPTIONS.type, PreviewWithOverrides);\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport * as _jsonata from 'jsonata';\nconst jsonata = (_jsonata as any).default || _jsonata;\n\n/** A `$doc`/`$pv`/`$case` path referenced by a JSONata expression. */\nexport interface ReferencedPath {\n scope: 'doc' | 'pv' | 'case';\n /** Dotted path under the scope, e.g. `aanvrager.naam`. Empty for a whole-scope reference. */\n path: string;\n}\n\nconst SCOPES = ['doc', 'pv', 'case'] as const;\ntype Scope = (typeof SCOPES)[number];\n\nfunction isScope(value: unknown): value is Scope {\n return typeof value === 'string' && (SCOPES as readonly string[]).includes(value);\n}\n\n/**\n * Statically extract every `$doc`/`$pv`/`$case` path referenced anywhere in a JSONata\n * expression. Used to surface — informationally — which inputs a template's data mapping\n * consumes, so the override-builder author sees what is worth overriding during preview.\n *\n * This is a best-effort static read: paths built dynamically (`$lookup`, custom functions,\n * computed keys) can't be resolved and simply won't appear. Treat the result as suggestions,\n * never as validation — an empty result (e.g. on a parse error) means \"nothing to suggest\".\n *\n * Generalizes the variable-path primitive in `utils/jsonata-converter.ts` (`classifyValue`)\n * to recurse over the whole AST rather than only top-level object values.\n */\nexport function extractReferencedPaths(expression: string | null | undefined): ReferencedPath[] {\n if (!expression || !expression.trim()) {\n return [];\n }\n let ast: any;\n try {\n ast = (jsonata(expression) as any).ast();\n } catch {\n return [];\n }\n\n const seen = new Map<string, ReferencedPath>();\n walk(ast, seen);\n\n return [...seen.values()].sort(\n (a, b) => a.scope.localeCompare(b.scope) || a.path.localeCompare(b.path),\n );\n}\n\nfunction record(node: any, seen: Map<string, ReferencedPath>): void {\n // Two shapes carry a scope reference:\n // - a bare `variable` node (`$doc`), where the scope is `node.value` and the path is empty;\n // - a `path` node whose first step is the `$<scope>` variable, followed by the property\n // names: `$doc.aanvrager.naam` → steps [doc, aanvrager, naam].\n const scope = node?.type === 'variable' ? node.value : node?.steps?.[0]?.value;\n if (!isScope(scope)) {\n return;\n }\n const path = (node.steps ?? [])\n .slice(1)\n .map((step: any) => step?.value)\n .filter((segment: unknown): segment is string => typeof segment === 'string')\n .join('.');\n const key = `${scope}.${path}`;\n if (!seen.has(key)) {\n seen.set(key, { scope, path });\n }\n}\n\n/** Recursively walk every child node, recording any `$doc`/`$pv`/`$case` path reference. */\nfunction walk(node: any, seen: Map<string, ReferencedPath>): void {\n if (!node || typeof node !== 'object') {\n return;\n }\n\n // A bare scope variable with no property access, e.g. `$spread($doc)`.\n if (node.type === 'variable') {\n if (isScope(node.value)) {\n record(node, seen);\n }\n return;\n }\n\n // A path rooted at a scope variable, e.g. `$doc.aanvrager.naam`. Record the whole path,\n // then walk only the filters/predicates attached to its steps — not the variable/name\n // steps themselves, which would otherwise re-record the leading scope with an empty path.\n if (\n node.type === 'path' &&\n node.steps?.[0]?.type === 'variable' &&\n isScope(node.steps[0].value)\n ) {\n record(node, seen);\n for (const step of node.steps) {\n walkValue(step?.predicate, seen);\n walkValue(step?.stages, seen);\n walkValue(step?.group, seen);\n }\n return;\n }\n\n // Generic recursion into every structural child the dashjoin AST uses. Object literals\n // carry their entries as `lhs` = array of [keyNode, valueNode] pairs.\n for (const child of [\n node.lhs,\n node.rhs,\n node.condition,\n node.then,\n node.else,\n node.procedure,\n node.group,\n node.pattern,\n node.update,\n node.delete,\n ]) {\n walkValue(child, seen);\n }\n for (const list of [\n node.steps,\n node.arguments,\n node.stages,\n node.expressions,\n node.terms,\n node.predicate,\n ]) {\n walkValue(list, seen);\n }\n}\n\n/** Walk a value that may be a node, an array of nodes, or an array of [key, value] pairs. */\nfunction walkValue(value: any, seen: Map<string, ReferencedPath>): void {\n if (Array.isArray(value)) {\n for (const item of value) {\n walkValue(item, seen);\n }\n } else {\n walk(value, seen);\n }\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { FormioCustomComponent } from '@valtimo/components';\nimport { Subject, of } from 'rxjs';\nimport { catchError, takeUntil } from 'rxjs/operators';\nimport { JsonataEditorComponent } from '../jsonata-editor/jsonata-editor.component';\nimport { OverrideRow, parseOverrideJsonata, serializeOverrideRows } from './override-jsonata';\nimport { isLegacyOverrideMapping, legacyOverrideToJsonata } from './legacy-override-converter';\nimport { EpistolaPluginService } from '../../services';\nimport { extractReferencedPaths, ReferencedPath } from '../../utils/extract-referenced-paths';\n\nexport interface FormFieldOption {\n key: string;\n label: string;\n}\n\n/**\n * Override mapping value: a JSONata expression (over `$form`) that produces the\n * `{ doc, pv }` overlay applied during preview. Legacy form definitions may\n * still carry the old `{ scope: { inputPath: \"form:key\" } }` object; it is\n * converted to JSONata on load (see {@link legacyOverrideToJsonata}).\n */\nexport type OverrideMapping = Record<string, Record<string, string>>;\n\n@Component({\n standalone: true,\n imports: [CommonModule, FormsModule, JsonataEditorComponent],\n selector: 'epistola-override-builder-component',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"override-builder\">\n <div class=\"builder-header\">\n <span class=\"builder-label\">{{ label || 'Input Overrides' }}</span>\n <button\n type=\"button\"\n class=\"mode-toggle\"\n [disabled]=\"simpleUnavailable && !advancedMode\"\n (click)=\"toggleMode()\"\n >\n {{ advancedMode ? 'Simple' : 'Advanced' }}\n </button>\n </div>\n\n <!-- Inline guidance for the author -->\n <p class=\"builder-intro\">\n Make the preview reflect what the user is typing — <em>before</em> they submit — by feeding\n live form values into the document inputs.\n </p>\n <details class=\"builder-help\">\n <summary>When should I map a field?</summary>\n <ul>\n <li>\n <strong>Map</strong> a field when its value ends up in the generated document — i.e. the\n template's data mapping reads that <code>doc</code>/<code>pv</code> path. The preview\n then updates live as the field is filled in.\n </li>\n <li>\n <strong>Don't map</strong> fields that don't affect the document, or values that are\n already saved on the case/process before this task — those are read from the real data\n automatically.\n </li>\n <li>\n Overriding a path the template never reads has <strong>no effect</strong> on the\n preview.\n </li>\n </ul>\n <p class=\"builder-help__how\">\n <strong>How it works:</strong> <code>$form</code> holds the current form values; the\n mapping returns a <code>{{ '{' }} doc, pv {{ '}' }}</code> overlay used\n <strong>only for the preview</strong>. The actual document is always generated from the\n real saved data after the form is submitted.\n </p>\n </details>\n\n <!-- Variables the selected template's mapping consumes (read-only guidance) -->\n <details *ngIf=\"hasReferencedPaths\" class=\"used-by-template\">\n <summary class=\"used-by-template__label\">\n Used by this template ({{ referencedPaths.length }})\n </summary>\n <p class=\"used-by-template__hint\">\n This template's data mapping reads these inputs — the paths worth overriding for the\n preview.\n </p>\n <ul class=\"used-by-template__list\">\n <li *ngFor=\"let ref of referencedPaths\">\n <code>{{ formatReferencedPath(ref) }}</code>\n </li>\n </ul>\n </details>\n\n <!-- Per-scope autocomplete options for the Input Path column -->\n <datalist id=\"epistola-override-paths-doc\">\n <option *ngFor=\"let p of referencedPathsForScope('doc')\" [value]=\"p\"></option>\n </datalist>\n <datalist id=\"epistola-override-paths-pv\">\n <option *ngFor=\"let p of referencedPathsForScope('pv')\" [value]=\"p\"></option>\n </datalist>\n\n <!-- Simple mode: table -->\n <div *ngIf=\"!advancedMode\" class=\"builder-table\">\n <div *ngIf=\"rows.length > 0\" class=\"table-header\">\n <span class=\"col-scope\">Scope</span>\n <span class=\"col-path\">Input Path</span>\n <span class=\"col-field\">Form Field</span>\n <span class=\"col-action\"></span>\n </div>\n <div *ngFor=\"let row of rows; let i = index\" class=\"table-row\">\n <select class=\"col-scope\" [(ngModel)]=\"row.scope\" (ngModelChange)=\"emitChange()\">\n <option value=\"doc\">doc</option>\n <option value=\"pv\">pv</option>\n </select>\n <input\n class=\"col-path\"\n type=\"text\"\n [(ngModel)]=\"row.inputPath\"\n (ngModelChange)=\"emitChange()\"\n [attr.list]=\"'epistola-override-paths-' + row.scope\"\n placeholder=\"e.g. beslissing.tekst\"\n />\n <!-- Dropdown when form fields are available, text input as fallback -->\n <select\n *ngIf=\"availableFields.length > 0\"\n class=\"col-field\"\n [(ngModel)]=\"row.formFieldKey\"\n (ngModelChange)=\"emitChange()\"\n >\n <option value=\"\">-- Select field --</option>\n <option *ngFor=\"let field of availableFields\" [value]=\"field.key\">\n {{ field.label }}\n </option>\n </select>\n <input\n *ngIf=\"availableFields.length === 0\"\n class=\"col-field\"\n type=\"text\"\n [(ngModel)]=\"row.formFieldKey\"\n (ngModelChange)=\"emitChange()\"\n placeholder=\"form field key\"\n />\n <button type=\"button\" class=\"col-action remove-btn\" (click)=\"removeRow(i)\">\n <i class=\"mdi mdi-close\"></i>\n </button>\n </div>\n <button type=\"button\" class=\"add-btn\" (click)=\"addRow()\">\n <i class=\"mdi mdi-plus mr-1\"></i> Add override\n </button>\n </div>\n\n <!-- Advanced mode: JSONata editor over $form -->\n <div *ngIf=\"advancedMode\" class=\"builder-advanced\">\n <div *ngIf=\"simpleUnavailable\" class=\"advanced-note\">\n This expression is too rich for the simple table — edit it here.\n </div>\n <epistola-jsonata-editor\n [expression]=\"expression\"\n [contextVariables]=\"editorContextVariables\"\n variablesHint=\"$form\"\n (expressionChange)=\"onExpressionChange($event)\"\n ></epistola-jsonata-editor>\n <div class=\"advanced-hint\">\n Map form fields onto a <code>{{ '{' }} doc, pv {{ '}' }}</code> overlay, e.g.\n <code>{{ exampleExpression }}</code>\n </div>\n </div>\n </div>\n `,\n styles: [\n `\n .override-builder {\n border: 1px solid #dee2e6;\n border-radius: 4px;\n padding: 0.75rem;\n background: #f8f9fa;\n }\n .builder-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 0.5rem;\n }\n .builder-label {\n font-weight: 600;\n font-size: 0.85rem;\n color: #495057;\n }\n .builder-intro {\n font-size: 0.78rem;\n color: #495057;\n margin: 0 0 0.4rem;\n line-height: 1.4;\n }\n .builder-help {\n margin: 0 0 0.6rem;\n font-size: 0.76rem;\n color: #6c757d;\n }\n .builder-help > summary {\n cursor: pointer;\n color: #0d6efd;\n font-size: 0.76rem;\n user-select: none;\n }\n .builder-help ul {\n margin: 0.35rem 0 0.35rem 0;\n padding-left: 1.1rem;\n line-height: 1.45;\n }\n .builder-help li {\n margin-bottom: 0.2rem;\n }\n .builder-help__how {\n margin: 0.35rem 0 0;\n line-height: 1.45;\n }\n .builder-help code {\n background: #eef0f2;\n border-radius: 3px;\n padding: 0 0.2rem;\n }\n .used-by-template {\n border: 1px solid #d6e4ff;\n background: #f0f6ff;\n border-radius: 4px;\n padding: 0.5rem 0.6rem;\n margin: 0 0 0.6rem;\n }\n .used-by-template__label {\n font-weight: 600;\n font-size: 0.78rem;\n color: #495057;\n cursor: pointer;\n user-select: none;\n }\n .used-by-template[open] .used-by-template__label {\n margin-bottom: 0.1rem;\n }\n .used-by-template__hint {\n margin: 0.2rem 0 0.4rem;\n font-size: 0.74rem;\n color: #6c757d;\n line-height: 1.4;\n }\n .used-by-template__list {\n margin: 0;\n padding-left: 1.1rem;\n display: flex;\n flex-wrap: wrap;\n gap: 0.15rem 1rem;\n list-style: none;\n }\n .used-by-template__list code {\n background: #e2ecff;\n border-radius: 3px;\n padding: 0 0.25rem;\n font-size: 0.76rem;\n color: #0d4a9c;\n }\n .mode-toggle {\n background: none;\n border: 1px solid #6c757d;\n border-radius: 4px;\n color: #6c757d;\n padding: 0.15rem 0.5rem;\n font-size: 0.75rem;\n cursor: pointer;\n }\n .mode-toggle:hover:not(:disabled) {\n background: #e9ecef;\n }\n .mode-toggle:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .table-header {\n display: flex;\n gap: 0.5rem;\n padding: 0.25rem 0;\n font-size: 0.75rem;\n color: #6c757d;\n font-weight: 600;\n }\n .table-row {\n display: flex;\n gap: 0.5rem;\n margin-bottom: 0.25rem;\n align-items: center;\n }\n .col-scope {\n width: 70px;\n flex-shrink: 0;\n }\n .col-path {\n flex: 1;\n min-width: 0;\n }\n .col-field {\n flex: 1;\n min-width: 0;\n }\n .col-action {\n width: 30px;\n flex-shrink: 0;\n }\n .table-row select,\n .table-row input {\n border: 1px solid #ced4da;\n border-radius: 4px;\n padding: 0.25rem 0.4rem;\n font-size: 0.8rem;\n background: white;\n }\n .remove-btn {\n background: none;\n border: none;\n color: #dc3545;\n cursor: pointer;\n padding: 0.25rem;\n font-size: 0.9rem;\n }\n .remove-btn:hover {\n color: #a71d2a;\n }\n .add-btn {\n background: none;\n border: 1px dashed #6c757d;\n border-radius: 4px;\n color: #6c757d;\n padding: 0.25rem 0.75rem;\n font-size: 0.8rem;\n cursor: pointer;\n margin-top: 0.25rem;\n display: flex;\n align-items: center;\n }\n .add-btn:hover {\n background: #e9ecef;\n border-color: #495057;\n }\n .advanced-note {\n color: #b54708;\n font-size: 0.75rem;\n margin-bottom: 0.4rem;\n }\n .advanced-hint {\n color: #6c757d;\n font-size: 0.72rem;\n margin-top: 0.35rem;\n line-height: 1.4;\n }\n .advanced-hint code {\n background: #eef0f2;\n border-radius: 3px;\n padding: 0 0.2rem;\n font-size: 0.95em;\n }\n `,\n ],\n})\nexport class EpistolaOverrideBuilderComponent\n implements FormioCustomComponent<string | OverrideMapping | null>, OnDestroy\n{\n @Input() value!: string | OverrideMapping | null;\n @Output() valueChange = new EventEmitter<string | OverrideMapping | null>();\n\n @Input() disabled = false;\n @Input() label = 'Input Overrides';\n @Input() availableFields: FormFieldOption[] = [];\n /**\n * Identify the selected generate-document process link, forwarded from the\n * preview component's editForm. Used to fetch the link's data mapping and\n * surface which `$doc`/`$pv` paths it consumes — purely informational guidance.\n */\n @Input() processDefinitionKey = '';\n @Input() sourceActivityId = '';\n\n rows: OverrideRow[] = [];\n advancedMode = false;\n /** True when the current expression can't be represented by the simple table. */\n simpleUnavailable = false;\n expression = '';\n\n /** `$doc`/`$pv`/`$case` paths the selected template's data mapping references. */\n referencedPaths: ReferencedPath[] = [];\n\n readonly exampleExpression = '{ \"doc\": { \"naam\": $form.voornaam & \\' \\' & $form.achternaam } }';\n\n private initialized = false;\n private readonly destroy$ = new Subject<void>();\n /** Link last fetched, so we refetch only when the selected process link changes. */\n private lastFetchedLinkKey: string | null = null;\n\n constructor(\n private readonly cdr: ChangeDetectorRef,\n private readonly pluginService: EpistolaPluginService,\n ) {}\n\n get formFieldKeys(): string[] {\n return this.availableFields.map((f) => f.key);\n }\n\n get hasReferencedPaths(): boolean {\n return this.referencedPaths.length > 0;\n }\n\n /** Referenced paths for a scope, excluding whole-scope refs (empty path) that aren't completions. */\n referencedPathsForScope(scope: ReferencedPath['scope']): string[] {\n return this.referencedPaths.filter((p) => p.scope === scope && p.path).map((p) => p.path);\n }\n\n /** Autocomplete context for the advanced editor: form fields plus the mapping's referenced paths. */\n get editorContextVariables(): Record<string, string[]> {\n return {\n form: this.formFieldKeys,\n doc: this.referencedPathsForScope('doc'),\n pv: this.referencedPathsForScope('pv'),\n case: this.referencedPathsForScope('case'),\n };\n }\n\n /** Render a referenced path as a `$scope.path` reference (or `$scope` for a whole-scope ref). */\n formatReferencedPath(ref: ReferencedPath): string {\n return ref.path ? `$${ref.scope}.${ref.path}` : `$${ref.scope}`;\n }\n\n ngOnChanges(_changes?: SimpleChanges): void {\n if (!this.initialized && this.value != null) {\n this.initialized = true;\n\n // Migrate a legacy object value to JSONata once, and persist it upward so\n // the form is saved in the new format. Everything below works on a string.\n if (isLegacyOverrideMapping(this.value)) {\n this.expression = legacyOverrideToJsonata(this.value);\n this.value = this.expression || null;\n this.valueChange.emit(this.value as string | null);\n } else {\n this.expression = String(this.value);\n }\n\n this.loadFromExpression(this.expression);\n }\n this.refreshReferencedPaths();\n this.cdr.markForCheck();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Fetch the selected process link's data mapping and extract the `$doc`/`$pv`/`$case`\n * paths it references, so the author sees what this template consumes. Refetches only\n * when the selected link changes; clears when no link is selected. Best-effort and\n * non-blocking — a failed fetch simply shows no suggestions.\n */\n private refreshReferencedPaths(): void {\n const linkKey =\n this.processDefinitionKey && this.sourceActivityId\n ? `${this.processDefinitionKey}::${this.sourceActivityId}`\n : null;\n\n if (!linkKey) {\n if (this.lastFetchedLinkKey !== null) {\n this.lastFetchedLinkKey = null;\n this.referencedPaths = [];\n }\n return;\n }\n if (linkKey === this.lastFetchedLinkKey) {\n return;\n }\n this.lastFetchedLinkKey = linkKey;\n\n this.pluginService\n .getProcessLinkMapping(this.processDefinitionKey, this.sourceActivityId)\n .pipe(\n takeUntil(this.destroy$),\n catchError(() => of({ dataMapping: '' })),\n )\n .subscribe((mapping) => {\n this.referencedPaths = extractReferencedPaths(mapping.dataMapping);\n this.cdr.markForCheck();\n });\n }\n\n toggleMode(): void {\n if (this.advancedMode) {\n // Advanced -> simple: only possible when the expression round-trips.\n const parsed = parseOverrideJsonata(this.expression);\n if (parsed === null) {\n this.simpleUnavailable = true;\n return;\n }\n this.rows = parsed;\n this.simpleUnavailable = false;\n this.advancedMode = false;\n } else {\n this.advancedMode = true;\n }\n }\n\n addRow(): void {\n this.rows.push({ scope: 'doc', inputPath: '', formFieldKey: '' });\n }\n\n removeRow(index: number): void {\n this.rows.splice(index, 1);\n this.emitChange();\n }\n\n /** Simple-table change: serialize rows back to a JSONata expression. */\n emitChange(): void {\n this.expression = serializeOverrideRows(this.rows);\n this.emit(this.expression);\n }\n\n /** Advanced-editor change. */\n onExpressionChange(expr: string): void {\n this.expression = expr;\n this.simpleUnavailable = parseOverrideJsonata(expr) === null;\n this.emit(expr);\n }\n\n private loadFromExpression(expression: string): void {\n const parsed = parseOverrideJsonata(expression);\n if (parsed === null) {\n // Richer than the simple table can show — start in advanced mode.\n this.simpleUnavailable = true;\n this.advancedMode = true;\n this.rows = [];\n } else {\n this.simpleUnavailable = false;\n this.rows = parsed;\n }\n }\n\n private emit(expression: string): void {\n const next = expression && expression.trim() ? expression : null;\n this.value = next;\n this.valueChange.emit(next);\n }\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport { Injector } from '@angular/core';\nimport { FormioCustomComponentInfo, registerCustomFormioComponent } from '@valtimo/components';\nimport { EpistolaOverrideBuilderComponent } from './override-builder.component';\nimport { hideFormioComponentFromBuilder } from '../formio-builder-utils';\n\nexport const EPISTOLA_OVERRIDE_BUILDER_OPTIONS: FormioCustomComponentInfo = {\n type: 'epistola-override-builder',\n selector: 'epistola-override-builder-element',\n title: 'Epistola Override Builder',\n group: 'basic',\n icon: 'list',\n emptyValue: null,\n fieldOptions: ['label', 'availableFields', 'processDefinitionKey', 'sourceActivityId'],\n};\n\n/**\n * Recursively collect input field keys and labels from a Formio component tree.\n * Skips epistola custom components (which are builder UI, not form fields).\n */\nfunction collectFormFields(components: any[]): { key: string; label: string }[] {\n const fields: { key: string; label: string }[] = [];\n for (const comp of components) {\n if (comp.input && comp.key && comp.type !== 'button' && !comp.type?.startsWith('epistola-')) {\n fields.push({ key: comp.key, label: comp.label || comp.key });\n }\n if (comp.components) {\n fields.push(...collectFormFields(comp.components));\n }\n if (comp.columns) {\n for (const col of comp.columns) {\n if (col.components) {\n fields.push(...collectFormFields(col.components));\n }\n }\n }\n }\n return fields;\n}\n\nexport function registerEpistolaOverrideBuilderComponent(injector: Injector): void {\n if (customElements.get(EPISTOLA_OVERRIDE_BUILDER_OPTIONS.selector)) {\n return;\n }\n\n // Register the base component (Angular element + Formio component class)\n registerCustomFormioComponent(\n EPISTOLA_OVERRIDE_BUILDER_OPTIONS,\n EpistolaOverrideBuilderComponent,\n injector,\n );\n\n // Get the Formio Components registry and the registered base class\n const Formio = (window as any).Formio;\n if (!Formio?.Components) return;\n\n const BaseComponent = Formio.Components.components[EPISTOLA_OVERRIDE_BUILDER_OPTIONS.type];\n if (!BaseComponent) return;\n\n // Extend the base class to pass available form fields and the selected process link\n // to the Angular component.\n class OverrideBuilderWithFields extends BaseComponent {\n private _selectionChangeHandler: (() => void) | null = null;\n\n attach(element: HTMLElement) {\n // Set inputs on the component BEFORE super.attach() reads fieldOptions.\n this.component.availableFields = this._extractFormFields();\n this._applyProcessLinkSelection();\n\n const result = super.attach(element);\n\n // The override builder lives in the preview component's editForm alongside the\n // process-link selector (key `processLinkSelection`). When the author changes the\n // selected link, push the new identity straight to the Angular element so it can\n // refetch the link's data mapping — Formio doesn't always redraw this widget on a\n // sibling change. Mirrors the listener lifecycle in epistola-document-preview.formio.ts.\n if (this.root?.on && !this._selectionChangeHandler) {\n this._selectionChangeHandler = () => {\n const selection = this.root?.data?.processLinkSelection;\n if (this._customAngularElement) {\n this._customAngularElement['processDefinitionKey'] =\n selection?.processDefinitionKey || '';\n this._customAngularElement['sourceActivityId'] = selection?.sourceActivityId || '';\n }\n };\n this.root.on('change', this._selectionChangeHandler);\n }\n\n return result;\n }\n\n detach() {\n if (this._selectionChangeHandler && this.root?.off) {\n this.root.off('change', this._selectionChangeHandler);\n this._selectionChangeHandler = null;\n }\n return super.detach();\n }\n\n private _applyProcessLinkSelection(): void {\n // The editForm dialog stores the selected link under `processLinkSelection`.\n const selection = this.root?.data?.processLinkSelection;\n this.component.processDefinitionKey = selection?.processDefinitionKey || '';\n this.component.sourceActivityId = selection?.sourceActivityId || '';\n }\n\n private _extractFormFields(): { key: string; label: string }[] {\n // The Formio builder passes the main form schema as options.editForm\n // when opening the edit dialog (editFormOptions.editForm = this.form).\n const components = this.options?.editForm?.components;\n if (Array.isArray(components)) {\n return collectFormFields(components);\n }\n return [];\n }\n }\n\n // Re-register with the extended class\n Formio.Components.setComponent(EPISTOLA_OVERRIDE_BUILDER_OPTIONS.type, OverrideBuilderWithFields);\n\n // Internal editForm widget — not a standalone form field. Hide it from the builder palette.\n hideFormioComponentFromBuilder(EPISTOLA_OVERRIDE_BUILDER_OPTIONS.type);\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport { PluginUsageEntry } from '../../models';\n\n/**\n * The plugin action definition key the backend serializes for generate-document\n * process links. It carries the `epistola-` prefix — see `EPISTOLA_ACTION_KEYS`\n * in `EpistolaAdminService` on the backend. The selector must match this exact\n * value; the un-prefixed `generate-document` never appears in the API response.\n */\nexport const GENERATE_DOCUMENT_ACTION_KEY = 'epistola-generate-document';\n\n/** Keeps only the generate-document process links from a usage overview. */\nexport function filterGenerateDocumentEntries(entries: PluginUsageEntry[]): PluginUsageEntry[] {\n return entries.filter((e) => e.actionKey === GENERATE_DOCUMENT_ACTION_KEY);\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { FormioCustomComponent } from '@valtimo/components';\nimport { EpistolaAdminService } from '../../services';\nimport { PluginUsageEntry } from '../../models';\nimport { Subscription } from 'rxjs';\nimport { filterGenerateDocumentEntries } from './process-link-selector.util';\n\nexport interface ProcessLinkSelection {\n processDefinitionKey: string;\n sourceActivityId: string;\n}\n\n@Component({\n standalone: true,\n imports: [CommonModule, FormsModule],\n selector: 'epistola-process-link-selector-component',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"process-link-selector\">\n <label class=\"selector-label\">{{ label || 'Process Link' }}</label>\n <select\n class=\"selector-dropdown\"\n [ngModel]=\"selectedKey\"\n (ngModelChange)=\"onSelect($event)\"\n [disabled]=\"disabled || loading\"\n >\n <option value=\"\">{{ loading ? 'Loading...' : '-- Select a process link --' }}</option>\n <option *ngFor=\"let entry of filteredEntries\" [value]=\"entryKey(entry)\">\n {{ entry.processDefinitionName }} / {{ entry.activityName }} ({{ entry.activityId }})\n </option>\n </select>\n <div *ngIf=\"error\" class=\"selector-error\">{{ error }}</div>\n </div>\n `,\n styles: [\n `\n .process-link-selector {\n margin-bottom: 0.5rem;\n }\n .selector-label {\n display: block;\n font-weight: 600;\n font-size: 0.85rem;\n color: #495057;\n margin-bottom: 0.25rem;\n }\n .selector-dropdown {\n width: 100%;\n border: 1px solid #ced4da;\n border-radius: 4px;\n padding: 0.4rem 0.5rem;\n font-size: 0.85rem;\n background: white;\n }\n .selector-error {\n color: #dc3545;\n font-size: 0.75rem;\n margin-top: 0.25rem;\n }\n `,\n ],\n})\nexport class EpistolaProcessLinkSelectorComponent\n implements FormioCustomComponent<ProcessLinkSelection | null>, OnChanges, OnDestroy\n{\n @Input() value!: ProcessLinkSelection | null;\n @Output() valueChange = new EventEmitter<ProcessLinkSelection | null>();\n\n @Input() disabled = false;\n @Input() label = 'Process Link';\n\n filteredEntries: PluginUsageEntry[] = [];\n selectedKey = '';\n loading = false;\n error: string | null = null;\n\n private initialized = false;\n private loadSubscription?: Subscription;\n\n constructor(\n private readonly adminService: EpistolaAdminService,\n private readonly cdr: ChangeDetectorRef,\n ) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!this.initialized) {\n this.initialized = true;\n this.loadEntries();\n }\n // Restore selection whenever value changes (Formio may set it after init)\n if (changes['value'] && this.value) {\n this.selectedKey = `${this.value.processDefinitionKey}::${this.value.sourceActivityId}`;\n this.cdr.markForCheck();\n }\n }\n\n ngOnDestroy(): void {\n this.loadSubscription?.unsubscribe();\n }\n\n onSelect(key: string): void {\n this.selectedKey = key;\n if (!key) {\n this.value = null;\n this.valueChange.emit(null);\n return;\n }\n const [processDefinitionKey, sourceActivityId] = key.split('::');\n this.value = { processDefinitionKey, sourceActivityId };\n this.valueChange.emit(this.value);\n }\n\n entryKey(entry: PluginUsageEntry): string {\n return `${entry.processDefinitionKey}::${entry.activityId}`;\n }\n\n private loadEntries(): void {\n this.loading = true;\n this.cdr.markForCheck();\n\n this.loadSubscription = this.adminService.getPluginUsage().subscribe({\n next: (entries) => {\n this.filteredEntries = filterGenerateDocumentEntries(entries);\n this.loading = false;\n\n // Restore selection from value\n if (this.value) {\n this.selectedKey = `${this.value.processDefinitionKey}::${this.value.sourceActivityId}`;\n }\n this.cdr.markForCheck();\n },\n error: (err) => {\n this.error = 'Failed to load process links';\n this.loading = false;\n this.cdr.markForCheck();\n },\n });\n }\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport { Injector } from '@angular/core';\nimport { FormioCustomComponentInfo, registerCustomFormioComponent } from '@valtimo/components';\nimport { EpistolaProcessLinkSelectorComponent } from './process-link-selector.component';\nimport { hideFormioComponentFromBuilder } from '../formio-builder-utils';\n\nexport const EPISTOLA_PROCESS_LINK_SELECTOR_OPTIONS: FormioCustomComponentInfo = {\n type: 'epistola-process-link-selector',\n selector: 'epistola-process-link-selector-element',\n title: 'Epistola Process Link Selector',\n group: 'basic',\n icon: 'link',\n emptyValue: null,\n fieldOptions: ['label'],\n};\n\nexport function registerEpistolaProcessLinkSelectorComponent(injector: Injector): void {\n if (!customElements.get(EPISTOLA_PROCESS_LINK_SELECTOR_OPTIONS.selector)) {\n registerCustomFormioComponent(\n EPISTOLA_PROCESS_LINK_SELECTOR_OPTIONS,\n EpistolaProcessLinkSelectorComponent,\n injector,\n );\n // Internal editForm widget — not a standalone form field. Hide it from the builder palette.\n hideFormioComponentFromBuilder(EPISTOLA_PROCESS_LINK_SELECTOR_OPTIONS.type);\n }\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport {\n ENVIRONMENT_INITIALIZER,\n inject,\n Injector,\n ModuleWithProviders,\n NgModule,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HttpClientModule } from '@angular/common/http';\nimport { PluginTranslatePipeModule } from '@valtimo/plugin';\nimport { FormModule, InputModule, SelectModule } from '@valtimo/components';\nimport { EpistolaConfigurationComponent } from './components/epistola-configuration/epistola-configuration.component';\nimport { GenerateDocumentConfigurationComponent } from './components/generate-document-configuration/generate-document-configuration.component';\nimport { CheckJobStatusConfigurationComponent } from './components/check-job-status-configuration/check-job-status-configuration.component';\nimport { DownloadDocumentConfigurationComponent } from './components/download-document-configuration/download-document-configuration.component';\nimport { EpistolaDocumentComponent } from './components/epistola-document/epistola-document.component';\nimport { EpistolaRetryFormComponent } from './components/epistola-retry-form/epistola-retry-form.component';\nimport { EpistolaDocumentPreviewComponent } from './components/epistola-document-preview/epistola-document-preview.component';\nimport { EpistolaAdminPageComponent } from './components/epistola-admin-page/epistola-admin-page.component';\nimport { EpistolaPluginService, EpistolaAdminService, EpistolaMenuService } from './services';\nimport { EpistolaAdminRoutingModule } from './epistola-admin-routing.module';\nimport { isEpistolaEnabled } from './epistola-runtime-config';\nimport { registerEpistolaDocumentComponent } from './components/epistola-document/epistola-document.formio';\nimport { registerEpistolaRetryFormComponent } from './components/epistola-retry-form/epistola-retry-form.formio';\nimport { registerEpistolaDocumentPreviewComponent } from './components/epistola-document-preview/epistola-document-preview.formio';\nimport { registerEpistolaOverrideBuilderComponent } from './components/override-builder/override-builder.formio';\nimport { registerEpistolaProcessLinkSelectorComponent } from './components/process-link-selector/process-link-selector.formio';\n\n@NgModule({\n imports: [\n CommonModule,\n HttpClientModule,\n PluginTranslatePipeModule,\n FormModule,\n InputModule,\n SelectModule,\n EpistolaAdminRoutingModule,\n EpistolaConfigurationComponent,\n GenerateDocumentConfigurationComponent,\n CheckJobStatusConfigurationComponent,\n DownloadDocumentConfigurationComponent,\n EpistolaDocumentComponent,\n EpistolaRetryFormComponent,\n EpistolaDocumentPreviewComponent,\n EpistolaAdminPageComponent,\n ],\n exports: [\n EpistolaConfigurationComponent,\n GenerateDocumentConfigurationComponent,\n CheckJobStatusConfigurationComponent,\n DownloadDocumentConfigurationComponent,\n EpistolaDocumentComponent,\n EpistolaRetryFormComponent,\n EpistolaDocumentPreviewComponent,\n EpistolaAdminPageComponent,\n ],\n providers: [\n EpistolaPluginService,\n EpistolaAdminService,\n EpistolaMenuService,\n {\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useValue: () => {\n if (!isEpistolaEnabled()) return;\n const injector = inject(Injector);\n registerEpistolaDocumentComponent(injector);\n registerEpistolaRetryFormComponent(injector);\n registerEpistolaOverrideBuilderComponent(injector);\n registerEpistolaProcessLinkSelectorComponent(injector);\n registerEpistolaDocumentPreviewComponent(injector);\n // Eagerly create EpistolaMenuService to trigger menu registration\n inject(EpistolaMenuService);\n },\n },\n ],\n})\nexport class EpistolaPluginModule {\n // Kept for back-compat with hosts that follow the README's `forRoot()`\n // setup. The providers above are now module-level so `imports: [EpistolaPluginModule]`\n // (what the Valtimo Configurator emits) wires everything on its own.\n static forRoot(): ModuleWithProviders<EpistolaPluginModule> {\n return { ngModule: EpistolaPluginModule };\n }\n}\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nexport const EPISTOLA_PLUGIN_LOGO_BASE64 =\n 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjAgMTIwIiB3aWR0aD0iMTIwIiBoZWlnaHQ9IjEyMCI+CiAgPCEtLSBTdGFjayBiYXNlIC0tPgogIDxyZWN0IHg9IjM2IiB5PSIxNiIgd2lkdGg9IjU0IiBoZWlnaHQ9IjcwIiByeD0iMyIgZmlsbD0iI2U2YzJiMCIgc3Ryb2tlPSIjNGYyZjJiIiBzdHJva2Utd2lkdGg9IjIiIHRyYW5zZm9ybT0icm90YXRlKDUgNjMgNTEpIi8+CiAgPHJlY3QgeD0iMzIiIHk9IjIyIiB3aWR0aD0iNTQiIGhlaWdodD0iNzAiIHJ4PSIzIiBmaWxsPSIjZjBkOGM4IiBzdHJva2U9IiM0ZjJmMmIiIHN0cm9rZS13aWR0aD0iMiIvPgogIDxyZWN0IHg9IjI4IiB5PSIyOCIgd2lkdGg9IjU0IiBoZWlnaHQ9IjcwIiByeD0iMyIgZmlsbD0iI2Y1ZWJlMyIgc3Ryb2tlPSIjNGYyZjJiIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogIDxsaW5lIHgxPSIzOCIgeTE9IjQ0IiB4Mj0iNzIiIHkyPSI0NCIgc3Ryb2tlPSIjYzRhODgyIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgogIDxsaW5lIHgxPSIzOCIgeTE9IjU0IiB4Mj0iNzIiIHkyPSI1NCIgc3Ryb2tlPSIjYzRhODgyIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgogIDxsaW5lIHgxPSIzOCIgeTE9IjY0IiB4Mj0iNTgiIHkyPSI2NCIgc3Ryb2tlPSIjYzRhODgyIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgogIDwhLS0gV2F4IHNlYWwgd2l0aCBjaGVja21hcmsgLS0+CiAgPGNpcmNsZSBjeD0iNTUiIGN5PSI4NCIgcj0iMTUiIGZpbGw9IiNiODVjM2MiIHN0cm9rZT0iIzRmMmYyYiIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPGNpcmNsZSBjeD0iNTUiIGN5PSI4NCIgcj0iMTAuNSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZDQ4MzZhIiBzdHJva2Utd2lkdGg9IjEiLz4KICA8cG9seWxpbmUgcG9pbnRzPSI0OSw4NCA1Myw4OSA2Miw3OCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNGYyZjJiIiBzdHJva2Utd2lkdGg9IjIuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+Cjwvc3ZnPgo=';\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nexport * from './epistola-logo';\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\nimport { PluginSpecification } from '@valtimo/plugin';\nimport { EpistolaConfigurationComponent } from './components/epistola-configuration/epistola-configuration.component';\nimport { GenerateDocumentConfigurationComponent } from './components/generate-document-configuration/generate-document-configuration.component';\nimport { CheckJobStatusConfigurationComponent } from './components/check-job-status-configuration/check-job-status-configuration.component';\nimport { DownloadDocumentConfigurationComponent } from './components/download-document-configuration/download-document-configuration.component';\nimport { EPISTOLA_PLUGIN_LOGO_BASE64 } from './assets';\nimport { isEpistolaEnabled } from './epistola-runtime-config';\n\nconst EPISTOLA_PLUGIN_ID = 'epistola';\nconst DISABLED_EPISTOLA_PLUGIN_ID = '__epistola_disabled__';\n\nconst epistolaPluginSpecification: PluginSpecification = {\n get pluginId(): string {\n return isEpistolaEnabled() ? EPISTOLA_PLUGIN_ID : DISABLED_EPISTOLA_PLUGIN_ID;\n },\n\n // Component for plugin-level configuration (tenantId)\n pluginConfigurationComponent: EpistolaConfigurationComponent,\n\n // Plugin logo\n pluginLogoBase64: EPISTOLA_PLUGIN_LOGO_BASE64,\n\n // Map action keys to their configuration components\n functionConfigurationComponents: {\n 'epistola-generate-document': GenerateDocumentConfigurationComponent,\n 'epistola-check-job-status': CheckJobStatusConfigurationComponent,\n 'epistola-download-document': DownloadDocumentConfigurationComponent,\n },\n\n // Translations\n pluginTranslations: {\n nl: {\n title: 'Epistola Document Suite',\n description: 'Documentgeneratie met Epistola',\n configurationTitle: 'Configuratienaam',\n baseUrl: 'Base URL',\n baseUrlTooltip: 'De basis URL van de Epistola API (bijv. https://api.epistola.app)',\n apiKey: 'API Key',\n apiKeyTooltip: 'De API sleutel voor authenticatie met Epistola',\n tenantId: 'Tenant ID',\n tenantIdTooltip:\n 'De tenant slug in Epistola (3-63 tekens, alleen kleine letters, cijfers en koppeltekens, bijv. \"mijn-tenant\")',\n defaultEnvironmentId: 'Standaard Omgeving',\n defaultEnvironmentIdTooltip:\n 'De standaard omgeving voor documentgeneratie (3-30 tekens, alleen kleine letters, cijfers en koppeltekens, bijv. \"productie\")',\n templateSyncEnabled: 'Template synchronisatie',\n templateSyncEnabledTooltip:\n 'Synchroniseer template definities automatisch van het classpath naar Epistola bij het opstarten',\n 'epistola-generate-document': 'Genereer Document',\n catalogId: 'Catalogus',\n catalogIdTooltip: 'Selecteer de catalogus waaruit een template gekozen wordt',\n templateId: 'Template',\n templateIdTooltip: 'Selecteer het template dat gebruikt wordt voor documentgeneratie',\n variantId: 'Variant',\n variantIdTooltip: 'Selecteer de template variant',\n variantSelectionMode: 'Variant selectie',\n variantSelectionModeTooltip: 'Kies hoe de variant geselecteerd wordt',\n selectByVariant: 'Selecteer variant',\n selectByAttributes: 'Selecteer op kenmerken',\n variantAttributes: 'Variant kenmerken',\n variantAttributesTooltip:\n 'Kenmerken voor automatische variant selectie. Waarden kunnen expressies zijn (doc:, pv:, case:).',\n attributeKey: 'Kenmerk',\n attributeKeyCustom: 'Aangepast...',\n attributeValue: 'Waarde',\n addAttribute: 'Kenmerk toevoegen',\n removeAttribute: 'Kenmerk verwijderen',\n attributeRequired: 'Verplicht',\n attributePreferred: 'Voorkeur',\n environmentId: 'Omgeving',\n environmentIdTooltip: 'Selecteer de doelomgeving (optioneel)',\n correlationId: 'Correlatie ID',\n correlationIdTooltip: 'Een optioneel correlatie ID voor het traceren van dit verzoek',\n dataMapping: 'Data Mapping',\n dataMappingTooltip: 'Koppeling van template velden naar data bronnen (doc:, pv:, case:)',\n outputFormat: 'Uitvoerformaat',\n outputFormatTooltip: 'Het gewenste formaat van het gegenereerde document',\n filename: 'Bestandsnaam',\n filenameTooltip: 'De bestandsnaam voor het gegenereerde document',\n resultProcessVariable: 'Resultaat Procesvariabele',\n resultProcessVariableTooltip:\n 'De naam van de procesvariabele waarin het request ID wordt opgeslagen',\n pdf: 'PDF',\n html: 'HTML',\n // Data mapping builder translations\n dataMappingTitle: 'Data Mapping',\n dataMappingDescription: 'Koppel template velden aan Valtimo data bronnen',\n jsonataDescription:\n 'JSONata expressie die de template data genereert. Gebruik $doc, $pv en $case voor toegang tot document-, procesvariabelen- en zaakdata.',\n mappingModeSimple: 'Eenvoudig',\n mappingModeAdvanced: 'Geavanceerd',\n mappingTools: 'Schema & Voorbeeld',\n expectedStructure: 'Verwacht schema',\n expectedStructureLoading: 'Schema laden...',\n previewTitle: 'Voorbeeld',\n previewDocPlaceholder: 'Document ID',\n previewExpected: 'Verwacht',\n previewProduced: 'Geproduceerd',\n previewRunHint: 'Voer een document ID in en klik ▶ om een voorbeeld te zien',\n previewMissing: 'Ontbrekende verplichte velden',\n templateField: 'Template veld',\n dataSource: 'Data bron',\n addMapping: 'Mapping toevoegen',\n noMappings: 'Nog geen mappings toegevoegd. Klik op \"Mapping toevoegen\" om te beginnen.',\n documentFields: 'Document velden',\n processVariables: 'Procesvariabelen',\n caseProperties: 'Zaak eigenschappen',\n sourceType: 'Brontype',\n sourceTypeDocument: 'Document veld',\n sourceTypeProcessVariable: 'Procesvariabele',\n sourceTypeManual: 'Handmatig',\n requiredFieldsMissing: 'Niet alle verplichte velden zijn gekoppeld',\n requiredFieldsComplete: 'Alle verplichte velden zijn gekoppeld',\n validationSummary: 'verplichte velden gekoppeld',\n jsonataValidationErrorsHeading: 'Ongeldige JSONata-expressies:',\n fieldRequired: 'Verplicht',\n fieldOptional: 'Optioneel',\n mapCollectionTo: 'Koppel collectie aan',\n browseMode: 'Bladermodus',\n pvMode: 'Procesvariabele modus',\n pvPlaceholder: 'Naam procesvariabele',\n expressionMode: 'Expressiemodus',\n availableFunctions: 'Beschikbare functies',\n itemFieldMapping: 'Veldnamen per item koppelen',\n itemFieldMappingTitle: 'Veldkoppeling per item:',\n sourceFieldPlaceholder: 'Bronveldnaam',\n noTemplateFields: 'Geen template velden beschikbaar',\n // Check job status action\n 'epistola-check-job-status': 'Controleer Taakstatus',\n requestIdVariable: 'Request ID Variabele',\n requestIdVariableTooltip: 'Naam van de procesvariabele met het Epistola request ID',\n statusVariable: 'Status Variabele',\n statusVariableTooltip: 'Naam van de procesvariabele waarin de status wordt opgeslagen',\n documentIdVariable: 'Document ID Variabele',\n documentIdVariableTooltip:\n 'Naam van de procesvariabele waarin het document ID wordt opgeslagen (bij voltooiing)',\n errorMessageVariable: 'Foutmelding Variabele',\n errorMessageVariableTooltip:\n 'Naam van de procesvariabele waarin de foutmelding wordt opgeslagen (bij fout)',\n // Download document action\n 'epistola-download-document': 'Download Document',\n documentVariable: 'Document Variabele',\n documentVariableTooltip:\n 'Naam van de procesvariabele met het Epistola resultaat. Mag een String document ID zijn (legacy) of een rich-result object met een documentId-veld; de actie haalt het document ID eruit.',\n storageTarget: 'Opslagdoel',\n storageTargetTooltip:\n 'Waar het gedownloade PDF wordt opgeslagen. \"Tijdelijke resource-opslag\" (aanbevolen) zet alleen een resource-id in de variabele — geschikt om door te geven aan documenten-api:store-temp-document. \"Procesvariabele\" zet de ruwe bytes inline in de variabele (alleen voor kleine, niet-gevoelige documenten; deze worden in de taakrespons meegestuurd).',\n resourceIdVariable: 'Resource-ID Variabele',\n resourceIdVariableTooltip:\n 'Naam van de procesvariabele waarin het tijdelijke resource-id wordt opgeslagen (geef deze door aan documenten-api:store-temp-document).',\n contentVariable: 'Inhoud Variabele',\n contentVariableTooltip:\n 'Naam van de procesvariabele waarin de ruwe PDF-bytes inline worden opgeslagen (alleen voor kleine, niet-gevoelige documenten).',\n // Admin page\n epistolaAdminOverview: 'Overzicht',\n epistolaAdminRefresh: 'Vernieuwen',\n epistolaAdminLoading: 'Laden...',\n epistolaAdminNoConfigurations: 'Geen Epistola plugin configuraties gevonden.',\n epistolaAdminTenantId: 'Tenant ID',\n epistolaAdminStatus: 'Status',\n epistolaAdminConnected: 'Verbonden',\n epistolaAdminUnreachable: 'Onbereikbaar',\n epistolaAdminError: 'Fout',\n epistolaAdminPluginActions: 'Plugin acties',\n epistolaAdminProblems: 'Problemen',\n epistolaAdminBackToOverview: 'Terug naar overzicht',\n epistolaAdminNoUsageForConfig: 'Geen procesacties geconfigureerd voor deze verbinding.',\n epistolaAdminCase: 'Zaak',\n epistolaAdminProcess: 'Proces',\n epistolaAdminActivity: 'Activiteit',\n epistolaAdminAction: 'Actie',\n epistolaAdminServerVersion: 'Server versie',\n epistolaAdminExport: 'Exporteren',\n epistolaAdminPendingJobs: 'Wachtende taken',\n epistolaAdminNoPendingJobs: 'Geen wachtende taken voor deze verbinding.',\n epistolaAdminConfiguration: 'Configuratie',\n epistolaAdminRequestId: 'Request ID',\n epistolaAdminReconcile: 'Hersynchroniseer',\n epistolaAdminReconciling: 'Bezig...',\n epistolaAdminReconcileTooltip:\n 'Vraag de huidige status op bij Epistola en hervat het wachtende proces als het klaar is.',\n epistolaAdminStatusWaiting: 'Wachtend',\n epistolaAdminStatusUnwired: 'Vastgelopen',\n epistolaAdminUnwiredTooltip:\n 'Deze taak heeft geen correlatie-token (epistolaWaitFor), dus de collector kan hem nooit hervatten — het proces is vastgelopen. Meestal een dubbelzinnig samengevoegd catch event (zie BPMN-validatie). Op te lossen in het procesmodel; hersynchroniseren werkt hier niet.',\n epistolaAdminUnwiredHint: 'Niet te hersynchroniseren',\n epistolaAdminConfigurations: 'Configuraties',\n epistolaAdminValidations: 'BPMN-validatie',\n epistolaAdminNoValidations:\n 'Geen race-onveilige procesdefinities gevonden. Alles ziet er goed uit.',\n epistolaAdminValidationWarningTitle: 'BPMN configuratie waarschuwing',\n epistolaAdminValidationWarningBody:\n 'In deze procesdefinities is de grens tussen de generate-document service task en de EpistolaDocumentGenerated catch event niet synchroon. Resultaten kunnen verloren gaan; gebruik in dat geval de Hersynchroniseer-knop in de Wachtende taken-tab.',\n epistolaAdminValidationCode: 'Code',\n epistolaAdminValidationMessage: 'Bericht',\n epistolaAdminValidationLastChecked: 'Laatst gecontroleerd',\n epistolaAdminValidationNotYetRun: 'nog niet uitgevoerd',\n epistolaAdminValidationAutoRefresh: 'automatisch opnieuw gecontroleerd, ongeveer elke',\n epistolaAdminValidationLatestVersionNote:\n 'Alleen de meest recente versie van elke procesdefinitie wordt gecontroleerd; oudere versies met nog lopende instanties kunnen problemen hebben die hier niet worden getoond.',\n epistolaAdminCatalogs: 'Catalogi',\n epistolaAdminCatalogsIntro:\n 'Catalogi op het classpath van de applicatie. Deze worden bij het opstarten automatisch uitgerold; gebruik Opnieuw uitrollen om een catalogus handmatig (geforceerd) naar deze Epistola-omgeving te sturen, bijvoorbeeld als de automatische uitrol is mislukt.',\n epistolaAdminNoCatalogs: 'Geen catalogi gevonden op het classpath.',\n epistolaAdminCatalogSlug: 'Slug',\n epistolaAdminCatalogVersion: 'Versie',\n epistolaAdminCatalogStatus: 'Status in Epistola',\n epistolaAdminCatalogInEpistola: 'Aanwezig in Epistola',\n epistolaAdminCatalogNotInEpistola: 'Niet in Epistola',\n epistolaAdminCatalogStatusUnknown: 'Onbekend (Epistola niet bereikbaar)',\n epistolaAdminRedeploy: 'Opnieuw uitrollen',\n epistolaAdminRedeploying: 'Bezig...',\n epistolaAdminRedeployTooltip:\n 'Bouw deze catalogus opnieuw vanaf het classpath en stuur hem geforceerd naar Epistola, ongeacht de versie of de templateSyncEnabled-instelling.',\n epistolaAdminChangelog: 'Changelog',\n epistolaAdminRunningVersion: 'Actieve plugin-versie:',\n epistolaAdminNoChangelog: 'Geen changelog beschikbaar in deze build.',\n // TEMPORARY (remove in 1.0.0): task-id carrier repair (admin \"Forms\" tab)\n epistolaAdminForms: 'Formulieren',\n epistolaAdminFormsIntro:\n 'Formulieren met een Epistola-component dat het verborgen task-id veld mist. Zonder dat veld werkt het voorbeeld/downloaden/opnieuw genereren niet in elke taak-openflow. Herstel voegt het veld toe.',\n epistolaAdminFormName: 'Formulier',\n epistolaAdminFormMissing: 'Ontbrekende componenten',\n epistolaAdminFormReadOnly: 'Alleen-lezen',\n epistolaAdminFormReadOnlyHint:\n 'Dit formulier komt van het classpath en wordt bij de volgende herstart teruggezet naar de bron. Voeg het veld toe aan de bron (component opnieuw plaatsen) voor een blijvende oplossing.',\n epistolaAdminRepair: 'Herstellen',\n epistolaAdminRepairAll: 'Alles herstellen',\n epistolaAdminRepairing: 'Bezig...',\n epistolaAdminRepairTooltip:\n 'Voeg het verborgen task-id veld toe aan alle Epistola-componenten in dit formulier.',\n epistolaAdminNoFormIssues: 'Geen formulieren met een ontbrekend task-id veld gevonden.',\n // TEMPORARY: legacy override-mapping format detection (admin \"Forms\" tab)\n epistolaAdminLegacyOverrideTitle: 'Verouderd invoer-override formaat',\n epistolaAdminLegacyOverrideIntro:\n 'Formulieren waarvan een document-voorbeeldcomponent de invoer-overrides nog als object opslaat (\"form:\"-verwijzingen) in plaats van als JSONata-expressie over $form. Ze blijven werken, maar worden pas naar het nieuwe formaat omgezet als je het formulier opnieuw opslaat in de formulierbouwer.',\n epistolaAdminLegacyOverrideComponents: 'Verouderde componenten',\n epistolaAdminNoLegacyOverride:\n 'Geen formulieren met het verouderde override-formaat gevonden.',\n },\n en: {\n title: 'Epistola Document Suite',\n description: 'Document generation using Epistola',\n configurationTitle: 'Configuration name',\n baseUrl: 'Base URL',\n baseUrlTooltip: 'The base URL of the Epistola API (e.g. https://api.epistola.app)',\n apiKey: 'API Key',\n apiKeyTooltip: 'The API key for authentication with Epistola',\n tenantId: 'Tenant ID',\n tenantIdTooltip:\n 'The tenant slug in Epistola (3-63 chars, lowercase letters, digits and hyphens only, e.g. \"my-tenant\")',\n defaultEnvironmentId: 'Default Environment',\n defaultEnvironmentIdTooltip:\n 'The default environment for document generation (3-30 chars, lowercase letters, digits and hyphens only, e.g. \"production\")',\n templateSyncEnabled: 'Template sync',\n templateSyncEnabledTooltip:\n 'Automatically synchronize template definitions from classpath to Epistola on startup',\n 'epistola-generate-document': 'Generate Document',\n catalogId: 'Catalog',\n catalogIdTooltip: 'Select the catalog to choose a template from',\n templateId: 'Template',\n templateIdTooltip: 'Select the template to use for document generation',\n variantId: 'Variant',\n variantIdTooltip: 'Select the template variant',\n variantSelectionMode: 'Variant selection',\n variantSelectionModeTooltip: 'Choose how the variant is selected',\n selectByVariant: 'Select variant',\n selectByAttributes: 'Select by attributes',\n variantAttributes: 'Variant attributes',\n variantAttributesTooltip:\n 'Attributes for automatic variant selection. Values can be expressions (doc:, pv:, case:).',\n attributeKey: 'Attribute',\n attributeKeyCustom: 'Custom...',\n attributeValue: 'Value',\n addAttribute: 'Add attribute',\n removeAttribute: 'Remove attribute',\n attributeRequired: 'Required',\n attributePreferred: 'Preferred',\n environmentId: 'Environment',\n environmentIdTooltip: 'Select the target environment (optional)',\n correlationId: 'Correlation ID',\n correlationIdTooltip: 'An optional correlation ID for tracking this request',\n dataMapping: 'Data Mapping',\n dataMappingTooltip: 'Mapping of template fields to data sources (doc:, pv:, case:)',\n outputFormat: 'Output Format',\n outputFormatTooltip: 'The desired format of the generated document',\n filename: 'Filename',\n filenameTooltip: 'The filename for the generated document',\n resultProcessVariable: 'Result Process Variable',\n resultProcessVariableTooltip: 'The name of the process variable to store the request ID in',\n pdf: 'PDF',\n html: 'HTML',\n // Data mapping builder translations\n dataMappingTitle: 'Data Mapping',\n dataMappingDescription: 'Map template fields to Valtimo data sources',\n mappingModeSimple: 'Simple',\n mappingModeAdvanced: 'Advanced',\n mappingTools: 'Schema & Preview',\n expectedStructure: 'Expected schema',\n expectedStructureLoading: 'Loading schema...',\n previewTitle: 'Preview',\n previewDocPlaceholder: 'Document ID',\n previewExpected: 'Expected',\n previewProduced: 'Produced',\n previewRunHint: 'Enter a document ID and click ▶ to preview the output',\n previewMissing: 'Missing required fields',\n jsonataDescription:\n 'JSONata expression that generates the template data. Use $doc, $pv and $case to access document, process variable and case data.',\n templateField: 'Template field',\n dataSource: 'Data source',\n addMapping: 'Add mapping',\n noMappings: 'No mappings added yet. Click \"Add mapping\" to start.',\n documentFields: 'Document fields',\n processVariables: 'Process variables',\n caseProperties: 'Case properties',\n sourceType: 'Source type',\n sourceTypeDocument: 'Document field',\n sourceTypeProcessVariable: 'Process variable',\n sourceTypeManual: 'Manual value',\n requiredFieldsMissing: 'Not all required fields are mapped',\n requiredFieldsComplete: 'All required fields are mapped',\n validationSummary: 'required fields mapped',\n jsonataValidationErrorsHeading: 'Invalid JSONata expressions:',\n fieldRequired: 'Required',\n fieldOptional: 'Optional',\n mapCollectionTo: 'Map collection to',\n browseMode: 'Browse mode',\n pvMode: 'Process variable mode',\n pvPlaceholder: 'Process variable name',\n expressionMode: 'Expression mode',\n availableFunctions: 'Available functions',\n itemFieldMapping: 'Map field names per item',\n itemFieldMappingTitle: 'Item field mapping:',\n sourceFieldPlaceholder: 'Source field name',\n noTemplateFields: 'No template fields available',\n // Check job status action\n 'epistola-check-job-status': 'Check Job Status',\n requestIdVariable: 'Request ID Variable',\n requestIdVariableTooltip: 'Name of the process variable containing the Epistola request ID',\n statusVariable: 'Status Variable',\n statusVariableTooltip: 'Name of the process variable to store the status in',\n documentIdVariable: 'Document ID Variable',\n documentIdVariableTooltip:\n 'Name of the process variable to store the document ID in (when completed)',\n errorMessageVariable: 'Error Message Variable',\n errorMessageVariableTooltip:\n 'Name of the process variable to store the error message in (when failed)',\n // Download document action\n 'epistola-download-document': 'Download Document',\n documentVariable: 'Document Variable',\n documentVariableTooltip:\n 'Name of the process variable holding the Epistola result. May be a String document id (legacy) or a rich result object with a `documentId` key — the action extracts the document id from it.',\n storageTarget: 'Storage Target',\n storageTargetTooltip:\n 'Where the downloaded PDF is stored. \"Temporary resource storage\" (recommended) writes only a resource id to the variable — ready to hand to documenten-api:store-temp-document. \"Process variable\" writes the raw bytes inline (small, non-sensitive documents only; they are included in the task response).',\n resourceIdVariable: 'Resource ID Variable',\n resourceIdVariableTooltip:\n 'Name of the process variable to store the temporary resource id in (hand this to documenten-api:store-temp-document).',\n contentVariable: 'Content Variable',\n contentVariableTooltip:\n 'Name of the process variable to store the raw PDF bytes inline in (small, non-sensitive documents only).',\n // Admin page\n epistolaAdminOverview: 'Overview',\n epistolaAdminRefresh: 'Refresh',\n epistolaAdminLoading: 'Loading...',\n epistolaAdminNoConfigurations: 'No Epistola plugin configurations found.',\n epistolaAdminTenantId: 'Tenant ID',\n epistolaAdminStatus: 'Status',\n epistolaAdminConnected: 'Connected',\n epistolaAdminUnreachable: 'Unreachable',\n epistolaAdminError: 'Error',\n epistolaAdminPluginActions: 'Plugin actions',\n epistolaAdminProblems: 'Problems',\n epistolaAdminBackToOverview: 'Back to overview',\n epistolaAdminNoUsageForConfig: 'No process actions configured for this connection.',\n epistolaAdminCase: 'Case',\n epistolaAdminProcess: 'Process',\n epistolaAdminActivity: 'Activity',\n epistolaAdminAction: 'Action',\n epistolaAdminServerVersion: 'Server version',\n epistolaAdminExport: 'Export',\n epistolaAdminPendingJobs: 'Pending jobs',\n epistolaAdminNoPendingJobs: 'No pending jobs for this connection.',\n epistolaAdminConfiguration: 'Configuration',\n epistolaAdminRequestId: 'Request ID',\n epistolaAdminReconcile: 'Reconcile',\n epistolaAdminReconciling: 'Reconciling...',\n epistolaAdminReconcileTooltip:\n \"Ask Epistola for this job's current status and resume the waiting process if it has finished.\",\n epistolaAdminStatusWaiting: 'Waiting',\n epistolaAdminStatusUnwired: 'Stuck',\n epistolaAdminUnwiredTooltip:\n 'This wait has no correlation token (epistolaWaitFor), so the collector can never resume it — the process is stuck. Usually an ambiguous merged catch event (see BPMN validation). Fix it in the process model; reconcile cannot recover it.',\n epistolaAdminUnwiredHint: 'Cannot reconcile',\n epistolaAdminConfigurations: 'Configurations',\n epistolaAdminValidations: 'BPMN validation',\n epistolaAdminNoValidations:\n 'No race-unsafe process definitions detected. Everything looks good.',\n epistolaAdminValidationWarningTitle: 'BPMN configuration warning',\n epistolaAdminValidationWarningBody:\n 'These process definitions have a non-synchronous boundary between the generate-document service task and the EpistolaDocumentGenerated catch event. Results can be missed; use the Reconcile button on the Pending Jobs tab to recover.',\n epistolaAdminValidationCode: 'Code',\n epistolaAdminValidationMessage: 'Message',\n epistolaAdminValidationLastChecked: 'Last checked',\n epistolaAdminValidationNotYetRun: 'not yet run',\n epistolaAdminValidationAutoRefresh: 'automatically re-checked roughly every',\n epistolaAdminValidationLatestVersionNote:\n \"Only the latest deployed version of each process definition is checked; older versions with running instances may have problems that aren't shown here.\",\n epistolaAdminCatalogs: 'Catalogs',\n epistolaAdminCatalogsIntro:\n 'Catalogs on the application classpath. These are deployed automatically on startup; use Redeploy to manually (force) push one to this Epistola installation — for example when the automatic startup deploy failed.',\n epistolaAdminNoCatalogs: 'No catalogs found on the classpath.',\n epistolaAdminCatalogSlug: 'Slug',\n epistolaAdminCatalogVersion: 'Version',\n epistolaAdminCatalogStatus: 'Status in Epistola',\n epistolaAdminCatalogInEpistola: 'Present in Epistola',\n epistolaAdminCatalogNotInEpistola: 'Not in Epistola',\n epistolaAdminCatalogStatusUnknown: 'Unknown (Epistola unreachable)',\n epistolaAdminRedeploy: 'Redeploy',\n epistolaAdminRedeploying: 'Redeploying...',\n epistolaAdminRedeployTooltip:\n 'Rebuild this catalog from the classpath and force-push it to Epistola, regardless of version or the templateSyncEnabled setting.',\n epistolaAdminChangelog: 'Changelog',\n epistolaAdminRunningVersion: 'Running plugin version:',\n epistolaAdminNoChangelog: 'No changelog available in this build.',\n // TEMPORARY (remove in 1.0.0): task-id carrier repair (admin \"Forms\" tab)\n epistolaAdminForms: 'Forms',\n epistolaAdminFormsIntro:\n 'Forms with an Epistola component that is missing the hidden task-id field. Without it, preview/download/retry do not work in every task-open flow. Repair adds the field.',\n epistolaAdminFormName: 'Form',\n epistolaAdminFormMissing: 'Missing components',\n epistolaAdminFormReadOnly: 'Read-only',\n epistolaAdminFormReadOnlyHint:\n 'This form is deployed from the classpath and is reconciled to its source on the next restart. Add the field to the source (re-drop the component) for a permanent fix.',\n epistolaAdminRepair: 'Repair',\n epistolaAdminRepairAll: 'Repair all',\n epistolaAdminRepairing: 'Working...',\n epistolaAdminRepairTooltip:\n 'Add the hidden task-id field to all Epistola components in this form.',\n epistolaAdminNoFormIssues: 'No forms with a missing task-id field found.',\n // TEMPORARY: legacy override-mapping format detection (admin \"Forms\" tab)\n epistolaAdminLegacyOverrideTitle: 'Legacy input-override format',\n epistolaAdminLegacyOverrideIntro:\n 'Forms whose document-preview component still stores input overrides as an object (\"form:\" references) instead of a JSONata expression over $form. They keep working, but only migrate to the new format once you re-save the form in the form builder.',\n epistolaAdminLegacyOverrideComponents: 'Legacy components',\n epistolaAdminNoLegacyOverride: 'No forms using the legacy override format found.',\n },\n },\n};\n\nexport { epistolaPluginSpecification };\n","/*\n * Copyright 2025 Epistola.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: EUPL-1.2\n */\n\n/*\n * Public API Surface of epistola plugin\n */\n\nexport * from './lib/models';\nexport * from './lib/services';\nexport * from './lib/epistola.module';\nexport * from './lib/epistola.specification';\nexport * from './lib/epistola-runtime-config';\nexport * from './lib/epistola-admin-routing.module';\nexport * from './lib/components/epistola-admin-page/epistola-admin-page.component';\nexport * from './lib/components/epistola-configuration/epistola-configuration.component';\nexport * from './lib/components/generate-document-configuration/generate-document-configuration.component';\nexport * from './lib/components/check-job-status-configuration/check-job-status-configuration.component';\nexport * from './lib/components/download-document-configuration/download-document-configuration.component';\nexport * from './lib/components/jsonata-editor/jsonata-editor.component';\nexport * from './lib/components/mapping-builder/mapping-builder.component';\nexport * from './lib/components/epistola-document/epistola-document.component';\nexport * from './lib/components/epistola-document/epistola-document.formio';\nexport * from './lib/components/epistola-retry-form/epistola-retry-form.component';\nexport * from './lib/components/epistola-retry-form/epistola-retry-form.formio';\nexport * from './lib/components/epistola-document-preview/epistola-document-preview.component';\nexport * from './lib/components/epistola-document-preview/epistola-document-preview.formio';\nexport * from './lib/components/override-builder/override-builder.component';\nexport * from './lib/components/override-builder/override-builder.formio';\nexport * from './lib/components/process-link-selector/process-link-selector.component';\nexport * from './lib/components/process-link-selector/process-link-selector.formio';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1","i2","jsonata","i1.EpistolaPluginService","i3","i4","take","takeUntil","i5","i6","debounceTime","i1.EpistolaAdminService"],"mappings":"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"}
|