@masterteam/forms 0.0.44 → 0.0.46

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.
@@ -6,6 +6,7 @@ import { CommonModule } from '@angular/common';
6
6
  import { Skeleton } from 'primeng/skeleton';
7
7
  import * as i2 from 'primeng/stepper';
8
8
  import { StepperModule } from 'primeng/stepper';
9
+ import { EntitiesPreview } from '@masterteam/components/entities';
9
10
  import { Tabs } from '@masterteam/components/tabs';
10
11
  import { DynamicForm } from '@masterteam/forms/dynamic-form';
11
12
  import { HttpClient, HttpContext } from '@angular/common/http';
@@ -136,6 +137,11 @@ const WIDTH_TO_COLSPAN = {
136
137
  '50': 6,
137
138
  '100': 12,
138
139
  };
140
+ const WIDTH_TO_ENTITY_SIZE = {
141
+ '25': 6,
142
+ '50': 12,
143
+ '100': 24,
144
+ };
139
145
  // ============================================================================
140
146
  // Public Mapper Functions
141
147
  // ============================================================================
@@ -185,15 +191,16 @@ function mapToDynamicFormConfig(config, lang = 'en', mode = 'create', lookups =
185
191
  *
186
192
  * Only includes non-virtual (editable) values.
187
193
  */
188
- function mapValuesToFormValue(values) {
194
+ function mapValuesToFormValue(values, config) {
189
195
  const result = {};
196
+ const fieldMap = config ? buildFieldValueMap(config) : null;
190
197
  for (const v of values) {
191
198
  if (v.metadata?.source === 'ProcessVirtual')
192
199
  continue;
193
- if (v.metadata?.viewType === 'Date')
194
- result[v.propertyKey] = v.value ? new Date(v.value) : null;
195
- else
196
- result[v.propertyKey] = v.value;
200
+ const targetFieldKey = resolveValueTargetKey(v, fieldMap) ?? v.propertyKey ?? null;
201
+ if (!targetFieldKey)
202
+ continue;
203
+ result[targetFieldKey] = v.value;
197
204
  }
198
205
  return result;
199
206
  }
@@ -233,6 +240,38 @@ function mapFormValueToSubmitValues(formValue, loadResponse) {
233
240
  })
234
241
  .filter((value) => !!value);
235
242
  }
243
+ function getPreviewOnlyFieldKeys(config, mode = 'create') {
244
+ return config.sections.flatMap((section) => (section.fields ?? [])
245
+ .filter((field) => isFieldVisible(field, mode) && isPreviewOnlyField(field))
246
+ .map((field) => field.propertyKey));
247
+ }
248
+ function mapPreviewFieldsToEntities(config, values, mode = 'create') {
249
+ const resolvedValues = mapValuesToFormValue(values, config);
250
+ return config.sections
251
+ .slice()
252
+ .sort((a, b) => a.order - b.order)
253
+ .flatMap((section) => (section.fields ?? [])
254
+ .filter((field) => isFieldVisible(field, mode) && isPreviewOnlyField(field))
255
+ .sort((a, b) => a.order - b.order)
256
+ .flatMap((field) => {
257
+ const property = resolveProperty(field);
258
+ if (!property)
259
+ return [];
260
+ return [
261
+ {
262
+ ...property,
263
+ name: property.name?.display,
264
+ key: property.key ?? field.propertyKey,
265
+ value: resolvedValues[field.propertyKey],
266
+ order: section.order * 1000 + field.order,
267
+ configuration: {
268
+ ...property.configuration,
269
+ size: WIDTH_TO_ENTITY_SIZE[field.width] ?? 24,
270
+ },
271
+ },
272
+ ];
273
+ }));
274
+ }
236
275
  // ============================================================================
237
276
  // Internal Helpers
238
277
  // ============================================================================
