@wemake4u/form-player 2.0.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"wemake4u-form-player.mjs","names":[],"sources":["../../../projects/form-player/src/lib/utils/FormGroupEx.ts","../../../projects/form-player/src/lib/utils/FormArrayEx.ts","../../../projects/form-player/src/lib/utils/feelable.ts","../../../projects/form-player/src/lib/utils/CallbackRegistry.ts","../../../projects/form-player/src/lib/locale/locale-it.ts","../../../projects/form-player/src/lib/locale/locale-en.ts","../../../projects/form-player/src/lib/locale/locale-de.ts","../../../projects/form-player/src/lib/locale/locale-fr.ts","../../../projects/form-player/src/lib/locale/locale-es.ts","../../../projects/form-player/src/lib/locale/locale-pt.ts","../../../projects/form-player/src/lib/locale/locale.ts","../../../projects/form-player/src/lib/locale/localize.ts","../../../projects/form-player/src/lib/utils/notifier.ts","../../../projects/form-player/src/lib/utils/proxy.ts","../../../projects/form-player/src/lib/utils/cacheControl.ts","../../../projects/form-player/src/lib/utils/string.ts","../../../projects/form-player/src/lib/services/global.service.ts","../../../projects/form-player/src/lib/services/feel.service.ts","../../../projects/form-player/src/lib/services/weak.service.ts","../../../projects/form-player/src/lib/utils/bound.ts","../../../projects/form-player/src/lib/services/toast.service.ts","../../../projects/form-player/src/lib/dialog/dialog.component.ts","../../../projects/form-player/src/lib/dialog/dialog.component.html","../../../projects/form-player/src/lib/services/dialog.service.ts","../../../projects/form-player/src/lib/services/formatter.service.ts","../../../projects/form-player/src/lib/services/json.service.ts","../../../projects/form-player/src/lib/utils/uuid.ts","../../../projects/form-player/src/lib/utils/window.ts","../../../projects/form-player/src/lib/services/metadata.service.ts","../../../projects/form-player/src/lib/services/function.service.ts","../../../projects/form-player/src/lib/common/path.ts","../../../projects/form-player/src/lib/services/form.service.ts","../../../projects/form-player/src/lib/services/subscribe.service.ts","../../../projects/form-player/src/lib/services/session.service.ts","../../../projects/form-player/src/lib/services/navigation.service.ts","../../../projects/form-player/src/lib/services/state.service.ts","../../../projects/form-player/src/lib/controls/control.ts","../../../projects/form-player/src/lib/services/register.service.ts","../../../projects/form-player/src/lib/utils/signal.ts","../../../projects/form-player/src/lib/services/scope.service.ts","../../../projects/form-player/src/lib/services/programmability.service.ts","../../../projects/form-player/src/lib/services/validation.service.ts","../../../projects/form-player/src/lib/services/disable.service.ts","../../../projects/form-player/src/lib/services/compute.service.ts","../../../projects/form-player/src/lib/services/status.service.ts","../../../projects/form-player/src/lib/services/event.service.ts","../../../projects/form-player/src/lib/services/lifetime.service.ts","../../../projects/form-player/src/lib/services/builder.service.ts","../../../projects/form-player/src/lib/utils/groupByRow.ts","../../../projects/form-player/src/lib/components/objectURLRenderer/objectURLRenderer.component.ts","../../../projects/form-player/src/lib/components/objectURLRenderer/objectURLRenderer.component.html","../../../projects/form-player/src/lib/components/deleteRowRenderer/deleteRowRenderer.component.ts","../../../projects/form-player/src/lib/components/deleteRowRenderer/deleteRowRenderer.component.html","../../../projects/form-player/src/lib/components/actionsCellRenderer/actionsCellRenderer.component.ts","../../../projects/form-player/src/lib/components/actionsCellRenderer/actionsCellRenderer.component.html","../../../projects/form-player/src/lib/common/symbols.ts","../../../projects/form-player/src/lib/common/record.ts","../../../projects/form-player/src/lib/components/setFilter/setFilter.component.ts","../../../projects/form-player/src/lib/components/setFilter/setfilter.component.html","../../../projects/form-player/src/lib/components/hostCellRenderer/hostCellRenderer.component.ts","../../../projects/form-player/src/lib/components/hostCellRenderer/hostCellRenderer.component.html","../../../projects/form-player/src/lib/utils/focusable.ts","../../../projects/form-player/src/lib/services/markdown.service.ts","../../../projects/form-player/src/lib/services/grid.service.ts","../../../projects/form-player/src/lib/utils/observableAll.ts","../../../projects/form-player/src/lib/services/chart.service.ts","../../../projects/form-player/src/lib/directives/readonly.directive.ts","../../../projects/form-player/src/lib/services/cache.service.ts","../../../projects/form-player/src/lib/directives/recursion.directive.ts","../../../projects/form-player/src/lib/directives/framesecurity.directive.ts","../../../projects/form-player/src/lib/directives/grid.directive.ts","../../../projects/form-player/src/lib/directives/change.directive.ts","../../../projects/form-player/src/lib/controls/form.ts","../../../projects/form-player/src/lib/controls/textfield.ts","../../../projects/form-player/src/lib/controls/select.ts","../../../projects/form-player/src/lib/controls/taglist.ts","../../../projects/form-player/src/lib/controls/number.ts","../../../projects/form-player/src/lib/controls/date.ts","../../../projects/form-player/src/lib/controls/time.ts","../../../projects/form-player/src/lib/controls/datetime.ts","../../../projects/form-player/src/lib/controls/checkbox.ts","../../../projects/form-player/src/lib/controls/radio.ts","../../../projects/form-player/src/lib/controls/checklist.ts","../../../projects/form-player/src/lib/controls/textarea.ts","../../../projects/form-player/src/lib/controls/range.ts","../../../projects/form-player/src/lib/controls/filepicker.ts","../../../projects/form-player/src/lib/controls/text.ts","../../../projects/form-player/src/lib/controls/html.ts","../../../projects/form-player/src/lib/controls/image.ts","../../../projects/form-player/src/lib/controls/tab.ts","../../../projects/form-player/src/lib/controls/chart.ts","../../../projects/form-player/src/lib/controls/accordion.ts","../../../projects/form-player/src/lib/controls/dynamiclist.ts","../../../projects/form-player/src/lib/controls/group.ts","../../../projects/form-player/src/lib/utils/observable.ts","../../../projects/form-player/src/lib/controls/table.ts","../../../projects/form-player/src/lib/controls/button.ts","../../../projects/form-player/src/lib/controls/separator.ts","../../../projects/form-player/src/lib/controls/spacer.ts","../../../projects/form-player/src/lib/controls/iframe.ts","../../../projects/form-player/src/lib/controls/tooltip.ts","../../../projects/form-player/src/lib/controls/displayfield.ts","../../../projects/form-player/src/lib/controls/navigator.ts","../../../projects/form-player/src/lib/controls/treerlist.ts","../../../projects/form-player/src/lib/controls/factory.ts","../../../projects/form-player/src/lib/directives/register.directive.ts","../../../projects/form-player/src/lib/directives/refresh.directive.ts","../../../projects/form-player/src/lib/directives/navigator.directive.ts","../../../projects/form-player/src/lib/services/listener.service.ts","../../../projects/form-player/src/lib/directives/collapse.directive.ts","../../../projects/form-player/src/lib/directives/treelist.directive.ts","../../../projects/form-player/src/lib/directives/file.directive.ts","../../../projects/form-player/src/lib/directives/jsonfile.directive.ts","../../../projects/form-player/src/lib/directives/attrs.directive.ts","../../../projects/form-player/src/lib/directives/required.directive.ts","../../../projects/form-player/src/lib/directives/requiredblur.directive.ts","../../../projects/form-player/src/lib/directives/markdown.directive.ts","../../../projects/form-player/src/lib/directives/selection.directive.ts","../../../projects/form-player/src/lib/dynamic-host/dynamic-host.component.ts","../../../projects/form-player/src/lib/dynamic-host/dynamic-host.component.html","../../../projects/form-player/src/lib/utils/isMeaningful.ts","../../../projects/form-player/src/lib/utils/flatten.ts","../../../projects/form-player/src/lib/utils/typeGuards.ts","../../../projects/form-player/src/lib/services/sirio-validation-presenter.ts","../../../projects/form-player/src/lib/services/sanitize.service.ts","../../../projects/form-player/src/lib/services/mime.service.ts","../../../projects/form-player/src/lib/services/autofocus.service.ts","../../../projects/form-player/src/lib/dynamic-fields/dynamic-fields.component.ts","../../../projects/form-player/src/lib/dynamic-fields/dynamic-fields.component.html","../../../projects/form-player/src/lib/utils/sanitize-css.ts","../../../projects/form-player/src/lib/directives/style.directive.ts","../../../projects/form-player/src/lib/dynamic-form/dynamic-form.component.ts","../../../projects/form-player/src/lib/dynamic-form/dynamic-form.component.html","../../../projects/form-player/src/lib/utils/syncronize.ts","../../../projects/form-player/src/lib/utils/resolveRefs.ts","../../../projects/form-player/src/lib/utils/deepEqual.ts","../../../projects/form-player/src/lib/utils/navigation.ts","../../../projects/form-player/src/lib/dataSources/odata.ts","../../../projects/form-player/src/lib/dataSources/rest.ts","../../../projects/form-player/src/lib/services/data.service.ts","../../../projects/form-player/src/lib/interact/confirmation.ts","../../../projects/form-player/src/lib/interact/notification.ts","../../../projects/form-player/src/lib/interact/prompt.ts","../../../projects/form-player/src/lib/interact/message.ts","../tmp-esm2022/lib/builtIn/console.json","../tmp-esm2022/lib/builtIn/formGroup.json","../tmp-esm2022/lib/builtIn/dialog.json","../tmp-esm2022/lib/builtIn/function.json","../tmp-esm2022/lib/builtIn/formatter.json","../tmp-esm2022/lib/builtIn/register.json","../tmp-esm2022/lib/builtIn/form.json","../tmp-esm2022/lib/builtIn/feel.json","../tmp-esm2022/lib/builtIn/json.json","../tmp-esm2022/lib/builtIn/cache.json","../tmp-esm2022/lib/builtIn/nav.json","../../../projects/form-player/src/lib/builtIn/builtIn.ts"],"sourcesContent":["import { AbstractControl, AbstractControlOptions, AsyncValidatorFn, FormGroup, ValidatorFn } from \"@angular/forms\";\r\nimport { Subscription } from \"rxjs\";\r\n\r\nexport class FormGroupEx<\r\n TControl extends { [K in keyof TControl]: AbstractControl<any> }\r\n> extends FormGroup<TControl> {\r\n\r\n constructor(\r\n controls: TControl,\r\n mode: FormGroupMode,\r\n validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null,\r\n asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null\r\n ) {\r\n super(controls, validatorOrOpts, asyncValidator);\r\n this.mode = mode;\r\n }\r\n\r\n getMode() : FormGroupMode {\r\n return this.mode;\r\n }\r\n\r\n isNull(): boolean {\r\n return this.__isNull;\r\n }\r\n\r\n setNull(): void {\r\n this.setNullValue();\r\n }\r\n\r\n setNotNull(): void {\r\n this.clearNullValue();\r\n }\r\n\r\n private __isNull = false;\r\n private sub?: Subscription;\r\n private mode: FormGroupMode;\r\n\r\n private setNullValue(): void {\r\n if (this.__isNull) return;\r\n\r\n this.__isNull = true;\r\n this.reset({});\r\n\r\n this.sub = this.valueChanges.subscribe(() => {\r\n if (this.dirty)\r\n this.clearNullValue();\r\n });\r\n\r\n this.updateValueAndValidity({ emitEvent: false });\r\n }\r\n\r\n private clearNullValue(): void {\r\n if (!this.__isNull) return;\r\n\r\n this.__isNull = false;\r\n\r\n this.sub?.unsubscribe();\r\n this.sub = undefined;\r\n\r\n this.updateValueAndValidity({ emitEvent: false });\r\n }\r\n\r\n protected _updateValue(): void {\r\n (FormGroup.prototype as any)._updateValue.call(this);\r\n if (this.__isNull) {\r\n (this as any).value = null;\r\n }\r\n }\r\n}\r\n\r\nexport type FormGroupMode = 'default' | 'nullable';\r\n\r\nexport function isNullableGroup(\r\n control: AbstractControl\r\n): control is FormGroupEx<any> {\r\n return control instanceof FormGroupEx\r\n && control.getMode() === \"nullable\";\r\n}\r\n","import {\r\n AbstractControl,\r\n AsyncValidatorFn,\r\n FormArray,\r\n ValidatorFn\r\n} from '@angular/forms';\r\n\r\nimport { Subject } from 'rxjs';\r\n\r\nexport type FormArrayChangeType =\r\n | 'add'\r\n | 'adding'\r\n | 'remove'\r\n | 'removing';\r\n\r\nexport interface FormArrayChange<TControl extends AbstractControl = AbstractControl> {\r\n type: FormArrayChangeType ;\r\n control: TControl;\r\n index: number;\r\n}\r\n\r\nexport class FormArrayEx<TControl extends AbstractControl = AbstractControl>\r\n extends FormArray<TControl> {\r\n\r\n readonly controlsChanges =\r\n new Subject<FormArrayChange<TControl>>();\r\n\r\n constructor(\r\n controls: TControl[],\r\n validatorOrOpts?: ValidatorFn | ValidatorFn[] | null,\r\n asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null\r\n ) {\r\n super(controls, validatorOrOpts, asyncValidator);\r\n }\r\n\r\n override push(control: TControl, options?: { emitEvent?: boolean; }): void {\r\n const index = this.length - 1;\r\n this.notify('adding', index, control);\r\n super.push(control, options);\r\n this.notify('add', index, control);\r\n }\r\n\r\n override insert(index: number, control: TControl, options?: { emitEvent?: boolean; }): void {\r\n this.notify('adding', index, control);\r\n super.insert(index, control, options);\r\n this.notify('add', index, control);\r\n }\r\n\r\n override removeAt(index: number, options?: { emitEvent?: boolean; }): void {\r\n const control = this.at(index) as TControl;\r\n this.notify('removing', index, control);\r\n super.removeAt(index, options);\r\n this.notify('remove', index, control);\r\n }\r\n\r\n override clear(): void {\r\n\r\n while (this.length > 0) {\r\n this.removeAt(0);\r\n }\r\n }\r\n\r\n moveUp(index: number): boolean {\r\n\r\n if (index <= 0 || index >= this.length)\r\n return false;\r\n\r\n const control: TControl = this.at(index) as TControl;\r\n super.removeAt(index);\r\n super.insert(index - 1, control);\r\n\r\n return true;\r\n }\r\n\r\n moveDown(index: number): boolean {\r\n if (index < 0 || index >= this.length - 1) return false;\r\n\r\n const control: TControl = this.at(index) as TControl;\r\n super.removeAt(index);\r\n super.insert(index + 1, control);\r\n\r\n return true;\r\n }\r\n\r\n resize(newSize: number, factory: () => TControl): void {\r\n\r\n while (this.length > newSize) {\r\n this.removeAt(this.length - 1, { emitEvent: false });\r\n }\r\n\r\n while (this.length < newSize) {\r\n this.push(factory(), { emitEvent: false });\r\n }\r\n\r\n this.updateValueAndValidity({ emitEvent: true });\r\n }\r\n\r\n private notify(type: FormArrayChangeType, index: number, control: TControl) {\r\n this.controlsChanges.next({\r\n type: type,\r\n control,\r\n index\r\n });\r\n }\r\n}\r\n","export function toExpression(value: any): string {\r\n return \"=\" + toFeelable(value);\r\n}\r\n\r\nexport function toFeelable(value: any): string {\r\n if (value === null || typeof value === 'number' || typeof value === 'boolean') {\r\n return JSON.stringify(value);\r\n }\r\n\r\n if (typeof value === 'string') {\r\n if (value.startsWith('=')) {\r\n return value.substring(1);\r\n } else {\r\n return JSON.stringify(value);\r\n }\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n const items = value.map(item => toFeelable(item));\r\n return `[${items.join(', ')}]`;\r\n }\r\n\r\n if (typeof value === 'object') {\r\n const entries = Object.entries(value).map(([key, val]) => {\r\n return `\"${key}\": ${toFeelable(val)}`;\r\n });\r\n return `{ ${entries.join(', ')} }`;\r\n }\r\n\r\n return JSON.stringify(null);\r\n}\r\n","export class CallbackRegistry {\r\n private callbacks: (() => void)[] = [];\r\n\r\n register(callback: () => void) {\r\n if (callback)\r\n this.callbacks.push(callback);\r\n }\r\n\r\n clear() {\r\n this.callbacks = [];\r\n }\r\n\r\n invoke() {\r\n for (const cb of this.callbacks) {\r\n cb();\r\n }\r\n }\r\n}\r\n","export const Texts = {\r\n TypeToSearch: \"Digita per cercare...\",\r\n Upload: \"Upload\",\r\n ScrollLeft: \"Scorri a sinistra\",\r\n ScrollRight: \"Scorri a destra\",\r\n AddItem: \"Aggiungi\",\r\n RemoveItem: \"Rimuovi\",\r\n PreviousSection: \"Sezione precedente\",\r\n NextSection: \"Sezione successiva\",\r\n Show: \"Visualizza\",\r\n Remove: \"Rimuovi\",\r\n Close: \"Chiudi\",\r\n Confirm: \"Conferma\",\r\n OK: \"OK\",\r\n Cancel: \"Annulla\",\r\n Abort: \"Interrompi\",\r\n Retry: \"Riprova\",\r\n Ignore: \"Ignora\",\r\n Yes: \"Sì\",\r\n No: \"No\",\r\n Try: \"Prova\",\r\n Continue: \"Continua\",\r\n Name: \"Nome\",\r\n Size: \"Dimensione\",\r\n Type: \"Tipo\",\r\n Actions: \"Azioni\",\r\n ReadMore: \"Leggi di più\",\r\n ReadLess: \"Leggi di meno\",\r\n SelectAll: \"Seleziona tutto\",\r\n ChooseOne: \"Scegli uno\",\r\n True: \"Vero\",\r\n False: \"Falso\",\r\n Blank: \"Vuoto\",\r\n NotBlank: \"Non vuoto\",\r\n Information: \"Informazioni\",\r\n InformationAbout: \"Informazioni su\",\r\n OpenMenu: \"Apri Menu\",\r\n CloseMenu: \"Chiudi Menu\",\r\n LoadingFailed: \"Si è verificato un errore durante il caricamento dei dati\",\r\n ConfirmDelete: \"Confermi l’eliminazione ?\\r\\nL’operazione non può essere annullata\",\r\n MoveUp: \"Sposta Sù\",\r\n MoveDown: \"Sposta Giù\",\r\n NoData: \"Nessun dato da mostrare\",\r\n RequiredField: \"Campo obbligatorio\",\r\n Errors: \"errori\",\r\n PreviousElement: \"Elemento precedente\",\r\n NextElement: \"Elemento successivo\",\r\n Elements: \"Elementi\",\r\n Element: \"Elemento\",\r\n GoToElement: \"Vai all'elemento\",\r\n ElementsNavigation: \"Navigazione degli elementi\",\r\n Of: \"di\",\r\n Download: \"Scarica\",\r\n Uploading: \"Caricamento in corso\",\r\n Downloading: \"Scaricamento in corso\",\r\n Deleting: \"Eliminazione in corso\",\r\n Selected: \"Selezionato\",\r\n SelectedPlural: \"Selezionati\",\r\n SomethingWentWrong: \"Si è verificato un problema\",\r\n TimeoutOccurred: \"Il server non ha risposto in tempo. Riprova tra qualche istante\",\r\n GenericError: \"Si è verificato un errore imprevisto\"\r\n};\r\n","export const Texts = {\r\n TypeToSearch: \"Type to search...\",\r\n Upload: \"Upload\",\r\n ScrollLeft: \"Scroll left\",\r\n ScrollRight: \"Scroll right\",\r\n AddItem: \"Add\",\r\n RemoveItem: \"Remove\",\r\n PreviousSection: \"Previous section\",\r\n NextSection: \"Next section\",\r\n Show: \"Show\",\r\n Remove: \"Remove\",\r\n Close: \"Close\",\r\n Confirm: \"Confirm\",\r\n OK: \"OK\",\r\n Cancel: \"Cancel\",\r\n Abort: \"Abort\",\r\n Retry: \"Retry\",\r\n Ignore: \"Ignore\",\r\n Yes: \"Yes\",\r\n No: \"No\",\r\n Try: \"Try\",\r\n Continue: \"Continue\",\r\n Name: \"Name\",\r\n Size: \"Size\",\r\n Type: \"Type\",\r\n Actions: \"Actions\",\r\n ReadMore: \"Read more\",\r\n ReadLess: \"Read less\",\r\n SelectAll: \"Select all\",\r\n ChooseOne: \"Choose one\",\r\n True: \"True\",\r\n False: \"False\",\r\n Blank: \"Blank\",\r\n NotBlank: \"Not blank\",\r\n Information: \"Information\",\r\n InformationAbout: \"Information about\",\r\n OpenMenu: \"Open menu\",\r\n CloseMenu: \"Close menu\",\r\n LoadingFailed: \"An error occurred while loading data\",\r\n ConfirmDelete: \"Do you confirm the deletion?\\r\\nThis action cannot be undone\",\r\n MoveUp: \"Move Up\",\r\n MoveDown: \"Move Down\",\r\n NoData: \"No data to display\",\r\n RequiredField: \"Required field\",\r\n Errors: \"errors\",\r\n PreviousElement: \"Previous element\",\r\n NextElement: \"Next element\",\r\n Elements: \"Elements\",\r\n Element: \"Element\",\r\n GoToElement: \"Go to element\",\r\n ElementsNavigation: \"Elements navigation\",\r\n Of: \"of\",\r\n Download: \"Download\",\r\n Uploading: \"Uploading\",\r\n Downloading: \"Downloading\",\r\n Deleting: \"Deleting\",\r\n Selected: \"Selected\",\r\n SelectedPlural: \"Selected\",\r\n SomethingWentWrong: \"Something went wrong\",\r\n TimeoutOccurred: \"The server did not respond in time. Please try again in a few moments\",\r\n GenericError: \"An unexpected error occurred\"\r\n};\r\n","export const Texts = {\r\n TypeToSearch: \"Zum Suchen tippen...\",\r\n Upload: \"Hochladen\",\r\n ScrollLeft: \"Nach links scrollen\",\r\n ScrollRight: \"Nach rechts scrollen\",\r\n AddItem: \"Hinzufügen\",\r\n RemoveItem: \"Entfernen\",\r\n PreviousSection: \"Vorheriger Abschnitt\",\r\n NextSection: \"Nächster Abschnitt\",\r\n Show: \"Anzeigen\",\r\n Remove: \"Entfernen\",\r\n Close: \"Schließen\",\r\n Confirm: \"Bestätigen\",\r\n OK: \"OK\",\r\n Cancel: \"Abbrechen\",\r\n Abort: \"Abbrechen\",\r\n Retry: \"Wiederholen\",\r\n Ignore: \"Ignorieren\",\r\n Yes: \"Ja\",\r\n No: \"Nein\",\r\n Try: \"Versuchen\",\r\n Continue: \"Fortsetzen\",\r\n Name: \"Name\",\r\n Size: \"Größe\",\r\n Type: \"Typ\",\r\n Actions: \"Aktionen\",\r\n ReadMore: \"Mehr lesen\",\r\n ReadLess: \"Weniger lesen\",\r\n SelectAll: \"Alles auswählen\",\r\n ChooseOne: \"Wähle eine Option\",\r\n True: \"Wahr\",\r\n False: \"Falsch\",\r\n Blank: \"Leer\",\r\n NotBlank: \"Nicht leer\",\r\n Information: \"Informationen\",\r\n InformationAbout: \"Informationen zu\",\r\n OpenMenu: \"Menü öffnen\",\r\n CloseMenu: \"Menü schließen\",\r\n LoadingFailed: \"Beim Laden der Daten ist ein Fehler aufgetreten\",\r\n ConfirmDelete: \"Möchten Sie das Löschen bestätigen?\\r\\nDieser Vorgang kann nicht rückgängig gemacht werden\",\r\n MoveUp: \"Nach oben verschieben\",\r\n MoveDown: \"Nach unten verschieben\",\r\n NoData: \"Keine Daten zum Anzeigen\",\r\n RequiredField: \"Pflichtfeld\",\r\n Errors: \"Fehler\",\r\n PreviousElement: \"Vorheriges Element\",\r\n NextElement: \"Nächstes Element\",\r\n Elements: \"Elemente\",\r\n Element: \"Element\",\r\n GoToElement: \"Gehe zu Element\",\r\n ElementsNavigation: \"Elementnavigation\",\r\n Of: \"von\",\r\n Download: \"Herunterladen\",\r\n Uploading: \"Wird hochgeladen\",\r\n Downloading: \"Wird heruntergeladen\",\r\n Deleting: \"Wird gelöscht\",\r\n Selected: \"Ausgewählt\",\r\n SelectedPlural: \"Ausgewählt\",\r\n SomethingWentWrong: \"Etwas ist schiefgelaufen\",\r\n TimeoutOccurred: \"Der Server hat nicht rechtzeitig geantwortet. Bitte versuchen Sie es in wenigen Augenblicken erneut\",\r\n GenericError: \"Ein unerwarteter Fehler ist aufgetreten\"\r\n};\r\n","export const Texts = {\r\n TypeToSearch: \"Tapez pour rechercher...\",\r\n Upload: \"Téléverser\",\r\n ScrollLeft: \"Faire défiler vers la gauche\",\r\n ScrollRight: \"Faire défiler vers la droite\",\r\n AddItem: \"Ajouter\",\r\n RemoveItem: \"Supprimer\",\r\n PreviousSection: \"Section précédente\",\r\n NextSection: \"Section suivante\",\r\n Show: \"Afficher\",\r\n Remove: \"Supprimer\",\r\n Close: \"Fermer\",\r\n Confirm: \"Confirmer\",\r\n OK: \"OK\",\r\n Cancel: \"Annuler\",\r\n Abort: \"Abandonner\",\r\n Retry: \"Réessayer\",\r\n Ignore: \"Ignorer\",\r\n Yes: \"Oui\",\r\n No: \"Non\",\r\n Try: \"Essayer\",\r\n Continue: \"Continuer\",\r\n Name: \"Nom\",\r\n Size: \"Taille\",\r\n Type: \"Type\",\r\n Actions: \"Actions\",\r\n ReadMore: \"Lire la suite\",\r\n ReadLess: \"Lire moins\",\r\n SelectAll: \"Tout sélectionner\",\r\n ChooseOne: \"Choisir un\",\r\n True: \"Vrai\",\r\n False: \"Faux\",\r\n Blank: \"Vide\",\r\n NotBlank: \"Non vide\",\r\n Information: \"Informations\",\r\n InformationAbout: \"Informations sur\",\r\n OpenMenu: \"Ouvrir le menu\",\r\n CloseMenu: \"Fermer le menu\",\r\n LoadingFailed: \"Erreur lors du chargement des données\",\r\n ConfirmDelete: \"Confirmez-vous la suppression ?\\r\\nCette action ne peut pas être annulée\",\r\n MoveUp: \"Déplacer vers le haut\",\r\n MoveDown: \"Déplacer vers le bas\",\r\n NoData: \"Aucune donnée à afficher\",\r\n RequiredField: \"Champ obligatoire\",\r\n Errors: \"erreurs\",\r\n PreviousElement: \"Élément précédent\",\r\n NextElement: \"Élément suivant\",\r\n Elements: \"Éléments\",\r\n Element: \"Élément\",\r\n GoToElement: \"Aller à l'élément\",\r\n ElementsNavigation: \"Navigation des éléments\",\r\n Of: \"de\",\r\n Download: \"Télécharger\",\r\n Uploading: \"Envoi en cours\",\r\n Downloading: \"Téléchargement en cours\",\r\n Deleting: \"Suppression en cours\",\r\n Selected: \"Sélectionné\",\r\n SelectedPlural: \"Sélectionnés\",\r\n SomethingWentWrong: \"Une erreur s'est produite\",\r\n TimeoutOccurred: \"Le serveur n'a pas répondu à temps. Veuillez réessayer dans quelques instants\",\r\n GenericError: \"Une erreur inattendue s'est produite\"\r\n};\r\n","export const Texts = {\r\n TypeToSearch: \"Escribe para buscar...\",\r\n Upload: \"Subir\",\r\n ScrollLeft: \"Desplazar a la izquierda\",\r\n ScrollRight: \"Desplazar a la derecha\",\r\n AddItem: \"Agregar\",\r\n RemoveItem: \"Eliminar\",\r\n PreviousSection: \"Sección anterior\",\r\n NextSection: \"Sección siguiente\",\r\n Show: \"Mostrar\",\r\n Remove: \"Eliminar\",\r\n Close: \"Cerrar\",\r\n Confirm: \"Confirmar\",\r\n OK: \"OK\",\r\n Cancel: \"Cancelar\",\r\n Abort: \"Abortar\",\r\n Retry: \"Reintentar\",\r\n Ignore: \"Ignorar\",\r\n Yes: \"Sí\",\r\n No: \"No\",\r\n Try: \"Intentar\",\r\n Continue: \"Continuar\",\r\n Name: \"Nombre\",\r\n Size: \"Tamaño\",\r\n Type: \"Tipo\",\r\n Actions: \"Acciones\",\r\n ReadMore: \"Leer más\",\r\n ReadLess: \"Leer menos\",\r\n SelectAll: \"Seleccionar todo\",\r\n ChooseOne: \"Elige uno\",\r\n True: \"Verdadero\",\r\n False: \"Falso\",\r\n Blank: \"Vacío\",\r\n NotBlank: \"No vacío\",\r\n Information: \"Información\",\r\n InformationAbout: \"Información sobre\",\r\n OpenMenu: \"Abrir menú\",\r\n CloseMenu: \"Cerrar menú\",\r\n LoadingFailed: \"Error al cargar los datos\",\r\n ConfirmDelete: \"¿Confirma la eliminación?\\r\\nEsta acción no se puede deshacer\",\r\n MoveUp: \"Mover arriba\",\r\n MoveDown: \"Mover abajo\",\r\n NoData: \"No hay datos para mostrar\",\r\n RequiredField: \"Campo obligatorio\",\r\n Errors: \"errores\",\r\n PreviousElement: \"Elemento anterior\",\r\n NextElement: \"Elemento siguiente\",\r\n Elements: \"Elementos\",\r\n Element: \"Elemento\",\r\n GoToElement: \"Ir al elemento\",\r\n ElementsNavigation: \"Navegación de elementos\",\r\n Of: \"de\",\r\n Download: \"Descargar\",\r\n Uploading: \"Subiendo\",\r\n Downloading: \"Descargando\",\r\n Deleting: \"Eliminando\",\r\n Selected: \"Seleccionado\",\r\n SelectedPlural: \"Seleccionados\",\r\n SomethingWentWrong: \"Algo salió mal\",\r\n TimeoutOccurred: \"El servidor no respondió a tiempo. Inténtalo de nuevo en unos instantes\",\r\n GenericError: \"Se produjo un error inesperado\"\r\n};\r\n","export const Texts = {\r\n TypeToSearch: \"Digite para pesquisar...\",\r\n Upload: \"Enviar\",\r\n ScrollLeft: \"Rolar para a esquerda\",\r\n ScrollRight: \"Rolar para a direita\",\r\n AddItem: \"Adicionar\",\r\n RemoveItem: \"Remover\",\r\n PreviousSection: \"Seção anterior\",\r\n NextSection: \"Próxima seção\",\r\n Show: \"Mostrar\",\r\n Remove: \"Remover\",\r\n Close: \"Fechar\",\r\n Confirm: \"Confirmar\",\r\n OK: \"OK\",\r\n Cancel: \"Cancelar\",\r\n Abort: \"Abortar\",\r\n Retry: \"Tentar novamente\",\r\n Ignore: \"Ignorar\",\r\n Yes: \"Sim\",\r\n No: \"Não\",\r\n Try: \"Tentar\",\r\n Continue: \"Continuar\",\r\n Name: \"Nome\",\r\n Size: \"Tamanho\",\r\n Type: \"Tipo\",\r\n Actions: \"Ações\",\r\n ReadMore: \"Leia mais\",\r\n ReadLess: \"Leia menos\",\r\n SelectAll: \"Selecionar tudo\",\r\n ChooseOne: \"Escolha um\",\r\n True: \"Verdadeiro\",\r\n False: \"Falso\",\r\n Blank: \"Vazio\",\r\n NotBlank: \"Não vazio\",\r\n Information: \"Informações\",\r\n InformationAbout: \"Informações sobre\",\r\n OpenMenu: \"Abrir menu\",\r\n CloseMenu: \"Fechar menu\",\r\n LoadingFailed: \"Erro ao carregar os dados\",\r\n ConfirmDelete: \"Confirma a eliminação?\\r\\nEsta ação não pode ser desfeita\",\r\n MoveUp: \"Mover para cima\",\r\n MoveDown: \"Mover para baixo\",\r\n NoData: \"Nenhum dado para exibir\",\r\n RequiredField: \"Campo obrigatório\",\r\n Errors: \"erros\",\r\n PreviousElement: \"Elemento anterior\",\r\n NextElement: \"Próximo elemento\",\r\n Elements: \"Elementos\",\r\n Element: \"Elemento\",\r\n GoToElement: \"Ir para o elemento\",\r\n ElementsNavigation: \"Navegação dos elementos\",\r\n Of: \"de\",\r\n Download: \"Baixar\",\r\n Uploading: \"Enviando\",\r\n Downloading: \"Baixando\",\r\n Deleting: \"Excluindo\",\r\n Selected: \"Selecionado\",\r\n SelectedPlural: \"Selecionados\",\r\n SomethingWentWrong: \"Algo deu errado\",\r\n TimeoutOccurred: \"O servidor não respondeu a tempo. Tente novamente dentro de alguns instantes\",\r\n GenericError: \"Ocorreu um erro inesperado\"\r\n};\r\n","import { Texts as it } from '../locale/locale-it';\r\nimport { Texts as en } from '../locale/locale-en';\r\nimport { Texts as de } from '../locale/locale-de';\r\nimport { Texts as fr } from '../locale/locale-fr';\r\nimport { Texts as es } from '../locale/locale-es';\r\nimport { Texts as pt } from '../locale/locale-pt';\r\n\r\nexport const Texts = {\r\n ...it, // neutral\r\n i18n: {\r\n it: it,\r\n en: en,\r\n de: de,\r\n fr: fr,\r\n es: es,\r\n pt: pt\r\n } \r\n};\r\n","const i18n = \"i18n\";\r\n\r\nexport function localize(language: string, component: any, key: string): string {\r\n const lng = language?.toLowerCase();\r\n if (lng) {\r\n return component[i18n]?.[lng]?.[key]\r\n || component[key]\r\n || \"\";\r\n }\r\n else {\r\n return component[key]\r\n || \"\";\r\n }\r\n}\r\n","import { Observable, Subject } from 'rxjs';\r\n\r\nexport class Notifier<T = void> {\r\n private readonly subject = new Subject<T>();\r\n\r\n readonly changes: Observable<T> = this.subject.asObservable();\r\n\r\n notify(value: T): void {\r\n this.subject.next(value);\r\n }\r\n\r\n complete(): void {\r\n this.subject.complete();\r\n }\r\n}\r\n","import { isSignal } from '@angular/core';\r\n\r\nconst IS_PROXY = Symbol('IS_PROXY');\r\nconst RAW_TARGET = Symbol('RAW_TARGET');\r\n\r\nexport function bindFunction(fn: Function, context: any) {\r\n if (fn.bind && context && fn.prototype !== undefined) {\r\n return fn.bind(context);\r\n }\r\n return (...args: any[]) => fn.apply(context, args);\r\n}\r\n\r\nexport function toProxy(instance: any, seen = new WeakMap()): any { \r\n if (instance === null || typeof instance !== 'object') return instance;\r\n if (instance[IS_PROXY]) return instance;\r\n if (seen.has(instance)) return seen.get(instance);\r\n\r\n const proxy = new Proxy(instance, {\r\n get: (target: any, property: PropertyKey, receiver: any) => {\r\n if (property === IS_PROXY) return true;\r\n if (property === RAW_TARGET) return target;\r\n let value: any;\r\n try {\r\n value = Reflect.get(target, property, receiver);\r\n } catch {\r\n return undefined;\r\n }\r\n\r\n if (typeof property === 'symbol' || property === 'toJSON') return value;\r\n\r\n // Signals (also computed/input) are read: expressions see the current value.\r\n if (isSignal(value)) {\r\n value = value();\r\n }\r\n\r\n if (typeof value === 'function') {\r\n return bindFunction(value, instance);\r\n }\r\n\r\n if (typeof value === 'object' && value !== null) {\r\n if (value instanceof Date || value instanceof RegExp || value instanceof Map || value instanceof Set) {\r\n return value;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n if (seen.has(value)) return seen.get(value);\r\n const arrayProxy = new Proxy(value, {\r\n get(arrTarget, index, arrReceiver) {\r\n if (index === IS_PROXY) return true;\r\n if (index === RAW_TARGET) return arrTarget;\r\n let item = Reflect.get(arrTarget, index, arrReceiver);\r\n if (typeof index !== 'symbol' && isSignal(item)) {\r\n item = item();\r\n }\r\n return typeof item === 'object' && item !== null\r\n ? toProxy(item, seen)\r\n : item;\r\n },\r\n has(arrTarget, key) {\r\n if (key === IS_PROXY || key === RAW_TARGET) return true;\r\n return key in arrTarget;\r\n }\r\n });\r\n seen.set(value, arrayProxy);\r\n return arrayProxy;\r\n }\r\n\r\n return toProxy(value, seen);\r\n }\r\n\r\n return value;\r\n },\r\n has(target, key) {\r\n if (key === IS_PROXY || key === RAW_TARGET) return true;\r\n return key in target;\r\n }\r\n });\r\n\r\n seen.set(instance, proxy);\r\n return proxy;\r\n}\r\n\r\nexport function isProxy(value: any): boolean {\r\n return !!value && typeof value === 'object' && value[IS_PROXY] === true;\r\n}\r\n\r\nexport function getTarget(value: any): any {\r\n if (!isProxy(value)) return value\r\n return value[RAW_TARGET];\r\n}\r\n","import { bindFunction } from '../utils/proxy';\r\n\r\nexport class CacheControl {\r\n\r\n private _volatile = false;\r\n private _ttl?: number;\r\n\r\n public get isVolatile(): boolean {\r\n return this._volatile;\r\n }\r\n\r\n public get ttl(): number | undefined {\r\n return this._ttl;\r\n }\r\n\r\n public volatile<T>(value: T): T {\r\n this._volatile = true;\r\n return value;\r\n }\r\n\r\n public cacheFor<T>(value: T, ttl: number): T {\r\n this._ttl = ttl;\r\n return value;\r\n }\r\n\r\n public configure(context: Record<string, any>): void {\r\n context[\"volatile\"] = bindFunction(this.volatile, this);\r\n context[\"cacheFor\"] = bindFunction(this.cacheFor, this);\r\n }\r\n}\r\n","export function isNullOrEmpty(value: string): boolean {\r\n return value === null\r\n || value === undefined\r\n || (typeof value === 'string' && value.trim() === '');\r\n}\r\n","import { Injectable, Type } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class GlobalService {\r\n\r\n constructor() { }\r\n\r\n clearProperties(): void {\r\n this.properties = {};\r\n }\r\n\r\n setProperties(properties: Record<string, any>): void {\r\n this.properties = { ...this.properties, ...properties };\r\n }\r\n\r\n getProperties(): Record<string, any> {\r\n return this.properties || { };\r\n }\r\n\r\n getProperty(name: string, defaultValue: any = undefined): any {\r\n const properties = this.getProperties();\r\n if (name in properties) {\r\n return properties[name];\r\n }\r\n return defaultValue;\r\n }\r\n\r\n registerComponent(typeName: string, componentType: Type<any>): void {\r\n this.components[typeName] = componentType;\r\n }\r\n\r\n getComponents(): Record<string, Type<any>> {\r\n return this.components || {};\r\n }\r\n\r\n getComponent(typeName: string): Type<any> | null {\r\n return this.getComponents()[typeName] ?? null;\r\n }\r\n \r\n //#region Private Members\r\n\r\n private properties: Record<string, any> = {};\r\n\r\n private components: Record<string, Type<any>> = {};\r\n\r\n //#endregion\r\n}\r\n","/// <reference path=\"../types/typings.d.ts\" />\r\nimport { Injectable } from '@angular/core';\r\nimport { buildSimpleTree, parser, evaluate as evaluateTemplate } from 'feelers';\r\nimport { unaryTest, evaluate, parseExpression, Warning } from 'feelin';\r\nimport { isNullOrEmpty } from '../utils/string';\r\nimport { GlobalService } from '../services/global.service';\r\n\r\nconst PathExpression = \"PathExpression\";\r\nconst VariableName = \"VariableName\";\r\nconst FunctionInvocation = \"FunctionInvocation\";\r\nconst PositionalParameters = \"PositionalParameters\";\r\nconst NamedParameters = \"NamedParameters\";\r\nconst ParameterName = \"ParameterName\";\r\nconst StringLiteral = \"StringLiteral\";\r\nconst NumericLiteral = \"NumericLiteral\";\r\nconst List = \"List\";\r\nconst StatusDependency = \"$status\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FeelService {\r\n\r\n constructor(\r\n private globalService: GlobalService\r\n ) {\r\n this._verbose = this.globalService.getProperty(\"feel-diagnostics\", \"off\") === \"on\";\r\n }\r\n\r\n private _verbose = false;\r\n\r\n get verbose(): boolean {\r\n return this._verbose;\r\n }\r\n\r\n evalTemplate(template: string, context: any = {}): string {\r\n return evaluateTemplate(template, context);\r\n };\r\n\r\n evalExpression(expression: string, context: Record<string, any> = {}): any {\r\n var evaluationResult = evaluate(expression, context);\r\n this.logWarnings(expression, evaluationResult.warnings);\r\n return evaluationResult.value;\r\n };\r\n\r\n evalUnaryTest(expression: string, context: Record<string, any> = {}, input: any = null): boolean | null {\r\n try {\r\n context['?'] = input;\r\n const evaluationResult = unaryTest(expression, context);\r\n this.logWarnings(expression, evaluationResult.warnings);\r\n return evaluationResult.value;\r\n }\r\n finally {\r\n delete context['?'];\r\n }\r\n };\r\n\r\n isValidExpression(expression: string): boolean {\r\n if (isNullOrEmpty(expression)) return true;\r\n try {\r\n evaluate(expression);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n isValidUnaryTest(expression: string): boolean {\r\n if (isNullOrEmpty(expression)) return true;\r\n try {\r\n unaryTest(expression);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n getDependencies(expression: string, context: Record<string, any> = {}): (string | string[])[] {\r\n const dependencies: (string | string[])[] = [];\r\n const uniqueSet = new Set<string>();\r\n const addSet = (text: string) => {\r\n if (uniqueSet.has(text)) {\r\n return false;\r\n }\r\n else {\r\n uniqueSet.add(text);\r\n return true;\r\n }\r\n };\r\n\r\n const nodes: NodeItem[] = [{ type: \"root\", text: expression, children: [], parent: null }];\r\n\r\n const peek = () => {\r\n return nodes.length > 0 ? nodes[nodes.length - 1] : null;\r\n };\r\n\r\n const isAllowedPathExpression = (node: NodeItem): boolean => {\r\n if (node.type === VariableName) {\r\n return true;\r\n }\r\n if (node.type !== PathExpression || !Array.isArray(node.children)) {\r\n return false;\r\n }\r\n return node.children.every(isAllowedPathExpression);\r\n };\r\n\r\n const getPathExpression = (item: NodeItem): string[] => {\r\n if (item.type === VariableName) {\r\n return [item.text];\r\n }\r\n if (item.type === PathExpression) {\r\n return item.children.flatMap(getPathExpression);\r\n }\r\n return [];\r\n };\r\n\r\n parseExpression(expression, context, undefined).iterate({\r\n enter: (node: any) => {\r\n const type = node.name;\r\n const text = expression.substring(node.from, node.to);\r\n const parent = peek();\r\n const item: NodeItem = { type, text, children: [], parent: parent };\r\n if (parent) {\r\n parent.children.push(item);\r\n }\r\n nodes.push(item);\r\n },\r\n leave: (node: any) => {\r\n if (nodes.length > 0) {\r\n const item = nodes.pop();\r\n if (!item) return;\r\n const parent = peek();\r\n\r\n if (item.type === PathExpression) {\r\n const ignore = (parent?.type === FunctionInvocation\r\n || parent?.type === PathExpression\r\n || item.children.length == 0\r\n || !isAllowedPathExpression(item));\r\n if (!ignore) {\r\n const pathExpression = getPathExpression(item);\r\n if (addSet(pathExpression.join('.'))) {\r\n dependencies.push(pathExpression);\r\n }\r\n }\r\n }\r\n else if (item.type === VariableName) {\r\n const ignore = (parent?.type === FunctionInvocation\r\n || parent?.type === PathExpression);\r\n if (!ignore) {\r\n const pathExpression = item.text;\r\n if (addSet(pathExpression)) {\r\n dependencies.push(pathExpression);\r\n } \r\n }\r\n }\r\n else if (item.type === FunctionInvocation) {\r\n const functionName = this.getFunctionName(item, getPathExpression);\r\n if (functionName == \"fn.status\") {\r\n const statusDeps = this.getStatusDependencies(item);\r\n if (statusDeps && addSet(statusDeps.join('.'))) {\r\n dependencies.push(statusDeps);\r\n }\r\n }\r\n else if (functionName == \"session.get\"\r\n || functionName == \"session.remove\" ) {\r\n dependencies.push(\"session\");\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n return dependencies;\r\n }\r\n\r\n getTemplateDependencies(expression: string, context: Record<string, any> = {}): (string | string[])[] {\r\n if (!expression) return [];\r\n\r\n const simpleTree = buildSimpleTree(parser.parse(expression), expression);\r\n\r\n const result: string[] = [];\r\n\r\n function traverse(nodeArray: any[]) {\r\n for (const node of nodeArray) {\r\n if (node.name === 'FeelBlock' && node.content) {\r\n result.push(node.content);\r\n }\r\n if (node.children && node.children.length > 0) {\r\n traverse(node.children);\r\n }\r\n }\r\n }\r\n\r\n traverse([simpleTree]);\r\n\r\n const arrayExpression = `[ ${result.join(', ')} ]`;\r\n\r\n return this.getDependencies(arrayExpression, context);\r\n }\r\n\r\n //#region Private Members\r\n\r\n private findAncestor(node: NodeItem, predicate: (child: NodeItem) => boolean): NodeItem | null {\r\n let current = node.parent;\r\n while (current !== null) {\r\n if (predicate(current)) {\r\n return current;\r\n }\r\n current = current.parent;\r\n }\r\n return null;\r\n }\r\n\r\n private findDescendant(node: NodeItem, predicate: (child: NodeItem) => boolean): NodeItem | null {\r\n for (const child of node.children) {\r\n if (predicate(child)) {\r\n return child;\r\n }\r\n const found = this.findDescendant(child, predicate);\r\n if (found !== null) {\r\n return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private findChild(node: NodeItem, predicate: (child: NodeItem) => boolean): NodeItem | null {\r\n for (const child of node.children) {\r\n if (predicate(child)) {\r\n return child;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private findChildren(node: NodeItem, predicate: (child: NodeItem) => boolean): NodeItem[] {\r\n return node.children.filter(predicate);\r\n }\r\n\r\n private getFunctionName(node: NodeItem, pathResolver: (item: NodeItem) => string[]): string | null {\r\n\r\n const pathExpression = this.findChild(node, (n) => n.type === PathExpression);\r\n if (pathExpression) {\r\n return pathResolver(pathExpression).join('.');\r\n }\r\n\r\n const variableName = this.findChild(node, (n) => n.type === VariableName);\r\n if (variableName) {\r\n return pathResolver(variableName).join('.');\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private getStatusDependencies(node: NodeItem): string[] | null {\r\n if (node.type != FunctionInvocation) return [];\r\n\r\n let pathParameter: NodeItem | null = null;\r\n\r\n const namedParameters = this.findChild(node, (n) => n.type === NamedParameters);\r\n\r\n if (namedParameters) {\r\n const pathName = this.findDescendant(namedParameters, (n) => n.type == ParameterName && n.text === \"path\");\r\n const namedParameter = pathName?.parent;\r\n if (namedParameter && namedParameter.children.length > 1) {\r\n pathParameter = namedParameter.children[1];\r\n } \r\n }\r\n\r\n const positionalParameters = this.findChild(node, (n) => n.type === PositionalParameters);\r\n\r\n if (positionalParameters) {\r\n pathParameter = positionalParameters.children[0];\r\n }\r\n\r\n if (pathParameter) {\r\n\r\n const getPathExpression = (item: NodeItem): string[] => {\r\n if (item.type === StringLiteral) {\r\n return this.splitQuoted(item.text);\r\n }\r\n else if (item.type === NumericLiteral) {\r\n return [item.text];\r\n }\r\n else if (item.type === List) {\r\n const items = this.findChildren(item, (n) => n.type !== \"[\" && n.type !== \"]\");\r\n if (items.every(n => n.type === StringLiteral || n.type === NumericLiteral)) {\r\n return items.flatMap(getPathExpression);\r\n }\r\n }\r\n return [];\r\n };\r\n\r\n const path = getPathExpression(pathParameter);\r\n if (path.length > 0) \r\n return [StatusDependency, ...path];\r\n }\r\n \r\n return null;\r\n }\r\n\r\n private splitQuoted(input: string, separator: string = '.'): string[] {\r\n input = (input ?? \"\").slice(1, -1)\r\n return input\r\n .split(separator)\r\n .map(part => part.trim())\r\n .filter(part => part.length > 0);\r\n }\r\n\r\n private logWarnings(expression: string, warnings: Warning[]): void {\r\n if (!this.verbose || !warnings.length) return;\r\n warnings.forEach(w =>\r\n console.warn(`[${expression}] ${w.type}: ${w.message} (${w.position?.from}-${w.position?.to})`)\r\n );\r\n }\r\n\r\n //#endregion\r\n}\r\n\r\ninterface NodeItem {\r\n type: string;\r\n text: string;\r\n children: NodeItem[];\r\n parent: NodeItem | null;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { isObservable, take } from 'rxjs';\r\nimport { shareReplay } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class WeakService {\r\n\r\n constructor() { }\r\n\r\n private cache = new WeakMap<object, Record<string, any>>();\r\n\r\n exists(source: object, key: string) {\r\n if (this.cache.has(source)) {\r\n const cachedObject = this.cache.get(source)!;\r\n return (key in cachedObject);\r\n }\r\n return false;\r\n }\r\n\r\n call<T>(source: object, key: string, func: () => T\r\n , reusable: ((value: T) => boolean) | null = null\r\n , store: ((value: T) => any) | null = null\r\n , cacheable: ((value: T) => boolean) | null = null\r\n ): T {\r\n if (!this.cache.has(source)) {\r\n this.cache.set(source, {});\r\n }\r\n\r\n const cachedObject = this.cache.get(source)!;\r\n\r\n if (key in cachedObject\r\n && (reusable == null\r\n || reusable(cachedObject[key])))\r\n {\r\n return cachedObject[key];\r\n }\r\n\r\n let result: any = func();\r\n\r\n if (store != null) {\r\n result = store(result);\r\n }\r\n\r\n const observable = isObservable(result);\r\n\r\n if (observable) {\r\n result = result.pipe(\r\n take(1), \r\n shareReplay(1)\r\n );\r\n }\r\n\r\n if (cacheable == null || cacheable(result))\r\n cachedObject[key] = result;\r\n\r\n return result;\r\n }\r\n\r\n invalidate(source: object, key: string) {\r\n if (this.cache.has(source)) {\r\n const cachedObject = this.cache.get(source)!;\r\n delete cachedObject[key];\r\n }\r\n }\r\n\r\n invalidateAll(source: object) {\r\n if (this.cache.has(source)) {\r\n this.cache.delete(source);\r\n }\r\n }\r\n}\r\n","import { bindFunction } from '../utils/proxy';\r\n\r\nexport function ToBoundArrows<T extends object>(\r\n instance: T,\r\n methodNames: (keyof T)[]): Record<string, any> {\r\n const result: Record<string, any> = {};\r\n\r\n for (const name of methodNames) {\r\n const original = instance[name];\r\n if (typeof original === 'function') {\r\n result[name as string] = bindFunction(original, instance);\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { IEvaluatorProvider } from '../services/programmability.service';\r\nimport { ToBoundArrows } from '../utils/bound';\r\nimport { SirioNotificationType, SirioToastService } from \"@wemake4u/form-controls\";\r\nimport { GlobalService } from './global.service';\r\n\r\nconst defaultDelayTime = 2000;\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ToastService implements IEvaluatorProvider {\r\n\r\n constructor(\r\n private sirioToast: SirioToastService,\r\n private global: GlobalService\r\n ) {\r\n this.delayTime =\r\n this.global.getProperty(\"toastDelay\", defaultDelayTime);\r\n }\r\n\r\n private delayTime: number;\r\n\r\n notifyInfo(message: string, title?: string, delay?: number) {\r\n this.notify(\"info\", message, title, delay ?? this.delayTime);\r\n }\r\n\r\n notifySuccess(message: string, title?: string, delay?: number) {\r\n this.notify(\"success\", message, title, delay ?? this.delayTime);\r\n }\r\n\r\n notifyWarning(message: string, title?: string, delay?: number) {\r\n this.notify(\"warning\", message, title, delay ?? this.delayTime);\r\n }\r\n\r\n notifyError(message: string, title?: string, delay?: number) {\r\n this.notify(\"error\", message, title, delay ?? this.delayTime);\r\n }\r\n\r\n getContext(): Record<string, any> {\r\n return ToBoundArrows(this, [\r\n \"notifyInfo\",\r\n \"notifySuccess\",\r\n \"notifyWarning\",\r\n \"notifyError\"\r\n ]);\r\n }\r\n\r\n // delay 0 = the toast stays until closed (as before).\r\n private notify(type: SirioNotificationType, message: string, title?: string, delay: number = defaultDelayTime) {\r\n this.sirioToast.show({\r\n delay: delay,\r\n message: message,\r\n type: type,\r\n title: title\r\n });\r\n }\r\n}\r\n","import {\r\n Component, ViewContainerRef, ViewChild, ComponentRef, Type,\r\n Injector, Input,\r\n ChangeDetectionStrategy,\r\n inject\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { FormDialogOptions, DialogAction, DialogResult } from '../services/dialog.service';\r\nimport { DynamicFormComponent } from '../dynamic-form/dynamic-form.component';\r\nimport { toProxy } from '../utils/proxy';\r\nimport { SirioButton, SirioDialog, SirioDialogFooter, SirioDialogRef, SirioDialogTone } from '@wemake4u/form-controls';\r\n\r\nimport { LanguageService } from '@wemake4u/interact';\r\nimport { Texts } from '../locale/locale';\r\nimport { localize } from '../locale/localize';\r\n\r\n@Component({\r\n selector: 'dynamic-dialog',\r\n imports: [\r\n CommonModule,\r\n SirioDialog,\r\n SirioDialogFooter,\r\n SirioButton\r\n ],\r\n templateUrl: './dialog.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n styleUrl: './dialog.component.css'\r\n})\r\nexport class DialogComponent {\r\n @ViewChild('formHost', { read: ViewContainerRef, static: true })\r\n private formHost!: ViewContainerRef;\r\n private formRef!: ComponentRef<any>\r\n Texts = Texts;\r\n\r\n // Inputs set by DialogService (SirioDialogService.open).\r\n @Input() formSchema: any;\r\n @Input() options: FormDialogOptions = { };\r\n @Input() dynamicFormType!: Type<any>;\r\n\r\n private readonly languageService = inject(LanguageService);\r\n // Reference of the dialog opened by SirioDialogService: closes it.\r\n private readonly dialogRef = inject(SirioDialogRef);\r\n\r\n ngOnInit() {\r\n this.options = this.options ?? {};\r\n this.currentValue = this.options.value;\r\n }\r\n \r\n ngAfterViewInit() {\r\n\r\n const injector = this.getInjector();\r\n\r\n const componentRef = this.formHost.createComponent(this.dynamicFormType, { injector });\r\n const instance = componentRef.instance as any;\r\n\r\n componentRef.setInput('schema', this.formSchema);\r\n componentRef.setInput('value', this.options.value ?? { });\r\n componentRef.setInput('showNav', this.options.showNav ?? false);\r\n componentRef.setInput('showNavButton', this.options.showNavButton ?? false);\r\n componentRef.setInput('showProgress', this.options.showProgress ?? false);\r\n componentRef.setInput('showFormTitle', this.options.showFormTitle ?? false);\r\n\r\n instance.valueChange\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((value: any) => this.setCurrentValue(value));\r\n\r\n this.formRef = componentRef;\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n /** Closed by the X, Esc or a click outside the drawer: result 'Close' (unless a button already sent one). */\r\n onClosed() {\r\n if (!this.resultSent) {\r\n this.resultSent = true;\r\n this.SendResult('Close');\r\n }\r\n }\r\n\r\n /** Closes the dialog without a result (DialogService.closeDialog). */\r\n dismiss() {\r\n this.resultSent = true;\r\n this.dialogRef.close();\r\n }\r\n\r\n doAction(action: DialogAction) {\r\n if (this.options.keepOpen !== true) {\r\n this.resultSent = true;\r\n this.dialogRef.close();\r\n }\r\n this.SendResult(action);\r\n }\r\n\r\n doSubmit(action: DialogAction) {\r\n const form = this.getForm();\r\n if (form?.hasSilentErrors())\r\n form?.showSilentErrors();\r\n if (!this.isInvalid())\r\n this.doAction(action);\r\n }\r\n\r\n canSubmit() {\r\n return !this.isInvalid()\r\n || this.getForm()?.hasSilentErrors();\r\n }\r\n\r\n /** Icon color of the title (dialog type). */\r\n tone(): SirioDialogTone {\r\n const type = this.options.type;\r\n return type === 'warning' || type === 'danger' ? type : 'default';\r\n }\r\n\r\n /** Title icon of the dialog type (as before: info, warning, danger); none in the drawer. */\r\n icon(): string | null {\r\n if (this.options.isDrawer) return null;\r\n switch (this.options.type ?? 'info') {\r\n case 'warning': return 'fa-exclamation-circle';\r\n case 'danger': return 'fa-exclamation-triangle';\r\n default: return 'fa-info-circle';\r\n }\r\n }\r\n\r\n showCloseButton(): boolean {\r\n const result = this.options.closeButton === true;\r\n return result;\r\n }\r\n\r\n showFooter(): boolean {\r\n return this.options.buttons !== undefined;\r\n }\r\n\r\n isInvalid(): boolean {\r\n return (this.getForm()?.formGroup?.valid ?? true) !== true;\r\n }\r\n\r\n locale(component: any, key: string): string {\r\n return localize(this.language, component, key);\r\n }\r\n\r\n private destroy$ = new Subject<void>();\r\n\r\n // The result was sent (or must not be sent): closing does not send 'Close'.\r\n private resultSent = false;\r\n\r\n private currentValue: any;\r\n\r\n private setCurrentValue(value: any): void {\r\n this.currentValue = value;\r\n }\r\n\r\n private get language(): string {\r\n return this.languageService.getLanguage();\r\n }\r\n\r\n private SendResult(action: DialogAction) {\r\n if (typeof this.options.onResult === 'function') {\r\n const result: DialogResult = {\r\n form: toProxy(this.getForm()),\r\n setProperty: (n, v) => this.formRef.setInput(n, v),\r\n action: action,\r\n value: this.currentValue\r\n };\r\n this.options.onResult(result);\r\n }\r\n }\r\n\r\n private getInjector(): Injector | undefined {\r\n return this.options.injector\r\n ?? this.formHost.injector;\r\n }\r\n\r\n private getForm() : DynamicFormComponent | undefined {\r\n return this.formRef?.instance as DynamicFormComponent;\r\n }\r\n}\r\n","<wm-sirio-dialog\r\n [title]=\"options.title ?? ''\"\r\n [icon]=\"icon()\"\r\n [tone]=\"tone()\"\r\n centered\r\n [size]=\"options.size ?? 'default'\"\r\n [drawer]=\"options.isDrawer ?? false\"\r\n [alert]=\"options.alert ?? false\"\r\n [dismissible]=\"showCloseButton()\"\r\n [closeLabel]=\"locale(Texts, 'Close')\"\r\n [closeOnBackdrop]=\"options.isDrawer ?? false\"\r\n (closed)=\"onClosed()\">\r\n\r\n <ng-template #formHost></ng-template>\r\n\r\n @if (showFooter()) {\r\n <div wmSirioDialogFooter>\r\n @switch (options.buttons) {\r\n <!-- OK -->\r\n @case ('OK') {\r\n <ng-container *ngTemplateOutlet=\"confirmTemplate; context: { action: 'OK' }\"></ng-container>\r\n }\r\n <!-- Caso: OKCancel -->\r\n @case ('OKCancel') {\r\n <ng-container *ngTemplateOutlet=\"confirmTemplate; context: { action: 'OK' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"closeTemplate; context: { action: 'Cancel' }\"></ng-container>\r\n }\r\n <!-- Caso: ConfirmClose -->\r\n @case ('ConfirmCancel') {\r\n <ng-container *ngTemplateOutlet=\"confirmTemplate; context: { action: 'Confirm' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"closeTemplate; context: { action: 'Cancel' }\"></ng-container>\r\n }\r\n <!-- Caso: AbortRetryIgnore -->\r\n @case ('AbortRetryIgnore') {\r\n <ng-container *ngTemplateOutlet=\"closeTemplate; context: { action: 'Abort' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"confirmTemplate; context: { action: 'Retry' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"closeTemplate; context: { action: 'Ignore' }\"></ng-container>\r\n }\r\n <!-- Caso: YesNoCancel -->\r\n @case ('YesNoCancel') {\r\n <ng-container *ngTemplateOutlet=\"confirmTemplate; context: { action: 'Yes' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"closeTemplate; context: { action: 'No' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"closeTemplate; context: { action: 'Cancel' }\"></ng-container>\r\n }\r\n <!-- Caso: YesNo -->\r\n @case ('YesNo') {\r\n <ng-container *ngTemplateOutlet=\"confirmTemplate; context: { action: 'Yes' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"closeTemplate; context: { action: 'No' }\"></ng-container>\r\n }\r\n <!-- Caso: RetryCancel -->\r\n @case ('RetryCancel') {\r\n <ng-container *ngTemplateOutlet=\"confirmTemplate; context: { action: 'Retry' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"closeTemplate; context: { action: 'Cancel' }\"></ng-container>\r\n }\r\n <!-- Caso: CancelTryContinue -->\r\n @case ('CancelTryContinue') {\r\n <ng-container *ngTemplateOutlet=\"closeTemplate; context: { action: 'Cancel' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"confirmTemplate; context: { action: 'Try' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"closeTemplate; context: { action: 'Continue' }\"></ng-container>\r\n }\r\n <!-- Caso: Custom -->\r\n @case ('Custom') {\r\n @for (customButton of options.customButtons ?? []; track customButton; let i = $index) {\r\n <ng-container *ngTemplateOutlet=\"customTemplate; context: { customButton: customButton }\"></ng-container>\r\n }\r\n }\r\n }\r\n <!-- Templates -->\r\n <ng-template #confirmTemplate let-action=\"action\">\r\n <button type=\"button\" wmSirioButton=\"primary\" (click)=\"doSubmit(action)\" [disabled]=\"!canSubmit()\">{{ locale(Texts, action) }}</button>\r\n </ng-template>\r\n <ng-template #closeTemplate let-action=\"action\">\r\n <button type=\"button\" wmSirioButton=\"secondary\" (click)=\"doAction(action)\">{{ locale(Texts, action) }}</button>\r\n </ng-template>\r\n <ng-template #customTemplate\r\n let-customButton=\"customButton\">\r\n <!-- No color = plain button (ngx-sirio-lib color null). -->\r\n <button type=\"button\" [wmSirioButton]=\"customButton.color || 'ghost'\" (click)=\"doAction(customButton.action)\">{{ customButton.text }}</button>\r\n </ng-template>\r\n </div>\r\n }\r\n\r\n</wm-sirio-dialog>\r\n","import { inject, Injectable, Injector } from '@angular/core';\r\nimport { SirioButtonVariant, SirioDialogService, SirioDialogSize } from '@wemake4u/form-controls';\r\nimport { IEvaluatorProvider } from '../services/programmability.service';\r\nimport { ToBoundArrows } from '../utils/bound';\r\nimport { DialogComponent } from '../dialog/dialog.component';\r\nimport { DynamicFormComponent } from '../dynamic-form/dynamic-form.component';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DialogService implements IEvaluatorProvider {\r\n\r\n // Opens the dialogs (stacked on top of each other) and gives the focus back when they close.\r\n private readonly dialogs = inject(SirioDialogService);\r\n\r\n openDialog(formSchema: any, options?: FormDialogOptions) {\r\n this.showDialog(formSchema, options);\r\n }\r\n\r\n /** Closes the top dialog without a result (onResult is not called). */\r\n closeDialog() {\r\n const top = this.dialogs.openDialogs().at(-1);\r\n const instance = top?.componentInstance;\r\n if (instance instanceof DialogComponent) {\r\n instance.dismiss();\r\n } else {\r\n top?.close();\r\n }\r\n }\r\n\r\n alert(text: string, options?: DialogOptions) {\r\n const formSchema = this.createTextSchema(text);\r\n const formOptions : FormDialogOptions = {\r\n ...options,\r\n type: \"warning\",\r\n buttons: 'OK',\r\n alert: true,\r\n isDrawer: false,\r\n showNav: false,\r\n showNavButton: false,\r\n showProgress: false,\r\n showFormTitle: false\r\n };\r\n this.showDialog(formSchema, formOptions);\r\n }\r\n\r\n info(text: string, options?: DialogOptions) {\r\n const formSchema = this.createTextSchema(text);\r\n const formOptions: FormDialogOptions = {\r\n ...options,\r\n type: \"info\",\r\n buttons: 'OK',\r\n isDrawer: false,\r\n showNav: false,\r\n showNavButton: false,\r\n showProgress: false,\r\n showFormTitle: false\r\n };\r\n this.showDialog(formSchema, formOptions);\r\n }\r\n\r\n confirm(text: string, options?: DialogOptions) {\r\n const formSchema = this.createTextSchema(text);\r\n const formOptions: FormDialogOptions = {\r\n ...options,\r\n type: \"info\",\r\n buttons: 'YesNo',\r\n alert: true,\r\n isDrawer: false,\r\n showNav: false,\r\n showNavButton: false,\r\n showProgress: false,\r\n showFormTitle: false\r\n }; \r\n this.showDialog(formSchema, formOptions);\r\n }\r\n\r\n show(text: string, options?: DialogOptions) {\r\n const formSchema = this.createTextSchema(text);\r\n const formOptions: FormDialogOptions = {\r\n type: \"info\",\r\n buttons: 'OK',\r\n ...options,\r\n isDrawer: false,\r\n showNav: false,\r\n showNavButton: false,\r\n showProgress: false,\r\n showFormTitle: false\r\n };\r\n this.showDialog(formSchema, formOptions);\r\n }\r\n\r\n prompt(text: string, defaultValue?: string, options?: DialogOptions) {\r\n const formSchema = this.createInputSchema(text, defaultValue);\r\n const formOptions: FormDialogOptions = {\r\n ...options,\r\n type: \"info\",\r\n buttons: 'OKCancel',\r\n isDrawer: false,\r\n showNav: false,\r\n showNavButton: false,\r\n showProgress: false,\r\n showFormTitle: false\r\n };\r\n this.showDialog(formSchema, formOptions);\r\n }\r\n\r\n getContext(): Record<string, any> {\r\n return ToBoundArrows(this, [\r\n 'openDialog',\r\n 'closeDialog',\r\n 'alert',\r\n 'info',\r\n 'confirm',\r\n 'show'\r\n ]);\r\n }\r\n\r\n private showDialog(formSchema: any, options?: FormDialogOptions) {\r\n\r\n options = this.ensureClosable(options);\r\n\r\n this.dialogs.open(DialogComponent, {\r\n inputs: {\r\n formSchema,\r\n options,\r\n dynamicFormType: DynamicFormComponent\r\n }\r\n });\r\n }\r\n\r\n private createTextSchema(text: string) {\r\n return {\r\n \"forms\": [\r\n {\r\n \"components\": [\r\n {\r\n \"text\": text,\r\n \"type\": \"text\",\r\n \"layout\": {\r\n \"row\": \"Row_14z9myo\",\r\n \"columns\": null\r\n },\r\n \"id\": \"Field_1xibp2r\"\r\n }\r\n ],\r\n \"type\": \"default\",\r\n \"id\": \"Form_0lotm2h\",\r\n \"schemaVersion\": 18\r\n }\r\n ]\r\n }\r\n }\r\n\r\n private createInputSchema(label: string, defaultValue?: string) {\r\n return {\r\n \"forms\": [\r\n {\r\n \"components\": [\r\n {\r\n \"label\": label,\r\n \"defaultValue\": defaultValue,\r\n \"type\": \"textfield\",\r\n \"layout\": {\r\n \"row\": \"Row_1wxz5gd\",\r\n \"columns\": null\r\n },\r\n \"id\": \"Field_1tau53x\",\r\n \"key\": \"input\"\r\n }\r\n ],\r\n \"type\": \"default\",\r\n \"id\": \"Form_1ontwnx\",\r\n \"schemaVersion\": 18\r\n }\r\n ]\r\n };\r\n }\r\n\r\n private ensureClosable(options?: FormDialogOptions): FormDialogOptions {\r\n\r\n options = {\r\n ...options,\r\n closeButton:\r\n options?.buttons == null ? true : options.closeButton\r\n }\r\n\r\n return options;\r\n }\r\n\r\n}\r\n\r\nexport type DialogTypes = 'info' | 'warning' | 'danger';\r\n\r\nexport type DialogSizes = SirioDialogSize;\r\n\r\nexport type ButtonColors = SirioButtonVariant;\r\n\r\nexport interface DialogOptions {\r\n type?: DialogTypes;\r\n size?: DialogSizes;\r\n title?: string;\r\n isDrawer?: boolean; \r\n closeButton?: boolean;\r\n buttons?: DialogButtons;\r\n customButtons?: CustomButton[],\r\n keepOpen?: boolean,\r\n onResult?: (result: DialogResult) => void;\r\n}\r\n\r\nexport interface FormDialogOptions extends DialogOptions {\r\n value?: any;\r\n injector?: Injector;\r\n showNav?: boolean;\r\n showNavButton?: boolean;\r\n showProgress?: boolean;\r\n showFormTitle?: boolean;\r\n /** role=\"alertdialog\" (alert and confirm). */\r\n alert?: boolean;\r\n}\r\n\r\nexport interface DialogResult {\r\n form: DynamicFormComponent;\r\n setProperty: (name: string, value: unknown) => void;\r\n action: DialogAction | string;\r\n value?: any; \r\n}\r\n\r\nexport interface CustomButton {\r\n text: string,\r\n color: ButtonColors,\r\n action: string\r\n}\r\n\r\nexport type DialogAction = 'OK'\r\n | 'Cancel'\r\n | 'Yes'\r\n | 'No'\r\n | 'Confirm'\r\n | 'Close'\r\n | 'Abort'\r\n | 'Retry'\r\n | 'Ignore'\r\n | 'Try'\r\n | 'Continue';\r\n\r\nexport type DialogButtons = 'OK'\r\n | 'OKCancel'\r\n | 'ConfirmCancel'\r\n | 'AbortRetryIgnore'\r\n | 'YesNoCancel'\r\n | 'YesNo'\r\n | 'RetryCancel'\r\n | 'CancelTryContinue'\r\n | 'Custom';\r\n","import { Injectable } from '@angular/core';\r\nimport { IEvaluatorProvider } from '../services/programmability.service';\r\nimport { ToBoundArrows } from '../utils/bound';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FormatterService implements IEvaluatorProvider {\r\n\r\n constructor() { }\r\n\r\n formatDate(isoDate: string | null | undefined,\r\n options?: Intl.DateTimeFormatOptions,\r\n locale: string = 'it-IT'\r\n ): string {\r\n if (!isoDate) return '';\r\n\r\n const date = new Date(isoDate);\r\n if (isNaN(date.getTime())) return '';\r\n\r\n const formatOptions: Intl.DateTimeFormatOptions = {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n ...options\r\n };\r\n\r\n return new Intl.DateTimeFormat(locale, formatOptions).format(date);\r\n }\r\n\r\n formatTime(isoDate: string | null | undefined,\r\n options?: Intl.DateTimeFormatOptions,\r\n locale: string = 'it-IT'\r\n ): string {\r\n if (!isoDate) return '';\r\n\r\n const date = new Date(isoDate);\r\n if (isNaN(date.getTime())) return '';\r\n\r\n const formatOptions: Intl.DateTimeFormatOptions = {\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n second: '2-digit',\r\n hour12: false,\r\n ...options\r\n };\r\n\r\n return new Intl.DateTimeFormat(locale, formatOptions).format(date);\r\n }\r\n\r\n formatDateTime(isoDate: string | null | undefined,\r\n options?: Intl.DateTimeFormatOptions,\r\n locale: string = 'it-IT') {\r\n if (!isoDate) return '';\r\n\r\n const date = new Date(isoDate);\r\n if (isNaN(date.getTime())) return '';\r\n\r\n const datePart = new Intl.DateTimeFormat(locale, {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n ...options\r\n }).format(date);\r\n\r\n const timePart = new Intl.DateTimeFormat(locale, {\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n second: '2-digit',\r\n hour12: false,\r\n ...options\r\n }).format(date);\r\n\r\n return `${datePart} ${timePart}`;\r\n }\r\n\r\n formatCurrency(\r\n value: number,\r\n currency: string = 'EUR',\r\n locale: string = 'it-IT'\r\n ): string {\r\n if (isNaN(value)) return '';\r\n\r\n return new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n useGrouping: true,\r\n currency: currency,\r\n currencyDisplay: 'symbol' // oppure: 'code' | 'name'\r\n }).format(value);\r\n }\r\n\r\n formatNumber(\r\n value: number,\r\n decimals: number = 2,\r\n locale: string = 'it-IT' \r\n ): string {\r\n if (isNaN(value)) return '';\r\n\r\n return new Intl.NumberFormat(locale, {\r\n style: 'decimal',\r\n useGrouping: true,\r\n minimumFractionDigits: decimals,\r\n maximumFractionDigits: decimals\r\n }).format(value);\r\n }\r\n\r\n getContext(): Record<string, any> {\r\n return ToBoundArrows(this, [\r\n 'formatDate',\r\n 'formatTime',\r\n 'formatDateTime',\r\n 'formatCurrency',\r\n 'formatNumber'\r\n ]);\r\n }\r\n \r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { IEvaluatorProvider } from '../services/programmability.service';\r\nimport { ToBoundArrows } from '../utils/bound';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class JsonService implements IEvaluatorProvider {\r\n\r\n constructor() { }\r\n\r\n toJson(value: any, indent: boolean): string {\r\n if (value === undefined) {\r\n return 'null';\r\n }\r\n try {\r\n return JSON.stringify(\r\n value,\r\n (_k, v) => (v === undefined ? null : v),\r\n indent ? 2 : undefined\r\n );\r\n } catch {\r\n return 'null';\r\n }\r\n }\r\n\r\n parseJson(value: any): any {\r\n if (typeof value !== 'string') {\r\n return value;\r\n }\r\n\r\n const trimmed = value.trim();\r\n\r\n if (trimmed === '') {\r\n return null;\r\n }\r\n\r\n try {\r\n return JSON.parse(trimmed);\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n getContext(): Record<string, any> {\r\n return ToBoundArrows(this, [\r\n 'toJson',\r\n 'parseJson'\r\n ]);\r\n }\r\n \r\n}\r\n","export function generateGuid(): string {\r\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\r\n return crypto.randomUUID();\r\n }\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\r\n const r = Math.random() * 16 | 0;\r\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\r\n return v.toString(16);\r\n });\r\n}\r\n","export interface OpenWindowFeatures {\r\n width?: number;\r\n height?: number;\r\n left?: number;\r\n top?: number;\r\n\r\n toolbar?: boolean;\r\n menubar?: boolean;\r\n location?: boolean;\r\n status?: boolean;\r\n resizable?: boolean;\r\n scrollbars?: boolean;\r\n\r\n noopener?: boolean;\r\n noreferrer?: boolean;\r\n\r\n center?: boolean;\r\n focus?: boolean;\r\n}\r\n\r\nexport type WindowTarget =\r\n | '_blank'\r\n | '_self'\r\n | '_parent'\r\n | '_top'\r\n | string;\r\n\r\nexport function openWindow(\r\n url: string,\r\n target: WindowTarget = '_blank',\r\n features: OpenWindowFeatures = {}\r\n): Window | null {\r\n\r\n const {\r\n width,\r\n height,\r\n left,\r\n top,\r\n toolbar,\r\n menubar,\r\n location,\r\n status,\r\n resizable,\r\n scrollbars,\r\n noopener = true,\r\n noreferrer = false,\r\n center = false,\r\n focus = true\r\n } = features;\r\n\r\n let finalLeft = left;\r\n let finalTop = top;\r\n\r\n if (center && width && height) {\r\n finalLeft = window.screenX + (window.outerWidth - width) / 2;\r\n finalTop = window.screenY + (window.outerHeight - height) / 2;\r\n }\r\n\r\n const featureList: string[] = [];\r\n\r\n if (width) featureList.push(`width=${width}`);\r\n if (height) featureList.push(`height=${height}`);\r\n if (finalLeft !== undefined) featureList.push(`left=${finalLeft}`);\r\n if (finalTop !== undefined) featureList.push(`top=${finalTop}`);\r\n\r\n if (toolbar !== undefined) featureList.push(`toolbar=${toolbar ? 'yes' : 'no'}`);\r\n if (menubar !== undefined) featureList.push(`menubar=${menubar ? 'yes' : 'no'}`);\r\n if (location !== undefined) featureList.push(`location=${location ? 'yes' : 'no'}`);\r\n if (status !== undefined) featureList.push(`status=${status ? 'yes' : 'no'}`);\r\n if (resizable !== undefined) featureList.push(`resizable=${resizable ? 'yes' : 'no'}`);\r\n if (scrollbars !== undefined) featureList.push(`scrollbars=${scrollbars ? 'yes' : 'no'}`);\r\n\r\n if (noopener) featureList.push('noopener');\r\n if (noreferrer) featureList.push('noreferrer');\r\n\r\n const locationUrl = new URL(url, window.location.href);\r\n \r\n const newWindow = window.open(\r\n locationUrl.toString(),\r\n target,\r\n featureList.join(',')\r\n );\r\n\r\n if (newWindow && focus) {\r\n newWindow.focus();\r\n }\r\n\r\n return newWindow;\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable()\r\nexport class MetadataService {\r\n\r\n constructor() {\r\n \r\n }\r\n\r\n setSchema(schema: any) {\r\n this.schema = schema ?? { forms: [] };\r\n } \r\n\r\n getSchema(): any {\r\n return this.schema;\r\n }\r\n\r\n setForms(forms: any[]) {\r\n this.forms = forms ?? []; \r\n }\r\n\r\n getTemplateByName(name: string): any {\r\n\r\n if (!this.schema || !Array.isArray(this.schema.forms)) {\r\n return undefined;\r\n }\r\n\r\n const templates = this.schema.forms.filter((form: any) => form.isTemplate === true);\r\n\r\n const templateToExpand = templates.find((form: any) => form.name === name);\r\n\r\n if (!templateToExpand) {\r\n return undefined;\r\n }\r\n\r\n const clonedForm = {\r\n ...templateToExpand,\r\n isTemplate: false\r\n };\r\n\r\n const newForms = templates\r\n .filter((form: any) => form.name !== name)\r\n .concat(clonedForm);\r\n\r\n return {\r\n forms: newForms\r\n };\r\n }\r\n\r\n getForms(): any[] {\r\n return this.forms;\r\n }\r\n\r\n getFormByName(name: string): any {\r\n return this.forms.find(form => form.name === name);\r\n }\r\n\r\n getFormIndexByName(name: string): number {\r\n return this.forms.findIndex(form => form.name === name);\r\n }\r\n\r\n getFormNameByIndex(index: number): string | undefined {\r\n if (!this.isValidFormIndex(index)) return undefined;\r\n return this.forms[index].name;\r\n }\r\n\r\n private schema: any = { forms: [] };\r\n\r\n private forms: any[] = [];\r\n\r\n private isValidFormIndex(index: number): boolean {\r\n return Number.isInteger(index) && index >= 0 && index < this.forms.length;\r\n }\r\n}\r\n","import { Injectable, Injector } from '@angular/core';\r\nimport { MetadataService } from '../services/metadata.service';\r\nimport { DialogService, DialogOptions, FormDialogOptions } from '../services/dialog.service';\r\nimport { ToBoundArrows } from '../utils/bound';\r\nimport { IEvaluatorProvider } from '../services/programmability.service';\r\nimport { Observable, take, of } from 'rxjs';\r\nimport { generateGuid } from '../utils/uuid';\r\nimport { openWindow, WindowTarget, OpenWindowFeatures } from '../utils/window';\r\n\r\n@Injectable()\r\nexport class FunctionService implements IEvaluatorProvider {\r\n\r\n constructor(private metadata: MetadataService\r\n , private dialog: DialogService\r\n , private injector: Injector) { }\r\n\r\n invokable(func: any): (...args: any[]) => any {\r\n return makeInvokable(func, () => { });\r\n }\r\n\r\n executeOnce<T>(observable: Observable<T>, callback: any): void {\r\n if (!observable) return;\r\n observable\r\n .pipe(take(1))\r\n .subscribe({\r\n next: this.invokable(callback) as (value: T) => void\r\n });\r\n }\r\n\r\n asObservable<T>(value: T): Observable<T> {\r\n return of(value);\r\n }\r\n\r\n setTimeout<T>(callback: any, delay: number): void {\r\n if (!callback) return;\r\n const func = this.invokable(callback) as (value: T) => void\r\n setTimeout(func, delay);\r\n }\r\n\r\n openForm(template: string | object, options: DialogOptions) {\r\n let formSchema: any;\r\n\r\n if (typeof template === 'string') {\r\n formSchema = this.metadata.getTemplateByName(template);\r\n } else {\r\n formSchema = template;\r\n }\r\n\r\n if (formSchema) {\r\n const formOptions: FormDialogOptions = {\r\n ...options,\r\n injector: this.injector\r\n }\r\n\r\n this.dialog.openDialog(formSchema, formOptions);\r\n }\r\n }\r\n\r\n openWindow(url: string, target: WindowTarget = '_blank', features: OpenWindowFeatures = {}): Window | null {\r\n return openWindow(url, target, features);\r\n }\r\n\r\n newGuid(): string {\r\n return generateGuid();\r\n }\r\n\r\n range(from: number, to: number): number[] {\r\n return Array.from(\r\n { length: to - from + 1 },\r\n (_, i) => from + i\r\n );\r\n }\r\n\r\n hydrate<T = any>(value: T, deep: boolean = false): T {\r\n // primitives (or \"bare\" functions) are not mutable: return the replacement instead\r\n if (value === null || typeof value !== 'object') {\r\n return value;\r\n }\r\n\r\n // if the root value itself is a function wrapper, it must be replaced (can't mutate in-place)\r\n if (isFunctionWrapper(value)) {\r\n return makeInvokable(value, value) as any;\r\n }\r\n\r\n if (!deep) {\r\n return value;\r\n }\r\n\r\n // \"opaque\" types we don't want to decompose into properties\r\n if (value instanceof Date || value instanceof RegExp) {\r\n return value;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n for (let i = 0; i < value.length; i++) {\r\n value[i] = this.hydrate(value[i], deep);\r\n }\r\n return value;\r\n }\r\n\r\n // generic object: mutate all enumerable properties in-place\r\n for (const key of Object.keys(value as object)) {\r\n (value as any)[key] = this.hydrate((value as any)[key], deep);\r\n }\r\n return value;\r\n }\r\n\r\n getContext(): Record<string, any> {\r\n return ToBoundArrows(this, [\r\n \"openForm\",\r\n \"openWindow\",\r\n \"invokable\",\r\n \"executeOnce\",\r\n \"asObservable\",\r\n \"setTimeout\",\r\n \"newGuid\",\r\n \"range\"\r\n ]);\r\n }\r\n}\r\n\r\nfunction isFunctionWrapper(func: any): boolean {\r\n return (typeof func?.invoke === 'function');\r\n}\r\n\r\nfunction makeInvokable<T>(func: any, fallback: T): ((...args: any[]) => any) | T {\r\n if (isFunctionWrapper(func)) {\r\n return (...args: any[]) => func.invoke(args);\r\n }\r\n return fallback;\r\n}\r\n","export type Path = string | number | Array<string | number>;\r\n\r\n/** A path split into its segments (see normalizePath). */\r\nexport type PathSegments = (string | number)[];\r\n\r\nexport function normalizePath(path: Path): PathSegments\r\n{\r\n if (typeof path === 'string') {\r\n return path.split('.');\r\n }\r\n if (Array.isArray(path)) {\r\n return path.reduce<PathSegments>((acc, part) => {\r\n if (typeof part === 'string') {\r\n acc.push(...part.split('.'));\r\n } else {\r\n acc.push(part);\r\n }\r\n return acc;\r\n }, []);\r\n }\r\n return [path];\r\n};\r\n\r\nexport function matchPath(pathA: Path, pathB: Path): boolean {\r\n\r\n const a = normalizePath(pathA);\r\n const b = normalizePath(pathB);\r\n\r\n const minLen = Math.min(a.length, b.length);\r\n\r\n for (let i = 0; i < minLen; i++) {\r\n if (a[i] !== b[i]) return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function stringifyPath(path: Path): string {\r\n if (Array.isArray(path)) {\r\n return path.join(\".\");\r\n }\r\n return String(path);\r\n}\r\n\r\nexport function isIndexSegment(segment: string | number): boolean {\r\n return typeof segment === 'number' || /^\\d+$/.test(segment);\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { IEvaluatorProvider } from './programmability.service';\r\nimport { AbstractControl, FormGroup, FormArray, FormControl, FormControlStatus } from '@angular/forms';\r\nimport { isNullableGroup } from '../utils/FormGroupEx';\r\nimport { Path, normalizePath } from '../common/path';\r\nimport { filter, interval, map, Observable, of, take } from 'rxjs';\r\nimport { FormArrayEx } from '../utils/FormArrayEx';\r\n\r\ntype ControlType = 'array' | 'group' | 'control';\r\n\r\nexport type PatchPredicate = (control: AbstractControl, value: any) => boolean;\r\n\r\nexport interface PatchOptions {\r\n emitEvent?: boolean;\r\n emitError?: boolean;\r\n emitWarn?: boolean;\r\n validateType?: boolean;\r\n fallbackValue?: any;\r\n strict: boolean;\r\n canPatch?: PatchPredicate;\r\n}\r\n\r\nexport interface PathOptions {\r\n emitError?: boolean;\r\n emitWarn?: boolean;\r\n create?: boolean;\r\n expected?: ControlType;\r\n breakOnArray?: boolean;\r\n breakOnNull?: boolean;\r\n};\r\n\r\nexport interface EnumerateOptions {\r\n expandArray?: boolean;\r\n expandGroup?: boolean;\r\n skipDisabled?: boolean;\r\n}\r\n\r\nexport type ExpandOptions = Omit<EnumerateOptions, 'skipDisabled'>;\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FormService implements IEvaluatorProvider {\r\n\r\n set(control: AbstractControl, path: Path, value: any, pathOptions?: PathOptions, patchOptions?: PatchOptions): boolean {\r\n\r\n const currentControl = this.applyPath(control, path, pathOptions ?? { create: true });\r\n\r\n if (!currentControl)\r\n return false;\r\n\r\n this.patch(currentControl, value, patchOptions);\r\n\r\n return true;\r\n }\r\n\r\n get(control: AbstractControl, path: Path, pathOptions?: PathOptions): any {\r\n const result = this.getControl(control, path, pathOptions);\r\n return result?.value;\r\n }\r\n\r\n reset(control: AbstractControl, path: Path): any {\r\n const targetControl = this.getControl(control, path);\r\n targetControl?.reset();\r\n }\r\n\r\n resetAll(control: AbstractControl, ...paths: string[]): void {\r\n if (!paths?.length) return;\r\n\r\n for (const path of paths) {\r\n this.reset(control, path);\r\n }\r\n }\r\n\r\n getControl(control: AbstractControl, path: Path, pathOptions?: PathOptions): AbstractControl | undefined {\r\n return this.applyPath(control, path, pathOptions);\r\n }\r\n\r\n prepend(control: AbstractControl, path: Path, value: any, pathOptions?: PathOptions, patchOptions?: PatchOptions): boolean {\r\n const formArray = this.applyPath(control, path, pathOptions ?? { expected: \"array\", create: true });\r\n if (formArray instanceof FormArray) {\r\n return this.insertIntoArray(formArray, 0, value, patchOptions);\r\n }\r\n return false;\r\n }\r\n\r\n append(control: AbstractControl, path: Path, value: any, pathOptions?: PathOptions, patchOptions?: PatchOptions): boolean {\r\n const formArray = this.applyPath(control, path, pathOptions ?? { expected: \"array\", create: true });\r\n if (formArray instanceof FormArray) {\r\n return this.insertIntoArray(formArray, formArray.length, value, patchOptions);\r\n }\r\n return false;\r\n }\r\n\r\n insert(control: AbstractControl, path: Path, index: number, value: any, pathOptions?: PathOptions, patchOptions?: PatchOptions): boolean {\r\n const formArray = this.applyPath(control, path, pathOptions ?? { expected: \"array\", create: true });\r\n if (formArray instanceof FormArray) {\r\n return this.insertIntoArray(formArray, index, value, patchOptions);\r\n }\r\n return false;\r\n }\r\n\r\n remove(control: AbstractControl, path: Path, index: number): boolean {\r\n const formArray = this.applyPath(control, path);\r\n if (formArray instanceof FormArray) {\r\n return this.removeFromArray(formArray, index);\r\n }\r\n return false;\r\n }\r\n\r\n moveUp(control: AbstractControl, path: Path, index: number): boolean {\r\n const formArray = this.applyPath(control, path);\r\n if (formArray instanceof FormArrayEx) {\r\n return formArray.moveUp(index);\r\n }\r\n return false;\r\n }\r\n\r\n moveDown(control: AbstractControl, path: Path, index: number): boolean {\r\n const formArray = this.applyPath(control, path);\r\n if (formArray instanceof FormArrayEx) {\r\n return formArray.moveDown(index);\r\n }\r\n return false;\r\n }\r\n\r\n status(control: AbstractControl, path: Path, pathOptions?: PathOptions): FormControlStatus | undefined {\r\n const result = this.applyPath(control, path, pathOptions);\r\n return result?.status;\r\n }\r\n\r\n updateAllValueAndValidity(control: AbstractControl, emitEvent: boolean = true): void {\r\n for (const c of this.enumerateControls(control)) {\r\n c.updateValueAndValidity({ emitEvent });\r\n }\r\n }\r\n\r\n getInvalidControls(control: AbstractControl): { path: string, control: AbstractControl }[] {\r\n const invalid: { path: string, control: AbstractControl }[] = [];\r\n\r\n if (control.disabled)\r\n return invalid;\r\n\r\n if (control instanceof FormGroup || control instanceof FormArray) {\r\n const children = Object.values(control.controls);\r\n for (const child of children) {\r\n invalid.push(...this.getInvalidControls(child));\r\n }\r\n }\r\n else if (control.invalid) {\r\n invalid.push({ path: this.getPath(control).join(\".\"), control });\r\n }\r\n\r\n return invalid;\r\n }\r\n\r\n patch(\r\n control: AbstractControl, value: any, options?: PatchOptions): void {\r\n\r\n const defaultOptions = {\r\n emitEvent: true,\r\n validateType: false,\r\n fallbackValue: null,\r\n strict: true\r\n };\r\n\r\n const warn = (message: string) => {\r\n if (options?.emitWarn)\r\n console.warn(`[patchControl] ${message}`)\r\n };\r\n\r\n const error = (message: string) => {\r\n if (options?.emitError)\r\n throw new Error(message);\r\n };\r\n\r\n const { emitEvent, validateType, fallbackValue, strict, canPatch }\r\n = { ...defaultOptions, ...options };\r\n\r\n const isPatchable = (target: AbstractControl) => !canPatch || canPatch(target, value);\r\n\r\n if (!isPatchable(control)) {\r\n return;\r\n }\r\n\r\n if (control instanceof FormControl) {\r\n if (validateType && typeof value !== typeof control.value) {\r\n warn(`Value type mismatch: expected ${typeof control.value}, but received ${typeof value}`);\r\n\r\n if (fallbackValue !== null) {\r\n control.patchValue(fallbackValue, { emitEvent });\r\n return;\r\n }\r\n error('Invalid value type and no fallback value provided.');\r\n return;\r\n }\r\n control.patchValue(value, { emitEvent });\r\n }\r\n else if (control instanceof FormGroup) {\r\n if (isNullableGroup(control)) {\r\n if (value == null) {\r\n control.setNull();\r\n return;\r\n }\r\n else if (control.isNull()) {\r\n control.setNotNull();\r\n }\r\n }\r\n const currentValue = this.asObject(value);\r\n Object.keys(currentValue).forEach((key) => {\r\n if (control.controls[key]) {\r\n this.patch(control.controls[key], value[key], options);\r\n }\r\n else if (!strict) {\r\n const newControl = this.createControlFromValue(value[key]);\r\n this.setUnknown(newControl);\r\n control.addControl(key, newControl);\r\n this.patch(newControl, value[key], options);\r\n }\r\n else {\r\n warn(`Key \"${key}\" not found in the FormGroup.`);\r\n }\r\n });\r\n Object.keys(control.controls).forEach((key) => {\r\n if (!(key in currentValue)) {\r\n const childControl = control.get(key);\r\n if (childControl) {\r\n if (isNullableGroup(childControl))\r\n childControl.setNull();\r\n else\r\n childControl.reset();\r\n }\r\n }\r\n });\r\n }\r\n else if (control instanceof FormArray) {\r\n const currentValue = this.asArray(value);\r\n while (control.length < currentValue.length) {\r\n control.push(new FormGroup({}));\r\n }\r\n while (control.length > currentValue.length) {\r\n control.removeAt(control.length - 1);\r\n }\r\n currentValue.forEach((item: any, index: number) => {\r\n this.patch(control.at(index), item, options);\r\n });\r\n }\r\n else {\r\n error('Unsupported AbstractControl type.');\r\n }\r\n }\r\n\r\n getPath(control: AbstractControl): (string | number)[] {\r\n const path: (string | number)[] = [];\r\n let current: AbstractControl | null = control;\r\n\r\n while (current?.parent) {\r\n const parent: any = current.parent;\r\n\r\n if (parent instanceof FormArray) {\r\n const index = parent.controls.indexOf(current);\r\n path.unshift(index);\r\n } else if (parent instanceof FormGroup) {\r\n const key = Object.keys(parent.controls).find(k => parent.get(k) === current);\r\n if (key) {\r\n path.unshift(key);\r\n }\r\n }\r\n\r\n current = parent;\r\n }\r\n\r\n return path;\r\n }\r\n \r\n getFullPath(control: AbstractControl): string {\r\n const segments: string[] = [];\r\n let current: AbstractControl | null = control;\r\n\r\n while (current?.parent) {\r\n const parent: FormGroup | FormArray = current.parent;\r\n const key = parent instanceof FormArray\r\n ? String(parent.controls.indexOf(current))\r\n : Object.keys(parent.controls).find(k => parent.controls[k] === current);\r\n\r\n if (key === undefined || key === '-1') break; // detached control\r\n segments.unshift(key);\r\n current = parent;\r\n }\r\n\r\n return segments.join('.');\r\n }\r\n\r\n waitForControl(\r\n formGroup: FormGroup\r\n , path: Path\r\n , pathOptions?: PathOptions\r\n ): Observable<AbstractControl> {\r\n\r\n const resolve = (): AbstractControl | undefined =>\r\n this.getControl(formGroup, path, pathOptions);\r\n\r\n const existing = resolve();\r\n if (existing) return of(existing);\r\n\r\n return new Observable<AbstractControl>((observer) => {\r\n const sub = formGroup.valueChanges.subscribe(() => {\r\n const ctrl = resolve();\r\n if (ctrl) {\r\n observer.next(ctrl);\r\n observer.complete();\r\n sub.unsubscribe();\r\n }\r\n });\r\n\r\n return () => sub.unsubscribe();\r\n });\r\n }\r\n\r\n statusChanges(control: AbstractControl\r\n , waitForPending?: () => void\r\n ): Observable<FormControlStatus> {\r\n\r\n if (control.status === 'PENDING' && waitForPending) {\r\n this.waitUntilSettled(control)\r\n .subscribe(() => waitForPending());\r\n }\r\n\r\n return control.statusChanges;\r\n }\r\n\r\n buildControl(value: any): AbstractControl {\r\n if (value instanceof FormControl ||\r\n value instanceof FormGroup ||\r\n value instanceof FormArray) {\r\n return value;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return new FormArray(\r\n value.map(v => this.buildControl(v))\r\n );\r\n }\r\n\r\n if (value !== null && typeof value === 'object') {\r\n\r\n const controls: { [key: string]: AbstractControl } = {};\r\n\r\n for (const key of Object.keys(value)) {\r\n controls[key] = this.buildControl(value[key]);\r\n }\r\n\r\n return new FormGroup(controls);\r\n }\r\n\r\n return new FormControl(value);\r\n }\r\n\r\n getContext(formGroup: any): Record<string, any> {\r\n if (!(formGroup instanceof FormGroup)) {\r\n throw new Error(\"Scope is not a FormGroup\");\r\n }\r\n const patchOptions: PatchOptions = {\r\n strict: false\r\n };\r\n\r\n return {\r\n set: (path: Path, value: any, pathOptions?: PathOptions): boolean =>\r\n this.set(formGroup, path, value, pathOptions, patchOptions),\r\n\r\n get: (path: Path, pathOptions?: PathOptions): AbstractControl | undefined =>\r\n this.get(formGroup, path, pathOptions),\r\n\r\n reset: (path: Path): void =>\r\n this.reset(formGroup, path),\r\n\r\n resetAll: (...paths: string[]): void =>\r\n this.resetAll(formGroup, ...paths),\r\n\r\n status: (path: Path, pathOptions?: PathOptions): FormControlStatus | undefined =>\r\n this.status(formGroup, path, pathOptions),\r\n\r\n prepend: (path: Path, value: any, pathOptions?: PathOptions): boolean =>\r\n this.prepend(formGroup, path, value, pathOptions, patchOptions),\r\n\r\n append: (path: Path, value: any, pathOptions?: PathOptions): boolean =>\r\n this.append(formGroup, path, value, pathOptions, patchOptions),\r\n\r\n insert: (path: Path, index: number, value: any, pathOptions?: PathOptions): boolean =>\r\n this.insert(formGroup, path, index, value, pathOptions, patchOptions),\r\n\r\n remove: (path: Path, index: number): boolean =>\r\n this.remove(formGroup, path, index),\r\n\r\n moveUp: (path: Path, index: number): boolean =>\r\n this.moveUp(formGroup, path, index),\r\n\r\n moveDown: (path: Path, index: number): boolean =>\r\n this.moveDown(formGroup, path, index),\r\n\r\n buildControl: (value: any) => this.buildControl(value),\r\n\r\n getInvalidControls: (control: AbstractControl): { path: string, control: AbstractControl }[] =>\r\n this.getInvalidControls(control)\r\n };\r\n }\r\n\r\n *enumerateControls(\r\n source: AbstractControl | Iterable<AbstractControl>,\r\n options?: EnumerateOptions\r\n ): Generator<AbstractControl> {\r\n\r\n if (!(source instanceof AbstractControl)) {\r\n for (const control of source) {\r\n yield* this.enumerateControls(control, options);\r\n }\r\n return;\r\n }\r\n\r\n const {\r\n expandArray = true,\r\n expandGroup = true,\r\n skipDisabled = false\r\n } = options ?? {};\r\n\r\n if (skipDisabled && source.disabled)\r\n return;\r\n\r\n yield source;\r\n\r\n if (source instanceof FormGroup && expandGroup) {\r\n for (const child of Object.values(source.controls)) {\r\n yield* this.enumerateControls(child, options);\r\n }\r\n }\r\n else if (source instanceof FormArray && expandArray) {\r\n for (const child of source.controls) {\r\n yield* this.enumerateControls(child, options);\r\n }\r\n }\r\n }\r\n\r\n private applyPath(\r\n control: AbstractControl,\r\n path: Path,\r\n options?: PathOptions\r\n ): AbstractControl | undefined {\r\n const warn = (message: string) => {\r\n if (options?.emitWarn) console.warn(`[applyPath] ${message}`);\r\n };\r\n\r\n const error = (message: string): never => {\r\n if (options?.emitError) throw new Error(`[applyPath] ${message}`);\r\n throw new Error(`[applyPath] ${message}`); // fallback default behavior\r\n };\r\n\r\n const createControl = (type: ControlType): AbstractControl => {\r\n switch (type) {\r\n case 'array': return new FormArray([]);\r\n case 'group': return new FormGroup({});\r\n case 'control': default: return new FormControl(null);\r\n }\r\n };\r\n\r\n const segments = normalizePath(path);\r\n let current: AbstractControl | null = control;\r\n const createPath = options?.create ?? false;\r\n\r\n for (let i = 0; i < segments.length; i++) {\r\n const segment = segments[i];\r\n const isLeaf = i === segments.length - 1;\r\n const nextType: ControlType =\r\n isLeaf ? (options?.expected ?? 'control')\r\n : typeof segments[i + 1] === 'number' ? 'array'\r\n : 'group';\r\n\r\n const getCurrentPath = () => segments.slice(0, i + 1).join('.');\r\n\r\n if (!current) {\r\n return error(`Control is null at segment \"${getCurrentPath()}\"`);\r\n }\r\n\r\n if (typeof segment === 'number') {\r\n if (!(current instanceof FormArray)) {\r\n return error(`Expected FormArray at segment [${getCurrentPath()}], got ${current.constructor.name}`);\r\n }\r\n\r\n const index = segment;\r\n if (index < 0 || index >= current.length) {\r\n warn(`Index ${index} is out of bounds at path \"${getCurrentPath()}\" (length = ${current.length})`);\r\n return undefined;\r\n }\r\n\r\n current = current.at(index);\r\n\r\n } else if (typeof segment === 'string') {\r\n\r\n if (segment === 'parent') {\r\n current = (current instanceof FormGroup) && current.get(segment)\r\n ? current.get(segment)\r\n : current.parent;\r\n continue;\r\n }\r\n\r\n if (segment === 'root') {\r\n current = (current instanceof FormGroup && current.get(segment))\r\n ? current.get(segment)\r\n : current.root;\r\n continue;\r\n }\r\n\r\n if ((current instanceof FormArray) && options?.breakOnArray) {\r\n break;\r\n }\r\n\r\n if (!(current instanceof FormGroup)) {\r\n return error(`Expected FormGroup at segment \"${getCurrentPath()}\", got ${current.constructor.name}`);\r\n }\r\n\r\n if (current.get(segment)) {\r\n current = current.get(segment);\r\n\r\n if (!isLeaf && current instanceof FormControl && current.value === null && options?.breakOnNull) {\r\n break;\r\n }\r\n\r\n } else {\r\n if (createPath) {\r\n const newControl = createControl(nextType);\r\n current.addControl(segment, newControl);\r\n current = newControl;\r\n }\r\n else {\r\n warn(`Control with key \"${getCurrentPath()}\" not found in FormGroup.`);\r\n return undefined;\r\n }\r\n }\r\n\r\n }\r\n else if (!segment) {\r\n continue;\r\n }\r\n else {\r\n return error(`Invalid segment type: ${typeof segment}`);\r\n }\r\n }\r\n\r\n return current ?? undefined;\r\n }\r\n\r\n private asObject(value: any): object {\r\n if (value && typeof value === 'object' && !Array.isArray(value)) {\r\n return value as Record<string, any>;\r\n }\r\n return {};\r\n }\r\n\r\n private asArray(value: any): Array<any> {\r\n if (value && Array.isArray(value)) {\r\n return value;\r\n }\r\n return [];\r\n }\r\n\r\n private insertIntoArray(formArray: FormArray, index: number, value: any, options?: PatchOptions): boolean {\r\n const itemToAdd = this.createArrayItem(formArray);\r\n this.patch(itemToAdd, value, options);\r\n formArray.insert(index, itemToAdd);\r\n return true;\r\n }\r\n\r\n private removeFromArray(formArray: FormArray, index: number): boolean {\r\n if (index <= 0 || index >= formArray.length) false;\r\n formArray.removeAt(index);\r\n return true;\r\n }\r\n\r\n private createArrayItem(formArray: FormArray): FormGroup {\r\n const anyControl = formArray as any;\r\n const formGroup = (typeof (anyControl).createItem === 'function')\r\n ? anyControl.createItem()\r\n : new FormGroup({});\r\n return formGroup;\r\n }\r\n\r\n private createControlFromValue(value: any): AbstractControl {\r\n if (value === null || typeof value !== 'object') {\r\n return new FormControl(value);\r\n }\r\n if (Array.isArray(value)) {\r\n return new FormArray(this.createControlFromArray(value));\r\n }\r\n return new FormGroup({});\r\n }\r\n\r\n private createControlFromArray(array: any[]): AbstractControl[] {\r\n return array.map(item => this.createControlFromValue(item));\r\n }\r\n\r\n private setUnknown(control: any) {\r\n control._unknown = true;\r\n }\r\n\r\n private isUnknown(control: any): boolean {\r\n return control && control._unknown === true;\r\n }\r\n\r\n private waitUntilSettled(\r\n control: AbstractControl,\r\n pollInterval = 100\r\n ): Observable<FormControlStatus> {\r\n return interval(pollInterval).pipe(\r\n map(() => control.status),\r\n filter(status => status !== 'PENDING'),\r\n take(1)\r\n );\r\n }\r\n}\r\n","import { DestroyRef, Injectable } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { AbstractControl, FormArray, FormGroup } from '@angular/forms';\r\nimport { filter, map, Observable, pairwise, startWith } from 'rxjs';\r\n\r\n@Injectable()\r\nexport class SubscribeService {\r\n\r\n get dispatchMode(): DispatchMode {\r\n return this._dispatchMode;\r\n }\r\n\r\n set dispatchMode(value: DispatchMode) {\r\n this._dispatchMode = value;\r\n }\r\n\r\n subscribeChanges<T>(\r\n observable$: Observable<T>,\r\n control: AbstractControl,\r\n initial: T,\r\n destroyRef: DestroyRef,\r\n callback: (() => void) | ((oldValue: T, newValue: T) => void),\r\n logFn?: (control: AbstractControl) => void,\r\n emitWhenUnchanged = false\r\n ) {\r\n observable$\r\n .pipe(\r\n map(value => ({ value, disabled: control.disabled })),\r\n startWith({ value: initial, disabled: control.disabled }),\r\n pairwise(),\r\n filter(([previous, current]) => {\r\n return emitWhenUnchanged\r\n || control instanceof FormArray\r\n || control instanceof FormGroup\r\n || previous.value !== current.value\r\n || previous.disabled !== current.disabled\r\n }),\r\n takeUntilDestroyed(destroyRef)\r\n )\r\n .subscribe(([previous, current]) => {\r\n\r\n this.dispatch(() => {\r\n if (callback.length === 0) {\r\n (callback as () => void)();\r\n } else {\r\n (callback as (oldValue: T, newValue: T) => void)(previous.value, current.value);\r\n }\r\n\r\n logFn?.(control);\r\n }, destroyRef);\r\n\r\n });\r\n }\r\n\r\n private _dispatchMode: DispatchMode = 'async';\r\n\r\n private dispatch(\r\n fn: () => void,\r\n destroyRef: DestroyRef\r\n ): void {\r\n\r\n let alive = true;\r\n\r\n destroyRef.onDestroy(() => {\r\n alive = false;\r\n });\r\n\r\n if (this._dispatchMode === 'sync') {\r\n fn();\r\n return;\r\n }\r\n\r\n queueMicrotask(() => {\r\n if (!alive) return;\r\n fn();\r\n });\r\n }\r\n}\r\n\r\nexport type DispatchMode = 'sync' | 'async';\r\n\r\n","import { Injectable, PLATFORM_ID, inject } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { Observable, Subject } from 'rxjs';\r\n\r\nexport interface SessionChange<T = unknown> {\r\n key: string;\r\n value: T | null; // null when the key has been removed\r\n previousValue: T | null;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class SessionService {\r\n // sessionStorage does not exist during server-side rendering\r\n private readonly storage = isPlatformBrowser(inject(PLATFORM_ID)) ? sessionStorage : null;\r\n\r\n private readonly changes = new Subject<SessionChange>();\r\n\r\n get<T>(key: string): T | null {\r\n return this.parse<T>(this.storage?.getItem(key) ?? null);\r\n }\r\n\r\n set<T>(key: string, value: T): void {\r\n this.write(key, JSON.stringify(value) ?? null);\r\n }\r\n\r\n remove(key: string): void {\r\n this.write(key, null);\r\n }\r\n\r\n // Emits every change to any key in this tab\r\n watch(): Observable<SessionChange> {\r\n return this.changes.asObservable();\r\n }\r\n\r\n private write(key: string, raw: string | null): void {\r\n const previousRaw = this.storage?.getItem(key) ?? null;\r\n\r\n // Compare serialized values: no emission when nothing actually changed\r\n if (raw === previousRaw) return;\r\n\r\n try {\r\n if (raw === null) this.storage?.removeItem(key);\r\n else this.storage?.setItem(key, raw);\r\n } catch {\r\n // Quota exceeded or storage blocked: notify anyway, the app keeps working\r\n }\r\n\r\n this.changes.next({ key, value: this.parse(raw), previousValue: this.parse(previousRaw) });\r\n }\r\n\r\n private parse<T>(raw: string | null): T | null {\r\n try {\r\n return raw ? (JSON.parse(raw) as T) : null;\r\n } catch {\r\n // Corrupted value\r\n return null;\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { NavigationStart, Router } from '@angular/router';\r\nimport { filter } from 'rxjs';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class NavigationService {\r\n\r\n constructor(private router: Router)\r\n {\r\n router.events\r\n .pipe(filter(e => e instanceof NavigationStart))\r\n .subscribe((e: NavigationStart) => {\r\n this._skipState = this.shouldSkipState(e);\r\n });\r\n }\r\n\r\n //#region Skip State\r\n\r\n private _skipState = false;\r\n\r\n get skipState(): boolean {\r\n return this._skipState;\r\n }\r\n\r\n private shouldSkipState(e: NavigationStart): boolean {\r\n if (e.navigationTrigger === 'popstate') {\r\n return false;\r\n }\r\n const nav = this.router.getCurrentNavigation();\r\n return this._skipState = nav?.extras.state?.['skipState'] === true;\r\n }\r\n\r\n //#endregion\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { NavigationService } from './navigation.service';\r\n\r\n@Injectable()\r\nexport class StateService {\r\n\r\n constructor(private navigation: NavigationService) {\r\n }\r\n\r\n private static readonly store = new Map<string, any>();\r\n\r\n private readonly prefix = `state:${location.href}:`;\r\n\r\n getState<T = any>(componentId: string): T | null {\r\n const key = this.buildKey(componentId);\r\n const state = StateService.store.get(key) ?? null;\r\n this.clearState(componentId);\r\n if (this.navigation.skipState) return null;\r\n return state;\r\n }\r\n\r\n setState(componentId: string, value: any): void {\r\n const key = this.buildKey(componentId);\r\n if (value === undefined || value === null) {\r\n StateService.store.delete(key);\r\n return;\r\n }\r\n StateService.store.set(key, value);\r\n }\r\n\r\n clearState(componentId: string): void {\r\n const key = this.buildKey(componentId);\r\n StateService.store.delete(key);\r\n }\r\n\r\n private buildKey(componentId: string): string {\r\n return `${this.prefix}${componentId}`.toLowerCase();\r\n }\r\n\r\n}\r\n","import { ElementRef, Injector, DestroyRef } from \"@angular/core\";\r\nimport { RegisterService } from \"../services/register.service\";\r\nimport { StateService } from \"../services/state.service\";\r\n\r\nexport class Control {\r\n\r\n private readonly context: ControlContext;\r\n\r\n constructor(context: ControlContext) {\r\n if (!context) {\r\n throw new Error('ControlContext must not be null or undefined');\r\n }\r\n\r\n this.context = context;\r\n\r\n const stateless = (context.metadata?.stateless === true);\r\n\r\n context.destroyRef?.onDestroy(() => {\r\n if (!stateless) {\r\n this.onSaveState();\r\n } \r\n this.onDestroy();\r\n });\r\n\r\n this.onInit();\r\n\r\n if (!stateless) {\r\n setTimeout(() => this.onLoadState());\r\n }\r\n \r\n }\r\n\r\n public get name(): string {\r\n return this.context.name;\r\n }\r\n\r\n protected getMetadata(): any {\r\n return this.context.metadata;\r\n }\r\n\r\n protected getComponentRef(): any {\r\n return this.context.componentRef;\r\n }\r\n\r\n protected getElementRef(): ElementRef {\r\n return this.context.elementRef;\r\n }\r\n\r\n protected getInjector(): Injector {\r\n return this.context.injector;\r\n }\r\n\r\n protected getDestroyRef(): DestroyRef {\r\n return this.context.destroyRef;\r\n }\r\n\r\n protected getRegister(): RegisterService | undefined {\r\n return this.context.register();\r\n }\r\n\r\n protected onInit(): void {\r\n }\r\n\r\n protected onLoadState(): void {\r\n }\r\n\r\n protected onSaveState(): void {\r\n }\r\n\r\n protected onDestroy(): void {\r\n }\r\n\r\n protected getState<T = any>(): T | null {\r\n const id = this.getId();\r\n if (!id) return null;\r\n return this.State()?.getState(id);\r\n }\r\n\r\n protected setState(state: any): void {\r\n const id = this.getId();\r\n if (!id) return;\r\n this.State()?.setState(id, state);\r\n }\r\n\r\n protected clearState(): void {\r\n const id = this.getId();\r\n if (!id) return;\r\n this.State()?.clearState(id);\r\n }\r\n\r\n //#region Private Members\r\n\r\n private getId(): string | null {\r\n return `${this.context.path}.${this.context.name}`;\r\n }\r\n\r\n private State() {\r\n return this.getInjector().get(StateService);\r\n }\r\n\r\n //#endregion\r\n\r\n}\r\n\r\nexport class ContainerControl extends Control {\r\n\r\n constructor(context: ControlContext) {\r\n super(context);\r\n }\r\n\r\n findControl(\r\n predicate: (control: Control) => boolean,\r\n firstOnly: boolean\r\n ): Control[] {\r\n const register = this.getRegister();\r\n return register\r\n ? register.findControl(predicate, firstOnly, false)\r\n : [];\r\n }\r\n}\r\n\r\nexport class ItemControl extends ContainerControl {\r\n\r\n constructor(context: ControlContext,\r\n public readonly index: number) {\r\n super(context);\r\n }\r\n\r\n}\r\n\r\nexport interface ControlContext {\r\n name: string;\r\n path: string;\r\n metadata: any;\r\n componentRef: any;\r\n elementRef: ElementRef;\r\n injector: Injector;\r\n destroyRef: DestroyRef;\r\n register: () => RegisterService | undefined; \r\n}\r\n","import { Injectable, Optional, SkipSelf } from '@angular/core';\r\nimport { Control, ContainerControl } from '../controls/control';\r\nimport { IEvaluatorProvider } from '../services/programmability.service';\r\nimport { toProxy } from '../utils/proxy';\r\n\r\n@Injectable()\r\nexport class RegisterService implements IEvaluatorProvider {\r\n\r\n constructor(\r\n @Optional() @SkipSelf() private parent: RegisterService | null)\r\n {\r\n }\r\n\r\n private controls: Record<string, Control> = {};\r\n\r\n //#region Registration\r\n\r\n register(name: string, control: Control) {\r\n this.controls[name] = control;\r\n }\r\n\r\n unregister(name: string) {\r\n delete this.controls[name];\r\n }\r\n\r\n unregisterAll() {\r\n this.controls = { };\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Hierarchy\r\n\r\n identify(id: string, index?: number): void {\r\n if (!id)\r\n id = crypto.randomUUID();\r\n\r\n if (this.identityNode)\r\n throw new Error('IdentityNode: already initialized');\r\n\r\n this.identityNode = { id, index };\r\n\r\n this._path = undefined;\r\n }\r\n\r\n getPath(): string {\r\n if (this._path)\r\n return this._path;\r\n\r\n this._path = this.identityChain\r\n .map(node =>\r\n node.index != null\r\n ? `${node.id}.${node.index}`\r\n : node.id\r\n )\r\n .join('.');\r\n\r\n return this._path;\r\n }\r\n\r\n private _path?: string;\r\n\r\n private identityNode?: IdentityNode;\r\n\r\n private get identityChain(): readonly IdentityNode[] {\r\n if (!this.identityNode) {\r\n return this.parent\r\n ? this.parent.identityChain\r\n : [];\r\n }\r\n return this.parent\r\n ? [...this.parent.identityChain, this.identityNode]\r\n : [this.identityNode];\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Controls\r\n\r\n getContext(): Record<string, any> {\r\n return {\r\n control: (name: string) => toProxy(this.getControl(name))\r\n };\r\n }\r\n\r\n getControl(name: string): Control | null {\r\n name = this.castString(name);\r\n\r\n if (!name)\r\n return null;\r\n\r\n if (name.startsWith(\"../\"))\r\n return this.resolveParent(name.substring(3));\r\n \r\n const controls = this.findControl(control => control.name === name, true, true);\r\n return (controls.length === 0)\r\n ? null\r\n : controls[0];\r\n }\r\n\r\n getControlAs<T extends Control>(name: string, type: new (...args: any[]) => T): T | null {\r\n const ctrl = this.getControl(name);\r\n return ctrl instanceof type ? ctrl : null;\r\n }\r\n\r\n findControl(predicate: (control: Control) => boolean, firstOnly: boolean = false, parent: boolean = false): Control[] {\r\n const controls: Control[] = [];\r\n\r\n for (const control of Object.values(this.controls)) {\r\n if (predicate(control)) {\r\n controls.push(control);\r\n if (firstOnly) {\r\n return controls;\r\n }\r\n }\r\n\r\n if (control instanceof ContainerControl) {\r\n controls.push(...control.findControl(predicate, firstOnly));\r\n if (controls.length > 0 && firstOnly) {\r\n return controls;\r\n }\r\n }\r\n }\r\n\r\n if (parent) {\r\n let currentParent = this.parent;\r\n\r\n while (currentParent) {\r\n for (const control of Object.values(currentParent.controls)) {\r\n if (predicate(control)) {\r\n controls.push(control);\r\n if (firstOnly) {\r\n return controls;\r\n }\r\n }\r\n }\r\n currentParent = currentParent.parent;\r\n }\r\n }\r\n \r\n return controls;\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Private Members\r\n\r\n private castString(value: any): string {\r\n return typeof value === 'string' ? value.trim() : \"\";\r\n }\r\n\r\n private resolveParent(name: string) : Control | null {\r\n if (!this.parent) {\r\n return null;\r\n }\r\n else {\r\n return this.parent.getControl(name);\r\n }\r\n }\r\n\r\n //#endregion\r\n}\r\n\r\nexport interface IdentityNode {\r\n id: string;\r\n index?: number;\r\n}\r\n","import { EffectRef, Injector, Signal, WritableSignal, effect, isSignal, untracked } from '@angular/core';\r\nimport { Path, PathSegments, isIndexSegment, normalizePath } from '../common/path';\r\n\r\n/**\r\n * Watches the value at the path of the object when the path goes through signals:\r\n * - `partial` (default): registers when there is at least one signal on the path (e.g. `cliente`\r\n * for `cliente.citta` when only `cliente` is a signal, or a path that breaks after a signal);\r\n * - not `partial`: registers only when the leaf of the path is a signal.\r\n * Once registered, every signal along the path is tracked, so a replaced intermediate value (e.g. a\r\n * new object with a new inner signal) is followed too; `onChange` is called with the new value at\r\n * the end of the path whenever it changes (not on the first read).\r\n * Returns the effect, or null when there is nothing to register on. The effect lives as long as its\r\n * injector (when omitted the call must be in an injection context), or until `destroy()`.\r\n */\r\nexport function watchSignalPath(\r\n root: unknown,\r\n path: Path,\r\n onChange: (value: unknown) => void,\r\n partial = true,\r\n injector?: Injector,\r\n): EffectRef | null {\r\n const segments = normalizePath(path);\r\n if (!untracked(() => findSignal(root, segments, partial))) {\r\n return null;\r\n }\r\n\r\n let first = true;\r\n let previous: unknown;\r\n // Created outside any reactive context: the watch can be requested while a template or a\r\n // computed is being evaluated (effect() would throw NG0602 there).\r\n return untracked(() =>\r\n effect(() => {\r\n const value = readSignalPath(root, segments);\r\n if (first) {\r\n first = false;\r\n previous = value;\r\n return;\r\n }\r\n if (Object.is(value, previous)) {\r\n return;\r\n }\r\n previous = value;\r\n untracked(() => onChange(value));\r\n }, { injector }),\r\n );\r\n}\r\n\r\n/**\r\n * Value at the path of the object, reading every signal found on the way (leaf included): inside a\r\n * reactive context all of them are tracked. Undefined when the path breaks.\r\n */\r\nexport function readSignalPath(root: unknown, path: Path): unknown {\r\n let node: any = isSignal(root) ? root() : root;\r\n for (const segment of normalizePath(path)) {\r\n if (node === null || (typeof node !== 'object' && typeof node !== 'function')) {\r\n return undefined;\r\n }\r\n node = node[segment];\r\n if (isSignal(node)) {\r\n node = node();\r\n }\r\n }\r\n return node;\r\n}\r\n\r\n/** The last signal along the path (partial) or the signal at the leaf (not partial). */\r\nfunction findSignal(root: unknown, segments: PathSegments, partial: boolean): Signal<unknown> | null {\r\n let node: any = root;\r\n let last: Signal<unknown> | null = null;\r\n for (let i = 0; i < segments.length; i++) {\r\n if (isSignal(node)) {\r\n last = node;\r\n node = node();\r\n }\r\n if (node === null || (typeof node !== 'object' && typeof node !== 'function')) {\r\n return partial ? last : null;\r\n }\r\n node = node[segments[i]];\r\n }\r\n if (isSignal(node)) {\r\n return node;\r\n }\r\n return partial ? last : null;\r\n}\r\n\r\n/**\r\n * Writes the value at the path of the object, respecting the signals found on the way:\r\n * - a writable signal at the end of the path gets `set(value)` (it is never replaced);\r\n * - a writable signal in the middle gets `set()` of a copy of its value with the change applied, so\r\n * the signal notifies its consumers (nested signals inside it are written directly);\r\n * - read-only signals (computed, input) are not written: a warning is logged;\r\n * - plain objects are changed in place; missing branches are created (`[]` before an index segment,\r\n * `{}` otherwise).\r\n * Returns true when something was written.\r\n */\r\nexport function writeSignalPath(root: object, segments: PathSegments, value: unknown): boolean {\r\n if (segments.length === 0) {\r\n return false;\r\n }\r\n return writeNode(root, segments, value, false).changed;\r\n}\r\n\r\ninterface NodeWrite {\r\n /** The node after the write: the same one, or a copy when `copy` was requested. */\r\n node: any;\r\n /** True when something was written. */\r\n changed: boolean;\r\n}\r\n\r\nfunction writeNode(node: any, segments: PathSegments, value: unknown, copy: boolean): NodeWrite {\r\n const [head, ...rest] = segments;\r\n const isObject = node !== null && typeof node === 'object';\r\n let target: any = isObject ? node : isIndexSegment(head) ? [] : {};\r\n const created = !isObject;\r\n const current = target[head];\r\n\r\n if (isSignal(current)) {\r\n // The signal keeps its place in the node: only its value changes.\r\n const changed = writeSignal(current, head, rest, value);\r\n return { node: target, changed: changed || created };\r\n }\r\n\r\n let next: unknown;\r\n let changed: boolean;\r\n if (rest.length === 0) {\r\n next = value;\r\n changed = current !== value;\r\n } else {\r\n const inner = writeNode(current, rest, value, copy);\r\n next = inner.node;\r\n changed = inner.changed;\r\n }\r\n\r\n if (next === current) {\r\n // Unchanged, or changed below this node without replacing it.\r\n return { node: target, changed: changed || created };\r\n }\r\n if (copy && !created) {\r\n target = Array.isArray(target) ? [...target] : { ...target };\r\n }\r\n target[head] = next;\r\n return { node: target, changed: true };\r\n}\r\n\r\nfunction writeSignal(\r\n source: Signal<unknown>,\r\n head: string | number,\r\n rest: PathSegments,\r\n value: unknown,\r\n): boolean {\r\n if (!isWritableSignal(source)) {\r\n console.warn(`Scope: \"${String(head)}\" is a read-only signal, the value is not written.`);\r\n return false;\r\n }\r\n const base = untracked(source);\r\n if (rest.length === 0) {\r\n if (Object.is(value, base)) {\r\n return false;\r\n }\r\n source.set(value);\r\n return true;\r\n }\r\n // Below a signal the objects are copied, so that the signal notifies the change.\r\n const inner = writeNode(base, rest, value, true);\r\n if (inner.node !== base) {\r\n source.set(inner.node);\r\n }\r\n // Same node: unchanged, or changed through a nested signal.\r\n return inner.changed;\r\n}\r\n\r\nfunction isWritableSignal(source: Signal<unknown>): source is WritableSignal<unknown> {\r\n return typeof (source as Partial<WritableSignal<unknown>>).set === 'function';\r\n}\r\n","import { EffectRef, Injectable, Injector, Optional, SkipSelf, inject } from '@angular/core';\r\nimport { IEvaluatorProvider } from '../services/programmability.service';\r\nimport { Observable, Subject } from 'rxjs';\r\nimport { filter } from 'rxjs/operators';\r\nimport { Path, PathSegments, normalizePath, matchPath } from '../common/path';\r\nimport { toProxy } from '../utils/proxy';\r\nimport { watchSignalPath, writeSignalPath } from '../utils/signal';\r\n\r\n@Injectable()\r\nexport class ScopeService implements IEvaluatorProvider {\r\n\r\n constructor(\r\n @Optional() @SkipSelf() private parent: ScopeService | null) {\r\n }\r\n\r\n private readonly injector = inject(Injector);\r\n\r\n private scope: Record<string, any> | null = null;\r\n\r\n private readonly refreshSubject = new Subject<Path>();\r\n\r\n readonly onRefresh: Observable<Path> = this.refreshSubject.asObservable();\r\n\r\n /** Paths requested with watch(), by key: watched again when the scope is replaced. */\r\n private readonly requested = new Map<string, PathSegments>();\r\n\r\n /** Effects of the watched paths that go through signals, by key. */\r\n private readonly watchers = new Map<string, EffectRef>();\r\n\r\n set(scope: Record<string, any> | null) {\r\n this.scope = scope;\r\n this.unwatchAll();\r\n for (const [key, segments] of this.requested) {\r\n this.watchSignals(key, segments);\r\n }\r\n }\r\n\r\n get(): Record<string, any> | null {\r\n return this.scope; \r\n }\r\n\r\n refresh(path: Path = []): void {\r\n this.refreshSubject.next(path);\r\n }\r\n\r\n refreshMany(...paths: Path[]): void {\r\n for (const path of paths) {\r\n this.refresh(path);\r\n }\r\n }\r\n\r\n /**\r\n * Refreshes that concern the given path: the explicit ones (refresh(), setValue()) and, when the\r\n * path goes through signals of the scope, the changes of those signals.\r\n */\r\n watch(path: Path): Observable<Path> {\r\n const segments = normalizePath(path);\r\n const key = segments.join('.');\r\n if (!this.requested.has(key)) {\r\n this.requested.set(key, segments);\r\n this.watchSignals(key, segments);\r\n }\r\n return this.onRefresh.pipe(filter(p => matchPath(p, segments)));\r\n }\r\n\r\n setValue(path: Path, value: any): void {\r\n if (!this.scope) return;\r\n\r\n const segments = normalizePath(path);\r\n if (segments.length === 0) return;\r\n\r\n if (writeSignalPath(this.scope, segments, value)) {\r\n this.refresh(path);\r\n }\r\n }\r\n\r\n getContext(): Record<string, any> {\r\n if (!this.scope) return {};\r\n const ctx = toProxy(this.scope);\r\n if (!(\"parent\" in ctx)) ctx.parent = () => this.parent?.getContext();\r\n if (!(\"set\" in ctx)) ctx.set = this.setValue.bind(this);\r\n return ctx;\r\n }\r\n\r\n /** Watches the last signal along the path (nothing to do when the path has none). */\r\n private watchSignals(key: string, segments: PathSegments): void {\r\n if (!this.scope) return;\r\n const ref = watchSignalPath(this.scope, segments, () => this.refresh(segments), true, this.injector);\r\n if (ref) {\r\n this.watchers.set(key, ref);\r\n }\r\n }\r\n\r\n private unwatchAll(): void {\r\n for (const ref of this.watchers.values()) {\r\n ref.destroy();\r\n }\r\n this.watchers.clear();\r\n }\r\n}\r\n","import { DestroyRef, inject, Injectable, Optional } from '@angular/core';\r\nimport { AbstractControl, FormArray, FormControlStatus, FormGroup } from '@angular/forms';\r\nimport { FeelService } from '../services/feel.service';\r\nimport { ScopeService } from '../services/scope.service';\r\nimport { RegisterService } from '../services/register.service';\r\nimport { ToastService } from '../services/toast.service';\r\nimport { FunctionService } from '../services/function.service';\r\nimport { GlobalService } from '../services/global.service';\r\nimport { FormService, PathOptions } from './form.service';\r\nimport { DialogService } from '../services/dialog.service';\r\nimport { FormatterService } from '../services/formatter.service';\r\nimport { JsonService } from '../services/json.service';\r\nimport { WeakService } from '../services/weak.service';\r\nimport { SubscribeService } from '../services/subscribe.service';\r\nimport { toProxy } from '../utils/proxy';\r\nimport { isObservable, Observable } from \"rxjs\";\r\nimport { filter, shareReplay, tap } from 'rxjs/operators';\r\nimport { Path } from '../common/path';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { CacheControl } from '../utils/cacheControl';\r\nimport { Notifier } from '../utils/notifier';\r\nimport { ActivatedRoute, Params } from '@angular/router';\r\nimport { SessionService } from './session.service';\r\n\r\nconst StatusDependency = \"$status\";\r\n\r\n@Injectable()\r\nexport class ProgrammabilityService {\r\n\r\n constructor(private feelService: FeelService\r\n , private weakService: WeakService\r\n , private toastService: ToastService\r\n , private dialogService: DialogService\r\n , private formatterService: FormatterService\r\n , private jsonService : JsonService\r\n , private functionService: FunctionService\r\n , private formService: FormService\r\n , private globalService: GlobalService\r\n , private subscribeService: SubscribeService\r\n , private session: SessionService\r\n , private destroyRef: DestroyRef\r\n , @Optional() private register: RegisterService\r\n , @Optional() private scope: ScopeService\r\n ) {\r\n this.Init();\r\n\r\n this.evaluatorProviders = [\r\n this.dialogService,\r\n this.toastService,\r\n this.functionService,\r\n this.formatterService,\r\n this.jsonService,\r\n this.register \r\n ];\r\n\r\n this.predefinedFunctions = this.getPredefinedFunctions();\r\n\r\n this.queryParams$.pipe(takeUntilDestroyed()).subscribe();\r\n }\r\n\r\n /*\r\n Global Properties:\r\n - feel-diagnostics: \"on\", \"off\"\r\n - feel-cacheable: \"on\", \"off\"\r\n */\r\n\r\n readonly evaluationDone = new Notifier();\r\n \r\n private predefinedFunctions!: Record<string, any>;\r\n\r\n private evaluatorProviders: IEvaluatorProvider[] = [];\r\n\r\n addEvaluatorProviders(evaluatorProvider: IEvaluatorProvider): void {\r\n if (evaluatorProvider) {\r\n this.evaluatorProviders.push(evaluatorProvider);\r\n this.predefinedFunctions = this.getPredefinedFunctions();\r\n }\r\n }\r\n\r\n isExpression(text: string | null | undefined): boolean {\r\n return typeof text === 'string' && text.startsWith(\"=\");\r\n };\r\n\r\n getExpression(text: string | null | undefined): string {\r\n if (this.isExpression(text))\r\n return text!.substring(1);\r\n return \"\";\r\n };\r\n\r\n evaluateString(formGroup: FormGroup, value: string | null | undefined, options: EvaluateOptions = {}): string {\r\n if (this.isExpression(value)) {\r\n return this.evalExpression(formGroup, this.getExpression(value), options) as string;\r\n }\r\n return value ?? \"\";\r\n }\r\n\r\n evaluateBoolean(formGroup: FormGroup, value: boolean | string | null | undefined, options: EvaluateOptions = {}): boolean | null {\r\n if (typeof value === 'boolean') {\r\n return value;\r\n }\r\n else if (this.isExpression(value)) {\r\n return this.evalExpression(formGroup, this.getExpression(value), options) as boolean; \r\n }\r\n return null;\r\n }\r\n\r\n evaluateNumber(formGroup: FormGroup, value: number | string | null | undefined, options: EvaluateOptions = {}): number | null {\r\n if (typeof value === 'number') {\r\n return value;\r\n }\r\n else if (this.isExpression(value)) {\r\n return this.evalExpression(formGroup, this.getExpression(value), options) as number;\r\n }\r\n return null;\r\n }\r\n\r\n evaluate(formGroup: FormGroup, value: string | null, options: EvaluateOptions = { }): any {\r\n if (this.isExpression(value)) {\r\n return this.evalExpression(formGroup, this.getExpression(value), options);\r\n }\r\n return value;\r\n }\r\n\r\n evaluateTemplate(formGroup: FormGroup, value: string | null, options: EvaluateOptions = {}): any {\r\n\r\n let template: string | null = null;\r\n\r\n if (this.isExpression(value)) {\r\n template = this.evalExpression(formGroup, this.getExpression(value), options) as string;\r\n }\r\n else {\r\n template = value;\r\n }\r\n\r\n if (!template)\r\n return \"\";\r\n\r\n return this.evalTemplate(formGroup, template, options);\r\n }\r\n\r\n evaluateUnary(formGroup: FormGroup, value: string | null, input: any, options: EvaluateOptions = {}): any {\r\n if (this.isExpression(value)) {\r\n return this.evalUnaryTest(formGroup, this.getExpression(value), input, options);\r\n }\r\n return null;\r\n }\r\n\r\n invalidate(value: string | null): void {\r\n if (this.isExpression(value)) {\r\n this.invalidateExpression(this.getExpression(value)); \r\n }\r\n }\r\n\r\n invalidateAll(): void {\r\n this.invalidateAllExpression(); \r\n }\r\n\r\n watch(formGroup: FormGroup\r\n , dependencies: (string | string[])[]\r\n , callback: () => void\r\n , destroyRef?: DestroyRef) {\r\n this.watchingDependencies(formGroup, dependencies, callback, destroyRef ?? this.destroyRef);\r\n }\r\n\r\n getDependencies(formGroup: FormGroup, expression: string): (string | string[])[] {\r\n const context = this.getContext(formGroup)\r\n return this.feelService.getDependencies(expression, context);\r\n }\r\n\r\n get verbose(): boolean {\r\n return this._verbose;\r\n }\r\n\r\n get cacheable(): boolean {\r\n return this._cacheable;\r\n }\r\n\r\n private _verbose = false;\r\n\r\n private _cacheable = true;\r\n\r\n private onErrorHandler: any = this.onError.bind(this);\r\n\r\n private Init() {\r\n this._cacheable = this.globalService.getProperty(\"feel-cacheable\", \"on\") === \"on\";\r\n this._verbose = this.globalService.getProperty(\"feel-diagnostics\", \"off\") === \"on\";\r\n if (this.verbose)\r\n console.log(\"Programmability Service Initialized\", { cacheable: this.cacheable, verbose: this.verbose });\r\n }\r\n\r\n private evalUnaryTest(formGroup: FormGroup, expression: string, input: any, options: EvaluateOptions = {}) {\r\n const logError = (expression: string, error: any) => {\r\n console.warn(expression, { formGroup, error });\r\n };\r\n\r\n const logEvaluation = (expression: string, result: any) => {\r\n if (!this.verbose) return;\r\n console.log(\"Evaluate UnaryTest:\", expression, result, { formGroup });\r\n };\r\n\r\n try {\r\n const context = this.getContext(formGroup, options);\r\n const result = this.feelService.evalUnaryTest(expression\r\n , context\r\n , input);\r\n logEvaluation(expression, result);\r\n return result;\r\n } catch (e) {\r\n logError(expression, e);\r\n return null;\r\n }\r\n finally {\r\n this.evaluationDone.notify();\r\n }\r\n }\r\n\r\n private evalExpression(formGroup: FormGroup, expression: string, options: EvaluateOptions = {}): any {\r\n\r\n const logError = (expression: string, error: any) => {\r\n console.warn(expression, { formGroup, options, error });\r\n };\r\n\r\n const logInvalidate = (expression: string) => {\r\n if (!this.verbose) return;\r\n console.log(\"Invalidate Expression:\", expression, { formGroup, options });\r\n };\r\n\r\n const logEvaluation = (expression: string, result: any) => {\r\n if (!this.verbose) return;\r\n console.log(\"Evaluate Expression:\", expression, result, { formGroup, options });\r\n };\r\n\r\n const cacheControl = new CacheControl();\r\n\r\n const fullHydratation = options.hydrate === true;\r\n\r\n const evaluate = () => {\r\n try {\r\n const context = this.getContext(formGroup, options);\r\n cacheControl.configure(context);\r\n const result = this.feelService.evalExpression(expression, context);\r\n logEvaluation(expression, result);\r\n if (cacheControl.ttl != null)\r\n setTimeout(() => this.invalidateExpression(expression), cacheControl.ttl);\r\n const hydrated = this.functionService.hydrate(result, fullHydratation);\r\n return options.transform ? options.transform(hydrated) : hydrated;\r\n }\r\n catch (e) {\r\n logError(expression, e);\r\n return null;\r\n }\r\n finally {\r\n this.evaluationDone.notify();\r\n }\r\n };\r\n\r\n const cacheable = options.cacheable ?? this.cacheable;\r\n\r\n if (cacheable) {\r\n\r\n const ignoreDeps = options.ignoreDeps ?? false;\r\n\r\n if (!ignoreDeps) {\r\n const watchKey = `:watch(${expression})`;\r\n\r\n this.weakService.call(this, watchKey, () => {\r\n this.watchingExpression(formGroup, expression\r\n , () => {\r\n this.invalidateExpression(expression);\r\n options.cacheInvalidated?.();\r\n logInvalidate(expression);\r\n }\r\n , options?.destroyRef);\r\n return true;\r\n });\r\n }\r\n }\r\n \r\n let result = cacheable\r\n ? this.weakService.call(this, expression, evaluate, null, this.onErrorHandler, () => !cacheControl.isVolatile)\r\n : evaluate();\r\n\r\n if (options?.invokeArgs && typeof result === 'function') {\r\n return result(...options.invokeArgs); \r\n }\r\n\r\n return result;\r\n }\r\n\r\n private evalTemplate(formGroup: FormGroup, expression: string, options: EvaluateOptions = {}): any {\r\n\r\n const logError = (expression: string, error: any) => {\r\n console.warn(expression, { formGroup, options, error });\r\n };\r\n\r\n const logInvalidate = (expression: string) => {\r\n if (!this.verbose) return;\r\n console.log(\"Invalidate Template:\", expression, { formGroup, options });\r\n };\r\n\r\n const logEvaluation = (expression: string, result: any) => {\r\n if (!this.verbose) return;\r\n console.log(\"Evaluate Template:\", expression, result, { formGroup, options });\r\n };\r\n\r\n const cacheControl = new CacheControl();\r\n\r\n const evaluate = () => {\r\n try {\r\n const context = this.getContext(formGroup);\r\n cacheControl.configure(context);\r\n const result = this.feelService.evalTemplate(expression, context);\r\n logEvaluation(expression, result);\r\n if (cacheControl.ttl != null)\r\n setTimeout(() => this.invalidateExpression(expression), cacheControl.ttl);\r\n return result;\r\n }\r\n catch (e) {\r\n logError(expression, e);\r\n return null;\r\n }\r\n finally {\r\n this.evaluationDone.notify();\r\n }\r\n };\r\n\r\n const cacheable = options.cacheable ?? this.cacheable;\r\n \r\n if (cacheable) {\r\n const watchKey = `:watchTemplate(${expression})`;\r\n\r\n this.weakService.call(this, watchKey, () => {\r\n this.watchingTemplateExpression(formGroup, expression\r\n , () => {\r\n this.invalidateExpression(expression);\r\n logInvalidate(expression);\r\n }\r\n , options?.destroyRef);\r\n return true;\r\n });\r\n\r\n return this.weakService.call(this, expression, evaluate, null, null, () => !cacheControl.isVolatile);\r\n }\r\n else {\r\n return evaluate();\r\n }\r\n }\r\n\r\n private onError(result: any): any {\r\n if (isObservable(result)) {\r\n return result.pipe(\r\n tap({\r\n error: err => {\r\n this.toastService.notifyError(err.message);\r\n }\r\n })\r\n );\r\n }\r\n else {\r\n return result;\r\n }\r\n }\r\n\r\n private getPredefinedFunctions(): Record<string, any> {\r\n return this.evaluatorProviders.reduce((acc, provider) => {\r\n return {\r\n ...acc,\r\n ...provider.getContext()\r\n };\r\n }, {});\r\n }\r\n\r\n private getFeelFunctions()\r\n {\r\n return {\r\n isValidExpression: this.feelService.isValidExpression,\r\n isValidUnaryTest: this.feelService.isValidUnaryTest\r\n };\r\n }\r\n\r\n private getFormFunctions(formGroup: FormGroup | null): Record<string, any> {\r\n return this.formService.getContext(formGroup);\r\n }\r\n\r\n private getParentContext(formGroup: FormGroup | null): Record<string, any> | null {\r\n if (formGroup === null) { \r\n return null;\r\n }\r\n\r\n const parent = this.getParent(formGroup);\r\n\r\n if (!parent) {\r\n return null;\r\n }\r\n\r\n const self = this;\r\n\r\n return {\r\n ...parent.value,\r\n formGroup: () => toProxy(parent), \r\n get parent() { return self.getParentContext(parent); },\r\n }; \r\n }\r\n\r\n private getRootContext(formGroup: FormGroup | null): Record<string, any> | null {\r\n if (formGroup === null) {\r\n return null;\r\n }\r\n \r\n const root = formGroup?.root;\r\n\r\n if (!root) {\r\n return null;\r\n }\r\n\r\n return root.value; \r\n }\r\n\r\n private getParent(formGroup: FormGroup) : FormGroup | null {\r\n let parent = formGroup.parent;\r\n\r\n while (parent instanceof FormArray) {\r\n parent = parent?.parent;\r\n }\r\n\r\n return parent as FormGroup | null;\r\n }\r\n\r\n private getContext(control: AbstractControl, options: EvaluateOptions = {}): Record<string, any> {\r\n\r\n const formGroup = control as FormGroup | null;\r\n\r\n const baseContext = formGroup?.value ?? { };\r\n\r\n const self = this;\r\n\r\n this.queryParams;\r\n\r\n let context = {\r\n get console() { return toProxy(console); },\r\n get parent() { return self.getParentContext(formGroup); },\r\n get root() { return self.getRootContext(formGroup); },\r\n get session() { return toProxy(self.session); },\r\n formGroup: () => toProxy(formGroup), \r\n _: this.scope?.getContext(),\r\n queryParams: this.queryParams,\r\n ...baseContext,\r\n fn: {\r\n ...this.predefinedFunctions,\r\n ...this.getFormFunctions(formGroup),\r\n ...this.getFeelFunctions()\r\n }\r\n }\r\n\r\n if (options.extendContext) {\r\n const extended = options.extendContext();\r\n if (extended) {\r\n context = {\r\n ...context,\r\n ...extended\r\n }\r\n }\r\n }\r\n\r\n return context;\r\n }\r\n\r\n private watchingExpression(formGroup: FormGroup\r\n , expression: string\r\n , callback: () => void\r\n , destroyRef?: DestroyRef): void {\r\n const logDependencies = (dependencies: any) => {\r\n if (!this.verbose) return;\r\n console.log(\"Get Dependencies:\", expression, dependencies, { formGroup });\r\n };\r\n const context = this.getContext(formGroup);\r\n const dependencies = this.feelService.getDependencies(expression, context);\r\n logDependencies(dependencies);\r\n this.watchingDependencies(formGroup, dependencies, callback, destroyRef ?? this.destroyRef);\r\n };\r\n\r\n private watchingTemplateExpression(formGroup: FormGroup\r\n , expression: string\r\n , callback: () => void\r\n , destroyRef?: DestroyRef): void {\r\n const logDependencies = (dependencies: any) => {\r\n if (!this.verbose) return;\r\n console.log(\"Get Template Dependencies:\", expression, dependencies, { formGroup });\r\n };\r\n const context = this.getContext(formGroup);\r\n const dependencies = this.feelService.getTemplateDependencies(expression, context);\r\n logDependencies(dependencies);\r\n this.watchingDependencies(formGroup, dependencies, callback, destroyRef ?? this.destroyRef);\r\n };\r\n\r\n private watchingDependencies(formGroup: FormGroup\r\n , dependencies: (string | string[])[]\r\n , callback: () => void\r\n , destroyRef: DestroyRef): void {\r\n\r\n if (!dependencies?.length) return;\r\n\r\n const logWatching = (dependence: any) => {\r\n if (!this.verbose) return;\r\n const text = Array.isArray(dependence) ? dependence.join(\".\") : dependence;\r\n console.log(\"Watching dependence:\", text, { formGroup });\r\n };\r\n\r\n const logValueChanged = (control: AbstractControl) => {\r\n if (!this.verbose) return;\r\n console.log(\"Value Changed:\", control.value, { path: this.getPath(control), control });\r\n };\r\n\r\n const logStatusChanged = (control: AbstractControl) => {\r\n if (!this.verbose) return;\r\n console.log(\"Status Changed:\", control.status, { path: this.getPath(control), control });\r\n };\r\n\r\n const logPathChanged = (message: string, path: Path) => {\r\n if (!this.verbose) return;\r\n console.log(message, path);\r\n };\r\n\r\n const valueSubscribe = (control: AbstractControl) => {\r\n this.subscribeService.subscribeChanges(control.valueChanges, control, control.value, destroyRef, callback, logValueChanged);\r\n };\r\n\r\n const statusSubscribe = (control: AbstractControl) => {\r\n this.subscribeService.subscribeChanges<FormControlStatus>(this.formService.statusChanges(control, callback), control, control.status, destroyRef, callback, logStatusChanged);\r\n };\r\n\r\n const subscribeTo = <T>(\r\n source$: Observable<T>,\r\n label: string,\r\n dependence: Path,\r\n predicate: (value: T) => boolean = () => true\r\n ) => {\r\n source$\r\n .pipe(filter(predicate), takeUntilDestroyed(destroyRef))\r\n .subscribe(() => {\r\n callback();\r\n logPathChanged(label, dependence);\r\n });\r\n logWatching(dependence);\r\n };\r\n\r\n const subscribeControl = (control: AbstractControl\r\n , status: boolean\r\n , dependence: string | string[]\r\n ) => {\r\n if (!status) {\r\n valueSubscribe(control);\r\n logWatching(dependence);\r\n }\r\n else {\r\n statusSubscribe(control);\r\n logWatching(dependence);\r\n }\r\n };\r\n\r\n const startsWith = (path: string | string[], value: string): path is string[] => {\r\n return Array.isArray(path) && path.length > 0 && path[0] === value;\r\n };\r\n\r\n for (const dependence of dependencies) {\r\n const [path, status] = this.processDependencies(dependence);\r\n if (startsWith(path, \"_\")) {\r\n const dependence = path.slice(1);\r\n subscribeTo(this.scope.watch(dependence), \"Scope Changed:\", dependence); \r\n }\r\n else if (startsWith(path, \"queryParams\")) {\r\n subscribeTo(this.queryParams$, \"QueryParams Changed:\", dependence);\r\n }\r\n else if (path == \"session\") {\r\n subscribeTo(this.session.watch(), \"Session Changed:\", path);\r\n }\r\n else {\r\n const options: PathOptions = { breakOnArray: true, breakOnNull: true };\r\n const control = this.formService.getControl(formGroup, path, options);\r\n if (control) {\r\n subscribeControl(control, status, dependence);\r\n }\r\n else {\r\n this.formService.waitForControl(formGroup, path, options)\r\n .pipe(takeUntilDestroyed(destroyRef))\r\n .subscribe(control => {\r\n subscribeControl(control, status, dependence);\r\n callback();\r\n });\r\n }\r\n }\r\n } \r\n }\r\n\r\n private invalidateExpression(expression: string): void {\r\n this.weakService.invalidate(this, expression);\r\n this.evaluationDone.notify();\r\n }\r\n\r\n private invalidateAllExpression(): void {\r\n this.weakService.invalidateAll(this);\r\n this.evaluationDone.notify();\r\n }\r\n\r\n private processDependencies(dependency: string | string[]): [string | string[], boolean] {\r\n const statusDependency = Array.isArray(dependency)\r\n && dependency.length > 1\r\n && dependency[0] === StatusDependency;\r\n\r\n return statusDependency\r\n ? [dependency.slice(1), true]\r\n : [dependency, false];\r\n }\r\n\r\n private getPath(control: AbstractControl): string {\r\n return this.formService.getPath(control).join(\".\");\r\n }\r\n\r\n private readonly route = inject(ActivatedRoute);\r\n\r\n private queryParams: Params = this.route.snapshot.queryParams;\r\n\r\n private readonly queryParams$: Observable<Params> = this.route.queryParams.pipe(\r\n tap(params => this.queryParams = params),\r\n shareReplay({ bufferSize: 1, refCount: true })\r\n );\r\n\r\n private onQueryParamsChange(action: (params: Params) => void): void {\r\n this.queryParams$\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(action);\r\n }\r\n}\r\n\r\nexport interface IEvaluatorProvider {\r\n getContext(scope?: any): Record<string, any>;\r\n}\r\n\r\nexport interface EvaluateOptions {\r\n cacheable?: boolean;\r\n ignoreDeps?: boolean;\r\n cacheInvalidated?: () => void;\r\n destroyRef?: DestroyRef,\r\n invokeArgs?: any[],\r\n hydrate?: boolean,\r\n extendContext?: ExtendContextFn;\r\n transform?: TransformFn;\r\n}\r\n\r\nexport type ExtendContextFn = () => Record<string, any>;\r\n\r\nexport type TransformFn<TIn = any, TOut = any> = (value: TIn) => TOut;\r\n","import { DestroyRef, Injectable } from '@angular/core';\r\nimport { ProgrammabilityService } from '../services/programmability.service';\r\nimport { AbstractControl, AsyncValidatorFn, FormGroup, ValidationErrors, ValidatorFn, Validators } from '@angular/forms';\r\nimport { isObservable, map, Observable, of, catchError, take, Subject, shareReplay } from 'rxjs';\r\nimport { toFeelable } from '../utils/feelable';\r\nimport { CallbackRegistry } from '../utils/CallbackRegistry';\r\n\r\nimport { LanguageService } from '@wemake4u/interact';\r\nimport { Texts } from '../locale/locale';\r\nimport { localize } from '../locale/localize';\r\nimport { Notifier } from '../utils/notifier';\r\n\r\nconst SILENT_ERROR = 'silent';\r\nconst ERROR_FLAG = 'error';\r\nconst MESSAGE_KEY = 'message';\r\n\r\n@Injectable()\r\nexport class ValidationService {\r\n\r\n constructor(\r\n private languageService: LanguageService,\r\n private programmability: ProgrammabilityService) {\r\n }\r\n\r\n private requiredMode: RequiredMode = \"silent\";\r\n\r\n readonly validationDone = new Notifier();\r\n\r\n private _suppress: boolean = false;\r\n\r\n set suppress(value: boolean) {\r\n this._suppress = value;\r\n }\r\n\r\n get suppress(): boolean {\r\n return this._suppress;\r\n }\r\n\r\n createCollection(): ValidationCollection {\r\n return new Map<AbstractControl, ComponentContext>();\r\n }\r\n\r\n addToCollection(collection: ValidationCollection, control: AbstractControl, formGroup: FormGroup, component: any) {\r\n if (!collection.has(control) && this.canAddToCollection(component)) { \r\n collection.set(control, { component, formGroup });\r\n }\r\n }\r\n\r\n setupCollection(collection: ValidationCollection, destroyRef?: DestroyRef) {\r\n collection.forEach((componentValidation, control) => {\r\n const component = componentValidation.component;\r\n const currentGroup = componentValidation.formGroup;\r\n const required = component?.validate?.required;\r\n const rules = this.getRules(component);\r\n const [requiredValidator, validators, asyncValidators, watching] = this.validateRules(currentGroup, component, required, rules, destroyRef);\r\n control.setValidators(validators);\r\n control.setAsyncValidators(asyncValidators);\r\n if (requiredValidator) this.requiredValidators.set(control, requiredValidator);\r\n watching(control);\r\n });\r\n }\r\n\r\n validateRequired(control: AbstractControl, currentValue: any): ValidationErrors | null {\r\n if (!this.requiredValidators.has(control))\r\n return null;\r\n const validator = this.requiredValidators.get(control);\r\n return validator!({ value: currentValue } as any);\r\n }\r\n\r\n isRequired(control: AbstractControl): boolean {\r\n return control && this.requiredValidators.has(control);\r\n }\r\n\r\n allowSilentError(): boolean {\r\n return this.requiredMode === \"silent\";\r\n }\r\n\r\n isSilentError(control: AbstractControl | null | undefined): boolean {\r\n if (!this.allowSilentError()) return false;\r\n const errors = control?.errors;\r\n if (!errors) return false;\r\n return errors[SILENT_ERROR] === true\r\n && errors[ERROR_FLAG] === true\r\n && !(MESSAGE_KEY in errors);\r\n }\r\n\r\n hasSilentErrors(controls: Iterable<AbstractControl>): boolean {\r\n if (!this.allowSilentError()) return false;\r\n for (const control of controls) {\r\n if (!control.disabled && this.isSilentError(control))\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n revealSilentErrors(controls: Iterable<AbstractControl>) {\r\n if (!this.allowSilentError()) return;\r\n for (const control of controls) {\r\n if (control.disabled || !this.isSilentError(control))\r\n continue;\r\n control.markAsTouched();\r\n control.updateValueAndValidity();\r\n }\r\n }\r\n\r\n countErrors(controls: Iterable<AbstractControl>, includeSilent = false): number {\r\n let errors = 0;\r\n for (const control of controls) {\r\n if (control.disabled || !control.errors)\r\n continue;\r\n if (!includeSilent && this.isSilentError(control))\r\n continue;\r\n errors++;\r\n }\r\n return errors;\r\n }\r\n\r\n private canAddToCollection(component: any): boolean {\r\n const required = component?.validate?.required;\r\n const hasRules = Array.isArray(component?.validations) && component.validations.length > 0;\r\n return required === true || hasRules;\r\n }\r\n\r\n private getRules(component: any): ValidationRule[] {\r\n if (!Array.isArray(component.validations)) return [];\r\n return component.validations?.map((rule: any) => {\r\n return {\r\n expression: rule.expression,\r\n type: rule.type,\r\n message: this.locale(rule, MESSAGE_KEY),\r\n async: rule.async === true\r\n } as ValidationRule;\r\n });\r\n }\r\n\r\n private validateRules(formGroup: FormGroup\r\n , component: any\r\n , required?: boolean\r\n , validations?: ValidationRule[]\r\n , destroyRef?: DestroyRef): [ValidatorFn | null, ValidatorFn[], AsyncValidatorFn[], (control: AbstractControl) => void] {\r\n\r\n const skipValidation = this.resolveSkipValidation(component);\r\n\r\n const validators: ValidatorFn[] = [];\r\n const asyncValidators: AsyncValidatorFn[] = [];\r\n\r\n const requiredValidator = required === true\r\n ? this.createRequiredValidator(component, formGroup, skipValidation)\r\n : null;\r\n\r\n if (requiredValidator) {\r\n validators.push(requiredValidator);\r\n }\r\n\r\n const callbacks = new CallbackRegistry();\r\n\r\n if (Array.isArray(validations)) {\r\n validations.forEach((item: ValidationRule) => {\r\n if (!this.programmability.isExpression(item.expression))\r\n return;\r\n\r\n const logger: ValidationCallback = (control: AbstractControl, result: ValidationErrors | null) =>\r\n this.logValidation(component, item, control, result);\r\n\r\n if (item.type === \"validate\" || item.type === \"invalidate\") {\r\n const predicate = item.type === \"validate\"\r\n ? (result: any) => result\r\n : (result: any) => !result;\r\n\r\n if (item.async) {\r\n asyncValidators.push(this.createAsyncValidator(formGroup, skipValidation, item, callbacks, predicate, logger));\r\n }\r\n else {\r\n validators.push(this.createValidator(formGroup, skipValidation, item, predicate, logger));\r\n }\r\n }\r\n });\r\n }\r\n\r\n const watching = (control: AbstractControl): void => {\r\n this.watchForValidation(formGroup, skipValidation, control, component.key, callbacks, validations, destroyRef);\r\n };\r\n\r\n return [requiredValidator, validators, asyncValidators, watching];\r\n }\r\n\r\n private createValidator(formGroup: FormGroup\r\n , skipValidation: string | boolean\r\n , item: ValidationRule\r\n , predicate: (result: any) => boolean\r\n , callback: ValidationCallback): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (this.suppress\r\n || this.shouldSkipValidation(formGroup, skipValidation)\r\n || !this.isRequiredSatisfied(control)) return null; \r\n const result = this.programmability.evaluateUnary(formGroup, item.expression, control.value)\r\n if (isObservable(result)) {\r\n console.warn(\r\n \"[Validator] Unexpected observable result in createValidator\",\r\n { expression: item.expression, value: control.value, rule: item }\r\n );\r\n return null;\r\n }\r\n const validate = predicate(result) ? null : this.validationErrors(formGroup, item);\r\n callback(control, validate);\r\n this.validationDone.notify();\r\n return validate;\r\n };\r\n }\r\n\r\n private createAsyncValidator(formGroup: FormGroup\r\n , skipValidation: string | boolean\r\n , item: ValidationRule\r\n , callbacks: CallbackRegistry\r\n , predicate: (result: any) => boolean\r\n , callback: ValidationCallback): AsyncValidatorFn {\r\n\r\n /** Cached result per control, so the same validator instance can safely be shared */\r\n let states = new WeakMap<AbstractControl, { value: any; result: Observable<any> }>();\r\n\r\n callbacks.register(() => states = new WeakMap());\r\n\r\n const evaluate = (control: AbstractControl): any =>\r\n this.programmability.evaluate(formGroup, item.expression, {\r\n cacheable: false,\r\n extendContext: () => { return { \"?\": control.value } }\r\n });\r\n\r\n /** Wraps the evaluation result, sync or async, into a single-emission observable that replays its result */\r\n const toObservable = (control: AbstractControl, result: any): Observable<any> => {\r\n\r\n const source: Observable<any> = isObservable(result)\r\n ? (result as Observable<any>).pipe(take(1))\r\n : of(result);\r\n\r\n return source.pipe(\r\n map((value: any) => {\r\n const errors = predicate(value) ? null : this.validationErrors(formGroup, item);\r\n callback(control, errors);\r\n this.validationDone.notify();\r\n return errors;\r\n }),\r\n catchError(err => {\r\n console.error(\"[AsyncValidator] Evaluation error\", { expression: item.expression, err });\r\n return this.nullObserver;\r\n }),\r\n // replays the computed result to later subscriptions instead of re-running the source:\r\n // without this, caching the observable would still re-evaluate on every subscribe\r\n shareReplay({ bufferSize: 1, refCount: false })\r\n );\r\n };\r\n\r\n const computeOnce = (control: AbstractControl): Observable<any> => {\r\n\r\n const value = control.value;\r\n\r\n const state = states.get(control);\r\n\r\n if (state && Object.is(state.value, value))\r\n return state.result;\r\n\r\n const result = toObservable(control, evaluate(control));\r\n\r\n states.set(control, { value, result });\r\n\r\n return result;\r\n };\r\n\r\n return (control: AbstractControl) => {\r\n\r\n if (this.suppress\r\n || this.shouldSkipValidation(formGroup, skipValidation)\r\n || !this.isRequiredSatisfied(control))\r\n return this.nullObserver;\r\n\r\n return computeOnce(control);\r\n };\r\n }\r\n\r\n private createRequiredValidator(component: any\r\n , formGroup: FormGroup\r\n , skipValidation: string | boolean): ValidatorFn\r\n {\r\n const fn = (this.isTrueValidator(component)\r\n ? this.requiredTrueValidator\r\n : this.requiredValidator).bind(this);\r\n\r\n const requiredText = component?.validate?.requiredText;\r\n\r\n return (control) => {\r\n if (this.suppress\r\n || this.shouldSkipValidation(formGroup, skipValidation)) return null;\r\n let result = fn(control);\r\n if (result && requiredText) {\r\n result = { ...result, [MESSAGE_KEY]: requiredText };\r\n }\r\n result = this.markSilent(control, result);\r\n this.validationDone.notify(); \r\n return result;\r\n };\r\n }\r\n\r\n private markSilent(control: AbstractControl, result: ValidationErrors | null): ValidationErrors | null {\r\n if (!this.allowSilentError()\r\n || !result\r\n || control.touched) return result;\r\n const silent: ValidationErrors = { ...result, [SILENT_ERROR]: true };\r\n delete silent[MESSAGE_KEY];\r\n return silent;\r\n }\r\n\r\n private validationErrors(formGroup: FormGroup, item: ValidationRule) {\r\n const message = this.programmability.evaluateString(formGroup, item.message, { cacheable: false });\r\n const validationError = { [ERROR_FLAG]: true, [MESSAGE_KEY]: message };\r\n return validationError;\r\n }\r\n\r\n private watchForValidation(formGroup: FormGroup\r\n , skipValidation: boolean | string\r\n , control: AbstractControl\r\n , key: string\r\n , callbacks: CallbackRegistry\r\n , validations?: ValidationRule[]\r\n , destroyRef?: DestroyRef): void {\r\n\r\n const expressions: string[] = [];\r\n\r\n if (typeof skipValidation === \"string\" && this.programmability.isExpression(skipValidation)) {\r\n expressions.push(\"=\" + this.programmability.getExpression(skipValidation));\r\n }\r\n \r\n if (Array.isArray(validations)) {\r\n const ruleExpressions = validations\r\n .filter(item => this.programmability.isExpression(item.expression))\r\n .map(item => \"=\" + this.programmability.getExpression(item.expression));\r\n expressions.push(...ruleExpressions);\r\n }\r\n\r\n if (expressions.length === 0) return;\r\n\r\n const feelable = toFeelable(expressions);\r\n\r\n const dependencies = this.programmability.getDependencies(formGroup, feelable)\r\n .filter(dep => dep !== key);\r\n\r\n if (dependencies.length === 0) return;\r\n\r\n this.programmability.watch(formGroup, dependencies, () => {\r\n setTimeout(() => {\r\n callbacks.invoke();\r\n control.updateValueAndValidity();\r\n });\r\n }, destroyRef);\r\n }\r\n\r\n private logValidation = (component: any, rule: ValidationRule, control: AbstractControl, result: ValidationErrors | null) => {\r\n if (this.programmability.verbose) {\r\n if (result != null) {\r\n console.warn(\"[Validation] Failed\", { control, component, rule, result });\r\n }\r\n else {\r\n console.log(\"[Validation] Success\", { control, component, rule, result });\r\n }\r\n }\r\n }\r\n\r\n private readonly nullObserver = of(null);\r\n\r\n private get language(): string {\r\n return this.languageService.getLanguage();\r\n }\r\n\r\n private locale(component: any, key: string): string {\r\n return localize(this.language, component, key);\r\n }\r\n\r\n private requiredValidators = new WeakMap<AbstractControl, ValidatorFn>();\r\n\r\n private requiredValidator(control: AbstractControl): ValidationErrors | null {\r\n if (Validators.required(control) == null) {\r\n return null;\r\n }\r\n return { [ERROR_FLAG]: true, [MESSAGE_KEY]: this.getRequiredMessage() } \r\n }\r\n\r\n private requiredTrueValidator(control: AbstractControl): ValidationErrors | null {\r\n if (Validators.requiredTrue(control) == null) {\r\n return null;\r\n }\r\n return { [ERROR_FLAG]: true, [MESSAGE_KEY]: this.getRequiredMessage() }\r\n }\r\n\r\n private isTrueValidator(component: any): boolean {\r\n return component?.type === 'checkbox';\r\n }\r\n\r\n private isRequiredSatisfied(control: AbstractControl): boolean {\r\n if (control.disabled) return true;\r\n const validator = this.requiredValidators.get(control);\r\n if (!validator) return true;\r\n return validator(control) === null;\r\n }\r\n\r\n private getRequiredMessage(): string {\r\n return this.locale(Texts, 'RequiredField');\r\n }\r\n\r\n private shouldSkipValidation(formGroup: FormGroup, skipValidation: string | boolean): boolean {\r\n if (typeof skipValidation === 'boolean') {\r\n return skipValidation;\r\n }\r\n if (typeof skipValidation === 'string') {\r\n return this.programmability.evaluateBoolean(formGroup, skipValidation) ?? false;\r\n }\r\n return false;\r\n }\r\n\r\n private resolveSkipValidation(component: any): boolean | string {\r\n const skipValidation = component.skipValidation;\r\n if (typeof skipValidation === 'boolean') {\r\n return skipValidation;\r\n }\r\n if (typeof skipValidation === 'string'\r\n && this.programmability.isExpression(skipValidation)) {\r\n return skipValidation;\r\n }\r\n return false;\r\n }\r\n}\r\n\r\ntype RequiredMode = 'default' | 'silent';\r\n\r\ntype ValidationCallback = (control: AbstractControl, result: ValidationErrors | null) => void;\r\n\r\nexport interface ComponentContext {\r\n component: any;\r\n formGroup: FormGroup;\r\n}\r\n\r\nexport interface ValidationRule {\r\n expression: string;\r\n type: \"validate\" | \"invalidate\";\r\n message: string,\r\n async: boolean\r\n}\r\n\r\nexport type ValidationCollection = Map<AbstractControl, ComponentContext>;\r\n","import { DestroyRef, Injectable } from '@angular/core';\r\nimport { ProgrammabilityService } from './programmability.service';\r\nimport { FormService } from './form.service';\r\nimport { AbstractControl, FormArray, FormGroup } from '@angular/forms';\r\n\r\n@Injectable()\r\nexport class DisableService {\r\n\r\n constructor(\r\n private programmability: ProgrammabilityService\r\n , private formService: FormService) {\r\n }\r\n\r\n createCollection(): DisableCollection {\r\n return new Map<AbstractControl, DisableContext>();\r\n }\r\n\r\n addToCollection(collection: DisableCollection, control: AbstractControl, parentGroup: FormGroup\r\n , component: any) {\r\n if (!collection.has(control) && this.canAddToCollection(component)) {\r\n collection.set(control, { parentGroup, component });\r\n }\r\n }\r\n\r\n setupCollection(collection: DisableCollection, destroyRef?: DestroyRef) {\r\n collection.forEach((disableContext, control) => {\r\n this.applyRule(disableContext.parentGroup, control, disableContext, destroyRef); \r\n });\r\n }\r\n\r\n private selfDisabled = new WeakMap<AbstractControl, boolean>();\r\n\r\n private applyRule(formGroup: FormGroup, control: AbstractControl, context: DisableContext, destroyRef?: DestroyRef): void {\r\n\r\n const {\r\n key\r\n , disabled } = context.component ?? {};\r\n\r\n const logDisabled = (value: any) => {\r\n if (!this.programmability.verbose) return;\r\n console.log(value ? \"Disable\" : \"Enable\", control, { path: this.getPath(control), formGroup });\r\n };\r\n\r\n const container = this.isContainer(control);\r\n\r\n const disableControl = (value: boolean | null) => {\r\n\r\n this.selfDisabled.set(control, value ?? false);\r\n\r\n if (value === true) {\r\n if (control.disabled && !container) return;\r\n control.disable();\r\n logDisabled(value);\r\n } else {\r\n if (control.enabled && !container) return;\r\n control.enable();\r\n logDisabled(value);\r\n }\r\n\r\n if (container)\r\n this.normalize(control); \r\n }\r\n\r\n if (typeof disabled === 'boolean') {\r\n disableControl(disabled);\r\n }\r\n else if (typeof disabled === 'string') {\r\n if (this.programmability.isExpression(disabled)) {\r\n const expression = this.programmability.getExpression(disabled);\r\n const dependencies = this.programmability.getDependencies(formGroup, expression)\r\n .filter(dep => dep !== key);\r\n const applyExpression = () => {\r\n const result = this.programmability.evaluateBoolean(formGroup, disabled\r\n , { cacheable: false, destroyRef: destroyRef });\r\n disableControl(result);\r\n };\r\n if (dependencies.length > 0) {\r\n this.programmability.watch(formGroup, dependencies, () => {\r\n queueMicrotask(applyExpression); \r\n }, destroyRef);\r\n }\r\n applyExpression();\r\n }\r\n }\r\n }\r\n\r\n private canAddToCollection(component: any): boolean {\r\n const disabled = component?.disabled;\r\n return typeof disabled === 'boolean'\r\n || typeof disabled === 'string';\r\n }\r\n\r\n private getPath(control: AbstractControl): string {\r\n return this.formService.getPath(control).join(\".\");\r\n }\r\n\r\n private normalize(control: AbstractControl) {\r\n if (!control.enabled)\r\n return;\r\n\r\n for (const child of this.formService.enumerateControls(control)) {\r\n if (this.selfDisabled.has(child)) {\r\n const selfDisabled = this.selfDisabled.get(child);\r\n if (child.enabled && selfDisabled)\r\n child.disable();\r\n } \r\n }\r\n\r\n }\r\n\r\n private isContainer(control: AbstractControl) {\r\n return control instanceof FormGroup\r\n || control instanceof FormArray;\r\n }\r\n}\r\n\r\nexport interface DisableContext {\r\n parentGroup: FormGroup;\r\n component: any\r\n}\r\n\r\nexport type DisableCollection = Map<AbstractControl, DisableContext>;\r\n","import { DestroyRef, Injectable } from '@angular/core';\r\nimport { ProgrammabilityService } from './programmability.service';\r\nimport { FormService } from './form.service';\r\nimport { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { toFeelable } from '../utils/feelable';\r\n\r\n@Injectable()\r\nexport class ComputeService {\r\n\r\n constructor(\r\n private programmability: ProgrammabilityService\r\n , private formService: FormService) {\r\n }\r\n\r\n createCollection(): ComputeCollection {\r\n return new Map<AbstractControl, ComputeContext>();\r\n }\r\n\r\n addToCollection(collection: ComputeCollection, control: AbstractControl\r\n , parentGroup: FormGroup, component: any)\r\n {\r\n if (!collection.has(control) && this.canAddToCollection(component)) {\r\n collection.set(control, { component, parentGroup });\r\n } \r\n }\r\n\r\n setupCollection(collection: ComputeCollection, destroyRef?: DestroyRef) {\r\n collection.forEach((computeContext, control) => {\r\n this.applyExpression(control, computeContext, destroyRef); \r\n });\r\n }\r\n\r\n private canAddToCollection(component: any): boolean {\r\n const expression = component?.expression;\r\n return this.programmability.isExpression(expression);\r\n }\r\n\r\n private applyExpression(control: AbstractControl, context: ComputeContext, destroyRef?: DestroyRef): void {\r\n const formGroup = context.parentGroup;\r\n\r\n const {\r\n key\r\n , expression\r\n , conditional } = context.component ?? {};\r\n\r\n const deactivate = conditional?.hide;\r\n\r\n const logComputed = (value: any) => {\r\n if (!this.programmability.verbose) return;\r\n console.log(\"Compute\", control, { value: value, path: this.getPath(control), formGroup });\r\n };\r\n const assignValue = (value: any) => {\r\n logComputed(value);\r\n this.formService.patch(control, value, { strict: false });\r\n }\r\n if (typeof expression === 'string') {\r\n if (this.programmability.isExpression(expression)) {\r\n const applyExpression = () => {\r\n if (this.programmability.isExpression(deactivate)) {\r\n const isDeactivate = this.programmability.evaluateBoolean(formGroup, deactivate\r\n , { cacheable: false, destroyRef: destroyRef });\r\n if (!!isDeactivate) {\r\n return;\r\n }\r\n }\r\n const result = this.programmability.evaluate(formGroup, expression\r\n , { cacheable: false, destroyRef: destroyRef });\r\n assignValue(result);\r\n };\r\n const dependencies = this.programmability.getDependencies(formGroup, toFeelable({\r\n expression: expression,\r\n deactivate: deactivate\r\n })).filter(dep => dep !== key);\r\n\r\n if (dependencies.length > 0) {\r\n this.programmability.watch(formGroup, dependencies, () => {\r\n queueMicrotask(applyExpression);\r\n }, destroyRef);\r\n }\r\n applyExpression();\r\n }\r\n }\r\n }\r\n\r\n private getPath(control: AbstractControl): string {\r\n return this.formService.getPath(control).join(\".\");\r\n }\r\n}\r\n\r\nexport interface ComputeContext {\r\n parentGroup: FormGroup;\r\n component: any;\r\n}\r\n\r\nexport type ComputeCollection = Map<AbstractControl, ComputeContext>;\r\n","import { DestroyRef, Injectable } from '@angular/core';\r\nimport { EnumerateOptions, FormService } from './form.service';\r\nimport { AbstractControl, FormArray } from '@angular/forms';\r\nimport { SubscribeService } from '../services/subscribe.service';\r\nimport { Notifier } from '../utils/notifier';\r\nimport { ValidationService } from './validation.service';\r\n\r\n@Injectable()\r\nexport class StatusService {\r\n\r\n constructor(\r\n private formService: FormService\r\n , private subscribeService: SubscribeService\r\n , private validationService: ValidationService\r\n , private destroyRef: DestroyRef) {\r\n }\r\n\r\n readonly statusDone = new Notifier();\r\n\r\n createCollection(key?: any): StatusCollection {\r\n return new StatusCollection(key);\r\n }\r\n\r\n addToCollection(collection: StatusCollection, control: AbstractControl, component: any) {\r\n if (!collection.has(control) && this.canAddToCollection(control, component)) {\r\n collection.add(control);\r\n }\r\n }\r\n\r\n setupCollection(collection: StatusCollection, destroyRef?: DestroyRef) {\r\n\r\n const key = collection.key;\r\n\r\n const root = key != null;\r\n\r\n if (root) {\r\n this.invalidMap.set(key, {\r\n collection,\r\n dirty: true,\r\n totalErrors: 0,\r\n visibleErrors: 0\r\n });\r\n }\r\n\r\n const markDirty = () => {\r\n const entry = this.invalidMap.get(key);\r\n if (entry) {\r\n entry.dirty = true;\r\n }\r\n this.statusDone.notify();\r\n };\r\n\r\n for (const control of collection.getControls(false)) {\r\n\r\n if (!root) {\r\n control.updateValueAndValidity({ onlySelf: true, emitEvent: true });\r\n }\r\n\r\n const emitWhenUnchanged = this.validationService.allowSilentError();\r\n\r\n this.subscribeService.subscribeChanges(\r\n control.statusChanges,\r\n control,\r\n control.status,\r\n destroyRef ?? this.destroyRef,\r\n () => markDirty(),\r\n undefined,\r\n emitWhenUnchanged\r\n );\r\n }\r\n }\r\n\r\n countErrors(key: any, includeSilent = false): number {\r\n\r\n const entry = this.invalidMap.get(key);\r\n\r\n if (!entry)\r\n return 0;\r\n\r\n if (entry.dirty) {\r\n const controls = [...this.enumerateControls(key)];\r\n entry.dirty = false;\r\n entry.totalErrors = this.validationService.countErrors(controls, true);\r\n entry.visibleErrors = this.validationService.countErrors(controls, false);\r\n }\r\n\r\n return includeSilent\r\n ? entry.totalErrors\r\n : entry.visibleErrors;\r\n }\r\n\r\n *enumerateControls(key: any, deep = true): Generator<AbstractControl> {\r\n\r\n const entry = this.invalidMap.get(key);\r\n\r\n if (!entry)\r\n return;\r\n\r\n yield* this.formService.enumerateControls(\r\n entry.collection.getControls(deep),\r\n this.enumerateOptions\r\n );\r\n }\r\n\r\n private invalidMap = new Map<any, {\r\n collection: StatusCollection;\r\n dirty: boolean;\r\n totalErrors: number;\r\n visibleErrors: number;\r\n }>();\r\n\r\n private canAddToCollection(control: AbstractControl, component: any): boolean {\r\n if (control instanceof FormArray) {\r\n return true;\r\n }\r\n else {\r\n const required = component?.validate?.required;\r\n const hasRules = Array.isArray(component?.validations) && component.validations.length > 0;\r\n return required === true || hasRules || control.validator != null || control.asyncValidator != null;\r\n }\r\n }\r\n\r\n private readonly enumerateOptions: EnumerateOptions = {\r\n expandArray: false,\r\n expandGroup: true,\r\n skipDisabled: true\r\n };\r\n}\r\n\r\nexport class StatusCollection<TKey = any> {\r\n\r\n constructor(\r\n public key?: any\r\n ) { }\r\n\r\n readonly controls = new Set<AbstractControl>();\r\n\r\n readonly children = new Map<TKey, StatusCollection<TKey>>();\r\n\r\n add(control: AbstractControl): this {\r\n this.controls.add(control);\r\n return this;\r\n }\r\n\r\n remove(control: AbstractControl): this {\r\n this.controls.delete(control);\r\n return this;\r\n }\r\n\r\n has(control: AbstractControl): boolean {\r\n return this.controls.has(control);\r\n }\r\n\r\n clear(): void {\r\n this.controls.clear();\r\n this.children.clear();\r\n }\r\n\r\n createCollection(key: TKey): StatusCollection<TKey> {\r\n let collection = this.children.get(key);\r\n\r\n if (!collection) {\r\n collection = new StatusCollection<TKey>();\r\n this.children.set(key, collection);\r\n }\r\n\r\n return collection;\r\n }\r\n\r\n getCollection(key: TKey): StatusCollection<TKey> | undefined {\r\n return this.children.get(key);\r\n }\r\n\r\n removeCollection(key: TKey): boolean {\r\n return this.children.delete(key);\r\n }\r\n\r\n *getControls(deep = true): IterableIterator<AbstractControl> {\r\n\r\n yield* this.controls;\r\n\r\n if (deep) {\r\n for (const child of this.children.values()) {\r\n yield* child.getControls(true);\r\n }\r\n }\r\n }\r\n\r\n}\r\n","import { DestroyRef, Injectable } from '@angular/core';\r\nimport { ProgrammabilityService } from '../services/programmability.service';\r\nimport { SubscribeService } from '../services/subscribe.service';\r\nimport { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { Observable } from 'rxjs';\r\n\r\n@Injectable()\r\nexport class EventService {\r\n\r\n constructor(\r\n private programmability: ProgrammabilityService\r\n , private subscribeService: SubscribeService\r\n , private destroyRef: DestroyRef) {\r\n }\r\n\r\n private _suppress: boolean = false;\r\n\r\n set suppress(value: boolean) {\r\n this._suppress = value;\r\n }\r\n\r\n get suppress(): boolean {\r\n return this._suppress;\r\n }\r\n\r\n createCollection(): EventCollection {\r\n return new Map<AbstractControl, EventContext>();\r\n }\r\n\r\n addToCollection(collection: EventCollection, control: AbstractControl, formGroup: FormGroup, component: any) {\r\n collection.set(control, { component, formGroup });\r\n }\r\n\r\n setupCollection(collection: EventCollection, destroyRef?: DestroyRef) {\r\n collection.forEach((componentValidation, control) => {\r\n const component = componentValidation.component;\r\n const currentGroup = componentValidation.formGroup;\r\n const events = component.events;\r\n if (!events || typeof events !== 'object') return;\r\n this.processHandler(events.onChange, currentGroup, control, control.valueChanges, control.value, destroyRef);\r\n this.processHandler(events.onStatusChange, currentGroup, control, control.statusChanges, control.status, destroyRef); \r\n });\r\n }\r\n\r\n private processHandler<T>(handler: string\r\n , formGroup: FormGroup\r\n , control: AbstractControl\r\n , observable$: Observable<T>\r\n , initial: T\r\n , destroyRef?: DestroyRef)\r\n {\r\n if (!this.programmability.isExpression(handler))\r\n return;\r\n\r\n this.subscribeService.subscribeChanges(observable$\r\n , control\r\n , initial\r\n , destroyRef ?? this.destroyRef\r\n , (oldValue, newValue) => {\r\n if (this.suppress) return;\r\n const event = {\r\n control: control,\r\n oldValue: oldValue,\r\n newValue: newValue\r\n };\r\n this.programmability.evaluate(formGroup, handler, {\r\n cacheable: false,\r\n extendContext: () => ({\r\n \"event\": event\r\n }),\r\n invokeArgs: [event]\r\n });\r\n }\r\n );\r\n }\r\n}\r\n\r\nexport interface EventContext {\r\n component: any;\r\n formGroup: FormGroup;\r\n}\r\n\r\nexport type EventCollection = Map<AbstractControl, EventContext>;\r\n","import { createEnvironmentInjector, DestroyRef, EnvironmentInjector, Injectable, OnDestroy } from '@angular/core';\r\n\r\n@Injectable()\r\nexport class LifetimeService<TKey> implements OnDestroy {\r\n\r\n private readonly injectors =\r\n new Map<TKey, EnvironmentInjector>();\r\n\r\n constructor(\r\n private readonly environmentInjector: EnvironmentInjector\r\n ) { }\r\n\r\n resolve(key: TKey): DestroyRef {\r\n\r\n let injector = this.injectors.get(key);\r\n\r\n if (!injector) {\r\n\r\n injector = createEnvironmentInjector(\r\n [],\r\n this.environmentInjector\r\n );\r\n\r\n this.injectors.set(key, injector);\r\n }\r\n\r\n return injector.get(DestroyRef);\r\n }\r\n\r\n destroy(key: TKey): void {\r\n\r\n const injector = this.injectors.get(key);\r\n\r\n if (!injector)\r\n return;\r\n\r\n injector.destroy();\r\n\r\n this.injectors.delete(key);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n\r\n for (const injector of this.injectors.values()) {\r\n injector.destroy();\r\n }\r\n\r\n this.injectors.clear();\r\n }\r\n}\r\n","import { DestroyRef, Injectable } from '@angular/core';\r\nimport { AbstractControl, FormControl, FormControlOptions, FormGroup } from '@angular/forms';\r\nimport { ValidationCollection, ValidationService } from './validation.service';\r\nimport { DisableCollection, DisableService } from './disable.service';\r\nimport { ComputeCollection, ComputeService } from './compute.service';\r\nimport { StatusCollection, StatusService } from './status.service';\r\nimport { EventCollection, EventService } from './event.service';\r\nimport { MetadataService } from './metadata.service';\r\nimport { FormGroupEx, FormGroupMode } from '../utils/FormGroupEx';\r\nimport { FormArrayEx } from '../utils/FormArrayEx';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { LifetimeService } from './lifetime.service';\r\n\r\ninterface BuildCollections {\r\n validation: ValidationCollection;\r\n disable: DisableCollection;\r\n event: EventCollection;\r\n compute: ComputeCollection;\r\n}\r\n\r\nexport interface BuildRowsOptions {\r\n path?: string | null;\r\n groupMode?: FormGroupMode;\r\n statusSource?: any;\r\n destroyRef?: DestroyRef;\r\n}\r\n\r\n@Injectable()\r\nexport class FormBuilderService {\r\n\r\n constructor(\r\n private validationService: ValidationService\r\n , private disableService: DisableService\r\n , private computeService: ComputeService\r\n , private statusService: StatusService\r\n , private eventService: EventService\r\n , private metadata: MetadataService\r\n , private lifetime: LifetimeService<FormGroup>\r\n , private destroyRef: DestroyRef) {\r\n }\r\n\r\n buildForm(formGroup: FormGroup,\r\n forms: Array<any>,\r\n groupMode: FormGroupMode = \"default\"\r\n ): void {\r\n const collections = this.createCollections();\r\n\r\n forms.forEach((form: any) => {\r\n const statusCollection = this.statusService.createCollection(form);\r\n const currentGroup = this.applyPath(formGroup, form.path, groupMode);\r\n\r\n if (this.hasValue(form.path)) {\r\n this.disableService.addToCollection(collections.disable, currentGroup, formGroup, form);\r\n }\r\n\r\n this.addRows(currentGroup, form.rows, groupMode, collections, statusCollection);\r\n this.statusService.setupCollection(statusCollection);\r\n });\r\n\r\n this.setupCollections(collections);\r\n }\r\n\r\n /**\r\n * Configures a FormGroup starting from an array of rows (each row exposes `components`).\r\n * Rows are registered in the group located at `options.path`, relative to `formGroup`.\r\n */\r\n buildRows(\r\n formGroup: FormGroup,\r\n rows: Array<any>,\r\n options: BuildRowsOptions = {}\r\n ): FormGroup {\r\n const groupMode = options.groupMode ?? \"default\";\r\n const source = options.statusSource ?? { path: options.path, rows };\r\n\r\n const collections = this.createCollections();\r\n const statusCollection = this.statusService.createCollection(source);\r\n const currentGroup = this.applyPath(formGroup, options.path ?? '', groupMode);\r\n\r\n // Same behaviour as buildForm: a path group can be disabled as a whole\r\n if (this.hasValue(options.path ?? null)) {\r\n this.disableService.addToCollection(collections.disable, currentGroup, formGroup, source);\r\n }\r\n\r\n this.addRows(currentGroup, rows, groupMode, collections, statusCollection);\r\n\r\n this.setupCollections(collections, options.destroyRef);\r\n this.statusService.setupCollection(statusCollection, options.destroyRef);\r\n\r\n return currentGroup;\r\n }\r\n\r\n private addRows(\r\n group: FormGroup,\r\n rows: Array<any> | null | undefined,\r\n groupMode: FormGroupMode,\r\n collections: BuildCollections,\r\n statusCollection: StatusCollection\r\n ): void {\r\n rows?.forEach((row: any) =>\r\n this.addControls(group, row.components, groupMode, collections, statusCollection)\r\n );\r\n }\r\n\r\n private createCollections(): BuildCollections {\r\n return {\r\n validation: this.validationService.createCollection(),\r\n disable: this.disableService.createCollection(),\r\n event: this.eventService.createCollection(),\r\n compute: this.computeService.createCollection(),\r\n };\r\n }\r\n\r\n private setupCollections(c: BuildCollections, destroyRef?: DestroyRef): void {\r\n this.disableService.setupCollection(c.disable, destroyRef);\r\n this.computeService.setupCollection(c.compute, destroyRef);\r\n this.validationService.setupCollection(c.validation, destroyRef);\r\n this.eventService.setupCollection(c.event, destroyRef);\r\n }\r\n\r\n private hasValue(value: string | null): boolean {\r\n return value != null && value.trim().length > 0;\r\n }\r\n\r\n private applyPath(formGroup: FormGroup, path: string, groupMode: FormGroupMode) {\r\n if (!this.hasValue(path)) {\r\n return formGroup;\r\n }\r\n let currentGroup: FormGroup = formGroup;\r\n this.splitPath(path).forEach((segment) => {\r\n const existGroup = currentGroup.get(segment);\r\n if (existGroup instanceof FormGroup) {\r\n currentGroup = existGroup;\r\n return;\r\n }\r\n else if (existGroup) {\r\n throw new Error(`Cannot create form group because an element with path ${segment} already exists`);\r\n }\r\n else {\r\n const segmentGroup = this.createFormGroup(groupMode);\r\n currentGroup.addControl(segment, segmentGroup);\r\n currentGroup = segmentGroup;\r\n }\r\n });\r\n return currentGroup;\r\n }\r\n\r\n private splitPath(path: string): string[] {\r\n if (!path) {\r\n return [];\r\n }\r\n return path\r\n .split('.')\r\n .map(segment => segment.trim())\r\n .filter(segment => segment.length > 0);\r\n }\r\n\r\n private createFormGroup(groupMode: FormGroupMode): FormGroup {\r\n return (groupMode === \"default\")\r\n ? new FormGroup({})\r\n : new FormGroupEx({}, groupMode);\r\n }\r\n\r\n private addControls(formGroup: FormGroup\r\n , components: Array<any>\r\n , groupMode: FormGroupMode\r\n , collections: BuildCollections\r\n , statusCollection: StatusCollection) {\r\n\r\n components?.forEach((component: any) => {\r\n if (this.isFormComponent(component)) {\r\n const currentGroup = this.applyPath(formGroup, component.path, groupMode);\r\n if (currentGroup.contains(component.key)) {\r\n this.statusService.addToCollection(statusCollection, currentGroup.get(component.key) as AbstractControl, component);\r\n return;\r\n }\r\n else {\r\n const defaultValue = this.getDefaultValue(component);\r\n const options: FormControlOptions = {\r\n updateOn: this.getUpdateOn(component) || \"change\",\r\n nonNullable: (defaultValue !== null && defaultValue !== undefined)\r\n };\r\n const control = new FormControl(defaultValue, options);\r\n currentGroup.addControl(component.key, control);\r\n this.validationService.addToCollection(collections.validation, control, currentGroup, component);\r\n this.statusService.addToCollection(statusCollection, control, component);\r\n this.disableService.addToCollection(collections.disable, control, formGroup, component);\r\n this.computeService.addToCollection(collections.compute, control, formGroup, component);\r\n this.eventService.addToCollection(collections.event, control, currentGroup, component);\r\n }\r\n }\r\n else if (this.isContainerComponent(component)) {\r\n this.getContainers(component).forEach((container) => {\r\n const currentGroup = this.applyPath(formGroup, container.path, groupMode);\r\n if (this.hasValue(container.path)) {\r\n this.disableService.addToCollection(collections.disable, currentGroup, formGroup, container);\r\n }\r\n // Recurse into the container rows sharing the same collections\r\n this.addRows(currentGroup, container.rows, groupMode, collections, statusCollection);\r\n });\r\n }\r\n else if (this.isArrayComponent(component)) {\r\n const itemComponent = this.getArrayItem(component);\r\n if (itemComponent.key) {\r\n const currentGroup = this.applyPath(formGroup, itemComponent.path, groupMode);\r\n const formArray = this.createFormArray(currentGroup, itemComponent, groupMode, statusCollection);\r\n this.validationService.addToCollection(collections.validation, formArray, currentGroup, component);\r\n this.statusService.addToCollection(statusCollection, formArray, component);\r\n this.eventService.addToCollection(collections.event, formArray, currentGroup, component);\r\n }\r\n }\r\n else if (this.isComponentWithInput(component)) {\r\n const currentGroup = this.applyPath(formGroup, component.path, groupMode);\r\n let control = currentGroup.get(component.key) as AbstractControl | null;\r\n if (!control) {\r\n control = new FormControl(null);\r\n currentGroup.addControl(component.key, control);\r\n }\r\n this.validationService.addToCollection(collections.validation, control, currentGroup, component);\r\n this.statusService.addToCollection(statusCollection, control, component);\r\n this.disableService.addToCollection(collections.disable, control, currentGroup, component);\r\n }\r\n });\r\n }\r\n\r\n private isFormComponent(component: any): boolean {\r\n switch (component.type) {\r\n case \"checkbox\":\r\n case \"checklist\":\r\n case \"datetime\":\r\n case \"filepicker\":\r\n case \"number\":\r\n case \"radio\":\r\n case \"select\":\r\n case \"taglist\":\r\n case \"textarea\":\r\n case \"textfield\":\r\n case \"range\":\r\n case \"expression\":\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n private isContainerComponent(component: any): boolean {\r\n switch (component.type) {\r\n case \"group\":\r\n case \"tab\":\r\n case \"accordion\":\r\n case \"templatehost\":\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n private isComponentWithInput(component: any): boolean {\r\n return component.type === \"component\"\r\n && component.isInput === true\r\n && component.key;\r\n }\r\n\r\n private isArrayComponent(component: any): boolean {\r\n switch (component.type) {\r\n case \"dynamiclist\":\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n private getArrayItem(component: any): { key: any; path: any; rows: any } {\r\n if (component.type === 'dynamiclist') {\r\n return { key: component.key, path: component.path, rows: component.rows };\r\n }\r\n else {\r\n return { key: null, path: null, rows: [] };\r\n }\r\n }\r\n\r\n private createFormArray(formGroup: FormGroup\r\n , itemComponent: any\r\n , groupMode: FormGroupMode\r\n , statusCollection: StatusCollection): FormArrayEx<FormGroup> {\r\n\r\n // Builds controls and behaviours for a newly added array item\r\n const setupItem = (itemGroup: FormGroup): void => {\r\n const statusItemCollection = statusCollection.createCollection(itemGroup);\r\n const collections = this.createCollections();\r\n this.addRows(itemGroup, itemComponent.rows, groupMode, collections, statusItemCollection);\r\n\r\n const destroyRef = this.lifetime.resolve(itemGroup);\r\n this.setupCollections(collections, destroyRef);\r\n this.statusService.setupCollection(statusItemCollection, destroyRef);\r\n };\r\n\r\n // Releases status tracking and subscriptions of a removed array item\r\n const cleanupItem = (itemGroup: FormGroup): void => {\r\n statusCollection.removeCollection(itemGroup);\r\n this.lifetime.destroy(itemGroup);\r\n };\r\n\r\n const existing = formGroup.get(itemComponent.key);\r\n\r\n let formArray: FormArrayEx<FormGroup>;\r\n\r\n if (existing instanceof FormArrayEx) {\r\n formArray = existing;\r\n }\r\n else {\r\n formArray = new FormArrayEx<FormGroup>([]);\r\n formGroup.addControl(itemComponent.key, formArray);\r\n }\r\n\r\n formArray.controlsChanges\r\n .pipe(\r\n takeUntilDestroyed(this.destroyRef)\r\n )\r\n .subscribe(e => {\r\n if (e?.type == \"add\")\r\n setupItem(e.control);\r\n else if (e?.type == \"remove\")\r\n cleanupItem(e.control);\r\n });\r\n\r\n return formArray;\r\n }\r\n\r\n private getContainers(component: any): { path: any; rows: any, disabled: any }[] {\r\n if (component.type === 'group') {\r\n return this.hasValue(component.bindTo) ? [] : [{\r\n path: component.path,\r\n rows: component.rows,\r\n disabled: component.disabled\r\n }];\r\n }\r\n else if ((component.type === 'tab' || component.type === 'accordion')\r\n && Array.isArray(component.panels)) {\r\n return component.panels.map((panel: any) => ({\r\n path: panel.path,\r\n rows: this.metadata.getFormByName(panel.template)?.rows ?? [],\r\n disabled: panel.disabled\r\n }));\r\n }\r\n else if (component.type === 'templatehost') {\r\n return [{\r\n path: component.path,\r\n rows: this.metadata.getFormByName(component.template)?.rows ?? [],\r\n disabled: component.disabled\r\n }];\r\n }\r\n else {\r\n return [];\r\n }\r\n }\r\n\r\n private getDefaultValue(component: any): any {\r\n switch (component.type) {\r\n case \"textarea\":\r\n case \"textfield\":\r\n case \"radio\":\r\n case \"select\":\r\n return component.defaultValue as string;\r\n case \"number\":\r\n return component.defaultValue as number;\r\n case \"checkbox\":\r\n return (component.defaultValue ?? false) as boolean;\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n private getUpdateOn(component: any): \"change\" | \"blur\" | null {\r\n if (component.updateOn === 'change' || component.updateOn === 'blur')\r\n return component.updateOn;\r\n\r\n switch (component.type) {\r\n case \"number\":\r\n case \"textarea\":\r\n case \"textfield\":\r\n return \"blur\";\r\n default:\r\n return null;\r\n }\r\n }\r\n}\r\n","interface Form {\r\n id: string;\r\n type: string;\r\n name: string;\r\n title: string;\r\n readonly: string | boolean | null;\r\n disabled: string | boolean | null;\r\n inactive: string | boolean | null;\r\n path: string | null;\r\n verticalAlignment: string | null;\r\n isTemplate: boolean | null;\r\n i18n: any,\r\n disableAutoFocus?: boolean;\r\n components: Component[];\r\n}\r\n\r\ninterface Component {\r\n id: string;\r\n layout: { columns: number | null, row: string };\r\n components?: Component[];\r\n [key: string]: any;\r\n}\r\n\r\ninterface RowComponent {\r\n id: string;\r\n layout: { columns: number | null, row: string };\r\n rows?: RowGroup[];\r\n [key: string]: any;\r\n}\r\n\r\ninterface RowGroup {\r\n row: string;\r\n components: RowComponent[];\r\n}\r\n\r\ninterface GroupedForm {\r\n id: string;\r\n title: string;\r\n isTemplate: boolean | null;\r\n rows: RowGroup[];\r\n [key: string]: any;\r\n}\r\n\r\nexport function groupByRow(forms: Form[]): GroupedForm[] {\r\n return forms.map(form => ({\r\n id: form.id,\r\n type: form.type,\r\n name: form.name,\r\n title: form.title,\r\n readonly: form.readonly,\r\n disabled: form.disabled,\r\n inactive: form.inactive,\r\n path: form.path,\r\n verticalAlignment: form.verticalAlignment,\r\n isTemplate: form.isTemplate,\r\n i18n: form.i18n,\r\n disableAutoFocus: form.disableAutoFocus,\r\n rows: groupRowsRecursively(form.components)\r\n })); \r\n}\r\n\r\nfunction groupRowsRecursively(components: Component[]): RowGroup[] {\r\n const groupedMap = new Map<string, RowComponent[]>();\r\n\r\n function processComponent(component: Component) {\r\n const row = component.layout?.row;\r\n\r\n if (!groupedMap.has(row)) {\r\n groupedMap.set(row, []);\r\n }\r\n\r\n const { components, ...props } = component;\r\n\r\n groupedMap.get(row)!.push({\r\n ...props,\r\n rows: components ? groupRowsRecursively(components) : undefined\r\n });\r\n }\r\n\r\n components.forEach(component => processComponent(component));\r\n\r\n return Array.from(groupedMap.entries()).map(([row, components]) => ({\r\n row,\r\n components\r\n }));\r\n}\r\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\r\nimport { ICellRendererAngularComp } from 'ag-grid-angular';\r\nimport { ICellRendererParams } from 'ag-grid-community';\r\nimport { Texts } from '../../locale/locale-it';\r\n\r\n@Component({\r\n templateUrl: './objectURLRenderer.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n standalone: true\r\n})\r\nexport class ObjectURLRendererComponent implements ICellRendererAngularComp {\r\n params!: ICellRendererParams;\r\n\r\n Texts = Texts;\r\n\r\n agInit(params: ICellRendererParams): void {\r\n this.params = params;\r\n }\r\n\r\n onClick(event: Event) {\r\n const fileURL = URL.createObjectURL(this.params.data);\r\n window.open(fileURL, '_blank');\r\n setTimeout(() => {\r\n URL.revokeObjectURL(fileURL);\r\n }, 1000);\r\n }\r\n\r\n refresh(): boolean {\r\n return false;\r\n }\r\n}\r\n","<a [attr.aria-label]=\"Texts.Show\" title=\"{{ Texts.Show }}\" href=\"javascript:void(0)\" (click)=\"onClick($event)\">\r\n <span class=\"fas fa-paperclip\"></span>\r\n</a>\r\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\r\nimport { ICellRendererAngularComp } from 'ag-grid-angular';\r\nimport { Texts } from '../../locale/locale-it';\r\n\r\n@Component({\r\n templateUrl: './deleteRowRenderer.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n standalone: true\r\n})\r\nexport class DeleteRowRendererComponent implements ICellRendererAngularComp {\r\n params: any;\r\n\r\n Texts = Texts;\r\n\r\n agInit(params: any): void {\r\n this.params = params;\r\n }\r\n\r\n onClick(event: Event) {\r\n\r\n if ('remove' in this.params.data && typeof this.params.data.remove === 'function') {\r\n this.params.data.remove();\r\n }\r\n }\r\n\r\n refresh(): boolean {\r\n return false;\r\n }\r\n}\r\n\r\n","<a [attr.aria-label]=\"Texts.Remove\" title=\"{{ Texts.Remove }}\" href=\"javascript:void(0)\" (click)=\"onClick($event)\">\r\n <span class=\"fas fa-trash\"></span>\r\n</a>\r\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\r\n\r\nimport { ICellRendererAngularComp } from 'ag-grid-angular';\r\nimport { SirioButton } from '@wemake4u/form-controls';\r\nimport { ProgrammabilityService, EvaluateOptions } from '../../services/programmability.service';\r\nimport { CacheContextService } from '../../services/cache.service';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { toProxy } from '../../utils/proxy';\r\n\r\n@Component({\r\n templateUrl: './actionsCellRenderer.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n imports: [\r\n SirioButton\r\n]\r\n})\r\nexport class ActionsCellRendererComponent implements ICellRendererAngularComp {\r\n\r\n constructor(private programmability: ProgrammabilityService) { }\r\n\r\n params: any;\r\n\r\n agInit(params: any): void {\r\n this.params = params;\r\n this.cacheContext = this.getCacheContext(); \r\n }\r\n\r\n refresh(): boolean {\r\n return false;\r\n }\r\n\r\n evaluateBoolean(value: boolean | string | null): boolean | null {\r\n return this.cacheContext.evaluateBoolean(this.getCacheControl(), this.getFormGroup(), value, this.getOptions());\r\n //return this.programmability.evaluateBoolean(this.getFormGroup(), value, this.getOptions());\r\n }\r\n\r\n evaluateString(value: string | null): string {\r\n return this.cacheContext.evaluateString(this.getCacheControl(), this.getFormGroup(), value, this.getOptions());\r\n //return this.programmability.evaluateString(this.getFormGroup(), value, this.getOptions());\r\n }\r\n\r\n clickButton(action: any, event: any) {\r\n if (action.click) {\r\n const event = {\r\n params: this.params,\r\n action: action,\r\n data: this.getData(),\r\n rowIndex: this.getRowIndex()\r\n };\r\n const options: EvaluateOptions = {\r\n cacheable: false,\r\n extendContext: () => ({\r\n \"event\": event\r\n }),\r\n invokeArgs: [event]\r\n }\r\n\r\n return this.programmability.evaluate(this.getFormGroup(), action.click, options);\r\n } \r\n }\r\n\r\n private cacheContext!: CacheContextService;\r\n\r\n private getCacheControl(): any {\r\n return this.params.data ?? this;\r\n }\r\n\r\n private getOptions(): EvaluateOptions {\r\n const event = {\r\n params: this.params,\r\n data: this.getData(),\r\n rowIndex: this.getRowIndex()\r\n };\r\n return {\r\n //cacheable: false,\r\n extendContext: () => ({\r\n \"event\": event\r\n }),\r\n invokeArgs: [event]\r\n }\r\n }\r\n\r\n private getData(): any {\r\n return toProxy(this.params.data);\r\n }\r\n\r\n private getRowIndex(): any {\r\n return this.params.node.rowIndex;\r\n }\r\n\r\n private getFormGroup(): FormGroup {\r\n return this.params.formGroup as FormGroup;\r\n }\r\n\r\n private getCacheContext(): CacheContextService {\r\n return this.params.api.getGridOption(\"context\").cacheContext; \r\n }\r\n}\r\n\r\n","<div class=\"btn-small-group\">\r\n @for (action of params.component.actions; track action) {\r\n @if (!evaluateBoolean(action.disabled)) {\r\n <button type=\"button\" wmSirioButton=\"ghost\" class=\"btn-small\" iconOnly\r\n [icon]=\"evaluateString(action.icon)\"\r\n [label]=\"evaluateString(action.label)\"\r\n (click)=\"clickButton(action, $event)\"></button>\r\n }\r\n }\r\n</div>\r\n","export const getLabelSymbol = Symbol('getLabel');\r\n","import { getLabelSymbol } from './symbols';\r\n\r\nexport type LabeledMap<TKey extends string | number, TValue> =\r\n Record<TKey, TValue> & {\r\n [getLabelSymbol]?: (value: TKey) => TValue;\r\n };\r\n\r\nexport function isLabeledRecord<TKey extends string | number, TValue>(\r\n obj: any,\r\n isKey: (key: any) => key is TKey,\r\n isValue: (val: any) => val is TValue,\r\n getLabelSymbol: symbol\r\n): obj is Record<TKey, TValue> & { [key: symbol]: (key: TKey) => TValue } {\r\n if (!isRecord(obj, isKey, isValue)) {\r\n return false;\r\n }\r\n const getLabel = (obj as { [key: symbol]: unknown })[getLabelSymbol];\r\n return (getLabel !== undefined && typeof getLabel === 'function');\r\n}\r\n\r\nexport function isRecord<TKey extends string | number, TValue>(\r\n obj: any,\r\n isKey: (key: any) => key is TKey,\r\n isValue: (val: any) => val is TValue\r\n): obj is Record<TKey, TValue> {\r\n if (typeof obj !== 'object' || obj === null || Array.isArray(obj)) {\r\n return false;\r\n }\r\n return Object.entries(obj).every(([key, val]) => {\r\n return isKey(key) && isValue(val);\r\n });\r\n}\r\n\r\nexport function isStringKey(key: any): key is string | number {\r\n return typeof key === 'string';\r\n}\r\n\r\nexport function isNumericKey(key: any): key is string | number {\r\n return typeof key === 'string' && !isNaN(Number(key));\r\n}\r\n\r\nexport function isBooleanKey(key: any): key is string | number {\r\n return key === 'true' || key === 'false';\r\n}\r\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\r\n\r\nimport { FormsModule } from '@angular/forms';\r\nimport { IFilterParams, IDoesFilterPassParams } from 'ag-grid-community';\r\nimport { IFilterAngularComp } from '@ag-grid-community/angular';\r\nimport { SirioCheckbox, SirioTextbox } from '@wemake4u/form-controls';\r\nimport { isRecord } from '../../common/record';\r\nimport { Texts } from '../../locale/locale-it';\r\n\r\n@Component({\r\n templateUrl: './setfilter.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n imports: [FormsModule, SirioTextbox, SirioCheckbox],\r\n styles: `\r\n .set-filter {\r\n padding: 10px;\r\n background-color: white;\r\n }\r\n .set-filter-options {\r\n max-height: 200px;\r\n overflow-y: auto;\r\n }\r\n `\r\n})\r\nexport class SetFilterComponent implements IFilterAngularComp {\r\n private params!: IFilterParams;\r\n private fieldName!: string;\r\n\r\n Texts = Texts;\r\n\r\n selectAll: boolean = true;\r\n searchText: string = '';\r\n\r\n options: { value: any; label: string; selected: boolean }[] = [];\r\n filteredOptions: typeof this.options = [];\r\n\r\n agInit(params: IFilterParams): void {\r\n this.params = params;\r\n this.fieldName = params.colDef.field!;\r\n\r\n const map = params.colDef.filterParams?.map;\r\n\r\n const result = isRecord(\r\n map,\r\n key => typeof key === 'string' || typeof key === 'number',\r\n val => typeof val === 'string'\r\n );\r\n\r\n if (result) {\r\n this.options = Object.entries(map).map(([key, label]) => ({\r\n value: this.parseKey(key),\r\n label: label,\r\n selected: true\r\n }));\r\n }\r\n else {\r\n this.options = [];\r\n }\r\n \r\n this.filteredOptions = [...this.options];\r\n }\r\n\r\n isFilterActive(): boolean {\r\n return this.options.some(o => !o.selected);\r\n }\r\n\r\n doesFilterPass(params: IDoesFilterPassParams): boolean {\r\n const value = this.resolvePath(params.data, this.fieldName);\r\n return this.options.some(o => o.selected && o.value === value);\r\n }\r\n\r\n getModel() {\r\n const selectedValues = this.options\r\n .filter(o => o.selected)\r\n .map(o => o.value);\r\n\r\n if (selectedValues.length === this.options.length) { \r\n return null;\r\n }\r\n\r\n if (selectedValues.length === 0) {\r\n return {\r\n filterType: 'text',\r\n type: 'excludeAll'\r\n }\r\n }\r\n\r\n const filterType = this.getFilterType();\r\n\r\n const filters = selectedValues.map(value => ({\r\n filterType: filterType,\r\n type: 'equals',\r\n filter: value\r\n }));\r\n\r\n if (filters.length === 1)\r\n return filters[0];\r\n\r\n return {\r\n filterType: filterType,\r\n operator: 'OR',\r\n conditions: filters\r\n }\r\n }\r\n\r\n setModel(model: any): void {\r\n\r\n // no filter = all selected\r\n if (model == null)\r\n return;\r\n\r\n this.selectAll = false;\r\n\r\n // all unselected\r\n if (model?.type === 'excludeAll') {\r\n this.options.forEach(o => o.selected = false);\r\n }\r\n // one selected\r\n else if (model?.type === 'equals') {\r\n this.options.forEach(o => o.selected = (o.value == model.filter));\r\n }\r\n // many selected\r\n else if (model?.operator === 'OR' && Array.isArray(model.conditions)) {\r\n const selected = model.conditions.map((x: any) => x.filter);\r\n this.options.forEach(o => o.selected = selected.includes(o.value));\r\n }\r\n\r\n this.updateFilteredOptions();\r\n }\r\n\r\n onSelectionChange(): void {\r\n this.params.filterChangedCallback();\r\n }\r\n\r\n onSearchChange(): void {\r\n this.updateFilteredOptions();\r\n }\r\n\r\n onSelectAllChange(): void { \r\n this.setAll(this.selectAll);\r\n }\r\n\r\n private parseKey(key: string): boolean | number | string {\r\n if (key === 'true') return true;\r\n if (key === 'false') return false;\r\n const num = Number(key);\r\n return isNaN(num) ? key : num;\r\n }\r\n\r\n private setAll(select: boolean): void {\r\n this.options.forEach(o => o.selected = select);\r\n this.updateFilteredOptions();\r\n this.params.filterChangedCallback();\r\n }\r\n\r\n private updateFilteredOptions(): void {\r\n const search = this.searchText.toLowerCase();\r\n this.filteredOptions = this.options.filter(o =>\r\n o.label.toLowerCase().includes(search)\r\n );\r\n }\r\n\r\n private resolvePath(obj: any, path: string): any {\r\n return path.split('.').reduce((acc, part) => acc?.[part], obj);\r\n }\r\n\r\n private getFilterType() {\r\n const cellDataType = this.params?.colDef?.cellDataType;\r\n\r\n switch (cellDataType) {\r\n case 'number':\r\n return 'number';\r\n case 'date':\r\n case 'dateTime':\r\n return 'date';\r\n case 'text':\r\n return 'text';\r\n default:\r\n return 'number';\r\n }\r\n \r\n }\r\n}\r\n","<div class=\"set-filter\">\r\n\r\n <wm-sirio-textbox\r\n [placeholder]=\"Texts.TypeToSearch\"\r\n [ariaLabel]=\"Texts.TypeToSearch\"\r\n autocomplete=\"off\"\r\n [(ngModel)]=\"searchText\"\r\n (ngModelChange)=\"onSearchChange()\" />\r\n\r\n <div class=\"set-filter-options\">\r\n <wm-sirio-checkbox [label]=\"Texts.SelectAll\" [(ngModel)]=\"selectAll\" (ngModelChange)=\"onSelectAllChange()\" />\r\n\r\n @for (option of filteredOptions; track option) {\r\n <wm-sirio-checkbox\r\n [label]=\"option.label\"\r\n [(ngModel)]=\"option.selected\"\r\n (ngModelChange)=\"onSelectionChange()\" />\r\n }\r\n </div>\r\n\r\n</div>\r\n","import {\r\n Component, ViewChild, ViewContainerRef, AfterViewInit, ComponentRef, Type,\r\n Injector,\r\n ChangeDetectionStrategy\r\n} from '@angular/core';\r\n\r\nimport { FormGroup } from '@angular/forms';\r\nimport { ICellRendererAngularComp } from 'ag-grid-angular';\r\nimport { ProgrammabilityService, EvaluateOptions } from '../../services/programmability.service';\r\nimport { GlobalService } from '../../services/global.service';\r\nimport { toProxy } from '../../utils/proxy';\r\n\r\n@Component({\r\n templateUrl: './hostCellRenderer.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n imports: []\r\n})\r\nexport class HostCellRendererComponent implements ICellRendererAngularComp, AfterViewInit {\r\n @ViewChild('container', { read: ViewContainerRef, static: true }) container!: ViewContainerRef;\r\n\r\n constructor(private injector: Injector,\r\n private programmability: ProgrammabilityService,\r\n private globalService: GlobalService) { }\r\n\r\n params: any;\r\n\r\n agInit(params: any): void {\r\n this.params = params;\r\n }\r\n\r\n refresh(): boolean {\r\n return false;\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n const componentType = this.resolveComponentType(this.getComponentType());\r\n if (componentType) {\r\n this.componentRef = this.container.createComponent(componentType, {\r\n injector: this.injector,\r\n });\r\n\r\n this.setProperties();\r\n }\r\n }\r\n\r\n //#region Private Members\r\n\r\n private componentRef: ComponentRef<any> | null = null;\r\n\r\n private resolveComponentType(type: string): Type<any> | null {\r\n return this.globalService.getComponent(type);\r\n }\r\n\r\n private resolveProperties(): Record<string, any> {\r\n const properties = this.getProperties();\r\n if (properties) {\r\n return this.evaluate(properties) ?? {}\r\n }\r\n else\r\n {\r\n return { };\r\n } \r\n }\r\n\r\n private setProperties(): void {\r\n if (!this.componentRef) return;\r\n const properties = this.resolveProperties();\r\n for (const key of Object.keys(properties)) {\r\n const value = properties[key];\r\n if (key in this.componentRef.instance) {\r\n this.componentRef.setInput?.(key, value);\r\n }\r\n }\r\n }\r\n\r\n private evaluate(value: string) {\r\n const event = {\r\n params: this.params,\r\n value: this.getValue(),\r\n data: this.getData(),\r\n rowIndex: this.getRowIndex()\r\n };\r\n const options: EvaluateOptions = {\r\n cacheable: false,\r\n extendContext: () => ({\r\n \"event\": event\r\n }),\r\n invokeArgs: [event]\r\n }\r\n\r\n return this.programmability.evaluate(this.getFormGroup(), value, options);\r\n }\r\n\r\n private getComponentType(): string {\r\n return this.params.componentType;\r\n }\r\n\r\n private getProperties(): string | undefined\r\n {\r\n return this.params.properties;\r\n }\r\n\r\n private getFormGroup(): FormGroup {\r\n return this.params.formGroup;\r\n }\r\n\r\n private getData(): any {\r\n return toProxy(this.params.data);\r\n }\r\n\r\n private getValue(): any {\r\n return this.params.value;\r\n }\r\n\r\n private getRowIndex(): any {\r\n return this.params.node.rowIndex;\r\n }\r\n\r\n //#endregion\r\n}\r\n\r\n","<ng-container #container></ng-container>\r\n","function getCandidate(element: HTMLElement): HTMLElement[] {\r\n return Array.from(element.querySelectorAll<HTMLElement>(\r\n 'a[href], area[href], input:not([disabled]), select:not([disabled]), ' +\r\n 'textarea:not([disabled]), button:not([disabled]), iframe, object, embed, ' +\r\n '[tabindex]:not([tabindex=\"-1\"]), [contenteditable]'\r\n ));\r\n}\r\n\r\nfunction isVisible(element: HTMLElement): boolean {\r\n let el: HTMLElement | null = element;\r\n while (el) {\r\n const style = window.getComputedStyle(el);\r\n if (style.display === 'none' || style.visibility === 'hidden') return false;\r\n el = el.parentElement;\r\n }\r\n return true;\r\n}\r\n\r\nfunction isFocusable(element: HTMLElement): boolean {\r\n const style = window.getComputedStyle(element);\r\n const hasTabIndex = element.tabIndex >= 0;\r\n const isContentEditable = element.hasAttribute('contenteditable')\r\n && element.getAttribute('contenteditable') !== 'false';\r\n if (element.contentEditable === \"true\") return true;\r\n return (hasTabIndex || isContentEditable) &&\r\n style.visibility !== 'hidden' &&\r\n style.display !== 'none' &&\r\n !element.hasAttribute('disabled') &&\r\n isVisible(element);\r\n}\r\n\r\nexport function getFocusables(el: HTMLElement, firstOnly = false): HTMLElement[] {\r\n const candidates = getCandidate(el);\r\n const result: HTMLElement[] = [];\r\n for (const focusableEl of candidates) { \r\n if (isFocusable(focusableEl)) {\r\n result.push(focusableEl);\r\n if (firstOnly) {\r\n break;\r\n }\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nexport function setFocus(el: HTMLElement, preventScroll: boolean = false): HTMLElement | null {\r\n const focusables = getFocusables(el, true); \r\n if (focusables.length === 0) {\r\n return null;\r\n }\r\n const target = focusables[0];\r\n\r\n target.focus({ preventScroll });\r\n\r\n return target;\r\n}\r\n\r\n/**\r\n * True when a field inside `container` already has the focus, e.g. moved there by a tab or an\r\n * accordion (`focusContent` of @wemake4u/form-controls): the automatic focus of the form keeps it.\r\n */\r\nexport function hasFieldFocus(container: HTMLElement): boolean {\r\n const active = container.ownerDocument.activeElement as HTMLElement | null;\r\n return !!active && active !== container && container.contains(active)\r\n && active.matches('input, select, textarea, [contenteditable]:not([contenteditable=\"false\"])');\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { marked } from 'marked';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MarkdownService {\r\n\r\n constructor() {\r\n\r\n marked.use({\r\n async: false,\r\n gfm: true,\r\n breaks: true\r\n });\r\n\r\n const renderer = new marked.Renderer();\r\n\r\n renderer.link = function (args) {\r\n if (args.href?.startsWith('action://'))\r\n return `<a href=\"#\" data-action=\"${args.href.substring(\"action://\".length) }\">${args.text}</a>`;\r\n return `<a href=\"${args.href}\" target=\"_blank\">${args.text}</a>`; \r\n };\r\n\r\n marked.setOptions({ renderer });\r\n }\r\n\r\n toHtml(text: string): string {\r\n return marked.parse(text ?? \"\") as string;\r\n };\r\n\r\n /** Inline markdown only (bold, italic, links...): no block elements such as <p>. */\r\n toInlineHtml(text: string): string {\r\n return marked.parseInline(text ?? \"\") as string;\r\n };\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport {\r\n Module, PaginationModule, ClientSideRowModelModule, InfiniteRowModelModule\r\n , LocaleModule, CellStyleModule, ValidationModule, RowApiModule, RowStyleModule \r\n , RowSelectionModule, RowSelectionOptions \r\n , TextFilterModule, NumberFilterModule, DateFilterModule, CustomFilterModule\r\n , ColDef, themeQuartz, iconSetAlpine, GridOptions, DataTypeDefinition\r\n , ClientSideRowModelApiModule, RowAutoHeightModule\r\n , GridSizeChangedEvent, ModelUpdatedEvent, ColumnAutoSizeModule, ColumnApiModule, GridApi\r\n , SuppressKeyboardEventParams\r\n , GetRowIdFunc, GetRowIdParams, HighlightChangesModule\r\n} from 'ag-grid-community';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { ObjectURLRendererComponent } from '../components/objectURLRenderer/objectURLRenderer.component';\r\nimport { DeleteRowRendererComponent } from '../components/deleteRowRenderer/deleteRowRenderer.component';\r\nimport { ActionsCellRendererComponent } from '../components/actionsCellRenderer/actionsCellRenderer.component';\r\nimport { SetFilterComponent } from '../components/setFilter/setFilter.component';\r\nimport { HostCellRendererComponent } from '../components/hostCellRenderer/hostCellRenderer.component';\r\nimport { FormatterService } from '../services/formatter.service';\r\nimport { MarkdownService } from '../services/markdown.service';\r\nimport { ProgrammabilityService } from '../services/programmability.service';\r\nimport { WeakService } from '../services/weak.service';\r\nimport { getFocusables } from '../utils/focusable';\r\nimport { isRecord, isLabeledRecord, isNumericKey } from '../common/record';\r\nimport { getLabelSymbol } from '../common/symbols';\r\nimport {\r\n AG_GRID_LOCALE_IT,\r\n AG_GRID_LOCALE_EN,\r\n AG_GRID_LOCALE_DE,\r\n AG_GRID_LOCALE_FR,\r\n AG_GRID_LOCALE_ES,\r\n AG_GRID_LOCALE_PT \r\n} from '@ag-grid-community/locale';\r\n\r\nimport { LanguageService } from '@wemake4u/interact';\r\nimport { Texts } from '../locale/locale';\r\nimport { localize } from '../locale/localize';\r\n\r\ntype MapType = Record<string | number, string> | null;\r\n\r\ntype GroupNode = {\r\n name: string;\r\n type: \"group\";\r\n columns: (GroupNode | any)[];\r\n};\r\n\r\n@Injectable()\r\nexport class GridService {\r\n\r\n constructor(private formatter: FormatterService\r\n , private languageService: LanguageService\r\n , private programmability: ProgrammabilityService\r\n , private markdownService: MarkdownService\r\n , private weak: WeakService) {\r\n }\r\n\r\n getModules(): Module[] {\r\n return [\r\n ClientSideRowModelModule\r\n , InfiniteRowModelModule\r\n , PaginationModule\r\n , LocaleModule\r\n , CellStyleModule\r\n , ClientSideRowModelApiModule\r\n , TextFilterModule\r\n , NumberFilterModule\r\n , DateFilterModule\r\n , CustomFilterModule\r\n , ColumnAutoSizeModule\r\n , ColumnApiModule\r\n , RowSelectionModule\r\n , RowApiModule\r\n , RowAutoHeightModule\r\n , RowStyleModule \r\n , HighlightChangesModule\r\n //, ValidationModule\r\n ];\r\n };\r\n\r\n getOptions(component: any, formGroup: FormGroup): GridOptions {\r\n const selection = this.getRowSelection(component, formGroup);\r\n const rowId = this.getRowId(component);\r\n const pagination = this.getPaginable(component);\r\n const pageSize = this.getPageSize(component);\r\n const texts = this.getTexts();\r\n const theme = this.getTheme();\r\n const autoHeight = (component.autoHeight === true);\r\n const options : GridOptions = {\r\n defaultColDef: {\r\n floatingFilter: (component.floatingFilter === true),\r\n headerClass: (component.floatingFilter === true)\r\n ? 'show-filter' : 'hide-filter'\r\n },\r\n selectionColumnDef: {\r\n pinned: 'left'\r\n },\r\n dataTypeDefinitions: this.getDataTypeDefinitions(),\r\n rowSelection: selection,\r\n pagination: pagination,\r\n paginationPageSize: pageSize,\r\n cacheBlockSize: pageSize,\r\n paginationPageSizeSelector: [5, 10, 20, 50],\r\n localeText: texts,\r\n enableCellTextSelection: true,\r\n theme: theme,\r\n getRowId: rowId,\r\n domLayout: autoHeight ? \"autoHeight\" : undefined,\r\n onGridSizeChanged: (params: GridSizeChangedEvent) => {\r\n this.resizeGrid(component, params.api);\r\n },\r\n onModelUpdated: (params: ModelUpdatedEvent) => {\r\n this.resizeGrid(component, params.api);\r\n this.onRowSelecting(component, formGroup, params); \r\n }\r\n };\r\n this.setRowStyle(component, options, formGroup);\r\n return options;\r\n }\r\n\r\n getColumnDefs(component: any, columns: any, formGroup: FormGroup): ColDef[] {\r\n if (Array.isArray(columns)) {\r\n const groupedColumns = this.groupColumns(columns);\r\n const columnDefs = this.groupsToColumnDefs(groupedColumns\r\n , (cs) => this.createColumnDefs(component, cs, formGroup));\r\n\r\n this.addActionColumnDef(component, columnDefs, formGroup);\r\n this.addRowNumbersColumnDef(component, columnDefs);\r\n\r\n return columnDefs;\r\n }\r\n else {\r\n return [];\r\n }\r\n }\r\n\r\n onSelectionChanged(component: any, formGroup: FormGroup, gridEvent: any) {\r\n if (component.selectionChanged) {\r\n const event = {\r\n selectedRows: gridEvent.api.getSelectedRows()\r\n };\r\n return this.programmability.evaluate(formGroup, component.selectionChanged, {\r\n cacheable: false,\r\n extendContext: () => ({\r\n \"event\": event\r\n }),\r\n invokeArgs: [ event ]\r\n });\r\n }\r\n }\r\n\r\n getCacheKey(): string {\r\n return `getGridOptions_${this.language}`;\r\n }\r\n\r\n invalidateOptions(component: any) {\r\n this.weak.invalidate(component, this.getCacheKey());\r\n }\r\n\r\n onRowDataChanged(component: any, api: GridApi, rowData: any) { \r\n if (this.hasRowNumbers(component) && this.hasRowId(component)) {\r\n this.refreshRowNumbers(api);\r\n } \r\n }\r\n\r\n onDataSourceChanged(component: any, api: GridApi, dataSource: any) {\r\n // Nothing\r\n }\r\n\r\n private get language(): string {\r\n return this.languageService.getLanguage();\r\n }\r\n\r\n private locale(component: any, key: string): string {\r\n return localize(this.language, component, key);\r\n }\r\n\r\n resizeGrid(component: any, api: GridApi) {\r\n const columnsToResize: string[] = [];\r\n\r\n if (this.hasActions(component)) {\r\n columnsToResize.push('actions');\r\n }\r\n\r\n if (this.hasRowNumbers(component)) {\r\n columnsToResize.push('rowNumbers');\r\n }\r\n\r\n if (columnsToResize.length > 0) {\r\n api.autoSizeColumns(columnsToResize);\r\n }\r\n }\r\n\r\n private hasActions(component: any) {\r\n return Array.isArray(component.actions) && component.actions.length > 0;\r\n }\r\n\r\n private hasRowNumbers(component: any) {\r\n return (component.rowNumbers);\r\n }\r\n\r\n private createColumnDefs(component: any, columns: any, formGroup: FormGroup): ColDef[] {\r\n if (Array.isArray(columns)) {\r\n const columnDefs = columns.map((column: any) => {\r\n const colDef: ColDef = {\r\n field: column.key,\r\n headerName: this.locale(column, 'label')\r\n }\r\n\r\n this.setCellDataType(column, colDef);\r\n\r\n const map = this.getMap(column, colDef, formGroup);\r\n\r\n this.setCellRenderer(column, colDef, map, formGroup);\r\n this.setValueGetter(column, colDef, formGroup);\r\n this.setColStyles(column, colDef, formGroup);\r\n this.setAutoHeight(column, colDef);\r\n this.setResizable(column, colDef);\r\n this.setSortable(column, colDef);\r\n this.setFilter(column, colDef, map);\r\n this.setFilterParams(column, colDef, map);\r\n this.setSuppressMovable(column, colDef);\r\n this.setFlex(column, colDef);\r\n this.setAlign(column, colDef);\r\n this.setPinned(column, colDef);\r\n this.setWidth(column, colDef);\r\n this.setValueFormatter(column, colDef, map);\r\n this.setCellChangeFlash(column, colDef);\r\n\r\n return colDef;\r\n });\r\n\r\n return columnDefs;\r\n }\r\n else {\r\n return [];\r\n }\r\n }\r\n\r\n private addActionColumnDef(component: any, columnDefs: ColDef[], formGroup: FormGroup) {\r\n if (this.hasActions(component)) {\r\n columnDefs.push({\r\n colId: 'actions',\r\n headerName: this.locale(Texts, 'Actions'),\r\n resizable: false,\r\n sortable: false,\r\n filter: false,\r\n cellDataType: false,\r\n hide: this.suppressActions(component, formGroup),\r\n pinned: \"right\", \r\n cellRendererParams: {\r\n component: component,\r\n formGroup: formGroup\r\n },\r\n cellRenderer: ActionsCellRendererComponent,\r\n suppressKeyboardEvent: this.navigateInsideCell.bind(this)\r\n });\r\n }\r\n }\r\n\r\n private addRowNumbersColumnDef(component: any, columnDefs: ColDef[]) { \r\n if (this.hasRowNumbers(component)) {\r\n columnDefs.unshift({\r\n colId: 'rowNumbers',\r\n headerName: \"#\",\r\n pinned: \"left\",\r\n headerClass: 'row-numbers-header',\r\n cellClass: 'row-numbers-cell',\r\n resizable: false,\r\n sortable: false,\r\n valueGetter: (n: any) => n.node.rowIndex + 1\r\n });\r\n }\r\n }\r\n\r\n private refreshRowNumbers(api: GridApi) {\r\n if (api) {\r\n const rowNumbers = [\"rowNumbers\"];\r\n api.setColumnsVisible(rowNumbers, false);\r\n api.setColumnsVisible(rowNumbers, true); \r\n } \r\n }\r\n\r\n private groupColumns(columns: any[]): (GroupNode | any)[] {\r\n const rootItemsOrdered: (GroupNode | any)[] = [];\r\n\r\n function findOrCreateGroup(\r\n groups: (GroupNode | any)[],\r\n name: string\r\n ): GroupNode {\r\n let group = groups.find(\r\n item => (item as GroupNode).type === \"group\" && (item as GroupNode).name === name\r\n ) as GroupNode;\r\n\r\n if (!group) {\r\n group = {\r\n name,\r\n type: \"group\",\r\n columns: [],\r\n };\r\n groups.push(group);\r\n }\r\n\r\n return group;\r\n }\r\n\r\n for (const column of columns) {\r\n const groupParts = (column.group ?? \"\")\r\n .split(/[\\\\/]/)\r\n .map((part: string) => part.trim())\r\n .filter((part: string) => part.length > 0);\r\n\r\n if (groupParts.length === 0) {\r\n rootItemsOrdered.push(column);\r\n } else {\r\n let currentLevel = rootItemsOrdered;\r\n for (let i = 0; i < groupParts.length; i++) {\r\n const part = groupParts[i];\r\n const group = findOrCreateGroup(currentLevel, part);\r\n currentLevel = group.columns;\r\n }\r\n currentLevel.push(column);\r\n }\r\n }\r\n\r\n return rootItemsOrdered;\r\n }\r\n\r\n private groupsToColumnDefs(grouped: (GroupNode | any)[], getColumnsDef: (columns: any[]) => ColDef[]): any[] {\r\n return grouped.map(item => {\r\n if ('type' in item && item.type === 'group') {\r\n return {\r\n headerName: item.name,\r\n children: this.groupsToColumnDefs(item.columns, getColumnsDef)\r\n };\r\n } else {\r\n return getColumnsDef([item])[0];\r\n }\r\n });\r\n }\r\n\r\n private setCellDataType(column: any, colDef: ColDef) {\r\n if (column.dataType === \"component\"\r\n || column.dataType === \"formatted\"\r\n || column.dataType === \"auto\") return;\r\n\r\n if (typeof column.dataType === \"string\"\r\n && column.dataType.trim() !== \"\") {\r\n colDef.cellDataType = column.dataType;\r\n }\r\n }\r\n\r\n private setRowStyle(component: any, gridOptions: GridOptions, formGroup: FormGroup) {\r\n this.applyStyle(gridOptions, formGroup, component.rowClass, \"getRowClass\", \"rowClass\");\r\n this.applyStyle(gridOptions, formGroup, component.rowStyle, \"getRowStyle\", \"rowStyle\");\r\n this.applyStyle(gridOptions, formGroup, component.rowClassRules, \"rowClassRules\", \"rowClassRules\");\r\n }\r\n\r\n private setColStyles(column: any, colDef: ColDef, formGroup: FormGroup) {\r\n this.applyStyle(colDef, formGroup, column.headerClass, \"headerClass\", \"headerClass\");\r\n this.applyStyle(colDef, formGroup, column.headerStyle, \"headerStyle\", \"headerStyle\");\r\n this.applyStyle(colDef, formGroup, column.cellClass, \"cellClass\", \"cellClass\");\r\n this.applyStyle(colDef, formGroup, column.cellStyle, \"cellStyle\", \"cellStyle\");\r\n this.applyStyle(colDef, formGroup, column.cellClassRules, \"cellClassRules\", \"cellClassRules\");\r\n }\r\n\r\n private setCellRenderer(column: any, colDef: ColDef, map: MapType, formGroup: FormGroup) {\r\n if (column.format === \"objectURL\") {\r\n colDef.cellRenderer = ObjectURLRendererComponent;\r\n }\r\n\r\n if (column.format === \"deleteRow\") {\r\n colDef.cellRenderer = DeleteRowRendererComponent;\r\n }\r\n\r\n if (colDef.cellDataType === \"boolean\" && map) {\r\n colDef.cellRenderer = (params: any) => {\r\n return this.formatMap(params.value, map); \r\n }\r\n }\r\n\r\n if (column.dataType === \"formatted\") {\r\n colDef.cellRenderer = (params: any) => {\r\n return this.markdownService.toHtml(params.value);\r\n }\r\n }\r\n\r\n if (column.dataType === \"component\") {\r\n colDef.cellRenderer = HostCellRendererComponent;\r\n colDef.cellRendererParams = {\r\n componentType: column.component,\r\n properties: column.properties,\r\n formGroup: formGroup\r\n };\r\n colDef.cellClass = 'cell-component';\r\n }\r\n\r\n if (column.dataType === \"custom\") {\r\n this.applyExpression(colDef, formGroup, column.customRenderer, \"cellRenderer\"); \r\n }\r\n }\r\n\r\n private setValueGetter(column: any, colDef: ColDef, formGroup: FormGroup) {\r\n this.applyExpression(colDef, formGroup, column.valueGetter, \"valueGetter\");\r\n }\r\n\r\n private setCellChangeFlash(column: any, colDef: ColDef) {\r\n colDef.enableCellChangeFlash = true;\r\n }\r\n\r\n private setAutoHeight(column: any, colDef: ColDef) {\r\n if (column.autoHeight) {\r\n colDef.autoHeight = true;\r\n colDef.wrapText = true;\r\n } \r\n }\r\n\r\n private setResizable(column: any, colDef: ColDef ) {\r\n colDef.resizable = (column.resize === true);\r\n }\r\n\r\n private setSortable(column: any, colDef: ColDef) {\r\n colDef.sortable = (column.sort === true);\r\n }\r\n\r\n private setFilter(column: any, colDef: ColDef, map: MapType) {\r\n if (column.filter === true) {\r\n colDef.filter = true;\r\n if (map) {\r\n colDef.filter = SetFilterComponent;\r\n }\r\n }\r\n }\r\n\r\n private setFilterParams(column: any, colDef: ColDef, map: MapType) {\r\n\r\n const filterParams: any = {};\r\n\r\n if (column.dataType === 'uuid') {\r\n this.setUuidFilterParams(filterParams);\r\n }\r\n else if (column.dataType === 'integer') {\r\n this.setIntegerFilterParams(filterParams);\r\n }\r\n else if (column.dataType === 'date') {\r\n this.setDateFilterParams(filterParams);\r\n }\r\n else if (column.dataType === 'boolean') {\r\n this.setBooleanFilterParams(filterParams);\r\n }\r\n \r\n if (map) {\r\n filterParams.map = map;\r\n }\r\n\r\n colDef.filterParams = filterParams;\r\n }\r\n\r\n private setUuidFilterParams(filterParams: any) {\r\n filterParams.filterOptions = ['equals', 'notEqual'];\r\n }\r\n\r\n private setIntegerFilterParams(filterParams: any) {\r\n filterParams.allowedCharPattern = '\\\\d';\r\n }\r\n\r\n private setDateFilterParams(filterParams: any) {\r\n filterParams.comparator = (filterLocalDateAtMidnight: Date, cellValue: string) => {\r\n if (!cellValue) return -1;\r\n const cellDate = new Date(cellValue);\r\n if (isNaN(cellDate.getTime())) return -1;\r\n\r\n const cellDateNoTime = new Date(cellDate.getFullYear(), cellDate.getMonth(), cellDate.getDate());\r\n\r\n if (cellDateNoTime < filterLocalDateAtMidnight) return -1;\r\n if (cellDateNoTime > filterLocalDateAtMidnight) return 1;\r\n return 0;\r\n }\r\n }\r\n\r\n private setBooleanFilterParams(filterParams: any) {\r\n filterParams.filterOptions = [\r\n {\r\n displayKey: 'includeAll',\r\n displayName: Texts.ChooseOne,\r\n numberOfInputs: 0,\r\n predicate: ([filter]: [any], value: any) => true\r\n },\r\n {\r\n displayKey: 'true',\r\n displayName: Texts.True,\r\n numberOfInputs: 0,\r\n predicate: ([filter]: [any], value: any) => value === true\r\n },\r\n {\r\n displayKey: 'false',\r\n displayName: Texts.False,\r\n numberOfInputs: 0,\r\n predicate: ([filter]: [any], value: any) => value === false\r\n },\r\n {\r\n displayKey: 'blank',\r\n displayName: Texts.Blank,\r\n numberOfInputs: 0,\r\n predicate: ([filter]: [any], value: any) => value === null\r\n },\r\n {\r\n displayKey: 'notBlank',\r\n displayName: Texts.NotBlank,\r\n numberOfInputs: 0,\r\n predicate: ([filter]: [any], value: any) => value !== null\r\n },\r\n ];\r\n filterParams.suppressAndOrCondition = true;\r\n }\r\n\r\n private setSuppressMovable(column: any, colDef: ColDef) {\r\n if (!(column.move === true)) { \r\n colDef.suppressMovable = true;\r\n }\r\n }\r\n\r\n private setFlex(column: any, colDef: ColDef) {\r\n if (column.flex === true) { \r\n colDef.flex = 1;\r\n }\r\n }\r\n\r\n private setAlign(column: any, colDef: ColDef) {\r\n if (column.align === \"left\") {\r\n colDef.cellStyle = { textAlign: 'left' };\r\n }\r\n else if (column.align === \"center\") {\r\n colDef.cellStyle = { textAlign: 'center' };\r\n }\r\n else if (column.align === \"right\") { \r\n colDef.cellStyle = { textAlign: 'right' };\r\n }\r\n }\r\n\r\n private setPinned(column: any, colDef: ColDef) {\r\n if (typeof column.pinned === \"string\") { \r\n colDef.pinned = column.pinned;\r\n }\r\n }\r\n\r\n private setWidth(column: any, colDef: ColDef) {\r\n if (typeof column.width === \"number\") { \r\n colDef.width = column.width;\r\n }\r\n\r\n if (typeof column.minWidth === \"number\") { \r\n colDef.minWidth = column.minWidth;\r\n }\r\n\r\n if (typeof column.maxWidth === \"number\") { \r\n colDef.maxWidth = column.maxWidth;\r\n }\r\n }\r\n\r\n private setValueFormatter(column: any, colDef: ColDef, map: MapType) {\r\n if (map) {\r\n colDef.valueFormatter = (params) => this.formatMap(params.value, map); \r\n }\r\n }\r\n\r\n getRowSelection(component: any, formGroup: FormGroup): RowSelectionOptions | undefined {\r\n let options: RowSelectionOptions | undefined = undefined;\r\n if (this.selectable(component, formGroup)) {\r\n if (this.multiSelect(component, formGroup)) {\r\n options = {\r\n mode: \"multiRow\",\r\n selectAll: 'filtered',\r\n hideDisabledCheckboxes: true\r\n };\r\n }\r\n else {\r\n options = { mode: \"singleRow\" };\r\n }\r\n\r\n if (component.rowSelectable) {\r\n options = {\r\n ...options,\r\n isRowSelectable: (rowNode) => this.onRowSelectable(component, formGroup, rowNode.data)\r\n }\r\n }\r\n }\r\n\r\n return options;\r\n }\r\n\r\n private hasRowId(component: any) {\r\n return typeof component.rowId === 'string' && component.rowId.trim() !== '';\r\n }\r\n\r\n private getRowId(component: any): GetRowIdFunc<any> | undefined\r\n {\r\n if (this.hasRowId(component)) {\r\n return (params: GetRowIdParams<any>) => params.data[component.rowId]; \r\n }\r\n else {\r\n return undefined;\r\n }\r\n }\r\n\r\n private applyStyle(target: any, formGroup: FormGroup, styleExpression: any, funcName: string, staticName: string)\r\n {\r\n if (styleExpression) {\r\n const value = this.programmability.evaluate(formGroup, styleExpression);\r\n if (typeof value === 'function') {\r\n target[funcName] = value\r\n }\r\n else {\r\n target[staticName] = value;\r\n }\r\n } \r\n }\r\n\r\n private applyExpression(target: any, formGroup: FormGroup, expression: any, propertyName: string) {\r\n if (expression) {\r\n const value = this.programmability.evaluate(formGroup, expression);\r\n if (typeof value === 'function') {\r\n target[propertyName] = (n: any) => value(n.data);\r\n }\r\n else {\r\n target[propertyName] = () => value;\r\n }\r\n }\r\n }\r\n\r\n private onRowSelectable(component: any, formGroup: FormGroup, data: any) : boolean {\r\n if (!data)\r\n return false;\r\n\r\n const event = {\r\n data: data\r\n };\r\n const result = this.programmability.evaluate(formGroup, component.rowSelectable, {\r\n cacheable: false,\r\n extendContext: () => ({\r\n \"event\": event\r\n }),\r\n invokeArgs: [event]\r\n });\r\n\r\n return result === true; \r\n }\r\n\r\n private onRowSelected(component: any, formGroup: FormGroup, data: any): boolean {\r\n if (!data)\r\n return false;\r\n\r\n const event = {\r\n data: data\r\n };\r\n const result = this.programmability.evaluate(formGroup, component.rowSelected, {\r\n cacheable: false,\r\n extendContext: () => ({\r\n \"event\": event\r\n }),\r\n invokeArgs: [event]\r\n });\r\n\r\n return result === true;\r\n }\r\n\r\n private onRowSelecting(component: any, formGroup: FormGroup, params: ModelUpdatedEvent) {\r\n if (params.newData \r\n && component.rowSelected\r\n && this.selectable(component, formGroup))\r\n {\r\n params.api.forEachNode((node) => {\r\n if (this.onRowSelected(component, formGroup, node.data)) {\r\n node.setSelected(true);\r\n }\r\n });\r\n }\r\n }\r\n\r\n private suppressActions(component: any, formGroup: FormGroup): boolean {\r\n return this.programmability.evaluateBoolean(formGroup, component.suppressActions, { cacheable: false })\r\n ?? false;\r\n }\r\n\r\n private selectable(component: any, formGroup: FormGroup): boolean {\r\n return this.programmability.evaluateBoolean(formGroup, component.selectable, { cacheable: false })\r\n ?? false;\r\n }\r\n\r\n private multiSelect(component: any, formGroup: FormGroup): boolean {\r\n return this.programmability.evaluateBoolean(formGroup, component.multiSelect, { cacheable: false })\r\n ?? false;\r\n }\r\n\r\n private getPaginable(component: any): boolean {\r\n return (typeof component.rowCount === 'number' && component.rowCount > 0);\r\n }\r\n\r\n private getPageSize(component: any) {\r\n if (typeof component.rowCount === 'number') {\r\n return component.rowCount;\r\n }\r\n }\r\n\r\n private getTexts(): any {\r\n if (this.language === 'it') {\r\n return AG_GRID_LOCALE_IT;\r\n }\r\n else if (this.language === 'en') {\r\n return AG_GRID_LOCALE_EN;\r\n }\r\n else if (this.language === 'de') {\r\n return AG_GRID_LOCALE_DE;\r\n }\r\n else if (this.language === 'fr') {\r\n return AG_GRID_LOCALE_FR;\r\n }\r\n else if (this.language === 'es') {\r\n return AG_GRID_LOCALE_ES;\r\n }\r\n else if (this.language === 'pt') {\r\n return AG_GRID_LOCALE_PT;\r\n }\r\n else if (this.language === '') {\r\n return AG_GRID_LOCALE_IT; // neutral\r\n }\r\n else {\r\n return AG_GRID_LOCALE_EN; // fallback\r\n }\r\n }\r\n\r\n private getTheme() {\r\n return themeQuartz\r\n .withPart(iconSetAlpine)\r\n .withParams({\r\n backgroundColor: \"#FAFAFA\",\r\n borderColor: \"#D9E4F7\",\r\n browserColorScheme: \"light\",\r\n cellTextColor: \"#00121A\",\r\n columnBorder: true,\r\n fontFamily: \"inherit\",\r\n fontSize: 16,\r\n headerBackgroundColor: \"#002460\",\r\n headerColumnBorder: true,\r\n headerColumnResizeHandleColor: \"#F2F6FC\",\r\n headerColumnResizeHandleWidth: 2,\r\n headerFontSize: 16,\r\n headerFontWeight: 600,\r\n headerRowBorder: true,\r\n headerTextColor: \"#F2F6FC\",\r\n rowBorder: true\r\n });\r\n }\r\n\r\n private getDataTypeDefinitions(): { [cellDataType: string]: DataTypeDefinition<any>; } {\r\n return {\r\n uuid: {\r\n baseDataType: 'text',\r\n extendsDataType: 'text'\r\n },\r\n date: {\r\n baseDataType: 'dateString',\r\n extendsDataType: 'dateString',\r\n dateParser: (value: string | undefined) => {\r\n return value ? new Date(value) : undefined;\r\n },\r\n valueFormatter: params => {\r\n return this.formatter.formatDate(params.value);\r\n }\r\n },\r\n dateTime: {\r\n baseDataType: 'dateString',\r\n extendsDataType: 'dateString',\r\n dateParser: (value: string | undefined) => {\r\n return value ? new Date(value) : undefined;\r\n },\r\n valueFormatter: params => {\r\n return this.formatter.formatDateTime(params.value);\r\n }\r\n },\r\n time: {\r\n baseDataType: 'dateString',\r\n extendsDataType: 'dateString',\r\n dateParser: (value: string | undefined) => {\r\n return value ? new Date(value) : undefined;\r\n },\r\n valueFormatter: params => {\r\n return this.formatter.formatTime(params.value);\r\n }\r\n },\r\n currency: {\r\n extendsDataType: 'number',\r\n baseDataType: 'number',\r\n valueFormatter: params => params.value == null\r\n ? ''\r\n : this.formatter.formatCurrency(params.value)\r\n },\r\n decimal: {\r\n extendsDataType: 'number',\r\n baseDataType: 'number',\r\n valueFormatter: params => params.value == null\r\n ? ''\r\n : this.formatter.formatNumber(params.value)\r\n },\r\n integer: {\r\n extendsDataType: 'number',\r\n baseDataType: 'number',\r\n valueFormatter: params => params.value == null\r\n ? ''\r\n : this.formatter.formatNumber(params.value, 0)\r\n },\r\n percentage: {\r\n extendsDataType: 'number',\r\n baseDataType: 'number',\r\n valueFormatter: params => params.value == null\r\n ? ''\r\n : `${Math.round(params.value * 100)}%`,\r\n },\r\n flags: {\r\n extendsDataType: 'number',\r\n baseDataType: 'number'\r\n } \r\n };\r\n }\r\n\r\n private getMap(column: any, colDef: ColDef, formGroup: FormGroup): MapType {\r\n\r\n const allowed = (colDef.cellDataType === \"boolean\"\r\n || colDef.cellDataType === \"text\"\r\n || colDef.cellDataType === \"number\"\r\n || colDef.cellDataType === \"flags\");\r\n\r\n if (allowed && column.map) {\r\n const map = this.programmability.evaluate(formGroup, column.mapValues);\r\n\r\n const valid = isRecord(\r\n map,\r\n key => typeof key === 'string' || typeof key === 'number',\r\n val => typeof val === 'string'\r\n );\r\n\r\n if (!valid)\r\n return null;\r\n\r\n if (colDef.cellDataType === \"flags\") {\r\n (map as any)[getLabelSymbol] = (key: any) => this.formatFlags(key, map);\r\n }\r\n\r\n return map;\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n\r\n private formatMap(value: any, map: MapType)\r\n {\r\n if (value == null) {\r\n return map?.['null'] ?? \"\";\r\n }\r\n\r\n if (map) {\r\n var result = map[value];\r\n\r\n if (result === undefined) {\r\n const labeled = isLabeledRecord(\r\n map,\r\n key => typeof key === 'string' || typeof key === 'number',\r\n val => typeof val === 'string',\r\n getLabelSymbol\r\n );\r\n\r\n if (labeled) {\r\n result = map[getLabelSymbol](value);\r\n }\r\n }\r\n \r\n return result ?? value.toString();\r\n }\r\n else {\r\n return value.toString();\r\n }\r\n }\r\n\r\n private formatFlags(value: any, map: MapType) {\r\n if (typeof value === 'number' &&\r\n isRecord(map, isNumericKey, val => typeof val === 'string')\r\n ) {\r\n if (value == 0) {\r\n return map[0] ?? \"0\";\r\n }\r\n\r\n const availableFlags = Object.keys(map)\r\n .map(Number)\r\n .filter(flag => flag !== 0);\r\n\r\n const flags = availableFlags.filter(flag => (value & flag) === flag);\r\n\r\n const sumFlags = flags.reduce((sum, f) => sum | f, 0);\r\n\r\n if ((value & sumFlags) !== value) {\r\n return null;\r\n }\r\n\r\n return flags\r\n .map(flag => map[flag])\r\n .filter((label): label is string => !!label)\r\n .join(', ');\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n private navigateInsideCell({ event }: SuppressKeyboardEventParams<any>) {\r\n const GRID_CELL_CLASSNAME = \"ag-cell\";\r\n const { key, shiftKey } = event;\r\n const path = this.getEventPath(event);\r\n const isTabForward = key === \"Tab\" && shiftKey === false;\r\n const isTabBackward = key === \"Tab\" && shiftKey === true;\r\n let suppressEvent = false;\r\n // Handle cell children tabbing\r\n if (isTabForward || isTabBackward) {\r\n const eGridCell = path.find((el) => {\r\n if (el.classList === undefined) return false;\r\n return el.classList.contains(GRID_CELL_CLASSNAME);\r\n });\r\n if (!eGridCell) {\r\n return suppressEvent;\r\n }\r\n const focusableChildrenElements = getFocusables(eGridCell);\r\n const lastCellChildEl =\r\n focusableChildrenElements[focusableChildrenElements.length - 1];\r\n const firstCellChildEl = focusableChildrenElements[0];\r\n // Suppress keyboard event if tabbing forward within the cell and the current focused element is not the last child\r\n if (focusableChildrenElements.length === 0) {\r\n return false;\r\n }\r\n const currentIndex = focusableChildrenElements.indexOf(\r\n document.activeElement as HTMLElement,\r\n );\r\n if (isTabForward) {\r\n const isLastChildFocused =\r\n lastCellChildEl && document.activeElement === lastCellChildEl;\r\n if (!isLastChildFocused) {\r\n suppressEvent = true;\r\n if (currentIndex !== -1 || document.activeElement === eGridCell) {\r\n event.preventDefault();\r\n focusableChildrenElements[currentIndex + 1].focus();\r\n }\r\n }\r\n }\r\n // Suppress keyboard event if tabbing backwards within the cell, and the current focused element is not the first child\r\n else {\r\n const cellHasFocusedChildren =\r\n eGridCell.contains(document.activeElement) &&\r\n eGridCell !== document.activeElement;\r\n // Manually set focus to the last child element if cell doesn't have focused children\r\n if (!cellHasFocusedChildren) {\r\n lastCellChildEl.focus();\r\n // Cancel keyboard press, so that it doesn't focus on the last child and then pass through the keyboard press to\r\n // move to the 2nd last child element\r\n event.preventDefault();\r\n }\r\n const isFirstChildFocused =\r\n firstCellChildEl && document.activeElement === firstCellChildEl;\r\n if (!isFirstChildFocused) {\r\n suppressEvent = true;\r\n if (currentIndex !== -1 || document.activeElement === eGridCell) {\r\n event.preventDefault();\r\n focusableChildrenElements[currentIndex - 1].focus();\r\n }\r\n }\r\n }\r\n }\r\n return suppressEvent;\r\n }\r\n\r\n private getEventPath(event: Event): HTMLElement[] {\r\n const path: HTMLElement[] = [];\r\n let currentTarget: any = event.target;\r\n while (currentTarget) {\r\n path.push(currentTarget);\r\n currentTarget = currentTarget.parentElement;\r\n }\r\n return path;\r\n }\r\n}\r\n","import { isObservable, combineLatest, of, Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\nexport function observableAll<T extends object>(obj: T): Observable<T> {\r\n function collect(value: any): Observable<any> {\r\n if (isObservable(value)) {\r\n return value;\r\n }\r\n if (Array.isArray(value)) {\r\n return combineLatest(value.map(collect));\r\n }\r\n if (typeof value === 'object' && value !== null) {\r\n const keys = Object.keys(value);\r\n const observables = keys.map(k => collect(value[k]));\r\n return combineLatest(observables).pipe(\r\n map(resolvedValues => {\r\n const resolvedObject: any = {};\r\n resolvedValues.forEach((v, i) => {\r\n resolvedObject[keys[i]] = v;\r\n });\r\n return resolvedObject;\r\n })\r\n );\r\n }\r\n return of(value);\r\n }\r\n\r\n return collect(obj);\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { ProgrammabilityService } from '../services/programmability.service';\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { observableAll } from '../utils/observableAll';\r\nimport {\r\n AgChartOptions, AgChartTheme, AgBaseSeriesOptions,\r\n AgBarSeriesOptions, AgBarSeriesOptionsNames, \r\n AgLineSeriesOptions, AgLineSeriesOptionsNames,\r\n AgAreaSeriesOptions, AgAreaSeriesOptionsNames,\r\n AgScatterSeriesOptions, AgScatterSeriesOptionsNames,\r\n AgBubbleSeriesOptions, AgBubbleSeriesOptionsNames,\r\n AgPieSeriesOptions, AgPieSeriesOptionsNames,\r\n AgDonutSeriesOptions, AgDonutSeriesOptionsNames\r\n} from 'ag-charts-community';\r\n\r\nimport { LanguageService } from '@wemake4u/interact';\r\nimport { localize } from '../locale/localize';\r\n\r\n@Injectable()\r\nexport class ChartService {\r\n\r\n constructor(\r\n private programmability: ProgrammabilityService\r\n , private languageService: LanguageService) {\r\n }\r\n\r\n getOptions(component: any, formGroup: FormGroup): Observable<AgChartOptions> {\r\n const expression = this.getDataExpression(component);\r\n const data = this.programmability.evaluate(formGroup, expression);\r\n return observableAll(data).pipe(\r\n map((chartData: any) => {\r\n const series = this.getSeries(component, formGroup);\r\n const options: AgChartOptions = {\r\n theme: this.getTheme(),\r\n series: series,\r\n ...this.getProps(component)\r\n };\r\n this.bindData(options, chartData);\r\n return options;\r\n })\r\n ); \r\n }\r\n\r\n getDataExpression(component: any) {\r\n const getExpression = (expression: any) => {\r\n return this.programmability.isExpression(expression)\r\n ? this.programmability.getExpression(expression)\r\n : \"null\"\r\n }\r\n const dataExpr = getExpression(component.data);\r\n const seriesExprs = (component.series ?? [])\r\n .map((serie: any) => getExpression(serie.data))\r\n .map((expr: string) => `(${expr})`)\r\n .join(\", \");\r\n\r\n return `={ data: (${dataExpr}), series: [${seriesExprs}] }`;\r\n }\r\n\r\n private bindData(options: AgChartOptions, chartData: any) {\r\n if (chartData.data) {\r\n options.data = chartData.data;\r\n }\r\n if (Array.isArray(options.series)) {\r\n options.series.forEach((serie: any, index: number) => {\r\n if (chartData.series[index]) {\r\n serie.data = chartData.series[index];\r\n }\r\n });\r\n }\r\n }\r\n\r\n private get language(): string {\r\n return this.languageService.getLanguage();\r\n }\r\n\r\n private locale(component: any, key: string): string {\r\n return localize(this.language, component, key);\r\n }\r\n\r\n private getTheme(): AgChartTheme {\r\n return {\r\n baseTheme: \"ag-default\",\r\n params: {\r\n fontFamily: \"inherit\",\r\n textColor: \"#00121A\",\r\n chromeFontFamily: \"inherit\",\r\n chromeTextColor: \"#00121A\"\r\n },\r\n overrides: {\r\n common: {\r\n background: {\r\n visible: true,\r\n fill: \"transparent\",\r\n }\r\n }\r\n }\r\n };\r\n }\r\n\r\n private getSeries(component: any, formGroup: FormGroup): any[] {\r\n if (Array.isArray(component.series)) {\r\n const series = component.series.map((serie: any) => {\r\n switch (serie.type) {\r\n case \"bar\":\r\n return this.getBarSeriesOptions(serie, formGroup);\r\n case \"line\":\r\n return this.getLineSeriesOptions(serie, formGroup);\r\n case \"area\":\r\n return this.getAreaSeriesOptions(serie, formGroup);\r\n case \"scatter\":\r\n return this.getScatterSeriesOptions(serie, formGroup);\r\n case \"bubble\":\r\n return this.getBubbleSeriesOptions(serie, formGroup);\r\n case \"pie\":\r\n return this.getPieSeriesOptions(serie, formGroup);\r\n case \"donut\":\r\n return this.getDonutSeriesOptions(serie, formGroup);\r\n default:\r\n return {};\r\n }\r\n });\r\n return series;\r\n }\r\n else {\r\n return [];\r\n }\r\n }\r\n\r\n private getSeriesOptionsNames(serie: any)\r\n : AgBarSeriesOptionsNames | AgLineSeriesOptionsNames {\r\n const options: AgBarSeriesOptionsNames | AgLineSeriesOptionsNames = {};\r\n\r\n if (this.isString(serie.xName))\r\n options.xName = this.locale(serie, \"xName\");\r\n\r\n if (this.isString(serie.yName))\r\n options.yName = this.locale(serie, \"yName\");\r\n\r\n if (this.isString(serie.legendItemName))\r\n options.legendItemName = this.locale(serie, \"legendItemName\");\r\n\r\n return options;\r\n }\r\n \r\n private getBaseSeriesOptions(serie: any, formGroup: FormGroup): AgBaseSeriesOptions<any>\r\n {\r\n const options: AgBaseSeriesOptions<any> = { };\r\n\r\n if (this.isBoolean(serie.visible))\r\n options.visible = serie.visible;\r\n\r\n return options;\r\n }\r\n\r\n private getBarSeriesOptions(serie: any, formGroup: FormGroup): AgBarSeriesOptions {\r\n const options: AgBarSeriesOptions = {\r\n type: \"bar\",\r\n xKey: serie.xKey,\r\n yKey: serie.yKey,\r\n ...this.getBaseSeriesOptions(serie, formGroup),\r\n ...this.getSeriesOptionsNames(serie)\r\n };\r\n\r\n if (this.isDirection(serie.direction))\r\n options.direction = serie.direction;\r\n\r\n if (this.isBoolean(serie.stacked))\r\n options.stacked = serie.stacked;\r\n\r\n if (this.isNumber(serie.normalizedTo))\r\n options.normalizedTo = serie.normalizedTo;\r\n\r\n if (this.isString(serie.stackGroup))\r\n options.stackGroup = serie.stackGroup;\r\n\r\n return options;\r\n }\r\n\r\n private getLineSeriesOptions(serie: any, formGroup: FormGroup): AgLineSeriesOptions {\r\n const options: AgLineSeriesOptions = {\r\n type: \"line\",\r\n xKey: serie.xKey,\r\n yKey: serie.yKey,\r\n ...this.getBaseSeriesOptions(serie, formGroup),\r\n ...this.getSeriesOptionsNames(serie)\r\n };\r\n\r\n if (this.isInterpolation(serie.interpolation)) { \r\n options.interpolation = {\r\n type: serie.interpolation\r\n };\r\n }\r\n\r\n return options;\r\n }\r\n\r\n private getAreaSeriesOptions(serie: any, formGroup: FormGroup): AgAreaSeriesOptions {\r\n const options: AgAreaSeriesOptions = {\r\n type: \"area\",\r\n xKey: serie.xKey,\r\n yKey: serie.yKey,\r\n ...this.getBaseSeriesOptions(serie, formGroup),\r\n ...this.getAreaSeriesOptionsNames(serie)\r\n };\r\n\r\n if (this.isBoolean(serie.stacked))\r\n options.stacked = serie.stacked;\r\n\r\n if (this.isNumber(serie.normalizedTo))\r\n options.normalizedTo = serie.normalizedTo;\r\n\r\n return options;\r\n }\r\n\r\n private getAreaSeriesOptionsNames(serie: any)\r\n : AgAreaSeriesOptionsNames {\r\n const options: AgAreaSeriesOptionsNames = {};\r\n\r\n if (serie.xName)\r\n options.xName = this.locale(serie, \"xName\");\r\n\r\n if (serie.yName)\r\n options.yName = this.locale(serie, \"yName\");\r\n\r\n return options;\r\n }\r\n\r\n private getScatterSeriesOptions(serie: any, formGroup: FormGroup): AgScatterSeriesOptions {\r\n return {\r\n type: \"scatter\",\r\n xKey: serie.xKey,\r\n yKey: serie.yKey,\r\n labelKey: serie.labelKey,\r\n ...this.getBaseSeriesOptions(serie, formGroup),\r\n ...this.getScatterSeriesOptionsNames(serie)\r\n };\r\n }\r\n\r\n private getScatterSeriesOptionsNames(serie: any)\r\n : AgScatterSeriesOptionsNames {\r\n const options: AgScatterSeriesOptionsNames = {};\r\n\r\n if (serie.xName)\r\n options.xName = this.locale(serie, \"xName\");\r\n\r\n if (serie.yName)\r\n options.yName = this.locale(serie, \"yName\");\r\n\r\n if (serie.labelName)\r\n options.labelName = this.locale(serie, \"labelName\");\r\n\r\n return options;\r\n }\r\n\r\n private getBubbleSeriesOptions(serie: any, formGroup: FormGroup): AgBubbleSeriesOptions {\r\n return {\r\n type: \"bubble\",\r\n xKey: serie.xKey,\r\n yKey: serie.yKey,\r\n sizeKey: serie.sizeKey,\r\n labelKey: serie.labelKey,\r\n ...this.getBaseSeriesOptions(serie, formGroup),\r\n ...this.getBubbleSeriesOptionsNames(serie)\r\n };\r\n }\r\n\r\n private getBubbleSeriesOptionsNames(serie: any)\r\n : AgBubbleSeriesOptionsNames {\r\n const options: AgBubbleSeriesOptionsNames = {};\r\n\r\n if (serie.xName)\r\n options.xName = this.locale(serie, \"xName\");\r\n\r\n if (serie.yName)\r\n options.yName = this.locale(serie, \"yName\");\r\n\r\n if (serie.sizeName)\r\n options.sizeName = this.locale(serie, \"sizeName\");\r\n\r\n if (serie.labelName)\r\n options.labelName = this.locale(serie, \"labelName\");\r\n\r\n return options;\r\n }\r\n\r\n private getPieSeriesOptions(serie: any, formGroup: FormGroup): AgPieSeriesOptions {\r\n const options: AgPieSeriesOptions = {\r\n type: \"pie\",\r\n angleKey: serie.angleKey,\r\n ...this.getBaseSeriesOptions(serie, formGroup),\r\n ...this.getPieSeriesOptionsNames(serie)\r\n };\r\n\r\n if (this.isString(serie.radiusKey))\r\n options.radiusKey = serie.radiusKey;\r\n\r\n if (this.isString(serie.calloutLabelKey))\r\n options.calloutLabelKey = serie.calloutLabelKey;\r\n\r\n if (this.isString(serie.sectorLabelKey))\r\n options.sectorLabelKey = serie.sectorLabelKey;\r\n\r\n if (this.isString(serie.legendItemKey))\r\n options.legendItemKey = serie.legendItemKey;\r\n\r\n return options;\r\n }\r\n\r\n private getPieSeriesOptionsNames(serie: any)\r\n : AgPieSeriesOptionsNames {\r\n const options: AgPieSeriesOptionsNames = {};\r\n\r\n if (serie.angleName)\r\n options.angleName = this.locale(serie, \"angleName\");\r\n\r\n if (serie.radiusName)\r\n options.radiusName = this.locale(serie, \"radiusName\");\r\n\r\n if (serie.calloutLabelName)\r\n options.calloutLabelName = this.locale(serie, \"calloutLabelName\");\r\n\r\n if (serie.sectorLabelName)\r\n options.sectorLabelName = this.locale(serie, \"sectorLabelName\");\r\n\r\n return options;\r\n }\r\n\r\n private getDonutSeriesOptions(serie: any, formGroup: FormGroup): AgDonutSeriesOptions {\r\n const options: AgDonutSeriesOptions = {\r\n type: \"donut\",\r\n angleKey: serie.angleKey,\r\n ...this.getBaseSeriesOptions(serie, formGroup),\r\n ...this.getDonutSeriesOptionsNames(serie)\r\n };\r\n\r\n if (this.isString(serie.radiusKey))\r\n options.radiusKey = serie.radiusKey;\r\n\r\n if (this.isString(serie.calloutLabelKey))\r\n options.calloutLabelKey = serie.calloutLabelKey;\r\n\r\n if (this.isString(serie.sectorLabelKey))\r\n options.sectorLabelKey = serie.sectorLabelKey;\r\n\r\n if (this.isString(serie.legendItemKey))\r\n options.legendItemKey = serie.legendItemKey;\r\n\r\n return options;\r\n }\r\n\r\n private getDonutSeriesOptionsNames(serie: any)\r\n : AgDonutSeriesOptionsNames {\r\n const options: AgDonutSeriesOptionsNames = {};\r\n\r\n if (serie.angleName)\r\n options.angleName = this.locale(serie, \"angleName\");\r\n\r\n if (serie.radiusName)\r\n options.radiusName = this.locale(serie, \"radiusName\");\r\n\r\n if (serie.calloutLabelName)\r\n options.calloutLabelName = this.locale(serie, \"calloutLabelName\");\r\n\r\n if (serie.sectorLabelName)\r\n options.sectorLabelName = this.locale(serie, \"sectorLabelName\");\r\n\r\n return options;\r\n }\r\n\r\n private getProps(component: any): any {\r\n const props: any = {};\r\n\r\n if (component && component.title) {\r\n props.title = { text: component.title };\r\n }\r\n\r\n if (component && component.subtitle) {\r\n props.subtitle = { text: component.subtitle };\r\n }\r\n\r\n return props;\r\n }\r\n\r\n private isBoolean(value: any): boolean {\r\n return typeof value === 'boolean' || value instanceof Boolean;\r\n }\r\n\r\n private isString(value: any): boolean {\r\n return typeof value === 'string' || value instanceof String;\r\n }\r\n\r\n private isNumber(value: any): boolean {\r\n return typeof value === 'number' && isFinite(value);\r\n }\r\n\r\n private isDirection(value: any): boolean {\r\n return value === 'horizontal' || value === 'vertical';\r\n }\r\n\r\n private isInterpolation(value: any): boolean {\r\n return value === 'linear' || value === 'smooth' || value === 'step';\r\n }\r\n}\r\n","import { Directive, Input, OnChanges, SimpleChanges, ElementRef, Renderer2, DestroyRef } from '@angular/core';\r\nimport { NgControl } from '@angular/forms';\r\nimport { SirioControlBase } from '@wemake4u/form-controls';\r\nimport { GlobalService } from '../services/global.service';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\n@Directive({\r\n selector: '[readonly]',\r\n standalone: true\r\n})\r\nexport class ReadOnlyDirective implements OnChanges {\r\n @Input() readonly: boolean | null = null;\r\n @Input() placeholder: string | null = null;\r\n @Input() componentRef: any;\r\n @Input() properties: any;\r\n\r\n constructor(private ngControl: NgControl\r\n , private global: GlobalService\r\n , private destroyRef: DestroyRef\r\n , private el: ElementRef\r\n , private renderer: Renderer2) {\r\n }\r\n\r\n private disableClass: string = \"is-disabled\";\r\n private readonlyClass: string = \"is-readonly\";\r\n private lightReadonlyClass: string = \"light-readonly\";\r\n\r\n ngOnInit() {\r\n const control = this.ngControl.control;\r\n if (control) {\r\n control.statusChanges\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(_ => {\r\n this.apply(); \r\n });\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[\"readonly\"]) {\r\n this.apply();\r\n }\r\n }\r\n\r\n private apply() {\r\n const control = this.ngControl.control;\r\n if (!control) return;\r\n if (control.disabled) {\r\n this.toggleClass(true, this.disableClass);\r\n this.overridePlaceholder(false);\r\n } else {\r\n this.toggleClass(false, this.disableClass);\r\n const readonly = this.readonly === true;\r\n // @wemake4u/form-controls controls render the `readonly` input themselves: no disabled state.\r\n if (!this.isSirioControl()) {\r\n (this.ngControl.valueAccessor as any)?.setDisabledState(readonly);\r\n }\r\n if (this.useLightReadonly()) {\r\n this.toggleClass(readonly, this.lightReadonlyClass);\r\n this.overridePlaceholder(readonly);\r\n }\r\n else {\r\n this.toggleClass(readonly, this.readonlyClass);\r\n }\r\n }\r\n }\r\n\r\n private toggleClass(value: boolean, className: string) {\r\n if (value) {\r\n this.renderer.addClass(this.el.nativeElement, className);\r\n } else {\r\n this.renderer.removeClass(this.el.nativeElement, className);\r\n }\r\n }\r\n\r\n private isSirioControl(): boolean {\r\n return this.ngControl.valueAccessor instanceof SirioControlBase;\r\n }\r\n\r\n private overridePlaceholder(value: boolean) {\r\n // The placeholder of a @wemake4u/form-controls control is a signal input: not overridable here.\r\n if (this.componentRef && !this.isSirioControl() && 'placeholder' in this.componentRef) {\r\n this.componentRef.placeholder = value\r\n ? \"-\"\r\n : this.placeholder;\r\n }\r\n }\r\n\r\n private useLightReadonly() {\r\n const value = this.properties?.useLightReadonly\r\n || this.global.getProperty(\"useLightReadonly\", \"yes\");\r\n if (value !== \"yes\" && value !== \"no\")\r\n return true;\r\n return (value === \"yes\");\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { EvaluateOptions, ProgrammabilityService } from '../services/programmability.service';\r\nimport { FormGroup } from '@angular/forms';\r\n\r\n@Injectable()\r\nexport class CacheContextService {\r\n\r\n constructor(\r\n private programmability: ProgrammabilityService) {\r\n }\r\n\r\n isExpression(text: string | null): boolean {\r\n return this.programmability.isExpression(text);\r\n }\r\n\r\n getExpression(text: string | null): string {\r\n return this.programmability.getExpression(text);\r\n }\r\n\r\n evaluateString(cacheControl: any, formGroup: FormGroup, value: string | null, options: EvaluateOptions = {}): string {\r\n if (this.isExpression(value)) {\r\n return this.call(cacheControl, value, () =>\r\n this.programmability.evaluateString(formGroup, value, this.getOptions(options))\r\n );\r\n }\r\n return value ?? \"\"; \r\n }\r\n\r\n evaluateBoolean(cacheControl: any, formGroup: FormGroup, value: boolean | string | null, options: EvaluateOptions = {}): boolean | null {\r\n if (typeof value === 'boolean') {\r\n return value;\r\n }\r\n else if (this.isExpression(value)) {\r\n return this.call(cacheControl, value, () => \r\n this.programmability.evaluateBoolean(formGroup, value, this.getOptions(options))\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n evaluateNumber(cacheControl: any, formGroup: FormGroup, value: number | string | null, options: EvaluateOptions = {}): number | null {\r\n if (typeof value === 'number') {\r\n return value;\r\n }\r\n else if (this.isExpression(value)) {\r\n return this.call(cacheControl, value, () =>\r\n this.programmability.evaluateNumber(formGroup, value, this.getOptions(options))\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n evaluate(cacheControl: any, formGroup: FormGroup, value: string | null, options: EvaluateOptions = {}): any {\r\n if (this.isExpression(value)) {\r\n return this.call(cacheControl, value, () =>\r\n this.programmability.evaluate(formGroup, value, this.getOptions(options))\r\n );\r\n }\r\n return value;\r\n }\r\n\r\n evaluateTemplate(cacheControl: any, formGroup: FormGroup, value: string | null, options: EvaluateOptions = {}): any {\r\n return this.call(cacheControl, value, () =>\r\n this.programmability.evaluateTemplate(formGroup, value, this.getOptions(options))\r\n );\r\n }\r\n\r\n evaluateUnary(cacheControl: any, formGroup: FormGroup, value: string | null, input: any, options: EvaluateOptions = {}): any {\r\n if (this.isExpression(value)) {\r\n return this.call(cacheControl, value, () =>\r\n this.programmability.evaluateUnary(formGroup, value, input, this.getOptions(options))\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n invalidate(cacheControl: any) {\r\n if (this.cache.has(cacheControl)) {\r\n this.cache.delete(cacheControl);\r\n }\r\n }\r\n\r\n invalidateAll() {\r\n this.cache = new WeakMap<object, Record<string, any>>();\r\n }\r\n\r\n private getOptions(options: EvaluateOptions): EvaluateOptions {\r\n return {\r\n ...options,\r\n cacheable: false\r\n };\r\n }\r\n\r\n private call(cacheControl: any, value: string | null, evaluate: () => any): any {\r\n\r\n if (value === null)\r\n return null;\r\n\r\n if (!this.cache.has(cacheControl)) {\r\n this.cache.set(cacheControl, {});\r\n }\r\n\r\n const cachedObject = this.cache.get(cacheControl)!;\r\n\r\n if (value in cachedObject) {\r\n return cachedObject[value];\r\n }\r\n\r\n const result: any = evaluate();\r\n\r\n cachedObject[value] = result;\r\n\r\n return result;\r\n }\r\n\r\n private cache = new WeakMap<object, Record<string, any>>();\r\n}\r\n","import { Directive, Input, OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core';\r\nimport { ControlContainer, FormArray, FormGroup } from '@angular/forms';\r\nimport { CacheContextService } from '../services/cache.service';\r\nimport { FormService } from '../services/form.service';\r\nimport { EvaluateOptions } from '../services/programmability.service';\r\nimport { debounceTime, Subscription } from 'rxjs';\r\n\r\n@Directive({\r\n selector: '[recursion]',\r\n exportAs: 'recursion',\r\n standalone: true,\r\n providers: [\r\n CacheContextService\r\n ],\r\n})\r\nexport class RecursionDirective implements OnInit, OnChanges, OnDestroy {\r\n @Input() formGroup!: FormGroup;\r\n @Input(\"recursion\") component: any;\r\n\r\n private subscription: Subscription | null = null;\r\n private componentRows: any = null;\r\n private nestedFormGroup: FormGroup | null = null;\r\n\r\n constructor(private controlContainer: ControlContainer\r\n , private formService: FormService\r\n , private cacheContext: CacheContextService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.componentRows = this.createComponentRows();\r\n this.nestedFormGroup = this.createNestedFormGroup();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (this.isSubscribeRequired()) {\r\n this.subscribeToChanges();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.unsubscribeToChanges();\r\n }\r\n\r\n getItemsArray(formItem: FormGroup): FormArray | null {\r\n if (this.isRecursionByKey()) {\r\n return this.getArrayFromKey(formItem);\r\n }\r\n\r\n if (this.isRecursionByExpression()) {\r\n return this.getArrayFromExpression(formItem);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n getComponentRows(): any {\r\n return this.componentRows;\r\n }\r\n\r\n getFormGroup(formItem: FormGroup): FormGroup {\r\n if (this.isRecursionByExpression()) {\r\n const nestedGroup = this.nestedFormGroup!;\r\n nestedGroup.setControl(this.component.key, this.getArrayFromExpression(formItem));\r\n return nestedGroup\r\n }\r\n else { \r\n return formItem;\r\n }\r\n }\r\n\r\n private isSubscribeRequired(): boolean {\r\n return this.shouldCreateItems()\r\n || this.isRecursionByExpression();\r\n }\r\n\r\n private isRecursionAllowed(): boolean {\r\n return this.component?.subtype === \"table\"\r\n && this.component?.recursion?.allowed === true\r\n }\r\n\r\n private isRecursionByKey(): boolean { \r\n return this.isRecursionAllowed()\r\n && this.component?.recursion?.source === \"key\"\r\n && this.component?.recursion?.key;\r\n }\r\n\r\n private isRecursionByExpression(): boolean {\r\n return this.isRecursionAllowed()\r\n && this.component?.recursion?.source === \"expression\"\r\n && this.cacheContext.isExpression(this.component.recursion.expression ?? \"\");\r\n }\r\n\r\n private shouldCreateItems(): boolean {\r\n return this.isRecursionByKey()\r\n && this.component.allowAddRemove === true\r\n && this.cacheContext.isExpression(this.component.recursion.shouldCreate ?? \"\");\r\n }\r\n\r\n private subscribeToChanges() {\r\n this.unsubscribeToChanges();\r\n const formArray = this.getFormArray();\r\n if (formArray) {\r\n this.subscription = formArray.valueChanges\r\n .pipe(debounceTime(200))\r\n .subscribe(() => this.onChangeArray(formArray));\r\n }\r\n }\r\n\r\n private unsubscribeToChanges() {\r\n if (this.subscription) {\r\n this.subscription.unsubscribe();\r\n this.subscription = null;\r\n }\r\n }\r\n\r\n private onChangeArray(formArray: FormArray) {\r\n this.cacheContext.invalidateAll();\r\n if (this.shouldCreateItems()) {\r\n this.creatingItems(formArray);\r\n } \r\n }\r\n\r\n private getFormArray(): FormArray {\r\n return this.controlContainer.control as FormArray;\r\n }\r\n\r\n private creatingItems(formArray: FormArray) {\r\n const key = this.component.recursion.key ?? \"\";\r\n const shouldCreate = this.component.recursion.shouldCreate ?? \"\";\r\n\r\n for (let i = 0; i < formArray.length; i++) {\r\n\r\n const formItem = formArray.at(i) as FormGroup;\r\n\r\n const options: EvaluateOptions = {\r\n extendContext: () => ({\r\n \"item\": formItem.value\r\n })\r\n }\r\n const recursive = this.cacheContext.evaluateBoolean(formItem, this.formGroup, shouldCreate, options);\r\n\r\n if (recursive && !formItem.get(key)) {\r\n const newArray = (formArray as any).createNewArray();\r\n formItem.addControl(key, newArray); \r\n }\r\n else if (!recursive && formItem.get(key)) {\r\n formItem.removeControl(key);\r\n }\r\n }\r\n }\r\n\r\n private getArrayFromKey(formItem: FormGroup): FormArray | null {\r\n const control = formItem.get(this.component.recursion.key);\r\n if ((control instanceof FormArray)) {\r\n const childArray = this.prepareChildArray(formItem, control);\r\n if (childArray != control) {\r\n formItem.setControl(this.component.recursion.key, childArray);\r\n }\r\n return childArray;\r\n }\r\n return null;\r\n }\r\n\r\n private getArrayFromExpression(formItem: FormGroup): FormArray | null {\r\n const expression = this.cacheContext.getExpression(this.component.recursion.expression);\r\n const wrapExpression = `=__asFormArray(${expression})`;\r\n const result = this.cacheContext.evaluate(formItem, this.formGroup, wrapExpression, {\r\n extendContext: () => ({\r\n item: formItem.value,\r\n __asFormArray: (value: any) => {\r\n if (Array.isArray(value)) { \r\n const newArray = new FormArray<any>([]);\r\n this.formService.patch(newArray, value, { strict: false });\r\n return newArray;\r\n }\r\n return null;\r\n }\r\n })\r\n });\r\n if ((result instanceof FormArray)) {\r\n return result;\r\n }\r\n return null;\r\n }\r\n\r\n private createComponentRows(): any {\r\n let component = this.component;\r\n\r\n if (this.isRecursionByKey()\r\n && component.key !== this.component.recursion.key) {\r\n component = { ...this.component, key: this.component.recursion.key };\r\n }\r\n\r\n return [{ components: [component] }]\r\n }\r\n\r\n private createNestedFormGroup(): FormGroup | null {\r\n if (this.isRecursionByExpression()) {\r\n return new FormGroup({\r\n [this.component.key]: new FormArray([])\r\n });\r\n }\r\n return null;\r\n }\r\n\r\n private prepareChildArray(formItem: FormGroup, childArray: FormArray) {\r\n if ((childArray as any).createNewArray)\r\n return childArray;\r\n\r\n const parentArray = formItem.parent;\r\n if ((parentArray instanceof FormArray)\r\n && (parentArray as any).createNewArray)\r\n {\r\n var newArray = (parentArray as any).createNewArray();\r\n this.formService.patch(newArray, childArray.value, { strict: false });\r\n return newArray;\r\n }\r\n\r\n return childArray;\r\n }\r\n}\r\n\r\n","import { Directive, Input, AfterViewInit, ElementRef, Renderer2 } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[frameSecurity]',\r\n standalone: true\r\n})\r\nexport class FrameSecurityDirective implements AfterViewInit {\r\n @Input() frameSecurity: any = null;\r\n\r\n constructor(private el: ElementRef, private renderer: Renderer2) { }\r\n\r\n ngAfterViewInit(): void {\r\n const frame = this.el.nativeElement;\r\n\r\n const sandbox = this.getSandBox(this.frameSecurity);\r\n\r\n if (sandbox)\r\n this.renderer.setAttribute(frame, 'sandbox', sandbox);\r\n\r\n const allow = this.getAllow(this.frameSecurity);\r\n\r\n if (allow)\r\n this.renderer.setAttribute(frame, 'allow', allow);\r\n }\r\n\r\n private getSandBox(security: any): string {\r\n let allowedProperties: string[] = [\r\n \"allowScripts\",\r\n \"allowSameOrigin\",\r\n \"allowForms\",\r\n \"allowModals\",\r\n \"allowPopups\",\r\n \"allowTopNavigation\",\r\n \"allowStorageAccessByUserActivation\"\r\n ];\r\n let sandBox = Object.entries(security)\r\n .filter(([key, value]) => value === true && allowedProperties.includes(key))\r\n .map(([key]) => this.camelToKebabCase(key))\r\n .join(' ');\r\n\r\n return sandBox;\r\n };\r\n\r\n private getAllow(security: any): string {\r\n let allowedProperties: string[] = [\r\n \"fullscreen\",\r\n \"geolocation\",\r\n \"camera\",\r\n \"microphone\"\r\n ];\r\n let allow = Object.entries(security)\r\n .filter(([key, value]) => value === true && allowedProperties.includes(key))\r\n .map(([key]) => key)\r\n .join(' ');\r\n\r\n return allow;\r\n };\r\n\r\n private camelToKebabCase(str: string): string {\r\n return str.replace(/[A-Z]/g, (match) => '-' + match.toLowerCase());\r\n }\r\n}\r\n","import { Directive, Input, OnChanges, SimpleChanges, Host, inject } from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { Observable, of, isObservable } from 'rxjs';\r\nimport { catchError, take, tap, finalize } from 'rxjs/operators';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { DestroyRef } from '@angular/core';\r\nimport { AgGridAngular } from 'ag-grid-angular';\r\nimport { IGetRowsParams, GridApi } from \"ag-grid-community\";\r\nimport { IRowsSource } from '../dataSources/interfaces';\r\nimport { GridService } from '../services/grid.service';\r\nimport { CacheContextService } from '../services/cache.service';\r\n\r\nimport { LanguageService } from '@wemake4u/interact';\r\nimport { Texts } from '../locale/locale';\r\nimport { localize } from '../locale/localize';\r\n\r\n@Directive({\r\n selector: '[rowSource], [columns], [selectable], [multiSelect], [suppressActions]',\r\n standalone: true,\r\n providers: [\r\n CacheContextService\r\n ],\r\n})\r\n\r\nexport class GridDirective implements OnChanges {\r\n @Input() rowSource!: any;\r\n @Input(\"columns\") columns: any = null;\r\n @Input() selectable: boolean | null = null;\r\n @Input() multiSelect: boolean | null = null;\r\n @Input() suppressActions: boolean | null = null;\r\n @Input() formGroup!: FormGroup; \r\n @Input(\"register\") component: any = null;\r\n\r\n constructor(\r\n @Host() private grid: AgGridAngular,\r\n private gridService: GridService,\r\n private cacheContext: CacheContextService,\r\n private languageService: LanguageService,\r\n private destroyRef: DestroyRef\r\n ) {\r\n\r\n grid.gridReady\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((params) => {\r\n this.gridApi = params.api;\r\n this.prepareContext();\r\n this.isGridReady = true;\r\n this.onGridReady(); \r\n });\r\n }\r\n\r\n //https://www.ag-grid.com/angular-data-grid/column-updating-definitions/\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n\r\n if (this.isRowSourceChanged(changes)) {\r\n this.onRowSourceChanged();\r\n }\r\n\r\n if (this.isColumnDefsChanged(changes)) {\r\n this.onColumnDefsChanged();\r\n }\r\n\r\n if (this.isSelectionChanged(changes)) {\r\n this.onSelectionChanged();\r\n }\r\n\r\n if (this.isSuppressActionChanged(changes)) {\r\n this.onSuppressAction();\r\n }\r\n }\r\n\r\n private gridApi!: GridApi<any>;\r\n\r\n private isGridReady: boolean = false;\r\n\r\n private noData: Observable<any> = of([]);\r\n\r\n private prepareContext() {\r\n const context = this.gridApi.getGridOption(\"context\") ?? {};\r\n context[\"cacheContext\"] = this.cacheContext;\r\n this.gridApi.setGridOption(\"context\", context);\r\n }\r\n\r\n private applyResult(data: any) {\r\n\r\n if (this.isArray(data)) {\r\n this.setRowData(data);\r\n }\r\n else if (this.isDataSource(data)) {\r\n this.setDataSource(data);\r\n }\r\n else {\r\n this.setRowData([]);\r\n }\r\n }\r\n\r\n private setRowData(rowSource: any) {\r\n this.grid.rowModelType = 'clientSide';\r\n if (this.isGridReady) {\r\n this.grid.api.setGridOption('rowData', rowSource);\r\n }\r\n else {\r\n this.grid.rowData = rowSource;\r\n }\r\n\r\n this.gridService.onRowDataChanged(this.component, this.gridApi, rowSource);\r\n }\r\n\r\n private setDataSource(rowSource: any) {\r\n this.grid.rowModelType = 'infinite';\r\n if (this.isGridReady) {\r\n this.grid.api.setGridOption('datasource', rowSource);\r\n }\r\n else {\r\n this.grid.datasource = rowSource;\r\n }\r\n\r\n this.gridService.onDataSourceChanged(this.component, this.gridApi, rowSource);\r\n }\r\n\r\n private isArray(rowSource: any): boolean {\r\n return Array.isArray(rowSource);\r\n }\r\n\r\n private isDataSource(obj: any): obj is IRowsSource {\r\n return obj && typeof obj.getRows === \"function\";\r\n }\r\n\r\n private onGridReady() { \r\n this.onColumnDefsChanged();\r\n }\r\n\r\n private isRowSourceChanged(changes: SimpleChanges): boolean {\r\n return ['rowSource'].some(\r\n key => !!changes[key]\r\n );\r\n }\r\n\r\n private onRowSourceChanged() {\r\n this.cacheContext.invalidateAll();\r\n if (isObservable(this.rowSource)) {\r\n this.wrapObservable(this.rowSource).pipe(\r\n take(1),\r\n takeUntilDestroyed(this.destroyRef)\r\n ).subscribe(value => {\r\n this.applyResult(value ?? []);\r\n });\r\n }\r\n else if (this.isDataSource(this.rowSource)) {\r\n this.applyResult(this.wrapRowsSource(this.rowSource));\r\n }\r\n else {\r\n this.applyResult(this.rowSource);\r\n }\r\n }\r\n\r\n private isColumnDefsChanged(changes: SimpleChanges): boolean {\r\n return ['columnDefs'].some(\r\n key => !!changes[key]\r\n );\r\n }\r\n\r\n private onColumnDefsChanged() {\r\n if (this.gridApi) {\r\n const columnDef = this.gridService.getColumnDefs(this.component, this.columns, this.formGroup);\r\n this.gridApi.setGridOption(\"columnDefs\", columnDef);\r\n }\r\n }\r\n\r\n private isSelectionChanged(changes: SimpleChanges): boolean {\r\n return ['selectable', 'multiSelect'].some(\r\n key => !!changes[key] && !changes[key].isFirstChange()\r\n );\r\n }\r\n\r\n private onSelectionChanged() {\r\n if (this.gridApi) {\r\n const rowSelection = this.gridService.getRowSelection(this.component, this.formGroup);\r\n this.gridApi.setGridOption(\"rowSelection\", rowSelection);\r\n }\r\n }\r\n\r\n private isSuppressActionChanged(changes: SimpleChanges): boolean {\r\n return ['suppressActions'].some(\r\n key => !!changes[key] && !changes[key].isFirstChange()\r\n );\r\n }\r\n\r\n private onSuppressAction() {\r\n if (this.gridApi) {\r\n this.gridApi.setColumnsVisible([\"actions\"], !(this.suppressActions ?? false));\r\n this.gridService.resizeGrid(this.component, this.gridApi);\r\n }\r\n }\r\n\r\n private showLoading(value: boolean) {\r\n if (this.gridApi) {\r\n this.gridApi.setGridOption('loading', value);\r\n } \r\n }\r\n\r\n private showLoadError(value: boolean) {\r\n if (!this.gridApi) return;\r\n\r\n if (value) {\r\n this.grid.api.setGridOption('overlayNoRowsTemplate', this.locale(Texts, 'LoadingFailed'));\r\n this.grid.api.showNoRowsOverlay();\r\n }\r\n else {\r\n this.grid.api.setGridOption('overlayNoRowsTemplate', undefined); \r\n } \r\n }\r\n\r\n private get language(): string {\r\n return this.languageService.getLanguage();\r\n }\r\n\r\n private locale(component: any, key: string): string {\r\n return localize(this.language, component, key);\r\n }\r\n\r\n private wrapObservable<T>(source: Observable<T>): Observable<T> {\r\n this.showLoading(true);\r\n this.showLoadError(false);\r\n\r\n return source.pipe(\r\n tap(() => this.showLoadError(false)),\r\n catchError(err => {\r\n this.showLoadError(true); \r\n return this.noData;\r\n }),\r\n finalize(() => this.showLoading(false))\r\n );\r\n }\r\n\r\n private wrapRowsSource(source: IRowsSource): IRowsSource {\r\n\r\n const thisRef = this;\r\n\r\n function calculateLastRow(params: IGetRowsParams\r\n , rows: any[], lastRow: number | undefined): number | undefined\r\n {\r\n if (lastRow === undefined && Array.isArray(rows)) {\r\n if (rows.length < params.endRow - params.startRow) {\r\n return params.startRow + rows.length;\r\n }\r\n }\r\n\r\n return lastRow;\r\n }\r\n\r\n function wrapParams(params: IGetRowsParams): IGetRowsParams {\r\n thisRef.showLoading(true);\r\n thisRef.showLoadError(false);\r\n\r\n return {\r\n ...params,\r\n successCallback: (rows, lastRow) => {\r\n try {\r\n params.successCallback(rows, calculateLastRow(params, rows, lastRow));\r\n } finally {\r\n thisRef.showLoading(false);\r\n }\r\n },\r\n failCallback: () => {\r\n try {\r\n params.failCallback();\r\n } finally {\r\n thisRef.showLoading(false);\r\n thisRef.showLoadError(true);\r\n }\r\n }\r\n };\r\n }\r\n\r\n return {\r\n getRows: (params: IGetRowsParams) => {\r\n const wrapped = wrapParams(params);\r\n source.getRows(wrapped);\r\n }\r\n };\r\n }\r\n\r\n}\r\n","import { Directive, Input, OnChanges, SimpleChanges, ChangeDetectorRef, inject } from '@angular/core';\r\n\r\nexport type ObserveCallback = (cdr: ChangeDetectorRef) => void;\r\n\r\n@Directive({\r\n selector: '[observe]',\r\n standalone: true\r\n})\r\nexport class ChangeDirective implements OnChanges {\r\n @Input() observe: any;\r\n @Input() callback?: ObserveCallback;\r\n\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[\"observe\"]) {\r\n this.callback?.(this.cdr);\r\n } \r\n }\r\n}\r\n","import { ContainerControl } from \"./control\";\r\n\r\nexport class FormControl extends ContainerControl {\r\n\r\n}\r\n","import { Control } from \"./control\";\r\nimport { SirioTextbox } from \"@wemake4u/form-controls\";\r\n\r\nexport class TextFieldControl extends Control {\r\n\r\n setRandomColor(): void {\r\n const input = this.getNativeInput();\r\n if (input) input.style.backgroundColor = this.getRandomColor();\r\n }\r\n\r\n focus(): void {\r\n this.getTextbox()?.focus();\r\n }\r\n\r\n //#region Private Methods\r\n\r\n private getTextbox(): SirioTextbox | null {\r\n return this.getComponentRef() as SirioTextbox | null;\r\n }\r\n\r\n private getNativeInput(): HTMLInputElement | null {\r\n return this.getElementRef()?.nativeElement?.querySelector('input') ?? null;\r\n }\r\n\r\n private getRandomColor(): string {\r\n const letters = '0123456789ABCDEF';\r\n let color = '#';\r\n\r\n for (let i = 0; i < 6; i++) {\r\n color += letters[Math.floor(Math.random() * 16)];\r\n }\r\n\r\n return color;\r\n }\r\n\r\n //#endregion\r\n}\r\n","import { Control } from \"./control\";\r\nimport { SirioSelect } from \"@wemake4u/form-controls\";\r\n\r\nexport class SelectControl extends Control {\r\n\r\n focus(): void {\r\n this.getSelect()?.focus();\r\n }\r\n\r\n refresh(): void {\r\n // Set by the refresh directive: reloads the values of the component.\r\n (this.getSelect() as any)?._refresh?.();\r\n }\r\n\r\n private getSelect(): SirioSelect | null {\r\n return this.getComponentRef() as SirioSelect | null;\r\n }\r\n}\r\n","import { Control } from \"./control\";\r\nimport { SirioSelect } from \"@wemake4u/form-controls\";\r\n\r\n// The taglist is a multiple wm-sirio-select.\r\nexport class TagListControl extends Control {\r\n\r\n focus(): void {\r\n this.getSelect()?.focus();\r\n }\r\n\r\n refresh(): void {\r\n // Set by the refresh directive: reloads the values of the component.\r\n (this.getSelect() as any)?._refresh?.();\r\n }\r\n\r\n private getSelect(): SirioSelect | null {\r\n return this.getComponentRef() as SirioSelect | null;\r\n }\r\n}\r\n","import { Control } from \"./control\";\r\nimport { SirioNumber } from \"@wemake4u/form-controls\";\r\n\r\nexport class NumberControl extends Control {\r\n\r\n focus(): void {\r\n this.getNumber()?.focus();\r\n }\r\n\r\n private getNumber(): SirioNumber | null {\r\n return this.getComponentRef() as SirioNumber | null;\r\n }\r\n\r\n}\r\n","import { Control } from \"./control\";\r\nimport { SirioDate } from \"@wemake4u/form-controls\";\r\n\r\nexport class DateControl extends Control {\r\n\r\n focus(): void {\r\n this.getDate()?.focus();\r\n }\r\n\r\n private getDate(): SirioDate | null {\r\n return this.getComponentRef() as SirioDate | null;\r\n }\r\n\r\n}\r\n","import { Control } from \"./control\";\r\nimport { SirioTime } from \"@wemake4u/form-controls\";\r\n\r\nexport class TimeControl extends Control {\r\n\r\n focus(): void {\r\n this.getTime()?.focus();\r\n }\r\n\r\n private getTime(): SirioTime | null {\r\n return this.getComponentRef() as SirioTime | null;\r\n }\r\n\r\n}\r\n","import { Control } from \"./control\";\r\nimport { SirioDateTime } from \"@wemake4u/form-controls\";\r\n\r\nexport class DateTimeControl extends Control {\r\n\r\n focus(): void {\r\n this.getDateTime()?.focus();\r\n }\r\n\r\n private getDateTime(): SirioDateTime | null {\r\n return this.getComponentRef() as SirioDateTime | null;\r\n }\r\n\r\n}\r\n","import { Control } from \"./control\";\r\nimport { SirioCheckbox } from \"@wemake4u/form-controls\";\r\n\r\n// Checkbox and toggle (subtype \"toggle\"): both are a wm-sirio-checkbox ([toggle] for the switch).\r\nexport class CheckBoxControl extends Control {\r\n\r\n focus(): void {\r\n this.getCheckBox()?.focus();\r\n }\r\n\r\n private getCheckBox(): SirioCheckbox | null {\r\n return this.getComponentRef() as SirioCheckbox | null;\r\n }\r\n\r\n}\r\n","import { Control } from \"./control\";\r\nimport { SirioRadioGroup } from \"@wemake4u/form-controls\";\r\n\r\n// Radio buttons and chips (subtype \"chip\"): both are a wm-sirio-radio-group ([chips] for the chips).\r\nexport class RadioControl extends Control {\r\n\r\n focus(): void {\r\n this.getRadio()?.focus();\r\n }\r\n\r\n refresh(): void {\r\n // Set by the refresh directive: reloads the values of the component.\r\n (this.getRadio() as any)?._refresh?.();\r\n }\r\n\r\n private getRadio(): SirioRadioGroup | null {\r\n return this.getComponentRef() as SirioRadioGroup | null;\r\n }\r\n\r\n}\r\n","import { Control } from \"./control\";\r\nimport { SirioChecklist } from \"@wemake4u/form-controls\";\r\n\r\n// Checkbox list and chips (subtype \"chip\"): both are a wm-sirio-checklist ([chips] for the chips).\r\nexport class CheckListControl extends Control {\r\n\r\n focus(): void {\r\n this.getChecklist()?.focus();\r\n }\r\n\r\n refresh(): void {\r\n // Set by the refresh directive: reloads the values of the component.\r\n (this.getChecklist() as any)?._refresh?.();\r\n }\r\n\r\n private getChecklist(): SirioChecklist | null {\r\n return this.getComponentRef() as SirioChecklist | null;\r\n }\r\n\r\n}\r\n","import { Control } from \"./control\";\r\nimport { SirioTextarea } from \"@wemake4u/form-controls\";\r\n\r\nexport class TextAreaControl extends Control {\r\n\r\n focus(): void {\r\n this.getTextarea()?.focus();\r\n }\r\n\r\n private getTextarea(): SirioTextarea | null {\r\n return this.getComponentRef() as SirioTextarea | null;\r\n }\r\n\r\n}\r\n","import { Control } from \"./control\";\r\nimport { SirioSlider } from \"@wemake4u/form-controls\";\r\n\r\n// Range (slider): a wm-sirio-slider.\r\nexport class RangeControl extends Control {\r\n\r\n focus(): void {\r\n this.getSlider()?.focus();\r\n }\r\n\r\n private getSlider(): SirioSlider | null {\r\n return this.getComponentRef() as SirioSlider | null;\r\n }\r\n\r\n}\r\n","import { Control } from \"./control\";\r\nimport { SirioFileUpload } from \"@wemake4u/form-controls\";\r\n\r\nexport class FilePickerControl extends Control {\r\n\r\n focus(): void {\r\n this.getFileUpload()?.focus();\r\n }\r\n\r\n private getFileUpload(): SirioFileUpload | null {\r\n return this.getComponentRef() as SirioFileUpload | null;\r\n }\r\n\r\n}\r\n","import { Control } from \"./control\";\r\n\r\nexport class TextControl extends Control {\r\n\r\n \r\n}\r\n","import { Control } from \"./control\";\r\n\r\nexport class HtmlControl extends Control {\r\n\r\n \r\n}\r\n","import { Control } from \"./control\";\r\n\r\nexport class ImageControl extends Control {\r\n\r\n \r\n}\r\n","import { ContainerControl } from \"./control\";\r\nimport { SirioTabs } from \"@wemake4u/form-controls\";\r\n\r\nexport class TabControl extends ContainerControl {\r\n\r\n canNext() {\r\n return this.tab.nextIndex() !== null;\r\n }\r\n\r\n goNext() {\r\n this.tab.selectNext();\r\n }\r\n\r\n canPrevious() {\r\n return this.tab.previousIndex() !== null;\r\n }\r\n\r\n goPrevious() {\r\n this.tab.selectPrevious();\r\n }\r\n\r\n /** Selects a tab (missing or disabled tabs are ignored). */\r\n setActiveIndex(index: number): void {\r\n this.tab.select(index);\r\n };\r\n\r\n //#region State\r\n\r\n override onLoadState(): void {\r\n const state = this.getState<TabControlState>();\r\n\r\n if (!state || typeof state.activeIndex !== 'number') {\r\n return;\r\n }\r\n\r\n this.setActiveIndex(state.activeIndex);\r\n }\r\n\r\n override onSaveState(): void {\r\n this.setState(this.createState());\r\n }\r\n\r\n private createState(): TabControlState | null {\r\n return {\r\n activeIndex: this.tab.activeIndex()\r\n };\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Private Members\r\n\r\n private get tab(): SirioTabs {\r\n const ref = this.getComponentRef();\r\n if (!(ref instanceof SirioTabs)) {\r\n throw new Error(\r\n 'ComponentRef is not a SirioTabs'\r\n );\r\n }\r\n return ref;\r\n }\r\n\r\n //#endregion\r\n}\r\n\r\ninterface TabControlState\r\n{\r\n activeIndex: number;\r\n}\r\n","import { Control } from \"./control\";\r\nimport { AgCharts } from 'ag-charts-angular';\r\n\r\nexport class ChartControl extends Control {\r\n\r\n //readonly refresh = (): void => {\r\n // (this.getGrid() as any)._refresh();\r\n //}\r\n\r\n private getChart(): AgCharts {\r\n return this.getComponentRef() as AgCharts;\r\n }\r\n}\r\n","import { ContainerControl } from \"./control\";\r\nimport { SirioAccordion } from \"@wemake4u/form-controls\";\r\n\r\nexport class AccordionControl extends ContainerControl {\r\n\r\n /** Opens a section (missing, disabled or already open sections are ignored). */\r\n openPanel(index: number): void {\r\n this.accordion.expand(index);\r\n };\r\n\r\n //#region State\r\n\r\n override onLoadState(): void {\r\n const state = this.getState<AccordionControlState>();\r\n\r\n if (!state || !Array.isArray(state.openIndexes)) {\r\n return;\r\n }\r\n\r\n for (const index of state.openIndexes) {\r\n this.openPanel(index);\r\n }\r\n }\r\n\r\n override onSaveState(): void {\r\n const state = this.createState();\r\n if (state) {\r\n this.setState(state);\r\n }\r\n }\r\n\r\n private createState(): AccordionControlState | null {\r\n const openIndexes = this.accordion.expandedIndexes();\r\n\r\n return openIndexes.length > 0\r\n ? { openIndexes }\r\n : null;\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Private Members\r\n\r\n private get accordion(): SirioAccordion {\r\n const ref = this.getComponentRef();\r\n if (!(ref instanceof SirioAccordion)) {\r\n throw new Error(\r\n 'ComponentRef is not a SirioAccordion'\r\n );\r\n }\r\n return ref;\r\n }\r\n\r\n //#endregion\r\n\r\n}\r\n\r\ninterface AccordionControlState {\r\n openIndexes: number[] | null;\r\n}\r\n","import { ContainerControl } from \"./control\";\r\n\r\nexport class DynamicListControl extends ContainerControl {\r\n\r\n \r\n}\r\n","import { ContainerControl } from \"./control\";\r\n\r\nexport class GroupControl extends ContainerControl {\r\n\r\n}\r\n","import { Observable } from 'rxjs';\r\nimport { take } from 'rxjs/operators';\r\n\r\nexport function subscribeOnce<T>(\r\n source$: Observable<T>,\r\n next: (value: T) => void,\r\n error?: (err: any) => void,\r\n complete?: () => void\r\n): void {\r\n source$\r\n .pipe(take(1))\r\n .subscribe({\r\n next,\r\n error,\r\n complete\r\n });\r\n}\r\n","import { merge } from 'rxjs';\r\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\r\nimport { Control } from \"./control\";\r\nimport { AgGridAngular } from 'ag-grid-angular';\r\nimport { FilterModel, ColumnState } from 'ag-grid-community';\r\nimport { subscribeOnce } from '../utils/observable';\r\n\r\nexport class TableControl extends Control {\r\n\r\n setFilter(filter: FilterModel): void {\r\n this.grid.api.setFilterModel(filter);\r\n }\r\n\r\n getFilter(): FilterModel {\r\n return this.grid.api.getFilterModel();\r\n }\r\n\r\n clearFilter(): void {\r\n this.grid.api.setFilterModel(null);\r\n }\r\n\r\n getOrder(): OrderModel {\r\n return this.grid.api.getColumnState()\r\n .filter(col => col.sort === 'asc' || col.sort === 'desc')\r\n .sort((a, b) => (a.sortIndex ?? 0) - (b.sortIndex ?? 0))\r\n .map(col => ({\r\n colId: col.colId,\r\n sort: col.sort as 'asc' | 'desc',\r\n }));\r\n }\r\n\r\n setOrder(order: OrderModel): void {\r\n this.grid.api.applyColumnState({\r\n state: order.map((o, i) => ({ colId: o.colId, sort: o.sort, sortIndex: i })),\r\n defaultState: { sort: null },\r\n });\r\n }\r\n\r\n refresh(): void {\r\n (this.grid as any)._refresh();\r\n }\r\n\r\n redraw(): void {\r\n this.grid.api.redrawRows();\r\n }\r\n\r\n //#region State\r\n\r\n private currentState: TableControlState | null = null;\r\n\r\n override onLoadState(): void {\r\n\r\n const destroyRef = this.getDestroyRef();\r\n\r\n merge(\r\n this.grid.filterChanged,\r\n this.grid.sortChanged,\r\n this.grid.columnResized,\r\n this.grid.paginationChanged,\r\n ).pipe(takeUntilDestroyed(destroyRef))\r\n .subscribe(() => {\r\n this.currentState = this.createState();\r\n });\r\n\r\n this.grid.gridReady\r\n .pipe(takeUntilDestroyed(destroyRef))\r\n .subscribe(event => {\r\n this.applyState();\r\n });\r\n }\r\n\r\n override onSaveState(): void {\r\n this.setState(this.currentState);\r\n }\r\n\r\n private createState(): TableControlState | null {\r\n return {\r\n columns: this.grid.api.getColumnState(),\r\n filter: this.grid.api.getFilterModel(),\r\n pagination: this.paginationEnabled() ? {\r\n page: this.grid.api.paginationGetCurrentPage(),\r\n pageSize: this.grid.api.paginationGetPageSize(),\r\n } : null\r\n }\r\n }\r\n\r\n private applyState() {\r\n const state = this.getState<TableControlState>();\r\n if (state) {\r\n if (state.columns)\r\n this.grid.api.applyColumnState({ state: state.columns, applyOrder: true });\r\n if (state.filter)\r\n this.grid.api.setFilterModel(state.filter);\r\n if (state.pagination)\r\n this.applyPagination(state.pagination)\r\n }\r\n }\r\n\r\n private applyPagination(pagination: TablePaginationState) {\r\n if (!this.paginationEnabled()) return;\r\n this.applyPageSize(pagination.pageSize);\r\n this.applyPageNumber(pagination.page);\r\n }\r\n\r\n private applyPageSize(pageSize: number) {\r\n if (this.grid.api.paginationGetPageSize() != pageSize)\r\n this.grid.api.setGridOption('paginationPageSize', pageSize);\r\n }\r\n\r\n private applyPageNumber(pageNumber: number, subscribe: boolean = true) {\r\n if (this.grid.api.paginationGetCurrentPage() != pageNumber) {\r\n this.grid.api.paginationGoToPage(pageNumber);\r\n if (subscribe) {\r\n subscribeOnce(this.grid.firstDataRendered, () => {\r\n this.applyPageNumber(pageNumber, false);\r\n });\r\n } \r\n }\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Private Members\r\n\r\n private get grid(): AgGridAngular {\r\n const ref = this.getComponentRef();\r\n if (!(ref instanceof AgGridAngular)) {\r\n throw new Error(\r\n 'ComponentRef is not a AgGridAngular'\r\n );\r\n }\r\n return ref;\r\n }\r\n\r\n private paginationEnabled(): boolean {\r\n return this.grid.api.getGridOption('pagination') === true;\r\n }\r\n\r\n //#endregion\r\n}\r\n\r\ninterface TableControlState {\r\n columns: ColumnState[] | null\r\n filter: FilterModel | null\r\n pagination: TablePaginationState | null\r\n}\r\n\r\ninterface TablePaginationState {\r\n page: number,\r\n pageSize: number\r\n}\r\n\r\nexport interface OrderModelItem {\r\n colId: string;\r\n sort: 'asc' | 'desc';\r\n}\r\n\r\nexport interface OrderModel extends Array<OrderModelItem> { }\r\n","import { Control } from \"./control\";\r\n\r\nexport class ButtonControl extends Control {\r\n\r\n /** The registered element is the native button (wmSirioButton of @wemake4u/form-controls). */\r\n focus(): void {\r\n (this.getElementRef()?.nativeElement as HTMLElement | undefined)?.focus();\r\n }\r\n\r\n}\r\n","import { Control } from \"./control\";\r\n\r\nexport class SeparatorControl extends Control {\r\n\r\n \r\n}\r\n","import { Control } from \"./control\";\r\n\r\nexport class SpacerControl extends Control {\r\n\r\n \r\n}\r\n","import { Control } from \"./control\";\r\n\r\nexport class IFrameControl extends Control {\r\n\r\n \r\n}\r\n","import { Control } from \"./control\";\r\n\r\nexport class TooltipControl extends Control {\r\n\r\n}\r\n","import { Control } from \"./control\";\r\n\r\nexport class DisplayFieldControl extends Control {\r\n\r\n \r\n}\r\n","import { Control } from \"./control\";\r\n\r\nexport class NavigatorControl extends Control {\r\n\r\n \r\n}\r\n","import { Control } from \"./control\";\r\n\r\nexport class TreelistControl extends Control {\r\n\r\n \r\n}\r\n","import { Control, ControlContext } from './control';\r\nimport { FormControl } from './form';\r\nimport { TextFieldControl } from './textfield';\r\nimport { SelectControl } from './select';\r\nimport { TagListControl } from './taglist';\r\nimport { NumberControl } from './number';\r\nimport { DateControl } from './date';\r\nimport { TimeControl } from './time';\r\nimport { DateTimeControl } from './datetime';\r\nimport { CheckBoxControl } from './checkbox';\r\nimport { RadioControl } from './radio';\r\nimport { CheckListControl } from './checklist';\r\nimport { TextAreaControl } from './textarea';\r\nimport { RangeControl } from './range';\r\nimport { FilePickerControl } from './filepicker';\r\nimport { TextControl } from './text';\r\nimport { HtmlControl } from './html';\r\nimport { ImageControl } from './image';\r\nimport { TabControl } from './tab';\r\nimport { ChartControl } from './chart';\r\nimport { AccordionControl } from './accordion';\r\nimport { DynamicListControl } from './dynamiclist';\r\nimport { GroupControl } from './group';\r\nimport { TableControl } from './table';\r\nimport { ButtonControl } from './button';\r\nimport { SeparatorControl } from './separator';\r\nimport { SpacerControl } from './spacer';\r\nimport { IFrameControl } from './iframe';\r\nimport { TooltipControl } from './tooltip';\r\nimport { DisplayFieldControl } from './displayfield';\r\nimport { NavigatorControl } from './navigator';\r\nimport { TreelistControl } from './treerlist';\r\n\r\nexport function createControl(context: ControlContext): Control {\r\n\r\n switch (context.metadata.type) {\r\n\r\n case \"default\":\r\n return new FormControl(context);\r\n\r\n case \"textfield\":\r\n return new TextFieldControl(context);\r\n\r\n case \"select\":\r\n return new SelectControl(context);\r\n\r\n case \"taglist\":\r\n return new TagListControl(context);\r\n\r\n case \"number\":\r\n return new NumberControl(context);\r\n\r\n case \"datetime\":\r\n switch (context.metadata.subtype) {\r\n case \"date\":\r\n return new DateControl(context);\r\n case \"time\":\r\n return new TimeControl(context);\r\n case \"datetime\":\r\n return new DateTimeControl(context);\r\n default:\r\n return new Control(context);\r\n }\r\n\r\n case \"checkbox\":\r\n // Checkbox and toggle (subtype \"toggle\") are both rendered by wm-sirio-checkbox.\r\n return new CheckBoxControl(context);\r\n\r\n case \"radio\":\r\n // Radio buttons and chips (subtype \"chip\") are both rendered by wm-sirio-radio-group.\r\n return new RadioControl(context);\r\n\r\n case \"checklist\":\r\n // Checkbox list and chips (subtype \"chip\") are both rendered by wm-sirio-checklist.\r\n return new CheckListControl(context);\r\n\r\n case \"textarea\":\r\n return new TextAreaControl(context);\r\n\r\n case \"range\":\r\n return new RangeControl(context);\r\n\r\n case \"filepicker\":\r\n return new FilePickerControl(context);\r\n\r\n case \"displayfield\":\r\n return new DisplayFieldControl(context);\r\n\r\n case \"text\":\r\n return new TextControl(context);\r\n\r\n case \"html\":\r\n return new HtmlControl(context);\r\n\r\n case \"image\":\r\n return new ImageControl(context);\r\n\r\n case \"dynamiclist\":\r\n switch (context.metadata.subtype) {\r\n case \"tab\":\r\n return new TabControl(context);\r\n case \"accordion\":\r\n return new AccordionControl(context);\r\n default:\r\n return new DynamicListControl(context);\r\n }\r\n\r\n case \"group\":\r\n return new GroupControl(context);\r\n\r\n case \"table\":\r\n return new TableControl(context);\r\n\r\n case \"chart\":\r\n return new ChartControl(context);\r\n\r\n case \"button\":\r\n return new ButtonControl(context);\r\n\r\n case \"separator\":\r\n return new SeparatorControl(context);\r\n\r\n case \"spacer\":\r\n return new SpacerControl(context);\r\n\r\n case \"iframe\":\r\n return new IFrameControl(context);\r\n\r\n case \"tooltip\":\r\n return new TooltipControl(context);\r\n\r\n case \"tab\":\r\n return new TabControl(context);\r\n\r\n case \"accordion\":\r\n return new AccordionControl(context);\r\n\r\n case \"navigator\":\r\n return new NavigatorControl(context);\r\n\r\n case \"treelist\":\r\n return new TreelistControl(context);\r\n\r\n default:\r\n return new Control(context);\r\n }\r\n}\r\n","import {\r\n Directive, Input, ElementRef, AfterContentInit, OnDestroy\r\n , ContentChild, ContentChildren, QueryList, forwardRef\r\n , DestroyRef, Injector\r\n} from '@angular/core';\r\nimport { RegisterService } from '../services/register.service';\r\nimport { createControl } from '../controls/factory';\r\nimport { DynamicFieldsComponent } from '../dynamic-fields/dynamic-fields.component';\r\nimport { IDynamicFieldsComponent } from '../dynamic-fields/dynamic-fields.interface';\r\nimport { ControlContext, ItemControl } from '../controls/control';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\n@Directive({\r\n selector: '[register]',\r\n standalone: true\r\n})\r\nexport class RegisterDirective implements AfterContentInit, OnDestroy {\r\n @Input() register: any = null;\r\n @Input() componentRef: any;\r\n @ContentChild(forwardRef(() => DynamicFieldsComponent)) dynamicField?: IDynamicFieldsComponent;\r\n @ContentChildren(forwardRef(() => DynamicFieldsComponent), { descendants: true }) itemFields!: QueryList<IDynamicFieldsComponent>;\r\n \r\n constructor(\r\n private el: ElementRef,\r\n private destroyRef: DestroyRef,\r\n private registerService: RegisterService,\r\n private injector: Injector\r\n )\r\n { }\r\n\r\n ngAfterContentInit(): void {\r\n this.registerControl();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.unregisterControl();\r\n }\r\n\r\n private registerControl(): void {\r\n const name = this.getName();\r\n const path = this.registerService.getPath();\r\n\r\n const createContext = (\r\n register: () => RegisterService | undefined\r\n ): ControlContext => ({\r\n name: name,\r\n path: path,\r\n metadata: this.register,\r\n componentRef: this.componentRef,\r\n elementRef: this.el,\r\n injector: this.injector,\r\n destroyRef: this.destroyRef,\r\n register\r\n });\r\n\r\n const noRegister = () => undefined;\r\n\r\n const register = () => (this.register.type === 'dynamiclist')\r\n ? this.createDynamicRegister(createContext(noRegister), this.itemFields)\r\n : this.dynamicField?.getRegister();\r\n\r\n const context = createContext(register);\r\n\r\n const control = createControl(context);\r\n\r\n this.registerService.register(name, control);\r\n }\r\n\r\n private unregisterControl(): void {\r\n this.registerService.unregister(this.getName());\r\n }\r\n\r\n private getName(): string {\r\n return this.register.name ?? this.register.id;\r\n }\r\n\r\n private createDynamicRegister(context: ControlContext\r\n , itemFields: QueryList<IDynamicFieldsComponent>): RegisterService {\r\n\r\n const newRegister = new RegisterService(null);\r\n\r\n const registerAll = (itemFields: QueryList<IDynamicFieldsComponent>) => {\r\n newRegister.unregisterAll();\r\n itemFields.forEach((itemField, index) => {\r\n const register = () => itemField.getRegister();\r\n const newName = `${context.name}-${index}`;\r\n const itemContext = {\r\n ...context,\r\n name: newName,\r\n register: register\r\n } \r\n const control = new ItemControl(itemContext, index);\r\n newRegister.register(newName, control);\r\n });\r\n }\r\n\r\n registerAll(itemFields);\r\n\r\n itemFields.changes\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((itemFields: QueryList<IDynamicFieldsComponent>) => {\r\n registerAll(itemFields);\r\n });\r\n\r\n return newRegister;\r\n }\r\n}\r\n","import { Directive, Input, AfterContentInit } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[refresh]',\r\n standalone: true\r\n})\r\nexport class RefreshDirective implements AfterContentInit {\r\n @Input() refresh: (() => void) | null = null;\r\n @Input() componentRef: any;\r\n\r\n constructor() {\r\n }\r\n\r\n ngAfterContentInit(): void {\r\n this.componentRef._refresh = this.refresh;\r\n }\r\n\r\n}\r\n","import { AfterViewInit, Directive, EventEmitter, Input, Output } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[navigatorState]',\r\n exportAs: 'navigatorState',\r\n standalone: true\r\n})\r\nexport class NavigatorStateDirective implements AfterViewInit {\r\n private _total = 0;\r\n private _index = 0;\r\n private _requestedIndex = 0;\r\n private initialized = false;\r\n\r\n ngAfterViewInit(): void {\r\n this.initialized = true;\r\n }\r\n\r\n @Output()\r\n indexChange = new EventEmitter<number>();\r\n\r\n @Input()\r\n set total(value: number) {\r\n this._total = value ?? 0;\r\n this.recalculate(false);\r\n }\r\n get total(): number {\r\n return this._total;\r\n }\r\n\r\n @Input()\r\n get index(): number {\r\n return this._index;\r\n }\r\n set index(value: number) {\r\n this._requestedIndex = value ?? 0;\r\n this.recalculate(true);\r\n }\r\n\r\n canNext(): boolean {\r\n return this._index < this._total - 1;\r\n }\r\n\r\n canPrevious(): boolean {\r\n return this._index > 0;\r\n }\r\n\r\n next(): void {\r\n if (this.canNext())\r\n this.setIndex(this._index + 1, true);\r\n }\r\n\r\n previous(): void {\r\n if (this.canPrevious())\r\n this.setIndex(this._index - 1, true);\r\n }\r\n\r\n private recalculate(preserveIndex: boolean): void {\r\n\r\n const newIndex =\r\n Math.max(0, Math.min(this._requestedIndex, this._total - 1));\r\n\r\n if (newIndex === this._index) {\r\n return;\r\n }\r\n\r\n this._index = newIndex;\r\n\r\n if (!preserveIndex)\r\n this._requestedIndex = this._index;\r\n\r\n if (this.initialized) {\r\n this.indexChange.emit(this._index);\r\n }\r\n }\r\n\r\n private setIndex(value: number, emit: boolean): void {\r\n\r\n if (value == null || isNaN(value)) {\r\n return;\r\n }\r\n\r\n this._requestedIndex = value;\r\n this.recalculate(false);\r\n }\r\n}\r\n","import { Injectable, OnDestroy, Renderer2 } from '@angular/core';\r\n\r\n@Injectable()\r\nexport class ListenerService implements OnDestroy {\r\n\r\n constructor(private renderer: Renderer2) {\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.listeners.forEach(remove => remove());\r\n this.listeners = [];\r\n }\r\n\r\n private listeners: Array<() => void> = [];\r\n\r\n listen(target: any, event: string, handler: (event: any) => void): void {\r\n const remove = this.renderer.listen(target, event, handler);\r\n this.listeners.push(remove);\r\n }\r\n}\r\n","import { Directive, ElementRef, Renderer2, Input, OnChanges, SimpleChanges, OnDestroy, DestroyRef } from '@angular/core';\r\nimport { ListenerService } from '../services/listener.service';\r\n\r\nimport { LanguageService } from '@wemake4u/interact';\r\nimport { Texts } from '../locale/locale';\r\nimport { localize } from '../locale/localize';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { EvaluateOptions } from '../services/programmability.service';\r\n\r\n@Directive({\r\n selector: '[collapse]',\r\n standalone: true,\r\n providers: [\r\n ListenerService\r\n ]\r\n})\r\nexport class CollapseDirective implements OnChanges, OnDestroy {\r\n @Input('collapse') maxHeight: number | null = null;\r\n @Input() onCollapse?: (options?: EvaluateOptions) => void;\r\n @Input() onExpand?: (options?: EvaluateOptions) => void;\r\n\r\n @Input(\"register\") component: any = null;\r\n\r\n private currentHeight: number | null = null;\r\n private button: HTMLButtonElement | null = null;\r\n private iconSpan: HTMLElement | null = null;\r\n private expanded = false;\r\n private viewInitialized = false;\r\n private timeoutFocusOut: any;\r\n private unlistenFocusOut!: () => void;\r\n \r\n constructor(private el: ElementRef\r\n , private renderer: Renderer2\r\n , private destroyRef: DestroyRef\r\n , private listenerService: ListenerService \r\n , private languageService: LanguageService) {\r\n\r\n languageService.onLanguageChanged()\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => this.applyCollapseLogic());\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.resetButton();\r\n this.resetFocusHandler(); \r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.viewInitialized = true;\r\n this.currentHeight = this.maxHeight;\r\n this.applyCollapseLogic();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['language'] || changes['maxHeight']) {\r\n this.currentHeight = this.maxHeight;\r\n if (this.viewInitialized) {\r\n this.applyCollapseLogic();\r\n }\r\n }\r\n }\r\n\r\n private get language(): string {\r\n return this.languageService.getLanguage();\r\n }\r\n\r\n private applyCollapseLogic(): void {\r\n \r\n this.resetStyles();\r\n \r\n this.resetButton();\r\n \r\n this.resetFocusHandler();\r\n\r\n if (this.maxHeight == null || this.maxHeight <= 0) {\r\n this.expanded = true;\r\n return;\r\n }\r\n\r\n this.expanded = false;\r\n\r\n this.applyStyle();\r\n\r\n const element = this.el.nativeElement as HTMLElement;\r\n\r\n setTimeout(() => {\r\n if (element.scrollHeight > this.maxHeight!) {\r\n this.applyButton();\r\n this.applyFocusHandler();\r\n }\r\n }, 100);\r\n \r\n }\r\n\r\n private applyStyle() {\r\n const element = this.el.nativeElement as HTMLElement;\r\n this.renderer.setStyle(element, 'overflow', 'hidden');\r\n this.renderer.setStyle(element, 'max-height', `${this.maxHeight}px`);\r\n }\r\n\r\n private resetStyles() {\r\n const element = this.el.nativeElement as HTMLElement;\r\n this.renderer.setStyle(element, 'overflow', null);\r\n this.renderer.setStyle(element, 'max-height', null);\r\n }\r\n\r\n private applyButton(): void {\r\n const element = this.el.nativeElement as HTMLElement;\r\n this.button = this.renderer.createElement('button');\r\n this.renderer.addClass(this.button, 'sirio-btn');\r\n this.renderer.setStyle(this.button, 'padding', '0px');\r\n\r\n const text = this.renderer.createText(this.locale(Texts, 'ReadMore'));\r\n\r\n this.iconSpan = this.renderer.createElement('span');\r\n this.renderer.addClass(this.iconSpan, 'fa');\r\n this.renderer.addClass(this.iconSpan, 'fa-chevron-down');\r\n \r\n this.renderer.appendChild(this.button, text);\r\n this.renderer.appendChild(this.button, this.iconSpan);\r\n\r\n this.listenerService.listen(this.button, 'click', () => this.toggleExpand());\r\n\r\n this.renderer.setStyle(this.button, 'margin-top', '8px');\r\n\r\n this.renderer.appendChild(element.parentNode, this.button);\r\n }\r\n\r\n private resetButton() {\r\n if (this.button && this.button.parentNode) {\r\n this.renderer.removeChild(this.button.parentNode, this.button);\r\n this.button = null; \r\n }\r\n }\r\n\r\n private applyFocusHandler() {\r\n const element = this.el.nativeElement as HTMLElement;\r\n this.unlistenFocusOut = this.renderer.listen(element, 'focusout', () => {\r\n clearTimeout(this.timeoutFocusOut);\r\n this.timeoutFocusOut = setTimeout(() => {\r\n if (!element.contains(document.activeElement)) {\r\n element.scrollTop = 0;\r\n //console.log('NESSUN elemento interno ha più il focus');\r\n }\r\n }, 0);\r\n });\r\n }\r\n\r\n private resetFocusHandler() {\r\n if (this.unlistenFocusOut) {\r\n this.unlistenFocusOut();\r\n }\r\n clearTimeout(this.timeoutFocusOut);\r\n }\r\n\r\n private toggleExpand(): void {\r\n this.expanded = !this.expanded;\r\n if (this.expanded) {\r\n this.expand();\r\n } else {\r\n this.collapse();\r\n }\r\n }\r\n\r\n private expand(): void {\r\n const element = this.el.nativeElement as HTMLElement;\r\n this.renderer.setStyle(element, 'max-height', 'none');\r\n this.renderer.setStyle(element, 'overflow', 'visible');\r\n this.button!.childNodes[0].textContent = this.locale(Texts, 'ReadLess');\r\n this.updateIcon('fa-chevron-up', 'fa-chevron-down');\r\n this.onExpandOccurred();\r\n }\r\n\r\n private collapse(): void {\r\n const element = this.el.nativeElement as HTMLElement;\r\n this.renderer.setStyle(element, 'max-height', `${this.currentHeight}px`);\r\n this.renderer.setStyle(element, 'overflow', 'hidden');\r\n this.button!.childNodes[0].textContent = this.locale(Texts, 'ReadMore');\r\n this.updateIcon('fa-chevron-down', 'fa-chevron-up');\r\n this.onCollapseOccurred();\r\n }\r\n\r\n private updateIcon(add: string, remove: string) {\r\n if (this.iconSpan) {\r\n this.renderer.removeClass(this.iconSpan, remove);\r\n this.renderer.addClass(this.iconSpan, add);\r\n }\r\n }\r\n\r\n private locale(component: any, key: string): string {\r\n return localize(this.language, component, key);\r\n }\r\n\r\n private onExpandOccurred() {\r\n if (this.onExpand)\r\n this.onExpand({ invokeArgs: [] });\r\n }\r\n\r\n private onCollapseOccurred() {\r\n if (this.onCollapse)\r\n this.onCollapse({ invokeArgs: [] });\r\n }\r\n}\r\n","import { Directive, ElementRef, AfterViewInit, Input, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { ListenerService } from '../services/listener.service';\r\n\r\n@Directive({\r\n selector: '[treelist]',\r\n standalone: true,\r\n providers: [\r\n ListenerService\r\n ]\r\n})\r\nexport class TreeListDirective implements OnChanges, AfterViewInit {\r\n\r\n @Input('treelist') nodes: any[] = [];\r\n\r\n constructor(private el: ElementRef\r\n , private listenerService: ListenerService) {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['nodes'] && this.initialized) {\r\n this.rebuild();\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.initialized = true;\r\n this.rebuild(); \r\n }\r\n\r\n private initialized = false;\r\n private rows: HTMLTableRowElement[] = [];\r\n\r\n private rebuild() {\r\n queueMicrotask(() => {\r\n this.rows = Array.from(this.el.nativeElement.querySelectorAll('tbody tr'));\r\n this.initToggles();\r\n this.refreshTree(); \r\n });\r\n }\r\n\r\n private getChildren(id: string): HTMLTableRowElement[] {\r\n return this.rows.filter(r => r.dataset['parent'] === id);\r\n }\r\n\r\n private setVisible(row: HTMLTableRowElement, visible: boolean) {\r\n row.classList.toggle('hidden', !visible);\r\n }\r\n\r\n private updateVisibility(parentId: string, parentVisible: boolean, parentExpanded: boolean) {\r\n const children = this.getChildren(parentId);\r\n\r\n for (const child of children) {\r\n const childVisible = parentVisible && parentExpanded;\r\n this.setVisible(child, childVisible);\r\n\r\n const childExpanded = child.dataset['expanded'] === 'true';\r\n this.updateVisibility(child.dataset['id']!, childVisible, childExpanded);\r\n }\r\n }\r\n\r\n private isExpanded(row: HTMLTableRowElement): boolean {\r\n return row.dataset['expanded'] === 'true';\r\n }\r\n\r\n private refreshTree() {\r\n this.rows\r\n .filter(r => !r.dataset['parent'])\r\n .forEach(root => {\r\n this.setVisible(root, true);\r\n this.updateVisibility(\r\n root.dataset['id']!,\r\n true,\r\n root.dataset['expanded'] === 'true'\r\n );\r\n });\r\n }\r\n\r\n private initToggles() {\r\n const toggles = this.el.nativeElement.querySelectorAll('.toggle');\r\n toggles.forEach((toggle: any) => {\r\n if (toggle.dataset['bound'] === 'true') {\r\n return;\r\n }\r\n toggle.dataset['bound'] = 'true';\r\n const row = toggle.closest('tr') as HTMLTableRowElement;\r\n this.refreshToggleIcon(toggle, this.isExpanded(row));\r\n this.listenerService.listen(toggle, 'click', (e: Event) => {\r\n e.stopPropagation();\r\n const expanded = this.isExpanded(row);\r\n row.dataset['expanded'] = (!expanded).toString();\r\n this.refreshToggleIcon(toggle, this.isExpanded(row));\r\n this.refreshTree();\r\n });\r\n });\r\n }\r\n\r\n private refreshToggleIcon(target: HTMLElement, expanded: boolean)\r\n { \r\n target.classList.remove('fas', 'fa-angle-down', 'fa-angle-right');\r\n target.classList.add('fas');\r\n target.classList.add(expanded ? 'fa-angle-down' : 'fa-angle-right');\r\n }\r\n}\r\n","import { DestroyRef, Directive, Input } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { finalize, isObservable, Observable, take } from 'rxjs';\r\nimport { ToastService } from '../services/toast.service';\r\nimport { downloadBlob, downloadFile } from '@wemake4u/interact'\r\n\r\n@Directive({\r\n selector: '[fileHandler]',\r\n exportAs: 'fileHandler',\r\n standalone: true\r\n})\r\nexport class FileHandlerDirective {\r\n\r\n constructor(\r\n protected toastService: ToastService,\r\n protected destroyRef: DestroyRef\r\n ) { }\r\n\r\n @Input()\r\n downloadHandler?: (file: any) => Observable<any> | string;\r\n\r\n getExtension(file?: FileInfo | null): string {\r\n const name = file?.name?.trim();\r\n\r\n if (!name) {\r\n return '';\r\n }\r\n\r\n const index = name.lastIndexOf('.');\r\n\r\n if (index < 0 || index === name.length - 1) {\r\n return '';\r\n }\r\n\r\n return name.substring(index + 1).toUpperCase();\r\n }\r\n\r\n getIcon(file: File): string {\r\n const extension = this.getExtension(file).toLowerCase();\r\n return FILE_ICONS[extension] ?? 'fa-file';\r\n }\r\n\r\n getSize(file?: FileInfo | null): string {\r\n const size = file?.size;\r\n\r\n if (\r\n typeof size !== 'number' ||\r\n !Number.isFinite(size) ||\r\n size < 0\r\n ) {\r\n return '';\r\n }\r\n\r\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\r\n\r\n let value = size;\r\n let unit = 0;\r\n\r\n while (\r\n value >= 1024 &&\r\n unit < units.length - 1\r\n ) {\r\n value /= 1024;\r\n unit++;\r\n }\r\n\r\n const decimals =\r\n unit === 0\r\n ? 0\r\n : value < 10\r\n ? 1\r\n : 0;\r\n\r\n return `${value.toFixed(decimals)} ${units[unit]}`;\r\n }\r\n\r\n canDownload(file: any): boolean {\r\n return this.isLocal(file)\r\n || (this.isHandled(file) && !this.isDownloading(file));\r\n }\r\n\r\n isLocal(file: any): file is File {\r\n return file instanceof File;\r\n }\r\n\r\n downloadLocal(file: File): void {\r\n downloadBlob(file, file.name); \r\n }\r\n\r\n isHandled(file: any): file is { name: string, type: string } {\r\n return !this.isLocal(file)\r\n && typeof file === 'object'\r\n && file !== null\r\n && 'name' in file\r\n && 'type' in file \r\n && typeof file.name === 'string'\r\n && this.downloadHandler != null;\r\n }\r\n\r\n downloadHandled(file: any): void {\r\n\r\n if (!this.downloadHandler || !this.isHandled(file))\r\n return;\r\n\r\n const downloadResult = this.downloadHandler(file);\r\n\r\n if (typeof downloadResult === 'string') {\r\n this.downloadUrl(downloadResult, file.name); \r\n }\r\n\r\n if (isObservable(downloadResult)) {\r\n\r\n this.downloadingHandled.add(file);\r\n\r\n downloadResult\r\n .pipe(\r\n take(1),\r\n finalize(() => this.downloadingHandled.delete(file)),\r\n takeUntilDestroyed(this.destroyRef)\r\n )\r\n .subscribe({\r\n next: (result: any) => {\r\n if (this.isBase64(result)) {\r\n downloadFile(result, file.name, file.type);\r\n }\r\n else if (this.isUri(result)) {\r\n this.downloadUrl(result, file.name);\r\n }\r\n },\r\n error: error => {\r\n this.logError(error);\r\n }\r\n });\r\n }\r\n }\r\n\r\n isDownloading(file: any): boolean {\r\n return this.downloadingHandled.has(file);\r\n }\r\n\r\n private readonly downloadingHandled = new WeakSet<object>();\r\n\r\n private downloadUrl(url: string, fileName: string) {\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = fileName;\r\n link.target = '_blank';\r\n link.click();\r\n }\r\n\r\n private isBase64(value: string): boolean {\r\n if (!value) {\r\n return false;\r\n }\r\n\r\n // Data URI\r\n if (value.startsWith('data:')) {\r\n return value.includes(';base64,');\r\n }\r\n\r\n // Lunghezza multipla di 4\r\n if (value.length % 4 !== 0) {\r\n return false;\r\n }\r\n\r\n // Caratteri validi Base64\r\n if (!/^[A-Za-z0-9+/]*={0,2}$/.test(value)) {\r\n return false;\r\n }\r\n\r\n try {\r\n atob(value);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n private isUri(value: string): boolean {\r\n try {\r\n new URL(value, window.location.origin);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n protected logError(error: Error) {\r\n if (!error) return;\r\n console.error(error);\r\n if (error.message)\r\n this.toastService.notifyError(error.message);\r\n }\r\n\r\n}\r\n\r\ntype FileInfo = Pick<File, 'name' | 'size'>;\r\n\r\nconst FILE_ICONS: Record<string, string> = {\r\n zip: 'fa-file-zipper',\r\n rar: 'fa-file-zipper',\r\n '7z': 'fa-file-zipper',\r\n tar: 'fa-file-zipper',\r\n gz: 'fa-file-zipper',\r\n\r\n doc: 'fa-file-word',\r\n docx: 'fa-file-word',\r\n\r\n ppt: 'fa-file-powerpoint',\r\n pptx: 'fa-file-powerpoint',\r\n\r\n txt: 'fa-file-lines',\r\n log: 'fa-file-lines',\r\n md: 'fa-file-lines',\r\n\r\n pdf: 'fa-file-pdf',\r\n\r\n jpg: 'fa-file-image',\r\n jpeg: 'fa-file-image',\r\n png: 'fa-file-image',\r\n gif: 'fa-file-image',\r\n bmp: 'fa-file-image',\r\n svg: 'fa-file-image',\r\n webp: 'fa-file-image',\r\n\r\n xls: 'fa-file-excel',\r\n xlsx: 'fa-file-excel',\r\n\r\n csv: 'fa-file-csv',\r\n\r\n mp3: 'fa-file-audio',\r\n wav: 'fa-file-audio',\r\n ogg: 'fa-file-audio',\r\n flac: 'fa-file-audio',\r\n aac: 'fa-file-audio',\r\n m4a: 'fa-file-audio',\r\n wma: 'fa-file-audio',\r\n\r\n mp4: 'fa-file-video',\r\n avi: 'fa-file-video',\r\n mov: 'fa-file-video',\r\n wmv: 'fa-file-video',\r\n mkv: 'fa-file-video',\r\n webm: 'fa-file-video',\r\n mpeg: 'fa-file-video',\r\n mpg: 'fa-file-video',\r\n m4v: 'fa-file-video',\r\n\r\n html: 'fa-file-code',\r\n css: 'fa-file-code',\r\n js: 'fa-file-code',\r\n ts: 'fa-file-code',\r\n json: 'fa-file-code',\r\n xml: 'fa-file-code',\r\n cs: 'fa-file-code',\r\n java: 'fa-file-code',\r\n py: 'fa-file-code',\r\n sql: 'fa-file-code'\r\n};\r\n","import { DestroyRef, Directive, OnInit, Self } from '@angular/core';\r\nimport { NgControl } from '@angular/forms';\r\nimport { SubscribeService } from '../services/subscribe.service';\r\n\r\n@Directive({\r\n selector: 'wm-sirio-file-upload',\r\n standalone: true\r\n})\r\nexport class JsonFileDirective implements OnInit {\r\n\r\n constructor(\r\n @Self() private ngControl: NgControl,\r\n private subscribe: SubscribeService,\r\n private destroyRef: DestroyRef\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n\r\n const control = this.ngControl.control;\r\n\r\n if (!control)\r\n return;\r\n\r\n this.subscribe.subscribeChanges(control.valueChanges, control, undefined, this.destroyRef, (_, n) => this.defineJson(n));\r\n\r\n }\r\n\r\n private defineJson(value: any): void {\r\n\r\n if (!Array.isArray(value)) {\r\n return;\r\n }\r\n\r\n for (const item of value) {\r\n\r\n if (!(item instanceof File)) {\r\n continue;\r\n }\r\n\r\n if (typeof (item as any).toJSON === 'function') {\r\n continue;\r\n }\r\n\r\n Object.defineProperty(item, 'toJSON', {\r\n value() {\r\n return {\r\n ...this,\r\n name: this.name,\r\n size: this.size,\r\n type: this.type,\r\n lastModified: this.lastModified\r\n };\r\n },\r\n writable: true,\r\n configurable: true,\r\n enumerable: false\r\n });\r\n }\r\n }\r\n \r\n}\r\n","import { Directive, ElementRef, Renderer2, effect, input } from '@angular/core';\r\n\r\ntype AttrMap = Record<string, string | number | boolean | null | undefined>;\r\n\r\n@Directive({\r\n selector: '[ngAttrs]',\r\n standalone: true,\r\n})\r\nexport class AttrsDirective {\r\n ngAttrs = input<AttrMap | null>(null);\r\n\r\n // Keep track of what we set, so removed keys can be cleaned up\r\n private previous: AttrMap = {};\r\n\r\n constructor(private el: ElementRef<HTMLElement>, private renderer: Renderer2) {\r\n effect(() => {\r\n const next = this.ngAttrs() ?? {};\r\n const node = this.el.nativeElement;\r\n\r\n // Remove attributes no longer present\r\n for (const key of Object.keys(this.previous)) {\r\n if (!(key in next)) this.renderer.removeAttribute(node, key);\r\n }\r\n\r\n // Set or remove attributes based on the new values\r\n for (const [key, value] of Object.entries(next)) {\r\n if (value === null || value === undefined || value === false) {\r\n this.renderer.removeAttribute(node, key);\r\n } else {\r\n this.renderer.setAttribute(node, key, value === true ? '' : String(value));\r\n }\r\n }\r\n\r\n this.previous = { ...next };\r\n });\r\n }\r\n}\r\n","import { Directive, ElementRef, Optional, AfterViewInit, OnDestroy, Input } from '@angular/core';\r\nimport { NgControl } from '@angular/forms';\r\nimport { ValidationService } from '../services/validation.service'\r\n\r\n@Directive({\r\n selector: '[requiredOnInput]',\r\n standalone: true\r\n})\r\nexport class RequiredOnInputDirective implements AfterViewInit, OnDestroy {\r\n @Input(\"requiredOnInput\") required: any;\r\n\r\n constructor(private validationService: ValidationService,\r\n private host: ElementRef<HTMLElement>,\r\n @Optional() private ngControl: NgControl | null) {\r\n }\r\n\r\n private removeListener?: () => void;\r\n\r\n private wasEmpty: boolean | null = null;\r\n\r\n ngOnDestroy(): void {\r\n this.removeListener?.();\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n\r\n if (this.required !== true) return;\r\n\r\n // Form control and native input of the @wemake4u/form-controls control.\r\n const control = this.ngControl?.control;\r\n const input: HTMLInputElement | HTMLTextAreaElement | null =\r\n this.host.nativeElement.querySelector('input, textarea');\r\n\r\n if (!control || !input) return;\r\n\r\n this.wasEmpty = this.isEmpty(control.value);\r\n\r\n const handler = () => {\r\n\r\n const isEmpty = this.isEmpty(input.value);\r\n\r\n if (this.wasEmpty !== isEmpty) {\r\n\r\n var errors = this.validationService.validateRequired(control, input.value);\r\n\r\n control.setErrors(errors);\r\n\r\n this.wasEmpty = isEmpty;\r\n }\r\n };\r\n\r\n input.addEventListener('input', handler);\r\n\r\n this.removeListener = () => {\r\n input.removeEventListener('input', handler);\r\n };\r\n }\r\n\r\n private isEmpty(value: string) {\r\n return (value ?? \"\").toString().length === 0;\r\n }\r\n}\r\n\r\n","import { Directive, Input, HostListener, Optional, Self, ElementRef } from '@angular/core';\r\nimport { AbstractControl, NgControl } from '@angular/forms';\r\nimport { ValidationService } from '../services/validation.service';\r\n\r\n@Directive({\r\n selector: '[requiredOnBlur]',\r\n standalone: true\r\n})\r\nexport class RequiredOnBlurDirective {\r\n @Input(\"requiredOnBlur\") required: any;\r\n\r\n constructor(\r\n private host: ElementRef<HTMLElement>\r\n , @Optional() @Self() private ngControl: NgControl\r\n , public validationService: ValidationService) {\r\n }\r\n\r\n @HostListener('focusout', ['$event'])\r\n onFocusOut(event: FocusEvent): void {\r\n if (!this.required\r\n || !this.validationService.allowSilentError()\r\n ) return;\r\n\r\n const control = this.control;\r\n if (!control) return;\r\n\r\n if (this.isInsideHost(event.relatedTarget)) return;\r\n\r\n this.validationService.revealSilentErrors([control]); \r\n }\r\n\r\n private get control(): AbstractControl | null {\r\n return this.ngControl?.control ?? null;\r\n }\r\n\r\n private isInsideHost(target: EventTarget | null): boolean {\r\n return target instanceof Node\r\n && this.host.nativeElement.contains(target);\r\n }\r\n}\r\n\r\n","import { Directive, HostListener, Input } from '@angular/core';\r\nimport { EvaluateOptions } from '../services/programmability.service';\r\n\r\n@Directive({\r\n selector: '[markdown]',\r\n standalone: true\r\n})\r\nexport class MarkdownDirective {\r\n @Input() onAnchorClick?: (options?: EvaluateOptions) => void;\r\n\r\n @HostListener('click', ['$event'])\r\n onClick(event: MouseEvent): void {\r\n if (event.target instanceof HTMLAnchorElement) {\r\n const action = event.target.dataset['action'];\r\n if (this.onAnchorClick && action) {\r\n event.preventDefault();\r\n this.onAnchorClick(this.getOptions(action)); \r\n } \r\n }\r\n }\r\n\r\n private getOptions(action: string): EvaluateOptions {\r\n const event = {\r\n action: action\r\n };\r\n return {\r\n cacheable: false,\r\n extendContext: () => ({\r\n \"event\": event\r\n }),\r\n invokeArgs: [event]\r\n }\r\n }\r\n\r\n}\r\n","import {\r\n AfterViewInit, Directive, ElementRef, Input, OnChanges, OnDestroy, OnInit,\r\n Optional, SimpleChanges, SkipSelf,\r\n} from '@angular/core';\r\nimport { AbstractControl } from '@angular/forms';\r\nimport { BehaviorSubject, Subscription } from 'rxjs';\r\nimport { EvaluateOptions } from '../services/programmability.service';\r\n\r\nexport type SelectionMode = 'none' | 'single' | 'multiple';\r\n\r\nexport interface SelectionChangedEvent {\r\n controls: AbstractControl[];\r\n elements: HTMLElement[];\r\n}\r\n\r\n// Row element -> row control\r\nconst itemRegistry = new WeakMap<Element, AbstractControl>();\r\nconst ITEM_ATTR = 'data-selection-item';\r\n\r\n// Marks tabindex values set by the directive, so user-defined ones are never touched\r\nconst TAB_MARK = 'data-selection-tab';\r\n\r\n@Directive({\r\n selector: '[selectionGroup]',\r\n standalone: true,\r\n host: {\r\n '(click)': 'onActivate($event)',\r\n '(keydown.enter)': 'onActivate($event)',\r\n '(keydown.space)': 'onActivate($event)',\r\n },\r\n})\r\nexport class SelectionGroupDirective implements OnChanges, OnInit, AfterViewInit, OnDestroy {\r\n // Accept any string and fall back to 'none' for unknown values\r\n @Input()\r\n set selectionMode(value: string | null | undefined) {\r\n this._selectionMode = value === 'single' || value === 'multiple' ? value : 'none';\r\n }\r\n get selectionMode(): SelectionMode {\r\n return this._selectionMode;\r\n }\r\n private _selectionMode: SelectionMode = 'none';\r\n\r\n @Input() selectableClass: string | null | undefined = 'selectable';\r\n @Input() selectedClass: string | null | undefined = 'is-selected';\r\n\r\n @Input() onSelectionChanged?: (options?: EvaluateOptions) => void;\r\n\r\n //@Output() selectionChanged = new EventEmitter<SelectionChangedEvent>();\r\n\r\n // Emits whether selection is enabled for this group or any ancestor group\r\n readonly activeChange = new BehaviorSubject<boolean>(false);\r\n\r\n get isActive(): boolean {\r\n return this.activeChange.value;\r\n }\r\n\r\n private host: HTMLElement;\r\n private selected = new Set<HTMLElement>();\r\n private observer?: MutationObserver;\r\n private parentSub?: Subscription;\r\n\r\n constructor(\r\n elementRef: ElementRef<HTMLElement>,\r\n // Closest ancestor selection group, if any (e.g. the outer DynamicList)\r\n @Optional() @SkipSelf() private parentGroup: SelectionGroupDirective | null,\r\n ) {\r\n this.host = elementRef.nativeElement;\r\n this.host.setAttribute('data-selection', this._selectionMode);\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['selectionMode']) {\r\n this.host.setAttribute('data-selection', this.selectionMode);\r\n // Clear selection when it gets disabled\r\n if (this.selectionMode === 'none') this.clear();\r\n this.updateActive();\r\n }\r\n this.refreshTabIndex();\r\n }\r\n\r\n ngOnInit(): void {\r\n // Re-evaluate when an ancestor group toggles its selection\r\n this.parentSub = this.parentGroup?.activeChange.subscribe(() => this.updateActive());\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.refreshTabIndex();\r\n // Track items added/removed, class changes and nested groups toggling their mode\r\n this.observer = new MutationObserver(() => {\r\n this.pruneSelection();\r\n this.refreshTabIndex();\r\n });\r\n this.observer.observe(this.host, {\r\n subtree: true,\r\n childList: true,\r\n attributes: true,\r\n attributeFilter: ['class', 'data-selection'],\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.observer?.disconnect();\r\n this.parentSub?.unsubscribe();\r\n this.activeChange.complete();\r\n }\r\n\r\n onActivate(event: Event): void {\r\n const mode = this.selectionMode;\r\n if (mode === 'none') return;\r\n\r\n const item = (event.target as Element).closest<HTMLElement>(this.selector());\r\n // The item must belong to this group, not to a nested group with selection enabled\r\n if (!item || ownerOf(item) !== this.host) return;\r\n\r\n if (event instanceof KeyboardEvent) {\r\n // React only when focus is on the item itself, not on inputs inside it\r\n if (event.target !== item) return;\r\n event.preventDefault();\r\n }\r\n\r\n if (mode === 'single') {\r\n if (this.selected.has(item)) return;\r\n this.selected.forEach(el => this.mark(el, false));\r\n this.mark(item, true);\r\n } else {\r\n this.mark(item, !this.selected.has(item));\r\n }\r\n this.emit();\r\n }\r\n\r\n clear(): void {\r\n if (!this.selected.size) return;\r\n this.selected.forEach(el => this.mark(el, false));\r\n this.emit();\r\n }\r\n\r\n private updateActive(): void {\r\n const active = this.selectionMode !== 'none' || !!this.parentGroup?.isActive;\r\n if (active !== this.activeChange.value) {\r\n this.activeChange.next(active);\r\n }\r\n }\r\n\r\n // Drop selected elements that are no longer valid items of this group and notify the change\r\n private pruneSelection(): void {\r\n if (!this.selected.size) return;\r\n\r\n const selector = this.selector();\r\n let changed = false;\r\n\r\n for (const el of [...this.selected]) {\r\n const stillValid = el.isConnected\r\n && this.host.contains(el)\r\n && el.matches(selector)\r\n && ownerOf(el) === this.host;\r\n\r\n if (!stillValid) {\r\n // Remove the selected class too, in case the element is reattached later\r\n this.mark(el, false);\r\n changed = true;\r\n }\r\n }\r\n\r\n if (changed) this.emit();\r\n }\r\n\r\n // Make owned selectable items focusable, release the ones no longer owned\r\n private refreshTabIndex(): void {\r\n const owned = new Set(\r\n this.selectionMode === 'none'\r\n ? []\r\n : Array.from(this.host.querySelectorAll<HTMLElement>(this.selector()))\r\n .filter(el => ownerOf(el) === this.host),\r\n );\r\n\r\n owned.forEach(el => {\r\n if (!el.hasAttribute('tabindex')) {\r\n el.setAttribute('tabindex', '0');\r\n el.setAttribute(TAB_MARK, '');\r\n }\r\n });\r\n\r\n this.host.querySelectorAll<HTMLElement>(`[${TAB_MARK}]`).forEach(el => {\r\n const owner = ownerOf(el);\r\n // Leave it to another active group if one owns it now\r\n if (!owned.has(el) && (owner === null || owner === this.host)) {\r\n el.removeAttribute('tabindex');\r\n el.removeAttribute(TAB_MARK);\r\n }\r\n });\r\n }\r\n\r\n private selector(): string {\r\n return '.' + CSS.escape(normalize(this.selectableClass) || 'selectable');\r\n }\r\n\r\n private mark(el: HTMLElement, on: boolean): void {\r\n el.classList.toggle(normalize(this.selectedClass) || 'is-selected', on);\r\n on ? this.selected.add(el) : this.selected.delete(el);\r\n }\r\n\r\n private emit(): void {\r\n\r\n if (!this.onSelectionChanged) return;\r\n\r\n // Drop elements removed from the DOM in the meantime\r\n const elements = [...this.selected].filter(el => el.isConnected);\r\n\r\n // Resolve the control of the nearest row; dedupe if a row has several selectable elements\r\n const controls = new Set<AbstractControl>();\r\n for (const el of elements) {\r\n const row = el.closest(`[${ITEM_ATTR}]`);\r\n const control = row && itemRegistry.get(row);\r\n if (control) controls.add(control);\r\n }\r\n\r\n const event = {\r\n selectedItems: [...controls]\r\n };\r\n\r\n const options: EvaluateOptions = {\r\n extendContext: () => ({\r\n \"event\": event\r\n }),\r\n invokeArgs: [event]\r\n };\r\n\r\n this.onSelectionChanged(options);\r\n }\r\n}\r\n\r\n@Directive({\r\n selector: '[selectionItem]',\r\n standalone: true,\r\n})\r\nexport class SelectionItemDirective implements OnChanges, OnInit, OnDestroy {\r\n @Input() selectionItem: AbstractControl | null = null;\r\n\r\n private active = false;\r\n private sub?: Subscription;\r\n\r\n constructor(\r\n private elementRef: ElementRef<HTMLElement>,\r\n @Optional() private group: SelectionGroupDirective | null,\r\n ) { }\r\n\r\n ngOnChanges(): void {\r\n // The row control may be replaced\r\n this.update();\r\n }\r\n\r\n ngOnInit(): void {\r\n // Nothing to do outside a selection group\r\n if (!this.group) return;\r\n\r\n this.sub = this.group.activeChange.subscribe(active => {\r\n this.active = active;\r\n this.update();\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.sub?.unsubscribe();\r\n itemRegistry.delete(this.elementRef.nativeElement);\r\n }\r\n\r\n // Register only while selection is enabled for this row\r\n private update(): void {\r\n const el = this.elementRef.nativeElement;\r\n if (this.active && this.selectionItem) {\r\n itemRegistry.set(el, this.selectionItem);\r\n el.setAttribute(ITEM_ATTR, '');\r\n } else {\r\n itemRegistry.delete(el);\r\n el.removeAttribute(ITEM_ATTR);\r\n }\r\n }\r\n}\r\n\r\n// Nearest ancestor group with selection enabled\r\nfunction ownerOf(el: Element): Element | null {\r\n return el.parentElement?.closest('[data-selection]:not([data-selection=\"none\"])') ?? null;\r\n}\r\n\r\n// Accept both \"selectable\" and \".selectable\"\r\nfunction normalize(value: string | null | undefined): string {\r\n return (value ?? '').trim().replace(/^\\./, '');\r\n}\r\n","import {\r\n Component, Input, AfterViewInit, ViewChild, ViewContainerRef, Injector,\r\n Type, ComponentRef, OnChanges, SimpleChanges,\r\n OnDestroy,\r\n EventEmitter,\r\n DestroyRef,\r\n ChangeDetectionStrategy\r\n} from '@angular/core';\r\nimport { FormGroup, ControlValueAccessor } from '@angular/forms';\r\nimport { GlobalService } from '../services/global.service';\r\nimport { isObservable, Subscription, distinctUntilChanged, map } from 'rxjs';\r\nimport { take } from 'rxjs/operators';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\n\r\n@Component({\r\n selector: 'app-dynamic-host',\r\n templateUrl: './dynamic-host.component.html',\r\n styleUrls: [\r\n './dynamic-host.component.css'],\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n standalone: true\r\n})\r\nexport class DynamicHostComponent implements AfterViewInit, OnChanges, OnDestroy {\r\n @Input(\"register\") component!: any;\r\n @Input() properties: Record<string, any> | null = null;\r\n @Input() formGroup!: FormGroup;\r\n @ViewChild('container', { read: ViewContainerRef, static: true }) container!: ViewContainerRef;\r\n\r\n constructor(private injector: Injector,\r\n private globalService: GlobalService,\r\n private destroyRef: DestroyRef) {\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.statusSub) {\r\n this.statusSub.unsubscribe();\r\n }\r\n } \r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[\"properties\"]) {\r\n this.setProperties();\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n const componentType = this.resolveComponentType(this.component.component);\r\n if (componentType) {\r\n this.componentRef = this.container.createComponent(componentType, {\r\n injector: this.injector,\r\n });\r\n\r\n if (this.isBindable()) {\r\n this.setBinding();\r\n }\r\n \r\n this.setProperties();\r\n }\r\n }\r\n\r\n getComponentRef(): ComponentRef<any> | null {\r\n return this.componentRef;\r\n }\r\n\r\n //#region Private Members\r\n\r\n private componentRef: ComponentRef<any> | null = null;\r\n\r\n private statusSub: Subscription | null = null;\r\n\r\n private subscriptions = new Map<string, Subscription>();\r\n\r\n private isBindable(): boolean {\r\n if (!this.componentRef) return false;\r\n return this.component.isInput\r\n && this.component.key\r\n && this.isControlValueAccessor(this.componentRef.instance);\r\n }\r\n\r\n private setBinding() {\r\n if (!this.componentRef) return;\r\n\r\n const key = this.component.key;\r\n const instance = this.componentRef.instance;\r\n\r\n if (!this.isControlValueAccessor(instance)) return;\r\n\r\n let formControl = this.formGroup.get(key);\r\n\r\n if (!formControl) {\r\n return;\r\n }\r\n\r\n instance.writeValue(formControl.value);\r\n\r\n instance.registerOnChange((value: any) => {\r\n formControl.setValue(value);\r\n });\r\n\r\n instance.registerOnTouched(() => {\r\n formControl.markAsTouched();\r\n });\r\n\r\n const setDisabledState = instance.setDisabledState;\r\n\r\n if (typeof setDisabledState === 'function') {\r\n const invoke = setDisabledState.bind(instance);\r\n this.statusSub = formControl.statusChanges\r\n .pipe(\r\n map(() => formControl.disabled),\r\n distinctUntilChanged()\r\n )\r\n .subscribe(isDisabled => {\r\n invoke(isDisabled);\r\n });\r\n invoke(formControl.disabled);\r\n }\r\n }\r\n\r\n private setProperties(): void {\r\n if (!this.componentRef) return;\r\n const properties = this.properties ?? {};\r\n if (this.validProperties(properties)) {\r\n for (const key of Object.keys(properties)) {\r\n const value = properties[key];\r\n if (key in this.componentRef.instance) {\r\n this.assignValue(key, value);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private assignValue(key: string, value: any)\r\n {\r\n if (this.isFunction(value) && this.isEmitter(this.componentRef, key)) {\r\n const emitter = (this.componentRef!.instance as any)[key];\r\n const previous = this.subscriptions.get(key);\r\n previous?.unsubscribe();\r\n const sub = emitter\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(value);\r\n this.subscriptions.set(key, sub);\r\n }\r\n else {\r\n if (isObservable(value)) {\r\n value.pipe(take(1)).subscribe(v => {\r\n this.componentRef?.setInput?.(key, v);\r\n });\r\n } else {\r\n this.componentRef?.setInput?.(key, value);\r\n }\r\n } \r\n }\r\n\r\n private isControlValueAccessor(obj: any): obj is ControlValueAccessor {\r\n return (\r\n obj &&\r\n typeof obj.writeValue === 'function' &&\r\n typeof obj.registerOnChange === 'function' &&\r\n typeof obj.registerOnTouched === 'function'\r\n );\r\n }\r\n\r\n private resolveComponentType(type: string): Type<any> | null {\r\n return this.globalService.getComponent(type);\r\n }\r\n\r\n private validProperties(value: unknown): value is Record<string, any> {\r\n return typeof value === 'object' && value !== null && !Array.isArray(value);\r\n }\r\n\r\n private isEmitter(\r\n componentRef: ComponentRef<any> | null | undefined,\r\n key: string\r\n ): boolean {\r\n return !!componentRef &&\r\n (componentRef.instance as any)?.[key] instanceof EventEmitter;\r\n }\r\n\r\n private isFunction(value: any): value is Function {\r\n return typeof value === 'function';\r\n }\r\n\r\n //#endregion\r\n}\r\n","<ng-container #container></ng-container>\r\n","export function isMeaningful(x: any): boolean {\r\n if (x == null) return false; // null/undefined\r\n if (Array.isArray(x)) return x.length > 0; // empty array\r\n if (typeof x === 'string') return x.trim().length > 0; // empty string\r\n if (typeof x === 'object') return Object.keys(x).length > 0; // empty object\r\n return !!x; // number/boolean/other\r\n};\r\n","export interface FlatNode<T = any> {\r\n id: number;\r\n parentId: number | null;\r\n level: number;\r\n hasChildren: boolean;\r\n expanded: boolean;\r\n data: T;\r\n meta?: Record<string, any>;\r\n}\r\n\r\nexport function flattenTree<T>(\r\n nodes: unknown,\r\n options?: {\r\n children?: keyof T | ((node: T) => T[] | null | undefined);\r\n onCreate?: (flatNode: FlatNode<T>) => void;\r\n }\r\n): FlatNode<T>[] {\r\n\r\n if (nodes == null) {\r\n return [];\r\n }\r\n\r\n if (!Array.isArray(nodes)) {\r\n console.warn('Expected an array but received:', nodes);\r\n return [];\r\n }\r\n\r\n const result: FlatNode<T>[] = [];\r\n let idCounter = 1;\r\n\r\n const getChildren = (node: T): T[] => {\r\n const c = options?.children;\r\n\r\n if (!c) return [];\r\n\r\n if (typeof c === 'function') {\r\n return c(node) ?? [];\r\n }\r\n\r\n const children = (node as any)[c];\r\n return Array.isArray(children) ? children : [];\r\n };\r\n\r\n function visit(node: T, parentId: number | null, level: number) {\r\n const currentId = idCounter++;\r\n\r\n const children = getChildren(node);\r\n const hasChildren = children.length > 0;\r\n\r\n const flatNode: FlatNode<T> = {\r\n id: currentId,\r\n parentId,\r\n level,\r\n hasChildren,\r\n expanded: false,\r\n data: node\r\n };\r\n\r\n result.push(flatNode);\r\n\r\n options?.onCreate?.(flatNode);\r\n\r\n for (const child of children) {\r\n visit(child, currentId, level + 1);\r\n }\r\n }\r\n\r\n for (const root of nodes as T[]) {\r\n visit(root, null, 0);\r\n }\r\n\r\n return result;\r\n}","// True only for object literals / Object.create(null), not for arrays, dates, class instances\r\nexport function isPlainObject(value: unknown): value is Record<string, any> {\r\n if (value === null || typeof value !== 'object') {\r\n return false;\r\n }\r\n const proto = Object.getPrototypeOf(value);\r\n return proto === Object.prototype || proto === null;\r\n}\r\n","import { SirioValidationPresenter } from '@wemake4u/form-controls';\r\n\r\n/**\r\n * How the form player errors are shown by the @wemake4u/form-controls controls:\r\n * - `silent` errors (required fields not revealed yet) are hidden;\r\n * - errors flagged as `warning` are shown as Sirio warnings;\r\n * - the text is the `message` put in the errors by the ValidationService.\r\n */\r\nexport const formPlayerValidationPresenter: SirioValidationPresenter = (control) => {\r\n const errors = control.errors;\r\n if (!errors) {\r\n return null;\r\n }\r\n if (errors['silent']) {\r\n return { state: 'none' };\r\n }\r\n const message = typeof errors['message'] === 'string' ? errors['message'] : null;\r\n if (errors['warning']) {\r\n return { state: 'warning', message };\r\n }\r\n return message ? { state: 'invalid', message } : null;\r\n};\r\n","import { Injectable } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml, SafeResourceUrl } from '@angular/platform-browser';\r\nimport sanitizeHtml from 'sanitize-html';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SanitizeService {\r\n\r\n constructor(private sanitizer: DomSanitizer)\r\n {\r\n this.sanitizeOption = {\r\n allowedTags: sanitizeHtml.defaults.allowedTags.concat(['img']),\r\n allowedAttributes: {\r\n ...sanitizeHtml.defaults.allowedAttributes,\r\n '*': ['style', 'align', 'class', 'id', 'data-action']\r\n }\r\n };\r\n }\r\n\r\n sanitizeHtml(html: string): string {\r\n return sanitizeHtml(html, this.sanitizeOption);\r\n };\r\n\r\n sanitizeSafeHtml(html: string): SafeHtml {\r\n return this.sanitizer.bypassSecurityTrustHtml(this.sanitizeHtml(html));\r\n };\r\n\r\n sanitizeSafeUrl(url: string): SafeResourceUrl {\r\n return this.sanitizer.bypassSecurityTrustResourceUrl(url);\r\n }\r\n\r\n toString(safeHtml: SafeHtml): string {\r\n return this.sanitizer.sanitize(1, safeHtml) || '';\r\n }\r\n\r\n private sanitizeOption!: sanitizeHtml.IOptions;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport mimeDb from 'mime-db';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MimeService {\r\n\r\n constructor() { }\r\n\r\n getMimeTypes(extensions: string): string {\r\n return (extensions ?? \"\")\r\n .split(',')\r\n .map(ext => this.getMimeType(ext.trim()))\r\n .filter(mime => mime !== null)\r\n .join(', ');\r\n };\r\n\r\n private getMimeType(extension: string): string | null {\r\n const ext = extension.startsWith('.') ? extension.slice(1) : extension;\r\n for (const [mimeType, info] of Object.entries(mimeDb)) {\r\n if (info.extensions && info.extensions.includes(ext)) {\r\n return mimeType;\r\n }\r\n }\r\n return null;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AutoFocusService {\r\n\r\n private map = new WeakMap<object, boolean>();\r\n\r\n mark(target: object): void {\r\n this.map.set(target, true);\r\n }\r\n\r\n consume(target: object): boolean {\r\n const flag = this.map.get(target) === true;\r\n this.map.delete(target);\r\n return flag;\r\n }\r\n}\r\n","import { Component, Input, OnInit, ViewEncapsulation, ElementRef, AfterViewInit, OnChanges, SimpleChanges, ChangeDetectionStrategy, ChangeDetectorRef, DestroyRef, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { IDynamicFieldsComponent } from './dynamic-fields.interface';\r\nimport { FormGroup, FormArray, AbstractControl } from '@angular/forms';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { SafeHtml, SafeResourceUrl } from '@angular/platform-browser';\r\nimport { SanitizeService } from '../services/sanitize.service';\r\nimport { MarkdownService } from '../services/markdown.service';\r\nimport { MimeService } from '../services/mime.service';\r\nimport { ExtendContextFn, ProgrammabilityService, EvaluateOptions } from '../services/programmability.service';\r\nimport { ValidationService } from '../services/validation.service';\r\nimport { DialogService } from '../services/dialog.service';\r\nimport { WeakService } from '../services/weak.service';\r\nimport { RegisterService } from '../services/register.service';\r\nimport { MetadataService } from '../services/metadata.service';\r\nimport { GlobalService } from '../services/global.service';\r\nimport { FormService } from '../services/form.service';\r\nimport { GridService } from '../services/grid.service';\r\nimport { ChartService } from '../services/chart.service';\r\nimport { AutoFocusService } from '../services/autofocus.service';\r\nimport { ReadOnlyDirective } from '../directives/readonly.directive';\r\nimport { RecursionDirective } from '../directives/recursion.directive';\r\nimport { FrameSecurityDirective } from '../directives/framesecurity.directive';\r\nimport { GridDirective } from '../directives/grid.directive';\r\nimport { ChangeDirective, ObserveCallback } from '../directives/change.directive';\r\nimport { RegisterDirective } from '../directives/register.directive';\r\nimport { RefreshDirective } from '../directives/refresh.directive';\r\nimport { NavigatorStateDirective } from '../directives/navigator.directive';\r\nimport { CollapseDirective } from '../directives/collapse.directive';\r\nimport { TreeListDirective } from '../directives/treelist.directive';\r\nimport { FileHandlerDirective } from '../directives/file.directive';\r\nimport { JsonFileDirective } from '../directives/jsonfile.directive';\r\nimport { AttrsDirective } from '../directives/attrs.directive';\r\nimport { RequiredOnInputDirective } from '../directives/required.directive';\r\nimport { RequiredOnBlurDirective } from '../directives/requiredblur.directive';\r\nimport { MarkdownDirective } from '../directives/markdown.directive';\r\nimport { SelectionGroupDirective, SelectionItemDirective } from '../directives/selection.directive';\r\nimport { DynamicHostComponent } from '../dynamic-host/dynamic-host.component';\r\nimport { toExpression } from '../utils/feelable';\r\nimport { isMeaningful } from '../utils/isMeaningful';\r\nimport { isObservable, map, merge, Observable, of } from 'rxjs';\r\nimport { hasFieldFocus, setFocus } from '../utils/focusable';\r\nimport { FlatNode, flattenTree } from '../utils/flatten';\r\nimport { isPlainObject } from '../utils/typeGuards';\r\nimport { getTarget } from '../utils/proxy';\r\nimport { ToastService } from '../services/toast.service';\r\n\r\n\r\nimport { AgGridAngular } from 'ag-grid-angular';\r\nimport { Module, GridOptions } from 'ag-grid-community';\r\nimport { AgCharts } from \"ag-charts-angular\";\r\nimport { AgChartOptions } from 'ag-charts-community';\r\n\r\nimport { LanguageService } from '@wemake4u/interact';\r\nimport { Texts } from '../locale/locale';\r\nimport { localize } from '../locale/localize';\r\nimport { DynamicFormComponent } from '../dynamic-form/dynamic-form.component';\r\nimport { SirioCheckbox, SirioChecklist, SirioDate, SirioSlider, SirioDateTime, SirioTime, SirioNumber, SirioFileUpload, SirioBadgeTag, SirioButton, SirioButtonVariant, SirioCollapse, SirioCollapseToggle, SirioAlert, SirioAlertContent, SirioNotify, SirioNotifyContent, SirioInfoButton, SirioPagination, SirioTabs, SirioTab, SirioTabContent, SirioAccordion, SirioAccordionItem, SirioAccordionContent, SirioFileErrorEvent, SirioFileItem, SirioOption, SirioOptionLabel, SirioRadioGroup, SirioSelect, SirioSelectOptionEvent, SirioTextarea, SirioTextbox, SirioTextCase, provideSirioValidationPresenter } from '@wemake4u/form-controls';\r\nimport { formPlayerValidationPresenter } from '../services/sirio-validation-presenter';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormBuilderService } from '../services/builder.service';\r\n\r\n/** Empty option list (stable reference). */\r\nconst NO_SIRIO_OPTIONS: SirioOption[] = [];\r\n\r\n@Component({\r\n selector: 'app-dynamic-fields',\r\n templateUrl: './dynamic-fields.component.html',\r\n styleUrls: [\r\n './dynamic-fields.component.css',\r\n './styles/data-display.css',\r\n './styles/light-readonly.css',\r\n './styles/dynamiclist-table.css',\r\n './styles/dynamiclist-nav.css',\r\n './styles/tab.css',\r\n './styles/treelist.css',\r\n './styles/navigator.css'\r\n ],\r\n imports: [CommonModule, ReactiveFormsModule, FormsModule,\r\n ReadOnlyDirective, FrameSecurityDirective,\r\n RecursionDirective, GridDirective,\r\n ChangeDirective, RegisterDirective, RefreshDirective,\r\n CollapseDirective, TreeListDirective,\r\n RequiredOnInputDirective, RequiredOnBlurDirective, NavigatorStateDirective,\r\n FileHandlerDirective, JsonFileDirective,\r\n AttrsDirective, SelectionGroupDirective, SelectionItemDirective,\r\n MarkdownDirective,\r\n SirioTextbox, SirioNumber, SirioTextarea, SirioCheckbox, SirioChecklist, SirioRadioGroup, SirioSelect, SirioOptionLabel, SirioDate, SirioTime, SirioDateTime, SirioSlider, SirioFileUpload, SirioBadgeTag, SirioButton, SirioCollapse, SirioCollapseToggle, SirioAlert, SirioAlertContent, SirioNotify, SirioNotifyContent, SirioInfoButton, SirioPagination, SirioTabs, SirioTab, SirioTabContent, SirioAccordion, SirioAccordionItem, SirioAccordionContent,\r\n DynamicHostComponent,\r\n AgGridAngular, AgCharts],\r\n providers: [\r\n RegisterService,\r\n ProgrammabilityService,\r\n GridService,\r\n ChartService,\r\n provideSirioValidationPresenter(formPlayerValidationPresenter)\r\n ],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class DynamicFieldsComponent implements OnInit, OnChanges, AfterViewInit, IDynamicFieldsComponent {\r\n @Input() form!: DynamicFormComponent;\r\n @Input() rows: Array<any> | undefined;\r\n @Input() formGroup!: FormGroup;\r\n @Input() alignment: string = \"\";\r\n @Input() readOnly: boolean | null = null;\r\n @Input() recursionLevel: number = 0;\r\n @Input() identity!: string;\r\n @Input() identityIndex?: number;\r\n @Input() disableAutoFocus?: boolean;\r\n\r\n Texts = Texts;\r\n\r\n private readonly toastService = inject(ToastService);\r\n\r\n constructor(private cdr: ChangeDetectorRef\r\n , private destroyRef: DestroyRef\r\n , private sanitizer: SanitizeService\r\n , private markdown: MarkdownService\r\n , private mime: MimeService\r\n , private programmability: ProgrammabilityService\r\n , private validation: ValidationService\r\n , private weak: WeakService\r\n , private register: RegisterService\r\n , private metadata: MetadataService\r\n , private languageService: LanguageService\r\n , private global: GlobalService\r\n , private formService: FormService\r\n , private grid: GridService\r\n , private chart: ChartService\r\n , private dialog: DialogService\r\n , private autoFocus: AutoFocusService\r\n , private formBuilder: FormBuilderService\r\n , private el: ElementRef\r\n ) {\r\n \r\n }\r\n\r\n ngOnInit(): void {\r\n this.register.identify(this.identity, this.identityIndex);\r\n\r\n this.programmability.addEvaluatorProviders(this.form);\r\n\r\n merge(\r\n this.programmability.evaluationDone.changes,\r\n this.validation.validationDone.changes,\r\n this.form.refreshed)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => {\r\n this.cdr.markForCheck();\r\n });\r\n \r\n this.suppressRequiredIndicator =\r\n this.global.getProperty(\"suppressRequiredIndicator\", \"off\") === \"on\";\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['formGroup']) {\r\n this.programmability.invalidateAll();\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n if (this.autoFocus.consume(this.formGroup)) {\r\n if (this.disableAutoFocus !== true) {\r\n setTimeout(() => {\r\n const el = this.el.nativeElement as HTMLElement;\r\n if (!hasFieldFocus(el))\r\n setFocus(el);\r\n });\r\n }\r\n }\r\n }\r\n\r\n getRegister(): RegisterService {\r\n return this.register;\r\n }\r\n\r\n getTextFeedback(component: any): string {\r\n const control = this.formService.getControl(this.formGroup, [component.path, component.key]);\r\n return !control || control.valid || !control.errors\r\n ? ''\r\n : control.errors['message'];\r\n }\r\n\r\n isWarning(component: any): boolean {\r\n const control = this.formService.getControl(this.formGroup, [component.path, component.key]);\r\n return (control && control.errors && control.errors['warning']) || false\r\n }\r\n\r\n locale(component: any, key: string): string {\r\n return localize(this.language, component, key);\r\n }\r\n\r\n evaluateString(value: string | null | undefined): string {\r\n return this.programmability.evaluateString(this.formGroup, value);\r\n }\r\n\r\n evaluateBoolean(value: boolean | string | null | undefined): boolean | null {\r\n return this.programmability.evaluateBoolean(this.formGroup, value);\r\n }\r\n\r\n evaluateNumber(value: number | string | null | undefined): number | null {\r\n return this.programmability.evaluateNumber(this.formGroup, value);\r\n }\r\n\r\n evaluateLabel(value: string | null, component: any): string {\r\n const label = this.asString(this.programmability.evaluateString(this.formGroup, value));\r\n\r\n const required = component?.validate?.required;\r\n\r\n const readOnly = this.readOnly || this.evaluateBoolean(component.readonly); \r\n\r\n if (this.suppressRequiredIndicator)\r\n return label;\r\n\r\n const trimmed = label?.trim();\r\n\r\n const shouldAppendAsterisk =\r\n required &&\r\n !readOnly &&\r\n !!trimmed &&\r\n !trimmed.endsWith('*');\r\n\r\n return shouldAppendAsterisk ? `${label}*` : label;\r\n }\r\n\r\n evaluateUrl(value: string | null): SafeResourceUrl {\r\n const url = this.programmability.evaluateString(this.formGroup, value);\r\n const watchKey = `:safeUrl(${url})`;\r\n return this.weak.call(this.formGroup, watchKey, () => {\r\n return this.sanitizer.sanitizeSafeUrl(url);\r\n });\r\n }\r\n\r\n evaluateSize(value: number | string | null): string | null {\r\n if (typeof value === \"number\") {\r\n return value + \"px\";\r\n }\r\n else if (typeof value === \"string\") {\r\n const result = this.programmability.evaluate(this.formGroup, value);\r\n if (typeof result === \"number\") {\r\n return result + \"px\";\r\n }\r\n return result;\r\n }\r\n return null;\r\n }\r\n\r\n evaluateTemplate(value: string | null): string {\r\n return this.programmability.evaluateTemplate(this.formGroup, value);\r\n }\r\n\r\n evaluate(text: string | null, cacheable: boolean = true, extendContext?: ExtendContextFn): any {\r\n return this.programmability.evaluate(this.formGroup, text, {\r\n cacheable: cacheable,\r\n extendContext: extendContext\r\n });\r\n }\r\n\r\n /** Button color of the schema → variant of wmSirioButton (unknown or empty → primary). */\r\n evaluateVariant(value: string | null): SirioButtonVariant {\r\n const color = this.evaluateString(value);\r\n const variants: SirioButtonVariant[] = ['primary', 'secondary', 'tertiary', 'tertiary-light', 'ghost', 'danger'];\r\n return variants.includes(color as SirioButtonVariant) ? (color as SirioButtonVariant) : 'primary';\r\n }\r\n\r\n evaluateConditional(conditional: any): boolean {\r\n const hide = this.evaluateBoolean(conditional?.hide);\r\n const show = this.evaluateBoolean(conditional?.show);\r\n\r\n return !(hide === true || show === false);\r\n }\r\n\r\n evaluateWithEvent(text: string | null, event: any): any {\r\n return this.programmability.evaluate(this.formGroup, text, this.getEventOptions(event));\r\n }\r\n\r\n evaluateWithEventAsBoolean(text: string | null, event?: any, defaultValue?: boolean): any { \r\n return this.programmability.evaluateBoolean(this.formGroup, text, this.getEventOptions(event)) ?? defaultValue;\r\n }\r\n\r\n evaluateWithEventAsString(text: string | null, event?: any, defaultValue?: string): string {\r\n return this.programmability.evaluateString(this.formGroup, text, this.getEventOptions(event)) ?? defaultValue;\r\n }\r\n\r\n evaluateWithEventAsHandler(text: string | null, event: any): any {\r\n return this.programmability.evaluate(this.formGroup, text, { ...this.getEventOptions(event), cacheable: false });\r\n }\r\n\r\n evaluateWithHydratation(text: string | null): any {\r\n return this.programmability.evaluate(this.formGroup, text, {\r\n hydrate: true\r\n });\r\n }\r\n\r\n shouldRender(component: any): boolean {\r\n return this.canShow(component)\r\n || !component.conditional?.collapseWhenHidden;\r\n }\r\n\r\n canShow(component: any): boolean {\r\n const show = this.evaluateBoolean(component.conditional?.show) !== false;\r\n const hide = this.evaluateBoolean(component.conditional?.hide) === true;\r\n return show && !hide;\r\n }\r\n\r\n getTreeColumns(component: any): any {\r\n const columns = component.columns\r\n || this.evaluate(component.columnsExpression)\r\n || [];\r\n\r\n return columns;\r\n }\r\n\r\n getTreeSource(component: any): Observable<FlatNode<any>[]> {\r\n const watchKey = `:evaluateTree(${component.dataSource})`;\r\n return this.weak.call(this.formGroup, watchKey, () => {\r\n const result = this.programmability.evaluate(this.formGroup, component.dataSource, {\r\n cacheable: true,\r\n cacheInvalidated: () => this.weak.invalidate(this.formGroup, watchKey)\r\n }); \r\n const toFlat = (data: any) => flattenTree(data, {\r\n children: this.evaluate(component.children),\r\n onCreate: node => {\r\n if (!component.row || typeof component.row !== 'object') {\r\n return;\r\n }\r\n node.expanded = this.evaluateWithEventAsBoolean(component.row?.expanded, node);\r\n node.meta = {\r\n cssClass: this.evaluateWithEventAsBoolean(component.row?.cssClass, node)\r\n };\r\n }\r\n });\r\n if (isObservable(result)) {\r\n return result.pipe(map(toFlat));\r\n }\r\n return of(toFlat(result));\r\n });\r\n }\r\n\r\n getTemplate(value: string): any {\r\n return this.metadata.getFormByName(value);\r\n }\r\n\r\n getFormGroup(control: AbstractControl | null): FormGroup {\r\n if (!(control instanceof FormGroup)) {\r\n throw new Error('Control is not a FormGroup');\r\n }\r\n return control;\r\n }\r\n\r\n getFormArray(control: AbstractControl | null): FormArray {\r\n if (!(control instanceof FormArray)) {\r\n throw new Error('Control is not a FormArray');\r\n }\r\n return control;\r\n }\r\n\r\n resolvePath(path: string | null): FormGroup {\r\n return this.getFormGroup(this.getControlFromPath(path))\r\n }\r\n\r\n resolveBoundGroup(component: any): FormGroup | null {\r\n const bindTo: string | undefined = component.bindTo?.trim();\r\n\r\n if (!bindTo) {\r\n return this.resolvePath(component.path);\r\n }\r\n\r\n return this.programmability.evaluate(this.formGroup, bindTo, {\r\n cacheable: true, \r\n transform: (value) => {\r\n //const target = this.navigatePath(getTarget(value), component.path);\r\n const target = getTarget(value);\r\n return this.prepareGroup(target, component);\r\n }\r\n });\r\n }\r\n \r\n toHTML(text: string): SafeHtml {\r\n const watchKey = `:safeHtml(${text})`;\r\n return this.weak.call(this.formGroup, watchKey, () => {\r\n const html = this.markdown.toHtml(text);\r\n return this.sanitizer.sanitizeSafeHtml(html);\r\n });\r\n };\r\n\r\n /** Markdown rendered as inline HTML (no <p>), for content placed inside a <label>. */\r\n toInlineHTML(text: string): SafeHtml {\r\n const watchKey = `:safeInlineHtml(${text})`;\r\n return this.weak.call(this.formGroup, watchKey, () => {\r\n const html = this.markdown.toInlineHtml(text);\r\n return this.sanitizer.sanitizeSafeHtml(html);\r\n });\r\n };\r\n\r\n sanitize(html: string): SafeHtml {\r\n return this.sanitizer.sanitizeSafeHtml(html);\r\n };\r\n\r\n getMimeTypes(extensions: string): string {\r\n return this.mime.getMimeTypes(extensions);\r\n };\r\n\r\n clickButton(component: any, event: any) {\r\n if (component.click) {\r\n this.evaluate(component.click, false);\r\n }\r\n }\r\n\r\n hasValues(component: any): boolean {\r\n if (!component) return false;\r\n const { values, valuesKey, valuesExpression } = component;\r\n return (\r\n isMeaningful(values) ||\r\n isMeaningful(valuesKey) ||\r\n isMeaningful(valuesExpression)\r\n );\r\n }\r\n\r\n getValues(component: any): Observable<any> {\r\n if (component.values) {\r\n // Static\r\n return of(component.values);\r\n }\r\n else if (component.valuesKey) {\r\n // Field value\r\n const result = this.evaluate(component.valuesKey);\r\n return this.getAsObservable(result);\r\n }\r\n else if (component.valuesExpression) {\r\n // Expression\r\n const result = this.evaluate(component.valuesExpression);\r\n return this.getAsObservable(result);\r\n }\r\n else {\r\n // Nothing\r\n return this.noData;\r\n }\r\n }\r\n\r\n private readonly sirioOptionsCache = new WeakMap<object, { language: string; options: SirioOption[] }>();\r\n\r\n /**\r\n * Values of a component ({ value, label }) as options of the @wemake4u/form-controls controls, with the\r\n * localized label. The same array is returned for the same source and language, so change detection\r\n * does not re-render the options.\r\n */\r\n sirioOptions(values: any[] | null | undefined): SirioOption[] {\r\n if (!Array.isArray(values)) {\r\n return NO_SIRIO_OPTIONS;\r\n }\r\n const cached = this.sirioOptionsCache.get(values);\r\n if (cached && cached.language === this.language) {\r\n return cached.options;\r\n }\r\n const options = values.map((item) => ({ value: item?.value, label: this.locale(item, 'label') }));\r\n this.sirioOptionsCache.set(values, { language: this.language, options });\r\n return options;\r\n }\r\n\r\n /** \"n selected\" text of the multiple selects (taglist), in the current language. */\r\n readonly sirioSelectionSummary = (count: number): string =>\r\n `${count} ${this.locale(Texts, count === 1 ? 'Selected' : 'SelectedPlural')}`;\r\n\r\n refreshValues(component: any): () => void {\r\n return () => {\r\n if (component.valuesKey) {\r\n this.invalidate(component.valuesKey);\r\n }\r\n else if (component.valuesExpression) {\r\n this.invalidate(component.valuesExpression);\r\n }\r\n };\r\n }\r\n\r\n toLabel(value: any, list: Array<{ label: string; value: any }>): any {\r\n if (!list || !Array.isArray(list) || list.length === 0) {\r\n return value;\r\n }\r\n const getLabel = (value: any) => {\r\n const item = list.find(x => x.value === value);\r\n return item ? item.label : value;\r\n }\r\n if (Array.isArray(value)) {\r\n return value.map(v => getLabel(v)).join(', ');\r\n }\r\n else {\r\n return getLabel(value);\r\n }\r\n }\r\n\r\n supportValues(component: any): boolean {\r\n if (!component) return false;\r\n return component.fieldtype === 'select' || component.fieldtype === 'taglist';\r\n }\r\n\r\n getChartOptions(component: any): Observable<AgChartOptions> {\r\n return this.weak.call(component, `getChartOptions_${this.language}`\r\n , () => this.chart.getOptions(component, this.formGroup));\r\n }\r\n\r\n invalidateChart(component: any): ObserveCallback {\r\n return () => {\r\n this.weak.invalidate(component, `getChartOptions_${this.language}`);\r\n };\r\n }\r\n\r\n getChartData(component: any): any {\r\n const expression = this.chart.getDataExpression(component);\r\n return this.programmability.evaluate(this.formGroup, expression);\r\n }\r\n\r\n getGridOptions(component: any): GridOptions {\r\n return this.weak.call(component, this.grid.getCacheKey()\r\n , () => this.grid.getOptions(component, this.formGroup));\r\n }\r\n\r\n getGridModules(component: any): Module[] {\r\n return this.weak.call(component, 'getGridModules', () => this.grid.getModules());\r\n }\r\n\r\n onGridSelectionChanged(component: any, event: any) {\r\n this.grid.onSelectionChanged(component, this.formGroup, event);\r\n }\r\n\r\n getRowSource(component: any): any {\r\n if (component.dataSource) {\r\n // Expression\r\n return this.evaluate(component.dataSource, true);\r\n }\r\n else {\r\n // Nothing\r\n return this.noData;\r\n }\r\n }\r\n\r\n /**\r\n * `selectionChanged` expression of a select, run when the user chooses an option. The expression\r\n * gets `event` = { selectedOption: { value, label } }, as with the ngx-sirio-lib dropdown directive.\r\n */\r\n selectionChanged(component: any, event: SirioSelectOptionEvent<unknown>): void {\r\n if (!component.selectionChanged) return;\r\n const payload = { selectedOption: { value: event.option.value, label: event.option.label } };\r\n this.programmability.evaluate(this.formGroup, component.selectionChanged, {\r\n cacheable: false,\r\n extendContext: () => ({ \"event\": payload }),\r\n invokeArgs: [payload]\r\n });\r\n }\r\n\r\n callExpression(expression: any): (() => void) | undefined {\r\n if (!expression) return undefined;\r\n\r\n const evaluate = (options?: EvaluateOptions) => {\r\n return this.programmability.evaluate(this.formGroup, expression, {\r\n ...options,\r\n cacheable: false\r\n })\r\n }\r\n\r\n return (options?: EvaluateOptions) => evaluate(options);\r\n }\r\n\r\n refreshRowSource(component: any): () => void {\r\n return () => {\r\n if (component.dataSource) {\r\n this.invalidate(component.dataSource);\r\n }\r\n };\r\n }\r\n\r\n addItem(formArray: FormArray, state: NavigatorStateDirective) {\r\n const addedItem = new FormGroup({});\r\n formArray.push(addedItem);\r\n this.autoFocus.mark(addedItem);\r\n setTimeout(() => state.index = state.total - 1);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n removeItem(formArray: FormArray, index: number, withConfirm: boolean, state: NavigatorStateDirective) {\r\n if (withConfirm) {\r\n this.dialog.confirm(this.locale(Texts, 'ConfirmDelete'), {\r\n \"title\": this.locale(Texts, 'Confirm'),\r\n \"buttons\": \"ConfirmCancel\",\r\n \"onResult\": (result) => {\r\n if (result.action === \"Yes\") {\r\n formArray.removeAt(index);\r\n setTimeout(() => state.index = Math.min(state.index, state.total - 1));\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n });\r\n }\r\n else {\r\n formArray.removeAt(index);\r\n }\r\n }\r\n\r\n moveUpItem(formArray: FormArray, index: number) {\r\n const control: AbstractControl = formArray.at(index);\r\n formArray.removeAt(index);\r\n formArray.insert(index - 1, control);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n moveDownItem(formArray: FormArray, index: number) {\r\n const control: AbstractControl = formArray.at(index);\r\n formArray.removeAt(index);\r\n formArray.insert(index + 1, control);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Expressions can remove a chosen file with `file.remove()` (as with the ngx-sirio-lib file upload):\r\n * the method is added to the files chosen in the picker.\r\n */\r\n filesAdded(files: File[], picker: SirioFileUpload) {\r\n for (const file of files) {\r\n if ('remove' in file)\r\n continue;\r\n Object.defineProperty(file, 'remove', {\r\n value: function (this: File) {\r\n const control = picker.control();\r\n const value = control?.value;\r\n if (Array.isArray(value))\r\n control!.setValue(value.filter((f: SirioFileItem) => f !== this));\r\n },\r\n writable: false,\r\n enumerable: false\r\n });\r\n }\r\n }\r\n\r\n /** Failed upload/delete/download of the file picker: the message is also shown as a toast. */\r\n fileError(event: SirioFileErrorEvent) {\r\n console.error(event.error);\r\n const message = event.error instanceof Error ? event.error.message : null;\r\n if (message)\r\n this.toastService.notifyError(message);\r\n }\r\n\r\n getFeelableProperties(component: any): Record<string, any> | null {\r\n const properties = component.properties;\r\n if (typeof properties === 'object' && properties !== null && !Array.isArray(properties)) {\r\n const feelable = toExpression(properties);\r\n return this.programmability.evaluate(this.formGroup, feelable);\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n\r\n getGroupOutline(component: any) {\r\n return {\r\n 'group-outline': component.showOutline === true\r\n };\r\n }\r\n\r\n getFormClass() {\r\n return {\r\n [\"df-components\"]: true,\r\n [\"valign-start\"]: this.alignment === 'start',\r\n [\"valign-center\"]: this.alignment === 'center',\r\n [\"valign-end\"]: this.alignment === 'end'\r\n }\r\n }\r\n\r\n getComponentClass(component: any) {\r\n const classes = {\r\n [\"col-host\"]: true,\r\n [\"col-md-\" + component.layout?.columns]: (component.layout?.columns),\r\n [\"col\"]: !(component.layout?.columns),\r\n [`df-field-${component.type}`]: true,\r\n [\"component-start\"]: component.selfAlignment === 'start',\r\n [\"component-center\"]: component.selfAlignment === 'center',\r\n [\"component-end\"]: component.selfAlignment === 'end'\r\n }\r\n this.applyCssClasses(classes, component.cssClass);\r\n return classes;\r\n }\r\n\r\n getComponentStyle(component: any): { [key: string]: string } | null {\r\n\r\n const styles = {};\r\n\r\n if (!this.applyInlineStyles(styles, component.inlineStyle))\r\n return null;\r\n\r\n return styles;\r\n }\r\n\r\n getComponentAttrs(component: any) {\r\n const attrs = {};\r\n\r\n if (!this.applyInlineAttrs(attrs, component.attrs))\r\n return null;\r\n\r\n return attrs; \r\n }\r\n\r\n getClass(component: any) {\r\n const classes = {}\r\n this.applyCssClasses(classes, component.cssClass);\r\n return classes;\r\n }\r\n\r\n getStyle(component: any): { [key: string]: string } | null {\r\n const styles = {};\r\n if (!this.applyInlineStyles(styles, component.inlineStyle))\r\n return null;\r\n return styles;\r\n }\r\n\r\n /**\r\n * Placeholder of a @wemake4u/form-controls control: \"-\" when read-only in light mode (what the\r\n * ReadOnlyDirective does on the ngx-sirio-lib inputs), otherwise the localized placeholder.\r\n */\r\n sirioPlaceholder(component: any): string {\r\n const readonly = this.readOnly || this.evaluateBoolean(component.readonly);\r\n if (readonly === true && this.useLightReadonly(component)) {\r\n return '-';\r\n }\r\n return this.locale(component, 'placeholder') || '';\r\n }\r\n\r\n private useLightReadonly(component: any): boolean {\r\n const value = component.properties?.useLightReadonly\r\n || this.global.getProperty('useLightReadonly', 'yes');\r\n return value !== 'yes' && value !== 'no' ? true : value === 'yes';\r\n }\r\n\r\n /** Form player text case ('uppercase' / 'lowercase') to the @wemake4u/form-controls one. */\r\n toTextCase(textCase: string | null | undefined): SirioTextCase {\r\n switch (textCase) {\r\n case 'uppercase': return 'upper';\r\n case 'lowercase': return 'lower';\r\n default: return 'none';\r\n }\r\n }\r\n\r\n getHorizontalAlignment(component: any) {\r\n const alignment = component.horizontalAlignment;\r\n const ruleName = \"horizontal\";\r\n return {\r\n [`${ruleName}-left`]: alignment === 'left',\r\n [`${ruleName}-center`]: alignment === 'center',\r\n [`${ruleName}-right`]: alignment === 'right',\r\n [`${ruleName}-fill`]: alignment === 'fill'\r\n };\r\n }\r\n\r\n getJustify(align: string | undefined): string {\r\n switch (align) {\r\n case 'right': return 'flex-end';\r\n case 'center': return 'center';\r\n default: return 'flex-start'\r\n }\r\n }\r\n\r\n getLightView(component: any): string {\r\n const className = 'light-view';\r\n const value = component.properties?.useLightReadonly\r\n || this.global.getProperty(\"useLightReadonly\", \"yes\");\r\n if (value !== \"yes\" && value !== \"no\")\r\n return className;\r\n return (value === \"yes\") ? className : \"\";\r\n }\r\n\r\n getPanels(component: any): Observable<any> {\r\n if (component.panels) {\r\n // Static\r\n return of(component.panels);\r\n }\r\n else if (component.panelsExpression) {\r\n // Expression\r\n const result = this.evaluate(component.panelsExpression);\r\n return this.getAsObservable(result);\r\n }\r\n else {\r\n // Nothing\r\n return this.noData;\r\n }\r\n }\r\n\r\n isTextOverflow(el: HTMLElement): boolean {\r\n return el.scrollWidth > el.clientWidth;\r\n }\r\n\r\n private noData: Observable<any> = of([]);\r\n\r\n private suppressRequiredIndicator: boolean = false;\r\n\r\n private get language(): string {\r\n return this.languageService.getLanguage();\r\n }\r\n\r\n private invalidate(text: string | null): void {\r\n return this.programmability.invalidate(text);\r\n }\r\n\r\n private getEventOptions(value: any): EvaluateOptions {\r\n if (value == null)\r\n return {};\r\n\r\n const options: EvaluateOptions = {\r\n extendContext: () => ({\r\n \"event\": value\r\n }),\r\n invokeArgs: [value]\r\n };\r\n return options;\r\n }\r\n\r\n private getControlFromPath(path: string | null): AbstractControl | null {\r\n const control = path\r\n ? this.formGroup.get(path)\r\n : this.formGroup;\r\n\r\n if (!control) {\r\n throw new Error(`FormGroup does not contain a control with path '${path}'`, { cause: this.formGroup });\r\n }\r\n return control;\r\n }\r\n\r\n private getAsObservable(value: any): Observable<any> {\r\n if (isObservable(value))\r\n return value;\r\n return of(value);\r\n }\r\n\r\n private applyCssClasses(target: Record<string, boolean>, cssClass: any): boolean {\r\n\r\n if (!cssClass)\r\n return false;\r\n\r\n var cssValue = this.evaluate(cssClass);\r\n\r\n if (!cssValue)\r\n return false;\r\n\r\n let classes: string[] = [];\r\n\r\n if (typeof cssValue === 'string') {\r\n classes = cssValue.split(/\\s+/);\r\n }\r\n else if (Array.isArray(cssClass)) {\r\n classes = cssValue;\r\n }\r\n else {\r\n return false;\r\n }\r\n\r\n if (classes.length == 0)\r\n return false;\r\n\r\n classes\r\n .filter(c => typeof c === 'string' && c.trim().length > 0)\r\n .forEach(cls => target[cls] = true);\r\n\r\n return true;\r\n }\r\n\r\n private applyInlineStyles(target: Record<string, any>, style: any): boolean {\r\n return this.applyOnTarget(target, style); \r\n }\r\n\r\n private applyInlineAttrs(target: Record<string, any>, attributes: any): boolean {\r\n return this.applyOnTarget(target, attributes); \r\n }\r\n\r\n private applyOnTarget(target: Record<string, any>, value: any): boolean {\r\n\r\n if (!value)\r\n return false;\r\n\r\n const evaluated = this.evaluate(value);\r\n\r\n if (!evaluated)\r\n return false;\r\n\r\n let container: Record<string, any> | null = null;\r\n\r\n if (typeof evaluated === 'string') {\r\n container = {};\r\n\r\n evaluated\r\n .split(';')\r\n .map(s => s.trim())\r\n .filter(Boolean)\r\n .forEach(rule => {\r\n const [key, value] = rule.split(':').map(p => p.trim());\r\n if (key && value) {\r\n container![key] = value;\r\n }\r\n });\r\n }\r\n else if (typeof evaluated === 'object' && !Array.isArray(evaluated)) {\r\n container = Object.fromEntries(\r\n Object.entries(evaluated)\r\n .filter(([_, v]) => v != null)\r\n );\r\n }\r\n\r\n if (!container || Object.keys(container).length === 0)\r\n return false;\r\n\r\n Object.assign(target, container);\r\n return true;\r\n }\r\n\r\n private asString(value: unknown): string {\r\n\r\n if (value == null)\r\n return '';\r\n\r\n if (typeof value === 'string')\r\n return value;\r\n\r\n if (typeof value === 'object')\r\n return '';\r\n\r\n return String(value);\r\n }\r\n\r\n private prepareGroup(value: any, component: any): FormGroup | null\r\n {\r\n const target = getTarget(value);\r\n\r\n const rows = component.rows ?? [];\r\n\r\n // Existing FormGroup: register the component rows into it\r\n if (target instanceof FormGroup) {\r\n const group = this.formBuilder.buildRows(target, rows, { path: component.path });\r\n return group;\r\n }\r\n\r\n // Plain object: build a new FormGroup from the rows and fill it with the object's values\r\n if (isPlainObject(target)) {\r\n const group = new FormGroup({});\r\n const currentGroup = this.formBuilder.buildRows(group, rows, { path: component.path });\r\n this.formService.patch(group, target);\r\n return currentGroup;\r\n }\r\n\r\n // Any other value (null, primitives, arrays, other controls) is not resolvable\r\n return null;\r\n }\r\n}\r\n","<div [ngClass]=\"getFormClass()\">\r\n <ng-container *ngFor=\"let row of rows\" [formGroup]=\"formGroup\">\r\n <div class=\"row field-set\">\r\n <ng-container *ngFor=\"let component of row.components\">\r\n <ng-container [ngSwitch]=\"component.type\">\r\n <div [ngClass]=\"getComponentClass(component)\"\r\n [style]=\"getComponentStyle(component)\"\r\n [ngAttrs]=\"getComponentAttrs(component)\"\r\n *ngIf=\"shouldRender(component)\">\r\n <div *ngIf=\"canShow(component)\">\r\n <!-- #region textfield -->\r\n <ng-container *ngSwitchCase=\"'textfield'\" [formGroup]=\"resolvePath(component.path)\">\r\n <!-- @wemake4u/form-controls: errors/warnings come from the validation presenter (see providers). -->\r\n <wm-sirio-textbox type=\"text\"\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel')) || null\"\r\n [label]=\"evaluateLabel(locale(component, 'label'), component)\"\r\n [info]=\"evaluateString(locale(component, 'tooltip')) || null\"\r\n [placeholder]=\"sirioPlaceholder(component)\"\r\n [helpText]=\"evaluateString(locale(component, 'description'))\"\r\n [prefix]=\"evaluateString(component.appearance?.prefixAdorner) || ''\"\r\n [suffix]=\"evaluateString(component.appearance?.suffixAdorner) || ''\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n [textCase]=\"toTextCase(component.textCase)\"\r\n [maxlength]=\"evaluateNumber(component.maxLength)\"\r\n [textAlign]=\"component.textAlign || null\"\r\n [requiredOnInput]=\"component.validate?.required\"\r\n [requiredOnBlur]=\"component.validate?.required\"\r\n [valueSync]=\"component.valueSync\"\r\n #textfield\r\n [register]=\"component\"\r\n [componentRef]=\"textfield\">\r\n </wm-sirio-textbox>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region select -->\r\n <ng-container *ngSwitchCase=\"'select'\" [formGroup]=\"resolvePath(component.path)\">\r\n <!-- @wemake4u/form-controls: strict = the value must be one of the options (was the dropdown directive);\r\n searchable shows the selection in the search field (was prefillSearch).\r\n Errors/warnings come from the validation presenter. -->\r\n <wm-sirio-select\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel')) || null\"\r\n [label]=\"evaluateLabel(locale(component, 'label'), component)\"\r\n [info]=\"evaluateString(locale(component, 'tooltip')) || null\"\r\n [placeholder]=\"sirioPlaceholder(component)\"\r\n [helpText]=\"evaluateString(locale(component, 'description'))\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n [options]=\"sirioOptions(getValues(component) | async)\"\r\n [searchable]=\"component.searchable\"\r\n [strict]=\"true\"\r\n (optionSelected)=\"selectionChanged(component, $event)\"\r\n [refresh]=\"refreshValues(component)\"\r\n [valueSync]=\"component.valueSync\"\r\n [requiredOnBlur]=\"component.validate?.required\"\r\n #select\r\n [register]=\"component\"\r\n [componentRef]=\"select\">\r\n </wm-sirio-select>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region taglist -->\r\n <ng-container *ngSwitchCase=\"'taglist'\" [formGroup]=\"resolvePath(component.path)\">\r\n <!-- @wemake4u/form-controls: multiple select with \"select all\" and the \"n selected\" summary\r\n (was the tag directive). Errors/warnings come from the validation presenter. -->\r\n <wm-sirio-select\r\n multiple\r\n selectAll\r\n [selectAllLabel]=\"locale(Texts, 'SelectAll')\"\r\n [maxVisibleSelections]=\"component.maxVisibleTags\"\r\n [selectionSummary]=\"sirioSelectionSummary\"\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel')) || null\"\r\n [label]=\"evaluateLabel(locale(component, 'label'), component)\"\r\n [info]=\"evaluateString(locale(component, 'tooltip')) || null\"\r\n [placeholder]=\"sirioPlaceholder(component)\"\r\n [helpText]=\"evaluateString(locale(component, 'description'))\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n [options]=\"sirioOptions(getValues(component) | async)\"\r\n [searchable]=\"component.searchable\"\r\n [refresh]=\"refreshValues(component)\"\r\n [valueSync]=\"component.valueSync\"\r\n [requiredOnBlur]=\"component.validate?.required\"\r\n #taglist\r\n [register]=\"component\"\r\n [componentRef]=\"taglist\">\r\n </wm-sirio-select>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region number -->\r\n <ng-container *ngSwitchCase=\"'number'\" [formGroup]=\"resolvePath(component.path)\">\r\n <!-- @wemake4u/form-controls: errors/warnings come from the validation presenter (see providers). -->\r\n <wm-sirio-number\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel')) || null\"\r\n [label]=\"evaluateLabel(locale(component, 'label'), component)\"\r\n [info]=\"evaluateString(locale(component, 'tooltip')) || null\"\r\n [placeholder]=\"sirioPlaceholder(component)\"\r\n [helpText]=\"evaluateString(locale(component, 'description'))\"\r\n [prefix]=\"evaluateString(component.appearance?.prefixAdorner) || ''\"\r\n [suffix]=\"evaluateString(component.appearance?.suffixAdorner) || ''\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n [textAlign]=\"component.textAlign || null\"\r\n [defaultValue]=\"evaluateNumber(component.defaultValue)\"\r\n [min]=\"evaluateNumber(component.minimum)\"\r\n [max]=\"evaluateNumber(component.maximum)\"\r\n [decimals]=\"evaluateNumber(component.decimalDigits)\"\r\n [requiredOnInput]=\"component.validate?.required\"\r\n [requiredOnBlur]=\"component.validate?.required\"\r\n [valueSync]=\"component.valueSync\"\r\n #number\r\n [register]=\"component\"\r\n [componentRef]=\"number\">\r\n </wm-sirio-number>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region datetime -->\r\n <ng-container *ngSwitchCase=\"'datetime'\" [formGroup]=\"resolvePath(component.path)\">\r\n <!-- @wemake4u/form-controls: date 'yyyy-MM-dd', time 'HH:mm', date and time 'yyyy-MM-ddTHH:mm:ss'.\r\n min/max only limit the pickers (typed values outside are moved to the nearest limit).\r\n Errors/warnings come from the validation presenter. -->\r\n <ng-container [ngSwitch]=\"component.subtype\">\r\n <!-- #region date -->\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <wm-sirio-date\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaDateLabel')) || null\"\r\n [label]=\"evaluateLabel(locale(component, 'dateLabel'), component)\"\r\n [info]=\"evaluateString(locale(component, 'tooltip')) || null\"\r\n [placeholder]=\"sirioPlaceholder(component)\"\r\n [helpText]=\"evaluateString(locale(component, 'description'))\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n [textAlign]=\"component.textAlign || null\"\r\n [pickLevel]=\"component.pick || 'date'\"\r\n [min]=\"evaluateString(component.range?.min) || null\"\r\n [max]=\"evaluateString(component.range?.max) || null\"\r\n [hideOnFocus]=\"evaluateBoolean(component.hideOnFocus)\"\r\n [valueSync]=\"component.valueSync\"\r\n [requiredOnBlur]=\"component.validate?.required\"\r\n #date\r\n [register]=\"component\"\r\n [componentRef]=\"date\">\r\n </wm-sirio-date>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region time -->\r\n <ng-container *ngSwitchCase=\"'time'\">\r\n <wm-sirio-time\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaTimeLabel')) || null\"\r\n [label]=\"evaluateLabel(locale(component, 'timeLabel'), component)\"\r\n [info]=\"evaluateString(locale(component, 'tooltip')) || null\"\r\n [placeholder]=\"sirioPlaceholder(component)\"\r\n [helpText]=\"evaluateString(locale(component, 'description'))\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n [textAlign]=\"component.textAlign || null\"\r\n [minuteStep]=\"component.timeInterval || 1\"\r\n [valueSync]=\"component.valueSync\"\r\n [requiredOnBlur]=\"component.validate?.required\"\r\n #time\r\n [register]=\"component\"\r\n [componentRef]=\"time\">\r\n </wm-sirio-time>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region datetime -->\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <!-- fieldLabels: dateLabel above the date, timeLabel above the time (as before);\r\n completeParts: date only -> 00:00, time only -> today (was the dateTimeCoordinator). -->\r\n <wm-sirio-datetime\r\n valueType=\"iso-seconds\"\r\n fieldLabels\r\n completeParts\r\n [label]=\"evaluateLabel(locale(component, 'dateLabel'), component)\"\r\n [timeLabel]=\"evaluateString(locale(component, 'timeLabel'))\"\r\n [info]=\"evaluateString(locale(component, 'tooltip')) || null\"\r\n [helpText]=\"evaluateString(locale(component, 'description'))\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n [textAlign]=\"component.textAlign || null\"\r\n [min]=\"evaluateString(component.range?.min) || null\"\r\n [max]=\"evaluateString(component.range?.max) || null\"\r\n [hideOnFocus]=\"evaluateBoolean(component.hideOnFocus)\"\r\n [minuteStep]=\"component.timeInterval || 1\"\r\n [valueSync]=\"component.valueSync\"\r\n [requiredOnBlur]=\"component.validate?.required\"\r\n #datetime\r\n [register]=\"component\"\r\n [componentRef]=\"datetime\">\r\n </wm-sirio-datetime>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region checkbox -->\r\n <ng-container *ngSwitchCase=\"'checkbox'\" [formGroup]=\"resolvePath(component.path)\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <!-- @wemake4u/form-controls: checkbox and toggle (subtype 'toggle'); the markdown label is projected\r\n inside the kit <label> as inline HTML. Errors/warnings come from the validation presenter. -->\r\n <wm-sirio-checkbox\r\n [toggle]=\"component.subtype === 'toggle'\"\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel')) || null\"\r\n [helpText]=\"evaluateString(locale(component, 'description'))\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n [valueSync]=\"component.valueSync\"\r\n [requiredOnBlur]=\"component.validate?.required\"\r\n #checkbox\r\n [register]=\"component\"\r\n [componentRef]=\"checkbox\"><span [innerHTML]=\"toInlineHTML(evaluateTemplate(locale(component, 'label')))\"></span></wm-sirio-checkbox>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region radio -->\r\n <ng-container *ngSwitchCase=\"'radio'\" [formGroup]=\"resolvePath(component.path)\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <!-- @wemake4u/form-controls: radio buttons and chips (subtype 'chip'); markdown option labels are\r\n rendered inline inside the kit <label>. Errors/warnings come from the validation presenter. -->\r\n <wm-sirio-radio-group\r\n [chips]=\"component.subtype === 'chip'\"\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel')) || null\"\r\n [label]=\"evaluateLabel(locale(component, 'label'), component)\"\r\n [info]=\"evaluateString(locale(component, 'tooltip')) || null\"\r\n [helpText]=\"evaluateString(locale(component, 'description'))\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n [options]=\"sirioOptions(getValues(component) | async)\"\r\n [inline]=\"component.displayInline\"\r\n [refresh]=\"refreshValues(component)\"\r\n [valueSync]=\"component.valueSync\"\r\n [requiredOnBlur]=\"component.validate?.required\"\r\n #radio\r\n [register]=\"component\"\r\n [componentRef]=\"radio\">\r\n <ng-template wmSirioOptionLabel let-option><span [innerHTML]=\"toInlineHTML(evaluateTemplate(option.label))\"></span></ng-template>\r\n </wm-sirio-radio-group>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region checklist -->\r\n <ng-container *ngSwitchCase=\"'checklist'\" [formGroup]=\"resolvePath(component.path)\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <!-- @wemake4u/form-controls: checkbox list and chips (subtype 'chip'); markdown option labels are\r\n rendered inline inside the kit <label>. Errors/warnings come from the validation presenter. -->\r\n <wm-sirio-checklist\r\n [chips]=\"component.subtype === 'chip'\"\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel')) || null\"\r\n [label]=\"evaluateLabel(locale(component, 'label'), component)\"\r\n [info]=\"evaluateString(locale(component, 'tooltip')) || null\"\r\n [helpText]=\"evaluateString(locale(component, 'description'))\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n [options]=\"sirioOptions(getValues(component) | async)\"\r\n [inline]=\"component.displayInline\"\r\n [refresh]=\"refreshValues(component)\"\r\n [valueSync]=\"component.valueSync\"\r\n [requiredOnBlur]=\"component.validate?.required\"\r\n #checklist\r\n [register]=\"component\"\r\n [componentRef]=\"checklist\">\r\n <ng-template wmSirioOptionLabel let-option><span [innerHTML]=\"toInlineHTML(evaluateTemplate(option.label))\"></span></ng-template>\r\n </wm-sirio-checklist>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region textarea -->\r\n <ng-container *ngSwitchCase=\"'textarea'\" [formGroup]=\"resolvePath(component.path)\">\r\n <!-- @wemake4u/form-controls: errors/warnings come from the validation presenter (see providers). -->\r\n <wm-sirio-textarea\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel')) || null\"\r\n [label]=\"evaluateLabel(locale(component, 'label'), component)\"\r\n [info]=\"evaluateString(locale(component, 'tooltip')) || null\"\r\n [placeholder]=\"sirioPlaceholder(component)\"\r\n [helpText]=\"evaluateString(locale(component, 'description'))\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n [textCase]=\"toTextCase(component.textCase)\"\r\n [maxlength]=\"evaluateNumber(component.maxLength)\"\r\n [textAlign]=\"component.textAlign || null\"\r\n [requiredOnInput]=\"component.validate?.required\"\r\n [requiredOnBlur]=\"component.validate?.required\"\r\n [valueSync]=\"component.valueSync\"\r\n #textarea\r\n [register]=\"component\"\r\n [componentRef]=\"textarea\">\r\n </wm-sirio-textarea>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region filepicker -->\r\n <ng-container *ngSwitchCase=\"'filepicker'\" [formGroup]=\"resolvePath(component.path)\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <!-- @wemake4u/form-controls: errors/warnings come from the validation presenter (see providers);\r\n upload, delete and download of the stored files are handled by the control. -->\r\n <wm-sirio-file-upload class=\"w-100\"\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel')) || null\"\r\n [label]=\"evaluateLabel(locale(component, 'label'), component)\"\r\n [info]=\"evaluateString(locale(component, 'tooltip')) || null\"\r\n [helpText]=\"evaluateString(locale(component, 'description'))\"\r\n [buttonLabel]=\"evaluateString(locale(component, 'text')) || locale(Texts, 'Upload')\"\r\n [accept]=\"getMimeTypes(component.accept)\"\r\n [multiple]=\"evaluateBoolean(component.multiple)\"\r\n valueType=\"array\"\r\n details\r\n downloadable\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [instantUpload]=\"evaluateBoolean(component.instantUpload)\"\r\n [uploadHandler]=\"evaluate(component.uploadHandler)\"\r\n [deleteHandler]=\"evaluate(component.deleteHandler)\"\r\n [downloadHandler]=\"evaluate(component.downloadHandler)\"\r\n [removeLabel]=\"locale(Texts, 'Remove')\"\r\n [downloadLabel]=\"locale(Texts, 'Download')\"\r\n [uploadingLabel]=\"locale(Texts, 'Uploading')\"\r\n [deletingLabel]=\"locale(Texts, 'Deleting')\"\r\n [downloadingLabel]=\"locale(Texts, 'Downloading')\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n [requiredOnBlur]=\"component.validate?.required\"\r\n [valueSync]=\"component.valueSync\"\r\n (filesAdded)=\"filesAdded($event, filepicker)\"\r\n (fileError)=\"fileError($event)\"\r\n #filepicker\r\n [register]=\"component\"\r\n [componentRef]=\"filepicker\">\r\n </wm-sirio-file-upload>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region range -->\r\n <ng-container *ngSwitchCase=\"'range'\" [formGroup]=\"resolvePath(component.path)\">\r\n <!-- @wemake4u/form-controls: errors/warnings come from the validation presenter (see providers). -->\r\n <wm-sirio-slider\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel')) || null\"\r\n [label]=\"evaluateLabel(locale(component, 'label'), component)\"\r\n [info]=\"evaluateString(locale(component, 'tooltip')) || null\"\r\n [helpText]=\"evaluateString(locale(component, 'description'))\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [properties]=\"component.properties\"\r\n [formControlName]=\"component.key\"\r\n [min]=\"evaluateNumber(component.range?.min) ?? 0\"\r\n [max]=\"evaluateNumber(component.range?.max) ?? 0\"\r\n [valueSync]=\"component.valueSync\"\r\n [requiredOnBlur]=\"component.validate?.required\"\r\n #range\r\n [register]=\"component\"\r\n [componentRef]=\"range\">\r\n </wm-sirio-slider>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region displayfield -->\r\n <ng-container *ngSwitchCase=\"'displayfield'\">\r\n <div class=\"display-field\"\r\n [ngClass]=\"getLightView(component)\"\r\n #displayfield\r\n [register]=\"component\"\r\n [componentRef]=\"displayfield\">\r\n <div *ngIf=\"component.label\" class=\"sirio-label\">\r\n {{ evaluateString(locale(component, 'label')) }}\r\n <!-- @wemake4u/form-controls: kit info button with popover, as next to the labels of the controls. -->\r\n <wm-sirio-info-button *ngIf=\"component.tooltip\"\r\n [content]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [title]=\"evaluateString(locale(component, 'label'))\"\r\n [label]=\"locale(Texts, 'InformationAbout') + ' ' + evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"></wm-sirio-info-button>\r\n </div>\r\n <div [class.sirio-form-control]=\"component.fieldtype !== 'filelist'\"\r\n [style.text-align]=\"component.fieldtype !== 'filelist' ? (component.textAlign || null) : null\"\r\n class=\"data-display\" [ngClass]=\"component.fieldtype\">\r\n <ng-container [ngSwitch]=\"component.fieldtype\">\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <ng-container *ngTemplateOutlet=\"checkboxTemplate\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <ng-container *ngTemplateOutlet=\"formattedTemplate\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'filelist'\">\r\n <ng-container *ngTemplateOutlet=\"filelistTemplate\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngTemplateOutlet=\"defaultTemplate\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #checkboxTemplate>\r\n <i *ngIf=\"evaluate(component.expression)\" class=\"fas fa-check\"></i>\r\n </ng-template>\r\n <ng-template #defaultTemplate>\r\n <ng-container *ngIf=\"supportValues(component) && hasValues(component); else simpleTemplate\">\r\n <ng-container *ngIf=\"getValues(component) | async as values\">\r\n {{ toLabel(evaluate(component.expression), values) }}\r\n </ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #simpleTemplate>\r\n {{ evaluate(component.expression) }}\r\n </ng-template>\r\n <ng-template #formattedTemplate>\r\n <div class=\"text-paragraph\" style=\"margin-top: -6px;\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(component.expression))\">\r\n </div>\r\n </ng-template>\r\n <ng-template #filelistTemplate>\r\n <ng-container *ngIf=\"{ files: evaluate(component.expression) } as expr\"\r\n fileHandler\r\n #fileHandlerRef=\"fileHandler\"\r\n [downloadHandler]=\"evaluate(component.downloadHandler)\">\r\n <ng-container *ngIf=\"expr.files?.length > 0\">\r\n <div *ngFor=\"let file of expr.files\" class=\"row w-100 p-3 g-0 sirio-bg-primary-light-40 sirio-text-secondary mt-1\">\r\n <div class=\"col-auto ms-auto\">\r\n <span [ngClass]=\"fileHandlerRef.getIcon(file)\" class=\"fas fa-24 mt-1 me-3 ms-1\" aria-hidden=\"true\"></span>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-0\"><span class=\"h6 sirio-text-link sirio-font-weight-700\">{{ file.name }}</span></p>\r\n {{ fileHandlerRef.getExtension(file) }}, {{ fileHandlerRef.getSize(file) }}\r\n </div>\r\n <div class=\"col-auto ms-auto d-lg-flex flex-column align-items-end\">\r\n <ng-container *ngIf=\"fileHandlerRef.canDownload(file)\">\r\n <div *ngIf=\"fileHandlerRef.isDownloading(file)\" class=\"mt-2\">\r\n <span class=\"d-none d-sm-inline-block\">{{ locale(Texts, 'Downloading') }}</span>\r\n <span class=\"fas fa-arrows-rotate fa-spin ms-2\" aria-hidden=\"true\"></span>\r\n </div>\r\n <a *ngIf=\"fileHandlerRef.isLocal(file)\"\r\n href=\"javascript:void(0)\"\r\n (click)=\"fileHandlerRef.downloadLocal(file)\"\r\n [attr.aria-label]=\"locale(Texts, 'Download') + ' ' + file.name\"\r\n [attr.title]=\"locale(Texts, 'Download') + ' ' + file.name\">\r\n <span class=\"d-none d-sm-inline-block\">\r\n {{ locale(Texts, 'Download') }}\r\n </span>\r\n <span class=\"fas fa-download ms-2\" aria-hidden=\"true\"></span>\r\n </a>\r\n <a *ngIf=\"fileHandlerRef.isHandled(file)\"\r\n href=\"javascript:void(0)\"\r\n (click)=\"fileHandlerRef.downloadHandled(file)\"\r\n [attr.aria-label]=\"locale(Texts, 'Download') + ' ' + file.name\"\r\n [attr.title]=\"locale(Texts, 'Download') + ' ' + file.name\"\r\n download>\r\n <span class=\"d-none d-sm-inline-block\">{{ locale(Texts, 'Download') }}</span>\r\n <span class=\"fas fa-download ms-2\" aria-hidden=\"true\"></span>\r\n </a>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!(expr.files?.length > 0)\">\r\n <div class=\"row p-3 g-0 sirio-bg-primary-light-40 sirio-text-secondary mt-1\">\r\n <div class=\"col\">\r\n <p class=\"mb-0\">\r\n <span class=\"h6 sirio-text-link sirio-font-weight-700\">Nessun file presente</span>\r\n </p>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n <p *ngIf=\"component.description\" class=\"sirio-form-text-help\">\r\n {{ evaluateString(locale(component, 'description')) }}\r\n </p>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region dynamiclist -->\r\n <ng-container *ngSwitchCase=\"'dynamiclist'\">\r\n <ng-container *ngIf=\"resolvePath(component.path) as formGroup\">\r\n <ng-container [formGroup]=\"formGroup\">\r\n <div [formArrayName]=\"component.key\"\r\n [formGroup]=\"formGroup\"\r\n [recursion]=\"component\"\r\n #recursion=\"recursion\">\r\n <p *ngIf=\"component.description\">{{ evaluateString(locale(component, 'description')) }}</p>\r\n <ng-container *ngIf=\"getFormArray(resolvePath(component.path).get(component.key)) as formArray\">\r\n <ng-template navigatorState\r\n [total]=\"formArray.controls.length\"\r\n #state=\"navigatorState\"></ng-template>\r\n <ng-container *ngIf=\"component.subtype == 'navigation'\">\r\n <ng-container *ngTemplateOutlet=\"navigation; context: { formArray: formArray, state: state }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"formArray.controls.length > 0\">\r\n <ng-container [ngSwitch]=\"component.subtype\">\r\n <!-- #region tab -->\r\n <ng-container *ngSwitchCase=\"'tab'\">\r\n <!-- @wemake4u/form-controls: activateAdded selects the added tab (after a removal the library selects the one\r\n taking its place); focusContent moves the focus to the first field of the panel. -->\r\n <div [register]=\"component\"\r\n [componentRef]=\"tabInstance\">\r\n <wm-sirio-tabs [scrollLeftLabel]=\"locale(Texts, 'ScrollLeft')\"\r\n [scrollRightLabel]=\"locale(Texts, 'ScrollRight')\"\r\n [focusablePanels]=\"false\"\r\n activateAdded\r\n focusContent\r\n #tabInstance>\r\n <ng-container *ngFor=\"let item of formArray.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ng-container *ngIf=\"{ formGroup: item, item: item.value, index: i } as event\">\r\n <wm-sirio-tab [label]=\"evaluateWithEventAsString(locale(component, 'label'), event)\"\r\n [badge]=\"evaluateWithEvent(component.badge, event)\">\r\n <ng-template wmSirioTabContent>\r\n <div>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"getFormGroup(item)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n <div style=\"text-align:right\">\r\n <ng-container *ngTemplateOutlet=\"buttonsRemove; context: { formArray: formArray, state: state, i: i }\"></ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </wm-sirio-tab>\r\n </ng-container>\r\n </ng-container>\r\n </wm-sirio-tabs>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region accordion -->\r\n <ng-container *ngSwitchCase=\"'accordion'\">\r\n <!-- @wemake4u/form-controls: activateAdded opens the first section at the start and the added one (after a removal\r\n the library opens the one taking its place); focusContent moves the focus to its first field. -->\r\n <div [register]=\"component\"\r\n [componentRef]=\"dynamiclistaccordion\">\r\n <wm-sirio-accordion exclusive\r\n activateAdded\r\n focusContent\r\n #dynamiclistaccordion>\r\n <ng-container *ngFor=\"let item of formArray.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ng-container *ngIf=\"{ formGroup: item, item: item.value, index: i } as event\">\r\n <wm-sirio-accordion-item [title]=\"evaluateWithEventAsString(locale(component, 'label'), event)\"\r\n [badge]=\"evaluateWithEvent(component.badge, event)\">\r\n <ng-template wmSirioAccordionContent>\r\n <div>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"getFormGroup(item)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n <div style=\"text-align:right\">\r\n <ng-container *ngTemplateOutlet=\"buttonsRemove; context: { formArray: formArray, state: state, i: i }\"></ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </wm-sirio-accordion-item>\r\n </ng-container>\r\n </ng-container>\r\n </wm-sirio-accordion>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region table -->\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <div #dynamiclist\r\n [register]=\"component\"\r\n [componentRef]=\"dynamiclist\">\r\n <table class=\"dynamiclist-table\" [ngClass]=\"{ 'main': recursionLevel == 0 }\">\r\n <ng-container *ngFor=\"let item of formArray.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ng-container *ngIf=\"getFormGroup(item) as formItem\">\r\n <ng-container *ngIf=\"{ itemsArray: recursion.getItemsArray(formItem) } as recursionData\">\r\n <tr>\r\n <td class=\"content-cell\">\r\n <div [ngClass]=\"{'group-outline': component.showOutline === true && component.subtype !== 'table', 'group-outline-repeat': true }\">\r\n <div>\r\n <div class=\"badge-header\" *ngIf=\"{ formGroup: item, item: item.value, index: i } as event\">\r\n <label>{{ evaluateWithEventAsString(locale(component, 'label'), event) }}</label>\r\n <span class=\"badge-header-tag\" [wmSirioBadge]=\"evaluateWithEvent(component.badge, event)\"></span>\r\n </div>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"formItem\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </div>\r\n </div>\r\n </td>\r\n <td class=\"command-cell\">\r\n <div>\r\n <ng-container *ngIf=\"recursionData.itemsArray\">\r\n <ng-container *ngTemplateOutlet=\"buttonsAdd; context: { formArray: recursionData.itemsArray, compact: true }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"buttonsReorder; context: { formArray: formArray, i: i, compact: true }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"buttonsRemove; context: { formArray: formArray, state: state, i: i, compact: true }\"></ng-container>\r\n </div>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"recursionData.itemsArray && recursionData.itemsArray.length > 0\">\r\n <td colspan=\"2\" class=\"recursion-cell\">\r\n <div class=\"layout\">\r\n <div class=\"recursion-toggle\">\r\n <!-- @wemake4u/form-controls: open at the start (as before); label for screen readers. -->\r\n <button type=\"button\" wmSirioButton=\"ghost\"\r\n [wmSirioCollapseToggle]=\"collapse\"\r\n iconOnly\r\n [icon]=\"collapse.expanded() ? 'fa-chevron-down' : 'fa-chevron-right'\"\r\n [label]=\"recursionData.itemsArray.length + ' elementi presenti'\"></button>\r\n </div>\r\n <div *ngIf=\"!collapse.expanded()\" class=\"recursion-title\">\r\n <div class=\"recursion-text\">\r\n {{ recursionData.itemsArray.length }} elementi presenti\r\n </div>\r\n </div>\r\n <div class=\"recursion-content\">\r\n <div wmSirioCollapse #collapse=\"wmSirioCollapse\" [expanded]=\"true\">\r\n <div *ngIf=\"collapse.expanded()\" style=\"margin-bottom: -11px;\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"recursion.getFormGroup(formItem)\"\r\n [readOnly]=\"readOnly\"\r\n [recursionLevel]=\"recursionLevel+1\"\r\n [rows]=\"recursion.getComponentRows()\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </table>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region navigation -->\r\n <ng-container *ngSwitchCase=\"'navigation'\">\r\n <div>\r\n <ng-container *ngIf=\"formArray.controls[state.index] as item\">\r\n <div [ngClass]=\"{'group-outline': component.showOutline === true, 'group-outline-repeat': true }\">\r\n <div>\r\n <div class=\"badge-header\" *ngIf=\"{ formGroup: item, item: item.value, index: state.index } as event\">\r\n <label>{{ evaluateWithEventAsString(locale(component, 'label'), event) }}</label>\r\n <span class=\"badge-header-tag\" [wmSirioBadge]=\"evaluateWithEvent(component.badge, event)\"></span>\r\n </div>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"getFormGroup(item)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region default -->\r\n <ng-container *ngSwitchDefault>\r\n <div #dynamiclist\r\n [register]=\"component\"\r\n [componentRef]=\"dynamiclist\"\r\n selectionGroup\r\n [selectionMode]=\"evaluateString(component.selection?.mode)\"\r\n [selectableClass]=\"evaluateString(component.selection?.selectableClass)\"\r\n [selectedClass]=\"evaluateString(component.selection?.selectedClass)\"\r\n [onSelectionChanged]=\"callExpression(component.selection?.selectionChanged)\">\r\n <ng-container *ngFor=\"let item of formArray.controls; let i = index;\" [formGroupName]=\"i\">\r\n <div [selectionItem]=\"item\"\r\n [ngClass]=\"{'group-outline': component.showOutline === true, 'group-outline-repeat': true }\">\r\n <div>\r\n <div class=\"badge-header\" *ngIf=\"{ formGroup: item, item: item.value, index: i } as event\">\r\n <label>{{ evaluateWithEventAsString(locale(component, 'label'), event) }}</label>\r\n <span class=\"badge-header-tag\" [wmSirioBadge]=\"evaluateWithEvent(component.badge, event)\"></span>\r\n </div>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"getFormGroup(item)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n <ng-container *ngIf=\"component.allowAddRemove || component.allowReorder\">\r\n <div style=\"text-align:right\">\r\n <ng-container *ngTemplateOutlet=\"buttonsReorder; context: { formArray: formArray, i: i }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"buttonsRemove; context: { formArray: formArray, state: state, i: i }\"></ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"formArray.controls.length == 0\">\r\n <div class=\"dynamiclist-no-data\">{{ evaluateString(locale(component, 'noDataText')) || locale(Texts, 'NoData') }}</div>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"feedback\"></ng-container>\r\n <ng-container *ngIf=\"recursionLevel == 0 && component.subtype !== 'navigation'\">\r\n <ng-container *ngTemplateOutlet=\"buttonsAdd; context: { formArray: formArray, state: state }\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n <!-- #region templates -->\r\n <ng-template #btnMoveUp let-formArray=\"formArray\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"locale(Texts, 'MoveUp') as upLabel\">\r\n <button type=\"button\" wmSirioButton=\"ghost\"\r\n (click)=\"moveUpItem(formArray, i)\"\r\n class=\"remove-item\"\r\n icon=\"fa-arrow-up\" iconPosition=\"start\"\r\n [iconOnly]=\"!!compact\" [label]=\"upLabel\">{{ upLabel }}</button>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #btnMoveDown let-formArray=\"formArray\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"locale(Texts, 'MoveDown') as downLabel\">\r\n <button type=\"button\" wmSirioButton=\"ghost\"\r\n (click)=\"moveDownItem(formArray, i)\"\r\n class=\"remove-item\"\r\n icon=\"fa-arrow-down\" iconPosition=\"start\"\r\n [iconOnly]=\"!!compact\" [label]=\"downLabel\">{{ downLabel }}</button>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #btnRemove let-formArray=\"formArray\" let-state=\"state\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'removeLabel') || locale(Texts, 'RemoveItem')) as removeLabel\">\r\n <button type=\"button\" wmSirioButton=\"ghost\"\r\n (click)=\"removeItem(formArray, i, true, state)\"\r\n class=\"remove-item\"\r\n icon=\"fa-trash\" iconPosition=\"start\"\r\n [iconOnly]=\"!!compact\" [label]=\"removeLabel\">{{ removeLabel }}</button>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #btnAdd let-formArray=\"formArray\" let-state=\"state\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'addLabel') || locale(Texts, 'AddItem')) as addLabel\">\r\n <button type=\"button\" wmSirioButton=\"ghost\"\r\n (click)=\"addItem(formArray, state)\"\r\n class=\"add-item\"\r\n icon=\"fa-plus\" iconPosition=\"start\"\r\n [iconOnly]=\"!!compact\" [label]=\"addLabel\">{{ addLabel }}</button>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #buttonsReorder let-formArray=\"formArray\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowReorder\">\r\n <ng-container *ngTemplateOutlet=\"btnMoveUp; context: { formArray: formArray, i: i, compact: compact }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"btnMoveDown; context: { formArray: formArray, i: i, compact: compact }\"></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #buttonsRemove let-formArray=\"formArray\" let-state=\"state\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowAddRemove && evaluateWithEventAsBoolean(component.removeCondition, { item: formArray.at(i)?.value, index: i, total: state.total }, true)\">\r\n <ng-container *ngTemplateOutlet=\"btnRemove; context: { formArray: formArray, state: state, i: i, compact: compact }\"></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #buttonsAdd let-formArray=\"formArray\" let-state=\"state\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowAddRemove && evaluateWithEventAsBoolean(component.addCondition, { total: state.total }, true)\">\r\n <ng-container *ngTemplateOutlet=\"btnAdd; context: { formArray: formArray, state: state, compact: compact }\"></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #feedback>\r\n <ng-container *ngIf=\"getTextFeedback(component) as textFeedback\">\r\n <div>\r\n <span class=\"sirio-form-feedback d-block sirio-text-danger\">{{textFeedback}}</span>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'description')) as textHelp\">\r\n <div>\r\n <p class=\"sirio-form-text-help\">{{textHelp}}</p>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #navigation let-formArray=\"formArray\" let-state=\"state\">\r\n <!-- @wemake4u/form-controls: item navigator (page = element, 1-based); the actions are projected at the end of the row. -->\r\n <wm-sirio-pagination [showItems]=\"false\"\r\n [pageSize]=\"1\"\r\n [total]=\"state.total\"\r\n [page]=\"state.index + 1\"\r\n (pageChange)=\"state.index = $event - 1\"\r\n [ariaLabel]=\"locale(Texts, 'ElementsNavigation')\"\r\n [ofLabel]=\"locale(Texts, 'Of')\"\r\n [pagesLabel]=\"locale(Texts, 'Elements')\"\r\n [pageLabel]=\"locale(Texts, 'Element')\"\r\n [goToPageLabel]=\"locale(Texts, 'GoToElement')\"\r\n [previousLabel]=\"locale(Texts, 'PreviousElement')\"\r\n [nextLabel]=\"locale(Texts, 'NextElement')\">\r\n <div class=\"actions\">\r\n <ng-container *ngTemplateOutlet=\"buttonsAdd; context: { formArray: formArray, state: state }\"></ng-container>\r\n <ng-container *ngIf=\"state.total && state.index != -1\">\r\n <ng-container *ngTemplateOutlet=\"buttonsRemove; context: { formArray: formArray, state: state, i: state.index }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </wm-sirio-pagination>\r\n </ng-template>\r\n <!-- #endregion -->\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region group -->\r\n <ng-container *ngSwitchCase=\"'group'\">\r\n <div *ngIf=\"resolveBoundGroup(component) as resolvedGroup\"\r\n [ngClass]=\"getGroupOutline(component)\">\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'label')) as labelText\">\r\n <label>{{ labelText }}</label>\r\n </ng-container>\r\n <div #group\r\n [register]=\"component\"\r\n [componentRef]=\"group\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"resolvedGroup\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region tab -->\r\n <ng-container *ngSwitchCase=\"'tab'\">\r\n <ng-container *ngIf=\"(getPanels(component) | async) as panels\">\r\n <ng-container *ngIf=\"panels.length > 0\">\r\n <!-- @wemake4u/form-controls: focusContent moves the focus into the panel shown at the start or selected (not for the\r\n arrow keys), except for the panels with disableAutoFocus. -->\r\n <wm-sirio-tabs #tabInstance\r\n [register]=\"component\"\r\n [componentRef]=\"tabInstance\"\r\n [scrollLeftLabel]=\"locale(Texts, 'ScrollLeft')\"\r\n [scrollRightLabel]=\"locale(Texts, 'ScrollRight')\"\r\n [line]=\"!!component.navigation\"\r\n [vertical]=\"!!component.vertical\"\r\n [focusablePanels]=\"false\"\r\n focusContent>\r\n <ng-container *ngFor=\"let panel of panels; let i = index;\">\r\n <wm-sirio-tab *ngIf=\"evaluateConditional(panel.conditional)\"\r\n [label]=\"evaluateString(locale(panel, 'label'))\"\r\n [icon]=\"evaluateString(panel.icon) || null\"\r\n [disabled]=\"evaluateBoolean(panel.disabled) ?? false\"\r\n [badge]=\"evaluate(panel.badge)\"\r\n [focusContent]=\"panel.disableAutoFocus !== true\">\r\n <ng-template wmSirioTabContent>\r\n <ng-container *ngIf=\"getTemplate(panel.template) as template\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"resolvePath(panel.path)\"\r\n [rows]=\"template.rows\"\r\n [identity]=\"component.id\"\r\n [identityIndex]=\"i\"\r\n [readOnly]=\"readOnly || evaluateBoolean(panel.readonly)\"\r\n [disableAutoFocus]=\"template.disableAutoFocus\"\r\n [alignment]=\"template.verticalAlignment\"></app-dynamic-fields>\r\n </ng-container>\r\n </ng-template>\r\n </wm-sirio-tab>\r\n </ng-container>\r\n </wm-sirio-tabs>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region accordion -->\r\n <ng-container *ngSwitchCase=\"'accordion'\">\r\n <ng-container *ngIf=\"(getPanels(component) | async) as panels\">\r\n <ng-container *ngIf=\"panels.length > 0\">\r\n <!-- exclusive: one section open at a time, as with ngx-sirio-lib. -->\r\n <wm-sirio-accordion exclusive\r\n #accordion\r\n [register]=\"component\"\r\n [componentRef]=\"accordion\">\r\n <ng-container *ngFor=\"let panel of panels; let i = index;\">\r\n <ng-container *ngIf=\"resolvePath(panel.path) as formGroup\">\r\n <!-- Content not lazy (as before): the fields of closed sections stay in the form. -->\r\n <wm-sirio-accordion-item *ngIf=\"evaluateConditional(panel.conditional)\"\r\n [title]=\"evaluateString(locale(panel, 'label'))\"\r\n [badge]=\"evaluate(panel.badge)\"\r\n [disabled]=\"evaluateBoolean(panel.disabled)\">\r\n <ng-container *ngIf=\"getTemplate(panel.template) as template\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"formGroup\"\r\n [readOnly]=\"readOnly || evaluateBoolean(panel.readonly)\"\r\n [rows]=\"template.rows\"\r\n [identity]=\"component.id\"\r\n [identityIndex]=\"i\"\r\n [disableAutoFocus]=\"template.disableAutoFocus\"\r\n [alignment]=\"template.verticalAlignment\"></app-dynamic-fields>\r\n </ng-container>\r\n </wm-sirio-accordion-item>\r\n </ng-container>\r\n </ng-container>\r\n </wm-sirio-accordion>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region text -->\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <div [collapse]=\"component.collapseTo\"\r\n [onCollapse]=\"callExpression(component.onCollapse)\"\r\n [onExpand]=\"callExpression(component.onExpand)\"\r\n #text\r\n [register]=\"component\"\r\n [componentRef]=\"text\">\r\n <!--Reset View Context-->\r\n <div tabindex=\"0\" style=\"display:none\"></div>\r\n <div class=\"flex\">\r\n <div class=\"text-paragraph\" markdown\r\n [onAnchorClick]=\"callExpression(component.anchorClick)\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'text')))\">\r\n </div>\r\n <ng-container *ngIf=\"component.tooltip\">\r\n <wm-sirio-info-button [content]=\"tooltipTemplate\"\r\n [label]=\"locale(Texts, 'Information')\"></wm-sirio-info-button>\r\n <ng-template #tooltipTemplate>\r\n <div class=\"sirio-tooltip-body\">\r\n <div class=\"text-paragraph\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'tooltip')))\">\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region html -->\r\n <ng-container *ngSwitchCase=\"'html'\">\r\n <div class=\"html-paragraph\"\r\n [innerHTML]=\"sanitize(evaluateTemplate(locale(component, 'content')))\"\r\n #html\r\n [register]=\"component\"\r\n [componentRef]=\"html\">\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region image -->\r\n <ng-container *ngSwitchCase=\"'image'\">\r\n <img [src]=\"evaluateString(component.source)\"\r\n [alt]=\"evaluateString(locale(component, 'alt'))\"\r\n style=\"width: 100%;height: 100%;\"\r\n #image\r\n [register]=\"component\"\r\n [componentRef]=\"image\">\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region table -->\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <label>{{ evaluateString(locale(component, 'label')) }}</label>\r\n <ag-grid-angular [modules]=\"getGridModules(component)\"\r\n [gridOptions]=\"getGridOptions(component)\"\r\n [selectable]=\"evaluateBoolean(component.selectable)\"\r\n [multiSelect]=\"evaluateBoolean(component.multiSelect)\"\r\n (selectionChanged)=\"onGridSelectionChanged(component, $event)\"\r\n [suppressActions]=\"evaluateBoolean(component.suppressActions)\"\r\n [columns]=\"component.columns || evaluateWithHydratation(component.columnsExpression) || []\"\r\n [rowSource]=\"getRowSource(component)\"\r\n [refresh]=\"refreshRowSource(component)\"\r\n [style.height]=\"component.autoHeight ? null : evaluateSize(component.height)\"\r\n [formGroup]=\"formGroup\"\r\n #table\r\n [register]=\"component\"\r\n [componentRef]=\"table\" />\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region button -->\r\n <ng-container *ngSwitchCase=\"'button'\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <!-- @wemake4u/form-controls: color \"ghost\" = plain sirio-btn; icon on the left unless iconPosition \"right\". -->\r\n <button type=\"button\"\r\n [wmSirioButton]=\"evaluateVariant(component.color)\"\r\n [disabled]=\"evaluateBoolean(component.disabled) ?? false\"\r\n [icon]=\"evaluateString(component.icon) || null\"\r\n [iconPosition]=\"component.iconPosition == 'right' ? 'end' : 'start'\"\r\n (click)=\"clickButton(component, $event)\"\r\n #button\r\n [register]=\"component\"\r\n [componentRef]=\"button\">{{ evaluateString(locale(component, 'label')) }}</button>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region separator -->\r\n <ng-container *ngSwitchCase=\"'separator'\">\r\n <div class=\"separator\"\r\n #separator\r\n [register]=\"component\"\r\n [componentRef]=\"separator\">\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region spacer -->\r\n <ng-container *ngSwitchCase=\"'spacer'\">\r\n <div style=\"width: 100%\"\r\n [style.height.px]=\"component.height\"\r\n #spacer\r\n [register]=\"component\"\r\n [componentRef]=\"spacer\">\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region iframe -->\r\n <ng-container *ngSwitchCase=\"'iframe'\">\r\n <label [for]=\"component.id\">{{ evaluateString(locale(component, 'label')) }}</label>\r\n <iframe [src]=\"evaluateUrl(component.url)\"\r\n [title]=\"evaluateString(locale(component, 'label'))\"\r\n [style.width]=\"'100%'\"\r\n [style.height.px]=\"component.height\"\r\n [frameSecurity]=\"component.security\"\r\n #iframe\r\n [register]=\"component\"\r\n [componentRef]=\"iframe\">\r\n </iframe>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region alert -->\r\n <ng-container *ngSwitchCase=\"'alert'\">\r\n <!-- @wemake4u/form-controls: preventClose → no close button; markdown as block content. -->\r\n <wm-sirio-alert [type]=\"component.role || 'info'\"\r\n [closeLabel]=\"locale(Texts, 'Close')\"\r\n [dismissible]=\"!evaluateBoolean(component.preventClose)\"\r\n #alert\r\n [register]=\"component\"\r\n [componentRef]=\"alert\">\r\n <div wmSirioAlertContent\r\n class=\"text-paragraph\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'text')))\">\r\n </div>\r\n </wm-sirio-alert>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region notice -->\r\n <ng-container *ngSwitchCase=\"'notice'\">\r\n <!-- @wemake4u/form-controls: light notice (kit default); markdown as block content. -->\r\n <wm-sirio-notify #notice\r\n [title]=\"evaluateString(locale(component, 'title'))\"\r\n [register]=\"component\"\r\n [componentRef]=\"notice\">\r\n <div wmSirioNotifyContent\r\n class=\"text-paragraph\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'text')))\">\r\n </div>\r\n </wm-sirio-notify>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region tooltip -->\r\n <ng-container *ngSwitchCase=\"'tooltip'\">\r\n <!-- @wemake4u/form-controls: the title is the popover title of the kit. -->\r\n <wm-sirio-info-button [content]=\"tooltipTemplate\"\r\n [title]=\"evaluateString(locale(component, 'title'))\"\r\n [label]=\"evaluateString(locale(component, 'title')) || locale(Texts, 'Information')\"\r\n #tooltip\r\n [register]=\"component\"\r\n [componentRef]=\"tooltip\"></wm-sirio-info-button>\r\n <ng-template #tooltipTemplate>\r\n <div class=\"sirio-tooltip-body\">\r\n <div class=\"text-paragraph\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'text')))\">\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region chart -->\r\n <ng-container *ngSwitchCase=\"'chart'\">\r\n <label>{{ evaluateString(locale(component, 'label')) }}</label>\r\n <ng-container [observe]=\"getChartData(component)\"\r\n [callback]=\"invalidateChart(component)\">\r\n <ag-charts [options]=\"(getChartOptions(component) | async) ?? {}\"\r\n [style.height.px]=\"component.height\"\r\n #chart\r\n [register]=\"component\"\r\n [componentRef]=\"chart\" />\r\n </ng-container> \r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region component -->\r\n <ng-container *ngSwitchCase=\"'component'\">\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'label')) as labelText\">\r\n <label>{{ labelText }}</label>\r\n </ng-container>\r\n <ng-container *ngIf=\"component.isInput; else noInputTemplate\">\r\n <app-dynamic-host [properties]=\"getFeelableProperties(component)\"\r\n [formGroup]=\"resolvePath(component.path)\"\r\n #componentHost\r\n [register]=\"component\"\r\n [componentRef]=\"componentHost\" />\r\n <ng-container *ngIf=\"getTextFeedback(component) as textFeedback\">\r\n <span class=\"sirio-form-feedback d-block sirio-text-danger\">{{textFeedback}}</span>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'description')) as textHelp\">\r\n <p class=\"sirio-form-text-help\">{{textHelp}}</p>\r\n </ng-container>\r\n <ng-template #noInputTemplate>\r\n <app-dynamic-host [properties]=\"getFeelableProperties(component)\"\r\n #componentHost\r\n [register]=\"component\"\r\n [componentRef]=\"componentHost\" />\r\n </ng-template>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region templatehost -->\r\n <ng-container *ngSwitchCase=\"'templatehost'\">\r\n <ng-container *ngIf=\"getTemplate(component.template) as template\">\r\n <div #template\r\n [register]=\"component\"\r\n [componentRef]=\"template\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"resolvePath(component.path)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"template?.rows\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region treelist -->\r\n <ng-container *ngSwitchCase=\"'treelist'\">\r\n <label>{{ evaluateString(locale(component, 'label')) }}</label>\r\n <div class=\"treelist\"\r\n [style.height]=\"component.height ? evaluateSize(component.height): null\"\r\n *ngIf=\"getTreeColumns(component) as columns\">\r\n <ng-container *ngIf=\"((getTreeSource(component) | async) ?? []) as rows\">\r\n <table #treelist\r\n [register]=\"component\"\r\n [componentRef]=\"treelist\"\r\n [treelist]=\"rows\">\r\n <colgroup>\r\n <col *ngFor=\"let column of columns\"\r\n [style.width]=\"evaluateSize(column.width)\">\r\n </colgroup>\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let column of columns\"\r\n [ngClass]=\"getClass(column)\"\r\n [style.text-align]=\"column.align\">\r\n {{column.label}}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <ng-container>\r\n <tr *ngFor=\"let row of rows\"\r\n [attr.data-id]=\"row.id\"\r\n [attr.data-parent]=\"row.parentId\"\r\n [attr.data-expanded]=\"row.expanded ? 'true': 'false'\"\r\n [ngClass]=\"row.meta?.['cssClass']\">\r\n <td *ngFor=\"let column of columns; let i = index\"\r\n [ngClass]=\"getClass(column)\">\r\n <div [style.justify-content]=\"getJustify(column.align)\">\r\n <span *ngIf=\"i==component.expanderColumn\"\r\n [style.visibility]=\"row.hasChildren ? 'visible' : 'hidden'\"\r\n [style.padding-left]=\"evaluateSize(20 * row.level)\"\r\n class=\"toggle\"></span>\r\n <span class=\"text\"\r\n [title]=\"row.data[column.key]\">\r\n {{ row.data[column.key] }}\r\n </span>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region navigator -->\r\n <ng-container *ngSwitchCase=\"'navigator'\">\r\n <div #navigator\r\n [register]=\"component\"\r\n [componentRef]=\"navigator\">\r\n <div navigatorState\r\n [index]=\"evaluateNumber(component.index) ?? 0\"\r\n [total]=\"evaluateNumber(component.total) ?? 0\"\r\n (indexChange)=\"evaluateWithEventAsHandler(component.selectionChanged, { index: $event, count: state.total })\"\r\n #state=\"navigatorState\">\r\n <!-- @wemake4u/form-controls: item navigator (page = element, 1-based); the actions are projected at the end of the row. -->\r\n <wm-sirio-pagination [showItems]=\"false\"\r\n [pageSize]=\"1\"\r\n [total]=\"state.total\"\r\n [page]=\"state.index + 1\"\r\n (pageChange)=\"state.index = $event - 1\"\r\n [ariaLabel]=\"locale(Texts, 'ElementsNavigation')\"\r\n [ofLabel]=\"locale(Texts, 'Of')\"\r\n [pagesLabel]=\"locale(Texts, 'Elements')\"\r\n [pageLabel]=\"locale(Texts, 'Element')\"\r\n [goToPageLabel]=\"locale(Texts, 'GoToElement')\"\r\n [previousLabel]=\"locale(Texts, 'PreviousElement')\"\r\n [nextLabel]=\"locale(Texts, 'NextElement')\">\r\n <div class=\"actions\">\r\n <ng-container *ngTemplateOutlet=\"buttonsAdd; context: { total: state.total }\"></ng-container>\r\n <ng-container *ngIf=\"state.total && state.index != -1\">\r\n <ng-container *ngTemplateOutlet=\"buttonsRemove; context: { i: state.index, total: state.total }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </wm-sirio-pagination>\r\n </div>\r\n </div>\r\n <ng-template #buttonsAdd let-total=\"total\">\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowAddRemove && evaluateWithEventAsBoolean(component.addCondition, { total: total }, true)\">\r\n <ng-container *ngTemplateOutlet=\"btnAdd; context: { total: total }\"></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #buttonsRemove let-i=\"i\" let-total=\"total\">\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowAddRemove && evaluateWithEventAsBoolean(component.removeCondition, { index: i, total: total }, true)\">\r\n <ng-container *ngTemplateOutlet=\"btnRemove; context: { i: i, total: total }\"></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #btnAdd let-total=\"total\">\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'addLabel') || locale(Texts, 'AddItem')) as addLabel\">\r\n <button type=\"button\" wmSirioButton=\"ghost\"\r\n class=\"add-item\"\r\n (click)=\"evaluateWithEventAsHandler(component.addExpression, { total: total })\"\r\n icon=\"fa-plus\" iconPosition=\"start\">{{ addLabel }}</button>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #btnRemove let-i=\"i\" let-total=\"total\">\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'removeLabel') || locale(Texts, 'RemoveItem')) as removeLabel\">\r\n <button type=\"button\" wmSirioButton=\"ghost\"\r\n class=\"remove-item\"\r\n (click)=\"evaluateWithEventAsHandler(component.removeExpression, { index: i, total: total })\"\r\n icon=\"fa-trash\" iconPosition=\"start\">{{ removeLabel }}</button>\r\n </ng-container>\r\n </ng-template>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</div>\r\n\r\n","// Allowed CSS properties, matched as prefixes: \"border\" also allows \"border-top-color\".\r\n// Shorthands are expanded by the browser into longhands before the check.\r\nconst ALLOWED_PROPERTIES = [\r\n // Colors and backgrounds\r\n 'color', 'background', 'opacity', 'accent-color', 'caret-color',\r\n\r\n // Typography\r\n 'font', 'text', 'line-height', 'letter-spacing', 'word', 'white-space',\r\n 'vertical-align', 'hyphens', 'overflow-wrap', 'direction', 'unicode-bidi',\r\n 'list-style', 'quotes',\r\n\r\n // Box model\r\n 'margin', 'padding', 'border', 'outline', 'box', 'width', 'height',\r\n 'min-width', 'max-width', 'min-height', 'max-height',\r\n 'inline-size', 'block-size', 'min-inline-size', 'max-inline-size',\r\n 'min-block-size', 'max-block-size', 'aspect-ratio',\r\n\r\n // Layout\r\n 'display', 'position', 'top', 'right', 'bottom', 'left', 'inset',\r\n 'z-index', 'float', 'clear', 'overflow', 'visibility', 'isolation',\r\n\r\n // Flexbox and grid\r\n 'flex', 'grid', 'gap', 'row-gap', 'column', 'order',\r\n 'align', 'justify', 'place',\r\n\r\n // Tables\r\n 'table-layout', 'caption-side', 'empty-cells',\r\n\r\n // Visual effects\r\n 'transform', 'translate', 'rotate', 'scale', 'perspective',\r\n 'filter', 'backdrop-filter', 'clip-path', 'mix-blend-mode',\r\n 'object-fit', 'object-position',\r\n\r\n // Animations (keyframes are dropped, so only transitions really apply)\r\n 'transition', 'animation',\r\n\r\n // Interaction\r\n 'cursor', 'pointer-events', 'user-select', 'resize', 'scroll', 'touch-action',\r\n];\r\n\r\n// Values that could load resources, read attributes or execute legacy script hooks\r\nconst FORBIDDEN_VALUE = /url\\(|image-set\\(|image\\(|element\\(|expression\\(|javascript:|attr\\(/i;\r\n\r\nconst MAX_CSS_LENGTH = 20_000;\r\n\r\nexport function supportsConstructableStylesheets(): boolean {\r\n return (\r\n typeof Document !== 'undefined' &&\r\n 'adoptedStyleSheets' in Document.prototype &&\r\n 'replaceSync' in CSSStyleSheet.prototype\r\n );\r\n}\r\n\r\nexport function sanitizeCss(css: string, scope: string): string {\r\n if (!css || css.length > MAX_CSS_LENGTH) {\r\n return '';\r\n }\r\n\r\n const output: string[] = [];\r\n for (const rule of parseStyleRules(css)) {\r\n const declarations: string[] = [];\r\n for (const prop of Array.from(rule.style)) {\r\n const value = rule.style.getPropertyValue(prop);\r\n\r\n // Custom properties (--name) are always allowed, their values are still checked below\r\n const allowed =\r\n prop.startsWith('--') ||\r\n ALLOWED_PROPERTIES.some(p => prop === p || prop.startsWith(p + '-'));\r\n\r\n // A fixed element could cover the whole page (UI redressing)\r\n const fixedPosition = prop === 'position' && /fixed/i.test(value);\r\n\r\n if (allowed && !fixedPosition && !FORBIDDEN_VALUE.test(value)) {\r\n const priority = rule.style.getPropertyPriority(prop) ? ' !important' : '';\r\n declarations.push(`${prop}: ${value}${priority};`);\r\n }\r\n }\r\n if (!declarations.length) {\r\n continue;\r\n }\r\n\r\n const selectors = splitSelectors(rule.selectorText).map(s => scopeSelector(s, scope));\r\n output.push(`${selectors.join(', ')} { ${declarations.join(' ')} }`);\r\n }\r\n return output.join('\\n');\r\n}\r\n\r\n// Parses CSS with the browser engine and returns only plain style rules\r\n// (at-rules like @import, @media, @font-face are dropped)\r\nfunction parseStyleRules(css: string): CSSStyleRule[] {\r\n let rules: CSSRuleList | undefined;\r\n try {\r\n if (supportsConstructableStylesheets()) {\r\n const sheet = new CSSStyleSheet();\r\n sheet.replaceSync(css);\r\n rules = sheet.cssRules;\r\n } else {\r\n // Fallback: parse inside an inert document so nothing is applied to the page\r\n const inertDoc = document.implementation.createHTMLDocument('');\r\n const style = inertDoc.createElement('style');\r\n style.textContent = css;\r\n inertDoc.head.appendChild(style);\r\n rules = style.sheet?.cssRules;\r\n }\r\n } catch {\r\n return [];\r\n }\r\n return rules\r\n ? Array.from(rules).filter((r): r is CSSStyleRule => r instanceof CSSStyleRule)\r\n : [];\r\n}\r\n\r\n// \":host\" targets the scope element itself, any other selector targets its descendants\r\nfunction scopeSelector(selector: string, scope: string): string {\r\n return selector.includes(':host') ? selector.replace(/:host/g, scope) : `${scope} ${selector}`;\r\n}\r\n\r\n// Splits a selector list on top-level commas, ignoring commas inside (), [] or quotes\r\nfunction splitSelectors(selectorText: string): string[] {\r\n const parts: string[] = [];\r\n let current = '';\r\n let depth = 0;\r\n let quote: string | null = null;\r\n\r\n for (const ch of selectorText) {\r\n if (quote) {\r\n if (ch === quote) quote = null;\r\n } else if (ch === '\"' || ch === \"'\") {\r\n quote = ch;\r\n } else if (ch === '(' || ch === '[') {\r\n depth++;\r\n } else if (ch === ')' || ch === ']') {\r\n depth--;\r\n } else if (ch === ',' && depth === 0) {\r\n parts.push(current);\r\n current = '';\r\n continue;\r\n }\r\n current += ch;\r\n }\r\n parts.push(current);\r\n return parts.map(p => p.trim()).filter(Boolean);\r\n}\r\n","import {\r\n Directive, ElementRef, Input, OnChanges, OnDestroy, PLATFORM_ID, Renderer2, inject,\r\n DOCUMENT\r\n} from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { sanitizeCss, supportsConstructableStylesheets } from '../utils/sanitize-css';\r\n\r\nlet nextId = 0;\r\n\r\n@Directive({\r\n selector: '[css]',\r\n standalone: true,\r\n})\r\nexport class StyleDirective implements OnChanges, OnDestroy {\r\n @Input('css') css = '';\r\n\r\n private readonly renderer = inject(Renderer2);\r\n private readonly doc = inject(DOCUMENT);\r\n private readonly host = inject(ElementRef<HTMLElement>);\r\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\r\n // Unique attribute used to scope the injected rules to this host element\r\n private readonly scopeAttr = `df-style-${nextId++}`;\r\n\r\n // Only one of these is used, depending on browser support\r\n private sheet?: CSSStyleSheet;\r\n private styleEl?: HTMLStyleElement;\r\n\r\n constructor() {\r\n this.renderer.setAttribute(this.host.nativeElement, this.scopeAttr, '');\r\n\r\n // Nothing to inject during server-side rendering\r\n if (!this.isBrowser) {\r\n return;\r\n }\r\n\r\n if (supportsConstructableStylesheets()) {\r\n this.sheet = new CSSStyleSheet();\r\n // Reassign instead of push: older implementations expose a frozen array\r\n this.doc.adoptedStyleSheets = [...this.doc.adoptedStyleSheets, this.sheet];\r\n } else {\r\n // Fallback for browsers without constructable stylesheets\r\n this.styleEl = this.renderer.createElement('style');\r\n this.renderer.appendChild(this.doc.head, this.styleEl);\r\n }\r\n }\r\n\r\n ngOnChanges(): void {\r\n if (!this.isBrowser) {\r\n return;\r\n }\r\n\r\n const safeCss = sanitizeCss(this.css ?? '', `[${this.scopeAttr}]`);\r\n\r\n if (this.sheet) {\r\n this.sheet.replaceSync(safeCss);\r\n } else if (this.styleEl) {\r\n // textContent avoids any HTML parsing of the CSS content\r\n this.renderer.setProperty(this.styleEl, 'textContent', safeCss);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.sheet) {\r\n this.doc.adoptedStyleSheets = this.doc.adoptedStyleSheets.filter(s => s !== this.sheet);\r\n }\r\n if (this.styleEl) {\r\n this.renderer.removeChild(this.doc.head, this.styleEl);\r\n }\r\n }\r\n}\r\n","import {\r\n Component, Input, Output, OnChanges, OnDestroy \r\n , SimpleChanges, ViewEncapsulation, EventEmitter\r\n , ViewChild, ElementRef, Injector,\r\n ChangeDetectionStrategy,\r\n OnInit,\r\n ChangeDetectorRef,\r\n DestroyRef,\r\n Optional,\r\n inject\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ActivatedRoute, Router, Params } from '@angular/router';\r\nimport { FormGroup, AbstractControl, FormArray } from '@angular/forms';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { distinctUntilChanged, map, merge, Observable, Subject, Subscription } from 'rxjs';\r\nimport { FormGroupMode } from '../utils/FormGroupEx';\r\nimport { FormBuilderService } from '../services/builder.service';\r\nimport { IEvaluatorProvider, ProgrammabilityService } from '../services/programmability.service';\r\nimport { ValidationService } from '../services/validation.service';\r\nimport { DisableService } from '../services/disable.service';\r\nimport { StatusService } from '../services/status.service';\r\nimport { EventService } from '../services/event.service';\r\nimport { ComputeService } from '../services/compute.service';\r\nimport { groupByRow } from '../utils/groupByRow';\r\nimport { MetadataService } from '../services/metadata.service';\r\nimport { FormService } from '../services/form.service';\r\nimport { StateService } from '../services/state.service';\r\nimport { FunctionService } from '../services/function.service';\r\nimport { DialogService, FormDialogOptions } from '../services/dialog.service';\r\nimport { SubscribeService } from '../services/subscribe.service';\r\nimport { LifetimeService } from '../services/lifetime.service';\r\nimport { DynamicFieldsComponent } from '../dynamic-fields/dynamic-fields.component';\r\nimport { SirioButton, SirioSidenav, SirioSidenavItem, SirioStep, SirioStepper } from '@wemake4u/form-controls';\r\nimport { RegisterService } from '../services/register.service';\r\nimport { RegisterDirective } from '../directives/register.directive';\r\nimport { StyleDirective } from '../directives/style.directive';\r\nimport { ToBoundArrows } from '../utils/bound';\r\n\r\nimport { Control } from '../controls/control'; \r\nimport { hasFieldFocus, setFocus } from '../utils/focusable';\r\n\r\nimport { LanguageService } from '@wemake4u/interact';\r\nimport { Texts } from '../locale/locale';\r\nimport { localize } from '../locale/localize';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { ScopeService } from '../services/scope.service';\r\n\r\nexport type BrowserNavigation = 'none' | 'fragment' | 'queryParam';\r\n\r\n@Component({\r\n selector: 'app-dynamic-form',\r\n templateUrl: './dynamic-form.component.html',\r\n styleUrls: [\r\n '../shared/bootstrap-grid.scss',\r\n './dynamic-form.component.css'\r\n ],\r\n imports: [CommonModule, ReactiveFormsModule,\r\n RegisterDirective, StyleDirective,\r\n SirioButton, SirioStepper, SirioSidenav,\r\n DynamicFieldsComponent],\r\n providers: [\r\n ProgrammabilityService,\r\n FormBuilderService,\r\n ValidationService,\r\n DisableService,\r\n ComputeService,\r\n StatusService,\r\n EventService,\r\n RegisterService,\r\n MetadataService,\r\n FunctionService,\r\n SubscribeService,\r\n StateService,\r\n LifetimeService\r\n ],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class DynamicFormComponent implements OnInit, OnChanges, OnDestroy, IEvaluatorProvider {\r\n @Input() schema: any;\r\n @Input() formGroup!: FormGroup;\r\n @Input() readOnly: boolean | null = null;\r\n @Input() value: any = {};\r\n @Input() strict: boolean = false;\r\n @Input() showNav: boolean = true;\r\n @Input() showNavButton: boolean = true;\r\n @Input() showProgress: boolean = false;\r\n @Input() showFormTitle: boolean = false;\r\n @Input() progressStatus: boolean = true;\r\n @Input() preventNavigationOnErrors = false;\r\n @Input() browserNavigation: BrowserNavigation = 'none';\r\n @Input() queryParamName = 'v';\r\n @Input() navSize: 'normal' | 'small' = 'normal';\r\n @Input() groupMode: FormGroupMode = \"default\";\r\n @Input() updateMode: 'changes' | 'submit' = 'changes';\r\n @Output() valueChange = new EventEmitter<any>();\r\n @Output() initialized = new EventEmitter<FormGroup>();\r\n @Output() activeNavChange = new EventEmitter<any>();\r\n @ViewChild('default') formDiv!: ElementRef<HTMLDivElement>;\r\n\r\n constructor(private cdr: ChangeDetectorRef\r\n , private destroyRef: DestroyRef\r\n , private programmability: ProgrammabilityService\r\n , private formBuilder: FormBuilderService\r\n , private validationService: ValidationService\r\n , private statusService: StatusService\r\n , private eventService: EventService\r\n , private registerService: RegisterService\r\n , private languageService: LanguageService\r\n , private subscribeService: SubscribeService\r\n , private metadata: MetadataService\r\n , private formService: FormService\r\n , private dialog: DialogService\r\n , private injector: Injector\r\n , private router: Router\r\n , private route: ActivatedRoute\r\n , @Optional() private scope: ScopeService\r\n ) { }\r\n \r\n Texts = Texts;\r\n\r\n ngOnInit(): void {\r\n\r\n this.initQueryParams();\r\n \r\n this.programmability.addEvaluatorProviders(this);\r\n\r\n merge(\r\n this.programmability.evaluationDone.changes,\r\n this.validationService.validationDone.changes,\r\n this.statusService.statusDone.changes)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => {\r\n this.cdr.markForCheck();\r\n }); \r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.clearHandlers();\r\n }\r\n \r\n ngOnChanges(changes: SimpleChanges): void {\r\n\r\n if (changes['schema']) {\r\n this.onChangeSchema();\r\n }\r\n\r\n if (changes['schema'] || (changes['value'] && !this.isEmittedValue(this.value))) {\r\n this.onChangeValue();\r\n }\r\n\r\n if (changes['schema']\r\n || changes['browserNavigation']\r\n || changes['queryParamName']) {\r\n this.listenToUrlChanges();\r\n }\r\n\r\n }\r\n\r\n get forms(): Array<any> {\r\n return this._forms;\r\n }\r\n\r\n locale(component: any, key: string): string {\r\n return localize(this.language, component, key);\r\n }\r\n\r\n canPrevious(): boolean {\r\n return this.getPrevious() != -1; \r\n }\r\n\r\n goPrevious() {\r\n if (this.canPrevious()) {\r\n this.activeNav = this.getPrevious();\r\n }\r\n }\r\n\r\n canNext(): boolean {\r\n return this.getNext() != -1\r\n || this.canRevealErrors();\r\n }\r\n\r\n goNext() {\r\n if (this.canRevealErrors()) {\r\n this.showActiveSilentErrors();\r\n }\r\n const next = this.getNext();\r\n if (next != -1) {\r\n this.activeNav = next;\r\n }\r\n }\r\n\r\n goTo(formName: string, extraParams?: Params): void {\r\n const formIndex = this.metadata.getFormIndexByName(formName);\r\n this.requestNavigation(formIndex, extraParams);\r\n }\r\n\r\n getControl(name: string): Control | null {\r\n return this.registerService.getControl(name);\r\n }\r\n\r\n getControlAs<T extends Control>(name: string, type: new (...args: any[]) => T): T | null {\r\n return this.registerService.getControlAs(name, type);\r\n }\r\n\r\n get activeNav(): number {\r\n return this._activeNav;\r\n }\r\n\r\n @Input()\r\n set activeNav(value: number) {\r\n this.requestNavigation(value);\r\n }\r\n\r\n getFormGroup(path: string | null): FormGroup {\r\n const control = path ? this.formGroup.get(path) : this.formGroup;\r\n if (!(control instanceof FormGroup)) {\r\n throw new Error('Control is not a FormGroup');\r\n }\r\n return control;\r\n }\r\n\r\n getFormStatus(form: any, index: number): FormStatus {\r\n\r\n const current = index == this.activeNav;\r\n\r\n if (this.isInactive(index)) {\r\n return \"inactive\";\r\n }\r\n else if (this.progressStatus && !current) {\r\n const errors = this.countErrors(form);\r\n return errors > 0 ? \"error\" : \"success\";\r\n }\r\n else {\r\n return \"active\";\r\n } \r\n }\r\n\r\n countErrors(form: any): number {\r\n return this.statusService.countErrors(form);\r\n }\r\n\r\n /**\r\n * Steps of the progress bar: one per enabled form, with the state of getFormStatus. The current form is the active\r\n * step; a form \"active\" without being the current one (progressStatus false) stays selectable.\r\n * The same object is returned while nothing changes (OnPush input of wm-sirio-stepper).\r\n */\r\n getProgress(): FormProgress | null {\r\n const steps: SirioStep[] = [];\r\n const formIndexes: number[] = [];\r\n let current = -1;\r\n this.forms.forEach((form, index) => {\r\n if (this.evaluateBoolean(form.disabled))\r\n return;\r\n const status = this.getFormStatus(form, index);\r\n if (index == this.activeNav)\r\n current = steps.length;\r\n formIndexes.push(index);\r\n const label = this.evaluateTemplate(this.locale(form, 'title'));\r\n steps.push(status === 'active'\r\n ? (index == this.activeNav ? { label } : { label, state: 'inactive', selectable: true })\r\n : { label, state: status });\r\n });\r\n if (!steps.length)\r\n return null;\r\n const key = JSON.stringify([steps, formIndexes, current]);\r\n if (this.progressCache?.key !== key)\r\n this.progressCache = { key, value: { steps, formIndexes, current: Math.max(current, 0) } };\r\n return this.progressCache.value;\r\n }\r\n\r\n private progressCache: { key: string, value: FormProgress } | null = null;\r\n\r\n /**\r\n * Entries of the side menu: one per enabled form (value = form index), disabled when the form is inactive, with\r\n * the number of errors as red badge. The same objects are returned while nothing changes: wm-sirio-sidenav finds\r\n * the current entry by identity.\r\n */\r\n getSidenavItems(): FormSidenav | null {\r\n const items: SirioSidenavItem[] = [];\r\n this.forms.forEach((form, index) => {\r\n if (this.evaluateBoolean(form.disabled))\r\n return;\r\n const errors = this.countErrors(form);\r\n const item: SirioSidenavItem = {\r\n label: this.evaluateTemplate(this.locale(form, 'title')),\r\n value: index,\r\n disabled: this.getFormStatus(form, index) === 'inactive',\r\n ...(errors > 0 ? { badge: errors, badgeType: 'danger', badgeLabel: this.locale(Texts, 'Errors') } : {})\r\n };\r\n items.push(item);\r\n });\r\n if (!items.length)\r\n return null;\r\n const key = JSON.stringify([items, this.activeNav]);\r\n if (this.sidenavCache?.key !== key) {\r\n const current = items.find(item => item.value == this.activeNav) ?? null;\r\n this.sidenavCache = { key, value: { items, active: current } };\r\n }\r\n return this.sidenavCache.value;\r\n }\r\n\r\n private sidenavCache: { key: string, value: FormSidenav } | null = null;\r\n\r\n activateForm(formIndex: number | undefined) {\r\n if (typeof formIndex === 'number') {\r\n this.activeNav = formIndex;\r\n }\r\n }\r\n\r\n evaluateBoolean(value: boolean | string | null): boolean | null {\r\n return this.programmability.evaluateBoolean(this.formGroup, value);\r\n }\r\n\r\n evaluateTemplate(value: string | null): string {\r\n return this.programmability.evaluateTemplate(this.formGroup, value);\r\n }\r\n\r\n openForm(template: string, options: FormDialogOptions) {\r\n const formSchema = this.metadata.getTemplateByName(template);\r\n this.openDialog(formSchema, options); \r\n }\r\n\r\n openDialog(formSchema: any, options: FormDialogOptions) {\r\n if (formSchema) {\r\n options = {\r\n ...options,\r\n injector: this.injector\r\n };\r\n this.dialog.openDialog(formSchema, options);\r\n }\r\n }\r\n\r\n isChanged(): boolean {\r\n return this.formGroup.dirty;\r\n }\r\n\r\n isValid(): boolean {\r\n return this.formGroup.valid;\r\n }\r\n\r\n getContext(): Record<string, any> {\r\n return ToBoundArrows(this, [\r\n 'canPrevious',\r\n 'goPrevious',\r\n 'canNext',\r\n 'goNext',\r\n 'goTo',\r\n 'activeNav',\r\n 'submit',\r\n 'navigate'\r\n ]);\r\n }\r\n\r\n submit(): boolean {\r\n this.showSilentErrors();\r\n this.emitValueChange(true);\r\n return this.formGroup.valid;\r\n }\r\n\r\n navigate(commands: any[], replaceUrl = false, queryParams?: Params): void {\r\n this.router.navigate(commands, {\r\n relativeTo: this.route,\r\n queryParams: queryParams,\r\n replaceUrl\r\n });\r\n }\r\n\r\n private valueChangesSubscription: Subscription | null = null;\r\n \r\n private _forms: Array<any> = [];\r\n\r\n private _activeNav: number = 0;\r\n\r\n private defaultValue: any = { };\r\n\r\n private urlSub?: Subscription;\r\n\r\n private initialQueryParams: Params = {};\r\n\r\n private currentQueryParams: Params = {};\r\n\r\n private listenToUrlChanges(): void {\r\n\r\n this.unlistenToUrlChanges();\r\n\r\n if (this.browserNavigation === 'none') return;\r\n\r\n let isFirstEmission = true;\r\n\r\n this.urlSub = this.selectUrlValue(this.browserNavigation)\r\n .pipe(\r\n distinctUntilChanged(),\r\n takeUntilDestroyed(this.destroyRef))\r\n .subscribe(value => {\r\n const isFirst = isFirstEmission;\r\n isFirstEmission = false;\r\n if (isFirst && !value) return;\r\n this.navigateFromUrl(value);\r\n });\r\n }\r\n\r\n private unlistenToUrlChanges(): void {\r\n this.urlSub?.unsubscribe();\r\n this.urlSub = undefined;\r\n }\r\n\r\n private selectUrlValue(strategy: BrowserNavigation): Observable<string | null> {\r\n const key = this.urlKey;\r\n\r\n switch (strategy) {\r\n case 'queryParam':\r\n return this.route.queryParamMap.pipe(map(params => params.get(key)));\r\n\r\n case 'fragment':\r\n default:\r\n return this.route.fragment;\r\n }\r\n }\r\n\r\n private requestNavigation(value: number, extraParams?: Params): void {\r\n if (!this.canNavigateTo(value)) return;\r\n\r\n if (this.browserNavigation !== 'none') {\r\n this.navigateToUrl(value, false, extraParams);\r\n } else {\r\n this.applyNavigation(value);\r\n }\r\n }\r\n\r\n private canNavigateTo(value: number): boolean {\r\n return value !== this._activeNav\r\n && this.canActivate(value);\r\n }\r\n\r\n private navigateToUrl(index: number, replaceUrl = false, extraParams?: Params): void {\r\n const value = this.toUrlValue(index);\r\n if (!value) return;\r\n\r\n switch (this.browserNavigation) {\r\n case 'queryParam':\r\n this.router.navigate([], {\r\n relativeTo: this.route,\r\n queryParams: this.buildQueryParams(extraParams, value),\r\n // No queryParamsHandling: the query string is rewritten from scratch,\r\n // so the previous call's extra params disappear\r\n replaceUrl,\r\n });\r\n break;\r\n\r\n case 'fragment':\r\n default:\r\n this.router.navigate([], {\r\n relativeTo: this.route,\r\n fragment: value,\r\n queryParams: this.buildQueryParams(extraParams),\r\n replaceUrl,\r\n });\r\n break;\r\n }\r\n }\r\n\r\n private navigateFromUrl(urlValue: string | null): void {\r\n const formIndex = urlValue ? this.fromUrlValue(urlValue) : 0;\r\n if (!this.canNavigateTo(formIndex)) return; // unknown, invalid or already active\r\n\r\n this.applyNavigation(formIndex);\r\n }\r\n\r\n private applyNavigation(value: number): void {\r\n this._activeNav = value;\r\n\r\n setTimeout(() => {\r\n this.autoFocus();\r\n this.activeNavChange.emit(this._activeNav);\r\n });\r\n\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private initQueryParams() {\r\n this.initialQueryParams = { ...this.route.snapshot.queryParams };\r\n }\r\n\r\n private buildQueryParams(extraParams?: Params, ownValue?: string): Params {\r\n const { [this.queryParamName]: _ownKey, ...preserved } = this.initialQueryParams;\r\n\r\n return {\r\n ...extraParams,\r\n ...preserved,\r\n ...(ownValue ? { [this.queryParamName]: ownValue } : {}),\r\n };\r\n }\r\n\r\n private toUrlValue(index: number) : string {\r\n const formName = this.metadata.getFormNameByIndex(index);\r\n return formName?.trim()\r\n ? encodeURIComponent(formName.trim())\r\n : `${this.urlKey}${index}`;\r\n }\r\n\r\n private fromUrlValue(url: string) : number {\r\n if (!url) return -1;\r\n const value = decodeURIComponent(url);\r\n const byName = this.metadata.getFormIndexByName(value);\r\n if (byName !== -1) return byName;\r\n const prefix = this.urlKey;\r\n if (!value.startsWith(prefix)) return -1;\r\n const index = Number(value.slice(prefix.length));\r\n return index;\r\n }\r\n\r\n private get urlKey(): string {\r\n return this.queryParamName?.trim() || 'v';\r\n }\r\n\r\n private get language(): string {\r\n return this.languageService.getLanguage();\r\n }\r\n\r\n private onChangeSchema() {\r\n if (!this.schema) return;\r\n\r\n if (!this.formGroup) {\r\n this.formGroup = new FormGroup({});\r\n }\r\n\r\n this.clearControls();\r\n\r\n this.clearHandlers();\r\n\r\n const schema = this.schema;\r\n\r\n const allForms = groupByRow(schema.forms ?? []);\r\n\r\n this.metadata.setSchema(schema);\r\n\r\n this.metadata.setForms(allForms);\r\n\r\n this._forms = allForms.filter(item => item.isTemplate !== true);\r\n\r\n this.formBuilder.buildForm(this.formGroup, this.forms, this.groupMode);\r\n\r\n this.defaultValue = this.formGroup.value;\r\n\r\n if (this.initialized)\r\n this.initialized.emit(this.formGroup);\r\n\r\n this.registerHandlers();\r\n\r\n this.assignActivaNav();\r\n }\r\n\r\n private onChangeValue() {\r\n if (!this.schema) return;\r\n this.patchingValue(() => {\r\n const emitEvent = true;\r\n this.formGroup.reset(this.defaultValue, { emitEvent });\r\n this.clearFormArrays(this.formGroup, emitEvent);\r\n this.formService.patch(this.formGroup, this.value, {\r\n emitEvent,\r\n strict: this.strict\r\n });\r\n });\r\n this.assignActivaNav();\r\n }\r\n\r\n private patchingValue(fn: () => void) : void {\r\n try {\r\n this.validationService.suppress = true;\r\n this.eventService.suppress = true;\r\n this.suspendValueChanges = true;\r\n this.subscribeService.dispatchMode = \"sync\";\r\n fn();\r\n }\r\n finally {\r\n this.subscribeService.dispatchMode = \"async\";\r\n this.validationService.suppress = false;\r\n this.eventService.suppress = false;\r\n this.formService.updateAllValueAndValidity(this.formGroup, true);\r\n this.suspendValueChanges = false;\r\n this.emitValueChange(false);\r\n }\r\n }\r\n\r\n private assignActivaNav() {\r\n if (!this.isFormActivable(this._activeNav)) {\r\n this.activeNav = this.getNextFrom(-1);\r\n }\r\n else {\r\n setTimeout(() => this.autoFocus());\r\n }\r\n }\r\n\r\n private suspendValueChanges: boolean = false;\r\n\r\n private registerHandlers(): void {\r\n this.valueChangesSubscription = this.formGroup.valueChanges.subscribe((value) => {\r\n if (this.suspendValueChanges)\r\n return;\r\n this.emitValueChange(false); \r\n });\r\n };\r\n\r\n private clearHandlers(): void {\r\n if (this.valueChangesSubscription) {\r\n this.valueChangesSubscription.unsubscribe();\r\n }\r\n }\r\n\r\n private emittedValues = new WeakMap<object, true>();\r\n\r\n private isEmittedValue(value: any): boolean {\r\n if (typeof value === 'object' && value !== null && this.emittedValues.has(value)) {\r\n this.emittedValues.delete(value);\r\n return true;\r\n }\r\n else {\r\n return false;\r\n }\r\n }\r\n\r\n private emitValueChange(submit: boolean): void {\r\n if (!this.shouldEmit(submit)) return;\r\n const newValue = this.formGroup.value;\r\n this.emittedValues.set(newValue, true);\r\n setTimeout(() => this.valueChange.emit(newValue));\r\n }\r\n\r\n private shouldEmit(submit: boolean): boolean {\r\n switch (this.updateMode) {\r\n case 'submit': return submit;\r\n case 'changes': return !submit;\r\n default: return true;\r\n }\r\n }\r\n\r\n readonly refreshed = new Subject<void>();\r\n\r\n refresh() {\r\n try {\r\n this.suspendValueChanges = true;\r\n this.formService.patch(this.formGroup, this.value, {\r\n strict: this.strict\r\n });\r\n this.refreshed.next();\r\n this.cdr.markForCheck(); \r\n } finally {\r\n this.suspendValueChanges = false;\r\n }\r\n }\r\n\r\n private getNext(): number {\r\n return this.getNextFrom(this.activeNav); \r\n }\r\n\r\n private getNextFrom(from: number): number {\r\n let index = from + 1;\r\n const max = this.getMaxNav();\r\n\r\n while (index < max) {\r\n if (this.isFormActivable(index)) {\r\n return index;\r\n }\r\n index++;\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n private getPrevious(): number {\r\n return this.getPreviousFrom(this.activeNav);\r\n }\r\n\r\n private getPreviousFrom(from: number): number {\r\n let index = from - 1;\r\n\r\n while (index >= 0) {\r\n if (this.isFormActivable(index)) {\r\n return index;\r\n }\r\n index--;\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n private getMaxNav(): number {\r\n return this.forms.length ?? 0; \r\n };\r\n\r\n private isFormActivable(index: number): boolean {\r\n return index >= 0\r\n && index < this.getMaxNav()\r\n && !this.isDisabled(index)\r\n && !this.isInactive(index);\r\n }\r\n\r\n private isDisabled(index: number): boolean {\r\n var form = this.getFormByIndex(index);\r\n\r\n if (!form)\r\n return false;\r\n\r\n return this.evaluateBoolean(form.disabled) ?? false;\r\n }\r\n\r\n private isInactive(index: number): boolean {\r\n var form = this.getFormByIndex(index);\r\n\r\n if (!form)\r\n return false;\r\n\r\n if (this.evaluateBoolean(form.inactive) ?? false)\r\n return true;\r\n\r\n if (this.preventNavigationOnErrors && this.hasPreviousErrors(index))\r\n return true;\r\n\r\n return false;\r\n }\r\n\r\n private canActivate(value: number): boolean {\r\n return value >= 0\r\n && value < this.getMaxNav()\r\n && !this.isDisabled(value)\r\n && !this.isInactive(value);\r\n }\r\n\r\n private hasPreviousErrors(index: number): boolean {\r\n for (let i = index - 1; i >= 0; i--) {\r\n const previousForm = this.getFormByIndex(i);\r\n\r\n if (previousForm && this.statusService.countErrors(previousForm, true) > 0) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n \r\n private clearControls(): void {\r\n Object.keys(this.formGroup.controls).forEach(key => {\r\n this.formGroup.removeControl(key);\r\n });\r\n }\r\n\r\n private clearFormArrays(control: AbstractControl, emitEvent: boolean): void {\r\n if (control instanceof FormArray && control.controls.length > 0) {\r\n control.clear({ emitEvent });\r\n control.markAsPristine();\r\n control.markAsUntouched();\r\n } else if (control instanceof FormGroup) {\r\n Object.values(control.controls).forEach(childControl => {\r\n this.clearFormArrays(childControl, emitEvent);\r\n });\r\n }\r\n }\r\n\r\n private getCurrentForm(): any | null {\r\n return this.getFormByIndex(this.activeNav); \r\n }\r\n\r\n private disableAutoFocus(): boolean {\r\n const form = this.getCurrentForm();\r\n return (form?.disableAutoFocus === true);\r\n }\r\n \r\n private autoFocus(): void {\r\n if (this.disableAutoFocus())\r\n return;\r\n if (this.formDiv?.nativeElement) {\r\n setTimeout(() => {\r\n if (!hasFieldFocus(this.formDiv.nativeElement))\r\n setFocus(this.formDiv.nativeElement);\r\n });\r\n }\r\n }\r\n\r\n private canRevealErrors(): boolean {\r\n return this.hasActiveSilentErrors()\r\n && this.hasPotentialNextForm();\r\n }\r\n\r\n private hasPotentialNextForm(): boolean {\r\n let index = this.activeNav + 1;\r\n const max = this.getMaxNav();\r\n\r\n while (index < max) {\r\n if (!this.isDisabled(index)) {\r\n return true;\r\n }\r\n index++;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n hasSilentErrors(): boolean {\r\n return this.validationService.hasSilentErrors(this.getSilentScope(\"all\"));\r\n }\r\n\r\n showSilentErrors(): void {\r\n this.validationService.revealSilentErrors(this.getSilentScope(\"all\"));\r\n }\r\n\r\n private hasActiveSilentErrors(): boolean {\r\n return this.validationService.hasSilentErrors(this.getSilentScope(\"active\"));\r\n }\r\n\r\n private showActiveSilentErrors(): void {\r\n this.validationService.revealSilentErrors(this.getSilentScope(\"active\"));\r\n }\r\n\r\n private getSilentScope(scope: 'all' | 'active'): Iterable<AbstractControl> {\r\n if (!this.validationService.allowSilentError())\r\n return [];\r\n return scope === 'active'\r\n ? this.getActiveControls()\r\n : this.getAllControls();\r\n }\r\n\r\n private getAllControls(): Iterable<AbstractControl> {\r\n return this.formService.enumerateControls(this.formGroup);\r\n }\r\n\r\n private *getActiveControls(): Generator<AbstractControl> {\r\n const key = this.getCurrentForm();\r\n if (key == null) return;\r\n yield* this.statusService.enumerateControls(key);\r\n }\r\n\r\n private getFormByIndex(index: number): any | null { \r\n if (!Number.isInteger(index)\r\n || index < 0\r\n || index >= (this.forms?.length ?? 0)) return null;\r\n return this.forms[index] ?? null;\r\n }\r\n}\r\n\r\n/** State of a form in the progress bar and in the side navigation. */\r\ntype FormStatus = 'inactive' | 'active' | 'success' | 'error';\r\n\r\n/** Steps of the progress bar and the form of each step. */\r\ninterface FormProgress {\r\n steps: SirioStep[];\r\n formIndexes: number[];\r\n current: number;\r\n}\r\n\r\n/** Entries of the side menu and the current one. */\r\ninterface FormSidenav {\r\n items: SirioSidenavItem[];\r\n active: SirioSidenavItem | null;\r\n}\r\n","@if (schema) {\r\n <div [formGroup]=\"formGroup\" class=\"ngs\" [css]=\"schema.styles\">\r\n <div class=\"row\">\r\n <!-- #region progress -->\r\n @if (showProgress) {\r\n <!-- @wemake4u/form-controls: one step per enabled form; the forms with a state can be selected. -->\r\n @if (getProgress(); as progress) {\r\n <wm-sirio-stepper navigable\r\n [steps]=\"progress.steps\"\r\n [current]=\"progress.current\"\r\n (stepSelected)=\"activateForm(progress.formIndexes[$event])\" />\r\n }\r\n }\r\n <!-- #endregion -->\r\n @if (showNav) {\r\n <div [ngClass]=\"navSize === 'small' ? 'col-md-2' : 'col-md-4'\">\r\n <!-- #region sidenav -->\r\n <!-- @wemake4u/form-controls: from 992px a column of the page, below a full screen dialog opened by the kit button. -->\r\n @if (getSidenavItems(); as nav) {\r\n <wm-sirio-sidenav [items]=\"nav.items\"\r\n [active]=\"nav.active\"\r\n (itemClick)=\"activateForm($any($event.item.value))\"\r\n [openLabel]=\"locale(Texts, 'OpenMenu')\"\r\n [closeLabel]=\"locale(Texts, 'CloseMenu')\" />\r\n }\r\n <!-- #endregion -->\r\n </div>\r\n <div class=\"col-md-1\">\r\n <div class=\"separator-horizontal\"></div>\r\n </div>\r\n }\r\n <div class=\"content-element-form\" [ngClass]=\"showNav ? (navSize === 'small' ? 'col-md-13' : 'col-md-11') : 'col-md-16'\">\r\n @for (form of forms; track form; let sectionIndex = $index) {\r\n @if (activeNav == sectionIndex && !evaluateBoolean(form.disabled)) {\r\n <div #default\r\n [register]=\"form\"\r\n [componentRef]=\"default\">\r\n @if (showFormTitle && form.title) {\r\n <h1 class=\"h3 form-title\">{{ evaluateTemplate(locale(form, 'title')) }}</h1>\r\n }\r\n <app-dynamic-fields [form]=\"this\"\r\n [formGroup]=\"getFormGroup(form.path)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(form.readonly)\"\r\n [rows]=\"form.rows\"\r\n [identity]=\"form.id\"\r\n [disableAutoFocus]=\"form.disableAutoFocus\"\r\n [alignment]=\"form.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n }\r\n }\r\n @if (showNavButton && (canNext() || canPrevious())) {\r\n <div class=\"row section-navs\">\r\n <div class=\"col-8 col-md-8\">\r\n @if (canNext()) {\r\n <button type=\"button\" wmSirioButton=\"ghost\" icon=\"fa-chevron-right\" (click)=\"goNext()\" class=\"nextSection\">{{ locale(Texts, 'NextSection') }}</button>\r\n }\r\n </div>\r\n <div class=\"col-8 col-md-8\">\r\n @if (canPrevious()) {\r\n <button type=\"button\" wmSirioButton=\"ghost\" icon=\"fa-chevron-left\" iconPosition=\"start\" (click)=\"goPrevious()\" class=\"prevSection\">{{ locale(Texts, 'PreviousSection') }}</button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n","export function syncronize(target: any, source: any): any {\r\n // If source is a primitive or null/undefined → replace directly\r\n if (source === null || source === undefined || typeof source !== \"object\") {\r\n return source;\r\n }\r\n\r\n // If target is null/undefined or a primitive → create a new container (array/object)\r\n if (target === null || target === undefined || typeof target !== \"object\") {\r\n target = Array.isArray(source) ? [] : {};\r\n }\r\n\r\n // Handle arrays\r\n if (Array.isArray(source)) {\r\n if (!Array.isArray(target)) {\r\n target = [];\r\n }\r\n\r\n target.length = source.length;\r\n\r\n for (let i = 0; i < source.length; i++) {\r\n target[i] = syncronize(target[i], source[i]);\r\n }\r\n\r\n return target;\r\n }\r\n\r\n // Handle objects\r\n\r\n // Remove missing keys\r\n for (const key of Object.keys(target)) {\r\n if (!(key in source)) {\r\n delete target[key];\r\n }\r\n }\r\n\r\n // Add or update keys\r\n for (const [key, value] of Object.entries(source)) {\r\n target[key] = syncronize(target[key], value);\r\n }\r\n\r\n return target;\r\n}\r\n","export interface RefContext {\r\n parent: any;\r\n key: string | number | null;\r\n root: any;\r\n}\r\n\r\nexport type RefResolver = (\r\n ref: string,\r\n ctx: RefContext\r\n) => any;\r\n\r\nexport type AsyncRefResolver = (\r\n ref: string,\r\n ctx: RefContext\r\n) => Promise<any>;\r\n\r\nexport interface ResolveRefsOptions {\r\n mergeRef?: boolean;\r\n}\r\n\r\nexport function resolveRefs<T>(\r\n input: T,\r\n resolver: RefResolver,\r\n options: ResolveRefsOptions = {}\r\n): T {\r\n\r\n const { mergeRef = false } = options;\r\n\r\n function visit(\r\n node: any,\r\n parent: any,\r\n key: any,\r\n root: any\r\n ): any {\r\n\r\n // Array\r\n if (Array.isArray(node)) {\r\n return node.map((v, i) => visit(v, node, i, root));\r\n }\r\n\r\n // Object\r\n if (node && typeof node === 'object') {\r\n\r\n if (\r\n Object.prototype.hasOwnProperty.call(node, '$ref') &&\r\n typeof node.$ref === 'string'\r\n ) {\r\n\r\n const resolved = resolver(node.$ref, { parent, key, root });\r\n\r\n if (mergeRef) {\r\n const { $ref, ...overrides } = node;\r\n return {\r\n ...resolved,\r\n ...overrides\r\n };\r\n }\r\n\r\n return resolved;\r\n }\r\n\r\n const result: any = {};\r\n for (const k of Object.keys(node)) {\r\n result[k] = visit(node[k], node, k, root);\r\n }\r\n return result;\r\n }\r\n\r\n return node;\r\n }\r\n\r\n return visit(input, null, null, input);\r\n}\r\n\r\n\r\nexport async function resolveRefsAsync<T>(\r\n input: T,\r\n resolver: AsyncRefResolver,\r\n options: ResolveRefsOptions = {}\r\n): Promise<T> {\r\n\r\n const { mergeRef = false } = options;\r\n\r\n async function visit(\r\n node: any,\r\n parent: any,\r\n key: any,\r\n root: any\r\n ): Promise<any> {\r\n\r\n // Array\r\n if (Array.isArray(node)) {\r\n const result = [];\r\n for (let i = 0; i < node.length; i++) {\r\n result[i] = await visit(node[i], node, i, root);\r\n }\r\n return result;\r\n }\r\n\r\n // Object\r\n if (node && typeof node === 'object') {\r\n\r\n if (\r\n Object.prototype.hasOwnProperty.call(node, '$ref') &&\r\n typeof node.$ref === 'string'\r\n ) {\r\n\r\n const resolved = await resolver(node.$ref, { parent, key, root });\r\n\r\n if (mergeRef) {\r\n const { $ref, ...overrides } = node;\r\n return {\r\n ...resolved,\r\n ...overrides\r\n };\r\n }\r\n\r\n return resolved;\r\n }\r\n\r\n const result: any = {};\r\n for (const k of Object.keys(node)) {\r\n result[k] = await visit(node[k], node, k, root);\r\n }\r\n return result;\r\n }\r\n\r\n return node;\r\n }\r\n\r\n return visit(input, null, null, input);\r\n}\r\n\r\n\r\n","export function deepEqual(a: any, b: any\r\n , options?: { handleCircular?: boolean }\r\n , visited?: WeakMap<any, any>): boolean\r\n{\r\n // Lazy init\r\n if (options?.handleCircular && !visited) {\r\n visited = new WeakMap();\r\n }\r\n\r\n // Same reference or same primitive value\r\n if (a === b) return true;\r\n\r\n // Handle null / undefined\r\n if (a == null || b == null) return a === b;\r\n\r\n // Different types\r\n if (typeof a !== typeof b) return false;\r\n\r\n // Non-object values (number, string, boolean, symbol)\r\n if (typeof a !== 'object') return Object.is(a, b);\r\n\r\n // Circular reference handling\r\n if (visited) {\r\n if (visited.get(a) === b) return true;\r\n visited.set(a, b);\r\n }\r\n\r\n // Different constructors → different types\r\n if (a.constructor !== b.constructor) return false;\r\n\r\n // Array comparison (order matters)\r\n if (Array.isArray(a)) {\r\n if (a.length !== b.length) return false;\r\n\r\n for (let i = 0; i < a.length; i++) {\r\n if (!deepEqual(a[i], b[i], options, visited)) return false;\r\n }\r\n return true;\r\n }\r\n\r\n // Date comparison\r\n if (a instanceof Date) {\r\n return a.getTime() === b.getTime();\r\n }\r\n\r\n // Object comparison (property order does NOT matter)\r\n const keys = Object.keys(a);\r\n if (keys.length !== Object.keys(b).length) return false;\r\n\r\n for (let i = 0; i < keys.length; i++) {\r\n const key = keys[i];\r\n if (b[key] === undefined && !(key in b)) return false;\r\n if (!deepEqual(a[key], b[key], options, visited)) return false;\r\n }\r\n\r\n return true;\r\n}\r\n","import { Router } from '@angular/router';\r\n\r\nexport function navigateTo(router: Router, uri: string): void {\r\n if (!router || uri == null) return\r\n\r\n var routeData = parseRoute(uri);\r\n\r\n router.navigate([routeData.route], {\r\n queryParams: routeData.queryParams\r\n });\r\n}\r\n\r\nexport function parseRoute(uri: string): { route: string; queryParams: Record<string, string> } {\r\n\r\n const url = new URL(uri, 'http://dummy');\r\n\r\n const params: Record<string, string> = {};\r\n\r\n url.searchParams.forEach((value, key) => {\r\n params[key] = value;\r\n });\r\n\r\n return {\r\n route: url.pathname.replace(/^\\/+/, ''),\r\n queryParams: params\r\n };\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { IGetRowsParams } from 'ag-grid-community';\r\nimport { IRowsSource } from './interfaces';\r\n\r\nexport class ODataSource implements IRowsSource {\r\n constructor(private url: string\r\n , private http: HttpClient) {\r\n }\r\n\r\n getRows(params: IGetRowsParams) {\r\n const queryString = this.getQueryString(params);\r\n\r\n let queryUrl = `${this.url}${queryString}`\r\n\r\n this.http.get<any>(queryUrl, { observe: 'response' }).subscribe({\r\n next: response => {\r\n const data = response.body ?? [];\r\n const count = response.headers.get('X-Total-Count');\r\n params.successCallback(data, this.toNumber(count));\r\n },\r\n error: error => {\r\n console.log(error);\r\n params.failCallback();\r\n }\r\n });\r\n }\r\n\r\n private getQueryString(params: IGetRowsParams): string {\r\n let queryParams = new HttpParams();\r\n queryParams = this.addCount(queryParams);\r\n queryParams = this.addSkipAndTake(params, queryParams);\r\n queryParams = this.addOrderBy(params, queryParams);\r\n queryParams = this.addFilterBy(params, queryParams);\r\n\r\n const queryString = queryParams.toString();\r\n return queryString ? \"?\" + queryString : queryString;\r\n }\r\n\r\n private addCount(queryParams: HttpParams): HttpParams {\r\n return queryParams.set(\"$count\", \"true\");\r\n }\r\n\r\n private addSkipAndTake(params: IGetRowsParams, queryParams: HttpParams): HttpParams {\r\n return queryParams\r\n .set(\"$top\", `${params.endRow - params.startRow}`)\r\n .set(\"$skip\", `${params.startRow}`);\r\n }\r\n\r\n private addOrderBy(params: IGetRowsParams, queryParams: HttpParams): HttpParams {\r\n if (!params.sortModel || params.sortModel.length === 0) {\r\n return queryParams;\r\n }\r\n\r\n const orderByParams = params.sortModel\r\n .map(sort => `${sort.colId} ${sort.sort}`)\r\n .join(\",\");\r\n\r\n return queryParams.set(\"$orderby\", orderByParams);\r\n }\r\n\r\n private addFilterBy(params: IGetRowsParams, queryParams: HttpParams): HttpParams {\r\n\r\n const filterModel = params.filterModel;\r\n\r\n if (!filterModel || Object.keys(filterModel).length === 0) {\r\n return queryParams;\r\n }\r\n\r\n const filters: string[] = [];\r\n\r\n for (const column in filterModel) {\r\n const filter = filterModel[column];\r\n\r\n const condition = this.getCondition(column, filter);\r\n\r\n if (condition) {\r\n filters.push(condition);\r\n }\r\n }\r\n\r\n return queryParams.set(\"$filter\", filters.join(\" and \"));\r\n }\r\n\r\n private getCondition(column: string, filter: any): string | null {\r\n\r\n if (filter.operator === \"AND\" || filter.operator === \"OR\") {\r\n if (Array.isArray(filter.conditions)) {\r\n return \"(\" + filter.conditions.map((subfilter: any) => this.getCondition(column, subfilter))\r\n .join(` ${filter.operator.toLowerCase()} `) + \")\";\r\n }\r\n return null;\r\n }\r\n\r\n const value = filter.filter;\r\n\r\n switch (filter.filterType) {\r\n case \"text\":\r\n const text = (value ?? \"\").replace(/'/g, \"''\");\r\n if (filter.type === \"contains\") {\r\n return `contains(${column}, '${text}')`;\r\n } else if (filter.type === \"notContains\") {\r\n return `not contains(${column}, '${text}')`;\r\n } else if (filter.type === \"equals\") {\r\n return `${column} eq '${text}'`;\r\n } else if (filter.type === \"notEqual\") {\r\n return `${column} ne '${text}'`;\r\n } else if (filter.type === \"startsWith\") {\r\n return `startswith(${column}, '${text}')`;\r\n } else if (filter.type === \"endsWith\") {\r\n return `endswith(${column}, '${text}')`;\r\n } else if (filter.type === \"blank\") {\r\n return `${column} eq null`;\r\n } else if (filter.type === \"notBlank\") {\r\n return `${column} ne null`;\r\n } else if (filter.type === \"true\") {\r\n return `${column} eq true`;\r\n } else if (filter.type === \"false\") {\r\n return `${column} eq false`;\r\n }\r\n break;\r\n\r\n case \"number\":\r\n if (filter.type === \"equals\") {\r\n return `${column} eq ${value}`;\r\n } else if (filter.type === \"greaterThan\") {\r\n return `${column} gt ${value}`;\r\n } else if (filter.type === \"lessThan\") {\r\n return `${column} lt ${value}`;\r\n } else if (filter.type === \"greaterThanOrEqual\") {\r\n return `${column} ge ${value}`;\r\n } else if (filter.type === \"lessThanOrEqual\") {\r\n return `${column} le ${value}`;\r\n }\r\n break;\r\n\r\n case \"date\":\r\n return `${column} eq ${value}`; // Modifica se OData usa formati ISO\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private toNumber(value: string | null): number | undefined {\r\n if (!value)\r\n return undefined;\r\n const num = parseFloat(value);\r\n return isNaN(num) ? undefined : num;\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\nexport class RestDataSource<T, T2 = T> {\r\n private params: Record<string, any> = {};\r\n private mapFn?: (data: T) => T2;\r\n\r\n constructor(private http: HttpClient\r\n , private baseUrl: string) { }\r\n\r\n setParam(key: string, value: any): RestDataSource<T, T2> {\r\n if (value !== undefined && value !== null) {\r\n this.params[key] = value;\r\n } else {\r\n delete this.params[key];\r\n }\r\n return this;\r\n }\r\n\r\n setParams(params: Record<string, any>): RestDataSource<T, T2> {\r\n this.params = { ...params };\r\n return this;\r\n }\r\n\r\n setMapFunction(mapFn: (data: T) => T2): RestDataSource<T, T2> {\r\n this.mapFn = mapFn;\r\n return this;\r\n }\r\n\r\n getMapFunction(): ((data: T) => T2) | undefined {\r\n return this.mapFn;\r\n }\r\n\r\n getParam(key: string): any {\r\n return this.params[key];\r\n }\r\n\r\n getParams(): Record<string, any> {\r\n return this.params;\r\n }\r\n\r\n getData(): Observable<T2[]> {\r\n let httpParams = new HttpParams();\r\n\r\n Object.keys(this.params).forEach(key => {\r\n if (this.params[key] !== undefined && this.params[key] !== null) {\r\n httpParams = httpParams.set(key, this.params[key].toString());\r\n }\r\n });\r\n\r\n return this.http.get<T[]>(this.baseUrl, { params: httpParams }).pipe(\r\n map(responseArray =>\r\n this.mapFn ? responseArray.map(item => this.mapFn!(item)) : responseArray as unknown as T2[]\r\n )\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { ODataSource } from '../dataSources/odata';\r\nimport { RestDataSource } from '../dataSources/rest';\r\nimport { IRowsSource } from '../dataSources/interfaces';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DataService {\r\n\r\n constructor(\r\n private http: HttpClient)\r\n { }\r\n\r\n queryOData(url: string): IRowsSource {\r\n return this.createOData(url);\r\n }\r\n\r\n createRest(url: string): RestDataSource<any, any>;\r\n createRest<T>(url: string): RestDataSource<T, T>;\r\n createRest<T, T2>(url: string): RestDataSource<T, T2>;\r\n createRest<T = any, T2 = T>(url: string): RestDataSource<T, T2> {\r\n return new RestDataSource<T, T2>(this.http, url);\r\n }\r\n\r\n private createOData(url: string): IRowsSource {\r\n return new ODataSource(url, this.http);\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ConfirmationController } from '@wemake4u/interact';\r\nimport { DialogOptions, DialogService } from '../services/dialog.service';\r\nimport { Observable } from 'rxjs';\r\n \r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DefaultConfirmationController implements ConfirmationController {\r\n\r\n constructor(private dialogService: DialogService) {\r\n }\r\n\r\n confirm(message?: string, title?: string): Observable<boolean> {\r\n\r\n return new Observable<boolean>(observer => {\r\n const options: DialogOptions = {\r\n title: title,\r\n type: 'info',\r\n onResult: result => {\r\n if (result.action === 'Yes') {\r\n observer.next(true);\r\n } else {\r\n observer.next(false);\r\n }\r\n observer.complete();\r\n }\r\n };\r\n\r\n this.dialogService.confirm(message ?? \"\", options); \r\n });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { NotificationController, NotifyTypes } from '@wemake4u/interact';\r\nimport { ToastService } from '../services/toast.service';\r\nimport { GlobalService } from '../services/global.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DefaultNotificationController implements NotificationController {\r\n\r\n constructor(\r\n private toast: ToastService,\r\n private global : GlobalService\r\n ) {\r\n this.delayTime =\r\n this.global.getProperty(\"notificationDelay\", 5000);\r\n }\r\n\r\n private delayTime: number;\r\n\r\n notify(type: NotifyTypes, message: string, title?: string): void {\r\n\r\n const delay = this.delayTime;\r\n\r\n switch (type) {\r\n case 'info': this.toast.notifyInfo(message, title, delay); break;\r\n case 'warning': this.toast.notifyWarning(message, title, delay); break;\r\n case 'error': this.toast.notifyError(message, title, delay); break;\r\n case 'success': this.toast.notifySuccess(message, title, delay); break;\r\n default: break;\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { PromptController } from '@wemake4u/interact';\r\nimport { DialogOptions, DialogService } from '../services/dialog.service';\r\nimport { Observable } from 'rxjs';\r\n \r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DefaultPromptController implements PromptController {\r\n\r\n constructor(private dialogService: DialogService) {\r\n }\r\n\r\n prompt(message?: string, defaultValue?: string, title?: string): Observable<string | null> {\r\n return new Observable<string | null>(observer => {\r\n const options: DialogOptions = {\r\n title: title,\r\n type: 'info',\r\n onResult: result => {\r\n if (result.action === 'OK') {\r\n observer.next(result.value.input);\r\n }\r\n observer.complete();\r\n }\r\n };\r\n\r\n this.dialogService.prompt(message ?? \"Prompt\", defaultValue, options);\r\n });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Message, MessageFactory } from '@wemake4u/interact';\r\nimport { TimeoutError } from 'rxjs';\r\nimport { LanguageService } from '@wemake4u/interact';\r\nimport { Texts } from '../locale/locale';\r\nimport { localize } from '../locale/localize';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DefaultMessageFactory implements MessageFactory {\r\n\r\n constructor(public languageService: LanguageService) {\r\n }\r\n\r\n createError(err: any): Message {\r\n\r\n if (typeof err.error === 'object' && err.error?.title) {\r\n err = err.error;\r\n }\r\n\r\n const title = err?.title ?? this.getTitleText();\r\n\r\n if (err instanceof TimeoutError) {\r\n return {\r\n title: title,\r\n detail: this.getTimeoutText(),\r\n severity: 'error'\r\n };\r\n }\r\n\r\n const detail = err?.detail\r\n ?? err?.message\r\n ?? this.getDetailText();\r\n\r\n return {\r\n title: title,\r\n detail: detail,\r\n severity: err?.severity === \"warning\" || err?.severity === \"error\"\r\n ? err.severity\r\n : \"error\"\r\n };\r\n }\r\n\r\n private get language(): string {\r\n return this.languageService.getLanguage();\r\n }\r\n\r\n private locale(component: any, key: string): string {\r\n return localize(this.language, component, key);\r\n }\r\n\r\n private getTitleText() {\r\n return this.locale(Texts, \"SomethingWentWrong\");\r\n }\r\n\r\n private getTimeoutText() {\r\n return this.locale(Texts, \"TimeoutOccurred\");\r\n }\r\n\r\n private getDetailText() {\r\n return this.locale(Texts, \"GenericError\");\r\n }\r\n}\r\n","","","","","","","","","","","","import consoleFn from './console.json';\r\nimport formGroupFn from './formGroup.json';\r\nimport dialogFn from './dialog.json';\r\nimport functionFn from './function.json';\r\nimport formatterFn from './formatter.json';\r\nimport registerFn from './register.json';\r\nimport formFn from './form.json';\r\nimport feelFn from './feel.json';\r\nimport jsonFn from './json.json';\r\nimport cacheFn from './cache.json';\r\nimport navFn from './nav.json';\r\n\r\nexport const builtIn = [\r\n consoleFn,\r\n formGroupFn,\r\n {\r\n \"name\": \"fn\",\r\n \"entries\": [\r\n ...dialogFn,\r\n ...functionFn,\r\n ...formatterFn,\r\n ...registerFn,\r\n ...formFn,\r\n ...feelFn,\r\n ...jsonFn,\r\n ...cacheFn,\r\n ...navFn\r\n ]\r\n }\r\n];\r\n"],"mappings":"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AAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;K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"}
1
+ {"version":3,"file":"wemake4u-form-player.mjs","names":[],"sources":["../../../projects/form-player/src/lib/utils/FormGroupEx.ts","../../../projects/form-player/src/lib/utils/FormArrayEx.ts","../../../projects/form-player/src/lib/utils/feelable.ts","../../../projects/form-player/src/lib/utils/CallbackRegistry.ts","../../../projects/form-player/src/lib/locale/locale-it.ts","../../../projects/form-player/src/lib/locale/locale-en.ts","../../../projects/form-player/src/lib/locale/locale-de.ts","../../../projects/form-player/src/lib/locale/locale-fr.ts","../../../projects/form-player/src/lib/locale/locale-es.ts","../../../projects/form-player/src/lib/locale/locale-pt.ts","../../../projects/form-player/src/lib/locale/locale.ts","../../../projects/form-player/src/lib/locale/localize.ts","../../../projects/form-player/src/lib/utils/notifier.ts","../../../projects/form-player/src/lib/utils/proxy.ts","../../../projects/form-player/src/lib/utils/cacheControl.ts","../../../projects/form-player/src/lib/utils/string.ts","../../../projects/form-player/src/lib/services/global.service.ts","../../../projects/form-player/src/lib/services/feel.service.ts","../../../projects/form-player/src/lib/services/weak.service.ts","../../../projects/form-player/src/lib/utils/bound.ts","../../../projects/form-player/src/lib/services/toast.service.ts","../../../projects/form-player/src/lib/dialog/dialog.component.ts","../../../projects/form-player/src/lib/dialog/dialog.component.html","../../../projects/form-player/src/lib/services/dialog.service.ts","../../../projects/form-player/src/lib/services/formatter.service.ts","../../../projects/form-player/src/lib/services/json.service.ts","../../../projects/form-player/src/lib/utils/uuid.ts","../../../projects/form-player/src/lib/utils/window.ts","../../../projects/form-player/src/lib/services/metadata.service.ts","../../../projects/form-player/src/lib/services/function.service.ts","../../../projects/form-player/src/lib/common/path.ts","../../../projects/form-player/src/lib/services/form.service.ts","../../../projects/form-player/src/lib/services/subscribe.service.ts","../../../projects/form-player/src/lib/services/session.service.ts","../../../projects/form-player/src/lib/services/navigation.service.ts","../../../projects/form-player/src/lib/services/state.service.ts","../../../projects/form-player/src/lib/controls/control.ts","../../../projects/form-player/src/lib/services/register.service.ts","../../../projects/form-player/src/lib/utils/signal.ts","../../../projects/form-player/src/lib/services/scope.service.ts","../../../projects/form-player/src/lib/services/programmability.service.ts","../../../projects/form-player/src/lib/services/validation.service.ts","../../../projects/form-player/src/lib/services/disable.service.ts","../../../projects/form-player/src/lib/services/compute.service.ts","../../../projects/form-player/src/lib/services/status.service.ts","../../../projects/form-player/src/lib/services/event.service.ts","../../../projects/form-player/src/lib/services/lifetime.service.ts","../../../projects/form-player/src/lib/services/builder.service.ts","../../../projects/form-player/src/lib/utils/groupByRow.ts","../../../projects/form-player/src/lib/components/objectURLRenderer/objectURLRenderer.component.ts","../../../projects/form-player/src/lib/components/objectURLRenderer/objectURLRenderer.component.html","../../../projects/form-player/src/lib/components/deleteRowRenderer/deleteRowRenderer.component.ts","../../../projects/form-player/src/lib/components/deleteRowRenderer/deleteRowRenderer.component.html","../../../projects/form-player/src/lib/components/actionsCellRenderer/actionsCellRenderer.component.ts","../../../projects/form-player/src/lib/components/actionsCellRenderer/actionsCellRenderer.component.html","../../../projects/form-player/src/lib/common/symbols.ts","../../../projects/form-player/src/lib/common/record.ts","../../../projects/form-player/src/lib/components/setFilter/setFilter.component.ts","../../../projects/form-player/src/lib/components/setFilter/setfilter.component.html","../../../projects/form-player/src/lib/components/hostCellRenderer/hostCellRenderer.component.ts","../../../projects/form-player/src/lib/components/hostCellRenderer/hostCellRenderer.component.html","../../../projects/form-player/src/lib/utils/focusable.ts","../../../projects/form-player/src/lib/services/markdown.service.ts","../../../projects/form-player/src/lib/services/grid.service.ts","../../../projects/form-player/src/lib/services/cache.service.ts","../../../projects/form-player/src/lib/dataSources/ag-grid-model.ts","../../../projects/form-player/src/lib/dataSources/rows-source-adapter.ts","../../../projects/form-player/src/lib/services/sirio-grid.service.ts","../../../projects/form-player/src/lib/components/sirioCellHost/sirioCellHost.component.ts","../../../projects/form-player/src/lib/utils/observableAll.ts","../../../projects/form-player/src/lib/services/chart.service.ts","../../../projects/form-player/src/lib/directives/recursion.directive.ts","../../../projects/form-player/src/lib/directives/framesecurity.directive.ts","../../../projects/form-player/src/lib/directives/grid.directive.ts","../../../projects/form-player/src/lib/directives/change.directive.ts","../../../projects/form-player/src/lib/controls/form.ts","../../../projects/form-player/src/lib/controls/textfield.ts","../../../projects/form-player/src/lib/controls/select.ts","../../../projects/form-player/src/lib/controls/taglist.ts","../../../projects/form-player/src/lib/controls/number.ts","../../../projects/form-player/src/lib/controls/date.ts","../../../projects/form-player/src/lib/controls/time.ts","../../../projects/form-player/src/lib/controls/datetime.ts","../../../projects/form-player/src/lib/controls/checkbox.ts","../../../projects/form-player/src/lib/controls/radio.ts","../../../projects/form-player/src/lib/controls/checklist.ts","../../../projects/form-player/src/lib/controls/textarea.ts","../../../projects/form-player/src/lib/controls/range.ts","../../../projects/form-player/src/lib/controls/filepicker.ts","../../../projects/form-player/src/lib/controls/text.ts","../../../projects/form-player/src/lib/controls/html.ts","../../../projects/form-player/src/lib/controls/image.ts","../../../projects/form-player/src/lib/controls/tab.ts","../../../projects/form-player/src/lib/controls/chart.ts","../../../projects/form-player/src/lib/controls/accordion.ts","../../../projects/form-player/src/lib/controls/dynamiclist.ts","../../../projects/form-player/src/lib/controls/group.ts","../../../projects/form-player/src/lib/utils/observable.ts","../../../projects/form-player/src/lib/controls/table.ts","../../../projects/form-player/src/lib/controls/data-grid.ts","../../../projects/form-player/src/lib/controls/button.ts","../../../projects/form-player/src/lib/controls/separator.ts","../../../projects/form-player/src/lib/controls/spacer.ts","../../../projects/form-player/src/lib/controls/iframe.ts","../../../projects/form-player/src/lib/controls/tooltip.ts","../../../projects/form-player/src/lib/controls/displayfield.ts","../../../projects/form-player/src/lib/controls/navigator.ts","../../../projects/form-player/src/lib/controls/treerlist.ts","../../../projects/form-player/src/lib/controls/factory.ts","../../../projects/form-player/src/lib/directives/register.directive.ts","../../../projects/form-player/src/lib/directives/refresh.directive.ts","../../../projects/form-player/src/lib/directives/navigator.directive.ts","../../../projects/form-player/src/lib/services/listener.service.ts","../../../projects/form-player/src/lib/directives/collapse.directive.ts","../../../projects/form-player/src/lib/directives/treelist.directive.ts","../../../projects/form-player/src/lib/directives/file.directive.ts","../../../projects/form-player/src/lib/directives/jsonfile.directive.ts","../../../projects/form-player/src/lib/directives/attrs.directive.ts","../../../projects/form-player/src/lib/directives/required.directive.ts","../../../projects/form-player/src/lib/directives/requiredblur.directive.ts","../../../projects/form-player/src/lib/directives/markdown.directive.ts","../../../projects/form-player/src/lib/directives/selection.directive.ts","../../../projects/form-player/src/lib/dynamic-host/dynamic-host.component.ts","../../../projects/form-player/src/lib/dynamic-host/dynamic-host.component.html","../../../projects/form-player/src/lib/utils/isMeaningful.ts","../../../projects/form-player/src/lib/utils/flatten.ts","../../../projects/form-player/src/lib/utils/typeGuards.ts","../../../projects/form-player/src/lib/services/announcer.service.ts","../../../projects/form-player/src/lib/services/sirio-validation-presenter.ts","../../../projects/form-player/src/lib/services/sanitize.service.ts","../../../projects/form-player/src/lib/services/mime.service.ts","../../../projects/form-player/src/lib/services/autofocus.service.ts","../../../projects/form-player/src/lib/dynamic-fields/dynamic-fields.component.ts","../../../projects/form-player/src/lib/dynamic-fields/dynamic-fields.component.html","../../../projects/form-player/src/lib/utils/sanitize-css.ts","../../../projects/form-player/src/lib/directives/style.directive.ts","../../../projects/form-player/src/lib/utils/scroll.ts","../../../projects/form-player/src/lib/dynamic-form/dynamic-form.component.ts","../../../projects/form-player/src/lib/dynamic-form/dynamic-form.component.html","../../../projects/form-player/src/lib/utils/syncronize.ts","../../../projects/form-player/src/lib/utils/resolveRefs.ts","../../../projects/form-player/src/lib/utils/deepEqual.ts","../../../projects/form-player/src/lib/utils/navigation.ts","../../../projects/form-player/src/lib/dataSources/odata.ts","../../../projects/form-player/src/lib/dataSources/rest.ts","../../../projects/form-player/src/lib/services/data.service.ts","../../../projects/form-player/src/lib/interact/confirmation.ts","../../../projects/form-player/src/lib/interact/notification.ts","../../../projects/form-player/src/lib/interact/prompt.ts","../../../projects/form-player/src/lib/interact/message.ts","../tmp-esm2022/lib/builtIn/console.json","../tmp-esm2022/lib/builtIn/formGroup.json","../tmp-esm2022/lib/builtIn/dialog.json","../tmp-esm2022/lib/builtIn/function.json","../tmp-esm2022/lib/builtIn/formatter.json","../tmp-esm2022/lib/builtIn/register.json","../tmp-esm2022/lib/builtIn/form.json","../tmp-esm2022/lib/builtIn/feel.json","../tmp-esm2022/lib/builtIn/json.json","../tmp-esm2022/lib/builtIn/cache.json","../tmp-esm2022/lib/builtIn/nav.json","../../../projects/form-player/src/lib/builtIn/builtIn.ts"],"sourcesContent":["import { AbstractControl, AbstractControlOptions, AsyncValidatorFn, FormGroup, ValidatorFn } from \"@angular/forms\";\r\nimport { Subscription } from \"rxjs\";\r\n\r\nexport class FormGroupEx<\r\n TControl extends { [K in keyof TControl]: AbstractControl<any> }\r\n> extends FormGroup<TControl> {\r\n\r\n constructor(\r\n controls: TControl,\r\n mode: FormGroupMode,\r\n validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null,\r\n asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null\r\n ) {\r\n super(controls, validatorOrOpts, asyncValidator);\r\n this.mode = mode;\r\n }\r\n\r\n getMode() : FormGroupMode {\r\n return this.mode;\r\n }\r\n\r\n isNull(): boolean {\r\n return this.__isNull;\r\n }\r\n\r\n setNull(): void {\r\n this.setNullValue();\r\n }\r\n\r\n setNotNull(): void {\r\n this.clearNullValue();\r\n }\r\n\r\n private __isNull = false;\r\n private sub?: Subscription;\r\n private mode: FormGroupMode;\r\n\r\n private setNullValue(): void {\r\n if (this.__isNull) return;\r\n\r\n this.__isNull = true;\r\n this.reset({});\r\n\r\n this.sub = this.valueChanges.subscribe(() => {\r\n if (this.dirty)\r\n this.clearNullValue();\r\n });\r\n\r\n this.updateValueAndValidity({ emitEvent: false });\r\n }\r\n\r\n private clearNullValue(): void {\r\n if (!this.__isNull) return;\r\n\r\n this.__isNull = false;\r\n\r\n this.sub?.unsubscribe();\r\n this.sub = undefined;\r\n\r\n this.updateValueAndValidity({ emitEvent: false });\r\n }\r\n\r\n protected _updateValue(): void {\r\n (FormGroup.prototype as any)._updateValue.call(this);\r\n if (this.__isNull) {\r\n (this as any).value = null;\r\n }\r\n }\r\n}\r\n\r\nexport type FormGroupMode = 'default' | 'nullable';\r\n\r\nexport function isNullableGroup(\r\n control: AbstractControl\r\n): control is FormGroupEx<any> {\r\n return control instanceof FormGroupEx\r\n && control.getMode() === \"nullable\";\r\n}\r\n","import {\r\n AbstractControl,\r\n AsyncValidatorFn,\r\n FormArray,\r\n ValidatorFn\r\n} from '@angular/forms';\r\n\r\nimport { Subject } from 'rxjs';\r\n\r\nexport type FormArrayChangeType =\r\n | 'add'\r\n | 'adding'\r\n | 'remove'\r\n | 'removing';\r\n\r\nexport interface FormArrayChange<TControl extends AbstractControl = AbstractControl> {\r\n type: FormArrayChangeType ;\r\n control: TControl;\r\n index: number;\r\n}\r\n\r\nexport class FormArrayEx<TControl extends AbstractControl = AbstractControl>\r\n extends FormArray<TControl> {\r\n\r\n readonly controlsChanges =\r\n new Subject<FormArrayChange<TControl>>();\r\n\r\n constructor(\r\n controls: TControl[],\r\n validatorOrOpts?: ValidatorFn | ValidatorFn[] | null,\r\n asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null\r\n ) {\r\n super(controls, validatorOrOpts, asyncValidator);\r\n }\r\n\r\n override push(control: TControl, options?: { emitEvent?: boolean; }): void {\r\n const index = this.length - 1;\r\n this.notify('adding', index, control);\r\n super.push(control, options);\r\n this.notify('add', index, control);\r\n }\r\n\r\n override insert(index: number, control: TControl, options?: { emitEvent?: boolean; }): void {\r\n this.notify('adding', index, control);\r\n super.insert(index, control, options);\r\n this.notify('add', index, control);\r\n }\r\n\r\n override removeAt(index: number, options?: { emitEvent?: boolean; }): void {\r\n const control = this.at(index) as TControl;\r\n this.notify('removing', index, control);\r\n super.removeAt(index, options);\r\n this.notify('remove', index, control);\r\n }\r\n\r\n override clear(): void {\r\n\r\n while (this.length > 0) {\r\n this.removeAt(0);\r\n }\r\n }\r\n\r\n moveUp(index: number): boolean {\r\n\r\n if (index <= 0 || index >= this.length)\r\n return false;\r\n\r\n const control: TControl = this.at(index) as TControl;\r\n super.removeAt(index);\r\n super.insert(index - 1, control);\r\n\r\n return true;\r\n }\r\n\r\n moveDown(index: number): boolean {\r\n if (index < 0 || index >= this.length - 1) return false;\r\n\r\n const control: TControl = this.at(index) as TControl;\r\n super.removeAt(index);\r\n super.insert(index + 1, control);\r\n\r\n return true;\r\n }\r\n\r\n resize(newSize: number, factory: () => TControl): void {\r\n\r\n while (this.length > newSize) {\r\n this.removeAt(this.length - 1, { emitEvent: false });\r\n }\r\n\r\n while (this.length < newSize) {\r\n this.push(factory(), { emitEvent: false });\r\n }\r\n\r\n this.updateValueAndValidity({ emitEvent: true });\r\n }\r\n\r\n private notify(type: FormArrayChangeType, index: number, control: TControl) {\r\n this.controlsChanges.next({\r\n type: type,\r\n control,\r\n index\r\n });\r\n }\r\n}\r\n","export function toExpression(value: any): string {\r\n return \"=\" + toFeelable(value);\r\n}\r\n\r\nexport function toFeelable(value: any): string {\r\n if (value === null || typeof value === 'number' || typeof value === 'boolean') {\r\n return JSON.stringify(value);\r\n }\r\n\r\n if (typeof value === 'string') {\r\n if (value.startsWith('=')) {\r\n return value.substring(1);\r\n } else {\r\n return JSON.stringify(value);\r\n }\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n const items = value.map(item => toFeelable(item));\r\n return `[${items.join(', ')}]`;\r\n }\r\n\r\n if (typeof value === 'object') {\r\n const entries = Object.entries(value).map(([key, val]) => {\r\n return `\"${key}\": ${toFeelable(val)}`;\r\n });\r\n return `{ ${entries.join(', ')} }`;\r\n }\r\n\r\n return JSON.stringify(null);\r\n}\r\n","export class CallbackRegistry {\r\n private callbacks: (() => void)[] = [];\r\n\r\n register(callback: () => void) {\r\n if (callback)\r\n this.callbacks.push(callback);\r\n }\r\n\r\n clear() {\r\n this.callbacks = [];\r\n }\r\n\r\n invoke() {\r\n for (const cb of this.callbacks) {\r\n cb();\r\n }\r\n }\r\n}\r\n","export const Texts = {\r\n TypeToSearch: \"Digita per cercare...\",\r\n Upload: \"Upload\",\r\n ScrollLeft: \"Scorri a sinistra\",\r\n ScrollRight: \"Scorri a destra\",\r\n AddItem: \"Aggiungi\",\r\n RemoveItem: \"Rimuovi\",\r\n PreviousSection: \"Sezione precedente\",\r\n NextSection: \"Sezione successiva\",\r\n Show: \"Visualizza\",\r\n Remove: \"Rimuovi\",\r\n Close: \"Chiudi\",\r\n Confirm: \"Conferma\",\r\n OK: \"OK\",\r\n Cancel: \"Annulla\",\r\n Abort: \"Interrompi\",\r\n Retry: \"Riprova\",\r\n Ignore: \"Ignora\",\r\n Yes: \"Sì\",\r\n No: \"No\",\r\n Try: \"Prova\",\r\n Continue: \"Continua\",\r\n Name: \"Nome\",\r\n Size: \"Dimensione\",\r\n Type: \"Tipo\",\r\n Actions: \"Azioni\",\r\n ReadMore: \"Leggi di più\",\r\n ReadLess: \"Leggi di meno\",\r\n SelectAll: \"Seleziona tutto\",\r\n ChooseOne: \"Scegli uno\",\r\n True: \"Vero\",\r\n False: \"Falso\",\r\n Blank: \"Vuoto\",\r\n NotBlank: \"Non vuoto\",\r\n Information: \"Informazioni\",\r\n InformationAbout: \"Informazioni su\",\r\n OpenMenu: \"Apri Menu\",\r\n CloseMenu: \"Chiudi Menu\",\r\n Loading: \"Caricamento in corso\",\r\n LoadingFailed: \"Si è verificato un errore durante il caricamento dei dati\",\r\n ConfirmDelete: \"Confermi l’eliminazione ?\\r\\nL’operazione non può essere annullata\",\r\n MoveUp: \"Sposta Sù\",\r\n MoveDown: \"Sposta Giù\",\r\n NoData: \"Nessun dato da mostrare\",\r\n RequiredField: \"Campo obbligatorio\",\r\n Errors: \"errori\",\r\n PreviousElement: \"Elemento precedente\",\r\n NextElement: \"Elemento successivo\",\r\n Elements: \"Elementi\",\r\n Element: \"Elemento\",\r\n GoToElement: \"Vai all'elemento\",\r\n ElementsNavigation: \"Navigazione degli elementi\",\r\n Of: \"di\",\r\n Download: \"Scarica\",\r\n Uploading: \"Caricamento in corso\",\r\n Downloading: \"Scaricamento in corso\",\r\n Deleting: \"Eliminazione in corso\",\r\n Selected: \"Selezionato\",\r\n SelectedPlural: \"Selezionati\",\r\n SomethingWentWrong: \"Si è verificato un problema\",\r\n TimeoutOccurred: \"Il server non ha risposto in tempo. Riprova tra qualche istante\",\r\n GenericError: \"Si è verificato un errore imprevisto\",\r\n ItemPosition: \"elemento {0} di {1}\",\r\n ItemAdded: \"Elemento {0} aggiunto\",\r\n ItemRemoved: \"Elemento {0} rimosso\",\r\n ItemMoved: \"Elemento spostato in posizione {0} di {1}\"\r\n};\r\n","export const Texts = {\r\n TypeToSearch: \"Type to search...\",\r\n Upload: \"Upload\",\r\n ScrollLeft: \"Scroll left\",\r\n ScrollRight: \"Scroll right\",\r\n AddItem: \"Add\",\r\n RemoveItem: \"Remove\",\r\n PreviousSection: \"Previous section\",\r\n NextSection: \"Next section\",\r\n Show: \"Show\",\r\n Remove: \"Remove\",\r\n Close: \"Close\",\r\n Confirm: \"Confirm\",\r\n OK: \"OK\",\r\n Cancel: \"Cancel\",\r\n Abort: \"Abort\",\r\n Retry: \"Retry\",\r\n Ignore: \"Ignore\",\r\n Yes: \"Yes\",\r\n No: \"No\",\r\n Try: \"Try\",\r\n Continue: \"Continue\",\r\n Name: \"Name\",\r\n Size: \"Size\",\r\n Type: \"Type\",\r\n Actions: \"Actions\",\r\n ReadMore: \"Read more\",\r\n ReadLess: \"Read less\",\r\n SelectAll: \"Select all\",\r\n ChooseOne: \"Choose one\",\r\n True: \"True\",\r\n False: \"False\",\r\n Blank: \"Blank\",\r\n NotBlank: \"Not blank\",\r\n Information: \"Information\",\r\n InformationAbout: \"Information about\",\r\n OpenMenu: \"Open menu\",\r\n CloseMenu: \"Close menu\",\r\n Loading: \"Loading\",\r\n LoadingFailed: \"An error occurred while loading data\",\r\n ConfirmDelete: \"Do you confirm the deletion?\\r\\nThis action cannot be undone\",\r\n MoveUp: \"Move Up\",\r\n MoveDown: \"Move Down\",\r\n NoData: \"No data to display\",\r\n RequiredField: \"Required field\",\r\n Errors: \"errors\",\r\n PreviousElement: \"Previous element\",\r\n NextElement: \"Next element\",\r\n Elements: \"Elements\",\r\n Element: \"Element\",\r\n GoToElement: \"Go to element\",\r\n ElementsNavigation: \"Elements navigation\",\r\n Of: \"of\",\r\n Download: \"Download\",\r\n Uploading: \"Uploading\",\r\n Downloading: \"Downloading\",\r\n Deleting: \"Deleting\",\r\n Selected: \"Selected\",\r\n SelectedPlural: \"Selected\",\r\n SomethingWentWrong: \"Something went wrong\",\r\n TimeoutOccurred: \"The server did not respond in time. Please try again in a few moments\",\r\n GenericError: \"An unexpected error occurred\",\r\n ItemPosition: \"item {0} of {1}\",\r\n ItemAdded: \"Item {0} added\",\r\n ItemRemoved: \"Item {0} removed\",\r\n ItemMoved: \"Item moved to position {0} of {1}\"\r\n};\r\n","export const Texts = {\r\n TypeToSearch: \"Zum Suchen tippen...\",\r\n Upload: \"Hochladen\",\r\n ScrollLeft: \"Nach links scrollen\",\r\n ScrollRight: \"Nach rechts scrollen\",\r\n AddItem: \"Hinzufügen\",\r\n RemoveItem: \"Entfernen\",\r\n PreviousSection: \"Vorheriger Abschnitt\",\r\n NextSection: \"Nächster Abschnitt\",\r\n Show: \"Anzeigen\",\r\n Remove: \"Entfernen\",\r\n Close: \"Schließen\",\r\n Confirm: \"Bestätigen\",\r\n OK: \"OK\",\r\n Cancel: \"Abbrechen\",\r\n Abort: \"Abbrechen\",\r\n Retry: \"Wiederholen\",\r\n Ignore: \"Ignorieren\",\r\n Yes: \"Ja\",\r\n No: \"Nein\",\r\n Try: \"Versuchen\",\r\n Continue: \"Fortsetzen\",\r\n Name: \"Name\",\r\n Size: \"Größe\",\r\n Type: \"Typ\",\r\n Actions: \"Aktionen\",\r\n ReadMore: \"Mehr lesen\",\r\n ReadLess: \"Weniger lesen\",\r\n SelectAll: \"Alles auswählen\",\r\n ChooseOne: \"Wähle eine Option\",\r\n True: \"Wahr\",\r\n False: \"Falsch\",\r\n Blank: \"Leer\",\r\n NotBlank: \"Nicht leer\",\r\n Information: \"Informationen\",\r\n InformationAbout: \"Informationen zu\",\r\n OpenMenu: \"Menü öffnen\",\r\n CloseMenu: \"Menü schließen\",\r\n Loading: \"Wird geladen\",\r\n LoadingFailed: \"Beim Laden der Daten ist ein Fehler aufgetreten\",\r\n ConfirmDelete: \"Möchten Sie das Löschen bestätigen?\\r\\nDieser Vorgang kann nicht rückgängig gemacht werden\",\r\n MoveUp: \"Nach oben verschieben\",\r\n MoveDown: \"Nach unten verschieben\",\r\n NoData: \"Keine Daten zum Anzeigen\",\r\n RequiredField: \"Pflichtfeld\",\r\n Errors: \"Fehler\",\r\n PreviousElement: \"Vorheriges Element\",\r\n NextElement: \"Nächstes Element\",\r\n Elements: \"Elemente\",\r\n Element: \"Element\",\r\n GoToElement: \"Gehe zu Element\",\r\n ElementsNavigation: \"Elementnavigation\",\r\n Of: \"von\",\r\n Download: \"Herunterladen\",\r\n Uploading: \"Wird hochgeladen\",\r\n Downloading: \"Wird heruntergeladen\",\r\n Deleting: \"Wird gelöscht\",\r\n Selected: \"Ausgewählt\",\r\n SelectedPlural: \"Ausgewählt\",\r\n SomethingWentWrong: \"Etwas ist schiefgelaufen\",\r\n TimeoutOccurred: \"Der Server hat nicht rechtzeitig geantwortet. Bitte versuchen Sie es in wenigen Augenblicken erneut\",\r\n GenericError: \"Ein unerwarteter Fehler ist aufgetreten\",\r\n ItemPosition: \"Element {0} von {1}\",\r\n ItemAdded: \"Element {0} hinzugefügt\",\r\n ItemRemoved: \"Element {0} entfernt\",\r\n ItemMoved: \"Element an Position {0} von {1} verschoben\"\r\n};\r\n","export const Texts = {\r\n TypeToSearch: \"Tapez pour rechercher...\",\r\n Upload: \"Téléverser\",\r\n ScrollLeft: \"Faire défiler vers la gauche\",\r\n ScrollRight: \"Faire défiler vers la droite\",\r\n AddItem: \"Ajouter\",\r\n RemoveItem: \"Supprimer\",\r\n PreviousSection: \"Section précédente\",\r\n NextSection: \"Section suivante\",\r\n Show: \"Afficher\",\r\n Remove: \"Supprimer\",\r\n Close: \"Fermer\",\r\n Confirm: \"Confirmer\",\r\n OK: \"OK\",\r\n Cancel: \"Annuler\",\r\n Abort: \"Abandonner\",\r\n Retry: \"Réessayer\",\r\n Ignore: \"Ignorer\",\r\n Yes: \"Oui\",\r\n No: \"Non\",\r\n Try: \"Essayer\",\r\n Continue: \"Continuer\",\r\n Name: \"Nom\",\r\n Size: \"Taille\",\r\n Type: \"Type\",\r\n Actions: \"Actions\",\r\n ReadMore: \"Lire la suite\",\r\n ReadLess: \"Lire moins\",\r\n SelectAll: \"Tout sélectionner\",\r\n ChooseOne: \"Choisir un\",\r\n True: \"Vrai\",\r\n False: \"Faux\",\r\n Blank: \"Vide\",\r\n NotBlank: \"Non vide\",\r\n Information: \"Informations\",\r\n InformationAbout: \"Informations sur\",\r\n OpenMenu: \"Ouvrir le menu\",\r\n CloseMenu: \"Fermer le menu\",\r\n Loading: \"Chargement en cours\",\r\n LoadingFailed: \"Erreur lors du chargement des données\",\r\n ConfirmDelete: \"Confirmez-vous la suppression ?\\r\\nCette action ne peut pas être annulée\",\r\n MoveUp: \"Déplacer vers le haut\",\r\n MoveDown: \"Déplacer vers le bas\",\r\n NoData: \"Aucune donnée à afficher\",\r\n RequiredField: \"Champ obligatoire\",\r\n Errors: \"erreurs\",\r\n PreviousElement: \"Élément précédent\",\r\n NextElement: \"Élément suivant\",\r\n Elements: \"Éléments\",\r\n Element: \"Élément\",\r\n GoToElement: \"Aller à l'élément\",\r\n ElementsNavigation: \"Navigation des éléments\",\r\n Of: \"de\",\r\n Download: \"Télécharger\",\r\n Uploading: \"Envoi en cours\",\r\n Downloading: \"Téléchargement en cours\",\r\n Deleting: \"Suppression en cours\",\r\n Selected: \"Sélectionné\",\r\n SelectedPlural: \"Sélectionnés\",\r\n SomethingWentWrong: \"Une erreur s'est produite\",\r\n TimeoutOccurred: \"Le serveur n'a pas répondu à temps. Veuillez réessayer dans quelques instants\",\r\n GenericError: \"Une erreur inattendue s'est produite\",\r\n ItemPosition: \"élément {0} sur {1}\",\r\n ItemAdded: \"Élément {0} ajouté\",\r\n ItemRemoved: \"Élément {0} supprimé\",\r\n ItemMoved: \"Élément déplacé en position {0} sur {1}\"\r\n};\r\n","export const Texts = {\r\n TypeToSearch: \"Escribe para buscar...\",\r\n Upload: \"Subir\",\r\n ScrollLeft: \"Desplazar a la izquierda\",\r\n ScrollRight: \"Desplazar a la derecha\",\r\n AddItem: \"Agregar\",\r\n RemoveItem: \"Eliminar\",\r\n PreviousSection: \"Sección anterior\",\r\n NextSection: \"Sección siguiente\",\r\n Show: \"Mostrar\",\r\n Remove: \"Eliminar\",\r\n Close: \"Cerrar\",\r\n Confirm: \"Confirmar\",\r\n OK: \"OK\",\r\n Cancel: \"Cancelar\",\r\n Abort: \"Abortar\",\r\n Retry: \"Reintentar\",\r\n Ignore: \"Ignorar\",\r\n Yes: \"Sí\",\r\n No: \"No\",\r\n Try: \"Intentar\",\r\n Continue: \"Continuar\",\r\n Name: \"Nombre\",\r\n Size: \"Tamaño\",\r\n Type: \"Tipo\",\r\n Actions: \"Acciones\",\r\n ReadMore: \"Leer más\",\r\n ReadLess: \"Leer menos\",\r\n SelectAll: \"Seleccionar todo\",\r\n ChooseOne: \"Elige uno\",\r\n True: \"Verdadero\",\r\n False: \"Falso\",\r\n Blank: \"Vacío\",\r\n NotBlank: \"No vacío\",\r\n Information: \"Información\",\r\n InformationAbout: \"Información sobre\",\r\n OpenMenu: \"Abrir menú\",\r\n CloseMenu: \"Cerrar menú\",\r\n Loading: \"Cargando\",\r\n LoadingFailed: \"Error al cargar los datos\",\r\n ConfirmDelete: \"¿Confirma la eliminación?\\r\\nEsta acción no se puede deshacer\",\r\n MoveUp: \"Mover arriba\",\r\n MoveDown: \"Mover abajo\",\r\n NoData: \"No hay datos para mostrar\",\r\n RequiredField: \"Campo obligatorio\",\r\n Errors: \"errores\",\r\n PreviousElement: \"Elemento anterior\",\r\n NextElement: \"Elemento siguiente\",\r\n Elements: \"Elementos\",\r\n Element: \"Elemento\",\r\n GoToElement: \"Ir al elemento\",\r\n ElementsNavigation: \"Navegación de elementos\",\r\n Of: \"de\",\r\n Download: \"Descargar\",\r\n Uploading: \"Subiendo\",\r\n Downloading: \"Descargando\",\r\n Deleting: \"Eliminando\",\r\n Selected: \"Seleccionado\",\r\n SelectedPlural: \"Seleccionados\",\r\n SomethingWentWrong: \"Algo salió mal\",\r\n TimeoutOccurred: \"El servidor no respondió a tiempo. Inténtalo de nuevo en unos instantes\",\r\n GenericError: \"Se produjo un error inesperado\",\r\n ItemPosition: \"elemento {0} de {1}\",\r\n ItemAdded: \"Elemento {0} añadido\",\r\n ItemRemoved: \"Elemento {0} eliminado\",\r\n ItemMoved: \"Elemento movido a la posición {0} de {1}\"\r\n};\r\n","export const Texts = {\r\n TypeToSearch: \"Digite para pesquisar...\",\r\n Upload: \"Enviar\",\r\n ScrollLeft: \"Rolar para a esquerda\",\r\n ScrollRight: \"Rolar para a direita\",\r\n AddItem: \"Adicionar\",\r\n RemoveItem: \"Remover\",\r\n PreviousSection: \"Seção anterior\",\r\n NextSection: \"Próxima seção\",\r\n Show: \"Mostrar\",\r\n Remove: \"Remover\",\r\n Close: \"Fechar\",\r\n Confirm: \"Confirmar\",\r\n OK: \"OK\",\r\n Cancel: \"Cancelar\",\r\n Abort: \"Abortar\",\r\n Retry: \"Tentar novamente\",\r\n Ignore: \"Ignorar\",\r\n Yes: \"Sim\",\r\n No: \"Não\",\r\n Try: \"Tentar\",\r\n Continue: \"Continuar\",\r\n Name: \"Nome\",\r\n Size: \"Tamanho\",\r\n Type: \"Tipo\",\r\n Actions: \"Ações\",\r\n ReadMore: \"Leia mais\",\r\n ReadLess: \"Leia menos\",\r\n SelectAll: \"Selecionar tudo\",\r\n ChooseOne: \"Escolha um\",\r\n True: \"Verdadeiro\",\r\n False: \"Falso\",\r\n Blank: \"Vazio\",\r\n NotBlank: \"Não vazio\",\r\n Information: \"Informações\",\r\n InformationAbout: \"Informações sobre\",\r\n OpenMenu: \"Abrir menu\",\r\n CloseMenu: \"Fechar menu\",\r\n Loading: \"A carregar\",\r\n LoadingFailed: \"Erro ao carregar os dados\",\r\n ConfirmDelete: \"Confirma a eliminação?\\r\\nEsta ação não pode ser desfeita\",\r\n MoveUp: \"Mover para cima\",\r\n MoveDown: \"Mover para baixo\",\r\n NoData: \"Nenhum dado para exibir\",\r\n RequiredField: \"Campo obrigatório\",\r\n Errors: \"erros\",\r\n PreviousElement: \"Elemento anterior\",\r\n NextElement: \"Próximo elemento\",\r\n Elements: \"Elementos\",\r\n Element: \"Elemento\",\r\n GoToElement: \"Ir para o elemento\",\r\n ElementsNavigation: \"Navegação dos elementos\",\r\n Of: \"de\",\r\n Download: \"Baixar\",\r\n Uploading: \"Enviando\",\r\n Downloading: \"Baixando\",\r\n Deleting: \"Excluindo\",\r\n Selected: \"Selecionado\",\r\n SelectedPlural: \"Selecionados\",\r\n SomethingWentWrong: \"Algo deu errado\",\r\n TimeoutOccurred: \"O servidor não respondeu a tempo. Tente novamente dentro de alguns instantes\",\r\n GenericError: \"Ocorreu um erro inesperado\",\r\n ItemPosition: \"item {0} de {1}\",\r\n ItemAdded: \"Item {0} adicionado\",\r\n ItemRemoved: \"Item {0} removido\",\r\n ItemMoved: \"Item movido para a posição {0} de {1}\"\r\n};\r\n","import { Texts as it } from '../locale/locale-it';\r\nimport { Texts as en } from '../locale/locale-en';\r\nimport { Texts as de } from '../locale/locale-de';\r\nimport { Texts as fr } from '../locale/locale-fr';\r\nimport { Texts as es } from '../locale/locale-es';\r\nimport { Texts as pt } from '../locale/locale-pt';\r\n\r\nexport const Texts = {\r\n ...it, // neutral\r\n i18n: {\r\n it: it,\r\n en: en,\r\n de: de,\r\n fr: fr,\r\n es: es,\r\n pt: pt\r\n } \r\n};\r\n","const i18n = \"i18n\";\r\n\r\nexport function localize(language: string, component: any, key: string): string {\r\n const lng = language?.toLowerCase();\r\n if (lng) {\r\n return component[i18n]?.[lng]?.[key]\r\n || component[key]\r\n || \"\";\r\n }\r\n else {\r\n return component[key]\r\n || \"\";\r\n }\r\n}\r\n","import { Observable, Subject } from 'rxjs';\r\n\r\nexport class Notifier<T = void> {\r\n private readonly subject = new Subject<T>();\r\n\r\n readonly changes: Observable<T> = this.subject.asObservable();\r\n\r\n notify(value: T): void {\r\n this.subject.next(value);\r\n }\r\n\r\n complete(): void {\r\n this.subject.complete();\r\n }\r\n}\r\n","import { isSignal } from '@angular/core';\r\n\r\nconst IS_PROXY = Symbol('IS_PROXY');\r\nconst RAW_TARGET = Symbol('RAW_TARGET');\r\n\r\nexport function bindFunction(fn: Function, context: any) {\r\n if (fn.bind && context && fn.prototype !== undefined) {\r\n return fn.bind(context);\r\n }\r\n return (...args: any[]) => fn.apply(context, args);\r\n}\r\n\r\nexport function toProxy(instance: any, seen = new WeakMap()): any { \r\n if (instance === null || typeof instance !== 'object') return instance;\r\n if (instance[IS_PROXY]) return instance;\r\n if (seen.has(instance)) return seen.get(instance);\r\n\r\n const proxy = new Proxy(instance, {\r\n get: (target: any, property: PropertyKey, receiver: any) => {\r\n if (property === IS_PROXY) return true;\r\n if (property === RAW_TARGET) return target;\r\n let value: any;\r\n try {\r\n value = Reflect.get(target, property, receiver);\r\n } catch {\r\n return undefined;\r\n }\r\n\r\n if (typeof property === 'symbol' || property === 'toJSON') return value;\r\n\r\n // Signals (also computed/input) are read: expressions see the current value.\r\n if (isSignal(value)) {\r\n value = value();\r\n }\r\n\r\n if (typeof value === 'function') {\r\n return bindFunction(value, instance);\r\n }\r\n\r\n if (typeof value === 'object' && value !== null) {\r\n if (value instanceof Date || value instanceof RegExp || value instanceof Map || value instanceof Set) {\r\n return value;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n if (seen.has(value)) return seen.get(value);\r\n const arrayProxy = new Proxy(value, {\r\n get(arrTarget, index, arrReceiver) {\r\n if (index === IS_PROXY) return true;\r\n if (index === RAW_TARGET) return arrTarget;\r\n let item = Reflect.get(arrTarget, index, arrReceiver);\r\n if (typeof index !== 'symbol' && isSignal(item)) {\r\n item = item();\r\n }\r\n return typeof item === 'object' && item !== null\r\n ? toProxy(item, seen)\r\n : item;\r\n },\r\n has(arrTarget, key) {\r\n if (key === IS_PROXY || key === RAW_TARGET) return true;\r\n return key in arrTarget;\r\n }\r\n });\r\n seen.set(value, arrayProxy);\r\n return arrayProxy;\r\n }\r\n\r\n return toProxy(value, seen);\r\n }\r\n\r\n return value;\r\n },\r\n has(target, key) {\r\n if (key === IS_PROXY || key === RAW_TARGET) return true;\r\n return key in target;\r\n }\r\n });\r\n\r\n seen.set(instance, proxy);\r\n return proxy;\r\n}\r\n\r\nexport function isProxy(value: any): boolean {\r\n return !!value && typeof value === 'object' && value[IS_PROXY] === true;\r\n}\r\n\r\nexport function getTarget(value: any): any {\r\n if (!isProxy(value)) return value\r\n return value[RAW_TARGET];\r\n}\r\n","import { bindFunction } from '../utils/proxy';\r\n\r\nexport class CacheControl {\r\n\r\n private _volatile = false;\r\n private _ttl?: number;\r\n\r\n public get isVolatile(): boolean {\r\n return this._volatile;\r\n }\r\n\r\n public get ttl(): number | undefined {\r\n return this._ttl;\r\n }\r\n\r\n public volatile<T>(value: T): T {\r\n this._volatile = true;\r\n return value;\r\n }\r\n\r\n public cacheFor<T>(value: T, ttl: number): T {\r\n this._ttl = ttl;\r\n return value;\r\n }\r\n\r\n public configure(context: Record<string, any>): void {\r\n context[\"volatile\"] = bindFunction(this.volatile, this);\r\n context[\"cacheFor\"] = bindFunction(this.cacheFor, this);\r\n }\r\n}\r\n","export function isNullOrEmpty(value: string): boolean {\r\n return value === null\r\n || value === undefined\r\n || (typeof value === 'string' && value.trim() === '');\r\n}\r\n","import { Injectable, Type } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class GlobalService {\r\n\r\n constructor() { }\r\n\r\n clearProperties(): void {\r\n this.properties = {};\r\n }\r\n\r\n setProperties(properties: Record<string, any>): void {\r\n this.properties = { ...this.properties, ...properties };\r\n }\r\n\r\n getProperties(): Record<string, any> {\r\n return this.properties || { };\r\n }\r\n\r\n getProperty(name: string, defaultValue: any = undefined): any {\r\n const properties = this.getProperties();\r\n if (name in properties) {\r\n return properties[name];\r\n }\r\n return defaultValue;\r\n }\r\n\r\n registerComponent(typeName: string, componentType: Type<any>): void {\r\n this.components[typeName] = componentType;\r\n }\r\n\r\n getComponents(): Record<string, Type<any>> {\r\n return this.components || {};\r\n }\r\n\r\n getComponent(typeName: string): Type<any> | null {\r\n return this.getComponents()[typeName] ?? null;\r\n }\r\n \r\n //#region Private Members\r\n\r\n private properties: Record<string, any> = {};\r\n\r\n private components: Record<string, Type<any>> = {};\r\n\r\n //#endregion\r\n}\r\n","/// <reference path=\"../types/typings.d.ts\" />\r\nimport { Injectable } from '@angular/core';\r\nimport { buildSimpleTree, parser, evaluate as evaluateTemplate } from 'feelers';\r\nimport { unaryTest, evaluate, parseExpression, Warning } from 'feelin';\r\nimport { isNullOrEmpty } from '../utils/string';\r\nimport { GlobalService } from '../services/global.service';\r\n\r\nconst PathExpression = \"PathExpression\";\r\nconst VariableName = \"VariableName\";\r\nconst FunctionInvocation = \"FunctionInvocation\";\r\nconst PositionalParameters = \"PositionalParameters\";\r\nconst NamedParameters = \"NamedParameters\";\r\nconst ParameterName = \"ParameterName\";\r\nconst StringLiteral = \"StringLiteral\";\r\nconst NumericLiteral = \"NumericLiteral\";\r\nconst List = \"List\";\r\nconst StatusDependency = \"$status\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FeelService {\r\n\r\n constructor(\r\n private globalService: GlobalService\r\n ) {\r\n this._verbose = this.globalService.getProperty(\"feel-diagnostics\", \"off\") === \"on\";\r\n }\r\n\r\n private _verbose = false;\r\n\r\n get verbose(): boolean {\r\n return this._verbose;\r\n }\r\n\r\n evalTemplate(template: string, context: any = {}): string {\r\n return evaluateTemplate(template, context);\r\n };\r\n\r\n evalExpression(expression: string, context: Record<string, any> = {}): any {\r\n var evaluationResult = evaluate(expression, context);\r\n this.logWarnings(expression, evaluationResult.warnings);\r\n return evaluationResult.value;\r\n };\r\n\r\n evalUnaryTest(expression: string, context: Record<string, any> = {}, input: any = null): boolean | null {\r\n try {\r\n context['?'] = input;\r\n const evaluationResult = unaryTest(expression, context);\r\n this.logWarnings(expression, evaluationResult.warnings);\r\n return evaluationResult.value;\r\n }\r\n finally {\r\n delete context['?'];\r\n }\r\n };\r\n\r\n isValidExpression(expression: string): boolean {\r\n if (isNullOrEmpty(expression)) return true;\r\n try {\r\n evaluate(expression);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n isValidUnaryTest(expression: string): boolean {\r\n if (isNullOrEmpty(expression)) return true;\r\n try {\r\n unaryTest(expression);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n getDependencies(expression: string, context: Record<string, any> = {}): (string | string[])[] {\r\n const dependencies: (string | string[])[] = [];\r\n const uniqueSet = new Set<string>();\r\n const addSet = (text: string) => {\r\n if (uniqueSet.has(text)) {\r\n return false;\r\n }\r\n else {\r\n uniqueSet.add(text);\r\n return true;\r\n }\r\n };\r\n\r\n const nodes: NodeItem[] = [{ type: \"root\", text: expression, children: [], parent: null }];\r\n\r\n const peek = () => {\r\n return nodes.length > 0 ? nodes[nodes.length - 1] : null;\r\n };\r\n\r\n const isAllowedPathExpression = (node: NodeItem): boolean => {\r\n if (node.type === VariableName) {\r\n return true;\r\n }\r\n if (node.type !== PathExpression || !Array.isArray(node.children)) {\r\n return false;\r\n }\r\n return node.children.every(isAllowedPathExpression);\r\n };\r\n\r\n const getPathExpression = (item: NodeItem): string[] => {\r\n if (item.type === VariableName) {\r\n return [item.text];\r\n }\r\n if (item.type === PathExpression) {\r\n return item.children.flatMap(getPathExpression);\r\n }\r\n return [];\r\n };\r\n\r\n parseExpression(expression, context, undefined).iterate({\r\n enter: (node: any) => {\r\n const type = node.name;\r\n const text = expression.substring(node.from, node.to);\r\n const parent = peek();\r\n const item: NodeItem = { type, text, children: [], parent: parent };\r\n if (parent) {\r\n parent.children.push(item);\r\n }\r\n nodes.push(item);\r\n },\r\n leave: (node: any) => {\r\n if (nodes.length > 0) {\r\n const item = nodes.pop();\r\n if (!item) return;\r\n const parent = peek();\r\n\r\n if (item.type === PathExpression) {\r\n const ignore = (parent?.type === FunctionInvocation\r\n || parent?.type === PathExpression\r\n || item.children.length == 0\r\n || !isAllowedPathExpression(item));\r\n if (!ignore) {\r\n const pathExpression = getPathExpression(item);\r\n if (addSet(pathExpression.join('.'))) {\r\n dependencies.push(pathExpression);\r\n }\r\n }\r\n }\r\n else if (item.type === VariableName) {\r\n const ignore = (parent?.type === FunctionInvocation\r\n || parent?.type === PathExpression);\r\n if (!ignore) {\r\n const pathExpression = item.text;\r\n if (addSet(pathExpression)) {\r\n dependencies.push(pathExpression);\r\n } \r\n }\r\n }\r\n else if (item.type === FunctionInvocation) {\r\n const functionName = this.getFunctionName(item, getPathExpression);\r\n if (functionName == \"fn.status\") {\r\n const statusDeps = this.getStatusDependencies(item);\r\n if (statusDeps && addSet(statusDeps.join('.'))) {\r\n dependencies.push(statusDeps);\r\n }\r\n }\r\n else if (functionName == \"session.get\"\r\n || functionName == \"session.remove\" ) {\r\n dependencies.push(\"session\");\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n return dependencies;\r\n }\r\n\r\n getTemplateDependencies(expression: string, context: Record<string, any> = {}): (string | string[])[] {\r\n if (!expression) return [];\r\n\r\n const simpleTree = buildSimpleTree(parser.parse(expression), expression);\r\n\r\n const result: string[] = [];\r\n\r\n function traverse(nodeArray: any[]) {\r\n for (const node of nodeArray) {\r\n if (node.name === 'FeelBlock' && node.content) {\r\n result.push(node.content);\r\n }\r\n if (node.children && node.children.length > 0) {\r\n traverse(node.children);\r\n }\r\n }\r\n }\r\n\r\n traverse([simpleTree]);\r\n\r\n const arrayExpression = `[ ${result.join(', ')} ]`;\r\n\r\n return this.getDependencies(arrayExpression, context);\r\n }\r\n\r\n //#region Private Members\r\n\r\n private findAncestor(node: NodeItem, predicate: (child: NodeItem) => boolean): NodeItem | null {\r\n let current = node.parent;\r\n while (current !== null) {\r\n if (predicate(current)) {\r\n return current;\r\n }\r\n current = current.parent;\r\n }\r\n return null;\r\n }\r\n\r\n private findDescendant(node: NodeItem, predicate: (child: NodeItem) => boolean): NodeItem | null {\r\n for (const child of node.children) {\r\n if (predicate(child)) {\r\n return child;\r\n }\r\n const found = this.findDescendant(child, predicate);\r\n if (found !== null) {\r\n return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private findChild(node: NodeItem, predicate: (child: NodeItem) => boolean): NodeItem | null {\r\n for (const child of node.children) {\r\n if (predicate(child)) {\r\n return child;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private findChildren(node: NodeItem, predicate: (child: NodeItem) => boolean): NodeItem[] {\r\n return node.children.filter(predicate);\r\n }\r\n\r\n private getFunctionName(node: NodeItem, pathResolver: (item: NodeItem) => string[]): string | null {\r\n\r\n const pathExpression = this.findChild(node, (n) => n.type === PathExpression);\r\n if (pathExpression) {\r\n return pathResolver(pathExpression).join('.');\r\n }\r\n\r\n const variableName = this.findChild(node, (n) => n.type === VariableName);\r\n if (variableName) {\r\n return pathResolver(variableName).join('.');\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private getStatusDependencies(node: NodeItem): string[] | null {\r\n if (node.type != FunctionInvocation) return [];\r\n\r\n let pathParameter: NodeItem | null = null;\r\n\r\n const namedParameters = this.findChild(node, (n) => n.type === NamedParameters);\r\n\r\n if (namedParameters) {\r\n const pathName = this.findDescendant(namedParameters, (n) => n.type == ParameterName && n.text === \"path\");\r\n const namedParameter = pathName?.parent;\r\n if (namedParameter && namedParameter.children.length > 1) {\r\n pathParameter = namedParameter.children[1];\r\n } \r\n }\r\n\r\n const positionalParameters = this.findChild(node, (n) => n.type === PositionalParameters);\r\n\r\n if (positionalParameters) {\r\n pathParameter = positionalParameters.children[0];\r\n }\r\n\r\n if (pathParameter) {\r\n\r\n const getPathExpression = (item: NodeItem): string[] => {\r\n if (item.type === StringLiteral) {\r\n return this.splitQuoted(item.text);\r\n }\r\n else if (item.type === NumericLiteral) {\r\n return [item.text];\r\n }\r\n else if (item.type === List) {\r\n const items = this.findChildren(item, (n) => n.type !== \"[\" && n.type !== \"]\");\r\n if (items.every(n => n.type === StringLiteral || n.type === NumericLiteral)) {\r\n return items.flatMap(getPathExpression);\r\n }\r\n }\r\n return [];\r\n };\r\n\r\n const path = getPathExpression(pathParameter);\r\n if (path.length > 0) \r\n return [StatusDependency, ...path];\r\n }\r\n \r\n return null;\r\n }\r\n\r\n private splitQuoted(input: string, separator: string = '.'): string[] {\r\n input = (input ?? \"\").slice(1, -1)\r\n return input\r\n .split(separator)\r\n .map(part => part.trim())\r\n .filter(part => part.length > 0);\r\n }\r\n\r\n private logWarnings(expression: string, warnings: Warning[]): void {\r\n if (!this.verbose || !warnings.length) return;\r\n warnings.forEach(w =>\r\n console.warn(`[${expression}] ${w.type}: ${w.message} (${w.position?.from}-${w.position?.to})`)\r\n );\r\n }\r\n\r\n //#endregion\r\n}\r\n\r\ninterface NodeItem {\r\n type: string;\r\n text: string;\r\n children: NodeItem[];\r\n parent: NodeItem | null;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { isObservable, take } from 'rxjs';\r\nimport { shareReplay } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class WeakService {\r\n\r\n constructor() { }\r\n\r\n private cache = new WeakMap<object, Record<string, any>>();\r\n\r\n exists(source: object, key: string) {\r\n if (this.cache.has(source)) {\r\n const cachedObject = this.cache.get(source)!;\r\n return (key in cachedObject);\r\n }\r\n return false;\r\n }\r\n\r\n call<T>(source: object, key: string, func: () => T\r\n , reusable: ((value: T) => boolean) | null = null\r\n , store: ((value: T) => any) | null = null\r\n , cacheable: ((value: T) => boolean) | null = null\r\n ): T {\r\n if (!this.cache.has(source)) {\r\n this.cache.set(source, {});\r\n }\r\n\r\n const cachedObject = this.cache.get(source)!;\r\n\r\n if (key in cachedObject\r\n && (reusable == null\r\n || reusable(cachedObject[key])))\r\n {\r\n return cachedObject[key];\r\n }\r\n\r\n let result: any = func();\r\n\r\n if (store != null) {\r\n result = store(result);\r\n }\r\n\r\n const observable = isObservable(result);\r\n\r\n if (observable) {\r\n result = result.pipe(\r\n take(1), \r\n shareReplay(1)\r\n );\r\n }\r\n\r\n if (cacheable == null || cacheable(result))\r\n cachedObject[key] = result;\r\n\r\n return result;\r\n }\r\n\r\n invalidate(source: object, key: string) {\r\n if (this.cache.has(source)) {\r\n const cachedObject = this.cache.get(source)!;\r\n delete cachedObject[key];\r\n }\r\n }\r\n\r\n invalidateAll(source: object) {\r\n if (this.cache.has(source)) {\r\n this.cache.delete(source);\r\n }\r\n }\r\n}\r\n","import { bindFunction } from '../utils/proxy';\r\n\r\nexport function ToBoundArrows<T extends object>(\r\n instance: T,\r\n methodNames: (keyof T)[]): Record<string, any> {\r\n const result: Record<string, any> = {};\r\n\r\n for (const name of methodNames) {\r\n const original = instance[name];\r\n if (typeof original === 'function') {\r\n result[name as string] = bindFunction(original, instance);\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { IEvaluatorProvider } from '../services/programmability.service';\r\nimport { ToBoundArrows } from '../utils/bound';\r\nimport { SirioNotificationType, SirioToastService } from \"@wemake4u/form-controls\";\r\nimport { GlobalService } from './global.service';\r\n\r\nconst defaultDelayTime = 2000;\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ToastService implements IEvaluatorProvider {\r\n\r\n constructor(\r\n private sirioToast: SirioToastService,\r\n private global: GlobalService\r\n ) {\r\n this.delayTime =\r\n this.global.getProperty(\"toastDelay\", defaultDelayTime);\r\n }\r\n\r\n private delayTime: number;\r\n\r\n notifyInfo(message: string, title?: string, delay?: number) {\r\n this.notify(\"info\", message, title, delay ?? this.delayTime);\r\n }\r\n\r\n notifySuccess(message: string, title?: string, delay?: number) {\r\n this.notify(\"success\", message, title, delay ?? this.delayTime);\r\n }\r\n\r\n notifyWarning(message: string, title?: string, delay?: number) {\r\n this.notify(\"warning\", message, title, delay ?? this.delayTime);\r\n }\r\n\r\n notifyError(message: string, title?: string, delay?: number) {\r\n this.notify(\"error\", message, title, delay ?? this.delayTime);\r\n }\r\n\r\n getContext(): Record<string, any> {\r\n return ToBoundArrows(this, [\r\n \"notifyInfo\",\r\n \"notifySuccess\",\r\n \"notifyWarning\",\r\n \"notifyError\"\r\n ]);\r\n }\r\n\r\n // delay 0 = the toast stays until closed (as before).\r\n private notify(type: SirioNotificationType, message: string, title?: string, delay: number = defaultDelayTime) {\r\n this.sirioToast.show({\r\n delay: delay,\r\n message: message,\r\n type: type,\r\n title: title\r\n });\r\n }\r\n}\r\n","import {\r\n Component, ViewContainerRef, ViewChild, ComponentRef, Type,\r\n Injector, Input,\r\n ChangeDetectionStrategy,\r\n inject\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { FormDialogOptions, DialogAction, DialogResult } from '../services/dialog.service';\r\nimport { DynamicFormComponent } from '../dynamic-form/dynamic-form.component';\r\nimport { toProxy } from '../utils/proxy';\r\nimport { SirioButton, SirioDialog, SirioDialogFooter, SirioDialogRef, SirioDialogTone } from '@wemake4u/form-controls';\r\n\r\nimport { LanguageService } from '@wemake4u/interact';\r\nimport { Texts } from '../locale/locale';\r\nimport { localize } from '../locale/localize';\r\n\r\n@Component({\r\n selector: 'dynamic-dialog',\r\n imports: [\r\n CommonModule,\r\n SirioDialog,\r\n SirioDialogFooter,\r\n SirioButton\r\n ],\r\n templateUrl: './dialog.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n styleUrl: './dialog.component.css'\r\n})\r\nexport class DialogComponent {\r\n @ViewChild('formHost', { read: ViewContainerRef, static: true })\r\n private formHost!: ViewContainerRef;\r\n private formRef!: ComponentRef<any>\r\n Texts = Texts;\r\n\r\n // Inputs set by DialogService (SirioDialogService.open).\r\n @Input() formSchema: any;\r\n @Input() options: FormDialogOptions = { };\r\n @Input() dynamicFormType!: Type<any>;\r\n\r\n private readonly languageService = inject(LanguageService);\r\n // Reference of the dialog opened by SirioDialogService: closes it.\r\n private readonly dialogRef = inject(SirioDialogRef);\r\n\r\n ngOnInit() {\r\n this.options = this.options ?? {};\r\n this.currentValue = this.options.value;\r\n }\r\n \r\n ngAfterViewInit() {\r\n\r\n const injector = this.getInjector();\r\n\r\n const componentRef = this.formHost.createComponent(this.dynamicFormType, { injector });\r\n const instance = componentRef.instance as any;\r\n\r\n componentRef.setInput('schema', this.formSchema);\r\n componentRef.setInput('value', this.options.value ?? { });\r\n componentRef.setInput('showNav', this.options.showNav ?? false);\r\n componentRef.setInput('showNavButton', this.options.showNavButton ?? false);\r\n componentRef.setInput('showProgress', this.options.showProgress ?? false);\r\n componentRef.setInput('showFormTitle', this.options.showFormTitle ?? false);\r\n\r\n instance.valueChange\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe((value: any) => this.setCurrentValue(value));\r\n\r\n this.formRef = componentRef;\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n /** Closed by the X, Esc or a click outside the drawer: result 'Close' (unless a button already sent one). */\r\n onClosed() {\r\n if (!this.resultSent) {\r\n this.resultSent = true;\r\n this.SendResult('Close');\r\n }\r\n }\r\n\r\n /** Closes the dialog without a result (DialogService.closeDialog). */\r\n dismiss() {\r\n this.resultSent = true;\r\n this.dialogRef.close();\r\n }\r\n\r\n doAction(action: DialogAction) {\r\n if (this.options.keepOpen !== true) {\r\n this.resultSent = true;\r\n this.dialogRef.close();\r\n }\r\n this.SendResult(action);\r\n }\r\n\r\n doSubmit(action: DialogAction) {\r\n const form = this.getForm();\r\n if (form?.hasSilentErrors())\r\n form?.showSilentErrors();\r\n if (!this.isInvalid())\r\n this.doAction(action);\r\n }\r\n\r\n canSubmit() {\r\n return !this.isInvalid()\r\n || this.getForm()?.hasSilentErrors();\r\n }\r\n\r\n /** Icon color of the title (dialog type). */\r\n tone(): SirioDialogTone {\r\n const type = this.options.type;\r\n return type === 'warning' || type === 'danger' ? type : 'default';\r\n }\r\n\r\n /** Title icon of the dialog type (as before: info, warning, danger); none in the drawer. */\r\n icon(): string | null {\r\n if (this.options.isDrawer) return null;\r\n switch (this.options.type ?? 'info') {\r\n case 'warning': return 'fa-exclamation-circle';\r\n case 'danger': return 'fa-exclamation-triangle';\r\n default: return 'fa-info-circle';\r\n }\r\n }\r\n\r\n showCloseButton(): boolean {\r\n const result = this.options.closeButton === true;\r\n return result;\r\n }\r\n\r\n showFooter(): boolean {\r\n return this.options.buttons !== undefined;\r\n }\r\n\r\n isInvalid(): boolean {\r\n return (this.getForm()?.formGroup?.valid ?? true) !== true;\r\n }\r\n\r\n locale(component: any, key: string): string {\r\n return localize(this.language, component, key);\r\n }\r\n\r\n private destroy$ = new Subject<void>();\r\n\r\n // The result was sent (or must not be sent): closing does not send 'Close'.\r\n private resultSent = false;\r\n\r\n private currentValue: any;\r\n\r\n private setCurrentValue(value: any): void {\r\n this.currentValue = value;\r\n }\r\n\r\n private get language(): string {\r\n return this.languageService.getLanguage();\r\n }\r\n\r\n private SendResult(action: DialogAction) {\r\n if (typeof this.options.onResult === 'function') {\r\n const result: DialogResult = {\r\n form: toProxy(this.getForm()),\r\n setProperty: (n, v) => this.formRef.setInput(n, v),\r\n action: action,\r\n value: this.currentValue\r\n };\r\n this.options.onResult(result);\r\n }\r\n }\r\n\r\n private getInjector(): Injector | undefined {\r\n return this.options.injector\r\n ?? this.formHost.injector;\r\n }\r\n\r\n private getForm() : DynamicFormComponent | undefined {\r\n return this.formRef?.instance as DynamicFormComponent;\r\n }\r\n}\r\n","<wm-sirio-dialog\r\n [title]=\"options.title ?? ''\"\r\n [icon]=\"icon()\"\r\n [tone]=\"tone()\"\r\n centered\r\n [size]=\"options.size ?? 'default'\"\r\n [drawer]=\"options.isDrawer ?? false\"\r\n [alert]=\"options.alert ?? false\"\r\n [dismissible]=\"showCloseButton()\"\r\n [closeLabel]=\"locale(Texts, 'Close')\"\r\n [closeOnBackdrop]=\"options.isDrawer ?? false\"\r\n (closed)=\"onClosed()\">\r\n\r\n <ng-template #formHost></ng-template>\r\n\r\n @if (showFooter()) {\r\n <div wmSirioDialogFooter>\r\n @switch (options.buttons) {\r\n <!-- OK -->\r\n @case ('OK') {\r\n <ng-container *ngTemplateOutlet=\"confirmTemplate; context: { action: 'OK' }\"></ng-container>\r\n }\r\n <!-- Caso: OKCancel -->\r\n @case ('OKCancel') {\r\n <ng-container *ngTemplateOutlet=\"confirmTemplate; context: { action: 'OK' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"closeTemplate; context: { action: 'Cancel' }\"></ng-container>\r\n }\r\n <!-- Caso: ConfirmClose -->\r\n @case ('ConfirmCancel') {\r\n <ng-container *ngTemplateOutlet=\"confirmTemplate; context: { action: 'Confirm' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"closeTemplate; context: { action: 'Cancel' }\"></ng-container>\r\n }\r\n <!-- Caso: AbortRetryIgnore -->\r\n @case ('AbortRetryIgnore') {\r\n <ng-container *ngTemplateOutlet=\"closeTemplate; context: { action: 'Abort' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"confirmTemplate; context: { action: 'Retry' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"closeTemplate; context: { action: 'Ignore' }\"></ng-container>\r\n }\r\n <!-- Caso: YesNoCancel -->\r\n @case ('YesNoCancel') {\r\n <ng-container *ngTemplateOutlet=\"confirmTemplate; context: { action: 'Yes' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"closeTemplate; context: { action: 'No' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"closeTemplate; context: { action: 'Cancel' }\"></ng-container>\r\n }\r\n <!-- Caso: YesNo -->\r\n @case ('YesNo') {\r\n <ng-container *ngTemplateOutlet=\"confirmTemplate; context: { action: 'Yes' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"closeTemplate; context: { action: 'No' }\"></ng-container>\r\n }\r\n <!-- Caso: RetryCancel -->\r\n @case ('RetryCancel') {\r\n <ng-container *ngTemplateOutlet=\"confirmTemplate; context: { action: 'Retry' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"closeTemplate; context: { action: 'Cancel' }\"></ng-container>\r\n }\r\n <!-- Caso: CancelTryContinue -->\r\n @case ('CancelTryContinue') {\r\n <ng-container *ngTemplateOutlet=\"closeTemplate; context: { action: 'Cancel' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"confirmTemplate; context: { action: 'Try' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"closeTemplate; context: { action: 'Continue' }\"></ng-container>\r\n }\r\n <!-- Caso: Custom -->\r\n @case ('Custom') {\r\n @for (customButton of options.customButtons ?? []; track customButton; let i = $index) {\r\n <ng-container *ngTemplateOutlet=\"customTemplate; context: { customButton: customButton }\"></ng-container>\r\n }\r\n }\r\n }\r\n <!-- Templates -->\r\n <ng-template #confirmTemplate let-action=\"action\">\r\n <button type=\"button\" wmSirioButton=\"primary\" (click)=\"doSubmit(action)\" [disabled]=\"!canSubmit()\">{{ locale(Texts, action) }}</button>\r\n </ng-template>\r\n <ng-template #closeTemplate let-action=\"action\">\r\n <button type=\"button\" wmSirioButton=\"secondary\" (click)=\"doAction(action)\">{{ locale(Texts, action) }}</button>\r\n </ng-template>\r\n <ng-template #customTemplate\r\n let-customButton=\"customButton\">\r\n <!-- No color = plain button (ngx-sirio-lib color null). -->\r\n <button type=\"button\" [wmSirioButton]=\"customButton.color || 'ghost'\" (click)=\"doAction(customButton.action)\">{{ customButton.text }}</button>\r\n </ng-template>\r\n </div>\r\n }\r\n\r\n</wm-sirio-dialog>\r\n","import { inject, Injectable, Injector } from '@angular/core';\r\nimport { SirioButtonVariant, SirioDialogService, SirioDialogSize } from '@wemake4u/form-controls';\r\nimport { IEvaluatorProvider } from '../services/programmability.service';\r\nimport { ToBoundArrows } from '../utils/bound';\r\nimport { DialogComponent } from '../dialog/dialog.component';\r\nimport { DynamicFormComponent } from '../dynamic-form/dynamic-form.component';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DialogService implements IEvaluatorProvider {\r\n\r\n // Opens the dialogs (stacked on top of each other) and gives the focus back when they close.\r\n private readonly dialogs = inject(SirioDialogService);\r\n\r\n openDialog(formSchema: any, options?: FormDialogOptions) {\r\n this.showDialog(formSchema, options);\r\n }\r\n\r\n /** Closes the top dialog without a result (onResult is not called). */\r\n closeDialog() {\r\n const top = this.dialogs.openDialogs().at(-1);\r\n const instance = top?.componentInstance;\r\n if (instance instanceof DialogComponent) {\r\n instance.dismiss();\r\n } else {\r\n top?.close();\r\n }\r\n }\r\n\r\n alert(text: string, options?: DialogOptions) {\r\n const formSchema = this.createTextSchema(text);\r\n const formOptions : FormDialogOptions = {\r\n ...options,\r\n type: \"warning\",\r\n buttons: 'OK',\r\n alert: true,\r\n isDrawer: false,\r\n showNav: false,\r\n showNavButton: false,\r\n showProgress: false,\r\n showFormTitle: false\r\n };\r\n this.showDialog(formSchema, formOptions);\r\n }\r\n\r\n info(text: string, options?: DialogOptions) {\r\n const formSchema = this.createTextSchema(text);\r\n const formOptions: FormDialogOptions = {\r\n ...options,\r\n type: \"info\",\r\n buttons: 'OK',\r\n isDrawer: false,\r\n showNav: false,\r\n showNavButton: false,\r\n showProgress: false,\r\n showFormTitle: false\r\n };\r\n this.showDialog(formSchema, formOptions);\r\n }\r\n\r\n confirm(text: string, options?: DialogOptions) {\r\n const formSchema = this.createTextSchema(text);\r\n const formOptions: FormDialogOptions = {\r\n ...options,\r\n type: \"info\",\r\n buttons: 'YesNo',\r\n alert: true,\r\n isDrawer: false,\r\n showNav: false,\r\n showNavButton: false,\r\n showProgress: false,\r\n showFormTitle: false\r\n }; \r\n this.showDialog(formSchema, formOptions);\r\n }\r\n\r\n show(text: string, options?: DialogOptions) {\r\n const formSchema = this.createTextSchema(text);\r\n const formOptions: FormDialogOptions = {\r\n type: \"info\",\r\n buttons: 'OK',\r\n ...options,\r\n isDrawer: false,\r\n showNav: false,\r\n showNavButton: false,\r\n showProgress: false,\r\n showFormTitle: false\r\n };\r\n this.showDialog(formSchema, formOptions);\r\n }\r\n\r\n prompt(text: string, defaultValue?: string, options?: DialogOptions) {\r\n const formSchema = this.createInputSchema(text, defaultValue);\r\n const formOptions: FormDialogOptions = {\r\n ...options,\r\n type: \"info\",\r\n buttons: 'OKCancel',\r\n isDrawer: false,\r\n showNav: false,\r\n showNavButton: false,\r\n showProgress: false,\r\n showFormTitle: false\r\n };\r\n this.showDialog(formSchema, formOptions);\r\n }\r\n\r\n getContext(): Record<string, any> {\r\n return ToBoundArrows(this, [\r\n 'openDialog',\r\n 'closeDialog',\r\n 'alert',\r\n 'info',\r\n 'confirm',\r\n 'show'\r\n ]);\r\n }\r\n\r\n private showDialog(formSchema: any, options?: FormDialogOptions) {\r\n\r\n options = this.ensureClosable(options);\r\n\r\n this.dialogs.open(DialogComponent, {\r\n inputs: {\r\n formSchema,\r\n options,\r\n dynamicFormType: DynamicFormComponent\r\n }\r\n });\r\n }\r\n\r\n private createTextSchema(text: string) {\r\n return {\r\n \"forms\": [\r\n {\r\n \"components\": [\r\n {\r\n \"text\": text,\r\n \"type\": \"text\",\r\n \"layout\": {\r\n \"row\": \"Row_14z9myo\",\r\n \"columns\": null\r\n },\r\n \"id\": \"Field_1xibp2r\"\r\n }\r\n ],\r\n \"type\": \"default\",\r\n \"id\": \"Form_0lotm2h\",\r\n \"schemaVersion\": 18\r\n }\r\n ]\r\n }\r\n }\r\n\r\n private createInputSchema(label: string, defaultValue?: string) {\r\n return {\r\n \"forms\": [\r\n {\r\n \"components\": [\r\n {\r\n \"label\": label,\r\n \"defaultValue\": defaultValue,\r\n \"type\": \"textfield\",\r\n \"layout\": {\r\n \"row\": \"Row_1wxz5gd\",\r\n \"columns\": null\r\n },\r\n \"id\": \"Field_1tau53x\",\r\n \"key\": \"input\"\r\n }\r\n ],\r\n \"type\": \"default\",\r\n \"id\": \"Form_1ontwnx\",\r\n \"schemaVersion\": 18\r\n }\r\n ]\r\n };\r\n }\r\n\r\n private ensureClosable(options?: FormDialogOptions): FormDialogOptions {\r\n\r\n options = {\r\n ...options,\r\n closeButton:\r\n options?.buttons == null ? true : options.closeButton\r\n }\r\n\r\n return options;\r\n }\r\n\r\n}\r\n\r\nexport type DialogTypes = 'info' | 'warning' | 'danger';\r\n\r\nexport type DialogSizes = SirioDialogSize;\r\n\r\nexport type ButtonColors = SirioButtonVariant;\r\n\r\nexport interface DialogOptions {\r\n type?: DialogTypes;\r\n size?: DialogSizes;\r\n title?: string;\r\n isDrawer?: boolean; \r\n closeButton?: boolean;\r\n buttons?: DialogButtons;\r\n customButtons?: CustomButton[],\r\n keepOpen?: boolean,\r\n onResult?: (result: DialogResult) => void;\r\n}\r\n\r\nexport interface FormDialogOptions extends DialogOptions {\r\n value?: any;\r\n injector?: Injector;\r\n showNav?: boolean;\r\n showNavButton?: boolean;\r\n showProgress?: boolean;\r\n showFormTitle?: boolean;\r\n /** role=\"alertdialog\" (alert and confirm). */\r\n alert?: boolean;\r\n}\r\n\r\nexport interface DialogResult {\r\n form: DynamicFormComponent;\r\n setProperty: (name: string, value: unknown) => void;\r\n action: DialogAction | string;\r\n value?: any; \r\n}\r\n\r\nexport interface CustomButton {\r\n text: string,\r\n color: ButtonColors,\r\n action: string\r\n}\r\n\r\nexport type DialogAction = 'OK'\r\n | 'Cancel'\r\n | 'Yes'\r\n | 'No'\r\n | 'Confirm'\r\n | 'Close'\r\n | 'Abort'\r\n | 'Retry'\r\n | 'Ignore'\r\n | 'Try'\r\n | 'Continue';\r\n\r\nexport type DialogButtons = 'OK'\r\n | 'OKCancel'\r\n | 'ConfirmCancel'\r\n | 'AbortRetryIgnore'\r\n | 'YesNoCancel'\r\n | 'YesNo'\r\n | 'RetryCancel'\r\n | 'CancelTryContinue'\r\n | 'Custom';\r\n","import { Injectable } from '@angular/core';\r\nimport { IEvaluatorProvider } from '../services/programmability.service';\r\nimport { ToBoundArrows } from '../utils/bound';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FormatterService implements IEvaluatorProvider {\r\n\r\n constructor() { }\r\n\r\n formatDate(isoDate: string | null | undefined,\r\n options?: Intl.DateTimeFormatOptions,\r\n locale: string = 'it-IT'\r\n ): string {\r\n if (!isoDate) return '';\r\n\r\n const date = new Date(isoDate);\r\n if (isNaN(date.getTime())) return '';\r\n\r\n const formatOptions: Intl.DateTimeFormatOptions = {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n ...options\r\n };\r\n\r\n return new Intl.DateTimeFormat(locale, formatOptions).format(date);\r\n }\r\n\r\n formatTime(isoDate: string | null | undefined,\r\n options?: Intl.DateTimeFormatOptions,\r\n locale: string = 'it-IT'\r\n ): string {\r\n if (!isoDate) return '';\r\n\r\n const date = new Date(isoDate);\r\n if (isNaN(date.getTime())) return '';\r\n\r\n const formatOptions: Intl.DateTimeFormatOptions = {\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n second: '2-digit',\r\n hour12: false,\r\n ...options\r\n };\r\n\r\n return new Intl.DateTimeFormat(locale, formatOptions).format(date);\r\n }\r\n\r\n formatDateTime(isoDate: string | null | undefined,\r\n options?: Intl.DateTimeFormatOptions,\r\n locale: string = 'it-IT') {\r\n if (!isoDate) return '';\r\n\r\n const date = new Date(isoDate);\r\n if (isNaN(date.getTime())) return '';\r\n\r\n const datePart = new Intl.DateTimeFormat(locale, {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n ...options\r\n }).format(date);\r\n\r\n const timePart = new Intl.DateTimeFormat(locale, {\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n second: '2-digit',\r\n hour12: false,\r\n ...options\r\n }).format(date);\r\n\r\n return `${datePart} ${timePart}`;\r\n }\r\n\r\n formatCurrency(\r\n value: number,\r\n currency: string = 'EUR',\r\n locale: string = 'it-IT'\r\n ): string {\r\n if (isNaN(value)) return '';\r\n\r\n return new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n useGrouping: true,\r\n currency: currency,\r\n currencyDisplay: 'symbol' // oppure: 'code' | 'name'\r\n }).format(value);\r\n }\r\n\r\n formatNumber(\r\n value: number,\r\n decimals: number = 2,\r\n locale: string = 'it-IT' \r\n ): string {\r\n if (isNaN(value)) return '';\r\n\r\n return new Intl.NumberFormat(locale, {\r\n style: 'decimal',\r\n useGrouping: true,\r\n minimumFractionDigits: decimals,\r\n maximumFractionDigits: decimals\r\n }).format(value);\r\n }\r\n\r\n getContext(): Record<string, any> {\r\n return ToBoundArrows(this, [\r\n 'formatDate',\r\n 'formatTime',\r\n 'formatDateTime',\r\n 'formatCurrency',\r\n 'formatNumber'\r\n ]);\r\n }\r\n \r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { IEvaluatorProvider } from '../services/programmability.service';\r\nimport { ToBoundArrows } from '../utils/bound';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class JsonService implements IEvaluatorProvider {\r\n\r\n constructor() { }\r\n\r\n toJson(value: any, indent: boolean): string {\r\n if (value === undefined) {\r\n return 'null';\r\n }\r\n try {\r\n return JSON.stringify(\r\n value,\r\n (_k, v) => (v === undefined ? null : v),\r\n indent ? 2 : undefined\r\n );\r\n } catch {\r\n return 'null';\r\n }\r\n }\r\n\r\n parseJson(value: any): any {\r\n if (typeof value !== 'string') {\r\n return value;\r\n }\r\n\r\n const trimmed = value.trim();\r\n\r\n if (trimmed === '') {\r\n return null;\r\n }\r\n\r\n try {\r\n return JSON.parse(trimmed);\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n getContext(): Record<string, any> {\r\n return ToBoundArrows(this, [\r\n 'toJson',\r\n 'parseJson'\r\n ]);\r\n }\r\n \r\n}\r\n","export function generateGuid(): string {\r\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\r\n return crypto.randomUUID();\r\n }\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\r\n const r = Math.random() * 16 | 0;\r\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\r\n return v.toString(16);\r\n });\r\n}\r\n","export interface OpenWindowFeatures {\r\n width?: number;\r\n height?: number;\r\n left?: number;\r\n top?: number;\r\n\r\n toolbar?: boolean;\r\n menubar?: boolean;\r\n location?: boolean;\r\n status?: boolean;\r\n resizable?: boolean;\r\n scrollbars?: boolean;\r\n\r\n noopener?: boolean;\r\n noreferrer?: boolean;\r\n\r\n center?: boolean;\r\n focus?: boolean;\r\n}\r\n\r\nexport type WindowTarget =\r\n | '_blank'\r\n | '_self'\r\n | '_parent'\r\n | '_top'\r\n | string;\r\n\r\nexport function openWindow(\r\n url: string,\r\n target: WindowTarget = '_blank',\r\n features: OpenWindowFeatures = {}\r\n): Window | null {\r\n\r\n const {\r\n width,\r\n height,\r\n left,\r\n top,\r\n toolbar,\r\n menubar,\r\n location,\r\n status,\r\n resizable,\r\n scrollbars,\r\n noopener = true,\r\n noreferrer = false,\r\n center = false,\r\n focus = true\r\n } = features;\r\n\r\n let finalLeft = left;\r\n let finalTop = top;\r\n\r\n if (center && width && height) {\r\n finalLeft = window.screenX + (window.outerWidth - width) / 2;\r\n finalTop = window.screenY + (window.outerHeight - height) / 2;\r\n }\r\n\r\n const featureList: string[] = [];\r\n\r\n if (width) featureList.push(`width=${width}`);\r\n if (height) featureList.push(`height=${height}`);\r\n if (finalLeft !== undefined) featureList.push(`left=${finalLeft}`);\r\n if (finalTop !== undefined) featureList.push(`top=${finalTop}`);\r\n\r\n if (toolbar !== undefined) featureList.push(`toolbar=${toolbar ? 'yes' : 'no'}`);\r\n if (menubar !== undefined) featureList.push(`menubar=${menubar ? 'yes' : 'no'}`);\r\n if (location !== undefined) featureList.push(`location=${location ? 'yes' : 'no'}`);\r\n if (status !== undefined) featureList.push(`status=${status ? 'yes' : 'no'}`);\r\n if (resizable !== undefined) featureList.push(`resizable=${resizable ? 'yes' : 'no'}`);\r\n if (scrollbars !== undefined) featureList.push(`scrollbars=${scrollbars ? 'yes' : 'no'}`);\r\n\r\n if (noopener) featureList.push('noopener');\r\n if (noreferrer) featureList.push('noreferrer');\r\n\r\n const locationUrl = new URL(url, window.location.href);\r\n \r\n const newWindow = window.open(\r\n locationUrl.toString(),\r\n target,\r\n featureList.join(',')\r\n );\r\n\r\n if (newWindow && focus) {\r\n newWindow.focus();\r\n }\r\n\r\n return newWindow;\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable()\r\nexport class MetadataService {\r\n\r\n constructor() {\r\n \r\n }\r\n\r\n setSchema(schema: any) {\r\n this.schema = schema ?? { forms: [] };\r\n } \r\n\r\n getSchema(): any {\r\n return this.schema;\r\n }\r\n\r\n setForms(forms: any[]) {\r\n this.forms = forms ?? []; \r\n }\r\n\r\n getTemplateByName(name: string): any {\r\n\r\n if (!this.schema || !Array.isArray(this.schema.forms)) {\r\n return undefined;\r\n }\r\n\r\n const templates = this.schema.forms.filter((form: any) => form.isTemplate === true);\r\n\r\n const templateToExpand = templates.find((form: any) => form.name === name);\r\n\r\n if (!templateToExpand) {\r\n return undefined;\r\n }\r\n\r\n const clonedForm = {\r\n ...templateToExpand,\r\n isTemplate: false\r\n };\r\n\r\n const newForms = templates\r\n .filter((form: any) => form.name !== name)\r\n .concat(clonedForm);\r\n\r\n return {\r\n forms: newForms\r\n };\r\n }\r\n\r\n getForms(): any[] {\r\n return this.forms;\r\n }\r\n\r\n getFormByName(name: string): any {\r\n return this.forms.find(form => form.name === name);\r\n }\r\n\r\n getFormIndexByName(name: string): number {\r\n return this.forms.findIndex(form => form.name === name);\r\n }\r\n\r\n getFormNameByIndex(index: number): string | undefined {\r\n if (!this.isValidFormIndex(index)) return undefined;\r\n return this.forms[index].name;\r\n }\r\n\r\n private schema: any = { forms: [] };\r\n\r\n private forms: any[] = [];\r\n\r\n private isValidFormIndex(index: number): boolean {\r\n return Number.isInteger(index) && index >= 0 && index < this.forms.length;\r\n }\r\n}\r\n","import { Injectable, Injector } from '@angular/core';\r\nimport { MetadataService } from '../services/metadata.service';\r\nimport { DialogService, DialogOptions, FormDialogOptions } from '../services/dialog.service';\r\nimport { ToBoundArrows } from '../utils/bound';\r\nimport { IEvaluatorProvider } from '../services/programmability.service';\r\nimport { Observable, take, of } from 'rxjs';\r\nimport { generateGuid } from '../utils/uuid';\r\nimport { openWindow, WindowTarget, OpenWindowFeatures } from '../utils/window';\r\n\r\n@Injectable()\r\nexport class FunctionService implements IEvaluatorProvider {\r\n\r\n constructor(private metadata: MetadataService\r\n , private dialog: DialogService\r\n , private injector: Injector) { }\r\n\r\n invokable(func: any): (...args: any[]) => any {\r\n return makeInvokable(func, () => { });\r\n }\r\n\r\n executeOnce<T>(observable: Observable<T>, callback: any): void {\r\n if (!observable) return;\r\n observable\r\n .pipe(take(1))\r\n .subscribe({\r\n next: this.invokable(callback) as (value: T) => void\r\n });\r\n }\r\n\r\n asObservable<T>(value: T): Observable<T> {\r\n return of(value);\r\n }\r\n\r\n setTimeout<T>(callback: any, delay: number): void {\r\n if (!callback) return;\r\n const func = this.invokable(callback) as (value: T) => void\r\n setTimeout(func, delay);\r\n }\r\n\r\n openForm(template: string | object, options: DialogOptions) {\r\n let formSchema: any;\r\n\r\n if (typeof template === 'string') {\r\n formSchema = this.metadata.getTemplateByName(template);\r\n } else {\r\n formSchema = template;\r\n }\r\n\r\n if (formSchema) {\r\n const formOptions: FormDialogOptions = {\r\n ...options,\r\n injector: this.injector\r\n }\r\n\r\n this.dialog.openDialog(formSchema, formOptions);\r\n }\r\n }\r\n\r\n openWindow(url: string, target: WindowTarget = '_blank', features: OpenWindowFeatures = {}): Window | null {\r\n return openWindow(url, target, features);\r\n }\r\n\r\n newGuid(): string {\r\n return generateGuid();\r\n }\r\n\r\n range(from: number, to: number): number[] {\r\n return Array.from(\r\n { length: to - from + 1 },\r\n (_, i) => from + i\r\n );\r\n }\r\n\r\n hydrate<T = any>(value: T, deep: boolean = false): T {\r\n // primitives (or \"bare\" functions) are not mutable: return the replacement instead\r\n if (value === null || typeof value !== 'object') {\r\n return value;\r\n }\r\n\r\n // if the root value itself is a function wrapper, it must be replaced (can't mutate in-place)\r\n if (isFunctionWrapper(value)) {\r\n return makeInvokable(value, value) as any;\r\n }\r\n\r\n if (!deep) {\r\n return value;\r\n }\r\n\r\n // \"opaque\" types we don't want to decompose into properties\r\n if (value instanceof Date || value instanceof RegExp) {\r\n return value;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n for (let i = 0; i < value.length; i++) {\r\n value[i] = this.hydrate(value[i], deep);\r\n }\r\n return value;\r\n }\r\n\r\n // generic object: mutate all enumerable properties in-place\r\n for (const key of Object.keys(value as object)) {\r\n (value as any)[key] = this.hydrate((value as any)[key], deep);\r\n }\r\n return value;\r\n }\r\n\r\n getContext(): Record<string, any> {\r\n return ToBoundArrows(this, [\r\n \"openForm\",\r\n \"openWindow\",\r\n \"invokable\",\r\n \"executeOnce\",\r\n \"asObservable\",\r\n \"setTimeout\",\r\n \"newGuid\",\r\n \"range\"\r\n ]);\r\n }\r\n}\r\n\r\nfunction isFunctionWrapper(func: any): boolean {\r\n return (typeof func?.invoke === 'function');\r\n}\r\n\r\nfunction makeInvokable<T>(func: any, fallback: T): ((...args: any[]) => any) | T {\r\n if (isFunctionWrapper(func)) {\r\n return (...args: any[]) => func.invoke(args);\r\n }\r\n return fallback;\r\n}\r\n","export type Path = string | number | Array<string | number>;\r\n\r\n/** A path split into its segments (see normalizePath). */\r\nexport type PathSegments = (string | number)[];\r\n\r\nexport function normalizePath(path: Path): PathSegments\r\n{\r\n if (typeof path === 'string') {\r\n return path.split('.');\r\n }\r\n if (Array.isArray(path)) {\r\n return path.reduce<PathSegments>((acc, part) => {\r\n if (typeof part === 'string') {\r\n acc.push(...part.split('.'));\r\n } else {\r\n acc.push(part);\r\n }\r\n return acc;\r\n }, []);\r\n }\r\n return [path];\r\n};\r\n\r\nexport function matchPath(pathA: Path, pathB: Path): boolean {\r\n\r\n const a = normalizePath(pathA);\r\n const b = normalizePath(pathB);\r\n\r\n const minLen = Math.min(a.length, b.length);\r\n\r\n for (let i = 0; i < minLen; i++) {\r\n if (a[i] !== b[i]) return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function stringifyPath(path: Path): string {\r\n if (Array.isArray(path)) {\r\n return path.join(\".\");\r\n }\r\n return String(path);\r\n}\r\n\r\nexport function isIndexSegment(segment: string | number): boolean {\r\n return typeof segment === 'number' || /^\\d+$/.test(segment);\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { IEvaluatorProvider } from './programmability.service';\r\nimport { AbstractControl, FormGroup, FormArray, FormControl, FormControlStatus } from '@angular/forms';\r\nimport { isNullableGroup } from '../utils/FormGroupEx';\r\nimport { Path, normalizePath } from '../common/path';\r\nimport { filter, interval, map, Observable, of, take } from 'rxjs';\r\nimport { FormArrayEx } from '../utils/FormArrayEx';\r\n\r\ntype ControlType = 'array' | 'group' | 'control';\r\n\r\nexport type PatchPredicate = (control: AbstractControl, value: any) => boolean;\r\n\r\nexport interface PatchOptions {\r\n emitEvent?: boolean;\r\n emitError?: boolean;\r\n emitWarn?: boolean;\r\n validateType?: boolean;\r\n fallbackValue?: any;\r\n strict: boolean;\r\n canPatch?: PatchPredicate;\r\n}\r\n\r\nexport interface PathOptions {\r\n emitError?: boolean;\r\n emitWarn?: boolean;\r\n create?: boolean;\r\n expected?: ControlType;\r\n breakOnArray?: boolean;\r\n breakOnNull?: boolean;\r\n};\r\n\r\nexport interface EnumerateOptions {\r\n expandArray?: boolean;\r\n expandGroup?: boolean;\r\n skipDisabled?: boolean;\r\n}\r\n\r\nexport type ExpandOptions = Omit<EnumerateOptions, 'skipDisabled'>;\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FormService implements IEvaluatorProvider {\r\n\r\n set(control: AbstractControl, path: Path, value: any, pathOptions?: PathOptions, patchOptions?: PatchOptions): boolean {\r\n\r\n const currentControl = this.applyPath(control, path, pathOptions ?? { create: true });\r\n\r\n if (!currentControl)\r\n return false;\r\n\r\n this.patch(currentControl, value, patchOptions);\r\n\r\n return true;\r\n }\r\n\r\n get(control: AbstractControl, path: Path, pathOptions?: PathOptions): any {\r\n const result = this.getControl(control, path, pathOptions);\r\n return result?.value;\r\n }\r\n\r\n reset(control: AbstractControl, path: Path): any {\r\n const targetControl = this.getControl(control, path);\r\n targetControl?.reset();\r\n }\r\n\r\n resetAll(control: AbstractControl, ...paths: string[]): void {\r\n if (!paths?.length) return;\r\n\r\n for (const path of paths) {\r\n this.reset(control, path);\r\n }\r\n }\r\n\r\n getControl(control: AbstractControl, path: Path, pathOptions?: PathOptions): AbstractControl | undefined {\r\n return this.applyPath(control, path, pathOptions);\r\n }\r\n\r\n prepend(control: AbstractControl, path: Path, value: any, pathOptions?: PathOptions, patchOptions?: PatchOptions): boolean {\r\n const formArray = this.applyPath(control, path, pathOptions ?? { expected: \"array\", create: true });\r\n if (formArray instanceof FormArray) {\r\n return this.insertIntoArray(formArray, 0, value, patchOptions);\r\n }\r\n return false;\r\n }\r\n\r\n append(control: AbstractControl, path: Path, value: any, pathOptions?: PathOptions, patchOptions?: PatchOptions): boolean {\r\n const formArray = this.applyPath(control, path, pathOptions ?? { expected: \"array\", create: true });\r\n if (formArray instanceof FormArray) {\r\n return this.insertIntoArray(formArray, formArray.length, value, patchOptions);\r\n }\r\n return false;\r\n }\r\n\r\n insert(control: AbstractControl, path: Path, index: number, value: any, pathOptions?: PathOptions, patchOptions?: PatchOptions): boolean {\r\n const formArray = this.applyPath(control, path, pathOptions ?? { expected: \"array\", create: true });\r\n if (formArray instanceof FormArray) {\r\n return this.insertIntoArray(formArray, index, value, patchOptions);\r\n }\r\n return false;\r\n }\r\n\r\n remove(control: AbstractControl, path: Path, index: number): boolean {\r\n const formArray = this.applyPath(control, path);\r\n if (formArray instanceof FormArray) {\r\n return this.removeFromArray(formArray, index);\r\n }\r\n return false;\r\n }\r\n\r\n moveUp(control: AbstractControl, path: Path, index: number): boolean {\r\n const formArray = this.applyPath(control, path);\r\n if (formArray instanceof FormArrayEx) {\r\n return formArray.moveUp(index);\r\n }\r\n return false;\r\n }\r\n\r\n moveDown(control: AbstractControl, path: Path, index: number): boolean {\r\n const formArray = this.applyPath(control, path);\r\n if (formArray instanceof FormArrayEx) {\r\n return formArray.moveDown(index);\r\n }\r\n return false;\r\n }\r\n\r\n resize(control: AbstractControl, path: Path, newSize: number): boolean {\r\n if (!Number.isInteger(newSize) || newSize < 0) {\r\n return false;\r\n }\r\n const formArray = this.applyPath(control, path);\r\n if (formArray instanceof FormArrayEx) {\r\n formArray.resize(newSize, () => this.createArrayItem(formArray));\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n status(control: AbstractControl, path: Path, pathOptions?: PathOptions): FormControlStatus | undefined {\r\n const result = this.applyPath(control, path, pathOptions);\r\n return result?.status;\r\n }\r\n\r\n updateAllValueAndValidity(control: AbstractControl, emitEvent: boolean = true): void {\r\n for (const c of this.enumerateControls(control)) {\r\n c.updateValueAndValidity({ emitEvent });\r\n }\r\n }\r\n\r\n getInvalidControls(control: AbstractControl): { path: string, control: AbstractControl }[] {\r\n const invalid: { path: string, control: AbstractControl }[] = [];\r\n\r\n if (control.disabled)\r\n return invalid;\r\n\r\n if (control instanceof FormGroup || control instanceof FormArray) {\r\n const children = Object.values(control.controls);\r\n for (const child of children) {\r\n invalid.push(...this.getInvalidControls(child));\r\n }\r\n }\r\n else if (control.invalid) {\r\n invalid.push({ path: this.getPath(control).join(\".\"), control });\r\n }\r\n\r\n return invalid;\r\n }\r\n\r\n patch(\r\n control: AbstractControl, value: any, options?: PatchOptions): void {\r\n\r\n const defaultOptions = {\r\n emitEvent: true,\r\n validateType: false,\r\n fallbackValue: null,\r\n strict: true\r\n };\r\n\r\n const warn = (message: string) => {\r\n if (options?.emitWarn)\r\n console.warn(`[patchControl] ${message}`)\r\n };\r\n\r\n const error = (message: string) => {\r\n if (options?.emitError)\r\n throw new Error(message);\r\n };\r\n\r\n const { emitEvent, validateType, fallbackValue, strict, canPatch }\r\n = { ...defaultOptions, ...options };\r\n\r\n const isPatchable = (target: AbstractControl) => !canPatch || canPatch(target, value);\r\n\r\n if (!isPatchable(control)) {\r\n return;\r\n }\r\n\r\n if (control instanceof FormControl) {\r\n if (validateType && typeof value !== typeof control.value) {\r\n warn(`Value type mismatch: expected ${typeof control.value}, but received ${typeof value}`);\r\n\r\n if (fallbackValue !== null) {\r\n control.patchValue(fallbackValue, { emitEvent });\r\n return;\r\n }\r\n error('Invalid value type and no fallback value provided.');\r\n return;\r\n }\r\n control.patchValue(value, { emitEvent });\r\n }\r\n else if (control instanceof FormGroup) {\r\n if (isNullableGroup(control)) {\r\n if (value == null) {\r\n control.setNull();\r\n return;\r\n }\r\n else if (control.isNull()) {\r\n control.setNotNull();\r\n }\r\n }\r\n const currentValue = this.asObject(value);\r\n Object.keys(currentValue).forEach((key) => {\r\n if (control.controls[key]) {\r\n this.patch(control.controls[key], value[key], options);\r\n }\r\n else if (!strict) {\r\n const newControl = this.createControlFromValue(value[key]);\r\n this.setUnknown(newControl);\r\n control.addControl(key, newControl);\r\n this.patch(newControl, value[key], options);\r\n }\r\n else {\r\n warn(`Key \"${key}\" not found in the FormGroup.`);\r\n }\r\n });\r\n Object.keys(control.controls).forEach((key) => {\r\n if (!(key in currentValue)) {\r\n const childControl = control.get(key);\r\n if (childControl) {\r\n if (isNullableGroup(childControl))\r\n childControl.setNull();\r\n else\r\n childControl.reset();\r\n }\r\n }\r\n });\r\n }\r\n else if (control instanceof FormArray) {\r\n const currentValue = this.asArray(value);\r\n while (control.length < currentValue.length) {\r\n control.push(new FormGroup({}));\r\n }\r\n while (control.length > currentValue.length) {\r\n control.removeAt(control.length - 1);\r\n }\r\n currentValue.forEach((item: any, index: number) => {\r\n this.patch(control.at(index), item, options);\r\n });\r\n }\r\n else {\r\n error('Unsupported AbstractControl type.');\r\n }\r\n }\r\n\r\n getPath(control: AbstractControl): (string | number)[] {\r\n const path: (string | number)[] = [];\r\n let current: AbstractControl | null = control;\r\n\r\n while (current?.parent) {\r\n const parent: any = current.parent;\r\n\r\n if (parent instanceof FormArray) {\r\n const index = parent.controls.indexOf(current);\r\n path.unshift(index);\r\n } else if (parent instanceof FormGroup) {\r\n const key = Object.keys(parent.controls).find(k => parent.get(k) === current);\r\n if (key) {\r\n path.unshift(key);\r\n }\r\n }\r\n\r\n current = parent;\r\n }\r\n\r\n return path;\r\n }\r\n \r\n getFullPath(control: AbstractControl): string {\r\n const segments: string[] = [];\r\n let current: AbstractControl | null = control;\r\n\r\n while (current?.parent) {\r\n const parent: FormGroup | FormArray = current.parent;\r\n const key = parent instanceof FormArray\r\n ? String(parent.controls.indexOf(current))\r\n : Object.keys(parent.controls).find(k => parent.controls[k] === current);\r\n\r\n if (key === undefined || key === '-1') break; // detached control\r\n segments.unshift(key);\r\n current = parent;\r\n }\r\n\r\n return segments.join('.');\r\n }\r\n\r\n waitForControl(\r\n formGroup: FormGroup\r\n , path: Path\r\n , pathOptions?: PathOptions\r\n ): Observable<AbstractControl> {\r\n\r\n const resolve = (): AbstractControl | undefined =>\r\n this.getControl(formGroup, path, pathOptions);\r\n\r\n const existing = resolve();\r\n if (existing) return of(existing);\r\n\r\n return new Observable<AbstractControl>((observer) => {\r\n const sub = formGroup.valueChanges.subscribe(() => {\r\n const ctrl = resolve();\r\n if (ctrl) {\r\n observer.next(ctrl);\r\n observer.complete();\r\n sub.unsubscribe();\r\n }\r\n });\r\n\r\n return () => sub.unsubscribe();\r\n });\r\n }\r\n\r\n statusChanges(control: AbstractControl\r\n , waitForPending?: () => void\r\n ): Observable<FormControlStatus> {\r\n\r\n if (control.status === 'PENDING' && waitForPending) {\r\n this.waitUntilSettled(control)\r\n .subscribe(() => waitForPending());\r\n }\r\n\r\n return control.statusChanges;\r\n }\r\n\r\n buildControl(value: any): AbstractControl {\r\n if (value instanceof FormControl ||\r\n value instanceof FormGroup ||\r\n value instanceof FormArray) {\r\n return value;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return new FormArray(\r\n value.map(v => this.buildControl(v))\r\n );\r\n }\r\n\r\n if (value !== null && typeof value === 'object') {\r\n\r\n const controls: { [key: string]: AbstractControl } = {};\r\n\r\n for (const key of Object.keys(value)) {\r\n controls[key] = this.buildControl(value[key]);\r\n }\r\n\r\n return new FormGroup(controls);\r\n }\r\n\r\n return new FormControl(value);\r\n }\r\n\r\n getContext(formGroup: any): Record<string, any> {\r\n if (!(formGroup instanceof FormGroup)) {\r\n throw new Error(\"Scope is not a FormGroup\");\r\n }\r\n const patchOptions: PatchOptions = {\r\n strict: false\r\n };\r\n\r\n return {\r\n set: (path: Path, value: any, pathOptions?: PathOptions): boolean =>\r\n this.set(formGroup, path, value, pathOptions, patchOptions),\r\n\r\n get: (path: Path, pathOptions?: PathOptions): AbstractControl | undefined =>\r\n this.get(formGroup, path, pathOptions),\r\n\r\n reset: (path: Path): void =>\r\n this.reset(formGroup, path),\r\n\r\n resetAll: (...paths: string[]): void =>\r\n this.resetAll(formGroup, ...paths),\r\n\r\n status: (path: Path, pathOptions?: PathOptions): FormControlStatus | undefined =>\r\n this.status(formGroup, path, pathOptions),\r\n\r\n prepend: (path: Path, value: any, pathOptions?: PathOptions): boolean =>\r\n this.prepend(formGroup, path, value, pathOptions, patchOptions),\r\n\r\n append: (path: Path, value: any, pathOptions?: PathOptions): boolean =>\r\n this.append(formGroup, path, value, pathOptions, patchOptions),\r\n\r\n insert: (path: Path, index: number, value: any, pathOptions?: PathOptions): boolean =>\r\n this.insert(formGroup, path, index, value, pathOptions, patchOptions),\r\n\r\n remove: (path: Path, index: number): boolean =>\r\n this.remove(formGroup, path, index),\r\n\r\n moveUp: (path: Path, index: number): boolean =>\r\n this.moveUp(formGroup, path, index),\r\n\r\n moveDown: (path: Path, index: number): boolean =>\r\n this.moveDown(formGroup, path, index),\r\n\r\n resize: (path: Path, newSize: number): boolean =>\r\n this.resize(formGroup, path, newSize),\r\n\r\n buildControl: (value: any) => this.buildControl(value),\r\n\r\n getInvalidControls: (control: AbstractControl): { path: string, control: AbstractControl }[] =>\r\n this.getInvalidControls(control)\r\n };\r\n }\r\n\r\n *enumerateControls(\r\n source: AbstractControl | Iterable<AbstractControl>,\r\n options?: EnumerateOptions\r\n ): Generator<AbstractControl> {\r\n\r\n if (!(source instanceof AbstractControl)) {\r\n for (const control of source) {\r\n yield* this.enumerateControls(control, options);\r\n }\r\n return;\r\n }\r\n\r\n const {\r\n expandArray = true,\r\n expandGroup = true,\r\n skipDisabled = false\r\n } = options ?? {};\r\n\r\n if (skipDisabled && source.disabled)\r\n return;\r\n\r\n yield source;\r\n\r\n if (source instanceof FormGroup && expandGroup) {\r\n for (const child of Object.values(source.controls)) {\r\n yield* this.enumerateControls(child, options);\r\n }\r\n }\r\n else if (source instanceof FormArray && expandArray) {\r\n for (const child of source.controls) {\r\n yield* this.enumerateControls(child, options);\r\n }\r\n }\r\n }\r\n\r\n private applyPath(\r\n control: AbstractControl,\r\n path: Path,\r\n options?: PathOptions\r\n ): AbstractControl | undefined {\r\n const warn = (message: string) => {\r\n if (options?.emitWarn) console.warn(`[applyPath] ${message}`);\r\n };\r\n\r\n const error = (message: string): never => {\r\n if (options?.emitError) throw new Error(`[applyPath] ${message}`);\r\n throw new Error(`[applyPath] ${message}`); // fallback default behavior\r\n };\r\n\r\n const createControl = (type: ControlType): AbstractControl => {\r\n switch (type) {\r\n case 'array': return new FormArray([]);\r\n case 'group': return new FormGroup({});\r\n case 'control': default: return new FormControl(null);\r\n }\r\n };\r\n\r\n const segments = normalizePath(path);\r\n let current: AbstractControl | null = control;\r\n const createPath = options?.create ?? false;\r\n\r\n for (let i = 0; i < segments.length; i++) {\r\n const segment = segments[i];\r\n const isLeaf = i === segments.length - 1;\r\n const nextType: ControlType =\r\n isLeaf ? (options?.expected ?? 'control')\r\n : typeof segments[i + 1] === 'number' ? 'array'\r\n : 'group';\r\n\r\n const getCurrentPath = () => segments.slice(0, i + 1).join('.');\r\n\r\n if (!current) {\r\n return error(`Control is null at segment \"${getCurrentPath()}\"`);\r\n }\r\n\r\n if (typeof segment === 'number') {\r\n if (!(current instanceof FormArray)) {\r\n return error(`Expected FormArray at segment [${getCurrentPath()}], got ${current.constructor.name}`);\r\n }\r\n\r\n const index = segment;\r\n if (index < 0 || index >= current.length) {\r\n warn(`Index ${index} is out of bounds at path \"${getCurrentPath()}\" (length = ${current.length})`);\r\n return undefined;\r\n }\r\n\r\n current = current.at(index);\r\n\r\n } else if (typeof segment === 'string') {\r\n\r\n if (segment === 'parent') {\r\n current = (current instanceof FormGroup) && current.get(segment)\r\n ? current.get(segment)\r\n : current.parent;\r\n continue;\r\n }\r\n\r\n if (segment === 'root') {\r\n current = (current instanceof FormGroup && current.get(segment))\r\n ? current.get(segment)\r\n : current.root;\r\n continue;\r\n }\r\n\r\n if ((current instanceof FormArray) && options?.breakOnArray) {\r\n break;\r\n }\r\n\r\n if (!(current instanceof FormGroup)) {\r\n return error(`Expected FormGroup at segment \"${getCurrentPath()}\", got ${current.constructor.name}`);\r\n }\r\n\r\n if (current.get(segment)) {\r\n current = current.get(segment);\r\n\r\n if (!isLeaf && current instanceof FormControl && current.value === null && options?.breakOnNull) {\r\n break;\r\n }\r\n\r\n } else {\r\n if (createPath) {\r\n const newControl = createControl(nextType);\r\n current.addControl(segment, newControl);\r\n current = newControl;\r\n }\r\n else {\r\n warn(`Control with key \"${getCurrentPath()}\" not found in FormGroup.`);\r\n return undefined;\r\n }\r\n }\r\n\r\n }\r\n else if (!segment) {\r\n continue;\r\n }\r\n else {\r\n return error(`Invalid segment type: ${typeof segment}`);\r\n }\r\n }\r\n\r\n return current ?? undefined;\r\n }\r\n\r\n private asObject(value: any): object {\r\n if (value && typeof value === 'object' && !Array.isArray(value)) {\r\n return value as Record<string, any>;\r\n }\r\n return {};\r\n }\r\n\r\n private asArray(value: any): Array<any> {\r\n if (value && Array.isArray(value)) {\r\n return value;\r\n }\r\n return [];\r\n }\r\n\r\n private insertIntoArray(formArray: FormArray, index: number, value: any, options?: PatchOptions): boolean {\r\n const itemToAdd = this.createArrayItem(formArray);\r\n this.patch(itemToAdd, value, options);\r\n formArray.insert(index, itemToAdd);\r\n return true;\r\n }\r\n\r\n private removeFromArray(formArray: FormArray, index: number): boolean {\r\n if (index <= 0 || index >= formArray.length) false;\r\n formArray.removeAt(index);\r\n return true;\r\n }\r\n\r\n private createArrayItem(formArray: FormArray): FormGroup {\r\n const anyControl = formArray as any;\r\n const formGroup = (typeof (anyControl).createItem === 'function')\r\n ? anyControl.createItem()\r\n : new FormGroup({});\r\n return formGroup;\r\n }\r\n\r\n private createControlFromValue(value: any): AbstractControl {\r\n if (value === null || typeof value !== 'object') {\r\n return new FormControl(value);\r\n }\r\n if (Array.isArray(value)) {\r\n return new FormArray(this.createControlFromArray(value));\r\n }\r\n return new FormGroup({});\r\n }\r\n\r\n private createControlFromArray(array: any[]): AbstractControl[] {\r\n return array.map(item => this.createControlFromValue(item));\r\n }\r\n\r\n private setUnknown(control: any) {\r\n control._unknown = true;\r\n }\r\n\r\n private isUnknown(control: any): boolean {\r\n return control && control._unknown === true;\r\n }\r\n\r\n private waitUntilSettled(\r\n control: AbstractControl,\r\n pollInterval = 100\r\n ): Observable<FormControlStatus> {\r\n return interval(pollInterval).pipe(\r\n map(() => control.status),\r\n filter(status => status !== 'PENDING'),\r\n take(1)\r\n );\r\n }\r\n}\r\n","import { DestroyRef, Injectable } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { AbstractControl, FormArray, FormGroup } from '@angular/forms';\r\nimport { filter, map, Observable, pairwise, startWith } from 'rxjs';\r\n\r\n@Injectable()\r\nexport class SubscribeService {\r\n\r\n get dispatchMode(): DispatchMode {\r\n return this._dispatchMode;\r\n }\r\n\r\n set dispatchMode(value: DispatchMode) {\r\n this._dispatchMode = value;\r\n }\r\n\r\n subscribeChanges<T>(\r\n observable$: Observable<T>,\r\n control: AbstractControl,\r\n initial: T,\r\n destroyRef: DestroyRef,\r\n callback: (() => void) | ((oldValue: T, newValue: T) => void),\r\n logFn?: (control: AbstractControl) => void,\r\n emitWhenUnchanged = false\r\n ) {\r\n observable$\r\n .pipe(\r\n map(value => ({ value, disabled: control.disabled })),\r\n startWith({ value: initial, disabled: control.disabled }),\r\n pairwise(),\r\n filter(([previous, current]) => {\r\n return emitWhenUnchanged\r\n || control instanceof FormArray\r\n || control instanceof FormGroup\r\n || previous.value !== current.value\r\n || previous.disabled !== current.disabled\r\n }),\r\n takeUntilDestroyed(destroyRef)\r\n )\r\n .subscribe(([previous, current]) => {\r\n\r\n this.dispatch(() => {\r\n if (callback.length === 0) {\r\n (callback as () => void)();\r\n } else {\r\n (callback as (oldValue: T, newValue: T) => void)(previous.value, current.value);\r\n }\r\n\r\n logFn?.(control);\r\n }, destroyRef);\r\n\r\n });\r\n }\r\n\r\n private _dispatchMode: DispatchMode = 'async';\r\n\r\n private dispatch(\r\n fn: () => void,\r\n destroyRef: DestroyRef\r\n ): void {\r\n\r\n let alive = true;\r\n\r\n destroyRef.onDestroy(() => {\r\n alive = false;\r\n });\r\n\r\n if (this._dispatchMode === 'sync') {\r\n fn();\r\n return;\r\n }\r\n\r\n queueMicrotask(() => {\r\n if (!alive) return;\r\n fn();\r\n });\r\n }\r\n}\r\n\r\nexport type DispatchMode = 'sync' | 'async';\r\n\r\n","import { Injectable, PLATFORM_ID, inject } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { Observable, Subject } from 'rxjs';\r\n\r\nexport interface SessionChange<T = unknown> {\r\n key: string;\r\n value: T | null; // null when the key has been removed\r\n previousValue: T | null;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class SessionService {\r\n // sessionStorage does not exist during server-side rendering\r\n private readonly storage = isPlatformBrowser(inject(PLATFORM_ID)) ? sessionStorage : null;\r\n\r\n private readonly changes = new Subject<SessionChange>();\r\n\r\n get<T>(key: string): T | null {\r\n return this.parse<T>(this.storage?.getItem(key) ?? null);\r\n }\r\n\r\n set<T>(key: string, value: T): void {\r\n this.write(key, JSON.stringify(value) ?? null);\r\n }\r\n\r\n remove(key: string): void {\r\n this.write(key, null);\r\n }\r\n\r\n // Emits every change to any key in this tab\r\n watch(): Observable<SessionChange> {\r\n return this.changes.asObservable();\r\n }\r\n\r\n private write(key: string, raw: string | null): void {\r\n const previousRaw = this.storage?.getItem(key) ?? null;\r\n\r\n // Compare serialized values: no emission when nothing actually changed\r\n if (raw === previousRaw) return;\r\n\r\n try {\r\n if (raw === null) this.storage?.removeItem(key);\r\n else this.storage?.setItem(key, raw);\r\n } catch {\r\n // Quota exceeded or storage blocked: notify anyway, the app keeps working\r\n }\r\n\r\n this.changes.next({ key, value: this.parse(raw), previousValue: this.parse(previousRaw) });\r\n }\r\n\r\n private parse<T>(raw: string | null): T | null {\r\n try {\r\n return raw ? (JSON.parse(raw) as T) : null;\r\n } catch {\r\n // Corrupted value\r\n return null;\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { NavigationStart, Router } from '@angular/router';\r\nimport { filter } from 'rxjs';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class NavigationService {\r\n\r\n constructor(private router: Router)\r\n {\r\n router.events\r\n .pipe(filter(e => e instanceof NavigationStart))\r\n .subscribe((e: NavigationStart) => {\r\n this._skipState = this.shouldSkipState(e);\r\n });\r\n }\r\n\r\n //#region Skip State\r\n\r\n private _skipState = false;\r\n\r\n get skipState(): boolean {\r\n return this._skipState;\r\n }\r\n\r\n private shouldSkipState(e: NavigationStart): boolean {\r\n if (e.navigationTrigger === 'popstate') {\r\n return false;\r\n }\r\n const nav = this.router.getCurrentNavigation();\r\n return this._skipState = nav?.extras.state?.['skipState'] === true;\r\n }\r\n\r\n //#endregion\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { NavigationService } from './navigation.service';\r\n\r\n@Injectable()\r\nexport class StateService {\r\n\r\n constructor(private navigation: NavigationService) {\r\n }\r\n\r\n private static readonly store = new Map<string, any>();\r\n\r\n private readonly prefix = `state:${location.href}:`;\r\n\r\n getState<T = any>(componentId: string): T | null {\r\n const key = this.buildKey(componentId);\r\n const state = StateService.store.get(key) ?? null;\r\n this.clearState(componentId);\r\n if (this.navigation.skipState) return null;\r\n return state;\r\n }\r\n\r\n setState(componentId: string, value: any): void {\r\n const key = this.buildKey(componentId);\r\n if (value === undefined || value === null) {\r\n StateService.store.delete(key);\r\n return;\r\n }\r\n StateService.store.set(key, value);\r\n }\r\n\r\n clearState(componentId: string): void {\r\n const key = this.buildKey(componentId);\r\n StateService.store.delete(key);\r\n }\r\n\r\n private buildKey(componentId: string): string {\r\n return `${this.prefix}${componentId}`.toLowerCase();\r\n }\r\n\r\n}\r\n","import { ElementRef, Injector, DestroyRef } from \"@angular/core\";\r\nimport { RegisterService } from \"../services/register.service\";\r\nimport { StateService } from \"../services/state.service\";\r\n\r\nexport class Control {\r\n\r\n private readonly context: ControlContext;\r\n\r\n constructor(context: ControlContext) {\r\n if (!context) {\r\n throw new Error('ControlContext must not be null or undefined');\r\n }\r\n\r\n this.context = context;\r\n\r\n const stateless = (context.metadata?.stateless === true);\r\n\r\n context.destroyRef?.onDestroy(() => {\r\n if (!stateless) {\r\n this.onSaveState();\r\n } \r\n this.onDestroy();\r\n });\r\n\r\n this.onInit();\r\n\r\n if (!stateless) {\r\n setTimeout(() => this.onLoadState());\r\n }\r\n \r\n }\r\n\r\n public get name(): string {\r\n return this.context.name;\r\n }\r\n\r\n protected getMetadata(): any {\r\n return this.context.metadata;\r\n }\r\n\r\n protected getComponentRef(): any {\r\n return this.context.componentRef;\r\n }\r\n\r\n protected getElementRef(): ElementRef {\r\n return this.context.elementRef;\r\n }\r\n\r\n protected getInjector(): Injector {\r\n return this.context.injector;\r\n }\r\n\r\n protected getDestroyRef(): DestroyRef {\r\n return this.context.destroyRef;\r\n }\r\n\r\n protected getRegister(): RegisterService | undefined {\r\n return this.context.register();\r\n }\r\n\r\n protected onInit(): void {\r\n }\r\n\r\n protected onLoadState(): void {\r\n }\r\n\r\n protected onSaveState(): void {\r\n }\r\n\r\n protected onDestroy(): void {\r\n }\r\n\r\n protected getState<T = any>(): T | null {\r\n const id = this.getId();\r\n if (!id) return null;\r\n return this.State()?.getState(id);\r\n }\r\n\r\n protected setState(state: any): void {\r\n const id = this.getId();\r\n if (!id) return;\r\n this.State()?.setState(id, state);\r\n }\r\n\r\n protected clearState(): void {\r\n const id = this.getId();\r\n if (!id) return;\r\n this.State()?.clearState(id);\r\n }\r\n\r\n //#region Private Members\r\n\r\n private getId(): string | null {\r\n return `${this.context.path}.${this.context.name}`;\r\n }\r\n\r\n private State() {\r\n return this.getInjector().get(StateService);\r\n }\r\n\r\n //#endregion\r\n\r\n}\r\n\r\nexport class ContainerControl extends Control {\r\n\r\n constructor(context: ControlContext) {\r\n super(context);\r\n }\r\n\r\n findControl(\r\n predicate: (control: Control) => boolean,\r\n firstOnly: boolean\r\n ): Control[] {\r\n const register = this.getRegister();\r\n return register\r\n ? register.findControl(predicate, firstOnly, false)\r\n : [];\r\n }\r\n}\r\n\r\nexport class ItemControl extends ContainerControl {\r\n\r\n constructor(context: ControlContext,\r\n public readonly index: number) {\r\n super(context);\r\n }\r\n\r\n}\r\n\r\nexport interface ControlContext {\r\n name: string;\r\n path: string;\r\n metadata: any;\r\n componentRef: any;\r\n elementRef: ElementRef;\r\n injector: Injector;\r\n destroyRef: DestroyRef;\r\n register: () => RegisterService | undefined; \r\n}\r\n","import { Injectable, Optional, SkipSelf } from '@angular/core';\r\nimport { Control, ContainerControl } from '../controls/control';\r\nimport { IEvaluatorProvider } from '../services/programmability.service';\r\nimport { toProxy } from '../utils/proxy';\r\n\r\n@Injectable()\r\nexport class RegisterService implements IEvaluatorProvider {\r\n\r\n constructor(\r\n @Optional() @SkipSelf() private parent: RegisterService | null)\r\n {\r\n }\r\n\r\n private controls: Record<string, Control> = {};\r\n\r\n //#region Registration\r\n\r\n register(name: string, control: Control) {\r\n this.controls[name] = control;\r\n }\r\n\r\n unregister(name: string) {\r\n delete this.controls[name];\r\n }\r\n\r\n unregisterAll() {\r\n this.controls = { };\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Hierarchy\r\n\r\n identify(id: string, index?: number): void {\r\n if (!id)\r\n id = crypto.randomUUID();\r\n\r\n if (this.identityNode)\r\n throw new Error('IdentityNode: already initialized');\r\n\r\n this.identityNode = { id, index };\r\n\r\n this._path = undefined;\r\n }\r\n\r\n getPath(): string {\r\n if (this._path)\r\n return this._path;\r\n\r\n this._path = this.identityChain\r\n .map(node =>\r\n node.index != null\r\n ? `${node.id}.${node.index}`\r\n : node.id\r\n )\r\n .join('.');\r\n\r\n return this._path;\r\n }\r\n\r\n private _path?: string;\r\n\r\n private identityNode?: IdentityNode;\r\n\r\n private get identityChain(): readonly IdentityNode[] {\r\n if (!this.identityNode) {\r\n return this.parent\r\n ? this.parent.identityChain\r\n : [];\r\n }\r\n return this.parent\r\n ? [...this.parent.identityChain, this.identityNode]\r\n : [this.identityNode];\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Controls\r\n\r\n getContext(): Record<string, any> {\r\n return {\r\n control: (name: string) => toProxy(this.getControl(name))\r\n };\r\n }\r\n\r\n getControl(name: string): Control | null {\r\n name = this.castString(name);\r\n\r\n if (!name)\r\n return null;\r\n\r\n if (name.startsWith(\"../\"))\r\n return this.resolveParent(name.substring(3));\r\n \r\n const controls = this.findControl(control => control.name === name, true, true);\r\n return (controls.length === 0)\r\n ? null\r\n : controls[0];\r\n }\r\n\r\n getControlAs<T extends Control>(name: string, type: new (...args: any[]) => T): T | null {\r\n const ctrl = this.getControl(name);\r\n return ctrl instanceof type ? ctrl : null;\r\n }\r\n\r\n findControl(predicate: (control: Control) => boolean, firstOnly: boolean = false, parent: boolean = false): Control[] {\r\n const controls: Control[] = [];\r\n\r\n for (const control of Object.values(this.controls)) {\r\n if (predicate(control)) {\r\n controls.push(control);\r\n if (firstOnly) {\r\n return controls;\r\n }\r\n }\r\n\r\n if (control instanceof ContainerControl) {\r\n controls.push(...control.findControl(predicate, firstOnly));\r\n if (controls.length > 0 && firstOnly) {\r\n return controls;\r\n }\r\n }\r\n }\r\n\r\n if (parent) {\r\n let currentParent = this.parent;\r\n\r\n while (currentParent) {\r\n for (const control of Object.values(currentParent.controls)) {\r\n if (predicate(control)) {\r\n controls.push(control);\r\n if (firstOnly) {\r\n return controls;\r\n }\r\n }\r\n }\r\n currentParent = currentParent.parent;\r\n }\r\n }\r\n \r\n return controls;\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Private Members\r\n\r\n private castString(value: any): string {\r\n return typeof value === 'string' ? value.trim() : \"\";\r\n }\r\n\r\n private resolveParent(name: string) : Control | null {\r\n if (!this.parent) {\r\n return null;\r\n }\r\n else {\r\n return this.parent.getControl(name);\r\n }\r\n }\r\n\r\n //#endregion\r\n}\r\n\r\nexport interface IdentityNode {\r\n id: string;\r\n index?: number;\r\n}\r\n","import { EffectRef, Injector, Signal, WritableSignal, effect, isSignal, untracked } from '@angular/core';\r\nimport { Path, PathSegments, isIndexSegment, normalizePath } from '../common/path';\r\n\r\n/**\r\n * Watches the value at the path of the object when the path goes through signals:\r\n * - `partial` (default): registers when there is at least one signal on the path (e.g. `cliente`\r\n * for `cliente.citta` when only `cliente` is a signal, or a path that breaks after a signal);\r\n * - not `partial`: registers only when the leaf of the path is a signal.\r\n * Once registered, every signal along the path is tracked, so a replaced intermediate value (e.g. a\r\n * new object with a new inner signal) is followed too; `onChange` is called with the new value at\r\n * the end of the path whenever it changes (not on the first read).\r\n * Returns the effect, or null when there is nothing to register on. The effect lives as long as its\r\n * injector (when omitted the call must be in an injection context), or until `destroy()`.\r\n */\r\nexport function watchSignalPath(\r\n root: unknown,\r\n path: Path,\r\n onChange: (value: unknown) => void,\r\n partial = true,\r\n injector?: Injector,\r\n): EffectRef | null {\r\n const segments = normalizePath(path);\r\n if (!untracked(() => findSignal(root, segments, partial))) {\r\n return null;\r\n }\r\n\r\n let first = true;\r\n let previous: unknown;\r\n // Created outside any reactive context: the watch can be requested while a template or a\r\n // computed is being evaluated (effect() would throw NG0602 there).\r\n return untracked(() =>\r\n effect(() => {\r\n const value = readSignalPath(root, segments);\r\n if (first) {\r\n first = false;\r\n previous = value;\r\n return;\r\n }\r\n if (Object.is(value, previous)) {\r\n return;\r\n }\r\n previous = value;\r\n untracked(() => onChange(value));\r\n }, { injector }),\r\n );\r\n}\r\n\r\n/**\r\n * Value at the path of the object, reading every signal found on the way (leaf included): inside a\r\n * reactive context all of them are tracked. Undefined when the path breaks.\r\n */\r\nexport function readSignalPath(root: unknown, path: Path): unknown {\r\n let node: any = isSignal(root) ? root() : root;\r\n for (const segment of normalizePath(path)) {\r\n if (node === null || (typeof node !== 'object' && typeof node !== 'function')) {\r\n return undefined;\r\n }\r\n node = node[segment];\r\n if (isSignal(node)) {\r\n node = node();\r\n }\r\n }\r\n return node;\r\n}\r\n\r\n/** The last signal along the path (partial) or the signal at the leaf (not partial). */\r\nfunction findSignal(root: unknown, segments: PathSegments, partial: boolean): Signal<unknown> | null {\r\n let node: any = root;\r\n let last: Signal<unknown> | null = null;\r\n for (let i = 0; i < segments.length; i++) {\r\n if (isSignal(node)) {\r\n last = node;\r\n node = node();\r\n }\r\n if (node === null || (typeof node !== 'object' && typeof node !== 'function')) {\r\n return partial ? last : null;\r\n }\r\n node = node[segments[i]];\r\n }\r\n if (isSignal(node)) {\r\n return node;\r\n }\r\n return partial ? last : null;\r\n}\r\n\r\n/**\r\n * Writes the value at the path of the object, respecting the signals found on the way:\r\n * - a writable signal at the end of the path gets `set(value)` (it is never replaced);\r\n * - a writable signal in the middle gets `set()` of a copy of its value with the change applied, so\r\n * the signal notifies its consumers (nested signals inside it are written directly);\r\n * - read-only signals (computed, input) are not written: a warning is logged;\r\n * - plain objects are changed in place; missing branches are created (`[]` before an index segment,\r\n * `{}` otherwise).\r\n * Returns true when something was written.\r\n */\r\nexport function writeSignalPath(root: object, segments: PathSegments, value: unknown): boolean {\r\n if (segments.length === 0) {\r\n return false;\r\n }\r\n return writeNode(root, segments, value, false).changed;\r\n}\r\n\r\ninterface NodeWrite {\r\n /** The node after the write: the same one, or a copy when `copy` was requested. */\r\n node: any;\r\n /** True when something was written. */\r\n changed: boolean;\r\n}\r\n\r\nfunction writeNode(node: any, segments: PathSegments, value: unknown, copy: boolean): NodeWrite {\r\n const [head, ...rest] = segments;\r\n const isObject = node !== null && typeof node === 'object';\r\n let target: any = isObject ? node : isIndexSegment(head) ? [] : {};\r\n const created = !isObject;\r\n const current = target[head];\r\n\r\n if (isSignal(current)) {\r\n // The signal keeps its place in the node: only its value changes.\r\n const changed = writeSignal(current, head, rest, value);\r\n return { node: target, changed: changed || created };\r\n }\r\n\r\n let next: unknown;\r\n let changed: boolean;\r\n if (rest.length === 0) {\r\n next = value;\r\n changed = current !== value;\r\n } else {\r\n const inner = writeNode(current, rest, value, copy);\r\n next = inner.node;\r\n changed = inner.changed;\r\n }\r\n\r\n if (next === current) {\r\n // Unchanged, or changed below this node without replacing it.\r\n return { node: target, changed: changed || created };\r\n }\r\n if (copy && !created) {\r\n target = Array.isArray(target) ? [...target] : { ...target };\r\n }\r\n target[head] = next;\r\n return { node: target, changed: true };\r\n}\r\n\r\nfunction writeSignal(\r\n source: Signal<unknown>,\r\n head: string | number,\r\n rest: PathSegments,\r\n value: unknown,\r\n): boolean {\r\n if (!isWritableSignal(source)) {\r\n console.warn(`Scope: \"${String(head)}\" is a read-only signal, the value is not written.`);\r\n return false;\r\n }\r\n const base = untracked(source);\r\n if (rest.length === 0) {\r\n if (Object.is(value, base)) {\r\n return false;\r\n }\r\n source.set(value);\r\n return true;\r\n }\r\n // Below a signal the objects are copied, so that the signal notifies the change.\r\n const inner = writeNode(base, rest, value, true);\r\n if (inner.node !== base) {\r\n source.set(inner.node);\r\n }\r\n // Same node: unchanged, or changed through a nested signal.\r\n return inner.changed;\r\n}\r\n\r\nfunction isWritableSignal(source: Signal<unknown>): source is WritableSignal<unknown> {\r\n return typeof (source as Partial<WritableSignal<unknown>>).set === 'function';\r\n}\r\n","import { EffectRef, Injectable, Injector, Optional, SkipSelf, inject } from '@angular/core';\r\nimport { IEvaluatorProvider } from '../services/programmability.service';\r\nimport { Observable, Subject } from 'rxjs';\r\nimport { filter } from 'rxjs/operators';\r\nimport { Path, PathSegments, normalizePath, matchPath } from '../common/path';\r\nimport { toProxy } from '../utils/proxy';\r\nimport { watchSignalPath, writeSignalPath } from '../utils/signal';\r\n\r\n@Injectable()\r\nexport class ScopeService implements IEvaluatorProvider {\r\n\r\n constructor(\r\n @Optional() @SkipSelf() private parent: ScopeService | null) {\r\n }\r\n\r\n private readonly injector = inject(Injector);\r\n\r\n private scope: Record<string, any> | null = null;\r\n\r\n private readonly refreshSubject = new Subject<Path>();\r\n\r\n readonly onRefresh: Observable<Path> = this.refreshSubject.asObservable();\r\n\r\n /** Paths requested with watch(), by key: watched again when the scope is replaced. */\r\n private readonly requested = new Map<string, PathSegments>();\r\n\r\n /** Effects of the watched paths that go through signals, by key. */\r\n private readonly watchers = new Map<string, EffectRef>();\r\n\r\n set(scope: Record<string, any> | null) {\r\n this.scope = scope;\r\n this.unwatchAll();\r\n for (const [key, segments] of this.requested) {\r\n this.watchSignals(key, segments);\r\n }\r\n }\r\n\r\n get(): Record<string, any> | null {\r\n return this.scope; \r\n }\r\n\r\n refresh(path: Path = []): void {\r\n this.refreshSubject.next(path);\r\n }\r\n\r\n refreshMany(...paths: Path[]): void {\r\n for (const path of paths) {\r\n this.refresh(path);\r\n }\r\n }\r\n\r\n /**\r\n * Refreshes that concern the given path: the explicit ones (refresh(), setValue()) and, when the\r\n * path goes through signals of the scope, the changes of those signals.\r\n */\r\n watch(path: Path): Observable<Path> {\r\n const segments = normalizePath(path);\r\n const key = segments.join('.');\r\n if (!this.requested.has(key)) {\r\n this.requested.set(key, segments);\r\n this.watchSignals(key, segments);\r\n }\r\n return this.onRefresh.pipe(filter(p => matchPath(p, segments)));\r\n }\r\n\r\n setValue(path: Path, value: any): void {\r\n if (!this.scope) return;\r\n\r\n const segments = normalizePath(path);\r\n if (segments.length === 0) return;\r\n\r\n if (writeSignalPath(this.scope, segments, value)) {\r\n this.refresh(path);\r\n }\r\n }\r\n\r\n getContext(): Record<string, any> {\r\n if (!this.scope) return {};\r\n const ctx = toProxy(this.scope);\r\n if (!(\"parent\" in ctx)) ctx.parent = () => this.parent?.getContext();\r\n if (!(\"set\" in ctx)) ctx.set = this.setValue.bind(this);\r\n return ctx;\r\n }\r\n\r\n /** Watches the last signal along the path (nothing to do when the path has none). */\r\n private watchSignals(key: string, segments: PathSegments): void {\r\n if (!this.scope) return;\r\n const ref = watchSignalPath(this.scope, segments, () => this.refresh(segments), true, this.injector);\r\n if (ref) {\r\n this.watchers.set(key, ref);\r\n }\r\n }\r\n\r\n private unwatchAll(): void {\r\n for (const ref of this.watchers.values()) {\r\n ref.destroy();\r\n }\r\n this.watchers.clear();\r\n }\r\n}\r\n","import { DestroyRef, inject, Injectable, Optional } from '@angular/core';\r\nimport { AbstractControl, FormArray, FormControlStatus, FormGroup } from '@angular/forms';\r\nimport { FeelService } from '../services/feel.service';\r\nimport { ScopeService } from '../services/scope.service';\r\nimport { RegisterService } from '../services/register.service';\r\nimport { ToastService } from '../services/toast.service';\r\nimport { FunctionService } from '../services/function.service';\r\nimport { GlobalService } from '../services/global.service';\r\nimport { FormService, PathOptions } from './form.service';\r\nimport { DialogService } from '../services/dialog.service';\r\nimport { FormatterService } from '../services/formatter.service';\r\nimport { JsonService } from '../services/json.service';\r\nimport { WeakService } from '../services/weak.service';\r\nimport { SubscribeService } from '../services/subscribe.service';\r\nimport { toProxy } from '../utils/proxy';\r\nimport { isObservable, Observable } from \"rxjs\";\r\nimport { filter, shareReplay, tap } from 'rxjs/operators';\r\nimport { Path } from '../common/path';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { CacheControl } from '../utils/cacheControl';\r\nimport { Notifier } from '../utils/notifier';\r\nimport { ActivatedRoute, Params } from '@angular/router';\r\nimport { SessionService } from './session.service';\r\n\r\nconst StatusDependency = \"$status\";\r\n\r\n@Injectable()\r\nexport class ProgrammabilityService {\r\n\r\n constructor(private feelService: FeelService\r\n , private weakService: WeakService\r\n , private toastService: ToastService\r\n , private dialogService: DialogService\r\n , private formatterService: FormatterService\r\n , private jsonService : JsonService\r\n , private functionService: FunctionService\r\n , private formService: FormService\r\n , private globalService: GlobalService\r\n , private subscribeService: SubscribeService\r\n , private session: SessionService\r\n , private destroyRef: DestroyRef\r\n , @Optional() private register: RegisterService\r\n , @Optional() private scope: ScopeService\r\n ) {\r\n this.Init();\r\n\r\n this.evaluatorProviders = [\r\n this.dialogService,\r\n this.toastService,\r\n this.functionService,\r\n this.formatterService,\r\n this.jsonService,\r\n this.register \r\n ];\r\n\r\n this.predefinedFunctions = this.getPredefinedFunctions();\r\n\r\n this.queryParams$.pipe(takeUntilDestroyed()).subscribe();\r\n }\r\n\r\n /*\r\n Global Properties:\r\n - feel-diagnostics: \"on\", \"off\"\r\n - feel-cacheable: \"on\", \"off\"\r\n */\r\n\r\n readonly evaluationDone = new Notifier();\r\n \r\n private predefinedFunctions!: Record<string, any>;\r\n\r\n private evaluatorProviders: IEvaluatorProvider[] = [];\r\n\r\n addEvaluatorProviders(evaluatorProvider: IEvaluatorProvider): void {\r\n if (evaluatorProvider) {\r\n this.evaluatorProviders.push(evaluatorProvider);\r\n this.predefinedFunctions = this.getPredefinedFunctions();\r\n }\r\n }\r\n\r\n isExpression(text: string | null | undefined): boolean {\r\n return typeof text === 'string' && text.startsWith(\"=\");\r\n };\r\n\r\n getExpression(text: string | null | undefined): string {\r\n if (this.isExpression(text))\r\n return text!.substring(1);\r\n return \"\";\r\n };\r\n\r\n evaluateString(formGroup: FormGroup, value: string | null | undefined, options: EvaluateOptions = {}): string {\r\n if (this.isExpression(value)) {\r\n return this.evalExpression(formGroup, this.getExpression(value), options) as string;\r\n }\r\n return value ?? \"\";\r\n }\r\n\r\n evaluateBoolean(formGroup: FormGroup, value: boolean | string | null | undefined, options: EvaluateOptions = {}): boolean | null {\r\n if (typeof value === 'boolean') {\r\n return value;\r\n }\r\n else if (this.isExpression(value)) {\r\n return this.evalExpression(formGroup, this.getExpression(value), options) as boolean; \r\n }\r\n return null;\r\n }\r\n\r\n evaluateNumber(formGroup: FormGroup, value: number | string | null | undefined, options: EvaluateOptions = {}): number | null {\r\n if (typeof value === 'number') {\r\n return value;\r\n }\r\n else if (this.isExpression(value)) {\r\n return this.evalExpression(formGroup, this.getExpression(value), options) as number;\r\n }\r\n return null;\r\n }\r\n\r\n evaluate(formGroup: FormGroup, value: string | null, options: EvaluateOptions = { }): any {\r\n if (this.isExpression(value)) {\r\n return this.evalExpression(formGroup, this.getExpression(value), options);\r\n }\r\n return value;\r\n }\r\n\r\n evaluateTemplate(formGroup: FormGroup, value: string | null, options: EvaluateOptions = {}): any {\r\n\r\n let template: string | null = null;\r\n\r\n if (this.isExpression(value)) {\r\n template = this.evalExpression(formGroup, this.getExpression(value), options) as string;\r\n }\r\n else {\r\n template = value;\r\n }\r\n\r\n if (!template)\r\n return \"\";\r\n\r\n return this.evalTemplate(formGroup, template, options);\r\n }\r\n\r\n evaluateUnary(formGroup: FormGroup, value: string | null, input: any, options: EvaluateOptions = {}): any {\r\n if (this.isExpression(value)) {\r\n return this.evalUnaryTest(formGroup, this.getExpression(value), input, options);\r\n }\r\n return null;\r\n }\r\n\r\n invalidate(value: string | null): void {\r\n if (this.isExpression(value)) {\r\n this.invalidateExpression(this.getExpression(value)); \r\n }\r\n }\r\n\r\n invalidateAll(): void {\r\n this.invalidateAllExpression(); \r\n }\r\n\r\n watch(formGroup: FormGroup\r\n , dependencies: (string | string[])[]\r\n , callback: () => void\r\n , destroyRef?: DestroyRef) {\r\n this.watchingDependencies(formGroup, dependencies, callback, destroyRef ?? this.destroyRef);\r\n }\r\n\r\n getDependencies(formGroup: FormGroup, expression: string): (string | string[])[] {\r\n const context = this.getContext(formGroup)\r\n return this.feelService.getDependencies(expression, context);\r\n }\r\n\r\n get verbose(): boolean {\r\n return this._verbose;\r\n }\r\n\r\n get cacheable(): boolean {\r\n return this._cacheable;\r\n }\r\n\r\n private _verbose = false;\r\n\r\n private _cacheable = true;\r\n\r\n private onErrorHandler: any = this.onError.bind(this);\r\n\r\n private Init() {\r\n this._cacheable = this.globalService.getProperty(\"feel-cacheable\", \"on\") === \"on\";\r\n this._verbose = this.globalService.getProperty(\"feel-diagnostics\", \"off\") === \"on\";\r\n if (this.verbose)\r\n console.log(\"Programmability Service Initialized\", { cacheable: this.cacheable, verbose: this.verbose });\r\n }\r\n\r\n private evalUnaryTest(formGroup: FormGroup, expression: string, input: any, options: EvaluateOptions = {}) {\r\n const logError = (expression: string, error: any) => {\r\n console.warn(expression, { formGroup, error });\r\n };\r\n\r\n const logEvaluation = (expression: string, result: any) => {\r\n if (!this.verbose) return;\r\n console.log(\"Evaluate UnaryTest:\", expression, result, { formGroup });\r\n };\r\n\r\n try {\r\n const context = this.getContext(formGroup, options);\r\n const result = this.feelService.evalUnaryTest(expression\r\n , context\r\n , input);\r\n logEvaluation(expression, result);\r\n return result;\r\n } catch (e) {\r\n logError(expression, e);\r\n return null;\r\n }\r\n finally {\r\n this.evaluationDone.notify();\r\n }\r\n }\r\n\r\n private evalExpression(formGroup: FormGroup, expression: string, options: EvaluateOptions = {}): any {\r\n\r\n const logError = (expression: string, error: any) => {\r\n console.warn(expression, { formGroup, options, error });\r\n };\r\n\r\n const logInvalidate = (expression: string) => {\r\n if (!this.verbose) return;\r\n console.log(\"Invalidate Expression:\", expression, { formGroup, options });\r\n };\r\n\r\n const logEvaluation = (expression: string, result: any) => {\r\n if (!this.verbose) return;\r\n console.log(\"Evaluate Expression:\", expression, result, { formGroup, options });\r\n };\r\n\r\n const cacheControl = new CacheControl();\r\n\r\n const fullHydratation = options.hydrate === true;\r\n\r\n const evaluate = () => {\r\n try {\r\n const context = this.getContext(formGroup, options);\r\n cacheControl.configure(context);\r\n const result = this.feelService.evalExpression(expression, context);\r\n logEvaluation(expression, result);\r\n if (cacheControl.ttl != null)\r\n setTimeout(() => this.invalidateExpression(expression), cacheControl.ttl);\r\n const hydrated = this.functionService.hydrate(result, fullHydratation);\r\n return options.transform ? options.transform(hydrated) : hydrated;\r\n }\r\n catch (e) {\r\n logError(expression, e);\r\n return null;\r\n }\r\n finally {\r\n this.evaluationDone.notify();\r\n }\r\n };\r\n\r\n const cacheable = options.cacheable ?? this.cacheable;\r\n\r\n if (cacheable) {\r\n\r\n const ignoreDeps = options.ignoreDeps ?? false;\r\n\r\n if (!ignoreDeps) {\r\n const watchKey = `:watch(${expression})`;\r\n\r\n this.weakService.call(this, watchKey, () => {\r\n this.watchingExpression(formGroup, expression\r\n , () => {\r\n this.invalidateExpression(expression);\r\n options.cacheInvalidated?.();\r\n logInvalidate(expression);\r\n }\r\n , options?.destroyRef);\r\n return true;\r\n });\r\n }\r\n }\r\n \r\n let result = cacheable\r\n ? this.weakService.call(this, expression, evaluate, null, this.onErrorHandler, () => !cacheControl.isVolatile)\r\n : evaluate();\r\n\r\n if (options?.invokeArgs && typeof result === 'function') {\r\n return result(...options.invokeArgs); \r\n }\r\n\r\n return result;\r\n }\r\n\r\n private evalTemplate(formGroup: FormGroup, expression: string, options: EvaluateOptions = {}): any {\r\n\r\n const logError = (expression: string, error: any) => {\r\n console.warn(expression, { formGroup, options, error });\r\n };\r\n\r\n const logInvalidate = (expression: string) => {\r\n if (!this.verbose) return;\r\n console.log(\"Invalidate Template:\", expression, { formGroup, options });\r\n };\r\n\r\n const logEvaluation = (expression: string, result: any) => {\r\n if (!this.verbose) return;\r\n console.log(\"Evaluate Template:\", expression, result, { formGroup, options });\r\n };\r\n\r\n const cacheControl = new CacheControl();\r\n\r\n const evaluate = () => {\r\n try {\r\n const context = this.getContext(formGroup);\r\n cacheControl.configure(context);\r\n const result = this.feelService.evalTemplate(expression, context);\r\n logEvaluation(expression, result);\r\n if (cacheControl.ttl != null)\r\n setTimeout(() => this.invalidateExpression(expression), cacheControl.ttl);\r\n return result;\r\n }\r\n catch (e) {\r\n logError(expression, e);\r\n return null;\r\n }\r\n finally {\r\n this.evaluationDone.notify();\r\n }\r\n };\r\n\r\n const cacheable = options.cacheable ?? this.cacheable;\r\n \r\n if (cacheable) {\r\n const watchKey = `:watchTemplate(${expression})`;\r\n\r\n this.weakService.call(this, watchKey, () => {\r\n this.watchingTemplateExpression(formGroup, expression\r\n , () => {\r\n this.invalidateExpression(expression);\r\n logInvalidate(expression);\r\n }\r\n , options?.destroyRef);\r\n return true;\r\n });\r\n\r\n return this.weakService.call(this, expression, evaluate, null, null, () => !cacheControl.isVolatile);\r\n }\r\n else {\r\n return evaluate();\r\n }\r\n }\r\n\r\n private onError(result: any): any {\r\n if (isObservable(result)) {\r\n return result.pipe(\r\n tap({\r\n error: err => {\r\n this.toastService.notifyError(err.message);\r\n }\r\n })\r\n );\r\n }\r\n else {\r\n return result;\r\n }\r\n }\r\n\r\n private getPredefinedFunctions(): Record<string, any> {\r\n return this.evaluatorProviders.reduce((acc, provider) => {\r\n return {\r\n ...acc,\r\n ...provider.getContext()\r\n };\r\n }, {});\r\n }\r\n\r\n private getFeelFunctions()\r\n {\r\n return {\r\n isValidExpression: this.feelService.isValidExpression,\r\n isValidUnaryTest: this.feelService.isValidUnaryTest\r\n };\r\n }\r\n\r\n private getFormFunctions(formGroup: FormGroup | null): Record<string, any> {\r\n return this.formService.getContext(formGroup);\r\n }\r\n\r\n private getParentContext(formGroup: FormGroup | null): Record<string, any> | null {\r\n if (formGroup === null) { \r\n return null;\r\n }\r\n\r\n const parent = this.getParent(formGroup);\r\n\r\n if (!parent) {\r\n return null;\r\n }\r\n\r\n const self = this;\r\n\r\n return {\r\n ...parent.value,\r\n formGroup: () => toProxy(parent), \r\n get parent() { return self.getParentContext(parent); },\r\n }; \r\n }\r\n\r\n private getRootContext(formGroup: FormGroup | null): Record<string, any> | null {\r\n if (formGroup === null) {\r\n return null;\r\n }\r\n \r\n const root = formGroup?.root;\r\n\r\n if (!root) {\r\n return null;\r\n }\r\n\r\n return root.value; \r\n }\r\n\r\n private getParent(formGroup: FormGroup) : FormGroup | null {\r\n let parent = formGroup.parent;\r\n\r\n while (parent instanceof FormArray) {\r\n parent = parent?.parent;\r\n }\r\n\r\n return parent as FormGroup | null;\r\n }\r\n\r\n private getContext(control: AbstractControl, options: EvaluateOptions = {}): Record<string, any> {\r\n\r\n const formGroup = control as FormGroup | null;\r\n\r\n const baseContext = formGroup?.value ?? { };\r\n\r\n const self = this;\r\n\r\n this.queryParams;\r\n\r\n let context = {\r\n get console() { return toProxy(console); },\r\n get parent() { return self.getParentContext(formGroup); },\r\n get root() { return self.getRootContext(formGroup); },\r\n get session() { return toProxy(self.session); },\r\n formGroup: () => toProxy(formGroup), \r\n _: this.scope?.getContext(),\r\n queryParams: this.queryParams,\r\n ...baseContext,\r\n fn: {\r\n ...this.predefinedFunctions,\r\n ...this.getFormFunctions(formGroup),\r\n ...this.getFeelFunctions()\r\n }\r\n }\r\n\r\n if (options.extendContext) {\r\n const extended = options.extendContext();\r\n if (extended) {\r\n context = {\r\n ...context,\r\n ...extended\r\n }\r\n }\r\n }\r\n\r\n return context;\r\n }\r\n\r\n private watchingExpression(formGroup: FormGroup\r\n , expression: string\r\n , callback: () => void\r\n , destroyRef?: DestroyRef): void {\r\n const logDependencies = (dependencies: any) => {\r\n if (!this.verbose) return;\r\n console.log(\"Get Dependencies:\", expression, dependencies, { formGroup });\r\n };\r\n const context = this.getContext(formGroup);\r\n const dependencies = this.feelService.getDependencies(expression, context);\r\n logDependencies(dependencies);\r\n this.watchingDependencies(formGroup, dependencies, callback, destroyRef ?? this.destroyRef);\r\n };\r\n\r\n private watchingTemplateExpression(formGroup: FormGroup\r\n , expression: string\r\n , callback: () => void\r\n , destroyRef?: DestroyRef): void {\r\n const logDependencies = (dependencies: any) => {\r\n if (!this.verbose) return;\r\n console.log(\"Get Template Dependencies:\", expression, dependencies, { formGroup });\r\n };\r\n const context = this.getContext(formGroup);\r\n const dependencies = this.feelService.getTemplateDependencies(expression, context);\r\n logDependencies(dependencies);\r\n this.watchingDependencies(formGroup, dependencies, callback, destroyRef ?? this.destroyRef);\r\n };\r\n\r\n private watchingDependencies(formGroup: FormGroup\r\n , dependencies: (string | string[])[]\r\n , callback: () => void\r\n , destroyRef: DestroyRef): void {\r\n\r\n if (!dependencies?.length) return;\r\n\r\n const logWatching = (dependence: any) => {\r\n if (!this.verbose) return;\r\n const text = Array.isArray(dependence) ? dependence.join(\".\") : dependence;\r\n console.log(\"Watching dependence:\", text, { formGroup });\r\n };\r\n\r\n const logValueChanged = (control: AbstractControl) => {\r\n if (!this.verbose) return;\r\n console.log(\"Value Changed:\", control.value, { path: this.getPath(control), control });\r\n };\r\n\r\n const logStatusChanged = (control: AbstractControl) => {\r\n if (!this.verbose) return;\r\n console.log(\"Status Changed:\", control.status, { path: this.getPath(control), control });\r\n };\r\n\r\n const logPathChanged = (message: string, path: Path) => {\r\n if (!this.verbose) return;\r\n console.log(message, path);\r\n };\r\n\r\n const valueSubscribe = (control: AbstractControl) => {\r\n this.subscribeService.subscribeChanges(control.valueChanges, control, control.value, destroyRef, callback, logValueChanged);\r\n };\r\n\r\n const statusSubscribe = (control: AbstractControl) => {\r\n this.subscribeService.subscribeChanges<FormControlStatus>(this.formService.statusChanges(control, callback), control, control.status, destroyRef, callback, logStatusChanged);\r\n };\r\n\r\n const subscribeTo = <T>(\r\n source$: Observable<T>,\r\n label: string,\r\n dependence: Path,\r\n predicate: (value: T) => boolean = () => true\r\n ) => {\r\n source$\r\n .pipe(filter(predicate), takeUntilDestroyed(destroyRef))\r\n .subscribe(() => {\r\n callback();\r\n logPathChanged(label, dependence);\r\n });\r\n logWatching(dependence);\r\n };\r\n\r\n const subscribeControl = (control: AbstractControl\r\n , status: boolean\r\n , dependence: string | string[]\r\n ) => {\r\n if (!status) {\r\n valueSubscribe(control);\r\n logWatching(dependence);\r\n }\r\n else {\r\n statusSubscribe(control);\r\n logWatching(dependence);\r\n }\r\n };\r\n\r\n const startsWith = (path: string | string[], value: string): path is string[] => {\r\n return Array.isArray(path) && path.length > 0 && path[0] === value;\r\n };\r\n\r\n for (const dependence of dependencies) {\r\n const [path, status] = this.processDependencies(dependence);\r\n if (startsWith(path, \"_\")) {\r\n const dependence = path.slice(1);\r\n subscribeTo(this.scope.watch(dependence), \"Scope Changed:\", dependence); \r\n }\r\n else if (startsWith(path, \"queryParams\")) {\r\n subscribeTo(this.queryParams$, \"QueryParams Changed:\", dependence);\r\n }\r\n else if (path == \"session\") {\r\n subscribeTo(this.session.watch(), \"Session Changed:\", path);\r\n }\r\n else {\r\n const options: PathOptions = { breakOnArray: true, breakOnNull: true };\r\n const control = this.formService.getControl(formGroup, path, options);\r\n if (control) {\r\n subscribeControl(control, status, dependence);\r\n }\r\n else {\r\n this.formService.waitForControl(formGroup, path, options)\r\n .pipe(takeUntilDestroyed(destroyRef))\r\n .subscribe(control => {\r\n subscribeControl(control, status, dependence);\r\n callback();\r\n });\r\n }\r\n }\r\n } \r\n }\r\n\r\n private invalidateExpression(expression: string): void {\r\n this.weakService.invalidate(this, expression);\r\n this.evaluationDone.notify();\r\n }\r\n\r\n private invalidateAllExpression(): void {\r\n this.weakService.invalidateAll(this);\r\n this.evaluationDone.notify();\r\n }\r\n\r\n private processDependencies(dependency: string | string[]): [string | string[], boolean] {\r\n const statusDependency = Array.isArray(dependency)\r\n && dependency.length > 1\r\n && dependency[0] === StatusDependency;\r\n\r\n return statusDependency\r\n ? [dependency.slice(1), true]\r\n : [dependency, false];\r\n }\r\n\r\n private getPath(control: AbstractControl): string {\r\n return this.formService.getPath(control).join(\".\");\r\n }\r\n\r\n private readonly route = inject(ActivatedRoute);\r\n\r\n private queryParams: Params = this.route.snapshot.queryParams;\r\n\r\n private readonly queryParams$: Observable<Params> = this.route.queryParams.pipe(\r\n tap(params => this.queryParams = params),\r\n shareReplay({ bufferSize: 1, refCount: true })\r\n );\r\n\r\n private onQueryParamsChange(action: (params: Params) => void): void {\r\n this.queryParams$\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(action);\r\n }\r\n}\r\n\r\nexport interface IEvaluatorProvider {\r\n getContext(scope?: any): Record<string, any>;\r\n}\r\n\r\nexport interface EvaluateOptions {\r\n cacheable?: boolean;\r\n ignoreDeps?: boolean;\r\n cacheInvalidated?: () => void;\r\n destroyRef?: DestroyRef,\r\n invokeArgs?: any[],\r\n hydrate?: boolean,\r\n extendContext?: ExtendContextFn;\r\n transform?: TransformFn;\r\n}\r\n\r\nexport type ExtendContextFn = () => Record<string, any>;\r\n\r\nexport type TransformFn<TIn = any, TOut = any> = (value: TIn) => TOut;\r\n","import { DestroyRef, Injectable } from '@angular/core';\r\nimport { ProgrammabilityService } from '../services/programmability.service';\r\nimport { AbstractControl, AsyncValidatorFn, FormGroup, ValidationErrors, ValidatorFn, Validators } from '@angular/forms';\r\nimport { isObservable, map, Observable, of, catchError, take, Subject, shareReplay } from 'rxjs';\r\nimport { toFeelable } from '../utils/feelable';\r\nimport { CallbackRegistry } from '../utils/CallbackRegistry';\r\n\r\nimport { LanguageService } from '@wemake4u/interact';\r\nimport { Texts } from '../locale/locale';\r\nimport { localize } from '../locale/localize';\r\nimport { Notifier } from '../utils/notifier';\r\n\r\nconst SILENT_ERROR = 'silent';\r\nconst ERROR_FLAG = 'error';\r\nconst MESSAGE_KEY = 'message';\r\n\r\n@Injectable()\r\nexport class ValidationService {\r\n\r\n constructor(\r\n private languageService: LanguageService,\r\n private programmability: ProgrammabilityService) {\r\n }\r\n\r\n private requiredMode: RequiredMode = \"silent\";\r\n\r\n readonly validationDone = new Notifier();\r\n\r\n private _suppress: boolean = false;\r\n\r\n set suppress(value: boolean) {\r\n this._suppress = value;\r\n }\r\n\r\n get suppress(): boolean {\r\n return this._suppress;\r\n }\r\n\r\n createCollection(): ValidationCollection {\r\n return new Map<AbstractControl, ComponentContext>();\r\n }\r\n\r\n addToCollection(collection: ValidationCollection, control: AbstractControl, formGroup: FormGroup, component: any) {\r\n if (!collection.has(control) && this.canAddToCollection(component)) { \r\n collection.set(control, { component, formGroup });\r\n }\r\n }\r\n\r\n setupCollection(collection: ValidationCollection, destroyRef?: DestroyRef) {\r\n collection.forEach((componentValidation, control) => {\r\n const component = componentValidation.component;\r\n const currentGroup = componentValidation.formGroup;\r\n const required = component?.validate?.required;\r\n const rules = this.getRules(component);\r\n const [requiredValidator, validators, asyncValidators, watching] = this.validateRules(currentGroup, component, required, rules, destroyRef);\r\n control.setValidators(validators);\r\n control.setAsyncValidators(asyncValidators);\r\n if (requiredValidator) this.requiredValidators.set(control, requiredValidator);\r\n watching(control);\r\n });\r\n }\r\n\r\n validateRequired(control: AbstractControl, currentValue: any): ValidationErrors | null {\r\n if (!this.requiredValidators.has(control))\r\n return null;\r\n const validator = this.requiredValidators.get(control);\r\n return validator!({ value: currentValue } as any);\r\n }\r\n\r\n isRequired(control: AbstractControl): boolean {\r\n return control && this.requiredValidators.has(control);\r\n }\r\n\r\n allowSilentError(): boolean {\r\n return this.requiredMode === \"silent\";\r\n }\r\n\r\n isSilentError(control: AbstractControl | null | undefined): boolean {\r\n if (!this.allowSilentError()) return false;\r\n const errors = control?.errors;\r\n if (!errors) return false;\r\n return errors[SILENT_ERROR] === true\r\n && errors[ERROR_FLAG] === true\r\n && !(MESSAGE_KEY in errors);\r\n }\r\n\r\n hasSilentErrors(controls: Iterable<AbstractControl>): boolean {\r\n if (!this.allowSilentError()) return false;\r\n for (const control of controls) {\r\n if (!control.disabled && this.isSilentError(control))\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n revealSilentErrors(controls: Iterable<AbstractControl>) {\r\n if (!this.allowSilentError()) return;\r\n for (const control of controls) {\r\n if (control.disabled || !this.isSilentError(control))\r\n continue;\r\n control.markAsTouched();\r\n control.updateValueAndValidity();\r\n }\r\n }\r\n\r\n countErrors(controls: Iterable<AbstractControl>, includeSilent = false): number {\r\n let errors = 0;\r\n for (const control of controls) {\r\n if (control.disabled || !control.errors)\r\n continue;\r\n if (!includeSilent && this.isSilentError(control))\r\n continue;\r\n errors++;\r\n }\r\n return errors;\r\n }\r\n\r\n private canAddToCollection(component: any): boolean {\r\n const required = component?.validate?.required;\r\n const hasRules = Array.isArray(component?.validations) && component.validations.length > 0;\r\n return required === true || hasRules;\r\n }\r\n\r\n private getRules(component: any): ValidationRule[] {\r\n if (!Array.isArray(component.validations)) return [];\r\n return component.validations?.map((rule: any) => {\r\n return {\r\n expression: rule.expression,\r\n type: rule.type,\r\n message: this.locale(rule, MESSAGE_KEY),\r\n async: rule.async === true\r\n } as ValidationRule;\r\n });\r\n }\r\n\r\n private validateRules(formGroup: FormGroup\r\n , component: any\r\n , required?: boolean\r\n , validations?: ValidationRule[]\r\n , destroyRef?: DestroyRef): [ValidatorFn | null, ValidatorFn[], AsyncValidatorFn[], (control: AbstractControl) => void] {\r\n\r\n const skipValidation = this.resolveSkipValidation(component);\r\n\r\n const validators: ValidatorFn[] = [];\r\n const asyncValidators: AsyncValidatorFn[] = [];\r\n\r\n const requiredValidator = required === true\r\n ? this.createRequiredValidator(component, formGroup, skipValidation)\r\n : null;\r\n\r\n if (requiredValidator) {\r\n validators.push(requiredValidator);\r\n }\r\n\r\n const callbacks = new CallbackRegistry();\r\n\r\n if (Array.isArray(validations)) {\r\n validations.forEach((item: ValidationRule) => {\r\n if (!this.programmability.isExpression(item.expression))\r\n return;\r\n\r\n const logger: ValidationCallback = (control: AbstractControl, result: ValidationErrors | null) =>\r\n this.logValidation(component, item, control, result);\r\n\r\n if (item.type === \"validate\" || item.type === \"invalidate\") {\r\n const predicate = item.type === \"validate\"\r\n ? (result: any) => result\r\n : (result: any) => !result;\r\n\r\n if (item.async) {\r\n asyncValidators.push(this.createAsyncValidator(formGroup, skipValidation, item, callbacks, predicate, logger));\r\n }\r\n else {\r\n validators.push(this.createValidator(formGroup, skipValidation, item, predicate, logger));\r\n }\r\n }\r\n });\r\n }\r\n\r\n const watching = (control: AbstractControl): void => {\r\n this.watchForValidation(formGroup, skipValidation, control, component.key, callbacks, validations, destroyRef);\r\n };\r\n\r\n return [requiredValidator, validators, asyncValidators, watching];\r\n }\r\n\r\n private createValidator(formGroup: FormGroup\r\n , skipValidation: string | boolean\r\n , item: ValidationRule\r\n , predicate: (result: any) => boolean\r\n , callback: ValidationCallback): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (this.suppress\r\n || this.shouldSkipValidation(formGroup, skipValidation)\r\n || !this.isRequiredSatisfied(control)) return null; \r\n const result = this.programmability.evaluateUnary(formGroup, item.expression, control.value)\r\n if (isObservable(result)) {\r\n console.warn(\r\n \"[Validator] Unexpected observable result in createValidator\",\r\n { expression: item.expression, value: control.value, rule: item }\r\n );\r\n return null;\r\n }\r\n const validate = predicate(result) ? null : this.validationErrors(formGroup, item);\r\n callback(control, validate);\r\n this.validationDone.notify();\r\n return validate;\r\n };\r\n }\r\n\r\n private createAsyncValidator(formGroup: FormGroup\r\n , skipValidation: string | boolean\r\n , item: ValidationRule\r\n , callbacks: CallbackRegistry\r\n , predicate: (result: any) => boolean\r\n , callback: ValidationCallback): AsyncValidatorFn {\r\n\r\n /** Cached result per control, so the same validator instance can safely be shared */\r\n let states = new WeakMap<AbstractControl, { value: any; result: Observable<any> }>();\r\n\r\n callbacks.register(() => states = new WeakMap());\r\n\r\n const evaluate = (control: AbstractControl): any =>\r\n this.programmability.evaluate(formGroup, item.expression, {\r\n cacheable: false,\r\n extendContext: () => { return { \"?\": control.value } }\r\n });\r\n\r\n /** Wraps the evaluation result, sync or async, into a single-emission observable that replays its result */\r\n const toObservable = (control: AbstractControl, result: any): Observable<any> => {\r\n\r\n const source: Observable<any> = isObservable(result)\r\n ? (result as Observable<any>).pipe(take(1))\r\n : of(result);\r\n\r\n return source.pipe(\r\n map((value: any) => {\r\n const errors = predicate(value) ? null : this.validationErrors(formGroup, item);\r\n callback(control, errors);\r\n this.validationDone.notify();\r\n return errors;\r\n }),\r\n catchError(err => {\r\n console.error(\"[AsyncValidator] Evaluation error\", { expression: item.expression, err });\r\n return this.nullObserver;\r\n }),\r\n // replays the computed result to later subscriptions instead of re-running the source:\r\n // without this, caching the observable would still re-evaluate on every subscribe\r\n shareReplay({ bufferSize: 1, refCount: false })\r\n );\r\n };\r\n\r\n const computeOnce = (control: AbstractControl): Observable<any> => {\r\n\r\n const value = control.value;\r\n\r\n const state = states.get(control);\r\n\r\n if (state && Object.is(state.value, value))\r\n return state.result;\r\n\r\n const result = toObservable(control, evaluate(control));\r\n\r\n states.set(control, { value, result });\r\n\r\n return result;\r\n };\r\n\r\n return (control: AbstractControl) => {\r\n\r\n if (this.suppress\r\n || this.shouldSkipValidation(formGroup, skipValidation)\r\n || !this.isRequiredSatisfied(control))\r\n return this.nullObserver;\r\n\r\n return computeOnce(control);\r\n };\r\n }\r\n\r\n private createRequiredValidator(component: any\r\n , formGroup: FormGroup\r\n , skipValidation: string | boolean): ValidatorFn\r\n {\r\n const fn = (this.isTrueValidator(component)\r\n ? this.requiredTrueValidator\r\n : this.requiredValidator).bind(this);\r\n\r\n const requiredText = component?.validate?.requiredText;\r\n\r\n return (control) => {\r\n if (this.suppress\r\n || this.shouldSkipValidation(formGroup, skipValidation)) return null;\r\n let result = fn(control);\r\n if (result && requiredText) {\r\n result = { ...result, [MESSAGE_KEY]: requiredText };\r\n }\r\n result = this.markSilent(control, result);\r\n this.validationDone.notify(); \r\n return result;\r\n };\r\n }\r\n\r\n private markSilent(control: AbstractControl, result: ValidationErrors | null): ValidationErrors | null {\r\n if (!this.allowSilentError()\r\n || !result\r\n || control.touched) return result;\r\n const silent: ValidationErrors = { ...result, [SILENT_ERROR]: true };\r\n delete silent[MESSAGE_KEY];\r\n return silent;\r\n }\r\n\r\n private validationErrors(formGroup: FormGroup, item: ValidationRule) {\r\n const message = this.programmability.evaluateString(formGroup, item.message, { cacheable: false });\r\n const validationError = { [ERROR_FLAG]: true, [MESSAGE_KEY]: message };\r\n return validationError;\r\n }\r\n\r\n private watchForValidation(formGroup: FormGroup\r\n , skipValidation: boolean | string\r\n , control: AbstractControl\r\n , key: string\r\n , callbacks: CallbackRegistry\r\n , validations?: ValidationRule[]\r\n , destroyRef?: DestroyRef): void {\r\n\r\n const expressions: string[] = [];\r\n\r\n if (typeof skipValidation === \"string\" && this.programmability.isExpression(skipValidation)) {\r\n expressions.push(\"=\" + this.programmability.getExpression(skipValidation));\r\n }\r\n \r\n if (Array.isArray(validations)) {\r\n const ruleExpressions = validations\r\n .filter(item => this.programmability.isExpression(item.expression))\r\n .map(item => \"=\" + this.programmability.getExpression(item.expression));\r\n expressions.push(...ruleExpressions);\r\n }\r\n\r\n if (expressions.length === 0) return;\r\n\r\n const feelable = toFeelable(expressions);\r\n\r\n const dependencies = this.programmability.getDependencies(formGroup, feelable)\r\n .filter(dep => dep !== key);\r\n\r\n if (dependencies.length === 0) return;\r\n\r\n this.programmability.watch(formGroup, dependencies, () => {\r\n setTimeout(() => {\r\n callbacks.invoke();\r\n control.updateValueAndValidity();\r\n });\r\n }, destroyRef);\r\n }\r\n\r\n private logValidation = (component: any, rule: ValidationRule, control: AbstractControl, result: ValidationErrors | null) => {\r\n if (this.programmability.verbose) {\r\n if (result != null) {\r\n console.warn(\"[Validation] Failed\", { control, component, rule, result });\r\n }\r\n else {\r\n console.log(\"[Validation] Success\", { control, component, rule, result });\r\n }\r\n }\r\n }\r\n\r\n private readonly nullObserver = of(null);\r\n\r\n private get language(): string {\r\n return this.languageService.getLanguage();\r\n }\r\n\r\n private locale(component: any, key: string): string {\r\n return localize(this.language, component, key);\r\n }\r\n\r\n private requiredValidators = new WeakMap<AbstractControl, ValidatorFn>();\r\n\r\n private requiredValidator(control: AbstractControl): ValidationErrors | null {\r\n if (Validators.required(control) == null) {\r\n return null;\r\n }\r\n return { [ERROR_FLAG]: true, [MESSAGE_KEY]: this.getRequiredMessage() } \r\n }\r\n\r\n private requiredTrueValidator(control: AbstractControl): ValidationErrors | null {\r\n if (Validators.requiredTrue(control) == null) {\r\n return null;\r\n }\r\n return { [ERROR_FLAG]: true, [MESSAGE_KEY]: this.getRequiredMessage() }\r\n }\r\n\r\n private isTrueValidator(component: any): boolean {\r\n return component?.type === 'checkbox';\r\n }\r\n\r\n private isRequiredSatisfied(control: AbstractControl): boolean {\r\n if (control.disabled) return true;\r\n const validator = this.requiredValidators.get(control);\r\n if (!validator) return true;\r\n return validator(control) === null;\r\n }\r\n\r\n private getRequiredMessage(): string {\r\n return this.locale(Texts, 'RequiredField');\r\n }\r\n\r\n private shouldSkipValidation(formGroup: FormGroup, skipValidation: string | boolean): boolean {\r\n if (typeof skipValidation === 'boolean') {\r\n return skipValidation;\r\n }\r\n if (typeof skipValidation === 'string') {\r\n return this.programmability.evaluateBoolean(formGroup, skipValidation) ?? false;\r\n }\r\n return false;\r\n }\r\n\r\n private resolveSkipValidation(component: any): boolean | string {\r\n const skipValidation = component.skipValidation;\r\n if (typeof skipValidation === 'boolean') {\r\n return skipValidation;\r\n }\r\n if (typeof skipValidation === 'string'\r\n && this.programmability.isExpression(skipValidation)) {\r\n return skipValidation;\r\n }\r\n return false;\r\n }\r\n}\r\n\r\ntype RequiredMode = 'default' | 'silent';\r\n\r\ntype ValidationCallback = (control: AbstractControl, result: ValidationErrors | null) => void;\r\n\r\nexport interface ComponentContext {\r\n component: any;\r\n formGroup: FormGroup;\r\n}\r\n\r\nexport interface ValidationRule {\r\n expression: string;\r\n type: \"validate\" | \"invalidate\";\r\n message: string,\r\n async: boolean\r\n}\r\n\r\nexport type ValidationCollection = Map<AbstractControl, ComponentContext>;\r\n","import { DestroyRef, Injectable } from '@angular/core';\r\nimport { ProgrammabilityService } from './programmability.service';\r\nimport { FormService } from './form.service';\r\nimport { AbstractControl, FormArray, FormGroup } from '@angular/forms';\r\n\r\n@Injectable()\r\nexport class DisableService {\r\n\r\n constructor(\r\n private programmability: ProgrammabilityService\r\n , private formService: FormService) {\r\n }\r\n\r\n createCollection(): DisableCollection {\r\n return new Map<AbstractControl, DisableContext>();\r\n }\r\n\r\n addToCollection(collection: DisableCollection, control: AbstractControl, parentGroup: FormGroup\r\n , component: any) {\r\n if (!collection.has(control) && this.canAddToCollection(component)) {\r\n collection.set(control, { parentGroup, component });\r\n }\r\n }\r\n\r\n setupCollection(collection: DisableCollection, destroyRef?: DestroyRef) {\r\n collection.forEach((disableContext, control) => {\r\n this.applyRule(disableContext.parentGroup, control, disableContext, destroyRef); \r\n });\r\n }\r\n\r\n private selfDisabled = new WeakMap<AbstractControl, boolean>();\r\n\r\n private applyRule(formGroup: FormGroup, control: AbstractControl, context: DisableContext, destroyRef?: DestroyRef): void {\r\n\r\n const {\r\n key\r\n , disabled } = context.component ?? {};\r\n\r\n const logDisabled = (value: any) => {\r\n if (!this.programmability.verbose) return;\r\n console.log(value ? \"Disable\" : \"Enable\", control, { path: this.getPath(control), formGroup });\r\n };\r\n\r\n const container = this.isContainer(control);\r\n\r\n const disableControl = (value: boolean | null) => {\r\n\r\n this.selfDisabled.set(control, value ?? false);\r\n\r\n if (value === true) {\r\n if (control.disabled && !container) return;\r\n control.disable();\r\n logDisabled(value);\r\n } else {\r\n if (control.enabled && !container) return;\r\n control.enable();\r\n logDisabled(value);\r\n }\r\n\r\n if (container)\r\n this.normalize(control); \r\n }\r\n\r\n if (typeof disabled === 'boolean') {\r\n disableControl(disabled);\r\n }\r\n else if (typeof disabled === 'string') {\r\n if (this.programmability.isExpression(disabled)) {\r\n const expression = this.programmability.getExpression(disabled);\r\n const dependencies = this.programmability.getDependencies(formGroup, expression)\r\n .filter(dep => dep !== key);\r\n const applyExpression = () => {\r\n const result = this.programmability.evaluateBoolean(formGroup, disabled\r\n , { cacheable: false, destroyRef: destroyRef });\r\n disableControl(result);\r\n };\r\n if (dependencies.length > 0) {\r\n this.programmability.watch(formGroup, dependencies, () => {\r\n queueMicrotask(applyExpression); \r\n }, destroyRef);\r\n }\r\n applyExpression();\r\n }\r\n }\r\n }\r\n\r\n private canAddToCollection(component: any): boolean {\r\n const disabled = component?.disabled;\r\n return typeof disabled === 'boolean'\r\n || typeof disabled === 'string';\r\n }\r\n\r\n private getPath(control: AbstractControl): string {\r\n return this.formService.getPath(control).join(\".\");\r\n }\r\n\r\n private normalize(control: AbstractControl) {\r\n if (!control.enabled)\r\n return;\r\n\r\n for (const child of this.formService.enumerateControls(control)) {\r\n if (this.selfDisabled.has(child)) {\r\n const selfDisabled = this.selfDisabled.get(child);\r\n if (child.enabled && selfDisabled)\r\n child.disable();\r\n } \r\n }\r\n\r\n }\r\n\r\n private isContainer(control: AbstractControl) {\r\n return control instanceof FormGroup\r\n || control instanceof FormArray;\r\n }\r\n}\r\n\r\nexport interface DisableContext {\r\n parentGroup: FormGroup;\r\n component: any\r\n}\r\n\r\nexport type DisableCollection = Map<AbstractControl, DisableContext>;\r\n","import { DestroyRef, Injectable } from '@angular/core';\r\nimport { ProgrammabilityService } from './programmability.service';\r\nimport { FormService } from './form.service';\r\nimport { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { toFeelable } from '../utils/feelable';\r\n\r\n@Injectable()\r\nexport class ComputeService {\r\n\r\n constructor(\r\n private programmability: ProgrammabilityService\r\n , private formService: FormService) {\r\n }\r\n\r\n createCollection(): ComputeCollection {\r\n return new Map<AbstractControl, ComputeContext>();\r\n }\r\n\r\n addToCollection(collection: ComputeCollection, control: AbstractControl\r\n , parentGroup: FormGroup, component: any)\r\n {\r\n if (!collection.has(control) && this.canAddToCollection(component)) {\r\n collection.set(control, { component, parentGroup });\r\n } \r\n }\r\n\r\n setupCollection(collection: ComputeCollection, destroyRef?: DestroyRef) {\r\n collection.forEach((computeContext, control) => {\r\n this.applyExpression(control, computeContext, destroyRef); \r\n });\r\n }\r\n\r\n private canAddToCollection(component: any): boolean {\r\n const expression = component?.expression;\r\n return this.programmability.isExpression(expression);\r\n }\r\n\r\n private applyExpression(control: AbstractControl, context: ComputeContext, destroyRef?: DestroyRef): void {\r\n const formGroup = context.parentGroup;\r\n\r\n const {\r\n key\r\n , expression\r\n , conditional } = context.component ?? {};\r\n\r\n const deactivate = conditional?.hide;\r\n\r\n const logComputed = (value: any) => {\r\n if (!this.programmability.verbose) return;\r\n console.log(\"Compute\", control, { value: value, path: this.getPath(control), formGroup });\r\n };\r\n const assignValue = (value: any) => {\r\n logComputed(value);\r\n this.formService.patch(control, value, { strict: false });\r\n }\r\n if (typeof expression === 'string') {\r\n if (this.programmability.isExpression(expression)) {\r\n const applyExpression = () => {\r\n if (this.programmability.isExpression(deactivate)) {\r\n const isDeactivate = this.programmability.evaluateBoolean(formGroup, deactivate\r\n , { cacheable: false, destroyRef: destroyRef });\r\n if (!!isDeactivate) {\r\n return;\r\n }\r\n }\r\n const result = this.programmability.evaluate(formGroup, expression\r\n , { cacheable: false, destroyRef: destroyRef });\r\n assignValue(result);\r\n };\r\n const dependencies = this.programmability.getDependencies(formGroup, toFeelable({\r\n expression: expression,\r\n deactivate: deactivate\r\n })).filter(dep => dep !== key);\r\n\r\n if (dependencies.length > 0) {\r\n this.programmability.watch(formGroup, dependencies, () => {\r\n queueMicrotask(applyExpression);\r\n }, destroyRef);\r\n }\r\n applyExpression();\r\n }\r\n }\r\n }\r\n\r\n private getPath(control: AbstractControl): string {\r\n return this.formService.getPath(control).join(\".\");\r\n }\r\n}\r\n\r\nexport interface ComputeContext {\r\n parentGroup: FormGroup;\r\n component: any;\r\n}\r\n\r\nexport type ComputeCollection = Map<AbstractControl, ComputeContext>;\r\n","import { DestroyRef, Injectable } from '@angular/core';\r\nimport { EnumerateOptions, FormService } from './form.service';\r\nimport { AbstractControl, FormArray } from '@angular/forms';\r\nimport { SubscribeService } from '../services/subscribe.service';\r\nimport { Notifier } from '../utils/notifier';\r\nimport { ValidationService } from './validation.service';\r\n\r\n@Injectable()\r\nexport class StatusService {\r\n\r\n constructor(\r\n private formService: FormService\r\n , private subscribeService: SubscribeService\r\n , private validationService: ValidationService\r\n , private destroyRef: DestroyRef) {\r\n }\r\n\r\n readonly statusDone = new Notifier();\r\n\r\n createCollection(key?: any): StatusCollection {\r\n return new StatusCollection(key);\r\n }\r\n\r\n addToCollection(collection: StatusCollection, control: AbstractControl, component: any) {\r\n if (!collection.has(control) && this.canAddToCollection(control, component)) {\r\n collection.add(control);\r\n }\r\n }\r\n\r\n setupCollection(collection: StatusCollection, destroyRef?: DestroyRef) {\r\n\r\n const key = collection.key;\r\n\r\n const root = key != null;\r\n\r\n if (root) {\r\n this.invalidMap.set(key, {\r\n collection,\r\n dirty: true,\r\n totalErrors: 0,\r\n visibleErrors: 0\r\n });\r\n }\r\n\r\n const markDirty = () => {\r\n const entry = this.invalidMap.get(key);\r\n if (entry) {\r\n entry.dirty = true;\r\n }\r\n this.statusDone.notify();\r\n };\r\n\r\n for (const control of collection.getControls(false)) {\r\n\r\n if (!root) {\r\n control.updateValueAndValidity({ onlySelf: true, emitEvent: true });\r\n }\r\n\r\n const emitWhenUnchanged = this.validationService.allowSilentError();\r\n\r\n this.subscribeService.subscribeChanges(\r\n control.statusChanges,\r\n control,\r\n control.status,\r\n destroyRef ?? this.destroyRef,\r\n () => markDirty(),\r\n undefined,\r\n emitWhenUnchanged\r\n );\r\n }\r\n }\r\n\r\n countErrors(key: any, includeSilent = false): number {\r\n\r\n const entry = this.invalidMap.get(key);\r\n\r\n if (!entry)\r\n return 0;\r\n\r\n if (entry.dirty) {\r\n const controls = [...this.enumerateControls(key)];\r\n entry.dirty = false;\r\n entry.totalErrors = this.validationService.countErrors(controls, true);\r\n entry.visibleErrors = this.validationService.countErrors(controls, false);\r\n }\r\n\r\n return includeSilent\r\n ? entry.totalErrors\r\n : entry.visibleErrors;\r\n }\r\n\r\n *enumerateControls(key: any, deep = true): Generator<AbstractControl> {\r\n\r\n const entry = this.invalidMap.get(key);\r\n\r\n if (!entry)\r\n return;\r\n\r\n yield* this.formService.enumerateControls(\r\n entry.collection.getControls(deep),\r\n this.enumerateOptions\r\n );\r\n }\r\n\r\n private invalidMap = new Map<any, {\r\n collection: StatusCollection;\r\n dirty: boolean;\r\n totalErrors: number;\r\n visibleErrors: number;\r\n }>();\r\n\r\n private canAddToCollection(control: AbstractControl, component: any): boolean {\r\n if (control instanceof FormArray) {\r\n return true;\r\n }\r\n else {\r\n const required = component?.validate?.required;\r\n const hasRules = Array.isArray(component?.validations) && component.validations.length > 0;\r\n return required === true || hasRules || control.validator != null || control.asyncValidator != null;\r\n }\r\n }\r\n\r\n private readonly enumerateOptions: EnumerateOptions = {\r\n expandArray: false,\r\n expandGroup: true,\r\n skipDisabled: true\r\n };\r\n}\r\n\r\nexport class StatusCollection<TKey = any> {\r\n\r\n constructor(\r\n public key?: any\r\n ) { }\r\n\r\n readonly controls = new Set<AbstractControl>();\r\n\r\n readonly children = new Map<TKey, StatusCollection<TKey>>();\r\n\r\n add(control: AbstractControl): this {\r\n this.controls.add(control);\r\n return this;\r\n }\r\n\r\n remove(control: AbstractControl): this {\r\n this.controls.delete(control);\r\n return this;\r\n }\r\n\r\n has(control: AbstractControl): boolean {\r\n return this.controls.has(control);\r\n }\r\n\r\n clear(): void {\r\n this.controls.clear();\r\n this.children.clear();\r\n }\r\n\r\n createCollection(key: TKey): StatusCollection<TKey> {\r\n let collection = this.children.get(key);\r\n\r\n if (!collection) {\r\n collection = new StatusCollection<TKey>();\r\n this.children.set(key, collection);\r\n }\r\n\r\n return collection;\r\n }\r\n\r\n getCollection(key: TKey): StatusCollection<TKey> | undefined {\r\n return this.children.get(key);\r\n }\r\n\r\n removeCollection(key: TKey): boolean {\r\n return this.children.delete(key);\r\n }\r\n\r\n *getControls(deep = true): IterableIterator<AbstractControl> {\r\n\r\n yield* this.controls;\r\n\r\n if (deep) {\r\n for (const child of this.children.values()) {\r\n yield* child.getControls(true);\r\n }\r\n }\r\n }\r\n\r\n}\r\n","import { DestroyRef, Injectable } from '@angular/core';\r\nimport { ProgrammabilityService } from '../services/programmability.service';\r\nimport { SubscribeService } from '../services/subscribe.service';\r\nimport { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { Observable } from 'rxjs';\r\n\r\n@Injectable()\r\nexport class EventService {\r\n\r\n constructor(\r\n private programmability: ProgrammabilityService\r\n , private subscribeService: SubscribeService\r\n , private destroyRef: DestroyRef) {\r\n }\r\n\r\n private _suppress: boolean = false;\r\n\r\n set suppress(value: boolean) {\r\n this._suppress = value;\r\n }\r\n\r\n get suppress(): boolean {\r\n return this._suppress;\r\n }\r\n\r\n createCollection(): EventCollection {\r\n return new Map<AbstractControl, EventContext>();\r\n }\r\n\r\n addToCollection(collection: EventCollection, control: AbstractControl, formGroup: FormGroup, component: any) {\r\n collection.set(control, { component, formGroup });\r\n }\r\n\r\n setupCollection(collection: EventCollection, destroyRef?: DestroyRef) {\r\n collection.forEach((componentValidation, control) => {\r\n const component = componentValidation.component;\r\n const currentGroup = componentValidation.formGroup;\r\n const events = component.events;\r\n if (!events || typeof events !== 'object') return;\r\n this.processHandler(events.onChange, currentGroup, control, control.valueChanges, control.value, destroyRef);\r\n this.processHandler(events.onStatusChange, currentGroup, control, control.statusChanges, control.status, destroyRef); \r\n });\r\n }\r\n\r\n private processHandler<T>(handler: string\r\n , formGroup: FormGroup\r\n , control: AbstractControl\r\n , observable$: Observable<T>\r\n , initial: T\r\n , destroyRef?: DestroyRef)\r\n {\r\n if (!this.programmability.isExpression(handler))\r\n return;\r\n\r\n this.subscribeService.subscribeChanges(observable$\r\n , control\r\n , initial\r\n , destroyRef ?? this.destroyRef\r\n , (oldValue, newValue) => {\r\n if (this.suppress) return;\r\n const event = {\r\n control: control,\r\n oldValue: oldValue,\r\n newValue: newValue\r\n };\r\n this.programmability.evaluate(formGroup, handler, {\r\n cacheable: false,\r\n extendContext: () => ({\r\n \"event\": event\r\n }),\r\n invokeArgs: [event]\r\n });\r\n }\r\n );\r\n }\r\n}\r\n\r\nexport interface EventContext {\r\n component: any;\r\n formGroup: FormGroup;\r\n}\r\n\r\nexport type EventCollection = Map<AbstractControl, EventContext>;\r\n","import { createEnvironmentInjector, DestroyRef, EnvironmentInjector, Injectable, OnDestroy } from '@angular/core';\r\n\r\n@Injectable()\r\nexport class LifetimeService<TKey> implements OnDestroy {\r\n\r\n private readonly injectors =\r\n new Map<TKey, EnvironmentInjector>();\r\n\r\n constructor(\r\n private readonly environmentInjector: EnvironmentInjector\r\n ) { }\r\n\r\n resolve(key: TKey): DestroyRef {\r\n\r\n let injector = this.injectors.get(key);\r\n\r\n if (!injector) {\r\n\r\n injector = createEnvironmentInjector(\r\n [],\r\n this.environmentInjector\r\n );\r\n\r\n this.injectors.set(key, injector);\r\n }\r\n\r\n return injector.get(DestroyRef);\r\n }\r\n\r\n destroy(key: TKey): void {\r\n\r\n const injector = this.injectors.get(key);\r\n\r\n if (!injector)\r\n return;\r\n\r\n injector.destroy();\r\n\r\n this.injectors.delete(key);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n\r\n for (const injector of this.injectors.values()) {\r\n injector.destroy();\r\n }\r\n\r\n this.injectors.clear();\r\n }\r\n}\r\n","import { DestroyRef, Injectable } from '@angular/core';\r\nimport { AbstractControl, FormControl, FormControlOptions, FormGroup } from '@angular/forms';\r\nimport { ValidationCollection, ValidationService } from './validation.service';\r\nimport { DisableCollection, DisableService } from './disable.service';\r\nimport { ComputeCollection, ComputeService } from './compute.service';\r\nimport { StatusCollection, StatusService } from './status.service';\r\nimport { EventCollection, EventService } from './event.service';\r\nimport { MetadataService } from './metadata.service';\r\nimport { FormGroupEx, FormGroupMode } from '../utils/FormGroupEx';\r\nimport { FormArrayEx } from '../utils/FormArrayEx';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { LifetimeService } from './lifetime.service';\r\n\r\ninterface BuildCollections {\r\n validation: ValidationCollection;\r\n disable: DisableCollection;\r\n event: EventCollection;\r\n compute: ComputeCollection;\r\n}\r\n\r\nexport interface BuildRowsOptions {\r\n path?: string | null;\r\n groupMode?: FormGroupMode;\r\n statusSource?: any;\r\n destroyRef?: DestroyRef;\r\n}\r\n\r\n@Injectable()\r\nexport class FormBuilderService {\r\n\r\n constructor(\r\n private validationService: ValidationService\r\n , private disableService: DisableService\r\n , private computeService: ComputeService\r\n , private statusService: StatusService\r\n , private eventService: EventService\r\n , private metadata: MetadataService\r\n , private lifetime: LifetimeService<FormGroup>\r\n , private destroyRef: DestroyRef) {\r\n }\r\n\r\n buildForm(formGroup: FormGroup,\r\n forms: Array<any>,\r\n groupMode: FormGroupMode = \"default\"\r\n ): void {\r\n const collections = this.createCollections();\r\n\r\n forms.forEach((form: any) => {\r\n const statusCollection = this.statusService.createCollection(form);\r\n const currentGroup = this.applyPath(formGroup, form.path, groupMode);\r\n\r\n if (this.hasValue(form.path)) {\r\n this.disableService.addToCollection(collections.disable, currentGroup, formGroup, form);\r\n }\r\n\r\n this.addRows(currentGroup, form.rows, groupMode, collections, statusCollection);\r\n this.statusService.setupCollection(statusCollection);\r\n });\r\n\r\n this.setupCollections(collections);\r\n }\r\n\r\n /**\r\n * Configures a FormGroup starting from an array of rows (each row exposes `components`).\r\n * Rows are registered in the group located at `options.path`, relative to `formGroup`.\r\n */\r\n buildRows(\r\n formGroup: FormGroup,\r\n rows: Array<any>,\r\n options: BuildRowsOptions = {}\r\n ): FormGroup {\r\n const groupMode = options.groupMode ?? \"default\";\r\n const source = options.statusSource ?? { path: options.path, rows };\r\n\r\n const collections = this.createCollections();\r\n const statusCollection = this.statusService.createCollection(source);\r\n const currentGroup = this.applyPath(formGroup, options.path ?? '', groupMode);\r\n\r\n // Same behaviour as buildForm: a path group can be disabled as a whole\r\n if (this.hasValue(options.path ?? null)) {\r\n this.disableService.addToCollection(collections.disable, currentGroup, formGroup, source);\r\n }\r\n\r\n this.addRows(currentGroup, rows, groupMode, collections, statusCollection);\r\n\r\n this.setupCollections(collections, options.destroyRef);\r\n this.statusService.setupCollection(statusCollection, options.destroyRef);\r\n\r\n return currentGroup;\r\n }\r\n\r\n private addRows(\r\n group: FormGroup,\r\n rows: Array<any> | null | undefined,\r\n groupMode: FormGroupMode,\r\n collections: BuildCollections,\r\n statusCollection: StatusCollection\r\n ): void {\r\n rows?.forEach((row: any) =>\r\n this.addControls(group, row.components, groupMode, collections, statusCollection)\r\n );\r\n }\r\n\r\n private createCollections(): BuildCollections {\r\n return {\r\n validation: this.validationService.createCollection(),\r\n disable: this.disableService.createCollection(),\r\n event: this.eventService.createCollection(),\r\n compute: this.computeService.createCollection(),\r\n };\r\n }\r\n\r\n private setupCollections(c: BuildCollections, destroyRef?: DestroyRef): void {\r\n this.disableService.setupCollection(c.disable, destroyRef);\r\n this.computeService.setupCollection(c.compute, destroyRef);\r\n this.validationService.setupCollection(c.validation, destroyRef);\r\n this.eventService.setupCollection(c.event, destroyRef);\r\n }\r\n\r\n private hasValue(value: string | null): boolean {\r\n return value != null && value.trim().length > 0;\r\n }\r\n\r\n private applyPath(formGroup: FormGroup, path: string, groupMode: FormGroupMode) {\r\n if (!this.hasValue(path)) {\r\n return formGroup;\r\n }\r\n let currentGroup: FormGroup = formGroup;\r\n this.splitPath(path).forEach((segment) => {\r\n const existGroup = currentGroup.get(segment);\r\n if (existGroup instanceof FormGroup) {\r\n currentGroup = existGroup;\r\n return;\r\n }\r\n else if (existGroup) {\r\n throw new Error(`Cannot create form group because an element with path ${segment} already exists`);\r\n }\r\n else {\r\n const segmentGroup = this.createFormGroup(groupMode);\r\n currentGroup.addControl(segment, segmentGroup);\r\n currentGroup = segmentGroup;\r\n }\r\n });\r\n return currentGroup;\r\n }\r\n\r\n private splitPath(path: string): string[] {\r\n if (!path) {\r\n return [];\r\n }\r\n return path\r\n .split('.')\r\n .map(segment => segment.trim())\r\n .filter(segment => segment.length > 0);\r\n }\r\n\r\n private createFormGroup(groupMode: FormGroupMode): FormGroup {\r\n return (groupMode === \"default\")\r\n ? new FormGroup({})\r\n : new FormGroupEx({}, groupMode);\r\n }\r\n\r\n private addControls(formGroup: FormGroup\r\n , components: Array<any>\r\n , groupMode: FormGroupMode\r\n , collections: BuildCollections\r\n , statusCollection: StatusCollection) {\r\n\r\n components?.forEach((component: any) => {\r\n if (this.isFormComponent(component)) {\r\n const currentGroup = this.applyPath(formGroup, component.path, groupMode);\r\n if (currentGroup.contains(component.key)) {\r\n this.statusService.addToCollection(statusCollection, currentGroup.get(component.key) as AbstractControl, component);\r\n return;\r\n }\r\n else {\r\n const defaultValue = this.getDefaultValue(component);\r\n const options: FormControlOptions = {\r\n updateOn: this.getUpdateOn(component) || \"change\",\r\n nonNullable: (defaultValue !== null && defaultValue !== undefined)\r\n };\r\n const control = new FormControl(defaultValue, options);\r\n currentGroup.addControl(component.key, control);\r\n this.validationService.addToCollection(collections.validation, control, currentGroup, component);\r\n this.statusService.addToCollection(statusCollection, control, component);\r\n this.disableService.addToCollection(collections.disable, control, formGroup, component);\r\n this.computeService.addToCollection(collections.compute, control, formGroup, component);\r\n this.eventService.addToCollection(collections.event, control, currentGroup, component);\r\n }\r\n }\r\n else if (this.isContainerComponent(component)) {\r\n this.getContainers(component).forEach((container) => {\r\n const currentGroup = this.applyPath(formGroup, container.path, groupMode);\r\n if (this.hasValue(container.path)) {\r\n this.disableService.addToCollection(collections.disable, currentGroup, formGroup, container);\r\n }\r\n // Recurse into the container rows sharing the same collections\r\n this.addRows(currentGroup, container.rows, groupMode, collections, statusCollection);\r\n });\r\n }\r\n else if (this.isArrayComponent(component)) {\r\n const itemComponent = this.getArrayItem(component);\r\n if (itemComponent.key) {\r\n const currentGroup = this.applyPath(formGroup, itemComponent.path, groupMode);\r\n const formArray = this.createFormArray(currentGroup, itemComponent, groupMode, statusCollection);\r\n this.validationService.addToCollection(collections.validation, formArray, currentGroup, component);\r\n this.statusService.addToCollection(statusCollection, formArray, component);\r\n this.eventService.addToCollection(collections.event, formArray, currentGroup, component);\r\n }\r\n }\r\n else if (this.isComponentWithInput(component)) {\r\n const currentGroup = this.applyPath(formGroup, component.path, groupMode);\r\n let control = currentGroup.get(component.key) as AbstractControl | null;\r\n if (!control) {\r\n control = new FormControl(null);\r\n currentGroup.addControl(component.key, control);\r\n }\r\n this.validationService.addToCollection(collections.validation, control, currentGroup, component);\r\n this.statusService.addToCollection(statusCollection, control, component);\r\n this.disableService.addToCollection(collections.disable, control, currentGroup, component);\r\n }\r\n });\r\n }\r\n\r\n private isFormComponent(component: any): boolean {\r\n switch (component.type) {\r\n case \"checkbox\":\r\n case \"checklist\":\r\n case \"datetime\":\r\n case \"filepicker\":\r\n case \"number\":\r\n case \"radio\":\r\n case \"select\":\r\n case \"taglist\":\r\n case \"textarea\":\r\n case \"textfield\":\r\n case \"range\":\r\n case \"expression\":\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n private isContainerComponent(component: any): boolean {\r\n switch (component.type) {\r\n case \"group\":\r\n case \"tab\":\r\n case \"accordion\":\r\n case \"templatehost\":\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n private isComponentWithInput(component: any): boolean {\r\n return component.type === \"component\"\r\n && component.isInput === true\r\n && component.key;\r\n }\r\n\r\n private isArrayComponent(component: any): boolean {\r\n switch (component.type) {\r\n case \"dynamiclist\":\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n private getArrayItem(component: any): { key: any; path: any; rows: any } {\r\n if (component.type === 'dynamiclist') {\r\n return { key: component.key, path: component.path, rows: component.rows };\r\n }\r\n else {\r\n return { key: null, path: null, rows: [] };\r\n }\r\n }\r\n\r\n private createFormArray(formGroup: FormGroup\r\n , itemComponent: any\r\n , groupMode: FormGroupMode\r\n , statusCollection: StatusCollection): FormArrayEx<FormGroup> {\r\n\r\n // Builds controls and behaviours for a newly added array item\r\n const setupItem = (itemGroup: FormGroup): void => {\r\n const statusItemCollection = statusCollection.createCollection(itemGroup);\r\n const collections = this.createCollections();\r\n this.addRows(itemGroup, itemComponent.rows, groupMode, collections, statusItemCollection);\r\n\r\n const destroyRef = this.lifetime.resolve(itemGroup);\r\n this.setupCollections(collections, destroyRef);\r\n this.statusService.setupCollection(statusItemCollection, destroyRef);\r\n };\r\n\r\n // Releases status tracking and subscriptions of a removed array item\r\n const cleanupItem = (itemGroup: FormGroup): void => {\r\n statusCollection.removeCollection(itemGroup);\r\n this.lifetime.destroy(itemGroup);\r\n };\r\n\r\n const existing = formGroup.get(itemComponent.key);\r\n\r\n let formArray: FormArrayEx<FormGroup>;\r\n\r\n if (existing instanceof FormArrayEx) {\r\n formArray = existing;\r\n }\r\n else {\r\n formArray = new FormArrayEx<FormGroup>([]);\r\n formGroup.addControl(itemComponent.key, formArray);\r\n }\r\n\r\n formArray.controlsChanges\r\n .pipe(\r\n takeUntilDestroyed(this.destroyRef)\r\n )\r\n .subscribe(e => {\r\n if (e?.type == \"add\")\r\n setupItem(e.control);\r\n else if (e?.type == \"remove\")\r\n cleanupItem(e.control);\r\n });\r\n\r\n return formArray;\r\n }\r\n\r\n private getContainers(component: any): { path: any; rows: any, disabled: any }[] {\r\n if (component.type === 'group') {\r\n return this.hasValue(component.bindTo) ? [] : [{\r\n path: component.path,\r\n rows: component.rows,\r\n disabled: component.disabled\r\n }];\r\n }\r\n else if ((component.type === 'tab' || component.type === 'accordion')\r\n && Array.isArray(component.panels)) {\r\n return component.panels.map((panel: any) => ({\r\n path: panel.path,\r\n rows: this.metadata.getFormByName(panel.template)?.rows ?? [],\r\n disabled: panel.disabled\r\n }));\r\n }\r\n else if (component.type === 'templatehost') {\r\n return [{\r\n path: component.path,\r\n rows: this.metadata.getFormByName(component.template)?.rows ?? [],\r\n disabled: component.disabled\r\n }];\r\n }\r\n else {\r\n return [];\r\n }\r\n }\r\n\r\n private getDefaultValue(component: any): any {\r\n switch (component.type) {\r\n case \"textarea\":\r\n case \"textfield\":\r\n case \"radio\":\r\n case \"select\":\r\n return component.defaultValue as string;\r\n case \"number\":\r\n return component.defaultValue as number;\r\n case \"checkbox\":\r\n return (component.defaultValue ?? false) as boolean;\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n private getUpdateOn(component: any): \"change\" | \"blur\" | null {\r\n if (component.updateOn === 'change' || component.updateOn === 'blur')\r\n return component.updateOn;\r\n\r\n switch (component.type) {\r\n case \"number\":\r\n case \"textarea\":\r\n case \"textfield\":\r\n return \"blur\";\r\n default:\r\n return null;\r\n }\r\n }\r\n}\r\n","interface Form {\r\n id: string;\r\n type: string;\r\n name: string;\r\n title: string;\r\n readonly: string | boolean | null;\r\n disabled: string | boolean | null;\r\n inactive: string | boolean | null;\r\n path: string | null;\r\n verticalAlignment: string | null;\r\n isTemplate: boolean | null;\r\n i18n: any,\r\n disableAutoFocus?: boolean;\r\n components: Component[];\r\n}\r\n\r\ninterface Component {\r\n id: string;\r\n layout: { columns: number | null, row: string };\r\n components?: Component[];\r\n [key: string]: any;\r\n}\r\n\r\ninterface RowComponent {\r\n id: string;\r\n layout: { columns: number | null, row: string };\r\n rows?: RowGroup[];\r\n [key: string]: any;\r\n}\r\n\r\ninterface RowGroup {\r\n row: string;\r\n components: RowComponent[];\r\n}\r\n\r\ninterface GroupedForm {\r\n id: string;\r\n title: string;\r\n isTemplate: boolean | null;\r\n rows: RowGroup[];\r\n [key: string]: any;\r\n}\r\n\r\nexport function groupByRow(forms: Form[]): GroupedForm[] {\r\n return forms.map(form => ({\r\n id: form.id,\r\n type: form.type,\r\n name: form.name,\r\n title: form.title,\r\n readonly: form.readonly,\r\n disabled: form.disabled,\r\n inactive: form.inactive,\r\n path: form.path,\r\n verticalAlignment: form.verticalAlignment,\r\n isTemplate: form.isTemplate,\r\n i18n: form.i18n,\r\n disableAutoFocus: form.disableAutoFocus,\r\n rows: groupRowsRecursively(form.components)\r\n })); \r\n}\r\n\r\nfunction groupRowsRecursively(components: Component[]): RowGroup[] {\r\n const groupedMap = new Map<string, RowComponent[]>();\r\n\r\n function processComponent(component: Component) {\r\n const row = component.layout?.row;\r\n\r\n if (!groupedMap.has(row)) {\r\n groupedMap.set(row, []);\r\n }\r\n\r\n const { components, ...props } = component;\r\n\r\n groupedMap.get(row)!.push({\r\n ...props,\r\n rows: components ? groupRowsRecursively(components) : undefined\r\n });\r\n }\r\n\r\n components.forEach(component => processComponent(component));\r\n\r\n return Array.from(groupedMap.entries()).map(([row, components]) => ({\r\n row,\r\n components\r\n }));\r\n}\r\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\r\nimport { ICellRendererAngularComp } from 'ag-grid-angular';\r\nimport { ICellRendererParams } from 'ag-grid-community';\r\nimport { SirioButton } from '@wemake4u/form-controls';\r\nimport { Texts } from '../../locale/locale-it';\r\n\r\n@Component({\r\n templateUrl: './objectURLRenderer.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n standalone: true,\r\n imports: [SirioButton]\r\n})\r\nexport class ObjectURLRendererComponent implements ICellRendererAngularComp {\r\n params!: ICellRendererParams;\r\n\r\n Texts = Texts;\r\n\r\n agInit(params: ICellRendererParams): void {\r\n this.params = params;\r\n }\r\n\r\n onClick(event: Event) {\r\n const fileURL = URL.createObjectURL(this.params.data);\r\n window.open(fileURL, '_blank');\r\n setTimeout(() => {\r\n URL.revokeObjectURL(fileURL);\r\n }, 1000);\r\n }\r\n\r\n refresh(): boolean {\r\n return false;\r\n }\r\n}\r\n","<!-- Button (not a link): announced as a button, activated also with Space. -->\r\n<button type=\"button\" wmSirioButton=\"ghost\" class=\"btn-small\" iconOnly icon=\"fa-paperclip\" [label]=\"Texts.Show\" (click)=\"onClick($event)\"></button>\r\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\r\nimport { ICellRendererAngularComp } from 'ag-grid-angular';\r\nimport { SirioButton } from '@wemake4u/form-controls';\r\nimport { Texts } from '../../locale/locale-it';\r\n\r\n@Component({\r\n templateUrl: './deleteRowRenderer.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n standalone: true,\r\n imports: [SirioButton]\r\n})\r\nexport class DeleteRowRendererComponent implements ICellRendererAngularComp {\r\n params: any;\r\n\r\n Texts = Texts;\r\n\r\n agInit(params: any): void {\r\n this.params = params;\r\n }\r\n\r\n onClick(event: Event) {\r\n\r\n if ('remove' in this.params.data && typeof this.params.data.remove === 'function') {\r\n this.params.data.remove();\r\n }\r\n }\r\n\r\n refresh(): boolean {\r\n return false;\r\n }\r\n}\r\n\r\n","<!-- Button (not a link): announced as a button, activated also with Space. -->\r\n<button type=\"button\" wmSirioButton=\"ghost\" class=\"btn-small\" iconOnly icon=\"fa-trash\" [label]=\"Texts.Remove\" (click)=\"onClick($event)\"></button>\r\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\r\n\r\nimport { ICellRendererAngularComp } from 'ag-grid-angular';\r\nimport { SirioButton } from '@wemake4u/form-controls';\r\nimport { ProgrammabilityService, EvaluateOptions } from '../../services/programmability.service';\r\nimport { CacheContextService } from '../../services/cache.service';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { toProxy } from '../../utils/proxy';\r\n\r\n@Component({\r\n templateUrl: './actionsCellRenderer.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n imports: [\r\n SirioButton\r\n]\r\n})\r\nexport class ActionsCellRendererComponent implements ICellRendererAngularComp {\r\n\r\n constructor(private programmability: ProgrammabilityService) { }\r\n\r\n params: any;\r\n\r\n agInit(params: any): void {\r\n this.params = params;\r\n this.cacheContext = this.getCacheContext(); \r\n }\r\n\r\n refresh(): boolean {\r\n return false;\r\n }\r\n\r\n evaluateBoolean(value: boolean | string | null): boolean | null {\r\n return this.cacheContext.evaluateBoolean(this.getCacheControl(), this.getFormGroup(), value, this.getOptions());\r\n //return this.programmability.evaluateBoolean(this.getFormGroup(), value, this.getOptions());\r\n }\r\n\r\n evaluateString(value: string | null): string {\r\n return this.cacheContext.evaluateString(this.getCacheControl(), this.getFormGroup(), value, this.getOptions());\r\n //return this.programmability.evaluateString(this.getFormGroup(), value, this.getOptions());\r\n }\r\n\r\n clickButton(action: any, event: any) {\r\n if (action.click) {\r\n const event = {\r\n params: this.params,\r\n action: action,\r\n data: this.getData(),\r\n rowIndex: this.getRowIndex()\r\n };\r\n const options: EvaluateOptions = {\r\n cacheable: false,\r\n extendContext: () => ({\r\n \"event\": event\r\n }),\r\n invokeArgs: [event]\r\n }\r\n\r\n return this.programmability.evaluate(this.getFormGroup(), action.click, options);\r\n } \r\n }\r\n\r\n private cacheContext!: CacheContextService;\r\n\r\n private getCacheControl(): any {\r\n return this.params.data ?? this;\r\n }\r\n\r\n private getOptions(): EvaluateOptions {\r\n const event = {\r\n params: this.params,\r\n data: this.getData(),\r\n rowIndex: this.getRowIndex()\r\n };\r\n return {\r\n //cacheable: false,\r\n extendContext: () => ({\r\n \"event\": event\r\n }),\r\n invokeArgs: [event]\r\n }\r\n }\r\n\r\n private getData(): any {\r\n return toProxy(this.params.data);\r\n }\r\n\r\n private getRowIndex(): any {\r\n return this.params.node.rowIndex;\r\n }\r\n\r\n private getFormGroup(): FormGroup {\r\n return this.params.formGroup as FormGroup;\r\n }\r\n\r\n private getCacheContext(): CacheContextService {\r\n return this.params.api.getGridOption(\"context\").cacheContext; \r\n }\r\n}\r\n\r\n","<div class=\"btn-small-group\">\r\n @for (action of params.component.actions; track action) {\r\n @if (!evaluateBoolean(action.disabled)) {\r\n <button type=\"button\" wmSirioButton=\"ghost\" class=\"btn-small\" iconOnly\r\n [icon]=\"evaluateString(action.icon)\"\r\n [label]=\"evaluateString(action.label)\"\r\n (click)=\"clickButton(action, $event)\"></button>\r\n }\r\n }\r\n</div>\r\n","export const getLabelSymbol = Symbol('getLabel');\r\n","import { getLabelSymbol } from './symbols';\r\n\r\nexport type LabeledMap<TKey extends string | number, TValue> =\r\n Record<TKey, TValue> & {\r\n [getLabelSymbol]?: (value: TKey) => TValue;\r\n };\r\n\r\nexport function isLabeledRecord<TKey extends string | number, TValue>(\r\n obj: any,\r\n isKey: (key: any) => key is TKey,\r\n isValue: (val: any) => val is TValue,\r\n getLabelSymbol: symbol\r\n): obj is Record<TKey, TValue> & { [key: symbol]: (key: TKey) => TValue } {\r\n if (!isRecord(obj, isKey, isValue)) {\r\n return false;\r\n }\r\n const getLabel = (obj as { [key: symbol]: unknown })[getLabelSymbol];\r\n return (getLabel !== undefined && typeof getLabel === 'function');\r\n}\r\n\r\nexport function isRecord<TKey extends string | number, TValue>(\r\n obj: any,\r\n isKey: (key: any) => key is TKey,\r\n isValue: (val: any) => val is TValue\r\n): obj is Record<TKey, TValue> {\r\n if (typeof obj !== 'object' || obj === null || Array.isArray(obj)) {\r\n return false;\r\n }\r\n return Object.entries(obj).every(([key, val]) => {\r\n return isKey(key) && isValue(val);\r\n });\r\n}\r\n\r\nexport function isStringKey(key: any): key is string | number {\r\n return typeof key === 'string';\r\n}\r\n\r\nexport function isNumericKey(key: any): key is string | number {\r\n return typeof key === 'string' && !isNaN(Number(key));\r\n}\r\n\r\nexport function isBooleanKey(key: any): key is string | number {\r\n return key === 'true' || key === 'false';\r\n}\r\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\r\n\r\nimport { FormsModule } from '@angular/forms';\r\nimport { IFilterParams, IDoesFilterPassParams } from 'ag-grid-community';\r\nimport { IFilterAngularComp } from '@ag-grid-community/angular';\r\nimport { SirioCheckbox, SirioTextbox } from '@wemake4u/form-controls';\r\nimport { isRecord } from '../../common/record';\r\nimport { Texts } from '../../locale/locale-it';\r\n\r\n@Component({\r\n templateUrl: './setfilter.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n imports: [FormsModule, SirioTextbox, SirioCheckbox],\r\n styles: `\r\n .set-filter {\r\n padding: 10px;\r\n background-color: white;\r\n }\r\n .set-filter-options {\r\n max-height: 200px;\r\n overflow-y: auto;\r\n }\r\n `\r\n})\r\nexport class SetFilterComponent implements IFilterAngularComp {\r\n private params!: IFilterParams;\r\n private fieldName!: string;\r\n\r\n Texts = Texts;\r\n\r\n selectAll: boolean = true;\r\n searchText: string = '';\r\n\r\n options: { value: any; label: string; selected: boolean }[] = [];\r\n filteredOptions: typeof this.options = [];\r\n\r\n agInit(params: IFilterParams): void {\r\n this.params = params;\r\n this.fieldName = params.colDef.field!;\r\n\r\n const map = params.colDef.filterParams?.map;\r\n\r\n const result = isRecord(\r\n map,\r\n key => typeof key === 'string' || typeof key === 'number',\r\n val => typeof val === 'string'\r\n );\r\n\r\n if (result) {\r\n this.options = Object.entries(map).map(([key, label]) => ({\r\n value: this.parseKey(key),\r\n label: label,\r\n selected: true\r\n }));\r\n }\r\n else {\r\n this.options = [];\r\n }\r\n \r\n this.filteredOptions = [...this.options];\r\n }\r\n\r\n isFilterActive(): boolean {\r\n return this.options.some(o => !o.selected);\r\n }\r\n\r\n doesFilterPass(params: IDoesFilterPassParams): boolean {\r\n const value = this.resolvePath(params.data, this.fieldName);\r\n return this.options.some(o => o.selected && o.value === value);\r\n }\r\n\r\n getModel() {\r\n const selectedValues = this.options\r\n .filter(o => o.selected)\r\n .map(o => o.value);\r\n\r\n if (selectedValues.length === this.options.length) { \r\n return null;\r\n }\r\n\r\n if (selectedValues.length === 0) {\r\n return {\r\n filterType: 'text',\r\n type: 'excludeAll'\r\n }\r\n }\r\n\r\n const filterType = this.getFilterType();\r\n\r\n const filters = selectedValues.map(value => ({\r\n filterType: filterType,\r\n type: 'equals',\r\n filter: value\r\n }));\r\n\r\n if (filters.length === 1)\r\n return filters[0];\r\n\r\n return {\r\n filterType: filterType,\r\n operator: 'OR',\r\n conditions: filters\r\n }\r\n }\r\n\r\n setModel(model: any): void {\r\n\r\n // no filter = all selected\r\n if (model == null)\r\n return;\r\n\r\n this.selectAll = false;\r\n\r\n // all unselected\r\n if (model?.type === 'excludeAll') {\r\n this.options.forEach(o => o.selected = false);\r\n }\r\n // one selected\r\n else if (model?.type === 'equals') {\r\n this.options.forEach(o => o.selected = (o.value == model.filter));\r\n }\r\n // many selected\r\n else if (model?.operator === 'OR' && Array.isArray(model.conditions)) {\r\n const selected = model.conditions.map((x: any) => x.filter);\r\n this.options.forEach(o => o.selected = selected.includes(o.value));\r\n }\r\n\r\n this.updateFilteredOptions();\r\n }\r\n\r\n onSelectionChange(): void {\r\n this.params.filterChangedCallback();\r\n }\r\n\r\n onSearchChange(): void {\r\n this.updateFilteredOptions();\r\n }\r\n\r\n onSelectAllChange(): void { \r\n this.setAll(this.selectAll);\r\n }\r\n\r\n private parseKey(key: string): boolean | number | string {\r\n if (key === 'true') return true;\r\n if (key === 'false') return false;\r\n const num = Number(key);\r\n return isNaN(num) ? key : num;\r\n }\r\n\r\n private setAll(select: boolean): void {\r\n this.options.forEach(o => o.selected = select);\r\n this.updateFilteredOptions();\r\n this.params.filterChangedCallback();\r\n }\r\n\r\n private updateFilteredOptions(): void {\r\n const search = this.searchText.toLowerCase();\r\n this.filteredOptions = this.options.filter(o =>\r\n o.label.toLowerCase().includes(search)\r\n );\r\n }\r\n\r\n private resolvePath(obj: any, path: string): any {\r\n return path.split('.').reduce((acc, part) => acc?.[part], obj);\r\n }\r\n\r\n private getFilterType() {\r\n const cellDataType = this.params?.colDef?.cellDataType;\r\n\r\n switch (cellDataType) {\r\n case 'number':\r\n return 'number';\r\n case 'date':\r\n case 'dateTime':\r\n return 'date';\r\n case 'text':\r\n return 'text';\r\n default:\r\n return 'number';\r\n }\r\n \r\n }\r\n}\r\n","<div class=\"set-filter\">\r\n\r\n <wm-sirio-textbox\r\n [placeholder]=\"Texts.TypeToSearch\"\r\n [ariaLabel]=\"Texts.TypeToSearch\"\r\n autocomplete=\"off\"\r\n [(ngModel)]=\"searchText\"\r\n (ngModelChange)=\"onSearchChange()\" />\r\n\r\n <div class=\"set-filter-options\">\r\n <wm-sirio-checkbox [label]=\"Texts.SelectAll\" [(ngModel)]=\"selectAll\" (ngModelChange)=\"onSelectAllChange()\" />\r\n\r\n @for (option of filteredOptions; track option) {\r\n <wm-sirio-checkbox\r\n [label]=\"option.label\"\r\n [(ngModel)]=\"option.selected\"\r\n (ngModelChange)=\"onSelectionChange()\" />\r\n }\r\n </div>\r\n\r\n</div>\r\n","import {\r\n Component, ViewChild, ViewContainerRef, AfterViewInit, ComponentRef, Type,\r\n Injector,\r\n ChangeDetectionStrategy\r\n} from '@angular/core';\r\n\r\nimport { FormGroup } from '@angular/forms';\r\nimport { ICellRendererAngularComp } from 'ag-grid-angular';\r\nimport { ProgrammabilityService, EvaluateOptions } from '../../services/programmability.service';\r\nimport { GlobalService } from '../../services/global.service';\r\nimport { toProxy } from '../../utils/proxy';\r\n\r\n/**\r\n * Handler invoked after the properties have been resolved.\r\n * It may mutate the given properties object and/or return\r\n * additional properties that will be merged over the resolved ones.\r\n */\r\nexport type HostCellRendererPropertiesHandler = (\r\n properties: Record<string, any>,\r\n params: any\r\n) => Record<string, any> | void | null | undefined;\r\n\r\n@Component({\r\n templateUrl: './hostCellRenderer.component.html',\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n imports: []\r\n})\r\nexport class HostCellRendererComponent implements ICellRendererAngularComp, AfterViewInit {\r\n @ViewChild('container', { read: ViewContainerRef, static: true }) container!: ViewContainerRef;\r\n\r\n constructor(private injector: Injector,\r\n private programmability: ProgrammabilityService,\r\n private globalService: GlobalService) { }\r\n\r\n params: any;\r\n\r\n agInit(params: any): void {\r\n this.params = params;\r\n }\r\n\r\n refresh(): boolean {\r\n return false;\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n const componentType = this.resolveComponentType(this.getComponentType());\r\n if (componentType) {\r\n this.componentRef = this.container.createComponent(componentType, {\r\n injector: this.injector,\r\n });\r\n\r\n this.setProperties();\r\n }\r\n }\r\n\r\n //#region Private Members\r\n\r\n private componentRef: ComponentRef<any> | null = null;\r\n\r\n private resolveComponentType(type: string): Type<any> | null {\r\n return this.globalService.getComponent(type);\r\n }\r\n\r\n private resolveProperties(): Record<string, any> {\r\n const properties = this.getProperties();\r\n if (properties) {\r\n return this.evaluate(properties) ?? {}\r\n }\r\n else {\r\n return {};\r\n }\r\n }\r\n\r\n private setProperties(): void {\r\n if (!this.componentRef) return;\r\n const properties = this.applyPropertiesHandler(this.resolveProperties());\r\n for (const key of Object.keys(properties)) {\r\n const value = properties[key];\r\n if (key in this.componentRef.instance) {\r\n this.componentRef.setInput?.(key, value);\r\n }\r\n }\r\n }\r\n\r\n private applyPropertiesHandler(properties: Record<string, any>): Record<string, any> {\r\n const handler = this.getPropertiesHandler();\r\n if (typeof handler !== 'function') return properties;\r\n\r\n // The handler can mutate the object in place and/or return extra properties\r\n const extra = handler(properties, this.params);\r\n return extra ? { ...properties, ...extra } : properties;\r\n }\r\n\r\n private evaluate(value: string) {\r\n const event = {\r\n params: this.params,\r\n value: this.getValue(),\r\n data: this.getData(),\r\n rowIndex: this.getRowIndex()\r\n };\r\n const options: EvaluateOptions = {\r\n cacheable: false,\r\n extendContext: () => ({\r\n \"event\": event\r\n }),\r\n invokeArgs: [event]\r\n }\r\n\r\n return this.programmability.evaluate(this.getFormGroup(), value, options);\r\n }\r\n\r\n private getComponentType(): string {\r\n return this.params.componentType;\r\n }\r\n\r\n private getProperties(): string | undefined {\r\n return this.params.properties;\r\n }\r\n\r\n private getPropertiesHandler(): HostCellRendererPropertiesHandler | undefined {\r\n return this.params.onPropertiesResolved;\r\n }\r\n\r\n private getFormGroup(): FormGroup {\r\n return this.params.formGroup;\r\n }\r\n\r\n private getData(): any {\r\n return toProxy(this.params.data);\r\n }\r\n\r\n private getValue(): any {\r\n return this.params.value;\r\n }\r\n\r\n private getRowIndex(): any {\r\n return this.params.node.rowIndex;\r\n }\r\n\r\n //#endregion\r\n}\r\n\r\n","<ng-container #container></ng-container>\r\n","function getCandidate(element: HTMLElement): HTMLElement[] {\r\n return Array.from(element.querySelectorAll<HTMLElement>(\r\n 'a[href], area[href], input:not([disabled]), select:not([disabled]), ' +\r\n 'textarea:not([disabled]), button:not([disabled]), iframe, object, embed, ' +\r\n '[tabindex]:not([tabindex=\"-1\"]), [contenteditable]'\r\n ));\r\n}\r\n\r\nfunction isVisible(element: HTMLElement): boolean {\r\n let el: HTMLElement | null = element;\r\n while (el) {\r\n const style = window.getComputedStyle(el);\r\n if (style.display === 'none' || style.visibility === 'hidden') return false;\r\n el = el.parentElement;\r\n }\r\n return true;\r\n}\r\n\r\nfunction isFocusable(element: HTMLElement): boolean {\r\n const style = window.getComputedStyle(element);\r\n const hasTabIndex = element.tabIndex >= 0;\r\n const isContentEditable = element.hasAttribute('contenteditable')\r\n && element.getAttribute('contenteditable') !== 'false';\r\n if (element.contentEditable === \"true\") return true;\r\n return (hasTabIndex || isContentEditable) &&\r\n style.visibility !== 'hidden' &&\r\n style.display !== 'none' &&\r\n !element.hasAttribute('disabled') &&\r\n isVisible(element);\r\n}\r\n\r\nexport function getFocusables(el: HTMLElement, firstOnly = false): HTMLElement[] {\r\n const candidates = getCandidate(el);\r\n const result: HTMLElement[] = [];\r\n for (const focusableEl of candidates) { \r\n if (isFocusable(focusableEl)) {\r\n result.push(focusableEl);\r\n if (firstOnly) {\r\n break;\r\n }\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nexport function setFocus(el: HTMLElement, preventScroll: boolean = false): HTMLElement | null {\r\n const focusables = getFocusables(el, true); \r\n if (focusables.length === 0) {\r\n return null;\r\n }\r\n const target = focusables[0];\r\n\r\n target.focus({ preventScroll });\r\n\r\n return target;\r\n}\r\n\r\n/**\r\n * True when a field inside `container` already has the focus, e.g. moved there by a tab or an\r\n * accordion (`focusContent` of @wemake4u/form-controls): the automatic focus of the form keeps it.\r\n */\r\nexport function hasFieldFocus(container: HTMLElement): boolean {\r\n const active = container.ownerDocument.activeElement as HTMLElement | null;\r\n return !!active && active !== container && container.contains(active)\r\n && active.matches('input, select, textarea, [contenteditable]:not([contenteditable=\"false\"])');\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { marked } from 'marked';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MarkdownService {\r\n\r\n constructor() {\r\n\r\n marked.use({\r\n async: false,\r\n gfm: true,\r\n breaks: true\r\n });\r\n\r\n const renderer = new marked.Renderer();\r\n\r\n renderer.link = function (args) {\r\n if (args.href?.startsWith('action://'))\r\n return `<a href=\"#\" data-action=\"${args.href.substring(\"action://\".length) }\">${args.text}</a>`;\r\n return `<a href=\"${args.href}\" target=\"_blank\">${args.text}</a>`; \r\n };\r\n\r\n marked.setOptions({ renderer });\r\n }\r\n\r\n toHtml(text: string): string {\r\n return marked.parse(text ?? \"\") as string;\r\n };\r\n\r\n /** Inline markdown only (bold, italic, links...): no block elements such as <p>. */\r\n toInlineHtml(text: string): string {\r\n return marked.parseInline(text ?? \"\") as string;\r\n };\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport {\r\n Module, PaginationModule, ClientSideRowModelModule, InfiniteRowModelModule\r\n , LocaleModule, CellStyleModule, ValidationModule, RowApiModule, RowStyleModule \r\n , RowSelectionModule, RowSelectionOptions \r\n , TextFilterModule, NumberFilterModule, DateFilterModule, CustomFilterModule\r\n , ColDef, themeQuartz, iconSetAlpine, GridOptions, DataTypeDefinition\r\n , ClientSideRowModelApiModule, RowAutoHeightModule\r\n , GridSizeChangedEvent, ModelUpdatedEvent, ColumnAutoSizeModule, ColumnApiModule, GridApi\r\n , SuppressKeyboardEventParams\r\n , GetRowIdFunc, GetRowIdParams, HighlightChangesModule\r\n} from 'ag-grid-community';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { ObjectURLRendererComponent } from '../components/objectURLRenderer/objectURLRenderer.component';\r\nimport { DeleteRowRendererComponent } from '../components/deleteRowRenderer/deleteRowRenderer.component';\r\nimport { ActionsCellRendererComponent } from '../components/actionsCellRenderer/actionsCellRenderer.component';\r\nimport { SetFilterComponent } from '../components/setFilter/setFilter.component';\r\nimport { HostCellRendererComponent } from '../components/hostCellRenderer/hostCellRenderer.component';\r\nimport { FormatterService } from '../services/formatter.service';\r\nimport { MarkdownService } from '../services/markdown.service';\r\nimport { ProgrammabilityService } from '../services/programmability.service';\r\nimport { WeakService } from '../services/weak.service';\r\nimport { getFocusables } from '../utils/focusable';\r\nimport { isRecord, isLabeledRecord, isNumericKey } from '../common/record';\r\nimport { getLabelSymbol } from '../common/symbols';\r\nimport {\r\n AG_GRID_LOCALE_IT,\r\n AG_GRID_LOCALE_EN,\r\n AG_GRID_LOCALE_DE,\r\n AG_GRID_LOCALE_FR,\r\n AG_GRID_LOCALE_ES,\r\n AG_GRID_LOCALE_PT \r\n} from '@ag-grid-community/locale';\r\n\r\nimport { LanguageService } from '@wemake4u/interact';\r\nimport { Texts } from '../locale/locale';\r\nimport { localize } from '../locale/localize';\r\nimport { MetadataService } from './metadata.service';\r\n\r\ntype MapType = Record<string | number, string> | null;\r\n\r\ntype GroupNode = {\r\n name: string;\r\n type: \"group\";\r\n columns: (GroupNode | any)[];\r\n};\r\n\r\n@Injectable()\r\nexport class GridService {\r\n\r\n constructor(private formatter: FormatterService\r\n , private languageService: LanguageService\r\n , private programmability: ProgrammabilityService\r\n , private metadata : MetadataService\r\n , private markdownService: MarkdownService\r\n , private weak: WeakService) {\r\n }\r\n\r\n getModules(): Module[] {\r\n return [\r\n ClientSideRowModelModule\r\n , InfiniteRowModelModule\r\n , PaginationModule\r\n , LocaleModule\r\n , CellStyleModule\r\n , ClientSideRowModelApiModule\r\n , TextFilterModule\r\n , NumberFilterModule\r\n , DateFilterModule\r\n , CustomFilterModule\r\n , ColumnAutoSizeModule\r\n , ColumnApiModule\r\n , RowSelectionModule\r\n , RowApiModule\r\n , RowAutoHeightModule\r\n , RowStyleModule \r\n , HighlightChangesModule\r\n //, ValidationModule\r\n ];\r\n };\r\n\r\n getOptions(component: any, formGroup: FormGroup): GridOptions {\r\n const selection = this.getRowSelection(component, formGroup);\r\n const rowId = this.getRowId(component);\r\n const pagination = this.getPaginable(component);\r\n const pageSize = this.getPageSize(component);\r\n const texts = this.getTexts();\r\n const theme = this.getTheme();\r\n const autoHeight = (component.autoHeight === true);\r\n const options : GridOptions = {\r\n defaultColDef: {\r\n floatingFilter: (component.floatingFilter === true),\r\n headerClass: (component.floatingFilter === true)\r\n ? 'show-filter' : 'hide-filter'\r\n },\r\n selectionColumnDef: {\r\n pinned: 'left'\r\n },\r\n dataTypeDefinitions: this.getDataTypeDefinitions(),\r\n rowSelection: selection,\r\n pagination: pagination,\r\n paginationPageSize: pageSize,\r\n cacheBlockSize: pageSize,\r\n paginationPageSizeSelector: [5, 10, 20, 50],\r\n localeText: texts,\r\n enableCellTextSelection: true,\r\n theme: theme,\r\n getRowId: rowId,\r\n domLayout: autoHeight ? \"autoHeight\" : undefined,\r\n onGridSizeChanged: (params: GridSizeChangedEvent) => {\r\n this.resizeGrid(component, params.api);\r\n },\r\n onModelUpdated: (params: ModelUpdatedEvent) => {\r\n this.resizeGrid(component, params.api);\r\n this.onRowSelecting(component, formGroup, params); \r\n }\r\n };\r\n this.setRowStyle(component, options, formGroup);\r\n return options;\r\n }\r\n\r\n getColumnDefs(component: any, columns: any, formGroup: FormGroup): ColDef[] {\r\n if (Array.isArray(columns)) {\r\n const groupedColumns = this.groupColumns(columns);\r\n const columnDefs = this.groupsToColumnDefs(groupedColumns\r\n , (cs) => this.createColumnDefs(component, cs, formGroup));\r\n\r\n this.addActionColumnDef(component, columnDefs, formGroup);\r\n this.addRowNumbersColumnDef(component, columnDefs);\r\n\r\n return columnDefs;\r\n }\r\n else {\r\n return [];\r\n }\r\n }\r\n\r\n onSelectionChanged(component: any, formGroup: FormGroup, gridEvent: any) {\r\n if (component.selectionChanged) {\r\n const event = {\r\n selectedRows: gridEvent.api.getSelectedRows()\r\n };\r\n return this.programmability.evaluate(formGroup, component.selectionChanged, {\r\n cacheable: false,\r\n extendContext: () => ({\r\n \"event\": event\r\n }),\r\n invokeArgs: [ event ]\r\n });\r\n }\r\n }\r\n\r\n getCacheKey(): string {\r\n return `getGridOptions_${this.language}`;\r\n }\r\n\r\n invalidateOptions(component: any) {\r\n this.weak.invalidate(component, this.getCacheKey());\r\n }\r\n\r\n onRowDataChanged(component: any, api: GridApi, rowData: any) { \r\n if (this.hasRowNumbers(component) && this.hasRowId(component)) {\r\n this.refreshRowNumbers(api);\r\n } \r\n }\r\n\r\n onDataSourceChanged(component: any, api: GridApi, dataSource: any) {\r\n // Nothing\r\n }\r\n\r\n private get language(): string {\r\n return this.languageService.getLanguage();\r\n }\r\n\r\n private locale(component: any, key: string): string {\r\n return localize(this.language, component, key);\r\n }\r\n\r\n resizeGrid(component: any, api: GridApi) {\r\n const columnsToResize: string[] = [];\r\n\r\n if (this.hasActions(component)) {\r\n columnsToResize.push('actions');\r\n }\r\n\r\n if (this.hasRowNumbers(component)) {\r\n columnsToResize.push('rowNumbers');\r\n }\r\n\r\n if (columnsToResize.length > 0) {\r\n api.autoSizeColumns(columnsToResize);\r\n }\r\n }\r\n\r\n private hasActions(component: any) {\r\n return Array.isArray(component.actions) && component.actions.length > 0;\r\n }\r\n\r\n private hasRowNumbers(component: any) {\r\n return (component.rowNumbers);\r\n }\r\n\r\n private createColumnDefs(component: any, columns: any, formGroup: FormGroup): ColDef[] {\r\n if (Array.isArray(columns)) {\r\n const columnDefs = columns.map((column: any) => {\r\n const colDef: ColDef = {\r\n field: column.key,\r\n headerName: this.locale(column, 'label')\r\n }\r\n\r\n this.setCellDataType(column, colDef);\r\n\r\n const map = this.getMap(column, colDef, formGroup);\r\n\r\n this.setCellRenderer(column, colDef, map, formGroup);\r\n this.setValueGetter(column, colDef, formGroup);\r\n this.setColStyles(column, colDef, formGroup);\r\n this.setAutoHeight(column, colDef);\r\n this.setResizable(column, colDef);\r\n this.setSortable(column, colDef);\r\n this.setFilter(column, colDef, map);\r\n this.setFilterParams(column, colDef, map);\r\n this.setSuppressMovable(column, colDef);\r\n this.setFlex(column, colDef);\r\n this.setAlign(column, colDef);\r\n this.setPinned(column, colDef);\r\n this.setWidth(column, colDef);\r\n this.setValueFormatter(column, colDef, map);\r\n this.setCellChangeFlash(column, colDef);\r\n\r\n return colDef;\r\n });\r\n\r\n return columnDefs;\r\n }\r\n else {\r\n return [];\r\n }\r\n }\r\n\r\n private addActionColumnDef(component: any, columnDefs: ColDef[], formGroup: FormGroup) {\r\n if (this.hasActions(component)) {\r\n columnDefs.push({\r\n colId: 'actions',\r\n headerName: this.locale(Texts, 'Actions'),\r\n resizable: false,\r\n sortable: false,\r\n filter: false,\r\n cellDataType: false,\r\n hide: this.suppressActions(component, formGroup),\r\n pinned: \"right\", \r\n cellRendererParams: {\r\n component: component,\r\n formGroup: formGroup\r\n },\r\n cellRenderer: ActionsCellRendererComponent,\r\n suppressKeyboardEvent: this.navigateInsideCell.bind(this)\r\n });\r\n }\r\n }\r\n\r\n private addRowNumbersColumnDef(component: any, columnDefs: ColDef[]) { \r\n if (this.hasRowNumbers(component)) {\r\n columnDefs.unshift({\r\n colId: 'rowNumbers',\r\n headerName: \"#\",\r\n pinned: \"left\",\r\n headerClass: 'row-numbers-header',\r\n cellClass: 'row-numbers-cell',\r\n resizable: false,\r\n sortable: false,\r\n valueGetter: (n: any) => n.node.rowIndex + 1\r\n });\r\n }\r\n }\r\n\r\n private refreshRowNumbers(api: GridApi) {\r\n if (api) {\r\n const rowNumbers = [\"rowNumbers\"];\r\n api.setColumnsVisible(rowNumbers, false);\r\n api.setColumnsVisible(rowNumbers, true); \r\n } \r\n }\r\n\r\n private groupColumns(columns: any[]): (GroupNode | any)[] {\r\n const rootItemsOrdered: (GroupNode | any)[] = [];\r\n\r\n function findOrCreateGroup(\r\n groups: (GroupNode | any)[],\r\n name: string\r\n ): GroupNode {\r\n let group = groups.find(\r\n item => (item as GroupNode).type === \"group\" && (item as GroupNode).name === name\r\n ) as GroupNode;\r\n\r\n if (!group) {\r\n group = {\r\n name,\r\n type: \"group\",\r\n columns: [],\r\n };\r\n groups.push(group);\r\n }\r\n\r\n return group;\r\n }\r\n\r\n for (const column of columns) {\r\n const groupParts = (column.group ?? \"\")\r\n .split(/[\\\\/]/)\r\n .map((part: string) => part.trim())\r\n .filter((part: string) => part.length > 0);\r\n\r\n if (groupParts.length === 0) {\r\n rootItemsOrdered.push(column);\r\n } else {\r\n let currentLevel = rootItemsOrdered;\r\n for (let i = 0; i < groupParts.length; i++) {\r\n const part = groupParts[i];\r\n const group = findOrCreateGroup(currentLevel, part);\r\n currentLevel = group.columns;\r\n }\r\n currentLevel.push(column);\r\n }\r\n }\r\n\r\n return rootItemsOrdered;\r\n }\r\n\r\n private groupsToColumnDefs(grouped: (GroupNode | any)[], getColumnsDef: (columns: any[]) => ColDef[]): any[] {\r\n return grouped.map(item => {\r\n if ('type' in item && item.type === 'group') {\r\n return {\r\n headerName: item.name,\r\n children: this.groupsToColumnDefs(item.columns, getColumnsDef)\r\n };\r\n } else {\r\n return getColumnsDef([item])[0];\r\n }\r\n });\r\n }\r\n\r\n private setCellDataType(column: any, colDef: ColDef) {\r\n if (column.dataType === \"component\"\r\n || column.dataType === \"template\"\r\n || column.dataType === \"formatted\"\r\n || column.dataType === \"auto\") return;\r\n\r\n if (typeof column.dataType === \"string\"\r\n && column.dataType.trim() !== \"\") {\r\n colDef.cellDataType = column.dataType;\r\n }\r\n }\r\n\r\n private setRowStyle(component: any, gridOptions: GridOptions, formGroup: FormGroup) {\r\n this.applyStyle(gridOptions, formGroup, component.rowClass, \"getRowClass\", \"rowClass\");\r\n this.applyStyle(gridOptions, formGroup, component.rowStyle, \"getRowStyle\", \"rowStyle\");\r\n this.applyStyle(gridOptions, formGroup, component.rowClassRules, \"rowClassRules\", \"rowClassRules\");\r\n }\r\n\r\n private setColStyles(column: any, colDef: ColDef, formGroup: FormGroup) {\r\n this.applyStyle(colDef, formGroup, column.headerClass, \"headerClass\", \"headerClass\");\r\n this.applyStyle(colDef, formGroup, column.headerStyle, \"headerStyle\", \"headerStyle\");\r\n this.applyStyle(colDef, formGroup, column.cellClass, \"cellClass\", \"cellClass\");\r\n this.applyStyle(colDef, formGroup, column.cellStyle, \"cellStyle\", \"cellStyle\");\r\n this.applyStyle(colDef, formGroup, column.cellClassRules, \"cellClassRules\", \"cellClassRules\");\r\n }\r\n\r\n private setCellRenderer(column: any, colDef: ColDef, map: MapType, formGroup: FormGroup) {\r\n if (column.format === \"objectURL\") {\r\n colDef.cellRenderer = ObjectURLRendererComponent;\r\n }\r\n\r\n if (column.format === \"deleteRow\") {\r\n colDef.cellRenderer = DeleteRowRendererComponent;\r\n }\r\n\r\n if (colDef.cellDataType === \"boolean\" && map) {\r\n colDef.cellRenderer = (params: any) => {\r\n return this.formatMap(params.value, map); \r\n }\r\n }\r\n\r\n if (column.dataType === \"formatted\") {\r\n colDef.cellRenderer = (params: any) => {\r\n return this.markdownService.toHtml(params.value);\r\n }\r\n }\r\n\r\n if (column.dataType === \"component\") {\r\n colDef.cellRenderer = HostCellRendererComponent;\r\n colDef.cellRendererParams = {\r\n componentType: column.component,\r\n properties: column.properties,\r\n formGroup: formGroup\r\n };\r\n colDef.cellClass = 'cell-component';\r\n }\r\n\r\n if (column.dataType === \"template\") {\r\n const template = this.metadata.getTemplateByName(column.template);\r\n\r\n if (template) {\r\n colDef.cellRenderer = HostCellRendererComponent;\r\n colDef.cellRendererParams = {\r\n componentType: \"form-host\",\r\n properties: {\r\n schema: template,\r\n showNav: false,\r\n showProgress: false,\r\n showNavButton: false,\r\n showFormTitle: false\r\n },\r\n onPropertiesResolved: (props: Record<string, any>, params: any) => ({\r\n value: params.data\r\n })\r\n };\r\n colDef.cellClass = 'cell-component';\r\n } \r\n }\r\n\r\n if (column.dataType === \"custom\") {\r\n this.applyExpression(colDef, formGroup, column.customRenderer, \"cellRenderer\"); \r\n }\r\n }\r\n\r\n private setValueGetter(column: any, colDef: ColDef, formGroup: FormGroup) {\r\n this.applyExpression(colDef, formGroup, column.valueGetter, \"valueGetter\");\r\n }\r\n\r\n private setCellChangeFlash(column: any, colDef: ColDef) {\r\n colDef.enableCellChangeFlash = true;\r\n }\r\n\r\n private setAutoHeight(column: any, colDef: ColDef) {\r\n if (column.autoHeight) {\r\n colDef.autoHeight = true;\r\n colDef.wrapText = true;\r\n } \r\n }\r\n\r\n private setResizable(column: any, colDef: ColDef ) {\r\n colDef.resizable = (column.resize === true);\r\n }\r\n\r\n private setSortable(column: any, colDef: ColDef) {\r\n colDef.sortable = (column.sort === true);\r\n }\r\n\r\n private setFilter(column: any, colDef: ColDef, map: MapType) {\r\n if (column.filter === true) {\r\n colDef.filter = true;\r\n if (map) {\r\n colDef.filter = SetFilterComponent;\r\n }\r\n }\r\n }\r\n\r\n private setFilterParams(column: any, colDef: ColDef, map: MapType) {\r\n\r\n const filterParams: any = {};\r\n\r\n if (column.dataType === 'uuid') {\r\n this.setUuidFilterParams(filterParams);\r\n }\r\n else if (column.dataType === 'integer') {\r\n this.setIntegerFilterParams(filterParams);\r\n }\r\n else if (column.dataType === 'date') {\r\n this.setDateFilterParams(filterParams);\r\n }\r\n else if (column.dataType === 'boolean') {\r\n this.setBooleanFilterParams(filterParams);\r\n }\r\n \r\n if (map) {\r\n filterParams.map = map;\r\n }\r\n\r\n colDef.filterParams = filterParams;\r\n }\r\n\r\n private setUuidFilterParams(filterParams: any) {\r\n filterParams.filterOptions = ['equals', 'notEqual'];\r\n }\r\n\r\n private setIntegerFilterParams(filterParams: any) {\r\n filterParams.allowedCharPattern = '\\\\d';\r\n }\r\n\r\n private setDateFilterParams(filterParams: any) {\r\n filterParams.comparator = (filterLocalDateAtMidnight: Date, cellValue: string) => {\r\n if (!cellValue) return -1;\r\n const cellDate = new Date(cellValue);\r\n if (isNaN(cellDate.getTime())) return -1;\r\n\r\n const cellDateNoTime = new Date(cellDate.getFullYear(), cellDate.getMonth(), cellDate.getDate());\r\n\r\n if (cellDateNoTime < filterLocalDateAtMidnight) return -1;\r\n if (cellDateNoTime > filterLocalDateAtMidnight) return 1;\r\n return 0;\r\n }\r\n }\r\n\r\n private setBooleanFilterParams(filterParams: any) {\r\n filterParams.filterOptions = [\r\n {\r\n displayKey: 'includeAll',\r\n displayName: Texts.ChooseOne,\r\n numberOfInputs: 0,\r\n predicate: ([filter]: [any], value: any) => true\r\n },\r\n {\r\n displayKey: 'true',\r\n displayName: Texts.True,\r\n numberOfInputs: 0,\r\n predicate: ([filter]: [any], value: any) => value === true\r\n },\r\n {\r\n displayKey: 'false',\r\n displayName: Texts.False,\r\n numberOfInputs: 0,\r\n predicate: ([filter]: [any], value: any) => value === false\r\n },\r\n {\r\n displayKey: 'blank',\r\n displayName: Texts.Blank,\r\n numberOfInputs: 0,\r\n predicate: ([filter]: [any], value: any) => value === null\r\n },\r\n {\r\n displayKey: 'notBlank',\r\n displayName: Texts.NotBlank,\r\n numberOfInputs: 0,\r\n predicate: ([filter]: [any], value: any) => value !== null\r\n },\r\n ];\r\n filterParams.suppressAndOrCondition = true;\r\n }\r\n\r\n private setSuppressMovable(column: any, colDef: ColDef) {\r\n if (!(column.move === true)) { \r\n colDef.suppressMovable = true;\r\n }\r\n }\r\n\r\n private setFlex(column: any, colDef: ColDef) {\r\n if (column.flex === true) { \r\n colDef.flex = 1;\r\n }\r\n }\r\n\r\n private setAlign(column: any, colDef: ColDef) {\r\n if (column.align === \"left\") {\r\n colDef.cellStyle = { textAlign: 'left' };\r\n }\r\n else if (column.align === \"center\") {\r\n colDef.cellStyle = { textAlign: 'center' };\r\n }\r\n else if (column.align === \"right\") { \r\n colDef.cellStyle = { textAlign: 'right' };\r\n }\r\n }\r\n\r\n private setPinned(column: any, colDef: ColDef) {\r\n if (typeof column.pinned === \"string\") { \r\n colDef.pinned = column.pinned;\r\n }\r\n }\r\n\r\n private setWidth(column: any, colDef: ColDef) {\r\n if (typeof column.width === \"number\") { \r\n colDef.width = column.width;\r\n }\r\n\r\n if (typeof column.minWidth === \"number\") { \r\n colDef.minWidth = column.minWidth;\r\n }\r\n\r\n if (typeof column.maxWidth === \"number\") { \r\n colDef.maxWidth = column.maxWidth;\r\n }\r\n }\r\n\r\n private setValueFormatter(column: any, colDef: ColDef, map: MapType) {\r\n if (map) {\r\n colDef.valueFormatter = (params) => this.formatMap(params.value, map); \r\n }\r\n }\r\n\r\n getRowSelection(component: any, formGroup: FormGroup): RowSelectionOptions | undefined {\r\n let options: RowSelectionOptions | undefined = undefined;\r\n if (this.selectable(component, formGroup)) {\r\n const trigger = this.selectionTrigger(component);\r\n const checkboxes = trigger !== 'click';\r\n const click = trigger !== 'checkbox';\r\n\r\n if (this.multiSelect(component, formGroup)) {\r\n options = {\r\n mode: \"multiRow\",\r\n selectAll: 'filtered',\r\n hideDisabledCheckboxes: true,\r\n checkboxes: checkboxes,\r\n headerCheckbox: checkboxes,\r\n enableClickSelection: click,\r\n // A click toggles the row, like its checkbox (no Ctrl/Shift needed)\r\n enableSelectionWithoutKeys: click\r\n };\r\n }\r\n else {\r\n options = {\r\n mode: \"singleRow\",\r\n checkboxes: checkboxes,\r\n enableClickSelection: click\r\n };\r\n }\r\n\r\n if (component.rowSelectable) {\r\n options = {\r\n ...options,\r\n isRowSelectable: (rowNode) => this.onRowSelectable(component, formGroup, rowNode.data)\r\n }\r\n }\r\n }\r\n\r\n return options;\r\n }\r\n\r\n private hasRowId(component: any) {\r\n return typeof component.rowId === 'string' && component.rowId.trim() !== '';\r\n }\r\n\r\n private getRowId(component: any): GetRowIdFunc<any> | undefined\r\n {\r\n if (this.hasRowId(component)) {\r\n return (params: GetRowIdParams<any>) => params.data[component.rowId]; \r\n }\r\n else {\r\n return undefined;\r\n }\r\n }\r\n\r\n private applyStyle(target: any, formGroup: FormGroup, styleExpression: any, funcName: string, staticName: string)\r\n {\r\n if (styleExpression) {\r\n const value = this.programmability.evaluate(formGroup, styleExpression);\r\n if (typeof value === 'function') {\r\n target[funcName] = value\r\n }\r\n else {\r\n target[staticName] = value;\r\n }\r\n } \r\n }\r\n\r\n private applyExpression(target: any, formGroup: FormGroup, expression: any, propertyName: string) {\r\n if (expression) {\r\n const value = this.programmability.evaluate(formGroup, expression);\r\n if (typeof value === 'function') {\r\n target[propertyName] = (n: any) => value(n.data);\r\n }\r\n else {\r\n target[propertyName] = () => value;\r\n }\r\n }\r\n }\r\n\r\n private onRowSelectable(component: any, formGroup: FormGroup, data: any) : boolean {\r\n if (!data)\r\n return false;\r\n\r\n const event = {\r\n data: data\r\n };\r\n const result = this.programmability.evaluate(formGroup, component.rowSelectable, {\r\n cacheable: false,\r\n extendContext: () => ({\r\n \"event\": event\r\n }),\r\n invokeArgs: [event]\r\n });\r\n\r\n return result === true; \r\n }\r\n\r\n private onRowSelected(component: any, formGroup: FormGroup, data: any): boolean {\r\n if (!data)\r\n return false;\r\n\r\n const event = {\r\n data: data\r\n };\r\n const result = this.programmability.evaluate(formGroup, component.rowSelected, {\r\n cacheable: false,\r\n extendContext: () => ({\r\n \"event\": event\r\n }),\r\n invokeArgs: [event]\r\n });\r\n\r\n return result === true;\r\n }\r\n\r\n private onRowSelecting(component: any, formGroup: FormGroup, params: ModelUpdatedEvent) {\r\n if (params.newData \r\n && component.rowSelected\r\n && this.selectable(component, formGroup))\r\n {\r\n params.api.forEachNode((node) => {\r\n if (this.onRowSelected(component, formGroup, node.data)) {\r\n node.setSelected(true);\r\n }\r\n });\r\n }\r\n }\r\n\r\n private suppressActions(component: any, formGroup: FormGroup): boolean {\r\n return this.programmability.evaluateBoolean(formGroup, component.suppressActions, { cacheable: false })\r\n ?? false;\r\n }\r\n\r\n private selectable(component: any, formGroup: FormGroup): boolean {\r\n return this.programmability.evaluateBoolean(formGroup, component.selectable, { cacheable: false })\r\n ?? false;\r\n }\r\n\r\n private multiSelect(component: any, formGroup: FormGroup): boolean {\r\n return this.programmability.evaluateBoolean(formGroup, component.multiSelect, { cacheable: false })\r\n ?? false;\r\n }\r\n\r\n // How rows are selected: \"checkbox\" (default), \"click\" or \"both\"; static value, unknown values fall back to \"checkbox\"\r\n private selectionTrigger(component: any): SelectionTrigger {\r\n const value = component.selectionTrigger;\r\n const trigger = typeof value === 'string' ? value.trim().toLowerCase() : '';\r\n return trigger === 'click' || trigger === 'both' ? trigger : 'checkbox';\r\n }\r\n\r\n private getPaginable(component: any): boolean {\r\n return (typeof component.rowCount === 'number' && component.rowCount > 0);\r\n }\r\n\r\n private getPageSize(component: any) {\r\n if (typeof component.rowCount === 'number') {\r\n return component.rowCount;\r\n }\r\n }\r\n\r\n private getTexts(): any {\r\n if (this.language === 'it') {\r\n return AG_GRID_LOCALE_IT;\r\n }\r\n else if (this.language === 'en') {\r\n return AG_GRID_LOCALE_EN;\r\n }\r\n else if (this.language === 'de') {\r\n return AG_GRID_LOCALE_DE;\r\n }\r\n else if (this.language === 'fr') {\r\n return AG_GRID_LOCALE_FR;\r\n }\r\n else if (this.language === 'es') {\r\n return AG_GRID_LOCALE_ES;\r\n }\r\n else if (this.language === 'pt') {\r\n return AG_GRID_LOCALE_PT;\r\n }\r\n else if (this.language === '') {\r\n return AG_GRID_LOCALE_IT; // neutral\r\n }\r\n else {\r\n return AG_GRID_LOCALE_EN; // fallback\r\n }\r\n }\r\n\r\n private getTheme() {\r\n return themeQuartz\r\n .withPart(iconSetAlpine)\r\n .withParams({\r\n backgroundColor: \"#FAFAFA\",\r\n borderColor: \"#D9E4F7\",\r\n browserColorScheme: \"light\",\r\n cellTextColor: \"#00121A\",\r\n columnBorder: true,\r\n fontFamily: \"inherit\",\r\n fontSize: 16,\r\n headerBackgroundColor: \"#002460\",\r\n headerColumnBorder: true,\r\n headerColumnResizeHandleColor: \"#F2F6FC\",\r\n headerColumnResizeHandleWidth: 2,\r\n headerFontSize: 16,\r\n headerFontWeight: 600,\r\n headerRowBorder: true,\r\n headerTextColor: \"#F2F6FC\",\r\n rowBorder: true\r\n });\r\n }\r\n\r\n private getDataTypeDefinitions(): { [cellDataType: string]: DataTypeDefinition<any>; } {\r\n return {\r\n uuid: {\r\n baseDataType: 'text',\r\n extendsDataType: 'text'\r\n },\r\n date: {\r\n baseDataType: 'dateString',\r\n extendsDataType: 'dateString',\r\n dateParser: (value: string | undefined) => {\r\n return value ? new Date(value) : undefined;\r\n },\r\n valueFormatter: params => {\r\n return this.formatter.formatDate(params.value);\r\n }\r\n },\r\n dateTime: {\r\n baseDataType: 'dateString',\r\n extendsDataType: 'dateString',\r\n dateParser: (value: string | undefined) => {\r\n return value ? new Date(value) : undefined;\r\n },\r\n valueFormatter: params => {\r\n return this.formatter.formatDateTime(params.value);\r\n }\r\n },\r\n time: {\r\n baseDataType: 'dateString',\r\n extendsDataType: 'dateString',\r\n dateParser: (value: string | undefined) => {\r\n return value ? new Date(value) : undefined;\r\n },\r\n valueFormatter: params => {\r\n return this.formatter.formatTime(params.value);\r\n }\r\n },\r\n currency: {\r\n extendsDataType: 'number',\r\n baseDataType: 'number',\r\n valueFormatter: params => params.value == null\r\n ? ''\r\n : this.formatter.formatCurrency(params.value)\r\n },\r\n decimal: {\r\n extendsDataType: 'number',\r\n baseDataType: 'number',\r\n valueFormatter: params => params.value == null\r\n ? ''\r\n : this.formatter.formatNumber(params.value)\r\n },\r\n integer: {\r\n extendsDataType: 'number',\r\n baseDataType: 'number',\r\n valueFormatter: params => params.value == null\r\n ? ''\r\n : this.formatter.formatNumber(params.value, 0)\r\n },\r\n percentage: {\r\n extendsDataType: 'number',\r\n baseDataType: 'number',\r\n valueFormatter: params => params.value == null\r\n ? ''\r\n : `${Math.round(params.value * 100)}%`,\r\n },\r\n flags: {\r\n extendsDataType: 'number',\r\n baseDataType: 'number'\r\n } \r\n };\r\n }\r\n\r\n private getMap(column: any, colDef: ColDef, formGroup: FormGroup): MapType {\r\n\r\n const allowed = (colDef.cellDataType === \"boolean\"\r\n || colDef.cellDataType === \"text\"\r\n || colDef.cellDataType === \"number\"\r\n || colDef.cellDataType === \"flags\");\r\n\r\n if (allowed && column.map) {\r\n const map = this.programmability.evaluate(formGroup, column.mapValues);\r\n\r\n const valid = isRecord(\r\n map,\r\n key => typeof key === 'string' || typeof key === 'number',\r\n val => typeof val === 'string'\r\n );\r\n\r\n if (!valid)\r\n return null;\r\n\r\n if (colDef.cellDataType === \"flags\") {\r\n (map as any)[getLabelSymbol] = (key: any) => this.formatFlags(key, map);\r\n }\r\n\r\n return map;\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n\r\n private formatMap(value: any, map: MapType)\r\n {\r\n if (value == null) {\r\n return map?.['null'] ?? \"\";\r\n }\r\n\r\n if (map) {\r\n var result = map[value];\r\n\r\n if (result === undefined) {\r\n const labeled = isLabeledRecord(\r\n map,\r\n key => typeof key === 'string' || typeof key === 'number',\r\n val => typeof val === 'string',\r\n getLabelSymbol\r\n );\r\n\r\n if (labeled) {\r\n result = map[getLabelSymbol](value);\r\n }\r\n }\r\n \r\n return result ?? value.toString();\r\n }\r\n else {\r\n return value.toString();\r\n }\r\n }\r\n\r\n private formatFlags(value: any, map: MapType) {\r\n if (typeof value === 'number' &&\r\n isRecord(map, isNumericKey, val => typeof val === 'string')\r\n ) {\r\n if (value == 0) {\r\n return map[0] ?? \"0\";\r\n }\r\n\r\n const availableFlags = Object.keys(map)\r\n .map(Number)\r\n .filter(flag => flag !== 0);\r\n\r\n const flags = availableFlags.filter(flag => (value & flag) === flag);\r\n\r\n const sumFlags = flags.reduce((sum, f) => sum | f, 0);\r\n\r\n if ((value & sumFlags) !== value) {\r\n return null;\r\n }\r\n\r\n return flags\r\n .map(flag => map[flag])\r\n .filter((label): label is string => !!label)\r\n .join(', ');\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n private navigateInsideCell({ event }: SuppressKeyboardEventParams<any>) {\r\n const GRID_CELL_CLASSNAME = \"ag-cell\";\r\n const { key, shiftKey } = event;\r\n const path = this.getEventPath(event);\r\n const isTabForward = key === \"Tab\" && shiftKey === false;\r\n const isTabBackward = key === \"Tab\" && shiftKey === true;\r\n let suppressEvent = false;\r\n // Handle cell children tabbing\r\n if (isTabForward || isTabBackward) {\r\n const eGridCell = path.find((el) => {\r\n if (el.classList === undefined) return false;\r\n return el.classList.contains(GRID_CELL_CLASSNAME);\r\n });\r\n if (!eGridCell) {\r\n return suppressEvent;\r\n }\r\n const focusableChildrenElements = getFocusables(eGridCell);\r\n const lastCellChildEl =\r\n focusableChildrenElements[focusableChildrenElements.length - 1];\r\n const firstCellChildEl = focusableChildrenElements[0];\r\n // Suppress keyboard event if tabbing forward within the cell and the current focused element is not the last child\r\n if (focusableChildrenElements.length === 0) {\r\n return false;\r\n }\r\n const currentIndex = focusableChildrenElements.indexOf(\r\n document.activeElement as HTMLElement,\r\n );\r\n if (isTabForward) {\r\n const isLastChildFocused =\r\n lastCellChildEl && document.activeElement === lastCellChildEl;\r\n if (!isLastChildFocused) {\r\n suppressEvent = true;\r\n if (currentIndex !== -1 || document.activeElement === eGridCell) {\r\n event.preventDefault();\r\n focusableChildrenElements[currentIndex + 1].focus();\r\n }\r\n }\r\n }\r\n // Suppress keyboard event if tabbing backwards within the cell, and the current focused element is not the first child\r\n else {\r\n const cellHasFocusedChildren =\r\n eGridCell.contains(document.activeElement) &&\r\n eGridCell !== document.activeElement;\r\n // Manually set focus to the last child element if cell doesn't have focused children\r\n if (!cellHasFocusedChildren) {\r\n lastCellChildEl.focus();\r\n // Cancel keyboard press, so that it doesn't focus on the last child and then pass through the keyboard press to\r\n // move to the 2nd last child element\r\n event.preventDefault();\r\n }\r\n const isFirstChildFocused =\r\n firstCellChildEl && document.activeElement === firstCellChildEl;\r\n if (!isFirstChildFocused) {\r\n suppressEvent = true;\r\n if (currentIndex !== -1 || document.activeElement === eGridCell) {\r\n event.preventDefault();\r\n focusableChildrenElements[currentIndex - 1].focus();\r\n }\r\n }\r\n }\r\n }\r\n return suppressEvent;\r\n }\r\n\r\n private getEventPath(event: Event): HTMLElement[] {\r\n const path: HTMLElement[] = [];\r\n let currentTarget: any = event.target;\r\n while (currentTarget) {\r\n path.push(currentTarget);\r\n currentTarget = currentTarget.parentElement;\r\n }\r\n return path;\r\n }\r\n}\r\n\r\ntype SelectionTrigger = 'checkbox' | 'click' | 'both';\r\n","import { Injectable } from '@angular/core';\r\nimport { EvaluateOptions, ProgrammabilityService } from '../services/programmability.service';\r\nimport { FormGroup } from '@angular/forms';\r\n\r\n@Injectable()\r\nexport class CacheContextService {\r\n\r\n constructor(\r\n private programmability: ProgrammabilityService) {\r\n }\r\n\r\n isExpression(text: string | null): boolean {\r\n return this.programmability.isExpression(text);\r\n }\r\n\r\n getExpression(text: string | null): string {\r\n return this.programmability.getExpression(text);\r\n }\r\n\r\n evaluateString(cacheControl: any, formGroup: FormGroup, value: string | null, options: EvaluateOptions = {}): string {\r\n if (this.isExpression(value)) {\r\n return this.call(cacheControl, value, () =>\r\n this.programmability.evaluateString(formGroup, value, this.getOptions(options))\r\n );\r\n }\r\n return value ?? \"\"; \r\n }\r\n\r\n evaluateBoolean(cacheControl: any, formGroup: FormGroup, value: boolean | string | null, options: EvaluateOptions = {}): boolean | null {\r\n if (typeof value === 'boolean') {\r\n return value;\r\n }\r\n else if (this.isExpression(value)) {\r\n return this.call(cacheControl, value, () => \r\n this.programmability.evaluateBoolean(formGroup, value, this.getOptions(options))\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n evaluateNumber(cacheControl: any, formGroup: FormGroup, value: number | string | null, options: EvaluateOptions = {}): number | null {\r\n if (typeof value === 'number') {\r\n return value;\r\n }\r\n else if (this.isExpression(value)) {\r\n return this.call(cacheControl, value, () =>\r\n this.programmability.evaluateNumber(formGroup, value, this.getOptions(options))\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n evaluate(cacheControl: any, formGroup: FormGroup, value: string | null, options: EvaluateOptions = {}): any {\r\n if (this.isExpression(value)) {\r\n return this.call(cacheControl, value, () =>\r\n this.programmability.evaluate(formGroup, value, this.getOptions(options))\r\n );\r\n }\r\n return value;\r\n }\r\n\r\n evaluateTemplate(cacheControl: any, formGroup: FormGroup, value: string | null, options: EvaluateOptions = {}): any {\r\n return this.call(cacheControl, value, () =>\r\n this.programmability.evaluateTemplate(formGroup, value, this.getOptions(options))\r\n );\r\n }\r\n\r\n evaluateUnary(cacheControl: any, formGroup: FormGroup, value: string | null, input: any, options: EvaluateOptions = {}): any {\r\n if (this.isExpression(value)) {\r\n return this.call(cacheControl, value, () =>\r\n this.programmability.evaluateUnary(formGroup, value, input, this.getOptions(options))\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n invalidate(cacheControl: any) {\r\n if (this.cache.has(cacheControl)) {\r\n this.cache.delete(cacheControl);\r\n }\r\n }\r\n\r\n invalidateAll() {\r\n this.cache = new WeakMap<object, Record<string, any>>();\r\n }\r\n\r\n private getOptions(options: EvaluateOptions): EvaluateOptions {\r\n return {\r\n ...options,\r\n cacheable: false\r\n };\r\n }\r\n\r\n private call(cacheControl: any, value: string | null, evaluate: () => any): any {\r\n\r\n if (value === null)\r\n return null;\r\n\r\n if (!this.cache.has(cacheControl)) {\r\n this.cache.set(cacheControl, {});\r\n }\r\n\r\n const cachedObject = this.cache.get(cacheControl)!;\r\n\r\n if (value in cachedObject) {\r\n return cachedObject[value];\r\n }\r\n\r\n const result: any = evaluate();\r\n\r\n cachedObject[value] = result;\r\n\r\n return result;\r\n }\r\n\r\n private cache = new WeakMap<object, Record<string, any>>();\r\n}\r\n","/**\r\n * TEMPORARY: conversion between the ag-grid filter / sort models and the models of the Sirio data\r\n * grid (`@wemake4u/form-controls`), used while ag-grid and the data grid coexist\r\n * (`DynamicFieldsComponent.useDataGrid`). Only `DataGridControl` and `rowsSourceToDataSource` use\r\n * it, so the existing form expressions (`setFilter` / `getFilter` / `setOrder` / `getOrder`) and\r\n * the `IRowsSource` data sources keep working with the data grid.\r\n *\r\n * To be removed, with the ag-grid types, when the forms use the data grid models directly.\r\n */\r\nimport type { FilterModel } from 'ag-grid-community';\r\nimport {\r\n SirioGridFilterCondition,\r\n SirioGridFilterOperator,\r\n SirioGridFilters,\r\n SirioGridFilterType,\r\n SirioGridRange,\r\n SirioGridSort,\r\n sirioGridFilterActive,\r\n sirioIsFilterCondition,\r\n} from '@wemake4u/form-controls';\r\n\r\n/** A column of the data grid as seen by the conversion: filter key and filter type. */\r\nexport interface AgGridModelColumn {\r\n /** Key of the column in the grid filters (unique also for columns on the same field, `data~2`). */\r\n key: string;\r\n /** Field of the column, the name known by a server source (default: the key). */\r\n field?: string;\r\n filter: SirioGridFilterType | null;\r\n}\r\n\r\n/** Sort model of `TableControl` (ag-grid column state). */\r\nexport interface AgGridOrderItem {\r\n colId: string;\r\n sort: 'asc' | 'desc';\r\n}\r\n\r\n/** ag-grid filter of one column (simple or combined with AND / OR). */\r\ntype AgFilter = Record<string, any>;\r\n\r\n/** ag-grid operators → data grid operators (same name when missing). */\r\nconst FROM_AG: Record<string, SirioGridFilterOperator> = {\r\n notEqual: 'notEquals',\r\n inRange: 'between',\r\n};\r\n\r\n/** Data grid operators → ag-grid operators, by filter type (same name when missing). */\r\nconst TO_AG: Partial<Record<SirioGridFilterOperator, string>> = {\r\n notEquals: 'notEqual',\r\n between: 'inRange',\r\n};\r\n\r\n/** Date of an ag-grid date filter ('yyyy-MM-dd HH:mm:ss') as 'yyyy-MM-dd'. */\r\nconst isoDay = (value: unknown): string | null =>\r\n typeof value === 'string' && value.length >= 10 ? value.slice(0, 10) : null;\r\n\r\n/** 'yyyy-MM-dd' as an ag-grid date ('yyyy-MM-dd 00:00:00'). */\r\nconst agDate = (value: unknown): string | null =>\r\n typeof value === 'string' && value.length >= 10 ? `${value.slice(0, 10)} 00:00:00` : null;\r\n\r\n/**\r\n * ag-grid filter model → data grid filters. Conditions combined with AND / OR cannot be represented\r\n * (one condition per column): an OR of \"equals\" on a select column becomes \"is one of\", the other\r\n * combinations keep only the first condition and are reported in the console.\r\n */\r\nexport function agFiltersToSirio(model: FilterModel | null | undefined, columns: readonly AgGridModelColumn[]): SirioGridFilters {\r\n const result: SirioGridFilters = {};\r\n if (!model) {\r\n return result;\r\n }\r\n for (const [key, filter] of Object.entries(model as Record<string, AgFilter>)) {\r\n const column = columns.find((c) => c.key === key);\r\n const condition = agFilterToCondition(filter, column?.filter ?? null, key);\r\n if (condition && sirioGridFilterActive(condition)) {\r\n result[key] = condition;\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nfunction agFilterToCondition(filter: AgFilter, type: SirioGridFilterType | null, key: string): SirioGridFilterCondition | null {\r\n if (!filter || typeof filter !== 'object') {\r\n return null;\r\n }\r\n if (Array.isArray(filter['conditions'])) {\r\n const conditions = filter['conditions'] as AgFilter[];\r\n if (filter['operator'] === 'OR' && conditions.every((c) => c?.['type'] === 'equals')) {\r\n return { operator: 'in', value: conditions.map((c) => c['filter']) };\r\n }\r\n console.warn(`[form-player] Data grid: the ${filter['operator']} filter of \"${key}\" keeps only its first condition.`);\r\n return conditions.length ? agFilterToCondition(conditions[0], type, key) : null;\r\n }\r\n const agType = String(filter['type'] ?? '');\r\n switch (agType) {\r\n case 'includeAll':\r\n case '':\r\n return null;\r\n case 'excludeAll':\r\n return { operator: 'in', value: [] };\r\n case 'true':\r\n return { operator: 'equals', value: true };\r\n case 'false':\r\n return { operator: 'equals', value: false };\r\n case 'blank':\r\n case 'notBlank':\r\n return { operator: agType };\r\n }\r\n const operator = (FROM_AG[agType] ?? agType) as SirioGridFilterOperator;\r\n if (filter['filterType'] === 'date') {\r\n const from = isoDay(filter['dateFrom']);\r\n const to = isoDay(filter['dateTo']);\r\n const dateOperator: SirioGridFilterOperator =\r\n agType === 'lessThan' ? 'before' : agType === 'greaterThan' ? 'after' : operator;\r\n return dateOperator === 'between' ? { operator: 'between', value: from, to } : { operator: dateOperator, value: from };\r\n }\r\n if (type === 'select' && operator === 'equals') {\r\n return { operator: 'in', value: [filter['filter']] };\r\n }\r\n return operator === 'between'\r\n ? { operator, value: filter['filter'] ?? null, to: filter['filterTo'] ?? null }\r\n : { operator, value: filter['filter'] ?? null };\r\n}\r\n\r\n/** Data grid filters → ag-grid filter model (the format of `TableControl.getFilter()`). */\r\nexport function sirioFiltersToAg(filters: SirioGridFilters, columns: readonly AgGridModelColumn[], byField = false): FilterModel {\r\n const result: Record<string, AgFilter> = {};\r\n for (const [key, value] of Object.entries(filters ?? {})) {\r\n if (!sirioGridFilterActive(value)) {\r\n continue;\r\n }\r\n const column = columns.find((c) => c.key === key);\r\n const filter = sirioValueToAg(value, column?.filter ?? 'text');\r\n // byField (server sources): keyed by the field; the model has one filter per field, the first\r\n // column on a field wins (e.g. a date shown as date and as time).\r\n const target = byField ? column?.field || key : key;\r\n if (filter && !(target in result)) {\r\n result[target] = filter;\r\n }\r\n }\r\n return result as FilterModel;\r\n}\r\n\r\nfunction sirioValueToAg(value: unknown, type: SirioGridFilterType): AgFilter | null {\r\n const condition: SirioGridFilterCondition = sirioIsFilterCondition(value) ? value : simpleToCondition(value, type);\r\n const { operator } = condition;\r\n if (operator === 'blank' || operator === 'notBlank') {\r\n return { filterType: agFilterType(type, null), type: operator };\r\n }\r\n if (type === 'boolean') {\r\n return { filterType: 'text', type: condition.value ? 'true' : 'false' };\r\n }\r\n if (operator === 'in' || operator === 'notIn') {\r\n const values = Array.isArray(condition.value) ? condition.value : [condition.value];\r\n const conditions = values.map((v) => ({ filterType: agFilterType(type, v), type: operator === 'in' ? 'equals' : 'notEqual', filter: v }));\r\n if (conditions.length === 1) {\r\n return conditions[0];\r\n }\r\n return { filterType: conditions[0]?.filterType ?? 'text', operator: operator === 'in' ? 'OR' : 'AND', conditions };\r\n }\r\n if (type === 'date') {\r\n const agType = operator === 'before' ? 'lessThan' : operator === 'after' ? 'greaterThan' : (TO_AG[operator] ?? operator);\r\n return {\r\n filterType: 'date',\r\n type: agType,\r\n dateFrom: agDate(condition.value),\r\n dateTo: operator === 'between' ? agDate(condition.to) : null,\r\n };\r\n }\r\n const filter: AgFilter = { filterType: agFilterType(type, condition.value), type: TO_AG[operator] ?? operator, filter: condition.value };\r\n if (operator === 'between') {\r\n filter['filterTo'] = condition.to;\r\n }\r\n return filter;\r\n}\r\n\r\n/** Simple value of a filter without operators → the equivalent condition. */\r\nfunction simpleToCondition(value: unknown, type: SirioGridFilterType): SirioGridFilterCondition {\r\n if (Array.isArray(value)) {\r\n return { operator: 'in', value };\r\n }\r\n if (typeof value === 'boolean') {\r\n return { operator: 'equals', value };\r\n }\r\n if (value && typeof value === 'object') {\r\n const range = value as SirioGridRange;\r\n const hasFrom = sirioGridFilterActive(range.from);\r\n const hasTo = sirioGridFilterActive(range.to);\r\n if (hasFrom && hasTo) {\r\n return { operator: 'between', value: range.from, to: range.to };\r\n }\r\n if (type === 'date') {\r\n return hasFrom ? { operator: 'after', value: range.from } : { operator: 'before', value: range.to };\r\n }\r\n return hasFrom ? { operator: 'greaterThanOrEqual', value: range.from } : { operator: 'lessThanOrEqual', value: range.to };\r\n }\r\n return type === 'select' ? { operator: 'in', value: [value] } : { operator: type === 'text' ? 'contains' : 'equals', value };\r\n}\r\n\r\nfunction agFilterType(type: SirioGridFilterType, value: unknown): string {\r\n switch (type) {\r\n case 'number':\r\n return 'number';\r\n case 'date':\r\n return 'date';\r\n case 'select':\r\n return typeof value === 'number' ? 'number' : 'text';\r\n default:\r\n return 'text';\r\n }\r\n}\r\n\r\n/** ag-grid sort model of `TableControl` → data grid sort. */\r\nexport function agOrderToSirio(order: readonly AgGridOrderItem[] | null | undefined): SirioGridSort[] {\r\n return (order ?? [])\r\n .filter((o) => o && (o.sort === 'asc' || o.sort === 'desc'))\r\n .map((o) => ({ field: o.colId, direction: o.sort }));\r\n}\r\n\r\n/** Data grid sort → ag-grid sort model of `TableControl`. */\r\nexport function sirioSortToAg(sort: readonly SirioGridSort[]): AgGridOrderItem[] {\r\n return sort.map((s) => ({ colId: s.field, sort: s.direction }));\r\n}\r\n","/**\r\n * TEMPORARY: an `IRowsSource` (ag-grid infinite row model: `ODataSource`, custom sources) used as\r\n * the data source of the Sirio data grid while ag-grid and the data grid coexist. The query of the\r\n * grid becomes the `IGetRowsParams` of ag-grid (rows range, sort model, filter model), the callbacks\r\n * become the page `{ rows, total }`.\r\n *\r\n * To be removed when the data sources use the data grid query (`SirioGridQuery`) directly.\r\n */\r\nimport { Signal, signal } from '@angular/core';\r\nimport type { IGetRowsParams } from 'ag-grid-community';\r\nimport { SirioGridDataSource, SirioGridQuery, SirioGridResult } from '@wemake4u/form-controls';\r\nimport { IRowsSource } from './interfaces';\r\nimport { AgGridModelColumn, sirioFiltersToAg, sirioSortToAg } from './ag-grid-model';\r\n\r\n/** Rows requested when the grid is not paged (ag-grid default block size). */\r\nconst UNPAGED_BLOCK = 100;\r\n\r\n/** True for an object with the `getRows` method of `IRowsSource`. */\r\nexport function isRowsSource(value: unknown): value is IRowsSource {\r\n return !!value && typeof (value as IRowsSource).getRows === 'function';\r\n}\r\n\r\n/** Data source of the data grid on an `IRowsSource`, with the paging found from its answers. */\r\nexport interface RowsSourceDataSource<T = any> {\r\n dataSource: SirioGridDataSource<T>;\r\n /**\r\n * Page size of a source that pages its rows, found from the first answer of a grid without\r\n * `rowCount` (null while not found): a total greater than the rows received, or a full block\r\n * without total. Once found it stays (a filter with fewer rows does not hide the paginator).\r\n */\r\n pagedSize: Signal<number | null>;\r\n}\r\n\r\n/**\r\n * Data source of the data grid reading the pages from an `IRowsSource`. `columns` gives the filter\r\n * types of the columns (to build the ag-grid filter model).\r\n */\r\nexport function rowsSourceToDataSource<T = any>(\r\n source: IRowsSource,\r\n columns: () => readonly AgGridModelColumn[],\r\n): RowsSourceDataSource<T> {\r\n const pagedSize = signal<number | null>(null);\r\n // Answer of the request that found the paging: the paged grids ask the same rows again at once\r\n // (first page, same sort and filters), they are given back without a second request. Kept for the\r\n // grids rendered together on the same source (the same change detection), then dropped.\r\n let reuse: { key: string; result: SirioGridResult<T>; dropping?: boolean } | null = null;\r\n const keyOf = (offset: number, size: number, query: SirioGridQuery) =>\r\n JSON.stringify([offset, size, query.sort, query.filters]);\r\n\r\n const dataSource: SirioGridDataSource<T> = (query: SirioGridQuery) => {\r\n const paged = query.pageSize > 0;\r\n const size = paged ? query.pageSize : UNPAGED_BLOCK;\r\n const key = keyOf(query.offset, size, query);\r\n if (reuse) {\r\n const kept = reuse;\r\n if (paged && kept.key === key) {\r\n if (!kept.dropping) {\r\n kept.dropping = true;\r\n setTimeout(() => reuse === kept && (reuse = null));\r\n }\r\n return Promise.resolve(kept.result);\r\n }\r\n reuse = null;\r\n }\r\n return new Promise<SirioGridResult<T>>((resolve, reject) => {\r\n const params = {\r\n startRow: query.offset,\r\n endRow: query.offset + size,\r\n sortModel: sirioSortToAg(query.sort),\r\n filterModel: sirioFiltersToAg(query.filters, columns(), true),\r\n context: undefined,\r\n successCallback: (rows: any[], lastRow?: number) => {\r\n const list = Array.isArray(rows) ? (rows as T[]) : [];\r\n const total = typeof lastRow === 'number' && lastRow >= 0 ? lastRow : null;\r\n const result: SirioGridResult<T> = { rows: list, total };\r\n if (!paged && pagedSize() === null) {\r\n const more = total !== null ? total > list.length : list.length >= size;\r\n if (more && list.length > 0) {\r\n // Fewer rows than asked with a greater total: the server has its own page size.\r\n const found = Math.min(size, list.length);\r\n reuse = { key: keyOf(0, found, query), result };\r\n // A synchronous source answers inside the request of the grid: written after it.\r\n queueMicrotask(() => pagedSize.set(found));\r\n }\r\n }\r\n resolve(result);\r\n },\r\n failCallback: () => reject(new Error('Data source error')),\r\n } as unknown as IGetRowsParams;\r\n try {\r\n source.getRows(params);\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n };\r\n return { dataSource, pagedSize };\r\n}\r\n","import { Injectable, Signal, Type, WritableSignal, signal } from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { isObservable, take } from 'rxjs';\r\nimport {\r\n SirioGridAlign,\r\n SirioGridCellClass,\r\n SirioGridCellStyle,\r\n SirioGridClass,\r\n SirioGridDataSource,\r\n SirioGridFilterOperator,\r\n SirioGridFilterType,\r\n SirioGridFixed,\r\n SirioGridRowClass,\r\n SirioGridRowStyle,\r\n SirioGridSelection,\r\n SirioGridStyle,\r\n SirioOption,\r\n sirioGridClassText,\r\n sirioGridStyleObject,\r\n} from '@wemake4u/form-controls';\r\nimport { ObjectURLRendererComponent } from '../components/objectURLRenderer/objectURLRenderer.component';\r\nimport { DeleteRowRendererComponent } from '../components/deleteRowRenderer/deleteRowRenderer.component';\r\nimport { ActionsCellRendererComponent } from '../components/actionsCellRenderer/actionsCellRenderer.component';\r\nimport { HostCellRendererComponent } from '../components/hostCellRenderer/hostCellRenderer.component';\r\nimport { FormatterService } from './formatter.service';\r\nimport { MarkdownService } from './markdown.service';\r\nimport { ProgrammabilityService } from './programmability.service';\r\nimport { MetadataService } from './metadata.service';\r\nimport { CacheContextService } from './cache.service';\r\nimport { LanguageService } from '@wemake4u/interact';\r\nimport { Texts } from '../locale/locale';\r\nimport { localize } from '../locale/localize';\r\nimport { isRecord, isLabeledRecord, isNumericKey } from '../common/record';\r\nimport { getLabelSymbol } from '../common/symbols';\r\nimport { AgGridModelColumn } from '../dataSources/ag-grid-model';\r\nimport { isRowsSource, rowsSourceToDataSource } from '../dataSources/rows-source-adapter';\r\n\r\ntype MapType = Record<string | number, string> | null;\r\n\r\n/** Rows in memory: no paging found from a server. */\r\nconst NO_PAGED_SIZE: Signal<number | null> = signal(null).asReadonly();\r\n\r\n/** Content of a data grid cell other than its text: an ag-grid renderer component or HTML. */\r\nexport type SirioGridCellRenderer =\r\n | { kind: 'component'; type: Type<any>; params: (row: any, value: unknown, index: number) => Record<string, any> }\r\n | { kind: 'html'; html: (row: any, value: unknown) => string };\r\n\r\n/** A column of the form JSON as inputs of `wm-sirio-grid-column`. */\r\nexport interface SirioGridColumnConfig {\r\n id: string;\r\n field: string;\r\n header: string;\r\n value: ((row: any) => unknown) | null;\r\n format: ((value: unknown, row: any) => string) | null;\r\n align: SirioGridAlign | null;\r\n filter: SirioGridFilterType | null;\r\n filterOptions: SirioOption[];\r\n filterMultiple: boolean;\r\n filterOperators: boolean | SirioGridFilterOperator[] | null;\r\n sortable: boolean;\r\n resizable: boolean;\r\n /** Text on more lines (`autoHeight` of the column, as ag-grid `wrapText`); otherwise one line. */\r\n wrap: boolean;\r\n /**\r\n * Kit numbers font: false for a column with a map (labels, not numbers), true for the numeric and\r\n * date / time data types (their values may be strings, e.g. ISO dates, that the grid does not see as\r\n * dates), else the grid default.\r\n */\r\n mono: boolean | null;\r\n /** As wide as the content (the actions column: its buttons), no share of the free room. */\r\n fit: boolean;\r\n fixed: SirioGridFixed | null;\r\n flex: number | null;\r\n width: string | null;\r\n minWidth: number;\r\n maxWidth: number | null;\r\n group: string | null;\r\n cellClass: SirioGridCellClass<any>;\r\n cellStyle: SirioGridCellStyle<any>;\r\n headerClass: SirioGridClass;\r\n headerStyle: SirioGridStyle;\r\n renderer: SirioGridCellRenderer | null;\r\n /** The actions column (hidden by `suppressActions`). */\r\n actions: boolean;\r\n}\r\n\r\n/** A `table` component of the form as inputs of `wm-sirio-data-grid`. */\r\nexport interface SirioGridConfig {\r\n /** The JSON columns the configuration was built from. */\r\n source: unknown;\r\n columns: SirioGridColumnConfig[];\r\n /** Filter keys and types, for the ag-grid model conversion (`DataGridControl`, `IRowsSource`). */\r\n modelColumns: AgGridModelColumn[];\r\n rowId: string | null;\r\n /** Checkbox / radio column (`selectionTrigger` \"checkbox\" or \"both\"). */\r\n checkboxes: boolean;\r\n /** A click on the row selects it (`selectionTrigger` \"click\" or \"both\"). */\r\n clickSelect: boolean;\r\n rowSelectable: ((row: any) => boolean) | null;\r\n rowClass: SirioGridRowClass<any>;\r\n rowStyle: SirioGridRowStyle<any>;\r\n /**\r\n * Paged grid: `rowCount` is a number greater than 0 (also with a server source). Without it a server\r\n * source that pages its rows shows the paginator too (`SirioGridRows.pagedSize`).\r\n */\r\n pageable: boolean;\r\n pageSize: number;\r\n rowNumbers: boolean;\r\n reorderable: boolean;\r\n resizable: boolean;\r\n /** Selected rows (`[selected]` of the grid, `rowSelected` for the initial selection). */\r\n selected: WritableSignal<readonly any[]>;\r\n}\r\n\r\n/** Rows of a `table` component: in memory (array / Observable) or from a server source (`IRowsSource`). */\r\nexport interface SirioGridRows {\r\n data: Signal<readonly any[] | null>;\r\n dataSource: SirioGridDataSource<any> | null;\r\n loading: Signal<boolean>;\r\n failed: Signal<boolean>;\r\n /** Page size of a server source found paging its rows (paginator without `rowCount`), else null. */\r\n pagedSize: Signal<number | null>;\r\n}\r\n\r\n/**\r\n * Configuration of the Sirio data grid (`@wemake4u/form-controls`) for the `table` components of the\r\n * form, the counterpart of `GridService` (ag-grid) while the two grids coexist\r\n * (`DynamicFieldsComponent.useDataGrid`). The form JSON is the same: columns, data types, maps,\r\n * renderers, filters, selection, styles.\r\n */\r\n@Injectable()\r\nexport class SirioGridService {\r\n constructor(\r\n private formatter: FormatterService,\r\n private languageService: LanguageService,\r\n private programmability: ProgrammabilityService,\r\n private metadata: MetadataService,\r\n private markdownService: MarkdownService,\r\n ) {}\r\n\r\n /** Rows state by row source (array, Observable or `IRowsSource`). */\r\n private readonly rowsCache = new WeakMap<object, SirioGridRows>();\r\n\r\n /** Class rules already reported as not supported (one warning each). */\r\n private readonly warnedRules = new Set<string>();\r\n\r\n getCacheKey(): string {\r\n return `getSirioGrid_${this.language}`;\r\n }\r\n\r\n /** Configuration of a table (columns from the JSON or from `columnsExpression`). */\r\n getConfig(component: any, columns: any, formGroup: FormGroup): SirioGridConfig {\r\n const list: any[] = Array.isArray(columns) ? columns : [];\r\n const columnConfigs = list.map((column, index) => this.createColumn(column, index, formGroup));\r\n // Unique ids (the same key can be shown twice, e.g. a date as date and as time).\r\n const used = new Set<string>();\r\n for (const config of columnConfigs) {\r\n let id = config.id;\r\n for (let n = 2; used.has(id); n++) {\r\n id = `${config.id}~${n}`;\r\n }\r\n used.add(id);\r\n config.id = id;\r\n }\r\n if (this.hasActions(component)) {\r\n columnConfigs.push(this.createActionsColumn(component, formGroup));\r\n }\r\n const trigger = this.selectionTrigger(component);\r\n const rowCount = typeof component.rowCount === 'number' && component.rowCount > 0 ? component.rowCount : null;\r\n const selectableCache = new WeakMap<object, boolean>();\r\n return {\r\n source: columns,\r\n columns: columnConfigs,\r\n // Filter keys as the data grid: the unique column ids (`data`, `data~2`), with the field for the server.\r\n modelColumns: columnConfigs.filter((c) => !c.actions).map((c) => ({ key: c.id, field: c.field, filter: c.filter })),\r\n rowId: typeof component.rowId === 'string' && component.rowId.trim() !== '' ? component.rowId : null,\r\n checkboxes: trigger !== 'click',\r\n clickSelect: trigger !== 'checkbox',\r\n rowSelectable: component.rowSelectable\r\n ? (row: any) => {\r\n if (!row || typeof row !== 'object') {\r\n return false;\r\n }\r\n if (!selectableCache.has(row)) {\r\n selectableCache.set(row, this.rowCallback(formGroup, component.rowSelectable, row));\r\n }\r\n return selectableCache.get(row)!;\r\n }\r\n : null,\r\n rowClass: this.rowClassOf(component, formGroup),\r\n rowStyle: this.rowStyleOf(component, formGroup),\r\n pageable: rowCount !== null,\r\n pageSize: rowCount ?? 100,\r\n rowNumbers: !!component.rowNumbers,\r\n reorderable: list.some((c) => c?.move === true),\r\n resizable: list.some((c) => c?.resize === true),\r\n selected: signal<readonly any[]>([]),\r\n };\r\n }\r\n\r\n /**\r\n * Rows of a row source: an array as it is, an Observable as an array once received (first value,\r\n * as the ag-grid directive), an `IRowsSource` as a server data source of the grid.\r\n */\r\n getRows(source: unknown, config: SirioGridConfig, onData: (rows: readonly any[]) => void): SirioGridRows {\r\n if (!source || typeof source !== 'object') {\r\n return this.staticRows([]);\r\n }\r\n const cached = this.rowsCache.get(source);\r\n if (cached) {\r\n return cached;\r\n }\r\n let rows: SirioGridRows;\r\n if (Array.isArray(source)) {\r\n rows = this.staticRows(source);\r\n onData(source);\r\n } else if (isRowsSource(source)) {\r\n const { dataSource, pagedSize } = rowsSourceToDataSource(source, () => config.modelColumns);\r\n rows = {\r\n data: signal(null),\r\n dataSource,\r\n loading: signal(false),\r\n failed: signal(false),\r\n pagedSize,\r\n };\r\n } else if (isObservable(source)) {\r\n // getRows runs while the template renders: a synchronous result (`of(...)`) initializes the\r\n // signals, only an asynchronous one writes them.\r\n let sync = true;\r\n let initial: { list: readonly any[] | null; failed: boolean; done: boolean } = { list: null, failed: false, done: false };\r\n let state: SirioGridRows | null = null;\r\n const receive = (list: readonly any[] | null, failedLoad: boolean) => {\r\n if (sync || !state) {\r\n initial = { list, failed: failedLoad, done: true };\r\n } else {\r\n (state.data as WritableSignal<readonly any[] | null>).set(list);\r\n (state.loading as WritableSignal<boolean>).set(false);\r\n (state.failed as WritableSignal<boolean>).set(failedLoad);\r\n }\r\n };\r\n source.pipe(take(1)).subscribe({\r\n next: (value) => {\r\n const list = Array.isArray(value) ? value : [];\r\n receive(list, false);\r\n onData(list);\r\n },\r\n error: () => receive([], true),\r\n complete: () => {\r\n if (!sync && state) {\r\n (state.loading as WritableSignal<boolean>).set(false);\r\n } else if (!initial.done) {\r\n initial = { list: [], failed: false, done: true };\r\n }\r\n },\r\n });\r\n sync = false;\r\n state = {\r\n data: signal<readonly any[] | null>(initial.list),\r\n dataSource: null,\r\n loading: signal(!initial.done),\r\n failed: signal(initial.failed),\r\n pagedSize: NO_PAGED_SIZE,\r\n };\r\n rows = state;\r\n } else {\r\n rows = this.staticRows([]);\r\n }\r\n this.rowsCache.set(source, rows);\r\n return rows;\r\n }\r\n\r\n /** `selectionChanged` expression of the table, with `event.selectedRows`. */\r\n onSelectionChanged(component: any, formGroup: FormGroup, selectedRows: readonly any[]): void {\r\n if (component.selectionChanged) {\r\n const event = { selectedRows: [...selectedRows] };\r\n this.programmability.evaluate(formGroup, component.selectionChanged, {\r\n cacheable: false,\r\n extendContext: () => ({ event }),\r\n invokeArgs: [event],\r\n });\r\n }\r\n }\r\n\r\n /** Rows initially selected by the `rowSelected` expression (selectable tables). */\r\n initialSelection(component: any, formGroup: FormGroup, selection: SirioGridSelection, rows: readonly any[]): any[] | null {\r\n if (!component.rowSelected || selection === 'none') {\r\n return null;\r\n }\r\n const selected = rows.filter((row) => row && this.rowCallback(formGroup, component.rowSelected, row));\r\n return selection === 'single' ? selected.slice(0, 1) : selected;\r\n }\r\n\r\n // ---- Columns ------------------------------------------------------------------------------------\r\n\r\n private createColumn(column: any, index: number, formGroup: FormGroup): SirioGridColumnConfig {\r\n const dataType: string = typeof column.dataType === 'string' ? column.dataType.trim() : '';\r\n const map = this.getMap(column, dataType, formGroup);\r\n const numeric = ['number', 'integer', 'decimal', 'currency', 'percentage'].includes(dataType);\r\n const config: SirioGridColumnConfig = {\r\n id: String(column.key ?? `column-${index}`),\r\n field: column.key ?? '',\r\n header: this.locale(column, 'label'),\r\n value: this.callbackOf(formGroup, column.valueGetter),\r\n format: this.formatOf(dataType, map),\r\n align: this.alignOf(column.align) ?? (numeric && !map ? 'end' : null),\r\n filter: null,\r\n filterOptions: [],\r\n filterMultiple: false,\r\n filterOperators: null,\r\n sortable: column.sort === true,\r\n resizable: column.resize === true,\r\n wrap: column.autoHeight === true,\r\n mono: map ? false : numeric || ['date', 'dateTime', 'time'].includes(dataType) ? true : null,\r\n fit: false,\r\n fixed: column.pinned === 'left' || column.pinned === 'right' ? column.pinned : null,\r\n flex: column.flex === true ? 1 : null,\r\n width: typeof column.width === 'number' ? `${column.width}px` : null,\r\n minWidth: typeof column.minWidth === 'number' ? column.minWidth : 60,\r\n maxWidth: typeof column.maxWidth === 'number' ? column.maxWidth : null,\r\n group: typeof column.group === 'string' && column.group.trim() ? column.group : null,\r\n cellClass: this.cellClassOf(column, formGroup),\r\n cellStyle: this.cellStyleOf(column, formGroup),\r\n headerClass: this.staticStyle(formGroup, column.headerClass, (fn) => sirioGridClassText(fn({ colDef: { field: column.key } }))),\r\n headerStyle: this.staticStyle(formGroup, column.headerStyle, (fn) => sirioGridStyleObject(fn({ colDef: { field: column.key } }))),\r\n renderer: this.rendererOf(column, dataType, formGroup),\r\n actions: false,\r\n };\r\n if (dataType === 'component' || dataType === 'template') {\r\n // As the `cell-component` cells of ag-grid: the hosted component uses the whole cell.\r\n config.cellStyle = this.withPadding(config.cellStyle, '1px');\r\n }\r\n if (column.filter === true) {\r\n this.setFilter(config, dataType, map);\r\n }\r\n return config;\r\n }\r\n\r\n private setFilter(config: SirioGridColumnConfig, dataType: string, map: MapType): void {\r\n if (map) {\r\n // ag-grid set filter: the values of the map.\r\n config.filter = 'select';\r\n config.filterMultiple = true;\r\n config.filterOptions = Object.entries(map).map(([key, label]) => ({ value: this.parseKey(key), label }));\r\n config.filterOperators = ['in'];\r\n return;\r\n }\r\n switch (dataType) {\r\n case 'number':\r\n case 'integer':\r\n case 'decimal':\r\n case 'currency':\r\n case 'percentage':\r\n config.filter = 'number';\r\n break;\r\n case 'date':\r\n case 'dateTime':\r\n config.filter = 'date';\r\n break;\r\n case 'boolean':\r\n config.filter = 'boolean';\r\n break;\r\n case 'uuid':\r\n config.filter = 'text';\r\n config.filterOperators = ['equals', 'notEquals'];\r\n break;\r\n default:\r\n config.filter = 'text';\r\n }\r\n }\r\n\r\n private createActionsColumn(component: any, formGroup: FormGroup): SirioGridColumnConfig {\r\n const cacheContext = new CacheContextService(this.programmability);\r\n const params = this.paramsCache((row, _value, index) => ({\r\n component,\r\n formGroup,\r\n data: row,\r\n node: { rowIndex: index },\r\n api: { getGridOption: () => ({ cacheContext }) },\r\n }));\r\n return {\r\n id: '__fp-actions',\r\n field: '',\r\n header: this.locale(Texts, 'Actions'),\r\n value: null,\r\n format: null,\r\n align: null,\r\n filter: null,\r\n filterOptions: [],\r\n filterMultiple: false,\r\n filterOperators: null,\r\n sortable: false,\r\n resizable: false,\r\n wrap: true, // no overflow clipping of the action buttons\r\n mono: null,\r\n fit: true,\r\n fixed: 'right',\r\n flex: null,\r\n width: null,\r\n minWidth: 60,\r\n maxWidth: null,\r\n group: null,\r\n cellClass: null,\r\n cellStyle: null,\r\n headerClass: null,\r\n headerStyle: null,\r\n renderer: { kind: 'component', type: ActionsCellRendererComponent, params },\r\n actions: true,\r\n };\r\n }\r\n\r\n /** Text of a cell for the data types of the form (same formats as the ag-grid data types). */\r\n private formatOf(dataType: string, map: MapType): ((value: unknown, row: any) => string) | null {\r\n if (map) {\r\n return (value) => this.formatMap(value, map);\r\n }\r\n const empty = (fn: (value: any) => string) => (value: unknown) => (value === null || value === undefined ? '' : fn(value));\r\n switch (dataType) {\r\n case 'date':\r\n return empty((v) => this.formatter.formatDate(v));\r\n case 'dateTime':\r\n return empty((v) => this.formatter.formatDateTime(v));\r\n case 'time':\r\n return empty((v) => this.formatter.formatTime(v));\r\n case 'currency':\r\n return empty((v) => this.formatter.formatCurrency(v));\r\n case 'decimal':\r\n return empty((v) => this.formatter.formatNumber(v));\r\n case 'integer':\r\n return empty((v) => this.formatter.formatNumber(v, 0));\r\n case 'percentage':\r\n return empty((v) => `${Math.round(Number(v) * 100)}%`);\r\n case 'boolean':\r\n return empty((v) => (v === true ? this.locale(Texts, 'True') : v === false ? this.locale(Texts, 'False') : String(v)));\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n private rendererOf(column: any, dataType: string, formGroup: FormGroup): SirioGridCellRenderer | null {\r\n if (column.format === 'objectURL') {\r\n return { kind: 'component', type: ObjectURLRendererComponent, params: this.paramsCache((row, value, index) => ({ data: row, value, node: { rowIndex: index } })) };\r\n }\r\n if (column.format === 'deleteRow') {\r\n return { kind: 'component', type: DeleteRowRendererComponent, params: this.paramsCache((row, value, index) => ({ data: row, value, node: { rowIndex: index } })) };\r\n }\r\n if (dataType === 'formatted') {\r\n return { kind: 'html', html: (_row, value) => String(this.markdownService.toHtml(value as any) ?? '') };\r\n }\r\n if (dataType === 'component') {\r\n return {\r\n kind: 'component',\r\n type: HostCellRendererComponent,\r\n params: this.paramsCache((row, value, index) => ({\r\n componentType: column.component,\r\n properties: column.properties,\r\n formGroup,\r\n data: row,\r\n value,\r\n node: { rowIndex: index },\r\n })),\r\n };\r\n }\r\n if (dataType === 'template') {\r\n const template = this.metadata.getTemplateByName(column.template);\r\n if (template) {\r\n return {\r\n kind: 'component',\r\n type: HostCellRendererComponent,\r\n params: this.paramsCache((row, value, index) => ({\r\n componentType: 'form-host',\r\n properties: { schema: template, showNav: false, showProgress: false, showNavButton: false, showFormTitle: false },\r\n onPropertiesResolved: (_props: Record<string, any>, params: any) => ({ value: params.data }),\r\n formGroup,\r\n data: row,\r\n value,\r\n node: { rowIndex: index },\r\n })),\r\n };\r\n }\r\n }\r\n if (dataType === 'custom') {\r\n const render = this.callbackOf(formGroup, column.customRenderer);\r\n if (render) {\r\n return { kind: 'html', html: (row) => String(render(row) ?? '') };\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /** Renderer parameters by row and column, stable while the row object stays the same. */\r\n private paramsCache(build: (row: any, value: unknown, index: number) => Record<string, any>) {\r\n const cache = new WeakMap<object, { index: number; value: unknown; params: Record<string, any> }>();\r\n return (row: any, value: unknown, index: number) => {\r\n if (!row || typeof row !== 'object') {\r\n return build(row, value, index);\r\n }\r\n const cached = cache.get(row);\r\n if (cached && cached.index === index && cached.value === value) {\r\n return cached.params;\r\n }\r\n const params = build(row, value, index);\r\n cache.set(row, { index, value, params });\r\n return params;\r\n };\r\n }\r\n\r\n // ---- Styles -------------------------------------------------------------------------------------\r\n\r\n /** `rowClass` (static or function of the ag-grid row params) and `rowClassRules`. */\r\n private rowClassOf(component: any, formGroup: FormGroup): SirioGridRowClass<any> {\r\n const rowClass = this.evaluateValue(formGroup, component.rowClass);\r\n const rules = this.evaluateValue(formGroup, component.rowClassRules);\r\n if (!rowClass && !rules) {\r\n return null;\r\n }\r\n return (row: any, index: number) => {\r\n const params = { data: row, rowIndex: index, node: { rowIndex: index, data: row } };\r\n const base = sirioGridClassText(typeof rowClass === 'function' ? rowClass(params) : rowClass);\r\n const extra = rules ? sirioGridClassText(this.applyRules(rules, params)) : '';\r\n return [base, extra].filter(Boolean).join(' ');\r\n };\r\n }\r\n\r\n /** `rowStyle` (static or function of the ag-grid row params). */\r\n private rowStyleOf(component: any, formGroup: FormGroup): SirioGridRowStyle<any> {\r\n const rowStyle = this.evaluateValue(formGroup, component.rowStyle);\r\n if (!rowStyle) {\r\n return null;\r\n }\r\n return typeof rowStyle === 'function'\r\n ? (row: any, index: number) => rowStyle({ data: row, rowIndex: index, node: { rowIndex: index, data: row } })\r\n : rowStyle;\r\n }\r\n\r\n /** `cellClass` (static or function of the ag-grid cell params) and `cellClassRules`. */\r\n private cellClassOf(column: any, formGroup: FormGroup): SirioGridCellClass<any> {\r\n const cellClass = this.evaluateValue(formGroup, column.cellClass);\r\n const rules = this.evaluateValue(formGroup, column.cellClassRules);\r\n if (!cellClass && !rules) {\r\n return null;\r\n }\r\n return (row: any, value: unknown) => {\r\n const params = { data: row, value, colDef: { field: column.key } };\r\n const base = sirioGridClassText(typeof cellClass === 'function' ? cellClass(params) : cellClass);\r\n const extra = rules ? sirioGridClassText(this.applyRules(rules, params)) : '';\r\n return [base, extra].filter(Boolean).join(' ');\r\n };\r\n }\r\n\r\n /** A cell style with the given padding first (the style of the column can still change it). */\r\n private withPadding(style: SirioGridCellStyle<any>, padding: string): SirioGridCellStyle<any> {\r\n if (typeof style === 'function') {\r\n return (row: any, value: unknown) => ({ padding, ...sirioGridStyleObject(style(row, value)) });\r\n }\r\n return { padding, ...sirioGridStyleObject(style) };\r\n }\r\n\r\n /** `cellStyle` (static or function of the ag-grid cell params). */\r\n private cellStyleOf(column: any, formGroup: FormGroup): SirioGridCellStyle<any> {\r\n const cellStyle = this.evaluateValue(formGroup, column.cellStyle);\r\n if (!cellStyle) {\r\n return null;\r\n }\r\n return typeof cellStyle === 'function'\r\n ? (row: any, value: unknown) => cellStyle({ data: row, value, colDef: { field: column.key } })\r\n : cellStyle;\r\n }\r\n\r\n /**\r\n * ag-grid class rules `{ classe: (params) => boolean }` → `{ classe: condizione }`. A rule can be a\r\n * function or a FEEL function of the context (`{ \"classe\": function(p) p.data.id = 3 }`).\r\n */\r\n private applyRules(rules: any, params: any): Record<string, boolean> {\r\n const result: Record<string, boolean> = {};\r\n if (rules && typeof rules === 'object') {\r\n for (const [name, rule] of Object.entries(rules)) {\r\n if (typeof rule === 'function') {\r\n result[name] = !!rule(params);\r\n } else if (typeof (rule as any)?.invoke === 'function') {\r\n result[name] = (rule as any).invoke([params]) === true;\r\n } else if (typeof rule === 'boolean') {\r\n result[name] = rule;\r\n } else if (rule !== null && rule !== undefined && !this.warnedRules.has(name)) {\r\n // ag-grid expression strings are not evaluated by the data grid.\r\n this.warnedRules.add(name);\r\n console.warn(`[form-player] Data grid: the class rule \"${name}\" must be a function.`);\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n\r\n /** A header class / style: static, or a function called once (no per-header params in the data grid). */\r\n private staticStyle<V>(formGroup: FormGroup, expression: any, call: (fn: (params: any) => any) => V): any {\r\n const value = this.evaluateValue(formGroup, expression);\r\n return typeof value === 'function' ? call(value) : (value ?? null);\r\n }\r\n\r\n // ---- Helpers ------------------------------------------------------------------------------------\r\n\r\n private get language(): string {\r\n return this.languageService.getLanguage();\r\n }\r\n\r\n private locale(source: any, key: string): string {\r\n return localize(this.language, source, key);\r\n }\r\n\r\n private hasActions(component: any): boolean {\r\n return Array.isArray(component.actions) && component.actions.length > 0;\r\n }\r\n\r\n private evaluateValue(formGroup: FormGroup, expression: any): any {\r\n return expression ? this.programmability.evaluate(formGroup, expression) : null;\r\n }\r\n\r\n\r\n /** An expression giving a function of the row data (as `applyExpression` of `GridService`). */\r\n private callbackOf(formGroup: FormGroup, expression: any): ((row: any) => any) | null {\r\n if (!expression) {\r\n return null;\r\n }\r\n const value = this.programmability.evaluate(formGroup, expression);\r\n return typeof value === 'function' ? (row: any) => value(row) : () => value;\r\n }\r\n\r\n /** `rowSelectable` / `rowSelected` expression for a row (`event.data`). */\r\n private rowCallback(formGroup: FormGroup, expression: any, row: any): boolean {\r\n const event = { data: row };\r\n const result = this.programmability.evaluate(formGroup, expression, {\r\n cacheable: false,\r\n extendContext: () => ({ event }),\r\n invokeArgs: [event],\r\n });\r\n return result === true;\r\n }\r\n\r\n private selectionTrigger(component: any): 'checkbox' | 'click' | 'both' {\r\n const value = component.selectionTrigger;\r\n const trigger = typeof value === 'string' ? value.trim().toLowerCase() : '';\r\n return trigger === 'click' || trigger === 'both' ? trigger : 'checkbox';\r\n }\r\n\r\n private alignOf(align: any): SirioGridAlign | null {\r\n return align === 'left' ? 'start' : align === 'center' ? 'center' : align === 'right' ? 'end' : null;\r\n }\r\n\r\n private staticRows(rows: readonly any[]): SirioGridRows {\r\n return { data: signal(rows), dataSource: null, loading: signal(false), failed: signal(false), pagedSize: NO_PAGED_SIZE };\r\n }\r\n\r\n private getMap(column: any, dataType: string, formGroup: FormGroup): MapType {\r\n const allowed = ['boolean', 'text', 'number', 'flags'].includes(dataType);\r\n if (!allowed || !column.map) {\r\n return null;\r\n }\r\n const map = this.programmability.evaluate(formGroup, column.mapValues);\r\n const valid = isRecord(map, (key) => typeof key === 'string' || typeof key === 'number', (val) => typeof val === 'string');\r\n if (!valid) {\r\n return null;\r\n }\r\n if (dataType === 'flags') {\r\n (map as any)[getLabelSymbol] = (key: any) => this.formatFlags(key, map);\r\n }\r\n return map;\r\n }\r\n\r\n private formatMap(value: any, map: MapType): string {\r\n if (value == null) {\r\n return map?.['null'] ?? '';\r\n }\r\n if (map) {\r\n let result: any = map[value];\r\n if (result === undefined) {\r\n const labeled = isLabeledRecord(map, (key) => typeof key === 'string' || typeof key === 'number', (val) => typeof val === 'string', getLabelSymbol);\r\n if (labeled) {\r\n result = (map as any)[getLabelSymbol](value);\r\n }\r\n }\r\n return result ?? value.toString();\r\n }\r\n return value.toString();\r\n }\r\n\r\n private formatFlags(value: any, map: MapType): string | null {\r\n if (typeof value === 'number' && isRecord(map, isNumericKey, (val) => typeof val === 'string')) {\r\n if (value == 0) {\r\n return map[0] ?? '0';\r\n }\r\n const flags = Object.keys(map).map(Number).filter((flag) => flag !== 0 && (value & flag) === flag);\r\n const sum = flags.reduce((acc, f) => acc | f, 0);\r\n if ((value & sum) !== value) {\r\n return null;\r\n }\r\n return flags.map((flag) => map[flag]).filter((label): label is string => !!label).join(', ');\r\n }\r\n return null;\r\n }\r\n\r\n private parseKey(key: string): boolean | number | string {\r\n if (key === 'true') return true;\r\n if (key === 'false') return false;\r\n const num = Number(key);\r\n return isNaN(num) ? key : num;\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ComponentRef,\r\n inject,\r\n Injector,\r\n input,\r\n OnChanges,\r\n OnDestroy,\r\n Type,\r\n ViewContainerRef,\r\n} from '@angular/core';\r\n\r\n/**\r\n * TEMPORARY: hosts an ag-grid cell renderer component (`agInit(params)`) inside a cell of the Sirio\r\n * data grid, so the existing renderers (component, template, actions, objectURL, deleteRow) work\r\n * with both grids while they coexist. `params` is an ag-grid-like object built by\r\n * `SirioGridService` (`data`, `value`, `node.rowIndex`, `api.getGridOption('context')`, plus the\r\n * renderer parameters).\r\n *\r\n * To be replaced by data grid templates when ag-grid is removed.\r\n */\r\n@Component({\r\n selector: 'fp-sirio-cell-host',\r\n template: '',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: { style: 'display: contents' },\r\n})\r\nexport class SirioCellHostComponent implements OnChanges, OnDestroy {\r\n readonly renderer = input.required<Type<any>>();\r\n readonly params = input.required<Record<string, any>>();\r\n\r\n private readonly container = inject(ViewContainerRef);\r\n private readonly injector = inject(Injector);\r\n private componentRef: ComponentRef<any> | null = null;\r\n\r\n ngOnChanges(): void {\r\n // A new row or value: the renderer is created again with the new parameters.\r\n this.destroy();\r\n this.componentRef = this.container.createComponent(this.renderer(), { injector: this.injector });\r\n this.componentRef.instance.agInit?.(this.params());\r\n this.componentRef.changeDetectorRef.detectChanges();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy();\r\n }\r\n\r\n private destroy(): void {\r\n this.componentRef?.destroy();\r\n this.componentRef = null;\r\n }\r\n}\r\n","import { isObservable, combineLatest, of, Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\nexport function observableAll<T extends object>(obj: T): Observable<T> {\r\n function collect(value: any): Observable<any> {\r\n if (isObservable(value)) {\r\n return value;\r\n }\r\n if (Array.isArray(value)) {\r\n return combineLatest(value.map(collect));\r\n }\r\n if (typeof value === 'object' && value !== null) {\r\n const keys = Object.keys(value);\r\n const observables = keys.map(k => collect(value[k]));\r\n return combineLatest(observables).pipe(\r\n map(resolvedValues => {\r\n const resolvedObject: any = {};\r\n resolvedValues.forEach((v, i) => {\r\n resolvedObject[keys[i]] = v;\r\n });\r\n return resolvedObject;\r\n })\r\n );\r\n }\r\n return of(value);\r\n }\r\n\r\n return collect(obj);\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { ProgrammabilityService } from '../services/programmability.service';\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { observableAll } from '../utils/observableAll';\r\nimport {\r\n AgChartOptions, AgChartTheme, AgBaseSeriesOptions,\r\n AgBarSeriesOptions, AgBarSeriesOptionsNames, \r\n AgLineSeriesOptions, AgLineSeriesOptionsNames,\r\n AgAreaSeriesOptions, AgAreaSeriesOptionsNames,\r\n AgScatterSeriesOptions, AgScatterSeriesOptionsNames,\r\n AgBubbleSeriesOptions, AgBubbleSeriesOptionsNames,\r\n AgPieSeriesOptions, AgPieSeriesOptionsNames,\r\n AgDonutSeriesOptions, AgDonutSeriesOptionsNames\r\n} from 'ag-charts-community';\r\n\r\nimport { LanguageService } from '@wemake4u/interact';\r\nimport { localize } from '../locale/localize';\r\n\r\n@Injectable()\r\nexport class ChartService {\r\n\r\n constructor(\r\n private programmability: ProgrammabilityService\r\n , private languageService: LanguageService) {\r\n }\r\n\r\n getOptions(component: any, formGroup: FormGroup): Observable<AgChartOptions> {\r\n const expression = this.getDataExpression(component);\r\n const data = this.programmability.evaluate(formGroup, expression);\r\n return observableAll(data).pipe(\r\n map((chartData: any) => {\r\n const series = this.getSeries(component, formGroup);\r\n const options: AgChartOptions = {\r\n theme: this.getTheme(),\r\n series: series,\r\n ...this.getProps(component)\r\n };\r\n this.bindData(options, chartData);\r\n return options;\r\n })\r\n ); \r\n }\r\n\r\n getDataExpression(component: any) {\r\n const getExpression = (expression: any) => {\r\n return this.programmability.isExpression(expression)\r\n ? this.programmability.getExpression(expression)\r\n : \"null\"\r\n }\r\n const dataExpr = getExpression(component.data);\r\n const seriesExprs = (component.series ?? [])\r\n .map((serie: any) => getExpression(serie.data))\r\n .map((expr: string) => `(${expr})`)\r\n .join(\", \");\r\n\r\n return `={ data: (${dataExpr}), series: [${seriesExprs}] }`;\r\n }\r\n\r\n private bindData(options: AgChartOptions, chartData: any) {\r\n if (chartData.data) {\r\n options.data = chartData.data;\r\n }\r\n if (Array.isArray(options.series)) {\r\n options.series.forEach((serie: any, index: number) => {\r\n if (chartData.series[index]) {\r\n serie.data = chartData.series[index];\r\n }\r\n });\r\n }\r\n }\r\n\r\n private get language(): string {\r\n return this.languageService.getLanguage();\r\n }\r\n\r\n private locale(component: any, key: string): string {\r\n return localize(this.language, component, key);\r\n }\r\n\r\n private getTheme(): AgChartTheme {\r\n return {\r\n baseTheme: \"ag-default\",\r\n params: {\r\n fontFamily: \"inherit\",\r\n textColor: \"#00121A\",\r\n chromeFontFamily: \"inherit\",\r\n chromeTextColor: \"#00121A\"\r\n },\r\n overrides: {\r\n common: {\r\n background: {\r\n visible: true,\r\n fill: \"transparent\",\r\n }\r\n }\r\n }\r\n };\r\n }\r\n\r\n private getSeries(component: any, formGroup: FormGroup): any[] {\r\n if (Array.isArray(component.series)) {\r\n const series = component.series.map((serie: any) => {\r\n switch (serie.type) {\r\n case \"bar\":\r\n return this.getBarSeriesOptions(serie, formGroup);\r\n case \"line\":\r\n return this.getLineSeriesOptions(serie, formGroup);\r\n case \"area\":\r\n return this.getAreaSeriesOptions(serie, formGroup);\r\n case \"scatter\":\r\n return this.getScatterSeriesOptions(serie, formGroup);\r\n case \"bubble\":\r\n return this.getBubbleSeriesOptions(serie, formGroup);\r\n case \"pie\":\r\n return this.getPieSeriesOptions(serie, formGroup);\r\n case \"donut\":\r\n return this.getDonutSeriesOptions(serie, formGroup);\r\n default:\r\n return {};\r\n }\r\n });\r\n return series;\r\n }\r\n else {\r\n return [];\r\n }\r\n }\r\n\r\n private getSeriesOptionsNames(serie: any)\r\n : AgBarSeriesOptionsNames | AgLineSeriesOptionsNames {\r\n const options: AgBarSeriesOptionsNames | AgLineSeriesOptionsNames = {};\r\n\r\n if (this.isString(serie.xName))\r\n options.xName = this.locale(serie, \"xName\");\r\n\r\n if (this.isString(serie.yName))\r\n options.yName = this.locale(serie, \"yName\");\r\n\r\n if (this.isString(serie.legendItemName))\r\n options.legendItemName = this.locale(serie, \"legendItemName\");\r\n\r\n return options;\r\n }\r\n \r\n private getBaseSeriesOptions(serie: any, formGroup: FormGroup): AgBaseSeriesOptions<any>\r\n {\r\n const options: AgBaseSeriesOptions<any> = { };\r\n\r\n if (this.isBoolean(serie.visible))\r\n options.visible = serie.visible;\r\n\r\n return options;\r\n }\r\n\r\n private getBarSeriesOptions(serie: any, formGroup: FormGroup): AgBarSeriesOptions {\r\n const options: AgBarSeriesOptions = {\r\n type: \"bar\",\r\n xKey: serie.xKey,\r\n yKey: serie.yKey,\r\n ...this.getBaseSeriesOptions(serie, formGroup),\r\n ...this.getSeriesOptionsNames(serie)\r\n };\r\n\r\n if (this.isDirection(serie.direction))\r\n options.direction = serie.direction;\r\n\r\n if (this.isBoolean(serie.stacked))\r\n options.stacked = serie.stacked;\r\n\r\n if (this.isNumber(serie.normalizedTo))\r\n options.normalizedTo = serie.normalizedTo;\r\n\r\n if (this.isString(serie.stackGroup))\r\n options.stackGroup = serie.stackGroup;\r\n\r\n return options;\r\n }\r\n\r\n private getLineSeriesOptions(serie: any, formGroup: FormGroup): AgLineSeriesOptions {\r\n const options: AgLineSeriesOptions = {\r\n type: \"line\",\r\n xKey: serie.xKey,\r\n yKey: serie.yKey,\r\n ...this.getBaseSeriesOptions(serie, formGroup),\r\n ...this.getSeriesOptionsNames(serie)\r\n };\r\n\r\n if (this.isInterpolation(serie.interpolation)) { \r\n options.interpolation = {\r\n type: serie.interpolation\r\n };\r\n }\r\n\r\n return options;\r\n }\r\n\r\n private getAreaSeriesOptions(serie: any, formGroup: FormGroup): AgAreaSeriesOptions {\r\n const options: AgAreaSeriesOptions = {\r\n type: \"area\",\r\n xKey: serie.xKey,\r\n yKey: serie.yKey,\r\n ...this.getBaseSeriesOptions(serie, formGroup),\r\n ...this.getAreaSeriesOptionsNames(serie)\r\n };\r\n\r\n if (this.isBoolean(serie.stacked))\r\n options.stacked = serie.stacked;\r\n\r\n if (this.isNumber(serie.normalizedTo))\r\n options.normalizedTo = serie.normalizedTo;\r\n\r\n return options;\r\n }\r\n\r\n private getAreaSeriesOptionsNames(serie: any)\r\n : AgAreaSeriesOptionsNames {\r\n const options: AgAreaSeriesOptionsNames = {};\r\n\r\n if (serie.xName)\r\n options.xName = this.locale(serie, \"xName\");\r\n\r\n if (serie.yName)\r\n options.yName = this.locale(serie, \"yName\");\r\n\r\n return options;\r\n }\r\n\r\n private getScatterSeriesOptions(serie: any, formGroup: FormGroup): AgScatterSeriesOptions {\r\n return {\r\n type: \"scatter\",\r\n xKey: serie.xKey,\r\n yKey: serie.yKey,\r\n labelKey: serie.labelKey,\r\n ...this.getBaseSeriesOptions(serie, formGroup),\r\n ...this.getScatterSeriesOptionsNames(serie)\r\n };\r\n }\r\n\r\n private getScatterSeriesOptionsNames(serie: any)\r\n : AgScatterSeriesOptionsNames {\r\n const options: AgScatterSeriesOptionsNames = {};\r\n\r\n if (serie.xName)\r\n options.xName = this.locale(serie, \"xName\");\r\n\r\n if (serie.yName)\r\n options.yName = this.locale(serie, \"yName\");\r\n\r\n if (serie.labelName)\r\n options.labelName = this.locale(serie, \"labelName\");\r\n\r\n return options;\r\n }\r\n\r\n private getBubbleSeriesOptions(serie: any, formGroup: FormGroup): AgBubbleSeriesOptions {\r\n return {\r\n type: \"bubble\",\r\n xKey: serie.xKey,\r\n yKey: serie.yKey,\r\n sizeKey: serie.sizeKey,\r\n labelKey: serie.labelKey,\r\n ...this.getBaseSeriesOptions(serie, formGroup),\r\n ...this.getBubbleSeriesOptionsNames(serie)\r\n };\r\n }\r\n\r\n private getBubbleSeriesOptionsNames(serie: any)\r\n : AgBubbleSeriesOptionsNames {\r\n const options: AgBubbleSeriesOptionsNames = {};\r\n\r\n if (serie.xName)\r\n options.xName = this.locale(serie, \"xName\");\r\n\r\n if (serie.yName)\r\n options.yName = this.locale(serie, \"yName\");\r\n\r\n if (serie.sizeName)\r\n options.sizeName = this.locale(serie, \"sizeName\");\r\n\r\n if (serie.labelName)\r\n options.labelName = this.locale(serie, \"labelName\");\r\n\r\n return options;\r\n }\r\n\r\n private getPieSeriesOptions(serie: any, formGroup: FormGroup): AgPieSeriesOptions {\r\n const options: AgPieSeriesOptions = {\r\n type: \"pie\",\r\n angleKey: serie.angleKey,\r\n ...this.getBaseSeriesOptions(serie, formGroup),\r\n ...this.getPieSeriesOptionsNames(serie)\r\n };\r\n\r\n if (this.isString(serie.radiusKey))\r\n options.radiusKey = serie.radiusKey;\r\n\r\n if (this.isString(serie.calloutLabelKey))\r\n options.calloutLabelKey = serie.calloutLabelKey;\r\n\r\n if (this.isString(serie.sectorLabelKey))\r\n options.sectorLabelKey = serie.sectorLabelKey;\r\n\r\n if (this.isString(serie.legendItemKey))\r\n options.legendItemKey = serie.legendItemKey;\r\n\r\n return options;\r\n }\r\n\r\n private getPieSeriesOptionsNames(serie: any)\r\n : AgPieSeriesOptionsNames {\r\n const options: AgPieSeriesOptionsNames = {};\r\n\r\n if (serie.angleName)\r\n options.angleName = this.locale(serie, \"angleName\");\r\n\r\n if (serie.radiusName)\r\n options.radiusName = this.locale(serie, \"radiusName\");\r\n\r\n if (serie.calloutLabelName)\r\n options.calloutLabelName = this.locale(serie, \"calloutLabelName\");\r\n\r\n if (serie.sectorLabelName)\r\n options.sectorLabelName = this.locale(serie, \"sectorLabelName\");\r\n\r\n return options;\r\n }\r\n\r\n private getDonutSeriesOptions(serie: any, formGroup: FormGroup): AgDonutSeriesOptions {\r\n const options: AgDonutSeriesOptions = {\r\n type: \"donut\",\r\n angleKey: serie.angleKey,\r\n ...this.getBaseSeriesOptions(serie, formGroup),\r\n ...this.getDonutSeriesOptionsNames(serie)\r\n };\r\n\r\n if (this.isString(serie.radiusKey))\r\n options.radiusKey = serie.radiusKey;\r\n\r\n if (this.isString(serie.calloutLabelKey))\r\n options.calloutLabelKey = serie.calloutLabelKey;\r\n\r\n if (this.isString(serie.sectorLabelKey))\r\n options.sectorLabelKey = serie.sectorLabelKey;\r\n\r\n if (this.isString(serie.legendItemKey))\r\n options.legendItemKey = serie.legendItemKey;\r\n\r\n return options;\r\n }\r\n\r\n private getDonutSeriesOptionsNames(serie: any)\r\n : AgDonutSeriesOptionsNames {\r\n const options: AgDonutSeriesOptionsNames = {};\r\n\r\n if (serie.angleName)\r\n options.angleName = this.locale(serie, \"angleName\");\r\n\r\n if (serie.radiusName)\r\n options.radiusName = this.locale(serie, \"radiusName\");\r\n\r\n if (serie.calloutLabelName)\r\n options.calloutLabelName = this.locale(serie, \"calloutLabelName\");\r\n\r\n if (serie.sectorLabelName)\r\n options.sectorLabelName = this.locale(serie, \"sectorLabelName\");\r\n\r\n return options;\r\n }\r\n\r\n private getProps(component: any): any {\r\n const props: any = {};\r\n\r\n if (component && component.title) {\r\n props.title = { text: component.title };\r\n }\r\n\r\n if (component && component.subtitle) {\r\n props.subtitle = { text: component.subtitle };\r\n }\r\n\r\n return props;\r\n }\r\n\r\n private isBoolean(value: any): boolean {\r\n return typeof value === 'boolean' || value instanceof Boolean;\r\n }\r\n\r\n private isString(value: any): boolean {\r\n return typeof value === 'string' || value instanceof String;\r\n }\r\n\r\n private isNumber(value: any): boolean {\r\n return typeof value === 'number' && isFinite(value);\r\n }\r\n\r\n private isDirection(value: any): boolean {\r\n return value === 'horizontal' || value === 'vertical';\r\n }\r\n\r\n private isInterpolation(value: any): boolean {\r\n return value === 'linear' || value === 'smooth' || value === 'step';\r\n }\r\n}\r\n","import { Directive, Input, OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core';\r\nimport { ControlContainer, FormArray, FormGroup } from '@angular/forms';\r\nimport { CacheContextService } from '../services/cache.service';\r\nimport { FormService } from '../services/form.service';\r\nimport { EvaluateOptions } from '../services/programmability.service';\r\nimport { debounceTime, Subscription } from 'rxjs';\r\n\r\n@Directive({\r\n selector: '[recursion]',\r\n exportAs: 'recursion',\r\n standalone: true,\r\n providers: [\r\n CacheContextService\r\n ],\r\n})\r\nexport class RecursionDirective implements OnInit, OnChanges, OnDestroy {\r\n @Input() formGroup!: FormGroup;\r\n @Input(\"recursion\") component: any;\r\n\r\n private subscription: Subscription | null = null;\r\n private componentRows: any = null;\r\n private nestedFormGroup: FormGroup | null = null;\r\n\r\n constructor(private controlContainer: ControlContainer\r\n , private formService: FormService\r\n , private cacheContext: CacheContextService) {\r\n }\r\n\r\n ngOnInit(): void {\r\n this.componentRows = this.createComponentRows();\r\n this.nestedFormGroup = this.createNestedFormGroup();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (this.isSubscribeRequired()) {\r\n this.subscribeToChanges();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.unsubscribeToChanges();\r\n }\r\n\r\n getItemsArray(formItem: FormGroup): FormArray | null {\r\n if (this.isRecursionByKey()) {\r\n return this.getArrayFromKey(formItem);\r\n }\r\n\r\n if (this.isRecursionByExpression()) {\r\n return this.getArrayFromExpression(formItem);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n getComponentRows(): any {\r\n return this.componentRows;\r\n }\r\n\r\n getFormGroup(formItem: FormGroup): FormGroup {\r\n if (this.isRecursionByExpression()) {\r\n const nestedGroup = this.nestedFormGroup!;\r\n nestedGroup.setControl(this.component.key, this.getArrayFromExpression(formItem));\r\n return nestedGroup\r\n }\r\n else { \r\n return formItem;\r\n }\r\n }\r\n\r\n private isSubscribeRequired(): boolean {\r\n return this.shouldCreateItems()\r\n || this.isRecursionByExpression();\r\n }\r\n\r\n private isRecursionAllowed(): boolean {\r\n return this.component?.subtype === \"table\"\r\n && this.component?.recursion?.allowed === true\r\n }\r\n\r\n private isRecursionByKey(): boolean { \r\n return this.isRecursionAllowed()\r\n && this.component?.recursion?.source === \"key\"\r\n && this.component?.recursion?.key;\r\n }\r\n\r\n private isRecursionByExpression(): boolean {\r\n return this.isRecursionAllowed()\r\n && this.component?.recursion?.source === \"expression\"\r\n && this.cacheContext.isExpression(this.component.recursion.expression ?? \"\");\r\n }\r\n\r\n private shouldCreateItems(): boolean {\r\n return this.isRecursionByKey()\r\n && this.component.allowAddRemove === true\r\n && this.cacheContext.isExpression(this.component.recursion.shouldCreate ?? \"\");\r\n }\r\n\r\n private subscribeToChanges() {\r\n this.unsubscribeToChanges();\r\n const formArray = this.getFormArray();\r\n if (formArray) {\r\n this.subscription = formArray.valueChanges\r\n .pipe(debounceTime(200))\r\n .subscribe(() => this.onChangeArray(formArray));\r\n }\r\n }\r\n\r\n private unsubscribeToChanges() {\r\n if (this.subscription) {\r\n this.subscription.unsubscribe();\r\n this.subscription = null;\r\n }\r\n }\r\n\r\n private onChangeArray(formArray: FormArray) {\r\n this.cacheContext.invalidateAll();\r\n if (this.shouldCreateItems()) {\r\n this.creatingItems(formArray);\r\n } \r\n }\r\n\r\n private getFormArray(): FormArray {\r\n return this.controlContainer.control as FormArray;\r\n }\r\n\r\n private creatingItems(formArray: FormArray) {\r\n const key = this.component.recursion.key ?? \"\";\r\n const shouldCreate = this.component.recursion.shouldCreate ?? \"\";\r\n\r\n for (let i = 0; i < formArray.length; i++) {\r\n\r\n const formItem = formArray.at(i) as FormGroup;\r\n\r\n const options: EvaluateOptions = {\r\n extendContext: () => ({\r\n \"item\": formItem.value\r\n })\r\n }\r\n const recursive = this.cacheContext.evaluateBoolean(formItem, this.formGroup, shouldCreate, options);\r\n\r\n if (recursive && !formItem.get(key)) {\r\n const newArray = (formArray as any).createNewArray();\r\n formItem.addControl(key, newArray); \r\n }\r\n else if (!recursive && formItem.get(key)) {\r\n formItem.removeControl(key);\r\n }\r\n }\r\n }\r\n\r\n private getArrayFromKey(formItem: FormGroup): FormArray | null {\r\n const control = formItem.get(this.component.recursion.key);\r\n if ((control instanceof FormArray)) {\r\n const childArray = this.prepareChildArray(formItem, control);\r\n if (childArray != control) {\r\n formItem.setControl(this.component.recursion.key, childArray);\r\n }\r\n return childArray;\r\n }\r\n return null;\r\n }\r\n\r\n private getArrayFromExpression(formItem: FormGroup): FormArray | null {\r\n const expression = this.cacheContext.getExpression(this.component.recursion.expression);\r\n const wrapExpression = `=__asFormArray(${expression})`;\r\n const result = this.cacheContext.evaluate(formItem, this.formGroup, wrapExpression, {\r\n extendContext: () => ({\r\n item: formItem.value,\r\n __asFormArray: (value: any) => {\r\n if (Array.isArray(value)) { \r\n const newArray = new FormArray<any>([]);\r\n this.formService.patch(newArray, value, { strict: false });\r\n return newArray;\r\n }\r\n return null;\r\n }\r\n })\r\n });\r\n if ((result instanceof FormArray)) {\r\n return result;\r\n }\r\n return null;\r\n }\r\n\r\n private createComponentRows(): any {\r\n let component = this.component;\r\n\r\n if (this.isRecursionByKey()\r\n && component.key !== this.component.recursion.key) {\r\n component = { ...this.component, key: this.component.recursion.key };\r\n }\r\n\r\n return [{ components: [component] }]\r\n }\r\n\r\n private createNestedFormGroup(): FormGroup | null {\r\n if (this.isRecursionByExpression()) {\r\n return new FormGroup({\r\n [this.component.key]: new FormArray([])\r\n });\r\n }\r\n return null;\r\n }\r\n\r\n private prepareChildArray(formItem: FormGroup, childArray: FormArray) {\r\n if ((childArray as any).createNewArray)\r\n return childArray;\r\n\r\n const parentArray = formItem.parent;\r\n if ((parentArray instanceof FormArray)\r\n && (parentArray as any).createNewArray)\r\n {\r\n var newArray = (parentArray as any).createNewArray();\r\n this.formService.patch(newArray, childArray.value, { strict: false });\r\n return newArray;\r\n }\r\n\r\n return childArray;\r\n }\r\n}\r\n\r\n","import { Directive, Input, AfterViewInit, ElementRef, Renderer2 } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[frameSecurity]',\r\n standalone: true\r\n})\r\nexport class FrameSecurityDirective implements AfterViewInit {\r\n @Input() frameSecurity: any = null;\r\n\r\n constructor(private el: ElementRef, private renderer: Renderer2) { }\r\n\r\n ngAfterViewInit(): void {\r\n const frame = this.el.nativeElement;\r\n\r\n const sandbox = this.getSandBox(this.frameSecurity);\r\n\r\n if (sandbox)\r\n this.renderer.setAttribute(frame, 'sandbox', sandbox);\r\n\r\n const allow = this.getAllow(this.frameSecurity);\r\n\r\n if (allow)\r\n this.renderer.setAttribute(frame, 'allow', allow);\r\n }\r\n\r\n private getSandBox(security: any): string {\r\n let allowedProperties: string[] = [\r\n \"allowScripts\",\r\n \"allowSameOrigin\",\r\n \"allowForms\",\r\n \"allowModals\",\r\n \"allowPopups\",\r\n \"allowTopNavigation\",\r\n \"allowStorageAccessByUserActivation\"\r\n ];\r\n let sandBox = Object.entries(security)\r\n .filter(([key, value]) => value === true && allowedProperties.includes(key))\r\n .map(([key]) => this.camelToKebabCase(key))\r\n .join(' ');\r\n\r\n return sandBox;\r\n };\r\n\r\n private getAllow(security: any): string {\r\n let allowedProperties: string[] = [\r\n \"fullscreen\",\r\n \"geolocation\",\r\n \"camera\",\r\n \"microphone\"\r\n ];\r\n let allow = Object.entries(security)\r\n .filter(([key, value]) => value === true && allowedProperties.includes(key))\r\n .map(([key]) => key)\r\n .join(' ');\r\n\r\n return allow;\r\n };\r\n\r\n private camelToKebabCase(str: string): string {\r\n return str.replace(/[A-Z]/g, (match) => '-' + match.toLowerCase());\r\n }\r\n}\r\n","import { Directive, Input, OnChanges, SimpleChanges, Host, inject } from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { Observable, of, isObservable } from 'rxjs';\r\nimport { catchError, take, tap, finalize } from 'rxjs/operators';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { DestroyRef } from '@angular/core';\r\nimport { AgGridAngular } from 'ag-grid-angular';\r\nimport { IGetRowsParams, GridApi } from \"ag-grid-community\";\r\nimport { IRowsSource } from '../dataSources/interfaces';\r\nimport { GridService } from '../services/grid.service';\r\nimport { CacheContextService } from '../services/cache.service';\r\n\r\nimport { LanguageService } from '@wemake4u/interact';\r\nimport { Texts } from '../locale/locale';\r\nimport { localize } from '../locale/localize';\r\n\r\n@Directive({\r\n selector: '[rowSource], [columns], [selectable], [multiSelect], [suppressActions]',\r\n standalone: true,\r\n providers: [\r\n CacheContextService\r\n ],\r\n})\r\n\r\nexport class GridDirective implements OnChanges {\r\n @Input() rowSource!: any;\r\n @Input(\"columns\") columns: any = null;\r\n @Input() selectable: boolean | null = null;\r\n @Input() multiSelect: boolean | null = null;\r\n @Input() suppressActions: boolean | null = null;\r\n @Input() formGroup!: FormGroup; \r\n @Input(\"register\") component: any = null;\r\n\r\n constructor(\r\n @Host() private grid: AgGridAngular,\r\n private gridService: GridService,\r\n private cacheContext: CacheContextService,\r\n private languageService: LanguageService,\r\n private destroyRef: DestroyRef\r\n ) {\r\n\r\n grid.gridReady\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((params) => {\r\n this.gridApi = params.api;\r\n this.prepareContext();\r\n this.isGridReady = true;\r\n this.onGridReady(); \r\n });\r\n }\r\n\r\n //https://www.ag-grid.com/angular-data-grid/column-updating-definitions/\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n\r\n if (this.isRowSourceChanged(changes)) {\r\n this.onRowSourceChanged();\r\n }\r\n\r\n if (this.isColumnDefsChanged(changes)) {\r\n this.onColumnDefsChanged();\r\n }\r\n\r\n if (this.isSelectionChanged(changes)) {\r\n this.onSelectionChanged();\r\n }\r\n\r\n if (this.isSuppressActionChanged(changes)) {\r\n this.onSuppressAction();\r\n }\r\n }\r\n\r\n private gridApi!: GridApi<any>;\r\n\r\n private isGridReady: boolean = false;\r\n\r\n private noData: Observable<any> = of([]);\r\n\r\n private prepareContext() {\r\n const context = this.gridApi.getGridOption(\"context\") ?? {};\r\n context[\"cacheContext\"] = this.cacheContext;\r\n this.gridApi.setGridOption(\"context\", context);\r\n }\r\n\r\n private applyResult(data: any) {\r\n\r\n if (this.isArray(data)) {\r\n this.setRowData(data);\r\n }\r\n else if (this.isDataSource(data)) {\r\n this.setDataSource(data);\r\n }\r\n else {\r\n this.setRowData([]);\r\n }\r\n }\r\n\r\n private setRowData(rowSource: any) {\r\n this.grid.rowModelType = 'clientSide';\r\n if (this.isGridReady) {\r\n this.grid.api.setGridOption('rowData', rowSource);\r\n }\r\n else {\r\n this.grid.rowData = rowSource;\r\n }\r\n\r\n this.gridService.onRowDataChanged(this.component, this.gridApi, rowSource);\r\n }\r\n\r\n private setDataSource(rowSource: any) {\r\n this.grid.rowModelType = 'infinite';\r\n if (this.isGridReady) {\r\n this.grid.api.setGridOption('datasource', rowSource);\r\n }\r\n else {\r\n this.grid.datasource = rowSource;\r\n }\r\n\r\n this.gridService.onDataSourceChanged(this.component, this.gridApi, rowSource);\r\n }\r\n\r\n private isArray(rowSource: any): boolean {\r\n return Array.isArray(rowSource);\r\n }\r\n\r\n private isDataSource(obj: any): obj is IRowsSource {\r\n return obj && typeof obj.getRows === \"function\";\r\n }\r\n\r\n private onGridReady() { \r\n this.onColumnDefsChanged();\r\n }\r\n\r\n private isRowSourceChanged(changes: SimpleChanges): boolean {\r\n return ['rowSource'].some(\r\n key => !!changes[key]\r\n );\r\n }\r\n\r\n private onRowSourceChanged() {\r\n this.cacheContext.invalidateAll();\r\n if (isObservable(this.rowSource)) {\r\n this.wrapObservable(this.rowSource).pipe(\r\n take(1),\r\n takeUntilDestroyed(this.destroyRef)\r\n ).subscribe(value => {\r\n this.applyResult(value ?? []);\r\n });\r\n }\r\n else if (this.isDataSource(this.rowSource)) {\r\n this.applyResult(this.wrapRowsSource(this.rowSource));\r\n }\r\n else {\r\n this.applyResult(this.rowSource);\r\n }\r\n }\r\n\r\n private isColumnDefsChanged(changes: SimpleChanges): boolean {\r\n return ['columnDefs'].some(\r\n key => !!changes[key]\r\n );\r\n }\r\n\r\n private onColumnDefsChanged() {\r\n if (this.gridApi) {\r\n const columnDef = this.gridService.getColumnDefs(this.component, this.columns, this.formGroup);\r\n this.gridApi.setGridOption(\"columnDefs\", columnDef);\r\n }\r\n }\r\n\r\n private isSelectionChanged(changes: SimpleChanges): boolean {\r\n return ['selectable', 'multiSelect'].some(\r\n key => !!changes[key] && !changes[key].isFirstChange()\r\n );\r\n }\r\n\r\n private onSelectionChanged() {\r\n if (this.gridApi) {\r\n const rowSelection = this.gridService.getRowSelection(this.component, this.formGroup);\r\n this.gridApi.setGridOption(\"rowSelection\", rowSelection);\r\n }\r\n }\r\n\r\n private isSuppressActionChanged(changes: SimpleChanges): boolean {\r\n return ['suppressActions'].some(\r\n key => !!changes[key] && !changes[key].isFirstChange()\r\n );\r\n }\r\n\r\n private onSuppressAction() {\r\n if (this.gridApi) {\r\n this.gridApi.setColumnsVisible([\"actions\"], !(this.suppressActions ?? false));\r\n this.gridService.resizeGrid(this.component, this.gridApi);\r\n }\r\n }\r\n\r\n private showLoading(value: boolean) {\r\n if (this.gridApi) {\r\n this.gridApi.setGridOption('loading', value);\r\n } \r\n }\r\n\r\n private showLoadError(value: boolean) {\r\n if (!this.gridApi) return;\r\n\r\n if (value) {\r\n this.grid.api.setGridOption('overlayNoRowsTemplate', this.locale(Texts, 'LoadingFailed'));\r\n this.grid.api.showNoRowsOverlay();\r\n }\r\n else {\r\n this.grid.api.setGridOption('overlayNoRowsTemplate', undefined); \r\n } \r\n }\r\n\r\n private get language(): string {\r\n return this.languageService.getLanguage();\r\n }\r\n\r\n private locale(component: any, key: string): string {\r\n return localize(this.language, component, key);\r\n }\r\n\r\n private wrapObservable<T>(source: Observable<T>): Observable<T> {\r\n this.showLoading(true);\r\n this.showLoadError(false);\r\n\r\n return source.pipe(\r\n tap(() => this.showLoadError(false)),\r\n catchError(err => {\r\n this.showLoadError(true); \r\n return this.noData;\r\n }),\r\n finalize(() => this.showLoading(false))\r\n );\r\n }\r\n\r\n private wrapRowsSource(source: IRowsSource): IRowsSource {\r\n\r\n const thisRef = this;\r\n\r\n function calculateLastRow(params: IGetRowsParams\r\n , rows: any[], lastRow: number | undefined): number | undefined\r\n {\r\n if (lastRow === undefined && Array.isArray(rows)) {\r\n if (rows.length < params.endRow - params.startRow) {\r\n return params.startRow + rows.length;\r\n }\r\n }\r\n\r\n return lastRow;\r\n }\r\n\r\n function wrapParams(params: IGetRowsParams): IGetRowsParams {\r\n thisRef.showLoading(true);\r\n thisRef.showLoadError(false);\r\n\r\n return {\r\n ...params,\r\n successCallback: (rows, lastRow) => {\r\n try {\r\n params.successCallback(rows, calculateLastRow(params, rows, lastRow));\r\n } finally {\r\n thisRef.showLoading(false);\r\n }\r\n },\r\n failCallback: () => {\r\n try {\r\n params.failCallback();\r\n } finally {\r\n thisRef.showLoading(false);\r\n thisRef.showLoadError(true);\r\n }\r\n }\r\n };\r\n }\r\n\r\n return {\r\n getRows: (params: IGetRowsParams) => {\r\n const wrapped = wrapParams(params);\r\n source.getRows(wrapped);\r\n }\r\n };\r\n }\r\n\r\n}\r\n","import { Directive, Input, OnChanges, SimpleChanges, ChangeDetectorRef, inject } from '@angular/core';\r\n\r\nexport type ObserveCallback = (cdr: ChangeDetectorRef) => void;\r\n\r\n@Directive({\r\n selector: '[observe]',\r\n standalone: true\r\n})\r\nexport class ChangeDirective implements OnChanges {\r\n @Input() observe: any;\r\n @Input() callback?: ObserveCallback;\r\n\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[\"observe\"]) {\r\n this.callback?.(this.cdr);\r\n } \r\n }\r\n}\r\n","import { ContainerControl } from \"./control\";\r\n\r\nexport class FormControl extends ContainerControl {\r\n\r\n}\r\n","import { Control } from \"./control\";\r\nimport { SirioTextbox } from \"@wemake4u/form-controls\";\r\n\r\nexport class TextFieldControl extends Control {\r\n\r\n setRandomColor(): void {\r\n const input = this.getNativeInput();\r\n if (input) input.style.backgroundColor = this.getRandomColor();\r\n }\r\n\r\n focus(): void {\r\n this.getTextbox()?.focus();\r\n }\r\n\r\n //#region Private Methods\r\n\r\n private getTextbox(): SirioTextbox | null {\r\n return this.getComponentRef() as SirioTextbox | null;\r\n }\r\n\r\n private getNativeInput(): HTMLInputElement | null {\r\n return this.getElementRef()?.nativeElement?.querySelector('input') ?? null;\r\n }\r\n\r\n private getRandomColor(): string {\r\n const letters = '0123456789ABCDEF';\r\n let color = '#';\r\n\r\n for (let i = 0; i < 6; i++) {\r\n color += letters[Math.floor(Math.random() * 16)];\r\n }\r\n\r\n return color;\r\n }\r\n\r\n //#endregion\r\n}\r\n","import { Control } from \"./control\";\r\nimport { SirioSelect } from \"@wemake4u/form-controls\";\r\n\r\nexport class SelectControl extends Control {\r\n\r\n focus(): void {\r\n this.getSelect()?.focus();\r\n }\r\n\r\n refresh(): void {\r\n // Set by the refresh directive: reloads the values of the component.\r\n (this.getSelect() as any)?._refresh?.();\r\n }\r\n\r\n private getSelect(): SirioSelect | null {\r\n return this.getComponentRef() as SirioSelect | null;\r\n }\r\n}\r\n","import { Control } from \"./control\";\r\nimport { SirioSelect } from \"@wemake4u/form-controls\";\r\n\r\n// The taglist is a multiple wm-sirio-select.\r\nexport class TagListControl extends Control {\r\n\r\n focus(): void {\r\n this.getSelect()?.focus();\r\n }\r\n\r\n refresh(): void {\r\n // Set by the refresh directive: reloads the values of the component.\r\n (this.getSelect() as any)?._refresh?.();\r\n }\r\n\r\n private getSelect(): SirioSelect | null {\r\n return this.getComponentRef() as SirioSelect | null;\r\n }\r\n}\r\n","import { Control } from \"./control\";\r\nimport { SirioNumber } from \"@wemake4u/form-controls\";\r\n\r\nexport class NumberControl extends Control {\r\n\r\n focus(): void {\r\n this.getNumber()?.focus();\r\n }\r\n\r\n private getNumber(): SirioNumber | null {\r\n return this.getComponentRef() as SirioNumber | null;\r\n }\r\n\r\n}\r\n","import { Control } from \"./control\";\r\nimport { SirioDate } from \"@wemake4u/form-controls\";\r\n\r\nexport class DateControl extends Control {\r\n\r\n focus(): void {\r\n this.getDate()?.focus();\r\n }\r\n\r\n private getDate(): SirioDate | null {\r\n return this.getComponentRef() as SirioDate | null;\r\n }\r\n\r\n}\r\n","import { Control } from \"./control\";\r\nimport { SirioTime } from \"@wemake4u/form-controls\";\r\n\r\nexport class TimeControl extends Control {\r\n\r\n focus(): void {\r\n this.getTime()?.focus();\r\n }\r\n\r\n private getTime(): SirioTime | null {\r\n return this.getComponentRef() as SirioTime | null;\r\n }\r\n\r\n}\r\n","import { Control } from \"./control\";\r\nimport { SirioDateTime } from \"@wemake4u/form-controls\";\r\n\r\nexport class DateTimeControl extends Control {\r\n\r\n focus(): void {\r\n this.getDateTime()?.focus();\r\n }\r\n\r\n private getDateTime(): SirioDateTime | null {\r\n return this.getComponentRef() as SirioDateTime | null;\r\n }\r\n\r\n}\r\n","import { Control } from \"./control\";\r\nimport { SirioCheckbox } from \"@wemake4u/form-controls\";\r\n\r\n// Checkbox and toggle (subtype \"toggle\"): both are a wm-sirio-checkbox ([toggle] for the switch).\r\nexport class CheckBoxControl extends Control {\r\n\r\n focus(): void {\r\n this.getCheckBox()?.focus();\r\n }\r\n\r\n private getCheckBox(): SirioCheckbox | null {\r\n return this.getComponentRef() as SirioCheckbox | null;\r\n }\r\n\r\n}\r\n","import { Control } from \"./control\";\r\nimport { SirioRadioGroup } from \"@wemake4u/form-controls\";\r\n\r\n// Radio buttons and chips (subtype \"chip\"): both are a wm-sirio-radio-group ([chips] for the chips).\r\nexport class RadioControl extends Control {\r\n\r\n focus(): void {\r\n this.getRadio()?.focus();\r\n }\r\n\r\n refresh(): void {\r\n // Set by the refresh directive: reloads the values of the component.\r\n (this.getRadio() as any)?._refresh?.();\r\n }\r\n\r\n private getRadio(): SirioRadioGroup | null {\r\n return this.getComponentRef() as SirioRadioGroup | null;\r\n }\r\n\r\n}\r\n","import { Control } from \"./control\";\r\nimport { SirioChecklist } from \"@wemake4u/form-controls\";\r\n\r\n// Checkbox list and chips (subtype \"chip\"): both are a wm-sirio-checklist ([chips] for the chips).\r\nexport class CheckListControl extends Control {\r\n\r\n focus(): void {\r\n this.getChecklist()?.focus();\r\n }\r\n\r\n refresh(): void {\r\n // Set by the refresh directive: reloads the values of the component.\r\n (this.getChecklist() as any)?._refresh?.();\r\n }\r\n\r\n private getChecklist(): SirioChecklist | null {\r\n return this.getComponentRef() as SirioChecklist | null;\r\n }\r\n\r\n}\r\n","import { Control } from \"./control\";\r\nimport { SirioTextarea } from \"@wemake4u/form-controls\";\r\n\r\nexport class TextAreaControl extends Control {\r\n\r\n focus(): void {\r\n this.getTextarea()?.focus();\r\n }\r\n\r\n private getTextarea(): SirioTextarea | null {\r\n return this.getComponentRef() as SirioTextarea | null;\r\n }\r\n\r\n}\r\n","import { Control } from \"./control\";\r\nimport { SirioSlider } from \"@wemake4u/form-controls\";\r\n\r\n// Range (slider): a wm-sirio-slider.\r\nexport class RangeControl extends Control {\r\n\r\n focus(): void {\r\n this.getSlider()?.focus();\r\n }\r\n\r\n private getSlider(): SirioSlider | null {\r\n return this.getComponentRef() as SirioSlider | null;\r\n }\r\n\r\n}\r\n","import { Control } from \"./control\";\r\nimport { SirioFileUpload } from \"@wemake4u/form-controls\";\r\n\r\nexport class FilePickerControl extends Control {\r\n\r\n focus(): void {\r\n this.getFileUpload()?.focus();\r\n }\r\n\r\n private getFileUpload(): SirioFileUpload | null {\r\n return this.getComponentRef() as SirioFileUpload | null;\r\n }\r\n\r\n}\r\n","import { Control } from \"./control\";\r\n\r\nexport class TextControl extends Control {\r\n\r\n \r\n}\r\n","import { Control } from \"./control\";\r\n\r\nexport class HtmlControl extends Control {\r\n\r\n \r\n}\r\n","import { Control } from \"./control\";\r\n\r\nexport class ImageControl extends Control {\r\n\r\n \r\n}\r\n","import { ContainerControl } from \"./control\";\r\nimport { SirioTabs } from \"@wemake4u/form-controls\";\r\n\r\nexport class TabControl extends ContainerControl {\r\n\r\n canNext() {\r\n return this.tab.nextIndex() !== null;\r\n }\r\n\r\n goNext() {\r\n this.tab.selectNext();\r\n }\r\n\r\n canPrevious() {\r\n return this.tab.previousIndex() !== null;\r\n }\r\n\r\n goPrevious() {\r\n this.tab.selectPrevious();\r\n }\r\n\r\n /** Selects a tab (missing or disabled tabs are ignored). */\r\n setActiveIndex(index: number): void {\r\n this.tab.select(index);\r\n };\r\n\r\n //#region State\r\n\r\n override onLoadState(): void {\r\n const state = this.getState<TabControlState>();\r\n\r\n if (!state || typeof state.activeIndex !== 'number') {\r\n return;\r\n }\r\n\r\n this.setActiveIndex(state.activeIndex);\r\n }\r\n\r\n override onSaveState(): void {\r\n this.setState(this.createState());\r\n }\r\n\r\n private createState(): TabControlState | null {\r\n return {\r\n activeIndex: this.tab.activeIndex()\r\n };\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Private Members\r\n\r\n private get tab(): SirioTabs {\r\n const ref = this.getComponentRef();\r\n if (!(ref instanceof SirioTabs)) {\r\n throw new Error(\r\n 'ComponentRef is not a SirioTabs'\r\n );\r\n }\r\n return ref;\r\n }\r\n\r\n //#endregion\r\n}\r\n\r\ninterface TabControlState\r\n{\r\n activeIndex: number;\r\n}\r\n","import { Control } from \"./control\";\r\nimport { AgCharts } from 'ag-charts-angular';\r\n\r\nexport class ChartControl extends Control {\r\n\r\n //readonly refresh = (): void => {\r\n // (this.getGrid() as any)._refresh();\r\n //}\r\n\r\n private getChart(): AgCharts {\r\n return this.getComponentRef() as AgCharts;\r\n }\r\n}\r\n","import { ContainerControl } from \"./control\";\r\nimport { SirioAccordion } from \"@wemake4u/form-controls\";\r\n\r\nexport class AccordionControl extends ContainerControl {\r\n\r\n /** Opens a section (missing, disabled or already open sections are ignored). */\r\n openPanel(index: number): void {\r\n this.accordion.expand(index);\r\n };\r\n\r\n //#region State\r\n\r\n override onLoadState(): void {\r\n const state = this.getState<AccordionControlState>();\r\n\r\n if (!state || !Array.isArray(state.openIndexes)) {\r\n return;\r\n }\r\n\r\n for (const index of state.openIndexes) {\r\n this.openPanel(index);\r\n }\r\n }\r\n\r\n override onSaveState(): void {\r\n const state = this.createState();\r\n if (state) {\r\n this.setState(state);\r\n }\r\n }\r\n\r\n private createState(): AccordionControlState | null {\r\n const openIndexes = this.accordion.expandedIndexes();\r\n\r\n return openIndexes.length > 0\r\n ? { openIndexes }\r\n : null;\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Private Members\r\n\r\n private get accordion(): SirioAccordion {\r\n const ref = this.getComponentRef();\r\n if (!(ref instanceof SirioAccordion)) {\r\n throw new Error(\r\n 'ComponentRef is not a SirioAccordion'\r\n );\r\n }\r\n return ref;\r\n }\r\n\r\n //#endregion\r\n\r\n}\r\n\r\ninterface AccordionControlState {\r\n openIndexes: number[] | null;\r\n}\r\n","import { ContainerControl } from \"./control\";\r\n\r\nexport class DynamicListControl extends ContainerControl {\r\n\r\n \r\n}\r\n","import { ContainerControl } from \"./control\";\r\n\r\nexport class GroupControl extends ContainerControl {\r\n\r\n}\r\n","import { Observable } from 'rxjs';\r\nimport { take } from 'rxjs/operators';\r\n\r\nexport function subscribeOnce<T>(\r\n source$: Observable<T>,\r\n next: (value: T) => void,\r\n error?: (err: any) => void,\r\n complete?: () => void\r\n): void {\r\n source$\r\n .pipe(take(1))\r\n .subscribe({\r\n next,\r\n error,\r\n complete\r\n });\r\n}\r\n","import { merge } from 'rxjs';\r\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\r\nimport { Control } from \"./control\";\r\nimport { AgGridAngular } from 'ag-grid-angular';\r\nimport { FilterModel, ColumnState } from 'ag-grid-community';\r\nimport { subscribeOnce } from '../utils/observable';\r\n\r\nexport class TableControl extends Control {\r\n\r\n setFilter(filter: FilterModel): void {\r\n this.grid.api.setFilterModel(filter);\r\n }\r\n\r\n getFilter(): FilterModel {\r\n return this.grid.api.getFilterModel();\r\n }\r\n\r\n clearFilter(): void {\r\n this.grid.api.setFilterModel(null);\r\n }\r\n\r\n getOrder(): OrderModel {\r\n return this.grid.api.getColumnState()\r\n .filter(col => col.sort === 'asc' || col.sort === 'desc')\r\n .sort((a, b) => (a.sortIndex ?? 0) - (b.sortIndex ?? 0))\r\n .map(col => ({\r\n colId: col.colId,\r\n sort: col.sort as 'asc' | 'desc',\r\n }));\r\n }\r\n\r\n setOrder(order: OrderModel): void {\r\n this.grid.api.applyColumnState({\r\n state: order.map((o, i) => ({ colId: o.colId, sort: o.sort, sortIndex: i })),\r\n defaultState: { sort: null },\r\n });\r\n }\r\n\r\n refresh(): void {\r\n (this.grid as any)._refresh();\r\n }\r\n\r\n redraw(): void {\r\n this.grid.api.redrawRows();\r\n }\r\n\r\n //#region State\r\n\r\n private currentState: TableControlState | null = null;\r\n\r\n override onLoadState(): void {\r\n\r\n const destroyRef = this.getDestroyRef();\r\n\r\n merge(\r\n this.grid.filterChanged,\r\n this.grid.sortChanged,\r\n this.grid.columnResized,\r\n this.grid.paginationChanged,\r\n ).pipe(takeUntilDestroyed(destroyRef))\r\n .subscribe(() => {\r\n this.currentState = this.createState();\r\n });\r\n\r\n this.grid.gridReady\r\n .pipe(takeUntilDestroyed(destroyRef))\r\n .subscribe(event => {\r\n this.applyState();\r\n });\r\n }\r\n\r\n override onSaveState(): void {\r\n this.setState(this.currentState);\r\n }\r\n\r\n private createState(): TableControlState | null {\r\n return {\r\n columns: this.grid.api.getColumnState(),\r\n filter: this.grid.api.getFilterModel(),\r\n pagination: this.paginationEnabled() ? {\r\n page: this.grid.api.paginationGetCurrentPage(),\r\n pageSize: this.grid.api.paginationGetPageSize(),\r\n } : null\r\n }\r\n }\r\n\r\n private applyState() {\r\n const state = this.getState<TableControlState>();\r\n if (state) {\r\n if (state.columns)\r\n this.grid.api.applyColumnState({ state: state.columns, applyOrder: true });\r\n if (state.filter)\r\n this.grid.api.setFilterModel(state.filter);\r\n if (state.pagination)\r\n this.applyPagination(state.pagination)\r\n }\r\n }\r\n\r\n private applyPagination(pagination: TablePaginationState) {\r\n if (!this.paginationEnabled()) return;\r\n this.applyPageSize(pagination.pageSize);\r\n this.applyPageNumber(pagination.page);\r\n }\r\n\r\n private applyPageSize(pageSize: number) {\r\n if (this.grid.api.paginationGetPageSize() != pageSize)\r\n this.grid.api.setGridOption('paginationPageSize', pageSize);\r\n }\r\n\r\n private applyPageNumber(pageNumber: number, subscribe: boolean = true) {\r\n if (this.grid.api.paginationGetCurrentPage() != pageNumber) {\r\n this.grid.api.paginationGoToPage(pageNumber);\r\n if (subscribe) {\r\n subscribeOnce(this.grid.firstDataRendered, () => {\r\n this.applyPageNumber(pageNumber, false);\r\n });\r\n } \r\n }\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Private Members\r\n\r\n private get grid(): AgGridAngular {\r\n const ref = this.getComponentRef();\r\n if (!(ref instanceof AgGridAngular)) {\r\n throw new Error(\r\n 'ComponentRef is not a AgGridAngular'\r\n );\r\n }\r\n return ref;\r\n }\r\n\r\n private paginationEnabled(): boolean {\r\n return this.grid.api.getGridOption('pagination') === true;\r\n }\r\n\r\n //#endregion\r\n}\r\n\r\ninterface TableControlState {\r\n columns: ColumnState[] | null\r\n filter: FilterModel | null\r\n pagination: TablePaginationState | null\r\n}\r\n\r\ninterface TablePaginationState {\r\n page: number,\r\n pageSize: number\r\n}\r\n\r\nexport interface OrderModelItem {\r\n colId: string;\r\n sort: 'asc' | 'desc';\r\n}\r\n\r\nexport interface OrderModel extends Array<OrderModelItem> { }\r\n","import type { FilterModel } from 'ag-grid-community';\r\nimport { SirioDataGrid, SirioGridState } from '@wemake4u/form-controls';\r\nimport { OrderModel, TableControl } from './table';\r\nimport {\r\n AgGridModelColumn,\r\n agFiltersToSirio,\r\n agOrderToSirio,\r\n sirioFiltersToAg,\r\n sirioSortToAg,\r\n} from '../dataSources/ag-grid-model';\r\n\r\n/**\r\n * Control of a `table` component rendered by the Sirio data grid (`DynamicFieldsComponent.useDataGrid`).\r\n * Same API as `TableControl` (ag-grid), so the form expressions work with both grids: filters and\r\n * sort use the ag-grid models, converted to the data grid ones (`ag-grid-model.ts`).\r\n *\r\n * It extends `TableControl` (overriding every method, nothing of ag-grid is used) so the code that\r\n * looks for the control by type (`getControlAs(name, TableControl)`) keeps working with both grids.\r\n *\r\n * When ag-grid is removed this content moves to `TableControl` (without the conversion, once the\r\n * forms use the data grid models) and `DataGridControl` is deleted.\r\n */\r\nexport class DataGridControl extends TableControl {\r\n\r\n override setFilter(filter: FilterModel): void {\r\n this.dataGrid.filters.set(agFiltersToSirio(filter, this.modelColumns()));\r\n }\r\n\r\n override getFilter(): FilterModel {\r\n return sirioFiltersToAg(this.dataGrid.filters(), this.modelColumns());\r\n }\r\n\r\n override clearFilter(): void {\r\n this.dataGrid.clearFilters();\r\n }\r\n\r\n override getOrder(): OrderModel {\r\n return sirioSortToAg(this.dataGrid.sort());\r\n }\r\n\r\n override setOrder(order: OrderModel): void {\r\n this.dataGrid.sort.set(agOrderToSirio(order));\r\n }\r\n\r\n /** Evaluates the data source expression again (as `TableControl`) and reloads a server source. */\r\n override refresh(): void {\r\n (this.dataGrid as any)._refresh?.();\r\n this.dataGrid.reload();\r\n }\r\n\r\n /** The data grid renders its rows from the data: nothing to redraw. */\r\n override redraw(): void {\r\n }\r\n\r\n //#region State\r\n\r\n private gridState: DataGridControlState | null = null;\r\n\r\n override onLoadState(): void {\r\n const subscription = this.dataGrid.stateChange.subscribe((state) => {\r\n this.gridState = { kind: DATA_GRID_STATE, state };\r\n });\r\n this.getDestroyRef().onDestroy(() => subscription.unsubscribe());\r\n this.restoreState();\r\n }\r\n\r\n override onSaveState(): void {\r\n this.setState(this.gridState);\r\n }\r\n\r\n /** Restores the saved state; a state saved by ag-grid (`TableControl`) is ignored. */\r\n private restoreState(): void {\r\n const saved = this.getState<DataGridControlState>();\r\n if (saved?.kind === DATA_GRID_STATE && saved.state) {\r\n this.dataGrid.setState(saved.state);\r\n this.gridState = saved;\r\n }\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Private Members\r\n\r\n private get dataGrid(): SirioDataGrid {\r\n const ref = this.getComponentRef();\r\n if (!(ref instanceof SirioDataGrid)) {\r\n throw new Error('ComponentRef is not a SirioDataGrid');\r\n }\r\n return ref;\r\n }\r\n\r\n /** Filter keys and types of the grid columns, for the ag-grid model conversion. */\r\n private modelColumns(): AgGridModelColumn[] {\r\n return this.dataGrid.columns().map((column) => ({ key: this.dataGrid.filterIdOf(column), field: column.field(), filter: column.filter() }));\r\n }\r\n\r\n //#endregion\r\n}\r\n\r\n/** Marker of the states saved by `DataGridControl` (the ag-grid ones have another format). */\r\nconst DATA_GRID_STATE = 'sirio-data-grid';\r\n\r\ninterface DataGridControlState {\r\n kind: typeof DATA_GRID_STATE;\r\n state: SirioGridState;\r\n}\r\n","import { Control } from \"./control\";\r\n\r\nexport class ButtonControl extends Control {\r\n\r\n /** The registered element is the native button (wmSirioButton of @wemake4u/form-controls). */\r\n focus(): void {\r\n (this.getElementRef()?.nativeElement as HTMLElement | undefined)?.focus();\r\n }\r\n\r\n}\r\n","import { Control } from \"./control\";\r\n\r\nexport class SeparatorControl extends Control {\r\n\r\n \r\n}\r\n","import { Control } from \"./control\";\r\n\r\nexport class SpacerControl extends Control {\r\n\r\n \r\n}\r\n","import { Control } from \"./control\";\r\n\r\nexport class IFrameControl extends Control {\r\n\r\n \r\n}\r\n","import { Control } from \"./control\";\r\n\r\nexport class TooltipControl extends Control {\r\n\r\n}\r\n","import { Control } from \"./control\";\r\n\r\nexport class DisplayFieldControl extends Control {\r\n\r\n \r\n}\r\n","import { Control } from \"./control\";\r\n\r\nexport class NavigatorControl extends Control {\r\n\r\n \r\n}\r\n","import { Control } from \"./control\";\r\n\r\nexport class TreelistControl extends Control {\r\n\r\n \r\n}\r\n","import { Control, ControlContext } from './control';\r\nimport { FormControl } from './form';\r\nimport { TextFieldControl } from './textfield';\r\nimport { SelectControl } from './select';\r\nimport { TagListControl } from './taglist';\r\nimport { NumberControl } from './number';\r\nimport { DateControl } from './date';\r\nimport { TimeControl } from './time';\r\nimport { DateTimeControl } from './datetime';\r\nimport { CheckBoxControl } from './checkbox';\r\nimport { RadioControl } from './radio';\r\nimport { CheckListControl } from './checklist';\r\nimport { TextAreaControl } from './textarea';\r\nimport { RangeControl } from './range';\r\nimport { FilePickerControl } from './filepicker';\r\nimport { TextControl } from './text';\r\nimport { HtmlControl } from './html';\r\nimport { ImageControl } from './image';\r\nimport { TabControl } from './tab';\r\nimport { ChartControl } from './chart';\r\nimport { AccordionControl } from './accordion';\r\nimport { DynamicListControl } from './dynamiclist';\r\nimport { GroupControl } from './group';\r\nimport { TableControl } from './table';\r\nimport { DataGridControl } from './data-grid';\r\nimport { SirioDataGrid } from '@wemake4u/form-controls';\r\nimport { ButtonControl } from './button';\r\nimport { SeparatorControl } from './separator';\r\nimport { SpacerControl } from './spacer';\r\nimport { IFrameControl } from './iframe';\r\nimport { TooltipControl } from './tooltip';\r\nimport { DisplayFieldControl } from './displayfield';\r\nimport { NavigatorControl } from './navigator';\r\nimport { TreelistControl } from './treerlist';\r\n\r\nexport function createControl(context: ControlContext): Control {\r\n\r\n switch (context.metadata.type) {\r\n\r\n case \"default\":\r\n return new FormControl(context);\r\n\r\n case \"textfield\":\r\n return new TextFieldControl(context);\r\n\r\n case \"select\":\r\n return new SelectControl(context);\r\n\r\n case \"taglist\":\r\n return new TagListControl(context);\r\n\r\n case \"number\":\r\n return new NumberControl(context);\r\n\r\n case \"datetime\":\r\n switch (context.metadata.subtype) {\r\n case \"date\":\r\n return new DateControl(context);\r\n case \"time\":\r\n return new TimeControl(context);\r\n case \"datetime\":\r\n return new DateTimeControl(context);\r\n default:\r\n return new Control(context);\r\n }\r\n\r\n case \"checkbox\":\r\n // Checkbox and toggle (subtype \"toggle\") are both rendered by wm-sirio-checkbox.\r\n return new CheckBoxControl(context);\r\n\r\n case \"radio\":\r\n // Radio buttons and chips (subtype \"chip\") are both rendered by wm-sirio-radio-group.\r\n return new RadioControl(context);\r\n\r\n case \"checklist\":\r\n // Checkbox list and chips (subtype \"chip\") are both rendered by wm-sirio-checklist.\r\n return new CheckListControl(context);\r\n\r\n case \"textarea\":\r\n return new TextAreaControl(context);\r\n\r\n case \"range\":\r\n return new RangeControl(context);\r\n\r\n case \"filepicker\":\r\n return new FilePickerControl(context);\r\n\r\n case \"displayfield\":\r\n return new DisplayFieldControl(context);\r\n\r\n case \"text\":\r\n return new TextControl(context);\r\n\r\n case \"html\":\r\n return new HtmlControl(context);\r\n\r\n case \"image\":\r\n return new ImageControl(context);\r\n\r\n case \"dynamiclist\":\r\n switch (context.metadata.subtype) {\r\n case \"tab\":\r\n return new TabControl(context);\r\n case \"accordion\":\r\n return new AccordionControl(context);\r\n default:\r\n return new DynamicListControl(context);\r\n }\r\n\r\n case \"group\":\r\n return new GroupControl(context);\r\n\r\n case \"table\":\r\n // Sirio data grid (DynamicFieldsComponent.useDataGrid) or ag-grid, from the rendered component.\r\n return context.componentRef instanceof SirioDataGrid\r\n ? new DataGridControl(context)\r\n : new TableControl(context);\r\n\r\n case \"chart\":\r\n return new ChartControl(context);\r\n\r\n case \"button\":\r\n return new ButtonControl(context);\r\n\r\n case \"separator\":\r\n return new SeparatorControl(context);\r\n\r\n case \"spacer\":\r\n return new SpacerControl(context);\r\n\r\n case \"iframe\":\r\n return new IFrameControl(context);\r\n\r\n case \"tooltip\":\r\n return new TooltipControl(context);\r\n\r\n case \"tab\":\r\n return new TabControl(context);\r\n\r\n case \"accordion\":\r\n return new AccordionControl(context);\r\n\r\n case \"navigator\":\r\n return new NavigatorControl(context);\r\n\r\n case \"treelist\":\r\n return new TreelistControl(context);\r\n\r\n default:\r\n return new Control(context);\r\n }\r\n}\r\n","import {\r\n Directive, Input, ElementRef, AfterContentInit, OnDestroy\r\n , ContentChild, ContentChildren, QueryList, forwardRef\r\n , DestroyRef, Injector\r\n} from '@angular/core';\r\nimport { RegisterService } from '../services/register.service';\r\nimport { createControl } from '../controls/factory';\r\nimport { DynamicFieldsComponent } from '../dynamic-fields/dynamic-fields.component';\r\nimport { IDynamicFieldsComponent } from '../dynamic-fields/dynamic-fields.interface';\r\nimport { ControlContext, ItemControl } from '../controls/control';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\n@Directive({\r\n selector: '[register]',\r\n standalone: true\r\n})\r\nexport class RegisterDirective implements AfterContentInit, OnDestroy {\r\n @Input() register: any = null;\r\n @Input() componentRef: any;\r\n @ContentChild(forwardRef(() => DynamicFieldsComponent)) dynamicField?: IDynamicFieldsComponent;\r\n @ContentChildren(forwardRef(() => DynamicFieldsComponent), { descendants: true }) itemFields!: QueryList<IDynamicFieldsComponent>;\r\n \r\n constructor(\r\n private el: ElementRef,\r\n private destroyRef: DestroyRef,\r\n private registerService: RegisterService,\r\n private injector: Injector\r\n )\r\n { }\r\n\r\n ngAfterContentInit(): void {\r\n this.registerControl();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.unregisterControl();\r\n }\r\n\r\n private registerControl(): void {\r\n const name = this.getName();\r\n const path = this.registerService.getPath();\r\n\r\n const createContext = (\r\n register: () => RegisterService | undefined\r\n ): ControlContext => ({\r\n name: name,\r\n path: path,\r\n metadata: this.register,\r\n componentRef: this.componentRef,\r\n elementRef: this.el,\r\n injector: this.injector,\r\n destroyRef: this.destroyRef,\r\n register\r\n });\r\n\r\n const noRegister = () => undefined;\r\n\r\n const register = () => (this.register.type === 'dynamiclist')\r\n ? this.createDynamicRegister(createContext(noRegister), this.itemFields)\r\n : this.dynamicField?.getRegister();\r\n\r\n const context = createContext(register);\r\n\r\n const control = createControl(context);\r\n\r\n this.registerService.register(name, control);\r\n }\r\n\r\n private unregisterControl(): void {\r\n this.registerService.unregister(this.getName());\r\n }\r\n\r\n private getName(): string {\r\n return this.register.name ?? this.register.id;\r\n }\r\n\r\n private createDynamicRegister(context: ControlContext\r\n , itemFields: QueryList<IDynamicFieldsComponent>): RegisterService {\r\n\r\n const newRegister = new RegisterService(null);\r\n\r\n const registerAll = (itemFields: QueryList<IDynamicFieldsComponent>) => {\r\n newRegister.unregisterAll();\r\n itemFields.forEach((itemField, index) => {\r\n const register = () => itemField.getRegister();\r\n const newName = `${context.name}-${index}`;\r\n const itemContext = {\r\n ...context,\r\n name: newName,\r\n register: register\r\n } \r\n const control = new ItemControl(itemContext, index);\r\n newRegister.register(newName, control);\r\n });\r\n }\r\n\r\n registerAll(itemFields);\r\n\r\n itemFields.changes\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((itemFields: QueryList<IDynamicFieldsComponent>) => {\r\n registerAll(itemFields);\r\n });\r\n\r\n return newRegister;\r\n }\r\n}\r\n","import { Directive, Input, AfterContentInit } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[refresh]',\r\n standalone: true\r\n})\r\nexport class RefreshDirective implements AfterContentInit {\r\n @Input() refresh: (() => void) | null = null;\r\n @Input() componentRef: any;\r\n\r\n constructor() {\r\n }\r\n\r\n ngAfterContentInit(): void {\r\n this.componentRef._refresh = this.refresh;\r\n }\r\n\r\n}\r\n","import { AfterViewInit, Directive, EventEmitter, Input, Output } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[navigatorState]',\r\n exportAs: 'navigatorState',\r\n standalone: true\r\n})\r\nexport class NavigatorStateDirective implements AfterViewInit {\r\n private _total = 0;\r\n private _index = 0;\r\n private _requestedIndex = 0;\r\n private initialized = false;\r\n\r\n ngAfterViewInit(): void {\r\n this.initialized = true;\r\n }\r\n\r\n @Output()\r\n indexChange = new EventEmitter<number>();\r\n\r\n @Input()\r\n set total(value: number) {\r\n this._total = value ?? 0;\r\n this.recalculate(false);\r\n }\r\n get total(): number {\r\n return this._total;\r\n }\r\n\r\n @Input()\r\n get index(): number {\r\n return this._index;\r\n }\r\n set index(value: number) {\r\n this._requestedIndex = value ?? 0;\r\n this.recalculate(true);\r\n }\r\n\r\n canNext(): boolean {\r\n return this._index < this._total - 1;\r\n }\r\n\r\n canPrevious(): boolean {\r\n return this._index > 0;\r\n }\r\n\r\n next(): void {\r\n if (this.canNext())\r\n this.setIndex(this._index + 1, true);\r\n }\r\n\r\n previous(): void {\r\n if (this.canPrevious())\r\n this.setIndex(this._index - 1, true);\r\n }\r\n\r\n private recalculate(preserveIndex: boolean): void {\r\n\r\n const newIndex =\r\n Math.max(0, Math.min(this._requestedIndex, this._total - 1));\r\n\r\n if (newIndex === this._index) {\r\n return;\r\n }\r\n\r\n this._index = newIndex;\r\n\r\n if (!preserveIndex)\r\n this._requestedIndex = this._index;\r\n\r\n if (this.initialized) {\r\n this.indexChange.emit(this._index);\r\n }\r\n }\r\n\r\n private setIndex(value: number, emit: boolean): void {\r\n\r\n if (value == null || isNaN(value)) {\r\n return;\r\n }\r\n\r\n this._requestedIndex = value;\r\n this.recalculate(false);\r\n }\r\n}\r\n","import { Injectable, OnDestroy, Renderer2 } from '@angular/core';\r\n\r\n@Injectable()\r\nexport class ListenerService implements OnDestroy {\r\n\r\n constructor(private renderer: Renderer2) {\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.listeners.forEach(remove => remove());\r\n this.listeners = [];\r\n }\r\n\r\n private listeners: Array<() => void> = [];\r\n\r\n listen(target: any, event: string, handler: (event: any) => void): void {\r\n const remove = this.renderer.listen(target, event, handler);\r\n this.listeners.push(remove);\r\n }\r\n}\r\n","import { Directive, ElementRef, Renderer2, Input, OnChanges, SimpleChanges, OnDestroy, DestroyRef } from '@angular/core';\r\nimport { ListenerService } from '../services/listener.service';\r\n\r\nimport { LanguageService } from '@wemake4u/interact';\r\nimport { Texts } from '../locale/locale';\r\nimport { localize } from '../locale/localize';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { EvaluateOptions } from '../services/programmability.service';\r\n\r\n@Directive({\r\n selector: '[collapse]',\r\n standalone: true,\r\n providers: [\r\n ListenerService\r\n ]\r\n})\r\nexport class CollapseDirective implements OnChanges, OnDestroy {\r\n @Input('collapse') maxHeight: number | null = null;\r\n @Input() onCollapse?: (options?: EvaluateOptions) => void;\r\n @Input() onExpand?: (options?: EvaluateOptions) => void;\r\n\r\n @Input(\"register\") component: any = null;\r\n\r\n private currentHeight: number | null = null;\r\n private button: HTMLButtonElement | null = null;\r\n private iconSpan: HTMLElement | null = null;\r\n private expanded = false;\r\n private viewInitialized = false;\r\n private timeoutFocusOut: any;\r\n private unlistenFocusOut!: () => void;\r\n \r\n constructor(private el: ElementRef\r\n , private renderer: Renderer2\r\n , private destroyRef: DestroyRef\r\n , private listenerService: ListenerService \r\n , private languageService: LanguageService) {\r\n\r\n languageService.onLanguageChanged()\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => this.applyCollapseLogic());\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.resetButton();\r\n this.resetFocusHandler(); \r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.viewInitialized = true;\r\n this.currentHeight = this.maxHeight;\r\n this.applyCollapseLogic();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['language'] || changes['maxHeight']) {\r\n this.currentHeight = this.maxHeight;\r\n if (this.viewInitialized) {\r\n this.applyCollapseLogic();\r\n }\r\n }\r\n }\r\n\r\n private get language(): string {\r\n return this.languageService.getLanguage();\r\n }\r\n\r\n private applyCollapseLogic(): void {\r\n \r\n this.resetStyles();\r\n \r\n this.resetButton();\r\n \r\n this.resetFocusHandler();\r\n\r\n if (this.maxHeight == null || this.maxHeight <= 0) {\r\n this.expanded = true;\r\n return;\r\n }\r\n\r\n this.expanded = false;\r\n\r\n this.applyStyle();\r\n\r\n const element = this.el.nativeElement as HTMLElement;\r\n\r\n setTimeout(() => {\r\n if (element.scrollHeight > this.maxHeight!) {\r\n this.applyButton();\r\n this.applyFocusHandler();\r\n }\r\n }, 100);\r\n \r\n }\r\n\r\n private applyStyle() {\r\n const element = this.el.nativeElement as HTMLElement;\r\n this.renderer.setStyle(element, 'overflow', 'hidden');\r\n this.renderer.setStyle(element, 'max-height', `${this.maxHeight}px`);\r\n }\r\n\r\n private resetStyles() {\r\n const element = this.el.nativeElement as HTMLElement;\r\n this.renderer.setStyle(element, 'overflow', null);\r\n this.renderer.setStyle(element, 'max-height', null);\r\n }\r\n\r\n private applyButton(): void {\r\n const element = this.el.nativeElement as HTMLElement;\r\n this.button = this.renderer.createElement('button');\r\n this.renderer.addClass(this.button, 'sirio-btn');\r\n this.renderer.setStyle(this.button, 'padding', '0px');\r\n\r\n const text = this.renderer.createText(this.locale(Texts, 'ReadMore'));\r\n\r\n this.iconSpan = this.renderer.createElement('span');\r\n this.renderer.addClass(this.iconSpan, 'fa');\r\n this.renderer.addClass(this.iconSpan, 'fa-chevron-down');\r\n \r\n this.renderer.appendChild(this.button, text);\r\n this.renderer.appendChild(this.button, this.iconSpan);\r\n\r\n this.listenerService.listen(this.button, 'click', () => this.toggleExpand());\r\n\r\n this.renderer.setStyle(this.button, 'margin-top', '8px');\r\n\r\n this.renderer.appendChild(element.parentNode, this.button);\r\n }\r\n\r\n private resetButton() {\r\n if (this.button && this.button.parentNode) {\r\n this.renderer.removeChild(this.button.parentNode, this.button);\r\n this.button = null; \r\n }\r\n }\r\n\r\n private applyFocusHandler() {\r\n const element = this.el.nativeElement as HTMLElement;\r\n this.unlistenFocusOut = this.renderer.listen(element, 'focusout', () => {\r\n clearTimeout(this.timeoutFocusOut);\r\n this.timeoutFocusOut = setTimeout(() => {\r\n if (!element.contains(document.activeElement)) {\r\n element.scrollTop = 0;\r\n //console.log('NESSUN elemento interno ha più il focus');\r\n }\r\n }, 0);\r\n });\r\n }\r\n\r\n private resetFocusHandler() {\r\n if (this.unlistenFocusOut) {\r\n this.unlistenFocusOut();\r\n }\r\n clearTimeout(this.timeoutFocusOut);\r\n }\r\n\r\n private toggleExpand(): void {\r\n this.expanded = !this.expanded;\r\n if (this.expanded) {\r\n this.expand();\r\n } else {\r\n this.collapse();\r\n }\r\n }\r\n\r\n private expand(): void {\r\n const element = this.el.nativeElement as HTMLElement;\r\n this.renderer.setStyle(element, 'max-height', 'none');\r\n this.renderer.setStyle(element, 'overflow', 'visible');\r\n this.button!.childNodes[0].textContent = this.locale(Texts, 'ReadLess');\r\n this.updateIcon('fa-chevron-up', 'fa-chevron-down');\r\n this.onExpandOccurred();\r\n }\r\n\r\n private collapse(): void {\r\n const element = this.el.nativeElement as HTMLElement;\r\n this.renderer.setStyle(element, 'max-height', `${this.currentHeight}px`);\r\n this.renderer.setStyle(element, 'overflow', 'hidden');\r\n this.button!.childNodes[0].textContent = this.locale(Texts, 'ReadMore');\r\n this.updateIcon('fa-chevron-down', 'fa-chevron-up');\r\n this.onCollapseOccurred();\r\n }\r\n\r\n private updateIcon(add: string, remove: string) {\r\n if (this.iconSpan) {\r\n this.renderer.removeClass(this.iconSpan, remove);\r\n this.renderer.addClass(this.iconSpan, add);\r\n }\r\n }\r\n\r\n private locale(component: any, key: string): string {\r\n return localize(this.language, component, key);\r\n }\r\n\r\n private onExpandOccurred() {\r\n if (this.onExpand)\r\n this.onExpand({ invokeArgs: [] });\r\n }\r\n\r\n private onCollapseOccurred() {\r\n if (this.onCollapse)\r\n this.onCollapse({ invokeArgs: [] });\r\n }\r\n}\r\n","import { Directive, ElementRef, AfterViewInit, Input, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { ListenerService } from '../services/listener.service';\r\n\r\n@Directive({\r\n selector: '[treelist]',\r\n standalone: true,\r\n providers: [\r\n ListenerService\r\n ]\r\n})\r\nexport class TreeListDirective implements OnChanges, AfterViewInit {\r\n\r\n @Input('treelist') nodes: any[] = [];\r\n\r\n constructor(private el: ElementRef\r\n , private listenerService: ListenerService) {\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['nodes'] && this.initialized) {\r\n this.rebuild();\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.initialized = true;\r\n this.rebuild(); \r\n }\r\n\r\n private initialized = false;\r\n private rows: HTMLTableRowElement[] = [];\r\n\r\n private rebuild() {\r\n queueMicrotask(() => {\r\n this.rows = Array.from(this.el.nativeElement.querySelectorAll('tbody tr'));\r\n this.initToggles();\r\n this.refreshTree(); \r\n });\r\n }\r\n\r\n private getChildren(id: string): HTMLTableRowElement[] {\r\n return this.rows.filter(r => r.dataset['parent'] === id);\r\n }\r\n\r\n private setVisible(row: HTMLTableRowElement, visible: boolean) {\r\n row.classList.toggle('hidden', !visible);\r\n }\r\n\r\n private updateVisibility(parentId: string, parentVisible: boolean, parentExpanded: boolean) {\r\n const children = this.getChildren(parentId);\r\n\r\n for (const child of children) {\r\n const childVisible = parentVisible && parentExpanded;\r\n this.setVisible(child, childVisible);\r\n\r\n const childExpanded = child.dataset['expanded'] === 'true';\r\n this.updateVisibility(child.dataset['id']!, childVisible, childExpanded);\r\n }\r\n }\r\n\r\n private isExpanded(row: HTMLTableRowElement): boolean {\r\n return row.dataset['expanded'] === 'true';\r\n }\r\n\r\n private refreshTree() {\r\n this.rows\r\n .filter(r => !r.dataset['parent'])\r\n .forEach(root => {\r\n this.setVisible(root, true);\r\n this.updateVisibility(\r\n root.dataset['id']!,\r\n true,\r\n root.dataset['expanded'] === 'true'\r\n );\r\n });\r\n }\r\n\r\n private initToggles() {\r\n const toggles = this.el.nativeElement.querySelectorAll('.toggle');\r\n toggles.forEach((toggle: any) => {\r\n if (toggle.dataset['bound'] === 'true') {\r\n return;\r\n }\r\n toggle.dataset['bound'] = 'true';\r\n const row = toggle.closest('tr') as HTMLTableRowElement;\r\n this.refreshToggleIcon(toggle, this.isExpanded(row));\r\n this.listenerService.listen(toggle, 'click', (e: Event) => {\r\n e.stopPropagation();\r\n const expanded = this.isExpanded(row);\r\n row.dataset['expanded'] = (!expanded).toString();\r\n this.refreshToggleIcon(toggle, this.isExpanded(row));\r\n this.refreshTree();\r\n });\r\n });\r\n }\r\n\r\n private refreshToggleIcon(target: HTMLElement, expanded: boolean)\r\n { \r\n target.classList.remove('fas', 'fa-angle-down', 'fa-angle-right');\r\n target.classList.add('fas');\r\n target.classList.add(expanded ? 'fa-angle-down' : 'fa-angle-right');\r\n }\r\n}\r\n","import { DestroyRef, Directive, Input } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { finalize, isObservable, Observable, take } from 'rxjs';\r\nimport { ToastService } from '../services/toast.service';\r\nimport { downloadBlob, downloadFile } from '@wemake4u/interact'\r\n\r\n@Directive({\r\n selector: '[fileHandler]',\r\n exportAs: 'fileHandler',\r\n standalone: true\r\n})\r\nexport class FileHandlerDirective {\r\n\r\n constructor(\r\n protected toastService: ToastService,\r\n protected destroyRef: DestroyRef\r\n ) { }\r\n\r\n @Input()\r\n downloadHandler?: (file: any) => Observable<any> | string;\r\n\r\n getExtension(file?: FileInfo | null): string {\r\n const name = file?.name?.trim();\r\n\r\n if (!name) {\r\n return '';\r\n }\r\n\r\n const index = name.lastIndexOf('.');\r\n\r\n if (index < 0 || index === name.length - 1) {\r\n return '';\r\n }\r\n\r\n return name.substring(index + 1).toUpperCase();\r\n }\r\n\r\n getIcon(file: File): string {\r\n const extension = this.getExtension(file).toLowerCase();\r\n return FILE_ICONS[extension] ?? 'fa-file';\r\n }\r\n\r\n getSize(file?: FileInfo | null): string {\r\n const size = file?.size;\r\n\r\n if (\r\n typeof size !== 'number' ||\r\n !Number.isFinite(size) ||\r\n size < 0\r\n ) {\r\n return '';\r\n }\r\n\r\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\r\n\r\n let value = size;\r\n let unit = 0;\r\n\r\n while (\r\n value >= 1024 &&\r\n unit < units.length - 1\r\n ) {\r\n value /= 1024;\r\n unit++;\r\n }\r\n\r\n const decimals =\r\n unit === 0\r\n ? 0\r\n : value < 10\r\n ? 1\r\n : 0;\r\n\r\n return `${value.toFixed(decimals)} ${units[unit]}`;\r\n }\r\n\r\n canDownload(file: any): boolean {\r\n return this.isLocal(file)\r\n || (this.isHandled(file) && !this.isDownloading(file));\r\n }\r\n\r\n isLocal(file: any): file is File {\r\n return file instanceof File;\r\n }\r\n\r\n downloadLocal(file: File): void {\r\n downloadBlob(file, file.name); \r\n }\r\n\r\n isHandled(file: any): file is { name: string, type: string } {\r\n return !this.isLocal(file)\r\n && typeof file === 'object'\r\n && file !== null\r\n && 'name' in file\r\n && 'type' in file \r\n && typeof file.name === 'string'\r\n && this.downloadHandler != null;\r\n }\r\n\r\n downloadHandled(file: any): void {\r\n\r\n if (!this.downloadHandler || !this.isHandled(file))\r\n return;\r\n\r\n const downloadResult = this.downloadHandler(file);\r\n\r\n if (typeof downloadResult === 'string') {\r\n this.downloadUrl(downloadResult, file.name); \r\n }\r\n\r\n if (isObservable(downloadResult)) {\r\n\r\n this.downloadingHandled.add(file);\r\n\r\n downloadResult\r\n .pipe(\r\n take(1),\r\n finalize(() => this.downloadingHandled.delete(file)),\r\n takeUntilDestroyed(this.destroyRef)\r\n )\r\n .subscribe({\r\n next: (result: any) => {\r\n if (this.isBase64(result)) {\r\n downloadFile(result, file.name, file.type);\r\n }\r\n else if (this.isUri(result)) {\r\n this.downloadUrl(result, file.name);\r\n }\r\n },\r\n error: error => {\r\n this.logError(error);\r\n }\r\n });\r\n }\r\n }\r\n\r\n isDownloading(file: any): boolean {\r\n return this.downloadingHandled.has(file);\r\n }\r\n\r\n private readonly downloadingHandled = new WeakSet<object>();\r\n\r\n private downloadUrl(url: string, fileName: string) {\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = fileName;\r\n link.target = '_blank';\r\n link.click();\r\n }\r\n\r\n private isBase64(value: string): boolean {\r\n if (!value) {\r\n return false;\r\n }\r\n\r\n // Data URI\r\n if (value.startsWith('data:')) {\r\n return value.includes(';base64,');\r\n }\r\n\r\n // Lunghezza multipla di 4\r\n if (value.length % 4 !== 0) {\r\n return false;\r\n }\r\n\r\n // Caratteri validi Base64\r\n if (!/^[A-Za-z0-9+/]*={0,2}$/.test(value)) {\r\n return false;\r\n }\r\n\r\n try {\r\n atob(value);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n private isUri(value: string): boolean {\r\n try {\r\n new URL(value, window.location.origin);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n protected logError(error: Error) {\r\n if (!error) return;\r\n console.error(error);\r\n if (error.message)\r\n this.toastService.notifyError(error.message);\r\n }\r\n\r\n}\r\n\r\ntype FileInfo = Pick<File, 'name' | 'size'>;\r\n\r\nconst FILE_ICONS: Record<string, string> = {\r\n zip: 'fa-file-zipper',\r\n rar: 'fa-file-zipper',\r\n '7z': 'fa-file-zipper',\r\n tar: 'fa-file-zipper',\r\n gz: 'fa-file-zipper',\r\n\r\n doc: 'fa-file-word',\r\n docx: 'fa-file-word',\r\n\r\n ppt: 'fa-file-powerpoint',\r\n pptx: 'fa-file-powerpoint',\r\n\r\n txt: 'fa-file-lines',\r\n log: 'fa-file-lines',\r\n md: 'fa-file-lines',\r\n\r\n pdf: 'fa-file-pdf',\r\n\r\n jpg: 'fa-file-image',\r\n jpeg: 'fa-file-image',\r\n png: 'fa-file-image',\r\n gif: 'fa-file-image',\r\n bmp: 'fa-file-image',\r\n svg: 'fa-file-image',\r\n webp: 'fa-file-image',\r\n\r\n xls: 'fa-file-excel',\r\n xlsx: 'fa-file-excel',\r\n\r\n csv: 'fa-file-csv',\r\n\r\n mp3: 'fa-file-audio',\r\n wav: 'fa-file-audio',\r\n ogg: 'fa-file-audio',\r\n flac: 'fa-file-audio',\r\n aac: 'fa-file-audio',\r\n m4a: 'fa-file-audio',\r\n wma: 'fa-file-audio',\r\n\r\n mp4: 'fa-file-video',\r\n avi: 'fa-file-video',\r\n mov: 'fa-file-video',\r\n wmv: 'fa-file-video',\r\n mkv: 'fa-file-video',\r\n webm: 'fa-file-video',\r\n mpeg: 'fa-file-video',\r\n mpg: 'fa-file-video',\r\n m4v: 'fa-file-video',\r\n\r\n html: 'fa-file-code',\r\n css: 'fa-file-code',\r\n js: 'fa-file-code',\r\n ts: 'fa-file-code',\r\n json: 'fa-file-code',\r\n xml: 'fa-file-code',\r\n cs: 'fa-file-code',\r\n java: 'fa-file-code',\r\n py: 'fa-file-code',\r\n sql: 'fa-file-code'\r\n};\r\n","import { DestroyRef, Directive, OnInit, Self } from '@angular/core';\r\nimport { NgControl } from '@angular/forms';\r\nimport { SubscribeService } from '../services/subscribe.service';\r\n\r\n@Directive({\r\n selector: 'wm-sirio-file-upload',\r\n standalone: true\r\n})\r\nexport class JsonFileDirective implements OnInit {\r\n\r\n constructor(\r\n @Self() private ngControl: NgControl,\r\n private subscribe: SubscribeService,\r\n private destroyRef: DestroyRef\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n\r\n const control = this.ngControl.control;\r\n\r\n if (!control)\r\n return;\r\n\r\n this.subscribe.subscribeChanges(control.valueChanges, control, undefined, this.destroyRef, (_, n) => this.defineJson(n));\r\n\r\n }\r\n\r\n private defineJson(value: any): void {\r\n\r\n if (!Array.isArray(value)) {\r\n return;\r\n }\r\n\r\n for (const item of value) {\r\n\r\n if (!(item instanceof File)) {\r\n continue;\r\n }\r\n\r\n if (typeof (item as any).toJSON === 'function') {\r\n continue;\r\n }\r\n\r\n Object.defineProperty(item, 'toJSON', {\r\n value() {\r\n return {\r\n ...this,\r\n name: this.name,\r\n size: this.size,\r\n type: this.type,\r\n lastModified: this.lastModified\r\n };\r\n },\r\n writable: true,\r\n configurable: true,\r\n enumerable: false\r\n });\r\n }\r\n }\r\n \r\n}\r\n","import { Directive, ElementRef, Renderer2, effect, input } from '@angular/core';\r\n\r\ntype AttrMap = Record<string, string | number | boolean | null | undefined>;\r\n\r\n@Directive({\r\n selector: '[ngAttrs]',\r\n standalone: true,\r\n})\r\nexport class AttrsDirective {\r\n ngAttrs = input<AttrMap | null>(null);\r\n\r\n // Keep track of what we set, so removed keys can be cleaned up\r\n private previous: AttrMap = {};\r\n\r\n constructor(private el: ElementRef<HTMLElement>, private renderer: Renderer2) {\r\n effect(() => {\r\n const next = this.ngAttrs() ?? {};\r\n const node = this.el.nativeElement;\r\n\r\n // Remove attributes no longer present\r\n for (const key of Object.keys(this.previous)) {\r\n if (!(key in next)) this.renderer.removeAttribute(node, key);\r\n }\r\n\r\n // Set or remove attributes based on the new values\r\n for (const [key, value] of Object.entries(next)) {\r\n if (value === null || value === undefined || value === false) {\r\n this.renderer.removeAttribute(node, key);\r\n } else {\r\n this.renderer.setAttribute(node, key, value === true ? '' : String(value));\r\n }\r\n }\r\n\r\n this.previous = { ...next };\r\n });\r\n }\r\n}\r\n","import { Directive, ElementRef, Optional, AfterViewInit, OnDestroy, Input } from '@angular/core';\r\nimport { NgControl } from '@angular/forms';\r\nimport { ValidationService } from '../services/validation.service'\r\n\r\n@Directive({\r\n selector: '[requiredOnInput]',\r\n standalone: true\r\n})\r\nexport class RequiredOnInputDirective implements AfterViewInit, OnDestroy {\r\n @Input(\"requiredOnInput\") required: any;\r\n\r\n constructor(private validationService: ValidationService,\r\n private host: ElementRef<HTMLElement>,\r\n @Optional() private ngControl: NgControl | null) {\r\n }\r\n\r\n private removeListener?: () => void;\r\n\r\n private wasEmpty: boolean | null = null;\r\n\r\n ngOnDestroy(): void {\r\n this.removeListener?.();\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n\r\n if (this.required !== true) return;\r\n\r\n // Form control and native input of the @wemake4u/form-controls control.\r\n const control = this.ngControl?.control;\r\n const input: HTMLInputElement | HTMLTextAreaElement | null =\r\n this.host.nativeElement.querySelector('input, textarea');\r\n\r\n if (!control || !input) return;\r\n\r\n this.wasEmpty = this.isEmpty(control.value);\r\n\r\n const handler = () => {\r\n\r\n const isEmpty = this.isEmpty(input.value);\r\n\r\n if (this.wasEmpty !== isEmpty) {\r\n\r\n var errors = this.validationService.validateRequired(control, input.value);\r\n\r\n control.setErrors(errors);\r\n\r\n this.wasEmpty = isEmpty;\r\n }\r\n };\r\n\r\n input.addEventListener('input', handler);\r\n\r\n this.removeListener = () => {\r\n input.removeEventListener('input', handler);\r\n };\r\n }\r\n\r\n private isEmpty(value: string) {\r\n return (value ?? \"\").toString().length === 0;\r\n }\r\n}\r\n\r\n","import { Directive, Input, HostListener, Optional, Self, ElementRef } from '@angular/core';\r\nimport { AbstractControl, NgControl } from '@angular/forms';\r\nimport { ValidationService } from '../services/validation.service';\r\n\r\n@Directive({\r\n selector: '[requiredOnBlur]',\r\n standalone: true\r\n})\r\nexport class RequiredOnBlurDirective {\r\n @Input(\"requiredOnBlur\") required: any;\r\n\r\n constructor(\r\n private host: ElementRef<HTMLElement>\r\n , @Optional() @Self() private ngControl: NgControl\r\n , public validationService: ValidationService) {\r\n }\r\n\r\n @HostListener('focusout', ['$event'])\r\n onFocusOut(event: FocusEvent): void {\r\n if (!this.required\r\n || !this.validationService.allowSilentError()\r\n ) return;\r\n\r\n const control = this.control;\r\n if (!control) return;\r\n\r\n if (this.isInsideHost(event.relatedTarget)) return;\r\n\r\n this.validationService.revealSilentErrors([control]); \r\n }\r\n\r\n private get control(): AbstractControl | null {\r\n return this.ngControl?.control ?? null;\r\n }\r\n\r\n private isInsideHost(target: EventTarget | null): boolean {\r\n return target instanceof Node\r\n && this.host.nativeElement.contains(target);\r\n }\r\n}\r\n\r\n","import { Directive, HostListener, Input } from '@angular/core';\r\nimport { EvaluateOptions } from '../services/programmability.service';\r\n\r\n@Directive({\r\n selector: '[markdown]',\r\n standalone: true\r\n})\r\nexport class MarkdownDirective {\r\n @Input() onAnchorClick?: (options?: EvaluateOptions) => void;\r\n\r\n @HostListener('click', ['$event'])\r\n onClick(event: MouseEvent): void {\r\n if (event.target instanceof HTMLAnchorElement) {\r\n const action = event.target.dataset['action'];\r\n if (this.onAnchorClick && action) {\r\n event.preventDefault();\r\n this.onAnchorClick(this.getOptions(action)); \r\n } \r\n }\r\n }\r\n\r\n private getOptions(action: string): EvaluateOptions {\r\n const event = {\r\n action: action\r\n };\r\n return {\r\n cacheable: false,\r\n extendContext: () => ({\r\n \"event\": event\r\n }),\r\n invokeArgs: [event]\r\n }\r\n }\r\n\r\n}\r\n","import {\r\n AfterViewInit, Directive, ElementRef, Input, OnChanges, OnDestroy, OnInit,\r\n Optional, SimpleChanges, SkipSelf,\r\n} from '@angular/core';\r\nimport { AbstractControl } from '@angular/forms';\r\nimport { BehaviorSubject, Subscription } from 'rxjs';\r\nimport { EvaluateOptions } from '../services/programmability.service';\r\n\r\nexport type SelectionMode = 'none' | 'single' | 'multiple';\r\n\r\nexport interface SelectionChangedEvent {\r\n controls: AbstractControl[];\r\n elements: HTMLElement[];\r\n}\r\n\r\n// Row element -> row control\r\nconst itemRegistry = new WeakMap<Element, AbstractControl>();\r\nconst ITEM_ATTR = 'data-selection-item';\r\n\r\n// Marks tabindex values set by the directive, so user-defined ones are never touched\r\nconst TAB_MARK = 'data-selection-tab';\r\n\r\n@Directive({\r\n selector: '[selectionGroup]',\r\n standalone: true,\r\n host: {\r\n '(click)': 'onActivate($event)',\r\n '(keydown.enter)': 'onActivate($event)',\r\n '(keydown.space)': 'onActivate($event)',\r\n },\r\n})\r\nexport class SelectionGroupDirective implements OnChanges, OnInit, AfterViewInit, OnDestroy {\r\n // Accept any string and fall back to 'none' for unknown values\r\n @Input()\r\n set selectionMode(value: string | null | undefined) {\r\n this._selectionMode = value === 'single' || value === 'multiple' ? value : 'none';\r\n }\r\n get selectionMode(): SelectionMode {\r\n return this._selectionMode;\r\n }\r\n private _selectionMode: SelectionMode = 'none';\r\n\r\n @Input() selectableClass: string | null | undefined = 'selectable';\r\n @Input() selectedClass: string | null | undefined = 'is-selected';\r\n\r\n @Input() onSelectionChanged?: (options?: EvaluateOptions) => void;\r\n\r\n //@Output() selectionChanged = new EventEmitter<SelectionChangedEvent>();\r\n\r\n // Emits whether selection is enabled for this group or any ancestor group\r\n readonly activeChange = new BehaviorSubject<boolean>(false);\r\n\r\n get isActive(): boolean {\r\n return this.activeChange.value;\r\n }\r\n\r\n private host: HTMLElement;\r\n private selected = new Set<HTMLElement>();\r\n private observer?: MutationObserver;\r\n private parentSub?: Subscription;\r\n\r\n constructor(\r\n elementRef: ElementRef<HTMLElement>,\r\n // Closest ancestor selection group, if any (e.g. the outer DynamicList)\r\n @Optional() @SkipSelf() private parentGroup: SelectionGroupDirective | null,\r\n ) {\r\n this.host = elementRef.nativeElement;\r\n this.host.setAttribute('data-selection', this._selectionMode);\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['selectionMode']) {\r\n this.host.setAttribute('data-selection', this.selectionMode);\r\n // Clear selection when it gets disabled\r\n if (this.selectionMode === 'none') this.clear();\r\n this.updateActive();\r\n }\r\n this.refreshTabIndex();\r\n }\r\n\r\n ngOnInit(): void {\r\n // Re-evaluate when an ancestor group toggles its selection\r\n this.parentSub = this.parentGroup?.activeChange.subscribe(() => this.updateActive());\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.refreshTabIndex();\r\n // Track items added/removed, class changes and nested groups toggling their mode\r\n this.observer = new MutationObserver(() => {\r\n this.pruneSelection();\r\n this.refreshTabIndex();\r\n });\r\n this.observer.observe(this.host, {\r\n subtree: true,\r\n childList: true,\r\n attributes: true,\r\n attributeFilter: ['class', 'data-selection'],\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.observer?.disconnect();\r\n this.parentSub?.unsubscribe();\r\n this.activeChange.complete();\r\n }\r\n\r\n onActivate(event: Event): void {\r\n const mode = this.selectionMode;\r\n if (mode === 'none') return;\r\n\r\n const item = (event.target as Element).closest<HTMLElement>(this.selector());\r\n // The item must belong to this group, not to a nested group with selection enabled\r\n if (!item || ownerOf(item) !== this.host) return;\r\n\r\n if (event instanceof KeyboardEvent) {\r\n // React only when focus is on the item itself, not on inputs inside it\r\n if (event.target !== item) return;\r\n event.preventDefault();\r\n }\r\n\r\n if (mode === 'single') {\r\n if (this.selected.has(item)) return;\r\n this.selected.forEach(el => this.mark(el, false));\r\n this.mark(item, true);\r\n } else {\r\n this.mark(item, !this.selected.has(item));\r\n }\r\n this.emit();\r\n }\r\n\r\n clear(): void {\r\n if (!this.selected.size) return;\r\n this.selected.forEach(el => this.mark(el, false));\r\n this.emit();\r\n }\r\n\r\n private updateActive(): void {\r\n const active = this.selectionMode !== 'none' || !!this.parentGroup?.isActive;\r\n if (active !== this.activeChange.value) {\r\n this.activeChange.next(active);\r\n }\r\n }\r\n\r\n // Drop selected elements that are no longer valid items of this group and notify the change\r\n private pruneSelection(): void {\r\n if (!this.selected.size) return;\r\n\r\n const selector = this.selector();\r\n let changed = false;\r\n\r\n for (const el of [...this.selected]) {\r\n const stillValid = el.isConnected\r\n && this.host.contains(el)\r\n && el.matches(selector)\r\n && ownerOf(el) === this.host;\r\n\r\n if (!stillValid) {\r\n // Remove the selected class too, in case the element is reattached later\r\n this.mark(el, false);\r\n changed = true;\r\n }\r\n }\r\n\r\n if (changed) this.emit();\r\n }\r\n\r\n // Make owned selectable items focusable, release the ones no longer owned\r\n private refreshTabIndex(): void {\r\n const owned = new Set(\r\n this.selectionMode === 'none'\r\n ? []\r\n : Array.from(this.host.querySelectorAll<HTMLElement>(this.selector()))\r\n .filter(el => ownerOf(el) === this.host),\r\n );\r\n\r\n owned.forEach(el => {\r\n if (!el.hasAttribute('tabindex')) {\r\n el.setAttribute('tabindex', '0');\r\n el.setAttribute(TAB_MARK, '');\r\n }\r\n });\r\n\r\n this.host.querySelectorAll<HTMLElement>(`[${TAB_MARK}]`).forEach(el => {\r\n const owner = ownerOf(el);\r\n // Leave it to another active group if one owns it now\r\n if (!owned.has(el) && (owner === null || owner === this.host)) {\r\n el.removeAttribute('tabindex');\r\n el.removeAttribute(TAB_MARK);\r\n }\r\n });\r\n }\r\n\r\n private selector(): string {\r\n return '.' + CSS.escape(normalize(this.selectableClass) || 'selectable');\r\n }\r\n\r\n private mark(el: HTMLElement, on: boolean): void {\r\n el.classList.toggle(normalize(this.selectedClass) || 'is-selected', on);\r\n on ? this.selected.add(el) : this.selected.delete(el);\r\n }\r\n\r\n private emit(): void {\r\n\r\n if (!this.onSelectionChanged) return;\r\n\r\n // Drop elements removed from the DOM in the meantime\r\n const elements = [...this.selected].filter(el => el.isConnected);\r\n\r\n // Resolve the control of the nearest row; dedupe if a row has several selectable elements\r\n const controls = new Set<AbstractControl>();\r\n for (const el of elements) {\r\n const row = el.closest(`[${ITEM_ATTR}]`);\r\n const control = row && itemRegistry.get(row);\r\n if (control) controls.add(control);\r\n }\r\n\r\n const event = {\r\n selectedItems: [...controls]\r\n };\r\n\r\n const options: EvaluateOptions = {\r\n extendContext: () => ({\r\n \"event\": event\r\n }),\r\n invokeArgs: [event]\r\n };\r\n\r\n this.onSelectionChanged(options);\r\n }\r\n}\r\n\r\n@Directive({\r\n selector: '[selectionItem]',\r\n standalone: true,\r\n})\r\nexport class SelectionItemDirective implements OnChanges, OnInit, OnDestroy {\r\n @Input() selectionItem: AbstractControl | null = null;\r\n\r\n private active = false;\r\n private sub?: Subscription;\r\n\r\n constructor(\r\n private elementRef: ElementRef<HTMLElement>,\r\n @Optional() private group: SelectionGroupDirective | null,\r\n ) { }\r\n\r\n ngOnChanges(): void {\r\n // The row control may be replaced\r\n this.update();\r\n }\r\n\r\n ngOnInit(): void {\r\n // Nothing to do outside a selection group\r\n if (!this.group) return;\r\n\r\n this.sub = this.group.activeChange.subscribe(active => {\r\n this.active = active;\r\n this.update();\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.sub?.unsubscribe();\r\n itemRegistry.delete(this.elementRef.nativeElement);\r\n }\r\n\r\n // Register only while selection is enabled for this row\r\n private update(): void {\r\n const el = this.elementRef.nativeElement;\r\n if (this.active && this.selectionItem) {\r\n itemRegistry.set(el, this.selectionItem);\r\n el.setAttribute(ITEM_ATTR, '');\r\n } else {\r\n itemRegistry.delete(el);\r\n el.removeAttribute(ITEM_ATTR);\r\n }\r\n }\r\n}\r\n\r\n// Nearest ancestor group with selection enabled\r\nfunction ownerOf(el: Element): Element | null {\r\n return el.parentElement?.closest('[data-selection]:not([data-selection=\"none\"])') ?? null;\r\n}\r\n\r\n// Accept both \"selectable\" and \".selectable\"\r\nfunction normalize(value: string | null | undefined): string {\r\n return (value ?? '').trim().replace(/^\\./, '');\r\n}\r\n","import {\r\n Component, Input, AfterViewInit, ViewChild, ViewContainerRef, Injector,\r\n Type, ComponentRef, OnChanges, SimpleChanges,\r\n OnDestroy,\r\n EventEmitter,\r\n DestroyRef,\r\n ChangeDetectionStrategy\r\n} from '@angular/core';\r\nimport { FormGroup, ControlValueAccessor } from '@angular/forms';\r\nimport { GlobalService } from '../services/global.service';\r\nimport { isObservable, Subscription, distinctUntilChanged, map } from 'rxjs';\r\nimport { take } from 'rxjs/operators';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\n\r\n@Component({\r\n selector: 'app-dynamic-host',\r\n templateUrl: './dynamic-host.component.html',\r\n styleUrls: [\r\n './dynamic-host.component.css'],\r\n changeDetection: ChangeDetectionStrategy.Eager,\r\n standalone: true\r\n})\r\nexport class DynamicHostComponent implements AfterViewInit, OnChanges, OnDestroy {\r\n @Input(\"register\") component!: any;\r\n @Input() properties: Record<string, any> | null = null;\r\n @Input() formGroup!: FormGroup;\r\n @ViewChild('container', { read: ViewContainerRef, static: true }) container!: ViewContainerRef;\r\n\r\n constructor(private injector: Injector,\r\n private globalService: GlobalService,\r\n private destroyRef: DestroyRef) {\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.statusSub) {\r\n this.statusSub.unsubscribe();\r\n }\r\n } \r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[\"properties\"]) {\r\n this.setProperties();\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n const componentType = this.resolveComponentType(this.component.component);\r\n if (componentType) {\r\n this.componentRef = this.container.createComponent(componentType, {\r\n injector: this.injector,\r\n });\r\n\r\n if (this.isBindable()) {\r\n this.setBinding();\r\n }\r\n \r\n this.setProperties();\r\n }\r\n }\r\n\r\n getComponentRef(): ComponentRef<any> | null {\r\n return this.componentRef;\r\n }\r\n\r\n //#region Private Members\r\n\r\n private componentRef: ComponentRef<any> | null = null;\r\n\r\n private statusSub: Subscription | null = null;\r\n\r\n private subscriptions = new Map<string, Subscription>();\r\n\r\n private isBindable(): boolean {\r\n if (!this.componentRef) return false;\r\n return this.component.isInput\r\n && this.component.key\r\n && this.isControlValueAccessor(this.componentRef.instance);\r\n }\r\n\r\n private setBinding() {\r\n if (!this.componentRef) return;\r\n\r\n const key = this.component.key;\r\n const instance = this.componentRef.instance;\r\n\r\n if (!this.isControlValueAccessor(instance)) return;\r\n\r\n let formControl = this.formGroup.get(key);\r\n\r\n if (!formControl) {\r\n return;\r\n }\r\n\r\n instance.writeValue(formControl.value);\r\n\r\n instance.registerOnChange((value: any) => {\r\n formControl.setValue(value);\r\n });\r\n\r\n instance.registerOnTouched(() => {\r\n formControl.markAsTouched();\r\n });\r\n\r\n const setDisabledState = instance.setDisabledState;\r\n\r\n if (typeof setDisabledState === 'function') {\r\n const invoke = setDisabledState.bind(instance);\r\n this.statusSub = formControl.statusChanges\r\n .pipe(\r\n map(() => formControl.disabled),\r\n distinctUntilChanged()\r\n )\r\n .subscribe(isDisabled => {\r\n invoke(isDisabled);\r\n });\r\n invoke(formControl.disabled);\r\n }\r\n }\r\n\r\n private setProperties(): void {\r\n if (!this.componentRef) return;\r\n const properties = this.properties ?? {};\r\n if (this.validProperties(properties)) {\r\n for (const key of Object.keys(properties)) {\r\n const value = properties[key];\r\n if (key in this.componentRef.instance) {\r\n this.assignValue(key, value);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private assignValue(key: string, value: any)\r\n {\r\n if (this.isFunction(value) && this.isEmitter(this.componentRef, key)) {\r\n const emitter = (this.componentRef!.instance as any)[key];\r\n const previous = this.subscriptions.get(key);\r\n previous?.unsubscribe();\r\n const sub = emitter\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(value);\r\n this.subscriptions.set(key, sub);\r\n }\r\n else {\r\n if (isObservable(value)) {\r\n value.pipe(take(1)).subscribe(v => {\r\n this.componentRef?.setInput?.(key, v);\r\n });\r\n } else {\r\n this.componentRef?.setInput?.(key, value);\r\n }\r\n } \r\n }\r\n\r\n private isControlValueAccessor(obj: any): obj is ControlValueAccessor {\r\n return (\r\n obj &&\r\n typeof obj.writeValue === 'function' &&\r\n typeof obj.registerOnChange === 'function' &&\r\n typeof obj.registerOnTouched === 'function'\r\n );\r\n }\r\n\r\n private resolveComponentType(type: string): Type<any> | null {\r\n return this.globalService.getComponent(type);\r\n }\r\n\r\n private validProperties(value: unknown): value is Record<string, any> {\r\n return typeof value === 'object' && value !== null && !Array.isArray(value);\r\n }\r\n\r\n private isEmitter(\r\n componentRef: ComponentRef<any> | null | undefined,\r\n key: string\r\n ): boolean {\r\n return !!componentRef &&\r\n (componentRef.instance as any)?.[key] instanceof EventEmitter;\r\n }\r\n\r\n private isFunction(value: any): value is Function {\r\n return typeof value === 'function';\r\n }\r\n\r\n //#endregion\r\n}\r\n","<ng-container #container></ng-container>\r\n","export function isMeaningful(x: any): boolean {\r\n if (x == null) return false; // null/undefined\r\n if (Array.isArray(x)) return x.length > 0; // empty array\r\n if (typeof x === 'string') return x.trim().length > 0; // empty string\r\n if (typeof x === 'object') return Object.keys(x).length > 0; // empty object\r\n return !!x; // number/boolean/other\r\n};\r\n","export interface FlatNode<T = any> {\r\n id: number;\r\n parentId: number | null;\r\n level: number;\r\n hasChildren: boolean;\r\n expanded: boolean;\r\n data: T;\r\n meta?: Record<string, any>;\r\n}\r\n\r\nexport function flattenTree<T>(\r\n nodes: unknown,\r\n options?: {\r\n children?: keyof T | ((node: T) => T[] | null | undefined);\r\n onCreate?: (flatNode: FlatNode<T>) => void;\r\n }\r\n): FlatNode<T>[] {\r\n\r\n if (nodes == null) {\r\n return [];\r\n }\r\n\r\n if (!Array.isArray(nodes)) {\r\n console.warn('Expected an array but received:', nodes);\r\n return [];\r\n }\r\n\r\n const result: FlatNode<T>[] = [];\r\n let idCounter = 1;\r\n\r\n const getChildren = (node: T): T[] => {\r\n const c = options?.children;\r\n\r\n if (!c) return [];\r\n\r\n if (typeof c === 'function') {\r\n return c(node) ?? [];\r\n }\r\n\r\n const children = (node as any)[c];\r\n return Array.isArray(children) ? children : [];\r\n };\r\n\r\n function visit(node: T, parentId: number | null, level: number) {\r\n const currentId = idCounter++;\r\n\r\n const children = getChildren(node);\r\n const hasChildren = children.length > 0;\r\n\r\n const flatNode: FlatNode<T> = {\r\n id: currentId,\r\n parentId,\r\n level,\r\n hasChildren,\r\n expanded: false,\r\n data: node\r\n };\r\n\r\n result.push(flatNode);\r\n\r\n options?.onCreate?.(flatNode);\r\n\r\n for (const child of children) {\r\n visit(child, currentId, level + 1);\r\n }\r\n }\r\n\r\n for (const root of nodes as T[]) {\r\n visit(root, null, 0);\r\n }\r\n\r\n return result;\r\n}","// True only for object literals / Object.create(null), not for arrays, dates, class instances\r\nexport function isPlainObject(value: unknown): value is Record<string, any> {\r\n if (value === null || typeof value !== 'object') {\r\n return false;\r\n }\r\n const proto = Object.getPrototypeOf(value);\r\n return proto === Object.prototype || proto === null;\r\n}\r\n","import { DOCUMENT, Injectable, inject } from '@angular/core';\r\n\r\n/**\r\n * Messages read by the screen readers (polite live region at the end of the page), e.g. the result\r\n * of the add / remove / move buttons of the repeaters, whose effect is not otherwise announced.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class AnnouncerService {\r\n private readonly document = inject(DOCUMENT);\r\n private region: HTMLElement | null = null;\r\n private timer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n announce(message: string): void {\r\n const region = this.ensureRegion();\r\n if (!region) {\r\n return;\r\n }\r\n // Emptied first: the same message twice in a row is read again.\r\n region.textContent = '';\r\n if (this.timer) {\r\n clearTimeout(this.timer);\r\n }\r\n this.timer = setTimeout(() => (region.textContent = message), 100);\r\n }\r\n\r\n private ensureRegion(): HTMLElement | null {\r\n if (this.region?.isConnected) {\r\n return this.region;\r\n }\r\n const body = this.document?.body;\r\n if (!body) {\r\n return null;\r\n }\r\n const region = this.document.createElement('div');\r\n region.setAttribute('role', 'status');\r\n region.setAttribute('aria-live', 'polite');\r\n region.setAttribute('aria-atomic', 'true');\r\n region.className = 'fp-announcer';\r\n // Visually hidden, still read (as the kit sr-only class, without depending on the page styles).\r\n Object.assign(region.style, {\r\n position: 'absolute', width: '1px', height: '1px', padding: '0', margin: '-1px',\r\n overflow: 'hidden', clip: 'rect(0, 0, 0, 0)', whiteSpace: 'nowrap', border: '0',\r\n });\r\n body.appendChild(region);\r\n this.region = region;\r\n return region;\r\n }\r\n}\r\n","import { SirioValidationPresenter } from '@wemake4u/form-controls';\r\n\r\n/**\r\n * How the form player errors are shown by the @wemake4u/form-controls controls:\r\n * - `silent` errors (required fields not revealed yet) are hidden;\r\n * - errors flagged as `warning` are shown as Sirio warnings;\r\n * - the text is the `message` put in the errors by the ValidationService.\r\n */\r\nexport const formPlayerValidationPresenter: SirioValidationPresenter = (control) => {\r\n const errors = control.errors;\r\n if (!errors) {\r\n return null;\r\n }\r\n if (errors['silent']) {\r\n return { state: 'none' };\r\n }\r\n const message = typeof errors['message'] === 'string' ? errors['message'] : null;\r\n if (errors['warning']) {\r\n return { state: 'warning', message };\r\n }\r\n return message ? { state: 'invalid', message } : null;\r\n};\r\n","import { Injectable } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml, SafeResourceUrl } from '@angular/platform-browser';\r\nimport sanitizeHtml from 'sanitize-html';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SanitizeService {\r\n\r\n constructor(private sanitizer: DomSanitizer)\r\n {\r\n this.sanitizeOption = {\r\n allowedTags: sanitizeHtml.defaults.allowedTags.concat(['img']),\r\n allowedAttributes: {\r\n ...sanitizeHtml.defaults.allowedAttributes,\r\n '*': ['style', 'align', 'class', 'id', 'data-action']\r\n }\r\n };\r\n }\r\n\r\n sanitizeHtml(html: string): string {\r\n return sanitizeHtml(html, this.sanitizeOption);\r\n };\r\n\r\n sanitizeSafeHtml(html: string): SafeHtml {\r\n return this.sanitizer.bypassSecurityTrustHtml(this.sanitizeHtml(html));\r\n };\r\n\r\n sanitizeSafeUrl(url: string): SafeResourceUrl {\r\n return this.sanitizer.bypassSecurityTrustResourceUrl(url);\r\n }\r\n\r\n toString(safeHtml: SafeHtml): string {\r\n return this.sanitizer.sanitize(1, safeHtml) || '';\r\n }\r\n\r\n private sanitizeOption!: sanitizeHtml.IOptions;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport mimeDb from 'mime-db';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MimeService {\r\n\r\n constructor() { }\r\n\r\n getMimeTypes(extensions: string): string {\r\n return (extensions ?? \"\")\r\n .split(',')\r\n .map(ext => this.getMimeType(ext.trim()))\r\n .filter(mime => mime !== null)\r\n .join(', ');\r\n };\r\n\r\n private getMimeType(extension: string): string | null {\r\n const ext = extension.startsWith('.') ? extension.slice(1) : extension;\r\n for (const [mimeType, info] of Object.entries(mimeDb)) {\r\n if (info.extensions && info.extensions.includes(ext)) {\r\n return mimeType;\r\n }\r\n }\r\n return null;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AutoFocusService {\r\n\r\n private map = new WeakMap<object, boolean>();\r\n\r\n mark(target: object): void {\r\n this.map.set(target, true);\r\n }\r\n\r\n consume(target: object): boolean {\r\n const flag = this.map.get(target) === true;\r\n this.map.delete(target);\r\n return flag;\r\n }\r\n}\r\n","import { Component, Input, OnInit, ViewEncapsulation, ElementRef, AfterViewInit, OnChanges, SimpleChanges, ChangeDetectionStrategy, ChangeDetectorRef, DestroyRef, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { IDynamicFieldsComponent } from './dynamic-fields.interface';\r\nimport { FormGroup, FormArray, AbstractControl } from '@angular/forms';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { SafeHtml, SafeResourceUrl } from '@angular/platform-browser';\r\nimport { SanitizeService } from '../services/sanitize.service';\r\nimport { MarkdownService } from '../services/markdown.service';\r\nimport { MimeService } from '../services/mime.service';\r\nimport { ExtendContextFn, ProgrammabilityService, EvaluateOptions } from '../services/programmability.service';\r\nimport { ValidationService } from '../services/validation.service';\r\nimport { DialogService } from '../services/dialog.service';\r\nimport { WeakService } from '../services/weak.service';\r\nimport { RegisterService } from '../services/register.service';\r\nimport { MetadataService } from '../services/metadata.service';\r\nimport { GlobalService } from '../services/global.service';\r\nimport { FormService } from '../services/form.service';\r\nimport { GridService } from '../services/grid.service';\r\nimport { SirioGridConfig, SirioGridRows, SirioGridService } from '../services/sirio-grid.service';\r\nimport { SirioCellHostComponent } from '../components/sirioCellHost/sirioCellHost.component';\r\nimport { ChartService } from '../services/chart.service';\r\nimport { AutoFocusService } from '../services/autofocus.service';\r\nimport { RecursionDirective } from '../directives/recursion.directive';\r\nimport { FrameSecurityDirective } from '../directives/framesecurity.directive';\r\nimport { GridDirective } from '../directives/grid.directive';\r\nimport { ChangeDirective, ObserveCallback } from '../directives/change.directive';\r\nimport { RegisterDirective } from '../directives/register.directive';\r\nimport { RefreshDirective } from '../directives/refresh.directive';\r\nimport { NavigatorStateDirective } from '../directives/navigator.directive';\r\nimport { CollapseDirective } from '../directives/collapse.directive';\r\nimport { TreeListDirective } from '../directives/treelist.directive';\r\nimport { FileHandlerDirective } from '../directives/file.directive';\r\nimport { JsonFileDirective } from '../directives/jsonfile.directive';\r\nimport { AttrsDirective } from '../directives/attrs.directive';\r\nimport { RequiredOnInputDirective } from '../directives/required.directive';\r\nimport { RequiredOnBlurDirective } from '../directives/requiredblur.directive';\r\nimport { MarkdownDirective } from '../directives/markdown.directive';\r\nimport { SelectionGroupDirective, SelectionItemDirective } from '../directives/selection.directive';\r\nimport { DynamicHostComponent } from '../dynamic-host/dynamic-host.component';\r\nimport { toExpression } from '../utils/feelable';\r\nimport { isMeaningful } from '../utils/isMeaningful';\r\nimport { isObservable, map, merge, Observable, of, tap } from 'rxjs';\r\nimport { hasFieldFocus, setFocus } from '../utils/focusable';\r\nimport { FlatNode, flattenTree } from '../utils/flatten';\r\nimport { isPlainObject } from '../utils/typeGuards';\r\nimport { getTarget } from '../utils/proxy';\r\nimport { ToastService } from '../services/toast.service';\r\nimport { AnnouncerService } from '../services/announcer.service';\r\n\r\n\r\nimport { AgGridAngular } from 'ag-grid-angular';\r\nimport { Module, GridOptions } from 'ag-grid-community';\r\nimport { AgCharts } from \"ag-charts-angular\";\r\nimport { AgChartOptions } from 'ag-charts-community';\r\n\r\nimport { LanguageService } from '@wemake4u/interact';\r\nimport { Texts } from '../locale/locale';\r\nimport { localize } from '../locale/localize';\r\nimport { DynamicFormComponent } from '../dynamic-form/dynamic-form.component';\r\nimport { SIRIO_DATA_GRID, SirioGridSelection } from '@wemake4u/form-controls';\r\nimport { SirioCheckbox, SirioChecklist, SirioDate, SirioSlider, SirioDateTime, SirioTime, SirioNumber, SirioFileUpload, SirioBadgeTag, SirioButton, SirioButtonVariant, SirioCollapse, SirioCollapseToggle, SirioAlert, SirioAlertContent, SirioNotify, SirioNotifyContent, SirioInfoButton, SirioPagination, SirioTabs, SirioTab, SirioTabContent, SirioAccordion, SirioAccordionItem, SirioAccordionContent, SirioFileErrorEvent, SirioFileItem, SirioOption, SirioOptionLabel, SirioRadioGroup, SirioSelect, SirioSelectOptionEvent, SirioTextarea, SirioTextbox, SirioTextCase, provideSirioValidationPresenter } from '@wemake4u/form-controls';\r\nimport { formPlayerValidationPresenter } from '../services/sirio-validation-presenter';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormBuilderService } from '../services/builder.service';\r\n\r\n/** Empty option list (stable reference). */\r\nconst NO_SIRIO_OPTIONS: SirioOption[] = [];\r\n\r\n/** Page sizes offered by the paginator of the Sirio data grid. */\r\nconst SIRIO_PAGE_SIZES: number[] = [5, 10, 20, 50, 100];\r\n\r\n@Component({\r\n selector: 'app-dynamic-fields',\r\n templateUrl: './dynamic-fields.component.html',\r\n styleUrls: [\r\n './dynamic-fields.component.css',\r\n './styles/data-display.css',\r\n './styles/light-readonly.css',\r\n './styles/dynamiclist-table.css',\r\n './styles/dynamiclist-nav.css',\r\n './styles/tab.css',\r\n './styles/treelist.css',\r\n './styles/navigator.css'\r\n ],\r\n imports: [CommonModule, ReactiveFormsModule, FormsModule,\r\n FrameSecurityDirective,\r\n RecursionDirective, GridDirective,\r\n ChangeDirective, RegisterDirective, RefreshDirective,\r\n CollapseDirective, TreeListDirective,\r\n RequiredOnInputDirective, RequiredOnBlurDirective, NavigatorStateDirective,\r\n FileHandlerDirective, JsonFileDirective,\r\n AttrsDirective, SelectionGroupDirective, SelectionItemDirective,\r\n MarkdownDirective,\r\n SirioTextbox, SirioNumber, SirioTextarea, SirioCheckbox, SirioChecklist, SirioRadioGroup, SirioSelect, SirioOptionLabel, SirioDate, SirioTime, SirioDateTime, SirioSlider, SirioFileUpload, SirioBadgeTag, SirioButton, SirioCollapse, SirioCollapseToggle, SirioAlert, SirioAlertContent, SirioNotify, SirioNotifyContent, SirioInfoButton, SirioPagination, SirioTabs, SirioTab, SirioTabContent, SirioAccordion, SirioAccordionItem, SirioAccordionContent,\r\n DynamicHostComponent,\r\n SIRIO_DATA_GRID, SirioCellHostComponent,\r\n AgGridAngular, AgCharts],\r\n providers: [\r\n RegisterService,\r\n ProgrammabilityService,\r\n GridService,\r\n SirioGridService,\r\n ChartService,\r\n provideSirioValidationPresenter(formPlayerValidationPresenter)\r\n ],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class DynamicFieldsComponent implements OnInit, OnChanges, AfterViewInit, IDynamicFieldsComponent {\r\n @Input() form!: DynamicFormComponent;\r\n @Input() rows: Array<any> | undefined;\r\n @Input() formGroup!: FormGroup;\r\n @Input() alignment: string = \"\";\r\n @Input() readOnly: boolean | null = null;\r\n @Input() recursionLevel: number = 0;\r\n @Input() identity!: string;\r\n @Input() identityIndex?: number;\r\n @Input() disableAutoFocus?: boolean;\r\n\r\n /**\r\n * Table implementation for every form: false = ag-grid (default), true = Sirio data grid\r\n * (`@wemake4u/form-controls`). Static: set it before the first form is rendered, e.g. in main.ts\r\n * before bootstrapApplication (`DynamicFieldsComponent.useDataGrid = true;`).\r\n */\r\n static useDataGrid = true;\r\n\r\n /** Value of `useDataGrid` for this instance (read by the template). */\r\n protected readonly useDataGrid = DynamicFieldsComponent.useDataGrid;\r\n\r\n Texts = Texts;\r\n\r\n private readonly toastService = inject(ToastService);\r\n private readonly announcer = inject(AnnouncerService);\r\n\r\n constructor(private cdr: ChangeDetectorRef\r\n , private destroyRef: DestroyRef\r\n , private sanitizer: SanitizeService\r\n , private markdown: MarkdownService\r\n , private mime: MimeService\r\n , private programmability: ProgrammabilityService\r\n , private validation: ValidationService\r\n , private weak: WeakService\r\n , private register: RegisterService\r\n , private metadata: MetadataService\r\n , private languageService: LanguageService\r\n , private global: GlobalService\r\n , private formService: FormService\r\n , private grid: GridService\r\n , private sirioGrid: SirioGridService\r\n , private chart: ChartService\r\n , private dialog: DialogService\r\n , private autoFocus: AutoFocusService\r\n , private formBuilder: FormBuilderService\r\n , private el: ElementRef\r\n ) {\r\n \r\n }\r\n\r\n ngOnInit(): void {\r\n this.register.identify(this.identity, this.identityIndex);\r\n\r\n this.programmability.addEvaluatorProviders(this.form);\r\n\r\n merge(\r\n this.programmability.evaluationDone.changes,\r\n this.validation.validationDone.changes,\r\n this.form.refreshed)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => {\r\n this.cdr.markForCheck();\r\n });\r\n \r\n this.suppressRequiredIndicator =\r\n this.global.getProperty(\"suppressRequiredIndicator\", \"off\") === \"on\";\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['formGroup']) {\r\n this.programmability.invalidateAll();\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n if (this.autoFocus.consume(this.formGroup)) {\r\n if (this.disableAutoFocus !== true) {\r\n setTimeout(() => {\r\n const el = this.el.nativeElement as HTMLElement;\r\n if (!hasFieldFocus(el))\r\n setFocus(el);\r\n });\r\n }\r\n }\r\n }\r\n\r\n getRegister(): RegisterService {\r\n return this.register;\r\n }\r\n\r\n getTextFeedback(component: any): string {\r\n const control = this.formService.getControl(this.formGroup, [component.path, component.key]);\r\n return !control || control.valid || !control.errors\r\n ? ''\r\n : control.errors['message'];\r\n }\r\n\r\n isWarning(component: any): boolean {\r\n const control = this.formService.getControl(this.formGroup, [component.path, component.key]);\r\n return (control && control.errors && control.errors['warning']) || false\r\n }\r\n\r\n locale(component: any, key: string): string {\r\n return localize(this.language, component, key);\r\n }\r\n\r\n evaluateString(value: string | null | undefined): string {\r\n return this.programmability.evaluateString(this.formGroup, value);\r\n }\r\n\r\n evaluateBoolean(value: boolean | string | null | undefined): boolean | null {\r\n return this.programmability.evaluateBoolean(this.formGroup, value);\r\n }\r\n\r\n evaluateNumber(value: number | string | null | undefined): number | null {\r\n return this.programmability.evaluateNumber(this.formGroup, value);\r\n }\r\n\r\n evaluateLabel(value: string | null, component: any): string {\r\n const label = this.asString(this.programmability.evaluateString(this.formGroup, value));\r\n\r\n const required = component?.validate?.required;\r\n\r\n const readOnly = this.readOnly || this.evaluateBoolean(component.readonly); \r\n\r\n if (this.suppressRequiredIndicator)\r\n return label;\r\n\r\n const trimmed = label?.trim();\r\n\r\n const shouldAppendAsterisk =\r\n required &&\r\n !readOnly &&\r\n !!trimmed &&\r\n !trimmed.endsWith('*');\r\n\r\n return shouldAppendAsterisk ? `${label}*` : label;\r\n }\r\n\r\n evaluateUrl(value: string | null): SafeResourceUrl {\r\n const url = this.programmability.evaluateString(this.formGroup, value);\r\n const watchKey = `:safeUrl(${url})`;\r\n return this.weak.call(this.formGroup, watchKey, () => {\r\n return this.sanitizer.sanitizeSafeUrl(url);\r\n });\r\n }\r\n\r\n evaluateSize(value: number | string | null): string | null {\r\n if (typeof value === \"number\") {\r\n return value + \"px\";\r\n }\r\n else if (typeof value === \"string\") {\r\n const result = this.programmability.evaluate(this.formGroup, value);\r\n if (typeof result === \"number\") {\r\n return result + \"px\";\r\n }\r\n return result;\r\n }\r\n return null;\r\n }\r\n\r\n evaluateTemplate(value: string | null): string {\r\n return this.programmability.evaluateTemplate(this.formGroup, value);\r\n }\r\n\r\n evaluate(text: string | null, cacheable: boolean = true, extendContext?: ExtendContextFn): any {\r\n return this.programmability.evaluate(this.formGroup, text, {\r\n cacheable: cacheable,\r\n extendContext: extendContext\r\n });\r\n }\r\n\r\n /** Button color of the schema → variant of wmSirioButton (unknown or empty → primary). */\r\n evaluateVariant(value: string | null): SirioButtonVariant {\r\n const color = this.evaluateString(value);\r\n const variants: SirioButtonVariant[] = ['primary', 'secondary', 'tertiary', 'tertiary-light', 'ghost', 'danger'];\r\n return variants.includes(color as SirioButtonVariant) ? (color as SirioButtonVariant) : 'primary';\r\n }\r\n\r\n evaluateConditional(conditional: any): boolean {\r\n const hide = this.evaluateBoolean(conditional?.hide);\r\n const show = this.evaluateBoolean(conditional?.show);\r\n\r\n return !(hide === true || show === false);\r\n }\r\n\r\n evaluateWithEvent(text: string | null, event: any): any {\r\n return this.programmability.evaluate(this.formGroup, text, this.getEventOptions(event));\r\n }\r\n\r\n evaluateWithEventAsBoolean(text: string | null, event?: any, defaultValue?: boolean): any { \r\n return this.programmability.evaluateBoolean(this.formGroup, text, this.getEventOptions(event)) ?? defaultValue;\r\n }\r\n\r\n evaluateWithEventAsString(text: string | null, event?: any, defaultValue?: string): string {\r\n return this.programmability.evaluateString(this.formGroup, text, this.getEventOptions(event)) ?? defaultValue;\r\n }\r\n\r\n evaluateWithEventAsHandler(text: string | null, event: any): any {\r\n return this.programmability.evaluate(this.formGroup, text, { ...this.getEventOptions(event), cacheable: false });\r\n }\r\n\r\n evaluateWithHydratation(text: string | null): any {\r\n return this.programmability.evaluate(this.formGroup, text, {\r\n hydrate: true\r\n });\r\n }\r\n\r\n shouldRender(component: any): boolean {\r\n return this.canShow(component)\r\n || !component.conditional?.collapseWhenHidden;\r\n }\r\n\r\n canShow(component: any): boolean {\r\n const show = this.evaluateBoolean(component.conditional?.show) !== false;\r\n const hide = this.evaluateBoolean(component.conditional?.hide) === true;\r\n return show && !hide;\r\n }\r\n\r\n getTreeColumns(component: any): any {\r\n const columns = component.columns\r\n || this.evaluate(component.columnsExpression)\r\n || [];\r\n\r\n return columns;\r\n }\r\n\r\n getTreeSource(component: any): Observable<FlatNode<any>[]> {\r\n const watchKey = `:evaluateTree(${component.dataSource})`;\r\n return this.weak.call(this.formGroup, watchKey, () => {\r\n const result = this.programmability.evaluate(this.formGroup, component.dataSource, {\r\n cacheable: true,\r\n cacheInvalidated: () => this.weak.invalidate(this.formGroup, watchKey)\r\n }); \r\n const toFlat = (data: any) => flattenTree(data, {\r\n children: this.evaluate(component.children),\r\n onCreate: node => {\r\n if (!component.row || typeof component.row !== 'object') {\r\n return;\r\n }\r\n node.expanded = this.evaluateWithEventAsBoolean(component.row?.expanded, node);\r\n node.meta = {\r\n cssClass: this.evaluateWithEventAsBoolean(component.row?.cssClass, node)\r\n };\r\n }\r\n });\r\n if (isObservable(result)) {\r\n return result.pipe(map(toFlat));\r\n }\r\n return of(toFlat(result));\r\n });\r\n }\r\n\r\n getTemplate(value: string): any {\r\n return this.metadata.getFormByName(value);\r\n }\r\n\r\n getFormGroup(control: AbstractControl | null): FormGroup {\r\n if (!(control instanceof FormGroup)) {\r\n throw new Error('Control is not a FormGroup');\r\n }\r\n return control;\r\n }\r\n\r\n getFormArray(control: AbstractControl | null): FormArray {\r\n if (!(control instanceof FormArray)) {\r\n throw new Error('Control is not a FormArray');\r\n }\r\n return control;\r\n }\r\n\r\n resolvePath(path: string | null): FormGroup {\r\n return this.getFormGroup(this.getControlFromPath(path))\r\n }\r\n\r\n resolveBoundGroup(component: any): FormGroup | null {\r\n const bindTo: string | undefined = component.bindTo?.trim();\r\n\r\n if (!bindTo) {\r\n return this.resolvePath(component.path);\r\n }\r\n\r\n return this.programmability.evaluate(this.formGroup, bindTo, {\r\n cacheable: true, \r\n transform: (value) => {\r\n //const target = this.navigatePath(getTarget(value), component.path);\r\n const target = getTarget(value);\r\n return this.prepareGroup(target, component);\r\n }\r\n });\r\n }\r\n \r\n toHTML(text: string): SafeHtml {\r\n const watchKey = `:safeHtml(${text})`;\r\n return this.weak.call(this.formGroup, watchKey, () => {\r\n const html = this.markdown.toHtml(text);\r\n return this.sanitizer.sanitizeSafeHtml(html);\r\n });\r\n };\r\n\r\n /** Markdown rendered as inline HTML (no <p>), for content placed inside a <label>. */\r\n toInlineHTML(text: string): SafeHtml {\r\n const watchKey = `:safeInlineHtml(${text})`;\r\n return this.weak.call(this.formGroup, watchKey, () => {\r\n const html = this.markdown.toInlineHtml(text);\r\n return this.sanitizer.sanitizeSafeHtml(html);\r\n });\r\n };\r\n\r\n sanitize(html: string): SafeHtml {\r\n return this.sanitizer.sanitizeSafeHtml(html);\r\n };\r\n\r\n getMimeTypes(extensions: string): string {\r\n return this.mime.getMimeTypes(extensions);\r\n };\r\n\r\n clickButton(component: any, event: any) {\r\n if (component.click) {\r\n this.evaluate(component.click, false);\r\n }\r\n }\r\n\r\n hasValues(component: any): boolean {\r\n if (!component) return false;\r\n const { values, valuesKey, valuesExpression } = component;\r\n return (\r\n isMeaningful(values) ||\r\n isMeaningful(valuesKey) ||\r\n isMeaningful(valuesExpression)\r\n );\r\n }\r\n\r\n getValues(component: any): Observable<any> {\r\n if (component.values) {\r\n // Static\r\n return of(component.values);\r\n }\r\n else if (component.valuesKey) {\r\n // Field value\r\n const result = this.evaluate(component.valuesKey);\r\n return this.getAsObservable(result);\r\n }\r\n else if (component.valuesExpression) {\r\n // Expression\r\n const result = this.evaluate(component.valuesExpression);\r\n return this.getAsObservable(result);\r\n }\r\n else {\r\n // Nothing\r\n return this.noData;\r\n }\r\n }\r\n\r\n private readonly sirioValuesCache = new WeakMap<Observable<any>, SirioValues>();\r\n\r\n /**\r\n * Values of a select / taglist with their loading state (`loading` of `wm-sirio-select`): true\r\n * until the source emits, completes or fails. The state is updated in the same subscription of\r\n * the async pipe (no second request); read it after `values$ | async` (`@let`), so a synchronous\r\n * source is already loaded.\r\n */\r\n getSirioValues(component: any): SirioValues {\r\n const source = this.getValues(component);\r\n let entry = this.sirioValuesCache.get(source);\r\n if (!entry) {\r\n const state = { loading: true };\r\n const done = () => (state.loading = false);\r\n entry = { values$: source.pipe(tap({ next: done, error: done, complete: done })), state };\r\n this.sirioValuesCache.set(source, entry);\r\n }\r\n return entry;\r\n }\r\n\r\n private readonly sirioOptionsCache = new WeakMap<object, { language: string; options: SirioOption[] }>();\r\n\r\n /**\r\n * Values of a component ({ value, label }) as options of the @wemake4u/form-controls controls, with the\r\n * localized label. The same array is returned for the same source and language, so change detection\r\n * does not re-render the options.\r\n */\r\n sirioOptions(values: any[] | null | undefined): SirioOption[] {\r\n if (!Array.isArray(values)) {\r\n return NO_SIRIO_OPTIONS;\r\n }\r\n const cached = this.sirioOptionsCache.get(values);\r\n if (cached && cached.language === this.language) {\r\n return cached.options;\r\n }\r\n const options = values.map((item) => ({ value: item?.value, label: this.locale(item, 'label') }));\r\n this.sirioOptionsCache.set(values, { language: this.language, options });\r\n return options;\r\n }\r\n\r\n /** \"n selected\" text of the multiple selects (taglist), in the current language. */\r\n readonly sirioSelectionSummary = (count: number): string =>\r\n `${count} ${this.locale(Texts, count === 1 ? 'Selected' : 'SelectedPlural')}`;\r\n\r\n refreshValues(component: any): () => void {\r\n return () => {\r\n if (component.valuesKey) {\r\n this.invalidate(component.valuesKey);\r\n }\r\n else if (component.valuesExpression) {\r\n this.invalidate(component.valuesExpression);\r\n }\r\n };\r\n }\r\n\r\n toLabel(value: any, list: Array<{ label: string; value: any }>): any {\r\n if (!list || !Array.isArray(list) || list.length === 0) {\r\n return value;\r\n }\r\n const getLabel = (value: any) => {\r\n const item = list.find(x => x.value === value);\r\n return item ? item.label : value;\r\n }\r\n if (Array.isArray(value)) {\r\n return value.map(v => getLabel(v)).join(', ');\r\n }\r\n else {\r\n return getLabel(value);\r\n }\r\n }\r\n\r\n supportValues(component: any): boolean {\r\n if (!component) return false;\r\n return component.fieldtype === 'select' || component.fieldtype === 'taglist';\r\n }\r\n\r\n getChartOptions(component: any): Observable<AgChartOptions> {\r\n return this.weak.call(component, `getChartOptions_${this.language}`\r\n , () => this.chart.getOptions(component, this.formGroup));\r\n }\r\n\r\n invalidateChart(component: any): ObserveCallback {\r\n return () => {\r\n this.weak.invalidate(component, `getChartOptions_${this.language}`);\r\n };\r\n }\r\n\r\n getChartData(component: any): any {\r\n const expression = this.chart.getDataExpression(component);\r\n return this.programmability.evaluate(this.formGroup, expression);\r\n }\r\n\r\n getGridOptions(component: any): GridOptions {\r\n return this.weak.call(component, this.grid.getCacheKey()\r\n , () => this.grid.getOptions(component, this.formGroup));\r\n }\r\n\r\n getGridModules(component: any): Module[] {\r\n return this.weak.call(component, 'getGridModules', () => this.grid.getModules());\r\n }\r\n\r\n onGridSelectionChanged(component: any, event: any) {\r\n this.grid.onSelectionChanged(component, this.formGroup, event);\r\n }\r\n\r\n /** Configuration of the Sirio data grid of a table (cached as the ag-grid options). */\r\n getSirioGrid(component: any): SirioGridConfig {\r\n const columns = component.columns || this.evaluateWithHydratation(component.columnsExpression) || [];\r\n // Built again when the columns change (columnsExpression).\r\n return this.weak.call(component, this.sirioGrid.getCacheKey(),\r\n () => this.sirioGrid.getConfig(component, columns, this.formGroup),\r\n (config) => config.source === columns);\r\n }\r\n\r\n /** Rows of the Sirio data grid of a table: array, Observable (first value) or IRowsSource. */\r\n getSirioRows(component: any, config: SirioGridConfig): SirioGridRows {\r\n return this.sirioGrid.getRows(this.getRowSource(component), config, (rows) => {\r\n // Deferred: the rows can arrive while the template renders (no signal writes there).\r\n queueMicrotask(() => {\r\n const selected = this.sirioGrid.initialSelection(component, this.formGroup, this.sirioSelection(component), rows);\r\n if (selected) {\r\n config.selected.set(selected);\r\n this.cdr.markForCheck();\r\n }\r\n });\r\n });\r\n }\r\n\r\n /** Selection mode of the Sirio data grid (`selectable` / `multiSelect` can be expressions). */\r\n sirioSelection(component: any): SirioGridSelection {\r\n if (this.evaluateBoolean(component.selectable) !== true) {\r\n return 'none';\r\n }\r\n return this.evaluateBoolean(component.multiSelect) === true ? 'multiple' : 'single';\r\n }\r\n\r\n /** Page sizes of the Sirio data grid paginator, with the page size of a paging server source. */\r\n sirioPageSizes(pagedSize: number | null): number[] {\r\n if (pagedSize === null || SIRIO_PAGE_SIZES.includes(pagedSize)) {\r\n return SIRIO_PAGE_SIZES;\r\n }\r\n let sizes = this.sirioPageSizesCache.get(pagedSize);\r\n if (!sizes) {\r\n sizes = [...SIRIO_PAGE_SIZES, pagedSize].sort((a, b) => a - b);\r\n this.sirioPageSizesCache.set(pagedSize, sizes);\r\n }\r\n return sizes;\r\n }\r\n private readonly sirioPageSizesCache = new Map<number, number[]>();\r\n\r\n /** Selection of the Sirio data grid changed by the user: `selectionChanged` expression. */\r\n onSirioSelectionChanged(component: any, config: SirioGridConfig, rows: readonly any[]): void {\r\n config.selected.set(rows);\r\n this.sirioGrid.onSelectionChanged(component, this.formGroup, rows);\r\n }\r\n\r\n getRowSource(component: any): any {\r\n if (component.dataSource) {\r\n // Expression\r\n return this.evaluate(component.dataSource, true);\r\n }\r\n else {\r\n // Nothing\r\n return this.noData;\r\n }\r\n }\r\n\r\n /**\r\n * `selectionChanged` expression of a select, run when the user chooses an option. The expression\r\n * gets `event` = { selectedOption: { value, label } }, as with the ngx-sirio-lib dropdown directive.\r\n */\r\n selectionChanged(component: any, event: SirioSelectOptionEvent<unknown>): void {\r\n if (!component.selectionChanged) return;\r\n const payload = { selectedOption: { value: event.option.value, label: event.option.label } };\r\n this.programmability.evaluate(this.formGroup, component.selectionChanged, {\r\n cacheable: false,\r\n extendContext: () => ({ \"event\": payload }),\r\n invokeArgs: [payload]\r\n });\r\n }\r\n\r\n callExpression(expression: any): (() => void) | undefined {\r\n if (!expression) return undefined;\r\n\r\n const evaluate = (options?: EvaluateOptions) => {\r\n return this.programmability.evaluate(this.formGroup, expression, {\r\n ...options,\r\n cacheable: false\r\n })\r\n }\r\n\r\n return (options?: EvaluateOptions) => evaluate(options);\r\n }\r\n\r\n refreshRowSource(component: any): () => void {\r\n return () => {\r\n if (component.dataSource) {\r\n this.invalidate(component.dataSource);\r\n }\r\n };\r\n }\r\n\r\n addItem(formArray: FormArray, state: NavigatorStateDirective) {\r\n const addedItem = new FormGroup({});\r\n formArray.push(addedItem);\r\n // The focus goes to the first field of the new item (autoFocus), the screen readers hear the result.\r\n this.autoFocus.mark(addedItem);\r\n this.announcer.announce(this.formatText('ItemAdded', formArray.length));\r\n setTimeout(() => state.index = state.total - 1);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /** Position of an item for the names of its buttons (\"elemento 3 di 5\"). */\r\n itemPosition(index: number, total: number): string {\r\n return this.formatText('ItemPosition', index + 1, total);\r\n }\r\n\r\n private formatText(key: string, ...values: (string | number)[]): string {\r\n return values.reduce<string>((text, value, i) => text.replace(`{${i}}`, String(value)), this.locale(Texts, key));\r\n }\r\n\r\n /**\r\n * After a button of a repeater removed or moved an item, the focus goes to the button of the item\r\n * now at `index` (the first action found), so that keyboard and screen reader users do not restart\r\n * from the top of the page; none found: the \"add\" button of the repeater.\r\n */\r\n private focusRepeaterButton(root: HTMLElement | null, actions: string[], indexes: number[]): void {\r\n if (!root) {\r\n return;\r\n }\r\n setTimeout(() => {\r\n for (const index of indexes) {\r\n for (const action of actions) {\r\n const button = root.querySelector<HTMLElement>(`[data-fp-action=\"${action}\"][data-fp-index=\"${index}\"]`);\r\n if (button) {\r\n button.focus();\r\n return;\r\n }\r\n }\r\n }\r\n root.querySelector<HTMLElement>('[data-fp-action=\"add\"]')?.focus();\r\n });\r\n }\r\n\r\n private repeaterOf(event?: Event): HTMLElement | null {\r\n return ((event?.currentTarget as HTMLElement | null) ?? null)?.closest<HTMLElement>('[data-fp-repeater]') ?? null;\r\n }\r\n\r\n removeItem(formArray: FormArray, index: number, withConfirm: boolean, state: NavigatorStateDirective, event?: Event) {\r\n const root = this.repeaterOf(event);\r\n const removed = () => {\r\n this.announcer.announce(this.formatText('ItemRemoved', index + 1));\r\n // The item taking its place, otherwise the previous one, otherwise \"add\".\r\n this.focusRepeaterButton(root, ['remove', 'up', 'down'], [index, index - 1]);\r\n };\r\n if (withConfirm) {\r\n this.dialog.confirm(this.locale(Texts, 'ConfirmDelete'), {\r\n \"title\": this.locale(Texts, 'Confirm'),\r\n \"buttons\": \"ConfirmCancel\",\r\n \"onResult\": (result) => {\r\n if (result.action === \"Yes\") {\r\n formArray.removeAt(index);\r\n setTimeout(() => state.index = Math.min(state.index, state.total - 1));\r\n this.cdr.markForCheck();\r\n removed();\r\n }\r\n }\r\n });\r\n }\r\n else {\r\n formArray.removeAt(index);\r\n this.cdr.markForCheck();\r\n removed();\r\n }\r\n }\r\n\r\n moveUpItem(formArray: FormArray, index: number, event?: Event) {\r\n this.moveItem(formArray, index, index - 1, event, ['up', 'down']);\r\n }\r\n\r\n moveDownItem(formArray: FormArray, index: number, event?: Event) {\r\n this.moveItem(formArray, index, index + 1, event, ['down', 'up']);\r\n }\r\n\r\n /** Moves an item; the focus follows it (same button, or the other one at the end of the list). */\r\n private moveItem(formArray: FormArray, from: number, to: number, event: Event | undefined, actions: string[]) {\r\n if (to < 0 || to >= formArray.length) {\r\n return;\r\n }\r\n const root = this.repeaterOf(event);\r\n const control: AbstractControl = formArray.at(from);\r\n formArray.removeAt(from);\r\n formArray.insert(to, control);\r\n this.cdr.markForCheck();\r\n this.announcer.announce(this.formatText('ItemMoved', to + 1, formArray.length));\r\n this.focusRepeaterButton(root, actions, [to]);\r\n }\r\n\r\n /**\r\n * Expressions can remove a chosen file with `file.remove()` (as with the ngx-sirio-lib file upload):\r\n * the method is added to the files chosen in the picker.\r\n */\r\n filesAdded(files: File[], picker: SirioFileUpload) {\r\n for (const file of files) {\r\n if ('remove' in file)\r\n continue;\r\n Object.defineProperty(file, 'remove', {\r\n value: function (this: File) {\r\n const control = picker.control();\r\n const value = control?.value;\r\n if (Array.isArray(value))\r\n control!.setValue(value.filter((f: SirioFileItem) => f !== this));\r\n },\r\n writable: false,\r\n enumerable: false\r\n });\r\n }\r\n }\r\n\r\n /** Failed upload/delete/download of the file picker: the message is also shown as a toast. */\r\n fileError(event: SirioFileErrorEvent) {\r\n console.error(event.error);\r\n const message = event.error instanceof Error ? event.error.message : null;\r\n if (message)\r\n this.toastService.notifyError(message);\r\n }\r\n\r\n getFeelableProperties(component: any): Record<string, any> | null {\r\n const properties = component.properties;\r\n if (typeof properties === 'object' && properties !== null && !Array.isArray(properties)) {\r\n const feelable = toExpression(properties);\r\n return this.programmability.evaluate(this.formGroup, feelable);\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n\r\n getGroupOutline(component: any) {\r\n return {\r\n 'group-outline': component.showOutline === true\r\n };\r\n }\r\n\r\n getFormClass() {\r\n return {\r\n [\"df-components\"]: true,\r\n [\"valign-start\"]: this.alignment === 'start',\r\n [\"valign-center\"]: this.alignment === 'center',\r\n [\"valign-end\"]: this.alignment === 'end'\r\n }\r\n }\r\n\r\n getComponentClass(component: any) {\r\n const classes = {\r\n [\"col-host\"]: true,\r\n [\"col-md-\" + component.layout?.columns]: (component.layout?.columns),\r\n [\"col\"]: !(component.layout?.columns),\r\n [`df-field-${component.type}`]: true,\r\n [\"component-start\"]: component.selfAlignment === 'start',\r\n [\"component-center\"]: component.selfAlignment === 'center',\r\n [\"component-end\"]: component.selfAlignment === 'end'\r\n }\r\n this.applyCssClasses(classes, component.cssClass);\r\n return classes;\r\n }\r\n\r\n getComponentStyle(component: any): { [key: string]: string } | null {\r\n\r\n const styles = {};\r\n\r\n if (!this.applyInlineStyles(styles, component.inlineStyle))\r\n return null;\r\n\r\n return styles;\r\n }\r\n\r\n getComponentAttrs(component: any) {\r\n const attrs = {};\r\n\r\n if (!this.applyInlineAttrs(attrs, component.attrs))\r\n return null;\r\n\r\n return attrs; \r\n }\r\n\r\n getClass(component: any) {\r\n const classes = {}\r\n this.applyCssClasses(classes, component.cssClass);\r\n return classes;\r\n }\r\n\r\n getStyle(component: any): { [key: string]: string } | null {\r\n const styles = {};\r\n if (!this.applyInlineStyles(styles, component.inlineStyle))\r\n return null;\r\n return styles;\r\n }\r\n\r\n\r\n \r\n /** Form player text case ('uppercase' / 'lowercase') to the @wemake4u/form-controls one. */\r\n toTextCase(textCase: string | null | undefined): SirioTextCase {\r\n switch (textCase) {\r\n case 'uppercase': return 'upper';\r\n case 'lowercase': return 'lower';\r\n default: return 'none';\r\n }\r\n }\r\n\r\n getHorizontalAlignment(component: any) {\r\n const alignment = component.horizontalAlignment;\r\n const ruleName = \"horizontal\";\r\n return {\r\n [`${ruleName}-left`]: alignment === 'left',\r\n [`${ruleName}-center`]: alignment === 'center',\r\n [`${ruleName}-right`]: alignment === 'right',\r\n [`${ruleName}-fill`]: alignment === 'fill'\r\n };\r\n }\r\n\r\n getJustify(align: string | undefined): string {\r\n switch (align) {\r\n case 'right': return 'flex-end';\r\n case 'center': return 'center';\r\n default: return 'flex-start'\r\n }\r\n }\r\n\r\n \r\n getPanels(component: any): Observable<any> {\r\n if (component.panels) {\r\n // Static\r\n return of(component.panels);\r\n }\r\n else if (component.panelsExpression) {\r\n // Expression\r\n const result = this.evaluate(component.panelsExpression);\r\n return this.getAsObservable(result);\r\n }\r\n else {\r\n // Nothing\r\n return this.noData;\r\n }\r\n }\r\n\r\n isTextOverflow(el: HTMLElement): boolean {\r\n return el.scrollWidth > el.clientWidth;\r\n }\r\n\r\n private noData: Observable<any> = of([]);\r\n\r\n private suppressRequiredIndicator: boolean = false;\r\n\r\n private get language(): string {\r\n return this.languageService.getLanguage();\r\n }\r\n\r\n private invalidate(text: string | null): void {\r\n return this.programmability.invalidate(text);\r\n }\r\n\r\n private getEventOptions(value: any): EvaluateOptions {\r\n if (value == null)\r\n return {};\r\n\r\n const options: EvaluateOptions = {\r\n extendContext: () => ({\r\n \"event\": value\r\n }),\r\n invokeArgs: [value]\r\n };\r\n return options;\r\n }\r\n\r\n private getControlFromPath(path: string | null): AbstractControl | null {\r\n const control = path\r\n ? this.formGroup.get(path)\r\n : this.formGroup;\r\n\r\n if (!control) {\r\n throw new Error(`FormGroup does not contain a control with path '${path}'`, { cause: this.formGroup });\r\n }\r\n return control;\r\n }\r\n\r\n private getAsObservable(value: any): Observable<any> {\r\n if (isObservable(value))\r\n return value;\r\n return of(value);\r\n }\r\n\r\n private applyCssClasses(target: Record<string, boolean>, cssClass: any): boolean {\r\n\r\n if (!cssClass)\r\n return false;\r\n\r\n var cssValue = this.evaluate(cssClass);\r\n\r\n if (!cssValue)\r\n return false;\r\n\r\n let classes: string[] = [];\r\n\r\n if (typeof cssValue === 'string') {\r\n classes = cssValue.split(/\\s+/);\r\n }\r\n else if (Array.isArray(cssClass)) {\r\n classes = cssValue;\r\n }\r\n else {\r\n return false;\r\n }\r\n\r\n if (classes.length == 0)\r\n return false;\r\n\r\n classes\r\n .filter(c => typeof c === 'string' && c.trim().length > 0)\r\n .forEach(cls => target[cls] = true);\r\n\r\n return true;\r\n }\r\n\r\n private applyInlineStyles(target: Record<string, any>, style: any): boolean {\r\n return this.applyOnTarget(target, style); \r\n }\r\n\r\n private applyInlineAttrs(target: Record<string, any>, attributes: any): boolean {\r\n return this.applyOnTarget(target, attributes); \r\n }\r\n\r\n private applyOnTarget(target: Record<string, any>, value: any): boolean {\r\n\r\n if (!value)\r\n return false;\r\n\r\n const evaluated = this.evaluate(value);\r\n\r\n if (!evaluated)\r\n return false;\r\n\r\n let container: Record<string, any> | null = null;\r\n\r\n if (typeof evaluated === 'string') {\r\n container = {};\r\n\r\n evaluated\r\n .split(';')\r\n .map(s => s.trim())\r\n .filter(Boolean)\r\n .forEach(rule => {\r\n const [key, value] = rule.split(':').map(p => p.trim());\r\n if (key && value) {\r\n container![key] = value;\r\n }\r\n });\r\n }\r\n else if (typeof evaluated === 'object' && !Array.isArray(evaluated)) {\r\n container = Object.fromEntries(\r\n Object.entries(evaluated)\r\n .filter(([_, v]) => v != null)\r\n );\r\n }\r\n\r\n if (!container || Object.keys(container).length === 0)\r\n return false;\r\n\r\n Object.assign(target, container);\r\n return true;\r\n }\r\n\r\n private asString(value: unknown): string {\r\n\r\n if (value == null)\r\n return '';\r\n\r\n if (typeof value === 'string')\r\n return value;\r\n\r\n if (typeof value === 'object')\r\n return '';\r\n\r\n return String(value);\r\n }\r\n\r\n private prepareGroup(value: any, component: any): FormGroup | null\r\n {\r\n const target = getTarget(value);\r\n\r\n const rows = component.rows ?? [];\r\n\r\n // Existing FormGroup: register the component rows into it\r\n if (target instanceof FormGroup) {\r\n const group = this.formBuilder.buildRows(target, rows, { path: component.path });\r\n return group;\r\n }\r\n\r\n // Plain object: build a new FormGroup from the rows and fill it with the object's values\r\n if (isPlainObject(target)) {\r\n const group = new FormGroup({});\r\n const currentGroup = this.formBuilder.buildRows(group, rows, { path: component.path });\r\n this.formService.patch(group, target);\r\n return currentGroup;\r\n }\r\n\r\n // Any other value (null, primitives, arrays, other controls) is not resolvable\r\n return null;\r\n }\r\n}\r\n\r\n/** Values of a select / taglist and whether they are still loading (`getSirioValues`). */\r\ninterface SirioValues {\r\n values$: Observable<any>;\r\n state: { loading: boolean };\r\n}\r\n","<div [ngClass]=\"getFormClass()\">\r\n <ng-container *ngFor=\"let row of rows\" [formGroup]=\"formGroup\">\r\n <div class=\"row field-set\">\r\n <ng-container *ngFor=\"let component of row.components\">\r\n <ng-container [ngSwitch]=\"component.type\">\r\n <div [ngClass]=\"getComponentClass(component)\"\r\n [style]=\"getComponentStyle(component)\"\r\n [ngAttrs]=\"getComponentAttrs(component)\"\r\n *ngIf=\"shouldRender(component)\">\r\n <div *ngIf=\"canShow(component)\">\r\n <!-- #region textfield -->\r\n <ng-container *ngSwitchCase=\"'textfield'\" [formGroup]=\"resolvePath(component.path)\">\r\n <!-- @wemake4u/form-controls: errors/warnings come from the validation presenter (see providers). -->\r\n <wm-sirio-textbox type=\"text\"\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel')) || null\"\r\n [label]=\"evaluateLabel(locale(component, 'label'), component)\"\r\n [info]=\"evaluateString(locale(component, 'tooltip')) || null\"\r\n [placeholder]=\"locale(component, 'placeholder')\"\r\n [helpText]=\"evaluateString(locale(component, 'description'))\"\r\n [prefix]=\"evaluateString(component.appearance?.prefixAdorner) || ''\"\r\n [suffix]=\"evaluateString(component.appearance?.suffixAdorner) || ''\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [formControlName]=\"component.key\"\r\n [textCase]=\"toTextCase(component.textCase)\"\r\n [maxlength]=\"evaluateNumber(component.maxLength)\"\r\n [textAlign]=\"component.textAlign || null\"\r\n [requiredOnInput]=\"component.validate?.required\"\r\n [requiredOnBlur]=\"component.validate?.required\"\r\n [valueSync]=\"component.valueSync\"\r\n #textfield\r\n [register]=\"component\"\r\n [componentRef]=\"textfield\">\r\n </wm-sirio-textbox>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region select -->\r\n <ng-container *ngSwitchCase=\"'select'\" [formGroup]=\"resolvePath(component.path)\">\r\n @let selectValues = getSirioValues(component);\r\n @let selectOptions = selectValues.values$ | async;\r\n <!-- @wemake4u/form-controls: strict = the value must be one of the options (was the dropdown directive);\r\n searchable shows the selection in the search field (was prefillSearch).\r\n Errors/warnings come from the validation presenter. -->\r\n <wm-sirio-select\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel')) || null\"\r\n [label]=\"evaluateLabel(locale(component, 'label'), component)\"\r\n [info]=\"evaluateString(locale(component, 'tooltip')) || null\"\r\n [placeholder]=\"locale(component, 'placeholder')\"\r\n [helpText]=\"evaluateString(locale(component, 'description'))\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [formControlName]=\"component.key\"\r\n [options]=\"sirioOptions(selectOptions)\"\r\n [loading]=\"selectValues.state.loading\"\r\n [loadingText]=\"locale(Texts, 'Loading')\"\r\n [searchable]=\"component.searchable\"\r\n [strict]=\"true\"\r\n (optionSelected)=\"selectionChanged(component, $event)\"\r\n [refresh]=\"refreshValues(component)\"\r\n [valueSync]=\"component.valueSync\"\r\n [requiredOnBlur]=\"component.validate?.required\"\r\n #select\r\n [register]=\"component\"\r\n [componentRef]=\"select\">\r\n </wm-sirio-select>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region taglist -->\r\n <ng-container *ngSwitchCase=\"'taglist'\" [formGroup]=\"resolvePath(component.path)\">\r\n @let taglistValues = getSirioValues(component);\r\n @let taglistOptions = taglistValues.values$ | async;\r\n <!-- @wemake4u/form-controls: multiple select with \"select all\" and the \"n selected\" summary\r\n (was the tag directive). Errors/warnings come from the validation presenter. -->\r\n <wm-sirio-select\r\n multiple\r\n selectAll\r\n [selectAllLabel]=\"locale(Texts, 'SelectAll')\"\r\n [maxVisibleSelections]=\"component.maxVisibleTags\"\r\n [selectionSummary]=\"sirioSelectionSummary\"\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel')) || null\"\r\n [label]=\"evaluateLabel(locale(component, 'label'), component)\"\r\n [info]=\"evaluateString(locale(component, 'tooltip')) || null\"\r\n [placeholder]=\"locale(component, 'placeholder')\"\r\n [helpText]=\"evaluateString(locale(component, 'description'))\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [formControlName]=\"component.key\"\r\n [options]=\"sirioOptions(taglistOptions)\"\r\n [loading]=\"taglistValues.state.loading\"\r\n [loadingText]=\"locale(Texts, 'Loading')\"\r\n [searchable]=\"component.searchable\"\r\n [refresh]=\"refreshValues(component)\"\r\n [valueSync]=\"component.valueSync\"\r\n [requiredOnBlur]=\"component.validate?.required\"\r\n #taglist\r\n [register]=\"component\"\r\n [componentRef]=\"taglist\">\r\n </wm-sirio-select>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region number -->\r\n <ng-container *ngSwitchCase=\"'number'\" [formGroup]=\"resolvePath(component.path)\">\r\n <!-- @wemake4u/form-controls: errors/warnings come from the validation presenter (see providers). -->\r\n <wm-sirio-number\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel')) || null\"\r\n [label]=\"evaluateLabel(locale(component, 'label'), component)\"\r\n [info]=\"evaluateString(locale(component, 'tooltip')) || null\"\r\n [placeholder]=\"locale(component, 'placeholder')\"\r\n [helpText]=\"evaluateString(locale(component, 'description'))\"\r\n [prefix]=\"evaluateString(component.appearance?.prefixAdorner) || ''\"\r\n [suffix]=\"evaluateString(component.appearance?.suffixAdorner) || ''\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [formControlName]=\"component.key\"\r\n [textAlign]=\"component.textAlign || null\"\r\n [defaultValue]=\"evaluateNumber(component.defaultValue)\"\r\n [min]=\"evaluateNumber(component.minimum)\"\r\n [max]=\"evaluateNumber(component.maximum)\"\r\n [decimals]=\"evaluateNumber(component.decimalDigits)\"\r\n [requiredOnInput]=\"component.validate?.required\"\r\n [requiredOnBlur]=\"component.validate?.required\"\r\n [valueSync]=\"component.valueSync\"\r\n #number\r\n [register]=\"component\"\r\n [componentRef]=\"number\">\r\n </wm-sirio-number>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region datetime -->\r\n <ng-container *ngSwitchCase=\"'datetime'\" [formGroup]=\"resolvePath(component.path)\">\r\n <!-- @wemake4u/form-controls: date 'yyyy-MM-dd', time 'HH:mm', date and time 'yyyy-MM-ddTHH:mm:ss'.\r\n min/max only limit the pickers (typed values outside are moved to the nearest limit).\r\n Errors/warnings come from the validation presenter. -->\r\n <ng-container [ngSwitch]=\"component.subtype\">\r\n <!-- #region date -->\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <wm-sirio-date\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaDateLabel')) || null\"\r\n [label]=\"evaluateLabel(locale(component, 'dateLabel'), component)\"\r\n [info]=\"evaluateString(locale(component, 'tooltip')) || null\"\r\n [placeholder]=\"locale(component, 'placeholder')\"\r\n [helpText]=\"evaluateString(locale(component, 'description'))\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [formControlName]=\"component.key\"\r\n [textAlign]=\"component.textAlign || null\"\r\n [pickLevel]=\"component.pick || 'date'\"\r\n [min]=\"evaluateString(component.range?.min) || null\"\r\n [max]=\"evaluateString(component.range?.max) || null\"\r\n [hideOnFocus]=\"evaluateBoolean(component.hideOnFocus)\"\r\n [valueSync]=\"component.valueSync\"\r\n [requiredOnBlur]=\"component.validate?.required\"\r\n #date\r\n [register]=\"component\"\r\n [componentRef]=\"date\">\r\n </wm-sirio-date>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region time -->\r\n <ng-container *ngSwitchCase=\"'time'\">\r\n <wm-sirio-time\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaTimeLabel')) || null\"\r\n [label]=\"evaluateLabel(locale(component, 'timeLabel'), component)\"\r\n [info]=\"evaluateString(locale(component, 'tooltip')) || null\"\r\n [placeholder]=\"locale(component, 'placeholder')\"\r\n [helpText]=\"evaluateString(locale(component, 'description'))\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [formControlName]=\"component.key\"\r\n [textAlign]=\"component.textAlign || null\"\r\n [minuteStep]=\"component.timeInterval || 1\"\r\n [valueSync]=\"component.valueSync\"\r\n [requiredOnBlur]=\"component.validate?.required\"\r\n #time\r\n [register]=\"component\"\r\n [componentRef]=\"time\">\r\n </wm-sirio-time>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region datetime -->\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <!-- fieldLabels: dateLabel above the date, timeLabel above the time (as before);\r\n completeParts: date only -> 00:00, time only -> today (was the dateTimeCoordinator). -->\r\n <wm-sirio-datetime\r\n valueType=\"iso-seconds\"\r\n fieldLabels\r\n completeParts\r\n [label]=\"evaluateLabel(locale(component, 'dateLabel'), component)\"\r\n [timeLabel]=\"evaluateString(locale(component, 'timeLabel'))\"\r\n [info]=\"evaluateString(locale(component, 'tooltip')) || null\"\r\n [helpText]=\"evaluateString(locale(component, 'description'))\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [formControlName]=\"component.key\"\r\n [textAlign]=\"component.textAlign || null\"\r\n [min]=\"evaluateString(component.range?.min) || null\"\r\n [max]=\"evaluateString(component.range?.max) || null\"\r\n [hideOnFocus]=\"evaluateBoolean(component.hideOnFocus)\"\r\n [minuteStep]=\"component.timeInterval || 1\"\r\n [valueSync]=\"component.valueSync\"\r\n [requiredOnBlur]=\"component.validate?.required\"\r\n #datetime\r\n [register]=\"component\"\r\n [componentRef]=\"datetime\">\r\n </wm-sirio-datetime>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region checkbox -->\r\n <ng-container *ngSwitchCase=\"'checkbox'\" [formGroup]=\"resolvePath(component.path)\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <!-- @wemake4u/form-controls: checkbox and toggle (subtype 'toggle'); the markdown label is projected\r\n inside the kit <label> as inline HTML. Errors/warnings come from the validation presenter. -->\r\n <wm-sirio-checkbox\r\n [toggle]=\"component.subtype === 'toggle'\"\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel')) || null\"\r\n [helpText]=\"evaluateString(locale(component, 'description'))\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [formControlName]=\"component.key\"\r\n [valueSync]=\"component.valueSync\"\r\n [requiredOnBlur]=\"component.validate?.required\"\r\n #checkbox\r\n [register]=\"component\"\r\n [componentRef]=\"checkbox\"><span [innerHTML]=\"toInlineHTML(evaluateTemplate(locale(component, 'label')))\"></span></wm-sirio-checkbox>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region radio -->\r\n <ng-container *ngSwitchCase=\"'radio'\" [formGroup]=\"resolvePath(component.path)\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <!-- @wemake4u/form-controls: radio buttons and chips (subtype 'chip'); markdown option labels are\r\n rendered inline inside the kit <label>. Errors/warnings come from the validation presenter. -->\r\n <wm-sirio-radio-group\r\n [chips]=\"component.subtype === 'chip'\"\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel')) || null\"\r\n [label]=\"evaluateLabel(locale(component, 'label'), component)\"\r\n [info]=\"evaluateString(locale(component, 'tooltip')) || null\"\r\n [helpText]=\"evaluateString(locale(component, 'description'))\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [formControlName]=\"component.key\"\r\n [options]=\"sirioOptions(getValues(component) | async)\"\r\n [inline]=\"component.displayInline\"\r\n [refresh]=\"refreshValues(component)\"\r\n [valueSync]=\"component.valueSync\"\r\n [requiredOnBlur]=\"component.validate?.required\"\r\n #radio\r\n [register]=\"component\"\r\n [componentRef]=\"radio\">\r\n <ng-template wmSirioOptionLabel let-option><span [innerHTML]=\"toInlineHTML(evaluateTemplate(option.label))\"></span></ng-template>\r\n </wm-sirio-radio-group>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region checklist -->\r\n <ng-container *ngSwitchCase=\"'checklist'\" [formGroup]=\"resolvePath(component.path)\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <!-- @wemake4u/form-controls: checkbox list and chips (subtype 'chip'); markdown option labels are\r\n rendered inline inside the kit <label>. Errors/warnings come from the validation presenter. -->\r\n <wm-sirio-checklist\r\n [chips]=\"component.subtype === 'chip'\"\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel')) || null\"\r\n [label]=\"evaluateLabel(locale(component, 'label'), component)\"\r\n [info]=\"evaluateString(locale(component, 'tooltip')) || null\"\r\n [helpText]=\"evaluateString(locale(component, 'description'))\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [formControlName]=\"component.key\"\r\n [options]=\"sirioOptions(getValues(component) | async)\"\r\n [inline]=\"component.displayInline\"\r\n [refresh]=\"refreshValues(component)\"\r\n [valueSync]=\"component.valueSync\"\r\n [requiredOnBlur]=\"component.validate?.required\"\r\n #checklist\r\n [register]=\"component\"\r\n [componentRef]=\"checklist\">\r\n <ng-template wmSirioOptionLabel let-option><span [innerHTML]=\"toInlineHTML(evaluateTemplate(option.label))\"></span></ng-template>\r\n </wm-sirio-checklist>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region textarea -->\r\n <ng-container *ngSwitchCase=\"'textarea'\" [formGroup]=\"resolvePath(component.path)\">\r\n <!-- @wemake4u/form-controls: errors/warnings come from the validation presenter (see providers). -->\r\n <wm-sirio-textarea\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel')) || null\"\r\n [label]=\"evaluateLabel(locale(component, 'label'), component)\"\r\n [info]=\"evaluateString(locale(component, 'tooltip')) || null\"\r\n [placeholder]=\"locale(component, 'placeholder')\"\r\n [helpText]=\"evaluateString(locale(component, 'description'))\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [formControlName]=\"component.key\"\r\n [textCase]=\"toTextCase(component.textCase)\"\r\n [maxlength]=\"evaluateNumber(component.maxLength)\"\r\n [textAlign]=\"component.textAlign || null\"\r\n [requiredOnInput]=\"component.validate?.required\"\r\n [requiredOnBlur]=\"component.validate?.required\"\r\n [valueSync]=\"component.valueSync\"\r\n #textarea\r\n [register]=\"component\"\r\n [componentRef]=\"textarea\">\r\n </wm-sirio-textarea>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region filepicker -->\r\n <ng-container *ngSwitchCase=\"'filepicker'\" [formGroup]=\"resolvePath(component.path)\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <!-- @wemake4u/form-controls: errors/warnings come from the validation presenter (see providers);\r\n upload, delete and download of the stored files are handled by the control. -->\r\n <wm-sirio-file-upload class=\"w-100\"\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel')) || null\"\r\n [label]=\"evaluateLabel(locale(component, 'label'), component)\"\r\n [info]=\"evaluateString(locale(component, 'tooltip')) || null\"\r\n [helpText]=\"evaluateString(locale(component, 'description'))\"\r\n [buttonLabel]=\"evaluateString(locale(component, 'text')) || locale(Texts, 'Upload')\"\r\n [accept]=\"getMimeTypes(component.accept)\"\r\n [multiple]=\"evaluateBoolean(component.multiple)\"\r\n valueType=\"array\"\r\n details\r\n downloadable\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [instantUpload]=\"evaluateBoolean(component.instantUpload)\"\r\n [uploadHandler]=\"evaluate(component.uploadHandler)\"\r\n [deleteHandler]=\"evaluate(component.deleteHandler)\"\r\n [downloadHandler]=\"evaluate(component.downloadHandler)\"\r\n [removeLabel]=\"locale(Texts, 'Remove')\"\r\n [downloadLabel]=\"locale(Texts, 'Download')\"\r\n [uploadingLabel]=\"locale(Texts, 'Uploading')\"\r\n [deletingLabel]=\"locale(Texts, 'Deleting')\"\r\n [downloadingLabel]=\"locale(Texts, 'Downloading')\"\r\n [formControlName]=\"component.key\"\r\n [requiredOnBlur]=\"component.validate?.required\"\r\n [valueSync]=\"component.valueSync\"\r\n (filesAdded)=\"filesAdded($event, filepicker)\"\r\n (fileError)=\"fileError($event)\"\r\n #filepicker\r\n [register]=\"component\"\r\n [componentRef]=\"filepicker\">\r\n </wm-sirio-file-upload>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region range -->\r\n <ng-container *ngSwitchCase=\"'range'\" [formGroup]=\"resolvePath(component.path)\">\r\n <!-- @wemake4u/form-controls: errors/warnings come from the validation presenter (see providers). -->\r\n <wm-sirio-slider\r\n [ariaLabel]=\"evaluateString(locale(component, 'ariaLabel')) || null\"\r\n [label]=\"evaluateLabel(locale(component, 'label'), component)\"\r\n [info]=\"evaluateString(locale(component, 'tooltip')) || null\"\r\n [helpText]=\"evaluateString(locale(component, 'description'))\"\r\n [readonly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [formControlName]=\"component.key\"\r\n [min]=\"evaluateNumber(component.range?.min) ?? 0\"\r\n [max]=\"evaluateNumber(component.range?.max) ?? 0\"\r\n [valueSync]=\"component.valueSync\"\r\n [requiredOnBlur]=\"component.validate?.required\"\r\n #range\r\n [register]=\"component\"\r\n [componentRef]=\"range\">\r\n </wm-sirio-slider>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region displayfield -->\r\n <ng-container *ngSwitchCase=\"'displayfield'\">\r\n <div class=\"display-field\"\r\n #displayfield\r\n [register]=\"component\"\r\n [componentRef]=\"displayfield\">\r\n <div *ngIf=\"component.label\" class=\"sirio-label\">\r\n {{ evaluateString(locale(component, 'label')) }}\r\n <!-- @wemake4u/form-controls: kit info button with popover, as next to the labels of the controls. -->\r\n <wm-sirio-info-button *ngIf=\"component.tooltip\"\r\n [content]=\"evaluateString(locale(component, 'tooltip'))\"\r\n [title]=\"evaluateString(locale(component, 'label'))\"\r\n [label]=\"locale(Texts, 'InformationAbout') + ' ' + evaluateString(locale(component, 'ariaLabel') || locale(component, 'label'))\"></wm-sirio-info-button>\r\n </div>\r\n <div [class.sirio-form-control]=\"component.fieldtype !== 'filelist'\"\r\n [style.text-align]=\"component.fieldtype !== 'filelist' ? (component.textAlign || null) : null\"\r\n class=\"data-display\" [ngClass]=\"component.fieldtype\">\r\n <ng-container [ngSwitch]=\"component.fieldtype\">\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <ng-container *ngTemplateOutlet=\"checkboxTemplate\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <ng-container *ngTemplateOutlet=\"formattedTemplate\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'filelist'\">\r\n <ng-container *ngTemplateOutlet=\"filelistTemplate\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngTemplateOutlet=\"defaultTemplate\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #checkboxTemplate>\r\n <i *ngIf=\"evaluate(component.expression)\" class=\"fas fa-check\"></i>\r\n </ng-template>\r\n <ng-template #defaultTemplate>\r\n <ng-container *ngIf=\"supportValues(component) && hasValues(component); else simpleTemplate\">\r\n <ng-container *ngIf=\"getValues(component) | async as values\">\r\n {{ toLabel(evaluate(component.expression), values) }}\r\n </ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #simpleTemplate>\r\n {{ evaluate(component.expression) }}\r\n </ng-template>\r\n <ng-template #formattedTemplate>\r\n <div class=\"text-paragraph\" style=\"margin-top: -6px;\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(component.expression))\">\r\n </div>\r\n </ng-template>\r\n <ng-template #filelistTemplate>\r\n <ng-container *ngIf=\"{ files: evaluate(component.expression) } as expr\"\r\n fileHandler\r\n #fileHandlerRef=\"fileHandler\"\r\n [downloadHandler]=\"evaluate(component.downloadHandler)\">\r\n <ng-container *ngIf=\"expr.files?.length > 0\">\r\n <div *ngFor=\"let file of expr.files\" class=\"row w-100 p-3 g-0 sirio-bg-primary-light-40 sirio-text-secondary mt-1\">\r\n <div class=\"col-auto ms-auto\">\r\n <span [ngClass]=\"fileHandlerRef.getIcon(file)\" class=\"fas fa-24 mt-1 me-3 ms-1\" aria-hidden=\"true\"></span>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-0\"><span class=\"h6 sirio-text-link sirio-font-weight-700\">{{ file.name }}</span></p>\r\n {{ fileHandlerRef.getExtension(file) }}, {{ fileHandlerRef.getSize(file) }}\r\n </div>\r\n <div class=\"col-auto ms-auto d-lg-flex flex-column align-items-end\">\r\n <ng-container *ngIf=\"fileHandlerRef.canDownload(file)\">\r\n <div *ngIf=\"fileHandlerRef.isDownloading(file)\" class=\"mt-2\">\r\n <span class=\"d-none d-sm-inline-block\">{{ locale(Texts, 'Downloading') }}</span>\r\n <span class=\"fas fa-arrows-rotate fa-spin ms-2\" aria-hidden=\"true\"></span>\r\n </div>\r\n <!-- Buttons, not links: announced as buttons, activated also with Space. -->\r\n <button *ngIf=\"fileHandlerRef.isLocal(file)\"\r\n type=\"button\"\r\n class=\"sirio-text-link fp-link-button\"\r\n (click)=\"fileHandlerRef.downloadLocal(file)\"\r\n [attr.aria-label]=\"locale(Texts, 'Download') + ' ' + file.name\"\r\n [attr.title]=\"locale(Texts, 'Download') + ' ' + file.name\">\r\n <span class=\"d-none d-sm-inline-block\">\r\n {{ locale(Texts, 'Download') }}\r\n </span>\r\n <span class=\"fas fa-download ms-2\" aria-hidden=\"true\"></span>\r\n </button>\r\n <button *ngIf=\"fileHandlerRef.isHandled(file)\"\r\n type=\"button\"\r\n class=\"sirio-text-link fp-link-button\"\r\n (click)=\"fileHandlerRef.downloadHandled(file)\"\r\n [attr.aria-label]=\"locale(Texts, 'Download') + ' ' + file.name\"\r\n [attr.title]=\"locale(Texts, 'Download') + ' ' + file.name\">\r\n <span class=\"d-none d-sm-inline-block\">{{ locale(Texts, 'Download') }}</span>\r\n <span class=\"fas fa-download ms-2\" aria-hidden=\"true\"></span>\r\n </button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!(expr.files?.length > 0)\">\r\n <div class=\"row p-3 g-0 sirio-bg-primary-light-40 sirio-text-secondary mt-1\">\r\n <div class=\"col\">\r\n <p class=\"mb-0\">\r\n <span class=\"h6 sirio-text-link sirio-font-weight-700\">Nessun file presente</span>\r\n </p>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n <p *ngIf=\"component.description\" class=\"sirio-form-text-help\">\r\n {{ evaluateString(locale(component, 'description')) }}\r\n </p>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region dynamiclist -->\r\n <ng-container *ngSwitchCase=\"'dynamiclist'\">\r\n <ng-container *ngIf=\"resolvePath(component.path) as formGroup\">\r\n <ng-container [formGroup]=\"formGroup\">\r\n <!-- data-fp-repeater: root of the repeater, where the focus goes after add / remove / move. -->\r\n <div [formArrayName]=\"component.key\"\r\n data-fp-repeater\r\n [formGroup]=\"formGroup\"\r\n [recursion]=\"component\"\r\n #recursion=\"recursion\">\r\n <p *ngIf=\"component.description\">{{ evaluateString(locale(component, 'description')) }}</p>\r\n <ng-container *ngIf=\"getFormArray(resolvePath(component.path).get(component.key)) as formArray\">\r\n <ng-template navigatorState\r\n [total]=\"formArray.controls.length\"\r\n #state=\"navigatorState\"></ng-template>\r\n <ng-container *ngIf=\"component.subtype == 'navigation'\">\r\n <ng-container *ngTemplateOutlet=\"navigation; context: { formArray: formArray, state: state }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"formArray.controls.length > 0\">\r\n <ng-container [ngSwitch]=\"component.subtype\">\r\n <!-- #region tab -->\r\n <ng-container *ngSwitchCase=\"'tab'\">\r\n <!-- @wemake4u/form-controls: activateAdded selects the added tab (after a removal the library selects the one\r\n taking its place); focusContent moves the focus to the first field of the panel. -->\r\n <div [register]=\"component\"\r\n [componentRef]=\"tabInstance\">\r\n <wm-sirio-tabs [scrollLeftLabel]=\"locale(Texts, 'ScrollLeft')\"\r\n [scrollRightLabel]=\"locale(Texts, 'ScrollRight')\"\r\n [focusablePanels]=\"false\"\r\n activateAdded\r\n focusContent\r\n #tabInstance>\r\n <ng-container *ngFor=\"let item of formArray.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ng-container *ngIf=\"{ formGroup: item, item: item.value, index: i } as event\">\r\n <wm-sirio-tab [label]=\"evaluateWithEventAsString(locale(component, 'label'), event)\"\r\n [badge]=\"evaluateWithEvent(component.badge, event)\">\r\n <ng-template wmSirioTabContent>\r\n <div>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"getFormGroup(item)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n <div style=\"text-align:right\">\r\n <ng-container *ngTemplateOutlet=\"buttonsRemove; context: { formArray: formArray, state: state, i: i }\"></ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </wm-sirio-tab>\r\n </ng-container>\r\n </ng-container>\r\n </wm-sirio-tabs>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region accordion -->\r\n <ng-container *ngSwitchCase=\"'accordion'\">\r\n <!-- @wemake4u/form-controls: activateAdded opens the first section at the start and the added one (after a removal\r\n the library opens the one taking its place); focusContent moves the focus to its first field. -->\r\n <div [register]=\"component\"\r\n [componentRef]=\"dynamiclistaccordion\">\r\n <wm-sirio-accordion exclusive\r\n activateAdded\r\n focusContent\r\n #dynamiclistaccordion>\r\n <ng-container *ngFor=\"let item of formArray.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ng-container *ngIf=\"{ formGroup: item, item: item.value, index: i } as event\">\r\n <wm-sirio-accordion-item [title]=\"evaluateWithEventAsString(locale(component, 'label'), event)\"\r\n [badge]=\"evaluateWithEvent(component.badge, event)\">\r\n <ng-template wmSirioAccordionContent>\r\n <div>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"getFormGroup(item)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n <div style=\"text-align:right\">\r\n <ng-container *ngTemplateOutlet=\"buttonsRemove; context: { formArray: formArray, state: state, i: i }\"></ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </wm-sirio-accordion-item>\r\n </ng-container>\r\n </ng-container>\r\n </wm-sirio-accordion>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region table -->\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <div #dynamiclist\r\n [register]=\"component\"\r\n [componentRef]=\"dynamiclist\">\r\n <table class=\"dynamiclist-table\" [ngClass]=\"{ 'main': recursionLevel == 0 }\">\r\n <ng-container *ngFor=\"let item of formArray.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ng-container *ngIf=\"getFormGroup(item) as formItem\">\r\n <ng-container *ngIf=\"{ itemsArray: recursion.getItemsArray(formItem) } as recursionData\">\r\n <tr>\r\n <td class=\"content-cell\">\r\n <div [ngClass]=\"{'group-outline': component.showOutline === true && component.subtype !== 'table', 'group-outline-repeat': true }\">\r\n <div>\r\n <div class=\"badge-header\" *ngIf=\"{ formGroup: item, item: item.value, index: i } as event\">\r\n <label *ngIf=\"evaluateWithEventAsString(locale(component, 'label'), event) as itemLabel\">{{ itemLabel }}</label>\r\n <span class=\"badge-header-tag\" [wmSirioBadge]=\"evaluateWithEvent(component.badge, event)\"></span>\r\n </div>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"formItem\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </div>\r\n </div>\r\n </td>\r\n <td class=\"command-cell\">\r\n <div>\r\n <ng-container *ngIf=\"recursionData.itemsArray\">\r\n <ng-container *ngTemplateOutlet=\"buttonsAdd; context: { formArray: recursionData.itemsArray, compact: true }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"buttonsReorder; context: { formArray: formArray, i: i, compact: true }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"buttonsRemove; context: { formArray: formArray, state: state, i: i, compact: true }\"></ng-container>\r\n </div>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"recursionData.itemsArray && recursionData.itemsArray.length > 0\">\r\n <td colspan=\"2\" class=\"recursion-cell\">\r\n <div class=\"layout\">\r\n <div class=\"recursion-toggle\">\r\n <!-- @wemake4u/form-controls: open at the start (as before); label for screen readers. -->\r\n <button type=\"button\" wmSirioButton=\"ghost\"\r\n [wmSirioCollapseToggle]=\"collapse\"\r\n iconOnly\r\n [icon]=\"collapse.expanded() ? 'fa-chevron-down' : 'fa-chevron-right'\"\r\n [label]=\"recursionData.itemsArray.length + ' elementi presenti'\"></button>\r\n </div>\r\n <div *ngIf=\"!collapse.expanded()\" class=\"recursion-title\">\r\n <div class=\"recursion-text\">\r\n {{ recursionData.itemsArray.length }} elementi presenti\r\n </div>\r\n </div>\r\n <div class=\"recursion-content\">\r\n <div wmSirioCollapse #collapse=\"wmSirioCollapse\" [expanded]=\"true\">\r\n <div *ngIf=\"collapse.expanded()\" style=\"margin-bottom: -11px;\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"recursion.getFormGroup(formItem)\"\r\n [readOnly]=\"readOnly\"\r\n [recursionLevel]=\"recursionLevel+1\"\r\n [rows]=\"recursion.getComponentRows()\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </table>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region navigation -->\r\n <ng-container *ngSwitchCase=\"'navigation'\">\r\n <div>\r\n <ng-container *ngIf=\"formArray.controls[state.index] as item\">\r\n <div [ngClass]=\"{'group-outline': component.showOutline === true, 'group-outline-repeat': true }\">\r\n <div>\r\n <div class=\"badge-header\" *ngIf=\"{ formGroup: item, item: item.value, index: state.index } as event\">\r\n <label *ngIf=\"evaluateWithEventAsString(locale(component, 'label'), event) as itemLabel\">{{ itemLabel }}</label>\r\n <span class=\"badge-header-tag\" [wmSirioBadge]=\"evaluateWithEvent(component.badge, event)\"></span>\r\n </div>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"getFormGroup(item)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region default -->\r\n <ng-container *ngSwitchDefault>\r\n <div #dynamiclist\r\n [register]=\"component\"\r\n [componentRef]=\"dynamiclist\"\r\n selectionGroup\r\n [selectionMode]=\"evaluateString(component.selection?.mode)\"\r\n [selectableClass]=\"evaluateString(component.selection?.selectableClass)\"\r\n [selectedClass]=\"evaluateString(component.selection?.selectedClass)\"\r\n [onSelectionChanged]=\"callExpression(component.selection?.selectionChanged)\">\r\n <ng-container *ngFor=\"let item of formArray.controls; let i = index;\" [formGroupName]=\"i\">\r\n <div [selectionItem]=\"item\"\r\n [ngClass]=\"{'group-outline': component.showOutline === true, 'group-outline-repeat': true }\">\r\n <div>\r\n <div class=\"badge-header\" *ngIf=\"{ formGroup: item, item: item.value, index: i } as event\">\r\n <label *ngIf=\"evaluateWithEventAsString(locale(component, 'label'), event) as itemLabel\">{{ itemLabel }}</label>\r\n <span class=\"badge-header-tag\" [wmSirioBadge]=\"evaluateWithEvent(component.badge, event)\"></span>\r\n </div>\r\n <div>\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"getFormGroup(item)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n <ng-container *ngIf=\"component.allowAddRemove || component.allowReorder\">\r\n <div style=\"text-align:right\">\r\n <ng-container *ngTemplateOutlet=\"buttonsReorder; context: { formArray: formArray, i: i }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"buttonsRemove; context: { formArray: formArray, state: state, i: i }\"></ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"formArray.controls.length == 0\">\r\n <div class=\"dynamiclist-no-data\">{{ evaluateString(locale(component, 'noDataText')) || locale(Texts, 'NoData') }}</div>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"feedback\"></ng-container>\r\n <ng-container *ngIf=\"recursionLevel == 0 && component.subtype !== 'navigation'\">\r\n <ng-container *ngTemplateOutlet=\"buttonsAdd; context: { formArray: formArray, state: state }\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n <!-- #region templates -->\r\n <ng-template #btnMoveUp let-formArray=\"formArray\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"locale(Texts, 'MoveUp') as upLabel\">\r\n <!-- Name with the position (\"Sposta Sù elemento 3 di 5\"): the visible text first, the rest for screen readers. -->\r\n <button type=\"button\" wmSirioButton=\"ghost\"\r\n (click)=\"moveUpItem(formArray, i, $event)\"\r\n class=\"remove-item\"\r\n data-fp-action=\"up\" [attr.data-fp-index]=\"i\"\r\n icon=\"fa-arrow-up\" iconPosition=\"start\"\r\n [iconOnly]=\"!!compact\" [label]=\"upLabel + ' ' + itemPosition(i, formArray.length)\">{{ upLabel }}<span *ngIf=\"!compact\" class=\"sr-only\"> {{ itemPosition(i, formArray.length) }}</span></button>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #btnMoveDown let-formArray=\"formArray\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"locale(Texts, 'MoveDown') as downLabel\">\r\n <button type=\"button\" wmSirioButton=\"ghost\"\r\n (click)=\"moveDownItem(formArray, i, $event)\"\r\n class=\"remove-item\"\r\n data-fp-action=\"down\" [attr.data-fp-index]=\"i\"\r\n icon=\"fa-arrow-down\" iconPosition=\"start\"\r\n [iconOnly]=\"!!compact\" [label]=\"downLabel + ' ' + itemPosition(i, formArray.length)\">{{ downLabel }}<span *ngIf=\"!compact\" class=\"sr-only\"> {{ itemPosition(i, formArray.length) }}</span></button>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #btnRemove let-formArray=\"formArray\" let-state=\"state\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'removeLabel') || locale(Texts, 'RemoveItem')) as removeLabel\">\r\n <button type=\"button\" wmSirioButton=\"ghost\"\r\n (click)=\"removeItem(formArray, i, true, state, $event)\"\r\n class=\"remove-item\"\r\n data-fp-action=\"remove\" [attr.data-fp-index]=\"i\"\r\n icon=\"fa-trash\" iconPosition=\"start\"\r\n [iconOnly]=\"!!compact\" [label]=\"removeLabel + ' ' + itemPosition(i, formArray.length)\">{{ removeLabel }}<span *ngIf=\"!compact\" class=\"sr-only\"> {{ itemPosition(i, formArray.length) }}</span></button>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #btnAdd let-formArray=\"formArray\" let-state=\"state\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'addLabel') || locale(Texts, 'AddItem')) as addLabel\">\r\n <button type=\"button\" wmSirioButton=\"ghost\"\r\n (click)=\"addItem(formArray, state)\"\r\n data-fp-action=\"add\"\r\n class=\"add-item\"\r\n icon=\"fa-plus\" iconPosition=\"start\"\r\n [iconOnly]=\"!!compact\" [label]=\"addLabel\">{{ addLabel }}</button>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #buttonsReorder let-formArray=\"formArray\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowReorder\">\r\n <ng-container *ngTemplateOutlet=\"btnMoveUp; context: { formArray: formArray, i: i, compact: compact }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"btnMoveDown; context: { formArray: formArray, i: i, compact: compact }\"></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #buttonsRemove let-formArray=\"formArray\" let-state=\"state\" let-i=\"i\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowAddRemove && evaluateWithEventAsBoolean(component.removeCondition, { item: formArray.at(i)?.value, index: i, total: state.total }, true)\">\r\n <ng-container *ngTemplateOutlet=\"btnRemove; context: { formArray: formArray, state: state, i: i, compact: compact }\"></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #buttonsAdd let-formArray=\"formArray\" let-state=\"state\" let-compact=\"compact\">\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowAddRemove && evaluateWithEventAsBoolean(component.addCondition, { total: state.total }, true)\">\r\n <ng-container *ngTemplateOutlet=\"btnAdd; context: { formArray: formArray, state: state, compact: compact }\"></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #feedback>\r\n <ng-container *ngIf=\"getTextFeedback(component) as textFeedback\">\r\n <div>\r\n <span class=\"sirio-form-feedback d-block sirio-text-danger\">{{textFeedback}}</span>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'description')) as textHelp\">\r\n <div>\r\n <p class=\"sirio-form-text-help\">{{textHelp}}</p>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #navigation let-formArray=\"formArray\" let-state=\"state\">\r\n <!-- @wemake4u/form-controls: item navigator (page = element, 1-based); the actions are projected at the end of the row. -->\r\n <wm-sirio-pagination [showItems]=\"false\"\r\n [pageSize]=\"1\"\r\n [total]=\"state.total\"\r\n [page]=\"state.index + 1\"\r\n (pageChange)=\"state.index = $event - 1\"\r\n [ariaLabel]=\"locale(Texts, 'ElementsNavigation')\"\r\n [ofLabel]=\"locale(Texts, 'Of')\"\r\n [pagesLabel]=\"locale(Texts, 'Elements')\"\r\n [pageLabel]=\"locale(Texts, 'Element')\"\r\n [goToPageLabel]=\"locale(Texts, 'GoToElement')\"\r\n [previousLabel]=\"locale(Texts, 'PreviousElement')\"\r\n [nextLabel]=\"locale(Texts, 'NextElement')\">\r\n <div class=\"actions\">\r\n <ng-container *ngTemplateOutlet=\"buttonsAdd; context: { formArray: formArray, state: state }\"></ng-container>\r\n <ng-container *ngIf=\"state.total && state.index != -1\">\r\n <ng-container *ngTemplateOutlet=\"buttonsRemove; context: { formArray: formArray, state: state, i: state.index }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </wm-sirio-pagination>\r\n </ng-template>\r\n <!-- #endregion -->\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region group -->\r\n <ng-container *ngSwitchCase=\"'group'\">\r\n <div *ngIf=\"resolveBoundGroup(component) as resolvedGroup\"\r\n [ngClass]=\"getGroupOutline(component)\">\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'label')) as labelText\">\r\n <label>{{ labelText }}</label>\r\n </ng-container>\r\n <div #group\r\n [register]=\"component\"\r\n [componentRef]=\"group\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"resolvedGroup\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"component.rows\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region tab -->\r\n <ng-container *ngSwitchCase=\"'tab'\">\r\n <ng-container *ngIf=\"(getPanels(component) | async) as panels\">\r\n <ng-container *ngIf=\"panels.length > 0\">\r\n <!-- @wemake4u/form-controls: focusContent moves the focus into the panel shown at the start or selected (not for the\r\n arrow keys), except for the panels with disableAutoFocus. -->\r\n <wm-sirio-tabs #tabInstance\r\n [register]=\"component\"\r\n [componentRef]=\"tabInstance\"\r\n [scrollLeftLabel]=\"locale(Texts, 'ScrollLeft')\"\r\n [scrollRightLabel]=\"locale(Texts, 'ScrollRight')\"\r\n [line]=\"!!component.navigation\"\r\n [vertical]=\"!!component.vertical\"\r\n [focusablePanels]=\"false\"\r\n focusContent>\r\n <ng-container *ngFor=\"let panel of panels; let i = index;\">\r\n <wm-sirio-tab *ngIf=\"evaluateConditional(panel.conditional)\"\r\n [label]=\"evaluateString(locale(panel, 'label'))\"\r\n [icon]=\"evaluateString(panel.icon) || null\"\r\n [disabled]=\"evaluateBoolean(panel.disabled) ?? false\"\r\n [badge]=\"evaluate(panel.badge)\"\r\n [focusContent]=\"panel.disableAutoFocus !== true\">\r\n <ng-template wmSirioTabContent>\r\n <ng-container *ngIf=\"getTemplate(panel.template) as template\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"resolvePath(panel.path)\"\r\n [rows]=\"template.rows\"\r\n [identity]=\"component.id\"\r\n [identityIndex]=\"i\"\r\n [readOnly]=\"readOnly || evaluateBoolean(panel.readonly)\"\r\n [disableAutoFocus]=\"template.disableAutoFocus\"\r\n [alignment]=\"template.verticalAlignment\"></app-dynamic-fields>\r\n </ng-container>\r\n </ng-template>\r\n </wm-sirio-tab>\r\n </ng-container>\r\n </wm-sirio-tabs>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region accordion -->\r\n <ng-container *ngSwitchCase=\"'accordion'\">\r\n <ng-container *ngIf=\"(getPanels(component) | async) as panels\">\r\n <ng-container *ngIf=\"panels.length > 0\">\r\n <!-- exclusive: one section open at a time, as with ngx-sirio-lib. -->\r\n <wm-sirio-accordion exclusive\r\n #accordion\r\n [register]=\"component\"\r\n [componentRef]=\"accordion\">\r\n <ng-container *ngFor=\"let panel of panels; let i = index;\">\r\n <ng-container *ngIf=\"resolvePath(panel.path) as formGroup\">\r\n <!-- Content not lazy (as before): the fields of closed sections stay in the form. -->\r\n <wm-sirio-accordion-item *ngIf=\"evaluateConditional(panel.conditional)\"\r\n [title]=\"evaluateString(locale(panel, 'label'))\"\r\n [badge]=\"evaluate(panel.badge)\"\r\n [disabled]=\"evaluateBoolean(panel.disabled)\">\r\n <ng-container *ngIf=\"getTemplate(panel.template) as template\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"formGroup\"\r\n [readOnly]=\"readOnly || evaluateBoolean(panel.readonly)\"\r\n [rows]=\"template.rows\"\r\n [identity]=\"component.id\"\r\n [identityIndex]=\"i\"\r\n [disableAutoFocus]=\"template.disableAutoFocus\"\r\n [alignment]=\"template.verticalAlignment\"></app-dynamic-fields>\r\n </ng-container>\r\n </wm-sirio-accordion-item>\r\n </ng-container>\r\n </ng-container>\r\n </wm-sirio-accordion>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region text -->\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <div [collapse]=\"component.collapseTo\"\r\n [onCollapse]=\"callExpression(component.onCollapse)\"\r\n [onExpand]=\"callExpression(component.onExpand)\"\r\n #text\r\n [register]=\"component\"\r\n [componentRef]=\"text\">\r\n <!--Reset View Context-->\r\n <div tabindex=\"0\" style=\"display:none\"></div>\r\n <div class=\"flex\">\r\n <div class=\"text-paragraph\" markdown\r\n [onAnchorClick]=\"callExpression(component.anchorClick)\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'text')))\">\r\n </div>\r\n <ng-container *ngIf=\"component.tooltip\">\r\n <wm-sirio-info-button [content]=\"tooltipTemplate\"\r\n [label]=\"locale(Texts, 'Information')\"></wm-sirio-info-button>\r\n <ng-template #tooltipTemplate>\r\n <div class=\"sirio-tooltip-body\">\r\n <div class=\"text-paragraph\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'tooltip')))\">\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region html -->\r\n <ng-container *ngSwitchCase=\"'html'\">\r\n <div class=\"html-paragraph\"\r\n [innerHTML]=\"sanitize(evaluateTemplate(locale(component, 'content')))\"\r\n #html\r\n [register]=\"component\"\r\n [componentRef]=\"html\">\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region image -->\r\n <ng-container *ngSwitchCase=\"'image'\">\r\n <!-- || '': an alt expression giving null would be read aloud as \"null\". -->\r\n <img [src]=\"evaluateString(component.source)\"\r\n [alt]=\"evaluateString(locale(component, 'alt')) || ''\"\r\n style=\"width: 100%;height: 100%;\"\r\n #image\r\n [register]=\"component\"\r\n [componentRef]=\"image\">\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region table -->\r\n <ng-container *ngSwitchCase=\"'table'\">\r\n <label *ngIf=\"evaluateString(locale(component, 'label')) as tableLabel\">{{ tableLabel }}</label>\r\n @if (useDataGrid) {\r\n <!-- Sirio data grid (DynamicFieldsComponent.useDataGrid): configuration from SirioGridService. -->\r\n @let grid = getSirioGrid(component);\r\n @let rows = getSirioRows(component, grid);\r\n <!-- Paginator with rowCount > 0, or when the server source pages its rows. -->\r\n @let pagedSize = grid.pageable ? null : rows.pagedSize();\r\n @let gridHeight = component.autoHeight ? null : evaluateSize(component.height);\r\n <wm-sirio-data-grid #table\r\n class=\"fp-data-grid\"\r\n variant=\"dark\"\r\n size=\"sm\"\r\n [filterButton]=\"component.floatingFilter === true ? 'always' : 'none'\"\r\n [showFilterChips]=\"false\"\r\n paginationVariant=\"compact\"\r\n [caption]=\"evaluateString(locale(component, 'label'))\"\r\n [data]=\"rows.data()\"\r\n [dataSource]=\"rows.dataSource\"\r\n [loading]=\"rows.loading()\"\r\n [emptyText]=\"rows.failed() ? locale(Texts, 'LoadingFailed') : 'Nessun risultato'\"\r\n [loadErrorText]=\"locale(Texts, 'LoadingFailed')\"\r\n [rowId]=\"grid.rowId\"\r\n [selection]=\"sirioSelection(component)\"\r\n singleSelectionControl=\"checkbox\"\r\n [selectionColumn]=\"grid.checkboxes\"\r\n [selectOnRowClick]=\"grid.checkboxes && grid.clickSelect\"\r\n selectAll=\"filtered\"\r\n hideUnselectable\r\n [rowSelectable]=\"grid.rowSelectable\"\r\n [selected]=\"grid.selected()\"\r\n (selectedChange)=\"onSirioSelectionChanged(component, grid, $event)\"\r\n [rowClass]=\"grid.rowClass\"\r\n [rowStyle]=\"grid.rowStyle\"\r\n [pageable]=\"grid.pageable || pagedSize !== null\"\r\n [pageSize]=\"pagedSize ?? grid.pageSize\"\r\n [pageSizeOptions]=\"sirioPageSizes(pagedSize)\"\r\n [rowNumbers]=\"grid.rowNumbers\"\r\n rowNumberHeader=\"#\"\r\n [resizable]=\"grid.resizable\"\r\n [reorderable]=\"grid.reorderable\"\r\n filterOperators\r\n [filterRow]=\"component.floatingFilter === true\"\r\n [filterYesLabel]=\"locale(Texts, 'True')\"\r\n [filterNoLabel]=\"locale(Texts, 'False')\"\r\n [height]=\"gridHeight\"\r\n [stickyHeader]=\"!!gridHeight\"\r\n [minHeight]=\"evaluateSize(component.minHeight)\"\r\n [refresh]=\"refreshRowSource(component)\"\r\n [register]=\"component\"\r\n [componentRef]=\"table\">\r\n @for (col of grid.columns; track col.id) {\r\n <wm-sirio-grid-column [field]=\"col.field\"\r\n [header]=\"col.header\"\r\n [value]=\"col.value\"\r\n [format]=\"col.format\"\r\n [align]=\"col.align\"\r\n [filter]=\"col.filter\"\r\n [filterOptions]=\"col.filterOptions\"\r\n [filterMultiple]=\"col.filterMultiple\"\r\n [filterOperators]=\"col.filterOperators\"\r\n [sortable]=\"col.sortable\"\r\n [resizable]=\"col.resizable\"\r\n [wrap]=\"col.wrap\"\r\n [mono]=\"col.mono\"\r\n [fit]=\"col.fit\"\r\n [fixed]=\"col.fixed\"\r\n [flex]=\"col.flex\"\r\n [width]=\"col.width\"\r\n [minWidth]=\"col.minWidth\"\r\n [maxWidth]=\"col.maxWidth\"\r\n [group]=\"col.group\"\r\n [hidden]=\"col.actions && evaluateBoolean(component.suppressActions) === true\"\r\n [cellClass]=\"col.cellClass\"\r\n [cellStyle]=\"col.cellStyle\"\r\n [headerClass]=\"col.headerClass\"\r\n [headerStyle]=\"col.headerStyle\">\r\n @if (col.renderer; as renderer) {\r\n <ng-template wmSirioGridCell let-row let-value=\"value\" let-index=\"index\">\r\n @if (renderer.kind === 'html') {\r\n <span [innerHTML]=\"renderer.html(row, value)\"></span>\r\n } @else {\r\n <fp-sirio-cell-host [renderer]=\"renderer.type\" [params]=\"renderer.params(row, value, index)\" />\r\n }\r\n </ng-template>\r\n }\r\n </wm-sirio-grid-column>\r\n }\r\n </wm-sirio-data-grid>\r\n } @else {\r\n <ag-grid-angular [modules]=\"getGridModules(component)\"\r\n [gridOptions]=\"getGridOptions(component)\"\r\n [selectable]=\"evaluateBoolean(component.selectable)\"\r\n [multiSelect]=\"evaluateBoolean(component.multiSelect)\"\r\n (selectionChanged)=\"onGridSelectionChanged(component, $event)\"\r\n [suppressActions]=\"evaluateBoolean(component.suppressActions)\"\r\n [columns]=\"component.columns || evaluateWithHydratation(component.columnsExpression) || []\"\r\n [rowSource]=\"getRowSource(component)\"\r\n [refresh]=\"refreshRowSource(component)\"\r\n [style.height]=\"component.autoHeight ? null : evaluateSize(component.height)\"\r\n [style.min-height]=\"evaluateSize(component.minHeight)\"\r\n [formGroup]=\"formGroup\"\r\n #table\r\n [register]=\"component\"\r\n [componentRef]=\"table\" />\r\n }\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region button -->\r\n <ng-container *ngSwitchCase=\"'button'\">\r\n <div [ngClass]=\"getHorizontalAlignment(component)\">\r\n <!-- @wemake4u/form-controls: color \"ghost\" = plain sirio-btn; icon on the left unless iconPosition \"right\". -->\r\n <button type=\"button\"\r\n [wmSirioButton]=\"evaluateVariant(component.color)\"\r\n [disabled]=\"evaluateBoolean(component.disabled) ?? false\"\r\n [icon]=\"evaluateString(component.icon) || null\"\r\n [iconPosition]=\"component.iconPosition == 'right' ? 'end' : 'start'\"\r\n (click)=\"clickButton(component, $event)\"\r\n #button\r\n [register]=\"component\"\r\n [componentRef]=\"button\">{{ evaluateString(locale(component, 'label')) }}</button>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region separator -->\r\n <ng-container *ngSwitchCase=\"'separator'\">\r\n <div class=\"separator\"\r\n #separator\r\n [register]=\"component\"\r\n [componentRef]=\"separator\">\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region spacer -->\r\n <ng-container *ngSwitchCase=\"'spacer'\">\r\n <div style=\"width: 100%\"\r\n [style.height.px]=\"component.height\"\r\n #spacer\r\n [register]=\"component\"\r\n [componentRef]=\"spacer\">\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region iframe -->\r\n <ng-container *ngSwitchCase=\"'iframe'\">\r\n <label [for]=\"component.id\">{{ evaluateString(locale(component, 'label')) }}</label>\r\n <iframe [src]=\"evaluateUrl(component.url)\"\r\n [title]=\"evaluateString(locale(component, 'label'))\"\r\n [style.width]=\"'100%'\"\r\n [style.height.px]=\"component.height\"\r\n [frameSecurity]=\"component.security\"\r\n #iframe\r\n [register]=\"component\"\r\n [componentRef]=\"iframe\">\r\n </iframe>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region alert -->\r\n <ng-container *ngSwitchCase=\"'alert'\">\r\n <!-- @wemake4u/form-controls: preventClose → no close button; markdown as block content. -->\r\n <wm-sirio-alert [type]=\"component.role || 'info'\"\r\n [closeLabel]=\"locale(Texts, 'Close')\"\r\n [dismissible]=\"!evaluateBoolean(component.preventClose)\"\r\n #alert\r\n [register]=\"component\"\r\n [componentRef]=\"alert\">\r\n <div wmSirioAlertContent\r\n class=\"text-paragraph\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'text')))\">\r\n </div>\r\n </wm-sirio-alert>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region notice -->\r\n <ng-container *ngSwitchCase=\"'notice'\">\r\n <!-- @wemake4u/form-controls: light notice (kit default); markdown as block content. -->\r\n <wm-sirio-notify #notice\r\n [title]=\"evaluateString(locale(component, 'title'))\"\r\n [register]=\"component\"\r\n [componentRef]=\"notice\">\r\n <div wmSirioNotifyContent\r\n class=\"text-paragraph\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'text')))\">\r\n </div>\r\n </wm-sirio-notify>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region tooltip -->\r\n <ng-container *ngSwitchCase=\"'tooltip'\">\r\n <!-- @wemake4u/form-controls: the title is the popover title of the kit. -->\r\n <wm-sirio-info-button [content]=\"tooltipTemplate\"\r\n [title]=\"evaluateString(locale(component, 'title'))\"\r\n [label]=\"evaluateString(locale(component, 'title')) || locale(Texts, 'Information')\"\r\n #tooltip\r\n [register]=\"component\"\r\n [componentRef]=\"tooltip\"></wm-sirio-info-button>\r\n <ng-template #tooltipTemplate>\r\n <div class=\"sirio-tooltip-body\">\r\n <div class=\"text-paragraph\"\r\n [innerHTML]=\"toHTML(evaluateTemplate(locale(component, 'text')))\">\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region chart -->\r\n <ng-container *ngSwitchCase=\"'chart'\">\r\n <label>{{ evaluateString(locale(component, 'label')) }}</label>\r\n <ng-container [observe]=\"getChartData(component)\"\r\n [callback]=\"invalidateChart(component)\">\r\n <ag-charts [options]=\"(getChartOptions(component) | async) ?? {}\"\r\n [style.height.px]=\"component.height\"\r\n #chart\r\n [register]=\"component\"\r\n [componentRef]=\"chart\" />\r\n </ng-container> \r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region component -->\r\n <ng-container *ngSwitchCase=\"'component'\">\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'label')) as labelText\">\r\n <label>{{ labelText }}</label>\r\n </ng-container>\r\n <ng-container *ngIf=\"component.isInput; else noInputTemplate\">\r\n <app-dynamic-host [properties]=\"getFeelableProperties(component)\"\r\n [formGroup]=\"resolvePath(component.path)\"\r\n #componentHost\r\n [register]=\"component\"\r\n [componentRef]=\"componentHost\" />\r\n <ng-container *ngIf=\"getTextFeedback(component) as textFeedback\">\r\n <span class=\"sirio-form-feedback d-block sirio-text-danger\">{{textFeedback}}</span>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'description')) as textHelp\">\r\n <p class=\"sirio-form-text-help\">{{textHelp}}</p>\r\n </ng-container>\r\n <ng-template #noInputTemplate>\r\n <app-dynamic-host [properties]=\"getFeelableProperties(component)\"\r\n #componentHost\r\n [register]=\"component\"\r\n [componentRef]=\"componentHost\" />\r\n </ng-template>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region templatehost -->\r\n <ng-container *ngSwitchCase=\"'templatehost'\">\r\n <ng-container *ngIf=\"getTemplate(component.template) as template\">\r\n <div #template\r\n [register]=\"component\"\r\n [componentRef]=\"template\">\r\n <app-dynamic-fields [form]=\"form\"\r\n [formGroup]=\"resolvePath(component.path)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(component.readonly)\"\r\n [rows]=\"template?.rows\"\r\n [identity]=\"component.id\"\r\n [disableAutoFocus]=\"component.disableAutoFocus\"\r\n [alignment]=\"component.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region treelist -->\r\n <ng-container *ngSwitchCase=\"'treelist'\">\r\n <label>{{ evaluateString(locale(component, 'label')) }}</label>\r\n <div class=\"treelist\"\r\n [style.height]=\"component.height ? evaluateSize(component.height): null\"\r\n *ngIf=\"getTreeColumns(component) as columns\">\r\n <ng-container *ngIf=\"((getTreeSource(component) | async) ?? []) as rows\">\r\n <table #treelist\r\n [register]=\"component\"\r\n [componentRef]=\"treelist\"\r\n [treelist]=\"rows\">\r\n <colgroup>\r\n <col *ngFor=\"let column of columns\"\r\n [style.width]=\"evaluateSize(column.width)\">\r\n </colgroup>\r\n <thead>\r\n <tr>\r\n <th scope=\"col\" *ngFor=\"let column of columns\"\r\n [ngClass]=\"getClass(column)\"\r\n [style.text-align]=\"column.align\">\r\n {{column.label}}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <ng-container>\r\n <tr *ngFor=\"let row of rows\"\r\n [attr.data-id]=\"row.id\"\r\n [attr.data-parent]=\"row.parentId\"\r\n [attr.data-expanded]=\"row.expanded ? 'true': 'false'\"\r\n [ngClass]=\"row.meta?.['cssClass']\">\r\n <td *ngFor=\"let column of columns; let i = index\"\r\n [ngClass]=\"getClass(column)\">\r\n <div [style.justify-content]=\"getJustify(column.align)\">\r\n <span *ngIf=\"i==component.expanderColumn\"\r\n [style.visibility]=\"row.hasChildren ? 'visible' : 'hidden'\"\r\n [style.padding-left]=\"evaluateSize(20 * row.level)\"\r\n class=\"toggle\"></span>\r\n <span class=\"text\"\r\n [title]=\"row.data[column.key]\">\r\n {{ row.data[column.key] }}\r\n </span>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <!-- #endregion -->\r\n <!-- #region navigator -->\r\n <ng-container *ngSwitchCase=\"'navigator'\">\r\n <div #navigator\r\n [register]=\"component\"\r\n [componentRef]=\"navigator\">\r\n <div navigatorState\r\n [index]=\"evaluateNumber(component.index) ?? 0\"\r\n [total]=\"evaluateNumber(component.total) ?? 0\"\r\n (indexChange)=\"evaluateWithEventAsHandler(component.selectionChanged, { index: $event, count: state.total })\"\r\n #state=\"navigatorState\">\r\n <!-- @wemake4u/form-controls: item navigator (page = element, 1-based); the actions are projected at the end of the row. -->\r\n <wm-sirio-pagination [showItems]=\"false\"\r\n [pageSize]=\"1\"\r\n [total]=\"state.total\"\r\n [page]=\"state.index + 1\"\r\n (pageChange)=\"state.index = $event - 1\"\r\n [ariaLabel]=\"locale(Texts, 'ElementsNavigation')\"\r\n [ofLabel]=\"locale(Texts, 'Of')\"\r\n [pagesLabel]=\"locale(Texts, 'Elements')\"\r\n [pageLabel]=\"locale(Texts, 'Element')\"\r\n [goToPageLabel]=\"locale(Texts, 'GoToElement')\"\r\n [previousLabel]=\"locale(Texts, 'PreviousElement')\"\r\n [nextLabel]=\"locale(Texts, 'NextElement')\">\r\n <div class=\"actions\">\r\n <ng-container *ngTemplateOutlet=\"buttonsAdd; context: { total: state.total }\"></ng-container>\r\n <ng-container *ngIf=\"state.total && state.index != -1\">\r\n <ng-container *ngTemplateOutlet=\"buttonsRemove; context: { i: state.index, total: state.total }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </wm-sirio-pagination>\r\n </div>\r\n </div>\r\n <ng-template #buttonsAdd let-total=\"total\">\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowAddRemove && evaluateWithEventAsBoolean(component.addCondition, { total: total }, true)\">\r\n <ng-container *ngTemplateOutlet=\"btnAdd; context: { total: total }\"></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #buttonsRemove let-i=\"i\" let-total=\"total\">\r\n <ng-container *ngIf=\"!(readOnly || evaluateBoolean(component.readonly)) && component.allowAddRemove && evaluateWithEventAsBoolean(component.removeCondition, { index: i, total: total }, true)\">\r\n <ng-container *ngTemplateOutlet=\"btnRemove; context: { i: i, total: total }\"></ng-container>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #btnAdd let-total=\"total\">\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'addLabel') || locale(Texts, 'AddItem')) as addLabel\">\r\n <button type=\"button\" wmSirioButton=\"ghost\"\r\n class=\"add-item\"\r\n (click)=\"evaluateWithEventAsHandler(component.addExpression, { total: total })\"\r\n icon=\"fa-plus\" iconPosition=\"start\">{{ addLabel }}</button>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #btnRemove let-i=\"i\" let-total=\"total\">\r\n <ng-container *ngIf=\"evaluateString(locale(component, 'removeLabel') || locale(Texts, 'RemoveItem')) as removeLabel\">\r\n <button type=\"button\" wmSirioButton=\"ghost\"\r\n class=\"remove-item\"\r\n (click)=\"evaluateWithEventAsHandler(component.removeExpression, { index: i, total: total })\"\r\n icon=\"fa-trash\" iconPosition=\"start\">{{ removeLabel }}<span class=\"sr-only\"> {{ itemPosition(i, total) }}</span></button>\r\n </ng-container>\r\n </ng-template>\r\n </ng-container>\r\n <!-- #endregion -->\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</div>\r\n\r\n","// Allowed CSS properties, matched as prefixes: \"border\" also allows \"border-top-color\".\r\n// Shorthands are expanded by the browser into longhands before the check.\r\nconst ALLOWED_PROPERTIES = [\r\n // Colors and backgrounds\r\n 'color', 'background', 'opacity', 'accent-color', 'caret-color',\r\n\r\n // Typography\r\n 'font', 'text', 'line-height', 'letter-spacing', 'word', 'white-space',\r\n 'vertical-align', 'hyphens', 'overflow-wrap', 'direction', 'unicode-bidi',\r\n 'list-style', 'quotes',\r\n\r\n // Box model\r\n 'margin', 'padding', 'border', 'outline', 'box', 'width', 'height',\r\n 'min-width', 'max-width', 'min-height', 'max-height',\r\n 'inline-size', 'block-size', 'min-inline-size', 'max-inline-size',\r\n 'min-block-size', 'max-block-size', 'aspect-ratio',\r\n\r\n // Layout\r\n 'display', 'position', 'top', 'right', 'bottom', 'left', 'inset',\r\n 'z-index', 'float', 'clear', 'overflow', 'visibility', 'isolation',\r\n\r\n // Flexbox and grid\r\n 'flex', 'grid', 'gap', 'row-gap', 'column', 'order',\r\n 'align', 'justify', 'place',\r\n\r\n // Tables\r\n 'table-layout', 'caption-side', 'empty-cells',\r\n\r\n // Visual effects\r\n 'transform', 'translate', 'rotate', 'scale', 'perspective',\r\n 'filter', 'backdrop-filter', 'clip-path', 'mix-blend-mode',\r\n 'object-fit', 'object-position',\r\n\r\n // Animations (keyframes are dropped, so only transitions really apply)\r\n 'transition', 'animation',\r\n\r\n // Interaction\r\n 'cursor', 'pointer-events', 'user-select', 'resize', 'scroll', 'touch-action',\r\n];\r\n\r\n// Values that could load resources, read attributes or execute legacy script hooks\r\nconst FORBIDDEN_VALUE = /url\\(|image-set\\(|image\\(|element\\(|expression\\(|javascript:|attr\\(/i;\r\n\r\nconst MAX_CSS_LENGTH = 20_000;\r\n\r\nexport function supportsConstructableStylesheets(): boolean {\r\n return (\r\n typeof Document !== 'undefined' &&\r\n 'adoptedStyleSheets' in Document.prototype &&\r\n 'replaceSync' in CSSStyleSheet.prototype\r\n );\r\n}\r\n\r\nexport function sanitizeCss(css: string, scope: string): string {\r\n if (!css || css.length > MAX_CSS_LENGTH) {\r\n return '';\r\n }\r\n\r\n const output: string[] = [];\r\n for (const rule of parseStyleRules(css)) {\r\n const declarations: string[] = [];\r\n for (const prop of Array.from(rule.style)) {\r\n const value = rule.style.getPropertyValue(prop);\r\n\r\n // Custom properties (--name) are always allowed, their values are still checked below\r\n const allowed =\r\n prop.startsWith('--') ||\r\n ALLOWED_PROPERTIES.some(p => prop === p || prop.startsWith(p + '-'));\r\n\r\n // A fixed element could cover the whole page (UI redressing)\r\n const fixedPosition = prop === 'position' && /fixed/i.test(value);\r\n\r\n if (allowed && !fixedPosition && !FORBIDDEN_VALUE.test(value)) {\r\n const priority = rule.style.getPropertyPriority(prop) ? ' !important' : '';\r\n declarations.push(`${prop}: ${value}${priority};`);\r\n }\r\n }\r\n if (!declarations.length) {\r\n continue;\r\n }\r\n\r\n const selectors = splitSelectors(rule.selectorText).map(s => scopeSelector(s, scope));\r\n output.push(`${selectors.join(', ')} { ${declarations.join(' ')} }`);\r\n }\r\n return output.join('\\n');\r\n}\r\n\r\n// Parses CSS with the browser engine and returns only plain style rules\r\n// (at-rules like @import, @media, @font-face are dropped)\r\nfunction parseStyleRules(css: string): CSSStyleRule[] {\r\n let rules: CSSRuleList | undefined;\r\n try {\r\n if (supportsConstructableStylesheets()) {\r\n const sheet = new CSSStyleSheet();\r\n sheet.replaceSync(css);\r\n rules = sheet.cssRules;\r\n } else {\r\n // Fallback: parse inside an inert document so nothing is applied to the page\r\n const inertDoc = document.implementation.createHTMLDocument('');\r\n const style = inertDoc.createElement('style');\r\n style.textContent = css;\r\n inertDoc.head.appendChild(style);\r\n rules = style.sheet?.cssRules;\r\n }\r\n } catch {\r\n return [];\r\n }\r\n return rules\r\n ? Array.from(rules).filter((r): r is CSSStyleRule => r instanceof CSSStyleRule)\r\n : [];\r\n}\r\n\r\n// \":host\" targets the scope element itself, any other selector targets its descendants\r\nfunction scopeSelector(selector: string, scope: string): string {\r\n return selector.includes(':host') ? selector.replace(/:host/g, scope) : `${scope} ${selector}`;\r\n}\r\n\r\n// Splits a selector list on top-level commas, ignoring commas inside (), [] or quotes\r\nfunction splitSelectors(selectorText: string): string[] {\r\n const parts: string[] = [];\r\n let current = '';\r\n let depth = 0;\r\n let quote: string | null = null;\r\n\r\n for (const ch of selectorText) {\r\n if (quote) {\r\n if (ch === quote) quote = null;\r\n } else if (ch === '\"' || ch === \"'\") {\r\n quote = ch;\r\n } else if (ch === '(' || ch === '[') {\r\n depth++;\r\n } else if (ch === ')' || ch === ']') {\r\n depth--;\r\n } else if (ch === ',' && depth === 0) {\r\n parts.push(current);\r\n current = '';\r\n continue;\r\n }\r\n current += ch;\r\n }\r\n parts.push(current);\r\n return parts.map(p => p.trim()).filter(Boolean);\r\n}\r\n","import {\r\n Directive, ElementRef, Input, OnChanges, OnDestroy, PLATFORM_ID, Renderer2, inject,\r\n DOCUMENT\r\n} from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { sanitizeCss, supportsConstructableStylesheets } from '../utils/sanitize-css';\r\n\r\nlet nextId = 0;\r\n\r\n@Directive({\r\n selector: '[css]',\r\n standalone: true,\r\n})\r\nexport class StyleDirective implements OnChanges, OnDestroy {\r\n @Input('css') css = '';\r\n\r\n private readonly renderer = inject(Renderer2);\r\n private readonly doc = inject(DOCUMENT);\r\n private readonly host = inject(ElementRef<HTMLElement>);\r\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\r\n // Unique attribute used to scope the injected rules to this host element\r\n private readonly scopeAttr = `df-style-${nextId++}`;\r\n\r\n // Only one of these is used, depending on browser support\r\n private sheet?: CSSStyleSheet;\r\n private styleEl?: HTMLStyleElement;\r\n\r\n constructor() {\r\n this.renderer.setAttribute(this.host.nativeElement, this.scopeAttr, '');\r\n\r\n // Nothing to inject during server-side rendering\r\n if (!this.isBrowser) {\r\n return;\r\n }\r\n\r\n if (supportsConstructableStylesheets()) {\r\n this.sheet = new CSSStyleSheet();\r\n // Reassign instead of push: older implementations expose a frozen array\r\n this.doc.adoptedStyleSheets = [...this.doc.adoptedStyleSheets, this.sheet];\r\n } else {\r\n // Fallback for browsers without constructable stylesheets\r\n this.styleEl = this.renderer.createElement('style');\r\n this.renderer.appendChild(this.doc.head, this.styleEl);\r\n }\r\n }\r\n\r\n ngOnChanges(): void {\r\n if (!this.isBrowser) {\r\n return;\r\n }\r\n\r\n const safeCss = sanitizeCss(this.css ?? '', `[${this.scopeAttr}]`);\r\n\r\n if (this.sheet) {\r\n this.sheet.replaceSync(safeCss);\r\n } else if (this.styleEl) {\r\n // textContent avoids any HTML parsing of the CSS content\r\n this.renderer.setProperty(this.styleEl, 'textContent', safeCss);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.sheet) {\r\n this.doc.adoptedStyleSheets = this.doc.adoptedStyleSheets.filter(s => s !== this.sheet);\r\n }\r\n if (this.styleEl) {\r\n this.renderer.removeChild(this.doc.head, this.styleEl);\r\n }\r\n }\r\n}\r\n","/**\r\n * Scroll helpers used when the active form changes (DynamicFormComponent.scrollOnNavigate).\r\n */\r\n\r\n/** Nearest ancestor that scrolls vertically, or null when the page itself scrolls. */\r\nfunction scrollParent(element: HTMLElement): HTMLElement | null {\r\n const doc = element.ownerDocument;\r\n let parent = element.parentElement;\r\n while (parent && parent !== doc.body && parent !== doc.documentElement) {\r\n const overflowY = doc.defaultView?.getComputedStyle(parent).overflowY ?? '';\r\n if (/(auto|scroll|overlay)/.test(overflowY) && parent.scrollHeight > parent.clientHeight) {\r\n return parent;\r\n }\r\n parent = parent.parentElement;\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * True when the start of the element (minus its scroll-margin-top) is inside the visible area of its scroll container\r\n * (the nearest scrolling ancestor, otherwise the viewport).\r\n */\r\nfunction isStartVisible(element: HTMLElement): boolean {\r\n const view = element.ownerDocument.defaultView;\r\n if (!view) {\r\n return true;\r\n }\r\n const margin = parseFloat(view.getComputedStyle(element).scrollMarginTop) || 0;\r\n const top = element.getBoundingClientRect().top - margin;\r\n const parent = scrollParent(element);\r\n const area = parent ? parent.getBoundingClientRect() : { top: 0, bottom: view.innerHeight };\r\n return top >= area.top && top < area.bottom;\r\n}\r\n\r\n/**\r\n * Brings the start of the element into view (block start, honouring its scroll-margin-top) when it is not already\r\n * visible. Works with the page and with nested scroll containers (dashboard content, dialogs).\r\n */\r\nexport function scrollToStart(element: HTMLElement | null | undefined): void {\r\n if (!element || isStartVisible(element)) {\r\n return;\r\n }\r\n element.scrollIntoView({ block: 'start', inline: 'nearest', behavior: 'instant' });\r\n}\r\n\r\n/** Scrolls the page to its top (only the document: nested scroll containers are not moved). */\r\nexport function scrollPageToTop(doc: Document): void {\r\n const view = doc.defaultView;\r\n if (view && view.scrollY > 0) {\r\n view.scrollTo({ top: 0, left: view.scrollX, behavior: 'instant' });\r\n }\r\n}\r\n","import {\r\n Component, Input, Output, OnChanges, OnDestroy\r\n , SimpleChanges, ViewEncapsulation, EventEmitter\r\n , ViewChild, ElementRef, Injector,\r\n ChangeDetectionStrategy,\r\n OnInit,\r\n ChangeDetectorRef,\r\n DestroyRef,\r\n Optional,\r\n inject\r\n} from '@angular/core';\r\nimport { CommonModule, DOCUMENT } from '@angular/common';\r\nimport { ActivatedRoute, Router, Params } from '@angular/router';\r\nimport { FormGroup, AbstractControl, FormArray } from '@angular/forms';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { distinctUntilChanged, map, merge, Observable, Subject, Subscription } from 'rxjs';\r\nimport { FormGroupMode } from '../utils/FormGroupEx';\r\nimport { FormBuilderService } from '../services/builder.service';\r\nimport { IEvaluatorProvider, ProgrammabilityService } from '../services/programmability.service';\r\nimport { ValidationService } from '../services/validation.service';\r\nimport { DisableService } from '../services/disable.service';\r\nimport { StatusService } from '../services/status.service';\r\nimport { EventService } from '../services/event.service';\r\nimport { ComputeService } from '../services/compute.service';\r\nimport { groupByRow } from '../utils/groupByRow';\r\nimport { MetadataService } from '../services/metadata.service';\r\nimport { FormService } from '../services/form.service';\r\nimport { StateService } from '../services/state.service';\r\nimport { FunctionService } from '../services/function.service';\r\nimport { DialogService, FormDialogOptions } from '../services/dialog.service';\r\nimport { SubscribeService } from '../services/subscribe.service';\r\nimport { LifetimeService } from '../services/lifetime.service';\r\nimport { DynamicFieldsComponent } from '../dynamic-fields/dynamic-fields.component';\r\nimport { SirioButton, SirioSidenav, SirioSidenavItem, SirioStep, SirioStepper, provideSirioReadonlyAppearance } from '@wemake4u/form-controls';\r\nimport { RegisterService } from '../services/register.service';\r\nimport { RegisterDirective } from '../directives/register.directive';\r\nimport { StyleDirective } from '../directives/style.directive';\r\nimport { ToBoundArrows } from '../utils/bound';\r\n\r\nimport { Control } from '../controls/control';\r\nimport { hasFieldFocus, setFocus } from '../utils/focusable';\r\nimport { scrollPageToTop, scrollToStart } from '../utils/scroll';\r\n\r\nimport { LanguageService } from '@wemake4u/interact';\r\nimport { Texts } from '../locale/locale';\r\nimport { localize } from '../locale/localize';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { ScopeService } from '../services/scope.service';\r\n\r\nexport type BrowserNavigation = 'none' | 'fragment' | 'queryParam';\r\n\r\n/**\r\n * Where the view scrolls when the active form changes:\r\n * - `content`: start of the form content (title and fields);\r\n * - `form`: start of the whole form player (progress stepper included);\r\n * - `page`: top of the page (the document; nested scroll containers are not moved);\r\n * - `none`: no scroll.\r\n */\r\nexport type ScrollOnNavigate = 'content' | 'form' | 'page' | 'none';\r\n\r\n@Component({\r\n selector: 'app-dynamic-form',\r\n templateUrl: './dynamic-form.component.html',\r\n styleUrls: [\r\n '../shared/bootstrap-grid.scss',\r\n './dynamic-form.component.css'\r\n ],\r\n imports: [CommonModule, ReactiveFormsModule,\r\n RegisterDirective, StyleDirective,\r\n SirioButton, SirioStepper, SirioSidenav,\r\n DynamicFieldsComponent],\r\n providers: [\r\n ProgrammabilityService,\r\n FormBuilderService,\r\n ValidationService,\r\n DisableService,\r\n ComputeService,\r\n StatusService,\r\n EventService,\r\n RegisterService,\r\n MetadataService,\r\n FunctionService,\r\n SubscribeService,\r\n StateService,\r\n LifetimeService,\r\n provideSirioReadonlyAppearance('outline')\r\n ],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class DynamicFormComponent implements OnInit, OnChanges, OnDestroy, IEvaluatorProvider {\r\n @Input() schema: any;\r\n @Input() formGroup!: FormGroup;\r\n @Input() readOnly: boolean | null = null;\r\n @Input() value: any = {};\r\n @Input() strict: boolean = false;\r\n @Input() showNav: boolean = true;\r\n @Input() showNavButton: boolean = true;\r\n @Input() showProgress: boolean = false;\r\n @Input() showFormTitle: boolean = false;\r\n @Input() progressStatus: boolean = true;\r\n @Input() preventNavigationOnErrors = false;\r\n @Input() browserNavigation: BrowserNavigation = 'none';\r\n @Input() queryParamName = 'v';\r\n @Input() navSize: 'normal' | 'small' = 'normal';\r\n /** Scroll applied when the active form changes (next/previous, side menu, stepper, goTo, browser history). */\r\n @Input() scrollOnNavigate: ScrollOnNavigate = 'content';\r\n @Input() groupMode: FormGroupMode = \"default\";\r\n @Input() updateMode: 'changes' | 'submit' = 'changes';\r\n @Output() valueChange = new EventEmitter<any>();\r\n @Output() initialized = new EventEmitter<FormGroup>();\r\n @Output() activeNavChange = new EventEmitter<any>();\r\n @ViewChild('default') formDiv!: ElementRef<HTMLDivElement>;\r\n @ViewChild('root') rootDiv?: ElementRef<HTMLDivElement>;\r\n\r\n private readonly document = inject(DOCUMENT);\r\n\r\n constructor(private cdr: ChangeDetectorRef\r\n , private destroyRef: DestroyRef\r\n , private programmability: ProgrammabilityService\r\n , private formBuilder: FormBuilderService\r\n , private validationService: ValidationService\r\n , private statusService: StatusService\r\n , private eventService: EventService\r\n , private registerService: RegisterService\r\n , private languageService: LanguageService\r\n , private subscribeService: SubscribeService\r\n , private metadata: MetadataService\r\n , private formService: FormService\r\n , private dialog: DialogService\r\n , private injector: Injector\r\n , private router: Router\r\n , private route: ActivatedRoute\r\n , @Optional() private scope: ScopeService\r\n ) { }\r\n\r\n Texts = Texts;\r\n\r\n ngOnInit(): void {\r\n\r\n this.initQueryParams();\r\n\r\n this.programmability.addEvaluatorProviders(this);\r\n\r\n merge(\r\n this.programmability.evaluationDone.changes,\r\n this.validationService.validationDone.changes,\r\n this.statusService.statusDone.changes)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => {\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.clearHandlers();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n\r\n if (changes['schema']) {\r\n this.onChangeSchema();\r\n }\r\n\r\n if (changes['schema'] || (changes['value'] && !this.isEmittedValue(this.value))) {\r\n this.onChangeValue();\r\n }\r\n\r\n if (changes['schema']\r\n || changes['browserNavigation']\r\n || changes['queryParamName']) {\r\n this.listenToUrlChanges();\r\n }\r\n\r\n }\r\n\r\n get forms(): Array<any> {\r\n return this._forms;\r\n }\r\n\r\n locale(component: any, key: string): string {\r\n return localize(this.language, component, key);\r\n }\r\n\r\n canPrevious(): boolean {\r\n return this.getPrevious() != -1;\r\n }\r\n\r\n goPrevious() {\r\n if (this.canPrevious()) {\r\n this.activeNav = this.getPrevious();\r\n }\r\n }\r\n\r\n canNext(): boolean {\r\n return this.getNext() != -1\r\n || this.canRevealErrors();\r\n }\r\n\r\n goNext() {\r\n if (this.canRevealErrors()) {\r\n this.showActiveSilentErrors();\r\n }\r\n const next = this.getNext();\r\n if (next != -1) {\r\n this.activeNav = next;\r\n }\r\n }\r\n\r\n goTo(formName: string, extraParams?: Params): void {\r\n const formIndex = this.metadata.getFormIndexByName(formName);\r\n this.requestNavigation(formIndex, extraParams);\r\n }\r\n\r\n getControl(name: string): Control | null {\r\n return this.registerService.getControl(name);\r\n }\r\n\r\n getControlAs<T extends Control>(name: string, type: new (...args: any[]) => T): T | null {\r\n return this.registerService.getControlAs(name, type);\r\n }\r\n\r\n get activeNav(): number {\r\n return this._activeNav;\r\n }\r\n\r\n @Input()\r\n set activeNav(value: number) {\r\n this.requestNavigation(value);\r\n }\r\n\r\n getFormGroup(path: string | null): FormGroup {\r\n const control = path ? this.formGroup.get(path) : this.formGroup;\r\n if (!(control instanceof FormGroup)) {\r\n throw new Error('Control is not a FormGroup');\r\n }\r\n return control;\r\n }\r\n\r\n getFormStatus(form: any, index: number): FormStatus {\r\n\r\n const current = index == this.activeNav;\r\n\r\n if (this.isInactive(index)) {\r\n return \"inactive\";\r\n }\r\n else if (this.progressStatus && !current) {\r\n const errors = this.countErrors(form);\r\n return errors > 0 ? \"error\" : \"success\";\r\n }\r\n else {\r\n return \"active\";\r\n }\r\n }\r\n\r\n countErrors(form: any): number {\r\n return this.statusService.countErrors(form);\r\n }\r\n\r\n /**\r\n * Steps of the progress bar: one per enabled form, with the state of getFormStatus. The current form is the active\r\n * step; a form \"active\" without being the current one (progressStatus false) stays selectable.\r\n * The same object is returned while nothing changes (OnPush input of wm-sirio-stepper).\r\n */\r\n getProgress(): FormProgress | null {\r\n const steps: SirioStep[] = [];\r\n const formIndexes: number[] = [];\r\n let current = -1;\r\n this.forms.forEach((form, index) => {\r\n if (this.evaluateBoolean(form.disabled))\r\n return;\r\n const status = this.getFormStatus(form, index);\r\n if (index == this.activeNav)\r\n current = steps.length;\r\n formIndexes.push(index);\r\n const label = this.evaluateTemplate(this.locale(form, 'title'));\r\n steps.push(status === 'active'\r\n ? (index == this.activeNav ? { label } : { label, state: 'inactive', selectable: true })\r\n : { label, state: status });\r\n });\r\n if (!steps.length)\r\n return null;\r\n const key = JSON.stringify([steps, formIndexes, current]);\r\n if (this.progressCache?.key !== key)\r\n this.progressCache = { key, value: { steps, formIndexes, current: Math.max(current, 0) } };\r\n return this.progressCache.value;\r\n }\r\n\r\n private progressCache: { key: string, value: FormProgress } | null = null;\r\n\r\n /**\r\n * Entries of the side menu: one per enabled form (value = form index), disabled when the form is inactive, with\r\n * the number of errors as red badge. The same objects are returned while nothing changes: wm-sirio-sidenav finds\r\n * the current entry by identity.\r\n */\r\n getSidenavItems(): FormSidenav | null {\r\n const items: SirioSidenavItem[] = [];\r\n this.forms.forEach((form, index) => {\r\n if (this.evaluateBoolean(form.disabled))\r\n return;\r\n const errors = this.countErrors(form);\r\n const item: SirioSidenavItem = {\r\n label: this.evaluateTemplate(this.locale(form, 'title')),\r\n value: index,\r\n disabled: this.getFormStatus(form, index) === 'inactive',\r\n ...(errors > 0 ? { badge: errors, badgeType: 'danger', badgeLabel: this.locale(Texts, 'Errors') } : {})\r\n };\r\n items.push(item);\r\n });\r\n if (!items.length)\r\n return null;\r\n const key = JSON.stringify([items, this.activeNav]);\r\n if (this.sidenavCache?.key !== key) {\r\n const current = items.find(item => item.value == this.activeNav) ?? null;\r\n this.sidenavCache = { key, value: { items, active: current } };\r\n }\r\n return this.sidenavCache.value;\r\n }\r\n\r\n private sidenavCache: { key: string, value: FormSidenav } | null = null;\r\n\r\n activateForm(formIndex: number | undefined) {\r\n if (typeof formIndex === 'number') {\r\n this.activeNav = formIndex;\r\n }\r\n }\r\n\r\n evaluateBoolean(value: boolean | string | null): boolean | null {\r\n return this.programmability.evaluateBoolean(this.formGroup, value);\r\n }\r\n\r\n evaluateTemplate(value: string | null): string {\r\n return this.programmability.evaluateTemplate(this.formGroup, value);\r\n }\r\n\r\n openForm(template: string, options: FormDialogOptions) {\r\n const formSchema = this.metadata.getTemplateByName(template);\r\n this.openDialog(formSchema, options);\r\n }\r\n\r\n openDialog(formSchema: any, options: FormDialogOptions) {\r\n if (formSchema) {\r\n options = {\r\n ...options,\r\n injector: this.injector\r\n };\r\n this.dialog.openDialog(formSchema, options);\r\n }\r\n }\r\n\r\n isChanged(): boolean {\r\n return this.formGroup.dirty;\r\n }\r\n\r\n isValid(): boolean {\r\n return this.formGroup.valid;\r\n }\r\n\r\n getContext(): Record<string, any> {\r\n return ToBoundArrows(this, [\r\n 'canPrevious',\r\n 'goPrevious',\r\n 'canNext',\r\n 'goNext',\r\n 'goTo',\r\n 'activeNav',\r\n 'submit',\r\n 'navigate'\r\n ]);\r\n }\r\n\r\n submit(): boolean {\r\n this.showSilentErrors();\r\n this.emitValueChange(true);\r\n return this.formGroup.valid;\r\n }\r\n\r\n navigate(commands: any[], replaceUrl = false, queryParams?: Params): void {\r\n this.router.navigate(commands, {\r\n relativeTo: this.route,\r\n queryParams: queryParams,\r\n replaceUrl\r\n });\r\n }\r\n\r\n private valueChangesSubscription: Subscription | null = null;\r\n\r\n private _forms: Array<any> = [];\r\n\r\n private _activeNav: number = 0;\r\n\r\n private defaultValue: any = {};\r\n\r\n private urlSub?: Subscription;\r\n\r\n private initialQueryParams: Params = {};\r\n\r\n private currentQueryParams: Params = {};\r\n\r\n private listenToUrlChanges(): void {\r\n\r\n this.unlistenToUrlChanges();\r\n\r\n if (this.browserNavigation === 'none') return;\r\n\r\n let isFirstEmission = true;\r\n\r\n this.urlSub = this.selectUrlValue(this.browserNavigation)\r\n .pipe(\r\n distinctUntilChanged(),\r\n takeUntilDestroyed(this.destroyRef))\r\n .subscribe(value => {\r\n const isFirst = isFirstEmission;\r\n isFirstEmission = false;\r\n if (isFirst && !value) return;\r\n this.navigateFromUrl(value);\r\n });\r\n }\r\n\r\n private unlistenToUrlChanges(): void {\r\n this.urlSub?.unsubscribe();\r\n this.urlSub = undefined;\r\n }\r\n\r\n private selectUrlValue(strategy: BrowserNavigation): Observable<string | null> {\r\n const key = this.urlKey;\r\n\r\n switch (strategy) {\r\n case 'queryParam':\r\n return this.route.queryParamMap.pipe(map(params => params.get(key)));\r\n\r\n case 'fragment':\r\n default:\r\n return this.route.fragment;\r\n }\r\n }\r\n\r\n private requestNavigation(value: number, extraParams?: Params): void {\r\n if (!this.canNavigateTo(value)) return;\r\n\r\n if (this.browserNavigation !== 'none') {\r\n this.navigateToUrl(value, false, extraParams);\r\n } else {\r\n this.applyNavigation(value);\r\n }\r\n }\r\n\r\n private canNavigateTo(value: number): boolean {\r\n return value !== this._activeNav\r\n && this.canActivate(value);\r\n }\r\n\r\n private navigateToUrl(index: number, replaceUrl = false, extraParams?: Params): void {\r\n const value = this.toUrlValue(index);\r\n if (!value) return;\r\n\r\n switch (this.browserNavigation) {\r\n case 'queryParam':\r\n this.router.navigate([], {\r\n relativeTo: this.route,\r\n queryParams: this.buildQueryParams(extraParams, value),\r\n // No queryParamsHandling: the query string is rewritten from scratch,\r\n // so the previous call's extra params disappear\r\n replaceUrl,\r\n });\r\n break;\r\n\r\n case 'fragment':\r\n default:\r\n this.router.navigate([], {\r\n relativeTo: this.route,\r\n fragment: value,\r\n queryParams: this.buildQueryParams(extraParams),\r\n replaceUrl,\r\n });\r\n break;\r\n }\r\n }\r\n\r\n private navigateFromUrl(urlValue: string | null): void {\r\n const formIndex = urlValue ? this.fromUrlValue(urlValue) : 0;\r\n if (!this.canNavigateTo(formIndex)) return; // unknown, invalid or already active\r\n\r\n this.applyNavigation(formIndex);\r\n }\r\n\r\n private applyNavigation(value: number): void {\r\n this._activeNav = value;\r\n\r\n setTimeout(() => {\r\n this.autoFocus(true);\r\n this.activeNavChange.emit(this._activeNav);\r\n });\r\n\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private initQueryParams() {\r\n this.initialQueryParams = { ...this.route.snapshot.queryParams };\r\n }\r\n\r\n private buildQueryParams(extraParams?: Params, ownValue?: string): Params {\r\n const { [this.queryParamName]: _ownKey, ...preserved } = this.initialQueryParams;\r\n\r\n return {\r\n ...extraParams,\r\n ...preserved,\r\n ...(ownValue ? { [this.queryParamName]: ownValue } : {}),\r\n };\r\n }\r\n\r\n private toUrlValue(index: number): string {\r\n const formName = this.metadata.getFormNameByIndex(index);\r\n return formName?.trim()\r\n ? encodeURIComponent(formName.trim())\r\n : `${this.urlKey}${index}`;\r\n }\r\n\r\n private fromUrlValue(url: string): number {\r\n if (!url) return -1;\r\n const value = decodeURIComponent(url);\r\n const byName = this.metadata.getFormIndexByName(value);\r\n if (byName !== -1) return byName;\r\n const prefix = this.urlKey;\r\n if (!value.startsWith(prefix)) return -1;\r\n const index = Number(value.slice(prefix.length));\r\n return index;\r\n }\r\n\r\n private get urlKey(): string {\r\n return this.queryParamName?.trim() || 'v';\r\n }\r\n\r\n private get language(): string {\r\n return this.languageService.getLanguage();\r\n }\r\n\r\n private onChangeSchema() {\r\n if (!this.schema) return;\r\n\r\n if (!this.formGroup) {\r\n this.formGroup = new FormGroup({});\r\n }\r\n\r\n this.clearControls();\r\n\r\n this.clearHandlers();\r\n\r\n const schema = this.schema;\r\n\r\n const allForms = groupByRow(schema.forms ?? []);\r\n\r\n this.metadata.setSchema(schema);\r\n\r\n this.metadata.setForms(allForms);\r\n\r\n this._forms = allForms.filter(item => item.isTemplate !== true);\r\n\r\n this.formBuilder.buildForm(this.formGroup, this.forms, this.groupMode);\r\n\r\n this.defaultValue = this.formGroup.value;\r\n\r\n if (this.initialized)\r\n this.initialized.emit(this.formGroup);\r\n\r\n this.registerHandlers();\r\n\r\n this.assignActivaNav();\r\n }\r\n\r\n private onChangeValue() {\r\n if (!this.schema) return;\r\n this.patchingValue(() => {\r\n const emitEvent = true;\r\n this.formGroup.reset(this.defaultValue, { emitEvent });\r\n this.clearFormArrays(this.formGroup, emitEvent);\r\n this.formService.patch(this.formGroup, this.value, {\r\n emitEvent,\r\n strict: this.strict\r\n });\r\n });\r\n this.assignActivaNav();\r\n }\r\n\r\n private patchingValue(fn: () => void): void {\r\n try {\r\n this.validationService.suppress = true;\r\n this.eventService.suppress = true;\r\n this.suspendValueChanges = true;\r\n this.subscribeService.dispatchMode = \"sync\";\r\n fn();\r\n }\r\n finally {\r\n this.subscribeService.dispatchMode = \"async\";\r\n this.validationService.suppress = false;\r\n this.eventService.suppress = false;\r\n this.formService.updateAllValueAndValidity(this.formGroup, true);\r\n this.suspendValueChanges = false;\r\n this.emitValueChange(false);\r\n }\r\n }\r\n\r\n private assignActivaNav() {\r\n if (!this.isFormActivable(this._activeNav)) {\r\n this.activeNav = this.getNextFrom(-1);\r\n }\r\n else {\r\n setTimeout(() => this.autoFocus());\r\n }\r\n }\r\n\r\n private suspendValueChanges: boolean = false;\r\n\r\n private registerHandlers(): void {\r\n this.valueChangesSubscription = this.formGroup.valueChanges.subscribe((value) => {\r\n if (this.suspendValueChanges)\r\n return;\r\n this.emitValueChange(false);\r\n });\r\n };\r\n\r\n private clearHandlers(): void {\r\n if (this.valueChangesSubscription) {\r\n this.valueChangesSubscription.unsubscribe();\r\n }\r\n }\r\n\r\n private emittedValues = new WeakMap<object, true>();\r\n\r\n private isEmittedValue(value: any): boolean {\r\n if (typeof value === 'object' && value !== null && this.emittedValues.has(value)) {\r\n this.emittedValues.delete(value);\r\n return true;\r\n }\r\n else {\r\n return false;\r\n }\r\n }\r\n\r\n private emitValueChange(submit: boolean): void {\r\n if (!this.shouldEmit(submit)) return;\r\n const newValue = this.formGroup.value;\r\n this.emittedValues.set(newValue, true);\r\n setTimeout(() => this.valueChange.emit(newValue));\r\n }\r\n\r\n private shouldEmit(submit: boolean): boolean {\r\n switch (this.updateMode) {\r\n case 'submit': return submit;\r\n case 'changes': return !submit;\r\n default: return true;\r\n }\r\n }\r\n\r\n readonly refreshed = new Subject<void>();\r\n\r\n refresh() {\r\n try {\r\n this.suspendValueChanges = true;\r\n this.formService.patch(this.formGroup, this.value, {\r\n strict: this.strict\r\n });\r\n this.refreshed.next();\r\n this.cdr.markForCheck();\r\n } finally {\r\n this.suspendValueChanges = false;\r\n }\r\n }\r\n\r\n private getNext(): number {\r\n return this.getNextFrom(this.activeNav);\r\n }\r\n\r\n private getNextFrom(from: number): number {\r\n let index = from + 1;\r\n const max = this.getMaxNav();\r\n\r\n while (index < max) {\r\n if (this.isFormActivable(index)) {\r\n return index;\r\n }\r\n index++;\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n private getPrevious(): number {\r\n return this.getPreviousFrom(this.activeNav);\r\n }\r\n\r\n private getPreviousFrom(from: number): number {\r\n let index = from - 1;\r\n\r\n while (index >= 0) {\r\n if (this.isFormActivable(index)) {\r\n return index;\r\n }\r\n index--;\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n private getMaxNav(): number {\r\n return this.forms.length ?? 0;\r\n };\r\n\r\n private isFormActivable(index: number): boolean {\r\n return index >= 0\r\n && index < this.getMaxNav()\r\n && !this.isDisabled(index)\r\n && !this.isInactive(index);\r\n }\r\n\r\n private isDisabled(index: number): boolean {\r\n var form = this.getFormByIndex(index);\r\n\r\n if (!form)\r\n return false;\r\n\r\n return this.evaluateBoolean(form.disabled) ?? false;\r\n }\r\n\r\n private isInactive(index: number): boolean {\r\n var form = this.getFormByIndex(index);\r\n\r\n if (!form)\r\n return false;\r\n\r\n if (this.evaluateBoolean(form.inactive) ?? false)\r\n return true;\r\n\r\n if (this.preventNavigationOnErrors && this.hasPreviousErrors(index))\r\n return true;\r\n\r\n return false;\r\n }\r\n\r\n private canActivate(value: number): boolean {\r\n return value >= 0\r\n && value < this.getMaxNav()\r\n && !this.isDisabled(value)\r\n && !this.isInactive(value);\r\n }\r\n\r\n private hasPreviousErrors(index: number): boolean {\r\n for (let i = index - 1; i >= 0; i--) {\r\n const previousForm = this.getFormByIndex(i);\r\n\r\n if (previousForm && this.statusService.countErrors(previousForm, true) > 0) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private clearControls(): void {\r\n Object.keys(this.formGroup.controls).forEach(key => {\r\n this.formGroup.removeControl(key);\r\n });\r\n }\r\n\r\n private clearFormArrays(control: AbstractControl, emitEvent: boolean): void {\r\n if (control instanceof FormArray && control.controls.length > 0) {\r\n control.clear({ emitEvent });\r\n control.markAsPristine();\r\n control.markAsUntouched();\r\n } else if (control instanceof FormGroup) {\r\n Object.values(control.controls).forEach(childControl => {\r\n this.clearFormArrays(childControl, emitEvent);\r\n });\r\n }\r\n }\r\n\r\n private getCurrentForm(): any | null {\r\n return this.getFormByIndex(this.activeNav);\r\n }\r\n\r\n private disableAutoFocus(): boolean {\r\n const form = this.getCurrentForm();\r\n return (form?.disableAutoFocus === true);\r\n }\r\n\r\n /**\r\n * Focuses the first field of the active form, once it is rendered. With `scroll` (form change) the view first scrolls\r\n * as set by `scrollOnNavigate`; the focus then does not scroll again (a first field lower in the form would hide its\r\n * start).\r\n */\r\n private autoFocus(scroll = false): void {\r\n setTimeout(() => {\r\n const preventScroll = scroll && this.scrollToActiveForm();\r\n if (this.disableAutoFocus())\r\n return;\r\n const formElement = this.formDiv?.nativeElement;\r\n if (formElement && !hasFieldFocus(formElement))\r\n setFocus(formElement, preventScroll);\r\n });\r\n }\r\n\r\n /** Scrolls as set by `scrollOnNavigate`; false when no scroll is configured. */\r\n private scrollToActiveForm(): boolean {\r\n switch (this.scrollOnNavigate) {\r\n case 'content':\r\n scrollToStart(this.formDiv?.nativeElement);\r\n return true;\r\n case 'form':\r\n scrollToStart(this.rootDiv?.nativeElement);\r\n return true;\r\n case 'page':\r\n scrollPageToTop(this.document);\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n private canRevealErrors(): boolean {\r\n return this.hasActiveSilentErrors()\r\n && this.hasPotentialNextForm();\r\n }\r\n\r\n private hasPotentialNextForm(): boolean {\r\n let index = this.activeNav + 1;\r\n const max = this.getMaxNav();\r\n\r\n while (index < max) {\r\n if (!this.isDisabled(index)) {\r\n return true;\r\n }\r\n index++;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n hasSilentErrors(): boolean {\r\n return this.validationService.hasSilentErrors(this.getSilentScope(\"all\"));\r\n }\r\n\r\n showSilentErrors(): void {\r\n this.validationService.revealSilentErrors(this.getSilentScope(\"all\"));\r\n }\r\n\r\n private hasActiveSilentErrors(): boolean {\r\n return this.validationService.hasSilentErrors(this.getSilentScope(\"active\"));\r\n }\r\n\r\n private showActiveSilentErrors(): void {\r\n this.validationService.revealSilentErrors(this.getSilentScope(\"active\"));\r\n }\r\n\r\n private getSilentScope(scope: 'all' | 'active'): Iterable<AbstractControl> {\r\n if (!this.validationService.allowSilentError())\r\n return [];\r\n return scope === 'active'\r\n ? this.getActiveControls()\r\n : this.getAllControls();\r\n }\r\n\r\n private getAllControls(): Iterable<AbstractControl> {\r\n return this.formService.enumerateControls(this.formGroup);\r\n }\r\n\r\n private *getActiveControls(): Generator<AbstractControl> {\r\n const key = this.getCurrentForm();\r\n if (key == null) return;\r\n yield* this.statusService.enumerateControls(key);\r\n }\r\n\r\n private getFormByIndex(index: number): any | null {\r\n if (!Number.isInteger(index)\r\n || index < 0\r\n || index >= (this.forms?.length ?? 0)) return null;\r\n return this.forms[index] ?? null;\r\n }\r\n}\r\n\r\n/** State of a form in the progress bar and in the side navigation. */\r\ntype FormStatus = 'inactive' | 'active' | 'success' | 'error';\r\n\r\n/** Steps of the progress bar and the form of each step. */\r\ninterface FormProgress {\r\n steps: SirioStep[];\r\n formIndexes: number[];\r\n current: number;\r\n}\r\n\r\n/** Entries of the side menu and the current one. */\r\ninterface FormSidenav {\r\n items: SirioSidenavItem[];\r\n active: SirioSidenavItem | null;\r\n}\r\n","@if (schema) {\r\n <div #root [formGroup]=\"formGroup\" class=\"ngs df-scroll-anchor\" [css]=\"schema.styles\">\r\n <div class=\"row\">\r\n <!-- #region progress -->\r\n @if (showProgress) {\r\n <!-- @wemake4u/form-controls: one step per enabled form; the forms with a state can be selected. -->\r\n @if (getProgress(); as progress) {\r\n <wm-sirio-stepper navigable\r\n [steps]=\"progress.steps\"\r\n [current]=\"progress.current\"\r\n (stepSelected)=\"activateForm(progress.formIndexes[$event])\" />\r\n }\r\n }\r\n <!-- #endregion -->\r\n @if (showNav) {\r\n <div [ngClass]=\"navSize === 'small' ? 'col-md-2' : 'col-md-4'\">\r\n <!-- #region sidenav -->\r\n <!-- @wemake4u/form-controls: from 992px a column of the page, below a full screen dialog opened by the kit button. -->\r\n @if (getSidenavItems(); as nav) {\r\n <wm-sirio-sidenav [items]=\"nav.items\"\r\n [active]=\"nav.active\"\r\n (itemClick)=\"activateForm($any($event.item.value))\"\r\n [openLabel]=\"locale(Texts, 'OpenMenu')\"\r\n [closeLabel]=\"locale(Texts, 'CloseMenu')\" />\r\n }\r\n <!-- #endregion -->\r\n </div>\r\n <div class=\"col-md-1\">\r\n <div class=\"separator-horizontal\"></div>\r\n </div>\r\n }\r\n <div class=\"content-element-form\" [ngClass]=\"showNav ? (navSize === 'small' ? 'col-md-13' : 'col-md-11') : 'col-md-16'\">\r\n @for (form of forms; track form; let sectionIndex = $index) {\r\n @if (activeNav == sectionIndex && !evaluateBoolean(form.disabled)) {\r\n <div #default\r\n class=\"df-scroll-anchor\"\r\n [register]=\"form\"\r\n [componentRef]=\"default\">\r\n @if (showFormTitle && form.title) {\r\n <h1 class=\"h3 form-title\">{{ evaluateTemplate(locale(form, 'title')) }}</h1>\r\n }\r\n <app-dynamic-fields [form]=\"this\"\r\n [formGroup]=\"getFormGroup(form.path)\"\r\n [readOnly]=\"readOnly || evaluateBoolean(form.readonly)\"\r\n [rows]=\"form.rows\"\r\n [identity]=\"form.id\"\r\n [disableAutoFocus]=\"form.disableAutoFocus\"\r\n [alignment]=\"form.verticalAlignment\"></app-dynamic-fields>\r\n </div>\r\n }\r\n }\r\n @if (showNavButton && (canNext() || canPrevious())) {\r\n <div class=\"row section-navs\">\r\n <div class=\"col-8 col-md-8\">\r\n @if (canNext()) {\r\n <button type=\"button\" wmSirioButton=\"ghost\" icon=\"fa-chevron-right\" (click)=\"goNext()\" class=\"nextSection\">{{ locale(Texts, 'NextSection') }}</button>\r\n }\r\n </div>\r\n <div class=\"col-8 col-md-8\">\r\n @if (canPrevious()) {\r\n <button type=\"button\" wmSirioButton=\"ghost\" icon=\"fa-chevron-left\" iconPosition=\"start\" (click)=\"goPrevious()\" class=\"prevSection\">{{ locale(Texts, 'PreviousSection') }}</button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n","export function syncronize(target: any, source: any): any {\r\n // If source is a primitive or null/undefined → replace directly\r\n if (source === null || source === undefined || typeof source !== \"object\") {\r\n return source;\r\n }\r\n\r\n // If target is null/undefined or a primitive → create a new container (array/object)\r\n if (target === null || target === undefined || typeof target !== \"object\") {\r\n target = Array.isArray(source) ? [] : {};\r\n }\r\n\r\n // Handle arrays\r\n if (Array.isArray(source)) {\r\n if (!Array.isArray(target)) {\r\n target = [];\r\n }\r\n\r\n target.length = source.length;\r\n\r\n for (let i = 0; i < source.length; i++) {\r\n target[i] = syncronize(target[i], source[i]);\r\n }\r\n\r\n return target;\r\n }\r\n\r\n // Handle objects\r\n\r\n // Remove missing keys\r\n for (const key of Object.keys(target)) {\r\n if (!(key in source)) {\r\n delete target[key];\r\n }\r\n }\r\n\r\n // Add or update keys\r\n for (const [key, value] of Object.entries(source)) {\r\n target[key] = syncronize(target[key], value);\r\n }\r\n\r\n return target;\r\n}\r\n","export interface RefContext {\r\n parent: any;\r\n key: string | number | null;\r\n root: any;\r\n}\r\n\r\nexport type RefResolver = (\r\n ref: string,\r\n ctx: RefContext\r\n) => any;\r\n\r\nexport type AsyncRefResolver = (\r\n ref: string,\r\n ctx: RefContext\r\n) => Promise<any>;\r\n\r\nexport interface ResolveRefsOptions {\r\n mergeRef?: boolean;\r\n}\r\n\r\nexport function resolveRefs<T>(\r\n input: T,\r\n resolver: RefResolver,\r\n options: ResolveRefsOptions = {}\r\n): T {\r\n\r\n const { mergeRef = false } = options;\r\n\r\n function visit(\r\n node: any,\r\n parent: any,\r\n key: any,\r\n root: any\r\n ): any {\r\n\r\n // Array\r\n if (Array.isArray(node)) {\r\n return node.map((v, i) => visit(v, node, i, root));\r\n }\r\n\r\n // Object\r\n if (node && typeof node === 'object') {\r\n\r\n if (\r\n Object.prototype.hasOwnProperty.call(node, '$ref') &&\r\n typeof node.$ref === 'string'\r\n ) {\r\n\r\n const resolved = resolver(node.$ref, { parent, key, root });\r\n\r\n if (mergeRef) {\r\n const { $ref, ...overrides } = node;\r\n return {\r\n ...resolved,\r\n ...overrides\r\n };\r\n }\r\n\r\n return resolved;\r\n }\r\n\r\n const result: any = {};\r\n for (const k of Object.keys(node)) {\r\n result[k] = visit(node[k], node, k, root);\r\n }\r\n return result;\r\n }\r\n\r\n return node;\r\n }\r\n\r\n return visit(input, null, null, input);\r\n}\r\n\r\n\r\nexport async function resolveRefsAsync<T>(\r\n input: T,\r\n resolver: AsyncRefResolver,\r\n options: ResolveRefsOptions = {}\r\n): Promise<T> {\r\n\r\n const { mergeRef = false } = options;\r\n\r\n async function visit(\r\n node: any,\r\n parent: any,\r\n key: any,\r\n root: any\r\n ): Promise<any> {\r\n\r\n // Array\r\n if (Array.isArray(node)) {\r\n const result = [];\r\n for (let i = 0; i < node.length; i++) {\r\n result[i] = await visit(node[i], node, i, root);\r\n }\r\n return result;\r\n }\r\n\r\n // Object\r\n if (node && typeof node === 'object') {\r\n\r\n if (\r\n Object.prototype.hasOwnProperty.call(node, '$ref') &&\r\n typeof node.$ref === 'string'\r\n ) {\r\n\r\n const resolved = await resolver(node.$ref, { parent, key, root });\r\n\r\n if (mergeRef) {\r\n const { $ref, ...overrides } = node;\r\n return {\r\n ...resolved,\r\n ...overrides\r\n };\r\n }\r\n\r\n return resolved;\r\n }\r\n\r\n const result: any = {};\r\n for (const k of Object.keys(node)) {\r\n result[k] = await visit(node[k], node, k, root);\r\n }\r\n return result;\r\n }\r\n\r\n return node;\r\n }\r\n\r\n return visit(input, null, null, input);\r\n}\r\n\r\n\r\n","export function deepEqual(a: any, b: any\r\n , options?: { handleCircular?: boolean }\r\n , visited?: WeakMap<any, any>): boolean\r\n{\r\n // Lazy init\r\n if (options?.handleCircular && !visited) {\r\n visited = new WeakMap();\r\n }\r\n\r\n // Same reference or same primitive value\r\n if (a === b) return true;\r\n\r\n // Handle null / undefined\r\n if (a == null || b == null) return a === b;\r\n\r\n // Different types\r\n if (typeof a !== typeof b) return false;\r\n\r\n // Non-object values (number, string, boolean, symbol)\r\n if (typeof a !== 'object') return Object.is(a, b);\r\n\r\n // Circular reference handling\r\n if (visited) {\r\n if (visited.get(a) === b) return true;\r\n visited.set(a, b);\r\n }\r\n\r\n // Different constructors → different types\r\n if (a.constructor !== b.constructor) return false;\r\n\r\n // Array comparison (order matters)\r\n if (Array.isArray(a)) {\r\n if (a.length !== b.length) return false;\r\n\r\n for (let i = 0; i < a.length; i++) {\r\n if (!deepEqual(a[i], b[i], options, visited)) return false;\r\n }\r\n return true;\r\n }\r\n\r\n // Date comparison\r\n if (a instanceof Date) {\r\n return a.getTime() === b.getTime();\r\n }\r\n\r\n // Object comparison (property order does NOT matter)\r\n const keys = Object.keys(a);\r\n if (keys.length !== Object.keys(b).length) return false;\r\n\r\n for (let i = 0; i < keys.length; i++) {\r\n const key = keys[i];\r\n if (b[key] === undefined && !(key in b)) return false;\r\n if (!deepEqual(a[key], b[key], options, visited)) return false;\r\n }\r\n\r\n return true;\r\n}\r\n","import { Router } from '@angular/router';\r\n\r\nexport function navigateTo(router: Router, uri: string): void {\r\n if (!router || uri == null) return\r\n\r\n var routeData = parseRoute(uri);\r\n\r\n router.navigate([routeData.route], {\r\n queryParams: routeData.queryParams\r\n });\r\n}\r\n\r\nexport function parseRoute(uri: string): { route: string; queryParams: Record<string, string> } {\r\n\r\n const url = new URL(uri, 'http://dummy');\r\n\r\n const params: Record<string, string> = {};\r\n\r\n url.searchParams.forEach((value, key) => {\r\n params[key] = value;\r\n });\r\n\r\n return {\r\n route: url.pathname.replace(/^\\/+/, ''),\r\n queryParams: params\r\n };\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { IGetRowsParams } from 'ag-grid-community';\r\nimport { IRowsSource } from './interfaces';\r\n\r\nexport class ODataSource implements IRowsSource {\r\n constructor(private url: string\r\n , private http: HttpClient) {\r\n }\r\n\r\n getRows(params: IGetRowsParams) {\r\n const queryString = this.getQueryString(params);\r\n\r\n let queryUrl = `${this.url}${queryString}`\r\n\r\n this.http.get<any>(queryUrl, { observe: 'response' }).subscribe({\r\n next: response => {\r\n const data = response.body ?? [];\r\n const count = response.headers.get('X-Total-Count');\r\n params.successCallback(data, this.toNumber(count));\r\n },\r\n error: error => {\r\n console.log(error);\r\n params.failCallback();\r\n }\r\n });\r\n }\r\n\r\n private getQueryString(params: IGetRowsParams): string {\r\n let queryParams = new HttpParams();\r\n queryParams = this.addCount(queryParams);\r\n queryParams = this.addSkipAndTake(params, queryParams);\r\n queryParams = this.addOrderBy(params, queryParams);\r\n queryParams = this.addFilterBy(params, queryParams);\r\n\r\n const queryString = queryParams.toString();\r\n return queryString ? \"?\" + queryString : queryString;\r\n }\r\n\r\n private addCount(queryParams: HttpParams): HttpParams {\r\n return queryParams.set(\"$count\", \"true\");\r\n }\r\n\r\n private addSkipAndTake(params: IGetRowsParams, queryParams: HttpParams): HttpParams {\r\n return queryParams\r\n .set(\"$top\", `${params.endRow - params.startRow}`)\r\n .set(\"$skip\", `${params.startRow}`);\r\n }\r\n\r\n private addOrderBy(params: IGetRowsParams, queryParams: HttpParams): HttpParams {\r\n if (!params.sortModel || params.sortModel.length === 0) {\r\n return queryParams;\r\n }\r\n\r\n const orderByParams = params.sortModel\r\n .map(sort => `${sort.colId} ${sort.sort}`)\r\n .join(\",\");\r\n\r\n return queryParams.set(\"$orderby\", orderByParams);\r\n }\r\n\r\n private addFilterBy(params: IGetRowsParams, queryParams: HttpParams): HttpParams {\r\n\r\n const filterModel = params.filterModel;\r\n\r\n if (!filterModel || Object.keys(filterModel).length === 0) {\r\n return queryParams;\r\n }\r\n\r\n const filters: string[] = [];\r\n\r\n for (const column in filterModel) {\r\n const filter = filterModel[column];\r\n\r\n const condition = this.getCondition(column, filter);\r\n\r\n if (condition) {\r\n filters.push(condition);\r\n }\r\n }\r\n\r\n return queryParams.set(\"$filter\", filters.join(\" and \"));\r\n }\r\n\r\n private getCondition(column: string, filter: any): string | null {\r\n\r\n if (filter.operator === \"AND\" || filter.operator === \"OR\") {\r\n if (Array.isArray(filter.conditions)) {\r\n return \"(\" + filter.conditions.map((subfilter: any) => this.getCondition(column, subfilter))\r\n .join(` ${filter.operator.toLowerCase()} `) + \")\";\r\n }\r\n return null;\r\n }\r\n\r\n const value = filter.filter;\r\n\r\n switch (filter.filterType) {\r\n case \"text\":\r\n const text = (value ?? \"\").replace(/'/g, \"''\");\r\n if (filter.type === \"contains\") {\r\n return `contains(${column}, '${text}')`;\r\n } else if (filter.type === \"notContains\") {\r\n return `not contains(${column}, '${text}')`;\r\n } else if (filter.type === \"equals\") {\r\n return `${column} eq '${text}'`;\r\n } else if (filter.type === \"notEqual\") {\r\n return `${column} ne '${text}'`;\r\n } else if (filter.type === \"startsWith\") {\r\n return `startswith(${column}, '${text}')`;\r\n } else if (filter.type === \"endsWith\") {\r\n return `endswith(${column}, '${text}')`;\r\n } else if (filter.type === \"blank\") {\r\n return `${column} eq null`;\r\n } else if (filter.type === \"notBlank\") {\r\n return `${column} ne null`;\r\n } else if (filter.type === \"true\") {\r\n return `${column} eq true`;\r\n } else if (filter.type === \"false\") {\r\n return `${column} eq false`;\r\n }\r\n break;\r\n\r\n case \"number\":\r\n if (filter.type === \"equals\") {\r\n return `${column} eq ${value}`;\r\n } else if (filter.type === \"greaterThan\") {\r\n return `${column} gt ${value}`;\r\n } else if (filter.type === \"lessThan\") {\r\n return `${column} lt ${value}`;\r\n } else if (filter.type === \"greaterThanOrEqual\") {\r\n return `${column} ge ${value}`;\r\n } else if (filter.type === \"lessThanOrEqual\") {\r\n return `${column} le ${value}`;\r\n }\r\n break;\r\n\r\n case \"date\":\r\n return `${column} eq ${value}`; // Modifica se OData usa formati ISO\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private toNumber(value: string | null): number | undefined {\r\n if (!value)\r\n return undefined;\r\n const num = parseFloat(value);\r\n return isNaN(num) ? undefined : num;\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\nexport class RestDataSource<T, T2 = T> {\r\n private params: Record<string, any> = {};\r\n private mapFn?: (data: T) => T2;\r\n\r\n constructor(private http: HttpClient\r\n , private baseUrl: string) { }\r\n\r\n setParam(key: string, value: any): RestDataSource<T, T2> {\r\n if (value !== undefined && value !== null) {\r\n this.params[key] = value;\r\n } else {\r\n delete this.params[key];\r\n }\r\n return this;\r\n }\r\n\r\n setParams(params: Record<string, any>): RestDataSource<T, T2> {\r\n this.params = { ...params };\r\n return this;\r\n }\r\n\r\n setMapFunction(mapFn: (data: T) => T2): RestDataSource<T, T2> {\r\n this.mapFn = mapFn;\r\n return this;\r\n }\r\n\r\n getMapFunction(): ((data: T) => T2) | undefined {\r\n return this.mapFn;\r\n }\r\n\r\n getParam(key: string): any {\r\n return this.params[key];\r\n }\r\n\r\n getParams(): Record<string, any> {\r\n return this.params;\r\n }\r\n\r\n getData(): Observable<T2[]> {\r\n let httpParams = new HttpParams();\r\n\r\n Object.keys(this.params).forEach(key => {\r\n if (this.params[key] !== undefined && this.params[key] !== null) {\r\n httpParams = httpParams.set(key, this.params[key].toString());\r\n }\r\n });\r\n\r\n return this.http.get<T[]>(this.baseUrl, { params: httpParams }).pipe(\r\n map(responseArray =>\r\n this.mapFn ? responseArray.map(item => this.mapFn!(item)) : responseArray as unknown as T2[]\r\n )\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { ODataSource } from '../dataSources/odata';\r\nimport { RestDataSource } from '../dataSources/rest';\r\nimport { IRowsSource } from '../dataSources/interfaces';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DataService {\r\n\r\n constructor(\r\n private http: HttpClient)\r\n { }\r\n\r\n queryOData(url: string): IRowsSource {\r\n return this.createOData(url);\r\n }\r\n\r\n createRest(url: string): RestDataSource<any, any>;\r\n createRest<T>(url: string): RestDataSource<T, T>;\r\n createRest<T, T2>(url: string): RestDataSource<T, T2>;\r\n createRest<T = any, T2 = T>(url: string): RestDataSource<T, T2> {\r\n return new RestDataSource<T, T2>(this.http, url);\r\n }\r\n\r\n private createOData(url: string): IRowsSource {\r\n return new ODataSource(url, this.http);\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ConfirmationController } from '@wemake4u/interact';\r\nimport { DialogOptions, DialogService } from '../services/dialog.service';\r\nimport { Observable } from 'rxjs';\r\n \r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DefaultConfirmationController implements ConfirmationController {\r\n\r\n constructor(private dialogService: DialogService) {\r\n }\r\n\r\n confirm(message?: string, title?: string): Observable<boolean> {\r\n\r\n return new Observable<boolean>(observer => {\r\n const options: DialogOptions = {\r\n title: title,\r\n type: 'info',\r\n onResult: result => {\r\n if (result.action === 'Yes') {\r\n observer.next(true);\r\n } else {\r\n observer.next(false);\r\n }\r\n observer.complete();\r\n }\r\n };\r\n\r\n this.dialogService.confirm(message ?? \"\", options); \r\n });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { NotificationController, NotifyTypes } from '@wemake4u/interact';\r\nimport { ToastService } from '../services/toast.service';\r\nimport { GlobalService } from '../services/global.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DefaultNotificationController implements NotificationController {\r\n\r\n constructor(\r\n private toast: ToastService,\r\n private global : GlobalService\r\n ) {\r\n this.delayTime =\r\n this.global.getProperty(\"notificationDelay\", 5000);\r\n }\r\n\r\n private delayTime: number;\r\n\r\n notify(type: NotifyTypes, message: string, title?: string): void {\r\n\r\n const delay = this.delayTime;\r\n\r\n switch (type) {\r\n case 'info': this.toast.notifyInfo(message, title, delay); break;\r\n case 'warning': this.toast.notifyWarning(message, title, delay); break;\r\n case 'error': this.toast.notifyError(message, title, delay); break;\r\n case 'success': this.toast.notifySuccess(message, title, delay); break;\r\n default: break;\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { PromptController } from '@wemake4u/interact';\r\nimport { DialogOptions, DialogService } from '../services/dialog.service';\r\nimport { Observable } from 'rxjs';\r\n \r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DefaultPromptController implements PromptController {\r\n\r\n constructor(private dialogService: DialogService) {\r\n }\r\n\r\n prompt(message?: string, defaultValue?: string, title?: string): Observable<string | null> {\r\n return new Observable<string | null>(observer => {\r\n const options: DialogOptions = {\r\n title: title,\r\n type: 'info',\r\n onResult: result => {\r\n if (result.action === 'OK') {\r\n observer.next(result.value.input);\r\n }\r\n observer.complete();\r\n }\r\n };\r\n\r\n this.dialogService.prompt(message ?? \"Prompt\", defaultValue, options);\r\n });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Message, MessageFactory } from '@wemake4u/interact';\r\nimport { TimeoutError } from 'rxjs';\r\nimport { LanguageService } from '@wemake4u/interact';\r\nimport { Texts } from '../locale/locale';\r\nimport { localize } from '../locale/localize';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DefaultMessageFactory implements MessageFactory {\r\n\r\n constructor(public languageService: LanguageService) {\r\n }\r\n\r\n createError(err: any): Message {\r\n\r\n if (typeof err.error === 'object' && err.error?.title) {\r\n err = err.error;\r\n }\r\n\r\n const title = err?.title ?? this.getTitleText();\r\n\r\n if (err instanceof TimeoutError) {\r\n return {\r\n title: title,\r\n detail: this.getTimeoutText(),\r\n severity: 'error'\r\n };\r\n }\r\n\r\n const detail = err?.detail\r\n ?? err?.message\r\n ?? this.getDetailText();\r\n\r\n return {\r\n title: title,\r\n detail: detail,\r\n severity: err?.severity === \"warning\" || err?.severity === \"error\"\r\n ? err.severity\r\n : \"error\"\r\n };\r\n }\r\n\r\n private get language(): string {\r\n return this.languageService.getLanguage();\r\n }\r\n\r\n private locale(component: any, key: string): string {\r\n return localize(this.language, component, key);\r\n }\r\n\r\n private getTitleText() {\r\n return this.locale(Texts, \"SomethingWentWrong\");\r\n }\r\n\r\n private getTimeoutText() {\r\n return this.locale(Texts, \"TimeoutOccurred\");\r\n }\r\n\r\n private getDetailText() {\r\n return this.locale(Texts, \"GenericError\");\r\n }\r\n}\r\n","","","","","","","","","","","","import consoleFn from './console.json';\r\nimport formGroupFn from './formGroup.json';\r\nimport dialogFn from './dialog.json';\r\nimport functionFn from './function.json';\r\nimport formatterFn from './formatter.json';\r\nimport registerFn from './register.json';\r\nimport formFn from './form.json';\r\nimport feelFn from './feel.json';\r\nimport jsonFn from './json.json';\r\nimport cacheFn from './cache.json';\r\nimport navFn from './nav.json';\r\n\r\nexport const builtIn = [\r\n consoleFn,\r\n formGroupFn,\r\n {\r\n \"name\": \"fn\",\r\n \"entries\": [\r\n ...dialogFn,\r\n ...functionFn,\r\n ...formatterFn,\r\n ...registerFn,\r\n ...formFn,\r\n ...feelFn,\r\n ...jsonFn,\r\n ...cacheFn,\r\n ...navFn\r\n ]\r\n }\r\n];\r\n"],"mappings":"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"}