@epistola.app/valtimo-plugin 0.9.0 → 0.9.2

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.
@@ -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/epistola-task-context.service.ts","../../src/lib/services/epistola-task-context.matcher.ts","../../src/lib/services/epistola-task-context.interceptor.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-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/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.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 BpmnValidationViolation,\n CatalogRedeployResult,\n ChangelogRelease,\n ClasspathCatalog,\n ConnectionStatus,\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 violations across deployed\n * process definitions. Empty list = healthy.\n */\n getValidationViolations(): Observable<BpmnValidationViolation[]> {\n return this.http.get<BpmnValidationViolation[]>(`${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","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. {@code processInstanceId},\n * {@code processDefinitionKey} and {@code sourceActivityId} together identify\n * the {@code generate-document} process link being previewed; {@code overrides}\n * and {@code inputOverrides} let the caller substitute data before the\n * JSONata mapping runs.\n */\nexport interface PreviewBlobRequest {\n taskId: string;\n documentId: string;\n processDefinitionKey?: string | null;\n sourceActivityId?: string | null;\n processInstanceId?: 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 * @param taskId Operaton user task id (required — backend authorizes via OperatonTask:VIEW)\n */\n getRetryForm(\n taskId: string,\n processInstanceId: string,\n documentId?: string,\n sourceActivityId?: string,\n ): Observable<any> {\n const params: Record<string, string> = { taskId, processInstanceId };\n if (documentId) {\n params['documentId'] = documentId;\n }\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","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\n/**\n * Holds the currently-open Operaton user task instance id so that custom\n * Formio components rendered inside a Valtimo task form (preview, download,\n * retry-form) can include it in backend requests for PBAC.\n *\n * Populated by {@link EpistolaTaskContextInterceptor}, which sniffs Valtimo's\n * canonical \"load process link for task\" GET (`/api/v2/process-link/task/{taskId}`)\n * — the request always fires when a task opens, before the form renders.\n *\n * <p><b>Why this exists:</b> Valtimo 13.21 does not expose the active task\n * instance id through any service that custom Formio components can inject\n * (`FormIoStateService` carries documentId and processInstanceId only;\n * `TaskDetailContentComponent.taskInstanceId$` is private to that component\n * and Formio elements live in their own injector tree). This service is a\n * workaround until upstream exposes `taskInstanceId` via `FormIoStateService`.\n */\n@Injectable({ providedIn: 'root' })\nexport class EpistolaTaskContextService {\n private readonly _taskInstanceId$ = new BehaviorSubject<string | null>(null);\n\n readonly taskInstanceId$: Observable<string | null> = this._taskInstanceId$.asObservable();\n\n get taskInstanceId(): string | null {\n return this._taskInstanceId$.value;\n }\n\n setTaskInstanceId(id: string | null): void {\n this._taskInstanceId$.next(id);\n }\n}\n","/**\n * Pure helpers for {@link EpistolaTaskContextInterceptor}, extracted so they\n * can be unit-tested without pulling in {@code @angular/core} (which ts-jest\n * cannot transform without {@code jest-preset-angular}).\n */\n\n/**\n * Pattern Valtimo uses for the canonical task-open call:\n * {@code GET /api/v2/process-link/task/{taskInstanceId}}.\n *\n * Captures the {@code taskInstanceId} (UUID v4-style 36-character hyphenated\n * hex string). Anchored at the end of the URL or at a query-string delimiter\n * so we don't accidentally match a longer trailing segment.\n */\nexport const TASK_PROCESS_LINK_PATTERN =\n /\\/api\\/v2\\/process-link\\/task\\/([0-9a-fA-F-]{36})(?:\\?|$)/;\n\n/**\n * Returns the captured {@code taskInstanceId} from a Valtimo task-open\n * request URL, or {@code null} if the request does not match.\n */\nexport function extractTaskInstanceIdFromUrl(method: string, url: string): string | null {\n if (method !== 'GET') return null;\n const match = TASK_PROCESS_LINK_PATTERN.exec(url);\n return match ? match[1] : null;\n}\n","import { Injectable } from '@angular/core';\nimport { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { EpistolaTaskContextService } from './epistola-task-context.service';\nimport { extractTaskInstanceIdFromUrl } from './epistola-task-context.matcher';\n\n/**\n * Sniffs Valtimo's task-open signal and pushes the active taskInstanceId into\n * {@link EpistolaTaskContextService}. The signal is the canonical\n * {@code GET /api/v2/process-link/task/{taskId}} call that\n * {@code TaskDetailContentComponent.loadTaskDetails(...)} fires unconditionally\n * before any task form is rendered (see @valtimo/task internals).\n *\n * <p>This interceptor does <b>not</b> modify the outgoing request. It only\n * captures the taskId from the URL.\n *\n * <p>Workaround for Valtimo 13.21 not exposing taskInstanceId through any\n * injectable service. Remove once upstream adds e.g.\n * {@code FormIoStateService.setTaskInstanceId(...)}.\n *\n * <p>The actual URL-matching logic lives in\n * {@link extractTaskInstanceIdFromUrl} so it can be unit-tested without an\n * Angular harness.\n */\n@Injectable()\nexport class EpistolaTaskContextInterceptor implements HttpInterceptor {\n constructor(private readonly taskContext: EpistolaTaskContextService) {}\n\n intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n const taskId = extractTaskInstanceIdFromUrl(request.method, request.url);\n if (taskId !== null && taskId !== this.taskContext.taskInstanceId) {\n this.taskContext.setTaskInstanceId(taskId);\n }\n return next.handle(request);\n }\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\">&#x2713;</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 ? '&#x25B6;' : '&#x25BC;'\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 &#x25B6;\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\">&#x26A0;</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 * 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 { FormModule, FormOutput, InputModule, SelectItem, SelectModule } 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 readonly selectedVariantId$ = new BehaviorSubject<string>('');\n\n variantSelectionMode: VariantSelectionMode = 'explicit';\n variantIdExpressionMode = false;\n variantIdExpression = '';\n filenameExpressionMode = false;\n filenameExpression = '';\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 requiredFieldsStatus: { mapped: number; total: number } = { mapped: 0, total: 0 };\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 if (formValue.catalogId && formValue.catalogId !== this.selectedCatalogId$.getValue()) {\n this.selectedCatalogId$.next(formValue.catalogId);\n this.selectedTemplateId$.next('');\n this.selectedVariantId$.next('');\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.selectedVariantId$.next('');\n }\n\n if (formValue.variantId && formValue.variantId !== this.selectedVariantId$.getValue()) {\n this.selectedVariantId$.next(formValue.variantId);\n }\n\n this.handleValid(formValue);\n }\n\n onDataMappingChange(expression: string): void {\n this.dataMapping$.next(expression);\n const currentFormValue = this.formValue$.getValue();\n if (currentFormValue) {\n this.handleValid(currentFormValue);\n }\n }\n\n onRequiredFieldsStatusChange(status: { mapped: number; total: number }): void {\n this.requiredFieldsStatus = status;\n const currentFormValue = this.formValue$.getValue();\n if (currentFormValue) {\n this.handleValid(currentFormValue);\n }\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.selectedVariantId$.next(config.variantId);\n }\n }\n\n // Detect expression mode for filename\n if (config.filename && isExpression(config.filename)) {\n this.filenameExpressionMode = true;\n this.filenameExpression = config.filename;\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 baseComplete = !!(\n this.selectedCatalogId$.getValue() &&\n formValue?.templateId &&\n formValue?.outputFormat &&\n formValue?.filename &&\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 requiredFieldsMapped =\n this.requiredFieldsStatus.total === 0 ||\n this.requiredFieldsStatus.mapped === this.requiredFieldsStatus.total;\n\n const valid = baseComplete && variantValid && requiredFieldsMapped;\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 : formValue.filename!,\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 : formValue.variantId!;\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 [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 <div *ngIf=\"variantSelectionMode === 'explicit'\" class=\"field-with-fx\">\n <v-select\n *ngIf=\"!variantIdExpressionMode\"\n name=\"variantId\"\n [title]=\"'variantId' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'variantIdTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [items]=\"obs.variants.data\"\n [defaultSelectionId]=\"obs.prefill?.variantId\"\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)=\"variantIdExpressionMode = !variantIdExpressionMode\"\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 &times;\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 &times;\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 name=\"filename\"\n [title]=\"'filename' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'filenameTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"obs.prefill?.filename\"\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)=\"filenameExpressionMode = !filenameExpressionMode\"\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 ? '&#x25B6;' : '&#x25BC;' }}</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 { 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 { DownloadDocumentConfig } from '../../models';\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],\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 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.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 this.formValue$.next(formValue);\n this.handleValid(formValue);\n }\n\n private handleValid(formValue: DownloadDocumentConfig): void {\n const valid = !!(formValue?.documentVariable && formValue?.contentVariable);\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-input\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 OnDestroy,\n OnInit,\n Output,\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 {\n DownloadDocumentRequest,\n EpistolaPluginService,\n EpistolaTaskContextService,\n} 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>, OnInit, 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 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 taskContext: EpistolaTaskContextService,\n private readonly cdr: ChangeDetectorRef,\n ) {}\n\n ngOnInit(): void {\n if (this.designMode) {\n return;\n }\n if (this.display !== 'button') {\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.taskContext.taskInstanceId;\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, FormIoStateService } from '@valtimo/components';\nimport { FormioModule } from '@formio/angular';\nimport { Subject, Subscription } from 'rxjs';\nimport { debounceTime, switchMap } from 'rxjs/operators';\nimport { EpistolaPluginService, EpistolaTaskContextService } 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 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 private processDefinitionKey?: 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 formIoStateService: FormIoStateService,\n private readonly cdr: ChangeDetectorRef,\n private readonly sanitizer: DomSanitizer,\n private readonly taskContext: EpistolaTaskContextService,\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 }\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 const documentId = this.formIoStateService.documentId;\n const processInstanceId = this.formIoStateService.processInstanceId;\n if (!documentId || !processInstanceId) return;\n\n const taskId = this.taskContext.taskInstanceId;\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 documentId,\n processInstanceId,\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 const processInstanceId = this.formIoStateService.processInstanceId;\n const documentId = this.formIoStateService.documentId;\n if (!processInstanceId) {\n this.error = 'Could not determine process instance ID.';\n this.loading = false;\n this.cdr.markForCheck();\n return;\n }\n\n const taskId = this.taskContext.taskInstanceId;\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, processInstanceId, documentId ?? undefined, 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, EpistolaTaskContextService } from '../../services';\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 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 private readonly taskContext: EpistolaTaskContextService,\n ) {}\n\n /**\n * Resolve the active task id from {@link EpistolaTaskContextService}, populated\n * by {@code EpistolaTaskContextInterceptor} on the canonical Valtimo task-open\n * call. Returns null when used outside a task context (e.g. Formio builder).\n */\n private get currentTaskId(): string | null {\n return this.taskContext.taskInstanceId;\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.loadPreview();\n return;\n }\n\n // React to value changes (input overrides from the Formio wrapper).\n if (changes['value']) {\n this.loadPreview();\n }\n }\n\n ngOnDestroy(): void {\n this.previewSubscription?.unsubscribe();\n this.revokeBlobUrl();\n }\n\n refresh(): void {\n this.loadPreview();\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 const documentId = this.formIoStateService.documentId;\n if (!documentId) {\n this.error = 'Could not determine document ID from context.';\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 const processInstanceId = this.formIoStateService.processInstanceId;\n if (!processInstanceId) {\n this.error = 'Preview is only available from within a running process.';\n this.cdr.markForCheck();\n return;\n }\n\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 documentId,\n processDefinitionKey: this.processDefinitionKey || null,\n processInstanceId,\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 BpmnValidationViolation,\n CatalogRedeployResult,\n ChangelogRelease,\n ClasspathCatalog,\n ConnectionStatus,\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 overviewTab: 'configurations' | 'validations' | 'changelog' = 'configurations';\n loading = false;\n pluginVersion: string | null = null;\n changelog: ChangelogRelease[] | null = null;\n changelogLoading = false;\n validationViolations: BpmnValidationViolation[] = [];\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 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 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 setOverviewTab(tab: 'configurations' | 'validations' | 'changelog'): void {\n this.overviewTab = tab;\n if (tab === 'changelog' && this.changelog === null && !this.changelogLoading) {\n this.loadChangelog();\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 violations are independent of cards — load alongside but don't\n // gate the loading flag on them.\n this.adminService.getValidationViolations().subscribe({\n next: (violations) => {\n this.validationViolations = violations;\n },\n error: () => {\n this.validationViolations = [];\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 <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 *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 </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 &larr; {{ '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 &#x2913;\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';\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};\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","import { Injector } from '@angular/core';\nimport { FormioCustomComponentInfo, registerCustomFormioComponent } from '@valtimo/components';\nimport { EpistolaRetryFormComponent } from './epistola-retry-form.component';\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};\n\nexport function registerEpistolaRetryFormComponent(injector: Injector): void {\n if (!customElements.get(EPISTOLA_RETRY_FORM_OPTIONS.selector)) {\n registerCustomFormioComponent(\n EPISTOLA_RETRY_FORM_OPTIONS,\n EpistolaRetryFormComponent,\n injector,\n );\n }\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';\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 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\n attach(element: HTMLElement) {\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 }\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.root.on('change', () => {\n this._computeAndSetOverrides();\n });\n // Compute initial value\n this._computeAndSetOverrides();\n }\n\n return result;\n }\n\n private _computeAndSetOverrides() {\n if (this._debounceTimer) {\n clearTimeout(this._debounceTimer);\n }\n this._debounceTimer = setTimeout(() => {\n const mapping = this.component?.overrideMapping;\n const formData = this.root?.data;\n if (mapping && formData) {\n const overrides = computeInputOverrides(mapping, formData);\n if (Object.keys(overrides).length > 0) {\n this.setValue(overrides);\n }\n }\n }, 1500);\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';\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","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';\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 = entries.filter((e) => e.actionKey === 'generate-document');\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';\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 }\n}\n","import {\n ENVIRONMENT_INITIALIZER,\n inject,\n Injector,\n ModuleWithProviders,\n NgModule,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HTTP_INTERCEPTORS, 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 {\n EpistolaPluginService,\n EpistolaAdminService,\n EpistolaMenuService,\n EpistolaTaskContextInterceptor,\n} 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: [EpistolaPluginService, EpistolaAdminService],\n})\nexport class EpistolaPluginModule {\n static forRoot(): ModuleWithProviders<EpistolaPluginModule> {\n return {\n ngModule: EpistolaPluginModule,\n providers: [\n EpistolaMenuService,\n {\n provide: HTTP_INTERCEPTORS,\n useClass: EpistolaTaskContextInterceptor,\n multi: true,\n },\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 };\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 contentVariable: 'Inhoud Variabele',\n contentVariableTooltip:\n 'Naam van de procesvariabele waarin de documentinhoud (Base64) wordt opgeslagen',\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 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 },\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 contentVariable: 'Content Variable',\n contentVariableTooltip:\n 'Name of the process variable to store the document content (Base64) in',\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 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 },\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","i1.EpistolaTaskContextService","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/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/epistola-task-context.service.ts","../../src/lib/services/epistola-task-context.matcher.ts","../../src/lib/services/epistola-task-context.interceptor.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-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/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.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 BpmnValidationViolation,\n CatalogRedeployResult,\n ChangelogRelease,\n ClasspathCatalog,\n ConnectionStatus,\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 violations across deployed\n * process definitions. Empty list = healthy.\n */\n getValidationViolations(): Observable<BpmnValidationViolation[]> {\n return this.http.get<BpmnValidationViolation[]>(`${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","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. {@code processInstanceId},\n * {@code processDefinitionKey} and {@code sourceActivityId} together identify\n * the {@code generate-document} process link being previewed; {@code overrides}\n * and {@code inputOverrides} let the caller substitute data before the\n * JSONata mapping runs.\n */\nexport interface PreviewBlobRequest {\n taskId: string;\n documentId: string;\n processDefinitionKey?: string | null;\n sourceActivityId?: string | null;\n processInstanceId?: 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 * @param taskId Operaton user task id (required — backend authorizes via OperatonTask:VIEW)\n */\n getRetryForm(\n taskId: string,\n processInstanceId: string,\n documentId?: string,\n sourceActivityId?: string,\n ): Observable<any> {\n const params: Record<string, string> = { taskId, processInstanceId };\n if (documentId) {\n params['documentId'] = documentId;\n }\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","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\n/**\n * Holds the currently-open Operaton user task instance id so that custom\n * Formio components rendered inside a Valtimo task form (preview, download,\n * retry-form) can include it in backend requests for PBAC.\n *\n * Populated by {@link EpistolaTaskContextInterceptor}, which sniffs Valtimo's\n * canonical \"load process link for task\" GET (`/api/v2/process-link/task/{taskId}`)\n * — the request always fires when a task opens, before the form renders.\n *\n * <p><b>Why this exists:</b> Valtimo 13.21 does not expose the active task\n * instance id through any service that custom Formio components can inject\n * (`FormIoStateService` carries documentId and processInstanceId only;\n * `TaskDetailContentComponent.taskInstanceId$` is private to that component\n * and Formio elements live in their own injector tree). This service is a\n * workaround until upstream exposes `taskInstanceId` via `FormIoStateService`.\n */\n@Injectable({ providedIn: 'root' })\nexport class EpistolaTaskContextService {\n private readonly _taskInstanceId$ = new BehaviorSubject<string | null>(null);\n\n readonly taskInstanceId$: Observable<string | null> = this._taskInstanceId$.asObservable();\n\n get taskInstanceId(): string | null {\n return this._taskInstanceId$.value;\n }\n\n setTaskInstanceId(id: string | null): void {\n this._taskInstanceId$.next(id);\n }\n}\n","/**\n * Pure helpers for {@link EpistolaTaskContextInterceptor}, extracted so they\n * can be unit-tested without pulling in {@code @angular/core} (which ts-jest\n * cannot transform without {@code jest-preset-angular}).\n */\n\n/**\n * Pattern Valtimo uses for the canonical task-open call:\n * {@code GET /api/v2/process-link/task/{taskInstanceId}}.\n *\n * Captures the {@code taskInstanceId} (UUID v4-style 36-character hyphenated\n * hex string). Anchored at the end of the URL or at a query-string delimiter\n * so we don't accidentally match a longer trailing segment.\n */\nexport const TASK_PROCESS_LINK_PATTERN =\n /\\/api\\/v2\\/process-link\\/task\\/([0-9a-fA-F-]{36})(?:\\?|$)/;\n\n/**\n * Returns the captured {@code taskInstanceId} from a Valtimo task-open\n * request URL, or {@code null} if the request does not match.\n */\nexport function extractTaskInstanceIdFromUrl(method: string, url: string): string | null {\n if (method !== 'GET') return null;\n const match = TASK_PROCESS_LINK_PATTERN.exec(url);\n return match ? match[1] : null;\n}\n","import { Injectable } from '@angular/core';\nimport { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { EpistolaTaskContextService } from './epistola-task-context.service';\nimport { extractTaskInstanceIdFromUrl } from './epistola-task-context.matcher';\n\n/**\n * Sniffs Valtimo's task-open signal and pushes the active taskInstanceId into\n * {@link EpistolaTaskContextService}. The signal is the canonical\n * {@code GET /api/v2/process-link/task/{taskId}} call that\n * {@code TaskDetailContentComponent.loadTaskDetails(...)} fires unconditionally\n * before any task form is rendered (see @valtimo/task internals).\n *\n * <p>This interceptor does <b>not</b> modify the outgoing request. It only\n * captures the taskId from the URL.\n *\n * <p>Workaround for Valtimo 13.21 not exposing taskInstanceId through any\n * injectable service. Remove once upstream adds e.g.\n * {@code FormIoStateService.setTaskInstanceId(...)}.\n *\n * <p>The actual URL-matching logic lives in\n * {@link extractTaskInstanceIdFromUrl} so it can be unit-tested without an\n * Angular harness.\n */\n@Injectable()\nexport class EpistolaTaskContextInterceptor implements HttpInterceptor {\n constructor(private readonly taskContext: EpistolaTaskContextService) {}\n\n intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n const taskId = extractTaskInstanceIdFromUrl(request.method, request.url);\n if (taskId !== null && taskId !== this.taskContext.taskInstanceId) {\n this.taskContext.setTaskInstanceId(taskId);\n }\n return next.handle(request);\n }\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\">&#x2713;</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 ? '&#x25B6;' : '&#x25BC;'\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 &#x25B6;\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\">&#x26A0;</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 * 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 { FormModule, FormOutput, InputModule, SelectItem, SelectModule } 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 readonly selectedVariantId$ = new BehaviorSubject<string>('');\n\n variantSelectionMode: VariantSelectionMode = 'explicit';\n variantIdExpressionMode = false;\n variantIdExpression = '';\n filenameExpressionMode = false;\n filenameExpression = '';\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 requiredFieldsStatus: { mapped: number; total: number } = { mapped: 0, total: 0 };\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 if (formValue.catalogId && formValue.catalogId !== this.selectedCatalogId$.getValue()) {\n this.selectedCatalogId$.next(formValue.catalogId);\n this.selectedTemplateId$.next('');\n this.selectedVariantId$.next('');\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.selectedVariantId$.next('');\n }\n\n if (formValue.variantId && formValue.variantId !== this.selectedVariantId$.getValue()) {\n this.selectedVariantId$.next(formValue.variantId);\n }\n\n this.handleValid(formValue);\n }\n\n onDataMappingChange(expression: string): void {\n this.dataMapping$.next(expression);\n const currentFormValue = this.formValue$.getValue();\n if (currentFormValue) {\n this.handleValid(currentFormValue);\n }\n }\n\n onRequiredFieldsStatusChange(status: { mapped: number; total: number }): void {\n this.requiredFieldsStatus = status;\n const currentFormValue = this.formValue$.getValue();\n if (currentFormValue) {\n this.handleValid(currentFormValue);\n }\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.selectedVariantId$.next(config.variantId);\n }\n }\n\n // Detect expression mode for filename\n if (config.filename && isExpression(config.filename)) {\n this.filenameExpressionMode = true;\n this.filenameExpression = config.filename;\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 baseComplete = !!(\n this.selectedCatalogId$.getValue() &&\n formValue?.templateId &&\n formValue?.outputFormat &&\n formValue?.filename &&\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 requiredFieldsMapped =\n this.requiredFieldsStatus.total === 0 ||\n this.requiredFieldsStatus.mapped === this.requiredFieldsStatus.total;\n\n const valid = baseComplete && variantValid && requiredFieldsMapped;\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 : formValue.filename!,\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 : formValue.variantId!;\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 [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 <div *ngIf=\"variantSelectionMode === 'explicit'\" class=\"field-with-fx\">\n <v-select\n *ngIf=\"!variantIdExpressionMode\"\n name=\"variantId\"\n [title]=\"'variantId' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'variantIdTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [items]=\"obs.variants.data\"\n [defaultSelectionId]=\"obs.prefill?.variantId\"\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)=\"variantIdExpressionMode = !variantIdExpressionMode\"\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 &times;\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 &times;\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 name=\"filename\"\n [title]=\"'filename' | pluginTranslate: pluginId | async\"\n [tooltip]=\"'filenameTooltip' | pluginTranslate: pluginId | async\"\n [margin]=\"true\"\n [defaultValue]=\"obs.prefill?.filename\"\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)=\"filenameExpressionMode = !filenameExpressionMode\"\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 ? '&#x25B6;' : '&#x25BC;' }}</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 { 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 { DownloadDocumentConfig } from '../../models';\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],\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 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.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 this.formValue$.next(formValue);\n this.handleValid(formValue);\n }\n\n private handleValid(formValue: DownloadDocumentConfig): void {\n const valid = !!(formValue?.documentVariable && formValue?.contentVariable);\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-input\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 OnDestroy,\n OnInit,\n Output,\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 {\n DownloadDocumentRequest,\n EpistolaPluginService,\n EpistolaTaskContextService,\n} 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>, OnInit, 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 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 taskContext: EpistolaTaskContextService,\n private readonly cdr: ChangeDetectorRef,\n ) {}\n\n ngOnInit(): void {\n if (this.designMode) {\n return;\n }\n if (this.display !== 'button') {\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.taskContext.taskInstanceId;\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, FormIoStateService } from '@valtimo/components';\nimport { FormioModule } from '@formio/angular';\nimport { Subject, Subscription } from 'rxjs';\nimport { debounceTime, switchMap } from 'rxjs/operators';\nimport { EpistolaPluginService, EpistolaTaskContextService } 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 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 private processDefinitionKey?: 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 formIoStateService: FormIoStateService,\n private readonly cdr: ChangeDetectorRef,\n private readonly sanitizer: DomSanitizer,\n private readonly taskContext: EpistolaTaskContextService,\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 }\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 const documentId = this.formIoStateService.documentId;\n const processInstanceId = this.formIoStateService.processInstanceId;\n if (!documentId || !processInstanceId) return;\n\n const taskId = this.taskContext.taskInstanceId;\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 documentId,\n processInstanceId,\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 const processInstanceId = this.formIoStateService.processInstanceId;\n const documentId = this.formIoStateService.documentId;\n if (!processInstanceId) {\n this.error = 'Could not determine process instance ID.';\n this.loading = false;\n this.cdr.markForCheck();\n return;\n }\n\n const taskId = this.taskContext.taskInstanceId;\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, processInstanceId, documentId ?? undefined, 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, EpistolaTaskContextService } from '../../services';\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 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 private readonly taskContext: EpistolaTaskContextService,\n ) {}\n\n /**\n * Resolve the active task id from {@link EpistolaTaskContextService}, populated\n * by {@code EpistolaTaskContextInterceptor} on the canonical Valtimo task-open\n * call. Returns null when used outside a task context (e.g. Formio builder).\n */\n private get currentTaskId(): string | null {\n return this.taskContext.taskInstanceId;\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.loadPreview();\n return;\n }\n\n // React to value changes (input overrides from the Formio wrapper).\n if (changes['value']) {\n this.loadPreview();\n }\n }\n\n ngOnDestroy(): void {\n this.previewSubscription?.unsubscribe();\n this.revokeBlobUrl();\n }\n\n refresh(): void {\n this.loadPreview();\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 const documentId = this.formIoStateService.documentId;\n if (!documentId) {\n this.error = 'Could not determine document ID from context.';\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 const processInstanceId = this.formIoStateService.processInstanceId;\n if (!processInstanceId) {\n this.error = 'Preview is only available from within a running process.';\n this.cdr.markForCheck();\n return;\n }\n\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 documentId,\n processDefinitionKey: this.processDefinitionKey || null,\n processInstanceId,\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 BpmnValidationViolation,\n CatalogRedeployResult,\n ChangelogRelease,\n ClasspathCatalog,\n ConnectionStatus,\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 overviewTab: 'configurations' | 'validations' | 'changelog' = 'configurations';\n loading = false;\n pluginVersion: string | null = null;\n changelog: ChangelogRelease[] | null = null;\n changelogLoading = false;\n validationViolations: BpmnValidationViolation[] = [];\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 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 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 setOverviewTab(tab: 'configurations' | 'validations' | 'changelog'): void {\n this.overviewTab = tab;\n if (tab === 'changelog' && this.changelog === null && !this.changelogLoading) {\n this.loadChangelog();\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 violations are independent of cards — load alongside but don't\n // gate the loading flag on them.\n this.adminService.getValidationViolations().subscribe({\n next: (violations) => {\n this.validationViolations = violations;\n },\n error: () => {\n this.validationViolations = [];\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 <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 *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 </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 &larr; {{ '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 &#x2913;\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';\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};\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","import { Injector } from '@angular/core';\nimport { FormioCustomComponentInfo, registerCustomFormioComponent } from '@valtimo/components';\nimport { EpistolaRetryFormComponent } from './epistola-retry-form.component';\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};\n\nexport function registerEpistolaRetryFormComponent(injector: Injector): void {\n if (!customElements.get(EPISTOLA_RETRY_FORM_OPTIONS.selector)) {\n registerCustomFormioComponent(\n EPISTOLA_RETRY_FORM_OPTIONS,\n EpistolaRetryFormComponent,\n injector,\n );\n }\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';\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 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\n attach(element: HTMLElement) {\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 }\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.root.on('change', () => {\n this._computeAndSetOverrides();\n });\n // Compute initial value\n this._computeAndSetOverrides();\n }\n\n return result;\n }\n\n private _computeAndSetOverrides() {\n if (this._debounceTimer) {\n clearTimeout(this._debounceTimer);\n }\n this._debounceTimer = setTimeout(() => {\n const mapping = this.component?.overrideMapping;\n const formData = this.root?.data;\n if (mapping && formData) {\n const overrides = computeInputOverrides(mapping, formData);\n if (Object.keys(overrides).length > 0) {\n this.setValue(overrides);\n }\n }\n }, 1500);\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';\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","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';\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 = entries.filter((e) => e.actionKey === 'generate-document');\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';\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 }\n}\n","import {\n ENVIRONMENT_INITIALIZER,\n inject,\n Injector,\n ModuleWithProviders,\n NgModule,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HTTP_INTERCEPTORS, 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 {\n EpistolaPluginService,\n EpistolaAdminService,\n EpistolaMenuService,\n EpistolaTaskContextInterceptor,\n} 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: HTTP_INTERCEPTORS,\n useClass: EpistolaTaskContextInterceptor,\n multi: true,\n },\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 contentVariable: 'Inhoud Variabele',\n contentVariableTooltip:\n 'Naam van de procesvariabele waarin de documentinhoud (Base64) wordt opgeslagen',\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 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 },\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 contentVariable: 'Content Variable',\n contentVariableTooltip:\n 'Name of the process variable to store the document content (Base64) in',\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 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 },\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","i1.EpistolaTaskContextService","i2","jsonata","i1.EpistolaPluginService","i3","i4","FORM_REF_PREFIX","take","takeUntil","i5","i6","debounceTime","i1.EpistolaAdminService"],"mappings":"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"}