@masterteam/forms 0.0.39 → 0.0.40
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/assets/forms.css +1 -1
- package/fesm2022/masterteam-forms-client-form.mjs +172 -6
- package/fesm2022/masterteam-forms-client-form.mjs.map +1 -1
- package/fesm2022/masterteam-forms-dynamic-form.mjs +28 -48
- package/fesm2022/masterteam-forms-dynamic-form.mjs.map +1 -1
- package/package.json +2 -2
- package/types/masterteam-forms-client-form.d.ts +23 -2
- package/types/masterteam-forms-dynamic-form.d.ts +3 -1
package/assets/forms.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */
|
|
2
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-600:oklch(57.7% .245 27.325);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-gray-200:oklch(92.8% .006 264.531);--spacing:.25rem;--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-semibold:600;--radius-lg:.5rem;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.\@container{container-type:inline-size}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.col-span-6{grid-column:span 6/span 6}.col-span-12{grid-column:span 12/span 12}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.flex{display:flex}.grid{display:grid}.hidden{display:none}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.list-disc{list-style-type:disc}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing) * 1)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}.rounded-lg{border-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-gray-200{border-color:var(--color-gray-200)}.border-surface-200{border-color:var(--p-surface-200)}@supports (color:color-mix(in lab, red, red)){.border-surface-200{border-color:color-mix(in srgb, var(--p-surface-200) calc(100% * 1), transparent)}}.bg-surface-50{background-color:var(--p-surface-50)}@supports (color:color-mix(in lab, red, red)){.bg-surface-50{background-color:color-mix(in srgb, var(--p-surface-50) calc(100% * 1), transparent)}}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.ps-5{padding-inline-start:calc(var(--spacing) * 5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.text-amber-600{color:var(--color-amber-600)}.text-amber-700{color:var(--color-amber-700)}.text-color{color:var(--p-text-color)}.text-muted-color{color:var(--p-text-muted-color)}.text-red-600{color:var(--color-red-600)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}}@keyframes enter{0%{opacity:var(--p-enter-opacity,1);transform:translate3d(var(--p-enter-translate-x,0), var(--p-enter-translate-y,0), 0) scale3d(var(--p-enter-scale,1), var(--p-enter-scale,1), var(--p-enter-scale,1)) rotate(var(--p-enter-rotate,0))}}@keyframes leave{to{opacity:var(--p-leave-opacity,1);transform:translate3d(var(--p-leave-translate-x,0), var(--p-leave-translate-y,0), 0) scale3d(var(--p-leave-scale,1), var(--p-leave-scale,1), var(--p-leave-scale,1)) rotate(var(--p-leave-rotate,0))}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-600:oklch(57.7% .245 27.325);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-gray-200:oklch(92.8% .006 264.531);--spacing:.25rem;--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-semibold:600;--radius-lg:.5rem;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.\@container{container-type:inline-size}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.col-span-6{grid-column:span 6/span 6}.col-span-12{grid-column:span 12/span 12}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.flex{display:flex}.grid{display:grid}.hidden{display:none}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.list-disc{list-style-type:disc}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing) * 1)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}.rounded{border-radius:.25rem}.rounded-lg{border-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-gray-200{border-color:var(--color-gray-200)}.border-surface-200{border-color:var(--p-surface-200)}@supports (color:color-mix(in lab, red, red)){.border-surface-200{border-color:color-mix(in srgb, var(--p-surface-200) calc(100% * 1), transparent)}}.border-surface-300{border-color:var(--p-surface-300)}@supports (color:color-mix(in lab, red, red)){.border-surface-300{border-color:color-mix(in srgb, var(--p-surface-300) calc(100% * 1), transparent)}}.bg-surface-50{background-color:var(--p-surface-50)}@supports (color:color-mix(in lab, red, red)){.bg-surface-50{background-color:color-mix(in srgb, var(--p-surface-50) calc(100% * 1), transparent)}}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-3{padding-inline:calc(var(--spacing) * 3)}.py-2{padding-block:calc(var(--spacing) * 2)}.ps-5{padding-inline-start:calc(var(--spacing) * 5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.text-amber-600{color:var(--color-amber-600)}.text-amber-700{color:var(--color-amber-700)}.text-color{color:var(--p-text-color)}.text-muted-color{color:var(--p-text-muted-color)}.text-red-600{color:var(--color-red-600)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}}@keyframes enter{0%{opacity:var(--p-enter-opacity,1);transform:translate3d(var(--p-enter-translate-x,0), var(--p-enter-translate-y,0), 0) scale3d(var(--p-enter-scale,1), var(--p-enter-scale,1), var(--p-enter-scale,1)) rotate(var(--p-enter-rotate,0))}}@keyframes leave{to{opacity:var(--p-leave-opacity,1);transform:translate3d(var(--p-leave-translate-x,0), var(--p-leave-translate-y,0), 0) scale3d(var(--p-leave-scale,1), var(--p-leave-scale,1), var(--p-leave-scale,1)) rotate(var(--p-leave-rotate,0))}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}
|
|
@@ -4,6 +4,8 @@ import * as i1 from '@angular/forms';
|
|
|
4
4
|
import { FormControl, ReactiveFormsModule } from '@angular/forms';
|
|
5
5
|
import { CommonModule } from '@angular/common';
|
|
6
6
|
import { Skeleton } from 'primeng/skeleton';
|
|
7
|
+
import * as i2 from 'primeng/stepper';
|
|
8
|
+
import { StepperModule } from 'primeng/stepper';
|
|
7
9
|
import { DynamicForm } from '@masterteam/forms/dynamic-form';
|
|
8
10
|
import { HttpClient, HttpContext } from '@angular/common/http';
|
|
9
11
|
import { ValidatorConfig, TextFieldConfig, SchemaConnectionFieldConfig, SelectFieldConfig, MultiSelectFieldConfig, UserSearchFieldConfig, REQUEST_CONTEXT, UploadFileFieldConfig, ToggleFieldConfig, DateFieldConfig, SliderFieldConfig, NumberFieldConfig, EditorFieldConfig } from '@masterteam/components';
|
|
@@ -203,6 +205,7 @@ function mapFormValueToSubmitValues(formValue, loadResponse) {
|
|
|
203
205
|
if (v.metadata) {
|
|
204
206
|
metadataByKey.set(v.propertyKey, {
|
|
205
207
|
propertyId: v.metadata.propertyId,
|
|
208
|
+
viewType: v.metadata.viewType,
|
|
206
209
|
});
|
|
207
210
|
}
|
|
208
211
|
}
|
|
@@ -210,12 +213,20 @@ function mapFormValueToSubmitValues(formValue, loadResponse) {
|
|
|
210
213
|
.filter(([, value]) => value !== undefined && value !== null)
|
|
211
214
|
.map(([propertyKey, value]) => {
|
|
212
215
|
const meta = metadataByKey.get(propertyKey);
|
|
213
|
-
const
|
|
216
|
+
const normalizedValue = normalizeSubmitValue(value, meta?.viewType);
|
|
217
|
+
if (normalizedValue === undefined || normalizedValue === null) {
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
const submitValue = {
|
|
221
|
+
propertyKey,
|
|
222
|
+
value: normalizedValue,
|
|
223
|
+
};
|
|
214
224
|
if (meta?.propertyId) {
|
|
215
225
|
submitValue.requestPropertyId = meta.propertyId;
|
|
216
226
|
}
|
|
217
227
|
return submitValue;
|
|
218
|
-
})
|
|
228
|
+
})
|
|
229
|
+
.filter((value) => !!value);
|
|
219
230
|
}
|
|
220
231
|
// ============================================================================
|
|
221
232
|
// Internal Helpers
|
|
@@ -408,6 +419,35 @@ function extractOptionsFromProperty(property) {
|
|
|
408
419
|
}
|
|
409
420
|
return null;
|
|
410
421
|
}
|
|
422
|
+
function normalizeSubmitValue(value, viewType) {
|
|
423
|
+
if (viewType !== 'User') {
|
|
424
|
+
return value;
|
|
425
|
+
}
|
|
426
|
+
if (Array.isArray(value)) {
|
|
427
|
+
return value
|
|
428
|
+
.map((item) => extractUserId(item))
|
|
429
|
+
.filter((id) => id !== null)
|
|
430
|
+
.map((id) => String(id));
|
|
431
|
+
}
|
|
432
|
+
const userId = extractUserId(value);
|
|
433
|
+
if (userId === null)
|
|
434
|
+
return value;
|
|
435
|
+
return String(userId);
|
|
436
|
+
}
|
|
437
|
+
function extractUserId(value) {
|
|
438
|
+
if (value === null || value === undefined)
|
|
439
|
+
return null;
|
|
440
|
+
if (typeof value === 'string' || typeof value === 'number') {
|
|
441
|
+
return value;
|
|
442
|
+
}
|
|
443
|
+
if (typeof value !== 'object')
|
|
444
|
+
return null;
|
|
445
|
+
const userId = value['userId'] ?? value['id'] ?? value['value'];
|
|
446
|
+
if (typeof userId === 'string' || typeof userId === 'number') {
|
|
447
|
+
return userId;
|
|
448
|
+
}
|
|
449
|
+
return null;
|
|
450
|
+
}
|
|
411
451
|
|
|
412
452
|
/**
|
|
413
453
|
* Client Form — Runtime process form component.
|
|
@@ -448,6 +488,7 @@ class ClientForm {
|
|
|
448
488
|
loading = computed(() => this.state.loading(), ...(ngDevMode ? [{ debugName: "loading" }] : []));
|
|
449
489
|
runtimeErrors = computed(() => this.runtimeMessages().filter((msg) => msg.severity === 'error'), ...(ngDevMode ? [{ debugName: "runtimeErrors" }] : []));
|
|
450
490
|
runtimeWarnings = computed(() => this.runtimeMessages().filter((msg) => msg.severity === 'warning'), ...(ngDevMode ? [{ debugName: "runtimeWarnings" }] : []));
|
|
491
|
+
currentStep = signal(1, ...(ngDevMode ? [{ debugName: "currentStep" }] : []));
|
|
451
492
|
// ============================================================================
|
|
452
493
|
// Inputs — Required Context
|
|
453
494
|
// ============================================================================
|
|
@@ -470,6 +511,8 @@ class ClientForm {
|
|
|
470
511
|
readonly = input(false, ...(ngDevMode ? [{ debugName: "readonly" }] : []));
|
|
471
512
|
autoLoad = input(true, ...(ngDevMode ? [{ debugName: "autoLoad" }] : []));
|
|
472
513
|
formMode = input('create', ...(ngDevMode ? [{ debugName: "formMode" }] : []));
|
|
514
|
+
renderMode = input('form', ...(ngDevMode ? [{ debugName: "renderMode" }] : []));
|
|
515
|
+
showInternalStepActions = input(true, ...(ngDevMode ? [{ debugName: "showInternalStepActions" }] : []));
|
|
473
516
|
lang = input('en', ...(ngDevMode ? [{ debugName: "lang" }] : []));
|
|
474
517
|
lookups = input([], ...(ngDevMode ? [{ debugName: "lookups" }] : []));
|
|
475
518
|
// ============================================================================
|
|
@@ -498,6 +541,21 @@ class ClientForm {
|
|
|
498
541
|
}, ...(ngDevMode ? [{ debugName: "initialValues" }] : []));
|
|
499
542
|
virtualFields = computed(() => this.state.virtualFields(), ...(ngDevMode ? [{ debugName: "virtualFields" }] : []));
|
|
500
543
|
hasVirtualFields = computed(() => this.virtualFields().length > 0, ...(ngDevMode ? [{ debugName: "hasVirtualFields" }] : []));
|
|
544
|
+
stepSections = computed(() => this.formConfig()?.sections ?? [], ...(ngDevMode ? [{ debugName: "stepSections" }] : []));
|
|
545
|
+
stepsEnabled = computed(() => this.renderMode() === 'steps' && this.stepSections().length > 1, ...(ngDevMode ? [{ debugName: "stepsEnabled" }] : []));
|
|
546
|
+
forcedHiddenFieldKeys = computed(() => {
|
|
547
|
+
if (!this.stepsEnabled())
|
|
548
|
+
return [];
|
|
549
|
+
const sections = this.stepSections();
|
|
550
|
+
const currentIndex = this.currentStep() - 1;
|
|
551
|
+
return sections.flatMap((section, index) => {
|
|
552
|
+
if (index === currentIndex)
|
|
553
|
+
return [];
|
|
554
|
+
return section.fields
|
|
555
|
+
.map((field) => field.key)
|
|
556
|
+
.filter((key) => !!key);
|
|
557
|
+
});
|
|
558
|
+
}, ...(ngDevMode ? [{ debugName: "forcedHiddenFieldKeys" }] : []));
|
|
501
559
|
// ============================================================================
|
|
502
560
|
// Effects
|
|
503
561
|
// ============================================================================
|
|
@@ -521,6 +579,18 @@ class ClientForm {
|
|
|
521
579
|
});
|
|
522
580
|
}
|
|
523
581
|
});
|
|
582
|
+
effect(() => {
|
|
583
|
+
const count = this.stepSections().length;
|
|
584
|
+
const current = this.currentStep();
|
|
585
|
+
if (count === 0) {
|
|
586
|
+
if (current !== 1)
|
|
587
|
+
this.currentStep.set(1);
|
|
588
|
+
return;
|
|
589
|
+
}
|
|
590
|
+
if (current < 1 || current > count) {
|
|
591
|
+
this.currentStep.set(1);
|
|
592
|
+
}
|
|
593
|
+
});
|
|
524
594
|
}
|
|
525
595
|
// ============================================================================
|
|
526
596
|
// Public API (accessed via viewChild)
|
|
@@ -629,6 +699,33 @@ class ClientForm {
|
|
|
629
699
|
onRuntimeMessagesChange(messages) {
|
|
630
700
|
this.runtimeMessages.set(messages ?? []);
|
|
631
701
|
}
|
|
702
|
+
onStepChange(value) {
|
|
703
|
+
const count = this.stepSections().length;
|
|
704
|
+
if (value < 1 || value > count)
|
|
705
|
+
return;
|
|
706
|
+
this.currentStep.set(value);
|
|
707
|
+
}
|
|
708
|
+
goToPreviousStep() {
|
|
709
|
+
this.onStepChange(this.currentStep() - 1);
|
|
710
|
+
}
|
|
711
|
+
goToNextStep() {
|
|
712
|
+
this.onStepChange(this.currentStep() + 1);
|
|
713
|
+
}
|
|
714
|
+
canGoToPreviousStep() {
|
|
715
|
+
return this.stepsEnabled() && this.currentStep() > 1;
|
|
716
|
+
}
|
|
717
|
+
canGoToNextStep() {
|
|
718
|
+
return this.stepsEnabled() && this.currentStep() < this.stepSections().length;
|
|
719
|
+
}
|
|
720
|
+
getCurrentStep() {
|
|
721
|
+
return this.currentStep();
|
|
722
|
+
}
|
|
723
|
+
getStepCount() {
|
|
724
|
+
return this.stepSections().length;
|
|
725
|
+
}
|
|
726
|
+
isStepNavigationEnabled() {
|
|
727
|
+
return this.stepsEnabled();
|
|
728
|
+
}
|
|
632
729
|
// ============================================================================
|
|
633
730
|
// Lifecycle
|
|
634
731
|
// ============================================================================
|
|
@@ -675,7 +772,10 @@ class ClientForm {
|
|
|
675
772
|
? mapFormValueToSubmitValues(formValue, loadResponse)
|
|
676
773
|
: Object.entries(formValue)
|
|
677
774
|
.filter(([, v]) => v !== undefined && v !== null)
|
|
678
|
-
.map(([propertyKey, value]) => ({
|
|
775
|
+
.map(([propertyKey, value]) => ({
|
|
776
|
+
propertyKey,
|
|
777
|
+
value: this.normalizeFallbackSubmitValue(propertyKey, value),
|
|
778
|
+
}));
|
|
679
779
|
const req = {
|
|
680
780
|
moduleKey: context?.moduleKey ?? this.moduleKey(),
|
|
681
781
|
operationKey: context?.operationKey ?? this.operationKey(),
|
|
@@ -704,13 +804,79 @@ class ClientForm {
|
|
|
704
804
|
req.returnUrl = returnUrl;
|
|
705
805
|
return req;
|
|
706
806
|
}
|
|
807
|
+
normalizeFallbackSubmitValue(propertyKey, value) {
|
|
808
|
+
const viewType = this.resolveFieldViewType(propertyKey);
|
|
809
|
+
switch (viewType) {
|
|
810
|
+
case 'User':
|
|
811
|
+
return this.normalizeUserValue(value);
|
|
812
|
+
case 'Lookup':
|
|
813
|
+
return this.normalizeLookupSingleValue(value);
|
|
814
|
+
case 'LookupMultiSelect':
|
|
815
|
+
return this.normalizeLookupMultiValue(value);
|
|
816
|
+
default:
|
|
817
|
+
return value;
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
resolveFieldViewType(propertyKey) {
|
|
821
|
+
const config = this.state.formConfiguration();
|
|
822
|
+
if (!config)
|
|
823
|
+
return null;
|
|
824
|
+
for (const section of config.sections ?? []) {
|
|
825
|
+
const field = section.fields?.find((f) => f.propertyKey === propertyKey);
|
|
826
|
+
if (!field)
|
|
827
|
+
continue;
|
|
828
|
+
const property = field.property ?? field.propertyMetadata;
|
|
829
|
+
return property?.viewType ?? null;
|
|
830
|
+
}
|
|
831
|
+
return null;
|
|
832
|
+
}
|
|
833
|
+
normalizeUserValue(value) {
|
|
834
|
+
if (Array.isArray(value)) {
|
|
835
|
+
return value
|
|
836
|
+
.map((item) => this.extractIdFromObject(item))
|
|
837
|
+
.filter((id) => id !== null)
|
|
838
|
+
.map((id) => String(id));
|
|
839
|
+
}
|
|
840
|
+
const id = this.extractIdFromObject(value);
|
|
841
|
+
if (id === null)
|
|
842
|
+
return value;
|
|
843
|
+
return String(id);
|
|
844
|
+
}
|
|
845
|
+
normalizeLookupSingleValue(value) {
|
|
846
|
+
const id = this.extractIdFromObject(value);
|
|
847
|
+
return id === null ? value : id;
|
|
848
|
+
}
|
|
849
|
+
normalizeLookupMultiValue(value) {
|
|
850
|
+
if (!Array.isArray(value))
|
|
851
|
+
return value;
|
|
852
|
+
return value
|
|
853
|
+
.map((item) => this.extractIdFromObject(item))
|
|
854
|
+
.filter((id) => id !== null);
|
|
855
|
+
}
|
|
856
|
+
extractIdFromObject(value) {
|
|
857
|
+
if (value === null || value === undefined)
|
|
858
|
+
return null;
|
|
859
|
+
if (typeof value === 'string' || typeof value === 'number') {
|
|
860
|
+
return value;
|
|
861
|
+
}
|
|
862
|
+
if (typeof value !== 'object')
|
|
863
|
+
return null;
|
|
864
|
+
const id = value['userId'] ?? value['id'] ?? value['value'];
|
|
865
|
+
return typeof id === 'string' || typeof id === 'number' ? id : null;
|
|
866
|
+
}
|
|
707
867
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: ClientForm, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
708
|
-
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 }, 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()) {\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 (msg of runtimeErrors()
|
|
868
|
+
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 <!-- Dynamic Form -->\r\n @if (state.requiresForm() && formConfig(); as config) {\r\n <div class=\"flex flex-col gap-4\">\r\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) {\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>\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 <mt-dynamic-form\n [formConfig]=\"config\"\n [formControl]=\"formControl\"\n [forcedHiddenFieldKeys]=\"forcedHiddenFieldKeys()\"\n [preserveForcedHiddenValues]=\"true\"\n (runtimeMessagesChange)=\"onRuntimeMessagesChange($event)\"\n />\n </div>\n } @else if (!state.requiresForm()) {\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}\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: DynamicForm, selector: "mt-dynamic-form", inputs: ["formConfig", "forcedHiddenFieldKeys", "preserveForcedHiddenValues"], outputs: ["runtimeMessagesChange"] }, { 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"] }] });
|
|
709
869
|
}
|
|
710
870
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: ClientForm, decorators: [{
|
|
711
871
|
type: Component,
|
|
712
|
-
args: [{ selector: 'mt-client-form', standalone: true, imports: [
|
|
713
|
-
|
|
872
|
+
args: [{ selector: 'mt-client-form', standalone: true, imports: [
|
|
873
|
+
CommonModule,
|
|
874
|
+
ReactiveFormsModule,
|
|
875
|
+
DynamicForm,
|
|
876
|
+
Skeleton,
|
|
877
|
+
StepperModule,
|
|
878
|
+
], 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 <!-- Dynamic Form -->\r\n @if (state.requiresForm() && formConfig(); as config) {\r\n <div class=\"flex flex-col gap-4\">\r\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) {\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>\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 <mt-dynamic-form\n [formConfig]=\"config\"\n [formControl]=\"formControl\"\n [forcedHiddenFieldKeys]=\"forcedHiddenFieldKeys()\"\n [preserveForcedHiddenValues]=\"true\"\n (runtimeMessagesChange)=\"onRuntimeMessagesChange($event)\"\n />\n </div>\n } @else if (!state.requiresForm()) {\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}\r\n", styles: [":host{display:block}\n"] }]
|
|
879
|
+
}], 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"] }] } });
|
|
714
880
|
|
|
715
881
|
// ============================================================================
|
|
716
882
|
// API Response Wrapper
|
|
@@ -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 {\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\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 {\n const validationRules = mapValidationRules(config, lang);\n\n return {\n sections: config.sections\n .slice()\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 })\n .filter((section) => section.fields.length > 0),\n validationRules,\n };\n}\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): Record<string, any> {\r\n const result: Record<string, any> = {};\r\n\r\n for (const v of values) {\r\n if (v.metadata?.source === 'ProcessVirtual') continue;\r\n result[v.propertyKey] = 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 * Maps `requestPropertyId` from the load response metadata where available,\r\n * so backend can match to schema request properties.\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<string, { propertyId?: number }>();\r\n\r\n for (const v of loadResponse.values) {\r\n if (v.metadata) {\r\n metadataByKey.set(v.propertyKey, {\r\n propertyId: v.metadata.propertyId,\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 submitValue: ProcessFormSubmitValue = { propertyKey, value };\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}\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 mapFieldToConfig(\r\n field: ClientFormField,\r\n lang: 'en' | 'ar',\r\n lookups: ClientLookup[],\r\n): DynamicFieldConfig {\r\n const prop = resolveProperty(field);\r\n const viewType = prop?.viewType ?? 'Text';\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 = {\n key: field.propertyKey,\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\n ? [ValidatorConfig.required(`${label} is required`)]\n : [],\n formulaCondition: buildFormulaCondition(field),\n };\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}\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\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: number }[] {\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.id,\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","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';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport { Skeleton } from 'primeng/skeleton';\r\n\r\nimport { DynamicForm } from '@masterteam/forms/dynamic-form';\nimport type { DynamicFormConfig, FormulaRuntimeMessage } from '@masterteam/components';\n\r\nimport { ClientFormApiService } from './services/client-form-api.service';\r\nimport { ClientFormStateService } from './services/client-form-state.service';\r\nimport {\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: [CommonModule, ReactiveFormsModule, DynamicForm, Skeleton],\r\n providers: [ClientFormStateService],\r\n templateUrl: './client-form.html',\r\n styleUrls: ['./client-form.scss'],\r\n})\r\nexport class ClientForm implements OnDestroy {\n private readonly api = inject(ClientFormApiService);\r\n protected readonly state = inject(ClientFormStateService);\r\n\r\n private loadSub?: Subscription;\n private submitSub?: Subscription;\n readonly runtimeMessages = signal<FormulaRuntimeMessage[]>([]);\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());\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\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 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(this.state.formValues());\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\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\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 {\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);\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\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();\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 {\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\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(): ProcessFormSubmitRequest {\r\n const loadResponse = this.state.loadResponse();\r\n const context = this.state.context();\r\n const formValue = this.getFormValue();\r\n\r\n const values: ProcessFormSubmitValue[] = loadResponse\r\n ? mapFormValueToSubmitValues(formValue, loadResponse)\r\n : Object.entries(formValue)\r\n .filter(([, v]) => v !== undefined && v !== null)\r\n .map(([propertyKey, value]) => ({ propertyKey, value }));\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()) {\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 (msg of runtimeErrors(); track msg.ruleId || msg.fieldKey || msg.message) {\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 (msg of runtimeWarnings(); track msg.ruleId || msg.fieldKey || msg.message) {\n <li>{{ msg.message }}</li>\n }\n </ul>\n </div>\n }\n </div>\n }\n\n <mt-dynamic-form\n [formConfig]=\"config\"\n [formControl]=\"formControl\"\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 >\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}\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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"}
|
|
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 {\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\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): Record<string, any> {\r\n const result: Record<string, any> = {};\r\n\r\n for (const v of values) {\r\n if (v.metadata?.source === 'ProcessVirtual') continue;\r\n result[v.propertyKey] = 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 * Maps `requestPropertyId` from the load response metadata where available,\r\n * so backend can match to schema request properties.\r\n */\r\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 v of loadResponse.values) {\n if (v.metadata) {\n metadataByKey.set(v.propertyKey, {\n propertyId: v.metadata.propertyId,\n viewType: v.metadata.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\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 mapFieldToConfig(\r\n field: ClientFormField,\r\n lang: 'en' | 'ar',\r\n lookups: ClientLookup[],\r\n): DynamicFieldConfig {\r\n const prop = resolveProperty(field);\r\n const viewType = prop?.viewType ?? 'Text';\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: number }[] {\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.id,\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(\n property: ClientPropertyItem | undefined,\n): { label: string; value: any }[] | null {\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\n return null;\n}\n\nfunction normalizeSubmitValue(value: any, viewType?: string): any {\n if (viewType !== 'User') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value\n .map((item) => extractUserId(item))\n .filter((id): id is string | number => id !== null)\n .map((id) => String(id));\n }\n\n const userId = extractUserId(value);\n if (userId === null) return value;\n return String(userId);\n}\n\nfunction extractUserId(value: any): string | number | null {\n if (value === null || value === undefined) return null;\n\n if (typeof value === 'string' || typeof value === 'number') {\n return value;\n }\n\n if (typeof value !== 'object') return null;\n\n const userId = value['userId'] ?? value['id'] ?? value['value'];\n if (typeof userId === 'string' || typeof userId === 'number') {\n return userId;\n }\n\n return null;\n}\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';\nimport { Subscription } from 'rxjs';\nimport { Skeleton } from 'primeng/skeleton';\nimport { StepperModule } from 'primeng/stepper';\n\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 mapToDynamicFormConfig,\r\n mapValuesToFormValue,\r\n mapFormValueToSubmitValues,\r\n} from './utils/form-config-mapper';\r\n\r\nimport type {\n ClientFormConfiguration,\n ProcessFormLoadRequest,\n ProcessFormLoadResponse,\n ProcessFormSubmitRequest,\n ProcessFormSubmitResponse,\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({\n selector: 'mt-client-form',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n DynamicForm,\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);\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(() =>\n this.runtimeMessages().filter((msg) => msg.severity === 'warning'),\n );\n readonly currentStep = signal(1);\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);\n readonly autoLoad = input(true);\n readonly formMode = input<'create' | 'edit'>('create');\n readonly renderMode = input<'form' | 'steps'>('form');\n readonly showInternalStepActions = input<boolean>(true);\n readonly lang = input<'en' | 'ar'>('en');\n readonly lookups = input<ClientLookup[]>([]);\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(this.state.formValues());\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);\n readonly stepSections = computed(() => this.formConfig()?.sections ?? []);\n readonly stepsEnabled = computed(\n () => this.renderMode() === 'steps' && this.stepSections().length > 1,\n );\n readonly forcedHiddenFieldKeys = computed(() => {\n if (!this.stepsEnabled()) 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\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(() => {\n const values = this.initialValues();\n const isLoaded = this.state.isLoaded();\n\r\n if (isLoaded && Object.keys(values).length > 0) {\r\n untracked(() => {\r\n this.formControl.patchValue(values, { emitEvent: false });\r\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\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\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();\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 {\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 this.stepsEnabled() && this.currentStep() < this.stepSections().length;\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\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(): ProcessFormSubmitRequest {\n const loadResponse = this.state.loadResponse();\r\n const context = this.state.context();\r\n const formValue = this.getFormValue();\r\n\r\n const values: ProcessFormSubmitValue[] = loadResponse\n ? mapFormValueToSubmitValues(formValue, loadResponse)\n : Object.entries(formValue)\n .filter(([, v]) => v !== undefined && v !== null)\n .map(([propertyKey, value]) => ({\n propertyKey,\n value: this.normalizeFallbackSubmitValue(propertyKey, value),\n }));\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;\n\n return req;\n }\n\n private normalizeFallbackSubmitValue(propertyKey: string, value: any): any {\n const viewType = this.resolveFieldViewType(propertyKey);\n\n switch (viewType) {\n case 'User':\n return this.normalizeUserValue(value);\n\n case 'Lookup':\n return this.normalizeLookupSingleValue(value);\n\n case 'LookupMultiSelect':\n return this.normalizeLookupMultiValue(value);\n\n default:\n return value;\n }\n }\n\n private resolveFieldViewType(propertyKey: string): string | null {\n const config: ClientFormConfiguration | null =\n this.state.formConfiguration();\n if (!config) return null;\n\n for (const section of config.sections ?? []) {\n const field = section.fields?.find((f) => f.propertyKey === propertyKey);\n if (!field) continue;\n\n const property = field.property ?? field.propertyMetadata;\n return property?.viewType ?? null;\n }\n\n return null;\n }\n\n private normalizeUserValue(value: any): any {\n if (Array.isArray(value)) {\n return value\n .map((item) => this.extractIdFromObject(item))\n .filter((id): id is string | number => id !== null)\n .map((id) => String(id));\n }\n\n const id = this.extractIdFromObject(value);\n if (id === null) return value;\n return String(id);\n }\n\n private normalizeLookupSingleValue(value: any): any {\n const id = this.extractIdFromObject(value);\n return id === null ? value : id;\n }\n\n private normalizeLookupMultiValue(value: any): any {\n if (!Array.isArray(value)) return value;\n\n return value\n .map((item) => this.extractIdFromObject(item))\n .filter((id): id is string | number => id !== null);\n }\n\n private extractIdFromObject(value: any): string | number | null {\n if (value === null || value === undefined) return null;\n\n if (typeof value === 'string' || typeof value === 'number') {\n return value;\n }\n\n if (typeof value !== 'object') return null;\n\n const id = value['userId'] ?? value['id'] ?? value['value'];\n return typeof id === 'string' || typeof id === 'number' ? id : null;\n }\n}\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 <!-- Dynamic Form -->\r\n @if (state.requiresForm() && formConfig(); as config) {\r\n <div class=\"flex flex-col gap-4\">\r\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) {\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>\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 <mt-dynamic-form\n [formConfig]=\"config\"\n [formControl]=\"formControl\"\n [forcedHiddenFieldKeys]=\"forcedHiddenFieldKeys()\"\n [preserveForcedHiddenValues]=\"true\"\n (runtimeMessagesChange)=\"onRuntimeMessagesChange($event)\"\n />\n </div>\n } @else if (!state.requiresForm()) {\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}\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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"}
|
|
@@ -12,6 +12,8 @@ class DynamicForm {
|
|
|
12
12
|
fb = inject(FormBuilder);
|
|
13
13
|
formulaEngine = new FormulaRuntimeEngine();
|
|
14
14
|
formConfig = input.required(...(ngDevMode ? [{ debugName: "formConfig" }] : []));
|
|
15
|
+
forcedHiddenFieldKeys = input([], ...(ngDevMode ? [{ debugName: "forcedHiddenFieldKeys" }] : []));
|
|
16
|
+
preserveForcedHiddenValues = input(true, ...(ngDevMode ? [{ debugName: "preserveForcedHiddenValues" }] : []));
|
|
15
17
|
runtimeMessagesChange = output();
|
|
16
18
|
form = new FormGroup({});
|
|
17
19
|
formBuilt = signal(false, ...(ngDevMode ? [{ debugName: "formBuilt" }] : []));
|
|
@@ -204,7 +206,8 @@ class DynamicForm {
|
|
|
204
206
|
}
|
|
205
207
|
});
|
|
206
208
|
}
|
|
207
|
-
if (field.formulaCondition?.mode &&
|
|
209
|
+
if (field.formulaCondition?.mode &&
|
|
210
|
+
field.formulaCondition.mode !== 'auto') {
|
|
208
211
|
if (field.formulaCondition.mode === 'show') {
|
|
209
212
|
hidden = true;
|
|
210
213
|
}
|
|
@@ -227,6 +230,7 @@ class DynamicForm {
|
|
|
227
230
|
evaluateRelations() {
|
|
228
231
|
const newStates = {};
|
|
229
232
|
const conditionMessages = [];
|
|
233
|
+
const forcedHiddenFields = new Set(this.forcedHiddenFieldKeys() ?? []);
|
|
230
234
|
const values = this.form.getRawValue();
|
|
231
235
|
// Process all fields with relations
|
|
232
236
|
this.formConfig().sections.forEach((section) => {
|
|
@@ -275,9 +279,9 @@ class DynamicForm {
|
|
|
275
279
|
});
|
|
276
280
|
if (conditionResult.errors.length > 0) {
|
|
277
281
|
conditionMessages.push(...conditionResult.errors.map((error) => ({
|
|
278
|
-
code:
|
|
282
|
+
code: error.code,
|
|
279
283
|
severity: 'warning',
|
|
280
|
-
message: `Condition formula failed for "${field.key}": ${error}`,
|
|
284
|
+
message: `Condition formula failed for "${field.key}": ${error.message}`,
|
|
281
285
|
formulaText: field.formulaCondition?.formulaText,
|
|
282
286
|
fieldKey: field.key,
|
|
283
287
|
})));
|
|
@@ -293,6 +297,12 @@ class DynamicForm {
|
|
|
293
297
|
}
|
|
294
298
|
});
|
|
295
299
|
});
|
|
300
|
+
forcedHiddenFields.forEach((fieldKey) => {
|
|
301
|
+
if (!newStates[fieldKey])
|
|
302
|
+
return;
|
|
303
|
+
newStates[fieldKey].hidden = true;
|
|
304
|
+
newStates[fieldKey].disabled = true;
|
|
305
|
+
});
|
|
296
306
|
// Update states
|
|
297
307
|
this.fieldStates.set(newStates);
|
|
298
308
|
// Sync form controls and clear values when disabled/hidden
|
|
@@ -302,17 +312,21 @@ class DynamicForm {
|
|
|
302
312
|
return;
|
|
303
313
|
}
|
|
304
314
|
const state = newStates[key];
|
|
315
|
+
const hiddenByExternalOverride = forcedHiddenFields.has(key);
|
|
316
|
+
const keepValueWhenHidden = hiddenByExternalOverride && this.preserveForcedHiddenValues();
|
|
305
317
|
const shouldDisable = state.hidden || state.disabled;
|
|
306
318
|
// Handle disabled state changes
|
|
307
319
|
if (shouldDisable && !control.disabled) {
|
|
308
320
|
control.disable({ emitEvent: false });
|
|
309
|
-
|
|
321
|
+
if (!keepValueWhenHidden) {
|
|
322
|
+
control.reset(undefined, { emitEvent: false }); // Clear value when disabled
|
|
323
|
+
}
|
|
310
324
|
}
|
|
311
325
|
else if (!shouldDisable && control.disabled) {
|
|
312
326
|
control.enable({ emitEvent: false });
|
|
313
327
|
}
|
|
314
328
|
// Clear value when hidden
|
|
315
|
-
if (state.hidden && control.value) {
|
|
329
|
+
if (state.hidden && control.value && !keepValueWhenHidden) {
|
|
316
330
|
control.reset(undefined, { emitEvent: false }); // Clear value when hidden
|
|
317
331
|
}
|
|
318
332
|
});
|
|
@@ -331,49 +345,15 @@ class DynamicForm {
|
|
|
331
345
|
return sourceValue === targetValue;
|
|
332
346
|
}
|
|
333
347
|
evaluateFormValidationRules(fieldStates, values) {
|
|
334
|
-
const errors = [];
|
|
335
|
-
const warnings = [];
|
|
336
348
|
const validationRules = this.formConfig().validationRules ?? [];
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
const state = fieldStates[dep];
|
|
343
|
-
return !!state && (state.hidden || state.disabled);
|
|
344
|
-
});
|
|
345
|
-
if (hasInactiveDependency)
|
|
346
|
-
return;
|
|
347
|
-
if (result.errors.length > 0) {
|
|
348
|
-
const message = {
|
|
349
|
-
code: 'FORMULA_EVALUATION_ERROR',
|
|
350
|
-
severity: rule.severity,
|
|
351
|
-
message: result.errors[0],
|
|
352
|
-
formulaText: rule.formulaText,
|
|
353
|
-
ruleId: rule.id,
|
|
354
|
-
};
|
|
355
|
-
if (rule.severity === 'error')
|
|
356
|
-
errors.push(message);
|
|
357
|
-
else
|
|
358
|
-
warnings.push(message);
|
|
359
|
-
return;
|
|
360
|
-
}
|
|
361
|
-
if (!result.valid) {
|
|
362
|
-
const message = {
|
|
363
|
-
code: 'FORMULA_FALSE',
|
|
364
|
-
severity: rule.severity,
|
|
365
|
-
message: rule.message || 'Validation rule failed',
|
|
366
|
-
formulaText: rule.formulaText,
|
|
367
|
-
ruleId: rule.id,
|
|
368
|
-
};
|
|
369
|
-
if (rule.severity === 'error')
|
|
370
|
-
errors.push(message);
|
|
371
|
-
else
|
|
372
|
-
warnings.push(message);
|
|
373
|
-
}
|
|
349
|
+
const evaluation = this.formulaEngine.evaluateValidationRules(validationRules, { values }, {
|
|
350
|
+
isDependencyActive: (dependency) => {
|
|
351
|
+
const state = fieldStates[dependency];
|
|
352
|
+
return !state || (!state.hidden && !state.disabled);
|
|
353
|
+
},
|
|
374
354
|
});
|
|
375
|
-
this.validationRuleErrors.set(errors);
|
|
376
|
-
this.validationRuleWarnings.set(warnings);
|
|
355
|
+
this.validationRuleErrors.set(evaluation.errors);
|
|
356
|
+
this.validationRuleWarnings.set(evaluation.warnings);
|
|
377
357
|
}
|
|
378
358
|
buildValidators(validatorConfigs) {
|
|
379
359
|
const validators = [];
|
|
@@ -446,7 +426,7 @@ class DynamicForm {
|
|
|
446
426
|
}
|
|
447
427
|
}
|
|
448
428
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: DynamicForm, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
449
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: DynamicForm, isStandalone: true, selector: "mt-dynamic-form", inputs: { formConfig: { classPropertyName: "formConfig", publicName: "formConfig", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { runtimeMessagesChange: "runtimeMessagesChange" }, providers: [
|
|
429
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: DynamicForm, isStandalone: true, selector: "mt-dynamic-form", inputs: { formConfig: { classPropertyName: "formConfig", publicName: "formConfig", isSignal: true, isRequired: true, transformFunction: null }, forcedHiddenFieldKeys: { classPropertyName: "forcedHiddenFieldKeys", publicName: "forcedHiddenFieldKeys", isSignal: true, isRequired: false, transformFunction: null }, preserveForcedHiddenValues: { classPropertyName: "preserveForcedHiddenValues", publicName: "preserveForcedHiddenValues", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { runtimeMessagesChange: "runtimeMessagesChange" }, providers: [
|
|
450
430
|
{
|
|
451
431
|
provide: NG_VALUE_ACCESSOR,
|
|
452
432
|
useExisting: forwardRef(() => DynamicForm),
|
|
@@ -473,7 +453,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImpor
|
|
|
473
453
|
multi: true,
|
|
474
454
|
},
|
|
475
455
|
], template: "<form [formGroup]=\"form\">\r\n <div\r\n class=\"flex flex-col gap-6\"\r\n [class]=\"formConfig().layout?.containerClass\"\r\n >\r\n @for (\r\n section of formConfig().sections | sort: \"order\";\r\n track section.key || $index\r\n ) {\r\n <div\r\n [class]=\"\r\n section.cssClass ||\r\n formConfig().layout?.sectionClass ||\r\n 'flex flex-col gap-4'\r\n \"\r\n >\r\n @if (section.type === \"header\" && section.label) {\r\n <h3\r\n [class]=\"\r\n section?.headerClass ||\r\n 'text-xl font-semibold text-color border-b-2 border-gray-200 pb-2 mb-4'\r\n \"\r\n >\r\n {{ section.label }}\r\n </h3>\r\n }\r\n\r\n <div\r\n [class]=\"section?.bodyClass || '@container grid gap-4 items-start'\"\r\n [style]=\"\r\n !section?.bodyClass\r\n ? sectionGridStyles()[section.key || 'section-' + $index]\r\n : {}\r\n \"\r\n >\r\n @for (field of section.fields | sort: \"order\"; track field.key) {\r\n <div\r\n [class]=\"\r\n field.cssClass ||\r\n formConfig().layout?.fieldClass ||\r\n 'flex flex-col gap-1'\r\n \"\r\n [style]=\"fieldColSpanStyles()[field.key!]\"\r\n [hidden]=\"field.type !== 'spacer' && hiddenFields()[field.key!]\"\r\n >\r\n @if (field.type === \"spacer\") {\r\n <mt-dynamic-field\r\n [fieldConfig]=\"field\"\r\n [fieldName]=\"field.key!\"\r\n />\r\n } @else if (field.key!.includes(\".\")) {\r\n <!-- Handle nested fields (e.g., name.ar, name.en) -->\r\n @let parentKey = field.key!.split(\".\")[0];\r\n @let childKey = field.key!.split(\".\")[1];\r\n <div [formGroup]=\"form.get(parentKey)\">\r\n <mt-dynamic-field\r\n [fieldConfig]=\"field\"\r\n [fieldName]=\"childKey\"\r\n />\r\n </div>\r\n } @else {\r\n <!-- Handle regular fields -->\r\n <mt-dynamic-field\r\n [fieldConfig]=\"field\"\r\n [fieldName]=\"field.key!\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n</form>\r\n" }]
|
|
476
|
-
}], ctorParameters: () => [], propDecorators: { formConfig: [{ type: i0.Input, args: [{ isSignal: true, alias: "formConfig", required: true }] }], runtimeMessagesChange: [{ type: i0.Output, args: ["runtimeMessagesChange"] }] } });
|
|
456
|
+
}], ctorParameters: () => [], propDecorators: { formConfig: [{ type: i0.Input, args: [{ isSignal: true, alias: "formConfig", required: true }] }], forcedHiddenFieldKeys: [{ type: i0.Input, args: [{ isSignal: true, alias: "forcedHiddenFieldKeys", required: false }] }], preserveForcedHiddenValues: [{ type: i0.Input, args: [{ isSignal: true, alias: "preserveForcedHiddenValues", required: false }] }], runtimeMessagesChange: [{ type: i0.Output, args: ["runtimeMessagesChange"] }] } });
|
|
477
457
|
|
|
478
458
|
/**
|
|
479
459
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-forms-dynamic-form.mjs","sources":["../../../../packages/masterteam/forms/dynamic-form/dynamic-form.ts","../../../../packages/masterteam/forms/dynamic-form/dynamic-form.html","../../../../packages/masterteam/forms/dynamic-form/masterteam-forms-dynamic-form.ts"],"sourcesContent":["import {\n Component,\n input,\n output,\n effect,\n OnDestroy,\n forwardRef,\n inject,\r\n signal,\r\n computed,\r\n untracked,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n AbstractControl,\r\n ValidatorFn,\r\n ControlValueAccessor,\r\n NG_VALUE_ACCESSOR,\r\n Validator,\r\n ValidationErrors,\r\n NG_VALIDATORS,\r\n} from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DynamicField } from '@masterteam/forms/dynamic-field';\r\nimport { SortPipe } from '@masterteam/forms/pipes';\r\n// import { SortPipe } from '../pipes/sort.pipe';\r\nimport {\n DynamicFormConfig,\n ValidatorConfig,\n createCustomValidator,\n wrapValidatorWithMessage,\n FieldState,\n FormulaRuntimeMessage,\n} from '@masterteam/components';\nimport { Subscription } from 'rxjs';\nimport {\n FormulaRuntimeEngine,\n type FormulaConditionEvaluation,\n type FormulaValidationEvaluation,\n} from '@masterteam/components/formula';\n\r\n@Component({\r\n selector: 'mt-dynamic-form',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule, DynamicField, SortPipe],\r\n templateUrl: './dynamic-form.html',\r\n styleUrls: ['./dynamic-form.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DynamicForm),\r\n multi: true,\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => DynamicForm),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class DynamicForm implements OnDestroy, ControlValueAccessor, Validator {\n private fb = inject(FormBuilder);\n private readonly formulaEngine = new FormulaRuntimeEngine();\n\n readonly formConfig = input.required<DynamicFormConfig>();\n readonly runtimeMessagesChange = output<FormulaRuntimeMessage[]>();\n\r\n form = new FormGroup({});\r\n private formBuilt = signal(false);\r\n private initValue = signal<any>({});\r\n\r\n // ControlValueAccessor implementation\r\n private onChange = (_value: any) => {};\r\n private onTouched = () => {};\r\n private onValidatorChange = () => {};\r\n private formSubscription?: Subscription;\n private fieldStates = signal<Record<string, FieldState>>({});\n private readonly conditionRuntimeMessages = signal<FormulaRuntimeMessage[]>(\n [],\n );\n private readonly validationRuleErrors = signal<FormulaRuntimeMessage[]>([]);\n private readonly validationRuleWarnings = signal<FormulaRuntimeMessage[]>([]);\n private readonly DEFAULT_GRID_COLUMNS = 12;\n\n readonly runtimeMessages = computed(() => [\n ...this.conditionRuntimeMessages(),\n ...this.validationRuleErrors(),\n ...this.validationRuleWarnings(),\n ]);\n\r\n // Computed signal for field visibility - better performance\r\n readonly hiddenFields = computed(() => {\r\n const states = this.fieldStates();\r\n const hidden: Record<string, boolean> = {};\r\n Object.keys(states).forEach((key) => {\r\n hidden[key] = states[key].hidden;\r\n });\r\n return hidden;\r\n });\r\n\r\n readonly fieldColSpanStyles = computed(() => {\r\n const styles: Record<string, { [key: string]: string }> = {};\r\n const config = this.formConfig();\r\n\r\n config.sections.forEach((section) => {\r\n section.fields.forEach((field) => {\r\n if (!field.key) return;\r\n if (!field.cssClass && !section.cssClass) {\r\n styles[field.key] = {\r\n 'grid-column': this.getColSpanStyleValue(field.colSpan),\r\n };\r\n }\r\n });\r\n });\r\n\r\n return styles;\r\n });\r\n\r\n readonly sectionGridStyles = computed(() => {\r\n const styles: Record<string, { [key: string]: string }> = {};\r\n const config = this.formConfig();\r\n\r\n config.sections.forEach((section, index) => {\r\n if (section.bodyClass) return;\r\n const key = section.key || `section-${index}`;\r\n const cols = section.columns || this.DEFAULT_GRID_COLUMNS;\r\n styles[key] = {\r\n 'grid-template-columns': `repeat(${cols}, minmax(0, 1fr))`,\r\n };\r\n });\r\n\r\n return styles;\r\n });\r\n\r\n constructor() {\r\n // Effect to rebuild form when config changes\r\n effect(() => {\r\n this.buildForm();\r\n this.formBuilt.set(true);\r\n const initValue = untracked(() => this.initValue());\r\n if (initValue && Object.keys(initValue)?.length > 0) {\r\n this.form.patchValue(initValue, { emitEvent: false });\r\n this.initValue.set(null);\r\n this.evaluateRelations();\r\n this.onChange(this.form.getRawValue());\r\n }\r\n });\r\n }\r\n\r\n registerOnValidatorChange(fn: () => void): void {\r\n this.onValidatorChange = fn;\r\n }\r\n registerOnChange(fn: (value: any) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n private buildForm() {\r\n if (this.formBuilt()) {\r\n return;\r\n }\r\n if (this.formSubscription) {\r\n this.formSubscription.unsubscribe();\r\n }\r\n\r\n const formControls: { [key: string]: AbstractControl } = {};\r\n const fieldStateMap: Record<string, FieldState> = {};\r\n\r\n this.formConfig().sections.forEach((section) => {\r\n section.fields.forEach((field) => {\r\n if (field.type === 'spacer') {\r\n return;\r\n }\r\n\r\n if (field.key) {\r\n // Calculate default state from relations\r\n const defaultState = this.getDefaultFieldState(field);\r\n\r\n fieldStateMap[field.key] = {\r\n hidden: defaultState.hidden,\r\n disabled: defaultState.disabled,\r\n };\r\n\r\n const validators = this.buildValidators(field.validators || []);\r\n\r\n // Check if field key contains dot notation (e.g., \"name.ar\", \"name.en\")\r\n if (field.key.includes('.')) {\r\n const [parentKey, childKey] = field.key.split('.');\r\n\r\n // Create or get the parent FormGroup\r\n if (!formControls[parentKey]) {\r\n formControls[parentKey] = this.fb.group({});\r\n }\r\n\r\n const parentGroup = formControls[parentKey] as FormGroup;\r\n\r\n // Add the child control to the parent group\r\n const control = this.fb.control(\r\n {\r\n value: null,\r\n disabled: defaultState.disabled,\r\n },\r\n validators,\r\n );\r\n\r\n parentGroup.addControl(childKey, control);\r\n } else {\r\n // Regular field without nesting\r\n const control = this.fb.control(\r\n {\r\n value: null,\r\n disabled: defaultState.disabled,\r\n },\r\n validators,\r\n );\r\n formControls[field.key] = control;\r\n }\r\n }\r\n });\r\n });\r\n\r\n this.form = this.fb.group(formControls);\r\n this.fieldStates.set(fieldStateMap);\r\n\r\n // Subscribe to form value changes and evaluate all relations\r\n this.formSubscription = this.form.valueChanges.subscribe(() => {\r\n this.evaluateRelations();\r\n this.onChange(this.form.getRawValue());\r\n });\r\n\r\n // Evaluate initial relations state\r\n this.evaluateRelations();\r\n\r\n // Trigger initial validation state\r\n // this.onValidatorChange();\r\n // this.onChange(this.form.getRawValue());\r\n }\r\n\r\n // ControlValueAccessor implementation\r\n writeValue(value: any): void {\r\n if (value && this.form && this.formBuilt()) {\r\n this.form.patchValue(value, { emitEvent: false });\r\n this.evaluateRelations();\r\n this.onChange(this.form.getRawValue());\r\n } else if (value && !this.formBuilt()) {\r\n this.initValue.set(value);\r\n }\r\n }\r\n\r\n validate(_control: AbstractControl): ValidationErrors | null {\n if (!this.form) {\n return null;\n }\n const ruleErrors = this.validationRuleErrors();\n const hasBlockingRuleErrors = ruleErrors.length > 0;\n if (this.form.valid && !hasBlockingRuleErrors) {\n return null;\n }\n\n return {\n invalidForm: true,\n formulaRules: hasBlockingRuleErrors ? ruleErrors : null,\n };\n }\n\r\n /**\r\n * Calculate default field state based on relations\r\n * If field has 'show' action → start hidden (opposite)\r\n * If field has 'enable' action → start disabled (opposite)\r\n */\r\n private getDefaultFieldState(field: any): {\r\n hidden: boolean;\r\n disabled: boolean;\r\n } {\r\n let hidden = !!field.hidden;\r\n let disabled = !!field.disabled;\r\n\r\n // If has relations, set opposite state\r\n if (field.relations?.length) {\n field.relations.forEach((relation: any) => {\n if (relation.action === 'show') {\n hidden = true;\n } else if (relation.action === 'hide') {\r\n hidden = false;\r\n } else if (relation.action === 'enable') {\r\n disabled = true;\r\n } else if (relation.action === 'disable') {\r\n disabled = false;\r\n }\r\n });\n }\n\n if (field.formulaCondition?.mode && field.formulaCondition.mode !== 'auto') {\n if (field.formulaCondition.mode === 'show') {\n hidden = true;\n } else if (field.formulaCondition.mode === 'hide') {\n hidden = false;\n } else if (field.formulaCondition.mode === 'enable') {\n disabled = true;\n } else if (field.formulaCondition.mode === 'disable') {\n disabled = false;\n }\n }\n\n return { hidden, disabled };\n }\n\r\n /**\r\n * Evaluate all relations - runs on every form change\r\n * Simple: if dependency matches → apply action, else apply opposite\r\n */\r\n private evaluateRelations() {\n const newStates: Record<string, FieldState> = {};\n const conditionMessages: FormulaRuntimeMessage[] = [];\n const values = this.form.getRawValue();\n\n // Process all fields with relations\n this.formConfig().sections.forEach((section) => {\n section.fields.forEach((field) => {\n if (!field.key) {\r\n return;\r\n }\r\n\r\n // Calculate default state\r\n const defaultState = this.getDefaultFieldState(field);\r\n\r\n // Start with default\r\n newStates[field.key] = {\r\n hidden: defaultState.hidden,\r\n disabled: defaultState.disabled,\r\n };\r\n\r\n // If has relations, check and apply\r\n if (field.relations?.length) {\n field.relations.forEach((relation) => {\n const dependencyControl = this.form.get(relation.key);\n if (!dependencyControl) {\r\n return;\r\n }\r\n\r\n const matches = this.doesRelationMatch(\r\n dependencyControl.value,\r\n relation.value,\r\n );\r\n\r\n // If matches, apply the action\r\n if (matches) {\r\n const state = newStates[field.key!];\r\n switch (relation.action) {\r\n case 'show':\r\n state.hidden = false;\r\n break;\r\n case 'hide':\r\n state.hidden = true;\r\n break;\r\n case 'enable':\r\n state.disabled = false;\r\n break;\r\n case 'disable':\r\n state.disabled = true;\r\n break;\r\n }\r\n }\n });\n }\n\n if (field.formulaCondition) {\n const conditionResult: FormulaConditionEvaluation =\n this.formulaEngine.evaluateCondition(field.formulaCondition, {\n values,\n });\n\n if (conditionResult.errors.length > 0) {\n conditionMessages.push(\n ...conditionResult.errors.map<FormulaRuntimeMessage>((error) => ({\n code: 'FORMULA_EVALUATION_ERROR',\n severity: 'warning',\n message: `Condition formula failed for \"${field.key}\": ${error}`,\n formulaText: field.formulaCondition?.formulaText,\n fieldKey: field.key,\n })),\n );\n } else {\n if (typeof conditionResult.hidden === 'boolean') {\n newStates[field.key].hidden = conditionResult.hidden;\n }\n if (typeof conditionResult.disabled === 'boolean') {\n newStates[field.key].disabled = conditionResult.disabled;\n }\n }\n }\n });\n });\n\r\n // Update states\r\n this.fieldStates.set(newStates);\r\n\r\n // Sync form controls and clear values when disabled/hidden\r\n Object.keys(newStates).forEach((key) => {\r\n const control = this.form.get(key);\r\n if (!control) {\r\n return;\r\n }\r\n\r\n const state = newStates[key];\r\n const shouldDisable = state.hidden || state.disabled;\r\n\r\n // Handle disabled state changes\r\n if (shouldDisable && !control.disabled) {\r\n control.disable({ emitEvent: false });\r\n control.reset(undefined, { emitEvent: false }); // Clear value when disabled\r\n } else if (!shouldDisable && control.disabled) {\r\n control.enable({ emitEvent: false });\r\n }\r\n\r\n // Clear value when hidden\r\n if (state.hidden && control.value) {\n control.reset(undefined, { emitEvent: false }); // Clear value when hidden\n }\n });\n\n this.conditionRuntimeMessages.set(conditionMessages);\n this.evaluateFormValidationRules(newStates, this.form.getRawValue());\n this.runtimeMessagesChange.emit(this.runtimeMessages());\n this.onValidatorChange();\n }\n\r\n private doesRelationMatch(sourceValue: any, targetValue: any): boolean {\n if (Array.isArray(sourceValue)) {\n if (Array.isArray(targetValue)) {\n return targetValue.every((value) => sourceValue.includes(value));\n }\n return sourceValue.includes(targetValue);\n }\n return sourceValue === targetValue;\n }\n\n private evaluateFormValidationRules(\n fieldStates: Record<string, FieldState>,\n values: Record<string, any>,\n ): void {\n const errors: FormulaRuntimeMessage[] = [];\n const warnings: FormulaRuntimeMessage[] = [];\n const validationRules = this.formConfig().validationRules ?? [];\n\n validationRules.forEach((rule) => {\n if (!rule.enabled) return;\n\n const result: FormulaValidationEvaluation =\n this.formulaEngine.evaluateValidation(rule, { values });\n\n const hasInactiveDependency = result.dependencies.some((dep) => {\n const state = fieldStates[dep];\n return !!state && (state.hidden || state.disabled);\n });\n if (hasInactiveDependency) return;\n\n if (result.errors.length > 0) {\n const message: FormulaRuntimeMessage = {\n code: 'FORMULA_EVALUATION_ERROR',\n severity: rule.severity,\n message: result.errors[0],\n formulaText: rule.formulaText,\n ruleId: rule.id,\n };\n\n if (rule.severity === 'error') errors.push(message);\n else warnings.push(message);\n return;\n }\n\n if (!result.valid) {\n const message: FormulaRuntimeMessage = {\n code: 'FORMULA_FALSE',\n severity: rule.severity,\n message: rule.message || 'Validation rule failed',\n formulaText: rule.formulaText,\n ruleId: rule.id,\n };\n\n if (rule.severity === 'error') errors.push(message);\n else warnings.push(message);\n }\n });\n\n this.validationRuleErrors.set(errors);\n this.validationRuleWarnings.set(warnings);\n }\n\r\n private buildValidators(validatorConfigs: ValidatorConfig[]): ValidatorFn[] {\r\n const validators: ValidatorFn[] = [];\r\n\r\n validatorConfigs.forEach((config) => {\r\n let validator: ValidatorFn | null = null;\r\n\r\n switch (config.type) {\r\n case 'required':\r\n validator = Validators.required;\r\n break;\r\n case 'email':\r\n validator = Validators.email;\r\n break;\r\n case 'minLength':\r\n if (config.value) {\r\n validator = Validators.minLength(config.value);\r\n }\r\n break;\r\n case 'maxLength':\r\n if (config.value) {\r\n validator = Validators.maxLength(config.value);\r\n }\r\n break;\r\n case 'min':\r\n if (config.value !== undefined) {\r\n validator = Validators.min(config.value);\r\n }\r\n break;\r\n case 'max':\r\n if (config.value !== undefined) {\r\n validator = Validators.max(config.value);\r\n }\r\n break;\r\n case 'pattern':\r\n if (config.value) {\r\n validator = Validators.pattern(config.value);\r\n }\r\n break;\r\n case 'custom':\r\n if (config.customValidator) {\r\n validators.push(\r\n createCustomValidator(config.customValidator, config.message),\r\n );\r\n }\r\n break;\r\n }\r\n\r\n // If we have a validator and a custom message, wrap it\r\n if (validator && config.message) {\r\n validators.push(\r\n wrapValidatorWithMessage(validator, config.type, config.message),\r\n );\r\n } else if (validator) {\r\n validators.push(validator);\r\n }\r\n });\r\n\r\n return validators;\r\n }\r\n\r\n private getColSpanStyleValue(colSpan?: number | any): string {\r\n if (!colSpan) {\r\n return `span ${this.DEFAULT_GRID_COLUMNS} / span ${this.DEFAULT_GRID_COLUMNS}`;\r\n }\r\n\r\n if (typeof colSpan === 'number') {\r\n return `span ${colSpan} / span ${colSpan}`;\r\n }\r\n\r\n const breakpointKeys = ['xs', 'sm', 'md', 'lg', 'xl'] as const;\r\n const span =\r\n breakpointKeys\r\n .map((key) => colSpan[key])\r\n .find((value) => value !== undefined) ?? this.DEFAULT_GRID_COLUMNS;\r\n\r\n return `span ${span} / span ${span}`;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.formSubscription) {\r\n this.formSubscription.unsubscribe();\r\n }\r\n }\r\n}\r\n","<form [formGroup]=\"form\">\r\n <div\r\n class=\"flex flex-col gap-6\"\r\n [class]=\"formConfig().layout?.containerClass\"\r\n >\r\n @for (\r\n section of formConfig().sections | sort: \"order\";\r\n track section.key || $index\r\n ) {\r\n <div\r\n [class]=\"\r\n section.cssClass ||\r\n formConfig().layout?.sectionClass ||\r\n 'flex flex-col gap-4'\r\n \"\r\n >\r\n @if (section.type === \"header\" && section.label) {\r\n <h3\r\n [class]=\"\r\n section?.headerClass ||\r\n 'text-xl font-semibold text-color border-b-2 border-gray-200 pb-2 mb-4'\r\n \"\r\n >\r\n {{ section.label }}\r\n </h3>\r\n }\r\n\r\n <div\r\n [class]=\"section?.bodyClass || '@container grid gap-4 items-start'\"\r\n [style]=\"\r\n !section?.bodyClass\r\n ? sectionGridStyles()[section.key || 'section-' + $index]\r\n : {}\r\n \"\r\n >\r\n @for (field of section.fields | sort: \"order\"; track field.key) {\r\n <div\r\n [class]=\"\r\n field.cssClass ||\r\n formConfig().layout?.fieldClass ||\r\n 'flex flex-col gap-1'\r\n \"\r\n [style]=\"fieldColSpanStyles()[field.key!]\"\r\n [hidden]=\"field.type !== 'spacer' && hiddenFields()[field.key!]\"\r\n >\r\n @if (field.type === \"spacer\") {\r\n <mt-dynamic-field\r\n [fieldConfig]=\"field\"\r\n [fieldName]=\"field.key!\"\r\n />\r\n } @else if (field.key!.includes(\".\")) {\r\n <!-- Handle nested fields (e.g., name.ar, name.en) -->\r\n @let parentKey = field.key!.split(\".\")[0];\r\n @let childKey = field.key!.split(\".\")[1];\r\n <div [formGroup]=\"form.get(parentKey)\">\r\n <mt-dynamic-field\r\n [fieldConfig]=\"field\"\r\n [fieldName]=\"childKey\"\r\n />\r\n </div>\r\n } @else {\r\n <!-- Handle regular fields -->\r\n <mt-dynamic-field\r\n [fieldConfig]=\"field\"\r\n [fieldName]=\"field.key!\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n</form>\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-form.mjs","sources":["../../../../packages/masterteam/forms/dynamic-form/dynamic-form.ts","../../../../packages/masterteam/forms/dynamic-form/dynamic-form.html","../../../../packages/masterteam/forms/dynamic-form/masterteam-forms-dynamic-form.ts"],"sourcesContent":["import {\r\n Component,\r\n input,\r\n output,\r\n effect,\r\n OnDestroy,\r\n forwardRef,\r\n inject,\r\n signal,\r\n computed,\r\n untracked,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n AbstractControl,\r\n ValidatorFn,\r\n ControlValueAccessor,\r\n NG_VALUE_ACCESSOR,\r\n Validator,\r\n ValidationErrors,\r\n NG_VALIDATORS,\r\n} from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DynamicField } from '@masterteam/forms/dynamic-field';\r\nimport { SortPipe } from '@masterteam/forms/pipes';\r\n// import { SortPipe } from '../pipes/sort.pipe';\r\nimport {\r\n DynamicFormConfig,\r\n ValidatorConfig,\r\n createCustomValidator,\r\n wrapValidatorWithMessage,\r\n FieldState,\r\n FormulaRuntimeMessage,\r\n} from '@masterteam/components';\r\nimport { Subscription } from 'rxjs';\r\nimport {\n FormulaRuntimeEngine,\n type FormulaConditionEvaluation,\n} from '@masterteam/components/formula';\n\r\n@Component({\r\n selector: 'mt-dynamic-form',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule, DynamicField, SortPipe],\r\n templateUrl: './dynamic-form.html',\r\n styleUrls: ['./dynamic-form.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DynamicForm),\r\n multi: true,\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => DynamicForm),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class DynamicForm implements OnDestroy, ControlValueAccessor, Validator {\n private fb = inject(FormBuilder);\n private readonly formulaEngine = new FormulaRuntimeEngine();\n\n readonly formConfig = input.required<DynamicFormConfig>();\n readonly forcedHiddenFieldKeys = input<string[]>([]);\n readonly preserveForcedHiddenValues = input<boolean>(true);\n readonly runtimeMessagesChange = output<FormulaRuntimeMessage[]>();\n\r\n form = new FormGroup({});\r\n private formBuilt = signal(false);\r\n private initValue = signal<any>({});\r\n\r\n // ControlValueAccessor implementation\r\n private onChange = (_value: any) => {};\r\n private onTouched = () => {};\r\n private onValidatorChange = () => {};\r\n private formSubscription?: Subscription;\r\n private fieldStates = signal<Record<string, FieldState>>({});\r\n private readonly conditionRuntimeMessages = signal<FormulaRuntimeMessage[]>(\r\n [],\r\n );\r\n private readonly validationRuleErrors = signal<FormulaRuntimeMessage[]>([]);\r\n private readonly validationRuleWarnings = signal<FormulaRuntimeMessage[]>([]);\r\n private readonly DEFAULT_GRID_COLUMNS = 12;\r\n\r\n readonly runtimeMessages = computed(() => [\r\n ...this.conditionRuntimeMessages(),\r\n ...this.validationRuleErrors(),\r\n ...this.validationRuleWarnings(),\r\n ]);\r\n\r\n // Computed signal for field visibility - better performance\r\n readonly hiddenFields = computed(() => {\r\n const states = this.fieldStates();\r\n const hidden: Record<string, boolean> = {};\r\n Object.keys(states).forEach((key) => {\r\n hidden[key] = states[key].hidden;\r\n });\r\n return hidden;\r\n });\r\n\r\n readonly fieldColSpanStyles = computed(() => {\r\n const styles: Record<string, { [key: string]: string }> = {};\r\n const config = this.formConfig();\r\n\r\n config.sections.forEach((section) => {\r\n section.fields.forEach((field) => {\r\n if (!field.key) return;\r\n if (!field.cssClass && !section.cssClass) {\r\n styles[field.key] = {\r\n 'grid-column': this.getColSpanStyleValue(field.colSpan),\r\n };\r\n }\r\n });\r\n });\r\n\r\n return styles;\r\n });\r\n\r\n readonly sectionGridStyles = computed(() => {\r\n const styles: Record<string, { [key: string]: string }> = {};\r\n const config = this.formConfig();\r\n\r\n config.sections.forEach((section, index) => {\r\n if (section.bodyClass) return;\r\n const key = section.key || `section-${index}`;\r\n const cols = section.columns || this.DEFAULT_GRID_COLUMNS;\r\n styles[key] = {\r\n 'grid-template-columns': `repeat(${cols}, minmax(0, 1fr))`,\r\n };\r\n });\r\n\r\n return styles;\r\n });\r\n\r\n constructor() {\r\n // Effect to rebuild form when config changes\r\n effect(() => {\r\n this.buildForm();\r\n this.formBuilt.set(true);\r\n const initValue = untracked(() => this.initValue());\r\n if (initValue && Object.keys(initValue)?.length > 0) {\r\n this.form.patchValue(initValue, { emitEvent: false });\r\n this.initValue.set(null);\r\n this.evaluateRelations();\r\n this.onChange(this.form.getRawValue());\r\n }\r\n });\r\n }\r\n\r\n registerOnValidatorChange(fn: () => void): void {\r\n this.onValidatorChange = fn;\r\n }\r\n registerOnChange(fn: (value: any) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n private buildForm() {\r\n if (this.formBuilt()) {\r\n return;\r\n }\r\n if (this.formSubscription) {\r\n this.formSubscription.unsubscribe();\r\n }\r\n\r\n const formControls: { [key: string]: AbstractControl } = {};\r\n const fieldStateMap: Record<string, FieldState> = {};\r\n\r\n this.formConfig().sections.forEach((section) => {\r\n section.fields.forEach((field) => {\r\n if (field.type === 'spacer') {\r\n return;\r\n }\r\n\r\n if (field.key) {\r\n // Calculate default state from relations\r\n const defaultState = this.getDefaultFieldState(field);\r\n\r\n fieldStateMap[field.key] = {\r\n hidden: defaultState.hidden,\r\n disabled: defaultState.disabled,\r\n };\r\n\r\n const validators = this.buildValidators(field.validators || []);\r\n\r\n // Check if field key contains dot notation (e.g., \"name.ar\", \"name.en\")\r\n if (field.key.includes('.')) {\r\n const [parentKey, childKey] = field.key.split('.');\r\n\r\n // Create or get the parent FormGroup\r\n if (!formControls[parentKey]) {\r\n formControls[parentKey] = this.fb.group({});\r\n }\r\n\r\n const parentGroup = formControls[parentKey] as FormGroup;\r\n\r\n // Add the child control to the parent group\r\n const control = this.fb.control(\r\n {\r\n value: null,\r\n disabled: defaultState.disabled,\r\n },\r\n validators,\r\n );\r\n\r\n parentGroup.addControl(childKey, control);\r\n } else {\r\n // Regular field without nesting\r\n const control = this.fb.control(\r\n {\r\n value: null,\r\n disabled: defaultState.disabled,\r\n },\r\n validators,\r\n );\r\n formControls[field.key] = control;\r\n }\r\n }\r\n });\r\n });\r\n\r\n this.form = this.fb.group(formControls);\r\n this.fieldStates.set(fieldStateMap);\r\n\r\n // Subscribe to form value changes and evaluate all relations\r\n this.formSubscription = this.form.valueChanges.subscribe(() => {\r\n this.evaluateRelations();\r\n this.onChange(this.form.getRawValue());\r\n });\r\n\r\n // Evaluate initial relations state\r\n this.evaluateRelations();\r\n\r\n // Trigger initial validation state\r\n // this.onValidatorChange();\r\n // this.onChange(this.form.getRawValue());\r\n }\r\n\r\n // ControlValueAccessor implementation\r\n writeValue(value: any): void {\r\n if (value && this.form && this.formBuilt()) {\r\n this.form.patchValue(value, { emitEvent: false });\r\n this.evaluateRelations();\r\n this.onChange(this.form.getRawValue());\r\n } else if (value && !this.formBuilt()) {\r\n this.initValue.set(value);\r\n }\r\n }\r\n\r\n validate(_control: AbstractControl): ValidationErrors | null {\r\n if (!this.form) {\r\n return null;\r\n }\r\n const ruleErrors = this.validationRuleErrors();\r\n const hasBlockingRuleErrors = ruleErrors.length > 0;\r\n if (this.form.valid && !hasBlockingRuleErrors) {\r\n return null;\r\n }\r\n\r\n return {\r\n invalidForm: true,\r\n formulaRules: hasBlockingRuleErrors ? ruleErrors : null,\r\n };\r\n }\r\n\r\n /**\r\n * Calculate default field state based on relations\r\n * If field has 'show' action → start hidden (opposite)\r\n * If field has 'enable' action → start disabled (opposite)\r\n */\r\n private getDefaultFieldState(field: any): {\r\n hidden: boolean;\r\n disabled: boolean;\r\n } {\r\n let hidden = !!field.hidden;\r\n let disabled = !!field.disabled;\r\n\r\n // If has relations, set opposite state\r\n if (field.relations?.length) {\r\n field.relations.forEach((relation: any) => {\r\n if (relation.action === 'show') {\r\n hidden = true;\r\n } else if (relation.action === 'hide') {\r\n hidden = false;\r\n } else if (relation.action === 'enable') {\r\n disabled = true;\r\n } else if (relation.action === 'disable') {\r\n disabled = false;\r\n }\r\n });\r\n }\r\n\r\n if (\r\n field.formulaCondition?.mode &&\r\n field.formulaCondition.mode !== 'auto'\r\n ) {\r\n if (field.formulaCondition.mode === 'show') {\r\n hidden = true;\r\n } else if (field.formulaCondition.mode === 'hide') {\r\n hidden = false;\r\n } else if (field.formulaCondition.mode === 'enable') {\r\n disabled = true;\r\n } else if (field.formulaCondition.mode === 'disable') {\r\n disabled = false;\r\n }\r\n }\r\n\r\n return { hidden, disabled };\r\n }\r\n\r\n /**\r\n * Evaluate all relations - runs on every form change\r\n * Simple: if dependency matches → apply action, else apply opposite\r\n */\r\n private evaluateRelations() {\n const newStates: Record<string, FieldState> = {};\n const conditionMessages: FormulaRuntimeMessage[] = [];\n const forcedHiddenFields = new Set(this.forcedHiddenFieldKeys() ?? []);\n const values = this.form.getRawValue();\n\r\n // Process all fields with relations\r\n this.formConfig().sections.forEach((section) => {\r\n section.fields.forEach((field) => {\r\n if (!field.key) {\r\n return;\r\n }\r\n\r\n // Calculate default state\r\n const defaultState = this.getDefaultFieldState(field);\r\n\r\n // Start with default\r\n newStates[field.key] = {\r\n hidden: defaultState.hidden,\r\n disabled: defaultState.disabled,\r\n };\r\n\r\n // If has relations, check and apply\r\n if (field.relations?.length) {\r\n field.relations.forEach((relation) => {\r\n const dependencyControl = this.form.get(relation.key);\r\n if (!dependencyControl) {\r\n return;\r\n }\r\n\r\n const matches = this.doesRelationMatch(\r\n dependencyControl.value,\r\n relation.value,\r\n );\r\n\r\n // If matches, apply the action\r\n if (matches) {\r\n const state = newStates[field.key!];\r\n switch (relation.action) {\r\n case 'show':\r\n state.hidden = false;\r\n break;\r\n case 'hide':\r\n state.hidden = true;\r\n break;\r\n case 'enable':\r\n state.disabled = false;\r\n break;\r\n case 'disable':\r\n state.disabled = true;\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (field.formulaCondition) {\n const conditionResult: FormulaConditionEvaluation =\n this.formulaEngine.evaluateCondition(field.formulaCondition, {\n values,\n });\n\r\n if (conditionResult.errors.length > 0) {\n conditionMessages.push(\n ...conditionResult.errors.map<FormulaRuntimeMessage>((error) => ({\n code: error.code,\n severity: 'warning',\n message: `Condition formula failed for \"${field.key}\": ${error.message}`,\n formulaText: field.formulaCondition?.formulaText,\n fieldKey: field.key,\n })),\n );\n } else {\r\n if (typeof conditionResult.hidden === 'boolean') {\r\n newStates[field.key].hidden = conditionResult.hidden;\r\n }\r\n if (typeof conditionResult.disabled === 'boolean') {\r\n newStates[field.key].disabled = conditionResult.disabled;\r\n }\r\n }\n }\n });\n });\n\n forcedHiddenFields.forEach((fieldKey) => {\n if (!newStates[fieldKey]) return;\n newStates[fieldKey].hidden = true;\n newStates[fieldKey].disabled = true;\n });\n\n // Update states\n this.fieldStates.set(newStates);\n\n // Sync form controls and clear values when disabled/hidden\n Object.keys(newStates).forEach((key) => {\r\n const control = this.form.get(key);\r\n if (!control) {\r\n return;\r\n }\r\n\n const state = newStates[key];\n const hiddenByExternalOverride = forcedHiddenFields.has(key);\n const keepValueWhenHidden =\n hiddenByExternalOverride && this.preserveForcedHiddenValues();\n const shouldDisable = state.hidden || state.disabled;\n\n // Handle disabled state changes\n if (shouldDisable && !control.disabled) {\n control.disable({ emitEvent: false });\n if (!keepValueWhenHidden) {\n control.reset(undefined, { emitEvent: false }); // Clear value when disabled\n }\n } else if (!shouldDisable && control.disabled) {\n control.enable({ emitEvent: false });\n }\n\n // Clear value when hidden\n if (state.hidden && control.value && !keepValueWhenHidden) {\n control.reset(undefined, { emitEvent: false }); // Clear value when hidden\n }\n });\n\r\n this.conditionRuntimeMessages.set(conditionMessages);\r\n this.evaluateFormValidationRules(newStates, this.form.getRawValue());\r\n this.runtimeMessagesChange.emit(this.runtimeMessages());\r\n this.onValidatorChange();\r\n }\r\n\r\n private doesRelationMatch(sourceValue: any, targetValue: any): boolean {\r\n if (Array.isArray(sourceValue)) {\r\n if (Array.isArray(targetValue)) {\r\n return targetValue.every((value) => sourceValue.includes(value));\r\n }\r\n return sourceValue.includes(targetValue);\r\n }\r\n return sourceValue === targetValue;\r\n }\r\n\r\n private evaluateFormValidationRules(\n fieldStates: Record<string, FieldState>,\n values: Record<string, any>,\n ): void {\n const validationRules = this.formConfig().validationRules ?? [];\n const evaluation = this.formulaEngine.evaluateValidationRules(\n validationRules,\n { values },\n {\n isDependencyActive: (dependency: string) => {\n const state = fieldStates[dependency];\n return !state || (!state.hidden && !state.disabled);\n },\n },\n );\n\n this.validationRuleErrors.set(evaluation.errors);\n this.validationRuleWarnings.set(evaluation.warnings);\n }\n\r\n private buildValidators(validatorConfigs: ValidatorConfig[]): ValidatorFn[] {\r\n const validators: ValidatorFn[] = [];\r\n\r\n validatorConfigs.forEach((config) => {\r\n let validator: ValidatorFn | null = null;\r\n\r\n switch (config.type) {\r\n case 'required':\r\n validator = Validators.required;\r\n break;\r\n case 'email':\r\n validator = Validators.email;\r\n break;\r\n case 'minLength':\r\n if (config.value) {\r\n validator = Validators.minLength(config.value);\r\n }\r\n break;\r\n case 'maxLength':\r\n if (config.value) {\r\n validator = Validators.maxLength(config.value);\r\n }\r\n break;\r\n case 'min':\r\n if (config.value !== undefined) {\r\n validator = Validators.min(config.value);\r\n }\r\n break;\r\n case 'max':\r\n if (config.value !== undefined) {\r\n validator = Validators.max(config.value);\r\n }\r\n break;\r\n case 'pattern':\r\n if (config.value) {\r\n validator = Validators.pattern(config.value);\r\n }\r\n break;\r\n case 'custom':\r\n if (config.customValidator) {\r\n validators.push(\r\n createCustomValidator(config.customValidator, config.message),\r\n );\r\n }\r\n break;\r\n }\r\n\r\n // If we have a validator and a custom message, wrap it\r\n if (validator && config.message) {\r\n validators.push(\r\n wrapValidatorWithMessage(validator, config.type, config.message),\r\n );\r\n } else if (validator) {\r\n validators.push(validator);\r\n }\r\n });\r\n\r\n return validators;\r\n }\r\n\r\n private getColSpanStyleValue(colSpan?: number | any): string {\r\n if (!colSpan) {\r\n return `span ${this.DEFAULT_GRID_COLUMNS} / span ${this.DEFAULT_GRID_COLUMNS}`;\r\n }\r\n\r\n if (typeof colSpan === 'number') {\r\n return `span ${colSpan} / span ${colSpan}`;\r\n }\r\n\r\n const breakpointKeys = ['xs', 'sm', 'md', 'lg', 'xl'] as const;\r\n const span =\r\n breakpointKeys\r\n .map((key) => colSpan[key])\r\n .find((value) => value !== undefined) ?? this.DEFAULT_GRID_COLUMNS;\r\n\r\n return `span ${span} / span ${span}`;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.formSubscription) {\r\n this.formSubscription.unsubscribe();\r\n }\r\n }\r\n}\r\n","<form [formGroup]=\"form\">\r\n <div\r\n class=\"flex flex-col gap-6\"\r\n [class]=\"formConfig().layout?.containerClass\"\r\n >\r\n @for (\r\n section of formConfig().sections | sort: \"order\";\r\n track section.key || $index\r\n ) {\r\n <div\r\n [class]=\"\r\n section.cssClass ||\r\n formConfig().layout?.sectionClass ||\r\n 'flex flex-col gap-4'\r\n \"\r\n >\r\n @if (section.type === \"header\" && section.label) {\r\n <h3\r\n [class]=\"\r\n section?.headerClass ||\r\n 'text-xl font-semibold text-color border-b-2 border-gray-200 pb-2 mb-4'\r\n \"\r\n >\r\n {{ section.label }}\r\n </h3>\r\n }\r\n\r\n <div\r\n [class]=\"section?.bodyClass || '@container grid gap-4 items-start'\"\r\n [style]=\"\r\n !section?.bodyClass\r\n ? sectionGridStyles()[section.key || 'section-' + $index]\r\n : {}\r\n \"\r\n >\r\n @for (field of section.fields | sort: \"order\"; track field.key) {\r\n <div\r\n [class]=\"\r\n field.cssClass ||\r\n formConfig().layout?.fieldClass ||\r\n 'flex flex-col gap-1'\r\n \"\r\n [style]=\"fieldColSpanStyles()[field.key!]\"\r\n [hidden]=\"field.type !== 'spacer' && hiddenFields()[field.key!]\"\r\n >\r\n @if (field.type === \"spacer\") {\r\n <mt-dynamic-field\r\n [fieldConfig]=\"field\"\r\n [fieldName]=\"field.key!\"\r\n />\r\n } @else if (field.key!.includes(\".\")) {\r\n <!-- Handle nested fields (e.g., name.ar, name.en) -->\r\n @let parentKey = field.key!.split(\".\")[0];\r\n @let childKey = field.key!.split(\".\")[1];\r\n <div [formGroup]=\"form.get(parentKey)\">\r\n <mt-dynamic-field\r\n [fieldConfig]=\"field\"\r\n [fieldName]=\"childKey\"\r\n />\r\n </div>\r\n } @else {\r\n <!-- Handle regular fields -->\r\n <mt-dynamic-field\r\n [fieldConfig]=\"field\"\r\n [fieldName]=\"field.key!\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n</form>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;MA8Da,WAAW,CAAA;AACd,IAAA,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC;AACf,IAAA,aAAa,GAAG,IAAI,oBAAoB,EAAE;AAElD,IAAA,UAAU,GAAG,KAAK,CAAC,QAAQ,qDAAqB;AAChD,IAAA,qBAAqB,GAAG,KAAK,CAAW,EAAE,iEAAC;AAC3C,IAAA,0BAA0B,GAAG,KAAK,CAAU,IAAI,sEAAC;IACjD,qBAAqB,GAAG,MAAM,EAA2B;AAElE,IAAA,IAAI,GAAG,IAAI,SAAS,CAAC,EAAE,CAAC;AAChB,IAAA,SAAS,GAAG,MAAM,CAAC,KAAK,qDAAC;AACzB,IAAA,SAAS,GAAG,MAAM,CAAM,EAAE,qDAAC;;AAG3B,IAAA,QAAQ,GAAG,CAAC,MAAW,KAAI,EAAE,CAAC;AAC9B,IAAA,SAAS,GAAG,MAAK,EAAE,CAAC;AACpB,IAAA,iBAAiB,GAAG,MAAK,EAAE,CAAC;AAC5B,IAAA,gBAAgB;AAChB,IAAA,WAAW,GAAG,MAAM,CAA6B,EAAE,uDAAC;AAC3C,IAAA,wBAAwB,GAAG,MAAM,CAChD,EAAE,oEACH;AACgB,IAAA,oBAAoB,GAAG,MAAM,CAA0B,EAAE,gEAAC;AAC1D,IAAA,sBAAsB,GAAG,MAAM,CAA0B,EAAE,kEAAC;IAC5D,oBAAoB,GAAG,EAAE;AAEjC,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM;QACxC,GAAG,IAAI,CAAC,wBAAwB,EAAE;QAClC,GAAG,IAAI,CAAC,oBAAoB,EAAE;QAC9B,GAAG,IAAI,CAAC,sBAAsB,EAAE;AACjC,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;;AAGO,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AACpC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE;QACjC,MAAM,MAAM,GAA4B,EAAE;QAC1C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;YAClC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM;AAClC,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,wDAAC;AAEO,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAK;QAC1C,MAAM,MAAM,GAA8C,EAAE;AAC5D,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;QAEhC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;YAClC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;gBAC/B,IAAI,CAAC,KAAK,CAAC,GAAG;oBAAE;gBAChB,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;AACxC,oBAAA,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG;wBAClB,aAAa,EAAE,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC;qBACxD;gBACH;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,8DAAC;AAEO,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAK;QACzC,MAAM,MAAM,GAA8C,EAAE;AAC5D,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;QAEhC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,KAAI;YACzC,IAAI,OAAO,CAAC,SAAS;gBAAE;YACvB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAA,QAAA,EAAW,KAAK,CAAA,CAAE;YAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,oBAAoB;YACzD,MAAM,CAAC,GAAG,CAAC,GAAG;gBACZ,uBAAuB,EAAE,CAAA,OAAA,EAAU,IAAI,CAAA,iBAAA,CAAmB;aAC3D;AACH,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,6DAAC;AAEF,IAAA,WAAA,GAAA;;QAEE,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,SAAS,EAAE;AAChB,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,YAAA,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;AACnD,YAAA,IAAI,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE;AACnD,gBAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACrD,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;gBACxB,IAAI,CAAC,iBAAiB,EAAE;gBACxB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACxC;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,yBAAyB,CAAC,EAAc,EAAA;AACtC,QAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE;IAC7B;AACA,IAAA,gBAAgB,CAAC,EAAwB,EAAA;AACvC,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;IAEQ,SAAS,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YACpB;QACF;AACA,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,YAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE;QACrC;QAEA,MAAM,YAAY,GAAuC,EAAE;QAC3D,MAAM,aAAa,GAA+B,EAAE;QAEpD,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;YAC7C,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AAC/B,gBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE;oBAC3B;gBACF;AAEA,gBAAA,IAAI,KAAK,CAAC,GAAG,EAAE;;oBAEb,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;AAErD,oBAAA,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG;wBACzB,MAAM,EAAE,YAAY,CAAC,MAAM;wBAC3B,QAAQ,EAAE,YAAY,CAAC,QAAQ;qBAChC;AAED,oBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC;;oBAG/D,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC3B,wBAAA,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;;AAGlD,wBAAA,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE;AAC5B,4BAAA,YAAY,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC7C;AAEA,wBAAA,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,CAAc;;AAGxD,wBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC7B;AACE,4BAAA,KAAK,EAAE,IAAI;4BACX,QAAQ,EAAE,YAAY,CAAC,QAAQ;yBAChC,EACD,UAAU,CACX;AAED,wBAAA,WAAW,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC;oBAC3C;yBAAO;;AAEL,wBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC7B;AACE,4BAAA,KAAK,EAAE,IAAI;4BACX,QAAQ,EAAE,YAAY,CAAC,QAAQ;yBAChC,EACD,UAAU,CACX;AACD,wBAAA,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO;oBACnC;gBACF;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC;AACvC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,aAAa,CAAC;;AAGnC,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,MAAK;YAC5D,IAAI,CAAC,iBAAiB,EAAE;YACxB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AACxC,QAAA,CAAC,CAAC;;QAGF,IAAI,CAAC,iBAAiB,EAAE;;;;IAK1B;;AAGA,IAAA,UAAU,CAAC,KAAU,EAAA;QACnB,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AAC1C,YAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YACjD,IAAI,CAAC,iBAAiB,EAAE;YACxB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACxC;aAAO,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;AACrC,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QAC3B;IACF;AAEA,IAAA,QAAQ,CAAC,QAAyB,EAAA;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AACd,YAAA,OAAO,IAAI;QACb;AACA,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,EAAE;AAC9C,QAAA,MAAM,qBAAqB,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC;QACnD,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,qBAAqB,EAAE;AAC7C,YAAA,OAAO,IAAI;QACb;QAEA,OAAO;AACL,YAAA,WAAW,EAAE,IAAI;YACjB,YAAY,EAAE,qBAAqB,GAAG,UAAU,GAAG,IAAI;SACxD;IACH;AAEA;;;;AAIG;AACK,IAAA,oBAAoB,CAAC,KAAU,EAAA;AAIrC,QAAA,IAAI,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM;AAC3B,QAAA,IAAI,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ;;AAG/B,QAAA,IAAI,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE;YAC3B,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAa,KAAI;AACxC,gBAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,EAAE;oBAC9B,MAAM,GAAG,IAAI;gBACf;AAAO,qBAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,EAAE;oBACrC,MAAM,GAAG,KAAK;gBAChB;AAAO,qBAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE;oBACvC,QAAQ,GAAG,IAAI;gBACjB;AAAO,qBAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE;oBACxC,QAAQ,GAAG,KAAK;gBAClB;AACF,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,IACE,KAAK,CAAC,gBAAgB,EAAE,IAAI;AAC5B,YAAA,KAAK,CAAC,gBAAgB,CAAC,IAAI,KAAK,MAAM,EACtC;YACA,IAAI,KAAK,CAAC,gBAAgB,CAAC,IAAI,KAAK,MAAM,EAAE;gBAC1C,MAAM,GAAG,IAAI;YACf;iBAAO,IAAI,KAAK,CAAC,gBAAgB,CAAC,IAAI,KAAK,MAAM,EAAE;gBACjD,MAAM,GAAG,KAAK;YAChB;iBAAO,IAAI,KAAK,CAAC,gBAAgB,CAAC,IAAI,KAAK,QAAQ,EAAE;gBACnD,QAAQ,GAAG,IAAI;YACjB;iBAAO,IAAI,KAAK,CAAC,gBAAgB,CAAC,IAAI,KAAK,SAAS,EAAE;gBACpD,QAAQ,GAAG,KAAK;YAClB;QACF;AAEA,QAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE;IAC7B;AAEA;;;AAGG;IACK,iBAAiB,GAAA;QACvB,MAAM,SAAS,GAA+B,EAAE;QAChD,MAAM,iBAAiB,GAA4B,EAAE;AACrD,QAAA,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,IAAI,EAAE,CAAC;QACtE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;;QAGtC,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;YAC7C,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AAC/B,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;oBACd;gBACF;;gBAGA,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;;AAGrD,gBAAA,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG;oBACrB,MAAM,EAAE,YAAY,CAAC,MAAM;oBAC3B,QAAQ,EAAE,YAAY,CAAC,QAAQ;iBAChC;;AAGD,gBAAA,IAAI,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE;oBAC3B,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;AACnC,wBAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;wBACrD,IAAI,CAAC,iBAAiB,EAAE;4BACtB;wBACF;AAEA,wBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CACpC,iBAAiB,CAAC,KAAK,EACvB,QAAQ,CAAC,KAAK,CACf;;wBAGD,IAAI,OAAO,EAAE;4BACX,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAI,CAAC;AACnC,4BAAA,QAAQ,QAAQ,CAAC,MAAM;AACrB,gCAAA,KAAK,MAAM;AACT,oCAAA,KAAK,CAAC,MAAM,GAAG,KAAK;oCACpB;AACF,gCAAA,KAAK,MAAM;AACT,oCAAA,KAAK,CAAC,MAAM,GAAG,IAAI;oCACnB;AACF,gCAAA,KAAK,QAAQ;AACX,oCAAA,KAAK,CAAC,QAAQ,GAAG,KAAK;oCACtB;AACF,gCAAA,KAAK,SAAS;AACZ,oCAAA,KAAK,CAAC,QAAQ,GAAG,IAAI;oCACrB;;wBAEN;AACF,oBAAA,CAAC,CAAC;gBACJ;AAEA,gBAAA,IAAI,KAAK,CAAC,gBAAgB,EAAE;oBAC1B,MAAM,eAAe,GACnB,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,KAAK,CAAC,gBAAgB,EAAE;wBAC3D,MAAM;AACP,qBAAA,CAAC;oBAEJ,IAAI,eAAe,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AACrC,wBAAA,iBAAiB,CAAC,IAAI,CACpB,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,CAAwB,CAAC,KAAK,MAAM;4BAC/D,IAAI,EAAE,KAAK,CAAC,IAAI;AAChB,4BAAA,QAAQ,EAAE,SAAS;4BACnB,OAAO,EAAE,iCAAiC,KAAK,CAAC,GAAG,CAAA,GAAA,EAAM,KAAK,CAAC,OAAO,CAAA,CAAE;AACxE,4BAAA,WAAW,EAAE,KAAK,CAAC,gBAAgB,EAAE,WAAW;4BAChD,QAAQ,EAAE,KAAK,CAAC,GAAG;yBACpB,CAAC,CAAC,CACJ;oBACH;yBAAO;AACL,wBAAA,IAAI,OAAO,eAAe,CAAC,MAAM,KAAK,SAAS,EAAE;4BAC/C,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,eAAe,CAAC,MAAM;wBACtD;AACA,wBAAA,IAAI,OAAO,eAAe,CAAC,QAAQ,KAAK,SAAS,EAAE;4BACjD,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,GAAG,eAAe,CAAC,QAAQ;wBAC1D;oBACF;gBACF;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,kBAAkB,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;AACtC,YAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;gBAAE;AAC1B,YAAA,SAAS,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,IAAI;AACjC,YAAA,SAAS,CAAC,QAAQ,CAAC,CAAC,QAAQ,GAAG,IAAI;AACrC,QAAA,CAAC,CAAC;;AAGF,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC;;QAG/B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAClC,IAAI,CAAC,OAAO,EAAE;gBACZ;YACF;AAEA,YAAA,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC;YAC5B,MAAM,wBAAwB,GAAG,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC;YAC5D,MAAM,mBAAmB,GACvB,wBAAwB,IAAI,IAAI,CAAC,0BAA0B,EAAE;YAC/D,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ;;AAGpD,YAAA,IAAI,aAAa,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;gBACtC,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gBACrC,IAAI,CAAC,mBAAmB,EAAE;AACxB,oBAAA,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;gBACjD;YACF;AAAO,iBAAA,IAAI,CAAC,aAAa,IAAI,OAAO,CAAC,QAAQ,EAAE;gBAC7C,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YACtC;;YAGA,IAAI,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,IAAI,CAAC,mBAAmB,EAAE;AACzD,gBAAA,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;YACjD;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,iBAAiB,CAAC;AACpD,QAAA,IAAI,CAAC,2BAA2B,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACpE,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QACvD,IAAI,CAAC,iBAAiB,EAAE;IAC1B;IAEQ,iBAAiB,CAAC,WAAgB,EAAE,WAAgB,EAAA;AAC1D,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;AAC9B,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;AAC9B,gBAAA,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClE;AACA,YAAA,OAAO,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC1C;QACA,OAAO,WAAW,KAAK,WAAW;IACpC;IAEQ,2BAA2B,CACjC,WAAuC,EACvC,MAA2B,EAAA;QAE3B,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,eAAe,IAAI,EAAE;AAC/D,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,uBAAuB,CAC3D,eAAe,EACf,EAAE,MAAM,EAAE,EACV;AACE,YAAA,kBAAkB,EAAE,CAAC,UAAkB,KAAI;AACzC,gBAAA,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC;AACrC,gBAAA,OAAO,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;YACrD,CAAC;AACF,SAAA,CACF;QAED,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;QAChD,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC;IACtD;AAEQ,IAAA,eAAe,CAAC,gBAAmC,EAAA;QACzD,MAAM,UAAU,GAAkB,EAAE;AAEpC,QAAA,gBAAgB,CAAC,OAAO,CAAC,CAAC,MAAM,KAAI;YAClC,IAAI,SAAS,GAAuB,IAAI;AAExC,YAAA,QAAQ,MAAM,CAAC,IAAI;AACjB,gBAAA,KAAK,UAAU;AACb,oBAAA,SAAS,GAAG,UAAU,CAAC,QAAQ;oBAC/B;AACF,gBAAA,KAAK,OAAO;AACV,oBAAA,SAAS,GAAG,UAAU,CAAC,KAAK;oBAC5B;AACF,gBAAA,KAAK,WAAW;AACd,oBAAA,IAAI,MAAM,CAAC,KAAK,EAAE;wBAChB,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;oBAChD;oBACA;AACF,gBAAA,KAAK,WAAW;AACd,oBAAA,IAAI,MAAM,CAAC,KAAK,EAAE;wBAChB,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;oBAChD;oBACA;AACF,gBAAA,KAAK,KAAK;AACR,oBAAA,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE;wBAC9B,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;oBAC1C;oBACA;AACF,gBAAA,KAAK,KAAK;AACR,oBAAA,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE;wBAC9B,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;oBAC1C;oBACA;AACF,gBAAA,KAAK,SAAS;AACZ,oBAAA,IAAI,MAAM,CAAC,KAAK,EAAE;wBAChB,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;oBAC9C;oBACA;AACF,gBAAA,KAAK,QAAQ;AACX,oBAAA,IAAI,MAAM,CAAC,eAAe,EAAE;AAC1B,wBAAA,UAAU,CAAC,IAAI,CACb,qBAAqB,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,CAC9D;oBACH;oBACA;;;AAIJ,YAAA,IAAI,SAAS,IAAI,MAAM,CAAC,OAAO,EAAE;AAC/B,gBAAA,UAAU,CAAC,IAAI,CACb,wBAAwB,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CACjE;YACH;iBAAO,IAAI,SAAS,EAAE;AACpB,gBAAA,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;YAC5B;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,UAAU;IACnB;AAEQ,IAAA,oBAAoB,CAAC,OAAsB,EAAA;QACjD,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO,CAAA,KAAA,EAAQ,IAAI,CAAC,oBAAoB,WAAW,IAAI,CAAC,oBAAoB,CAAA,CAAE;QAChF;AAEA,QAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AAC/B,YAAA,OAAO,CAAA,KAAA,EAAQ,OAAO,CAAA,QAAA,EAAW,OAAO,EAAE;QAC5C;AAEA,QAAA,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU;QAC9D,MAAM,IAAI,GACR;aACG,GAAG,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC;AACzB,aAAA,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,KAAK,SAAS,CAAC,IAAI,IAAI,CAAC,oBAAoB;AAEtE,QAAA,OAAO,CAAA,KAAA,EAAQ,IAAI,CAAA,QAAA,EAAW,IAAI,EAAE;IACtC;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,YAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE;QACrC;IACF;uGAnfW,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,qBAAA,EAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,0BAAA,EAAA,EAAA,iBAAA,EAAA,4BAAA,EAAA,UAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,EAAA,SAAA,EAbX;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,WAAW,CAAC;AAC1C,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACD,YAAA;AACE,gBAAA,OAAO,EAAE,aAAa;AACtB,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,WAAW,CAAC;AAC1C,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;SACF,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5DH,4gFA0EA,yDD5BY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,sGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,YAAY,8FAAE,QAAQ,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA;;2FAgBxD,WAAW,EAAA,UAAA,EAAA,CAAA;kBAnBvB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAA,SAAA,EAGzD;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,iBAAiB,CAAC;AAC1C,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACD,wBAAA;AACE,4BAAA,OAAO,EAAE,aAAa;AACtB,4BAAA,WAAW,EAAE,UAAU,CAAC,iBAAiB,CAAC;AAC1C,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACF,qBAAA,EAAA,QAAA,EAAA,4gFAAA,EAAA;;;AE5DH;;AAEG;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@masterteam/forms",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.40",
|
|
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.94"
|
|
21
21
|
},
|
|
22
22
|
"sideEffects": false,
|
|
23
23
|
"exports": {
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import * as _masterteam_components from '@masterteam/components';
|
|
2
|
+
import { FormulaRuntimeMessage, DynamicFormConfig } from '@masterteam/components';
|
|
1
3
|
import * as _angular_core from '@angular/core';
|
|
2
4
|
import { OnDestroy } from '@angular/core';
|
|
3
5
|
import { FormControl } from '@angular/forms';
|
|
4
|
-
import { FormulaRuntimeMessage, DynamicFormConfig } from '@masterteam/components';
|
|
5
6
|
import * as _masterteam_forms_client_form from '@masterteam/forms/client-form';
|
|
6
7
|
import { Observable } from 'rxjs';
|
|
7
8
|
|
|
@@ -273,6 +274,7 @@ declare class ClientForm implements OnDestroy {
|
|
|
273
274
|
readonly loading: _angular_core.Signal<boolean>;
|
|
274
275
|
readonly runtimeErrors: _angular_core.Signal<FormulaRuntimeMessage[]>;
|
|
275
276
|
readonly runtimeWarnings: _angular_core.Signal<FormulaRuntimeMessage[]>;
|
|
277
|
+
readonly currentStep: _angular_core.WritableSignal<number>;
|
|
276
278
|
readonly moduleKey: _angular_core.InputSignal<string>;
|
|
277
279
|
readonly operationKey: _angular_core.InputSignal<string>;
|
|
278
280
|
readonly moduleId: _angular_core.InputSignal<number | undefined>;
|
|
@@ -286,6 +288,8 @@ declare class ClientForm implements OnDestroy {
|
|
|
286
288
|
readonly readonly: _angular_core.InputSignal<boolean>;
|
|
287
289
|
readonly autoLoad: _angular_core.InputSignal<boolean>;
|
|
288
290
|
readonly formMode: _angular_core.InputSignal<"create" | "edit">;
|
|
291
|
+
readonly renderMode: _angular_core.InputSignal<"form" | "steps">;
|
|
292
|
+
readonly showInternalStepActions: _angular_core.InputSignal<boolean>;
|
|
289
293
|
readonly lang: _angular_core.InputSignal<"en" | "ar">;
|
|
290
294
|
readonly lookups: _angular_core.InputSignal<ClientLookup[]>;
|
|
291
295
|
readonly loaded: _angular_core.OutputEmitterRef<ProcessFormLoadResponse>;
|
|
@@ -298,6 +302,9 @@ declare class ClientForm implements OnDestroy {
|
|
|
298
302
|
readonly initialValues: _angular_core.Signal<Record<string, any>>;
|
|
299
303
|
readonly virtualFields: _angular_core.Signal<ProcessFormValue[]>;
|
|
300
304
|
readonly hasVirtualFields: _angular_core.Signal<boolean>;
|
|
305
|
+
readonly stepSections: _angular_core.Signal<_masterteam_components.SectionConfig[]>;
|
|
306
|
+
readonly stepsEnabled: _angular_core.Signal<boolean>;
|
|
307
|
+
readonly forcedHiddenFieldKeys: _angular_core.Signal<string[]>;
|
|
301
308
|
constructor();
|
|
302
309
|
/**
|
|
303
310
|
* Load form configuration from the API.
|
|
@@ -326,11 +333,25 @@ declare class ClientForm implements OnDestroy {
|
|
|
326
333
|
*/
|
|
327
334
|
reset(): void;
|
|
328
335
|
onRuntimeMessagesChange(messages: FormulaRuntimeMessage[]): void;
|
|
336
|
+
onStepChange(value: number): void;
|
|
337
|
+
goToPreviousStep(): void;
|
|
338
|
+
goToNextStep(): void;
|
|
339
|
+
canGoToPreviousStep(): boolean;
|
|
340
|
+
canGoToNextStep(): boolean;
|
|
341
|
+
getCurrentStep(): number;
|
|
342
|
+
getStepCount(): number;
|
|
343
|
+
isStepNavigationEnabled(): boolean;
|
|
329
344
|
ngOnDestroy(): void;
|
|
330
345
|
private buildLoadRequest;
|
|
331
346
|
private buildSubmitRequest;
|
|
347
|
+
private normalizeFallbackSubmitValue;
|
|
348
|
+
private resolveFieldViewType;
|
|
349
|
+
private normalizeUserValue;
|
|
350
|
+
private normalizeLookupSingleValue;
|
|
351
|
+
private normalizeLookupMultiValue;
|
|
352
|
+
private extractIdFromObject;
|
|
332
353
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ClientForm, never>;
|
|
333
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ClientForm, "mt-client-form", never, { "moduleKey": { "alias": "moduleKey"; "required": true; "isSignal": true; }; "operationKey": { "alias": "operationKey"; "required": true; "isSignal": true; }; "moduleId": { "alias": "moduleId"; "required": false; "isSignal": true; }; "levelId": { "alias": "levelId"; "required": false; "isSignal": true; }; "levelDataId": { "alias": "levelDataId"; "required": false; "isSignal": true; }; "moduleDataId": { "alias": "moduleDataId"; "required": false; "isSignal": true; }; "requestSchemaId": { "alias": "requestSchemaId"; "required": false; "isSignal": true; }; "draftProcessId": { "alias": "draftProcessId"; "required": false; "isSignal": true; }; "preview": { "alias": "preview"; "required": false; "isSignal": true; }; "returnUrl": { "alias": "returnUrl"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "autoLoad": { "alias": "autoLoad"; "required": false; "isSignal": true; }; "formMode": { "alias": "formMode"; "required": false; "isSignal": true; }; "lang": { "alias": "lang"; "required": false; "isSignal": true; }; "lookups": { "alias": "lookups"; "required": false; "isSignal": true; }; }, { "loaded": "loaded"; "submitted": "submitted"; "errored": "errored"; "modeDetected": "modeDetected"; "formSourceDetected": "formSourceDetected"; }, never, never, true, never>;
|
|
354
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ClientForm, "mt-client-form", never, { "moduleKey": { "alias": "moduleKey"; "required": true; "isSignal": true; }; "operationKey": { "alias": "operationKey"; "required": true; "isSignal": true; }; "moduleId": { "alias": "moduleId"; "required": false; "isSignal": true; }; "levelId": { "alias": "levelId"; "required": false; "isSignal": true; }; "levelDataId": { "alias": "levelDataId"; "required": false; "isSignal": true; }; "moduleDataId": { "alias": "moduleDataId"; "required": false; "isSignal": true; }; "requestSchemaId": { "alias": "requestSchemaId"; "required": false; "isSignal": true; }; "draftProcessId": { "alias": "draftProcessId"; "required": false; "isSignal": true; }; "preview": { "alias": "preview"; "required": false; "isSignal": true; }; "returnUrl": { "alias": "returnUrl"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "autoLoad": { "alias": "autoLoad"; "required": false; "isSignal": true; }; "formMode": { "alias": "formMode"; "required": false; "isSignal": true; }; "renderMode": { "alias": "renderMode"; "required": false; "isSignal": true; }; "showInternalStepActions": { "alias": "showInternalStepActions"; "required": false; "isSignal": true; }; "lang": { "alias": "lang"; "required": false; "isSignal": true; }; "lookups": { "alias": "lookups"; "required": false; "isSignal": true; }; }, { "loaded": "loaded"; "submitted": "submitted"; "errored": "errored"; "modeDetected": "modeDetected"; "formSourceDetected": "formSourceDetected"; }, never, never, true, never>;
|
|
334
355
|
}
|
|
335
356
|
|
|
336
357
|
/**
|
|
@@ -7,6 +7,8 @@ declare class DynamicForm implements OnDestroy, ControlValueAccessor, Validator
|
|
|
7
7
|
private fb;
|
|
8
8
|
private readonly formulaEngine;
|
|
9
9
|
readonly formConfig: _angular_core.InputSignal<DynamicFormConfig>;
|
|
10
|
+
readonly forcedHiddenFieldKeys: _angular_core.InputSignal<string[]>;
|
|
11
|
+
readonly preserveForcedHiddenValues: _angular_core.InputSignal<boolean>;
|
|
10
12
|
readonly runtimeMessagesChange: _angular_core.OutputEmitterRef<FormulaRuntimeMessage[]>;
|
|
11
13
|
form: FormGroup<{}>;
|
|
12
14
|
private formBuilt;
|
|
@@ -52,7 +54,7 @@ declare class DynamicForm implements OnDestroy, ControlValueAccessor, Validator
|
|
|
52
54
|
private getColSpanStyleValue;
|
|
53
55
|
ngOnDestroy(): void;
|
|
54
56
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DynamicForm, never>;
|
|
55
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<DynamicForm, "mt-dynamic-form", never, { "formConfig": { "alias": "formConfig"; "required": true; "isSignal": true; }; }, { "runtimeMessagesChange": "runtimeMessagesChange"; }, never, never, true, never>;
|
|
57
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<DynamicForm, "mt-dynamic-form", never, { "formConfig": { "alias": "formConfig"; "required": true; "isSignal": true; }; "forcedHiddenFieldKeys": { "alias": "forcedHiddenFieldKeys"; "required": false; "isSignal": true; }; "preserveForcedHiddenValues": { "alias": "preserveForcedHiddenValues"; "required": false; "isSignal": true; }; }, { "runtimeMessagesChange": "runtimeMessagesChange"; }, never, never, true, never>;
|
|
56
58
|
}
|
|
57
59
|
|
|
58
60
|
export { DynamicForm };
|