@masterteam/forms 0.0.45 → 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.
- package/fesm2022/masterteam-forms-client-form.mjs +88 -8
- package/fesm2022/masterteam-forms-client-form.mjs.map +1 -1
- package/fesm2022/masterteam-forms-dynamic-field.mjs +2 -2
- package/fesm2022/masterteam-forms-dynamic-field.mjs.map +1 -1
- package/package.json +2 -2
- package/types/masterteam-forms-client-form.d.ts +9 -1
|
@@ -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
|
// ============================================================================
|
|
@@ -234,6 +240,38 @@ function mapFormValueToSubmitValues(formValue, loadResponse) {
|
|
|
234
240
|
})
|
|
235
241
|
.filter((value) => !!value);
|
|
236
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
|
+
}
|
|
237
275
|
// ============================================================================
|
|
238
276
|
// Internal Helpers
|
|
239
277
|
// ============================================================================
|
|
@@ -244,6 +282,16 @@ function mapFormValueToSubmitValues(formValue, loadResponse) {
|
|
|
244
282
|
function resolveProperty(field) {
|
|
245
283
|
return field.property ?? field.propertyMetadata;
|
|
246
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
|
+
}
|
|
247
295
|
function resolveFieldMeta(field) {
|
|
248
296
|
const property = resolveProperty(field);
|
|
249
297
|
return {
|
|
@@ -621,7 +669,35 @@ class ClientForm {
|
|
|
621
669
|
}, ...(ngDevMode ? [{ debugName: "initialValues" }] : []));
|
|
622
670
|
virtualFields = computed(() => this.state.virtualFields(), ...(ngDevMode ? [{ debugName: "virtualFields" }] : []));
|
|
623
671
|
hasVirtualFields = computed(() => this.virtualFields().length > 0, ...(ngDevMode ? [{ debugName: "hasVirtualFields" }] : []));
|
|
624
|
-
|
|
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" }] : []));
|
|
625
701
|
stepsEnabled = computed(() => this.renderMode() === 'steps' && this.stepSections().length > 1, ...(ngDevMode ? [{ debugName: "stepsEnabled" }] : []));
|
|
626
702
|
tabsEnabled = computed(() => this.renderMode() === 'tabs' && this.stepSections().length > 1, ...(ngDevMode ? [{ debugName: "tabsEnabled" }] : []));
|
|
627
703
|
sectionNavigationEnabled = computed(() => this.stepsEnabled() || this.tabsEnabled(), ...(ngDevMode ? [{ debugName: "sectionNavigationEnabled" }] : []));
|
|
@@ -643,13 +719,16 @@ class ClientForm {
|
|
|
643
719
|
return [];
|
|
644
720
|
const sections = this.stepSections();
|
|
645
721
|
const currentIndex = this.currentStep() - 1;
|
|
646
|
-
|
|
722
|
+
const hiddenFieldKeys = new Set();
|
|
723
|
+
sections.forEach((section, index) => {
|
|
647
724
|
if (index === currentIndex)
|
|
648
|
-
return
|
|
649
|
-
|
|
725
|
+
return;
|
|
726
|
+
section.fields
|
|
650
727
|
.map((field) => field.key)
|
|
651
|
-
.filter((key) => !!key)
|
|
728
|
+
.filter((key) => !!key)
|
|
729
|
+
.forEach((key) => hiddenFieldKeys.add(key));
|
|
652
730
|
});
|
|
731
|
+
return [...hiddenFieldKeys];
|
|
653
732
|
}, ...(ngDevMode ? [{ debugName: "forcedHiddenFieldKeys" }] : []));
|
|
654
733
|
// ============================================================================
|
|
655
734
|
// Effects
|
|
@@ -899,18 +978,19 @@ class ClientForm {
|
|
|
899
978
|
return req;
|
|
900
979
|
}
|
|
901
980
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: ClientForm, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
902
|
-
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 [visibleSectionKeys]=\"visibleSectionKeys()\"\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", "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"] }] });
|
|
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"] }] });
|
|
903
982
|
}
|
|
904
983
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: ClientForm, decorators: [{
|
|
905
984
|
type: Component,
|
|
906
985
|
args: [{ selector: 'mt-client-form', standalone: true, imports: [
|
|
907
986
|
CommonModule,
|
|
908
987
|
ReactiveFormsModule,
|
|
988
|
+
EntitiesPreview,
|
|
909
989
|
DynamicForm,
|
|
910
990
|
Tabs,
|
|
911
991
|
Skeleton,
|
|
912
992
|
StepperModule,
|
|
913
|
-
], 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
|
|
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"] }]
|
|
914
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"] }] } });
|
|
915
995
|
|
|
916
996
|
// ============================================================================
|
|
@@ -931,5 +1011,5 @@ function isFormRequiredInterception(response) {
|
|
|
931
1011
|
* Generated bundle index. Do not edit.
|
|
932
1012
|
*/
|
|
933
1013
|
|
|
934
|
-
export { ClientForm, ClientFormApiService, ClientFormStateService, isFormRequiredInterception, mapFormValueToSubmitValues, mapToDynamicFormConfig, mapValuesToFormValue };
|
|
1014
|
+
export { ClientForm, ClientFormApiService, ClientFormStateService, getPreviewOnlyFieldKeys, isFormRequiredInterception, mapFormValueToSubmitValues, mapPreviewFieldsToEntities, mapToDynamicFormConfig, mapValuesToFormValue };
|
|
935
1015
|
//# sourceMappingURL=masterteam-forms-client-form.mjs.map
|
|
@@ -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} from '../models/client-form.model';\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 private readonly baseUrl = 'process-forms';\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 `${this.baseUrl}/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 `${this.baseUrl}/submit`,\r\n request,\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 isFallbackForm = computed(() => {\r\n const source = this.formSource();\r\n return source === 'ModuleFallback' || source === 'LevelFallback';\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 readonly createdEntityId = computed<number | null>(\r\n () => this.submitResponse()?.createdEntityId ?? null,\r\n );\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 {\n DynamicFormConfig,\n DynamicFieldConfig,\n FormulaValidationRuleConfig,\n} from '@masterteam/components';\nimport {\n REQUEST_CONTEXT,\n ValidatorConfig,\n TextFieldConfig,\n EditorFieldConfig,\n SelectFieldConfig,\n MultiSelectFieldConfig,\n DateFieldConfig,\n NumberFieldConfig,\n SliderFieldConfig,\n ToggleFieldConfig,\n UserSearchFieldConfig,\n UploadFileFieldConfig,\n SchemaConnectionFieldConfig,\n} from '@masterteam/components';\nimport { HttpContext } from '@angular/common/http';\n\nimport type {\n ClientFormConfiguration,\n ClientFormField,\n ClientPropertyItem,\n ClientLookup,\n ProcessFormValue,\n ProcessFormLoadResponse,\n ProcessFormSubmitValue,\n} from '../models/client-form.model';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst WIDTH_TO_COLSPAN: Record<string, number> = {\n '25': 3,\n '50': 6,\n '100': 12,\n};\n\n// ============================================================================\n// Public Mapper Functions\n// ============================================================================\n\n/**\n * Convert a runtime FormConfiguration into a DynamicFormConfig\n * that can be passed directly to `<mt-dynamic-form>`.\n *\n * @param config The form configuration from the load API\n * @param lang Current UI language ('en' | 'ar')\n * @param mode 'create' or 'edit' — filters hidden fields accordingly\n * @param lookups Available lookup definitions for resolving Lookup/LookupMultiSelect options\n */\nexport function mapToDynamicFormConfig(\n config: ClientFormConfiguration,\n lang: 'en' | 'ar' = 'en',\n mode: 'create' | 'edit' = 'create',\n lookups: ClientLookup[] = [],\n): DynamicFormConfig {\n const validationRules = mapValidationRules(config, lang);\n\n return {\n sections: config.sections\n .slice()\n .sort((a, b) => a.order - b.order)\n .map((section) => {\n const sectionName = section.name[lang] ?? section.name['en'] ?? '';\n\n const visibleFields = section.fields\n .filter((field) => {\n // isRead=false → completely hidden\n if (field.isRead === false) return false;\n if (mode === 'create') return !field.hiddenInCreation;\n return !field.hiddenInEditForm;\n })\n .sort((a, b) => a.order - b.order);\n\n return {\n key: section.id,\n label: sectionName,\n type: 'header' as const,\n columns: 12,\n order: section.order,\n fields: visibleFields.map((field) =>\n mapFieldToConfig(field, lang, lookups),\n ),\n };\n })\n .filter((section) => section.fields.length > 0),\n validationRules,\n };\n}\n\n/**\n * Convert API property values into a flat key-value object\n * suitable for `formControl.patchValue()`.\n *\n * Only includes non-virtual (editable) values.\n */\nexport function mapValuesToFormValue(\n values: ProcessFormValue[],\n config?: ClientFormConfiguration | null,\n): Record<string, any> {\n const result: Record<string, any> = {};\n const fieldMap = config ? buildFieldValueMap(config) : null;\n\n for (const v of values) {\n if (v.metadata?.source === 'ProcessVirtual') continue;\n\n const targetFieldKey =\n resolveValueTargetKey(v, fieldMap) ?? v.propertyKey ?? null;\n if (!targetFieldKey) continue;\n\n result[targetFieldKey] = v.value;\n }\n\n return result;\n}\n\n/**\n * Convert the current form value back into the submit payload format.\n *\n * Uses form configuration metadata (same source used to render fields)\n * to map `requestPropertyId` and `viewType`.\n */\nexport function mapFormValueToSubmitValues(\n formValue: Record<string, any>,\n loadResponse: ProcessFormLoadResponse,\n): ProcessFormSubmitValue[] {\n const metadataByKey = new Map<\n string,\n { propertyId?: number; viewType?: string }\n >();\n\n for (const section of loadResponse.formConfiguration?.sections ?? []) {\n for (const field of section.fields ?? []) {\n const { propertyId, viewType } = resolveFieldMeta(field);\n metadataByKey.set(field.propertyKey, {\n propertyId,\n viewType,\n });\n }\n }\n\n return Object.entries(formValue)\n .filter(([, value]) => value !== undefined && value !== null)\n .map(([propertyKey, value]) => {\n const meta = metadataByKey.get(propertyKey);\n const normalizedValue = normalizeSubmitValue(value, meta?.viewType);\n if (normalizedValue === undefined || normalizedValue === null) {\n return null;\n }\n\n const submitValue: ProcessFormSubmitValue = {\n propertyKey,\n value: normalizedValue,\n };\n\n if (meta?.propertyId) {\n submitValue.requestPropertyId = meta.propertyId;\n }\n\n return submitValue;\n })\n .filter((value): value is ProcessFormSubmitValue => !!value);\n}\n\n// ============================================================================\n// Internal Helpers\n// ============================================================================\n\n/**\n * Resolve the property item from either `property` or `propertyMetadata`.\n * The API may return the data under either key.\n */\nfunction resolveProperty(\n field: ClientFormField,\n): ClientPropertyItem | undefined {\n return field.property ?? field.propertyMetadata;\n}\n\nfunction resolveFieldMeta(field: ClientFormField): {\n property: ClientPropertyItem | undefined;\n propertyId?: number;\n viewType: string;\n} {\n const property = resolveProperty(field);\n return {\n property,\n propertyId: property?.propertyId,\n viewType: property?.viewType ?? 'Text',\n };\n}\n\nfunction mapFieldToConfig(\n field: ClientFormField,\n lang: 'en' | 'ar',\n lookups: ClientLookup[],\n): DynamicFieldConfig {\n const { property: prop, viewType } = resolveFieldMeta(field);\n const label = resolvePropertyName(prop, lang) || field.propertyKey;\n const colSpan = WIDTH_TO_COLSPAN[field.width] ?? 12;\n\n const base = {\n key: field.propertyKey,\n label,\n colSpan,\n order: field.order,\n placeholder: label,\n required: field.isRequired ?? false,\n readonly: field.isWrite === false,\n validators: field.isRequired\n ? [ValidatorConfig.required(`${label} is required`)]\n : [],\n formulaCondition: buildFormulaCondition(field),\n };\n\n switch (viewType) {\n // ── Text-like ──────────────────────────────────────────────\n case 'Text':\n case 'Currency':\n case 'EditableListView':\n case 'LookupLog':\n return new TextFieldConfig(base);\n\n case 'LongText':\n return new EditorFieldConfig(base);\n\n // ── Numeric ───────────────────────────────────────────────\n case 'Number':\n return new NumberFieldConfig(base);\n\n case 'Percentage':\n return new SliderFieldConfig({ ...base, min: 0, max: 100 });\n\n // ── Date / Time ───────────────────────────────────────────\n case 'Date':\n return new DateFieldConfig({ ...base, showTime: false });\n\n case 'DateTime':\n return new DateFieldConfig({ ...base, showTime: true });\n\n case 'Time':\n return new DateFieldConfig({ ...base, showTime: true });\n\n // ── Boolean ───────────────────────────────────────────────\n case 'Checkbox':\n return new ToggleFieldConfig(base);\n\n // ── File ──────────────────────────────────────────────────\n case 'Attachment':\n return new UploadFileFieldConfig(base);\n\n // ── User Search ───────────────────────────────────────────\n case 'User':\n return new UserSearchFieldConfig({\n ...base,\n apiUrl: 'Identity/users',\n context: new HttpContext().set(REQUEST_CONTEXT, {\n useBaseUrl: false,\n }),\n });\n\n // ── Lookup (single select) ────────────────────────────────\n case 'Lookup': {\n const items = resolveLookupOptions(prop, lookups);\n return new SelectFieldConfig({\n ...base,\n options: items,\n optionLabel: 'label',\n optionValue: 'value',\n filter: items.length > 10,\n showClear: !(field.isRequired ?? false),\n });\n }\n\n // ── Lookup (multi select) ─────────────────────────────────\n case 'LookupMultiSelect': {\n const items = resolveLookupOptions(prop, lookups);\n return new MultiSelectFieldConfig({\n ...base,\n options: items,\n optionLabel: 'label',\n optionValue: 'value',\n filter: items.length > 10,\n display: 'chip',\n });\n }\n\n // ── Other select-based types ──────────────────────────────\n case 'Status':\n case 'InternalModule':\n case 'DynamicList':\n case 'API':\n case 'LookupMatrix':\n case 'Location': {\n const options = extractOptionsFromProperty(prop);\n return new SelectFieldConfig({\n ...base,\n options: options ?? [],\n optionLabel: 'label',\n optionValue: 'value',\n });\n }\n\n // ── Connection (level-to-level) ─────────────────────────\n case 'Connection': {\n const connectionConfig = prop?.configuration ?? {};\n return new SchemaConnectionFieldConfig({\n ...base,\n configuration: connectionConfig,\n });\n }\n\n // ── Fallback ──────────────────────────────────────────────\n default:\n return new TextFieldConfig(base);\n }\n}\n\nfunction buildFormulaCondition(\n field: ClientFormField,\n): { formulaTokens: string; formulaText?: string; mode?: 'auto' } | undefined {\n if (!field.showConditionalDisplayFormula) return undefined;\n const formulaTokens = (field.conditionalDisplayFormula ?? '').trim();\n if (!formulaTokens) return undefined;\n\n return {\n formulaTokens,\n formulaText: field.conditionalDisplayFormula ?? '',\n mode: 'auto',\n };\n}\n\nfunction mapValidationRules(\n config: ClientFormConfiguration,\n lang: 'en' | 'ar',\n): FormulaValidationRuleConfig[] {\n return (config.validations ?? []).map((rule) => ({\n id: rule.id,\n formulaTokens: rule.formulaTokens,\n formulaText: rule.formulaText,\n message:\n rule.message?.[lang] ??\n rule.message?.en ??\n rule.message?.ar ??\n 'Validation rule failed',\n severity: rule.severity,\n enabled: rule.enabled,\n }));\n}\n\nfunction resolvePropertyName(\n property: ClientPropertyItem | undefined,\n lang: 'en' | 'ar',\n): string {\n if (!property?.name) return '';\n if (typeof property.name === 'string') return property.name;\n // Prefer display name, then lang-specific, then English fallback\n return (\n property.name['display'] ?? property.name[lang] ?? property.name['en'] ?? ''\n );\n}\n\n/**\n * Resolve lookup items for Lookup / LookupMultiSelect viewTypes.\n *\n * Reads `configuration.lookup` (the lookup ID) from the property metadata,\n * finds the matching lookup definition, and maps its items to select options.\n */\nfunction resolveLookupOptions(\n prop: ClientPropertyItem | undefined,\n lookups: ClientLookup[],\n): { label: string; value: string }[] {\n const lookupId = prop?.configuration?.['lookup'] as number | undefined;\n if (!lookupId || !lookups.length) return [];\n\n const lookup = lookups.find((l) => l.id === lookupId);\n if (!lookup) return [];\n\n return lookup.items\n .slice()\n .sort((a, b) => a.order - b.order)\n .map((item) => ({\n label: item.name?.display ?? item.key,\n value: item.key,\n }));\n}\n\n/**\n * Fallback option extractor for non-lookup select types\n * (Status, InternalModule, DynamicList, API, etc.).\n */\nfunction extractOptionsFromProperty(\n property: ClientPropertyItem | undefined,\n): { label: string; value: any }[] | null {\n if (!property?.configuration) return null;\n\n const config = property.configuration;\n\n if (Array.isArray(config['options'])) {\n return config['options'] as { label: string; value: any }[];\n }\n\n if (Array.isArray(config['items'])) {\n return (config['items'] as any[]).map((item) => ({\n label:\n typeof item.name === 'string'\n ? item.name\n : (item.name?.['en'] ?? item.label ?? String(item.value)),\n value: item.id ?? item.value ?? item.key,\n }));\n }\n\n return null;\n}\n\nfunction normalizeSubmitValue(value: any, viewType?: string): any {\n switch (viewType) {\n case 'User':\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value['id'] ?? value;\n }\n return value;\n\n default:\n return value;\n }\n}\n\ntype FieldValueMeta = {\n key: string;\n propertyId?: number;\n};\n\ntype FieldValueMap = {\n fieldsByKey: Map<string, FieldValueMeta>;\n propertyIdToKey: Map<number, string>;\n aliasToKey: Map<string, string>;\n};\n\nfunction buildFieldValueMap(config: ClientFormConfiguration): FieldValueMap {\n const fieldsByKey = new Map<string, FieldValueMeta>();\n const propertyIdCandidates = new Map<number, Set<string>>();\n const aliasCandidates = new Map<string, Set<string>>();\n\n for (const section of config.sections ?? []) {\n for (const field of section.fields ?? []) {\n const { propertyId } = resolveFieldMeta(field);\n const fieldMeta: FieldValueMeta = {\n key: field.propertyKey,\n propertyId,\n };\n\n fieldsByKey.set(field.propertyKey, fieldMeta);\n\n if (propertyId != null) {\n if (!propertyIdCandidates.has(propertyId)) {\n propertyIdCandidates.set(propertyId, new Set<string>());\n }\n propertyIdCandidates.get(propertyId)!.add(field.propertyKey);\n }\n\n const aliases = new Set<string>([\n field.propertyKey,\n stripTemplatePrefix(field.propertyKey),\n ]);\n\n const property = resolveProperty(field);\n if (property?.key) {\n aliases.add(property.key);\n aliases.add(stripTemplatePrefix(property.key));\n }\n\n aliases.forEach((alias) => {\n if (!alias) return;\n if (!aliasCandidates.has(alias)) {\n aliasCandidates.set(alias, new Set<string>());\n }\n aliasCandidates.get(alias)!.add(field.propertyKey);\n });\n }\n }\n\n const propertyIdToKey = new Map<number, string>();\n propertyIdCandidates.forEach((keys, propertyId) => {\n if (keys.size !== 1) return;\n propertyIdToKey.set(propertyId, [...keys][0]);\n });\n\n const aliasToKey = new Map<string, string>();\n aliasCandidates.forEach((keys, alias) => {\n if (keys.size !== 1) return;\n aliasToKey.set(alias, [...keys][0]);\n });\n\n return {\n fieldsByKey,\n propertyIdToKey,\n aliasToKey,\n };\n}\n\nfunction resolveValueTargetKey(\n value: ProcessFormValue,\n fieldMap: FieldValueMap | null,\n): string | null {\n if (!fieldMap) {\n return value.propertyKey ?? null;\n }\n\n const exactCandidates = [value.propertyKey, value.metadata?.key].filter(\n (candidate): candidate is string => !!candidate,\n );\n\n for (const candidate of exactCandidates) {\n if (fieldMap.fieldsByKey.has(candidate)) {\n return candidate;\n }\n }\n\n const propertyId = value.metadata?.propertyId;\n if (propertyId != null && fieldMap.propertyIdToKey.has(propertyId)) {\n return fieldMap.propertyIdToKey.get(propertyId)!;\n }\n\n const aliasCandidates = exactCandidates.flatMap((candidate) => [\n candidate,\n stripTemplatePrefix(candidate),\n ]);\n\n for (const candidate of aliasCandidates) {\n if (!candidate) continue;\n if (fieldMap.aliasToKey.has(candidate)) {\n return fieldMap.aliasToKey.get(candidate)!;\n }\n }\n\n return null;\n}\n\nfunction stripTemplatePrefix(value: string): string {\n return value.replace(/^template_\\d+_/, '');\n}\n","import {\n Component,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n untracked,\n OnDestroy,\n} from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { Subscription } from 'rxjs';\nimport { Skeleton } from 'primeng/skeleton';\nimport { StepperModule } from 'primeng/stepper';\n\nimport { Tabs, type OptionItem } from '@masterteam/components/tabs';\nimport { DynamicForm } from '@masterteam/forms/dynamic-form';\nimport type {\n DynamicFormConfig,\n FormulaRuntimeMessage,\n} from '@masterteam/components';\n\nimport { ClientFormApiService } from './services/client-form-api.service';\nimport { ClientFormStateService } from './services/client-form-state.service';\nimport {\n mapToDynamicFormConfig,\n mapValuesToFormValue,\n mapFormValueToSubmitValues,\n} from './utils/form-config-mapper';\n\nimport type {\n ProcessFormLoadRequest,\n ProcessFormLoadResponse,\n ProcessFormSubmitRequest,\n ProcessFormSubmitResponse,\n ProcessFormSubmitValue,\n ProcessFormMode,\n ProcessFormSource,\n ProcessFormValue,\n ClientLookup,\n} from './models/client-form.model';\n\n/**\n * Client Form — Runtime process form component.\n *\n * Self-contained, signal-based (no NGXS). Each instance manages its own state\n * via a component-scoped `ClientFormStateService`.\n *\n * **No action buttons in template.** Parent controls all actions via `viewChild()`:\n *\n * ```html\n * <mt-client-form #processForm [moduleKey]=\"'Risk'\" [operationKey]=\"'CloseRisk'\" />\n * <button (click)=\"processForm.load()\">Load</button>\n * <button (click)=\"processForm.submit()\">Submit</button>\n * ```\n *\n * Or programmatically:\n * ```typescript\n * readonly processForm = viewChild.required(ClientForm);\n * this.processForm().load();\n * this.processForm().submit();\n * ```\n */\n@Component({\n selector: 'mt-client-form',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n DynamicForm,\n Tabs,\n Skeleton,\n StepperModule,\n ],\n providers: [ClientFormStateService],\n templateUrl: './client-form.html',\n styleUrls: ['./client-form.scss'],\n})\nexport class ClientForm implements OnDestroy {\n private readonly api = inject(ClientFormApiService);\n protected readonly state = inject(ClientFormStateService);\n\n private loadSub?: Subscription;\n private submitSub?: Subscription;\n readonly runtimeMessages = signal<FormulaRuntimeMessage[]>([]);\n\n // ============================================================================\n // Public State Signals (for parent access via viewChild)\n // ============================================================================\n\n readonly submitting = computed(() => this.state.submitting());\n readonly submitError = computed(() => this.state.submitError());\n readonly isSubmitted = computed(() => this.state.isSubmitted());\n readonly isPendingApproval = computed(() => this.state.isPendingApproval());\n readonly isExecuted = computed(() => this.state.isExecuted());\n readonly isLoaded = computed(() => this.state.isLoaded());\n readonly loading = computed(() => this.state.loading());\n readonly runtimeErrors = computed(() =>\n this.runtimeMessages().filter((msg) => msg.severity === 'error'),\n );\n readonly runtimeWarnings = computed(() =>\n this.runtimeMessages().filter((msg) => msg.severity === 'warning'),\n );\n readonly currentStep = signal(1);\n\n // ============================================================================\n // Inputs — Required Context\n // ============================================================================\n\n readonly moduleKey = input.required<string>();\n readonly operationKey = input.required<string>();\n\n // ============================================================================\n // Inputs — Optional Context\n // ============================================================================\n\n readonly moduleId = input<number>();\n readonly levelId = input<number>();\n readonly levelDataId = input<number>();\n readonly moduleDataId = input<number>();\n readonly requestSchemaId = input<number>();\n readonly draftProcessId = input<number>();\n readonly preview = input(false);\n readonly returnUrl = input<string>();\n\n // ============================================================================\n // Inputs — UI Configuration\n // ============================================================================\n\n readonly readonly = input(false);\n readonly autoLoad = input(true);\n readonly formMode = input<'create' | 'edit'>('create');\n readonly renderMode = input<'form' | 'steps' | 'tabs'>('form');\n readonly showInternalStepActions = input<boolean>(true);\n readonly lang = input<'en' | 'ar'>('en');\n readonly lookups = input<ClientLookup[]>([]);\n\n // ============================================================================\n // Outputs\n // ============================================================================\n\n readonly loaded = output<ProcessFormLoadResponse>();\n readonly submitted = output<ProcessFormSubmitResponse>();\n readonly errored = output<string>();\n readonly modeDetected = output<ProcessFormMode>();\n readonly formSourceDetected = output<ProcessFormSource>();\n\n // ============================================================================\n // Internal Form Control\n // ============================================================================\n\n readonly formControl = new FormControl<Record<string, any>>({});\n\n // ============================================================================\n // Computed — Dynamic Form Config\n // ============================================================================\n\n readonly formConfig = computed<DynamicFormConfig | null>(() => {\n const config = this.state.formConfiguration();\n if (!config) return null;\n return mapToDynamicFormConfig(\n config,\n this.lang(),\n this.formMode(),\n this.lookups(),\n );\n });\n\n readonly initialValues = computed<Record<string, any>>(() => {\n return mapValuesToFormValue(\n this.state.formValues(),\n this.state.formConfiguration(),\n );\n });\n\n readonly virtualFields = computed<ProcessFormValue[]>(() =>\n this.state.virtualFields(),\n );\n\n readonly hasVirtualFields = computed(() => this.virtualFields().length > 0);\n readonly stepSections = computed(() => this.formConfig()?.sections ?? []);\n readonly stepsEnabled = computed(\n () => this.renderMode() === 'steps' && this.stepSections().length > 1,\n );\n readonly tabsEnabled = computed(\n () => this.renderMode() === 'tabs' && this.stepSections().length > 1,\n );\n readonly sectionNavigationEnabled = computed(\n () => this.stepsEnabled() || this.tabsEnabled(),\n );\n readonly tabOptions = computed<OptionItem[]>(() =>\n this.stepSections().map((section, index) => ({\n label: section.label || `Tab ${index + 1}`,\n value: index + 1,\n })),\n );\n readonly visibleSectionKeys = computed(() => {\n if (!this.sectionNavigationEnabled()) return null;\n\n const currentIndex = this.currentStep() - 1;\n const activeSection = this.stepSections()[currentIndex];\n\n if (!activeSection) return null;\n\n return [activeSection.key || `section-${currentIndex}`];\n });\n readonly forcedHiddenFieldKeys = computed(() => {\n if (!this.sectionNavigationEnabled()) return [];\n\n const sections = this.stepSections();\n const currentIndex = this.currentStep() - 1;\n\n return sections.flatMap((section, index) => {\n if (index === currentIndex) return [];\n return section.fields\n .map((field) => field.key)\n .filter((key): key is string => !!key);\n });\n });\n\n // ============================================================================\n // Effects\n // ============================================================================\n\n constructor() {\n // Auto-load when inputs are ready\n effect(() => {\n const autoLoad = this.autoLoad();\n const moduleKey = this.moduleKey();\n const operationKey = this.operationKey();\n\n if (autoLoad && moduleKey && operationKey) {\n untracked(() => this.load());\n }\n });\n\n // Patch form values after load\n effect(() => {\n const values = this.initialValues();\n const isLoaded = this.state.isLoaded();\n\n if (isLoaded && Object.keys(values).length > 0) {\n untracked(() => {\n this.formControl.patchValue(values, { emitEvent: false });\n });\n }\n });\n\n effect(() => {\n const count = this.stepSections().length;\n const current = this.currentStep();\n\n if (count === 0) {\n if (current !== 1) this.currentStep.set(1);\n return;\n }\n\n if (current < 1 || current > count) {\n this.currentStep.set(1);\n }\n });\n }\n\n // ============================================================================\n // Public API (accessed via viewChild)\n // ============================================================================\n\n /**\n * Load form configuration from the API.\n * Builds request from current input values.\n */\n load(): void {\n if (this.state.loading()) return;\n\n this.loadSub?.unsubscribe();\n this.runtimeMessages.set([]);\n this.state.loading.set(true);\n this.state.error.set(null);\n this.state.submitResponse.set(null);\n\n const request = this.buildLoadRequest();\n\n this.loadSub = this.api.load(request).subscribe({\n next: (response) => {\n this.state.loading.set(false);\n\n if (response.data) {\n this.state.setLoadResponse(response.data);\n this.loaded.emit(response.data);\n\n if (response.data.mode) {\n this.modeDetected.emit(response.data.mode);\n }\n\n if (response.data.formSource) {\n this.formSourceDetected.emit(response.data.formSource);\n }\n } else {\n const msg = response.message ?? 'Failed to load form';\n this.state.setError(msg);\n this.errored.emit(msg);\n }\n },\n error: (err) => {\n const msg =\n err?.error?.message ?? err?.message ?? 'Failed to load form';\n this.state.setError(msg);\n this.errored.emit(msg);\n },\n });\n }\n\n /**\n * Submit the current form values.\n * Builds submit request from form value + load context.\n */\n submit(): void {\n if (this.state.submitting()) return;\n const loadResponse = this.state.loadResponse();\n if (!loadResponse) {\n const msg = 'Form must be loaded before submit';\n this.state.submitError.set(msg);\n this.errored.emit(msg);\n return;\n }\n\n this.submitSub?.unsubscribe();\n this.state.submitting.set(true);\n this.state.submitError.set(null);\n\n const request = this.buildSubmitRequest(loadResponse);\n\n this.submitSub = this.api.submit(request).subscribe({\n next: (response) => {\n this.state.submitting.set(false);\n\n if (response.data) {\n this.state.setSubmitResponse(response.data);\n this.submitted.emit(response.data);\n } else {\n const msg = response.message ?? 'Failed to submit form';\n this.state.setSubmitError(msg);\n this.errored.emit(msg);\n }\n },\n error: (err) => {\n const msg =\n err?.error?.message ?? err?.message ?? 'Failed to submit form';\n this.state.setSubmitError(msg);\n this.errored.emit(msg);\n },\n });\n }\n\n /**\n * Get the current form value as a flat key-value object.\n */\n getFormValue(): Record<string, any> {\n return this.formControl.value ?? {};\n }\n\n /**\n * Get the current form value mapped to submit payload format.\n */\n getSubmitValues(): ProcessFormSubmitValue[] {\n const loadResponse = this.state.loadResponse();\n if (!loadResponse) return [];\n return mapFormValueToSubmitValues(this.getFormValue(), loadResponse);\n }\n\n /**\n * Check whether the current form state is valid.\n */\n isValid(): boolean {\n return this.formControl.valid;\n }\n\n /**\n * Reset the component to its initial state.\n */\n reset(): void {\n this.loadSub?.unsubscribe();\n this.submitSub?.unsubscribe();\n this.formControl.reset({});\n this.runtimeMessages.set([]);\n this.state.reset();\n }\n\n onRuntimeMessagesChange(messages: FormulaRuntimeMessage[]): void {\n this.runtimeMessages.set(messages ?? []);\n }\n\n onStepChange(value: number): void {\n const count = this.stepSections().length;\n if (value < 1 || value > count) return;\n this.currentStep.set(value);\n }\n\n goToPreviousStep(): void {\n this.onStepChange(this.currentStep() - 1);\n }\n\n goToNextStep(): void {\n this.onStepChange(this.currentStep() + 1);\n }\n\n canGoToPreviousStep(): boolean {\n return this.stepsEnabled() && this.currentStep() > 1;\n }\n\n canGoToNextStep(): boolean {\n return (\n this.stepsEnabled() && this.currentStep() < this.stepSections().length\n );\n }\n\n getCurrentStep(): number {\n return this.currentStep();\n }\n\n getStepCount(): number {\n return this.stepSections().length;\n }\n\n isStepNavigationEnabled(): boolean {\n return this.stepsEnabled();\n }\n\n // ============================================================================\n // Lifecycle\n // ============================================================================\n\n ngOnDestroy(): void {\n this.loadSub?.unsubscribe();\n this.submitSub?.unsubscribe();\n }\n\n // ============================================================================\n // Private Helpers\n // ============================================================================\n\n private buildLoadRequest(): ProcessFormLoadRequest {\n const req: ProcessFormLoadRequest = {\n moduleKey: this.moduleKey(),\n operationKey: this.operationKey(),\n };\n\n const moduleId = this.moduleId();\n const levelId = this.levelId();\n const levelDataId = this.levelDataId();\n const moduleDataId = this.moduleDataId();\n const requestSchemaId = this.requestSchemaId();\n const draftProcessId = this.draftProcessId();\n const preview = this.preview();\n\n if (moduleId != null) req.moduleId = moduleId;\n if (levelId != null) req.levelId = levelId;\n if (levelDataId != null) req.levelDataId = levelDataId;\n if (moduleDataId != null) req.moduleDataId = moduleDataId;\n if (requestSchemaId != null) req.requestSchemaId = requestSchemaId;\n if (draftProcessId != null) req.draftProcessId = draftProcessId;\n if (preview) req.preview = preview;\n\n return req;\n }\n\n private buildSubmitRequest(\n loadResponse: ProcessFormLoadResponse,\n ): ProcessFormSubmitRequest {\n const context = this.state.context();\n const formValue = this.getFormValue();\n const values: ProcessFormSubmitValue[] = mapFormValueToSubmitValues(\n formValue,\n loadResponse,\n );\n\n const req: ProcessFormSubmitRequest = {\n moduleKey: context?.moduleKey ?? this.moduleKey(),\n operationKey: context?.operationKey ?? this.operationKey(),\n values,\n };\n\n const moduleId = context?.moduleId ?? this.moduleId();\n const levelId = context?.levelId ?? this.levelId();\n const levelDataId = context?.levelDataId ?? this.levelDataId();\n const moduleDataId = context?.moduleDataId ?? this.moduleDataId();\n const requestSchemaId = context?.requestSchemaId ?? this.requestSchemaId();\n const draftProcessId = this.draftProcessId();\n const returnUrl = this.returnUrl();\n\n if (moduleId != null) req.moduleId = moduleId;\n if (levelId != null) req.levelId = levelId;\n if (levelDataId != null) req.levelDataId = levelDataId;\n if (moduleDataId != null) req.moduleDataId = moduleDataId;\n if (requestSchemaId != null) req.requestSchemaId = requestSchemaId;\n if (draftProcessId != null) req.draftProcessId = draftProcessId;\n if (returnUrl) req.returnUrl = returnUrl;\n\n return req;\n }\n}\n","<!-- Client Form Template — 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 [visibleSectionKeys]=\"visibleSectionKeys()\"\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","// ============================================================================\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 =\r\n | 'Step'\r\n | 'ModuleFallback'\r\n | 'LevelFallback'\r\n | 'None';\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;\r\n levelId?: number;\r\n levelDataId?: number;\r\n moduleDataId?: number;\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;\r\n levelId?: number;\r\n levelDataId?: number;\r\n moduleDataId?: number;\r\n requestSchemaId?: number;\r\n draftProcessId?: number;\r\n returnUrl?: string;\r\n values: ProcessFormSubmitValue[];\r\n}\r\n\r\nexport interface ProcessFormSubmitValue {\r\n requestPropertyId?: number;\r\n propertyKey: string;\r\n value: any;\r\n}\r\n\r\nexport interface ProcessFormSubmitResponse {\r\n status: ProcessFormSubmitStatus;\r\n requestSchemaId: number | null;\r\n requestId: number | null;\r\n createdEntityId: number | null;\r\n message: 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 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\n\r\nexport interface ClientFormConfiguration {\r\n isActive?: boolean;\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 /** Property info — may come as `property` or `propertyMetadata` from API */\r\n property?: ClientPropertyItem;\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 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>;\r\n [key: string]: any;\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-forms 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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"}
|
|
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} from '../models/client-form.model';\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 private readonly baseUrl = 'process-forms';\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 `${this.baseUrl}/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 `${this.baseUrl}/submit`,\r\n request,\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 isFallbackForm = computed(() => {\r\n const source = this.formSource();\r\n return source === 'ModuleFallback' || source === 'LevelFallback';\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 readonly createdEntityId = computed<number | null>(\r\n () => this.submitResponse()?.createdEntityId ?? null,\r\n );\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 FormulaValidationRuleConfig,\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 SchemaConnectionFieldConfig,\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 ProcessFormSubmitValue,\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\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 */\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): DynamicFormConfig {\r\n const validationRules = mapValidationRules(config, lang);\r\n\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.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(field, lang, lookups),\r\n ),\r\n };\r\n })\r\n .filter((section) => section.fields.length > 0),\r\n validationRules,\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] = v.value;\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 mapFormValueToSubmitValues(\r\n formValue: Record<string, any>,\r\n loadResponse: ProcessFormLoadResponse,\r\n): ProcessFormSubmitValue[] {\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(([, value]) => value !== undefined && value !== null)\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 submitValue: ProcessFormSubmitValue = {\r\n propertyKey,\r\n value: normalizedValue,\r\n };\r\n\r\n if (meta?.propertyId) {\r\n submitValue.requestPropertyId = meta.propertyId;\r\n }\r\n\r\n return submitValue;\r\n })\r\n .filter((value): value is ProcessFormSubmitValue => !!value);\r\n}\r\n\r\nexport function getPreviewOnlyFieldKeys(\r\n config: ClientFormConfiguration,\r\n mode: 'create' | 'edit' = 'create',\r\n): string[] {\r\n return config.sections.flatMap((section) =>\r\n (section.fields ?? [])\r\n .filter(\r\n (field) => isFieldVisible(field, mode) && isPreviewOnlyField(field),\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): EntityData[] {\r\n const resolvedValues = mapValuesToFormValue(values, config);\r\n\r\n return config.sections\r\n .slice()\r\n .sort((a, b) => a.order - b.order)\r\n .flatMap((section) =>\r\n (section.fields ?? [])\r\n .filter(\r\n (field) => isFieldVisible(field, mode) && isPreviewOnlyField(field),\r\n )\r\n .sort((a, b) => a.order - b.order)\r\n .flatMap((field) => {\r\n const property = resolveProperty(field);\r\n if (!property) return [];\r\n\r\n return [\r\n {\r\n ...(property as EntityData),\r\n name: (property.name as any)?.display,\r\n key: property.key ?? field.propertyKey,\r\n value: resolvedValues[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 },\r\n } satisfies EntityData,\r\n ];\r\n }),\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// Internal Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Resolve the property item from either `property` or `propertyMetadata`.\r\n * The API may return the data under either key.\r\n */\r\nfunction resolveProperty(\r\n field: ClientFormField,\r\n): ClientPropertyItem | undefined {\r\n return field.property ?? field.propertyMetadata;\r\n}\r\n\r\nfunction isFieldVisible(\r\n field: ClientFormField,\r\n mode: 'create' | 'edit',\r\n): boolean {\r\n if (field.isRead === false) return false;\r\n if (mode === 'create') return !field.hiddenInCreation;\r\n return !field.hiddenInEditForm;\r\n}\r\n\r\nfunction isPreviewOnlyField(field: ClientFormField): boolean {\r\n return field.isRead === true && field.isWrite === false;\r\n}\r\n\r\nfunction resolveFieldMeta(field: ClientFormField): {\r\n property: ClientPropertyItem | undefined;\r\n propertyId?: number;\r\n viewType: string;\r\n} {\r\n const property = resolveProperty(field);\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): DynamicFieldConfig {\r\n const { property: prop, viewType } = resolveFieldMeta(field);\r\n const label = resolvePropertyName(prop, lang) || 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 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 'Currency':\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 'Percentage':\r\n return new SliderFieldConfig({ ...base, min: 0, max: 100 });\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 return new UploadFileFieldConfig(base);\r\n\r\n // ── User Search ───────────────────────────────────────────\r\n case 'User':\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 // ── 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 'LookupMatrix':\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 // ── 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\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\nfunction mapValidationRules(\r\n config: ClientFormConfiguration,\r\n lang: 'en' | 'ar',\r\n): FormulaValidationRuleConfig[] {\r\n return (config.validations ?? []).map((rule) => ({\r\n id: rule.id,\r\n formulaTokens: rule.formulaTokens,\r\n formulaText: rule.formulaText,\r\n message:\r\n rule.message?.[lang] ??\r\n rule.message?.en ??\r\n rule.message?.ar ??\r\n 'Validation rule failed',\r\n severity: rule.severity,\r\n enabled: rule.enabled,\r\n }));\r\n}\r\n\r\nfunction resolvePropertyName(\r\n property: ClientPropertyItem | undefined,\r\n lang: 'en' | 'ar',\r\n): string {\r\n if (!property?.name) return '';\r\n if (typeof property.name === 'string') return property.name;\r\n // Prefer display name, then lang-specific, then English fallback\r\n return (\r\n property.name['display'] ?? property.name[lang] ?? property.name['en'] ?? ''\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): { label: string; value: string }[] {\r\n const lookupId = prop?.configuration?.['lookup'] as number | undefined;\r\n if (!lookupId || !lookups.length) return [];\r\n\r\n const lookup = lookups.find((l) => l.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 label: item.name?.display ?? item.key,\r\n value: item.key,\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\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 default:\r\n return value;\r\n }\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 = resolveProperty(field);\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 effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n untracked,\r\n OnDestroy,\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 { Skeleton } from 'primeng/skeleton';\r\nimport { StepperModule } from 'primeng/stepper';\r\n\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 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 mapPreviewFieldsToEntities,\r\n mapToDynamicFormConfig,\r\n mapValuesToFormValue,\r\n mapFormValueToSubmitValues,\r\n} from './utils/form-config-mapper';\r\n\r\nimport type {\r\n ProcessFormLoadRequest,\r\n ProcessFormLoadResponse,\r\n ProcessFormSubmitRequest,\r\n ProcessFormSubmitResponse,\r\n ProcessFormSubmitValue,\r\n ProcessFormMode,\r\n ProcessFormSource,\r\n ProcessFormValue,\r\n ClientLookup,\r\n} from './models/client-form.model';\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 * **No action buttons in template.** Parent controls all 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 EntitiesPreview,\r\n DynamicForm,\r\n Tabs,\r\n Skeleton,\r\n StepperModule,\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 protected readonly state = inject(ClientFormStateService);\r\n\r\n private loadSub?: Subscription;\r\n private submitSub?: Subscription;\r\n readonly runtimeMessages = signal<FormulaRuntimeMessage[]>([]);\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>();\r\n readonly levelId = input<number>();\r\n readonly levelDataId = input<number>();\r\n readonly moduleDataId = input<number>();\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\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<'form' | 'steps' | 'tabs'>('form');\r\n readonly showInternalStepActions = input<boolean>(true);\r\n readonly lang = input<'en' | 'ar'>('en');\r\n readonly lookups = input<ClientLookup[]>([]);\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\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 );\r\n });\r\n\r\n readonly initialValues = computed<Record<string, any>>(() => {\r\n return mapValuesToFormValue(\r\n this.state.formValues(),\r\n this.state.formConfiguration(),\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 getPreviewOnlyFieldKeys(config, this.formMode());\r\n });\r\n readonly previewEntities = computed(() => {\r\n const config = this.state.formConfiguration();\r\n if (!config) return [];\r\n return mapPreviewFieldsToEntities(config, this.state.formValues(), this.formMode());\r\n });\r\n readonly editableFormConfig = computed<DynamicFormConfig | null>(() => {\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(() => this.editableFormConfig()?.sections ?? []);\r\n readonly hasEditableFormSections = computed(\r\n () => this.stepSections().length > 0,\r\n );\r\n readonly stepsEnabled = computed(\r\n () => this.renderMode() === 'steps' && this.stepSections().length > 1,\r\n );\r\n readonly tabsEnabled = computed(\r\n () => this.renderMode() === 'tabs' && this.stepSections().length > 1,\r\n );\r\n readonly sectionNavigationEnabled = computed(\r\n () => this.stepsEnabled() || this.tabsEnabled(),\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 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\r\n // ============================================================================\r\n // Effects\r\n // ============================================================================\r\n\r\n constructor() {\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\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.runtimeMessages.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 } 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\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 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 /**\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 getSubmitValues(): ProcessFormSubmitValue[] {\r\n const loadResponse = this.state.loadResponse();\r\n if (!loadResponse) return [];\r\n return mapFormValueToSubmitValues(this.getFormValue(), loadResponse);\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;\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.formControl.reset({});\r\n this.runtimeMessages.set([]);\r\n this.state.reset();\r\n }\r\n\r\n onRuntimeMessagesChange(messages: FormulaRuntimeMessage[]): void {\r\n this.runtimeMessages.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 this.currentStep.set(value);\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 this.stepsEnabled() && this.currentStep() > 1;\r\n }\r\n\r\n canGoToNextStep(): boolean {\r\n return (\r\n this.stepsEnabled() && this.currentStep() < this.stepSections().length\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 // ============================================================================\r\n // Lifecycle\r\n // ============================================================================\r\n\r\n ngOnDestroy(): void {\r\n this.loadSub?.unsubscribe();\r\n this.submitSub?.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 values: ProcessFormSubmitValue[] = mapFormValueToSubmitValues(\r\n formValue,\r\n loadResponse,\r\n );\r\n\r\n const req: ProcessFormSubmitRequest = {\r\n moduleKey: context?.moduleKey ?? this.moduleKey(),\r\n operationKey: context?.operationKey ?? this.operationKey(),\r\n values,\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 draftProcessId = this.draftProcessId();\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 (requestSchemaId != null) req.requestSchemaId = requestSchemaId;\r\n if (draftProcessId != null) req.draftProcessId = draftProcessId;\r\n if (returnUrl) req.returnUrl = returnUrl;\r\n\r\n return req;\r\n }\r\n}\r\n","<!-- Client Form Template — 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","// ============================================================================\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 =\r\n | 'Step'\r\n | 'ModuleFallback'\r\n | 'LevelFallback'\r\n | 'None';\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;\r\n levelId?: number;\r\n levelDataId?: number;\r\n moduleDataId?: number;\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;\r\n levelId?: number;\r\n levelDataId?: number;\r\n moduleDataId?: number;\r\n requestSchemaId?: number;\r\n draftProcessId?: number;\r\n returnUrl?: string;\r\n values: ProcessFormSubmitValue[];\r\n}\r\n\r\nexport interface ProcessFormSubmitValue {\r\n requestPropertyId?: number;\r\n propertyKey: string;\r\n value: any;\r\n}\r\n\r\nexport interface ProcessFormSubmitResponse {\r\n status: ProcessFormSubmitStatus;\r\n requestSchemaId: number | null;\r\n requestId: number | null;\r\n createdEntityId: number | null;\r\n message: 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 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\n\r\nexport interface ClientFormConfiguration {\r\n isActive?: boolean;\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 /** Property info — may come as `property` or `propertyMetadata` from API */\r\n property?: ClientPropertyItem;\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 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>;\r\n [key: string]: any;\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-forms 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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"}
|
|
@@ -99,7 +99,7 @@ class DynamicField {
|
|
|
99
99
|
});
|
|
100
100
|
}
|
|
101
101
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: DynamicField, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
102
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: DynamicField, isStandalone: true, selector: "mt-dynamic-field", inputs: { fieldConfig: { classPropertyName: "fieldConfig", publicName: "fieldConfig", isSignal: true, isRequired: true, transformFunction: null }, fieldName: { classPropertyName: "fieldName", publicName: "fieldName", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "@switch (transformedFieldConfig().type) {\r\n @case (\"text\") {\r\n <mt-text-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [placeholder]=\"transformedFieldConfig().placeholder\"\r\n [type]=\"transformedFieldConfig().inputType || 'text'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"textarea\") {\r\n <mt-textarea-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [rows]=\"transformedFieldConfig().rows || 3\"\r\n [placeholder]=\"transformedFieldConfig().placeholder\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"select\") {\r\n <mt-select-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [placeholder]=\"transformedFieldConfig().placeholder || ''\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [optionLabel]=\"transformedFieldConfig().optionLabel || 'label'\"\r\n [optionValue]=\"transformedFieldConfig().optionValue || 'value'\"\r\n [size]=\"transformedFieldConfig().size\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [filter]=\"transformedFieldConfig().filter\"\r\n [formControlName]=\"fieldName()\"\r\n [hasPlaceholderPrefix]=\"transformedFieldConfig().hasPlaceholderPrefix\"\r\n />\r\n }\r\n @case (\"date\") {\r\n <mt-date-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [placeholder]=\"transformedFieldConfig().placeholder\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n [showTime]=\"transformedFieldConfig().showTime\"\r\n />\r\n }\r\n @case (\"number\") {\r\n <mt-number-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [placeholder]=\"transformedFieldConfig().placeholder\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"slider\") {\r\n <mt-slider-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"multi-select\") {\r\n <mt-multi-select-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [placeholder]=\"transformedFieldConfig().placeholder || ''\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [optionLabel]=\"transformedFieldConfig().optionLabel || 'label'\"\r\n [optionValue]=\"transformedFieldConfig().optionValue || 'value'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [maxSelectedLabels]=\"transformedFieldConfig().maxSelectedLabels\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"pick-list\") {\r\n <mt-pick-list-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [optionLabel]=\"transformedFieldConfig().optionLabel || 'label'\"\r\n [optionValue]=\"transformedFieldConfig().optionValue || 'value'\"\r\n [sourceHeader]=\"transformedFieldConfig().sourceHeader || 'Available'\"\r\n [targetHeader]=\"transformedFieldConfig().targetHeader || 'Selected'\"\r\n [showSourceControls]=\"transformedFieldConfig().showSourceControls ?? true\"\r\n [showTargetControls]=\"transformedFieldConfig().showTargetControls ?? true\"\r\n [showSourceFilter]=\"transformedFieldConfig().showSourceFilter ?? false\"\r\n [showTargetFilter]=\"transformedFieldConfig().showTargetFilter ?? false\"\r\n [filterBy]=\"transformedFieldConfig().filterBy\"\r\n [dataKey]=\"transformedFieldConfig().dataKey\"\r\n [dragdrop]=\"transformedFieldConfig().dragdrop\"\r\n [responsive]=\"transformedFieldConfig().responsive\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"user-search\") {\r\n <mt-user-search-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [placeholder]=\"transformedFieldConfig().placeholder || ''\"\r\n [hint]=\"transformedFieldConfig().hint || ''\"\r\n [apiUrl]=\"transformedFieldConfig().apiUrl || ''\"\r\n [optionLabel]=\"transformedFieldConfig().optionLabel || 'label'\"\r\n [optionValue]=\"transformedFieldConfig().optionValue || 'value'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [context]=\"transformedFieldConfig().context\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"checkbox\") {\r\n <mt-checkbox-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"radio-button\") {\r\n <mt-radio-button-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [orientation]=\"transformedFieldConfig().orientation || 'vertical'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"radio-cards\") {\r\n <mt-radio-cards-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [size]=\"transformedFieldConfig().size || 'small'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"toggle\") {\r\n <mt-toggle-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [toggleShape]=\"transformedFieldConfig().toggleShape || 'toggle'\"\r\n [icon]=\"transformedFieldConfig().icon\"\r\n [descriptionCard]=\"transformedFieldConfig().descriptionCard\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"icon-field\") {\r\n <mt-icon-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"color-picker\") {\r\n <mt-color-picker-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n [appendTo]=\"transformedFieldConfig().appendTo\"\r\n />\r\n }\r\n @case (\"editor-field\") {\r\n <mt-editor-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"upload-file\") {\r\n <mt-upload-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [formControlName]=\"fieldName()\"\r\n [shape]=\"transformedFieldConfig().shape\"\r\n [size]=\"transformedFieldConfig().size\"\r\n [userImgClass]=\"transformedFieldConfig().userImgClass\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [endPoint]=\"transformedFieldConfig().endPoint\"\r\n [accept]=\"transformedFieldConfig().accept\"\r\n [fileSizeLimit]=\"transformedFieldConfig().fileSizeLimit\"\r\n [context]=\"transformedFieldConfig().context\"\r\n [title]=\"transformedFieldConfig().title\"\r\n [description]=\"transformedFieldConfig().description\"\r\n />\r\n }\r\n @case (\"spacer\") {\r\n <div class=\"spacer\"></div>\r\n }\r\n @case (\"schema-connection\") {\r\n <mt-schema-connection-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [placeholder]=\"transformedFieldConfig().placeholder || ''\"\r\n [configuration]=\"transformedFieldConfig().configuration\"\r\n [context]=\"transformedFieldConfig().context\"\r\n [filter]=\"transformedFieldConfig().filter ?? true\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n}\r\n", styles: [":host{display:block;width:100%}\n"], dependencies: [{ kind: "component", type: TextField, selector: "mt-text-field", inputs: ["field", "hint", "label", "placeholder", "class", "type", "readonly", "pInputs", "required", "icon", "iconPosition"] }, { kind: "component", type: TextareaField, selector: "mt-textarea-field", inputs: ["field", "label", "placeholder", "class", "readonly", "noErrorStyle", "pInputs", "rows", "required"] }, { kind: "component", type: SelectField, selector: "mt-select-field", inputs: ["field", "label", "placeholder", "hasPlaceholderPrefix", "class", "readonly", "pInputs", "options", "optionValue", "optionLabel", "filter", "filterBy", "dataKey", "showClear", "clearAfterSelect", "required", "group", "size", "optionGroupLabel", "optionGroupChildren", "loading", "optionIcon", "optionIconColor", "optionIconShape", "optionAvatarShape", "optionGroupIcon", "optionGroupIconColor", "optionGroupIconShape", "optionGroupAvatarShape"], outputs: ["onChange"] }, { kind: "component", type: DateField, selector: "mt-date-field", inputs: ["field", "label", "placeholder", "class", "readonly", "showIcon", "showClear", "showTime", "pInputs", "required"] }, { kind: "component", type: NumberField, selector: "mt-number-field", inputs: ["field", "label", "placeholder", "class", "readonly", "pInputs", "format", "maxFractionDigits", "min", "max", "required"] }, { kind: "component", type: SliderField, selector: "mt-slider-field", inputs: ["field", "label", "animate", "class", "min", "max", "step", "hideNumber", "unit", "readonly", "pInputs", "required"], outputs: ["onChange", "onSlideEnd"] }, { kind: "component", type: MultiSelectField, selector: "mt-multi-select-field", inputs: ["field", "label", "placeholder", "class", "readonly", "pInputs", "options", "optionValue", "optionLabel", "filter", "filterBy", "dataKey", "showClear", "display", "required", "maxSelectedLabels", "group", "optionGroupLabel", "optionGroupChildren", "optionIcon", "optionIconColor", "optionIconShape", "optionAvatarShape", "optionGroupIcon", "optionGroupIconColor", "optionGroupIconShape", "optionGroupAvatarShape"], outputs: ["onChange"] }, { kind: "component", type: PickListField, selector: "mt-pick-list-field", inputs: ["label", "class", "readonly", "options", "optionLabel", "optionValue", "sourceHeader", "targetHeader", "showSourceControls", "showTargetControls", "showSourceFilter", "showTargetFilter", "filterBy", "dataKey", "filterLocale", "filterMatchMode", "dragdrop", "responsive", "required"] }, { kind: "component", type: CheckboxField, selector: "mt-checkbox-field", inputs: ["label", "labelPosition", "placeholder", "readonly", "pInputs", "required"], outputs: ["onChange"] }, { kind: "component", type: ColorPickerField, selector: "mt-color-picker-field", inputs: ["label", "appendTo", "placeholder", "class", "variant", "readonly", "pInputs", "required"], outputs: ["onChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: IconField, selector: "mt-icon-field", inputs: ["label", "required"] }, { kind: "component", type: EditorField, selector: "mt-editor-field", inputs: ["label", "placeholder", "readonly", "theme", "height", "dir", "modules", "required"] }, { kind: "component", type: RadioButtonField, selector: "mt-radio-button-field", inputs: ["labelPosition", "orientation", "readonly", "pInputs", "required", "options", "size", "label"], outputs: ["onChange"] }, { kind: "component", type: RadioCardsField, selector: "mt-radio-cards-field", inputs: ["circle", "label", "required", "color", "size", "options"] }, { kind: "component", type: ToggleField, selector: "mt-toggle-field", inputs: ["label", "labelPosition", "placeholder", "readonly", "pInputs", "required", "toggleShape", "size", "icon", "descriptionCard"], outputs: ["onChange"] }, { kind: "component", type: UserSearchField, selector: "mt-user-search-field", inputs: ["hint", "label", "placeholder", "class", "readonly", "required", "apiUrl", "dataKey", "paramName", "context", "size"] }, { kind: "component", type: UploadField, selector: "mt-upload-field", inputs: ["label", "title", "description", "endPoint", "size", "userImgClass", "shape", "accept", "isDragging", "fileSizeLimit", "readonly", "context"], outputs: ["isDraggingChange", "onChange"] }, { kind: "component", type: SchemaConnectionField, selector: "mt-schema-connection-field", inputs: ["label", "placeholder", "readonly", "required", "filter", "configuration", "context"] }], viewProviders: [
|
|
102
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: DynamicField, isStandalone: true, selector: "mt-dynamic-field", inputs: { fieldConfig: { classPropertyName: "fieldConfig", publicName: "fieldConfig", isSignal: true, isRequired: true, transformFunction: null }, fieldName: { classPropertyName: "fieldName", publicName: "fieldName", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "@switch (transformedFieldConfig().type) {\r\n @case (\"text\") {\r\n <mt-text-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [placeholder]=\"transformedFieldConfig().placeholder\"\r\n [type]=\"transformedFieldConfig().inputType || 'text'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"textarea\") {\r\n <mt-textarea-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [rows]=\"transformedFieldConfig().rows || 3\"\r\n [placeholder]=\"transformedFieldConfig().placeholder\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"select\") {\r\n <mt-select-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [placeholder]=\"transformedFieldConfig().placeholder || ''\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [optionLabel]=\"transformedFieldConfig().optionLabel || 'label'\"\r\n [optionValue]=\"transformedFieldConfig().optionValue || 'value'\"\r\n [size]=\"transformedFieldConfig().size\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [filter]=\"transformedFieldConfig().filter\"\r\n [formControlName]=\"fieldName()\"\r\n [hasPlaceholderPrefix]=\"transformedFieldConfig().hasPlaceholderPrefix\"\r\n />\r\n }\r\n @case (\"date\") {\r\n <mt-date-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [placeholder]=\"transformedFieldConfig().placeholder\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n [showTime]=\"transformedFieldConfig().showTime\"\r\n />\r\n }\r\n @case (\"number\") {\r\n <mt-number-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [placeholder]=\"transformedFieldConfig().placeholder\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"slider\") {\r\n <mt-slider-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"multi-select\") {\r\n <mt-multi-select-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [placeholder]=\"transformedFieldConfig().placeholder || ''\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [optionLabel]=\"transformedFieldConfig().optionLabel || 'label'\"\r\n [optionValue]=\"transformedFieldConfig().optionValue || 'value'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [maxSelectedLabels]=\"transformedFieldConfig().maxSelectedLabels\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"pick-list\") {\r\n <mt-pick-list-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [optionLabel]=\"transformedFieldConfig().optionLabel || 'label'\"\r\n [optionValue]=\"transformedFieldConfig().optionValue || 'value'\"\r\n [sourceHeader]=\"transformedFieldConfig().sourceHeader || 'Available'\"\r\n [targetHeader]=\"transformedFieldConfig().targetHeader || 'Selected'\"\r\n [showSourceControls]=\"transformedFieldConfig().showSourceControls ?? true\"\r\n [showTargetControls]=\"transformedFieldConfig().showTargetControls ?? true\"\r\n [showSourceFilter]=\"transformedFieldConfig().showSourceFilter ?? false\"\r\n [showTargetFilter]=\"transformedFieldConfig().showTargetFilter ?? false\"\r\n [filterBy]=\"transformedFieldConfig().filterBy\"\r\n [dataKey]=\"transformedFieldConfig().dataKey\"\r\n [dragdrop]=\"transformedFieldConfig().dragdrop\"\r\n [responsive]=\"transformedFieldConfig().responsive\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"user-search\") {\r\n <mt-user-search-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [placeholder]=\"transformedFieldConfig().placeholder || ''\"\r\n [hint]=\"transformedFieldConfig().hint || ''\"\r\n [apiUrl]=\"transformedFieldConfig().apiUrl || ''\"\r\n [optionLabel]=\"transformedFieldConfig().optionLabel || 'label'\"\r\n [optionValue]=\"transformedFieldConfig().optionValue || 'value'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [context]=\"transformedFieldConfig().context\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"checkbox\") {\r\n <mt-checkbox-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"radio-button\") {\r\n <mt-radio-button-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [orientation]=\"transformedFieldConfig().orientation || 'vertical'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"radio-cards\") {\r\n <mt-radio-cards-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [size]=\"transformedFieldConfig().size || 'small'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"toggle\") {\r\n <mt-toggle-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [toggleShape]=\"transformedFieldConfig().toggleShape || 'toggle'\"\r\n [icon]=\"transformedFieldConfig().icon\"\r\n [descriptionCard]=\"transformedFieldConfig().descriptionCard\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"icon-field\") {\r\n <mt-icon-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"color-picker\") {\r\n <mt-color-picker-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n [appendTo]=\"transformedFieldConfig().appendTo\"\r\n />\r\n }\r\n @case (\"editor-field\") {\r\n <mt-editor-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"upload-file\") {\r\n <mt-upload-field\n [label]=\"transformedFieldConfig().label\"\n [formControlName]=\"fieldName()\"\n [shape]=\"transformedFieldConfig().shape\"\n [size]=\"transformedFieldConfig().size\"\n [userImgClass]=\"transformedFieldConfig().userImgClass\"\n [multiple]=\"transformedFieldConfig().multiple\"\n [readonly]=\"transformedFieldConfig().readonly!\"\n [endPoint]=\"transformedFieldConfig().endPoint\"\n [accept]=\"transformedFieldConfig().accept\"\n [fileSizeLimit]=\"transformedFieldConfig().fileSizeLimit\"\n [context]=\"transformedFieldConfig().context\"\r\n [title]=\"transformedFieldConfig().title\"\r\n [description]=\"transformedFieldConfig().description\"\r\n />\r\n }\r\n @case (\"spacer\") {\r\n <div class=\"spacer\"></div>\r\n }\r\n @case (\"schema-connection\") {\r\n <mt-schema-connection-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [placeholder]=\"transformedFieldConfig().placeholder || ''\"\r\n [configuration]=\"transformedFieldConfig().configuration\"\r\n [context]=\"transformedFieldConfig().context\"\r\n [filter]=\"transformedFieldConfig().filter ?? true\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n}\r\n", styles: [":host{display:block;width:100%}\n"], dependencies: [{ kind: "component", type: TextField, selector: "mt-text-field", inputs: ["field", "hint", "label", "placeholder", "class", "type", "readonly", "pInputs", "required", "icon", "iconPosition"] }, { kind: "component", type: TextareaField, selector: "mt-textarea-field", inputs: ["field", "label", "placeholder", "class", "readonly", "noErrorStyle", "pInputs", "rows", "required"] }, { kind: "component", type: SelectField, selector: "mt-select-field", inputs: ["field", "label", "placeholder", "hasPlaceholderPrefix", "class", "readonly", "pInputs", "options", "optionValue", "optionLabel", "filter", "filterBy", "dataKey", "showClear", "clearAfterSelect", "required", "group", "size", "optionGroupLabel", "optionGroupChildren", "loading", "optionIcon", "optionIconColor", "optionIconShape", "optionAvatarShape", "optionGroupIcon", "optionGroupIconColor", "optionGroupIconShape", "optionGroupAvatarShape"], outputs: ["onChange"] }, { kind: "component", type: DateField, selector: "mt-date-field", inputs: ["field", "label", "placeholder", "class", "readonly", "showIcon", "showClear", "showTime", "pInputs", "required"] }, { kind: "component", type: NumberField, selector: "mt-number-field", inputs: ["field", "label", "placeholder", "class", "readonly", "pInputs", "format", "maxFractionDigits", "min", "max", "required"] }, { kind: "component", type: SliderField, selector: "mt-slider-field", inputs: ["field", "label", "animate", "class", "min", "max", "step", "hideNumber", "unit", "readonly", "pInputs", "required"], outputs: ["onChange", "onSlideEnd"] }, { kind: "component", type: MultiSelectField, selector: "mt-multi-select-field", inputs: ["field", "label", "placeholder", "class", "readonly", "pInputs", "options", "optionValue", "optionLabel", "filter", "filterBy", "dataKey", "showClear", "display", "required", "maxSelectedLabels", "group", "optionGroupLabel", "optionGroupChildren", "optionIcon", "optionIconColor", "optionIconShape", "optionAvatarShape", "optionGroupIcon", "optionGroupIconColor", "optionGroupIconShape", "optionGroupAvatarShape"], outputs: ["onChange"] }, { kind: "component", type: PickListField, selector: "mt-pick-list-field", inputs: ["label", "class", "readonly", "options", "optionLabel", "optionValue", "sourceHeader", "targetHeader", "showSourceControls", "showTargetControls", "showSourceFilter", "showTargetFilter", "filterBy", "dataKey", "filterLocale", "filterMatchMode", "dragdrop", "responsive", "required"] }, { kind: "component", type: CheckboxField, selector: "mt-checkbox-field", inputs: ["label", "labelPosition", "placeholder", "readonly", "pInputs", "required"], outputs: ["onChange"] }, { kind: "component", type: ColorPickerField, selector: "mt-color-picker-field", inputs: ["label", "appendTo", "placeholder", "class", "variant", "readonly", "pInputs", "required"], outputs: ["onChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: IconField, selector: "mt-icon-field", inputs: ["label", "required"] }, { kind: "component", type: EditorField, selector: "mt-editor-field", inputs: ["label", "placeholder", "readonly", "theme", "height", "dir", "modules", "required"] }, { kind: "component", type: RadioButtonField, selector: "mt-radio-button-field", inputs: ["labelPosition", "orientation", "readonly", "pInputs", "required", "options", "size", "label"], outputs: ["onChange"] }, { kind: "component", type: RadioCardsField, selector: "mt-radio-cards-field", inputs: ["circle", "label", "required", "color", "size", "options"] }, { kind: "component", type: ToggleField, selector: "mt-toggle-field", inputs: ["label", "labelPosition", "placeholder", "readonly", "pInputs", "required", "toggleShape", "size", "icon", "descriptionCard"], outputs: ["onChange"] }, { kind: "component", type: UserSearchField, selector: "mt-user-search-field", inputs: ["hint", "label", "placeholder", "class", "readonly", "required", "apiUrl", "dataKey", "paramName", "context", "size"] }, { kind: "component", type: UploadField, selector: "mt-upload-field", inputs: ["label", "title", "description", "endPoint", "size", "userImgClass", "shape", "multiple", "accept", "isDragging", "fileSizeLimit", "readonly", "context"], outputs: ["isDraggingChange", "onChange"] }, { kind: "component", type: SchemaConnectionField, selector: "mt-schema-connection-field", inputs: ["label", "placeholder", "readonly", "required", "filter", "configuration", "context"] }], viewProviders: [
|
|
103
103
|
{ provide: ControlContainer, useExisting: FormGroupDirective },
|
|
104
104
|
], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
105
105
|
}
|
|
@@ -127,7 +127,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImpor
|
|
|
127
127
|
SchemaConnectionField,
|
|
128
128
|
], changeDetection: ChangeDetectionStrategy.OnPush, viewProviders: [
|
|
129
129
|
{ provide: ControlContainer, useExisting: FormGroupDirective },
|
|
130
|
-
], template: "@switch (transformedFieldConfig().type) {\r\n @case (\"text\") {\r\n <mt-text-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [placeholder]=\"transformedFieldConfig().placeholder\"\r\n [type]=\"transformedFieldConfig().inputType || 'text'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"textarea\") {\r\n <mt-textarea-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [rows]=\"transformedFieldConfig().rows || 3\"\r\n [placeholder]=\"transformedFieldConfig().placeholder\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"select\") {\r\n <mt-select-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [placeholder]=\"transformedFieldConfig().placeholder || ''\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [optionLabel]=\"transformedFieldConfig().optionLabel || 'label'\"\r\n [optionValue]=\"transformedFieldConfig().optionValue || 'value'\"\r\n [size]=\"transformedFieldConfig().size\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [filter]=\"transformedFieldConfig().filter\"\r\n [formControlName]=\"fieldName()\"\r\n [hasPlaceholderPrefix]=\"transformedFieldConfig().hasPlaceholderPrefix\"\r\n />\r\n }\r\n @case (\"date\") {\r\n <mt-date-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [placeholder]=\"transformedFieldConfig().placeholder\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n [showTime]=\"transformedFieldConfig().showTime\"\r\n />\r\n }\r\n @case (\"number\") {\r\n <mt-number-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [placeholder]=\"transformedFieldConfig().placeholder\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"slider\") {\r\n <mt-slider-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"multi-select\") {\r\n <mt-multi-select-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [placeholder]=\"transformedFieldConfig().placeholder || ''\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [optionLabel]=\"transformedFieldConfig().optionLabel || 'label'\"\r\n [optionValue]=\"transformedFieldConfig().optionValue || 'value'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [maxSelectedLabels]=\"transformedFieldConfig().maxSelectedLabels\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"pick-list\") {\r\n <mt-pick-list-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [optionLabel]=\"transformedFieldConfig().optionLabel || 'label'\"\r\n [optionValue]=\"transformedFieldConfig().optionValue || 'value'\"\r\n [sourceHeader]=\"transformedFieldConfig().sourceHeader || 'Available'\"\r\n [targetHeader]=\"transformedFieldConfig().targetHeader || 'Selected'\"\r\n [showSourceControls]=\"transformedFieldConfig().showSourceControls ?? true\"\r\n [showTargetControls]=\"transformedFieldConfig().showTargetControls ?? true\"\r\n [showSourceFilter]=\"transformedFieldConfig().showSourceFilter ?? false\"\r\n [showTargetFilter]=\"transformedFieldConfig().showTargetFilter ?? false\"\r\n [filterBy]=\"transformedFieldConfig().filterBy\"\r\n [dataKey]=\"transformedFieldConfig().dataKey\"\r\n [dragdrop]=\"transformedFieldConfig().dragdrop\"\r\n [responsive]=\"transformedFieldConfig().responsive\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"user-search\") {\r\n <mt-user-search-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [placeholder]=\"transformedFieldConfig().placeholder || ''\"\r\n [hint]=\"transformedFieldConfig().hint || ''\"\r\n [apiUrl]=\"transformedFieldConfig().apiUrl || ''\"\r\n [optionLabel]=\"transformedFieldConfig().optionLabel || 'label'\"\r\n [optionValue]=\"transformedFieldConfig().optionValue || 'value'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [context]=\"transformedFieldConfig().context\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"checkbox\") {\r\n <mt-checkbox-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"radio-button\") {\r\n <mt-radio-button-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [orientation]=\"transformedFieldConfig().orientation || 'vertical'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"radio-cards\") {\r\n <mt-radio-cards-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [size]=\"transformedFieldConfig().size || 'small'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"toggle\") {\r\n <mt-toggle-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [toggleShape]=\"transformedFieldConfig().toggleShape || 'toggle'\"\r\n [icon]=\"transformedFieldConfig().icon\"\r\n [descriptionCard]=\"transformedFieldConfig().descriptionCard\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"icon-field\") {\r\n <mt-icon-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"color-picker\") {\r\n <mt-color-picker-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n [appendTo]=\"transformedFieldConfig().appendTo\"\r\n />\r\n }\r\n @case (\"editor-field\") {\r\n <mt-editor-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"upload-file\") {\r\n <mt-upload-field\
|
|
130
|
+
], template: "@switch (transformedFieldConfig().type) {\r\n @case (\"text\") {\r\n <mt-text-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [placeholder]=\"transformedFieldConfig().placeholder\"\r\n [type]=\"transformedFieldConfig().inputType || 'text'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"textarea\") {\r\n <mt-textarea-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [rows]=\"transformedFieldConfig().rows || 3\"\r\n [placeholder]=\"transformedFieldConfig().placeholder\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"select\") {\r\n <mt-select-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [placeholder]=\"transformedFieldConfig().placeholder || ''\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [optionLabel]=\"transformedFieldConfig().optionLabel || 'label'\"\r\n [optionValue]=\"transformedFieldConfig().optionValue || 'value'\"\r\n [size]=\"transformedFieldConfig().size\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [filter]=\"transformedFieldConfig().filter\"\r\n [formControlName]=\"fieldName()\"\r\n [hasPlaceholderPrefix]=\"transformedFieldConfig().hasPlaceholderPrefix\"\r\n />\r\n }\r\n @case (\"date\") {\r\n <mt-date-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [placeholder]=\"transformedFieldConfig().placeholder\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n [showTime]=\"transformedFieldConfig().showTime\"\r\n />\r\n }\r\n @case (\"number\") {\r\n <mt-number-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [placeholder]=\"transformedFieldConfig().placeholder\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"slider\") {\r\n <mt-slider-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"multi-select\") {\r\n <mt-multi-select-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [placeholder]=\"transformedFieldConfig().placeholder || ''\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [optionLabel]=\"transformedFieldConfig().optionLabel || 'label'\"\r\n [optionValue]=\"transformedFieldConfig().optionValue || 'value'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [maxSelectedLabels]=\"transformedFieldConfig().maxSelectedLabels\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"pick-list\") {\r\n <mt-pick-list-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [optionLabel]=\"transformedFieldConfig().optionLabel || 'label'\"\r\n [optionValue]=\"transformedFieldConfig().optionValue || 'value'\"\r\n [sourceHeader]=\"transformedFieldConfig().sourceHeader || 'Available'\"\r\n [targetHeader]=\"transformedFieldConfig().targetHeader || 'Selected'\"\r\n [showSourceControls]=\"transformedFieldConfig().showSourceControls ?? true\"\r\n [showTargetControls]=\"transformedFieldConfig().showTargetControls ?? true\"\r\n [showSourceFilter]=\"transformedFieldConfig().showSourceFilter ?? false\"\r\n [showTargetFilter]=\"transformedFieldConfig().showTargetFilter ?? false\"\r\n [filterBy]=\"transformedFieldConfig().filterBy\"\r\n [dataKey]=\"transformedFieldConfig().dataKey\"\r\n [dragdrop]=\"transformedFieldConfig().dragdrop\"\r\n [responsive]=\"transformedFieldConfig().responsive\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"user-search\") {\r\n <mt-user-search-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [placeholder]=\"transformedFieldConfig().placeholder || ''\"\r\n [hint]=\"transformedFieldConfig().hint || ''\"\r\n [apiUrl]=\"transformedFieldConfig().apiUrl || ''\"\r\n [optionLabel]=\"transformedFieldConfig().optionLabel || 'label'\"\r\n [optionValue]=\"transformedFieldConfig().optionValue || 'value'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [context]=\"transformedFieldConfig().context\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"checkbox\") {\r\n <mt-checkbox-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"radio-button\") {\r\n <mt-radio-button-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [orientation]=\"transformedFieldConfig().orientation || 'vertical'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"radio-cards\") {\r\n <mt-radio-cards-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [size]=\"transformedFieldConfig().size || 'small'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"toggle\") {\r\n <mt-toggle-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [toggleShape]=\"transformedFieldConfig().toggleShape || 'toggle'\"\r\n [icon]=\"transformedFieldConfig().icon\"\r\n [descriptionCard]=\"transformedFieldConfig().descriptionCard\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"icon-field\") {\r\n <mt-icon-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"color-picker\") {\r\n <mt-color-picker-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n [appendTo]=\"transformedFieldConfig().appendTo\"\r\n />\r\n }\r\n @case (\"editor-field\") {\r\n <mt-editor-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"upload-file\") {\r\n <mt-upload-field\n [label]=\"transformedFieldConfig().label\"\n [formControlName]=\"fieldName()\"\n [shape]=\"transformedFieldConfig().shape\"\n [size]=\"transformedFieldConfig().size\"\n [userImgClass]=\"transformedFieldConfig().userImgClass\"\n [multiple]=\"transformedFieldConfig().multiple\"\n [readonly]=\"transformedFieldConfig().readonly!\"\n [endPoint]=\"transformedFieldConfig().endPoint\"\n [accept]=\"transformedFieldConfig().accept\"\n [fileSizeLimit]=\"transformedFieldConfig().fileSizeLimit\"\n [context]=\"transformedFieldConfig().context\"\r\n [title]=\"transformedFieldConfig().title\"\r\n [description]=\"transformedFieldConfig().description\"\r\n />\r\n }\r\n @case (\"spacer\") {\r\n <div class=\"spacer\"></div>\r\n }\r\n @case (\"schema-connection\") {\r\n <mt-schema-connection-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [placeholder]=\"transformedFieldConfig().placeholder || ''\"\r\n [configuration]=\"transformedFieldConfig().configuration\"\r\n [context]=\"transformedFieldConfig().context\"\r\n [filter]=\"transformedFieldConfig().filter ?? true\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n}\r\n", styles: [":host{display:block;width:100%}\n"] }]
|
|
131
131
|
}], ctorParameters: () => [], propDecorators: { fieldConfig: [{ type: i0.Input, args: [{ isSignal: true, alias: "fieldConfig", required: true }] }], fieldName: [{ type: i0.Input, args: [{ isSignal: true, alias: "fieldName", required: true }] }] } });
|
|
132
132
|
|
|
133
133
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-forms-dynamic-field.mjs","sources":["../../../../packages/masterteam/forms/dynamic-field/dynamic-field.ts","../../../../packages/masterteam/forms/dynamic-field/dynamic-field.html","../../../../packages/masterteam/forms/dynamic-field/masterteam-forms-dynamic-field.ts"],"sourcesContent":["import {\r\n Component,\r\n input,\r\n computed,\r\n ChangeDetectionStrategy,\r\n Signal,\r\n inject,\r\n} from '@angular/core';\r\nimport {\r\n ReactiveFormsModule,\r\n ControlContainer,\r\n FormGroupDirective,\r\n} from '@angular/forms';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { TextareaField } from '@masterteam/components/textarea-field';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { DateField } from '@masterteam/components/date-field';\r\nimport { NumberField } from '@masterteam/components/number-field';\r\nimport { SliderField } from '@masterteam/components/slider-field';\r\nimport { MultiSelectField } from '@masterteam/components/multi-select-field';\r\nimport { CheckboxField } from '@masterteam/components/checkbox-field';\r\nimport { ColorPickerField } from '@masterteam/components/color-picker-field';\r\nimport { PickListField } from '@masterteam/components/pick-list-field';\r\nimport {\r\n TextFieldConfig,\r\n TextareaFieldConfig,\r\n SelectFieldConfig,\r\n DateFieldConfig,\r\n NumberFieldConfig,\r\n SliderFieldConfig,\r\n MultiSelectFieldConfig,\r\n PickListFieldConfig,\r\n CheckboxFieldConfig,\r\n ColorPickerFieldConfig,\r\n DynamicFieldConfig,\r\n IconFieldConfig,\r\n RadioButtonFieldConfig,\r\n RadioCardsFieldConfig,\r\n ToggleFieldConfig,\r\n EditorFieldConfig,\r\n UserSearchFieldConfig,\r\n UploadFileFieldConfig,\r\n SpacerFieldConfig,\r\n SchemaConnectionFieldConfig,\r\n} from '@masterteam/components';\r\nimport { IconField } from '@masterteam/components/icon-field';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { RadioCardsField } from '@masterteam/components/radio-cards-field';\r\nimport { RadioButtonField } from '@masterteam/components/radio-button-field';\r\nimport { EditorField } from '@masterteam/components/editor-field';\r\nimport { UserSearchField } from '@masterteam/components/user-search-field';\r\nimport { UploadField } from '@masterteam/components/upload-field';\r\nimport { SchemaConnectionField } from '@masterteam/components/business-fields';\r\n\r\n@Component({\r\n selector: 'mt-dynamic-field',\r\n standalone: true,\r\n imports: [\r\n TextField,\r\n TextareaField,\r\n SelectField,\r\n DateField,\r\n NumberField,\r\n SliderField,\r\n MultiSelectField,\r\n PickListField,\r\n CheckboxField,\r\n ColorPickerField,\r\n ReactiveFormsModule,\r\n IconField,\r\n EditorField,\r\n RadioButtonField,\r\n RadioCardsField,\r\n ToggleField,\r\n UserSearchField,\r\n UploadField,\r\n SchemaConnectionField,\r\n ],\r\n templateUrl: './dynamic-field.html',\r\n styleUrls: ['./dynamic-field.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n viewProviders: [\r\n { provide: ControlContainer, useExisting: FormGroupDirective },\r\n ],\r\n})\r\nexport class DynamicField {\r\n // Input signal with transform to handle class for text type\r\n readonly fieldConfig = input.required<DynamicFieldConfig>();\r\n\r\n // Computed property for transformed field config\r\n readonly transformedFieldConfig: Signal<DynamicFieldConfig> = computed(() =>\r\n this.transformToFieldConfig(this.fieldConfig()),\r\n );\r\n\r\n // Inject ControlContainer to connect directly with parent form\r\n private controlContainer = inject(ControlContainer, { optional: true });\r\n\r\n // Input for the form control name\r\n readonly fieldName = input.required<string>();\r\n constructor() {}\r\n\r\n private transformToFieldConfig(value: any): DynamicFieldConfig {\r\n // If it's a plain object, transform it to appropriate field config\r\n if (typeof value === 'object') {\r\n if (value.type === 'text') {\r\n return new TextFieldConfig(value);\r\n }\r\n if (value.type === 'textarea') {\r\n return new TextareaFieldConfig(value);\r\n }\r\n if (value.type === 'select') {\r\n return new SelectFieldConfig(value);\r\n }\r\n if (value.type === 'date') {\r\n return new DateFieldConfig(value);\r\n }\r\n if (value.type === 'number') {\r\n return new NumberFieldConfig(value);\r\n }\r\n if (value.type === 'slider') {\r\n return new SliderFieldConfig(value);\r\n }\r\n if (value.type === 'multi-select') {\r\n return new MultiSelectFieldConfig(value);\r\n }\r\n if (value.type === 'pick-list') {\r\n return new PickListFieldConfig(value);\r\n }\r\n if (value.type === 'checkbox') {\r\n return new CheckboxFieldConfig(value);\r\n }\r\n if (value.type === 'radio-button') {\r\n return new RadioButtonFieldConfig(value);\r\n }\r\n if (value.type === 'radio-cards') {\r\n return new RadioCardsFieldConfig(value);\r\n }\r\n if (value.type === 'user-search') {\r\n return new UserSearchFieldConfig(value);\r\n }\r\n if (value.type === 'toggle') {\r\n return new ToggleFieldConfig(value);\r\n }\r\n if (value.type === 'editor-field') {\r\n return new EditorFieldConfig(value);\r\n }\r\n if (value.type === 'icon-field') {\r\n return new IconFieldConfig(value);\r\n }\r\n if (value.type === 'color-picker') {\r\n return new ColorPickerFieldConfig(value);\r\n }\r\n if (value.type === 'upload-file') {\r\n return new UploadFileFieldConfig(value);\r\n }\r\n if (value.type === 'spacer') {\r\n return new SpacerFieldConfig(value);\r\n }\r\n if (value.type === 'schema-connection') {\r\n return new SchemaConnectionFieldConfig(value);\r\n }\r\n }\r\n\r\n // Default fallback to TextFieldConfig\r\n return new TextFieldConfig({\r\n ...value,\r\n });\r\n }\r\n}\r\n","@switch (transformedFieldConfig().type) {\r\n @case (\"text\") {\r\n <mt-text-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [placeholder]=\"transformedFieldConfig().placeholder\"\r\n [type]=\"transformedFieldConfig().inputType || 'text'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"textarea\") {\r\n <mt-textarea-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [rows]=\"transformedFieldConfig().rows || 3\"\r\n [placeholder]=\"transformedFieldConfig().placeholder\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"select\") {\r\n <mt-select-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [placeholder]=\"transformedFieldConfig().placeholder || ''\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [optionLabel]=\"transformedFieldConfig().optionLabel || 'label'\"\r\n [optionValue]=\"transformedFieldConfig().optionValue || 'value'\"\r\n [size]=\"transformedFieldConfig().size\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [filter]=\"transformedFieldConfig().filter\"\r\n [formControlName]=\"fieldName()\"\r\n [hasPlaceholderPrefix]=\"transformedFieldConfig().hasPlaceholderPrefix\"\r\n />\r\n }\r\n @case (\"date\") {\r\n <mt-date-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [placeholder]=\"transformedFieldConfig().placeholder\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n [showTime]=\"transformedFieldConfig().showTime\"\r\n />\r\n }\r\n @case (\"number\") {\r\n <mt-number-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [placeholder]=\"transformedFieldConfig().placeholder\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"slider\") {\r\n <mt-slider-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"multi-select\") {\r\n <mt-multi-select-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [placeholder]=\"transformedFieldConfig().placeholder || ''\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [optionLabel]=\"transformedFieldConfig().optionLabel || 'label'\"\r\n [optionValue]=\"transformedFieldConfig().optionValue || 'value'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [maxSelectedLabels]=\"transformedFieldConfig().maxSelectedLabels\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"pick-list\") {\r\n <mt-pick-list-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [optionLabel]=\"transformedFieldConfig().optionLabel || 'label'\"\r\n [optionValue]=\"transformedFieldConfig().optionValue || 'value'\"\r\n [sourceHeader]=\"transformedFieldConfig().sourceHeader || 'Available'\"\r\n [targetHeader]=\"transformedFieldConfig().targetHeader || 'Selected'\"\r\n [showSourceControls]=\"transformedFieldConfig().showSourceControls ?? true\"\r\n [showTargetControls]=\"transformedFieldConfig().showTargetControls ?? true\"\r\n [showSourceFilter]=\"transformedFieldConfig().showSourceFilter ?? false\"\r\n [showTargetFilter]=\"transformedFieldConfig().showTargetFilter ?? false\"\r\n [filterBy]=\"transformedFieldConfig().filterBy\"\r\n [dataKey]=\"transformedFieldConfig().dataKey\"\r\n [dragdrop]=\"transformedFieldConfig().dragdrop\"\r\n [responsive]=\"transformedFieldConfig().responsive\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"user-search\") {\r\n <mt-user-search-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [placeholder]=\"transformedFieldConfig().placeholder || ''\"\r\n [hint]=\"transformedFieldConfig().hint || ''\"\r\n [apiUrl]=\"transformedFieldConfig().apiUrl || ''\"\r\n [optionLabel]=\"transformedFieldConfig().optionLabel || 'label'\"\r\n [optionValue]=\"transformedFieldConfig().optionValue || 'value'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [context]=\"transformedFieldConfig().context\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"checkbox\") {\r\n <mt-checkbox-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"radio-button\") {\r\n <mt-radio-button-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [orientation]=\"transformedFieldConfig().orientation || 'vertical'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"radio-cards\") {\r\n <mt-radio-cards-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [size]=\"transformedFieldConfig().size || 'small'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"toggle\") {\r\n <mt-toggle-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [toggleShape]=\"transformedFieldConfig().toggleShape || 'toggle'\"\r\n [icon]=\"transformedFieldConfig().icon\"\r\n [descriptionCard]=\"transformedFieldConfig().descriptionCard\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"icon-field\") {\r\n <mt-icon-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"color-picker\") {\r\n <mt-color-picker-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n [appendTo]=\"transformedFieldConfig().appendTo\"\r\n />\r\n }\r\n @case (\"editor-field\") {\r\n <mt-editor-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"upload-file\") {\r\n <mt-upload-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [formControlName]=\"fieldName()\"\r\n [shape]=\"transformedFieldConfig().shape\"\r\n [size]=\"transformedFieldConfig().size\"\r\n [userImgClass]=\"transformedFieldConfig().userImgClass\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [endPoint]=\"transformedFieldConfig().endPoint\"\r\n [accept]=\"transformedFieldConfig().accept\"\r\n [fileSizeLimit]=\"transformedFieldConfig().fileSizeLimit\"\r\n [context]=\"transformedFieldConfig().context\"\r\n [title]=\"transformedFieldConfig().title\"\r\n [description]=\"transformedFieldConfig().description\"\r\n />\r\n }\r\n @case (\"spacer\") {\r\n <div class=\"spacer\"></div>\r\n }\r\n @case (\"schema-connection\") {\r\n <mt-schema-connection-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [placeholder]=\"transformedFieldConfig().placeholder || ''\"\r\n [configuration]=\"transformedFieldConfig().configuration\"\r\n [context]=\"transformedFieldConfig().context\"\r\n [filter]=\"transformedFieldConfig().filter ?? true\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"masterteam-forms-dynamic-field.mjs","sources":["../../../../packages/masterteam/forms/dynamic-field/dynamic-field.ts","../../../../packages/masterteam/forms/dynamic-field/dynamic-field.html","../../../../packages/masterteam/forms/dynamic-field/masterteam-forms-dynamic-field.ts"],"sourcesContent":["import {\r\n Component,\r\n input,\r\n computed,\r\n ChangeDetectionStrategy,\r\n Signal,\r\n inject,\r\n} from '@angular/core';\r\nimport {\r\n ReactiveFormsModule,\r\n ControlContainer,\r\n FormGroupDirective,\r\n} from '@angular/forms';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { TextareaField } from '@masterteam/components/textarea-field';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { DateField } from '@masterteam/components/date-field';\r\nimport { NumberField } from '@masterteam/components/number-field';\r\nimport { SliderField } from '@masterteam/components/slider-field';\r\nimport { MultiSelectField } from '@masterteam/components/multi-select-field';\r\nimport { CheckboxField } from '@masterteam/components/checkbox-field';\r\nimport { ColorPickerField } from '@masterteam/components/color-picker-field';\r\nimport { PickListField } from '@masterteam/components/pick-list-field';\r\nimport {\r\n TextFieldConfig,\r\n TextareaFieldConfig,\r\n SelectFieldConfig,\r\n DateFieldConfig,\r\n NumberFieldConfig,\r\n SliderFieldConfig,\r\n MultiSelectFieldConfig,\r\n PickListFieldConfig,\r\n CheckboxFieldConfig,\r\n ColorPickerFieldConfig,\r\n DynamicFieldConfig,\r\n IconFieldConfig,\r\n RadioButtonFieldConfig,\r\n RadioCardsFieldConfig,\r\n ToggleFieldConfig,\r\n EditorFieldConfig,\r\n UserSearchFieldConfig,\r\n UploadFileFieldConfig,\r\n SpacerFieldConfig,\r\n SchemaConnectionFieldConfig,\r\n} from '@masterteam/components';\r\nimport { IconField } from '@masterteam/components/icon-field';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { RadioCardsField } from '@masterteam/components/radio-cards-field';\r\nimport { RadioButtonField } from '@masterteam/components/radio-button-field';\r\nimport { EditorField } from '@masterteam/components/editor-field';\r\nimport { UserSearchField } from '@masterteam/components/user-search-field';\r\nimport { UploadField } from '@masterteam/components/upload-field';\r\nimport { SchemaConnectionField } from '@masterteam/components/business-fields';\r\n\r\n@Component({\r\n selector: 'mt-dynamic-field',\r\n standalone: true,\r\n imports: [\r\n TextField,\r\n TextareaField,\r\n SelectField,\r\n DateField,\r\n NumberField,\r\n SliderField,\r\n MultiSelectField,\r\n PickListField,\r\n CheckboxField,\r\n ColorPickerField,\r\n ReactiveFormsModule,\r\n IconField,\r\n EditorField,\r\n RadioButtonField,\r\n RadioCardsField,\r\n ToggleField,\r\n UserSearchField,\r\n UploadField,\r\n SchemaConnectionField,\r\n ],\r\n templateUrl: './dynamic-field.html',\r\n styleUrls: ['./dynamic-field.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n viewProviders: [\r\n { provide: ControlContainer, useExisting: FormGroupDirective },\r\n ],\r\n})\r\nexport class DynamicField {\r\n // Input signal with transform to handle class for text type\r\n readonly fieldConfig = input.required<DynamicFieldConfig>();\r\n\r\n // Computed property for transformed field config\r\n readonly transformedFieldConfig: Signal<DynamicFieldConfig> = computed(() =>\r\n this.transformToFieldConfig(this.fieldConfig()),\r\n );\r\n\r\n // Inject ControlContainer to connect directly with parent form\r\n private controlContainer = inject(ControlContainer, { optional: true });\r\n\r\n // Input for the form control name\r\n readonly fieldName = input.required<string>();\r\n constructor() {}\r\n\r\n private transformToFieldConfig(value: any): DynamicFieldConfig {\r\n // If it's a plain object, transform it to appropriate field config\r\n if (typeof value === 'object') {\r\n if (value.type === 'text') {\r\n return new TextFieldConfig(value);\r\n }\r\n if (value.type === 'textarea') {\r\n return new TextareaFieldConfig(value);\r\n }\r\n if (value.type === 'select') {\r\n return new SelectFieldConfig(value);\r\n }\r\n if (value.type === 'date') {\r\n return new DateFieldConfig(value);\r\n }\r\n if (value.type === 'number') {\r\n return new NumberFieldConfig(value);\r\n }\r\n if (value.type === 'slider') {\r\n return new SliderFieldConfig(value);\r\n }\r\n if (value.type === 'multi-select') {\r\n return new MultiSelectFieldConfig(value);\r\n }\r\n if (value.type === 'pick-list') {\r\n return new PickListFieldConfig(value);\r\n }\r\n if (value.type === 'checkbox') {\r\n return new CheckboxFieldConfig(value);\r\n }\r\n if (value.type === 'radio-button') {\r\n return new RadioButtonFieldConfig(value);\r\n }\r\n if (value.type === 'radio-cards') {\r\n return new RadioCardsFieldConfig(value);\r\n }\r\n if (value.type === 'user-search') {\r\n return new UserSearchFieldConfig(value);\r\n }\r\n if (value.type === 'toggle') {\r\n return new ToggleFieldConfig(value);\r\n }\r\n if (value.type === 'editor-field') {\r\n return new EditorFieldConfig(value);\r\n }\r\n if (value.type === 'icon-field') {\r\n return new IconFieldConfig(value);\r\n }\r\n if (value.type === 'color-picker') {\r\n return new ColorPickerFieldConfig(value);\r\n }\r\n if (value.type === 'upload-file') {\r\n return new UploadFileFieldConfig(value);\r\n }\r\n if (value.type === 'spacer') {\r\n return new SpacerFieldConfig(value);\r\n }\r\n if (value.type === 'schema-connection') {\r\n return new SchemaConnectionFieldConfig(value);\r\n }\r\n }\r\n\r\n // Default fallback to TextFieldConfig\r\n return new TextFieldConfig({\r\n ...value,\r\n });\r\n }\r\n}\r\n","@switch (transformedFieldConfig().type) {\r\n @case (\"text\") {\r\n <mt-text-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [placeholder]=\"transformedFieldConfig().placeholder\"\r\n [type]=\"transformedFieldConfig().inputType || 'text'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"textarea\") {\r\n <mt-textarea-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [rows]=\"transformedFieldConfig().rows || 3\"\r\n [placeholder]=\"transformedFieldConfig().placeholder\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"select\") {\r\n <mt-select-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [placeholder]=\"transformedFieldConfig().placeholder || ''\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [optionLabel]=\"transformedFieldConfig().optionLabel || 'label'\"\r\n [optionValue]=\"transformedFieldConfig().optionValue || 'value'\"\r\n [size]=\"transformedFieldConfig().size\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [filter]=\"transformedFieldConfig().filter\"\r\n [formControlName]=\"fieldName()\"\r\n [hasPlaceholderPrefix]=\"transformedFieldConfig().hasPlaceholderPrefix\"\r\n />\r\n }\r\n @case (\"date\") {\r\n <mt-date-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [placeholder]=\"transformedFieldConfig().placeholder\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n [showTime]=\"transformedFieldConfig().showTime\"\r\n />\r\n }\r\n @case (\"number\") {\r\n <mt-number-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [placeholder]=\"transformedFieldConfig().placeholder\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"slider\") {\r\n <mt-slider-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"multi-select\") {\r\n <mt-multi-select-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [placeholder]=\"transformedFieldConfig().placeholder || ''\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [optionLabel]=\"transformedFieldConfig().optionLabel || 'label'\"\r\n [optionValue]=\"transformedFieldConfig().optionValue || 'value'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [maxSelectedLabels]=\"transformedFieldConfig().maxSelectedLabels\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"pick-list\") {\r\n <mt-pick-list-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [optionLabel]=\"transformedFieldConfig().optionLabel || 'label'\"\r\n [optionValue]=\"transformedFieldConfig().optionValue || 'value'\"\r\n [sourceHeader]=\"transformedFieldConfig().sourceHeader || 'Available'\"\r\n [targetHeader]=\"transformedFieldConfig().targetHeader || 'Selected'\"\r\n [showSourceControls]=\"transformedFieldConfig().showSourceControls ?? true\"\r\n [showTargetControls]=\"transformedFieldConfig().showTargetControls ?? true\"\r\n [showSourceFilter]=\"transformedFieldConfig().showSourceFilter ?? false\"\r\n [showTargetFilter]=\"transformedFieldConfig().showTargetFilter ?? false\"\r\n [filterBy]=\"transformedFieldConfig().filterBy\"\r\n [dataKey]=\"transformedFieldConfig().dataKey\"\r\n [dragdrop]=\"transformedFieldConfig().dragdrop\"\r\n [responsive]=\"transformedFieldConfig().responsive\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"user-search\") {\r\n <mt-user-search-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [placeholder]=\"transformedFieldConfig().placeholder || ''\"\r\n [hint]=\"transformedFieldConfig().hint || ''\"\r\n [apiUrl]=\"transformedFieldConfig().apiUrl || ''\"\r\n [optionLabel]=\"transformedFieldConfig().optionLabel || 'label'\"\r\n [optionValue]=\"transformedFieldConfig().optionValue || 'value'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [context]=\"transformedFieldConfig().context\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"checkbox\") {\r\n <mt-checkbox-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"radio-button\") {\r\n <mt-radio-button-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [orientation]=\"transformedFieldConfig().orientation || 'vertical'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"radio-cards\") {\r\n <mt-radio-cards-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [options]=\"transformedFieldConfig().options || []\"\r\n [size]=\"transformedFieldConfig().size || 'small'\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"toggle\") {\r\n <mt-toggle-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [toggleShape]=\"transformedFieldConfig().toggleShape || 'toggle'\"\r\n [icon]=\"transformedFieldConfig().icon\"\r\n [descriptionCard]=\"transformedFieldConfig().descriptionCard\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"icon-field\") {\r\n <mt-icon-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"color-picker\") {\r\n <mt-color-picker-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n [appendTo]=\"transformedFieldConfig().appendTo\"\r\n />\r\n }\r\n @case (\"editor-field\") {\r\n <mt-editor-field\r\n [label]=\"transformedFieldConfig().label\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n @case (\"upload-file\") {\r\n <mt-upload-field\n [label]=\"transformedFieldConfig().label\"\n [formControlName]=\"fieldName()\"\n [shape]=\"transformedFieldConfig().shape\"\n [size]=\"transformedFieldConfig().size\"\n [userImgClass]=\"transformedFieldConfig().userImgClass\"\n [multiple]=\"transformedFieldConfig().multiple\"\n [readonly]=\"transformedFieldConfig().readonly!\"\n [endPoint]=\"transformedFieldConfig().endPoint\"\n [accept]=\"transformedFieldConfig().accept\"\n [fileSizeLimit]=\"transformedFieldConfig().fileSizeLimit\"\n [context]=\"transformedFieldConfig().context\"\r\n [title]=\"transformedFieldConfig().title\"\r\n [description]=\"transformedFieldConfig().description\"\r\n />\r\n }\r\n @case (\"spacer\") {\r\n <div class=\"spacer\"></div>\r\n }\r\n @case (\"schema-connection\") {\r\n <mt-schema-connection-field\r\n [label]=\"transformedFieldConfig().label || ''\"\r\n [placeholder]=\"transformedFieldConfig().placeholder || ''\"\r\n [configuration]=\"transformedFieldConfig().configuration\"\r\n [context]=\"transformedFieldConfig().context\"\r\n [filter]=\"transformedFieldConfig().filter ?? true\"\r\n [readonly]=\"transformedFieldConfig().readonly!\"\r\n [formControlName]=\"fieldName()\"\r\n />\r\n }\r\n}\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.
|
|
3
|
+
"version": "0.0.46",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"directory": "../../../dist/masterteam/forms",
|
|
6
6
|
"linkDirectory": true,
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"primeng": "21.0.1",
|
|
18
18
|
"@primeuix/themes": "^2.0.2",
|
|
19
19
|
"rxjs": "^7.8.2",
|
|
20
|
-
"@masterteam/components": "^0.0.
|
|
20
|
+
"@masterteam/components": "^0.0.99"
|
|
21
21
|
},
|
|
22
22
|
"sideEffects": false,
|
|
23
23
|
"exports": {
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import * as _masterteam_components from '@masterteam/components';
|
|
2
2
|
import { FormulaRuntimeMessage, DynamicFormConfig } from '@masterteam/components';
|
|
3
|
+
import * as _masterteam_components_entities from '@masterteam/components/entities';
|
|
4
|
+
import { EntityData } from '@masterteam/components/entities';
|
|
3
5
|
import * as _angular_core from '@angular/core';
|
|
4
6
|
import { OnDestroy } from '@angular/core';
|
|
5
7
|
import { FormControl } from '@angular/forms';
|
|
@@ -303,7 +305,11 @@ declare class ClientForm implements OnDestroy {
|
|
|
303
305
|
readonly initialValues: _angular_core.Signal<Record<string, any>>;
|
|
304
306
|
readonly virtualFields: _angular_core.Signal<ProcessFormValue[]>;
|
|
305
307
|
readonly hasVirtualFields: _angular_core.Signal<boolean>;
|
|
308
|
+
readonly previewFieldKeys: _angular_core.Signal<string[]>;
|
|
309
|
+
readonly previewEntities: _angular_core.Signal<_masterteam_components_entities.EntityData[]>;
|
|
310
|
+
readonly editableFormConfig: _angular_core.Signal<DynamicFormConfig | null>;
|
|
306
311
|
readonly stepSections: _angular_core.Signal<_masterteam_components.SectionConfig[]>;
|
|
312
|
+
readonly hasEditableFormSections: _angular_core.Signal<boolean>;
|
|
307
313
|
readonly stepsEnabled: _angular_core.Signal<boolean>;
|
|
308
314
|
readonly tabsEnabled: _angular_core.Signal<boolean>;
|
|
309
315
|
readonly sectionNavigationEnabled: _angular_core.Signal<boolean>;
|
|
@@ -399,6 +405,8 @@ declare function mapValuesToFormValue(values: ProcessFormValue[], config?: Clien
|
|
|
399
405
|
* to map `requestPropertyId` and `viewType`.
|
|
400
406
|
*/
|
|
401
407
|
declare function mapFormValueToSubmitValues(formValue: Record<string, any>, loadResponse: ProcessFormLoadResponse): ProcessFormSubmitValue[];
|
|
408
|
+
declare function getPreviewOnlyFieldKeys(config: ClientFormConfiguration, mode?: 'create' | 'edit'): string[];
|
|
409
|
+
declare function mapPreviewFieldsToEntities(config: ClientFormConfiguration, values: ProcessFormValue[], mode?: 'create' | 'edit'): EntityData[];
|
|
402
410
|
|
|
403
|
-
export { ClientForm, ClientFormApiService, ClientFormStateService, isFormRequiredInterception, mapFormValueToSubmitValues, mapToDynamicFormConfig, mapValuesToFormValue };
|
|
411
|
+
export { ClientForm, ClientFormApiService, ClientFormStateService, getPreviewOnlyFieldKeys, isFormRequiredInterception, mapFormValueToSubmitValues, mapPreviewFieldsToEntities, mapToDynamicFormConfig, mapValuesToFormValue };
|
|
404
412
|
export type { ClientFieldWidth, ClientFormConfiguration, ClientFormField, ClientFormSection, ClientLookup, ClientLookupItem, ClientPropertyItem, ClientValidationRule, FormRequiredInterception, OperationType, ProcessFormContext, ProcessFormLoadRequest, ProcessFormLoadResponse, ProcessFormMode, ProcessFormSource, ProcessFormSubmitRequest, ProcessFormSubmitResponse, ProcessFormSubmitStatus, ProcessFormSubmitValue, ProcessFormValue, ProcessFormValueMetadata, Response };
|