@masterteam/forms 0.0.69 → 0.0.70

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.
@@ -267,6 +267,7 @@ function mapPreviewFieldsToEntities(config, values, mode = 'create', readonly =
267
267
  function mapPreviewSectionsToEntities(config, values, lang = 'en', mode = 'create', readonly = false) {
268
268
  const fieldMap = buildFieldValueMap(config);
269
269
  const previewValueByKey = new Map();
270
+ const comparisonByKey = new Map();
270
271
  for (const value of values) {
271
272
  if (value.metadata?.source === 'ProcessVirtual')
272
273
  continue;
@@ -274,6 +275,9 @@ function mapPreviewSectionsToEntities(config, values, lang = 'en', mode = 'creat
274
275
  if (!targetFieldKey)
275
276
  continue;
276
277
  previewValueByKey.set(targetFieldKey, value.value);
278
+ if (value.comparison) {
279
+ comparisonByKey.set(targetFieldKey, value.comparison);
280
+ }
277
281
  }
278
282
  return config.sections
279
283
  .slice()
@@ -298,6 +302,7 @@ function mapPreviewSectionsToEntities(config, values, lang = 'en', mode = 'creat
298
302
  size: WIDTH_TO_ENTITY_SIZE[field.width] ?? 24,
299
303
  labelPosition: 'top',
300
304
  },
305
+ comparison: comparisonByKey.get(field.propertyKey),
301
306
  };
302
307
  }),
303
308
  }))
@@ -1142,9 +1147,12 @@ class ClientForm {
1142
1147
  this.submitSub?.unsubscribe();
1143
1148
  this.state.submitting.set(true);
1144
1149
  this.state.submitError.set(null);
1145
- const request = this.buildSubmitRequest(loadResponse);
1150
+ const submitRequest = this.buildSubmitRequest(loadResponse);
1151
+ const validationRequest = this.buildSubmitRequest(loadResponse, {
1152
+ IsSteps: this.resolveValidateIsSteps(false),
1153
+ });
1146
1154
  this.submitValidationMessages.set([]);
1147
- this.submitSub = this.api.validate(request).subscribe({
1155
+ this.submitSub = this.api.validate(validationRequest).subscribe({
1148
1156
  next: (validationResponse) => {
1149
1157
  const validation = validationResponse.data;
1150
1158
  if (!validation) {
@@ -1165,11 +1173,11 @@ class ClientForm {
1165
1173
  this.confirmValidationWarnings(warnings, 'clientForm.warning-confirmation-question', this.translocoService.translate('clientForm.continue-submit'), () => {
1166
1174
  this.state.submitting.set(true);
1167
1175
  this.submitValidationMessages.set([]);
1168
- this.executeSubmit(request);
1176
+ this.executeSubmit(submitRequest);
1169
1177
  });
1170
1178
  return;
1171
1179
  }
1172
- this.executeSubmit(request);
1180
+ this.executeSubmit(submitRequest);
1173
1181
  },
1174
1182
  error: (err) => {
1175
1183
  this.state.submitting.set(false);
@@ -1313,7 +1321,7 @@ class ClientForm {
1313
1321
  req.preview = preview;
1314
1322
  return req;
1315
1323
  }
1316
- buildSubmitRequest(loadResponse) {
1324
+ buildSubmitRequest(loadResponse, options) {
1317
1325
  const context = this.state.context();
1318
1326
  const formValue = this.getFormValue();
1319
1327
  const fields = mapFormValueToSubmitFields(formValue, loadResponse);
@@ -1346,6 +1354,8 @@ class ClientForm {
1346
1354
  req.requestSchemaId = requestSchemaId;
1347
1355
  if (returnUrl)
1348
1356
  req.returnUrl = returnUrl;
1357
+ if (options?.IsSteps != null)
1358
+ req.IsSteps = options.IsSteps;
1349
1359
  const submitRequestMapper = this.submitRequestMapper();
1350
1360
  if (!submitRequestMapper) {
1351
1361
  return req;
@@ -1373,7 +1383,9 @@ class ClientForm {
1373
1383
  this.stepValidationPending.set(true);
1374
1384
  this.state.submitError.set(null);
1375
1385
  this.submitValidationMessages.set([]);
1376
- const request = this.buildSubmitRequest(loadResponse);
1386
+ const request = this.buildSubmitRequest(loadResponse, {
1387
+ IsSteps: this.resolveValidateIsSteps(true),
1388
+ });
1377
1389
  this.submitSub = this.api.validate(request).subscribe({
1378
1390
  next: (validationResponse) => {
1379
1391
  this.stepValidationPending.set(false);
@@ -1417,6 +1429,12 @@ class ClientForm {
1417
1429
  requiresForwardStepValidation(targetStep, currentStep) {
1418
1430
  return (targetStep > currentStep && (this.stepsEnabled() || this.wizardEnabled()));
1419
1431
  }
1432
+ resolveValidateIsSteps(isIntermediateStepValidation) {
1433
+ if (!(this.stepsEnabled() || this.wizardEnabled())) {
1434
+ return undefined;
1435
+ }
1436
+ return isIntermediateStepValidation;
1437
+ }
1420
1438
  hasLocalBlockingValidationIssues() {
1421
1439
  return (this.formControl.invalid ||
1422
1440
  this.formRuntimeMessages().some((msg) => msg.severity === 'error'));
@@ -1529,7 +1547,7 @@ class ClientForm {
1529
1547
  return 'upcoming';
1530
1548
  }
1531
1549
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: ClientForm, deps: [], target: i0.ɵɵFactoryTarget.Component });
1532
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: ClientForm, isStandalone: true, selector: "mt-client-form", inputs: { moduleKey: { classPropertyName: "moduleKey", publicName: "moduleKey", isSignal: true, isRequired: true, transformFunction: null }, operationKey: { classPropertyName: "operationKey", publicName: "operationKey", isSignal: true, isRequired: true, transformFunction: null }, moduleId: { classPropertyName: "moduleId", publicName: "moduleId", isSignal: true, isRequired: false, transformFunction: null }, levelId: { classPropertyName: "levelId", publicName: "levelId", isSignal: true, isRequired: false, transformFunction: null }, levelDataId: { classPropertyName: "levelDataId", publicName: "levelDataId", isSignal: true, isRequired: false, transformFunction: null }, moduleDataId: { classPropertyName: "moduleDataId", publicName: "moduleDataId", isSignal: true, isRequired: false, transformFunction: null }, requestSchemaId: { classPropertyName: "requestSchemaId", publicName: "requestSchemaId", isSignal: true, isRequired: false, transformFunction: null }, draftProcessId: { classPropertyName: "draftProcessId", publicName: "draftProcessId", isSignal: true, isRequired: false, transformFunction: null }, preview: { classPropertyName: "preview", publicName: "preview", isSignal: true, isRequired: false, transformFunction: null }, returnUrl: { classPropertyName: "returnUrl", publicName: "returnUrl", isSignal: true, isRequired: false, transformFunction: null }, defaultValues: { classPropertyName: "defaultValues", publicName: "defaultValues", isSignal: true, isRequired: false, transformFunction: null }, submitRequestMapper: { classPropertyName: "submitRequestMapper", publicName: "submitRequestMapper", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, autoLoad: { classPropertyName: "autoLoad", publicName: "autoLoad", isSignal: true, isRequired: false, transformFunction: null }, formMode: { classPropertyName: "formMode", publicName: "formMode", isSignal: true, isRequired: false, transformFunction: null }, renderMode: { classPropertyName: "renderMode", publicName: "renderMode", isSignal: true, isRequired: false, transformFunction: null }, showInternalStepActions: { classPropertyName: "showInternalStepActions", publicName: "showInternalStepActions", isSignal: true, isRequired: false, transformFunction: null }, confirmWarningsOnSubmit: { classPropertyName: "confirmWarningsOnSubmit", publicName: "confirmWarningsOnSubmit", isSignal: true, isRequired: false, transformFunction: null }, confirmWarningsOnStepChange: { classPropertyName: "confirmWarningsOnStepChange", publicName: "confirmWarningsOnStepChange", isSignal: true, isRequired: false, transformFunction: null }, lookups: { classPropertyName: "lookups", publicName: "lookups", isSignal: true, isRequired: false, transformFunction: null }, ignoredFieldKeys: { classPropertyName: "ignoredFieldKeys", publicName: "ignoredFieldKeys", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { loaded: "loaded", submitted: "submitted", errored: "errored", modeDetected: "modeDetected", formSourceDetected: "formSourceDetected", footerStateChanged: "footerStateChanged" }, providers: [ClientFormStateService], viewQueries: [{ propertyName: "validationSummary", first: true, predicate: ["validationSummary"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Client Form Template - render only; step navigation buttons are optional -->\r\n\r\n<!-- Loading State -->\r\n@if (state.loading()) {\r\n <div class=\"flex flex-col gap-6\">\r\n <!-- Section header skeleton -->\r\n <div class=\"flex flex-col gap-4\">\r\n <p-skeleton width=\"30%\" height=\"1.5rem\" />\r\n <div class=\"grid grid-cols-12 gap-4\">\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"40%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"40%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-12 flex flex-col gap-2\">\r\n <p-skeleton width=\"25%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"35%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"45%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Second section skeleton -->\r\n <div class=\"flex flex-col gap-4\">\r\n <p-skeleton width=\"25%\" height=\"1.5rem\" />\r\n <div class=\"grid grid-cols-12 gap-4\">\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"35%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"50%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-12 flex flex-col gap-2\">\r\n <p-skeleton width=\"30%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"5rem\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n}\r\n\r\n<!-- Loaded State -->\r\n@if (state.isLoaded() && !state.loading()) {\r\n <div class=\"flex flex-col gap-4\" *transloco=\"let t; prefix: 'clientForm'\">\r\n @if (previewEntitySections().length > 0) {\r\n <div class=\"flex flex-col gap-3\">\r\n @for (section of previewEntitySections(); track section.key) {\r\n <mt-card [title]=\"section.label\">\r\n <mt-entities-preview [entities]=\"section.entities\" />\r\n </mt-card>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Dynamic Form -->\r\n @if (state.requiresForm() && editableFormConfig(); as config) {\r\n @if (hasEditableFormSections()) {\r\n @if (wizardEnabled()) {\r\n <!-- Wizard Mode: vertical stepper left + form right -->\r\n <div class=\"flex gap-0 min-h-0\">\r\n <!-- Vertical Stepper -->\r\n <div class=\"w-[30%] shrink-0 flex flex-col py-4 px-6\">\r\n @for (\r\n step of stepTimeline();\r\n track step.key;\r\n let first = $first;\r\n let last = $last\r\n ) {\r\n @if (!first) {\r\n <div\r\n class=\"ms-6 w-0.5 h-5 shrink-0\"\r\n [ngClass]=\"\r\n step.beforeLineActive ? 'bg-primary' : 'bg-surface-300'\r\n \"\r\n ></div>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"flex items-center cursor-pointer gap-3 text-left focus-visible:outline-none\"\r\n [attr.aria-pressed]=\"step.selected\"\r\n [attr.aria-current]=\"step.state === 'current' ? 'step' : null\"\r\n [disabled]=\"stepNavigationValidating()\"\r\n (click)=\"onStepChange(step.value)\"\r\n >\r\n <span\r\n class=\"flex h-12 w-12 shrink-0 items-center justify-center rounded text-base font-semibold transition-all duration-200\"\r\n [class]=\"\r\n step.state === 'current'\r\n ? 'ring-2 ring-primary/20 bg-primary text-white '\r\n : step.state === 'completed'\r\n ? 'text-primary bg-primary-100 '\r\n : step.state === 'upcoming'\r\n ? 'bg-primary-100 text-white'\r\n : ''\r\n \"\r\n >\r\n @if (step.state === \"completed\") {\r\n <mt-icon icon=\"general.check\" class=\"text-xl\" />\r\n } @else {\r\n {{ step.value }}\r\n }\r\n </span>\r\n <span\r\n class=\"text-sm leading-5 truncate transition-colors duration-200\"\r\n [ngClass]=\"{\r\n 'font-semibold text-primary': step.state === 'current',\r\n 'font-medium text-surface-700':\r\n step.state === 'completed',\r\n 'font-medium text-surface-400': step.state === 'upcoming',\r\n }\"\r\n dir=\"auto\"\r\n >\r\n {{ step.label }}\r\n </span>\r\n </button>\r\n @if (!last) {\r\n <div\r\n class=\"ms-6 w-0.5 h-5 shrink-0\"\r\n [ngClass]=\"\r\n step.afterLineActive ? 'bg-primary' : 'bg-surface-300'\r\n \"\r\n ></div>\r\n }\r\n }\r\n </div>\r\n <!-- Form Content + Buttons -->\r\n <div class=\"flex-1 flex flex-col gap-4 min-w-0 ps-6\">\r\n @if (runtimeErrors().length > 0 || runtimeWarnings().length > 0) {\r\n <div #validationSummary class=\"flex flex-col gap-3 scroll-mt-4\">\r\n @if (runtimeErrors().length > 0) {\r\n <section class=\"flex flex-col gap-2\">\r\n <p\r\n class=\"m-0 text-xs font-semibold uppercase tracking-[0.18em] text-slate-500\"\r\n >\r\n {{ t(\"validation-errors\") }}\r\n </p>\r\n @for (\r\n msg of runtimeErrors();\r\n track msg.ruleId || msg.fieldKey || msg.message\r\n ) {\r\n <p-message\r\n severity=\"error\"\r\n styleClass=\"w-full\"\r\n [text]=\"msg.message\"\r\n />\r\n }\r\n </section>\r\n }\r\n\r\n @if (runtimeWarnings().length > 0) {\r\n <section class=\"flex flex-col gap-2\">\r\n <p\r\n class=\"m-0 text-xs font-semibold uppercase tracking-[0.18em] text-slate-500\"\r\n >\r\n {{ t(\"validation-warnings\") }}\r\n </p>\r\n @for (\r\n msg of runtimeWarnings();\r\n track msg.ruleId || msg.fieldKey || msg.message\r\n ) {\r\n <p-message\r\n severity=\"warn\"\r\n styleClass=\"w-full\"\r\n [text]=\"msg.message\"\r\n />\r\n }\r\n </section>\r\n }\r\n </div>\r\n }\r\n <mt-dynamic-form\r\n [formConfig]=\"wizardFormConfig() ?? config\"\r\n [formControl]=\"formControl\"\r\n [visibleSectionKeys]=\"visibleSectionKeys()\"\r\n [forcedHiddenFieldKeys]=\"effectiveForcedHiddenFieldKeys()\"\r\n [preserveForcedHiddenValues]=\"true\"\r\n (runtimeMessagesChange)=\"onRuntimeMessagesChange($event)\"\r\n />\r\n @if (showInternalStepActions()) {\r\n <div class=\"flex justify-end gap-2 pt-4 mt-auto\">\r\n <mt-button\r\n [label]=\"'previous' | transloco\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n [disabled]=\"\r\n currentStep() === 1 || stepNavigationValidating()\r\n \"\r\n (onClick)=\"goToPreviousStep()\"\r\n />\r\n <mt-button\r\n [label]=\"'next' | transloco\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\r\n [disabled]=\"\r\n currentStep() === stepSections().length ||\r\n stepNavigationValidating()\r\n \"\r\n [loading]=\"stepNavigationValidating()\"\r\n (onClick)=\"goToNextStep()\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"flex flex-col gap-4\">\r\n @if (runtimeErrors().length > 0 || runtimeWarnings().length > 0) {\r\n <div #validationSummary class=\"flex flex-col gap-3 scroll-mt-4\">\r\n @if (runtimeErrors().length > 0) {\r\n <section class=\"flex flex-col gap-2\">\r\n <p\r\n class=\"m-0 text-xs font-semibold uppercase tracking-[0.18em] text-slate-500\"\r\n >\r\n {{ t(\"validation-errors\") }}\r\n </p>\r\n @for (\r\n msg of runtimeErrors();\r\n track msg.ruleId || msg.fieldKey || msg.message\r\n ) {\r\n <p-message\r\n severity=\"error\"\r\n styleClass=\"w-full\"\r\n [text]=\"msg.message\"\r\n />\r\n }\r\n </section>\r\n }\r\n\r\n @if (runtimeWarnings().length > 0) {\r\n <section class=\"flex flex-col gap-2\">\r\n <p\r\n class=\"m-0 text-xs font-semibold uppercase tracking-[0.18em] text-slate-500\"\r\n >\r\n {{ t(\"validation-warnings\") }}\r\n </p>\r\n @for (\r\n msg of runtimeWarnings();\r\n track msg.ruleId || msg.fieldKey || msg.message\r\n ) {\r\n <p-message\r\n severity=\"warn\"\r\n styleClass=\"w-full\"\r\n [text]=\"msg.message\"\r\n />\r\n }\r\n </section>\r\n }\r\n </div>\r\n }\r\n\r\n @if (stepsEnabled()) {\r\n <div class=\"flex flex-col gap-4\">\r\n <div class=\"overflow-x-auto pb-2\">\r\n <div class=\"flex min-w-[36rem] items-start\">\r\n @for (\r\n step of stepTimeline();\r\n track step.key;\r\n let first = $first;\r\n let last = $last\r\n ) {\r\n <div\r\n class=\"relative flex min-w-[8rem] flex-1 justify-center\"\r\n >\r\n @if (!rtl() && !first) {\r\n <span\r\n class=\"absolute top-5 left-0 right-1/2 h-0.5\"\r\n [ngClass]=\"\r\n step.beforeLineActive\r\n ? 'bg-primary'\r\n : 'bg-surface-300'\r\n \"\r\n ></span>\r\n }\r\n @if (!rtl() && !last) {\r\n <span\r\n class=\"absolute top-5 left-1/2 right-0 h-0.5\"\r\n [ngClass]=\"\r\n step.afterLineActive\r\n ? 'bg-primary'\r\n : 'bg-surface-300'\r\n \"\r\n ></span>\r\n }\r\n @if (rtl() && !last) {\r\n <span\r\n class=\"absolute top-5 left-0 right-1/2 h-0.5\"\r\n [ngClass]=\"\r\n step.afterLineActive\r\n ? 'bg-primary'\r\n : 'bg-surface-300'\r\n \"\r\n ></span>\r\n }\r\n @if (rtl() && !first) {\r\n <span\r\n class=\"absolute top-5 left-1/2 right-0 h-0.5\"\r\n [ngClass]=\"\r\n step.beforeLineActive\r\n ? 'bg-primary'\r\n : 'bg-surface-300'\r\n \"\r\n ></span>\r\n }\r\n\r\n <button\r\n type=\"button\"\r\n class=\"relative z-10 flex w-full flex-col items-center gap-3 px-2 text-center focus-visible:outline-none\"\r\n [attr.aria-pressed]=\"step.selected\"\r\n [attr.aria-current]=\"\r\n step.state === 'current' ? 'step' : null\r\n \"\r\n [attr.title]=\"step.label\"\r\n [disabled]=\"stepNavigationValidating()\"\r\n (click)=\"onStepChange(step.value)\"\r\n >\r\n <span\r\n class=\"flex h-10 w-10 cursor-pointer items-center justify-center rounded-full border text-sm font-semibold transition-all duration-200\"\r\n [ngClass]=\"{\r\n 'border-primary bg-primary text-surface-0 ring-4 ring-primary/10':\r\n step.state === 'completed' ||\r\n step.state === 'current',\r\n\r\n 'border-surface-300 bg-white text-surface-500':\r\n step.state === 'upcoming',\r\n }\"\r\n >\r\n {{ step.value }}\r\n </span>\r\n <span\r\n class=\"max-w-[8rem] text-center text-sm leading-5 transition-colors duration-200\"\r\n [ngClass]=\"{\r\n 'font-semibold text-primary':\r\n step.selected || step.state === 'current',\r\n 'font-medium text-surface-700':\r\n step.state === 'completed' && !step.selected,\r\n 'font-medium text-surface-500':\r\n step.state === 'upcoming',\r\n }\"\r\n dir=\"auto\"\r\n >\r\n {{ step.label }}\r\n </span>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (showInternalStepActions()) {\r\n <div class=\"flex justify-between gap-2\">\r\n <mt-button\r\n [label]=\"'previous' | transloco\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n [disabled]=\"\r\n currentStep() === 1 || stepNavigationValidating()\r\n \"\r\n (onClick)=\"goToPreviousStep()\"\r\n />\r\n <mt-button\r\n [label]=\"'next' | transloco\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\r\n [disabled]=\"\r\n currentStep() === stepSections().length ||\r\n stepNavigationValidating()\r\n \"\r\n [loading]=\"stepNavigationValidating()\"\r\n (onClick)=\"goToNextStep()\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n @if (tabsEnabled()) {\r\n <mt-tabs\r\n [active]=\"currentStep()\"\r\n (activeChange)=\"onStepChange($event)\"\r\n [options]=\"tabOptions()\"\r\n size=\"small\"\r\n fluid\r\n />\r\n }\r\n <mt-dynamic-form\r\n [formConfig]=\"config\"\r\n [formControl]=\"formControl\"\r\n [visibleSectionKeys]=\"visibleSectionKeys()\"\r\n [forcedHiddenFieldKeys]=\"effectiveForcedHiddenFieldKeys()\"\r\n [preserveForcedHiddenValues]=\"true\"\r\n (runtimeMessagesChange)=\"onRuntimeMessagesChange($event)\"\r\n />\r\n </div>\r\n }\r\n }\r\n } @else if (previewEntitySections().length === 0) {\r\n <div\r\n class=\"flex items-center justify-center p-6 rounded-lg bg-surface-50 border border-surface-200 border-dashed\"\r\n >\r\n <p class=\"text-sm text-muted-color\">\r\n No form required for this operation.\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n}\r\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: Card, selector: "mt-card", inputs: ["class", "title", "paddingless"] }, { kind: "component", type: EntitiesPreview, selector: "mt-entities-preview", inputs: ["entities", "attachmentShape"] }, { kind: "component", type: DynamicForm, selector: "mt-dynamic-form", inputs: ["formConfig", "forcedHiddenFieldKeys", "preserveForcedHiddenValues", "visibleSectionKeys"], outputs: ["runtimeMessagesChange"] }, { kind: "component", type: Tabs, selector: "mt-tabs", inputs: ["options", "optionLabel", "optionValue", "active", "mode", "size", "fluid", "disabled"], outputs: ["activeChange", "onChange"] }, { kind: "component", type: Skeleton, selector: "p-skeleton", inputs: ["styleClass", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "component", type: Icon, selector: "mt-icon", inputs: ["icon"] }, { kind: "component", type: Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant", "motionOptions"], outputs: ["onClose"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
1550
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: ClientForm, isStandalone: true, selector: "mt-client-form", inputs: { moduleKey: { classPropertyName: "moduleKey", publicName: "moduleKey", isSignal: true, isRequired: true, transformFunction: null }, operationKey: { classPropertyName: "operationKey", publicName: "operationKey", isSignal: true, isRequired: true, transformFunction: null }, moduleId: { classPropertyName: "moduleId", publicName: "moduleId", isSignal: true, isRequired: false, transformFunction: null }, levelId: { classPropertyName: "levelId", publicName: "levelId", isSignal: true, isRequired: false, transformFunction: null }, levelDataId: { classPropertyName: "levelDataId", publicName: "levelDataId", isSignal: true, isRequired: false, transformFunction: null }, moduleDataId: { classPropertyName: "moduleDataId", publicName: "moduleDataId", isSignal: true, isRequired: false, transformFunction: null }, requestSchemaId: { classPropertyName: "requestSchemaId", publicName: "requestSchemaId", isSignal: true, isRequired: false, transformFunction: null }, draftProcessId: { classPropertyName: "draftProcessId", publicName: "draftProcessId", isSignal: true, isRequired: false, transformFunction: null }, preview: { classPropertyName: "preview", publicName: "preview", isSignal: true, isRequired: false, transformFunction: null }, returnUrl: { classPropertyName: "returnUrl", publicName: "returnUrl", isSignal: true, isRequired: false, transformFunction: null }, defaultValues: { classPropertyName: "defaultValues", publicName: "defaultValues", isSignal: true, isRequired: false, transformFunction: null }, submitRequestMapper: { classPropertyName: "submitRequestMapper", publicName: "submitRequestMapper", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, autoLoad: { classPropertyName: "autoLoad", publicName: "autoLoad", isSignal: true, isRequired: false, transformFunction: null }, formMode: { classPropertyName: "formMode", publicName: "formMode", isSignal: true, isRequired: false, transformFunction: null }, renderMode: { classPropertyName: "renderMode", publicName: "renderMode", isSignal: true, isRequired: false, transformFunction: null }, showInternalStepActions: { classPropertyName: "showInternalStepActions", publicName: "showInternalStepActions", isSignal: true, isRequired: false, transformFunction: null }, confirmWarningsOnSubmit: { classPropertyName: "confirmWarningsOnSubmit", publicName: "confirmWarningsOnSubmit", isSignal: true, isRequired: false, transformFunction: null }, confirmWarningsOnStepChange: { classPropertyName: "confirmWarningsOnStepChange", publicName: "confirmWarningsOnStepChange", isSignal: true, isRequired: false, transformFunction: null }, lookups: { classPropertyName: "lookups", publicName: "lookups", isSignal: true, isRequired: false, transformFunction: null }, ignoredFieldKeys: { classPropertyName: "ignoredFieldKeys", publicName: "ignoredFieldKeys", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { loaded: "loaded", submitted: "submitted", errored: "errored", modeDetected: "modeDetected", formSourceDetected: "formSourceDetected", footerStateChanged: "footerStateChanged" }, providers: [ClientFormStateService], viewQueries: [{ propertyName: "validationSummary", first: true, predicate: ["validationSummary"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Client Form Template - render only; step navigation buttons are optional -->\r\n\r\n<!-- Loading State -->\r\n@if (state.loading()) {\r\n <div class=\"flex flex-col gap-6\">\r\n <!-- Section header skeleton -->\r\n <div class=\"flex flex-col gap-4\">\r\n <p-skeleton width=\"30%\" height=\"1.5rem\" />\r\n <div class=\"grid grid-cols-12 gap-4\">\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"40%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"40%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-12 flex flex-col gap-2\">\r\n <p-skeleton width=\"25%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"35%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"45%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Second section skeleton -->\r\n <div class=\"flex flex-col gap-4\">\r\n <p-skeleton width=\"25%\" height=\"1.5rem\" />\r\n <div class=\"grid grid-cols-12 gap-4\">\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"35%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"50%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-12 flex flex-col gap-2\">\r\n <p-skeleton width=\"30%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"5rem\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n}\r\n\r\n<!-- Loaded State -->\r\n@if (state.isLoaded() && !state.loading()) {\r\n <div class=\"flex flex-col gap-4\" *transloco=\"let t; prefix: 'clientForm'\">\r\n @if (previewEntitySections().length > 0) {\r\n <div class=\"flex flex-col gap-3\">\r\n @for (section of previewEntitySections(); track section.key) {\r\n <mt-card [title]=\"section.label\">\r\n <mt-entities-preview [entities]=\"section.entities\" />\r\n </mt-card>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Dynamic Form -->\r\n @if (state.requiresForm() && editableFormConfig(); as config) {\r\n @if (hasEditableFormSections()) {\r\n @if (wizardEnabled()) {\r\n <!-- Wizard Mode: vertical stepper left + form right -->\r\n <div class=\"flex gap-0 min-h-0\">\r\n <!-- Vertical Stepper -->\r\n <div class=\"w-[30%] shrink-0 flex flex-col py-4 px-6\">\r\n @for (\r\n step of stepTimeline();\r\n track step.key;\r\n let first = $first;\r\n let last = $last\r\n ) {\r\n @if (!first) {\r\n <div\r\n class=\"ms-6 w-0.5 h-5 shrink-0\"\r\n [ngClass]=\"\r\n step.beforeLineActive ? 'bg-primary' : 'bg-surface-300'\r\n \"\r\n ></div>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"flex items-center cursor-pointer gap-3 text-left focus-visible:outline-none\"\r\n [attr.aria-pressed]=\"step.selected\"\r\n [attr.aria-current]=\"step.state === 'current' ? 'step' : null\"\r\n [disabled]=\"stepNavigationValidating()\"\r\n (click)=\"onStepChange(step.value)\"\r\n >\r\n <span\r\n class=\"flex h-12 w-12 shrink-0 items-center justify-center rounded text-base font-semibold transition-all duration-200\"\r\n [class]=\"\r\n step.state === 'current'\r\n ? 'ring-2 ring-primary/20 bg-primary text-white '\r\n : step.state === 'completed'\r\n ? 'text-primary bg-primary-100 '\r\n : step.state === 'upcoming'\r\n ? 'bg-primary-100 text-white'\r\n : ''\r\n \"\r\n >\r\n @if (step.state === \"completed\") {\r\n <mt-icon icon=\"general.check\" class=\"text-xl\" />\r\n } @else {\r\n {{ step.value }}\r\n }\r\n </span>\r\n <span\r\n class=\"text-sm leading-5 truncate transition-colors duration-200\"\r\n [ngClass]=\"{\r\n 'font-semibold text-primary': step.state === 'current',\r\n 'font-medium text-surface-700':\r\n step.state === 'completed',\r\n 'font-medium text-surface-400': step.state === 'upcoming',\r\n }\"\r\n dir=\"auto\"\r\n >\r\n {{ step.label }}\r\n </span>\r\n </button>\r\n @if (!last) {\r\n <div\r\n class=\"ms-6 w-0.5 h-5 shrink-0\"\r\n [ngClass]=\"\r\n step.afterLineActive ? 'bg-primary' : 'bg-surface-300'\r\n \"\r\n ></div>\r\n }\r\n }\r\n </div>\r\n <!-- Form Content + Buttons -->\r\n <div class=\"flex-1 flex flex-col gap-4 min-w-0 ps-6\">\r\n @if (runtimeErrors().length > 0 || runtimeWarnings().length > 0) {\r\n <div #validationSummary class=\"flex flex-col gap-3 scroll-mt-4\">\r\n @if (runtimeErrors().length > 0) {\r\n <section class=\"flex flex-col gap-2\">\r\n <p\r\n class=\"m-0 text-xs font-semibold uppercase tracking-[0.18em] text-slate-500\"\r\n >\r\n {{ t(\"validation-errors\") }}\r\n </p>\r\n @for (\r\n msg of runtimeErrors();\r\n track msg.ruleId || msg.fieldKey || msg.message\r\n ) {\r\n <p-message\r\n severity=\"error\"\r\n styleClass=\"w-full\"\r\n [text]=\"msg.message\"\r\n />\r\n }\r\n </section>\r\n }\r\n\r\n @if (runtimeWarnings().length > 0) {\r\n <section class=\"flex flex-col gap-2\">\r\n <p\r\n class=\"m-0 text-xs font-semibold uppercase tracking-[0.18em] text-slate-500\"\r\n >\r\n {{ t(\"validation-warnings\") }}\r\n </p>\r\n @for (\r\n msg of runtimeWarnings();\r\n track msg.ruleId || msg.fieldKey || msg.message\r\n ) {\r\n <p-message\r\n severity=\"warn\"\r\n styleClass=\"w-full\"\r\n [text]=\"msg.message\"\r\n />\r\n }\r\n </section>\r\n }\r\n </div>\r\n }\r\n <mt-dynamic-form\r\n [formConfig]=\"wizardFormConfig() ?? config\"\r\n [formControl]=\"formControl\"\r\n [visibleSectionKeys]=\"visibleSectionKeys()\"\r\n [forcedHiddenFieldKeys]=\"effectiveForcedHiddenFieldKeys()\"\r\n [preserveForcedHiddenValues]=\"true\"\r\n (runtimeMessagesChange)=\"onRuntimeMessagesChange($event)\"\r\n />\r\n @if (showInternalStepActions()) {\r\n <div class=\"flex justify-end gap-2 pt-4 mt-auto\">\r\n <mt-button\r\n [label]=\"'previous' | transloco\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n [disabled]=\"\r\n currentStep() === 1 || stepNavigationValidating()\r\n \"\r\n (onClick)=\"goToPreviousStep()\"\r\n />\r\n <mt-button\r\n [label]=\"'next' | transloco\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\r\n [disabled]=\"\r\n currentStep() === stepSections().length ||\r\n stepNavigationValidating()\r\n \"\r\n [loading]=\"stepNavigationValidating()\"\r\n (onClick)=\"goToNextStep()\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"flex flex-col gap-4\">\r\n @if (runtimeErrors().length > 0 || runtimeWarnings().length > 0) {\r\n <div #validationSummary class=\"flex flex-col gap-3 scroll-mt-4\">\r\n @if (runtimeErrors().length > 0) {\r\n <section class=\"flex flex-col gap-2\">\r\n <p\r\n class=\"m-0 text-xs font-semibold uppercase tracking-[0.18em] text-slate-500\"\r\n >\r\n {{ t(\"validation-errors\") }}\r\n </p>\r\n @for (\r\n msg of runtimeErrors();\r\n track msg.ruleId || msg.fieldKey || msg.message\r\n ) {\r\n <p-message\r\n severity=\"error\"\r\n styleClass=\"w-full\"\r\n [text]=\"msg.message\"\r\n />\r\n }\r\n </section>\r\n }\r\n\r\n @if (runtimeWarnings().length > 0) {\r\n <section class=\"flex flex-col gap-2\">\r\n <p\r\n class=\"m-0 text-xs font-semibold uppercase tracking-[0.18em] text-slate-500\"\r\n >\r\n {{ t(\"validation-warnings\") }}\r\n </p>\r\n @for (\r\n msg of runtimeWarnings();\r\n track msg.ruleId || msg.fieldKey || msg.message\r\n ) {\r\n <p-message\r\n severity=\"warn\"\r\n styleClass=\"w-full\"\r\n [text]=\"msg.message\"\r\n />\r\n }\r\n </section>\r\n }\r\n </div>\r\n }\r\n\r\n @if (stepsEnabled()) {\r\n <div class=\"flex flex-col gap-4\">\r\n <div class=\"overflow-x-auto pb-2\">\r\n <div class=\"flex min-w-[36rem] items-start\">\r\n @for (\r\n step of stepTimeline();\r\n track step.key;\r\n let first = $first;\r\n let last = $last\r\n ) {\r\n <div\r\n class=\"relative flex min-w-[8rem] flex-1 justify-center\"\r\n >\r\n @if (!rtl() && !first) {\r\n <span\r\n class=\"absolute top-5 left-0 right-1/2 h-0.5\"\r\n [ngClass]=\"\r\n step.beforeLineActive\r\n ? 'bg-primary'\r\n : 'bg-surface-300'\r\n \"\r\n ></span>\r\n }\r\n @if (!rtl() && !last) {\r\n <span\r\n class=\"absolute top-5 left-1/2 right-0 h-0.5\"\r\n [ngClass]=\"\r\n step.afterLineActive\r\n ? 'bg-primary'\r\n : 'bg-surface-300'\r\n \"\r\n ></span>\r\n }\r\n @if (rtl() && !last) {\r\n <span\r\n class=\"absolute top-5 left-0 right-1/2 h-0.5\"\r\n [ngClass]=\"\r\n step.afterLineActive\r\n ? 'bg-primary'\r\n : 'bg-surface-300'\r\n \"\r\n ></span>\r\n }\r\n @if (rtl() && !first) {\r\n <span\r\n class=\"absolute top-5 left-1/2 right-0 h-0.5\"\r\n [ngClass]=\"\r\n step.beforeLineActive\r\n ? 'bg-primary'\r\n : 'bg-surface-300'\r\n \"\r\n ></span>\r\n }\r\n\r\n <button\r\n type=\"button\"\r\n class=\"relative z-10 flex w-full flex-col items-center gap-3 px-2 text-center focus-visible:outline-none\"\r\n [attr.aria-pressed]=\"step.selected\"\r\n [attr.aria-current]=\"\r\n step.state === 'current' ? 'step' : null\r\n \"\r\n [attr.title]=\"step.label\"\r\n [disabled]=\"stepNavigationValidating()\"\r\n (click)=\"onStepChange(step.value)\"\r\n >\r\n <span\r\n class=\"flex h-10 w-10 cursor-pointer items-center justify-center rounded-full border text-sm font-semibold transition-all duration-200\"\r\n [ngClass]=\"{\r\n 'border-primary bg-primary text-surface-0 ring-4 ring-primary/10':\r\n step.state === 'completed' ||\r\n step.state === 'current',\r\n\r\n 'border-surface-300 bg-white text-surface-500':\r\n step.state === 'upcoming',\r\n }\"\r\n >\r\n {{ step.value }}\r\n </span>\r\n <span\r\n class=\"max-w-[8rem] text-center text-sm leading-5 transition-colors duration-200\"\r\n [ngClass]=\"{\r\n 'font-semibold text-primary':\r\n step.selected || step.state === 'current',\r\n 'font-medium text-surface-700':\r\n step.state === 'completed' && !step.selected,\r\n 'font-medium text-surface-500':\r\n step.state === 'upcoming',\r\n }\"\r\n dir=\"auto\"\r\n >\r\n {{ step.label }}\r\n </span>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (showInternalStepActions()) {\r\n <div class=\"flex justify-between gap-2\">\r\n <mt-button\r\n [label]=\"'previous' | transloco\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n [disabled]=\"\r\n currentStep() === 1 || stepNavigationValidating()\r\n \"\r\n (onClick)=\"goToPreviousStep()\"\r\n />\r\n <mt-button\r\n [label]=\"'next' | transloco\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\r\n [disabled]=\"\r\n currentStep() === stepSections().length ||\r\n stepNavigationValidating()\r\n \"\r\n [loading]=\"stepNavigationValidating()\"\r\n (onClick)=\"goToNextStep()\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n @if (tabsEnabled()) {\r\n <mt-tabs\r\n [active]=\"currentStep()\"\r\n (activeChange)=\"onStepChange($event)\"\r\n [options]=\"tabOptions()\"\r\n size=\"small\"\r\n fluid\r\n />\r\n }\r\n <mt-dynamic-form\r\n [formConfig]=\"config\"\r\n [formControl]=\"formControl\"\r\n [visibleSectionKeys]=\"visibleSectionKeys()\"\r\n [forcedHiddenFieldKeys]=\"effectiveForcedHiddenFieldKeys()\"\r\n [preserveForcedHiddenValues]=\"true\"\r\n (runtimeMessagesChange)=\"onRuntimeMessagesChange($event)\"\r\n />\r\n </div>\r\n }\r\n }\r\n } @else if (previewEntitySections().length === 0) {\r\n <div\r\n class=\"flex items-center justify-center p-6 rounded-lg bg-surface-50 border border-surface-200 border-dashed\"\r\n >\r\n <p class=\"text-sm text-muted-color\">\r\n No form required for this operation.\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n}\r\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: Card, selector: "mt-card", inputs: ["class", "title", "paddingless"] }, { kind: "component", type: EntitiesPreview, selector: "mt-entities-preview", inputs: ["entities", "attachmentShape"] }, { kind: "component", type: DynamicForm, selector: "mt-dynamic-form", inputs: ["formConfig", "forcedHiddenFieldKeys", "preserveForcedHiddenValues", "visibleSectionKeys"], outputs: ["runtimeMessagesChange"] }, { kind: "component", type: Tabs, selector: "mt-tabs", inputs: ["options", "optionLabel", "optionValue", "active", "mode", "moreLabel", "size", "fluid", "disabled"], outputs: ["activeChange", "onChange"] }, { kind: "component", type: Skeleton, selector: "p-skeleton", inputs: ["styleClass", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "component", type: Icon, selector: "mt-icon", inputs: ["icon"] }, { kind: "component", type: Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant", "motionOptions"], outputs: ["onClose"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
1533
1551
  }
1534
1552
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: ClientForm, decorators: [{
1535
1553
  type: Component,
@@ -1549,9 +1567,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
1549
1567
  ], providers: [ClientFormStateService], template: "<!-- Client Form Template - render only; step navigation buttons are optional -->\r\n\r\n<!-- Loading State -->\r\n@if (state.loading()) {\r\n <div class=\"flex flex-col gap-6\">\r\n <!-- Section header skeleton -->\r\n <div class=\"flex flex-col gap-4\">\r\n <p-skeleton width=\"30%\" height=\"1.5rem\" />\r\n <div class=\"grid grid-cols-12 gap-4\">\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"40%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"40%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-12 flex flex-col gap-2\">\r\n <p-skeleton width=\"25%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"35%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"45%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Second section skeleton -->\r\n <div class=\"flex flex-col gap-4\">\r\n <p-skeleton width=\"25%\" height=\"1.5rem\" />\r\n <div class=\"grid grid-cols-12 gap-4\">\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"35%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"50%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-12 flex flex-col gap-2\">\r\n <p-skeleton width=\"30%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"5rem\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n}\r\n\r\n<!-- Loaded State -->\r\n@if (state.isLoaded() && !state.loading()) {\r\n <div class=\"flex flex-col gap-4\" *transloco=\"let t; prefix: 'clientForm'\">\r\n @if (previewEntitySections().length > 0) {\r\n <div class=\"flex flex-col gap-3\">\r\n @for (section of previewEntitySections(); track section.key) {\r\n <mt-card [title]=\"section.label\">\r\n <mt-entities-preview [entities]=\"section.entities\" />\r\n </mt-card>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Dynamic Form -->\r\n @if (state.requiresForm() && editableFormConfig(); as config) {\r\n @if (hasEditableFormSections()) {\r\n @if (wizardEnabled()) {\r\n <!-- Wizard Mode: vertical stepper left + form right -->\r\n <div class=\"flex gap-0 min-h-0\">\r\n <!-- Vertical Stepper -->\r\n <div class=\"w-[30%] shrink-0 flex flex-col py-4 px-6\">\r\n @for (\r\n step of stepTimeline();\r\n track step.key;\r\n let first = $first;\r\n let last = $last\r\n ) {\r\n @if (!first) {\r\n <div\r\n class=\"ms-6 w-0.5 h-5 shrink-0\"\r\n [ngClass]=\"\r\n step.beforeLineActive ? 'bg-primary' : 'bg-surface-300'\r\n \"\r\n ></div>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"flex items-center cursor-pointer gap-3 text-left focus-visible:outline-none\"\r\n [attr.aria-pressed]=\"step.selected\"\r\n [attr.aria-current]=\"step.state === 'current' ? 'step' : null\"\r\n [disabled]=\"stepNavigationValidating()\"\r\n (click)=\"onStepChange(step.value)\"\r\n >\r\n <span\r\n class=\"flex h-12 w-12 shrink-0 items-center justify-center rounded text-base font-semibold transition-all duration-200\"\r\n [class]=\"\r\n step.state === 'current'\r\n ? 'ring-2 ring-primary/20 bg-primary text-white '\r\n : step.state === 'completed'\r\n ? 'text-primary bg-primary-100 '\r\n : step.state === 'upcoming'\r\n ? 'bg-primary-100 text-white'\r\n : ''\r\n \"\r\n >\r\n @if (step.state === \"completed\") {\r\n <mt-icon icon=\"general.check\" class=\"text-xl\" />\r\n } @else {\r\n {{ step.value }}\r\n }\r\n </span>\r\n <span\r\n class=\"text-sm leading-5 truncate transition-colors duration-200\"\r\n [ngClass]=\"{\r\n 'font-semibold text-primary': step.state === 'current',\r\n 'font-medium text-surface-700':\r\n step.state === 'completed',\r\n 'font-medium text-surface-400': step.state === 'upcoming',\r\n }\"\r\n dir=\"auto\"\r\n >\r\n {{ step.label }}\r\n </span>\r\n </button>\r\n @if (!last) {\r\n <div\r\n class=\"ms-6 w-0.5 h-5 shrink-0\"\r\n [ngClass]=\"\r\n step.afterLineActive ? 'bg-primary' : 'bg-surface-300'\r\n \"\r\n ></div>\r\n }\r\n }\r\n </div>\r\n <!-- Form Content + Buttons -->\r\n <div class=\"flex-1 flex flex-col gap-4 min-w-0 ps-6\">\r\n @if (runtimeErrors().length > 0 || runtimeWarnings().length > 0) {\r\n <div #validationSummary class=\"flex flex-col gap-3 scroll-mt-4\">\r\n @if (runtimeErrors().length > 0) {\r\n <section class=\"flex flex-col gap-2\">\r\n <p\r\n class=\"m-0 text-xs font-semibold uppercase tracking-[0.18em] text-slate-500\"\r\n >\r\n {{ t(\"validation-errors\") }}\r\n </p>\r\n @for (\r\n msg of runtimeErrors();\r\n track msg.ruleId || msg.fieldKey || msg.message\r\n ) {\r\n <p-message\r\n severity=\"error\"\r\n styleClass=\"w-full\"\r\n [text]=\"msg.message\"\r\n />\r\n }\r\n </section>\r\n }\r\n\r\n @if (runtimeWarnings().length > 0) {\r\n <section class=\"flex flex-col gap-2\">\r\n <p\r\n class=\"m-0 text-xs font-semibold uppercase tracking-[0.18em] text-slate-500\"\r\n >\r\n {{ t(\"validation-warnings\") }}\r\n </p>\r\n @for (\r\n msg of runtimeWarnings();\r\n track msg.ruleId || msg.fieldKey || msg.message\r\n ) {\r\n <p-message\r\n severity=\"warn\"\r\n styleClass=\"w-full\"\r\n [text]=\"msg.message\"\r\n />\r\n }\r\n </section>\r\n }\r\n </div>\r\n }\r\n <mt-dynamic-form\r\n [formConfig]=\"wizardFormConfig() ?? config\"\r\n [formControl]=\"formControl\"\r\n [visibleSectionKeys]=\"visibleSectionKeys()\"\r\n [forcedHiddenFieldKeys]=\"effectiveForcedHiddenFieldKeys()\"\r\n [preserveForcedHiddenValues]=\"true\"\r\n (runtimeMessagesChange)=\"onRuntimeMessagesChange($event)\"\r\n />\r\n @if (showInternalStepActions()) {\r\n <div class=\"flex justify-end gap-2 pt-4 mt-auto\">\r\n <mt-button\r\n [label]=\"'previous' | transloco\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n [disabled]=\"\r\n currentStep() === 1 || stepNavigationValidating()\r\n \"\r\n (onClick)=\"goToPreviousStep()\"\r\n />\r\n <mt-button\r\n [label]=\"'next' | transloco\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\r\n [disabled]=\"\r\n currentStep() === stepSections().length ||\r\n stepNavigationValidating()\r\n \"\r\n [loading]=\"stepNavigationValidating()\"\r\n (onClick)=\"goToNextStep()\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"flex flex-col gap-4\">\r\n @if (runtimeErrors().length > 0 || runtimeWarnings().length > 0) {\r\n <div #validationSummary class=\"flex flex-col gap-3 scroll-mt-4\">\r\n @if (runtimeErrors().length > 0) {\r\n <section class=\"flex flex-col gap-2\">\r\n <p\r\n class=\"m-0 text-xs font-semibold uppercase tracking-[0.18em] text-slate-500\"\r\n >\r\n {{ t(\"validation-errors\") }}\r\n </p>\r\n @for (\r\n msg of runtimeErrors();\r\n track msg.ruleId || msg.fieldKey || msg.message\r\n ) {\r\n <p-message\r\n severity=\"error\"\r\n styleClass=\"w-full\"\r\n [text]=\"msg.message\"\r\n />\r\n }\r\n </section>\r\n }\r\n\r\n @if (runtimeWarnings().length > 0) {\r\n <section class=\"flex flex-col gap-2\">\r\n <p\r\n class=\"m-0 text-xs font-semibold uppercase tracking-[0.18em] text-slate-500\"\r\n >\r\n {{ t(\"validation-warnings\") }}\r\n </p>\r\n @for (\r\n msg of runtimeWarnings();\r\n track msg.ruleId || msg.fieldKey || msg.message\r\n ) {\r\n <p-message\r\n severity=\"warn\"\r\n styleClass=\"w-full\"\r\n [text]=\"msg.message\"\r\n />\r\n }\r\n </section>\r\n }\r\n </div>\r\n }\r\n\r\n @if (stepsEnabled()) {\r\n <div class=\"flex flex-col gap-4\">\r\n <div class=\"overflow-x-auto pb-2\">\r\n <div class=\"flex min-w-[36rem] items-start\">\r\n @for (\r\n step of stepTimeline();\r\n track step.key;\r\n let first = $first;\r\n let last = $last\r\n ) {\r\n <div\r\n class=\"relative flex min-w-[8rem] flex-1 justify-center\"\r\n >\r\n @if (!rtl() && !first) {\r\n <span\r\n class=\"absolute top-5 left-0 right-1/2 h-0.5\"\r\n [ngClass]=\"\r\n step.beforeLineActive\r\n ? 'bg-primary'\r\n : 'bg-surface-300'\r\n \"\r\n ></span>\r\n }\r\n @if (!rtl() && !last) {\r\n <span\r\n class=\"absolute top-5 left-1/2 right-0 h-0.5\"\r\n [ngClass]=\"\r\n step.afterLineActive\r\n ? 'bg-primary'\r\n : 'bg-surface-300'\r\n \"\r\n ></span>\r\n }\r\n @if (rtl() && !last) {\r\n <span\r\n class=\"absolute top-5 left-0 right-1/2 h-0.5\"\r\n [ngClass]=\"\r\n step.afterLineActive\r\n ? 'bg-primary'\r\n : 'bg-surface-300'\r\n \"\r\n ></span>\r\n }\r\n @if (rtl() && !first) {\r\n <span\r\n class=\"absolute top-5 left-1/2 right-0 h-0.5\"\r\n [ngClass]=\"\r\n step.beforeLineActive\r\n ? 'bg-primary'\r\n : 'bg-surface-300'\r\n \"\r\n ></span>\r\n }\r\n\r\n <button\r\n type=\"button\"\r\n class=\"relative z-10 flex w-full flex-col items-center gap-3 px-2 text-center focus-visible:outline-none\"\r\n [attr.aria-pressed]=\"step.selected\"\r\n [attr.aria-current]=\"\r\n step.state === 'current' ? 'step' : null\r\n \"\r\n [attr.title]=\"step.label\"\r\n [disabled]=\"stepNavigationValidating()\"\r\n (click)=\"onStepChange(step.value)\"\r\n >\r\n <span\r\n class=\"flex h-10 w-10 cursor-pointer items-center justify-center rounded-full border text-sm font-semibold transition-all duration-200\"\r\n [ngClass]=\"{\r\n 'border-primary bg-primary text-surface-0 ring-4 ring-primary/10':\r\n step.state === 'completed' ||\r\n step.state === 'current',\r\n\r\n 'border-surface-300 bg-white text-surface-500':\r\n step.state === 'upcoming',\r\n }\"\r\n >\r\n {{ step.value }}\r\n </span>\r\n <span\r\n class=\"max-w-[8rem] text-center text-sm leading-5 transition-colors duration-200\"\r\n [ngClass]=\"{\r\n 'font-semibold text-primary':\r\n step.selected || step.state === 'current',\r\n 'font-medium text-surface-700':\r\n step.state === 'completed' && !step.selected,\r\n 'font-medium text-surface-500':\r\n step.state === 'upcoming',\r\n }\"\r\n dir=\"auto\"\r\n >\r\n {{ step.label }}\r\n </span>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (showInternalStepActions()) {\r\n <div class=\"flex justify-between gap-2\">\r\n <mt-button\r\n [label]=\"'previous' | transloco\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n [disabled]=\"\r\n currentStep() === 1 || stepNavigationValidating()\r\n \"\r\n (onClick)=\"goToPreviousStep()\"\r\n />\r\n <mt-button\r\n [label]=\"'next' | transloco\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\r\n [disabled]=\"\r\n currentStep() === stepSections().length ||\r\n stepNavigationValidating()\r\n \"\r\n [loading]=\"stepNavigationValidating()\"\r\n (onClick)=\"goToNextStep()\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n @if (tabsEnabled()) {\r\n <mt-tabs\r\n [active]=\"currentStep()\"\r\n (activeChange)=\"onStepChange($event)\"\r\n [options]=\"tabOptions()\"\r\n size=\"small\"\r\n fluid\r\n />\r\n }\r\n <mt-dynamic-form\r\n [formConfig]=\"config\"\r\n [formControl]=\"formControl\"\r\n [visibleSectionKeys]=\"visibleSectionKeys()\"\r\n [forcedHiddenFieldKeys]=\"effectiveForcedHiddenFieldKeys()\"\r\n [preserveForcedHiddenValues]=\"true\"\r\n (runtimeMessagesChange)=\"onRuntimeMessagesChange($event)\"\r\n />\r\n </div>\r\n }\r\n }\r\n } @else if (previewEntitySections().length === 0) {\r\n <div\r\n class=\"flex items-center justify-center p-6 rounded-lg bg-surface-50 border border-surface-200 border-dashed\"\r\n >\r\n <p class=\"text-sm text-muted-color\">\r\n No form required for this operation.\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n}\r\n", styles: [":host{display:block}\n"] }]
1550
1568
  }], ctorParameters: () => [], propDecorators: { validationSummary: [{ type: i0.ViewChild, args: ['validationSummary', { isSignal: true }] }], moduleKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "moduleKey", required: true }] }], operationKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "operationKey", required: true }] }], moduleId: [{ type: i0.Input, args: [{ isSignal: true, alias: "moduleId", required: false }] }], levelId: [{ type: i0.Input, args: [{ isSignal: true, alias: "levelId", required: false }] }], levelDataId: [{ type: i0.Input, args: [{ isSignal: true, alias: "levelDataId", required: false }] }], moduleDataId: [{ type: i0.Input, args: [{ isSignal: true, alias: "moduleDataId", required: false }] }], requestSchemaId: [{ type: i0.Input, args: [{ isSignal: true, alias: "requestSchemaId", required: false }] }], draftProcessId: [{ type: i0.Input, args: [{ isSignal: true, alias: "draftProcessId", required: false }] }], preview: [{ type: i0.Input, args: [{ isSignal: true, alias: "preview", required: false }] }], returnUrl: [{ type: i0.Input, args: [{ isSignal: true, alias: "returnUrl", required: false }] }], defaultValues: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultValues", required: false }] }], submitRequestMapper: [{ type: i0.Input, args: [{ isSignal: true, alias: "submitRequestMapper", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], autoLoad: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoLoad", required: false }] }], formMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "formMode", required: false }] }], renderMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "renderMode", required: false }] }], showInternalStepActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "showInternalStepActions", required: false }] }], confirmWarningsOnSubmit: [{ type: i0.Input, args: [{ isSignal: true, alias: "confirmWarningsOnSubmit", required: false }] }], confirmWarningsOnStepChange: [{ type: i0.Input, args: [{ isSignal: true, alias: "confirmWarningsOnStepChange", required: false }] }], lookups: [{ type: i0.Input, args: [{ isSignal: true, alias: "lookups", required: false }] }], ignoredFieldKeys: [{ type: i0.Input, args: [{ isSignal: true, alias: "ignoredFieldKeys", required: false }] }], loaded: [{ type: i0.Output, args: ["loaded"] }], submitted: [{ type: i0.Output, args: ["submitted"] }], errored: [{ type: i0.Output, args: ["errored"] }], modeDetected: [{ type: i0.Output, args: ["modeDetected"] }], formSourceDetected: [{ type: i0.Output, args: ["formSourceDetected"] }], footerStateChanged: [{ type: i0.Output, args: ["footerStateChanged"] }] } });
1551
1569
 
1552
- // ============================================================================
1553
- // API Response Wrapper
1554
- // ============================================================================
1555
1570
  /**
1556
1571
  * Type guard to detect a FormRequired interception response from legacy commands.
1557
1572
  * Use in HTTP interceptors to redirect to process-form runtime flow.
@@ -1 +1 @@
1
- {"version":3,"file":"masterteam-forms-client-form.mjs","sources":["../../../../packages/masterteam/forms/client-form/services/client-form-api.service.ts","../../../../packages/masterteam/forms/client-form/services/client-form-state.service.ts","../../../../packages/masterteam/forms/client-form/utils/form-config-mapper.ts","../../../../packages/masterteam/forms/client-form/client-form.ts","../../../../packages/masterteam/forms/client-form/client-form.html","../../../../packages/masterteam/forms/client-form/models/client-form.model.ts","../../../../packages/masterteam/forms/client-form/public-api.ts","../../../../packages/masterteam/forms/client-form/masterteam-forms-client-form.ts"],"sourcesContent":["import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\n\r\nimport type {\r\n Response,\r\n ProcessFormLoadRequest,\r\n ProcessFormLoadResponse,\r\n ProcessFormSubmitRequest,\r\n ProcessFormSubmitResponse,\r\n ProcessFormValidationRuntimeResult,\r\n} from '../models/client-form.model';\r\n\r\nexport interface TeamMemberApiDto {\r\n userId: string;\r\n user: { displayName?: string; fullName?: string; [key: string]: any } | null;\r\n [key: string]: any;\r\n}\r\n\r\n/**\r\n * Stateless HTTP service for process-forms runtime APIs.\r\n * Root-provided — safe to share across multiple ClientForm instances.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class ClientFormApiService {\r\n private readonly http = inject(HttpClient);\r\n\r\n /**\r\n * Load form configuration and values for a given operation context.\r\n * Backend determines mode (Approval vs Direct) based on published schema.\r\n */\r\n load(\r\n request: ProcessFormLoadRequest,\r\n ): Observable<Response<ProcessFormLoadResponse>> {\r\n return this.http.post<Response<ProcessFormLoadResponse>>(\r\n 'process-form-load',\r\n request,\r\n );\r\n }\r\n\r\n /**\r\n * Submit form values. Result depends on mode:\r\n * - Approval → status: 'PendingApproval'\r\n * - Direct → status: 'Executed'\r\n */\r\n submit(\r\n request: ProcessFormSubmitRequest,\r\n ): Observable<Response<ProcessFormSubmitResponse>> {\r\n return this.http.post<Response<ProcessFormSubmitResponse>>(\r\n 'process-submit',\r\n request,\r\n );\r\n }\r\n\r\n /**\r\n * Validate the exact submit payload against backend-owned form rules\r\n * before the real submit call.\r\n */\r\n validate(\r\n request: ProcessFormSubmitRequest,\r\n ): Observable<Response<ProcessFormValidationRuntimeResult>> {\r\n return this.http.post<Response<ProcessFormValidationRuntimeResult>>(\r\n 'process-submit/validate',\r\n request,\r\n );\r\n }\r\n\r\n /**\r\n * Fetch team members for a given level data entry.\r\n * Used when a User-type property has justTeamMembers configuration enabled.\r\n */\r\n getTeamMembers(\r\n levelDataId: number | string,\r\n ): Observable<Response<TeamMemberApiDto[]>> {\r\n return this.http.get<Response<TeamMemberApiDto[]>>(\r\n `LevelData/${levelDataId}/team-members`,\r\n );\r\n }\r\n}\r\n","import { Injectable, signal, computed } from '@angular/core';\r\n\r\nimport type {\r\n ProcessFormLoadResponse,\r\n ProcessFormSubmitResponse,\r\n ProcessFormValue,\r\n ProcessFormContext,\r\n ProcessFormMode,\r\n ProcessFormSource,\r\n ClientFormConfiguration,\r\n} from '../models/client-form.model';\r\n\r\n/**\r\n * Per-instance signal-based state for ClientForm.\r\n *\r\n * NOT providedIn root — each ClientForm component provides its own instance\r\n * via `providers: [ClientFormStateService]`, enabling multiple independent\r\n * forms on the same page.\r\n */\r\n@Injectable()\r\nexport class ClientFormStateService {\r\n // ============================================================================\r\n // Core State Signals\r\n // ============================================================================\r\n\r\n readonly loading = signal(false);\r\n readonly submitting = signal(false);\r\n readonly error = signal<string | null>(null);\r\n readonly submitError = signal<string | null>(null);\r\n readonly loadResponse = signal<ProcessFormLoadResponse | null>(null);\r\n readonly submitResponse = signal<ProcessFormSubmitResponse | null>(null);\r\n\r\n // ============================================================================\r\n // Derived Computeds — Load Response\r\n // ============================================================================\r\n\r\n readonly isLoaded = computed(() => !!this.loadResponse());\r\n\r\n readonly mode = computed<ProcessFormMode | null>(\r\n () => this.loadResponse()?.mode ?? null,\r\n );\r\n\r\n readonly isApproval = computed(() => this.mode() === 'Approval');\r\n readonly isDirect = computed(() => this.mode() === 'Direct');\r\n\r\n readonly formSource = computed<ProcessFormSource | null>(\r\n () => this.loadResponse()?.formSource ?? null,\r\n );\r\n\r\n readonly requiresForm = computed(\r\n () => this.loadResponse()?.requiresForm ?? false,\r\n );\r\n\r\n readonly formConfiguration = computed<ClientFormConfiguration | null>(\r\n () => this.loadResponse()?.formConfiguration ?? null,\r\n );\r\n\r\n readonly values = computed<ProcessFormValue[]>(\r\n () => this.loadResponse()?.values ?? [],\r\n );\r\n\r\n readonly context = computed<ProcessFormContext | null>(\r\n () => this.loadResponse()?.context ?? null,\r\n );\r\n\r\n readonly stepName = computed<string | null>(\r\n () => this.loadResponse()?.stepName ?? null,\r\n );\r\n\r\n readonly requestSchemaId = computed<number | null>(\r\n () => this.loadResponse()?.requestSchemaId ?? null,\r\n );\r\n\r\n readonly requestId = computed<number | null>(\r\n () => this.loadResponse()?.requestId ?? null,\r\n );\r\n\r\n readonly stepId = computed<number | null>(\r\n () => this.loadResponse()?.stepId ?? null,\r\n );\r\n\r\n readonly stepSchemaId = computed<number | null>(\r\n () => this.loadResponse()?.stepSchemaId ?? null,\r\n );\r\n\r\n // ============================================================================\r\n // Derived Computeds — Value Categories\r\n // ============================================================================\r\n\r\n /** Process virtual fields (Request_Date, Step_Name, etc.) — read-only display */\r\n readonly virtualFields = computed<ProcessFormValue[]>(() =>\r\n this.values().filter((v) => v.metadata?.source === 'ProcessVirtual'),\r\n );\r\n\r\n /** Editable form values (non-virtual) */\r\n readonly formValues = computed<ProcessFormValue[]>(() =>\r\n this.values().filter((v) => v.metadata?.source !== 'ProcessVirtual'),\r\n );\r\n\r\n // ============================================================================\r\n // Derived Computeds — Submit Response\r\n // ============================================================================\r\n\r\n readonly isSubmitted = computed(() => !!this.submitResponse());\r\n\r\n readonly submitStatus = computed(() => this.submitResponse()?.status ?? null);\r\n\r\n readonly isPendingApproval = computed(\r\n () => this.submitStatus() === 'PendingApproval',\r\n );\r\n\r\n readonly isExecuted = computed(() => this.submitStatus() === 'Executed');\r\n\r\n // ============================================================================\r\n // State Mutations\r\n // ============================================================================\r\n\r\n setLoadResponse(response: ProcessFormLoadResponse): void {\r\n this.loadResponse.set(response);\r\n this.error.set(null);\r\n }\r\n\r\n setSubmitResponse(response: ProcessFormSubmitResponse): void {\r\n this.submitResponse.set(response);\r\n this.submitError.set(null);\r\n }\r\n\r\n setError(message: string): void {\r\n this.error.set(message);\r\n this.loading.set(false);\r\n }\r\n\r\n setSubmitError(message: string): void {\r\n this.submitError.set(message);\r\n this.submitting.set(false);\r\n }\r\n\r\n reset(): void {\r\n this.loading.set(false);\r\n this.submitting.set(false);\r\n this.error.set(null);\r\n this.submitError.set(null);\r\n this.loadResponse.set(null);\r\n this.submitResponse.set(null);\r\n }\r\n}\r\n","import type {\r\n DynamicFormConfig,\r\n DynamicFieldConfig,\r\n} from '@masterteam/components';\r\nimport type { EntityData, EntitySize } from '@masterteam/components/entities';\r\nimport {\r\n REQUEST_CONTEXT,\r\n ValidatorConfig,\r\n TextFieldConfig,\r\n EditorFieldConfig,\r\n SelectFieldConfig,\r\n MultiSelectFieldConfig,\r\n DateFieldConfig,\r\n NumberFieldConfig,\r\n SliderFieldConfig,\r\n ToggleFieldConfig,\r\n UserSearchFieldConfig,\r\n UploadFileFieldConfig,\r\n LookupMatrixFieldConfig,\r\n SchemaConnectionFieldConfig,\r\n SchedulePredecessorFieldConfig,\r\n} from '@masterteam/components';\r\nimport { HttpContext } from '@angular/common/http';\r\n\r\nimport type {\r\n ClientFormConfiguration,\r\n ClientFormField,\r\n ClientPropertyItem,\r\n ClientLookup,\r\n ProcessFormValue,\r\n ProcessFormLoadResponse,\r\n ProcessFormSubmitField,\r\n ProcessFormContext,\r\n} from '../models/client-form.model';\r\n\r\n// ============================================================================\r\n// Constants\r\n// ============================================================================\r\n\r\nconst WIDTH_TO_COLSPAN: Record<string, number> = {\r\n '25': 3,\r\n '50': 6,\r\n '100': 12,\r\n};\r\n\r\nconst WIDTH_TO_ENTITY_SIZE: Record<string, EntitySize> = {\r\n '25': 6,\r\n '50': 12,\r\n '100': 24,\r\n};\r\n\r\nexport interface ClientFormPreviewSection {\r\n key: string;\r\n label: string;\r\n order: number;\r\n entities: EntityData[];\r\n}\r\n\r\nexport interface TeamMemberOption {\r\n label: string;\r\n value: string;\r\n}\r\n\r\n// ============================================================================\r\n// Public Mapper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Convert a runtime FormConfiguration into a DynamicFormConfig\r\n * that can be passed directly to `<mt-dynamic-form>`.\r\n *\r\n * @param config The form configuration from the load API\r\n * @param lang Current UI language ('en' | 'ar')\r\n * @param mode 'create' or 'edit' — filters hidden fields accordingly\r\n * @param lookups Available lookup definitions for resolving Lookup/LookupMultiSelect options\r\n * @param teamMemberOptions Pre-fetched team member options (used when property configuration has justTeamMembers=true)\r\n */\r\nexport function mapToDynamicFormConfig(\r\n config: ClientFormConfiguration,\r\n lang: 'en' | 'ar' = 'en',\r\n mode: 'create' | 'edit' = 'create',\r\n lookups: ClientLookup[] = [],\r\n context: ProcessFormContext | null = null,\r\n readonly = false,\r\n teamMemberOptions: TeamMemberOption[] = [],\r\n): DynamicFormConfig {\r\n return {\r\n sections: config.sections\r\n .slice()\r\n .sort((a, b) => a.order - b.order)\r\n .map((section) => {\r\n const sectionName = section.name[lang] ?? section.name['en'] ?? '';\r\n\r\n const visibleFields = section.fields\r\n .filter((field) => {\r\n // isRead=false → completely hidden\r\n if (field.isWrite !== true && field.isRead === false) return false;\r\n if (mode === 'create') return !field.hiddenInCreation;\r\n return !field.hiddenInEditForm;\r\n })\r\n .sort((a, b) => a.order - b.order);\r\n\r\n return {\r\n key: section.id,\r\n label: sectionName,\r\n type: 'header' as const,\r\n columns: 12,\r\n order: section.order,\r\n fields: visibleFields.map((field) =>\r\n mapFieldToConfig(\r\n field,\r\n lang,\r\n lookups,\r\n context,\r\n readonly,\r\n teamMemberOptions,\r\n ),\r\n ),\r\n };\r\n })\r\n .filter((section) => section.fields.length > 0),\r\n };\r\n}\r\n\r\n/**\r\n * Convert API property values into a flat key-value object\r\n * suitable for `formControl.patchValue()`.\r\n *\r\n * Only includes non-virtual (editable) values.\r\n */\r\nexport function mapValuesToFormValue(\r\n values: ProcessFormValue[],\r\n config?: ClientFormConfiguration | null,\r\n): Record<string, any> {\r\n const result: Record<string, any> = {};\r\n const fieldMap = config ? buildFieldValueMap(config) : null;\r\n\r\n for (const v of values) {\r\n if (v.metadata?.source === 'ProcessVirtual') continue;\r\n\r\n const targetFieldKey =\r\n resolveValueTargetKey(v, fieldMap) ?? v.propertyKey ?? null;\r\n if (!targetFieldKey) continue;\r\n\r\n result[targetFieldKey] = resolveLoadedFieldValue(v);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Convert the current form value back into the submit payload format.\r\n *\r\n * Uses form configuration metadata (same source used to render fields)\r\n * to map `requestPropertyId` and `viewType`.\r\n */\r\nexport function mapFormValueToSubmitFields(\r\n formValue: Record<string, any>,\r\n loadResponse: ProcessFormLoadResponse,\r\n): ProcessFormSubmitField[] {\r\n const metadataByKey = new Map<\r\n string,\r\n { propertyId?: number; viewType?: string }\r\n >();\r\n\r\n for (const section of loadResponse.formConfiguration?.sections ?? []) {\r\n for (const field of section.fields ?? []) {\r\n const { propertyId, viewType } = resolveFieldMeta(field);\r\n metadataByKey.set(field.propertyKey, {\r\n propertyId,\r\n viewType,\r\n });\r\n }\r\n }\r\n\r\n return Object.entries(formValue)\r\n .filter(([propertyKey, value]) => {\r\n if (value === undefined || value === null) return false;\r\n return metadataByKey.get(propertyKey)?.viewType !== 'LookupMatrix';\r\n })\r\n .map(([propertyKey, value]) => {\r\n const meta = metadataByKey.get(propertyKey);\r\n const normalizedValue = normalizeSubmitValue(value, meta?.viewType);\r\n if (normalizedValue === undefined || normalizedValue === null) {\r\n return null;\r\n }\r\n\r\n const submitField: ProcessFormSubmitField = {\r\n propertyKey,\r\n value: normalizedValue,\r\n };\r\n\r\n if (meta?.propertyId) {\r\n submitField.requestPropertyId = meta.propertyId;\r\n }\r\n\r\n return submitField;\r\n })\r\n .filter((value): value is ProcessFormSubmitField => !!value);\r\n}\r\n\r\nexport function getPreviewOnlyFieldKeys(\r\n config: ClientFormConfiguration,\r\n mode: 'create' | 'edit' = 'create',\r\n readonly = false,\r\n): string[] {\r\n return config.sections.flatMap((section) =>\r\n (section.fields ?? [])\r\n .filter(\r\n (field) =>\r\n isFieldVisible(field, mode) && isPreviewOnlyField(field, readonly),\r\n )\r\n .map((field) => field.propertyKey),\r\n );\r\n}\r\n\r\nexport function mapPreviewFieldsToEntities(\r\n config: ClientFormConfiguration,\r\n values: ProcessFormValue[],\r\n mode: 'create' | 'edit' = 'create',\r\n readonly = false,\r\n): EntityData[] {\r\n return mapPreviewSectionsToEntities(\r\n config,\r\n values,\r\n 'en',\r\n mode,\r\n readonly,\r\n ).flatMap((section) => section.entities);\r\n}\r\n\r\nexport function mapPreviewSectionsToEntities(\r\n config: ClientFormConfiguration,\r\n values: ProcessFormValue[],\r\n lang: 'en' | 'ar' = 'en',\r\n mode: 'create' | 'edit' = 'create',\r\n readonly = false,\r\n): ClientFormPreviewSection[] {\r\n const fieldMap = buildFieldValueMap(config);\r\n const previewValueByKey = new Map<string, any>();\r\n\r\n for (const value of values) {\r\n if (value.metadata?.source === 'ProcessVirtual') continue;\r\n\r\n const targetFieldKey =\r\n resolveValueTargetKey(value, fieldMap) ?? value.propertyKey ?? null;\r\n if (!targetFieldKey) continue;\r\n\r\n previewValueByKey.set(targetFieldKey, value.value);\r\n }\r\n\r\n return config.sections\r\n .slice()\r\n .sort((a, b) => a.order - b.order)\r\n .map((section) => ({\r\n key: section.id,\r\n label: section.name[lang] ?? section.name.en ?? '',\r\n order: section.order,\r\n entities: (section.fields ?? [])\r\n .filter(\r\n (field) =>\r\n isFieldVisible(field, mode) && isPreviewOnlyField(field, readonly),\r\n )\r\n .sort((a, b) => a.order - b.order)\r\n .map((field) => {\r\n const property = field.propertyMetadata;\r\n\r\n return {\r\n ...(property as EntityData),\r\n name: (property.name as any)?.display,\r\n key: property.key ?? field.propertyKey,\r\n value: previewValueByKey.get(field.propertyKey),\r\n order: section.order * 1000 + field.order,\r\n configuration: {\r\n ...(property.configuration as Record<string, unknown>),\r\n size: WIDTH_TO_ENTITY_SIZE[field.width] ?? 24,\r\n labelPosition: 'top',\r\n },\r\n } satisfies EntityData;\r\n }),\r\n }))\r\n .filter((section) => section.entities.length > 0);\r\n}\r\n\r\n// ============================================================================\r\n// Internal Helpers\r\n// ============================================================================\r\n\r\nfunction isFieldVisible(\r\n field: ClientFormField,\r\n mode: 'create' | 'edit',\r\n): boolean {\r\n if (!isFieldReadable(field) && field.isWrite !== true) return false;\r\n if (mode === 'create') return !field.hiddenInCreation;\r\n return !field.hiddenInEditForm;\r\n}\r\n\r\nfunction isPreviewOnlyField(field: ClientFormField, readonly = false): boolean {\r\n return isFieldReadable(field) && (readonly || field.isWrite === false);\r\n}\r\n\r\nfunction isFieldReadable(field: ClientFormField): boolean {\r\n return field.isRead !== false || field.isWrite === true;\r\n}\r\n\r\nfunction isCalculatedField(field: ClientFormField): boolean {\r\n return field.propertyMetadata?.isCalculated === true;\r\n}\r\n\r\nfunction resolveFieldMeta(field: ClientFormField): {\r\n property: ClientPropertyItem;\r\n propertyId?: number;\r\n viewType: string;\r\n} {\r\n const property = field.propertyMetadata;\r\n return {\r\n property,\r\n propertyId: property?.propertyId,\r\n viewType: property?.viewType ?? 'Text',\r\n };\r\n}\r\n\r\nfunction mapFieldToConfig(\r\n field: ClientFormField,\r\n lang: 'en' | 'ar',\r\n lookups: ClientLookup[],\r\n context: ProcessFormContext | null,\r\n readonly = false,\r\n teamMemberOptions: TeamMemberOption[] = [],\r\n): DynamicFieldConfig {\r\n const { property: prop, viewType } = resolveFieldMeta(field);\r\n const label =\r\n (prop?.name as { display?: string } | undefined)?.display ??\r\n field.propertyKey;\r\n const colSpan = WIDTH_TO_COLSPAN[field.width] ?? 12;\r\n\r\n const base = {\r\n key: field.propertyKey,\r\n label,\r\n colSpan,\r\n order: field.order,\r\n placeholder: label,\r\n required: field.isRequired ?? false,\r\n disabled: isCalculatedField(field),\r\n readonly: readonly || field.isWrite === false,\r\n validators: field.isRequired\r\n ? [ValidatorConfig.required(`${label} is required`)]\r\n : [],\r\n formulaCondition: buildFormulaCondition(field),\r\n };\r\n\r\n switch (viewType) {\r\n // ── Text-like ──────────────────────────────────────────────\r\n case 'Text':\r\n case 'EditableListView':\r\n case 'LookupLog':\r\n return new TextFieldConfig(base);\r\n\r\n case 'LongText':\r\n return new EditorFieldConfig(base);\r\n\r\n // ── Numeric ───────────────────────────────────────────────\r\n case 'Number':\r\n return new NumberFieldConfig(base);\r\n\r\n case 'Currency':\r\n return new NumberFieldConfig({\r\n ...base,\r\n useGrouping: true,\r\n });\r\n\r\n case 'Percentage':\r\n return new SliderFieldConfig({\r\n ...base,\r\n min: 0,\r\n max: 100,\r\n unit: '%',\r\n });\r\n\r\n // ── Date / Time ───────────────────────────────────────────\r\n case 'Date':\r\n return new DateFieldConfig({ ...base, showTime: false });\r\n\r\n case 'DateTime':\r\n return new DateFieldConfig({ ...base, showTime: true });\r\n\r\n case 'Time':\r\n return new DateFieldConfig({ ...base, showTime: true });\r\n\r\n // ── Boolean ───────────────────────────────────────────────\r\n case 'Checkbox':\r\n return new ToggleFieldConfig(base);\r\n\r\n // ── File ──────────────────────────────────────────────────\r\n case 'Attachment': {\r\n const isMultiple =\r\n (prop?.configuration?.['IsMulitple'] as boolean) ?? false;\r\n return new UploadFileFieldConfig({\r\n ...base,\r\n multiple: isMultiple,\r\n });\r\n }\r\n\r\n // ── User Search ───────────────────────────────────────────\r\n case 'User': {\r\n const justTeamMembers = !!prop?.configuration?.['justTeamMembers'];\r\n if (justTeamMembers) {\r\n return new SelectFieldConfig({\r\n ...base,\r\n options: teamMemberOptions,\r\n optionLabel: 'label',\r\n optionValue: 'value',\r\n filter: teamMemberOptions.length > 10,\r\n showClear: !(field.isRequired ?? false),\r\n });\r\n }\r\n return new UserSearchFieldConfig({\r\n ...base,\r\n apiUrl: 'Identity/users',\r\n context: new HttpContext().set(REQUEST_CONTEXT, {\r\n useBaseUrl: false,\r\n }),\r\n });\r\n }\r\n\r\n case 'MultiUser':\r\n return new UserSearchFieldConfig({\r\n ...base,\r\n apiUrl: 'Identity/users',\r\n isMultiple: true,\r\n context: new HttpContext().set(REQUEST_CONTEXT, {\r\n useBaseUrl: false,\r\n }),\r\n });\r\n\r\n // ── Lookup (single select) ────────────────────────────────\r\n case 'Lookup': {\r\n const items = resolveLookupOptions(prop, lookups);\r\n return new SelectFieldConfig({\r\n ...base,\r\n options: items,\r\n optionLabel: 'label',\r\n optionValue: 'value',\r\n filter: items.length > 10,\r\n showClear: !(field.isRequired ?? false),\r\n });\r\n }\r\n\r\n // ── Lookup (multi select) ─────────────────────────────────\r\n case 'LookupMultiSelect': {\r\n const items = resolveLookupOptions(prop, lookups);\r\n return new MultiSelectFieldConfig({\r\n ...base,\r\n options: items,\r\n optionLabel: 'label',\r\n optionValue: 'value',\r\n filter: items.length > 10,\r\n display: 'chip',\r\n });\r\n }\r\n\r\n // ── Other select-based types ──────────────────────────────\r\n case 'Status':\r\n case 'InternalModule':\r\n case 'DynamicList':\r\n case 'API':\r\n case 'Location': {\r\n const options = extractOptionsFromProperty(prop);\r\n return new SelectFieldConfig({\r\n ...base,\r\n options: options ?? [],\r\n optionLabel: 'label',\r\n optionValue: 'value',\r\n });\r\n }\r\n\r\n case 'LookupMatrix':\r\n return buildLookupMatrixFieldConfig(base, prop, lookups);\r\n\r\n // ── Connection (level-to-level) ─────────────────────────\r\n case 'Connection': {\r\n const connectionConfig = prop?.configuration ?? {};\r\n return new SchemaConnectionFieldConfig({\r\n ...base,\r\n configuration: connectionConfig,\r\n });\r\n }\r\n case 'Predecessor':\r\n return new SchedulePredecessorFieldConfig({\r\n ...base,\r\n configuration: prop?.configuration ?? null,\r\n runtimeContext: context\r\n ? {\r\n levelId: context.levelId,\r\n levelDataId: context.levelDataId,\r\n moduleDataId: context.moduleDataId,\r\n }\r\n : null,\r\n });\r\n\r\n // ── Fallback ──────────────────────────────────────────────\r\n default:\r\n return new TextFieldConfig(base);\r\n }\r\n}\r\n\r\nfunction buildFormulaCondition(\r\n field: ClientFormField,\r\n): { formulaTokens: string; formulaText?: string; mode?: 'auto' } | undefined {\r\n if (!field.showConditionalDisplayFormula) return undefined;\r\n const formulaTokens = (field.conditionalDisplayFormula ?? '').trim();\r\n if (!formulaTokens) return undefined;\r\n\r\n return {\r\n formulaTokens,\r\n formulaText: field.conditionalDisplayFormula ?? '',\r\n mode: 'auto',\r\n };\r\n}\r\n\r\n/**\r\n * Resolve lookup items for Lookup / LookupMultiSelect viewTypes.\r\n *\r\n * Reads `configuration.lookup` (the lookup ID) from the property metadata,\r\n * finds the matching lookup definition, and maps its items to select options.\r\n */\r\nfunction resolveLookupOptions(\r\n prop: ClientPropertyItem | undefined,\r\n lookups: ClientLookup[],\r\n): ResolvedLookupOption[] {\r\n return resolveLookupOptionsById(\r\n coerceLookupId(prop?.configuration?.['lookup']),\r\n lookups,\r\n );\r\n}\r\n\r\n/**\r\n * Fallback option extractor for non-lookup select types\r\n * (Status, InternalModule, DynamicList, API, etc.).\r\n */\r\nfunction extractOptionsFromProperty(\r\n property: ClientPropertyItem | undefined,\r\n): { label: string; value: any }[] | null {\r\n if (!property?.configuration) return null;\r\n\r\n const config = property.configuration;\r\n\r\n if (Array.isArray(config['options'])) {\r\n return config['options'] as { label: string; value: any }[];\r\n }\r\n\r\n if (Array.isArray(config['items'])) {\r\n return (config['items'] as any[]).map((item) => ({\r\n label:\r\n typeof item.name === 'string'\r\n ? item.name\r\n : (item.name?.['en'] ?? item.label ?? String(item.value)),\r\n value: item.id ?? item.value ?? item.key,\r\n }));\r\n }\r\n\r\n return null;\r\n}\r\n\r\ntype ResolvedLookupOption = {\r\n id?: number | string;\r\n key?: string;\r\n label: string;\r\n value: any;\r\n color?: string | null;\r\n description?: string;\r\n};\r\n\r\nfunction resolveLookupOptionsById(\r\n lookupId: number | null,\r\n lookups: ClientLookup[],\r\n): ResolvedLookupOption[] {\r\n if (!lookupId || !lookups.length) return [];\r\n\r\n const lookup = lookups.find((item) => item.id === lookupId);\r\n if (!lookup) return [];\r\n\r\n return lookup.items\r\n .slice()\r\n .sort((a, b) => a.order - b.order)\r\n .map((item) => ({\r\n id: item.id,\r\n key: item.key,\r\n label: item.name?.display ?? item.name?.en ?? item.key,\r\n value: item.key,\r\n color: item.color ?? null,\r\n description:\r\n item.description?.display ?? item.description?.en ?? undefined,\r\n }));\r\n}\r\n\r\nfunction resolveLookupNameById(\r\n lookupId: number | null,\r\n lookups: ClientLookup[],\r\n): string {\r\n if (!lookupId) return '';\r\n\r\n const lookup = lookups.find((item) => item.id === lookupId);\r\n return lookup?.name?.display ?? lookup?.name?.en ?? lookup?.key ?? '';\r\n}\r\n\r\nfunction buildLookupMatrixFieldConfig(\r\n base: {\r\n key: string;\r\n label: string;\r\n colSpan: number;\r\n order: number;\r\n placeholder: string;\r\n required: boolean;\r\n disabled: boolean;\r\n readonly: boolean;\r\n validators: ValidatorConfig[];\r\n formulaCondition:\r\n | { formulaTokens: string; formulaText?: string; mode?: 'auto' }\r\n | undefined;\r\n },\r\n prop: ClientPropertyItem | undefined,\r\n lookups: ClientLookup[],\r\n): LookupMatrixFieldConfig {\r\n const configuration = (prop?.configuration ?? {}) as Record<string, unknown>;\r\n const xLookupId = coerceLookupId(configuration['xlookupSource']);\r\n const yLookupId = coerceLookupId(configuration['ylookupSource']);\r\n const zLookupId = coerceLookupId(configuration['zlookupId']);\r\n\r\n const xOptions = resolveLookupOptionsById(xLookupId, lookups);\r\n const yOptions = resolveLookupOptionsById(yLookupId, lookups);\r\n const zOptions = resolveLookupOptionsById(zLookupId, lookups);\r\n const zOptionsById = new Map(\r\n zOptions\r\n .filter((item) => item.id != null)\r\n .map((item) => [String(item.id), item] as const),\r\n );\r\n\r\n const rawCells = Array.isArray(configuration['lookupsMatrix'])\r\n ? (configuration['lookupsMatrix'] as Array<Record<string, unknown>>)\r\n : [];\r\n\r\n return new LookupMatrixFieldConfig({\r\n ...base,\r\n required: false,\r\n xFieldKey: String(configuration['xPropertyLookupKey'] ?? ''),\r\n yFieldKey: String(configuration['yPropertyLookupKey'] ?? ''),\r\n xAxisLabel: resolveLookupNameById(xLookupId, lookups),\r\n yAxisLabel: resolveLookupNameById(yLookupId, lookups),\r\n xOptions,\r\n yOptions,\r\n cells: rawCells.map((cell) => {\r\n const zOption = zOptionsById.get(String(cell['value'] ?? ''));\r\n\r\n return {\r\n row: Number(cell['row'] ?? 0),\r\n column: Number(cell['column'] ?? 0),\r\n xLookupItemId: String(cell['xValue'] ?? ''),\r\n yLookupItemId: String(cell['yValue'] ?? ''),\r\n zLookupItemId: cell['value'] == null ? null : String(cell['value']),\r\n label: zOption?.label ?? String(cell['value'] ?? ''),\r\n color: zOption?.color ?? null,\r\n };\r\n }),\r\n });\r\n}\r\n\r\nfunction coerceLookupId(value: unknown): number | null {\r\n if (typeof value === 'number' && Number.isFinite(value)) {\r\n return value;\r\n }\r\n\r\n if (typeof value === 'string' && value.trim() !== '') {\r\n const parsed = Number(value);\r\n return Number.isFinite(parsed) ? parsed : null;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction normalizeSubmitValue(value: any, viewType?: string): any {\r\n switch (viewType) {\r\n case 'User':\r\n if (value && typeof value === 'object' && !Array.isArray(value)) {\r\n return value['id'] ?? value;\r\n }\r\n return value;\r\n\r\n case 'MultiUser':\r\n if (Array.isArray(value)) {\r\n return value.map((v) =>\r\n v && typeof v === 'object' ? (v['id'] ?? v) : v,\r\n );\r\n }\r\n return value;\r\n\r\n case 'Attachment':\r\n if (Array.isArray(value)) {\r\n return value.map((v) =>\r\n v && typeof v === 'object' ? (v['id'] ?? v) : v,\r\n );\r\n }\r\n if (value && typeof value === 'object') {\r\n return value['id'] ?? value;\r\n }\r\n return value;\r\n\r\n default:\r\n return value;\r\n }\r\n}\r\n\r\nfunction resolveLoadedFieldValue(value: ProcessFormValue): any {\r\n const resolvedValue =\r\n value.metadata?.viewType === 'User'\r\n ? value.value\r\n : (value.rawValue ?? value.value);\r\n\r\n switch (value.metadata?.viewType) {\r\n // case 'Date':\r\n // case 'DateTime':\r\n // case 'Time':\r\n // return coerceToDate(resolvedValue);\r\n\r\n default:\r\n return resolvedValue;\r\n }\r\n}\r\n\r\n// function coerceToDate(value: any): any {\r\n// if (value === null || value === undefined || value === '') {\r\n// return value;\r\n// }\r\n\r\n// if (value instanceof Date) {\r\n// return value;\r\n// }\r\n\r\n// const coerced = new Date(value);\r\n// return Number.isNaN(coerced.getTime()) ? value : coerced;\r\n// }\r\n\r\ntype FieldValueMeta = {\r\n key: string;\r\n propertyId?: number;\r\n};\r\n\r\ntype FieldValueMap = {\r\n fieldsByKey: Map<string, FieldValueMeta>;\r\n propertyIdToKey: Map<number, string>;\r\n aliasToKey: Map<string, string>;\r\n};\r\n\r\nfunction buildFieldValueMap(config: ClientFormConfiguration): FieldValueMap {\r\n const fieldsByKey = new Map<string, FieldValueMeta>();\r\n const propertyIdCandidates = new Map<number, Set<string>>();\r\n const aliasCandidates = new Map<string, Set<string>>();\r\n\r\n for (const section of config.sections ?? []) {\r\n for (const field of section.fields ?? []) {\r\n const { propertyId } = resolveFieldMeta(field);\r\n const fieldMeta: FieldValueMeta = {\r\n key: field.propertyKey,\r\n propertyId,\r\n };\r\n\r\n fieldsByKey.set(field.propertyKey, fieldMeta);\r\n\r\n if (propertyId != null) {\r\n if (!propertyIdCandidates.has(propertyId)) {\r\n propertyIdCandidates.set(propertyId, new Set<string>());\r\n }\r\n propertyIdCandidates.get(propertyId)!.add(field.propertyKey);\r\n }\r\n\r\n const aliases = new Set<string>([\r\n field.propertyKey,\r\n stripTemplatePrefix(field.propertyKey),\r\n ]);\r\n\r\n const property = field.propertyMetadata;\r\n if (property?.key) {\r\n aliases.add(property.key);\r\n aliases.add(stripTemplatePrefix(property.key));\r\n }\r\n\r\n aliases.forEach((alias) => {\r\n if (!alias) return;\r\n if (!aliasCandidates.has(alias)) {\r\n aliasCandidates.set(alias, new Set<string>());\r\n }\r\n aliasCandidates.get(alias)!.add(field.propertyKey);\r\n });\r\n }\r\n }\r\n\r\n const propertyIdToKey = new Map<number, string>();\r\n propertyIdCandidates.forEach((keys, propertyId) => {\r\n if (keys.size !== 1) return;\r\n propertyIdToKey.set(propertyId, [...keys][0]);\r\n });\r\n\r\n const aliasToKey = new Map<string, string>();\r\n aliasCandidates.forEach((keys, alias) => {\r\n if (keys.size !== 1) return;\r\n aliasToKey.set(alias, [...keys][0]);\r\n });\r\n\r\n return {\r\n fieldsByKey,\r\n propertyIdToKey,\r\n aliasToKey,\r\n };\r\n}\r\n\r\nfunction resolveValueTargetKey(\r\n value: ProcessFormValue,\r\n fieldMap: FieldValueMap | null,\r\n): string | null {\r\n if (!fieldMap) {\r\n return value.propertyKey ?? null;\r\n }\r\n\r\n const exactCandidates = [value.propertyKey, value.metadata?.key].filter(\r\n (candidate): candidate is string => !!candidate,\r\n );\r\n\r\n for (const candidate of exactCandidates) {\r\n if (fieldMap.fieldsByKey.has(candidate)) {\r\n return candidate;\r\n }\r\n }\r\n\r\n const propertyId = value.metadata?.propertyId;\r\n if (propertyId != null && fieldMap.propertyIdToKey.has(propertyId)) {\r\n return fieldMap.propertyIdToKey.get(propertyId)!;\r\n }\r\n\r\n const aliasCandidates = exactCandidates.flatMap((candidate) => [\r\n candidate,\r\n stripTemplatePrefix(candidate),\r\n ]);\r\n\r\n for (const candidate of aliasCandidates) {\r\n if (!candidate) continue;\r\n if (fieldMap.aliasToKey.has(candidate)) {\r\n return fieldMap.aliasToKey.get(candidate)!;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction stripTemplatePrefix(value: string): string {\r\n return value.replace(/^template_\\d+_/, '');\r\n}\r\n","import {\r\n Component,\r\n computed,\r\n ElementRef,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n untracked,\r\n OnDestroy,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport { Message } from 'primeng/message';\r\nimport { Skeleton } from 'primeng/skeleton';\r\n\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { ConfirmationService } from '@masterteam/components/confirmation';\r\nimport { EntitiesPreview } from '@masterteam/components/entities';\r\nimport { Tabs, type OptionItem } from '@masterteam/components/tabs';\r\nimport { DynamicForm } from '@masterteam/forms/dynamic-form';\r\nimport { Icon } from '@masterteam/icons';\r\nimport type {\r\n DynamicFormConfig,\r\n FormulaRuntimeMessage,\r\n} from '@masterteam/components';\r\n\r\nimport { ClientFormApiService } from './services/client-form-api.service';\r\nimport { ClientFormStateService } from './services/client-form-state.service';\r\nimport {\r\n getPreviewOnlyFieldKeys,\r\n mapPreviewSectionsToEntities,\r\n mapToDynamicFormConfig,\r\n mapValuesToFormValue,\r\n mapFormValueToSubmitFields,\r\n type TeamMemberOption,\r\n} from './utils/form-config-mapper';\r\n\r\nimport type {\r\n ClientFormFooterState,\r\n ClientFormResolvedRenderMode,\r\n ProcessFormLoadRequest,\r\n ProcessFormLoadResponse,\r\n ProcessFormSubmitRequest,\r\n ProcessFormSubmitResponse,\r\n ProcessFormSubmitField,\r\n ProcessFormValidationRuleResult,\r\n ProcessFormMode,\r\n ProcessFormSource,\r\n ProcessFormValue,\r\n ClientLookup,\r\n ClientFormSubmitRequestMapper,\r\n ClientFormTranslatableValue,\r\n} from './models/client-form.model';\r\nimport {\r\n TranslocoDirective,\r\n TranslocoPipe,\r\n TranslocoService,\r\n} from '@jsverse/transloco';\r\n\r\ntype StepTimelineState = 'completed' | 'current' | 'upcoming';\r\n\r\ninterface StepTimelineItem {\r\n key: string;\r\n label: string;\r\n value: number;\r\n state: StepTimelineState;\r\n selected: boolean;\r\n beforeLineActive: boolean;\r\n afterLineActive: boolean;\r\n}\r\n\r\n/**\r\n * Client Form — Runtime process form component.\r\n *\r\n * Self-contained, signal-based (no NGXS). Each instance manages its own state\r\n * via a component-scoped `ClientFormStateService`.\r\n *\r\n * Submit and reset actions stay external. Step navigation buttons are optional\r\n * and can be hidden with `showInternalStepActions`.\r\n *\r\n * Parent can control actions via `viewChild()`:\r\n *\r\n * ```html\r\n * <mt-client-form #processForm [moduleKey]=\"'Risk'\" [operationKey]=\"'CloseRisk'\" />\r\n * <button (click)=\"processForm.load()\">Load</button>\r\n * <button (click)=\"processForm.submit()\">Submit</button>\r\n * ```\r\n *\r\n * Or programmatically:\r\n * ```typescript\r\n * readonly processForm = viewChild.required(ClientForm);\r\n * this.processForm().load();\r\n * this.processForm().submit();\r\n * ```\r\n */\r\n@Component({\r\n selector: 'mt-client-form',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n Button,\r\n Card,\r\n EntitiesPreview,\r\n DynamicForm,\r\n Tabs,\r\n Skeleton,\r\n Icon,\r\n Message,\r\n TranslocoDirective,\r\n TranslocoPipe,\r\n ],\r\n providers: [ClientFormStateService],\r\n templateUrl: './client-form.html',\r\n styleUrls: ['./client-form.scss'],\r\n})\r\nexport class ClientForm implements OnDestroy {\r\n private readonly api = inject(ClientFormApiService);\r\n private readonly teamMemberOptions = signal<TeamMemberOption[]>([]);\r\n private readonly confirmationService = inject(ConfirmationService);\r\n protected readonly state = inject(ClientFormStateService);\r\n readonly validationSummary =\r\n viewChild<ElementRef<HTMLElement>>('validationSummary');\r\n\r\n private loadSub?: Subscription;\r\n private submitSub?: Subscription;\r\n private formValueSub?: Subscription;\r\n private readonly hasStartedLoad = signal(false);\r\n private readonly stepValidationPending = signal(false);\r\n private readonly formRuntimeMessages = signal<FormulaRuntimeMessage[]>([]);\r\n private readonly submitValidationMessages = signal<FormulaRuntimeMessage[]>(\r\n [],\r\n );\r\n readonly runtimeMessages = computed(() => [\r\n ...this.formRuntimeMessages(),\r\n ...this.submitValidationMessages(),\r\n ]);\r\n private readonly translocoService = inject(TranslocoService);\r\n\r\n // ============================================================================\r\n // Public State Signals (for parent access via viewChild)\r\n // ============================================================================\r\n\r\n readonly submitting = computed(() => this.state.submitting());\r\n readonly submitError = computed(() => this.state.submitError());\r\n readonly isSubmitted = computed(() => this.state.isSubmitted());\r\n readonly isPendingApproval = computed(() => this.state.isPendingApproval());\r\n readonly isExecuted = computed(() => this.state.isExecuted());\r\n readonly isLoaded = computed(() => this.state.isLoaded());\r\n readonly loading = computed(() => this.state.loading());\r\n readonly runtimeErrors = computed(() =>\r\n this.runtimeMessages().filter((msg) => msg.severity === 'error'),\r\n );\r\n readonly runtimeWarnings = computed(() =>\r\n this.runtimeMessages().filter((msg) => msg.severity === 'warning'),\r\n );\r\n readonly currentStep = signal(1);\r\n\r\n // ============================================================================\r\n // Inputs — Required Context\r\n // ============================================================================\r\n\r\n readonly moduleKey = input.required<string>();\r\n readonly operationKey = input.required<string>();\r\n\r\n // ============================================================================\r\n // Inputs — Optional Context\r\n // ============================================================================\r\n\r\n readonly moduleId = input<number | string>();\r\n readonly levelId = input<number | string>();\r\n readonly levelDataId = input<number | string>();\r\n readonly moduleDataId = input<number | string>();\r\n readonly requestSchemaId = input<number>();\r\n readonly draftProcessId = input<number>();\r\n readonly preview = input(false);\r\n readonly returnUrl = input<string>();\r\n readonly defaultValues = input<Record<string, any> | null>(null);\r\n readonly submitRequestMapper = input<ClientFormSubmitRequestMapper | null>(\r\n null,\r\n );\r\n\r\n // ============================================================================\r\n // Inputs — UI Configuration\r\n // ============================================================================\r\n\r\n readonly readonly = input(false);\r\n readonly autoLoad = input(true);\r\n readonly formMode = input<'create' | 'edit'>('create');\r\n readonly renderMode = input<\r\n 'form' | 'steps' | 'tabs' | 'wizard' | undefined\r\n >();\r\n // Hide the built-in previous/next buttons when step actions are rendered by the parent.\r\n readonly showInternalStepActions = input<boolean>(true);\r\n readonly confirmWarningsOnSubmit = input(true);\r\n readonly confirmWarningsOnStepChange = input(true);\r\n readonly lang = signal(this.translocoService.getActiveLang() as 'en' | 'ar');\r\n readonly lookups = input<ClientLookup[]>([]);\r\n readonly ignoredFieldKeys = input<string[]>([]);\r\n readonly rtl = computed(() => this.lang() === 'ar');\r\n readonly stepNavigationValidating = computed(() =>\r\n this.stepValidationPending(),\r\n );\r\n\r\n // ============================================================================\r\n // Outputs\r\n // ============================================================================\r\n\r\n readonly loaded = output<ProcessFormLoadResponse>();\r\n readonly submitted = output<ProcessFormSubmitResponse>();\r\n readonly errored = output<string>();\r\n readonly modeDetected = output<ProcessFormMode>();\r\n readonly formSourceDetected = output<ProcessFormSource>();\r\n readonly footerStateChanged = output<ClientFormFooterState>();\r\n\r\n // ============================================================================\r\n // Internal Form Control\r\n // ============================================================================\r\n\r\n readonly formControl = new FormControl<Record<string, any>>({});\r\n\r\n // ============================================================================\r\n // Computed — Dynamic Form Config\r\n // ============================================================================\r\n\r\n readonly formConfig = computed<DynamicFormConfig | null>(() => {\r\n const config = this.state.formConfiguration();\r\n if (!config) return null;\r\n return mapToDynamicFormConfig(\r\n config,\r\n this.lang(),\r\n this.formMode(),\r\n this.lookups(),\r\n this.state.context(),\r\n this.readonly(),\r\n this.teamMemberOptions(),\r\n );\r\n });\r\n\r\n readonly initialValues = computed<Record<string, any>>(() => {\r\n const mappedValues = mapValuesToFormValue(\r\n this.state.formValues(),\r\n this.state.formConfiguration(),\r\n );\r\n\r\n return {\r\n ...(this.defaultValues() ?? {}),\r\n ...mappedValues,\r\n };\r\n });\r\n\r\n readonly virtualFields = computed<ProcessFormValue[]>(() =>\r\n this.state.virtualFields(),\r\n );\r\n\r\n readonly hasVirtualFields = computed(() => this.virtualFields().length > 0);\r\n readonly previewFieldKeys = computed(() => {\r\n const config = this.state.formConfiguration();\r\n if (!config) return [];\r\n return [\r\n ...new Set([\r\n ...getPreviewOnlyFieldKeys(config, this.formMode(), this.readonly()),\r\n ...this.ignoredFieldKeys(),\r\n ]),\r\n ];\r\n });\r\n readonly previewEntitySections = computed(() => {\r\n const config = this.state.formConfiguration();\r\n if (!config) return [];\r\n const ignoredFieldKeys = new Set(this.ignoredFieldKeys());\r\n return mapPreviewSectionsToEntities(\r\n config,\r\n this.state.formValues(),\r\n this.lang(),\r\n this.formMode(),\r\n this.readonly(),\r\n )\r\n .map((section) => ({\r\n ...section,\r\n entities: section.entities.filter(\r\n (entity) => !entity.key || !ignoredFieldKeys.has(entity.key),\r\n ),\r\n }))\r\n .filter((section) => section.entities.length > 0);\r\n });\r\n readonly editableFormConfig = computed<DynamicFormConfig | null>(() => {\r\n if (this.readonly()) {\r\n return null;\r\n }\r\n\r\n const config = this.formConfig();\r\n if (!config) return null;\r\n\r\n const previewFieldKeys = new Set(this.previewFieldKeys());\r\n\r\n return {\r\n ...config,\r\n sections: config.sections\r\n .map((section) => ({\r\n ...section,\r\n fields: section.fields.filter(\r\n (field) => !field.key || !previewFieldKeys.has(field.key),\r\n ),\r\n }))\r\n .filter((section) =>\r\n section.fields.some((field) => field.type !== 'spacer'),\r\n ),\r\n };\r\n });\r\n readonly stepSections = computed(\r\n () => this.editableFormConfig()?.sections ?? [],\r\n );\r\n readonly hasEditableFormSections = computed(\r\n () => this.stepSections().length > 0,\r\n );\r\n readonly effectiveRenderMode = computed<'form' | 'steps' | 'tabs' | 'wizard'>(\r\n () => {\r\n const explicitRenderMode = this.renderMode();\r\n if (explicitRenderMode) return explicitRenderMode;\r\n\r\n const configRenderMode = this.state.formConfiguration()?.renderMode;\r\n if (\r\n configRenderMode === 'steps' ||\r\n configRenderMode === 'tabs' ||\r\n configRenderMode === 'wizard'\r\n ) {\r\n return configRenderMode;\r\n }\r\n\r\n return 'form';\r\n },\r\n );\r\n readonly stepsEnabled = computed(\r\n () =>\r\n this.effectiveRenderMode() === 'steps' && this.stepSections().length > 1,\r\n );\r\n readonly tabsEnabled = computed(\r\n () =>\r\n this.effectiveRenderMode() === 'tabs' && this.stepSections().length > 1,\r\n );\r\n readonly wizardEnabled = computed(\r\n () =>\r\n this.effectiveRenderMode() === 'wizard' && this.stepSections().length > 1,\r\n );\r\n readonly wizardFormConfig = computed<DynamicFormConfig | null>(() => {\r\n const config = this.editableFormConfig();\r\n if (!config) return null;\r\n return {\r\n ...config,\r\n sections: config.sections.map((s) => ({ ...s, label: undefined })),\r\n };\r\n });\r\n readonly sectionNavigationEnabled = computed(\r\n () => this.stepsEnabled() || this.tabsEnabled() || this.wizardEnabled(),\r\n );\r\n readonly tabOptions = computed<OptionItem[]>(() =>\r\n this.stepSections().map((section, index) => ({\r\n label: section.label || `Tab ${index + 1}`,\r\n value: index + 1,\r\n })),\r\n );\r\n readonly stepTimeline = computed<StepTimelineItem[]>(() => {\r\n const sections = this.stepSections();\r\n const currentStep = this.currentStep();\r\n\r\n return sections.map((section, index) => {\r\n const value = index + 1;\r\n const state = this.resolveStepTimelineState(value, currentStep);\r\n\r\n return {\r\n key: section.key || `section-${index}`,\r\n label: section.label || `Step ${value}`,\r\n value,\r\n state,\r\n selected: value === currentStep,\r\n beforeLineActive: index > 0 && value <= currentStep,\r\n afterLineActive: index < sections.length - 1 && value < currentStep,\r\n };\r\n });\r\n });\r\n readonly visibleSectionKeys = computed(() => {\r\n if (!this.sectionNavigationEnabled()) return null;\r\n\r\n const currentIndex = this.currentStep() - 1;\r\n const activeSection = this.stepSections()[currentIndex];\r\n\r\n if (!activeSection) return null;\r\n\r\n return [activeSection.key || `section-${currentIndex}`];\r\n });\r\n readonly forcedHiddenFieldKeys = computed(() => {\r\n if (!this.sectionNavigationEnabled()) return [];\r\n\r\n const sections = this.stepSections();\r\n const currentIndex = this.currentStep() - 1;\r\n const hiddenFieldKeys = new Set<string>();\r\n\r\n sections.forEach((section, index) => {\r\n if (index === currentIndex) return;\r\n section.fields\r\n .map((field) => field.key)\r\n .filter((key): key is string => !!key)\r\n .forEach((key) => hiddenFieldKeys.add(key));\r\n });\r\n\r\n return [...hiddenFieldKeys];\r\n });\r\n readonly effectiveForcedHiddenFieldKeys = computed(() => {\r\n return [\r\n ...new Set([...this.forcedHiddenFieldKeys(), ...this.ignoredFieldKeys()]),\r\n ];\r\n });\r\n readonly footerLoading = computed(() => {\r\n return (\r\n this.state.loading() ||\r\n (this.autoLoad() &&\r\n !this.hasStartedLoad() &&\r\n !this.state.isLoaded() &&\r\n !this.state.error())\r\n );\r\n });\r\n readonly footerState = computed<ClientFormFooterState>(() => {\r\n const loading = this.footerLoading();\r\n const isLoaded = this.state.isLoaded();\r\n const renderMode = this.effectiveRenderMode();\r\n const stepNavigationEnabled = this.stepsEnabled() || this.wizardEnabled();\r\n const sectionNavigationEnabled = this.sectionNavigationEnabled();\r\n const currentStep = this.currentStep();\r\n const stepCount = this.stepSections().length;\r\n const stepValidationPending = this.stepValidationPending();\r\n const canGoToPreviousStep =\r\n stepNavigationEnabled && currentStep > 1 && !stepValidationPending;\r\n const canGoToNextStep =\r\n stepNavigationEnabled &&\r\n currentStep < stepCount &&\r\n !stepValidationPending;\r\n\r\n return {\r\n loading,\r\n isLoaded,\r\n renderMode,\r\n actionMode: loading\r\n ? 'loading'\r\n : stepNavigationEnabled\r\n ? 'steps'\r\n : 'submit',\r\n stepNavigationEnabled,\r\n sectionNavigationEnabled,\r\n currentStep,\r\n stepCount,\r\n canGoToPreviousStep,\r\n canGoToNextStep,\r\n showPreviousStep: stepNavigationEnabled,\r\n showNextStep: stepNavigationEnabled && canGoToNextStep,\r\n showSubmit:\r\n isLoaded && !loading && (!stepNavigationEnabled || !canGoToNextStep),\r\n };\r\n });\r\n\r\n // ============================================================================\r\n // Effects\r\n // ============================================================================\r\n\r\n constructor() {\r\n this.formValueSub = this.formControl.valueChanges.subscribe(() => {\r\n if (this.submitValidationMessages().length > 0) {\r\n this.submitValidationMessages.set([]);\r\n }\r\n });\r\n\r\n // Auto-load when inputs are ready\r\n effect(() => {\r\n const autoLoad = this.autoLoad();\r\n const moduleKey = this.moduleKey();\r\n const operationKey = this.operationKey();\r\n\r\n if (autoLoad && moduleKey && operationKey) {\r\n untracked(() => this.load());\r\n }\r\n });\r\n\r\n // Patch form values after load\r\n effect(() => {\r\n const values = this.initialValues();\r\n const isLoaded = this.state.isLoaded();\r\n\r\n if (isLoaded && Object.keys(values).length > 0) {\r\n untracked(() => {\r\n this.formControl.patchValue(values, { emitEvent: false });\r\n });\r\n }\r\n });\r\n\r\n effect(() => {\r\n const count = this.stepSections().length;\r\n const current = this.currentStep();\r\n\r\n if (count === 0) {\r\n if (current !== 1) this.currentStep.set(1);\r\n return;\r\n }\r\n\r\n if (current < 1 || current > count) {\r\n this.currentStep.set(1);\r\n }\r\n });\r\n\r\n effect(() => {\r\n const footerState = this.footerState();\r\n\r\n untracked(() => {\r\n this.footerStateChanged.emit(footerState);\r\n });\r\n });\r\n\r\n effect(() => {\r\n const submitValidationCount = this.submitValidationMessages().length;\r\n const validationSummary = this.validationSummary()?.nativeElement;\r\n\r\n if (submitValidationCount === 0 || !validationSummary) {\r\n return;\r\n }\r\n\r\n untracked(() => {\r\n queueMicrotask(() => {\r\n validationSummary.scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'start',\r\n });\r\n });\r\n });\r\n });\r\n }\r\n\r\n // ============================================================================\r\n // Public API (accessed via viewChild)\r\n // ============================================================================\r\n\r\n /**\r\n * Load form configuration from the API.\r\n * Builds request from current input values.\r\n */\r\n load(): void {\r\n if (this.state.loading()) return;\r\n\r\n this.loadSub?.unsubscribe();\r\n this.hasStartedLoad.set(true);\r\n this.teamMemberOptions.set([]);\r\n this.stepValidationPending.set(false);\r\n this.formRuntimeMessages.set([]);\r\n this.submitValidationMessages.set([]);\r\n this.state.loading.set(true);\r\n this.state.error.set(null);\r\n this.state.submitResponse.set(null);\r\n\r\n const request = this.buildLoadRequest();\r\n\r\n this.loadSub = this.api.load(request).subscribe({\r\n next: (response) => {\r\n this.state.loading.set(false);\r\n\r\n if (response.data) {\r\n this.state.setLoadResponse(response.data);\r\n this.loaded.emit(response.data);\r\n\r\n if (response.data.mode) {\r\n this.modeDetected.emit(response.data.mode);\r\n }\r\n\r\n if (response.data.formSource) {\r\n this.formSourceDetected.emit(response.data.formSource);\r\n }\r\n\r\n // Fetch team members if any User field has justTeamMembers=true\r\n const hasJustTeamMembers =\r\n response.data.formConfiguration?.sections\r\n .flatMap((s) => s.fields ?? [])\r\n .some(\r\n (f) =>\r\n f.propertyMetadata?.viewType === 'User' &&\r\n !!f.propertyMetadata?.configuration?.['justTeamMembers'],\r\n ) ?? false;\r\n\r\n const levelDataId =\r\n this.levelDataId() ?? response.data.context?.levelDataId;\r\n if (hasJustTeamMembers && levelDataId != null) {\r\n this.api.getTeamMembers(levelDataId).subscribe({\r\n next: (res) => {\r\n const options: TeamMemberOption[] = (res.data ?? []).map(\r\n (m) => ({\r\n label: m.user?.displayName ?? m.user?.fullName ?? m.userId,\r\n value: m.userId,\r\n }),\r\n );\r\n this.teamMemberOptions.set(options);\r\n },\r\n });\r\n }\r\n } else {\r\n const msg = response.message ?? 'Failed to load form';\r\n this.state.setError(msg);\r\n this.errored.emit(msg);\r\n }\r\n },\r\n error: (err) => {\r\n const msg =\r\n err?.error?.message ?? err?.message ?? 'Failed to load form';\r\n this.state.setError(msg);\r\n this.errored.emit(msg);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Submit the current form values.\r\n * Builds submit request from form value + load context.\r\n */\r\n submit(): void {\r\n if (this.state.submitting()) return;\r\n const loadResponse = this.state.loadResponse();\r\n if (!loadResponse) {\r\n const msg = 'Form must be loaded before submit';\r\n this.state.submitError.set(msg);\r\n this.errored.emit(msg);\r\n return;\r\n }\r\n\r\n this.submitSub?.unsubscribe();\r\n this.state.submitting.set(true);\r\n this.state.submitError.set(null);\r\n\r\n const request = this.buildSubmitRequest(loadResponse);\r\n this.submitValidationMessages.set([]);\r\n\r\n this.submitSub = this.api.validate(request).subscribe({\r\n next: (validationResponse) => {\r\n const validation = validationResponse.data;\r\n\r\n if (!validation) {\r\n const msg = validationResponse.message ?? 'Failed to validate form';\r\n this.state.submitting.set(false);\r\n this.state.setSubmitError(msg);\r\n this.errored.emit(msg);\r\n return;\r\n }\r\n\r\n this.submitValidationMessages.set(\r\n this.mapSubmitValidationMessages(validation.results ?? []),\r\n );\r\n\r\n if (validation.hasBlockingFailures) {\r\n this.state.submitting.set(false);\r\n return;\r\n }\r\n\r\n const warnings = this.runtimeWarnings();\r\n if (this.confirmWarningsOnSubmit() && warnings.length > 0) {\r\n this.state.submitting.set(false);\r\n this.confirmValidationWarnings(\r\n warnings,\r\n 'clientForm.warning-confirmation-question',\r\n this.translocoService.translate('clientForm.continue-submit'),\r\n () => {\r\n this.state.submitting.set(true);\r\n this.submitValidationMessages.set([]);\r\n this.executeSubmit(request);\r\n },\r\n );\r\n return;\r\n }\r\n\r\n this.executeSubmit(request);\r\n },\r\n error: (err) => {\r\n this.state.submitting.set(false);\r\n const msg =\r\n err?.error?.message ?? err?.message ?? 'Failed to validate form';\r\n this.state.setSubmitError(msg);\r\n this.errored.emit(msg);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Get the current form value as a flat key-value object.\r\n */\r\n getFormValue(): Record<string, any> {\r\n return this.formControl.value ?? {};\r\n }\r\n\r\n /**\r\n * Get the current form value mapped to submit payload format.\r\n */\r\n getSubmitFields(): ProcessFormSubmitField[] {\r\n const loadResponse = this.state.loadResponse();\r\n if (!loadResponse) return [];\r\n return mapFormValueToSubmitFields(this.getFormValue(), loadResponse);\r\n }\r\n\r\n /**\r\n * Backward-compatible alias for consumers still using the previous helper name.\r\n */\r\n getSubmitValues(): ProcessFormSubmitField[] {\r\n return this.getSubmitFields();\r\n }\r\n\r\n /**\r\n * Check whether the current form state is valid.\r\n */\r\n isValid(): boolean {\r\n return this.formControl.valid && this.runtimeErrors().length === 0;\r\n }\r\n\r\n /**\r\n * Reset the component to its initial state.\r\n */\r\n reset(): void {\r\n this.loadSub?.unsubscribe();\r\n this.submitSub?.unsubscribe();\r\n this.stepValidationPending.set(false);\r\n this.formControl.reset({});\r\n this.formRuntimeMessages.set([]);\r\n this.submitValidationMessages.set([]);\r\n this.state.reset();\r\n }\r\n\r\n onRuntimeMessagesChange(messages: FormulaRuntimeMessage[]): void {\r\n this.formRuntimeMessages.set(messages ?? []);\r\n }\r\n\r\n onStepChange(value: number): void {\r\n const count = this.stepSections().length;\r\n if (value < 1 || value > count) return;\r\n if (this.stepValidationPending()) return;\r\n\r\n const currentStep = this.currentStep();\r\n if (value === currentStep) return;\r\n\r\n if (!this.requiresForwardStepValidation(value, currentStep)) {\r\n this.applyStepChange(value);\r\n return;\r\n }\r\n\r\n const targetStep = Math.min(value, currentStep + 1);\r\n this.validateAndAdvanceStep(targetStep);\r\n }\r\n\r\n goToPreviousStep(): void {\r\n this.onStepChange(this.currentStep() - 1);\r\n }\r\n\r\n goToNextStep(): void {\r\n this.onStepChange(this.currentStep() + 1);\r\n }\r\n\r\n canGoToPreviousStep(): boolean {\r\n return (\r\n (this.stepsEnabled() || this.wizardEnabled()) &&\r\n this.currentStep() > 1 &&\r\n !this.stepValidationPending()\r\n );\r\n }\r\n\r\n canGoToNextStep(): boolean {\r\n return (\r\n (this.stepsEnabled() || this.wizardEnabled()) &&\r\n this.currentStep() < this.stepSections().length &&\r\n !this.stepValidationPending()\r\n );\r\n }\r\n\r\n getCurrentStep(): number {\r\n return this.currentStep();\r\n }\r\n\r\n getStepCount(): number {\r\n return this.stepSections().length;\r\n }\r\n\r\n isStepNavigationEnabled(): boolean {\r\n return this.stepsEnabled();\r\n }\r\n\r\n isSectionNavigationEnabled(): boolean {\r\n return this.sectionNavigationEnabled();\r\n }\r\n\r\n isFooterLoading(): boolean {\r\n return this.footerState().loading;\r\n }\r\n\r\n getResolvedRenderMode(): ClientFormResolvedRenderMode {\r\n return this.footerState().renderMode;\r\n }\r\n\r\n getFooterState(): ClientFormFooterState {\r\n return this.footerState();\r\n }\r\n\r\n // ============================================================================\r\n // Lifecycle\r\n // ============================================================================\r\n\r\n ngOnDestroy(): void {\r\n this.loadSub?.unsubscribe();\r\n this.submitSub?.unsubscribe();\r\n this.formValueSub?.unsubscribe();\r\n }\r\n\r\n // ============================================================================\r\n // Private Helpers\r\n // ============================================================================\r\n\r\n private buildLoadRequest(): ProcessFormLoadRequest {\r\n const req: ProcessFormLoadRequest = {\r\n moduleKey: this.moduleKey(),\r\n operationKey: this.operationKey(),\r\n };\r\n\r\n const moduleId = this.moduleId();\r\n const levelId = this.levelId();\r\n const levelDataId = this.levelDataId();\r\n const moduleDataId = this.moduleDataId();\r\n const requestSchemaId = this.requestSchemaId();\r\n const draftProcessId = this.draftProcessId();\r\n const preview = this.preview();\r\n\r\n if (moduleId != null) req.moduleId = moduleId;\r\n if (levelId != null) req.levelId = levelId;\r\n if (levelDataId != null) req.levelDataId = levelDataId;\r\n if (moduleDataId != null) req.moduleDataId = moduleDataId;\r\n if (requestSchemaId != null) req.requestSchemaId = requestSchemaId;\r\n if (draftProcessId != null) req.draftProcessId = draftProcessId;\r\n if (preview) req.preview = preview;\r\n\r\n return req;\r\n }\r\n\r\n private buildSubmitRequest(\r\n loadResponse: ProcessFormLoadResponse,\r\n ): ProcessFormSubmitRequest {\r\n const context = this.state.context();\r\n const formValue = this.getFormValue();\r\n const fields: ProcessFormSubmitField[] = mapFormValueToSubmitFields(\r\n formValue,\r\n loadResponse,\r\n );\r\n\r\n const req: ProcessFormSubmitRequest = {\r\n moduleKey: this.moduleKey() ?? context?.moduleKey,\r\n operationKey: this.operationKey() ?? context?.operationKey,\r\n fields,\r\n };\r\n\r\n const moduleId = context?.moduleId ?? this.moduleId();\r\n const levelId = context?.levelId ?? this.levelId();\r\n const levelDataId = context?.levelDataId ?? this.levelDataId();\r\n const moduleDataId = context?.moduleDataId ?? this.moduleDataId();\r\n const requestSchemaId = context?.requestSchemaId ?? this.requestSchemaId();\r\n const recordId =\r\n moduleDataId ??\r\n (req.moduleKey === 'LevelData' && req.operationKey !== 'Create'\r\n ? levelDataId\r\n : undefined);\r\n const returnUrl = this.returnUrl();\r\n\r\n if (moduleId != null) req.moduleId = moduleId;\r\n if (levelId != null) req.levelId = levelId;\r\n if (levelDataId != null) req.levelDataId = levelDataId;\r\n if (moduleDataId != null) req.moduleDataId = moduleDataId;\r\n if (recordId != null) req.recordId = recordId;\r\n if (requestSchemaId != null) req.requestSchemaId = requestSchemaId;\r\n if (returnUrl) req.returnUrl = returnUrl;\r\n\r\n const submitRequestMapper = this.submitRequestMapper();\r\n if (!submitRequestMapper) {\r\n return req;\r\n }\r\n\r\n return submitRequestMapper(req, {\r\n formValue,\r\n loadResponse,\r\n });\r\n }\r\n\r\n private validateAndAdvanceStep(targetStep: number): void {\r\n if (this.stepValidationPending()) {\r\n return;\r\n }\r\n\r\n const loadResponse = this.state.loadResponse();\r\n if (!loadResponse) {\r\n const msg = 'Form must be loaded before step navigation';\r\n this.state.setSubmitError(msg);\r\n this.submitValidationMessages.set([\r\n this.createValidationFeedbackMessage(msg, 'error'),\r\n ]);\r\n this.errored.emit(msg);\r\n return;\r\n }\r\n\r\n this.submitSub?.unsubscribe();\r\n this.stepValidationPending.set(true);\r\n this.state.submitError.set(null);\r\n this.submitValidationMessages.set([]);\r\n\r\n const request = this.buildSubmitRequest(loadResponse);\r\n\r\n this.submitSub = this.api.validate(request).subscribe({\r\n next: (validationResponse) => {\r\n this.stepValidationPending.set(false);\r\n\r\n const validation = validationResponse.data;\r\n if (!validation) {\r\n const msg = validationResponse.message ?? 'Failed to validate form';\r\n this.handleValidationRequestFailure(msg);\r\n return;\r\n }\r\n\r\n const backendMessages = this.mapSubmitValidationMessages(\r\n validation.results ?? [],\r\n );\r\n const localBlockingIssues = this.hasLocalBlockingValidationIssues();\r\n\r\n this.submitValidationMessages.set([\r\n ...backendMessages,\r\n ...(localBlockingIssues\r\n ? [\r\n this.createValidationFeedbackMessage(\r\n this.translocoService.translate('clientForm.validation-next'),\r\n 'error',\r\n ),\r\n ]\r\n : []),\r\n ]);\r\n\r\n if (validation.hasBlockingFailures || localBlockingIssues) {\r\n return;\r\n }\r\n\r\n const warnings = this.runtimeWarnings();\r\n if (this.confirmWarningsOnStepChange() && warnings.length > 0) {\r\n this.confirmValidationWarnings(\r\n warnings,\r\n 'clientForm.warning-confirmation-question-next',\r\n this.translocoService.translate('clientForm.next'),\r\n () => this.applyStepChange(targetStep),\r\n );\r\n return;\r\n }\r\n\r\n this.applyStepChange(targetStep);\r\n },\r\n error: (err) => {\r\n this.stepValidationPending.set(false);\r\n const msg =\r\n err?.error?.message ?? err?.message ?? 'Failed to validate form';\r\n this.handleValidationRequestFailure(msg);\r\n },\r\n });\r\n }\r\n\r\n private applyStepChange(value: number): void {\r\n this.submitValidationMessages.set([]);\r\n this.currentStep.set(value);\r\n }\r\n\r\n private requiresForwardStepValidation(\r\n targetStep: number,\r\n currentStep: number,\r\n ): boolean {\r\n return (\r\n targetStep > currentStep && (this.stepsEnabled() || this.wizardEnabled())\r\n );\r\n }\r\n\r\n private hasLocalBlockingValidationIssues(): boolean {\r\n return (\r\n this.formControl.invalid ||\r\n this.formRuntimeMessages().some((msg) => msg.severity === 'error')\r\n );\r\n }\r\n\r\n private handleValidationRequestFailure(message: string): void {\r\n this.state.setSubmitError(message);\r\n this.submitValidationMessages.set([\r\n this.createValidationFeedbackMessage(message, 'error'),\r\n ]);\r\n this.errored.emit(message);\r\n }\r\n\r\n private createValidationFeedbackMessage(\r\n message: string,\r\n severity: 'error' | 'warning',\r\n ): FormulaRuntimeMessage {\r\n return {\r\n code: 'FORMULA_FALSE',\r\n severity,\r\n message,\r\n };\r\n }\r\n\r\n private confirmValidationWarnings(\r\n warnings: FormulaRuntimeMessage[],\r\n questionTranslationKey: string,\r\n acceptLabel: string,\r\n onAccept: () => void,\r\n ): void {\r\n this.confirmationService.confirm({\r\n type: 'dialog',\r\n header: this.translocoService.translate(\r\n 'clientForm.warning-confirmation-header',\r\n ),\r\n message: this.buildWarningConfirmationMessage(\r\n warnings,\r\n questionTranslationKey,\r\n ),\r\n acceptLabel: acceptLabel,\r\n acceptButton: {\r\n severity: 'warn',\r\n },\r\n accept: onAccept,\r\n reject: () => {},\r\n });\r\n }\r\n\r\n private executeSubmit(request: ProcessFormSubmitRequest): void {\r\n this.submitSub = this.api.submit(request).subscribe({\r\n next: (response) => {\r\n this.state.submitting.set(false);\r\n\r\n if (response.data) {\r\n this.state.setSubmitResponse(response.data);\r\n this.submitted.emit(response.data);\r\n } else {\r\n const msg = response.message ?? 'Failed to submit form';\r\n this.state.setSubmitError(msg);\r\n this.errored.emit(msg);\r\n }\r\n },\r\n error: (err) => {\r\n this.state.submitting.set(false);\r\n const msg =\r\n err?.error?.message ?? err?.message ?? 'Failed to submit form';\r\n this.state.setSubmitError(msg);\r\n this.errored.emit(msg);\r\n },\r\n });\r\n }\r\n\r\n private buildWarningConfirmationMessage(\r\n warnings: FormulaRuntimeMessage[],\r\n questionTranslationKey: string,\r\n ): string {\r\n const intro = this.translocoService.translate(\r\n 'clientForm.warning-confirmation-message',\r\n );\r\n const question = this.translocoService.translate(questionTranslationKey);\r\n const warningLines = [\r\n ...new Set(\r\n warnings\r\n .map((warning) => warning.message?.trim())\r\n .filter((message): message is string => !!message),\r\n ),\r\n ].map((message) => `- ${message}`);\r\n\r\n return [intro, ...warningLines, '', question].join('\\n');\r\n }\r\n\r\n private mapSubmitValidationMessages(\r\n results: ProcessFormValidationRuleResult[],\r\n ): FormulaRuntimeMessage[] {\r\n return results\r\n .filter((result) => !result.passed)\r\n .map((result) => ({\r\n code: result.isEvaluationError\r\n ? 'FORMULA_EVALUATION_ERROR'\r\n : 'FORMULA_FALSE',\r\n severity: result.severity,\r\n message: this.resolveSubmitValidationMessage(result),\r\n ruleId: result.ruleId,\r\n }));\r\n }\r\n\r\n private resolveSubmitValidationMessage(\r\n result: ProcessFormValidationRuleResult,\r\n ): string {\r\n const translatedMessage = this.resolveTranslatableValue(result.message);\r\n if (translatedMessage) {\r\n return translatedMessage;\r\n }\r\n\r\n const errorMessage = result.errorMessage?.trim();\r\n if (errorMessage) {\r\n return errorMessage;\r\n }\r\n\r\n return 'Form validation failed';\r\n }\r\n\r\n private resolveTranslatableValue(\r\n value: ClientFormTranslatableValue | string | null | undefined,\r\n ): string | null {\r\n if (typeof value === 'string') {\r\n const normalized = value.trim();\r\n return normalized.length > 0 ? normalized : null;\r\n }\r\n\r\n if (!value) {\r\n return null;\r\n }\r\n\r\n const lang = this.lang();\r\n const localized =\r\n value.display ?? value[lang] ?? value.en ?? value.ar ?? null;\r\n\r\n if (typeof localized !== 'string') {\r\n return null;\r\n }\r\n\r\n const normalized = localized.trim();\r\n return normalized.length > 0 ? normalized : null;\r\n }\r\n\r\n private resolveStepTimelineState(\r\n stepValue: number,\r\n currentStep: number,\r\n ): StepTimelineState {\r\n if (stepValue < currentStep) {\r\n return 'completed';\r\n }\r\n\r\n if (stepValue === currentStep) {\r\n return 'current';\r\n }\r\n\r\n return 'upcoming';\r\n }\r\n}\r\n","<!-- Client Form Template - render only; step navigation buttons are optional -->\r\n\r\n<!-- Loading State -->\r\n@if (state.loading()) {\r\n <div class=\"flex flex-col gap-6\">\r\n <!-- Section header skeleton -->\r\n <div class=\"flex flex-col gap-4\">\r\n <p-skeleton width=\"30%\" height=\"1.5rem\" />\r\n <div class=\"grid grid-cols-12 gap-4\">\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"40%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"40%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-12 flex flex-col gap-2\">\r\n <p-skeleton width=\"25%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"35%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"45%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Second section skeleton -->\r\n <div class=\"flex flex-col gap-4\">\r\n <p-skeleton width=\"25%\" height=\"1.5rem\" />\r\n <div class=\"grid grid-cols-12 gap-4\">\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"35%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"50%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-12 flex flex-col gap-2\">\r\n <p-skeleton width=\"30%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"5rem\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n}\r\n\r\n<!-- Loaded State -->\r\n@if (state.isLoaded() && !state.loading()) {\r\n <div class=\"flex flex-col gap-4\" *transloco=\"let t; prefix: 'clientForm'\">\r\n @if (previewEntitySections().length > 0) {\r\n <div class=\"flex flex-col gap-3\">\r\n @for (section of previewEntitySections(); track section.key) {\r\n <mt-card [title]=\"section.label\">\r\n <mt-entities-preview [entities]=\"section.entities\" />\r\n </mt-card>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Dynamic Form -->\r\n @if (state.requiresForm() && editableFormConfig(); as config) {\r\n @if (hasEditableFormSections()) {\r\n @if (wizardEnabled()) {\r\n <!-- Wizard Mode: vertical stepper left + form right -->\r\n <div class=\"flex gap-0 min-h-0\">\r\n <!-- Vertical Stepper -->\r\n <div class=\"w-[30%] shrink-0 flex flex-col py-4 px-6\">\r\n @for (\r\n step of stepTimeline();\r\n track step.key;\r\n let first = $first;\r\n let last = $last\r\n ) {\r\n @if (!first) {\r\n <div\r\n class=\"ms-6 w-0.5 h-5 shrink-0\"\r\n [ngClass]=\"\r\n step.beforeLineActive ? 'bg-primary' : 'bg-surface-300'\r\n \"\r\n ></div>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"flex items-center cursor-pointer gap-3 text-left focus-visible:outline-none\"\r\n [attr.aria-pressed]=\"step.selected\"\r\n [attr.aria-current]=\"step.state === 'current' ? 'step' : null\"\r\n [disabled]=\"stepNavigationValidating()\"\r\n (click)=\"onStepChange(step.value)\"\r\n >\r\n <span\r\n class=\"flex h-12 w-12 shrink-0 items-center justify-center rounded text-base font-semibold transition-all duration-200\"\r\n [class]=\"\r\n step.state === 'current'\r\n ? 'ring-2 ring-primary/20 bg-primary text-white '\r\n : step.state === 'completed'\r\n ? 'text-primary bg-primary-100 '\r\n : step.state === 'upcoming'\r\n ? 'bg-primary-100 text-white'\r\n : ''\r\n \"\r\n >\r\n @if (step.state === \"completed\") {\r\n <mt-icon icon=\"general.check\" class=\"text-xl\" />\r\n } @else {\r\n {{ step.value }}\r\n }\r\n </span>\r\n <span\r\n class=\"text-sm leading-5 truncate transition-colors duration-200\"\r\n [ngClass]=\"{\r\n 'font-semibold text-primary': step.state === 'current',\r\n 'font-medium text-surface-700':\r\n step.state === 'completed',\r\n 'font-medium text-surface-400': step.state === 'upcoming',\r\n }\"\r\n dir=\"auto\"\r\n >\r\n {{ step.label }}\r\n </span>\r\n </button>\r\n @if (!last) {\r\n <div\r\n class=\"ms-6 w-0.5 h-5 shrink-0\"\r\n [ngClass]=\"\r\n step.afterLineActive ? 'bg-primary' : 'bg-surface-300'\r\n \"\r\n ></div>\r\n }\r\n }\r\n </div>\r\n <!-- Form Content + Buttons -->\r\n <div class=\"flex-1 flex flex-col gap-4 min-w-0 ps-6\">\r\n @if (runtimeErrors().length > 0 || runtimeWarnings().length > 0) {\r\n <div #validationSummary class=\"flex flex-col gap-3 scroll-mt-4\">\r\n @if (runtimeErrors().length > 0) {\r\n <section class=\"flex flex-col gap-2\">\r\n <p\r\n class=\"m-0 text-xs font-semibold uppercase tracking-[0.18em] text-slate-500\"\r\n >\r\n {{ t(\"validation-errors\") }}\r\n </p>\r\n @for (\r\n msg of runtimeErrors();\r\n track msg.ruleId || msg.fieldKey || msg.message\r\n ) {\r\n <p-message\r\n severity=\"error\"\r\n styleClass=\"w-full\"\r\n [text]=\"msg.message\"\r\n />\r\n }\r\n </section>\r\n }\r\n\r\n @if (runtimeWarnings().length > 0) {\r\n <section class=\"flex flex-col gap-2\">\r\n <p\r\n class=\"m-0 text-xs font-semibold uppercase tracking-[0.18em] text-slate-500\"\r\n >\r\n {{ t(\"validation-warnings\") }}\r\n </p>\r\n @for (\r\n msg of runtimeWarnings();\r\n track msg.ruleId || msg.fieldKey || msg.message\r\n ) {\r\n <p-message\r\n severity=\"warn\"\r\n styleClass=\"w-full\"\r\n [text]=\"msg.message\"\r\n />\r\n }\r\n </section>\r\n }\r\n </div>\r\n }\r\n <mt-dynamic-form\r\n [formConfig]=\"wizardFormConfig() ?? config\"\r\n [formControl]=\"formControl\"\r\n [visibleSectionKeys]=\"visibleSectionKeys()\"\r\n [forcedHiddenFieldKeys]=\"effectiveForcedHiddenFieldKeys()\"\r\n [preserveForcedHiddenValues]=\"true\"\r\n (runtimeMessagesChange)=\"onRuntimeMessagesChange($event)\"\r\n />\r\n @if (showInternalStepActions()) {\r\n <div class=\"flex justify-end gap-2 pt-4 mt-auto\">\r\n <mt-button\r\n [label]=\"'previous' | transloco\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n [disabled]=\"\r\n currentStep() === 1 || stepNavigationValidating()\r\n \"\r\n (onClick)=\"goToPreviousStep()\"\r\n />\r\n <mt-button\r\n [label]=\"'next' | transloco\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\r\n [disabled]=\"\r\n currentStep() === stepSections().length ||\r\n stepNavigationValidating()\r\n \"\r\n [loading]=\"stepNavigationValidating()\"\r\n (onClick)=\"goToNextStep()\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"flex flex-col gap-4\">\r\n @if (runtimeErrors().length > 0 || runtimeWarnings().length > 0) {\r\n <div #validationSummary class=\"flex flex-col gap-3 scroll-mt-4\">\r\n @if (runtimeErrors().length > 0) {\r\n <section class=\"flex flex-col gap-2\">\r\n <p\r\n class=\"m-0 text-xs font-semibold uppercase tracking-[0.18em] text-slate-500\"\r\n >\r\n {{ t(\"validation-errors\") }}\r\n </p>\r\n @for (\r\n msg of runtimeErrors();\r\n track msg.ruleId || msg.fieldKey || msg.message\r\n ) {\r\n <p-message\r\n severity=\"error\"\r\n styleClass=\"w-full\"\r\n [text]=\"msg.message\"\r\n />\r\n }\r\n </section>\r\n }\r\n\r\n @if (runtimeWarnings().length > 0) {\r\n <section class=\"flex flex-col gap-2\">\r\n <p\r\n class=\"m-0 text-xs font-semibold uppercase tracking-[0.18em] text-slate-500\"\r\n >\r\n {{ t(\"validation-warnings\") }}\r\n </p>\r\n @for (\r\n msg of runtimeWarnings();\r\n track msg.ruleId || msg.fieldKey || msg.message\r\n ) {\r\n <p-message\r\n severity=\"warn\"\r\n styleClass=\"w-full\"\r\n [text]=\"msg.message\"\r\n />\r\n }\r\n </section>\r\n }\r\n </div>\r\n }\r\n\r\n @if (stepsEnabled()) {\r\n <div class=\"flex flex-col gap-4\">\r\n <div class=\"overflow-x-auto pb-2\">\r\n <div class=\"flex min-w-[36rem] items-start\">\r\n @for (\r\n step of stepTimeline();\r\n track step.key;\r\n let first = $first;\r\n let last = $last\r\n ) {\r\n <div\r\n class=\"relative flex min-w-[8rem] flex-1 justify-center\"\r\n >\r\n @if (!rtl() && !first) {\r\n <span\r\n class=\"absolute top-5 left-0 right-1/2 h-0.5\"\r\n [ngClass]=\"\r\n step.beforeLineActive\r\n ? 'bg-primary'\r\n : 'bg-surface-300'\r\n \"\r\n ></span>\r\n }\r\n @if (!rtl() && !last) {\r\n <span\r\n class=\"absolute top-5 left-1/2 right-0 h-0.5\"\r\n [ngClass]=\"\r\n step.afterLineActive\r\n ? 'bg-primary'\r\n : 'bg-surface-300'\r\n \"\r\n ></span>\r\n }\r\n @if (rtl() && !last) {\r\n <span\r\n class=\"absolute top-5 left-0 right-1/2 h-0.5\"\r\n [ngClass]=\"\r\n step.afterLineActive\r\n ? 'bg-primary'\r\n : 'bg-surface-300'\r\n \"\r\n ></span>\r\n }\r\n @if (rtl() && !first) {\r\n <span\r\n class=\"absolute top-5 left-1/2 right-0 h-0.5\"\r\n [ngClass]=\"\r\n step.beforeLineActive\r\n ? 'bg-primary'\r\n : 'bg-surface-300'\r\n \"\r\n ></span>\r\n }\r\n\r\n <button\r\n type=\"button\"\r\n class=\"relative z-10 flex w-full flex-col items-center gap-3 px-2 text-center focus-visible:outline-none\"\r\n [attr.aria-pressed]=\"step.selected\"\r\n [attr.aria-current]=\"\r\n step.state === 'current' ? 'step' : null\r\n \"\r\n [attr.title]=\"step.label\"\r\n [disabled]=\"stepNavigationValidating()\"\r\n (click)=\"onStepChange(step.value)\"\r\n >\r\n <span\r\n class=\"flex h-10 w-10 cursor-pointer items-center justify-center rounded-full border text-sm font-semibold transition-all duration-200\"\r\n [ngClass]=\"{\r\n 'border-primary bg-primary text-surface-0 ring-4 ring-primary/10':\r\n step.state === 'completed' ||\r\n step.state === 'current',\r\n\r\n 'border-surface-300 bg-white text-surface-500':\r\n step.state === 'upcoming',\r\n }\"\r\n >\r\n {{ step.value }}\r\n </span>\r\n <span\r\n class=\"max-w-[8rem] text-center text-sm leading-5 transition-colors duration-200\"\r\n [ngClass]=\"{\r\n 'font-semibold text-primary':\r\n step.selected || step.state === 'current',\r\n 'font-medium text-surface-700':\r\n step.state === 'completed' && !step.selected,\r\n 'font-medium text-surface-500':\r\n step.state === 'upcoming',\r\n }\"\r\n dir=\"auto\"\r\n >\r\n {{ step.label }}\r\n </span>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (showInternalStepActions()) {\r\n <div class=\"flex justify-between gap-2\">\r\n <mt-button\r\n [label]=\"'previous' | transloco\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n [disabled]=\"\r\n currentStep() === 1 || stepNavigationValidating()\r\n \"\r\n (onClick)=\"goToPreviousStep()\"\r\n />\r\n <mt-button\r\n [label]=\"'next' | transloco\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\r\n [disabled]=\"\r\n currentStep() === stepSections().length ||\r\n stepNavigationValidating()\r\n \"\r\n [loading]=\"stepNavigationValidating()\"\r\n (onClick)=\"goToNextStep()\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n @if (tabsEnabled()) {\r\n <mt-tabs\r\n [active]=\"currentStep()\"\r\n (activeChange)=\"onStepChange($event)\"\r\n [options]=\"tabOptions()\"\r\n size=\"small\"\r\n fluid\r\n />\r\n }\r\n <mt-dynamic-form\r\n [formConfig]=\"config\"\r\n [formControl]=\"formControl\"\r\n [visibleSectionKeys]=\"visibleSectionKeys()\"\r\n [forcedHiddenFieldKeys]=\"effectiveForcedHiddenFieldKeys()\"\r\n [preserveForcedHiddenValues]=\"true\"\r\n (runtimeMessagesChange)=\"onRuntimeMessagesChange($event)\"\r\n />\r\n </div>\r\n }\r\n }\r\n } @else if (previewEntitySections().length === 0) {\r\n <div\r\n class=\"flex items-center justify-center p-6 rounded-lg bg-surface-50 border border-surface-200 border-dashed\"\r\n >\r\n <p class=\"text-sm text-muted-color\">\r\n No form required for this operation.\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n}\r\n","// ============================================================================\r\n// API Response Wrapper\r\n// ============================================================================\r\n\r\nexport interface Response<T> {\r\n endpoint: string;\r\n status: number;\r\n code: number;\r\n locale: string;\r\n message?: string | null;\r\n errors?: any | null;\r\n data: T;\r\n cacheSession?: string;\r\n}\r\n\r\n// ============================================================================\r\n// Process Form Mode\r\n// ============================================================================\r\n\r\nexport type ProcessFormMode = 'Approval' | 'Direct';\r\nexport type ProcessFormSubmitStatus = 'PendingApproval' | 'Executed';\r\nexport type OperationType = 'FormOperation' | 'ActionOperation';\r\nexport type ProcessFormSource = 'Step' | 'None';\r\nexport type ClientFormResolvedRenderMode = 'form' | 'steps' | 'tabs' | 'wizard';\r\nexport type ClientFormFooterActionMode = 'loading' | 'steps' | 'submit';\r\n\r\nexport interface ClientFormFooterState {\r\n loading: boolean;\r\n isLoaded: boolean;\r\n renderMode: ClientFormResolvedRenderMode;\r\n actionMode: ClientFormFooterActionMode;\r\n stepNavigationEnabled: boolean;\r\n sectionNavigationEnabled: boolean;\r\n currentStep: number;\r\n stepCount: number;\r\n canGoToPreviousStep: boolean;\r\n canGoToNextStep: boolean;\r\n showPreviousStep: boolean;\r\n showNextStep: boolean;\r\n showSubmit: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Load Request / Response\r\n// ============================================================================\r\n\r\nexport interface ProcessFormLoadRequest {\r\n moduleKey: string;\r\n operationKey: string;\r\n moduleId?: number | string;\r\n levelId?: number | string;\r\n levelDataId?: number | string;\r\n moduleDataId?: number | string;\r\n requestSchemaId?: number;\r\n draftProcessId?: number;\r\n preview?: boolean;\r\n}\r\n\r\nexport interface ProcessFormLoadResponse {\r\n mode: ProcessFormMode;\r\n formSource: ProcessFormSource;\r\n requiresForm: boolean;\r\n requestSchemaId: number | null;\r\n requestId: number | null;\r\n stepId: number | null;\r\n stepSchemaId: number | null;\r\n stepName: string | null;\r\n formConfiguration: ClientFormConfiguration | null;\r\n values: ProcessFormValue[];\r\n context: ProcessFormContext;\r\n}\r\n\r\n// ============================================================================\r\n// Submit Request / Response\r\n// ============================================================================\r\n\r\nexport interface ProcessFormSubmitRequest {\r\n moduleKey: string;\r\n operationKey: string;\r\n moduleId?: number | string;\r\n levelId?: number | string;\r\n levelDataId?: number | string;\r\n moduleDataId?: number | string;\r\n recordId?: number | string;\r\n requestSchemaId?: number;\r\n returnUrl?: string;\r\n fields: ProcessFormSubmitField[];\r\n}\r\n\r\nexport interface ProcessFormValidationRuntimeResult {\r\n isValid: boolean;\r\n hasBlockingFailures: boolean;\r\n results: ProcessFormValidationRuleResult[];\r\n}\r\n\r\nexport interface ProcessFormValidationRuleResult {\r\n ruleId: string | number;\r\n message?: ClientFormTranslatableValue | string | null;\r\n severity: 'error' | 'warning';\r\n passed: boolean;\r\n isBlocking: boolean;\r\n isEvaluationError: boolean;\r\n errorMessage?: string | null;\r\n}\r\n\r\nexport interface ClientFormSubmitRequestMapperContext {\r\n formValue: Record<string, any>;\r\n loadResponse: ProcessFormLoadResponse;\r\n}\r\n\r\nexport type ClientFormSubmitRequestMapper = (\r\n request: ProcessFormSubmitRequest,\r\n context: ClientFormSubmitRequestMapperContext,\r\n) => ProcessFormSubmitRequest;\r\n\r\nexport interface ProcessFormSubmitField {\r\n requestPropertyId?: number;\r\n propertyKey: string;\r\n value: any;\r\n}\r\n\r\nexport type ProcessFormSubmitValue = ProcessFormSubmitField;\r\n\r\nexport interface ProcessFormSubmitResponse {\r\n status: ProcessFormSubmitStatus;\r\n moduleKey: string;\r\n operationKey: string;\r\n recordId: number | null;\r\n levelId: number | null;\r\n levelDataId: number | null;\r\n requestSchemaId?: number | null;\r\n requestId?: number | null;\r\n resultModuleKey?: string | null;\r\n resultModuleId?: number | null;\r\n record?: ProcessFormSubmitRecord | null;\r\n}\r\n\r\nexport interface ProcessFormSubmitRecord {\r\n fields: ProcessFormSubmitRecordField[];\r\n}\r\n\r\nexport interface ProcessFormSubmitRecordField {\r\n id: number;\r\n key: string;\r\n normalizedKey: string;\r\n label: string;\r\n viewType: string;\r\n configuration: Record<string, unknown> | null;\r\n source: string;\r\n order: number;\r\n isRequired: boolean;\r\n isSystem: boolean;\r\n raw: any;\r\n value: any;\r\n display?: string | null;\r\n}\r\n\r\n// ============================================================================\r\n// Values & Context\r\n// ============================================================================\r\n\r\nexport interface ProcessFormValue {\r\n propertyKey: string;\r\n rawValue?: any;\r\n value: any;\r\n metadata?: ProcessFormValueMetadata;\r\n}\r\n\r\nexport interface ProcessFormValueMetadata {\r\n propertyId: number;\r\n key: string;\r\n viewType: string;\r\n source: string;\r\n}\r\n\r\nexport interface ProcessFormContext {\r\n moduleKey: string;\r\n operationKey: string;\r\n moduleId: number | null;\r\n levelId: number | null;\r\n levelDataId: number | null;\r\n moduleDataId: number | null;\r\n requestSchemaId: number | null;\r\n requestId: number | null;\r\n stepId: number | null;\r\n stepSchemaId: number | null;\r\n preview: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Form Configuration (runtime shape — no _pending/_deleting)\r\n// ============================================================================\r\n\r\nexport type ClientFieldWidth = '25' | '50' | '100';\r\nexport type ClientFormRenderMode =\r\n | 'sections'\r\n | 'steps'\r\n | 'tabs'\r\n | 'wizard'\r\n | undefined;\r\n\r\nexport interface ClientFormConfiguration {\r\n isActive?: boolean;\r\n renderMode?: ClientFormRenderMode;\r\n sections: ClientFormSection[];\r\n validations?: ClientValidationRule[];\r\n}\r\n\r\nexport interface ClientFormSection {\r\n id: string;\r\n name: {\r\n en: string;\r\n ar: string;\r\n };\r\n order: number;\r\n fields: ClientFormField[];\r\n}\r\n\r\nexport interface ClientFormField {\r\n id: string;\r\n sectionId: string;\r\n propertyKey: string;\r\n /** Runtime property metadata returned by the API */\r\n propertyMetadata: ClientPropertyItem;\r\n width: ClientFieldWidth;\r\n order: number;\r\n hiddenInCreation?: boolean;\r\n hiddenInEditForm?: boolean;\r\n isRequired?: boolean;\r\n isRead?: boolean;\r\n isWrite?: boolean;\r\n showConditionalDisplayFormula?: boolean;\r\n conditionalDisplayFormula?: string;\r\n}\r\n\r\nexport interface ClientPropertyItem {\r\n key: string;\r\n propertyId?: number;\r\n isCalculated?: boolean;\r\n name:\r\n | string\r\n | {\r\n display?: string;\r\n en?: string;\r\n ar?: string;\r\n [k: string]: string | undefined;\r\n };\r\n viewType?: string;\r\n source?: string;\r\n configuration?: Record<string, unknown> | null;\r\n [key: string]: any;\r\n}\r\n\r\nexport interface ClientFormTranslatableValue {\r\n display?: string;\r\n en?: string;\r\n ar?: string;\r\n [key: string]: string | undefined;\r\n}\r\n\r\nexport interface ClientValidationRule {\r\n id: string | number;\r\n formulaTokens: string;\r\n formulaText: string;\r\n message: {\r\n en: string;\r\n ar: string;\r\n };\r\n severity: 'error' | 'warning';\r\n enabled: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Lookup Definitions (passed as input to ClientForm)\r\n// ============================================================================\r\n\r\nexport interface ClientLookup {\r\n id: number;\r\n key: string;\r\n name: { display?: string; ar?: string; en?: string };\r\n items: ClientLookupItem[];\r\n}\r\n\r\nexport interface ClientLookupItem {\r\n id: number;\r\n lookupId: number;\r\n key: string;\r\n name: { display?: string; ar?: string; en?: string };\r\n description?: { display?: string; ar?: string; en?: string };\r\n color?: string;\r\n order: number;\r\n}\r\n\r\n// ============================================================================\r\n// Legacy Command Interception\r\n// ============================================================================\r\n\r\nexport interface FormRequiredInterception {\r\n requestSchemaId: number;\r\n operationType: OperationType;\r\n status: 'FormRequired';\r\n message: string;\r\n levelId: number;\r\n levelDataId: number;\r\n moduleDataId: number;\r\n}\r\n\r\n/**\r\n * Type guard to detect a FormRequired interception response from legacy commands.\r\n * Use in HTTP interceptors to redirect to process-form runtime flow.\r\n */\r\nexport function isFormRequiredInterception(\r\n response: any,\r\n): response is FormRequiredInterception {\r\n return (\r\n response?.status === 'FormRequired' &&\r\n typeof response?.requestSchemaId === 'number'\r\n );\r\n}\r\n","// Client Form - Runtime process form component\r\nexport * from './client-form';\r\nexport * from './models/client-form.model';\r\nexport * from './services/client-form-api.service';\r\nexport * from './services/client-form-state.service';\r\nexport * from './utils/form-config-mapper';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAmBA;;;AAGG;MAEU,oBAAoB,CAAA;AACd,IAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;AAE1C;;;AAGG;AACH,IAAA,IAAI,CACF,OAA+B,EAAA;QAE/B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,mBAAmB,EACnB,OAAO,CACR;IACH;AAEA;;;;AAIG;AACH,IAAA,MAAM,CACJ,OAAiC,EAAA;QAEjC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,gBAAgB,EAChB,OAAO,CACR;IACH;AAEA;;;AAGG;AACH,IAAA,QAAQ,CACN,OAAiC,EAAA;QAEjC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,yBAAyB,EACzB,OAAO,CACR;IACH;AAEA;;;AAGG;AACH,IAAA,cAAc,CACZ,WAA4B,EAAA;QAE5B,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,CAAA,UAAA,EAAa,WAAW,CAAA,aAAA,CAAe,CACxC;IACH;uGArDW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAApB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cADP,MAAM,EAAA,CAAA;;2FACnB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACXlC;;;;;;AAMG;MAEU,sBAAsB,CAAA;;;;AAKxB,IAAA,OAAO,GAAG,MAAM,CAAC,KAAK,8EAAC;AACvB,IAAA,UAAU,GAAG,MAAM,CAAC,KAAK,iFAAC;AAC1B,IAAA,KAAK,GAAG,MAAM,CAAgB,IAAI,4EAAC;AACnC,IAAA,WAAW,GAAG,MAAM,CAAgB,IAAI,kFAAC;AACzC,IAAA,YAAY,GAAG,MAAM,CAAiC,IAAI,mFAAC;AAC3D,IAAA,cAAc,GAAG,MAAM,CAAmC,IAAI,qFAAC;;;;AAM/D,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,+EAAC;AAEhD,IAAA,IAAI,GAAG,QAAQ,CACtB,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,IAAI,IAAI,2EACxC;AAEQ,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,KAAK,UAAU,iFAAC;AACvD,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,KAAK,QAAQ,+EAAC;AAEnD,IAAA,UAAU,GAAG,QAAQ,CAC5B,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,UAAU,IAAI,IAAI,iFAC9C;AAEQ,IAAA,YAAY,GAAG,QAAQ,CAC9B,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,YAAY,IAAI,KAAK,mFACjD;AAEQ,IAAA,iBAAiB,GAAG,QAAQ,CACnC,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,iBAAiB,IAAI,IAAI,wFACrD;AAEQ,IAAA,MAAM,GAAG,QAAQ,CACxB,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,IAAI,EAAE,6EACxC;AAEQ,IAAA,OAAO,GAAG,QAAQ,CACzB,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,OAAO,IAAI,IAAI,8EAC3C;AAEQ,IAAA,QAAQ,GAAG,QAAQ,CAC1B,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,QAAQ,IAAI,IAAI,+EAC5C;AAEQ,IAAA,eAAe,GAAG,QAAQ,CACjC,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,eAAe,IAAI,IAAI,sFACnD;AAEQ,IAAA,SAAS,GAAG,QAAQ,CAC3B,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,SAAS,IAAI,IAAI,gFAC7C;AAEQ,IAAA,MAAM,GAAG,QAAQ,CACxB,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,IAAI,IAAI,6EAC1C;AAEQ,IAAA,YAAY,GAAG,QAAQ,CAC9B,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,YAAY,IAAI,IAAI,mFAChD;;;;;IAOQ,aAAa,GAAG,QAAQ,CAAqB,MACpD,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,gBAAgB,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACrE;;IAGQ,UAAU,GAAG,QAAQ,CAAqB,MACjD,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,gBAAgB,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACrE;;;;AAMQ,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,kFAAC;AAErD,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,EAAE,MAAM,IAAI,IAAI,mFAAC;AAEpE,IAAA,iBAAiB,GAAG,QAAQ,CACnC,MAAM,IAAI,CAAC,YAAY,EAAE,KAAK,iBAAiB,wFAChD;AAEQ,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,KAAK,UAAU,iFAAC;;;;AAMxE,IAAA,eAAe,CAAC,QAAiC,EAAA;AAC/C,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC/B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;IACtB;AAEA,IAAA,iBAAiB,CAAC,QAAmC,EAAA;AACnD,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC;AACjC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;IAC5B;AAEA,IAAA,QAAQ,CAAC,OAAe,EAAA;AACtB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;AACvB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IACzB;AAEA,IAAA,cAAc,CAAC,OAAe,EAAA;AAC5B,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC;AAC7B,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;IAC5B;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;IAC/B;uGA5HW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAtB,sBAAsB,EAAA,CAAA;;2FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBADlC;;;ACgBD;AACA;AACA;AAEA,MAAM,gBAAgB,GAA2B;AAC/C,IAAA,IAAI,EAAE,CAAC;AACP,IAAA,IAAI,EAAE,CAAC;AACP,IAAA,KAAK,EAAE,EAAE;CACV;AAED,MAAM,oBAAoB,GAA+B;AACvD,IAAA,IAAI,EAAE,CAAC;AACP,IAAA,IAAI,EAAE,EAAE;AACR,IAAA,KAAK,EAAE,EAAE;CACV;AAcD;AACA;AACA;AAEA;;;;;;;;;AASG;AACG,SAAU,sBAAsB,CACpC,MAA+B,EAC/B,IAAA,GAAoB,IAAI,EACxB,IAAA,GAA0B,QAAQ,EAClC,UAA0B,EAAE,EAC5B,UAAqC,IAAI,EACzC,QAAQ,GAAG,KAAK,EAChB,iBAAA,GAAwC,EAAE,EAAA;IAE1C,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC;AACd,aAAA,KAAK;AACL,aAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK;AAChC,aAAA,GAAG,CAAC,CAAC,OAAO,KAAI;AACf,YAAA,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AAElE,YAAA,MAAM,aAAa,GAAG,OAAO,CAAC;AAC3B,iBAAA,MAAM,CAAC,CAAC,KAAK,KAAI;;gBAEhB,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK;AAAE,oBAAA,OAAO,KAAK;gBAClE,IAAI,IAAI,KAAK,QAAQ;AAAE,oBAAA,OAAO,CAAC,KAAK,CAAC,gBAAgB;AACrD,gBAAA,OAAO,CAAC,KAAK,CAAC,gBAAgB;AAChC,YAAA,CAAC;AACA,iBAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;YAEpC,OAAO;gBACL,GAAG,EAAE,OAAO,CAAC,EAAE;AACf,gBAAA,KAAK,EAAE,WAAW;AAClB,gBAAA,IAAI,EAAE,QAAiB;AACvB,gBAAA,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,KAC9B,gBAAgB,CACd,KAAK,EACL,IAAI,EACJ,OAAO,EACP,OAAO,EACP,QAAQ,EACR,iBAAiB,CAClB,CACF;aACF;AACH,QAAA,CAAC;AACA,aAAA,MAAM,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;KAClD;AACH;AAEA;;;;;AAKG;AACG,SAAU,oBAAoB,CAClC,MAA0B,EAC1B,MAAuC,EAAA;IAEvC,MAAM,MAAM,GAAwB,EAAE;AACtC,IAAA,MAAM,QAAQ,GAAG,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,GAAG,IAAI;AAE3D,IAAA,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE;AACtB,QAAA,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,gBAAgB;YAAE;AAE7C,QAAA,MAAM,cAAc,GAClB,qBAAqB,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,IAAI,IAAI;AAC7D,QAAA,IAAI,CAAC,cAAc;YAAE;QAErB,MAAM,CAAC,cAAc,CAAC,GAAG,uBAAuB,CAAC,CAAC,CAAC;IACrD;AAEA,IAAA,OAAO,MAAM;AACf;AAEA;;;;;AAKG;AACG,SAAU,0BAA0B,CACxC,SAA8B,EAC9B,YAAqC,EAAA;AAErC,IAAA,MAAM,aAAa,GAAG,IAAI,GAAG,EAG1B;IAEH,KAAK,MAAM,OAAO,IAAI,YAAY,CAAC,iBAAiB,EAAE,QAAQ,IAAI,EAAE,EAAE;QACpE,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE,EAAE;YACxC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC;AACxD,YAAA,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE;gBACnC,UAAU;gBACV,QAAQ;AACT,aAAA,CAAC;QACJ;IACF;AAEA,IAAA,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS;SAC5B,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,KAAI;AAC/B,QAAA,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;AAAE,YAAA,OAAO,KAAK;QACvD,OAAO,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,QAAQ,KAAK,cAAc;AACpE,IAAA,CAAC;SACA,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,KAAI;QAC5B,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC;QAC3C,MAAM,eAAe,GAAG,oBAAoB,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC;QACnE,IAAI,eAAe,KAAK,SAAS,IAAI,eAAe,KAAK,IAAI,EAAE;AAC7D,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,MAAM,WAAW,GAA2B;YAC1C,WAAW;AACX,YAAA,KAAK,EAAE,eAAe;SACvB;AAED,QAAA,IAAI,IAAI,EAAE,UAAU,EAAE;AACpB,YAAA,WAAW,CAAC,iBAAiB,GAAG,IAAI,CAAC,UAAU;QACjD;AAEA,QAAA,OAAO,WAAW;AACpB,IAAA,CAAC;SACA,MAAM,CAAC,CAAC,KAAK,KAAsC,CAAC,CAAC,KAAK,CAAC;AAChE;AAEM,SAAU,uBAAuB,CACrC,MAA+B,EAC/B,OAA0B,QAAQ,EAClC,QAAQ,GAAG,KAAK,EAAA;AAEhB,IAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,KACrC,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE;AAClB,SAAA,MAAM,CACL,CAAC,KAAK,KACJ,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,kBAAkB,CAAC,KAAK,EAAE,QAAQ,CAAC;SAErE,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,WAAW,CAAC,CACrC;AACH;AAEM,SAAU,0BAA0B,CACxC,MAA+B,EAC/B,MAA0B,EAC1B,IAAA,GAA0B,QAAQ,EAClC,QAAQ,GAAG,KAAK,EAAA;IAEhB,OAAO,4BAA4B,CACjC,MAAM,EACN,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,QAAQ,CACT,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC;AAC1C;AAEM,SAAU,4BAA4B,CAC1C,MAA+B,EAC/B,MAA0B,EAC1B,IAAA,GAAoB,IAAI,EACxB,IAAA,GAA0B,QAAQ,EAClC,QAAQ,GAAG,KAAK,EAAA;AAEhB,IAAA,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC;AAC3C,IAAA,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAe;AAEhD,IAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAC1B,QAAA,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,gBAAgB;YAAE;AAEjD,QAAA,MAAM,cAAc,GAClB,qBAAqB,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,KAAK,CAAC,WAAW,IAAI,IAAI;AACrE,QAAA,IAAI,CAAC,cAAc;YAAE;QAErB,iBAAiB,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,KAAK,CAAC;IACpD;IAEA,OAAO,MAAM,CAAC;AACX,SAAA,KAAK;AACL,SAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK;AAChC,SAAA,GAAG,CAAC,CAAC,OAAO,MAAM;QACjB,GAAG,EAAE,OAAO,CAAC,EAAE;AACf,QAAA,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE;QAClD,KAAK,EAAE,OAAO,CAAC,KAAK;AACpB,QAAA,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE;AAC5B,aAAA,MAAM,CACL,CAAC,KAAK,KACJ,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,kBAAkB,CAAC,KAAK,EAAE,QAAQ,CAAC;AAErE,aAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK;AAChC,aAAA,GAAG,CAAC,CAAC,KAAK,KAAI;AACb,YAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,gBAAgB;YAEvC,OAAO;AACL,gBAAA,GAAI,QAAuB;AAC3B,gBAAA,IAAI,EAAG,QAAQ,CAAC,IAAY,EAAE,OAAO;AACrC,gBAAA,GAAG,EAAE,QAAQ,CAAC,GAAG,IAAI,KAAK,CAAC,WAAW;gBACtC,KAAK,EAAE,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;gBAC/C,KAAK,EAAE,OAAO,CAAC,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC,KAAK;AACzC,gBAAA,aAAa,EAAE;oBACb,GAAI,QAAQ,CAAC,aAAyC;oBACtD,IAAI,EAAE,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;AAC7C,oBAAA,aAAa,EAAE,KAAK;AACrB,iBAAA;aACmB;AACxB,QAAA,CAAC,CAAC;AACL,KAAA,CAAC;AACD,SAAA,MAAM,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;AACrD;AAEA;AACA;AACA;AAEA,SAAS,cAAc,CACrB,KAAsB,EACtB,IAAuB,EAAA;IAEvB,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;AAAE,QAAA,OAAO,KAAK;IACnE,IAAI,IAAI,KAAK,QAAQ;AAAE,QAAA,OAAO,CAAC,KAAK,CAAC,gBAAgB;AACrD,IAAA,OAAO,CAAC,KAAK,CAAC,gBAAgB;AAChC;AAEA,SAAS,kBAAkB,CAAC,KAAsB,EAAE,QAAQ,GAAG,KAAK,EAAA;AAClE,IAAA,OAAO,eAAe,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC;AACxE;AAEA,SAAS,eAAe,CAAC,KAAsB,EAAA;IAC7C,OAAO,KAAK,CAAC,MAAM,KAAK,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;AACzD;AAEA,SAAS,iBAAiB,CAAC,KAAsB,EAAA;AAC/C,IAAA,OAAO,KAAK,CAAC,gBAAgB,EAAE,YAAY,KAAK,IAAI;AACtD;AAEA,SAAS,gBAAgB,CAAC,KAAsB,EAAA;AAK9C,IAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,gBAAgB;IACvC,OAAO;QACL,QAAQ;QACR,UAAU,EAAE,QAAQ,EAAE,UAAU;AAChC,QAAA,QAAQ,EAAE,QAAQ,EAAE,QAAQ,IAAI,MAAM;KACvC;AACH;AAEA,SAAS,gBAAgB,CACvB,KAAsB,EACtB,IAAiB,EACjB,OAAuB,EACvB,OAAkC,EAClC,QAAQ,GAAG,KAAK,EAChB,oBAAwC,EAAE,EAAA;AAE1C,IAAA,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC;AAC5D,IAAA,MAAM,KAAK,GACR,IAAI,EAAE,IAAyC,EAAE,OAAO;QACzD,KAAK,CAAC,WAAW;IACnB,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;AAEnD,IAAA,MAAM,IAAI,GAAG;QACX,GAAG,EAAE,KAAK,CAAC,WAAW;QACtB,KAAK;QACL,OAAO;QACP,KAAK,EAAE,KAAK,CAAC,KAAK;AAClB,QAAA,WAAW,EAAE,KAAK;AAClB,QAAA,QAAQ,EAAE,KAAK,CAAC,UAAU,IAAI,KAAK;AACnC,QAAA,QAAQ,EAAE,iBAAiB,CAAC,KAAK,CAAC;AAClC,QAAA,QAAQ,EAAE,QAAQ,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK;QAC7C,UAAU,EAAE,KAAK,CAAC;cACd,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA,EAAG,KAAK,CAAA,YAAA,CAAc,CAAC;AACnD,cAAE,EAAE;AACN,QAAA,gBAAgB,EAAE,qBAAqB,CAAC,KAAK,CAAC;KAC/C;IAED,QAAQ,QAAQ;;AAEd,QAAA,KAAK,MAAM;AACX,QAAA,KAAK,kBAAkB;AACvB,QAAA,KAAK,WAAW;AACd,YAAA,OAAO,IAAI,eAAe,CAAC,IAAI,CAAC;AAElC,QAAA,KAAK,UAAU;AACb,YAAA,OAAO,IAAI,iBAAiB,CAAC,IAAI,CAAC;;AAGpC,QAAA,KAAK,QAAQ;AACX,YAAA,OAAO,IAAI,iBAAiB,CAAC,IAAI,CAAC;AAEpC,QAAA,KAAK,UAAU;YACb,OAAO,IAAI,iBAAiB,CAAC;AAC3B,gBAAA,GAAG,IAAI;AACP,gBAAA,WAAW,EAAE,IAAI;AAClB,aAAA,CAAC;AAEJ,QAAA,KAAK,YAAY;YACf,OAAO,IAAI,iBAAiB,CAAC;AAC3B,gBAAA,GAAG,IAAI;AACP,gBAAA,GAAG,EAAE,CAAC;AACN,gBAAA,GAAG,EAAE,GAAG;AACR,gBAAA,IAAI,EAAE,GAAG;AACV,aAAA,CAAC;;AAGJ,QAAA,KAAK,MAAM;AACT,YAAA,OAAO,IAAI,eAAe,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAE1D,QAAA,KAAK,UAAU;AACb,YAAA,OAAO,IAAI,eAAe,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAEzD,QAAA,KAAK,MAAM;AACT,YAAA,OAAO,IAAI,eAAe,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;AAGzD,QAAA,KAAK,UAAU;AACb,YAAA,OAAO,IAAI,iBAAiB,CAAC,IAAI,CAAC;;QAGpC,KAAK,YAAY,EAAE;YACjB,MAAM,UAAU,GACb,IAAI,EAAE,aAAa,GAAG,YAAY,CAAa,IAAI,KAAK;YAC3D,OAAO,IAAI,qBAAqB,CAAC;AAC/B,gBAAA,GAAG,IAAI;AACP,gBAAA,QAAQ,EAAE,UAAU;AACrB,aAAA,CAAC;QACJ;;QAGA,KAAK,MAAM,EAAE;YACX,MAAM,eAAe,GAAG,CAAC,CAAC,IAAI,EAAE,aAAa,GAAG,iBAAiB,CAAC;YAClE,IAAI,eAAe,EAAE;gBACnB,OAAO,IAAI,iBAAiB,CAAC;AAC3B,oBAAA,GAAG,IAAI;AACP,oBAAA,OAAO,EAAE,iBAAiB;AAC1B,oBAAA,WAAW,EAAE,OAAO;AACpB,oBAAA,WAAW,EAAE,OAAO;AACpB,oBAAA,MAAM,EAAE,iBAAiB,CAAC,MAAM,GAAG,EAAE;oBACrC,SAAS,EAAE,EAAE,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC;AACxC,iBAAA,CAAC;YACJ;YACA,OAAO,IAAI,qBAAqB,CAAC;AAC/B,gBAAA,GAAG,IAAI;AACP,gBAAA,MAAM,EAAE,gBAAgB;gBACxB,OAAO,EAAE,IAAI,WAAW,EAAE,CAAC,GAAG,CAAC,eAAe,EAAE;AAC9C,oBAAA,UAAU,EAAE,KAAK;iBAClB,CAAC;AACH,aAAA,CAAC;QACJ;AAEA,QAAA,KAAK,WAAW;YACd,OAAO,IAAI,qBAAqB,CAAC;AAC/B,gBAAA,GAAG,IAAI;AACP,gBAAA,MAAM,EAAE,gBAAgB;AACxB,gBAAA,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,IAAI,WAAW,EAAE,CAAC,GAAG,CAAC,eAAe,EAAE;AAC9C,oBAAA,UAAU,EAAE,KAAK;iBAClB,CAAC;AACH,aAAA,CAAC;;QAGJ,KAAK,QAAQ,EAAE;YACb,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC;YACjD,OAAO,IAAI,iBAAiB,CAAC;AAC3B,gBAAA,GAAG,IAAI;AACP,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,WAAW,EAAE,OAAO;AACpB,gBAAA,WAAW,EAAE,OAAO;AACpB,gBAAA,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,EAAE;gBACzB,SAAS,EAAE,EAAE,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC;AACxC,aAAA,CAAC;QACJ;;QAGA,KAAK,mBAAmB,EAAE;YACxB,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC;YACjD,OAAO,IAAI,sBAAsB,CAAC;AAChC,gBAAA,GAAG,IAAI;AACP,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,WAAW,EAAE,OAAO;AACpB,gBAAA,WAAW,EAAE,OAAO;AACpB,gBAAA,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,EAAE;AACzB,gBAAA,OAAO,EAAE,MAAM;AAChB,aAAA,CAAC;QACJ;;AAGA,QAAA,KAAK,QAAQ;AACb,QAAA,KAAK,gBAAgB;AACrB,QAAA,KAAK,aAAa;AAClB,QAAA,KAAK,KAAK;QACV,KAAK,UAAU,EAAE;AACf,YAAA,MAAM,OAAO,GAAG,0BAA0B,CAAC,IAAI,CAAC;YAChD,OAAO,IAAI,iBAAiB,CAAC;AAC3B,gBAAA,GAAG,IAAI;gBACP,OAAO,EAAE,OAAO,IAAI,EAAE;AACtB,gBAAA,WAAW,EAAE,OAAO;AACpB,gBAAA,WAAW,EAAE,OAAO;AACrB,aAAA,CAAC;QACJ;AAEA,QAAA,KAAK,cAAc;YACjB,OAAO,4BAA4B,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC;;QAG1D,KAAK,YAAY,EAAE;AACjB,YAAA,MAAM,gBAAgB,GAAG,IAAI,EAAE,aAAa,IAAI,EAAE;YAClD,OAAO,IAAI,2BAA2B,CAAC;AACrC,gBAAA,GAAG,IAAI;AACP,gBAAA,aAAa,EAAE,gBAAgB;AAChC,aAAA,CAAC;QACJ;AACA,QAAA,KAAK,aAAa;YAChB,OAAO,IAAI,8BAA8B,CAAC;AACxC,gBAAA,GAAG,IAAI;AACP,gBAAA,aAAa,EAAE,IAAI,EAAE,aAAa,IAAI,IAAI;AAC1C,gBAAA,cAAc,EAAE;AACd,sBAAE;wBACE,OAAO,EAAE,OAAO,CAAC,OAAO;wBACxB,WAAW,EAAE,OAAO,CAAC,WAAW;wBAChC,YAAY,EAAE,OAAO,CAAC,YAAY;AACnC;AACH,sBAAE,IAAI;AACT,aAAA,CAAC;;AAGJ,QAAA;AACE,YAAA,OAAO,IAAI,eAAe,CAAC,IAAI,CAAC;;AAEtC;AAEA,SAAS,qBAAqB,CAC5B,KAAsB,EAAA;IAEtB,IAAI,CAAC,KAAK,CAAC,6BAA6B;AAAE,QAAA,OAAO,SAAS;AAC1D,IAAA,MAAM,aAAa,GAAG,CAAC,KAAK,CAAC,yBAAyB,IAAI,EAAE,EAAE,IAAI,EAAE;AACpE,IAAA,IAAI,CAAC,aAAa;AAAE,QAAA,OAAO,SAAS;IAEpC,OAAO;QACL,aAAa;AACb,QAAA,WAAW,EAAE,KAAK,CAAC,yBAAyB,IAAI,EAAE;AAClD,QAAA,IAAI,EAAE,MAAM;KACb;AACH;AAEA;;;;;AAKG;AACH,SAAS,oBAAoB,CAC3B,IAAoC,EACpC,OAAuB,EAAA;AAEvB,IAAA,OAAO,wBAAwB,CAC7B,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,QAAQ,CAAC,CAAC,EAC/C,OAAO,CACR;AACH;AAEA;;;AAGG;AACH,SAAS,0BAA0B,CACjC,QAAwC,EAAA;IAExC,IAAI,CAAC,QAAQ,EAAE,aAAa;AAAE,QAAA,OAAO,IAAI;AAEzC,IAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa;IAErC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE;AACpC,QAAA,OAAO,MAAM,CAAC,SAAS,CAAoC;IAC7D;IAEA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE;AAClC,QAAA,OAAQ,MAAM,CAAC,OAAO,CAAW,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM;AAC/C,YAAA,KAAK,EACH,OAAO,IAAI,CAAC,IAAI,KAAK;kBACjB,IAAI,CAAC;mBACJ,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7D,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG;AACzC,SAAA,CAAC,CAAC;IACL;AAEA,IAAA,OAAO,IAAI;AACb;AAWA,SAAS,wBAAwB,CAC/B,QAAuB,EACvB,OAAuB,EAAA;AAEvB,IAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM;AAAE,QAAA,OAAO,EAAE;AAE3C,IAAA,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC;AAC3D,IAAA,IAAI,CAAC,MAAM;AAAE,QAAA,OAAO,EAAE;IAEtB,OAAO,MAAM,CAAC;AACX,SAAA,KAAK;AACL,SAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK;AAChC,SAAA,GAAG,CAAC,CAAC,IAAI,MAAM;QACd,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,GAAG,EAAE,IAAI,CAAC,GAAG;AACb,QAAA,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,IAAI,CAAC,GAAG;QACtD,KAAK,EAAE,IAAI,CAAC,GAAG;AACf,QAAA,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;AACzB,QAAA,WAAW,EACT,IAAI,CAAC,WAAW,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,SAAS;AACjE,KAAA,CAAC,CAAC;AACP;AAEA,SAAS,qBAAqB,CAC5B,QAAuB,EACvB,OAAuB,EAAA;AAEvB,IAAA,IAAI,CAAC,QAAQ;AAAE,QAAA,OAAO,EAAE;AAExB,IAAA,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC;AAC3D,IAAA,OAAO,MAAM,EAAE,IAAI,EAAE,OAAO,IAAI,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE;AACvE;AAEA,SAAS,4BAA4B,CACnC,IAaC,EACD,IAAoC,EACpC,OAAuB,EAAA;IAEvB,MAAM,aAAa,IAAI,IAAI,EAAE,aAAa,IAAI,EAAE,CAA4B;IAC5E,MAAM,SAAS,GAAG,cAAc,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,cAAc,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,cAAc,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IAE5D,MAAM,QAAQ,GAAG,wBAAwB,CAAC,SAAS,EAAE,OAAO,CAAC;IAC7D,MAAM,QAAQ,GAAG,wBAAwB,CAAC,SAAS,EAAE,OAAO,CAAC;IAC7D,MAAM,QAAQ,GAAG,wBAAwB,CAAC,SAAS,EAAE,OAAO,CAAC;AAC7D,IAAA,MAAM,YAAY,GAAG,IAAI,GAAG,CAC1B;SACG,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,IAAI,IAAI;AAChC,SAAA,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAU,CAAC,CACnD;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,eAAe,CAAC;AAC3D,UAAG,aAAa,CAAC,eAAe;UAC9B,EAAE;IAEN,OAAO,IAAI,uBAAuB,CAAC;AACjC,QAAA,GAAG,IAAI;AACP,QAAA,QAAQ,EAAE,KAAK;QACf,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC;QAC5D,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC;AAC5D,QAAA,UAAU,EAAE,qBAAqB,CAAC,SAAS,EAAE,OAAO,CAAC;AACrD,QAAA,UAAU,EAAE,qBAAqB,CAAC,SAAS,EAAE,OAAO,CAAC;QACrD,QAAQ;QACR,QAAQ;QACR,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;AAC3B,YAAA,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAE7D,OAAO;gBACL,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC7B,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACnC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAC3C,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAC3C,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACnE,gBAAA,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AACpD,gBAAA,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI;aAC9B;AACH,QAAA,CAAC,CAAC;AACH,KAAA,CAAC;AACJ;AAEA,SAAS,cAAc,CAAC,KAAc,EAAA;AACpC,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AACvD,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;AACpD,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC;AAC5B,QAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,IAAI;IAChD;AAEA,IAAA,OAAO,IAAI;AACb;AAEA,SAAS,oBAAoB,CAAC,KAAU,EAAE,QAAiB,EAAA;IACzD,QAAQ,QAAQ;AACd,QAAA,KAAK,MAAM;AACT,YAAA,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC/D,gBAAA,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK;YAC7B;AACA,YAAA,OAAO,KAAK;AAEd,QAAA,KAAK,WAAW;AACd,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,gBAAA,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KACjB,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAChD;YACH;AACA,YAAA,OAAO,KAAK;AAEd,QAAA,KAAK,YAAY;AACf,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,gBAAA,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KACjB,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAChD;YACH;AACA,YAAA,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AACtC,gBAAA,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK;YAC7B;AACA,YAAA,OAAO,KAAK;AAEd,QAAA;AACE,YAAA,OAAO,KAAK;;AAElB;AAEA,SAAS,uBAAuB,CAAC,KAAuB,EAAA;IACtD,MAAM,aAAa,GACjB,KAAK,CAAC,QAAQ,EAAE,QAAQ,KAAK;UACzB,KAAK,CAAC;WACL,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC;AAErC,IAAA,QAAQ,KAAK,CAAC,QAAQ,EAAE,QAAQ;;;;;AAM9B,QAAA;AACE,YAAA,OAAO,aAAa;;AAE1B;AA0BA,SAAS,kBAAkB,CAAC,MAA+B,EAAA;AACzD,IAAA,MAAM,WAAW,GAAG,IAAI,GAAG,EAA0B;AACrD,IAAA,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAuB;AAC3D,IAAA,MAAM,eAAe,GAAG,IAAI,GAAG,EAAuB;IAEtD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,EAAE;QAC3C,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE,EAAE;YACxC,MAAM,EAAE,UAAU,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC;AAC9C,YAAA,MAAM,SAAS,GAAmB;gBAChC,GAAG,EAAE,KAAK,CAAC,WAAW;gBACtB,UAAU;aACX;YAED,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,SAAS,CAAC;AAE7C,YAAA,IAAI,UAAU,IAAI,IAAI,EAAE;gBACtB,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;oBACzC,oBAAoB,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,GAAG,EAAU,CAAC;gBACzD;AACA,gBAAA,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;YAC9D;AAEA,YAAA,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS;AAC9B,gBAAA,KAAK,CAAC,WAAW;AACjB,gBAAA,mBAAmB,CAAC,KAAK,CAAC,WAAW,CAAC;AACvC,aAAA,CAAC;AAEF,YAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,gBAAgB;AACvC,YAAA,IAAI,QAAQ,EAAE,GAAG,EAAE;AACjB,gBAAA,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAChD;AAEA,YAAA,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AACxB,gBAAA,IAAI,CAAC,KAAK;oBAAE;gBACZ,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;oBAC/B,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAU,CAAC;gBAC/C;AACA,gBAAA,eAAe,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;AACpD,YAAA,CAAC,CAAC;QACJ;IACF;AAEA,IAAA,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB;IACjD,oBAAoB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,UAAU,KAAI;AAChD,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;YAAE;AACrB,QAAA,eAAe,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,IAAA,CAAC,CAAC;AAEF,IAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB;IAC5C,eAAe,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;AACtC,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;YAAE;AACrB,QAAA,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACrC,IAAA,CAAC,CAAC;IAEF,OAAO;QACL,WAAW;QACX,eAAe;QACf,UAAU;KACX;AACH;AAEA,SAAS,qBAAqB,CAC5B,KAAuB,EACvB,QAA8B,EAAA;IAE9B,IAAI,CAAC,QAAQ,EAAE;AACb,QAAA,OAAO,KAAK,CAAC,WAAW,IAAI,IAAI;IAClC;IAEA,MAAM,eAAe,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,MAAM,CACrE,CAAC,SAAS,KAA0B,CAAC,CAAC,SAAS,CAChD;AAED,IAAA,KAAK,MAAM,SAAS,IAAI,eAAe,EAAE;QACvC,IAAI,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;AACvC,YAAA,OAAO,SAAS;QAClB;IACF;AAEA,IAAA,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,EAAE,UAAU;AAC7C,IAAA,IAAI,UAAU,IAAI,IAAI,IAAI,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;QAClE,OAAO,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAE;IAClD;IAEA,MAAM,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,SAAS,KAAK;QAC7D,SAAS;QACT,mBAAmB,CAAC,SAAS,CAAC;AAC/B,KAAA,CAAC;AAEF,IAAA,KAAK,MAAM,SAAS,IAAI,eAAe,EAAE;AACvC,QAAA,IAAI,CAAC,SAAS;YAAE;QAChB,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;YACtC,OAAO,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAE;QAC5C;IACF;AAEA,IAAA,OAAO,IAAI;AACb;AAEA,SAAS,mBAAmB,CAAC,KAAa,EAAA;IACxC,OAAO,KAAK,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC;AAC5C;;AC3wBA;;;;;;;;;;;;;;;;;;;;;;;AAuBG;MAsBU,UAAU,CAAA;AACJ,IAAA,GAAG,GAAG,MAAM,CAAC,oBAAoB,CAAC;AAClC,IAAA,iBAAiB,GAAG,MAAM,CAAqB,EAAE,wFAAC;AAClD,IAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAC/C,IAAA,KAAK,GAAG,MAAM,CAAC,sBAAsB,CAAC;AAChD,IAAA,iBAAiB,GACxB,SAAS,CAA0B,mBAAmB,wFAAC;AAEjD,IAAA,OAAO;AACP,IAAA,SAAS;AACT,IAAA,YAAY;AACH,IAAA,cAAc,GAAG,MAAM,CAAC,KAAK,qFAAC;AAC9B,IAAA,qBAAqB,GAAG,MAAM,CAAC,KAAK,4FAAC;AACrC,IAAA,mBAAmB,GAAG,MAAM,CAA0B,EAAE,0FAAC;AACzD,IAAA,wBAAwB,GAAG,MAAM,CAChD,EAAE,+FACH;AACQ,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM;QACxC,GAAG,IAAI,CAAC,mBAAmB,EAAE;QAC7B,GAAG,IAAI,CAAC,wBAAwB,EAAE;AACnC,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AACe,IAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;;;;AAMnD,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,iFAAC;AACpD,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,kFAAC;AACtD,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,kFAAC;AACtD,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,wFAAC;AAClE,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,iFAAC;AACpD,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,+EAAC;AAChD,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,8EAAC;IAC9C,aAAa,GAAG,QAAQ,CAAC,MAChC,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,QAAQ,KAAK,OAAO,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACjE;IACQ,eAAe,GAAG,QAAQ,CAAC,MAClC,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACnE;AACQ,IAAA,WAAW,GAAG,MAAM,CAAC,CAAC,kFAAC;;;;AAMvB,IAAA,SAAS,GAAG,KAAK,CAAC,QAAQ,+EAAU;AACpC,IAAA,YAAY,GAAG,KAAK,CAAC,QAAQ,kFAAU;;;;IAMvC,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAmB;IACnC,OAAO,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAmB;IAClC,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAmB;IACtC,YAAY,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAmB;IACvC,eAAe,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IACjC,cAAc,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;AAChC,IAAA,OAAO,GAAG,KAAK,CAAC,KAAK,8EAAC;IACtB,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;AAC3B,IAAA,aAAa,GAAG,KAAK,CAA6B,IAAI,oFAAC;AACvD,IAAA,mBAAmB,GAAG,KAAK,CAClC,IAAI,0FACL;;;;AAMQ,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,+EAAC;AACvB,IAAA,QAAQ,GAAG,KAAK,CAAC,IAAI,+EAAC;AACtB,IAAA,QAAQ,GAAG,KAAK,CAAoB,QAAQ,+EAAC;IAC7C,UAAU,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAExB;;AAEM,IAAA,uBAAuB,GAAG,KAAK,CAAU,IAAI,8FAAC;AAC9C,IAAA,uBAAuB,GAAG,KAAK,CAAC,IAAI,8FAAC;AACrC,IAAA,2BAA2B,GAAG,KAAK,CAAC,IAAI,kGAAC;IACzC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAiB,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AACnE,IAAA,OAAO,GAAG,KAAK,CAAiB,EAAE,8EAAC;AACnC,IAAA,gBAAgB,GAAG,KAAK,CAAW,EAAE,uFAAC;AACtC,IAAA,GAAG,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,0EAAC;IAC1C,wBAAwB,GAAG,QAAQ,CAAC,MAC3C,IAAI,CAAC,qBAAqB,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,0BAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAC7B;;;;IAMQ,MAAM,GAAG,MAAM,EAA2B;IAC1C,SAAS,GAAG,MAAM,EAA6B;IAC/C,OAAO,GAAG,MAAM,EAAU;IAC1B,YAAY,GAAG,MAAM,EAAmB;IACxC,kBAAkB,GAAG,MAAM,EAAqB;IAChD,kBAAkB,GAAG,MAAM,EAAyB;;;;AAMpD,IAAA,WAAW,GAAG,IAAI,WAAW,CAAsB,EAAE,CAAC;;;;AAMtD,IAAA,UAAU,GAAG,QAAQ,CAA2B,MAAK;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE;AAC7C,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;AACxB,QAAA,OAAO,sBAAsB,CAC3B,MAAM,EACN,IAAI,CAAC,IAAI,EAAE,EACX,IAAI,CAAC,QAAQ,EAAE,EACf,IAAI,CAAC,OAAO,EAAE,EACd,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EACpB,IAAI,CAAC,QAAQ,EAAE,EACf,IAAI,CAAC,iBAAiB,EAAE,CACzB;AACH,IAAA,CAAC,iFAAC;AAEO,IAAA,aAAa,GAAG,QAAQ,CAAsB,MAAK;AAC1D,QAAA,MAAM,YAAY,GAAG,oBAAoB,CACvC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,EACvB,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAC/B;QAED,OAAO;AACL,YAAA,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC;AAC/B,YAAA,GAAG,YAAY;SAChB;AACH,IAAA,CAAC,oFAAC;AAEO,IAAA,aAAa,GAAG,QAAQ,CAAqB,MACpD,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,oFAC3B;AAEQ,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,GAAG,CAAC,uFAAC;AAClE,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE;AAC7C,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE;QACtB,OAAO;YACL,GAAG,IAAI,GAAG,CAAC;AACT,gBAAA,GAAG,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACpE,GAAG,IAAI,CAAC,gBAAgB,EAAE;aAC3B,CAAC;SACH;AACH,IAAA,CAAC,uFAAC;AACO,IAAA,qBAAqB,GAAG,QAAQ,CAAC,MAAK;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE;AAC7C,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE;QACtB,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACzD,OAAO,4BAA4B,CACjC,MAAM,EACN,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,EACvB,IAAI,CAAC,IAAI,EAAE,EACX,IAAI,CAAC,QAAQ,EAAE,EACf,IAAI,CAAC,QAAQ,EAAE;AAEd,aAAA,GAAG,CAAC,CAAC,OAAO,MAAM;AACjB,YAAA,GAAG,OAAO;YACV,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAC/B,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAC7D;AACF,SAAA,CAAC;AACD,aAAA,MAAM,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;AACrD,IAAA,CAAC,4FAAC;AACO,IAAA,kBAAkB,GAAG,QAAQ,CAA2B,MAAK;AACpE,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACnB,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;AAChC,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;QAExB,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAEzD,OAAO;AACL,YAAA,GAAG,MAAM;YACT,QAAQ,EAAE,MAAM,CAAC;AACd,iBAAA,GAAG,CAAC,CAAC,OAAO,MAAM;AACjB,gBAAA,GAAG,OAAO;gBACV,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAC3B,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAC1D;AACF,aAAA,CAAC;iBACD,MAAM,CAAC,CAAC,OAAO,KACd,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CACxD;SACJ;AACH,IAAA,CAAC,yFAAC;AACO,IAAA,YAAY,GAAG,QAAQ,CAC9B,MAAM,IAAI,CAAC,kBAAkB,EAAE,EAAE,QAAQ,IAAI,EAAE,mFAChD;AACQ,IAAA,uBAAuB,GAAG,QAAQ,CACzC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,GAAG,CAAC,8FACrC;AACQ,IAAA,mBAAmB,GAAG,QAAQ,CACrC,MAAK;AACH,QAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,UAAU,EAAE;AAC5C,QAAA,IAAI,kBAAkB;AAAE,YAAA,OAAO,kBAAkB;QAEjD,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,EAAE,UAAU;QACnE,IACE,gBAAgB,KAAK,OAAO;AAC5B,YAAA,gBAAgB,KAAK,MAAM;YAC3B,gBAAgB,KAAK,QAAQ,EAC7B;AACA,YAAA,OAAO,gBAAgB;QACzB;AAEA,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,0FACF;IACQ,YAAY,GAAG,QAAQ,CAC9B,MACE,IAAI,CAAC,mBAAmB,EAAE,KAAK,OAAO,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,GAAG,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAC3E;IACQ,WAAW,GAAG,QAAQ,CAC7B,MACE,IAAI,CAAC,mBAAmB,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,GAAG,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAC1E;IACQ,aAAa,GAAG,QAAQ,CAC/B,MACE,IAAI,CAAC,mBAAmB,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,GAAG,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAC5E;AACQ,IAAA,gBAAgB,GAAG,QAAQ,CAA2B,MAAK;AAClE,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,EAAE;AACxC,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;QACxB,OAAO;AACL,YAAA,GAAG,MAAM;YACT,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;SACnE;AACH,IAAA,CAAC,uFAAC;IACO,wBAAwB,GAAG,QAAQ,CAC1C,MAAM,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,0BAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACxE;IACQ,UAAU,GAAG,QAAQ,CAAe,MAC3C,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,MAAM;QAC3C,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA,IAAA,EAAO,KAAK,GAAG,CAAC,CAAA,CAAE;QAC1C,KAAK,EAAE,KAAK,GAAG,CAAC;KACjB,CAAC,CAAC,iFACJ;AACQ,IAAA,YAAY,GAAG,QAAQ,CAAqB,MAAK;AACxD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE;AACpC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;QAEtC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,KAAI;AACrC,YAAA,MAAM,KAAK,GAAG,KAAK,GAAG,CAAC;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,WAAW,CAAC;YAE/D,OAAO;AACL,gBAAA,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA,QAAA,EAAW,KAAK,CAAA,CAAE;AACtC,gBAAA,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAE;gBACvC,KAAK;gBACL,KAAK;gBACL,QAAQ,EAAE,KAAK,KAAK,WAAW;AAC/B,gBAAA,gBAAgB,EAAE,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,WAAW;gBACnD,eAAe,EAAE,KAAK,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,GAAG,WAAW;aACpE;AACH,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,mFAAC;AACO,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAK;AAC1C,QAAA,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE;AAAE,YAAA,OAAO,IAAI;QAEjD,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC;QAC3C,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,YAAY,CAAC;AAEvD,QAAA,IAAI,CAAC,aAAa;AAAE,YAAA,OAAO,IAAI;QAE/B,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAAA,QAAA,EAAW,YAAY,CAAA,CAAE,CAAC;AACzD,IAAA,CAAC,yFAAC;AACO,IAAA,qBAAqB,GAAG,QAAQ,CAAC,MAAK;AAC7C,QAAA,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE;AAAE,YAAA,OAAO,EAAE;AAE/C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE;QACpC,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC;AAC3C,QAAA,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU;QAEzC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,KAAI;YAClC,IAAI,KAAK,KAAK,YAAY;gBAAE;AAC5B,YAAA,OAAO,CAAC;iBACL,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG;iBACxB,MAAM,CAAC,CAAC,GAAG,KAAoB,CAAC,CAAC,GAAG;AACpC,iBAAA,OAAO,CAAC,CAAC,GAAG,KAAK,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC/C,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,CAAC,GAAG,eAAe,CAAC;AAC7B,IAAA,CAAC,4FAAC;AACO,IAAA,8BAA8B,GAAG,QAAQ,CAAC,MAAK;QACtD,OAAO;AACL,YAAA,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,qBAAqB,EAAE,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;SAC1E;AACH,IAAA,CAAC,qGAAC;AACO,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AACrC,QAAA,QACE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;aACnB,IAAI,CAAC,QAAQ,EAAE;gBACd,CAAC,IAAI,CAAC,cAAc,EAAE;AACtB,gBAAA,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;gBACtB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;AAE1B,IAAA,CAAC,oFAAC;AACO,IAAA,WAAW,GAAG,QAAQ,CAAwB,MAAK;AAC1D,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AACtC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,EAAE;QAC7C,MAAM,qBAAqB,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE;AACzE,QAAA,MAAM,wBAAwB,GAAG,IAAI,CAAC,wBAAwB,EAAE;AAChE,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM;AAC5C,QAAA,MAAM,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,EAAE;QAC1D,MAAM,mBAAmB,GACvB,qBAAqB,IAAI,WAAW,GAAG,CAAC,IAAI,CAAC,qBAAqB;QACpE,MAAM,eAAe,GACnB,qBAAqB;AACrB,YAAA,WAAW,GAAG,SAAS;AACvB,YAAA,CAAC,qBAAqB;QAExB,OAAO;YACL,OAAO;YACP,QAAQ;YACR,UAAU;AACV,YAAA,UAAU,EAAE;AACV,kBAAE;AACF,kBAAE;AACA,sBAAE;AACF,sBAAE,QAAQ;YACd,qBAAqB;YACrB,wBAAwB;YACxB,WAAW;YACX,SAAS;YACT,mBAAmB;YACnB,eAAe;AACf,YAAA,gBAAgB,EAAE,qBAAqB;YACvC,YAAY,EAAE,qBAAqB,IAAI,eAAe;AACtD,YAAA,UAAU,EACR,QAAQ,IAAI,CAAC,OAAO,KAAK,CAAC,qBAAqB,IAAI,CAAC,eAAe,CAAC;SACvE;AACH,IAAA,CAAC,kFAAC;;;;AAMF,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,MAAK;YAC/D,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;AAC9C,gBAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC;YACvC;AACF,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;AAClC,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE;AAExC,YAAA,IAAI,QAAQ,IAAI,SAAS,IAAI,YAAY,EAAE;gBACzC,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAC9B;AACF,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;YACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AAEtC,YAAA,IAAI,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC9C,SAAS,CAAC,MAAK;AACb,oBAAA,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC3D,gBAAA,CAAC,CAAC;YACJ;AACF,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;YACV,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM;AACxC,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE;AAElC,YAAA,IAAI,KAAK,KAAK,CAAC,EAAE;gBACf,IAAI,OAAO,KAAK,CAAC;AAAE,oBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC1C;YACF;YAEA,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,KAAK,EAAE;AAClC,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB;AACF,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;YAEtC,SAAS,CAAC,MAAK;AACb,gBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;AAC3C,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;YACV,MAAM,qBAAqB,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC,MAAM;YACpE,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,EAAE,EAAE,aAAa;AAEjE,YAAA,IAAI,qBAAqB,KAAK,CAAC,IAAI,CAAC,iBAAiB,EAAE;gBACrD;YACF;YAEA,SAAS,CAAC,MAAK;gBACb,cAAc,CAAC,MAAK;oBAClB,iBAAiB,CAAC,cAAc,CAAC;AAC/B,wBAAA,QAAQ,EAAE,QAAQ;AAClB,wBAAA,KAAK,EAAE,OAAO;AACf,qBAAA,CAAC;AACJ,gBAAA,CAAC,CAAC;AACJ,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;;;;AAMA;;;AAGG;IACH,IAAI,GAAA;AACF,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;YAAE;AAE1B,QAAA,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE;AAC3B,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;AAC9B,QAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC;AACrC,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC;AAChC,QAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;AAEnC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAEvC,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC;AAC9C,YAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;gBACjB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AAE7B,gBAAA,IAAI,QAAQ,CAAC,IAAI,EAAE;oBACjB,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC;oBACzC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AAE/B,oBAAA,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE;wBACtB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC5C;AAEA,oBAAA,IAAI,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE;wBAC5B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;oBACxD;;oBAGA,MAAM,kBAAkB,GACtB,QAAQ,CAAC,IAAI,CAAC,iBAAiB,EAAE;yBAC9B,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,EAAE;AAC7B,yBAAA,IAAI,CACH,CAAC,CAAC,KACA,CAAC,CAAC,gBAAgB,EAAE,QAAQ,KAAK,MAAM;AACvC,wBAAA,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,aAAa,GAAG,iBAAiB,CAAC,CAC3D,IAAI,KAAK;AAEd,oBAAA,MAAM,WAAW,GACf,IAAI,CAAC,WAAW,EAAE,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW;AAC1D,oBAAA,IAAI,kBAAkB,IAAI,WAAW,IAAI,IAAI,EAAE;wBAC7C,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC;AAC7C,4BAAA,IAAI,EAAE,CAAC,GAAG,KAAI;AACZ,gCAAA,MAAM,OAAO,GAAuB,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,GAAG,CACtD,CAAC,CAAC,MAAM;AACN,oCAAA,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,IAAI,CAAC,CAAC,IAAI,EAAE,QAAQ,IAAI,CAAC,CAAC,MAAM;oCAC1D,KAAK,EAAE,CAAC,CAAC,MAAM;AAChB,iCAAA,CAAC,CACH;AACD,gCAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC;4BACrC,CAAC;AACF,yBAAA,CAAC;oBACJ;gBACF;qBAAO;AACL,oBAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,IAAI,qBAAqB;AACrD,oBAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;AACxB,oBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;gBACxB;YACF,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,gBAAA,MAAM,GAAG,GACP,GAAG,EAAE,KAAK,EAAE,OAAO,IAAI,GAAG,EAAE,OAAO,IAAI,qBAAqB;AAC9D,gBAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;AACxB,gBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;YACxB,CAAC;AACF,SAAA,CAAC;IACJ;AAEA;;;AAGG;IACH,MAAM,GAAA;AACJ,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;YAAE;QAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QAC9C,IAAI,CAAC,YAAY,EAAE;YACjB,MAAM,GAAG,GAAG,mCAAmC;YAC/C,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;AAC/B,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;YACtB;QACF;AAEA,QAAA,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE;QAC7B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QAEhC,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC;AACrD,QAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC;AAErC,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC;AACpD,YAAA,IAAI,EAAE,CAAC,kBAAkB,KAAI;AAC3B,gBAAA,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI;gBAE1C,IAAI,CAAC,UAAU,EAAE;AACf,oBAAA,MAAM,GAAG,GAAG,kBAAkB,CAAC,OAAO,IAAI,yBAAyB;oBACnE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAChC,oBAAA,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC;AAC9B,oBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;oBACtB;gBACF;AAEA,gBAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAC/B,IAAI,CAAC,2BAA2B,CAAC,UAAU,CAAC,OAAO,IAAI,EAAE,CAAC,CAC3D;AAED,gBAAA,IAAI,UAAU,CAAC,mBAAmB,EAAE;oBAClC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;oBAChC;gBACF;AAEA,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE;gBACvC,IAAI,IAAI,CAAC,uBAAuB,EAAE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;oBACzD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAChC,oBAAA,IAAI,CAAC,yBAAyB,CAC5B,QAAQ,EACR,0CAA0C,EAC1C,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,4BAA4B,CAAC,EAC7D,MAAK;wBACH,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AAC/B,wBAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC;AACrC,wBAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7B,oBAAA,CAAC,CACF;oBACD;gBACF;AAEA,gBAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;YAC7B,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;gBACb,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAChC,gBAAA,MAAM,GAAG,GACP,GAAG,EAAE,KAAK,EAAE,OAAO,IAAI,GAAG,EAAE,OAAO,IAAI,yBAAyB;AAClE,gBAAA,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC;AAC9B,gBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;YACxB,CAAC;AACF,SAAA,CAAC;IACJ;AAEA;;AAEG;IACH,YAAY,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;IACrC;AAEA;;AAEG;IACH,eAAe,GAAA;QACb,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AAC9C,QAAA,IAAI,CAAC,YAAY;AAAE,YAAA,OAAO,EAAE;QAC5B,OAAO,0BAA0B,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,YAAY,CAAC;IACtE;AAEA;;AAEG;IACH,eAAe,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE;IAC/B;AAEA;;AAEG;IACH,OAAO,GAAA;AACL,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,KAAK,CAAC;IACpE;AAEA;;AAEG;IACH,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE;AAC3B,QAAA,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE;AAC7B,QAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC;AACrC,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;AAC1B,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC;AAChC,QAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC;AACrC,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;IACpB;AAEA,IAAA,uBAAuB,CAAC,QAAiC,EAAA;QACvD,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;IAC9C;AAEA,IAAA,YAAY,CAAC,KAAa,EAAA;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM;AACxC,QAAA,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,KAAK;YAAE;QAChC,IAAI,IAAI,CAAC,qBAAqB,EAAE;YAAE;AAElC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;QACtC,IAAI,KAAK,KAAK,WAAW;YAAE;QAE3B,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE;AAC3D,YAAA,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;YAC3B;QACF;AAEA,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,GAAG,CAAC,CAAC;AACnD,QAAA,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC;IACzC;IAEA,gBAAgB,GAAA;QACd,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAC3C;IAEA,YAAY,GAAA;QACV,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAC3C;IAEA,mBAAmB,GAAA;QACjB,QACE,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE;AAC5C,YAAA,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC;AACtB,YAAA,CAAC,IAAI,CAAC,qBAAqB,EAAE;IAEjC;IAEA,eAAe,GAAA;QACb,QACE,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE;YAC5C,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM;AAC/C,YAAA,CAAC,IAAI,CAAC,qBAAqB,EAAE;IAEjC;IAEA,cAAc,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE;IAC3B;IAEA,YAAY,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM;IACnC;IAEA,uBAAuB,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE;IAC5B;IAEA,0BAA0B,GAAA;AACxB,QAAA,OAAO,IAAI,CAAC,wBAAwB,EAAE;IACxC;IAEA,eAAe,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO;IACnC;IAEA,qBAAqB,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU;IACtC;IAEA,cAAc,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE;IAC3B;;;;IAMA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE;AAC3B,QAAA,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE;AAC7B,QAAA,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE;IAClC;;;;IAMQ,gBAAgB,GAAA;AACtB,QAAA,MAAM,GAAG,GAA2B;AAClC,YAAA,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;AAC3B,YAAA,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE;SAClC;AAED,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;AACtC,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE;AACxC,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE;AAC9C,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE;AAC5C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;QAE9B,IAAI,QAAQ,IAAI,IAAI;AAAE,YAAA,GAAG,CAAC,QAAQ,GAAG,QAAQ;QAC7C,IAAI,OAAO,IAAI,IAAI;AAAE,YAAA,GAAG,CAAC,OAAO,GAAG,OAAO;QAC1C,IAAI,WAAW,IAAI,IAAI;AAAE,YAAA,GAAG,CAAC,WAAW,GAAG,WAAW;QACtD,IAAI,YAAY,IAAI,IAAI;AAAE,YAAA,GAAG,CAAC,YAAY,GAAG,YAAY;QACzD,IAAI,eAAe,IAAI,IAAI;AAAE,YAAA,GAAG,CAAC,eAAe,GAAG,eAAe;QAClE,IAAI,cAAc,IAAI,IAAI;AAAE,YAAA,GAAG,CAAC,cAAc,GAAG,cAAc;AAC/D,QAAA,IAAI,OAAO;AAAE,YAAA,GAAG,CAAC,OAAO,GAAG,OAAO;AAElC,QAAA,OAAO,GAAG;IACZ;AAEQ,IAAA,kBAAkB,CACxB,YAAqC,EAAA;QAErC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;AACpC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE;QACrC,MAAM,MAAM,GAA6B,0BAA0B,CACjE,SAAS,EACT,YAAY,CACb;AAED,QAAA,MAAM,GAAG,GAA6B;YACpC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,OAAO,EAAE,SAAS;YACjD,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,OAAO,EAAE,YAAY;YAC1D,MAAM;SACP;QAED,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE;QACrD,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE;QAClD,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,IAAI,CAAC,WAAW,EAAE;QAC9D,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,IAAI,IAAI,CAAC,YAAY,EAAE;QACjE,MAAM,eAAe,GAAG,OAAO,EAAE,eAAe,IAAI,IAAI,CAAC,eAAe,EAAE;QAC1E,MAAM,QAAQ,GACZ,YAAY;aACX,GAAG,CAAC,SAAS,KAAK,WAAW,IAAI,GAAG,CAAC,YAAY,KAAK;AACrD,kBAAE;kBACA,SAAS,CAAC;AAChB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;QAElC,IAAI,QAAQ,IAAI,IAAI;AAAE,YAAA,GAAG,CAAC,QAAQ,GAAG,QAAQ;QAC7C,IAAI,OAAO,IAAI,IAAI;AAAE,YAAA,GAAG,CAAC,OAAO,GAAG,OAAO;QAC1C,IAAI,WAAW,IAAI,IAAI;AAAE,YAAA,GAAG,CAAC,WAAW,GAAG,WAAW;QACtD,IAAI,YAAY,IAAI,IAAI;AAAE,YAAA,GAAG,CAAC,YAAY,GAAG,YAAY;QACzD,IAAI,QAAQ,IAAI,IAAI;AAAE,YAAA,GAAG,CAAC,QAAQ,GAAG,QAAQ;QAC7C,IAAI,eAAe,IAAI,IAAI;AAAE,YAAA,GAAG,CAAC,eAAe,GAAG,eAAe;AAClE,QAAA,IAAI,SAAS;AAAE,YAAA,GAAG,CAAC,SAAS,GAAG,SAAS;AAExC,QAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,EAAE;QACtD,IAAI,CAAC,mBAAmB,EAAE;AACxB,YAAA,OAAO,GAAG;QACZ;QAEA,OAAO,mBAAmB,CAAC,GAAG,EAAE;YAC9B,SAAS;YACT,YAAY;AACb,SAAA,CAAC;IACJ;AAEQ,IAAA,sBAAsB,CAAC,UAAkB,EAAA;AAC/C,QAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE,EAAE;YAChC;QACF;QAEA,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QAC9C,IAAI,CAAC,YAAY,EAAE;YACjB,MAAM,GAAG,GAAG,4CAA4C;AACxD,YAAA,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC;AAC9B,YAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC;AAChC,gBAAA,IAAI,CAAC,+BAA+B,CAAC,GAAG,EAAE,OAAO,CAAC;AACnD,aAAA,CAAC;AACF,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;YACtB;QACF;AAEA,QAAA,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE;AAC7B,QAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAChC,QAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC;QAErC,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC;AAErD,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC;AACpD,YAAA,IAAI,EAAE,CAAC,kBAAkB,KAAI;AAC3B,gBAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC;AAErC,gBAAA,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI;gBAC1C,IAAI,CAAC,UAAU,EAAE;AACf,oBAAA,MAAM,GAAG,GAAG,kBAAkB,CAAC,OAAO,IAAI,yBAAyB;AACnE,oBAAA,IAAI,CAAC,8BAA8B,CAAC,GAAG,CAAC;oBACxC;gBACF;AAEA,gBAAA,MAAM,eAAe,GAAG,IAAI,CAAC,2BAA2B,CACtD,UAAU,CAAC,OAAO,IAAI,EAAE,CACzB;AACD,gBAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,gCAAgC,EAAE;AAEnE,gBAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC;AAChC,oBAAA,GAAG,eAAe;AAClB,oBAAA,IAAI;AACF,0BAAE;AACE,4BAAA,IAAI,CAAC,+BAA+B,CAClC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,4BAA4B,CAAC,EAC7D,OAAO,CACR;AACF;0BACD,EAAE,CAAC;AACR,iBAAA,CAAC;AAEF,gBAAA,IAAI,UAAU,CAAC,mBAAmB,IAAI,mBAAmB,EAAE;oBACzD;gBACF;AAEA,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE;gBACvC,IAAI,IAAI,CAAC,2BAA2B,EAAE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC7D,IAAI,CAAC,yBAAyB,CAC5B,QAAQ,EACR,+CAA+C,EAC/C,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,iBAAiB,CAAC,EAClD,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CACvC;oBACD;gBACF;AAEA,gBAAA,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC;YAClC,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,gBAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC;AACrC,gBAAA,MAAM,GAAG,GACP,GAAG,EAAE,KAAK,EAAE,OAAO,IAAI,GAAG,EAAE,OAAO,IAAI,yBAAyB;AAClE,gBAAA,IAAI,CAAC,8BAA8B,CAAC,GAAG,CAAC;YAC1C,CAAC;AACF,SAAA,CAAC;IACJ;AAEQ,IAAA,eAAe,CAAC,KAAa,EAAA;AACnC,QAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC;AACrC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;IAC7B;IAEQ,6BAA6B,CACnC,UAAkB,EAClB,WAAmB,EAAA;AAEnB,QAAA,QACE,UAAU,GAAG,WAAW,KAAK,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;IAE7E;IAEQ,gCAAgC,GAAA;AACtC,QAAA,QACE,IAAI,CAAC,WAAW,CAAC,OAAO;AACxB,YAAA,IAAI,CAAC,mBAAmB,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,QAAQ,KAAK,OAAO,CAAC;IAEtE;AAEQ,IAAA,8BAA8B,CAAC,OAAe,EAAA;AACpD,QAAA,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC;AAClC,QAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC;AAChC,YAAA,IAAI,CAAC,+BAA+B,CAAC,OAAO,EAAE,OAAO,CAAC;AACvD,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;IAC5B;IAEQ,+BAA+B,CACrC,OAAe,EACf,QAA6B,EAAA;QAE7B,OAAO;AACL,YAAA,IAAI,EAAE,eAAe;YACrB,QAAQ;YACR,OAAO;SACR;IACH;AAEQ,IAAA,yBAAyB,CAC/B,QAAiC,EACjC,sBAA8B,EAC9B,WAAmB,EACnB,QAAoB,EAAA;AAEpB,QAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC;AAC/B,YAAA,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CACrC,wCAAwC,CACzC;YACD,OAAO,EAAE,IAAI,CAAC,+BAA+B,CAC3C,QAAQ,EACR,sBAAsB,CACvB;AACD,YAAA,WAAW,EAAE,WAAW;AACxB,YAAA,YAAY,EAAE;AACZ,gBAAA,QAAQ,EAAE,MAAM;AACjB,aAAA;AACD,YAAA,MAAM,EAAE,QAAQ;AAChB,YAAA,MAAM,EAAE,MAAK,EAAE,CAAC;AACjB,SAAA,CAAC;IACJ;AAEQ,IAAA,aAAa,CAAC,OAAiC,EAAA;AACrD,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC;AAClD,YAAA,IAAI,EAAE,CAAC,QAAQ,KAAI;gBACjB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAEhC,gBAAA,IAAI,QAAQ,CAAC,IAAI,EAAE;oBACjB,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAC3C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACpC;qBAAO;AACL,oBAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,IAAI,uBAAuB;AACvD,oBAAA,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC;AAC9B,oBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;gBACxB;YACF,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;gBACb,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAChC,gBAAA,MAAM,GAAG,GACP,GAAG,EAAE,KAAK,EAAE,OAAO,IAAI,GAAG,EAAE,OAAO,IAAI,uBAAuB;AAChE,gBAAA,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC;AAC9B,gBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;YACxB,CAAC;AACF,SAAA,CAAC;IACJ;IAEQ,+BAA+B,CACrC,QAAiC,EACjC,sBAA8B,EAAA;QAE9B,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAC3C,yCAAyC,CAC1C;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,sBAAsB,CAAC;AACxE,QAAA,MAAM,YAAY,GAAG;YACnB,GAAG,IAAI,GAAG,CACR;AACG,iBAAA,GAAG,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE;iBACxC,MAAM,CAAC,CAAC,OAAO,KAAwB,CAAC,CAAC,OAAO,CAAC,CACrD;SACF,CAAC,GAAG,CAAC,CAAC,OAAO,KAAK,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAC;AAElC,QAAA,OAAO,CAAC,KAAK,EAAE,GAAG,YAAY,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1D;AAEQ,IAAA,2BAA2B,CACjC,OAA0C,EAAA;AAE1C,QAAA,OAAO;aACJ,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM;AACjC,aAAA,GAAG,CAAC,CAAC,MAAM,MAAM;YAChB,IAAI,EAAE,MAAM,CAAC;AACX,kBAAE;AACF,kBAAE,eAAe;YACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;AACzB,YAAA,OAAO,EAAE,IAAI,CAAC,8BAA8B,CAAC,MAAM,CAAC;YACpD,MAAM,EAAE,MAAM,CAAC,MAAM;AACtB,SAAA,CAAC,CAAC;IACP;AAEQ,IAAA,8BAA8B,CACpC,MAAuC,EAAA;QAEvC,MAAM,iBAAiB,GAAG,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,OAAO,CAAC;QACvE,IAAI,iBAAiB,EAAE;AACrB,YAAA,OAAO,iBAAiB;QAC1B;QAEA,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,EAAE,IAAI,EAAE;QAChD,IAAI,YAAY,EAAE;AAChB,YAAA,OAAO,YAAY;QACrB;AAEA,QAAA,OAAO,wBAAwB;IACjC;AAEQ,IAAA,wBAAwB,CAC9B,KAA8D,EAAA;AAE9D,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,YAAA,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE;AAC/B,YAAA,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,GAAG,UAAU,GAAG,IAAI;QAClD;QAEA,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;QACxB,MAAM,SAAS,GACb,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,IAAI,IAAI;AAE9D,QAAA,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE;AACjC,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,EAAE;AACnC,QAAA,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,GAAG,UAAU,GAAG,IAAI;IAClD;IAEQ,wBAAwB,CAC9B,SAAiB,EACjB,WAAmB,EAAA;AAEnB,QAAA,IAAI,SAAS,GAAG,WAAW,EAAE;AAC3B,YAAA,OAAO,WAAW;QACpB;AAEA,QAAA,IAAI,SAAS,KAAK,WAAW,EAAE;AAC7B,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,OAAO,UAAU;IACnB;uGA7/BW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,uBAAA,EAAA,EAAA,iBAAA,EAAA,yBAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,uBAAA,EAAA,EAAA,iBAAA,EAAA,yBAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,2BAAA,EAAA,EAAA,iBAAA,EAAA,6BAAA,EAAA,UAAA,EAAA,6BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,SAAA,EAAA,YAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,EAAA,SAAA,EAJV,CAAC,sBAAsB,CAAC,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrHrC,kwkBAkaA,EAAA,MAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED1TI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,MAAM,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,eAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACN,IAAI,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACJ,eAAe,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,WAAW,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,uBAAA,EAAA,4BAAA,EAAA,oBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,IAAI,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACJ,QAAQ,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,OAAA,EAAA,WAAA,EAAA,cAAA,EAAA,MAAA,EAAA,OAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACR,IAAI,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACJ,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,YAAA,EAAA,UAAA,EAAA,MAAA,EAAA,WAAA,EAAA,MAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,SAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,kBAAkB,2LAClB,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FAMJ,UAAU,EAAA,UAAA,EAAA,CAAA;kBArBtB,SAAS;+BACE,gBAAgB,EAAA,UAAA,EACd,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,MAAM;wBACN,IAAI;wBACJ,eAAe;wBACf,WAAW;wBACX,IAAI;wBACJ,QAAQ;wBACR,IAAI;wBACJ,OAAO;wBACP,kBAAkB;wBAClB,aAAa;qBACd,EAAA,SAAA,EACU,CAAC,sBAAsB,CAAC,EAAA,QAAA,EAAA,kwkBAAA,EAAA,MAAA,EAAA,CAAA,wBAAA,CAAA,EAAA;yGAUE,mBAAmB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,uBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,uBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,2BAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,6BAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,CAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AE/H1D;AACA;AACA;AAiTA;;;AAGG;AACG,SAAU,0BAA0B,CACxC,QAAa,EAAA;AAEb,IAAA,QACE,QAAQ,EAAE,MAAM,KAAK,cAAc;AACnC,QAAA,OAAO,QAAQ,EAAE,eAAe,KAAK,QAAQ;AAEjD;;AC9TA;;ACAA;;AAEG;;;;"}
1
+ {"version":3,"file":"masterteam-forms-client-form.mjs","sources":["../../../../packages/masterteam/forms/client-form/services/client-form-api.service.ts","../../../../packages/masterteam/forms/client-form/services/client-form-state.service.ts","../../../../packages/masterteam/forms/client-form/utils/form-config-mapper.ts","../../../../packages/masterteam/forms/client-form/client-form.ts","../../../../packages/masterteam/forms/client-form/client-form.html","../../../../packages/masterteam/forms/client-form/models/client-form.model.ts","../../../../packages/masterteam/forms/client-form/public-api.ts","../../../../packages/masterteam/forms/client-form/masterteam-forms-client-form.ts"],"sourcesContent":["import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\n\r\nimport type {\r\n Response,\r\n ProcessFormLoadRequest,\r\n ProcessFormLoadResponse,\r\n ProcessFormSubmitRequest,\r\n ProcessFormSubmitResponse,\r\n ProcessFormValidationRuntimeResult,\r\n} from '../models/client-form.model';\r\n\r\nexport interface TeamMemberApiDto {\r\n userId: string;\r\n user: { displayName?: string; fullName?: string; [key: string]: any } | null;\r\n [key: string]: any;\r\n}\r\n\r\n/**\r\n * Stateless HTTP service for process-forms runtime APIs.\r\n * Root-provided — safe to share across multiple ClientForm instances.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class ClientFormApiService {\r\n private readonly http = inject(HttpClient);\r\n\r\n /**\r\n * Load form configuration and values for a given operation context.\r\n * Backend determines mode (Approval vs Direct) based on published schema.\r\n */\r\n load(\r\n request: ProcessFormLoadRequest,\r\n ): Observable<Response<ProcessFormLoadResponse>> {\r\n return this.http.post<Response<ProcessFormLoadResponse>>(\r\n 'process-form-load',\r\n request,\r\n );\r\n }\r\n\r\n /**\r\n * Submit form values. Result depends on mode:\r\n * - Approval → status: 'PendingApproval'\r\n * - Direct → status: 'Executed'\r\n */\r\n submit(\r\n request: ProcessFormSubmitRequest,\r\n ): Observable<Response<ProcessFormSubmitResponse>> {\r\n return this.http.post<Response<ProcessFormSubmitResponse>>(\r\n 'process-submit',\r\n request,\r\n );\r\n }\r\n\r\n /**\r\n * Validate the exact submit payload against backend-owned form rules\r\n * before the real submit call.\r\n */\r\n validate(\r\n request: ProcessFormSubmitRequest,\r\n ): Observable<Response<ProcessFormValidationRuntimeResult>> {\r\n return this.http.post<Response<ProcessFormValidationRuntimeResult>>(\r\n 'process-submit/validate',\r\n request,\r\n );\r\n }\r\n\r\n /**\r\n * Fetch team members for a given level data entry.\r\n * Used when a User-type property has justTeamMembers configuration enabled.\r\n */\r\n getTeamMembers(\r\n levelDataId: number | string,\r\n ): Observable<Response<TeamMemberApiDto[]>> {\r\n return this.http.get<Response<TeamMemberApiDto[]>>(\r\n `LevelData/${levelDataId}/team-members`,\r\n );\r\n }\r\n}\r\n","import { Injectable, signal, computed } from '@angular/core';\r\n\r\nimport type {\r\n ProcessFormLoadResponse,\r\n ProcessFormSubmitResponse,\r\n ProcessFormValue,\r\n ProcessFormContext,\r\n ProcessFormMode,\r\n ProcessFormSource,\r\n ClientFormConfiguration,\r\n} from '../models/client-form.model';\r\n\r\n/**\r\n * Per-instance signal-based state for ClientForm.\r\n *\r\n * NOT providedIn root — each ClientForm component provides its own instance\r\n * via `providers: [ClientFormStateService]`, enabling multiple independent\r\n * forms on the same page.\r\n */\r\n@Injectable()\r\nexport class ClientFormStateService {\r\n // ============================================================================\r\n // Core State Signals\r\n // ============================================================================\r\n\r\n readonly loading = signal(false);\r\n readonly submitting = signal(false);\r\n readonly error = signal<string | null>(null);\r\n readonly submitError = signal<string | null>(null);\r\n readonly loadResponse = signal<ProcessFormLoadResponse | null>(null);\r\n readonly submitResponse = signal<ProcessFormSubmitResponse | null>(null);\r\n\r\n // ============================================================================\r\n // Derived Computeds — Load Response\r\n // ============================================================================\r\n\r\n readonly isLoaded = computed(() => !!this.loadResponse());\r\n\r\n readonly mode = computed<ProcessFormMode | null>(\r\n () => this.loadResponse()?.mode ?? null,\r\n );\r\n\r\n readonly isApproval = computed(() => this.mode() === 'Approval');\r\n readonly isDirect = computed(() => this.mode() === 'Direct');\r\n\r\n readonly formSource = computed<ProcessFormSource | null>(\r\n () => this.loadResponse()?.formSource ?? null,\r\n );\r\n\r\n readonly requiresForm = computed(\r\n () => this.loadResponse()?.requiresForm ?? false,\r\n );\r\n\r\n readonly formConfiguration = computed<ClientFormConfiguration | null>(\r\n () => this.loadResponse()?.formConfiguration ?? null,\r\n );\r\n\r\n readonly values = computed<ProcessFormValue[]>(\r\n () => this.loadResponse()?.values ?? [],\r\n );\r\n\r\n readonly context = computed<ProcessFormContext | null>(\r\n () => this.loadResponse()?.context ?? null,\r\n );\r\n\r\n readonly stepName = computed<string | null>(\r\n () => this.loadResponse()?.stepName ?? null,\r\n );\r\n\r\n readonly requestSchemaId = computed<number | null>(\r\n () => this.loadResponse()?.requestSchemaId ?? null,\r\n );\r\n\r\n readonly requestId = computed<number | null>(\r\n () => this.loadResponse()?.requestId ?? null,\r\n );\r\n\r\n readonly stepId = computed<number | null>(\r\n () => this.loadResponse()?.stepId ?? null,\r\n );\r\n\r\n readonly stepSchemaId = computed<number | null>(\r\n () => this.loadResponse()?.stepSchemaId ?? null,\r\n );\r\n\r\n // ============================================================================\r\n // Derived Computeds — Value Categories\r\n // ============================================================================\r\n\r\n /** Process virtual fields (Request_Date, Step_Name, etc.) — read-only display */\r\n readonly virtualFields = computed<ProcessFormValue[]>(() =>\r\n this.values().filter((v) => v.metadata?.source === 'ProcessVirtual'),\r\n );\r\n\r\n /** Editable form values (non-virtual) */\r\n readonly formValues = computed<ProcessFormValue[]>(() =>\r\n this.values().filter((v) => v.metadata?.source !== 'ProcessVirtual'),\r\n );\r\n\r\n // ============================================================================\r\n // Derived Computeds — Submit Response\r\n // ============================================================================\r\n\r\n readonly isSubmitted = computed(() => !!this.submitResponse());\r\n\r\n readonly submitStatus = computed(() => this.submitResponse()?.status ?? null);\r\n\r\n readonly isPendingApproval = computed(\r\n () => this.submitStatus() === 'PendingApproval',\r\n );\r\n\r\n readonly isExecuted = computed(() => this.submitStatus() === 'Executed');\r\n\r\n // ============================================================================\r\n // State Mutations\r\n // ============================================================================\r\n\r\n setLoadResponse(response: ProcessFormLoadResponse): void {\r\n this.loadResponse.set(response);\r\n this.error.set(null);\r\n }\r\n\r\n setSubmitResponse(response: ProcessFormSubmitResponse): void {\r\n this.submitResponse.set(response);\r\n this.submitError.set(null);\r\n }\r\n\r\n setError(message: string): void {\r\n this.error.set(message);\r\n this.loading.set(false);\r\n }\r\n\r\n setSubmitError(message: string): void {\r\n this.submitError.set(message);\r\n this.submitting.set(false);\r\n }\r\n\r\n reset(): void {\r\n this.loading.set(false);\r\n this.submitting.set(false);\r\n this.error.set(null);\r\n this.submitError.set(null);\r\n this.loadResponse.set(null);\r\n this.submitResponse.set(null);\r\n }\r\n}\r\n","import type {\r\n DynamicFormConfig,\r\n DynamicFieldConfig,\r\n} from '@masterteam/components';\r\nimport type { EntityData, EntitySize } from '@masterteam/components/entities';\r\nimport {\r\n REQUEST_CONTEXT,\r\n ValidatorConfig,\r\n TextFieldConfig,\r\n EditorFieldConfig,\r\n SelectFieldConfig,\r\n MultiSelectFieldConfig,\r\n DateFieldConfig,\r\n NumberFieldConfig,\r\n SliderFieldConfig,\r\n ToggleFieldConfig,\r\n UserSearchFieldConfig,\r\n UploadFileFieldConfig,\r\n LookupMatrixFieldConfig,\r\n SchemaConnectionFieldConfig,\r\n SchedulePredecessorFieldConfig,\r\n} from '@masterteam/components';\r\nimport { HttpContext } from '@angular/common/http';\r\n\r\nimport type {\r\n ClientFormConfiguration,\r\n ClientFormField,\r\n ClientPropertyItem,\r\n ClientLookup,\r\n ProcessFormValue,\r\n ProcessFormLoadResponse,\r\n ProcessFormSubmitField,\r\n ProcessFormContext,\r\n PropertyValueComparison,\r\n} from '../models/client-form.model';\r\n\r\n// ============================================================================\r\n// Constants\r\n// ============================================================================\r\n\r\nconst WIDTH_TO_COLSPAN: Record<string, number> = {\r\n '25': 3,\r\n '50': 6,\r\n '100': 12,\r\n};\r\n\r\nconst WIDTH_TO_ENTITY_SIZE: Record<string, EntitySize> = {\r\n '25': 6,\r\n '50': 12,\r\n '100': 24,\r\n};\r\n\r\nexport interface ClientFormPreviewSection {\r\n key: string;\r\n label: string;\r\n order: number;\r\n entities: EntityData[];\r\n}\r\n\r\nexport interface TeamMemberOption {\r\n label: string;\r\n value: string;\r\n}\r\n\r\n// ============================================================================\r\n// Public Mapper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Convert a runtime FormConfiguration into a DynamicFormConfig\r\n * that can be passed directly to `<mt-dynamic-form>`.\r\n *\r\n * @param config The form configuration from the load API\r\n * @param lang Current UI language ('en' | 'ar')\r\n * @param mode 'create' or 'edit' — filters hidden fields accordingly\r\n * @param lookups Available lookup definitions for resolving Lookup/LookupMultiSelect options\r\n * @param teamMemberOptions Pre-fetched team member options (used when property configuration has justTeamMembers=true)\r\n */\r\nexport function mapToDynamicFormConfig(\r\n config: ClientFormConfiguration,\r\n lang: 'en' | 'ar' = 'en',\r\n mode: 'create' | 'edit' = 'create',\r\n lookups: ClientLookup[] = [],\r\n context: ProcessFormContext | null = null,\r\n readonly = false,\r\n teamMemberOptions: TeamMemberOption[] = [],\r\n): DynamicFormConfig {\r\n return {\r\n sections: config.sections\r\n .slice()\r\n .sort((a, b) => a.order - b.order)\r\n .map((section) => {\r\n const sectionName = section.name[lang] ?? section.name['en'] ?? '';\r\n\r\n const visibleFields = section.fields\r\n .filter((field) => {\r\n // isRead=false → completely hidden\r\n if (field.isWrite !== true && field.isRead === false) return false;\r\n if (mode === 'create') return !field.hiddenInCreation;\r\n return !field.hiddenInEditForm;\r\n })\r\n .sort((a, b) => a.order - b.order);\r\n\r\n return {\r\n key: section.id,\r\n label: sectionName,\r\n type: 'header' as const,\r\n columns: 12,\r\n order: section.order,\r\n fields: visibleFields.map((field) =>\r\n mapFieldToConfig(\r\n field,\r\n lang,\r\n lookups,\r\n context,\r\n readonly,\r\n teamMemberOptions,\r\n ),\r\n ),\r\n };\r\n })\r\n .filter((section) => section.fields.length > 0),\r\n };\r\n}\r\n\r\n/**\r\n * Convert API property values into a flat key-value object\r\n * suitable for `formControl.patchValue()`.\r\n *\r\n * Only includes non-virtual (editable) values.\r\n */\r\nexport function mapValuesToFormValue(\r\n values: ProcessFormValue[],\r\n config?: ClientFormConfiguration | null,\r\n): Record<string, any> {\r\n const result: Record<string, any> = {};\r\n const fieldMap = config ? buildFieldValueMap(config) : null;\r\n\r\n for (const v of values) {\r\n if (v.metadata?.source === 'ProcessVirtual') continue;\r\n\r\n const targetFieldKey =\r\n resolveValueTargetKey(v, fieldMap) ?? v.propertyKey ?? null;\r\n if (!targetFieldKey) continue;\r\n\r\n result[targetFieldKey] = resolveLoadedFieldValue(v);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Convert the current form value back into the submit payload format.\r\n *\r\n * Uses form configuration metadata (same source used to render fields)\r\n * to map `requestPropertyId` and `viewType`.\r\n */\r\nexport function mapFormValueToSubmitFields(\r\n formValue: Record<string, any>,\r\n loadResponse: ProcessFormLoadResponse,\r\n): ProcessFormSubmitField[] {\r\n const metadataByKey = new Map<\r\n string,\r\n { propertyId?: number; viewType?: string }\r\n >();\r\n\r\n for (const section of loadResponse.formConfiguration?.sections ?? []) {\r\n for (const field of section.fields ?? []) {\r\n const { propertyId, viewType } = resolveFieldMeta(field);\r\n metadataByKey.set(field.propertyKey, {\r\n propertyId,\r\n viewType,\r\n });\r\n }\r\n }\r\n\r\n return Object.entries(formValue)\r\n .filter(([propertyKey, value]) => {\r\n if (value === undefined || value === null) return false;\r\n return metadataByKey.get(propertyKey)?.viewType !== 'LookupMatrix';\r\n })\r\n .map(([propertyKey, value]) => {\r\n const meta = metadataByKey.get(propertyKey);\r\n const normalizedValue = normalizeSubmitValue(value, meta?.viewType);\r\n if (normalizedValue === undefined || normalizedValue === null) {\r\n return null;\r\n }\r\n\r\n const submitField: ProcessFormSubmitField = {\r\n propertyKey,\r\n value: normalizedValue,\r\n };\r\n\r\n if (meta?.propertyId) {\r\n submitField.requestPropertyId = meta.propertyId;\r\n }\r\n\r\n return submitField;\r\n })\r\n .filter((value): value is ProcessFormSubmitField => !!value);\r\n}\r\n\r\nexport function getPreviewOnlyFieldKeys(\r\n config: ClientFormConfiguration,\r\n mode: 'create' | 'edit' = 'create',\r\n readonly = false,\r\n): string[] {\r\n return config.sections.flatMap((section) =>\r\n (section.fields ?? [])\r\n .filter(\r\n (field) =>\r\n isFieldVisible(field, mode) && isPreviewOnlyField(field, readonly),\r\n )\r\n .map((field) => field.propertyKey),\r\n );\r\n}\r\n\r\nexport function mapPreviewFieldsToEntities(\r\n config: ClientFormConfiguration,\r\n values: ProcessFormValue[],\r\n mode: 'create' | 'edit' = 'create',\r\n readonly = false,\r\n): EntityData[] {\r\n return mapPreviewSectionsToEntities(\r\n config,\r\n values,\r\n 'en',\r\n mode,\r\n readonly,\r\n ).flatMap((section) => section.entities);\r\n}\r\n\r\nexport function mapPreviewSectionsToEntities(\r\n config: ClientFormConfiguration,\r\n values: ProcessFormValue[],\r\n lang: 'en' | 'ar' = 'en',\r\n mode: 'create' | 'edit' = 'create',\r\n readonly = false,\r\n): ClientFormPreviewSection[] {\r\n const fieldMap = buildFieldValueMap(config);\r\n const previewValueByKey = new Map<string, any>();\r\n const comparisonByKey = new Map<string, PropertyValueComparison>();\r\n\r\n for (const value of values) {\r\n if (value.metadata?.source === 'ProcessVirtual') continue;\r\n\r\n const targetFieldKey =\r\n resolveValueTargetKey(value, fieldMap) ?? value.propertyKey ?? null;\r\n if (!targetFieldKey) continue;\r\n\r\n previewValueByKey.set(targetFieldKey, value.value);\r\n if (value.comparison) {\r\n comparisonByKey.set(targetFieldKey, value.comparison);\r\n }\r\n }\r\n\r\n return config.sections\r\n .slice()\r\n .sort((a, b) => a.order - b.order)\r\n .map((section) => ({\r\n key: section.id,\r\n label: section.name[lang] ?? section.name.en ?? '',\r\n order: section.order,\r\n entities: (section.fields ?? [])\r\n .filter(\r\n (field) =>\r\n isFieldVisible(field, mode) && isPreviewOnlyField(field, readonly),\r\n )\r\n .sort((a, b) => a.order - b.order)\r\n .map((field) => {\r\n const property = field.propertyMetadata;\r\n\r\n return {\r\n ...(property as EntityData),\r\n name: (property.name as any)?.display,\r\n key: property.key ?? field.propertyKey,\r\n value: previewValueByKey.get(field.propertyKey),\r\n order: section.order * 1000 + field.order,\r\n configuration: {\r\n ...(property.configuration as Record<string, unknown>),\r\n size: WIDTH_TO_ENTITY_SIZE[field.width] ?? 24,\r\n labelPosition: 'top',\r\n },\r\n comparison: comparisonByKey.get(field.propertyKey),\r\n } satisfies EntityData;\r\n }),\r\n }))\r\n .filter((section) => section.entities.length > 0);\r\n}\r\n\r\n// ============================================================================\r\n// Internal Helpers\r\n// ============================================================================\r\n\r\nfunction isFieldVisible(\r\n field: ClientFormField,\r\n mode: 'create' | 'edit',\r\n): boolean {\r\n if (!isFieldReadable(field) && field.isWrite !== true) return false;\r\n if (mode === 'create') return !field.hiddenInCreation;\r\n return !field.hiddenInEditForm;\r\n}\r\n\r\nfunction isPreviewOnlyField(field: ClientFormField, readonly = false): boolean {\r\n return isFieldReadable(field) && (readonly || field.isWrite === false);\r\n}\r\n\r\nfunction isFieldReadable(field: ClientFormField): boolean {\r\n return field.isRead !== false || field.isWrite === true;\r\n}\r\n\r\nfunction isCalculatedField(field: ClientFormField): boolean {\r\n return field.propertyMetadata?.isCalculated === true;\r\n}\r\n\r\nfunction resolveFieldMeta(field: ClientFormField): {\r\n property: ClientPropertyItem;\r\n propertyId?: number;\r\n viewType: string;\r\n} {\r\n const property = field.propertyMetadata;\r\n return {\r\n property,\r\n propertyId: property?.propertyId,\r\n viewType: property?.viewType ?? 'Text',\r\n };\r\n}\r\n\r\nfunction mapFieldToConfig(\r\n field: ClientFormField,\r\n lang: 'en' | 'ar',\r\n lookups: ClientLookup[],\r\n context: ProcessFormContext | null,\r\n readonly = false,\r\n teamMemberOptions: TeamMemberOption[] = [],\r\n): DynamicFieldConfig {\r\n const { property: prop, viewType } = resolveFieldMeta(field);\r\n const label =\r\n (prop?.name as { display?: string } | undefined)?.display ??\r\n field.propertyKey;\r\n const colSpan = WIDTH_TO_COLSPAN[field.width] ?? 12;\r\n\r\n const base = {\r\n key: field.propertyKey,\r\n label,\r\n colSpan,\r\n order: field.order,\r\n placeholder: label,\r\n required: field.isRequired ?? false,\r\n disabled: isCalculatedField(field),\r\n readonly: readonly || field.isWrite === false,\r\n validators: field.isRequired\r\n ? [ValidatorConfig.required(`${label} is required`)]\r\n : [],\r\n formulaCondition: buildFormulaCondition(field),\r\n };\r\n\r\n switch (viewType) {\r\n // ── Text-like ──────────────────────────────────────────────\r\n case 'Text':\r\n case 'EditableListView':\r\n case 'LookupLog':\r\n return new TextFieldConfig(base);\r\n\r\n case 'LongText':\r\n return new EditorFieldConfig(base);\r\n\r\n // ── Numeric ───────────────────────────────────────────────\r\n case 'Number':\r\n return new NumberFieldConfig(base);\r\n\r\n case 'Currency':\r\n return new NumberFieldConfig({\r\n ...base,\r\n useGrouping: true,\r\n });\r\n\r\n case 'Percentage':\r\n return new SliderFieldConfig({\r\n ...base,\r\n min: 0,\r\n max: 100,\r\n unit: '%',\r\n });\r\n\r\n // ── Date / Time ───────────────────────────────────────────\r\n case 'Date':\r\n return new DateFieldConfig({ ...base, showTime: false });\r\n\r\n case 'DateTime':\r\n return new DateFieldConfig({ ...base, showTime: true });\r\n\r\n case 'Time':\r\n return new DateFieldConfig({ ...base, showTime: true });\r\n\r\n // ── Boolean ───────────────────────────────────────────────\r\n case 'Checkbox':\r\n return new ToggleFieldConfig(base);\r\n\r\n // ── File ──────────────────────────────────────────────────\r\n case 'Attachment': {\r\n const isMultiple =\r\n (prop?.configuration?.['IsMulitple'] as boolean) ?? false;\r\n return new UploadFileFieldConfig({\r\n ...base,\r\n multiple: isMultiple,\r\n });\r\n }\r\n\r\n // ── User Search ───────────────────────────────────────────\r\n case 'User': {\r\n const justTeamMembers = !!prop?.configuration?.['justTeamMembers'];\r\n if (justTeamMembers) {\r\n return new SelectFieldConfig({\r\n ...base,\r\n options: teamMemberOptions,\r\n optionLabel: 'label',\r\n optionValue: 'value',\r\n filter: teamMemberOptions.length > 10,\r\n showClear: !(field.isRequired ?? false),\r\n });\r\n }\r\n return new UserSearchFieldConfig({\r\n ...base,\r\n apiUrl: 'Identity/users',\r\n context: new HttpContext().set(REQUEST_CONTEXT, {\r\n useBaseUrl: false,\r\n }),\r\n });\r\n }\r\n\r\n case 'MultiUser':\r\n return new UserSearchFieldConfig({\r\n ...base,\r\n apiUrl: 'Identity/users',\r\n isMultiple: true,\r\n context: new HttpContext().set(REQUEST_CONTEXT, {\r\n useBaseUrl: false,\r\n }),\r\n });\r\n\r\n // ── Lookup (single select) ────────────────────────────────\r\n case 'Lookup': {\r\n const items = resolveLookupOptions(prop, lookups);\r\n return new SelectFieldConfig({\r\n ...base,\r\n options: items,\r\n optionLabel: 'label',\r\n optionValue: 'value',\r\n filter: items.length > 10,\r\n showClear: !(field.isRequired ?? false),\r\n });\r\n }\r\n\r\n // ── Lookup (multi select) ─────────────────────────────────\r\n case 'LookupMultiSelect': {\r\n const items = resolveLookupOptions(prop, lookups);\r\n return new MultiSelectFieldConfig({\r\n ...base,\r\n options: items,\r\n optionLabel: 'label',\r\n optionValue: 'value',\r\n filter: items.length > 10,\r\n display: 'chip',\r\n });\r\n }\r\n\r\n // ── Other select-based types ──────────────────────────────\r\n case 'Status':\r\n case 'InternalModule':\r\n case 'DynamicList':\r\n case 'API':\r\n case 'Location': {\r\n const options = extractOptionsFromProperty(prop);\r\n return new SelectFieldConfig({\r\n ...base,\r\n options: options ?? [],\r\n optionLabel: 'label',\r\n optionValue: 'value',\r\n });\r\n }\r\n\r\n case 'LookupMatrix':\r\n return buildLookupMatrixFieldConfig(base, prop, lookups);\r\n\r\n // ── Connection (level-to-level) ─────────────────────────\r\n case 'Connection': {\r\n const connectionConfig = prop?.configuration ?? {};\r\n return new SchemaConnectionFieldConfig({\r\n ...base,\r\n configuration: connectionConfig,\r\n });\r\n }\r\n case 'Predecessor':\r\n return new SchedulePredecessorFieldConfig({\r\n ...base,\r\n configuration: prop?.configuration ?? null,\r\n runtimeContext: context\r\n ? {\r\n levelId: context.levelId,\r\n levelDataId: context.levelDataId,\r\n moduleDataId: context.moduleDataId,\r\n }\r\n : null,\r\n });\r\n\r\n // ── Fallback ──────────────────────────────────────────────\r\n default:\r\n return new TextFieldConfig(base);\r\n }\r\n}\r\n\r\nfunction buildFormulaCondition(\r\n field: ClientFormField,\r\n): { formulaTokens: string; formulaText?: string; mode?: 'auto' } | undefined {\r\n if (!field.showConditionalDisplayFormula) return undefined;\r\n const formulaTokens = (field.conditionalDisplayFormula ?? '').trim();\r\n if (!formulaTokens) return undefined;\r\n\r\n return {\r\n formulaTokens,\r\n formulaText: field.conditionalDisplayFormula ?? '',\r\n mode: 'auto',\r\n };\r\n}\r\n\r\n/**\r\n * Resolve lookup items for Lookup / LookupMultiSelect viewTypes.\r\n *\r\n * Reads `configuration.lookup` (the lookup ID) from the property metadata,\r\n * finds the matching lookup definition, and maps its items to select options.\r\n */\r\nfunction resolveLookupOptions(\r\n prop: ClientPropertyItem | undefined,\r\n lookups: ClientLookup[],\r\n): ResolvedLookupOption[] {\r\n return resolveLookupOptionsById(\r\n coerceLookupId(prop?.configuration?.['lookup']),\r\n lookups,\r\n );\r\n}\r\n\r\n/**\r\n * Fallback option extractor for non-lookup select types\r\n * (Status, InternalModule, DynamicList, API, etc.).\r\n */\r\nfunction extractOptionsFromProperty(\r\n property: ClientPropertyItem | undefined,\r\n): { label: string; value: any }[] | null {\r\n if (!property?.configuration) return null;\r\n\r\n const config = property.configuration;\r\n\r\n if (Array.isArray(config['options'])) {\r\n return config['options'] as { label: string; value: any }[];\r\n }\r\n\r\n if (Array.isArray(config['items'])) {\r\n return (config['items'] as any[]).map((item) => ({\r\n label:\r\n typeof item.name === 'string'\r\n ? item.name\r\n : (item.name?.['en'] ?? item.label ?? String(item.value)),\r\n value: item.id ?? item.value ?? item.key,\r\n }));\r\n }\r\n\r\n return null;\r\n}\r\n\r\ntype ResolvedLookupOption = {\r\n id?: number | string;\r\n key?: string;\r\n label: string;\r\n value: any;\r\n color?: string | null;\r\n description?: string;\r\n};\r\n\r\nfunction resolveLookupOptionsById(\r\n lookupId: number | null,\r\n lookups: ClientLookup[],\r\n): ResolvedLookupOption[] {\r\n if (!lookupId || !lookups.length) return [];\r\n\r\n const lookup = lookups.find((item) => item.id === lookupId);\r\n if (!lookup) return [];\r\n\r\n return lookup.items\r\n .slice()\r\n .sort((a, b) => a.order - b.order)\r\n .map((item) => ({\r\n id: item.id,\r\n key: item.key,\r\n label: item.name?.display ?? item.name?.en ?? item.key,\r\n value: item.key,\r\n color: item.color ?? null,\r\n description:\r\n item.description?.display ?? item.description?.en ?? undefined,\r\n }));\r\n}\r\n\r\nfunction resolveLookupNameById(\r\n lookupId: number | null,\r\n lookups: ClientLookup[],\r\n): string {\r\n if (!lookupId) return '';\r\n\r\n const lookup = lookups.find((item) => item.id === lookupId);\r\n return lookup?.name?.display ?? lookup?.name?.en ?? lookup?.key ?? '';\r\n}\r\n\r\nfunction buildLookupMatrixFieldConfig(\r\n base: {\r\n key: string;\r\n label: string;\r\n colSpan: number;\r\n order: number;\r\n placeholder: string;\r\n required: boolean;\r\n disabled: boolean;\r\n readonly: boolean;\r\n validators: ValidatorConfig[];\r\n formulaCondition:\r\n | { formulaTokens: string; formulaText?: string; mode?: 'auto' }\r\n | undefined;\r\n },\r\n prop: ClientPropertyItem | undefined,\r\n lookups: ClientLookup[],\r\n): LookupMatrixFieldConfig {\r\n const configuration = (prop?.configuration ?? {}) as Record<string, unknown>;\r\n const xLookupId = coerceLookupId(configuration['xlookupSource']);\r\n const yLookupId = coerceLookupId(configuration['ylookupSource']);\r\n const zLookupId = coerceLookupId(configuration['zlookupId']);\r\n\r\n const xOptions = resolveLookupOptionsById(xLookupId, lookups);\r\n const yOptions = resolveLookupOptionsById(yLookupId, lookups);\r\n const zOptions = resolveLookupOptionsById(zLookupId, lookups);\r\n const zOptionsById = new Map(\r\n zOptions\r\n .filter((item) => item.id != null)\r\n .map((item) => [String(item.id), item] as const),\r\n );\r\n\r\n const rawCells = Array.isArray(configuration['lookupsMatrix'])\r\n ? (configuration['lookupsMatrix'] as Array<Record<string, unknown>>)\r\n : [];\r\n\r\n return new LookupMatrixFieldConfig({\r\n ...base,\r\n required: false,\r\n xFieldKey: String(configuration['xPropertyLookupKey'] ?? ''),\r\n yFieldKey: String(configuration['yPropertyLookupKey'] ?? ''),\r\n xAxisLabel: resolveLookupNameById(xLookupId, lookups),\r\n yAxisLabel: resolveLookupNameById(yLookupId, lookups),\r\n xOptions,\r\n yOptions,\r\n cells: rawCells.map((cell) => {\r\n const zOption = zOptionsById.get(String(cell['value'] ?? ''));\r\n\r\n return {\r\n row: Number(cell['row'] ?? 0),\r\n column: Number(cell['column'] ?? 0),\r\n xLookupItemId: String(cell['xValue'] ?? ''),\r\n yLookupItemId: String(cell['yValue'] ?? ''),\r\n zLookupItemId: cell['value'] == null ? null : String(cell['value']),\r\n label: zOption?.label ?? String(cell['value'] ?? ''),\r\n color: zOption?.color ?? null,\r\n };\r\n }),\r\n });\r\n}\r\n\r\nfunction coerceLookupId(value: unknown): number | null {\r\n if (typeof value === 'number' && Number.isFinite(value)) {\r\n return value;\r\n }\r\n\r\n if (typeof value === 'string' && value.trim() !== '') {\r\n const parsed = Number(value);\r\n return Number.isFinite(parsed) ? parsed : null;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction normalizeSubmitValue(value: any, viewType?: string): any {\r\n switch (viewType) {\r\n case 'User':\r\n if (value && typeof value === 'object' && !Array.isArray(value)) {\r\n return value['id'] ?? value;\r\n }\r\n return value;\r\n\r\n case 'MultiUser':\r\n if (Array.isArray(value)) {\r\n return value.map((v) =>\r\n v && typeof v === 'object' ? (v['id'] ?? v) : v,\r\n );\r\n }\r\n return value;\r\n\r\n case 'Attachment':\r\n if (Array.isArray(value)) {\r\n return value.map((v) =>\r\n v && typeof v === 'object' ? (v['id'] ?? v) : v,\r\n );\r\n }\r\n if (value && typeof value === 'object') {\r\n return value['id'] ?? value;\r\n }\r\n return value;\r\n\r\n default:\r\n return value;\r\n }\r\n}\r\n\r\nfunction resolveLoadedFieldValue(value: ProcessFormValue): any {\r\n const resolvedValue =\r\n value.metadata?.viewType === 'User'\r\n ? value.value\r\n : (value.rawValue ?? value.value);\r\n\r\n switch (value.metadata?.viewType) {\r\n // case 'Date':\r\n // case 'DateTime':\r\n // case 'Time':\r\n // return coerceToDate(resolvedValue);\r\n\r\n default:\r\n return resolvedValue;\r\n }\r\n}\r\n\r\n// function coerceToDate(value: any): any {\r\n// if (value === null || value === undefined || value === '') {\r\n// return value;\r\n// }\r\n\r\n// if (value instanceof Date) {\r\n// return value;\r\n// }\r\n\r\n// const coerced = new Date(value);\r\n// return Number.isNaN(coerced.getTime()) ? value : coerced;\r\n// }\r\n\r\ntype FieldValueMeta = {\r\n key: string;\r\n propertyId?: number;\r\n};\r\n\r\ntype FieldValueMap = {\r\n fieldsByKey: Map<string, FieldValueMeta>;\r\n propertyIdToKey: Map<number, string>;\r\n aliasToKey: Map<string, string>;\r\n};\r\n\r\nfunction buildFieldValueMap(config: ClientFormConfiguration): FieldValueMap {\r\n const fieldsByKey = new Map<string, FieldValueMeta>();\r\n const propertyIdCandidates = new Map<number, Set<string>>();\r\n const aliasCandidates = new Map<string, Set<string>>();\r\n\r\n for (const section of config.sections ?? []) {\r\n for (const field of section.fields ?? []) {\r\n const { propertyId } = resolveFieldMeta(field);\r\n const fieldMeta: FieldValueMeta = {\r\n key: field.propertyKey,\r\n propertyId,\r\n };\r\n\r\n fieldsByKey.set(field.propertyKey, fieldMeta);\r\n\r\n if (propertyId != null) {\r\n if (!propertyIdCandidates.has(propertyId)) {\r\n propertyIdCandidates.set(propertyId, new Set<string>());\r\n }\r\n propertyIdCandidates.get(propertyId)!.add(field.propertyKey);\r\n }\r\n\r\n const aliases = new Set<string>([\r\n field.propertyKey,\r\n stripTemplatePrefix(field.propertyKey),\r\n ]);\r\n\r\n const property = field.propertyMetadata;\r\n if (property?.key) {\r\n aliases.add(property.key);\r\n aliases.add(stripTemplatePrefix(property.key));\r\n }\r\n\r\n aliases.forEach((alias) => {\r\n if (!alias) return;\r\n if (!aliasCandidates.has(alias)) {\r\n aliasCandidates.set(alias, new Set<string>());\r\n }\r\n aliasCandidates.get(alias)!.add(field.propertyKey);\r\n });\r\n }\r\n }\r\n\r\n const propertyIdToKey = new Map<number, string>();\r\n propertyIdCandidates.forEach((keys, propertyId) => {\r\n if (keys.size !== 1) return;\r\n propertyIdToKey.set(propertyId, [...keys][0]);\r\n });\r\n\r\n const aliasToKey = new Map<string, string>();\r\n aliasCandidates.forEach((keys, alias) => {\r\n if (keys.size !== 1) return;\r\n aliasToKey.set(alias, [...keys][0]);\r\n });\r\n\r\n return {\r\n fieldsByKey,\r\n propertyIdToKey,\r\n aliasToKey,\r\n };\r\n}\r\n\r\nfunction resolveValueTargetKey(\r\n value: ProcessFormValue,\r\n fieldMap: FieldValueMap | null,\r\n): string | null {\r\n if (!fieldMap) {\r\n return value.propertyKey ?? null;\r\n }\r\n\r\n const exactCandidates = [value.propertyKey, value.metadata?.key].filter(\r\n (candidate): candidate is string => !!candidate,\r\n );\r\n\r\n for (const candidate of exactCandidates) {\r\n if (fieldMap.fieldsByKey.has(candidate)) {\r\n return candidate;\r\n }\r\n }\r\n\r\n const propertyId = value.metadata?.propertyId;\r\n if (propertyId != null && fieldMap.propertyIdToKey.has(propertyId)) {\r\n return fieldMap.propertyIdToKey.get(propertyId)!;\r\n }\r\n\r\n const aliasCandidates = exactCandidates.flatMap((candidate) => [\r\n candidate,\r\n stripTemplatePrefix(candidate),\r\n ]);\r\n\r\n for (const candidate of aliasCandidates) {\r\n if (!candidate) continue;\r\n if (fieldMap.aliasToKey.has(candidate)) {\r\n return fieldMap.aliasToKey.get(candidate)!;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction stripTemplatePrefix(value: string): string {\r\n return value.replace(/^template_\\d+_/, '');\r\n}\r\n","import {\r\n Component,\r\n computed,\r\n ElementRef,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n untracked,\r\n OnDestroy,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport { Message } from 'primeng/message';\r\nimport { Skeleton } from 'primeng/skeleton';\r\n\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { ConfirmationService } from '@masterteam/components/confirmation';\r\nimport { EntitiesPreview } from '@masterteam/components/entities';\r\nimport { Tabs, type OptionItem } from '@masterteam/components/tabs';\r\nimport { DynamicForm } from '@masterteam/forms/dynamic-form';\r\nimport { Icon } from '@masterteam/icons';\r\nimport type {\r\n DynamicFormConfig,\r\n FormulaRuntimeMessage,\r\n} from '@masterteam/components';\r\n\r\nimport { ClientFormApiService } from './services/client-form-api.service';\r\nimport { ClientFormStateService } from './services/client-form-state.service';\r\nimport {\r\n getPreviewOnlyFieldKeys,\r\n mapPreviewSectionsToEntities,\r\n mapToDynamicFormConfig,\r\n mapValuesToFormValue,\r\n mapFormValueToSubmitFields,\r\n type TeamMemberOption,\r\n} from './utils/form-config-mapper';\r\n\r\nimport type {\r\n ClientFormFooterState,\r\n ClientFormResolvedRenderMode,\r\n ProcessFormLoadRequest,\r\n ProcessFormLoadResponse,\r\n ProcessFormSubmitRequest,\r\n ProcessFormSubmitResponse,\r\n ProcessFormSubmitField,\r\n ProcessFormValidationRuleResult,\r\n ProcessFormMode,\r\n ProcessFormSource,\r\n ProcessFormValue,\r\n ClientLookup,\r\n ClientFormSubmitRequestMapper,\r\n ClientFormTranslatableValue,\r\n} from './models/client-form.model';\r\nimport {\r\n TranslocoDirective,\r\n TranslocoPipe,\r\n TranslocoService,\r\n} from '@jsverse/transloco';\r\n\r\ntype StepTimelineState = 'completed' | 'current' | 'upcoming';\r\n\r\ninterface StepTimelineItem {\r\n key: string;\r\n label: string;\r\n value: number;\r\n state: StepTimelineState;\r\n selected: boolean;\r\n beforeLineActive: boolean;\r\n afterLineActive: boolean;\r\n}\r\n\r\n/**\r\n * Client Form — Runtime process form component.\r\n *\r\n * Self-contained, signal-based (no NGXS). Each instance manages its own state\r\n * via a component-scoped `ClientFormStateService`.\r\n *\r\n * Submit and reset actions stay external. Step navigation buttons are optional\r\n * and can be hidden with `showInternalStepActions`.\r\n *\r\n * Parent can control actions via `viewChild()`:\r\n *\r\n * ```html\r\n * <mt-client-form #processForm [moduleKey]=\"'Risk'\" [operationKey]=\"'CloseRisk'\" />\r\n * <button (click)=\"processForm.load()\">Load</button>\r\n * <button (click)=\"processForm.submit()\">Submit</button>\r\n * ```\r\n *\r\n * Or programmatically:\r\n * ```typescript\r\n * readonly processForm = viewChild.required(ClientForm);\r\n * this.processForm().load();\r\n * this.processForm().submit();\r\n * ```\r\n */\r\n@Component({\r\n selector: 'mt-client-form',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n Button,\r\n Card,\r\n EntitiesPreview,\r\n DynamicForm,\r\n Tabs,\r\n Skeleton,\r\n Icon,\r\n Message,\r\n TranslocoDirective,\r\n TranslocoPipe,\r\n ],\r\n providers: [ClientFormStateService],\r\n templateUrl: './client-form.html',\r\n styleUrls: ['./client-form.scss'],\r\n})\r\nexport class ClientForm implements OnDestroy {\r\n private readonly api = inject(ClientFormApiService);\r\n private readonly teamMemberOptions = signal<TeamMemberOption[]>([]);\r\n private readonly confirmationService = inject(ConfirmationService);\r\n protected readonly state = inject(ClientFormStateService);\r\n readonly validationSummary =\r\n viewChild<ElementRef<HTMLElement>>('validationSummary');\r\n\r\n private loadSub?: Subscription;\r\n private submitSub?: Subscription;\r\n private formValueSub?: Subscription;\r\n private readonly hasStartedLoad = signal(false);\r\n private readonly stepValidationPending = signal(false);\r\n private readonly formRuntimeMessages = signal<FormulaRuntimeMessage[]>([]);\r\n private readonly submitValidationMessages = signal<FormulaRuntimeMessage[]>(\r\n [],\r\n );\r\n readonly runtimeMessages = computed(() => [\r\n ...this.formRuntimeMessages(),\r\n ...this.submitValidationMessages(),\r\n ]);\r\n private readonly translocoService = inject(TranslocoService);\r\n\r\n // ============================================================================\r\n // Public State Signals (for parent access via viewChild)\r\n // ============================================================================\r\n\r\n readonly submitting = computed(() => this.state.submitting());\r\n readonly submitError = computed(() => this.state.submitError());\r\n readonly isSubmitted = computed(() => this.state.isSubmitted());\r\n readonly isPendingApproval = computed(() => this.state.isPendingApproval());\r\n readonly isExecuted = computed(() => this.state.isExecuted());\r\n readonly isLoaded = computed(() => this.state.isLoaded());\r\n readonly loading = computed(() => this.state.loading());\r\n readonly runtimeErrors = computed(() =>\r\n this.runtimeMessages().filter((msg) => msg.severity === 'error'),\r\n );\r\n readonly runtimeWarnings = computed(() =>\r\n this.runtimeMessages().filter((msg) => msg.severity === 'warning'),\r\n );\r\n readonly currentStep = signal(1);\r\n\r\n // ============================================================================\r\n // Inputs — Required Context\r\n // ============================================================================\r\n\r\n readonly moduleKey = input.required<string>();\r\n readonly operationKey = input.required<string>();\r\n\r\n // ============================================================================\r\n // Inputs — Optional Context\r\n // ============================================================================\r\n\r\n readonly moduleId = input<number | string>();\r\n readonly levelId = input<number | string>();\r\n readonly levelDataId = input<number | string>();\r\n readonly moduleDataId = input<number | string>();\r\n readonly requestSchemaId = input<number>();\r\n readonly draftProcessId = input<number>();\r\n readonly preview = input(false);\r\n readonly returnUrl = input<string>();\r\n readonly defaultValues = input<Record<string, any> | null>(null);\r\n readonly submitRequestMapper = input<ClientFormSubmitRequestMapper | null>(\r\n null,\r\n );\r\n\r\n // ============================================================================\r\n // Inputs — UI Configuration\r\n // ============================================================================\r\n\r\n readonly readonly = input(false);\r\n readonly autoLoad = input(true);\r\n readonly formMode = input<'create' | 'edit'>('create');\r\n readonly renderMode = input<\r\n 'form' | 'steps' | 'tabs' | 'wizard' | undefined\r\n >();\r\n // Hide the built-in previous/next buttons when step actions are rendered by the parent.\r\n readonly showInternalStepActions = input<boolean>(true);\r\n readonly confirmWarningsOnSubmit = input(true);\r\n readonly confirmWarningsOnStepChange = input(true);\r\n readonly lang = signal(this.translocoService.getActiveLang() as 'en' | 'ar');\r\n readonly lookups = input<ClientLookup[]>([]);\r\n readonly ignoredFieldKeys = input<string[]>([]);\r\n readonly rtl = computed(() => this.lang() === 'ar');\r\n readonly stepNavigationValidating = computed(() =>\r\n this.stepValidationPending(),\r\n );\r\n\r\n // ============================================================================\r\n // Outputs\r\n // ============================================================================\r\n\r\n readonly loaded = output<ProcessFormLoadResponse>();\r\n readonly submitted = output<ProcessFormSubmitResponse>();\r\n readonly errored = output<string>();\r\n readonly modeDetected = output<ProcessFormMode>();\r\n readonly formSourceDetected = output<ProcessFormSource>();\r\n readonly footerStateChanged = output<ClientFormFooterState>();\r\n\r\n // ============================================================================\r\n // Internal Form Control\r\n // ============================================================================\r\n\r\n readonly formControl = new FormControl<Record<string, any>>({});\r\n\r\n // ============================================================================\r\n // Computed — Dynamic Form Config\r\n // ============================================================================\r\n\r\n readonly formConfig = computed<DynamicFormConfig | null>(() => {\r\n const config = this.state.formConfiguration();\r\n if (!config) return null;\r\n return mapToDynamicFormConfig(\r\n config,\r\n this.lang(),\r\n this.formMode(),\r\n this.lookups(),\r\n this.state.context(),\r\n this.readonly(),\r\n this.teamMemberOptions(),\r\n );\r\n });\r\n\r\n readonly initialValues = computed<Record<string, any>>(() => {\r\n const mappedValues = mapValuesToFormValue(\r\n this.state.formValues(),\r\n this.state.formConfiguration(),\r\n );\r\n\r\n return {\r\n ...(this.defaultValues() ?? {}),\r\n ...mappedValues,\r\n };\r\n });\r\n\r\n readonly virtualFields = computed<ProcessFormValue[]>(() =>\r\n this.state.virtualFields(),\r\n );\r\n\r\n readonly hasVirtualFields = computed(() => this.virtualFields().length > 0);\r\n readonly previewFieldKeys = computed(() => {\r\n const config = this.state.formConfiguration();\r\n if (!config) return [];\r\n return [\r\n ...new Set([\r\n ...getPreviewOnlyFieldKeys(config, this.formMode(), this.readonly()),\r\n ...this.ignoredFieldKeys(),\r\n ]),\r\n ];\r\n });\r\n readonly previewEntitySections = computed(() => {\r\n const config = this.state.formConfiguration();\r\n if (!config) return [];\r\n const ignoredFieldKeys = new Set(this.ignoredFieldKeys());\r\n return mapPreviewSectionsToEntities(\r\n config,\r\n this.state.formValues(),\r\n this.lang(),\r\n this.formMode(),\r\n this.readonly(),\r\n )\r\n .map((section) => ({\r\n ...section,\r\n entities: section.entities.filter(\r\n (entity) => !entity.key || !ignoredFieldKeys.has(entity.key),\r\n ),\r\n }))\r\n .filter((section) => section.entities.length > 0);\r\n });\r\n readonly editableFormConfig = computed<DynamicFormConfig | null>(() => {\r\n if (this.readonly()) {\r\n return null;\r\n }\r\n\r\n const config = this.formConfig();\r\n if (!config) return null;\r\n\r\n const previewFieldKeys = new Set(this.previewFieldKeys());\r\n\r\n return {\r\n ...config,\r\n sections: config.sections\r\n .map((section) => ({\r\n ...section,\r\n fields: section.fields.filter(\r\n (field) => !field.key || !previewFieldKeys.has(field.key),\r\n ),\r\n }))\r\n .filter((section) =>\r\n section.fields.some((field) => field.type !== 'spacer'),\r\n ),\r\n };\r\n });\r\n readonly stepSections = computed(\r\n () => this.editableFormConfig()?.sections ?? [],\r\n );\r\n readonly hasEditableFormSections = computed(\r\n () => this.stepSections().length > 0,\r\n );\r\n readonly effectiveRenderMode = computed<'form' | 'steps' | 'tabs' | 'wizard'>(\r\n () => {\r\n const explicitRenderMode = this.renderMode();\r\n if (explicitRenderMode) return explicitRenderMode;\r\n\r\n const configRenderMode = this.state.formConfiguration()?.renderMode;\r\n if (\r\n configRenderMode === 'steps' ||\r\n configRenderMode === 'tabs' ||\r\n configRenderMode === 'wizard'\r\n ) {\r\n return configRenderMode;\r\n }\r\n\r\n return 'form';\r\n },\r\n );\r\n readonly stepsEnabled = computed(\r\n () =>\r\n this.effectiveRenderMode() === 'steps' && this.stepSections().length > 1,\r\n );\r\n readonly tabsEnabled = computed(\r\n () =>\r\n this.effectiveRenderMode() === 'tabs' && this.stepSections().length > 1,\r\n );\r\n readonly wizardEnabled = computed(\r\n () =>\r\n this.effectiveRenderMode() === 'wizard' && this.stepSections().length > 1,\r\n );\r\n readonly wizardFormConfig = computed<DynamicFormConfig | null>(() => {\r\n const config = this.editableFormConfig();\r\n if (!config) return null;\r\n return {\r\n ...config,\r\n sections: config.sections.map((s) => ({ ...s, label: undefined })),\r\n };\r\n });\r\n readonly sectionNavigationEnabled = computed(\r\n () => this.stepsEnabled() || this.tabsEnabled() || this.wizardEnabled(),\r\n );\r\n readonly tabOptions = computed<OptionItem[]>(() =>\r\n this.stepSections().map((section, index) => ({\r\n label: section.label || `Tab ${index + 1}`,\r\n value: index + 1,\r\n })),\r\n );\r\n readonly stepTimeline = computed<StepTimelineItem[]>(() => {\r\n const sections = this.stepSections();\r\n const currentStep = this.currentStep();\r\n\r\n return sections.map((section, index) => {\r\n const value = index + 1;\r\n const state = this.resolveStepTimelineState(value, currentStep);\r\n\r\n return {\r\n key: section.key || `section-${index}`,\r\n label: section.label || `Step ${value}`,\r\n value,\r\n state,\r\n selected: value === currentStep,\r\n beforeLineActive: index > 0 && value <= currentStep,\r\n afterLineActive: index < sections.length - 1 && value < currentStep,\r\n };\r\n });\r\n });\r\n readonly visibleSectionKeys = computed(() => {\r\n if (!this.sectionNavigationEnabled()) return null;\r\n\r\n const currentIndex = this.currentStep() - 1;\r\n const activeSection = this.stepSections()[currentIndex];\r\n\r\n if (!activeSection) return null;\r\n\r\n return [activeSection.key || `section-${currentIndex}`];\r\n });\r\n readonly forcedHiddenFieldKeys = computed(() => {\r\n if (!this.sectionNavigationEnabled()) return [];\r\n\r\n const sections = this.stepSections();\r\n const currentIndex = this.currentStep() - 1;\r\n const hiddenFieldKeys = new Set<string>();\r\n\r\n sections.forEach((section, index) => {\r\n if (index === currentIndex) return;\r\n section.fields\r\n .map((field) => field.key)\r\n .filter((key): key is string => !!key)\r\n .forEach((key) => hiddenFieldKeys.add(key));\r\n });\r\n\r\n return [...hiddenFieldKeys];\r\n });\r\n readonly effectiveForcedHiddenFieldKeys = computed(() => {\r\n return [\r\n ...new Set([...this.forcedHiddenFieldKeys(), ...this.ignoredFieldKeys()]),\r\n ];\r\n });\r\n readonly footerLoading = computed(() => {\r\n return (\r\n this.state.loading() ||\r\n (this.autoLoad() &&\r\n !this.hasStartedLoad() &&\r\n !this.state.isLoaded() &&\r\n !this.state.error())\r\n );\r\n });\r\n readonly footerState = computed<ClientFormFooterState>(() => {\r\n const loading = this.footerLoading();\r\n const isLoaded = this.state.isLoaded();\r\n const renderMode = this.effectiveRenderMode();\r\n const stepNavigationEnabled = this.stepsEnabled() || this.wizardEnabled();\r\n const sectionNavigationEnabled = this.sectionNavigationEnabled();\r\n const currentStep = this.currentStep();\r\n const stepCount = this.stepSections().length;\r\n const stepValidationPending = this.stepValidationPending();\r\n const canGoToPreviousStep =\r\n stepNavigationEnabled && currentStep > 1 && !stepValidationPending;\r\n const canGoToNextStep =\r\n stepNavigationEnabled &&\r\n currentStep < stepCount &&\r\n !stepValidationPending;\r\n\r\n return {\r\n loading,\r\n isLoaded,\r\n renderMode,\r\n actionMode: loading\r\n ? 'loading'\r\n : stepNavigationEnabled\r\n ? 'steps'\r\n : 'submit',\r\n stepNavigationEnabled,\r\n sectionNavigationEnabled,\r\n currentStep,\r\n stepCount,\r\n canGoToPreviousStep,\r\n canGoToNextStep,\r\n showPreviousStep: stepNavigationEnabled,\r\n showNextStep: stepNavigationEnabled && canGoToNextStep,\r\n showSubmit:\r\n isLoaded && !loading && (!stepNavigationEnabled || !canGoToNextStep),\r\n };\r\n });\r\n\r\n // ============================================================================\r\n // Effects\r\n // ============================================================================\r\n\r\n constructor() {\r\n this.formValueSub = this.formControl.valueChanges.subscribe(() => {\r\n if (this.submitValidationMessages().length > 0) {\r\n this.submitValidationMessages.set([]);\r\n }\r\n });\r\n\r\n // Auto-load when inputs are ready\r\n effect(() => {\r\n const autoLoad = this.autoLoad();\r\n const moduleKey = this.moduleKey();\r\n const operationKey = this.operationKey();\r\n\r\n if (autoLoad && moduleKey && operationKey) {\r\n untracked(() => this.load());\r\n }\r\n });\r\n\r\n // Patch form values after load\r\n effect(() => {\r\n const values = this.initialValues();\r\n const isLoaded = this.state.isLoaded();\r\n\r\n if (isLoaded && Object.keys(values).length > 0) {\r\n untracked(() => {\r\n this.formControl.patchValue(values, { emitEvent: false });\r\n });\r\n }\r\n });\r\n\r\n effect(() => {\r\n const count = this.stepSections().length;\r\n const current = this.currentStep();\r\n\r\n if (count === 0) {\r\n if (current !== 1) this.currentStep.set(1);\r\n return;\r\n }\r\n\r\n if (current < 1 || current > count) {\r\n this.currentStep.set(1);\r\n }\r\n });\r\n\r\n effect(() => {\r\n const footerState = this.footerState();\r\n\r\n untracked(() => {\r\n this.footerStateChanged.emit(footerState);\r\n });\r\n });\r\n\r\n effect(() => {\r\n const submitValidationCount = this.submitValidationMessages().length;\r\n const validationSummary = this.validationSummary()?.nativeElement;\r\n\r\n if (submitValidationCount === 0 || !validationSummary) {\r\n return;\r\n }\r\n\r\n untracked(() => {\r\n queueMicrotask(() => {\r\n validationSummary.scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'start',\r\n });\r\n });\r\n });\r\n });\r\n }\r\n\r\n // ============================================================================\r\n // Public API (accessed via viewChild)\r\n // ============================================================================\r\n\r\n /**\r\n * Load form configuration from the API.\r\n * Builds request from current input values.\r\n */\r\n load(): void {\r\n if (this.state.loading()) return;\r\n\r\n this.loadSub?.unsubscribe();\r\n this.hasStartedLoad.set(true);\r\n this.teamMemberOptions.set([]);\r\n this.stepValidationPending.set(false);\r\n this.formRuntimeMessages.set([]);\r\n this.submitValidationMessages.set([]);\r\n this.state.loading.set(true);\r\n this.state.error.set(null);\r\n this.state.submitResponse.set(null);\r\n\r\n const request = this.buildLoadRequest();\r\n\r\n this.loadSub = this.api.load(request).subscribe({\r\n next: (response) => {\r\n this.state.loading.set(false);\r\n\r\n if (response.data) {\r\n this.state.setLoadResponse(response.data);\r\n this.loaded.emit(response.data);\r\n\r\n if (response.data.mode) {\r\n this.modeDetected.emit(response.data.mode);\r\n }\r\n\r\n if (response.data.formSource) {\r\n this.formSourceDetected.emit(response.data.formSource);\r\n }\r\n\r\n // Fetch team members if any User field has justTeamMembers=true\r\n const hasJustTeamMembers =\r\n response.data.formConfiguration?.sections\r\n .flatMap((s) => s.fields ?? [])\r\n .some(\r\n (f) =>\r\n f.propertyMetadata?.viewType === 'User' &&\r\n !!f.propertyMetadata?.configuration?.['justTeamMembers'],\r\n ) ?? false;\r\n\r\n const levelDataId =\r\n this.levelDataId() ?? response.data.context?.levelDataId;\r\n if (hasJustTeamMembers && levelDataId != null) {\r\n this.api.getTeamMembers(levelDataId).subscribe({\r\n next: (res) => {\r\n const options: TeamMemberOption[] = (res.data ?? []).map(\r\n (m) => ({\r\n label: m.user?.displayName ?? m.user?.fullName ?? m.userId,\r\n value: m.userId,\r\n }),\r\n );\r\n this.teamMemberOptions.set(options);\r\n },\r\n });\r\n }\r\n } else {\r\n const msg = response.message ?? 'Failed to load form';\r\n this.state.setError(msg);\r\n this.errored.emit(msg);\r\n }\r\n },\r\n error: (err) => {\r\n const msg =\r\n err?.error?.message ?? err?.message ?? 'Failed to load form';\r\n this.state.setError(msg);\r\n this.errored.emit(msg);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Submit the current form values.\r\n * Builds submit request from form value + load context.\r\n */\r\n submit(): void {\r\n if (this.state.submitting()) return;\r\n const loadResponse = this.state.loadResponse();\r\n if (!loadResponse) {\r\n const msg = 'Form must be loaded before submit';\r\n this.state.submitError.set(msg);\r\n this.errored.emit(msg);\r\n return;\r\n }\r\n\r\n this.submitSub?.unsubscribe();\r\n this.state.submitting.set(true);\r\n this.state.submitError.set(null);\r\n\r\n const submitRequest = this.buildSubmitRequest(loadResponse);\r\n const validationRequest = this.buildSubmitRequest(loadResponse, {\r\n IsSteps: this.resolveValidateIsSteps(false),\r\n });\r\n this.submitValidationMessages.set([]);\r\n\r\n this.submitSub = this.api.validate(validationRequest).subscribe({\r\n next: (validationResponse) => {\r\n const validation = validationResponse.data;\r\n\r\n if (!validation) {\r\n const msg = validationResponse.message ?? 'Failed to validate form';\r\n this.state.submitting.set(false);\r\n this.state.setSubmitError(msg);\r\n this.errored.emit(msg);\r\n return;\r\n }\r\n\r\n this.submitValidationMessages.set(\r\n this.mapSubmitValidationMessages(validation.results ?? []),\r\n );\r\n\r\n if (validation.hasBlockingFailures) {\r\n this.state.submitting.set(false);\r\n return;\r\n }\r\n\r\n const warnings = this.runtimeWarnings();\r\n if (this.confirmWarningsOnSubmit() && warnings.length > 0) {\r\n this.state.submitting.set(false);\r\n this.confirmValidationWarnings(\r\n warnings,\r\n 'clientForm.warning-confirmation-question',\r\n this.translocoService.translate('clientForm.continue-submit'),\r\n () => {\r\n this.state.submitting.set(true);\r\n this.submitValidationMessages.set([]);\r\n this.executeSubmit(submitRequest);\r\n },\r\n );\r\n return;\r\n }\r\n\r\n this.executeSubmit(submitRequest);\r\n },\r\n error: (err) => {\r\n this.state.submitting.set(false);\r\n const msg =\r\n err?.error?.message ?? err?.message ?? 'Failed to validate form';\r\n this.state.setSubmitError(msg);\r\n this.errored.emit(msg);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Get the current form value as a flat key-value object.\r\n */\r\n getFormValue(): Record<string, any> {\r\n return this.formControl.value ?? {};\r\n }\r\n\r\n /**\r\n * Get the current form value mapped to submit payload format.\r\n */\r\n getSubmitFields(): ProcessFormSubmitField[] {\r\n const loadResponse = this.state.loadResponse();\r\n if (!loadResponse) return [];\r\n return mapFormValueToSubmitFields(this.getFormValue(), loadResponse);\r\n }\r\n\r\n /**\r\n * Backward-compatible alias for consumers still using the previous helper name.\r\n */\r\n getSubmitValues(): ProcessFormSubmitField[] {\r\n return this.getSubmitFields();\r\n }\r\n\r\n /**\r\n * Check whether the current form state is valid.\r\n */\r\n isValid(): boolean {\r\n return this.formControl.valid && this.runtimeErrors().length === 0;\r\n }\r\n\r\n /**\r\n * Reset the component to its initial state.\r\n */\r\n reset(): void {\r\n this.loadSub?.unsubscribe();\r\n this.submitSub?.unsubscribe();\r\n this.stepValidationPending.set(false);\r\n this.formControl.reset({});\r\n this.formRuntimeMessages.set([]);\r\n this.submitValidationMessages.set([]);\r\n this.state.reset();\r\n }\r\n\r\n onRuntimeMessagesChange(messages: FormulaRuntimeMessage[]): void {\r\n this.formRuntimeMessages.set(messages ?? []);\r\n }\r\n\r\n onStepChange(value: number): void {\r\n const count = this.stepSections().length;\r\n if (value < 1 || value > count) return;\r\n if (this.stepValidationPending()) return;\r\n\r\n const currentStep = this.currentStep();\r\n if (value === currentStep) return;\r\n\r\n if (!this.requiresForwardStepValidation(value, currentStep)) {\r\n this.applyStepChange(value);\r\n return;\r\n }\r\n\r\n const targetStep = Math.min(value, currentStep + 1);\r\n this.validateAndAdvanceStep(targetStep);\r\n }\r\n\r\n goToPreviousStep(): void {\r\n this.onStepChange(this.currentStep() - 1);\r\n }\r\n\r\n goToNextStep(): void {\r\n this.onStepChange(this.currentStep() + 1);\r\n }\r\n\r\n canGoToPreviousStep(): boolean {\r\n return (\r\n (this.stepsEnabled() || this.wizardEnabled()) &&\r\n this.currentStep() > 1 &&\r\n !this.stepValidationPending()\r\n );\r\n }\r\n\r\n canGoToNextStep(): boolean {\r\n return (\r\n (this.stepsEnabled() || this.wizardEnabled()) &&\r\n this.currentStep() < this.stepSections().length &&\r\n !this.stepValidationPending()\r\n );\r\n }\r\n\r\n getCurrentStep(): number {\r\n return this.currentStep();\r\n }\r\n\r\n getStepCount(): number {\r\n return this.stepSections().length;\r\n }\r\n\r\n isStepNavigationEnabled(): boolean {\r\n return this.stepsEnabled();\r\n }\r\n\r\n isSectionNavigationEnabled(): boolean {\r\n return this.sectionNavigationEnabled();\r\n }\r\n\r\n isFooterLoading(): boolean {\r\n return this.footerState().loading;\r\n }\r\n\r\n getResolvedRenderMode(): ClientFormResolvedRenderMode {\r\n return this.footerState().renderMode;\r\n }\r\n\r\n getFooterState(): ClientFormFooterState {\r\n return this.footerState();\r\n }\r\n\r\n // ============================================================================\r\n // Lifecycle\r\n // ============================================================================\r\n\r\n ngOnDestroy(): void {\r\n this.loadSub?.unsubscribe();\r\n this.submitSub?.unsubscribe();\r\n this.formValueSub?.unsubscribe();\r\n }\r\n\r\n // ============================================================================\r\n // Private Helpers\r\n // ============================================================================\r\n\r\n private buildLoadRequest(): ProcessFormLoadRequest {\r\n const req: ProcessFormLoadRequest = {\r\n moduleKey: this.moduleKey(),\r\n operationKey: this.operationKey(),\r\n };\r\n\r\n const moduleId = this.moduleId();\r\n const levelId = this.levelId();\r\n const levelDataId = this.levelDataId();\r\n const moduleDataId = this.moduleDataId();\r\n const requestSchemaId = this.requestSchemaId();\r\n const draftProcessId = this.draftProcessId();\r\n const preview = this.preview();\r\n\r\n if (moduleId != null) req.moduleId = moduleId;\r\n if (levelId != null) req.levelId = levelId;\r\n if (levelDataId != null) req.levelDataId = levelDataId;\r\n if (moduleDataId != null) req.moduleDataId = moduleDataId;\r\n if (requestSchemaId != null) req.requestSchemaId = requestSchemaId;\r\n if (draftProcessId != null) req.draftProcessId = draftProcessId;\r\n if (preview) req.preview = preview;\r\n\r\n return req;\r\n }\r\n\r\n private buildSubmitRequest(\r\n loadResponse: ProcessFormLoadResponse,\r\n options?: {\r\n IsSteps?: boolean;\r\n },\r\n ): ProcessFormSubmitRequest {\r\n const context = this.state.context();\r\n const formValue = this.getFormValue();\r\n const fields: ProcessFormSubmitField[] = mapFormValueToSubmitFields(\r\n formValue,\r\n loadResponse,\r\n );\r\n\r\n const req: ProcessFormSubmitRequest = {\r\n moduleKey: this.moduleKey() ?? context?.moduleKey,\r\n operationKey: this.operationKey() ?? context?.operationKey,\r\n fields,\r\n };\r\n\r\n const moduleId = context?.moduleId ?? this.moduleId();\r\n const levelId = context?.levelId ?? this.levelId();\r\n const levelDataId = context?.levelDataId ?? this.levelDataId();\r\n const moduleDataId = context?.moduleDataId ?? this.moduleDataId();\r\n const requestSchemaId = context?.requestSchemaId ?? this.requestSchemaId();\r\n const recordId =\r\n moduleDataId ??\r\n (req.moduleKey === 'LevelData' && req.operationKey !== 'Create'\r\n ? levelDataId\r\n : undefined);\r\n const returnUrl = this.returnUrl();\r\n\r\n if (moduleId != null) req.moduleId = moduleId;\r\n if (levelId != null) req.levelId = levelId;\r\n if (levelDataId != null) req.levelDataId = levelDataId;\r\n if (moduleDataId != null) req.moduleDataId = moduleDataId;\r\n if (recordId != null) req.recordId = recordId;\r\n if (requestSchemaId != null) req.requestSchemaId = requestSchemaId;\r\n if (returnUrl) req.returnUrl = returnUrl;\r\n if (options?.IsSteps != null) req.IsSteps = options.IsSteps;\r\n\r\n const submitRequestMapper = this.submitRequestMapper();\r\n if (!submitRequestMapper) {\r\n return req;\r\n }\r\n\r\n return submitRequestMapper(req, {\r\n formValue,\r\n loadResponse,\r\n });\r\n }\r\n\r\n private validateAndAdvanceStep(targetStep: number): void {\r\n if (this.stepValidationPending()) {\r\n return;\r\n }\r\n\r\n const loadResponse = this.state.loadResponse();\r\n if (!loadResponse) {\r\n const msg = 'Form must be loaded before step navigation';\r\n this.state.setSubmitError(msg);\r\n this.submitValidationMessages.set([\r\n this.createValidationFeedbackMessage(msg, 'error'),\r\n ]);\r\n this.errored.emit(msg);\r\n return;\r\n }\r\n\r\n this.submitSub?.unsubscribe();\r\n this.stepValidationPending.set(true);\r\n this.state.submitError.set(null);\r\n this.submitValidationMessages.set([]);\r\n\r\n const request = this.buildSubmitRequest(loadResponse, {\r\n IsSteps: this.resolveValidateIsSteps(true),\r\n });\r\n\r\n this.submitSub = this.api.validate(request).subscribe({\r\n next: (validationResponse) => {\r\n this.stepValidationPending.set(false);\r\n\r\n const validation = validationResponse.data;\r\n if (!validation) {\r\n const msg = validationResponse.message ?? 'Failed to validate form';\r\n this.handleValidationRequestFailure(msg);\r\n return;\r\n }\r\n\r\n const backendMessages = this.mapSubmitValidationMessages(\r\n validation.results ?? [],\r\n );\r\n const localBlockingIssues = this.hasLocalBlockingValidationIssues();\r\n\r\n this.submitValidationMessages.set([\r\n ...backendMessages,\r\n ...(localBlockingIssues\r\n ? [\r\n this.createValidationFeedbackMessage(\r\n this.translocoService.translate('clientForm.validation-next'),\r\n 'error',\r\n ),\r\n ]\r\n : []),\r\n ]);\r\n\r\n if (validation.hasBlockingFailures || localBlockingIssues) {\r\n return;\r\n }\r\n\r\n const warnings = this.runtimeWarnings();\r\n if (this.confirmWarningsOnStepChange() && warnings.length > 0) {\r\n this.confirmValidationWarnings(\r\n warnings,\r\n 'clientForm.warning-confirmation-question-next',\r\n this.translocoService.translate('clientForm.next'),\r\n () => this.applyStepChange(targetStep),\r\n );\r\n return;\r\n }\r\n\r\n this.applyStepChange(targetStep);\r\n },\r\n error: (err) => {\r\n this.stepValidationPending.set(false);\r\n const msg =\r\n err?.error?.message ?? err?.message ?? 'Failed to validate form';\r\n this.handleValidationRequestFailure(msg);\r\n },\r\n });\r\n }\r\n\r\n private applyStepChange(value: number): void {\r\n this.submitValidationMessages.set([]);\r\n this.currentStep.set(value);\r\n }\r\n\r\n private requiresForwardStepValidation(\r\n targetStep: number,\r\n currentStep: number,\r\n ): boolean {\r\n return (\r\n targetStep > currentStep && (this.stepsEnabled() || this.wizardEnabled())\r\n );\r\n }\r\n\r\n private resolveValidateIsSteps(\r\n isIntermediateStepValidation: boolean,\r\n ): boolean | undefined {\r\n if (!(this.stepsEnabled() || this.wizardEnabled())) {\r\n return undefined;\r\n }\r\n\r\n return isIntermediateStepValidation;\r\n }\r\n\r\n private hasLocalBlockingValidationIssues(): boolean {\r\n return (\r\n this.formControl.invalid ||\r\n this.formRuntimeMessages().some((msg) => msg.severity === 'error')\r\n );\r\n }\r\n\r\n private handleValidationRequestFailure(message: string): void {\r\n this.state.setSubmitError(message);\r\n this.submitValidationMessages.set([\r\n this.createValidationFeedbackMessage(message, 'error'),\r\n ]);\r\n this.errored.emit(message);\r\n }\r\n\r\n private createValidationFeedbackMessage(\r\n message: string,\r\n severity: 'error' | 'warning',\r\n ): FormulaRuntimeMessage {\r\n return {\r\n code: 'FORMULA_FALSE',\r\n severity,\r\n message,\r\n };\r\n }\r\n\r\n private confirmValidationWarnings(\r\n warnings: FormulaRuntimeMessage[],\r\n questionTranslationKey: string,\r\n acceptLabel: string,\r\n onAccept: () => void,\r\n ): void {\r\n this.confirmationService.confirm({\r\n type: 'dialog',\r\n header: this.translocoService.translate(\r\n 'clientForm.warning-confirmation-header',\r\n ),\r\n message: this.buildWarningConfirmationMessage(\r\n warnings,\r\n questionTranslationKey,\r\n ),\r\n acceptLabel: acceptLabel,\r\n acceptButton: {\r\n severity: 'warn',\r\n },\r\n accept: onAccept,\r\n reject: () => {},\r\n });\r\n }\r\n\r\n private executeSubmit(request: ProcessFormSubmitRequest): void {\r\n this.submitSub = this.api.submit(request).subscribe({\r\n next: (response) => {\r\n this.state.submitting.set(false);\r\n\r\n if (response.data) {\r\n this.state.setSubmitResponse(response.data);\r\n this.submitted.emit(response.data);\r\n } else {\r\n const msg = response.message ?? 'Failed to submit form';\r\n this.state.setSubmitError(msg);\r\n this.errored.emit(msg);\r\n }\r\n },\r\n error: (err) => {\r\n this.state.submitting.set(false);\r\n const msg =\r\n err?.error?.message ?? err?.message ?? 'Failed to submit form';\r\n this.state.setSubmitError(msg);\r\n this.errored.emit(msg);\r\n },\r\n });\r\n }\r\n\r\n private buildWarningConfirmationMessage(\r\n warnings: FormulaRuntimeMessage[],\r\n questionTranslationKey: string,\r\n ): string {\r\n const intro = this.translocoService.translate(\r\n 'clientForm.warning-confirmation-message',\r\n );\r\n const question = this.translocoService.translate(questionTranslationKey);\r\n const warningLines = [\r\n ...new Set(\r\n warnings\r\n .map((warning) => warning.message?.trim())\r\n .filter((message): message is string => !!message),\r\n ),\r\n ].map((message) => `- ${message}`);\r\n\r\n return [intro, ...warningLines, '', question].join('\\n');\r\n }\r\n\r\n private mapSubmitValidationMessages(\r\n results: ProcessFormValidationRuleResult[],\r\n ): FormulaRuntimeMessage[] {\r\n return results\r\n .filter((result) => !result.passed)\r\n .map((result) => ({\r\n code: result.isEvaluationError\r\n ? 'FORMULA_EVALUATION_ERROR'\r\n : 'FORMULA_FALSE',\r\n severity: result.severity,\r\n message: this.resolveSubmitValidationMessage(result),\r\n ruleId: result.ruleId,\r\n }));\r\n }\r\n\r\n private resolveSubmitValidationMessage(\r\n result: ProcessFormValidationRuleResult,\r\n ): string {\r\n const translatedMessage = this.resolveTranslatableValue(result.message);\r\n if (translatedMessage) {\r\n return translatedMessage;\r\n }\r\n\r\n const errorMessage = result.errorMessage?.trim();\r\n if (errorMessage) {\r\n return errorMessage;\r\n }\r\n\r\n return 'Form validation failed';\r\n }\r\n\r\n private resolveTranslatableValue(\r\n value: ClientFormTranslatableValue | string | null | undefined,\r\n ): string | null {\r\n if (typeof value === 'string') {\r\n const normalized = value.trim();\r\n return normalized.length > 0 ? normalized : null;\r\n }\r\n\r\n if (!value) {\r\n return null;\r\n }\r\n\r\n const lang = this.lang();\r\n const localized =\r\n value.display ?? value[lang] ?? value.en ?? value.ar ?? null;\r\n\r\n if (typeof localized !== 'string') {\r\n return null;\r\n }\r\n\r\n const normalized = localized.trim();\r\n return normalized.length > 0 ? normalized : null;\r\n }\r\n\r\n private resolveStepTimelineState(\r\n stepValue: number,\r\n currentStep: number,\r\n ): StepTimelineState {\r\n if (stepValue < currentStep) {\r\n return 'completed';\r\n }\r\n\r\n if (stepValue === currentStep) {\r\n return 'current';\r\n }\r\n\r\n return 'upcoming';\r\n }\r\n}\r\n","<!-- Client Form Template - render only; step navigation buttons are optional -->\r\n\r\n<!-- Loading State -->\r\n@if (state.loading()) {\r\n <div class=\"flex flex-col gap-6\">\r\n <!-- Section header skeleton -->\r\n <div class=\"flex flex-col gap-4\">\r\n <p-skeleton width=\"30%\" height=\"1.5rem\" />\r\n <div class=\"grid grid-cols-12 gap-4\">\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"40%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"40%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-12 flex flex-col gap-2\">\r\n <p-skeleton width=\"25%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"35%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"45%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Second section skeleton -->\r\n <div class=\"flex flex-col gap-4\">\r\n <p-skeleton width=\"25%\" height=\"1.5rem\" />\r\n <div class=\"grid grid-cols-12 gap-4\">\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"35%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-6 flex flex-col gap-2\">\r\n <p-skeleton width=\"50%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\r\n </div>\r\n <div class=\"col-span-12 flex flex-col gap-2\">\r\n <p-skeleton width=\"30%\" height=\"0.875rem\" />\r\n <p-skeleton width=\"100%\" height=\"5rem\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n}\r\n\r\n<!-- Loaded State -->\r\n@if (state.isLoaded() && !state.loading()) {\r\n <div class=\"flex flex-col gap-4\" *transloco=\"let t; prefix: 'clientForm'\">\r\n @if (previewEntitySections().length > 0) {\r\n <div class=\"flex flex-col gap-3\">\r\n @for (section of previewEntitySections(); track section.key) {\r\n <mt-card [title]=\"section.label\">\r\n <mt-entities-preview [entities]=\"section.entities\" />\r\n </mt-card>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Dynamic Form -->\r\n @if (state.requiresForm() && editableFormConfig(); as config) {\r\n @if (hasEditableFormSections()) {\r\n @if (wizardEnabled()) {\r\n <!-- Wizard Mode: vertical stepper left + form right -->\r\n <div class=\"flex gap-0 min-h-0\">\r\n <!-- Vertical Stepper -->\r\n <div class=\"w-[30%] shrink-0 flex flex-col py-4 px-6\">\r\n @for (\r\n step of stepTimeline();\r\n track step.key;\r\n let first = $first;\r\n let last = $last\r\n ) {\r\n @if (!first) {\r\n <div\r\n class=\"ms-6 w-0.5 h-5 shrink-0\"\r\n [ngClass]=\"\r\n step.beforeLineActive ? 'bg-primary' : 'bg-surface-300'\r\n \"\r\n ></div>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"flex items-center cursor-pointer gap-3 text-left focus-visible:outline-none\"\r\n [attr.aria-pressed]=\"step.selected\"\r\n [attr.aria-current]=\"step.state === 'current' ? 'step' : null\"\r\n [disabled]=\"stepNavigationValidating()\"\r\n (click)=\"onStepChange(step.value)\"\r\n >\r\n <span\r\n class=\"flex h-12 w-12 shrink-0 items-center justify-center rounded text-base font-semibold transition-all duration-200\"\r\n [class]=\"\r\n step.state === 'current'\r\n ? 'ring-2 ring-primary/20 bg-primary text-white '\r\n : step.state === 'completed'\r\n ? 'text-primary bg-primary-100 '\r\n : step.state === 'upcoming'\r\n ? 'bg-primary-100 text-white'\r\n : ''\r\n \"\r\n >\r\n @if (step.state === \"completed\") {\r\n <mt-icon icon=\"general.check\" class=\"text-xl\" />\r\n } @else {\r\n {{ step.value }}\r\n }\r\n </span>\r\n <span\r\n class=\"text-sm leading-5 truncate transition-colors duration-200\"\r\n [ngClass]=\"{\r\n 'font-semibold text-primary': step.state === 'current',\r\n 'font-medium text-surface-700':\r\n step.state === 'completed',\r\n 'font-medium text-surface-400': step.state === 'upcoming',\r\n }\"\r\n dir=\"auto\"\r\n >\r\n {{ step.label }}\r\n </span>\r\n </button>\r\n @if (!last) {\r\n <div\r\n class=\"ms-6 w-0.5 h-5 shrink-0\"\r\n [ngClass]=\"\r\n step.afterLineActive ? 'bg-primary' : 'bg-surface-300'\r\n \"\r\n ></div>\r\n }\r\n }\r\n </div>\r\n <!-- Form Content + Buttons -->\r\n <div class=\"flex-1 flex flex-col gap-4 min-w-0 ps-6\">\r\n @if (runtimeErrors().length > 0 || runtimeWarnings().length > 0) {\r\n <div #validationSummary class=\"flex flex-col gap-3 scroll-mt-4\">\r\n @if (runtimeErrors().length > 0) {\r\n <section class=\"flex flex-col gap-2\">\r\n <p\r\n class=\"m-0 text-xs font-semibold uppercase tracking-[0.18em] text-slate-500\"\r\n >\r\n {{ t(\"validation-errors\") }}\r\n </p>\r\n @for (\r\n msg of runtimeErrors();\r\n track msg.ruleId || msg.fieldKey || msg.message\r\n ) {\r\n <p-message\r\n severity=\"error\"\r\n styleClass=\"w-full\"\r\n [text]=\"msg.message\"\r\n />\r\n }\r\n </section>\r\n }\r\n\r\n @if (runtimeWarnings().length > 0) {\r\n <section class=\"flex flex-col gap-2\">\r\n <p\r\n class=\"m-0 text-xs font-semibold uppercase tracking-[0.18em] text-slate-500\"\r\n >\r\n {{ t(\"validation-warnings\") }}\r\n </p>\r\n @for (\r\n msg of runtimeWarnings();\r\n track msg.ruleId || msg.fieldKey || msg.message\r\n ) {\r\n <p-message\r\n severity=\"warn\"\r\n styleClass=\"w-full\"\r\n [text]=\"msg.message\"\r\n />\r\n }\r\n </section>\r\n }\r\n </div>\r\n }\r\n <mt-dynamic-form\r\n [formConfig]=\"wizardFormConfig() ?? config\"\r\n [formControl]=\"formControl\"\r\n [visibleSectionKeys]=\"visibleSectionKeys()\"\r\n [forcedHiddenFieldKeys]=\"effectiveForcedHiddenFieldKeys()\"\r\n [preserveForcedHiddenValues]=\"true\"\r\n (runtimeMessagesChange)=\"onRuntimeMessagesChange($event)\"\r\n />\r\n @if (showInternalStepActions()) {\r\n <div class=\"flex justify-end gap-2 pt-4 mt-auto\">\r\n <mt-button\r\n [label]=\"'previous' | transloco\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n [disabled]=\"\r\n currentStep() === 1 || stepNavigationValidating()\r\n \"\r\n (onClick)=\"goToPreviousStep()\"\r\n />\r\n <mt-button\r\n [label]=\"'next' | transloco\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\r\n [disabled]=\"\r\n currentStep() === stepSections().length ||\r\n stepNavigationValidating()\r\n \"\r\n [loading]=\"stepNavigationValidating()\"\r\n (onClick)=\"goToNextStep()\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"flex flex-col gap-4\">\r\n @if (runtimeErrors().length > 0 || runtimeWarnings().length > 0) {\r\n <div #validationSummary class=\"flex flex-col gap-3 scroll-mt-4\">\r\n @if (runtimeErrors().length > 0) {\r\n <section class=\"flex flex-col gap-2\">\r\n <p\r\n class=\"m-0 text-xs font-semibold uppercase tracking-[0.18em] text-slate-500\"\r\n >\r\n {{ t(\"validation-errors\") }}\r\n </p>\r\n @for (\r\n msg of runtimeErrors();\r\n track msg.ruleId || msg.fieldKey || msg.message\r\n ) {\r\n <p-message\r\n severity=\"error\"\r\n styleClass=\"w-full\"\r\n [text]=\"msg.message\"\r\n />\r\n }\r\n </section>\r\n }\r\n\r\n @if (runtimeWarnings().length > 0) {\r\n <section class=\"flex flex-col gap-2\">\r\n <p\r\n class=\"m-0 text-xs font-semibold uppercase tracking-[0.18em] text-slate-500\"\r\n >\r\n {{ t(\"validation-warnings\") }}\r\n </p>\r\n @for (\r\n msg of runtimeWarnings();\r\n track msg.ruleId || msg.fieldKey || msg.message\r\n ) {\r\n <p-message\r\n severity=\"warn\"\r\n styleClass=\"w-full\"\r\n [text]=\"msg.message\"\r\n />\r\n }\r\n </section>\r\n }\r\n </div>\r\n }\r\n\r\n @if (stepsEnabled()) {\r\n <div class=\"flex flex-col gap-4\">\r\n <div class=\"overflow-x-auto pb-2\">\r\n <div class=\"flex min-w-[36rem] items-start\">\r\n @for (\r\n step of stepTimeline();\r\n track step.key;\r\n let first = $first;\r\n let last = $last\r\n ) {\r\n <div\r\n class=\"relative flex min-w-[8rem] flex-1 justify-center\"\r\n >\r\n @if (!rtl() && !first) {\r\n <span\r\n class=\"absolute top-5 left-0 right-1/2 h-0.5\"\r\n [ngClass]=\"\r\n step.beforeLineActive\r\n ? 'bg-primary'\r\n : 'bg-surface-300'\r\n \"\r\n ></span>\r\n }\r\n @if (!rtl() && !last) {\r\n <span\r\n class=\"absolute top-5 left-1/2 right-0 h-0.5\"\r\n [ngClass]=\"\r\n step.afterLineActive\r\n ? 'bg-primary'\r\n : 'bg-surface-300'\r\n \"\r\n ></span>\r\n }\r\n @if (rtl() && !last) {\r\n <span\r\n class=\"absolute top-5 left-0 right-1/2 h-0.5\"\r\n [ngClass]=\"\r\n step.afterLineActive\r\n ? 'bg-primary'\r\n : 'bg-surface-300'\r\n \"\r\n ></span>\r\n }\r\n @if (rtl() && !first) {\r\n <span\r\n class=\"absolute top-5 left-1/2 right-0 h-0.5\"\r\n [ngClass]=\"\r\n step.beforeLineActive\r\n ? 'bg-primary'\r\n : 'bg-surface-300'\r\n \"\r\n ></span>\r\n }\r\n\r\n <button\r\n type=\"button\"\r\n class=\"relative z-10 flex w-full flex-col items-center gap-3 px-2 text-center focus-visible:outline-none\"\r\n [attr.aria-pressed]=\"step.selected\"\r\n [attr.aria-current]=\"\r\n step.state === 'current' ? 'step' : null\r\n \"\r\n [attr.title]=\"step.label\"\r\n [disabled]=\"stepNavigationValidating()\"\r\n (click)=\"onStepChange(step.value)\"\r\n >\r\n <span\r\n class=\"flex h-10 w-10 cursor-pointer items-center justify-center rounded-full border text-sm font-semibold transition-all duration-200\"\r\n [ngClass]=\"{\r\n 'border-primary bg-primary text-surface-0 ring-4 ring-primary/10':\r\n step.state === 'completed' ||\r\n step.state === 'current',\r\n\r\n 'border-surface-300 bg-white text-surface-500':\r\n step.state === 'upcoming',\r\n }\"\r\n >\r\n {{ step.value }}\r\n </span>\r\n <span\r\n class=\"max-w-[8rem] text-center text-sm leading-5 transition-colors duration-200\"\r\n [ngClass]=\"{\r\n 'font-semibold text-primary':\r\n step.selected || step.state === 'current',\r\n 'font-medium text-surface-700':\r\n step.state === 'completed' && !step.selected,\r\n 'font-medium text-surface-500':\r\n step.state === 'upcoming',\r\n }\"\r\n dir=\"auto\"\r\n >\r\n {{ step.label }}\r\n </span>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (showInternalStepActions()) {\r\n <div class=\"flex justify-between gap-2\">\r\n <mt-button\r\n [label]=\"'previous' | transloco\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n [disabled]=\"\r\n currentStep() === 1 || stepNavigationValidating()\r\n \"\r\n (onClick)=\"goToPreviousStep()\"\r\n />\r\n <mt-button\r\n [label]=\"'next' | transloco\"\r\n severity=\"primary\"\r\n variant=\"outlined\"\r\n [disabled]=\"\r\n currentStep() === stepSections().length ||\r\n stepNavigationValidating()\r\n \"\r\n [loading]=\"stepNavigationValidating()\"\r\n (onClick)=\"goToNextStep()\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n @if (tabsEnabled()) {\r\n <mt-tabs\r\n [active]=\"currentStep()\"\r\n (activeChange)=\"onStepChange($event)\"\r\n [options]=\"tabOptions()\"\r\n size=\"small\"\r\n fluid\r\n />\r\n }\r\n <mt-dynamic-form\r\n [formConfig]=\"config\"\r\n [formControl]=\"formControl\"\r\n [visibleSectionKeys]=\"visibleSectionKeys()\"\r\n [forcedHiddenFieldKeys]=\"effectiveForcedHiddenFieldKeys()\"\r\n [preserveForcedHiddenValues]=\"true\"\r\n (runtimeMessagesChange)=\"onRuntimeMessagesChange($event)\"\r\n />\r\n </div>\r\n }\r\n }\r\n } @else if (previewEntitySections().length === 0) {\r\n <div\r\n class=\"flex items-center justify-center p-6 rounded-lg bg-surface-50 border border-surface-200 border-dashed\"\r\n >\r\n <p class=\"text-sm text-muted-color\">\r\n No form required for this operation.\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n}\r\n","import type { PropertyValueComparison } from '@masterteam/components/entities';\r\n\r\nexport type {\r\n ComparisonValueSide,\r\n ValueComparison,\r\n EntityComparisonField,\r\n EntityComparisonOperation,\r\n EntityListComparisonRow,\r\n EntityListComparison,\r\n PropertyValueComparison,\r\n} from '@masterteam/components/entities';\r\n\r\n// ============================================================================\r\n// API Response Wrapper\r\n// ============================================================================\r\n\r\nexport interface Response<T> {\r\n endpoint: string;\r\n status: number;\r\n code: number;\r\n locale: string;\r\n message?: string | null;\r\n errors?: any | null;\r\n data: T;\r\n cacheSession?: string;\r\n}\r\n\r\n// ============================================================================\r\n// Process Form Mode\r\n// ============================================================================\r\n\r\nexport type ProcessFormMode = 'Approval' | 'Direct';\r\nexport type ProcessFormSubmitStatus = 'PendingApproval' | 'Executed';\r\nexport type OperationType = 'FormOperation' | 'ActionOperation';\r\nexport type ProcessFormSource = 'Step' | 'None';\r\nexport type ClientFormResolvedRenderMode = 'form' | 'steps' | 'tabs' | 'wizard';\r\nexport type ClientFormFooterActionMode = 'loading' | 'steps' | 'submit';\r\n\r\nexport interface ClientFormFooterState {\r\n loading: boolean;\r\n isLoaded: boolean;\r\n renderMode: ClientFormResolvedRenderMode;\r\n actionMode: ClientFormFooterActionMode;\r\n stepNavigationEnabled: boolean;\r\n sectionNavigationEnabled: boolean;\r\n currentStep: number;\r\n stepCount: number;\r\n canGoToPreviousStep: boolean;\r\n canGoToNextStep: boolean;\r\n showPreviousStep: boolean;\r\n showNextStep: boolean;\r\n showSubmit: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Load Request / Response\r\n// ============================================================================\r\n\r\nexport interface ProcessFormLoadRequest {\r\n moduleKey: string;\r\n operationKey: string;\r\n moduleId?: number | string;\r\n levelId?: number | string;\r\n levelDataId?: number | string;\r\n moduleDataId?: number | string;\r\n requestSchemaId?: number;\r\n draftProcessId?: number;\r\n preview?: boolean;\r\n}\r\n\r\nexport interface ProcessFormLoadResponse {\r\n mode: ProcessFormMode;\r\n formSource: ProcessFormSource;\r\n requiresForm: boolean;\r\n requestSchemaId: number | null;\r\n requestId: number | null;\r\n stepId: number | null;\r\n stepSchemaId: number | null;\r\n stepName: string | null;\r\n formConfiguration: ClientFormConfiguration | null;\r\n values: ProcessFormValue[];\r\n context: ProcessFormContext;\r\n}\r\n\r\n// ============================================================================\r\n// Submit Request / Response\r\n// ============================================================================\r\n\r\nexport interface ProcessFormSubmitRequest {\r\n moduleKey: string;\r\n operationKey: string;\r\n moduleId?: number | string;\r\n levelId?: number | string;\r\n levelDataId?: number | string;\r\n moduleDataId?: number | string;\r\n recordId?: number | string;\r\n requestSchemaId?: number;\r\n returnUrl?: string;\r\n IsSteps?: boolean;\r\n fields: ProcessFormSubmitField[];\r\n}\r\n\r\nexport interface ProcessFormValidationRuntimeResult {\r\n isValid: boolean;\r\n hasBlockingFailures: boolean;\r\n results: ProcessFormValidationRuleResult[];\r\n}\r\n\r\nexport interface ProcessFormValidationRuleResult {\r\n ruleId: string | number;\r\n message?: ClientFormTranslatableValue | string | null;\r\n severity: 'error' | 'warning';\r\n passed: boolean;\r\n isBlocking: boolean;\r\n isEvaluationError: boolean;\r\n errorMessage?: string | null;\r\n}\r\n\r\nexport interface ClientFormSubmitRequestMapperContext {\r\n formValue: Record<string, any>;\r\n loadResponse: ProcessFormLoadResponse;\r\n}\r\n\r\nexport type ClientFormSubmitRequestMapper = (\r\n request: ProcessFormSubmitRequest,\r\n context: ClientFormSubmitRequestMapperContext,\r\n) => ProcessFormSubmitRequest;\r\n\r\nexport interface ProcessFormSubmitField {\r\n requestPropertyId?: number;\r\n propertyKey: string;\r\n value: any;\r\n}\r\n\r\nexport type ProcessFormSubmitValue = ProcessFormSubmitField;\r\n\r\nexport interface ProcessFormSubmitResponse {\r\n status: ProcessFormSubmitStatus;\r\n moduleKey: string;\r\n operationKey: string;\r\n recordId: number | null;\r\n levelId: number | null;\r\n levelDataId: number | null;\r\n requestSchemaId?: number | null;\r\n requestId?: number | null;\r\n resultModuleKey?: string | null;\r\n resultModuleId?: number | null;\r\n record?: ProcessFormSubmitRecord | null;\r\n}\r\n\r\nexport interface ProcessFormSubmitRecord {\r\n fields: ProcessFormSubmitRecordField[];\r\n}\r\n\r\nexport interface ProcessFormSubmitRecordField {\r\n id: number;\r\n key: string;\r\n normalizedKey: string;\r\n label: string;\r\n viewType: string;\r\n configuration: Record<string, unknown> | null;\r\n source: string;\r\n order: number;\r\n isRequired: boolean;\r\n isSystem: boolean;\r\n raw: any;\r\n value: any;\r\n display?: string | null;\r\n}\r\n\r\n// ============================================================================\r\n// Values & Context\r\n// ============================================================================\r\n\r\nexport interface ProcessFormValue {\r\n propertyKey: string;\r\n rawValue?: any;\r\n value: any;\r\n metadata?: ProcessFormValueMetadata;\r\n comparison?: PropertyValueComparison;\r\n}\r\n\r\nexport interface ProcessFormValueMetadata {\r\n propertyId: number;\r\n key: string;\r\n viewType: string;\r\n source: string;\r\n}\r\n\r\nexport interface ProcessFormContext {\r\n moduleKey: string;\r\n operationKey: string;\r\n moduleId: number | null;\r\n levelId: number | null;\r\n levelDataId: number | null;\r\n moduleDataId: number | null;\r\n requestSchemaId: number | null;\r\n requestId: number | null;\r\n stepId: number | null;\r\n stepSchemaId: number | null;\r\n preview: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Form Configuration (runtime shape — no _pending/_deleting)\r\n// ============================================================================\r\n\r\nexport type ClientFieldWidth = '25' | '50' | '100';\r\nexport type ClientFormRenderMode =\r\n | 'sections'\r\n | 'steps'\r\n | 'tabs'\r\n | 'wizard'\r\n | undefined;\r\n\r\nexport interface ClientFormConfiguration {\r\n isActive?: boolean;\r\n renderMode?: ClientFormRenderMode;\r\n sections: ClientFormSection[];\r\n validations?: ClientValidationRule[];\r\n}\r\n\r\nexport interface ClientFormSection {\r\n id: string;\r\n name: {\r\n en: string;\r\n ar: string;\r\n };\r\n order: number;\r\n fields: ClientFormField[];\r\n}\r\n\r\nexport interface ClientFormField {\r\n id: string;\r\n sectionId: string;\r\n propertyKey: string;\r\n /** Runtime property metadata returned by the API */\r\n propertyMetadata: ClientPropertyItem;\r\n width: ClientFieldWidth;\r\n order: number;\r\n hiddenInCreation?: boolean;\r\n hiddenInEditForm?: boolean;\r\n isRequired?: boolean;\r\n isRead?: boolean;\r\n isWrite?: boolean;\r\n showConditionalDisplayFormula?: boolean;\r\n conditionalDisplayFormula?: string;\r\n}\r\n\r\nexport interface ClientPropertyItem {\r\n key: string;\r\n propertyId?: number;\r\n isCalculated?: boolean;\r\n name:\r\n | string\r\n | {\r\n display?: string;\r\n en?: string;\r\n ar?: string;\r\n [k: string]: string | undefined;\r\n };\r\n viewType?: string;\r\n source?: string;\r\n configuration?: Record<string, unknown> | null;\r\n [key: string]: any;\r\n}\r\n\r\nexport interface ClientFormTranslatableValue {\r\n display?: string;\r\n en?: string;\r\n ar?: string;\r\n [key: string]: string | undefined;\r\n}\r\n\r\nexport interface ClientValidationRule {\r\n id: string | number;\r\n formulaTokens: string;\r\n formulaText: string;\r\n message: {\r\n en: string;\r\n ar: string;\r\n };\r\n severity: 'error' | 'warning';\r\n enabled: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Lookup Definitions (passed as input to ClientForm)\r\n// ============================================================================\r\n\r\nexport interface ClientLookup {\r\n id: number;\r\n key: string;\r\n name: { display?: string; ar?: string; en?: string };\r\n items: ClientLookupItem[];\r\n}\r\n\r\nexport interface ClientLookupItem {\r\n id: number;\r\n lookupId: number;\r\n key: string;\r\n name: { display?: string; ar?: string; en?: string };\r\n description?: { display?: string; ar?: string; en?: string };\r\n color?: string;\r\n order: number;\r\n}\r\n\r\n// ============================================================================\r\n// Legacy Command Interception\r\n// ============================================================================\r\n\r\nexport interface FormRequiredInterception {\r\n requestSchemaId: number;\r\n operationType: OperationType;\r\n status: 'FormRequired';\r\n message: string;\r\n levelId: number;\r\n levelDataId: number;\r\n moduleDataId: number;\r\n}\r\n\r\n/**\r\n * Type guard to detect a FormRequired interception response from legacy commands.\r\n * Use in HTTP interceptors to redirect to process-form runtime flow.\r\n */\r\nexport function isFormRequiredInterception(\r\n response: any,\r\n): response is FormRequiredInterception {\r\n return (\r\n response?.status === 'FormRequired' &&\r\n typeof response?.requestSchemaId === 'number'\r\n );\r\n}\r\n","// Client Form - Runtime process form component\r\nexport * from './client-form';\r\nexport * from './models/client-form.model';\r\nexport * from './services/client-form-api.service';\r\nexport * from './services/client-form-state.service';\r\nexport * from './utils/form-config-mapper';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@masterteam/forms",
3
- "version": "0.0.69",
3
+ "version": "0.0.70",
4
4
  "publishConfig": {
5
5
  "directory": "../../../dist/masterteam/forms",
6
6
  "linkDirectory": true,
@@ -17,7 +17,7 @@
17
17
  "primeng": "21.1.5",
18
18
  "@primeuix/themes": "^2.0.3",
19
19
  "rxjs": "^7.8.2",
20
- "@masterteam/components": "^0.0.149"
20
+ "@masterteam/components": "^0.0.150"
21
21
  },
22
22
  "sideEffects": false,
23
23
  "exports": {
@@ -1,7 +1,8 @@
1
1
  import * as _masterteam_components from '@masterteam/components';
2
2
  import { FormulaRuntimeMessage, DynamicFormConfig } from '@masterteam/components';
3
3
  import * as _masterteam_components_entities from '@masterteam/components/entities';
4
- import { EntityData } from '@masterteam/components/entities';
4
+ import { PropertyValueComparison, EntityData } from '@masterteam/components/entities';
5
+ export { ComparisonValueSide, EntityComparisonField, EntityComparisonOperation, EntityListComparison, EntityListComparisonRow, PropertyValueComparison, ValueComparison } from '@masterteam/components/entities';
5
6
  import * as _angular_core from '@angular/core';
6
7
  import { OnDestroy, ElementRef } from '@angular/core';
7
8
  import { FormControl } from '@angular/forms';
@@ -74,6 +75,7 @@ interface ProcessFormSubmitRequest {
74
75
  recordId?: number | string;
75
76
  requestSchemaId?: number;
76
77
  returnUrl?: string;
78
+ IsSteps?: boolean;
77
79
  fields: ProcessFormSubmitField[];
78
80
  }
79
81
  interface ProcessFormValidationRuntimeResult {
@@ -137,6 +139,7 @@ interface ProcessFormValue {
137
139
  rawValue?: any;
138
140
  value: any;
139
141
  metadata?: ProcessFormValueMetadata;
142
+ comparison?: PropertyValueComparison;
140
143
  }
141
144
  interface ProcessFormValueMetadata {
142
145
  propertyId: number;
@@ -476,6 +479,7 @@ declare class ClientForm implements OnDestroy {
476
479
  private validateAndAdvanceStep;
477
480
  private applyStepChange;
478
481
  private requiresForwardStepValidation;
482
+ private resolveValidateIsSteps;
479
483
  private hasLocalBlockingValidationIssues;
480
484
  private handleValidationRequestFailure;
481
485
  private createValidationFeedbackMessage;