@@ -243,6 +282,16 @@ function mapFormValueToSubmitValues(formValue, loadResponse) {
243
282
  function resolveProperty(field) {
244
283
  return field.property ?? field.propertyMetadata;
245
284
  }
285
+ function isFieldVisible(field, mode) {
286
+ if (field.isRead === false)
287
+ return false;
288
+ if (mode === 'create')
289
+ return !field.hiddenInCreation;
290
+ return !field.hiddenInEditForm;
291
+ }
292
+ function isPreviewOnlyField(field) {
293
+ return field.isRead === true && field.isWrite === false;
294
+ }
246
295
  function resolveFieldMeta(field) {
247
296
  const property = resolveProperty(field);
248
297
  return {
@@ -442,6 +491,91 @@ function normalizeSubmitValue(value, viewType) {
442
491
  return value;
443
492
  }
444
493
  }
494
+ function buildFieldValueMap(config) {
495
+ const fieldsByKey = new Map();
496
+ const propertyIdCandidates = new Map();
497
+ const aliasCandidates = new Map();
498
+ for (const section of config.sections ?? []) {
499
+ for (const field of section.fields ?? []) {
500
+ const { propertyId } = resolveFieldMeta(field);
501
+ const fieldMeta = {
502
+ key: field.propertyKey,
503
+ propertyId,
504
+ };
505
+ fieldsByKey.set(field.propertyKey, fieldMeta);
506
+ if (propertyId != null) {
507
+ if (!propertyIdCandidates.has(propertyId)) {
508
+ propertyIdCandidates.set(propertyId, new Set());
509
+ }
510
+ propertyIdCandidates.get(propertyId).add(field.propertyKey);
511
+ }
512
+ const aliases = new Set([
513
+ field.propertyKey,
514
+ stripTemplatePrefix(field.propertyKey),
515
+ ]);
516
+ const property = resolveProperty(field);
517
+ if (property?.key) {
518
+ aliases.add(property.key);
519
+ aliases.add(stripTemplatePrefix(property.key));
520
+ }
521
+ aliases.forEach((alias) => {
522
+ if (!alias)
523
+ return;
524
+ if (!aliasCandidates.has(alias)) {
525
+ aliasCandidates.set(alias, new Set());
526
+ }
527
+ aliasCandidates.get(alias).add(field.propertyKey);
528
+ });
529
+ }
530
+ }
531
+ const propertyIdToKey = new Map();
532
+ propertyIdCandidates.forEach((keys, propertyId) => {
533
+ if (keys.size !== 1)
534
+ return;
535
+ propertyIdToKey.set(propertyId, [...keys][0]);
536
+ });
537
+ const aliasToKey = new Map();
538
+ aliasCandidates.forEach((keys, alias) => {
539
+ if (keys.size !== 1)
540
+ return;
541
+ aliasToKey.set(alias, [...keys][0]);
542
+ });
543
+ return {
544
+ fieldsByKey,
545
+ propertyIdToKey,
546
+ aliasToKey,
547
+ };
548
+ }
549
+ function resolveValueTargetKey(value, fieldMap) {
550
+ if (!fieldMap) {
551
+ return value.propertyKey ?? null;
552
+ }
553
+ const exactCandidates = [value.propertyKey, value.metadata?.key].filter((candidate) => !!candidate);
554
+ for (const candidate of exactCandidates) {
555
+ if (fieldMap.fieldsByKey.has(candidate)) {
556
+ return candidate;
557
+ }
558
+ }
559
+ const propertyId = value.metadata?.propertyId;
560
+ if (propertyId != null && fieldMap.propertyIdToKey.has(propertyId)) {
561
+ return fieldMap.propertyIdToKey.get(propertyId);
562
+ }
563
+ const aliasCandidates = exactCandidates.flatMap((candidate) => [
564
+ candidate,
565
+ stripTemplatePrefix(candidate),
566
+ ]);
567
+ for (const candidate of aliasCandidates) {
568
+ if (!candidate)
569
+ continue;
570
+ if (fieldMap.aliasToKey.has(candidate)) {
571
+ return fieldMap.aliasToKey.get(candidate);
572
+ }
573
+ }
574
+ return null;
575
+ }
576
+ function stripTemplatePrefix(value) {
577
+ return value.replace(/^template_\d+_/, '');
578
+ }
445
579
 
446
580
  /**
447
581
  * Client Form — Runtime process form component.
@@ -531,11 +665,39 @@ class ClientForm {
531
665
  return mapToDynamicFormConfig(config, this.lang(), this.formMode(), this.lookups());
532
666
  }, ...(ngDevMode ? [{ debugName: "formConfig" }] : []));
533
667
  initialValues = computed(() => {
534
- return mapValuesToFormValue(this.state.formValues());
668
+ return mapValuesToFormValue(this.state.formValues(), this.state.formConfiguration());
535
669
  }, ...(ngDevMode ? [{ debugName: "initialValues" }] : []));
536
670
  virtualFields = computed(() => this.state.virtualFields(), ...(ngDevMode ? [{ debugName: "virtualFields" }] : []));
537
671
  hasVirtualFields = computed(() => this.virtualFields().length > 0, ...(ngDevMode ? [{ debugName: "hasVirtualFields" }] : []));
538
- stepSections = computed(() => this.formConfig()?.sections ?? [], ...(ngDevMode ? [{ debugName: "stepSections" }] : []));
672
+ previewFieldKeys = computed(() => {
673
+ const config = this.state.formConfiguration();
674
+ if (!config)
675
+ return [];
676
+ return getPreviewOnlyFieldKeys(config, this.formMode());
677
+ }, ...(ngDevMode ? [{ debugName: "previewFieldKeys" }] : []));
678
+ previewEntities = computed(() => {
679
+ const config = this.state.formConfiguration();
680
+ if (!config)
681
+ return [];
682
+ return mapPreviewFieldsToEntities(config, this.state.formValues(), this.formMode());
683
+ }, ...(ngDevMode ? [{ debugName: "previewEntities" }] : []));
684
+ editableFormConfig = computed(() => {
685
+ const config = this.formConfig();
686
+ if (!config)
687
+ return null;
688
+ const previewFieldKeys = new Set(this.previewFieldKeys());
689
+ return {
690
+ ...config,
691
+ sections: config.sections
692
+ .map((section) => ({
693
+ ...section,
694
+ fields: section.fields.filter((field) => !field.key || !previewFieldKeys.has(field.key)),
695
+ }))
696
+ .filter((section) => section.fields.some((field) => field.type !== 'spacer')),
697
+ };
698
+ }, ...(ngDevMode ? [{ debugName: "editableFormConfig" }] : []));
699
+ stepSections = computed(() => this.editableFormConfig()?.sections ?? [], ...(ngDevMode ? [{ debugName: "stepSections" }] : []));
700
+ hasEditableFormSections = computed(() => this.stepSections().length > 0, ...(ngDevMode ? [{ debugName: "hasEditableFormSections" }] : []));
539
701
  stepsEnabled = computed(() => this.renderMode() === 'steps' && this.stepSections().length > 1, ...(ngDevMode ? [{ debugName: "stepsEnabled" }] : []));
540
702
  tabsEnabled = computed(() => this.renderMode() === 'tabs' && this.stepSections().length > 1, ...(ngDevMode ? [{ debugName: "tabsEnabled" }] : []));
541
703
  sectionNavigationEnabled = computed(() => this.stepsEnabled() || this.tabsEnabled(), ...(ngDevMode ? [{ debugName: "sectionNavigationEnabled" }] : []));
@@ -543,18 +705,30 @@ class ClientForm {
543
705
  label: section.label || `Tab ${index + 1}`,
544
706
  value: index + 1,
545
707
  })), ...(ngDevMode ? [{ debugName: "tabOptions" }] : []));
708
+ visibleSectionKeys = computed(() => {
709
+ if (!this.sectionNavigationEnabled())
710
+ return null;
711
+ const currentIndex = this.currentStep() - 1;
712
+ const activeSection = this.stepSections()[currentIndex];
713
+ if (!activeSection)
714
+ return null;
715
+ return [activeSection.key || `section-${currentIndex}`];
716
+ }, ...(ngDevMode ? [{ debugName: "visibleSectionKeys" }] : []));
546
717
  forcedHiddenFieldKeys = computed(() => {
547
718
  if (!this.sectionNavigationEnabled())
548
719
  return [];
549
720
  const sections = this.stepSections();
550
721
  const currentIndex = this.currentStep() - 1;
551
- return sections.flatMap((section, index) => {
722
+ const hiddenFieldKeys = new Set();
723
+ sections.forEach((section, index) => {
552
724
  if (index === currentIndex)
553
- return [];
554
- return section.fields
725
+ return;
726
+ section.fields
555
727
  .map((field) => field.key)
556
- .filter((key) => !!key);
728
+ .filter((key) => !!key)
729
+ .forEach((key) => hiddenFieldKeys.add(key));
557
730
  });
731
+ return [...hiddenFieldKeys];
558
732
  }, ...(ngDevMode ? [{ debugName: "forcedHiddenFieldKeys" }] : []));
559
733
  // ============================================================================
560
734
  // Effects
@@ -804,18 +978,19 @@ class ClientForm {
804
978
  return req;
805
979
  }
806
980
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: ClientForm, deps: [], target: i0.ɵɵFactoryTarget.Component });
807
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", 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 }, 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 }, lang: { classPropertyName: "lang", publicName: "lang", isSignal: true, isRequired: false, transformFunction: null }, lookups: { classPropertyName: "lookups", publicName: "lookups", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { loaded: "loaded", submitted: "submitted", errored: "errored", modeDetected: "modeDetected", formSourceDetected: "formSourceDetected" }, providers: [ClientFormStateService], ngImport: i0, template: "<!-- Client Form Template \u2014 Render only, NO action buttons -->\n\n<!-- Loading State -->\n@if (state.loading()) {\n <div class=\"flex flex-col gap-6\">\n <!-- Section header skeleton -->\n <div class=\"flex flex-col gap-4\">\n <p-skeleton width=\"30%\" height=\"1.5rem\" />\n <div class=\"grid grid-cols-12 gap-4\">\n <div class=\"col-span-6 flex flex-col gap-2\">\n <p-skeleton width=\"40%\" height=\"0.875rem\" />\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\n </div>\n <div class=\"col-span-6 flex flex-col gap-2\">\n <p-skeleton width=\"40%\" height=\"0.875rem\" />\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\n </div>\n <div class=\"col-span-12 flex flex-col gap-2\">\n <p-skeleton width=\"25%\" height=\"0.875rem\" />\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\n </div>\n <div class=\"col-span-6 flex flex-col gap-2\">\n <p-skeleton width=\"35%\" height=\"0.875rem\" />\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\n </div>\n <div class=\"col-span-6 flex flex-col gap-2\">\n <p-skeleton width=\"45%\" height=\"0.875rem\" />\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\n </div>\n </div>\n </div>\n\n <!-- Second section skeleton -->\n <div class=\"flex flex-col gap-4\">\n <p-skeleton width=\"25%\" height=\"1.5rem\" />\n <div class=\"grid grid-cols-12 gap-4\">\n <div class=\"col-span-6 flex flex-col gap-2\">\n <p-skeleton width=\"35%\" height=\"0.875rem\" />\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\n </div>\n <div class=\"col-span-6 flex flex-col gap-2\">\n <p-skeleton width=\"50%\" height=\"0.875rem\" />\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\n </div>\n <div class=\"col-span-12 flex flex-col gap-2\">\n <p-skeleton width=\"30%\" height=\"0.875rem\" />\n <p-skeleton width=\"100%\" height=\"5rem\" />\n </div>\n </div>\n </div>\n </div>\n}\n\n<!-- Loaded State -->\n@if (state.isLoaded() && !state.loading()) {\n <!-- Dynamic Form -->\n @if (state.requiresForm() && formConfig(); as config) {\n <div class=\"flex flex-col gap-4\">\n @if (runtimeErrors().length > 0 || runtimeWarnings().length > 0) {\n <div class=\"rounded-lg border border-surface-200 p-4 bg-surface-50\">\n @if (runtimeErrors().length > 0) {\n <div class=\"mb-3\">\n <h4 class=\"text-sm font-semibold text-red-600 mb-2\">\n Validation Errors\n </h4>\n <ul class=\"list-disc ps-5 text-sm text-red-600 space-y-1\">\n @for (\n msg of runtimeErrors();\n track msg.ruleId || msg.fieldKey || msg.message\n ) {\n <li>{{ msg.message }}</li>\n }\n </ul>\n </div>\n }\n\n @if (runtimeWarnings().length > 0) {\n <div>\n <h4 class=\"text-sm font-semibold text-amber-600 mb-2\">\n Validation Warnings\n </h4>\n <ul class=\"list-disc ps-5 text-sm text-amber-700 space-y-1\">\n @for (\n msg of runtimeWarnings();\n track msg.ruleId || msg.fieldKey || msg.message\n ) {\n <li>{{ msg.message }}</li>\n }\n </ul>\n </div>\n }\n </div>\n }\n @if (stepsEnabled()) {\n <div class=\"flex flex-col gap-4\">\n <p-stepper\n [value]=\"currentStep()\"\n (valueChange)=\"onStepChange($event)\"\n >\n <p-step-list>\n @for (section of stepSections(); track section.key || $index) {\n <p-step [value]=\"$index + 1\">\n {{ section.label || \"Step \" + ($index + 1) }}\n </p-step>\n }\n </p-step-list>\n </p-stepper>\n\n @if (showInternalStepActions()) {\n <div class=\"flex justify-between gap-2\">\n <button\n type=\"button\"\n class=\"px-3 py-2 rounded border border-surface-300 text-sm\"\n [disabled]=\"currentStep() === 1\"\n (click)=\"goToPreviousStep()\"\n >\n Previous\n </button>\n <button\n type=\"button\"\n class=\"px-3 py-2 rounded border border-surface-300 text-sm\"\n [disabled]=\"currentStep() === stepSections().length\"\n (click)=\"goToNextStep()\"\n >\n Next\n </button>\n </div>\n }\n </div>\n }\n\n @if (tabsEnabled()) {\n <mt-tabs\n [active]=\"currentStep()\"\n (activeChange)=\"onStepChange($event)\"\n [options]=\"tabOptions()\"\n size=\"small\"\n fluid\n />\n }\n\n <mt-dynamic-form\n [formConfig]=\"config\"\n [formControl]=\"formControl\"\n [forcedHiddenFieldKeys]=\"forcedHiddenFieldKeys()\"\n [preserveForcedHiddenValues]=\"true\"\n (runtimeMessagesChange)=\"onRuntimeMessagesChange($event)\"\n />\n </div>\n } @else if (!state.requiresForm()) {\n <div\n class=\"flex items-center justify-center p-6 rounded-lg bg-surface-50 border border-surface-200 border-dashed\"\n >\n <p class=\"text-sm text-muted-color\">\n No form required for this operation.\n </p>\n </div>\n }\n}\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: DynamicForm, selector: "mt-dynamic-form", inputs: ["formConfig", "forcedHiddenFieldKeys", "preserveForcedHiddenValues"], outputs: ["runtimeMessagesChange"] }, { kind: "component", type: Tabs, selector: "mt-tabs", inputs: ["options", "optionLabel", "optionValue", "active", "size", "fluid", "disabled"], outputs: ["activeChange", "onChange"] }, { kind: "component", type: Skeleton, selector: "p-skeleton", inputs: ["styleClass", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "ngmodule", type: StepperModule }, { kind: "component", type: i2.Stepper, selector: "p-stepper", inputs: ["value", "linear", "transitionOptions", "motionOptions"], outputs: ["valueChange"] }, { kind: "component", type: i2.StepList, selector: "p-step-list" }, { kind: "component", type: i2.Step, selector: "p-step", inputs: ["value", "disabled"], outputs: ["valueChange"] }] });
981
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", 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 }, 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 }, lang: { classPropertyName: "lang", publicName: "lang", isSignal: true, isRequired: false, transformFunction: null }, lookups: { classPropertyName: "lookups", publicName: "lookups", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { loaded: "loaded", submitted: "submitted", errored: "errored", modeDetected: "modeDetected", formSourceDetected: "formSourceDetected" }, providers: [ClientFormStateService], ngImport: i0, template: "<!-- Client Form Template \u2014 Render only, NO action buttons -->\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\">\r\n @if (previewEntities().length > 0) {\r\n <mt-entities-preview [entities]=\"previewEntities()\" />\r\n }\r\n\r\n <!-- Dynamic Form -->\r\n @if (state.requiresForm() && editableFormConfig(); as config) {\r\n @if (hasEditableFormSections()) {\r\n <div class=\"flex flex-col gap-4\">\r\n @if (runtimeErrors().length > 0 || runtimeWarnings().length > 0) {\r\n <div class=\"rounded-lg border border-surface-200 p-4 bg-surface-50\">\r\n @if (runtimeErrors().length > 0) {\r\n <div class=\"mb-3\">\r\n <h4 class=\"text-sm font-semibold text-red-600 mb-2\">\r\n Validation Errors\r\n </h4>\r\n <ul class=\"list-disc ps-5 text-sm text-red-600 space-y-1\">\r\n @for (\r\n msg of runtimeErrors();\r\n track msg.ruleId || msg.fieldKey || msg.message\r\n ) {\r\n <li>{{ msg.message }}</li>\r\n }\r\n </ul>\r\n </div>\r\n }\r\n\r\n @if (runtimeWarnings().length > 0) {\r\n <div>\r\n <h4 class=\"text-sm font-semibold text-amber-600 mb-2\">\r\n Validation Warnings\r\n </h4>\r\n <ul class=\"list-disc ps-5 text-sm text-amber-700 space-y-1\">\r\n @for (\r\n msg of runtimeWarnings();\r\n track msg.ruleId || msg.fieldKey || msg.message\r\n ) {\r\n <li>{{ msg.message }}</li>\r\n }\r\n </ul>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n @if (stepsEnabled()) {\r\n <div class=\"flex flex-col gap-4\">\r\n <p-stepper\r\n [value]=\"currentStep()\"\r\n (valueChange)=\"onStepChange($event)\"\r\n >\r\n <p-step-list>\r\n @for (section of stepSections(); track section.key || $index) {\r\n <p-step [value]=\"$index + 1\">\r\n {{ section.label || \"Step \" + ($index + 1) }}\r\n </p-step>\r\n }\r\n </p-step-list>\r\n </p-stepper>\r\n\r\n @if (showInternalStepActions()) {\r\n <div class=\"flex justify-between gap-2\">\r\n <button\r\n type=\"button\"\r\n class=\"px-3 py-2 rounded border border-surface-300 text-sm\"\r\n [disabled]=\"currentStep() === 1\"\r\n (click)=\"goToPreviousStep()\"\r\n >\r\n Previous\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"px-3 py-2 rounded border border-surface-300 text-sm\"\r\n [disabled]=\"currentStep() === stepSections().length\"\r\n (click)=\"goToNextStep()\"\r\n >\r\n Next\r\n </button>\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\r\n <mt-dynamic-form\r\n [formConfig]=\"config\"\r\n [formControl]=\"formControl\"\r\n [visibleSectionKeys]=\"visibleSectionKeys()\"\r\n [forcedHiddenFieldKeys]=\"forcedHiddenFieldKeys()\"\r\n [preserveForcedHiddenValues]=\"true\"\r\n (runtimeMessagesChange)=\"onRuntimeMessagesChange($event)\"\r\n />\r\n </div>\r\n }\r\n } @else if (previewEntities().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: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: EntitiesPreview, selector: "mt-entities-preview", inputs: ["entities"] }, { 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", "size", "fluid", "disabled"], outputs: ["activeChange", "onChange"] }, { kind: "component", type: Skeleton, selector: "p-skeleton", inputs: ["styleClass", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "ngmodule", type: StepperModule }, { kind: "component", type: i2.Stepper, selector: "p-stepper", inputs: ["value", "linear", "transitionOptions", "motionOptions"], outputs: ["valueChange"] }, { kind: "component", type: i2.StepList, selector: "p-step-list" }, { kind: "component", type: i2.Step, selector: "p-step", inputs: ["value", "disabled"], outputs: ["valueChange"] }] });
808
982
  }
809
983
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: ClientForm, decorators: [{
810
984
  type: Component,
811
985
  args: [{ selector: 'mt-client-form', standalone: true, imports: [
812
986
  CommonModule,
813
987
  ReactiveFormsModule,
988
+ EntitiesPreview,
814
989
  DynamicForm,
815
990
  Tabs,
816
991
  Skeleton,
817
992
  StepperModule,
818
- ], providers: [ClientFormStateService], template: "<!-- Client Form Template \u2014 Render only, NO action buttons -->\n\n<!-- Loading State -->\n@if (state.loading()) {\n <div class=\"flex flex-col gap-6\">\n <!-- Section header skeleton -->\n <div class=\"flex flex-col gap-4\">\n <p-skeleton width=\"30%\" height=\"1.5rem\" />\n <div class=\"grid grid-cols-12 gap-4\">\n <div class=\"col-span-6 flex flex-col gap-2\">\n <p-skeleton width=\"40%\" height=\"0.875rem\" />\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\n </div>\n <div class=\"col-span-6 flex flex-col gap-2\">\n <p-skeleton width=\"40%\" height=\"0.875rem\" />\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\n </div>\n <div class=\"col-span-12 flex flex-col gap-2\">\n <p-skeleton width=\"25%\" height=\"0.875rem\" />\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\n </div>\n <div class=\"col-span-6 flex flex-col gap-2\">\n <p-skeleton width=\"35%\" height=\"0.875rem\" />\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\n </div>\n <div class=\"col-span-6 flex flex-col gap-2\">\n <p-skeleton width=\"45%\" height=\"0.875rem\" />\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\n </div>\n </div>\n </div>\n\n <!-- Second section skeleton -->\n <div class=\"flex flex-col gap-4\">\n <p-skeleton width=\"25%\" height=\"1.5rem\" />\n <div class=\"grid grid-cols-12 gap-4\">\n <div class=\"col-span-6 flex flex-col gap-2\">\n <p-skeleton width=\"35%\" height=\"0.875rem\" />\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\n </div>\n <div class=\"col-span-6 flex flex-col gap-2\">\n <p-skeleton width=\"50%\" height=\"0.875rem\" />\n <p-skeleton width=\"100%\" height=\"2.5rem\" />\n </div>\n <div class=\"col-span-12 flex flex-col gap-2\">\n <p-skeleton width=\"30%\" height=\"0.875rem\" />\n <p-skeleton width=\"100%\" height=\"5rem\" />\n </div>\n </div>\n </div>\n </div>\n}\n\n<!-- Loaded State -->\n@if (state.isLoaded() && !state.loading()) {\n <!-- Dynamic Form -->\n @if (state.requiresForm() && formConfig(); as config) {\n <div class=\"flex flex-col gap-4\">\n @if (runtimeErrors().length > 0 || runtimeWarnings().length > 0) {\n <div class=\"rounded-lg border border-surface-200 p-4 bg-surface-50\">\n @if (runtimeErrors().length > 0) {\n <div class=\"mb-3\">\n <h4 class=\"text-sm font-semibold text-red-600 mb-2\">\n Validation Errors\n </h4>\n <ul class=\"list-disc ps-5 text-sm text-red-600 space-y-1\">\n @for (\n msg of runtimeErrors();\n track msg.ruleId || msg.fieldKey || msg.message\n ) {\n <li>{{ msg.message }}</li>\n }\n </ul>\n </div>\n }\n\n @if (runtimeWarnings().length > 0) {\n <div>\n <h4 class=\"text-sm font-semibold text-amber-600 mb-2\">\n Validation Warnings\n </h4>\n <ul class=\"list-disc ps-5 text-sm text-amber-700 space-y-1\">\n @for (\n msg of runtimeWarnings();\n track msg.ruleId || msg.fieldKey || msg.message\n ) {\n <li>{{ msg.message }}</li>\n }\n </ul>\n </div>\n }\n </div>\n }\n @if (stepsEnabled()) {\n <div class=\"flex flex-col gap-4\">\n <p-stepper\n [value]=\"currentStep()\"\n (valueChange)=\"onStepChange($event)\"\n >\n <p-step-list>\n @for (section of stepSections(); track section.key || $index) {\n <p-step [value]=\"$index + 1\">\n {{ section.label || \"Step \" + ($index + 1) }}\n </p-step>\n }\n </p-step-list>\n </p-stepper>\n\n @if (showInternalStepActions()) {\n <div class=\"flex justify-between gap-2\">\n <button\n type=\"button\"\n class=\"px-3 py-2 rounded border border-surface-300 text-sm\"\n [disabled]=\"currentStep() === 1\"\n (click)=\"goToPreviousStep()\"\n >\n Previous\n </button>\n <button\n type=\"button\"\n class=\"px-3 py-2 rounded border border-surface-300 text-sm\"\n [disabled]=\"currentStep() === stepSections().length\"\n (click)=\"goToNextStep()\"\n >\n Next\n </button>\n </div>\n }\n </div>\n }\n\n @if (tabsEnabled()) {\n <mt-tabs\n [active]=\"currentStep()\"\n (activeChange)=\"onStepChange($event)\"\n [options]=\"tabOptions()\"\n size=\"small\"\n fluid\n />\n }\n\n <mt-dynamic-form\n [formConfig]=\"config\"\n [formControl]=\"formControl\"\n [forcedHiddenFieldKeys]=\"forcedHiddenFieldKeys()\"\n [preserveForcedHiddenValues]=\"true\"\n (runtimeMessagesChange)=\"onRuntimeMessagesChange($event)\"\n />\n </div>\n } @else if (!state.requiresForm()) {\n <div\n class=\"flex items-center justify-center p-6 rounded-lg bg-surface-50 border border-surface-200 border-dashed\"\n >\n <p class=\"text-sm text-muted-color\">\n No form required for this operation.\n </p>\n </div>\n }\n}\n", styles: [":host{display:block}\n"] }]
993
+ ], providers: [ClientFormStateService], template: "<!-- Client Form Template \u2014 Render only, NO action buttons -->\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\">\r\n @if (previewEntities().length > 0) {\r\n <mt-entities-preview [entities]=\"previewEntities()\" />\r\n }\r\n\r\n <!-- Dynamic Form -->\r\n @if (state.requiresForm() && editableFormConfig(); as config) {\r\n @if (hasEditableFormSections()) {\r\n <div class=\"flex flex-col gap-4\">\r\n @if (runtimeErrors().length > 0 || runtimeWarnings().length > 0) {\r\n <div class=\"rounded-lg border border-surface-200 p-4 bg-surface-50\">\r\n @if (runtimeErrors().length > 0) {\r\n <div class=\"mb-3\">\r\n <h4 class=\"text-sm font-semibold text-red-600 mb-2\">\r\n Validation Errors\r\n </h4>\r\n <ul class=\"list-disc ps-5 text-sm text-red-600 space-y-1\">\r\n @for (\r\n msg of runtimeErrors();\r\n track msg.ruleId || msg.fieldKey || msg.message\r\n ) {\r\n <li>{{ msg.message }}</li>\r\n }\r\n </ul>\r\n </div>\r\n }\r\n\r\n @if (runtimeWarnings().length > 0) {\r\n <div>\r\n <h4 class=\"text-sm font-semibold text-amber-600 mb-2\">\r\n Validation Warnings\r\n </h4>\r\n <ul class=\"list-disc ps-5 text-sm text-amber-700 space-y-1\">\r\n @for (\r\n msg of runtimeWarnings();\r\n track msg.ruleId || msg.fieldKey || msg.message\r\n ) {\r\n <li>{{ msg.message }}</li>\r\n }\r\n </ul>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n @if (stepsEnabled()) {\r\n <div class=\"flex flex-col gap-4\">\r\n <p-stepper\r\n [value]=\"currentStep()\"\r\n (valueChange)=\"onStepChange($event)\"\r\n >\r\n <p-step-list>\r\n @for (section of stepSections(); track section.key || $index) {\r\n <p-step [value]=\"$index + 1\">\r\n {{ section.label || \"Step \" + ($index + 1) }}\r\n </p-step>\r\n }\r\n </p-step-list>\r\n </p-stepper>\r\n\r\n @if (showInternalStepActions()) {\r\n <div class=\"flex justify-between gap-2\">\r\n <button\r\n type=\"button\"\r\n class=\"px-3 py-2 rounded border border-surface-300 text-sm\"\r\n [disabled]=\"currentStep() === 1\"\r\n (click)=\"goToPreviousStep()\"\r\n >\r\n Previous\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"px-3 py-2 rounded border border-surface-300 text-sm\"\r\n [disabled]=\"currentStep() === stepSections().length\"\r\n (click)=\"goToNextStep()\"\r\n >\r\n Next\r\n </button>\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\r\n <mt-dynamic-form\r\n [formConfig]=\"config\"\r\n [formControl]=\"formControl\"\r\n [visibleSectionKeys]=\"visibleSectionKeys()\"\r\n [forcedHiddenFieldKeys]=\"forcedHiddenFieldKeys()\"\r\n [preserveForcedHiddenValues]=\"true\"\r\n (runtimeMessagesChange)=\"onRuntimeMessagesChange($event)\"\r\n />\r\n </div>\r\n }\r\n } @else if (previewEntities().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"] }]
819
994
  }], ctorParameters: () => [], propDecorators: { 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 }] }], 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 }] }], lang: [{ type: i0.Input, args: [{ isSignal: true, alias: "lang", required: false }] }], lookups: [{ type: i0.Input, args: [{ isSignal: true, alias: "lookups", 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"] }] } });
820
995
 
821
996
  // ============================================================================
@@ -836,5 +1011,5 @@ function isFormRequiredInterception(response) {
836
1011
  * Generated bundle index. Do not edit.
837
1012
  */
838
1013
 
839
- export { ClientForm, ClientFormApiService, ClientFormStateService, isFormRequiredInterception, mapFormValueToSubmitValues, mapToDynamicFormConfig, mapValuesToFormValue };
1014
+ export { ClientForm, ClientFormApiService, ClientFormStateService, getPreviewOnlyFieldKeys, isFormRequiredInterception, mapFormValueToSubmitValues, mapPreviewFieldsToEntities, mapToDynamicFormConfig, mapValuesToFormValue };
840
1015
  //# sourceMappingURL=masterteam-forms-client-form.mjs.map