ngx-t-forms 2.0.29 → 2.0.30

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.
Files changed (62) hide show
  1. package/fesm2022/{ngx-t-forms-calculated-field-rules.component-D-SBMdYg.mjs → ngx-t-forms-calculated-field-rules.component-Ct6_c_Lj.mjs} +3 -3
  2. package/fesm2022/{ngx-t-forms-calculated-field-rules.component-D-SBMdYg.mjs.map → ngx-t-forms-calculated-field-rules.component-Ct6_c_Lj.mjs.map} +1 -1
  3. package/fesm2022/{ngx-t-forms-chip-options-creator-editor.component-1cpszpPN.mjs → ngx-t-forms-chip-options-creator-editor.component-yuM1KHho.mjs} +2 -2
  4. package/fesm2022/{ngx-t-forms-chip-options-creator-editor.component-1cpszpPN.mjs.map → ngx-t-forms-chip-options-creator-editor.component-yuM1KHho.mjs.map} +1 -1
  5. package/fesm2022/{ngx-t-forms-config-mscoa-additional-inputs.component-DFdAVWTg.mjs → ngx-t-forms-config-mscoa-additional-inputs.component-BptpYSe-.mjs} +2 -2
  6. package/fesm2022/{ngx-t-forms-config-mscoa-additional-inputs.component-DFdAVWTg.mjs.map → ngx-t-forms-config-mscoa-additional-inputs.component-BptpYSe-.mjs.map} +1 -1
  7. package/fesm2022/{ngx-t-forms-data-source-picker.component-DxORinAD.mjs → ngx-t-forms-data-source-picker.component-Badna1Rl.mjs} +5 -5
  8. package/fesm2022/{ngx-t-forms-data-source-picker.component-DxORinAD.mjs.map → ngx-t-forms-data-source-picker.component-Badna1Rl.mjs.map} +1 -1
  9. package/fesm2022/{ngx-t-forms-document-list-label-config-editor.component-DcWS1txl.mjs → ngx-t-forms-document-list-label-config-editor.component-2_8XzUgD.mjs} +3 -3
  10. package/fesm2022/{ngx-t-forms-document-list-label-config-editor.component-DcWS1txl.mjs.map → ngx-t-forms-document-list-label-config-editor.component-2_8XzUgD.mjs.map} +1 -1
  11. package/fesm2022/{ngx-t-forms-form-input-selector.component-B2QEnvkq.mjs → ngx-t-forms-form-input-selector.component-DV4Sts9F.mjs} +2 -2
  12. package/fesm2022/{ngx-t-forms-form-input-selector.component-B2QEnvkq.mjs.map → ngx-t-forms-form-input-selector.component-DV4Sts9F.mjs.map} +1 -1
  13. package/fesm2022/{ngx-t-forms-form-json-view.component-DePf44w6.mjs → ngx-t-forms-form-json-view.component-B8seYzMQ.mjs} +2 -2
  14. package/fesm2022/{ngx-t-forms-form-json-view.component-DePf44w6.mjs.map → ngx-t-forms-form-json-view.component-B8seYzMQ.mjs.map} +1 -1
  15. package/fesm2022/ngx-t-forms-form-section-stepper.component-x_83iAWA.mjs +281 -0
  16. package/fesm2022/ngx-t-forms-form-section-stepper.component-x_83iAWA.mjs.map +1 -0
  17. package/fesm2022/{ngx-t-forms-forms-builder-menu.component-Wamzf_sq.mjs → ngx-t-forms-forms-builder-menu.component-UWo_dyVt.mjs} +4 -4
  18. package/fesm2022/{ngx-t-forms-forms-builder-menu.component-Wamzf_sq.mjs.map → ngx-t-forms-forms-builder-menu.component-UWo_dyVt.mjs.map} +1 -1
  19. package/fesm2022/{ngx-t-forms-input-editor.component-D4xHO76K.mjs → ngx-t-forms-input-editor.component-B_kkOoEO.mjs} +2 -2
  20. package/fesm2022/{ngx-t-forms-input-editor.component-D4xHO76K.mjs.map → ngx-t-forms-input-editor.component-B_kkOoEO.mjs.map} +1 -1
  21. package/fesm2022/{ngx-t-forms-map-mat-options-keys-CbdW82su.mjs → ngx-t-forms-map-mat-options-keys-SM5XM9uy.mjs} +2 -2
  22. package/fesm2022/{ngx-t-forms-map-mat-options-keys-CbdW82su.mjs.map → ngx-t-forms-map-mat-options-keys-SM5XM9uy.mjs.map} +1 -1
  23. package/fesm2022/{ngx-t-forms-mat-chip-list-editor.component-DmTyO9Wi.mjs → ngx-t-forms-mat-chip-list-editor.component-C41AL9Et.mjs} +2 -2
  24. package/fesm2022/{ngx-t-forms-mat-chip-list-editor.component-DmTyO9Wi.mjs.map → ngx-t-forms-mat-chip-list-editor.component-C41AL9Et.mjs.map} +1 -1
  25. package/fesm2022/{ngx-t-forms-mat-slider-editor.component-DZ4TenrI.mjs → ngx-t-forms-mat-slider-editor.component-BWe8U-sI.mjs} +2 -2
  26. package/fesm2022/{ngx-t-forms-mat-slider-editor.component-DZ4TenrI.mjs.map → ngx-t-forms-mat-slider-editor.component-BWe8U-sI.mjs.map} +1 -1
  27. package/fesm2022/{ngx-t-forms-mat-slider-toggle-editor.component-DPyBYE4p.mjs → ngx-t-forms-mat-slider-toggle-editor.component-B_XlkHuK.mjs} +2 -2
  28. package/fesm2022/{ngx-t-forms-mat-slider-toggle-editor.component-DPyBYE4p.mjs.map → ngx-t-forms-mat-slider-toggle-editor.component-B_XlkHuK.mjs.map} +1 -1
  29. package/fesm2022/{ngx-t-forms-missing-form-configs.component-BRmnwAK6.mjs → ngx-t-forms-missing-form-configs.component-DPNNyKkt.mjs} +2 -2
  30. package/fesm2022/{ngx-t-forms-missing-form-configs.component-BRmnwAK6.mjs.map → ngx-t-forms-missing-form-configs.component-DPNNyKkt.mjs.map} +1 -1
  31. package/fesm2022/{ngx-t-forms-mscoa-chart-toolbar.component-D_umeAPL.mjs → ngx-t-forms-mscoa-chart-toolbar.component-DY1QnG08.mjs} +2 -2
  32. package/fesm2022/{ngx-t-forms-mscoa-chart-toolbar.component-D_umeAPL.mjs.map → ngx-t-forms-mscoa-chart-toolbar.component-DY1QnG08.mjs.map} +1 -1
  33. package/fesm2022/{ngx-t-forms-mscoa-error-display.component-CSX2NCNU.mjs → ngx-t-forms-mscoa-error-display.component-CRc_4l3l.mjs} +2 -2
  34. package/fesm2022/{ngx-t-forms-mscoa-error-display.component-CSX2NCNU.mjs.map → ngx-t-forms-mscoa-error-display.component-CRc_4l3l.mjs.map} +1 -1
  35. package/fesm2022/{ngx-t-forms-mscoa-segment-config.component-B6IF8kGg.mjs → ngx-t-forms-mscoa-segment-config.component-Ckr_nuZF.mjs} +2 -2
  36. package/fesm2022/{ngx-t-forms-mscoa-segment-config.component-B6IF8kGg.mjs.map → ngx-t-forms-mscoa-segment-config.component-Ckr_nuZF.mjs.map} +1 -1
  37. package/fesm2022/{ngx-t-forms-mscoa-temporary-hint.component-BPkjsRmH.mjs → ngx-t-forms-mscoa-temporary-hint.component-GYxT-56Y.mjs} +2 -2
  38. package/fesm2022/{ngx-t-forms-mscoa-temporary-hint.component-BPkjsRmH.mjs.map → ngx-t-forms-mscoa-temporary-hint.component-GYxT-56Y.mjs.map} +1 -1
  39. package/fesm2022/{ngx-t-forms-ngx-t-forms-D9qmig6g.mjs → ngx-t-forms-ngx-t-forms-DP2koSL5.mjs} +636 -79
  40. package/fesm2022/ngx-t-forms-ngx-t-forms-DP2koSL5.mjs.map +1 -0
  41. package/fesm2022/{ngx-t-forms-pipeline-generator.component-DBJEyCbd.mjs → ngx-t-forms-pipeline-generator.component-BxHetD_Q.mjs} +3 -3
  42. package/fesm2022/{ngx-t-forms-pipeline-generator.component-DBJEyCbd.mjs.map → ngx-t-forms-pipeline-generator.component-BxHetD_Q.mjs.map} +1 -1
  43. package/fesm2022/{ngx-t-forms-record-list-manager.component-Dgs9lNSr.mjs → ngx-t-forms-record-list-manager.component-BQuMkoXo.mjs} +2 -2
  44. package/fesm2022/{ngx-t-forms-record-list-manager.component-Dgs9lNSr.mjs.map → ngx-t-forms-record-list-manager.component-BQuMkoXo.mjs.map} +1 -1
  45. package/fesm2022/{ngx-t-forms-required-inputs.component-CSIJvSHq.mjs → ngx-t-forms-required-inputs.component-CLyq9dIR.mjs} +2 -2
  46. package/fesm2022/{ngx-t-forms-required-inputs.component-CSIJvSHq.mjs.map → ngx-t-forms-required-inputs.component-CLyq9dIR.mjs.map} +1 -1
  47. package/fesm2022/{ngx-t-forms-rest-api-call-setup.component-CY-JSkGs.mjs → ngx-t-forms-rest-api-call-setup.component-CWeIUKLz.mjs} +2 -2
  48. package/fesm2022/{ngx-t-forms-rest-api-call-setup.component-CY-JSkGs.mjs.map → ngx-t-forms-rest-api-call-setup.component-CWeIUKLz.mjs.map} +1 -1
  49. package/fesm2022/{ngx-t-forms-section-report.component-12-KdKT6.mjs → ngx-t-forms-section-report.component-BtaF39WD.mjs} +2 -2
  50. package/fesm2022/{ngx-t-forms-section-report.component-12-KdKT6.mjs.map → ngx-t-forms-section-report.component-BtaF39WD.mjs.map} +1 -1
  51. package/fesm2022/{ngx-t-forms-selection-options-editor.component-Be3QAG_L.mjs → ngx-t-forms-selection-options-editor.component-B4cEGWrK.mjs} +2 -2
  52. package/fesm2022/{ngx-t-forms-selection-options-editor.component-Be3QAG_L.mjs.map → ngx-t-forms-selection-options-editor.component-B4cEGWrK.mjs.map} +1 -1
  53. package/fesm2022/{ngx-t-forms-t-workflow-picker.component-a4f1r8gH.mjs → ngx-t-forms-t-workflow-picker.component-BkVN4Wdk.mjs} +2 -2
  54. package/fesm2022/{ngx-t-forms-t-workflow-picker.component-a4f1r8gH.mjs.map → ngx-t-forms-t-workflow-picker.component-BkVN4Wdk.mjs.map} +1 -1
  55. package/fesm2022/{ngx-t-forms-validators-config.component-B3j9Dmgu.mjs → ngx-t-forms-validators-config.component-Cq07Er-G.mjs} +3 -3
  56. package/fesm2022/{ngx-t-forms-validators-config.component-B3j9Dmgu.mjs.map → ngx-t-forms-validators-config.component-Cq07Er-G.mjs.map} +1 -1
  57. package/fesm2022/ngx-t-forms.mjs +1 -1
  58. package/package.json +2 -2
  59. package/types/ngx-t-forms.d.ts +148 -3
  60. package/fesm2022/ngx-t-forms-form-section-stepper.component-BTkcSjg7.mjs +0 -270
  61. package/fesm2022/ngx-t-forms-form-section-stepper.component-BTkcSjg7.mjs.map +0 -1
  62. package/fesm2022/ngx-t-forms-ngx-t-forms-D9qmig6g.mjs.map +0 -1
@@ -1,9 +1,9 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, Component, InjectionToken, makeEnvironmentProviders, inject, Inject, Directive, NgModule, Input, Pipe, EventEmitter, ElementRef, ViewChild, Output, ViewEncapsulation, HostBinding, Optional, Self, HostListener, ChangeDetectionStrategy, ChangeDetectorRef, Injector, forwardRef, DestroyRef } from '@angular/core';
3
- import { DataSources, formColumnInputsSchema, ElementTypes, validateCalculatedFieldRules, CalculationFunctions, MinInputTypes, InputDataTypes, FormSubmissionStatus, InputTypes, AdjudicationSteps, InputPipeTypes, getElementEditorConfig, ElementEditorTypes, AllFormInputPrimaryKeys, DefaultInputConfig, SpecialElementKeys, validateFormColumnInputsWithRequired, validateForm, FormListSection, FormStateErrors, validateFormSlide, BlurHandleTypes, OptionSelectTypes, AllDocumentFileExtensions, AllImageFileExtensions, InputFileType, UploadTypes, DocumentLitsLabelConfigInterfaceValueType } from 'ngx-t-forms-types';
2
+ import { Injectable, Component, InjectionToken, makeEnvironmentProviders, inject, Inject, Directive, Injector, NgModule, Input, Pipe, EventEmitter, ElementRef, ViewChild, Output, ViewEncapsulation, HostBinding, Optional, Self, HostListener, ChangeDetectionStrategy, ChangeDetectorRef, forwardRef, DestroyRef } from '@angular/core';
3
+ import { DataSources, formColumnInputsSchema, ElementTypes, validateCalculatedFieldRules, CalculationFunctions, MinInputTypes, InputDataTypes, FormSubmissionStatus, InputTypes, AdjudicationSteps, InputPipeTypes, getElementEditorConfig, ElementEditorTypes, AllFormInputPrimaryKeys, DefaultInputConfig, SpecialElementKeys, validateFormColumnInputsWithRequired, validateForm, FormListSection, FormStateErrors, validateFormSlide, BlurHandleTypes, OptionSelectTypes, AllDocumentFileExtensions, AllImageFileExtensions, InputFileType, UploadTypes, DocumentLitsLabelConfigInterfaceValueType, MultipleInputAvailableOperations } from 'ngx-t-forms-types';
4
4
  import * as i1$3 from '@angular/forms';
5
5
  import { Validators, FormControl, FormGroup, FormsModule, ReactiveFormsModule, ɵInternalFormsSharedModule as _InternalFormsSharedModule } from '@angular/forms';
6
- import { takeUntil, debounceTime, distinctUntilChanged, startWith, map, pairwise, switchMap, catchError, EMPTY, throwError, of, tap, take, forkJoin, filter, from, concatMap, last, Subject, Observable, concat, finalize, Subscription, BehaviorSubject, combineLatest, withLatestFrom, shareReplay, timer, firstValueFrom } from 'rxjs';
6
+ import { takeUntil, debounceTime, distinctUntilChanged, startWith, map, pairwise, switchMap, catchError, EMPTY, throwError, of, tap, take, forkJoin, filter, firstValueFrom, from, concatMap, last, Subject, BehaviorSubject, timer, timeout, defaultIfEmpty, Observable, shareReplay, concat, finalize, Subscription, combineLatest, withLatestFrom } from 'rxjs';
7
7
  import { create, all } from 'mathjs';
8
8
  import * as i1 from '@angular/common/http';
9
9
  import { HttpClient, HttpErrorResponse } from '@angular/common/http';
@@ -16,7 +16,7 @@ import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA, MatDialog } from '@angu
16
16
  import { CdkAccordionModule } from '@angular/cdk/accordion';
17
17
  import { ClipboardModule } from '@angular/cdk/clipboard';
18
18
  import * as i1$2 from '@angular/cdk/drag-drop';
19
- import { DragDropModule } from '@angular/cdk/drag-drop';
19
+ import { DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';
20
20
  import * as i9$1 from '@angular/cdk/portal';
21
21
  import { PortalModule, ComponentPortal } from '@angular/cdk/portal';
22
22
  import { ScrollingModule } from '@angular/cdk/scrolling';
@@ -2250,7 +2250,7 @@ const returnAnyFormInputFromForm = (form, id) => {
2250
2250
  };
2251
2251
 
2252
2252
  const updateValue = (self, inputId, value) => {
2253
- const input = returnAnyFormInputFromForm(self.form, inputId);
2253
+ const input = returnAnyFormInputFromForm(self.form, inputId) || self.systemInputs.find(inp => inp.id === inputId);
2254
2254
  if (!input) {
2255
2255
  throw new Error(`Input cant be found.Failed to set value`);
2256
2256
  }
@@ -3008,6 +3008,7 @@ const prepPopulateForm = (form, initValue) => {
3008
3008
  if (column.element === ElementTypes.MultipleInput) {
3009
3009
  const newM = {
3010
3010
  ...column,
3011
+ formIsOpen: column.formIsOpen ?? false,
3011
3012
  value: (deepValue || initValue[column.formControlName || ''] || column.value || []).map((item) => {
3012
3013
  return Object.entries(item).reduce((acc, [key, value]) => {
3013
3014
  const inputId = column.formInputs?.find(input => input.formControlName === key)?.id;
@@ -3645,11 +3646,14 @@ function getInputSourcedValue(inputConfig, formValue, utils) {
3645
3646
  if (!inheritValueFromInputId) {
3646
3647
  throw new Error('Input source ID not specified for Input Sourced Value function.');
3647
3648
  }
3649
+ utils.setInputStatus(inputConfig.id, 'a3f7c821-5e14-4d92-b836-8e2d1a0f6c45', 'Loading sourced value...');
3648
3650
  const sourcedValue = formVal[inheritValueFromInputId];
3649
3651
  utils.updateValue(inputConfig.id, sourcedValue);
3652
+ utils.removeInputStatus(inputConfig.id, 'a3f7c821-5e14-4d92-b836-8e2d1a0f6c45');
3650
3653
  return of(void 0);
3651
3654
  }
3652
3655
  catch (error) {
3656
+ utils.removeInputStatus(inputConfig.id, 'a3f7c821-5e14-4d92-b836-8e2d1a0f6c45');
3653
3657
  utils.setTemporaryHint(inputConfig.id, error instanceof Error ? error.message : `Failed to prepopulate value`, HintType.ERROR);
3654
3658
  return throwError(() => error instanceof Error ? error.message : `Failed to prepopulate value`);
3655
3659
  }
@@ -3677,10 +3681,35 @@ function createDateInput(config) {
3677
3681
  validators: [],
3678
3682
  };
3679
3683
  }
3684
+ function createTextInput(config) {
3685
+ return {
3686
+ element: ElementTypes.Input,
3687
+ inputType: InputTypes.Text,
3688
+ formControlName: config.controlName,
3689
+ id: config.id,
3690
+ label: config.label,
3691
+ placeholder: config.label,
3692
+ value: config.value ?? null,
3693
+ sectionId: config.sectionId,
3694
+ dataType: InputDataTypes.String,
3695
+ appearance: "fill",
3696
+ required: false,
3697
+ colSize: 0,
3698
+ onlySetTempErrorOnTouch: false,
3699
+ isCalculatedField: false,
3700
+ validators: [],
3701
+ };
3702
+ }
3680
3703
  function generateSystemInputs(globals, sectionId) {
3681
3704
  if (!globals)
3682
3705
  return [];
3683
3706
  const inputConfigs = [
3707
+ {
3708
+ condition: Boolean(globals.CURRENT_FINANCIAL_CYCLE),
3709
+ items: [
3710
+ { id: SystemInputIDs.CURRENT_FINANCIAL_CYCLE, name: 'CURRENT_FINANCIAL_CYCLE', label: 'Current Financial Cycle', inputType: 'text' }
3711
+ ]
3712
+ },
3684
3713
  {
3685
3714
  condition: Boolean(globals.CURRENT_FINANCIAL_CYCLE_START_DATE && globals.CURRENT_FINANCIAL_CYCLE_END_DATE),
3686
3715
  items: [
@@ -3694,36 +3723,79 @@ function generateSystemInputs(globals, sectionId) {
3694
3723
  { id: SystemInputIDs.CURRENT_SPRINT_START_DATE, name: 'CURRENT_SPRINT_START_DATE', label: 'Current Sprint Start Date' },
3695
3724
  { id: SystemInputIDs.CURRENT_SPRINT_END_DATE, name: 'CURRENT_SPRINT_END_DATE', label: 'Current Sprint End Date' }
3696
3725
  ]
3726
+ },
3727
+ {
3728
+ condition: Boolean(globals.NEXT_FINANCIAL_CYCLE),
3729
+ items: [
3730
+ { id: SystemInputIDs.NEXT_FINANCIAL_CYCLE, name: 'NEXT_FINANCIAL_CYCLE', label: 'Next Financial Cycle', inputType: 'text' }
3731
+ ]
3732
+ },
3733
+ {
3734
+ condition: Boolean(globals.NEXT_FINANCIAL_CYCLE_START_DATE && globals.NEXT_FINANCIAL_CYCLE_END_DATE),
3735
+ items: [
3736
+ { id: SystemInputIDs.NEXT_FINANCIAL_CYCLE_START_DATE, name: 'NEXT_FINANCIAL_CYCLE_START_DATE', label: 'Next Financial Cycle Start Date' },
3737
+ { id: SystemInputIDs.NEXT_FINANCIAL_CYCLE_END_DATE, name: 'NEXT_FINANCIAL_CYCLE_END_DATE', label: 'Next Financial Cycle End Date' }
3738
+ ]
3739
+ },
3740
+ {
3741
+ condition: Boolean(globals.PREVIOUS_FINANCIAL_CYCLE),
3742
+ items: [
3743
+ { id: SystemInputIDs.PREVIOUS_FINANCIAL_CYCLE, name: 'PREVIOUS_FINANCIAL_CYCLE', label: 'Previous Financial Cycle', inputType: 'text' }
3744
+ ]
3745
+ },
3746
+ {
3747
+ condition: Boolean(globals.PREVIOUS_FINANCIAL_CYCLE_START_DATE && globals.PREVIOUS_FINANCIAL_CYCLE_END_DATE),
3748
+ items: [
3749
+ { id: SystemInputIDs.PREVIOUS_FINANCIAL_CYCLE_START_DATE, name: 'PREVIOUS_FINANCIAL_CYCLE_START_DATE', label: 'Previous Financial Cycle Start Date' },
3750
+ { id: SystemInputIDs.PREVIOUS_FINANCIAL_CYCLE_END_DATE, name: 'PREVIOUS_FINANCIAL_CYCLE_END_DATE', label: 'Previous Financial Cycle End Date' }
3751
+ ]
3697
3752
  }
3698
3753
  ];
3699
3754
  return inputConfigs
3700
3755
  .filter(group => group.condition)
3701
- .flatMap(group => group.items.map(item => createDateInput({
3702
- id: item.id,
3703
- controlName: item.name,
3704
- label: `🏢 System: ${item.label}`,
3705
- value: globals[item.name],
3706
- sectionId
3707
- })));
3756
+ .flatMap(group => group.items.map(item => item.inputType === 'text'
3757
+ ? createTextInput({ id: item.id, controlName: item.name, label: `🏢 System: ${item.label}`, value: globals[item.name], sectionId })
3758
+ : createDateInput({ id: item.id, controlName: item.name, label: `🏢 System: ${item.label}`, value: globals[item.name], sectionId })));
3708
3759
  }
3709
3760
  var SystemInputIDs;
3710
3761
  (function (SystemInputIDs) {
3762
+ SystemInputIDs["CURRENT_FINANCIAL_CYCLE"] = "3f7a1c2d-8e4b-4f9a-b6c5-1d2e3f4a5b6c";
3711
3763
  SystemInputIDs["CURRENT_FINANCIAL_CYCLE_START_DATE"] = "aabe9916-efbe-4aee-8ca4-2500832786b1";
3712
3764
  SystemInputIDs["CURRENT_FINANCIAL_CYCLE_END_DATE"] = "a9b41b41-6370-4dce-b2b3-cc8bbb7f6b5f";
3713
3765
  SystemInputIDs["CURRENT_SPRINT_START_DATE"] = "956d6333-b5a5-4790-ba80-4276dd53ee90";
3714
3766
  SystemInputIDs["CURRENT_SPRINT_END_DATE"] = "1e2468d2-4ae3-4778-a007-754d2fa694af";
3767
+ SystemInputIDs["NEXT_FINANCIAL_CYCLE"] = "7d8e9f0a-1b2c-3d4e-5f6a-7b8c9d0e1f2a";
3768
+ SystemInputIDs["NEXT_FINANCIAL_CYCLE_START_DATE"] = "b2c3d4e5-f6a7-8b9c-0d1e-2f3a4b5c6d7e";
3769
+ SystemInputIDs["NEXT_FINANCIAL_CYCLE_END_DATE"] = "c3d4e5f6-a7b8-9c0d-1e2f-3a4b5c6d7e8f";
3770
+ SystemInputIDs["PREVIOUS_FINANCIAL_CYCLE"] = "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f9a";
3771
+ SystemInputIDs["PREVIOUS_FINANCIAL_CYCLE_START_DATE"] = "e5f6a7b8-c9d0-1e2f-3a4b-5c6d7e8f9a0b";
3772
+ SystemInputIDs["PREVIOUS_FINANCIAL_CYCLE_END_DATE"] = "f6a7b8c9-d0e1-2f3a-4b5c-6d7e8f9a0b1c";
3715
3773
  })(SystemInputIDs || (SystemInputIDs = {}));
3716
3774
 
3717
- const loadSystemInputs = (self) => {
3775
+ /**
3776
+ * Fetches global financial-cycle variables and populates the tower's system inputs.
3777
+ *
3778
+ * Must be `await`ed inside `initialize` **before** `formGenerator` is called so that
3779
+ * system-input controls are included in the `FormGroup` from the start.
3780
+ * Previously this fired a fire-and-forget `.subscribe()` which created a race condition:
3781
+ * `formGenerator` ran before the observable resolved, so system inputs had no
3782
+ * corresponding `FormControl`s and every later `updateValue` call for them threw.
3783
+ *
3784
+ * Errors are swallowed because system inputs are optional — if `getFinacialCycles`
3785
+ * fails the tower still functions, just without system-input controls.
3786
+ *
3787
+ * @param self - The tower instance whose `systemInputs` will be populated.
3788
+ */
3789
+ const loadSystemInputs = async (self) => {
3718
3790
  try {
3719
- self.NGX_T_FORMS_CONFIG.formBuilder.getFinacialCycles().pipe(take(1), tap((globalVariables => {
3720
- const firstSectionId = self.form?.slides[0]?.columns[0]?.sectionId;
3721
- if (!firstSectionId)
3722
- return;
3723
- self.systemInputs = generateSystemInputs(globalVariables, firstSectionId);
3724
- }))).subscribe();
3791
+ const globalVariables = await firstValueFrom(self.NGX_T_FORMS_CONFIG.formBuilder.getFinacialCycles());
3792
+ const firstSectionId = self.form?.slides[0]?.columns[0]?.sectionId;
3793
+ if (!firstSectionId)
3794
+ return;
3795
+ self.systemInputs = generateSystemInputs(globalVariables, firstSectionId);
3725
3796
  }
3726
- catch (error) {
3797
+ catch {
3798
+ // system inputs are optional — swallow errors silently
3727
3799
  }
3728
3800
  };
3729
3801
 
@@ -3866,6 +3938,9 @@ class FormTowerControllerService {
3866
3938
  this.NGX_T_FORMS_CONFIG = inject(NGX_T_FORMS_CONFIG_TOKEN);
3867
3939
  this.getFinacialCycles = this.NGX_T_FORMS_CONFIG.formBuilder.getFinacialCycles;
3868
3940
  this._destroyed$ = new Subject();
3941
+ // Reactive busy state — tracks all in-flight status keys (inputId:statusId)
3942
+ this._activeStatusKeys = new Set();
3943
+ this._busyState$ = new BehaviorSubject(false);
3869
3944
  // Keep form record for non-FormControl based operation, like calculations and API calls
3870
3945
  this._formValue = {};
3871
3946
  this._initialFormValue = {};
@@ -3878,17 +3953,22 @@ class FormTowerControllerService {
3878
3953
  // This tells us: "When input X changes, these inputs depend on it and need their functions run"
3879
3954
  this._reverseDependencyMap = {};
3880
3955
  this._changeHistory = [];
3881
- this.submittingForm = false;
3956
+ this._submittingForm = false;
3882
3957
  this.initialize = async (form) => {
3883
3958
  // .1 Clean up for State
3884
3959
  this.clearFormState();
3885
3960
  // .2 Initialize the form. Create an empty form if none is provided.
3886
3961
  this._form = { ...(prepPopulateForm(form, this._initialFormValue)) };
3887
- loadSystemInputs(this);
3962
+ await loadSystemInputs(this);
3888
3963
  this.setFirstStepAsActive();
3889
3964
  // .3 Create the main form Group
3890
3965
  const allFormInputs = this.allFormInputs() || [];
3891
3966
  this._mainForm = formGenerator(allFormInputs, this.getFormValue.bind(this));
3967
+ // Re-add sub-form controls for any multiple inputs that had their form open before re-initialization
3968
+ // (e.g. triggered by drag-and-drop or any other form config change that calls initialize)
3969
+ allFormInputs
3970
+ .filter(input => input.element === ElementTypes.MultipleInput && input.formIsOpen === true)
3971
+ .forEach(input => toggleMultipleInput(this, this._mainForm, input.id, true));
3892
3972
  // .4 crete change reaction functions
3893
3973
  this.createAllInputDependencies();
3894
3974
  this.createInputFunctionsCollection();
@@ -3964,8 +4044,16 @@ class FormTowerControllerService {
3964
4044
  this._inputChangeDependencyRecords[input.id] = createInputChangeDependency(input);
3965
4045
  }
3966
4046
  };
3967
- this.setInputStatus = (inputId, statusId, status) => setInputStatus(this, inputId, statusId, status);
3968
- this.removeInputStatus = (inputId, statusId) => removeInputStatus(this, inputId, statusId);
4047
+ this.setInputStatus = (inputId, statusId, status) => {
4048
+ this._activeStatusKeys.add(`${inputId}:${statusId}`);
4049
+ this._syncBusyState();
4050
+ setInputStatus(this, inputId, statusId, status);
4051
+ };
4052
+ this.removeInputStatus = (inputId, statusId) => {
4053
+ this._activeStatusKeys.delete(`${inputId}:${statusId}`);
4054
+ this._syncBusyState();
4055
+ removeInputStatus(this, inputId, statusId);
4056
+ };
3969
4057
  this.updateValue = (inputId, value) => updateValue(this, inputId, value);
3970
4058
  this.getFormValue = () => this._formValue;
3971
4059
  this.clearFormState = () => {
@@ -3974,6 +4062,8 @@ class FormTowerControllerService {
3974
4062
  this._inputFunctionsCollection = {};
3975
4063
  this._inputChangeDependencyRecords = {};
3976
4064
  this._reverseDependencyMap = {};
4065
+ this._activeStatusKeys.clear();
4066
+ this._busyState$.next(false);
3977
4067
  this._destroyed$.next();
3978
4068
  };
3979
4069
  this.executeInputFunctionsWithoutDependencies = () => {
@@ -4011,15 +4101,37 @@ class FormTowerControllerService {
4011
4101
  const allInputs = this.allFormInputs();
4012
4102
  if (!allInputs)
4013
4103
  return;
4104
+ const main = this._mainForm;
4105
+ const hasBoundControl = (input) => {
4106
+ if (!main || !input.sectionId)
4107
+ return false;
4108
+ return !!getSectionControl(main, input.sectionId, input.id);
4109
+ };
4110
+ const applyValue = (inputId, v) => {
4111
+ try {
4112
+ this.updateValue(inputId, v);
4113
+ }
4114
+ catch {
4115
+ /* skip fields that cannot be bound (schema drift, nested edge cases) */
4116
+ }
4117
+ };
4014
4118
  for (const input of allInputs || []) {
4015
- const value = safeReturnDeepProperty(initialValues, input.formControlName.split('.')).value || initialValues[input.formControlName];
4119
+ if (input.element === ElementTypes.SectionTitle || input.multipleInputInEditId) {
4120
+ continue;
4121
+ }
4122
+ const fromPath = safeReturnDeepProperty(initialValues, input.formControlName.split('.')).value;
4123
+ const value = fromPath ?? initialValues[input.formControlName];
4016
4124
  const isMultipleInput = input.element === ElementTypes.MultipleInput;
4017
4125
  if (value !== undefined && !isMultipleInput) {
4018
- this.updateValue(input.id, value);
4126
+ if (!hasBoundControl(input))
4127
+ continue;
4128
+ applyValue(input.id, value);
4019
4129
  continue;
4020
4130
  }
4021
4131
  if (isMultipleInput) {
4022
- const v = (value || []).map((item) => {
4132
+ if (!hasBoundControl(input))
4133
+ continue;
4134
+ const v = (value ?? []).map((item) => {
4023
4135
  return Object.entries(item).reduce((acc, [key, val]) => {
4024
4136
  const inp = allInputs.find((i) => i.formControlName === key);
4025
4137
  if (key === 'id') {
@@ -4033,10 +4145,12 @@ class FormTowerControllerService {
4033
4145
  });
4034
4146
  v[`${input.id}.id`] = initialValues[input.id];
4035
4147
  console.error(`Setting multiple input value`, v);
4036
- this.updateValue(input.id, v);
4148
+ applyValue(input.id, v);
4037
4149
  continue;
4038
4150
  }
4039
- this.updateValue(input.id, '');
4151
+ if (!hasBoundControl(input))
4152
+ continue;
4153
+ applyValue(input.id, '');
4040
4154
  }
4041
4155
  };
4042
4156
  this.revertBackHistory = () => {
@@ -4122,6 +4236,14 @@ class FormTowerControllerService {
4122
4236
  this.canRefreshFn = (inputId) => canRefresh(this, inputId);
4123
4237
  this.canRefreshSection = (sectionId) => canRefreshSectionFn(this, sectionId);
4124
4238
  }
4239
+ _syncBusyState() {
4240
+ this._busyState$.next(this._submittingForm || this._activeStatusKeys.size > 0);
4241
+ }
4242
+ get submittingForm() { return this._submittingForm; }
4243
+ set submittingForm(value) {
4244
+ this._submittingForm = value;
4245
+ this._syncBusyState();
4246
+ }
4125
4247
  get form() {
4126
4248
  return this._form;
4127
4249
  }
@@ -4146,6 +4268,35 @@ class FormTowerControllerService {
4146
4268
  get inputFunctionsCollection() {
4147
4269
  return this._inputFunctionsCollection;
4148
4270
  }
4271
+ get isBusy() {
4272
+ return this._busyState$.value;
4273
+ }
4274
+ /**
4275
+ * Reactive stream of the tower's busy state.
4276
+ * Emits `true` whenever any calculation, API fetch, or validation is in flight,
4277
+ * or while the form is submitting. Emits `false` when all operations have settled.
4278
+ */
4279
+ get isBusy$() {
4280
+ return this._busyState$.asObservable();
4281
+ }
4282
+ /**
4283
+ * Resolves once the tower has finished all in-flight computations (calculations,
4284
+ * API fetches, input-sourced values, validations).
4285
+ *
4286
+ * Safe to use in import workflows:
4287
+ * ```ts
4288
+ * await tower.initialize(form);
4289
+ * tower.initializeFormValues(rowData);
4290
+ * await tower.waitUntilSettled(); // changeMonitor debounce + all ops complete
4291
+ * const value = tower.getFormValueNames();
4292
+ * ```
4293
+ *
4294
+ * @param debounceMs Extra lead time matching the changeMonitor debounce (default 600ms).
4295
+ * @param timeoutMs Hard timeout before the promise rejects (default 30s).
4296
+ */
4297
+ waitUntilSettled(debounceMs = 600, timeoutMs = 30_000) {
4298
+ return firstValueFrom(timer(debounceMs).pipe(switchMap(() => this._busyState$.pipe(filter(busy => !busy), take(1))), timeout(timeoutMs), defaultIfEmpty(undefined), map(() => undefined)));
4299
+ }
4149
4300
  ngOnDestroy() {
4150
4301
  this._destroyed$.next();
4151
4302
  this._destroyed$.complete();
@@ -4169,7 +4320,7 @@ class FormTowerControllerService {
4169
4320
  this._reverseDependencyMap[dependencyId] = [];
4170
4321
  }
4171
4322
  // Add this input as dependent on the dependencyId
4172
- this._reverseDependencyMap[dependencyId].push({
4323
+ this._reverseDependencyMap[dependencyId]?.push({
4173
4324
  inputId,
4174
4325
  functionType: functionType
4175
4326
  });
@@ -4410,6 +4561,269 @@ function computedErrors(element, allErrors) {
4410
4561
  return [...[], ...errors];
4411
4562
  }
4412
4563
 
4564
+ // ---------------------------------------------------------------------------
4565
+ // Concrete tower
4566
+ //
4567
+ // Decorated with @Injectable() so Angular's DI can resolve its dependencies
4568
+ // (HttpClient, NGX_T_FORMS_CONFIG_TOKEN, etc.) from a child injector without
4569
+ // us having to manually thread those deps through TFormImportController.
4570
+ // ---------------------------------------------------------------------------
4571
+ class ImportTowerInstance extends FormTowerControllerService {
4572
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: ImportTowerInstance, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
4573
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: ImportTowerInstance }); }
4574
+ }
4575
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: ImportTowerInstance, decorators: [{
4576
+ type: Injectable
4577
+ }] });
4578
+ // ---------------------------------------------------------------------------
4579
+ // Service
4580
+ // ---------------------------------------------------------------------------
4581
+ class TFormImportController {
4582
+ constructor() {
4583
+ this._injector = inject(Injector);
4584
+ this._rows$ = new BehaviorSubject([]);
4585
+ /**
4586
+ * Per-session HTTP caches.
4587
+ * Key: serialized request identity → shared Observable (shareReplay).
4588
+ * Populated at the start of runImport and cleared when it finishes,
4589
+ * so every import session starts cold but identical in-flight requests
4590
+ * across concurrent rows reuse a single HTTP call.
4591
+ */
4592
+ this._getCache = new Map();
4593
+ this._postCache = new Map();
4594
+ /**
4595
+ * Shared financial-cycles observable for the current import session.
4596
+ * loadSystemInputs calls getFinacialCycles() directly via NGX_T_FORMS_CONFIG
4597
+ * (not through utils), so HTTP-function patching alone cannot deduplicate it.
4598
+ * We intercept it at the config level by providing a wrapped token in each
4599
+ * tower's child injector that returns this shared observable instead.
4600
+ */
4601
+ this._financialCycles$ = null;
4602
+ /**
4603
+ * Reactive progress stream — subscribe to track each row in real time.
4604
+ */
4605
+ this.progress$ = this._rows$.pipe(map(rows => this._toProgress(rows)));
4606
+ }
4607
+ /**
4608
+ * Snapshot of the current progress (non-reactive).
4609
+ */
4610
+ get currentProgress() {
4611
+ return this._toProgress(this._rows$.value);
4612
+ }
4613
+ // -------------------------------------------------------------------------
4614
+ // Public API
4615
+ // -------------------------------------------------------------------------
4616
+ /**
4617
+ * Runs an import session.
4618
+ *
4619
+ * For each row a fresh tower instance is spun up via a child injector,
4620
+ * prepopulated, and left to settle (calculations + API fetches) before
4621
+ * recording the final value and validation status.
4622
+ * All rows are processed concurrently.
4623
+ *
4624
+ * Usage:
4625
+ * ```ts
4626
+ * const results = await importController.runImport(form, rows);
4627
+ * const valid = results.filter(r => r.isValid);
4628
+ * ```
4629
+ *
4630
+ * @param form The form definition every row is validated against.
4631
+ * @param rows Raw data objects — one per import row.
4632
+ */
4633
+ async runImport(form, rows) {
4634
+ // Fresh cache per session — previous responses must not bleed into a new run.
4635
+ this._getCache.clear();
4636
+ this._postCache.clear();
4637
+ this._financialCycles$ = null;
4638
+ this._rows$.next(rows.map((originalData, rowIndex) => ({ rowIndex, originalData, status: 'pending' })));
4639
+ await Promise.all(rows.map((row, i) => this._processRow(form, row, i)));
4640
+ // Session is over — release cached Observables.
4641
+ this._getCache.clear();
4642
+ this._postCache.clear();
4643
+ this._financialCycles$ = null;
4644
+ return this._rows$.value;
4645
+ }
4646
+ /** Clears all row state. */
4647
+ reset() {
4648
+ this._getCache.clear();
4649
+ this._postCache.clear();
4650
+ this._financialCycles$ = null;
4651
+ this._rows$.next([]);
4652
+ }
4653
+ // -------------------------------------------------------------------------
4654
+ // Private
4655
+ // -------------------------------------------------------------------------
4656
+ /**
4657
+ * Creates an isolated tower instance through a short-lived child injector.
4658
+ *
4659
+ * The child injector delegates all token resolution to the parent, so
4660
+ * HttpClient, NGX_T_FORMS_CONFIG_TOKEN, and any other deps the tower needs
4661
+ * are found automatically — no manual wiring required here.
4662
+ *
4663
+ * After creation the tower's HTTP functions are replaced with cache-aware
4664
+ * wrappers so that identical requests fired by different rows share one
4665
+ * in-flight Observable instead of each issuing their own HTTP call.
4666
+ */
4667
+ _createTower() {
4668
+ // Build a wrapped config that routes getFinacialCycles through the shared
4669
+ // session observable so all 10 towers share one HTTP call instead of each
4670
+ // firing their own. loadSystemInputs calls this directly via the injected
4671
+ // config token, so HTTP-function patching alone cannot deduplicate it.
4672
+ const parentConfig = this._injector.get(NGX_T_FORMS_CONFIG_TOKEN);
4673
+ const wrappedConfig = {
4674
+ ...parentConfig,
4675
+ formBuilder: {
4676
+ ...parentConfig.formBuilder,
4677
+ getFinacialCycles: () => {
4678
+ if (!this._financialCycles$) {
4679
+ this._financialCycles$ = parentConfig.formBuilder.getFinacialCycles()
4680
+ .pipe(shareReplay({ bufferSize: 1, refCount: false }));
4681
+ }
4682
+ return this._financialCycles$;
4683
+ },
4684
+ },
4685
+ };
4686
+ const tower = Injector.create({
4687
+ providers: [
4688
+ { provide: ImportTowerInstance },
4689
+ { provide: NGX_T_FORMS_CONFIG_TOKEN, useValue: wrappedConfig },
4690
+ ],
4691
+ parent: this._injector,
4692
+ }).get(ImportTowerInstance);
4693
+ const originalGet = tower.httpGetDataFunction.bind(tower);
4694
+ const originalPost = tower.httpPostDataFunction.bind(tower);
4695
+ tower.httpGetDataFunction = (url, options) => this._cachedGet(url, options, originalGet);
4696
+ tower.httpPostDataFunction = (url, data, options) => this._cachedPost(url, data, options, originalPost);
4697
+ return tower;
4698
+ }
4699
+ /**
4700
+ * Returns a shared Observable for a GET request.
4701
+ * On cache miss the original function is called once and its result is
4702
+ * multicasted via shareReplay(1) so every concurrent subscriber (row) that
4703
+ * asks for the same URL+options receives the same response without an
4704
+ * additional HTTP call.
4705
+ */
4706
+ _cachedGet(url, options, original) {
4707
+ const key = `GET::${url}::${JSON.stringify(options ?? null)}`;
4708
+ if (!this._getCache.has(key)) {
4709
+ this._getCache.set(key, original(url, options).pipe(shareReplay({ bufferSize: 1, refCount: false })));
4710
+ }
4711
+ return this._getCache.get(key);
4712
+ }
4713
+ /**
4714
+ * Returns a shared Observable for a POST request.
4715
+ * Keyed by URL + serialised body + serialised options so only truly
4716
+ * identical requests are deduplicated.
4717
+ */
4718
+ _cachedPost(url, data, options, original) {
4719
+ const key = `POST::${url}::${JSON.stringify(data ?? null)}::${JSON.stringify(options ?? null)}`;
4720
+ if (!this._postCache.has(key)) {
4721
+ this._postCache.set(key, original(url, data, options).pipe(shareReplay({ bufferSize: 1, refCount: false })));
4722
+ }
4723
+ return this._postCache.get(key);
4724
+ }
4725
+ async _processRow(form, rowData, rowIndex) {
4726
+ this._patchRow(rowIndex, { status: 'processing' });
4727
+ const tower = this._createTower();
4728
+ try {
4729
+ await tower.initialize(form);
4730
+ tower.initializeFormValues(rowData);
4731
+ // Waits for the changeMonitor debounce + all async ops (API, calculations)
4732
+ await tower.waitUntilSettled();
4733
+ // Ensures required-field validators surface on untouched controls
4734
+ tower.mainForm?.markAllAsTouched();
4735
+ const settledValue = tower.getFormValueNames();
4736
+ const validationErrors = this._collectValidationErrors(tower);
4737
+ const colErrors = this._collectColErrors(tower);
4738
+ const isValid = (tower.mainForm?.valid ?? false) && Object.keys(validationErrors).length === 0;
4739
+ this._patchRow(rowIndex, {
4740
+ status: isValid ? 'valid' : 'invalid',
4741
+ settledValue,
4742
+ isValid,
4743
+ validationErrors,
4744
+ colErrors,
4745
+ });
4746
+ }
4747
+ catch (err) {
4748
+ this._patchRow(rowIndex, {
4749
+ status: 'error',
4750
+ errorMessage: err instanceof Error ? err.message : String(err),
4751
+ });
4752
+ }
4753
+ finally {
4754
+ tower.ngOnDestroy();
4755
+ }
4756
+ }
4757
+ /**
4758
+ * Walks `{ [sectionId]: FormGroup { [inputId]: FormControl } }` and
4759
+ * collects every control that carries validation errors.
4760
+ */
4761
+ _collectValidationErrors(tower) {
4762
+ const errors = {};
4763
+ if (!tower.mainForm)
4764
+ return errors;
4765
+ Object.values(tower.mainForm.controls).forEach(section => {
4766
+ if (!(section instanceof FormGroup))
4767
+ return;
4768
+ Object.entries(section.controls).forEach(([inputId, control]) => {
4769
+ if (control.errors)
4770
+ errors[inputId] = Object.keys(control.errors);
4771
+ });
4772
+ });
4773
+ return errors;
4774
+ }
4775
+ /**
4776
+ * Builds a formControlName-keyed error map from the settled form.
4777
+ * Multiple error keys on one control are joined with '.'.
4778
+ */
4779
+ _collectColErrors(tower) {
4780
+ const colErrors = {};
4781
+ if (!tower.mainForm)
4782
+ return colErrors;
4783
+ // Flatten sectionId → inputId → control into a single inputId → control map
4784
+ const controlMap = {};
4785
+ Object.values(tower.mainForm.controls).forEach(section => {
4786
+ if (section instanceof FormGroup) {
4787
+ Object.assign(controlMap, section.controls);
4788
+ }
4789
+ });
4790
+ // Map inputId back to formControlName via allFormInputs()
4791
+ (tower.allFormInputs() ?? []).forEach(input => {
4792
+ if (!input.formControlName || !input.id)
4793
+ return;
4794
+ const control = controlMap[input.id];
4795
+ if (control?.errors) {
4796
+ colErrors[input.formControlName] = Object.keys(control.errors).join('.');
4797
+ }
4798
+ });
4799
+ return colErrors;
4800
+ }
4801
+ _patchRow(index, patch) {
4802
+ const rows = [...this._rows$.value];
4803
+ rows[index] = { ...rows[index], ...patch };
4804
+ this._rows$.next(rows);
4805
+ }
4806
+ _toProgress(rows) {
4807
+ const count = (status) => rows.filter(r => r.status === status).length;
4808
+ return {
4809
+ total: rows.length,
4810
+ pending: count('pending'),
4811
+ processing: count('processing'),
4812
+ complete: count('valid') + count('invalid'),
4813
+ valid: count('valid'),
4814
+ invalid: count('invalid'),
4815
+ error: count('error'),
4816
+ rows,
4817
+ };
4818
+ }
4819
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: TFormImportController, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4820
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: TFormImportController, providedIn: 'root' }); }
4821
+ }
4822
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: TFormImportController, decorators: [{
4823
+ type: Injectable,
4824
+ args: [{ providedIn: 'root' }]
4825
+ }] });
4826
+
4413
4827
  class MatModulesModule {
4414
4828
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: MatModulesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
4415
4829
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.5", ngImport: i0, type: MatModulesModule, exports: [CdkAccordionModule,
@@ -5163,12 +5577,7 @@ function moveFormInput(event, sectionId, form) {
5163
5577
  let columns = [...[], ...slide.columns];
5164
5578
  if (!columns)
5165
5579
  return;
5166
- const prevItem = columns[event.previousIndex];
5167
- const currItem = columns[event.currentIndex];
5168
- if (prevItem && currItem) {
5169
- columns[event.previousIndex] = currItem;
5170
- columns[event.currentIndex] = prevItem;
5171
- }
5580
+ moveItemInArray(columns, event.previousIndex, event.currentIndex);
5172
5581
  const newForm = {
5173
5582
  ...form,
5174
5583
  slides: form.slides.map((slide) => {
@@ -5196,12 +5605,7 @@ function moveMultipleInputInput(parentId, event, form) {
5196
5605
  if (!parentInput)
5197
5606
  return;
5198
5607
  const columns = [...(parentInput.formInputs || [])];
5199
- const prevItem = columns[event.previousIndex];
5200
- const currItem = columns[event.currentIndex];
5201
- if (prevItem && currItem) {
5202
- columns[event.previousIndex] = currItem;
5203
- columns[event.currentIndex] = prevItem;
5204
- }
5608
+ moveItemInArray(columns, event.previousIndex, event.currentIndex);
5205
5609
  return {
5206
5610
  ...form,
5207
5611
  slides: form.slides.map((slide) => {
@@ -5558,6 +5962,93 @@ const clearInputInEditFn = (form, inputId) => {
5558
5962
  }
5559
5963
  };
5560
5964
 
5965
+ // ── 1. Top-level runtime keys ──────────────────────────────────────────────────
5966
+ /** Keys that live only in builder UI / runtime state and must never be persisted. */
5967
+ const RUNTIME_KEYS = [
5968
+ 'formIsOpen', // IMultiple — whether nested form is expanded in builder
5969
+ 'temporaryHint', // transient hint shown during editing
5970
+ 'valueUpdatedAt', // runtime timestamp
5971
+ 'status', // runtime status record
5972
+ ];
5973
+ const cleanRuntimeKeys = (input) => {
5974
+ const cleaned = { ...input };
5975
+ for (const key of RUNTIME_KEYS) {
5976
+ delete cleaned[key];
5977
+ }
5978
+ return cleaned;
5979
+ };
5980
+ // ── 2. matOptions — strip runtime-fetched options data ─────────────────────────
5981
+ function hasFetchedOptionsData(options) {
5982
+ if (Array.isArray(options))
5983
+ return options.length > 1;
5984
+ return !!options && typeof options === 'object' && Object.keys(options).length > 1;
5985
+ }
5986
+ /**
5987
+ * If matOptions.options was loaded from a datasource (API / MongoDB),
5988
+ * strip the resolved options array. Only the fetch config should persist —
5989
+ * not the data that was fetched into it at builder interaction time.
5990
+ * Custom options (user-typed) are left untouched.
5991
+ */
5992
+ const cleanMatOptions = (input) => {
5993
+ const matOptions = input[AllFormInputPrimaryKeys.MatOptions];
5994
+ if (!matOptions)
5995
+ return input;
5996
+ const source = matOptions.fetch?.options?.source;
5997
+ const isLoadedFromDatasource = !!source && source !== 'customOptions';
5998
+ if (!isLoadedFromDatasource || !hasFetchedOptionsData(matOptions.options))
5999
+ return input;
6000
+ return {
6001
+ ...input,
6002
+ [AllFormInputPrimaryKeys.MatOptions]: { ...matOptions, options: undefined },
6003
+ };
6004
+ };
6005
+ // ── 3. workflowPickerConfig — strip runtime sampleDocument ────────────────────
6006
+ /**
6007
+ * sampleDocument is assembled at runtime by merging fetched workflow documents
6008
+ * (see elementConfigurationChanged — workflowPickerConfig.workflowId change path).
6009
+ * Only workflowId and column config should persist; the fetched document snapshot must not.
6010
+ */
6011
+ const cleanWorkflowPickerConfig = (input) => {
6012
+ if (!input.workflowPickerConfig?.sampleDocument)
6013
+ return input;
6014
+ return {
6015
+ ...input,
6016
+ workflowPickerConfig: {
6017
+ ...input.workflowPickerConfig,
6018
+ sampleDocument: undefined,
6019
+ },
6020
+ };
6021
+ };
6022
+ // ── Composition ────────────────────────────────────────────────────────────────
6023
+ /**
6024
+ * Ordered list of cleaners applied to every input.
6025
+ * To add a new cleanup rule: implement an InputCleaner and push it here.
6026
+ */
6027
+ const INPUT_CLEANERS = [
6028
+ cleanRuntimeKeys,
6029
+ cleanMatOptions,
6030
+ cleanWorkflowPickerConfig,
6031
+ ];
6032
+ function applyCleaners(input) {
6033
+ return INPUT_CLEANERS.reduce((cleaned, cleaner) => cleaner(cleaned), input);
6034
+ }
6035
+ function cleanInput(input) {
6036
+ const cleaned = applyCleaners(input);
6037
+ // Recursively clean nested inputs (multipleInput children)
6038
+ if (!cleaned.formInputs?.length)
6039
+ return cleaned;
6040
+ return { ...cleaned, formInputs: cleaned.formInputs.map(cleanInput) };
6041
+ }
6042
+ function cleanFormForSave(form) {
6043
+ return {
6044
+ ...form,
6045
+ slides: form.slides.map(slide => ({
6046
+ ...slide,
6047
+ columns: slide.columns.map(cleanInput),
6048
+ })),
6049
+ };
6050
+ }
6051
+
5561
6052
  /**
5562
6053
  * Adds a form input to the form.
5563
6054
  *
@@ -5908,11 +6399,11 @@ function formBuilderStoreActions(store) {
5908
6399
  return;
5909
6400
  const _id = form?._id;
5910
6401
  if (_id) {
5911
- store.effects.updateForm$(of({ form: { ...form.form, formId: _id }, versionNumber: form.__v || 0 }));
6402
+ store.effects.updateForm$(of({ form: cleanFormForSave({ ...form.form, formId: _id }), versionNumber: form.__v || 0 }));
5912
6403
  store.showMessage('Form updated successfully', HintType.SUCCESS);
5913
6404
  }
5914
6405
  else {
5915
- store.effects.createForm$(of(form.form));
6406
+ store.effects.createForm$(of(cleanFormForSave(form.form)));
5916
6407
  store.showMessage('Form saved successfully', HintType.SUCCESS);
5917
6408
  }
5918
6409
  })).subscribe();
@@ -6453,9 +6944,9 @@ class FormBuilderComponent {
6453
6944
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: FormBuilderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6454
6945
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: FormBuilderComponent, isStandalone: true, selector: "app-form-builder", inputs: { formId: "formId" }, providers: [
6455
6946
  FormsStoreService
6456
- ], ngImport: i0, template: "<header style=\"position:fixed;width:100%;left:0px;top:0px\">\r\n <mat-toolbar color=\"primary\">\r\n @if (closeButton) {\r\n <button mat-icon-button [style.color]=\"closeButton.color\" (click)=\"closeButton.onClick()\">\r\n <mat-icon>{{closeButton.icon}}</mat-icon>\r\n </button>\r\n }\r\n\r\n <!-- Navigation group -->\r\n <div class=\"nav-group\">\r\n <button mat-button routerLink=\"/\">Forms</button>\r\n <mat-icon>navigate_next</mat-icon>\r\n </div>\r\n\r\n <!-- Title input with optimized binding -->\r\n @if (selectHasFormId()) {\r\n <input [(ngModel)]=\"titleValue\" class=\"section-title-input\" placeholder=\"Enter Form Title\">\r\n }\r\n\r\n <span class=\"spacer\"></span>\r\n\r\n @defer (on viewport) {\r\n <app-forms-builder-menu />\r\n } @placeholder {\r\n <div style=\"padding: 50px;display:flex;justify-content:center;align-items:center; text-align: center;\">\r\n <mat-spinner diameter=\"20\" />\r\n </div>\r\n\r\n }\r\n\r\n <span class=\"divider\">|</span>\r\n\r\n <!-- Save/Update button with optimized reactive state -->\r\n <button mat-raised-button color=\"accent\" class=\"save-button\" [disabled]=\"!(canSaveForm())\" (click)=\"saveForm()\">\r\n\r\n <mat-icon>\r\n {{(isNewForm()) ? 'save' : 'update'}}\r\n </mat-icon>\r\n\r\n @if (selectFormBuilderIsBusy()) {\r\n {{(isNewForm()) ? '..Saving new form' : '..Updating Form'}}\r\n } @else {\r\n {{(isNewForm()) ? 'Save' : 'Update'}}\r\n }\r\n </button>\r\n\r\n \r\n </mat-toolbar>\r\n</header>\r\n\r\n<!-- Main content with optimized loading -->\r\n@defer (on viewport) {\r\n<div class=\"container\">\r\n <div class=\"middle\">\r\n <br>\r\n @if (selectLoadingForm()) {\r\n <div class=\"loading-container\">\r\n <mat-spinner />\r\n </div>\r\n } @else {\r\n <app-form-section-stepper />\r\n }\r\n <br>\r\n @if ((hasMissingConfigs()) && !(selectLoadingForm())) {\r\n <app-missing-form-configs />\r\n }\r\n <!-- Updated time info -->\r\n @if (!(isNewForm())) {\r\n <div class=\"updated-time\">\r\n <mat-icon>update</mat-icon>\r\n <span>Updated {{ selectFormUpdated() }}</span>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (elementEditorOpen()) {\r\n <app-input-editor style=\"max-width:480px;height:calc(100vh - 76px);\r\n position:sticky;\r\n top:76px;\r\n z-index:1\" cdkDrag cdkDragBoundary=\"container\" class=\"middle editor-container\" />\r\n }\r\n <!-- Missing fields section -->`\r\n\r\n\r\n</div>\r\n}@placeholder {\r\n<div style=\"padding: 50px;display:flex;justify-content:center;align-items:center; text-align: center;\">\r\n <mat-spinner diameter=\"50\" />\r\n</div>\r\n}", styles: [".container{display:flex;width:100%;height:calc(100% - 64px);padding-top:4em}.side{width:100px;background-color:#f8d7da}.middle{flex-grow:1;height:calc(100vh - 68px);overflow:auto;background-color:none}.section-title-input{border:none;background-color:transparent;font-size:.8575em;font-weight:600;color:#fff;padding-top:12px;padding-bottom:12px;outline:none;width:100%;min-width:268px;transition:border-bottom-color .3s ease-in-out}.section-title-input:focus{border-bottom:1px solid #ffffff}.missing-fields{position:fixed;bottom:0}.updated-time{display:flex;color:var(--mat-sidenav-content-text-color, var(--mat-sys-on-background));gap:8px;align-items:center;line-height:normal;font-size:.875em;bottom:0;position:absolute;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);padding:8px;border-radius:4px}.nav-group{display:flex;align-items:center;gap:8px}.save-button{margin-left:8px;min-width:168px}.loading-container{display:flex;height:calc(100% - 150px);justify-content:center;align-items:center}.editor-container{max-width:500px}.divider{margin:0 8px;opacity:.5}app-missing-form-configs{position:absolute;bottom:0;right:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatModulesModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i5.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$4.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }], deferBlockDependencies: [() => [import('./ngx-t-forms-forms-builder-menu.component-Wamzf_sq.mjs').then(m => m.FormsBuilderMenuComponent)], () => [i1$2.CdkDrag, i3.MatIcon, i7.MatProgressSpinner, import('./ngx-t-forms-input-editor.component-D4xHO76K.mjs').then(m => m.InputEditorComponent), import('./ngx-t-forms-form-section-stepper.component-BTkcSjg7.mjs').then(m => m.FormSectionStepperComponent), import('./ngx-t-forms-missing-form-configs.component-BRmnwAK6.mjs').then(m => m.MissingFormConfigsComponent)]] }); }
6947
+ ], ngImport: i0, template: "<header style=\"position:fixed;width:100%;left:0px;top:0px\">\r\n <mat-toolbar color=\"primary\">\r\n @if (closeButton) {\r\n <button mat-icon-button [style.color]=\"closeButton.color\" (click)=\"closeButton.onClick()\">\r\n <mat-icon>{{closeButton.icon}}</mat-icon>\r\n </button>\r\n }\r\n\r\n <!-- Navigation group -->\r\n <div class=\"nav-group\">\r\n <button mat-button routerLink=\"/\">Forms</button>\r\n <mat-icon>navigate_next</mat-icon>\r\n </div>\r\n\r\n <!-- Title input with optimized binding -->\r\n @if (selectHasFormId()) {\r\n <input [(ngModel)]=\"titleValue\" class=\"section-title-input\" placeholder=\"Enter Form Title\">\r\n }\r\n\r\n <span class=\"spacer\"></span>\r\n\r\n @defer (on viewport) {\r\n <app-forms-builder-menu />\r\n } @placeholder {\r\n <div style=\"padding: 50px;display:flex;justify-content:center;align-items:center; text-align: center;\">\r\n <mat-spinner diameter=\"20\" />\r\n </div>\r\n\r\n }\r\n\r\n <span class=\"divider\">|</span>\r\n\r\n <!-- Save/Update button with optimized reactive state -->\r\n <button mat-raised-button color=\"accent\" class=\"save-button\" [disabled]=\"!(canSaveForm())\" (click)=\"saveForm()\">\r\n\r\n <mat-icon>\r\n {{(isNewForm()) ? 'save' : 'update'}}\r\n </mat-icon>\r\n\r\n @if (selectFormBuilderIsBusy()) {\r\n {{(isNewForm()) ? '..Saving new form' : '..Updating Form'}}\r\n } @else {\r\n {{(isNewForm()) ? 'Save' : 'Update'}}\r\n }\r\n </button>\r\n\r\n \r\n </mat-toolbar>\r\n</header>\r\n\r\n<!-- Main content with optimized loading -->\r\n@defer (on viewport) {\r\n<div class=\"container\">\r\n <div class=\"middle\">\r\n <br>\r\n @if (selectLoadingForm()) {\r\n <div class=\"loading-container\">\r\n <mat-spinner />\r\n </div>\r\n } @else {\r\n <app-form-section-stepper />\r\n }\r\n <br>\r\n @if ((hasMissingConfigs()) && !(selectLoadingForm())) {\r\n <app-missing-form-configs />\r\n }\r\n <!-- Updated time info -->\r\n @if (!(isNewForm())) {\r\n <div class=\"updated-time\">\r\n <mat-icon>update</mat-icon>\r\n <span>Updated {{ selectFormUpdated() }}</span>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (elementEditorOpen()) {\r\n <app-input-editor style=\"max-width:480px;height:calc(100vh - 76px);\r\n position:sticky;\r\n top:76px;\r\n z-index:1\" cdkDrag cdkDragBoundary=\"container\" class=\"middle editor-container\" />\r\n }\r\n <!-- Missing fields section -->`\r\n\r\n\r\n</div>\r\n}@placeholder {\r\n<div style=\"padding: 50px;display:flex;justify-content:center;align-items:center; text-align: center;\">\r\n <mat-spinner diameter=\"50\" />\r\n</div>\r\n}", styles: [".container{display:flex;width:100%;height:calc(100% - 64px);padding-top:4em}.side{width:100px;background-color:#f8d7da}.middle{flex-grow:1;height:calc(100vh - 68px);overflow:auto;background-color:none}.section-title-input{border:none;background-color:transparent;font-size:.8575em;font-weight:600;color:#fff;padding-top:12px;padding-bottom:12px;outline:none;width:100%;min-width:268px;transition:border-bottom-color .3s ease-in-out}.section-title-input:focus{border-bottom:1px solid #ffffff}.missing-fields{position:fixed;bottom:0}.updated-time{display:flex;color:var(--mat-sidenav-content-text-color, var(--mat-sys-on-background));gap:8px;align-items:center;line-height:normal;font-size:.875em;bottom:0;position:absolute;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);padding:8px;border-radius:4px}.nav-group{display:flex;align-items:center;gap:8px}.save-button{margin-left:8px;min-width:168px}.loading-container{display:flex;height:calc(100% - 150px);justify-content:center;align-items:center}.editor-container{max-width:500px}.divider{margin:0 8px;opacity:.5}app-missing-form-configs{position:absolute;bottom:0;right:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatModulesModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i5.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$4.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }], deferBlockDependencies: [() => [import('./ngx-t-forms-forms-builder-menu.component-UWo_dyVt.mjs').then(m => m.FormsBuilderMenuComponent)], () => [i1$2.CdkDrag, i3.MatIcon, i7.MatProgressSpinner, import('./ngx-t-forms-input-editor.component-B_kkOoEO.mjs').then(m => m.InputEditorComponent), import('./ngx-t-forms-form-section-stepper.component-x_83iAWA.mjs').then(m => m.FormSectionStepperComponent), import('./ngx-t-forms-missing-form-configs.component-DPNNyKkt.mjs').then(m => m.MissingFormConfigsComponent)]] }); }
6457
6948
  }
6458
- i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "21.1.5", ngImport: i0, type: FormBuilderComponent, resolveDeferredDeps: () => [import('./ngx-t-forms-forms-builder-menu.component-Wamzf_sq.mjs').then(m => m.FormsBuilderMenuComponent), import('./ngx-t-forms-input-editor.component-D4xHO76K.mjs').then(m => m.InputEditorComponent), import('./ngx-t-forms-form-section-stepper.component-BTkcSjg7.mjs').then(m => m.FormSectionStepperComponent), import('./ngx-t-forms-missing-form-configs.component-BRmnwAK6.mjs').then(m => m.MissingFormConfigsComponent)], resolveMetadata: (FormsBuilderMenuComponent, InputEditorComponent, FormSectionStepperComponent, MissingFormConfigsComponent) => ({ decorators: [{
6949
+ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "21.1.5", ngImport: i0, type: FormBuilderComponent, resolveDeferredDeps: () => [import('./ngx-t-forms-forms-builder-menu.component-UWo_dyVt.mjs').then(m => m.FormsBuilderMenuComponent), import('./ngx-t-forms-input-editor.component-B_kkOoEO.mjs').then(m => m.InputEditorComponent), import('./ngx-t-forms-form-section-stepper.component-x_83iAWA.mjs').then(m => m.FormSectionStepperComponent), import('./ngx-t-forms-missing-form-configs.component-DPNNyKkt.mjs').then(m => m.MissingFormConfigsComponent)], resolveMetadata: (FormsBuilderMenuComponent, InputEditorComponent, FormSectionStepperComponent, MissingFormConfigsComponent) => ({ decorators: [{
6459
6950
  type: Component,
6460
6951
  args: [{ selector: 'app-form-builder', standalone: true, imports: [CommonModule,
6461
6952
  MatModulesModule,
@@ -6561,8 +7052,11 @@ function createFuzzyRegExp(query) {
6561
7052
  }
6562
7053
  /**
6563
7054
  * Performs the fuzzy search against a target string.
7055
+ * Returns false for blank queries instead of matching everything.
6564
7056
  */
6565
7057
  function fuzzySearch(query, text) {
7058
+ if (!query?.trim())
7059
+ return false;
6566
7060
  const regex = createFuzzyRegExp(query);
6567
7061
  return regex.test(text);
6568
7062
  }
@@ -8308,9 +8802,9 @@ class TDynamicDataEditComponent {
8308
8802
  }
8309
8803
  }
8310
8804
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: TDynamicDataEditComponent, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
8311
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: TDynamicDataEditComponent, isStandalone: true, selector: "lib-t-dynamic-data-edit", inputs: { editorConfig: "editorConfig", formInputs: "formInputs", data: "data", validationErrors: "validationErrors" }, outputs: { valueChange: "valueChange", blur: "blur" }, ngImport: i0, template: "@defer {\r\n<ng-container *ngIf=\"( vm$ |async) as vm\">\r\n\r\n <mat-form-field appearance=\"outline\" [color]=\"((validationErrors)||[]||[]).length>0 ? 'warn' : 'primary'\"\r\n [floatLabel]=\"'always'\" [subscriptSizing]=\"'dynamic'\" [hintLabel]=\"vm.editorConfigValue?.hint||''\">\r\n <mat-label> {{ (vm. editorConfigValue)?.label }} </mat-label>\r\n @switch ((vm. editorConfigValue)?.editType) {\r\n @default {\r\n <lib-input-custom \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [inputConfig]=\"vm.inputConfig\"\r\n [placeholder]=\"(vm. editorConfigValue)?.placeholder ||'Enter value'\"\r\n [required]=\"!!(vm. editorConfigValue)?.required\"\r\n [disabled]=\"!!(vm.disabled)\"\r\n [ngModel]=\"(vm.value)\"\r\n (blur)=\"elementBlur($event)\"\r\n (input)=\"inputChange($event)\" ></lib-input-custom>\r\n \r\n\r\n }\r\n @case ( elementEditorTypes.Toggle) {\r\n <lib-mat-slider-toggle-editor\r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [name]=\"((vm. editorConfigValue)?.name||'') \"\r\n [label]=\"((vm. editorConfigValue)?.label||'')\" [disabled]=\"(vm.disabled)||false\"\r\n (valueChange)=\"valueChanged(!!$event)\" [value]=\"(vm.value)\" [errors]=\"(validationErrors)||[]\">\r\n </lib-mat-slider-toggle-editor>\r\n\r\n }\r\n\r\n @case (elementEditorTypes.Range) {\r\n\r\n\r\n <lib-mat-slider-editor \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [format]=\"( vm.editorConfigValue)?.format \" [formatLabel]=\" formatLabel\"\r\n [disabled]=\"(vm.disabled)||false\" [max]=\"( vm.editorConfigValue)?.max || 100\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" [min]=\"( vm.editorConfigValue)?.min || 0\"\r\n (valueChange)=\"inputChange($event)\" [step]=\"( vm.editorConfigValue)?.step || 1\"\r\n tickInterval=\"( vm.editorConfigValue)?.step || 1\">\r\n\r\n\r\n </lib-mat-slider-editor>\r\n\r\n\r\n\r\n }\r\n\r\n @case (elementEditorTypes.ChipSelect) {\r\n <lib-mat-chip-list-editor \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [disabled]=\"(vm.disabled)||false\"\r\n [options]=\"(vm.editorConfigValue)?.options || vm.dataOptions\"\r\n [required]=\"!!( vm.editorConfigValue)?.required\" [value]=\"(vm.value)\" [errors]=\"(validationErrors)||[]\"\r\n (valueChange)=\" valueChanged($event)\"></lib-mat-chip-list-editor>\r\n\r\n\r\n }\r\n\r\n @case (elementEditorTypes.OptionSelect) {\r\n\r\n <mat-select \r\n \r\n [value]=\"(vm.value)\" (selectionChange)=\"valueChanged($event.value)\"\r\n [disabled]=\"(vm.disabled)||false\">\r\n @for(option of ( vm.editorConfigValue)?.options || vm.dataOptions;track option.value){\r\n <mat-option [value]=\"option.value\">{{option.label}}</mat-option>\r\n }\r\n </mat-select>\r\n\r\n }\r\n\r\n @case (elementEditorTypes.RichTextEditor) {\r\n <lib-editor-js-input \r\n \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [value]=\"(vm.value)\" (valueChanged)=\"valueChanged($event)\"\r\n [disabled]=\"(vm.disabled)||false\" [inputConfig]=\"data\">\r\n </lib-editor-js-input>\r\n }\r\n\r\n\r\n @case (elementEditorTypes.SelectionOptions) {\r\n\r\n <app-selection-options-editor \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [errors]=\"(validationErrors)||[]\" [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\"\r\n [options]=\"(vm.value) || []\" (valueChanged)=\"valueChanged($event)\"></app-selection-options-editor>\r\n }\r\n\r\n @case (\r\n elementEditorTypes.ApiCall) {\r\n\r\n <lib-rest-api-call-setup \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [postmanCollectionConfig]=\"(vm.editorConfigValue)?.postmanCollectionConfig\"\r\n [httpGetDataFunction]=\"(vm.editorConfigValue)?.httpGetDataFunction\" [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" (valueChanged)=\"valueChanged($event)\">\r\n\r\n </lib-rest-api-call-setup>\r\n\r\n }\r\n\r\n @case (elementEditorTypes.MongoPipelineBuilder) {\r\n\r\n <app-pipeline-generator [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" [getWorkflowOptions]=\"getWorkflowOptions$\"\r\n (valueChanged)=\"valueChanged($event)\"></app-pipeline-generator>\r\n\r\n }\r\n @case (elementEditorTypes.MapMatOptionsKeys) {\r\n <lib-map-mat-options-keys [disabled]=\"(vm.disabled)||false\"\r\n [value]=\"(vm.value)\"\r\n [formInputs]=\"formInputs || []\"\r\n [mapToData]=\"vm.dataOptions\"\r\n [errors]=\"(validationErrors)||[]\"\r\n (valueChanged)=\"valueChanged($event)\">\r\n </lib-map-mat-options-keys>\r\n <pre>\r\n {{vm.inputConfig.matOptions|json}}\r\n </pre>\r\n \r\n }\r\n @case (elementEditorTypes.ApiValueAccessRules) {\r\n\r\n\r\n\r\n <app-api-value-access-rules [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" \r\n [formInputs]=\"formInputs ||[]\"\r\n \r\n [postmanCollectionConfig]=\"(vm.editorConfigValue)?.postmanCollectionConfig\" [mapToData]=\"vm.dataOptions\"\r\n (valueChanged)=\"valueChanged($event)\">\r\n </app-api-value-access-rules>\r\n\r\n }\r\n\r\n @case (elementEditorTypes.FormInputSelector)\r\n {\r\n\r\n <lib-form-input-selector [id]=\"((vm.editorConfigValue)?.id)\" [disabled]=\"(vm.disabled)||false\" [formInputs]=\"formInputs ||[]\"\r\n [errors]=\"(validationErrors)||[]\" [value]=\"(vm.value) || []\" (change)=\"valueChanged($event)\">\r\n </lib-form-input-selector>\r\n }\r\n\r\n @case (\r\n elementEditorTypes.RequiredInputs\r\n ){\r\n\r\n <app-required-inputs [formInputs]=\"formInputs ||[]\" [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" (valueChanged)=\"valueChanged($event)\">\r\n </app-required-inputs>\r\n }\r\n\r\n @case(elementEditorTypes.CalculatedFieldRules){\r\n\r\n <app-calculated-field-rules [formInputs]=\"formInputs ||[]\" [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" (valueChanged)=\"valueChanged($event)\"\r\n [mapToData]=\"vm.dataOptions\"></app-calculated-field-rules>\r\n }\r\n\r\n @case(elementEditorTypes.Validators){\r\n\r\n <app-validators-config [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" (valueChanged)=\"valueChanged($event)\" [formInputs]=\"formInputs ||[]\"\r\n [mapToData]=\"vm.dataOptions\">\r\n </app-validators-config>\r\n\r\n }\r\n @case(elementEditorTypes.ConfigMscoaSegments){\r\n\r\n <app-mscoa-segment-config [disabled]=\"(vm.disabled)||false\" [id]=\"((vm.editorConfigValue)?.id)\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" [getMscoaTree]=\"getMscoaTree$\" [dataValue]=\"vm.dataValue\"\r\n [isCashSegmentConfig]=\"vm.editorConfigValue?.deepBind?.at(-1) === 'cashSegments'\"\r\n [showAllSegments]=\"vm.dataOptions\" (valueChanged)=\"valueChanged($event)\"></app-mscoa-segment-config>\r\n }\r\n @case(elementEditorTypes.ConfigMscoaAdditionalInputs){\r\n\r\n <app-config-mscoa-additional-inputs [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" [getMscoaTree]=\"getMscoaTree$\" [mapToData]=\"vm.dataOptions\">\r\n (valueChanged)=\"valueChanged($event)\">\r\n </app-config-mscoa-additional-inputs>\r\n\r\n }\r\n @case (elementEditorTypes.ChipOptionsCreator) {\r\n <lib-chip-options-creator-editor [id]=\"((vm.editorConfigValue)?.id)\" [disabled]=\"(vm.disabled)||false\" (valueChange)=\"valueChanged($event)\"\r\n [value]=\"(vm.value)\" [errors]=\"(validationErrors)||[]\">\r\n\r\n </lib-chip-options-creator-editor>\r\n\r\n }\r\n @case (elementEditorTypes.DataSourcePicker) {\r\n <lib-data-source-picker [id]=\"((vm.editorConfigValue)?.id)\" [disabled]=\"(vm.disabled)||false\" [editorConfig]=\"vm. editorConfigValue\"\r\n (valueChange)=\"valueChanged($event)\" [formInputs]=\"formInputs ||[]\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\">\r\n </lib-data-source-picker>\r\n }\r\n @case (elementEditorTypes.ListLabelConfigEditor) {\r\n <lib-document-list-label-config-editor \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [formInputs]=\"formInputs ||[]\"\r\n [disabled]=\"(vm.disabled)||false\" \r\n [editorConfig]=\"vm. editorConfigValue\"\r\n (valueChange)=\"valueChanged($event)\" \r\n [value]=\"(vm.value)\" [mapToData]=\"vm.dataOptions\"\r\n [errors]=\"(validationErrors)||[]\">\r\n\r\n </lib-document-list-label-config-editor>\r\n }\r\n @case(\r\n elementEditorTypes.WorkflowPicker\r\n ){\r\n <lib-t-workflow-picker [id]=\"((vm.editorConfigValue)?.id)\" [disabled]=\"(vm.disabled)||false\" [getWorkflowOptions]=\"getWorkflowOptions$\"\r\n (valueChanged)=\"valueChanged($event)\" [value]=\"(vm.value)\" [errors]=\"(validationErrors)||[]\"\r\n [value]=\"(vm.value)\"></lib-t-workflow-picker>\r\n }\r\n @case (\r\n elementEditorTypes.RecordListManager\r\n ) {\r\n <lib-record-list-manager \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [editorConfig]=\"vm.editorConfigValue\" [disabled]=\"(vm.disabled)||false\"\r\n [formInputs]=\"formInputs ||[]\" [mapToData]=\"vm.dataOptions\" (valueChange)=\"valueChanged($event)\"\r\n \r\n [value]=\"(vm.value)\" [errors]=\"(validationErrors)||[]\"></lib-record-list-manager>\r\n }\r\n }\r\n\r\n <button [matTooltip]=\"blurFunctionTooltip((vm.editorConfigValue)?.blurHandle)\" *ngIf=\"(vm.inputHasBlurFunction)\"\r\n [disabled]=\"(vm.disabled)\" [color]=\"blurOff?'':'primary'\" (click)=\"blurOff=!blurOff\" matSuffix\r\n mat-icon-button>\r\n <mat-icon>{{\r\n blurOff?'blur_off':'blur_on'\r\n }}\r\n\r\n\r\n </mat-icon>\r\n </button>\r\n </mat-form-field>\r\n\r\n @if (!(vm.value) && (vm. editorConfigValue)?.required ) {\r\n <mat-error>\r\n {{ (vm. editorConfigValue)?.label }}'s is required\r\n </mat-error>}\r\n\r\n <mat-error style=\" font-size: 0.75em;\r\n margin-left: 14px;\r\n \" *ngFor=\"let error of (validationErrors)||[]\">\r\n\r\n {{error.message}}</mat-error>\r\n\r\n</ng-container>\r\n\r\n}@error {\r\n<mat-card>\r\n <mat-card-content>\r\n\r\n <span>\r\n Failed to load form inputs\r\n </span>\r\n </mat-card-content>\r\n</mat-card>\r\n}\r\n\r\n\r\n\r\n<!-- - \r\n `TableConfigSetup`\r\n- `ConditionalInputConfig`\r\n- `MatrixTable`-->", styles: [".showItemValue{opacity:.6}mat-form-field{width:100%}mat-slider{width:100%}.range{display:flex;align-items:center}label{line-height:normal;margin-top:12px;font-weight:500;font-size:.75em;color:var(--mdc-filled-text-field-focus-label-text-color, var(--mat-app-primary));display:flex;justify-content:space-between;align-items:center}.elementInfo{display:flex;align-items:center;justify-content:center;padding:0;height:24px;width:24px}.infoIcon{font-size:1em;height:16px;width:16px}.toggle-label{margin-left:5px;align-items:center;display:flex;font-weight:500;line-height:normal;justify-content:space-between;color:var(--mdc-filled-text-field-focus-label-text-color, var(--mat-app-primary))}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatModulesModule }, { kind: "component", type: i3$3.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i3$3.MatCardContent, selector: "mat-card-content" }, { kind: "ngmodule", type: FormsModule }], deferBlockDependencies: [() => [i2$1.NgForOf, i2$1.NgIf, import('./ngx-t-forms-selection-options-editor.component-Be3QAG_L.mjs').then(m => m.SelectionOptionsEditorComponent), import('./ngx-t-forms-form-input-selector.component-B2QEnvkq.mjs').then(m => m.FormInputSelectorComponent), import('./ngx-t-forms-rest-api-call-setup.component-CY-JSkGs.mjs').then(m => m.RestApiCallSetupComponent), Promise.resolve().then(function () { return apiValueAccessRules_component; }).then(m => m.ApiValueAccessRulesComponent), import('./ngx-t-forms-required-inputs.component-CSIJvSHq.mjs').then(m => m.RequiredInputsComponent), import('./ngx-t-forms-pipeline-generator.component-DBJEyCbd.mjs').then(m => m.PipelineGeneratorComponent), import('./ngx-t-forms-calculated-field-rules.component-D-SBMdYg.mjs').then(m => m.CalculatedFieldRulesComponent), import('./ngx-t-forms-validators-config.component-B3j9Dmgu.mjs').then(m => m.ValidatorsConfigComponent), import('./ngx-t-forms-config-mscoa-additional-inputs.component-DFdAVWTg.mjs').then(m => m.ConfigMscoaAdditionalInputsComponent), import('./ngx-t-forms-mat-slider-editor.component-DZ4TenrI.mjs').then(m => m.MatSliderEditorComponent), import('./ngx-t-forms-mscoa-segment-config.component-B6IF8kGg.mjs').then(m => m.MscoaSegmentConfigComponent), import('./ngx-t-forms-mat-slider-toggle-editor.component-DPyBYE4p.mjs').then(m => m.MatSliderToggleEditorComponent), import('./ngx-t-forms-mat-chip-list-editor.component-DmTyO9Wi.mjs').then(m => m.MatChipListEditorComponent), i2$2.MatOption, i2.MatIconButton, i3.MatIcon, i3$1.MatFormField, i3$1.MatLabel, i3$1.MatError, i3$1.MatSuffix, i3$1.MatSelect, i4.MatTooltip, import('./ngx-t-forms-chip-options-creator-editor.component-1cpszpPN.mjs').then(m => m.ChipOptionsCreatorEditorComponent), import('./ngx-t-forms-data-source-picker.component-DxORinAD.mjs').then(m => m.DataSourcePickerComponent), import('./ngx-t-forms-document-list-label-config-editor.component-DcWS1txl.mjs').then(m => m.DocumentListLabelConfigEditorComponent), import('./ngx-t-forms-t-workflow-picker.component-a4f1r8gH.mjs').then(m => m.TWorkflowPickerComponent), Promise.resolve().then(function () { return editorJsInput_component; }).then(m => m.EditorJsInputComponent), import('./ngx-t-forms-record-list-manager.component-Dgs9lNSr.mjs').then(m => m.RecordListManagerComponent), Promise.resolve().then(function () { return inputCustom_component; }).then(m => m.InputCustomComponent), i1$3.NgControlStatus, i1$3.RequiredValidator, i1$3.NgModel, import('./ngx-t-forms-map-mat-options-keys-CbdW82su.mjs').then(m => m.MapMatOptionsKeys), i2$1.AsyncPipe, i2$1.JsonPipe]] }); }
8805
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: TDynamicDataEditComponent, isStandalone: true, selector: "lib-t-dynamic-data-edit", inputs: { editorConfig: "editorConfig", formInputs: "formInputs", data: "data", validationErrors: "validationErrors" }, outputs: { valueChange: "valueChange", blur: "blur" }, ngImport: i0, template: "@defer {\r\n<ng-container *ngIf=\"( vm$ |async) as vm\">\r\n\r\n <mat-form-field appearance=\"outline\" [color]=\"((validationErrors)||[]||[]).length>0 ? 'warn' : 'primary'\"\r\n [floatLabel]=\"'always'\" [subscriptSizing]=\"'dynamic'\" [hintLabel]=\"vm.editorConfigValue?.hint||''\">\r\n <mat-label> {{ (vm. editorConfigValue)?.label }} </mat-label>\r\n @switch ((vm. editorConfigValue)?.editType) {\r\n @default {\r\n <lib-input-custom \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [inputConfig]=\"vm.inputConfig\"\r\n [placeholder]=\"(vm. editorConfigValue)?.placeholder ||'Enter value'\"\r\n [required]=\"!!(vm. editorConfigValue)?.required\"\r\n [disabled]=\"!!(vm.disabled)\"\r\n [ngModel]=\"(vm.value)\"\r\n (blur)=\"elementBlur($event)\"\r\n (input)=\"inputChange($event)\" ></lib-input-custom>\r\n \r\n\r\n }\r\n @case ( elementEditorTypes.Toggle) {\r\n <lib-mat-slider-toggle-editor\r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [name]=\"((vm. editorConfigValue)?.name||'') \"\r\n [label]=\"((vm. editorConfigValue)?.label||'')\" [disabled]=\"(vm.disabled)||false\"\r\n (valueChange)=\"valueChanged(!!$event)\" [value]=\"(vm.value)\" [errors]=\"(validationErrors)||[]\">\r\n </lib-mat-slider-toggle-editor>\r\n\r\n }\r\n\r\n @case (elementEditorTypes.Range) {\r\n\r\n\r\n <lib-mat-slider-editor \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [format]=\"( vm.editorConfigValue)?.format \" [formatLabel]=\" formatLabel\"\r\n [disabled]=\"(vm.disabled)||false\" [max]=\"( vm.editorConfigValue)?.max || 100\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" [min]=\"( vm.editorConfigValue)?.min || 0\"\r\n (valueChange)=\"inputChange($event)\" [step]=\"( vm.editorConfigValue)?.step || 1\"\r\n tickInterval=\"( vm.editorConfigValue)?.step || 1\">\r\n\r\n\r\n </lib-mat-slider-editor>\r\n\r\n\r\n\r\n }\r\n\r\n @case (elementEditorTypes.ChipSelect) {\r\n \r\n <lib-mat-chip-list-editor \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [multiple]=\"!!vm.editorConfigValue?.multipleSelection\"\r\n [disabled]=\"(vm.disabled)||false\"\r\n [options]=\"(vm.editorConfigValue)?.options || vm.dataOptions\"\r\n [required]=\"!!( vm.editorConfigValue)?.required\" [value]=\"(vm.value)\" \r\n [errors]=\"(validationErrors)||[]\"\r\n (valueChange)=\" valueChanged($event)\"></lib-mat-chip-list-editor>\r\n\r\n\r\n }\r\n\r\n @case (elementEditorTypes.OptionSelect) {\r\n\r\n <mat-select \r\n \r\n [value]=\"(vm.value)\" (selectionChange)=\"valueChanged($event.value)\"\r\n [disabled]=\"(vm.disabled)||false\">\r\n @for(option of ( vm.editorConfigValue)?.options || vm.dataOptions;track option.value){\r\n <mat-option [value]=\"option.value\">{{option.label}}</mat-option>\r\n }\r\n </mat-select>\r\n\r\n }\r\n\r\n @case (elementEditorTypes.RichTextEditor) {\r\n <lib-editor-js-input \r\n \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [value]=\"(vm.value)\" (valueChanged)=\"valueChanged($event)\"\r\n [disabled]=\"(vm.disabled)||false\" [inputConfig]=\"data\">\r\n </lib-editor-js-input>\r\n }\r\n\r\n\r\n @case (elementEditorTypes.SelectionOptions) {\r\n\r\n <app-selection-options-editor \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [errors]=\"(validationErrors)||[]\" [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\"\r\n [options]=\"(vm.value) || []\" (valueChanged)=\"valueChanged($event)\"></app-selection-options-editor>\r\n }\r\n\r\n @case (\r\n elementEditorTypes.ApiCall) {\r\n\r\n <lib-rest-api-call-setup \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [postmanCollectionConfig]=\"(vm.editorConfigValue)?.postmanCollectionConfig\"\r\n [httpGetDataFunction]=\"(vm.editorConfigValue)?.httpGetDataFunction\" [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" (valueChanged)=\"valueChanged($event)\">\r\n\r\n </lib-rest-api-call-setup>\r\n\r\n }\r\n\r\n @case (elementEditorTypes.MongoPipelineBuilder) {\r\n\r\n <app-pipeline-generator [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" [getWorkflowOptions]=\"getWorkflowOptions$\"\r\n (valueChanged)=\"valueChanged($event)\"></app-pipeline-generator>\r\n\r\n }\r\n @case (elementEditorTypes.MapMatOptionsKeys) {\r\n <lib-map-mat-options-keys [disabled]=\"(vm.disabled)||false\"\r\n [value]=\"(vm.value)\"\r\n [formInputs]=\"formInputs || []\"\r\n [mapToData]=\"vm.dataOptions\"\r\n [errors]=\"(validationErrors)||[]\"\r\n (valueChanged)=\"valueChanged($event)\">\r\n </lib-map-mat-options-keys>\r\n <pre>\r\n {{vm.inputConfig.matOptions|json}}\r\n </pre>\r\n \r\n }\r\n @case (elementEditorTypes.ApiValueAccessRules) {\r\n\r\n\r\n\r\n <app-api-value-access-rules [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" \r\n [formInputs]=\"formInputs ||[]\"\r\n \r\n [postmanCollectionConfig]=\"(vm.editorConfigValue)?.postmanCollectionConfig\" [mapToData]=\"vm.dataOptions\"\r\n (valueChanged)=\"valueChanged($event)\">\r\n </app-api-value-access-rules>\r\n\r\n }\r\n\r\n @case (elementEditorTypes.FormInputSelector)\r\n {\r\n\r\n <lib-form-input-selector [id]=\"((vm.editorConfigValue)?.id)\" [disabled]=\"(vm.disabled)||false\" [formInputs]=\"formInputs ||[]\"\r\n [errors]=\"(validationErrors)||[]\" [value]=\"(vm.value) || []\" (change)=\"valueChanged($event)\">\r\n </lib-form-input-selector>\r\n }\r\n\r\n @case (\r\n elementEditorTypes.RequiredInputs\r\n ){\r\n\r\n <app-required-inputs [formInputs]=\"formInputs ||[]\" [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" (valueChanged)=\"valueChanged($event)\">\r\n </app-required-inputs>\r\n }\r\n\r\n @case(elementEditorTypes.CalculatedFieldRules){\r\n\r\n <app-calculated-field-rules [formInputs]=\"formInputs ||[]\" [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" (valueChanged)=\"valueChanged($event)\"\r\n [mapToData]=\"vm.dataOptions\"></app-calculated-field-rules>\r\n }\r\n\r\n @case(elementEditorTypes.Validators){\r\n\r\n <app-validators-config [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" (valueChanged)=\"valueChanged($event)\" [formInputs]=\"formInputs ||[]\"\r\n [mapToData]=\"vm.dataOptions\">\r\n </app-validators-config>\r\n\r\n }\r\n @case(elementEditorTypes.ConfigMscoaSegments){\r\n\r\n <app-mscoa-segment-config [disabled]=\"(vm.disabled)||false\" [id]=\"((vm.editorConfigValue)?.id)\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" [getMscoaTree]=\"getMscoaTree$\" [dataValue]=\"vm.dataValue\"\r\n [isCashSegmentConfig]=\"vm.editorConfigValue?.deepBind?.at(-1) === 'cashSegments'\"\r\n [showAllSegments]=\"vm.dataOptions\" (valueChanged)=\"valueChanged($event)\"></app-mscoa-segment-config>\r\n }\r\n @case(elementEditorTypes.ConfigMscoaAdditionalInputs){\r\n\r\n <app-config-mscoa-additional-inputs [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" [getMscoaTree]=\"getMscoaTree$\" [mapToData]=\"vm.dataOptions\">\r\n (valueChanged)=\"valueChanged($event)\">\r\n </app-config-mscoa-additional-inputs>\r\n\r\n }\r\n @case (elementEditorTypes.ChipOptionsCreator) {\r\n <lib-chip-options-creator-editor [id]=\"((vm.editorConfigValue)?.id)\" [disabled]=\"(vm.disabled)||false\" (valueChange)=\"valueChanged($event)\"\r\n [value]=\"(vm.value)\" [errors]=\"(validationErrors)||[]\">\r\n\r\n </lib-chip-options-creator-editor>\r\n\r\n }\r\n @case (elementEditorTypes.DataSourcePicker) {\r\n <lib-data-source-picker [id]=\"((vm.editorConfigValue)?.id)\" [disabled]=\"(vm.disabled)||false\" [editorConfig]=\"vm. editorConfigValue\"\r\n (valueChange)=\"valueChanged($event)\" [formInputs]=\"formInputs ||[]\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\">\r\n </lib-data-source-picker>\r\n }\r\n @case (elementEditorTypes.ListLabelConfigEditor) {\r\n <lib-document-list-label-config-editor \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [formInputs]=\"formInputs ||[]\"\r\n [disabled]=\"(vm.disabled)||false\" \r\n [editorConfig]=\"vm. editorConfigValue\"\r\n (valueChange)=\"valueChanged($event)\" \r\n [value]=\"(vm.value)\" [mapToData]=\"vm.dataOptions\"\r\n [errors]=\"(validationErrors)||[]\">\r\n\r\n </lib-document-list-label-config-editor>\r\n }\r\n @case(\r\n elementEditorTypes.WorkflowPicker\r\n ){\r\n <lib-t-workflow-picker [id]=\"((vm.editorConfigValue)?.id)\" [disabled]=\"(vm.disabled)||false\" [getWorkflowOptions]=\"getWorkflowOptions$\"\r\n (valueChanged)=\"valueChanged($event)\" [value]=\"(vm.value)\" [errors]=\"(validationErrors)||[]\"\r\n [value]=\"(vm.value)\"></lib-t-workflow-picker>\r\n }\r\n @case (\r\n elementEditorTypes.RecordListManager\r\n ) {\r\n <lib-record-list-manager \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [editorConfig]=\"vm.editorConfigValue\" [disabled]=\"(vm.disabled)||false\"\r\n [formInputs]=\"formInputs ||[]\" [mapToData]=\"vm.dataOptions\" (valueChange)=\"valueChanged($event)\"\r\n \r\n [value]=\"(vm.value)\" [errors]=\"(validationErrors)||[]\"></lib-record-list-manager>\r\n }\r\n }\r\n\r\n <button [matTooltip]=\"blurFunctionTooltip((vm.editorConfigValue)?.blurHandle)\" *ngIf=\"(vm.inputHasBlurFunction)\"\r\n [disabled]=\"(vm.disabled)\" [color]=\"blurOff?'':'primary'\" (click)=\"blurOff=!blurOff\" matSuffix\r\n mat-icon-button>\r\n <mat-icon>{{\r\n blurOff?'blur_off':'blur_on'\r\n }}\r\n\r\n\r\n </mat-icon>\r\n </button>\r\n </mat-form-field>\r\n\r\n @if (!(vm.value) && (vm. editorConfigValue)?.required ) {\r\n <mat-error>\r\n {{ (vm. editorConfigValue)?.label }}'s is required\r\n </mat-error>}\r\n\r\n <mat-error style=\" font-size: 0.75em;\r\n margin-left: 14px;\r\n \" *ngFor=\"let error of (validationErrors)||[]\">\r\n\r\n {{error.message}}</mat-error>\r\n\r\n</ng-container>\r\n\r\n}@error {\r\n<mat-card>\r\n <mat-card-content>\r\n\r\n <span>\r\n Failed to load form inputs\r\n </span>\r\n </mat-card-content>\r\n</mat-card>\r\n}\r\n\r\n\r\n\r\n<!-- - \r\n `TableConfigSetup`\r\n- `ConditionalInputConfig`\r\n- `MatrixTable`-->", styles: [".showItemValue{opacity:.6}mat-form-field{width:100%}mat-slider{width:100%}.range{display:flex;align-items:center}label{line-height:normal;margin-top:12px;font-weight:500;font-size:.75em;color:var(--mdc-filled-text-field-focus-label-text-color, var(--mat-app-primary));display:flex;justify-content:space-between;align-items:center}.elementInfo{display:flex;align-items:center;justify-content:center;padding:0;height:24px;width:24px}.infoIcon{font-size:1em;height:16px;width:16px}.toggle-label{margin-left:5px;align-items:center;display:flex;font-weight:500;line-height:normal;justify-content:space-between;color:var(--mdc-filled-text-field-focus-label-text-color, var(--mat-app-primary))}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatModulesModule }, { kind: "component", type: i3$3.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i3$3.MatCardContent, selector: "mat-card-content" }, { kind: "ngmodule", type: FormsModule }], deferBlockDependencies: [() => [i2$1.NgForOf, i2$1.NgIf, import('./ngx-t-forms-selection-options-editor.component-B4cEGWrK.mjs').then(m => m.SelectionOptionsEditorComponent), import('./ngx-t-forms-form-input-selector.component-DV4Sts9F.mjs').then(m => m.FormInputSelectorComponent), import('./ngx-t-forms-rest-api-call-setup.component-CWeIUKLz.mjs').then(m => m.RestApiCallSetupComponent), Promise.resolve().then(function () { return apiValueAccessRules_component; }).then(m => m.ApiValueAccessRulesComponent), import('./ngx-t-forms-required-inputs.component-CLyq9dIR.mjs').then(m => m.RequiredInputsComponent), import('./ngx-t-forms-pipeline-generator.component-BxHetD_Q.mjs').then(m => m.PipelineGeneratorComponent), import('./ngx-t-forms-calculated-field-rules.component-Ct6_c_Lj.mjs').then(m => m.CalculatedFieldRulesComponent), import('./ngx-t-forms-validators-config.component-Cq07Er-G.mjs').then(m => m.ValidatorsConfigComponent), import('./ngx-t-forms-config-mscoa-additional-inputs.component-BptpYSe-.mjs').then(m => m.ConfigMscoaAdditionalInputsComponent), import('./ngx-t-forms-mat-slider-editor.component-BWe8U-sI.mjs').then(m => m.MatSliderEditorComponent), import('./ngx-t-forms-mscoa-segment-config.component-Ckr_nuZF.mjs').then(m => m.MscoaSegmentConfigComponent), import('./ngx-t-forms-mat-slider-toggle-editor.component-B_XlkHuK.mjs').then(m => m.MatSliderToggleEditorComponent), import('./ngx-t-forms-mat-chip-list-editor.component-C41AL9Et.mjs').then(m => m.MatChipListEditorComponent), i2$2.MatOption, i2.MatIconButton, i3.MatIcon, i3$1.MatFormField, i3$1.MatLabel, i3$1.MatError, i3$1.MatSuffix, i3$1.MatSelect, i4.MatTooltip, import('./ngx-t-forms-chip-options-creator-editor.component-yuM1KHho.mjs').then(m => m.ChipOptionsCreatorEditorComponent), import('./ngx-t-forms-data-source-picker.component-Badna1Rl.mjs').then(m => m.DataSourcePickerComponent), import('./ngx-t-forms-document-list-label-config-editor.component-2_8XzUgD.mjs').then(m => m.DocumentListLabelConfigEditorComponent), import('./ngx-t-forms-t-workflow-picker.component-BkVN4Wdk.mjs').then(m => m.TWorkflowPickerComponent), Promise.resolve().then(function () { return editorJsInput_component; }).then(m => m.EditorJsInputComponent), import('./ngx-t-forms-record-list-manager.component-BQuMkoXo.mjs').then(m => m.RecordListManagerComponent), Promise.resolve().then(function () { return inputCustom_component; }).then(m => m.InputCustomComponent), i1$3.NgControlStatus, i1$3.RequiredValidator, i1$3.NgModel, import('./ngx-t-forms-map-mat-options-keys-SM5XM9uy.mjs').then(m => m.MapMatOptionsKeys), i2$1.AsyncPipe, i2$1.JsonPipe]] }); }
8312
8806
  }
8313
- i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "21.1.5", ngImport: i0, type: TDynamicDataEditComponent, resolveDeferredDeps: () => [import('./ngx-t-forms-selection-options-editor.component-Be3QAG_L.mjs').then(m => m.SelectionOptionsEditorComponent), import('./ngx-t-forms-form-input-selector.component-B2QEnvkq.mjs').then(m => m.FormInputSelectorComponent), import('./ngx-t-forms-rest-api-call-setup.component-CY-JSkGs.mjs').then(m => m.RestApiCallSetupComponent), Promise.resolve().then(function () { return apiValueAccessRules_component; }).then(m => m.ApiValueAccessRulesComponent), import('./ngx-t-forms-required-inputs.component-CSIJvSHq.mjs').then(m => m.RequiredInputsComponent), import('./ngx-t-forms-pipeline-generator.component-DBJEyCbd.mjs').then(m => m.PipelineGeneratorComponent), import('./ngx-t-forms-calculated-field-rules.component-D-SBMdYg.mjs').then(m => m.CalculatedFieldRulesComponent), import('./ngx-t-forms-validators-config.component-B3j9Dmgu.mjs').then(m => m.ValidatorsConfigComponent), import('./ngx-t-forms-config-mscoa-additional-inputs.component-DFdAVWTg.mjs').then(m => m.ConfigMscoaAdditionalInputsComponent), import('./ngx-t-forms-mat-slider-editor.component-DZ4TenrI.mjs').then(m => m.MatSliderEditorComponent), import('./ngx-t-forms-mscoa-segment-config.component-B6IF8kGg.mjs').then(m => m.MscoaSegmentConfigComponent), import('./ngx-t-forms-mat-slider-toggle-editor.component-DPyBYE4p.mjs').then(m => m.MatSliderToggleEditorComponent), import('./ngx-t-forms-mat-chip-list-editor.component-DmTyO9Wi.mjs').then(m => m.MatChipListEditorComponent), import('./ngx-t-forms-chip-options-creator-editor.component-1cpszpPN.mjs').then(m => m.ChipOptionsCreatorEditorComponent), import('./ngx-t-forms-data-source-picker.component-DxORinAD.mjs').then(m => m.DataSourcePickerComponent), import('./ngx-t-forms-document-list-label-config-editor.component-DcWS1txl.mjs').then(m => m.DocumentListLabelConfigEditorComponent), import('./ngx-t-forms-t-workflow-picker.component-a4f1r8gH.mjs').then(m => m.TWorkflowPickerComponent), Promise.resolve().then(function () { return editorJsInput_component; }).then(m => m.EditorJsInputComponent), import('./ngx-t-forms-record-list-manager.component-Dgs9lNSr.mjs').then(m => m.RecordListManagerComponent), Promise.resolve().then(function () { return inputCustom_component; }).then(m => m.InputCustomComponent), import('./ngx-t-forms-map-mat-options-keys-CbdW82su.mjs').then(m => m.MapMatOptionsKeys)], resolveMetadata: (SelectionOptionsEditorComponent, FormInputSelectorComponent, RestApiCallSetupComponent, ApiValueAccessRulesComponent, RequiredInputsComponent, PipelineGeneratorComponent, CalculatedFieldRulesComponent, ValidatorsConfigComponent, ConfigMscoaAdditionalInputsComponent, MatSliderEditorComponent, MscoaSegmentConfigComponent, MatSliderToggleEditorComponent, MatChipListEditorComponent, ChipOptionsCreatorEditorComponent, DataSourcePickerComponent, DocumentListLabelConfigEditorComponent, TWorkflowPickerComponent, EditorJsInputComponent, RecordListManagerComponent, InputCustomComponent, MapMatOptionsKeys) => ({ decorators: [{
8807
+ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "21.1.5", ngImport: i0, type: TDynamicDataEditComponent, resolveDeferredDeps: () => [import('./ngx-t-forms-selection-options-editor.component-B4cEGWrK.mjs').then(m => m.SelectionOptionsEditorComponent), import('./ngx-t-forms-form-input-selector.component-DV4Sts9F.mjs').then(m => m.FormInputSelectorComponent), import('./ngx-t-forms-rest-api-call-setup.component-CWeIUKLz.mjs').then(m => m.RestApiCallSetupComponent), Promise.resolve().then(function () { return apiValueAccessRules_component; }).then(m => m.ApiValueAccessRulesComponent), import('./ngx-t-forms-required-inputs.component-CLyq9dIR.mjs').then(m => m.RequiredInputsComponent), import('./ngx-t-forms-pipeline-generator.component-BxHetD_Q.mjs').then(m => m.PipelineGeneratorComponent), import('./ngx-t-forms-calculated-field-rules.component-Ct6_c_Lj.mjs').then(m => m.CalculatedFieldRulesComponent), import('./ngx-t-forms-validators-config.component-Cq07Er-G.mjs').then(m => m.ValidatorsConfigComponent), import('./ngx-t-forms-config-mscoa-additional-inputs.component-BptpYSe-.mjs').then(m => m.ConfigMscoaAdditionalInputsComponent), import('./ngx-t-forms-mat-slider-editor.component-BWe8U-sI.mjs').then(m => m.MatSliderEditorComponent), import('./ngx-t-forms-mscoa-segment-config.component-Ckr_nuZF.mjs').then(m => m.MscoaSegmentConfigComponent), import('./ngx-t-forms-mat-slider-toggle-editor.component-B_XlkHuK.mjs').then(m => m.MatSliderToggleEditorComponent), import('./ngx-t-forms-mat-chip-list-editor.component-C41AL9Et.mjs').then(m => m.MatChipListEditorComponent), import('./ngx-t-forms-chip-options-creator-editor.component-yuM1KHho.mjs').then(m => m.ChipOptionsCreatorEditorComponent), import('./ngx-t-forms-data-source-picker.component-Badna1Rl.mjs').then(m => m.DataSourcePickerComponent), import('./ngx-t-forms-document-list-label-config-editor.component-2_8XzUgD.mjs').then(m => m.DocumentListLabelConfigEditorComponent), import('./ngx-t-forms-t-workflow-picker.component-BkVN4Wdk.mjs').then(m => m.TWorkflowPickerComponent), Promise.resolve().then(function () { return editorJsInput_component; }).then(m => m.EditorJsInputComponent), import('./ngx-t-forms-record-list-manager.component-BQuMkoXo.mjs').then(m => m.RecordListManagerComponent), Promise.resolve().then(function () { return inputCustom_component; }).then(m => m.InputCustomComponent), import('./ngx-t-forms-map-mat-options-keys-SM5XM9uy.mjs').then(m => m.MapMatOptionsKeys)], resolveMetadata: (SelectionOptionsEditorComponent, FormInputSelectorComponent, RestApiCallSetupComponent, ApiValueAccessRulesComponent, RequiredInputsComponent, PipelineGeneratorComponent, CalculatedFieldRulesComponent, ValidatorsConfigComponent, ConfigMscoaAdditionalInputsComponent, MatSliderEditorComponent, MscoaSegmentConfigComponent, MatSliderToggleEditorComponent, MatChipListEditorComponent, ChipOptionsCreatorEditorComponent, DataSourcePickerComponent, DocumentListLabelConfigEditorComponent, TWorkflowPickerComponent, EditorJsInputComponent, RecordListManagerComponent, InputCustomComponent, MapMatOptionsKeys) => ({ decorators: [{
8314
8808
  type: Component,
8315
8809
  args: [{ selector: 'lib-t-dynamic-data-edit', standalone: true, imports: [CommonModule,
8316
8810
  SelectionOptionsEditorComponent,
@@ -8336,7 +8830,7 @@ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "21.1.5", ng
8336
8830
  InputCustomComponent,
8337
8831
  FormsModule,
8338
8832
  MapMatOptionsKeys
8339
- ], template: "@defer {\r\n<ng-container *ngIf=\"( vm$ |async) as vm\">\r\n\r\n <mat-form-field appearance=\"outline\" [color]=\"((validationErrors)||[]||[]).length>0 ? 'warn' : 'primary'\"\r\n [floatLabel]=\"'always'\" [subscriptSizing]=\"'dynamic'\" [hintLabel]=\"vm.editorConfigValue?.hint||''\">\r\n <mat-label> {{ (vm. editorConfigValue)?.label }} </mat-label>\r\n @switch ((vm. editorConfigValue)?.editType) {\r\n @default {\r\n <lib-input-custom \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [inputConfig]=\"vm.inputConfig\"\r\n [placeholder]=\"(vm. editorConfigValue)?.placeholder ||'Enter value'\"\r\n [required]=\"!!(vm. editorConfigValue)?.required\"\r\n [disabled]=\"!!(vm.disabled)\"\r\n [ngModel]=\"(vm.value)\"\r\n (blur)=\"elementBlur($event)\"\r\n (input)=\"inputChange($event)\" ></lib-input-custom>\r\n \r\n\r\n }\r\n @case ( elementEditorTypes.Toggle) {\r\n <lib-mat-slider-toggle-editor\r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [name]=\"((vm. editorConfigValue)?.name||'') \"\r\n [label]=\"((vm. editorConfigValue)?.label||'')\" [disabled]=\"(vm.disabled)||false\"\r\n (valueChange)=\"valueChanged(!!$event)\" [value]=\"(vm.value)\" [errors]=\"(validationErrors)||[]\">\r\n </lib-mat-slider-toggle-editor>\r\n\r\n }\r\n\r\n @case (elementEditorTypes.Range) {\r\n\r\n\r\n <lib-mat-slider-editor \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [format]=\"( vm.editorConfigValue)?.format \" [formatLabel]=\" formatLabel\"\r\n [disabled]=\"(vm.disabled)||false\" [max]=\"( vm.editorConfigValue)?.max || 100\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" [min]=\"( vm.editorConfigValue)?.min || 0\"\r\n (valueChange)=\"inputChange($event)\" [step]=\"( vm.editorConfigValue)?.step || 1\"\r\n tickInterval=\"( vm.editorConfigValue)?.step || 1\">\r\n\r\n\r\n </lib-mat-slider-editor>\r\n\r\n\r\n\r\n }\r\n\r\n @case (elementEditorTypes.ChipSelect) {\r\n <lib-mat-chip-list-editor \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [disabled]=\"(vm.disabled)||false\"\r\n [options]=\"(vm.editorConfigValue)?.options || vm.dataOptions\"\r\n [required]=\"!!( vm.editorConfigValue)?.required\" [value]=\"(vm.value)\" [errors]=\"(validationErrors)||[]\"\r\n (valueChange)=\" valueChanged($event)\"></lib-mat-chip-list-editor>\r\n\r\n\r\n }\r\n\r\n @case (elementEditorTypes.OptionSelect) {\r\n\r\n <mat-select \r\n \r\n [value]=\"(vm.value)\" (selectionChange)=\"valueChanged($event.value)\"\r\n [disabled]=\"(vm.disabled)||false\">\r\n @for(option of ( vm.editorConfigValue)?.options || vm.dataOptions;track option.value){\r\n <mat-option [value]=\"option.value\">{{option.label}}</mat-option>\r\n }\r\n </mat-select>\r\n\r\n }\r\n\r\n @case (elementEditorTypes.RichTextEditor) {\r\n <lib-editor-js-input \r\n \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [value]=\"(vm.value)\" (valueChanged)=\"valueChanged($event)\"\r\n [disabled]=\"(vm.disabled)||false\" [inputConfig]=\"data\">\r\n </lib-editor-js-input>\r\n }\r\n\r\n\r\n @case (elementEditorTypes.SelectionOptions) {\r\n\r\n <app-selection-options-editor \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [errors]=\"(validationErrors)||[]\" [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\"\r\n [options]=\"(vm.value) || []\" (valueChanged)=\"valueChanged($event)\"></app-selection-options-editor>\r\n }\r\n\r\n @case (\r\n elementEditorTypes.ApiCall) {\r\n\r\n <lib-rest-api-call-setup \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [postmanCollectionConfig]=\"(vm.editorConfigValue)?.postmanCollectionConfig\"\r\n [httpGetDataFunction]=\"(vm.editorConfigValue)?.httpGetDataFunction\" [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" (valueChanged)=\"valueChanged($event)\">\r\n\r\n </lib-rest-api-call-setup>\r\n\r\n }\r\n\r\n @case (elementEditorTypes.MongoPipelineBuilder) {\r\n\r\n <app-pipeline-generator [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" [getWorkflowOptions]=\"getWorkflowOptions$\"\r\n (valueChanged)=\"valueChanged($event)\"></app-pipeline-generator>\r\n\r\n }\r\n @case (elementEditorTypes.MapMatOptionsKeys) {\r\n <lib-map-mat-options-keys [disabled]=\"(vm.disabled)||false\"\r\n [value]=\"(vm.value)\"\r\n [formInputs]=\"formInputs || []\"\r\n [mapToData]=\"vm.dataOptions\"\r\n [errors]=\"(validationErrors)||[]\"\r\n (valueChanged)=\"valueChanged($event)\">\r\n </lib-map-mat-options-keys>\r\n <pre>\r\n {{vm.inputConfig.matOptions|json}}\r\n </pre>\r\n \r\n }\r\n @case (elementEditorTypes.ApiValueAccessRules) {\r\n\r\n\r\n\r\n <app-api-value-access-rules [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" \r\n [formInputs]=\"formInputs ||[]\"\r\n \r\n [postmanCollectionConfig]=\"(vm.editorConfigValue)?.postmanCollectionConfig\" [mapToData]=\"vm.dataOptions\"\r\n (valueChanged)=\"valueChanged($event)\">\r\n </app-api-value-access-rules>\r\n\r\n }\r\n\r\n @case (elementEditorTypes.FormInputSelector)\r\n {\r\n\r\n <lib-form-input-selector [id]=\"((vm.editorConfigValue)?.id)\" [disabled]=\"(vm.disabled)||false\" [formInputs]=\"formInputs ||[]\"\r\n [errors]=\"(validationErrors)||[]\" [value]=\"(vm.value) || []\" (change)=\"valueChanged($event)\">\r\n </lib-form-input-selector>\r\n }\r\n\r\n @case (\r\n elementEditorTypes.RequiredInputs\r\n ){\r\n\r\n <app-required-inputs [formInputs]=\"formInputs ||[]\" [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" (valueChanged)=\"valueChanged($event)\">\r\n </app-required-inputs>\r\n }\r\n\r\n @case(elementEditorTypes.CalculatedFieldRules){\r\n\r\n <app-calculated-field-rules [formInputs]=\"formInputs ||[]\" [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" (valueChanged)=\"valueChanged($event)\"\r\n [mapToData]=\"vm.dataOptions\"></app-calculated-field-rules>\r\n }\r\n\r\n @case(elementEditorTypes.Validators){\r\n\r\n <app-validators-config [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" (valueChanged)=\"valueChanged($event)\" [formInputs]=\"formInputs ||[]\"\r\n [mapToData]=\"vm.dataOptions\">\r\n </app-validators-config>\r\n\r\n }\r\n @case(elementEditorTypes.ConfigMscoaSegments){\r\n\r\n <app-mscoa-segment-config [disabled]=\"(vm.disabled)||false\" [id]=\"((vm.editorConfigValue)?.id)\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" [getMscoaTree]=\"getMscoaTree$\" [dataValue]=\"vm.dataValue\"\r\n [isCashSegmentConfig]=\"vm.editorConfigValue?.deepBind?.at(-1) === 'cashSegments'\"\r\n [showAllSegments]=\"vm.dataOptions\" (valueChanged)=\"valueChanged($event)\"></app-mscoa-segment-config>\r\n }\r\n @case(elementEditorTypes.ConfigMscoaAdditionalInputs){\r\n\r\n <app-config-mscoa-additional-inputs [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" [getMscoaTree]=\"getMscoaTree$\" [mapToData]=\"vm.dataOptions\">\r\n (valueChanged)=\"valueChanged($event)\">\r\n </app-config-mscoa-additional-inputs>\r\n\r\n }\r\n @case (elementEditorTypes.ChipOptionsCreator) {\r\n <lib-chip-options-creator-editor [id]=\"((vm.editorConfigValue)?.id)\" [disabled]=\"(vm.disabled)||false\" (valueChange)=\"valueChanged($event)\"\r\n [value]=\"(vm.value)\" [errors]=\"(validationErrors)||[]\">\r\n\r\n </lib-chip-options-creator-editor>\r\n\r\n }\r\n @case (elementEditorTypes.DataSourcePicker) {\r\n <lib-data-source-picker [id]=\"((vm.editorConfigValue)?.id)\" [disabled]=\"(vm.disabled)||false\" [editorConfig]=\"vm. editorConfigValue\"\r\n (valueChange)=\"valueChanged($event)\" [formInputs]=\"formInputs ||[]\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\">\r\n </lib-data-source-picker>\r\n }\r\n @case (elementEditorTypes.ListLabelConfigEditor) {\r\n <lib-document-list-label-config-editor \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [formInputs]=\"formInputs ||[]\"\r\n [disabled]=\"(vm.disabled)||false\" \r\n [editorConfig]=\"vm. editorConfigValue\"\r\n (valueChange)=\"valueChanged($event)\" \r\n [value]=\"(vm.value)\" [mapToData]=\"vm.dataOptions\"\r\n [errors]=\"(validationErrors)||[]\">\r\n\r\n </lib-document-list-label-config-editor>\r\n }\r\n @case(\r\n elementEditorTypes.WorkflowPicker\r\n ){\r\n <lib-t-workflow-picker [id]=\"((vm.editorConfigValue)?.id)\" [disabled]=\"(vm.disabled)||false\" [getWorkflowOptions]=\"getWorkflowOptions$\"\r\n (valueChanged)=\"valueChanged($event)\" [value]=\"(vm.value)\" [errors]=\"(validationErrors)||[]\"\r\n [value]=\"(vm.value)\"></lib-t-workflow-picker>\r\n }\r\n @case (\r\n elementEditorTypes.RecordListManager\r\n ) {\r\n <lib-record-list-manager \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [editorConfig]=\"vm.editorConfigValue\" [disabled]=\"(vm.disabled)||false\"\r\n [formInputs]=\"formInputs ||[]\" [mapToData]=\"vm.dataOptions\" (valueChange)=\"valueChanged($event)\"\r\n \r\n [value]=\"(vm.value)\" [errors]=\"(validationErrors)||[]\"></lib-record-list-manager>\r\n }\r\n }\r\n\r\n <button [matTooltip]=\"blurFunctionTooltip((vm.editorConfigValue)?.blurHandle)\" *ngIf=\"(vm.inputHasBlurFunction)\"\r\n [disabled]=\"(vm.disabled)\" [color]=\"blurOff?'':'primary'\" (click)=\"blurOff=!blurOff\" matSuffix\r\n mat-icon-button>\r\n <mat-icon>{{\r\n blurOff?'blur_off':'blur_on'\r\n }}\r\n\r\n\r\n </mat-icon>\r\n </button>\r\n </mat-form-field>\r\n\r\n @if (!(vm.value) && (vm. editorConfigValue)?.required ) {\r\n <mat-error>\r\n {{ (vm. editorConfigValue)?.label }}'s is required\r\n </mat-error>}\r\n\r\n <mat-error style=\" font-size: 0.75em;\r\n margin-left: 14px;\r\n \" *ngFor=\"let error of (validationErrors)||[]\">\r\n\r\n {{error.message}}</mat-error>\r\n\r\n</ng-container>\r\n\r\n}@error {\r\n<mat-card>\r\n <mat-card-content>\r\n\r\n <span>\r\n Failed to load form inputs\r\n </span>\r\n </mat-card-content>\r\n</mat-card>\r\n}\r\n\r\n\r\n\r\n<!-- - \r\n `TableConfigSetup`\r\n- `ConditionalInputConfig`\r\n- `MatrixTable`-->", styles: [".showItemValue{opacity:.6}mat-form-field{width:100%}mat-slider{width:100%}.range{display:flex;align-items:center}label{line-height:normal;margin-top:12px;font-weight:500;font-size:.75em;color:var(--mdc-filled-text-field-focus-label-text-color, var(--mat-app-primary));display:flex;justify-content:space-between;align-items:center}.elementInfo{display:flex;align-items:center;justify-content:center;padding:0;height:24px;width:24px}.infoIcon{font-size:1em;height:16px;width:16px}.toggle-label{margin-left:5px;align-items:center;display:flex;font-weight:500;line-height:normal;justify-content:space-between;color:var(--mdc-filled-text-field-focus-label-text-color, var(--mat-app-primary))}\n"] }]
8833
+ ], template: "@defer {\r\n<ng-container *ngIf=\"( vm$ |async) as vm\">\r\n\r\n <mat-form-field appearance=\"outline\" [color]=\"((validationErrors)||[]||[]).length>0 ? 'warn' : 'primary'\"\r\n [floatLabel]=\"'always'\" [subscriptSizing]=\"'dynamic'\" [hintLabel]=\"vm.editorConfigValue?.hint||''\">\r\n <mat-label> {{ (vm. editorConfigValue)?.label }} </mat-label>\r\n @switch ((vm. editorConfigValue)?.editType) {\r\n @default {\r\n <lib-input-custom \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [inputConfig]=\"vm.inputConfig\"\r\n [placeholder]=\"(vm. editorConfigValue)?.placeholder ||'Enter value'\"\r\n [required]=\"!!(vm. editorConfigValue)?.required\"\r\n [disabled]=\"!!(vm.disabled)\"\r\n [ngModel]=\"(vm.value)\"\r\n (blur)=\"elementBlur($event)\"\r\n (input)=\"inputChange($event)\" ></lib-input-custom>\r\n \r\n\r\n }\r\n @case ( elementEditorTypes.Toggle) {\r\n <lib-mat-slider-toggle-editor\r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [name]=\"((vm. editorConfigValue)?.name||'') \"\r\n [label]=\"((vm. editorConfigValue)?.label||'')\" [disabled]=\"(vm.disabled)||false\"\r\n (valueChange)=\"valueChanged(!!$event)\" [value]=\"(vm.value)\" [errors]=\"(validationErrors)||[]\">\r\n </lib-mat-slider-toggle-editor>\r\n\r\n }\r\n\r\n @case (elementEditorTypes.Range) {\r\n\r\n\r\n <lib-mat-slider-editor \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [format]=\"( vm.editorConfigValue)?.format \" [formatLabel]=\" formatLabel\"\r\n [disabled]=\"(vm.disabled)||false\" [max]=\"( vm.editorConfigValue)?.max || 100\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" [min]=\"( vm.editorConfigValue)?.min || 0\"\r\n (valueChange)=\"inputChange($event)\" [step]=\"( vm.editorConfigValue)?.step || 1\"\r\n tickInterval=\"( vm.editorConfigValue)?.step || 1\">\r\n\r\n\r\n </lib-mat-slider-editor>\r\n\r\n\r\n\r\n }\r\n\r\n @case (elementEditorTypes.ChipSelect) {\r\n \r\n <lib-mat-chip-list-editor \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [multiple]=\"!!vm.editorConfigValue?.multipleSelection\"\r\n [disabled]=\"(vm.disabled)||false\"\r\n [options]=\"(vm.editorConfigValue)?.options || vm.dataOptions\"\r\n [required]=\"!!( vm.editorConfigValue)?.required\" [value]=\"(vm.value)\" \r\n [errors]=\"(validationErrors)||[]\"\r\n (valueChange)=\" valueChanged($event)\"></lib-mat-chip-list-editor>\r\n\r\n\r\n }\r\n\r\n @case (elementEditorTypes.OptionSelect) {\r\n\r\n <mat-select \r\n \r\n [value]=\"(vm.value)\" (selectionChange)=\"valueChanged($event.value)\"\r\n [disabled]=\"(vm.disabled)||false\">\r\n @for(option of ( vm.editorConfigValue)?.options || vm.dataOptions;track option.value){\r\n <mat-option [value]=\"option.value\">{{option.label}}</mat-option>\r\n }\r\n </mat-select>\r\n\r\n }\r\n\r\n @case (elementEditorTypes.RichTextEditor) {\r\n <lib-editor-js-input \r\n \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [value]=\"(vm.value)\" (valueChanged)=\"valueChanged($event)\"\r\n [disabled]=\"(vm.disabled)||false\" [inputConfig]=\"data\">\r\n </lib-editor-js-input>\r\n }\r\n\r\n\r\n @case (elementEditorTypes.SelectionOptions) {\r\n\r\n <app-selection-options-editor \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [errors]=\"(validationErrors)||[]\" [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\"\r\n [options]=\"(vm.value) || []\" (valueChanged)=\"valueChanged($event)\"></app-selection-options-editor>\r\n }\r\n\r\n @case (\r\n elementEditorTypes.ApiCall) {\r\n\r\n <lib-rest-api-call-setup \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [postmanCollectionConfig]=\"(vm.editorConfigValue)?.postmanCollectionConfig\"\r\n [httpGetDataFunction]=\"(vm.editorConfigValue)?.httpGetDataFunction\" [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" (valueChanged)=\"valueChanged($event)\">\r\n\r\n </lib-rest-api-call-setup>\r\n\r\n }\r\n\r\n @case (elementEditorTypes.MongoPipelineBuilder) {\r\n\r\n <app-pipeline-generator [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" [getWorkflowOptions]=\"getWorkflowOptions$\"\r\n (valueChanged)=\"valueChanged($event)\"></app-pipeline-generator>\r\n\r\n }\r\n @case (elementEditorTypes.MapMatOptionsKeys) {\r\n <lib-map-mat-options-keys [disabled]=\"(vm.disabled)||false\"\r\n [value]=\"(vm.value)\"\r\n [formInputs]=\"formInputs || []\"\r\n [mapToData]=\"vm.dataOptions\"\r\n [errors]=\"(validationErrors)||[]\"\r\n (valueChanged)=\"valueChanged($event)\">\r\n </lib-map-mat-options-keys>\r\n <pre>\r\n {{vm.inputConfig.matOptions|json}}\r\n </pre>\r\n \r\n }\r\n @case (elementEditorTypes.ApiValueAccessRules) {\r\n\r\n\r\n\r\n <app-api-value-access-rules [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" \r\n [formInputs]=\"formInputs ||[]\"\r\n \r\n [postmanCollectionConfig]=\"(vm.editorConfigValue)?.postmanCollectionConfig\" [mapToData]=\"vm.dataOptions\"\r\n (valueChanged)=\"valueChanged($event)\">\r\n </app-api-value-access-rules>\r\n\r\n }\r\n\r\n @case (elementEditorTypes.FormInputSelector)\r\n {\r\n\r\n <lib-form-input-selector [id]=\"((vm.editorConfigValue)?.id)\" [disabled]=\"(vm.disabled)||false\" [formInputs]=\"formInputs ||[]\"\r\n [errors]=\"(validationErrors)||[]\" [value]=\"(vm.value) || []\" (change)=\"valueChanged($event)\">\r\n </lib-form-input-selector>\r\n }\r\n\r\n @case (\r\n elementEditorTypes.RequiredInputs\r\n ){\r\n\r\n <app-required-inputs [formInputs]=\"formInputs ||[]\" [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" (valueChanged)=\"valueChanged($event)\">\r\n </app-required-inputs>\r\n }\r\n\r\n @case(elementEditorTypes.CalculatedFieldRules){\r\n\r\n <app-calculated-field-rules [formInputs]=\"formInputs ||[]\" [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" (valueChanged)=\"valueChanged($event)\"\r\n [mapToData]=\"vm.dataOptions\"></app-calculated-field-rules>\r\n }\r\n\r\n @case(elementEditorTypes.Validators){\r\n\r\n <app-validators-config [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" (valueChanged)=\"valueChanged($event)\" [formInputs]=\"formInputs ||[]\"\r\n [mapToData]=\"vm.dataOptions\">\r\n </app-validators-config>\r\n\r\n }\r\n @case(elementEditorTypes.ConfigMscoaSegments){\r\n\r\n <app-mscoa-segment-config [disabled]=\"(vm.disabled)||false\" [id]=\"((vm.editorConfigValue)?.id)\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" [getMscoaTree]=\"getMscoaTree$\" [dataValue]=\"vm.dataValue\"\r\n [isCashSegmentConfig]=\"vm.editorConfigValue?.deepBind?.at(-1) === 'cashSegments'\"\r\n [showAllSegments]=\"vm.dataOptions\" (valueChanged)=\"valueChanged($event)\"></app-mscoa-segment-config>\r\n }\r\n @case(elementEditorTypes.ConfigMscoaAdditionalInputs){\r\n\r\n <app-config-mscoa-additional-inputs [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" [getMscoaTree]=\"getMscoaTree$\" [mapToData]=\"vm.dataOptions\">\r\n (valueChanged)=\"valueChanged($event)\">\r\n </app-config-mscoa-additional-inputs>\r\n\r\n }\r\n @case (elementEditorTypes.ChipOptionsCreator) {\r\n <lib-chip-options-creator-editor [id]=\"((vm.editorConfigValue)?.id)\" [disabled]=\"(vm.disabled)||false\" (valueChange)=\"valueChanged($event)\"\r\n [value]=\"(vm.value)\" [errors]=\"(validationErrors)||[]\">\r\n\r\n </lib-chip-options-creator-editor>\r\n\r\n }\r\n @case (elementEditorTypes.DataSourcePicker) {\r\n <lib-data-source-picker [id]=\"((vm.editorConfigValue)?.id)\" [disabled]=\"(vm.disabled)||false\" [editorConfig]=\"vm. editorConfigValue\"\r\n (valueChange)=\"valueChanged($event)\" [formInputs]=\"formInputs ||[]\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\">\r\n </lib-data-source-picker>\r\n }\r\n @case (elementEditorTypes.ListLabelConfigEditor) {\r\n <lib-document-list-label-config-editor \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [formInputs]=\"formInputs ||[]\"\r\n [disabled]=\"(vm.disabled)||false\" \r\n [editorConfig]=\"vm. editorConfigValue\"\r\n (valueChange)=\"valueChanged($event)\" \r\n [value]=\"(vm.value)\" [mapToData]=\"vm.dataOptions\"\r\n [errors]=\"(validationErrors)||[]\">\r\n\r\n </lib-document-list-label-config-editor>\r\n }\r\n @case(\r\n elementEditorTypes.WorkflowPicker\r\n ){\r\n <lib-t-workflow-picker [id]=\"((vm.editorConfigValue)?.id)\" [disabled]=\"(vm.disabled)||false\" [getWorkflowOptions]=\"getWorkflowOptions$\"\r\n (valueChanged)=\"valueChanged($event)\" [value]=\"(vm.value)\" [errors]=\"(validationErrors)||[]\"\r\n [value]=\"(vm.value)\"></lib-t-workflow-picker>\r\n }\r\n @case (\r\n elementEditorTypes.RecordListManager\r\n ) {\r\n <lib-record-list-manager \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [editorConfig]=\"vm.editorConfigValue\" [disabled]=\"(vm.disabled)||false\"\r\n [formInputs]=\"formInputs ||[]\" [mapToData]=\"vm.dataOptions\" (valueChange)=\"valueChanged($event)\"\r\n \r\n [value]=\"(vm.value)\" [errors]=\"(validationErrors)||[]\"></lib-record-list-manager>\r\n }\r\n }\r\n\r\n <button [matTooltip]=\"blurFunctionTooltip((vm.editorConfigValue)?.blurHandle)\" *ngIf=\"(vm.inputHasBlurFunction)\"\r\n [disabled]=\"(vm.disabled)\" [color]=\"blurOff?'':'primary'\" (click)=\"blurOff=!blurOff\" matSuffix\r\n mat-icon-button>\r\n <mat-icon>{{\r\n blurOff?'blur_off':'blur_on'\r\n }}\r\n\r\n\r\n </mat-icon>\r\n </button>\r\n </mat-form-field>\r\n\r\n @if (!(vm.value) && (vm. editorConfigValue)?.required ) {\r\n <mat-error>\r\n {{ (vm. editorConfigValue)?.label }}'s is required\r\n </mat-error>}\r\n\r\n <mat-error style=\" font-size: 0.75em;\r\n margin-left: 14px;\r\n \" *ngFor=\"let error of (validationErrors)||[]\">\r\n\r\n {{error.message}}</mat-error>\r\n\r\n</ng-container>\r\n\r\n}@error {\r\n<mat-card>\r\n <mat-card-content>\r\n\r\n <span>\r\n Failed to load form inputs\r\n </span>\r\n </mat-card-content>\r\n</mat-card>\r\n}\r\n\r\n\r\n\r\n<!-- - \r\n `TableConfigSetup`\r\n- `ConditionalInputConfig`\r\n- `MatrixTable`-->", styles: [".showItemValue{opacity:.6}mat-form-field{width:100%}mat-slider{width:100%}.range{display:flex;align-items:center}label{line-height:normal;margin-top:12px;font-weight:500;font-size:.75em;color:var(--mdc-filled-text-field-focus-label-text-color, var(--mat-app-primary));display:flex;justify-content:space-between;align-items:center}.elementInfo{display:flex;align-items:center;justify-content:center;padding:0;height:24px;width:24px}.infoIcon{font-size:1em;height:16px;width:16px}.toggle-label{margin-left:5px;align-items:center;display:flex;font-weight:500;line-height:normal;justify-content:space-between;color:var(--mdc-filled-text-field-focus-label-text-color, var(--mat-app-primary))}\n"] }]
8340
8834
  }], ctorParameters: () => [{ type: i0.NgZone }], propDecorators: { editorConfig: [{
8341
8835
  type: Input
8342
8836
  }], formInputs: [{
@@ -8861,39 +9355,64 @@ class MscoaComputationComponent {
8861
9355
  this.destroy$.complete();
8862
9356
  }
8863
9357
  /**
8864
- * Searches the tree for nodes matching the search text using fuzzy search
8865
- * @param searchText - The text to search for
8866
- * @returns Array of matching paths
9358
+ * Searches the tree for nodes matching the search text using fuzzy search.
9359
+ * Returns empty when no term is provided. Scores and caps results to avoid
9360
+ * flooding the UI with low-relevance matches on large datasets.
8867
9361
  */
8868
9362
  searchTree(searchText) {
8869
- // 1. fast exit if no data
8870
9363
  if (!this.dataSource?.data)
8871
9364
  return [];
8872
- // 2. Normalize search text once (optimization)
8873
- const term = (searchText || '').toLowerCase();
8874
- const results = [];
8875
- // 3. Define recursive visitor
9365
+ const term = (searchText || '').trim().toLowerCase();
9366
+ // No term show nothing, not everything
9367
+ if (!term)
9368
+ return [];
9369
+ const MAX_RESULTS = 50;
9370
+ const scored = [];
8876
9371
  const traverse = (nodes) => {
8877
9372
  for (const node of nodes) {
8878
- // Safety check
8879
9373
  if (!node)
8880
9374
  continue;
8881
9375
  const path = node.path;
8882
9376
  const nodeName = path?.at(-1)?.toLowerCase() || '';
8883
- // Check match
8884
- const isMatch = fuzzySearch(term, nodeName);
8885
- if (path && isMatch) {
8886
- results.push(path);
9377
+ if (path && fuzzySearch(term, nodeName)) {
9378
+ scored.push({ path, score: this.scoreMatch(term, nodeName) });
8887
9379
  }
8888
- // Recurse if children exist
8889
9380
  if (Array.isArray(node.children) && node.children.length > 0) {
8890
9381
  traverse(node.children);
8891
9382
  }
8892
9383
  }
8893
9384
  };
8894
- // 4. Start traversal
8895
9385
  traverse(this.dataSource.data);
8896
- return results;
9386
+ return scored
9387
+ .sort((a, b) => b.score - a.score)
9388
+ .slice(0, MAX_RESULTS)
9389
+ .map(r => r.path);
9390
+ }
9391
+ /**
9392
+ * Scores how well a term matches a text string.
9393
+ * Higher score = more relevant. Priorities: exact > prefix > substring > fuzzy-tight > fuzzy-loose.
9394
+ */
9395
+ scoreMatch(term, text) {
9396
+ if (text === term)
9397
+ return 100;
9398
+ if (text.startsWith(term))
9399
+ return 80;
9400
+ if (text.includes(term))
9401
+ return 60;
9402
+ // Fuzzy: score inversely by the character span (tighter = better)
9403
+ let pos = 0;
9404
+ let first = -1, last = -1;
9405
+ for (let i = 0; i < text.length && pos < term.length; i++) {
9406
+ if (text[i] === term[pos]) {
9407
+ if (first === -1)
9408
+ first = i;
9409
+ last = i;
9410
+ pos++;
9411
+ }
9412
+ }
9413
+ if (pos < term.length)
9414
+ return 0;
9415
+ return Math.max(1, 40 - (last - first));
8897
9416
  }
8898
9417
  /**
8899
9418
  * Checks if a path is the currently selected path or a parent of it
@@ -9215,7 +9734,7 @@ class MscoaComputationComponent {
9215
9734
  return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
9216
9735
  }
9217
9736
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: MscoaComputationComponent, deps: [{ token: i1$1.MatDialogRef }], target: i0.ɵɵFactoryTarget.Component }); }
9218
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: MscoaComputationComponent, isStandalone: true, selector: "app-mscoa-computation", host: { listeners: { "keydown": "handleKeyboardNavigation($event)" } }, ngImport: i0, template: "<!-- Header Toolbar -->\r\n<mat-toolbar class=\"main-toolbar header-toolbar\" role=\"banner\">\r\n <span class=\"toolbar-title\">\r\n {{ (segment || 'No segment') | uppercase }} : {{ activeColumn | uppercase }} ACCOUNT\r\n </span>\r\n <span class=\"spacer\"></span>\r\n @if (selectedAccount) {\r\n <button \r\n mat-flat-button \r\n (click)=\"clearSelectedAccount(); cancel()\"\r\n [attr.aria-label]=\"'Change account'\">\r\n <mat-icon>arrow_back</mat-icon>\r\n Change Account\r\n </button>\r\n }\r\n</mat-toolbar>\r\n\r\n<!-- Search Bar - Hidden when account selected -->\r\n@if (!selectedAccount) {\r\n <mat-toolbar class=\"main-toolbar header-toolbar search-toolbar\" role=\"search\">\r\n <mat-form-field [subscriptSizing]=\"'dynamic'\" class=\"search-field\">\r\n <mat-label position=\"floating\">Search {{ segment || 'account' }} : {{ activeColumn || '' }} Account</mat-label>\r\n <input \r\n matInput \r\n [formControl]=\"accountSearchTextControl\"\r\n [placeholder]=\"('Search ' + segment + ' : ' + activeColumn + ' Account').toUpperCase()\"\r\n [attr.aria-label]=\"'Search for account'\"\r\n autocomplete=\"off\">\r\n <button \r\n mat-icon-button \r\n matSuffix \r\n (click)=\"clearSearch()\"\r\n [attr.aria-label]=\"'Clear search'\"\r\n type=\"button\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n </mat-toolbar>\r\n}\r\n\r\n<mat-divider></mat-divider>\r\n\r\n<!-- Account Details View -->\r\n@if (selectedAccount) {\r\n <div class=\"account-details-container\" role=\"region\" [attr.aria-label]=\"'Account details'\">\r\n <app-account-value \r\n [accountInputs]=\"accountInputs\" \r\n [userCanClearAccount]=\"userCanClearAccount\"\r\n [mscoaAccount]=\"selectedAccount\" \r\n (updateAccount)=\"updateAccount($event)\"\r\n (clearSelectedAccount)=\"clearSelectedAccount()\">\r\n </app-account-value>\r\n </div>\r\n} @else {\r\n <!-- Main Content Area with Drawer -->\r\n <mat-drawer-container \r\n class=\"drawer-container\"\r\n [attr.aria-label]=\"'Account selection interface'\">\r\n <!-- Account Table Drawer -->\r\n <mat-drawer \r\n #drawer \r\n class=\"account-drawer\"\r\n mode=\"side\" \r\n position=\"end\"\r\n [opened]=\"!searchingAccounts && !!selectedTreeNode && !accountSearchTextControl.value\">\r\n\r\n\r\n\r\n\r\n @if (searchingAccounts) {\r\n <div class=\"loading-container skeleton-table\" role=\"status\" [attr.aria-live]=\"'polite'\">\r\n @for (item of [1,2,3,4,5]; track item) {\r\n <div class=\"skeleton-row\">\r\n <div class=\"skeleton-checkbox\"></div>\r\n <div class=\"skeleton-text short\"></div>\r\n <div class=\"skeleton-text medium\"></div>\r\n <div class=\"skeleton-text\"></div>\r\n </div>\r\n }\r\n </div>\r\n } @else if (hasError) {\r\n <div class=\"error-container\" role=\"alert\" [attr.aria-live]=\"'assertive'\">\r\n <mat-icon class=\"error-icon\" aria-hidden=\"true\">error</mat-icon>\r\n <p class=\"error-message\">{{ errorMessage }}</p>\r\n <button \r\n mat-flat-button \r\n color=\"primary\"\r\n (click)=\"retryLoadAccounts()\"\r\n [attr.aria-label]=\"'Retry loading accounts'\">\r\n <mat-icon aria-hidden=\"true\">refresh</mat-icon>\r\n Retry\r\n </button>\r\n </div>\r\n } @else if (searchAccounts.length === 0 && selectedTreeNode) {\r\n <div class=\"empty-state\" role=\"status\" [attr.aria-live]=\"'polite'\">\r\n <mat-icon class=\"empty-icon\" aria-hidden=\"true\">info</mat-icon>\r\n <p class=\"empty-message\">No accounts found for this category.</p>\r\n </div>\r\n } @else {\r\n <app-scoa-account-table \r\n [selectedAccount]=\"selectedAccount\" \r\n [segment]=\"segment\"\r\n (accountSelected)=\"selectAccount($event)\" \r\n [data]=\"{\r\n accounts: searchAccounts,\r\n account: currentAccountPath || ''\r\n }\">\r\n </app-scoa-account-table>\r\n }\r\n </mat-drawer>\r\n <!-- Tree Content Area -->\r\n <div class=\"tree-content\" role=\"main\">\r\n\r\n <!-- Search Results View -->\r\n @if (accountSearchTextControl.value) {\r\n <mat-nav-list class=\"search-results-list\" role=\"list\">\r\n <div mat-subheader class=\"search-results-header\">\r\n <mat-icon class=\"search-icon\">search</mat-icon>\r\n Search Results\r\n <span class=\"count-badge\" [attr.aria-label]=\"'Number of results'\">\r\n ({{ (searchedPaths$ | async)?.length || 0 }})\r\n </span>\r\n </div>\r\n \r\n @if ((searchedPaths$ | async)?.length === 0) {\r\n <!-- Empty Search Results -->\r\n <div class=\"empty-state\" role=\"status\" [attr.aria-live]=\"'polite'\">\r\n <mat-icon class=\"empty-icon\" aria-hidden=\"true\">search_off</mat-icon>\r\n <p class=\"empty-message\">\r\n No account found for the search\r\n <strong>{{ accountSearchTextControl.value }}</strong>.\r\n </p>\r\n <button \r\n mat-flat-button \r\n (click)=\"clearSearch()\"\r\n [attr.aria-label]=\"'Clear search and show all accounts'\">\r\n Clear Search\r\n </button>\r\n </div>\r\n } @else {\r\n <p class=\"search-results-hint\">Click a result to load accounts for that category.</p>\r\n <div class=\"search-results-grid\" role=\"list\">\r\n @for (searchedItem of (searchedPaths$ | async); track searchedItem.join(':')) {\r\n <div \r\n class=\"path-result-item\"\r\n role=\"listitem\"\r\n (click)=\"selectPath(searchedItem)\" \r\n [attr.aria-label]=\"'Load accounts for: ' + searchedItem.join(' > ') + '. Click to select.'\"\r\n tabindex=\"0\"\r\n (keydown.enter)=\"selectPath(searchedItem)\"\r\n (keydown.space)=\"selectPath(searchedItem); $event.preventDefault()\">\r\n <div class=\"breadcrumb-container\">\r\n @for (part of searchedItem; track part; let last = $last) {\r\n <div class=\"crumb-segment\" [class.is-target]=\"last\">\r\n <span \r\n class=\"text-content\" \r\n [innerHTML]=\"accountSearchTextControl.value ? highlightSearchText(part, accountSearchTextControl.value) : part\">\r\n </span>\r\n @if (!last) {\r\n <mat-icon class=\"separator\" aria-hidden=\"true\">chevron_right</mat-icon>\r\n }\r\n </div>\r\n }\r\n </div>\r\n <span class=\"path-result-meta\">Load accounts</span>\r\n <mat-icon class=\"path-result-arrow\" aria-hidden=\"true\">arrow_forward</mat-icon>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </mat-nav-list>\r\n }\r\n\r\n <!-- Tree View -->\r\n @else {\r\n <!-- Breadcrumb: show current path when category selected (like file explorers) -->\r\n @if (selectedTreeNode?.path?.length) {\r\n <div class=\"tree-breadcrumb\" role=\"navigation\" [attr.aria-label]=\"'Current category: ' + (selectedTreeNode?.path ?? []).join(' > ')\">\r\n <span class=\"breadcrumb-label\">Category:</span>\r\n @for (part of (selectedTreeNode?.path ?? []); track $index; let last = $last) {\r\n <span class=\"breadcrumb-part\" [class.is-current]=\"last\">{{ part }}</span>\r\n @if (!last) {\r\n <mat-icon class=\"breadcrumb-sep\" aria-hidden=\"true\">chevron_right</mat-icon>\r\n }\r\n }\r\n </div>\r\n }\r\n <!-- Compact Instructions - Collapsed by default -->\r\n @if (noneIsExpanded) {\r\n <mat-expansion-panel \r\n [expanded]=\"false\"\r\n class=\"instructions-panel compact-instructions\"\r\n [attr.aria-label]=\"'How to use the account selector'\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <mat-icon class=\"instruction-icon\" aria-hidden=\"true\">info</mat-icon>\r\n <span>Quick tips</span>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <div class=\"instructions-content\">\r\n <div class=\"instruction-item\">\r\n <mat-icon class=\"instruction-bullet\" aria-hidden=\"true\">folder_open</mat-icon>\r\n <span>Expand folders to browse</span>\r\n </div>\r\n <div class=\"instruction-item\">\r\n <mat-icon class=\"instruction-bullet\" aria-hidden=\"true\">check_box</mat-icon>\r\n <span>Check category to load accounts</span>\r\n </div>\r\n <div class=\"instruction-item\">\r\n <mat-icon class=\"instruction-bullet\" aria-hidden=\"true\">search</mat-icon>\r\n <span>Use search bar to find accounts</span>\r\n </div>\r\n </div>\r\n </mat-expansion-panel>\r\n }\r\n\r\n <!-- Account Tree -->\r\n <mat-tree \r\n \r\n [dataSource]=\"dataSource\" \r\n [treeControl]=\"treeControl\"\r\n role=\"tree\"\r\n [attr.aria-label]=\"'Account category tree'\">\r\n \r\n <!-- Leaf Node (no children) -->\r\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodePadding role=\"treeitem\" \r\n [attr.data-tree-path]=\"node.path?.join(':')\">\r\n <button \r\n class=\"toggle-button\" \r\n mat-icon-button \r\n disabled\r\n aria-hidden=\"true\">\r\n </button>\r\n <mat-checkbox \r\n (change)=\"selectNode(node)\"\r\n [disabled]=\"isActivePathOrParent(node.path) && searchingAccounts\"\r\n [checked]=\"isActivePathOrParent(node.path)\"\r\n [attr.aria-label]=\"'Select ' + node.name + ' account category'\">\r\n @if (isActivePathOrParent(node.path) && searchingAccounts) {\r\n <mat-spinner \r\n color=\"primary\" \r\n class=\"loading\"\r\n [attr.aria-label]=\"'Loading accounts for ' + node.name\">\r\n </mat-spinner>\r\n <span class=\"label selected\" [attr.aria-live]=\"'polite'\">\r\n Loading <strong>{{ node.name }}</strong> accounts...\r\n </span>\r\n } @else {\r\n <span \r\n class=\"label\" \r\n [class.selected]=\"isActivePathOrParent(node.path)\">\r\n {{ node.name }}\r\n </span>\r\n }\r\n </mat-checkbox>\r\n </mat-tree-node>\r\n\r\n <!-- Branch Node (has children) -->\r\n <mat-tree-node \r\n *matTreeNodeDef=\"let node; when: hasChild\" \r\n matTreeNodePadding \r\n role=\"treeitem\"\r\n [attr.data-tree-path]=\"node.path?.join(':')\"\r\n [attr.aria-expanded]=\"treeControl.isExpanded(node)\">\r\n <button \r\n class=\"toggle-button\" \r\n mat-icon-button \r\n [attr.aria-label]=\"(treeControl.isExpanded(node) ? 'Collapse' : 'Expand') + ' ' + node.name\"\r\n (click)=\"toggleNode(node)\"\r\n type=\"button\">\r\n <mat-icon class=\"mat-icon-rtl-mirror\">\r\n {{ treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\r\n </mat-icon>\r\n </button>\r\n \r\n @if (isActivePathOrParent(node.path)) {\r\n <mat-checkbox \r\n (change)=\"selectNode(node)\" \r\n [disabled]=\"true\" \r\n [checked]=\"true\"\r\n [attr.aria-label]=\"'Selected: ' + node.name\">\r\n <span class=\"label selected\">\r\n {{ node.name }}\r\n </span>\r\n </mat-checkbox>\r\n } @else {\r\n <mat-checkbox \r\n (change)=\"selectNode(node)\"\r\n [checked]=\"false\"\r\n [attr.aria-label]=\"'Select ' + node.name + ' account category'\">\r\n <span class=\"label\">\r\n {{ node.name }}\r\n </span>\r\n </mat-checkbox>\r\n }\r\n </mat-tree-node>\r\n </mat-tree>\r\n }\r\n\r\n </div>\r\n </mat-drawer-container>\r\n}\r\n\r\n<mat-divider></mat-divider>\r\n\r\n<!-- Footer Actions -->\r\n<mat-dialog-actions\r\nstyle=\" background: var(--mscoa-surface-container) !important;\"\r\nalign=\"end\">\r\n<button \r\nclass=\"action-button close-button\"\r\nmat-button \r\n(click)=\"closeAndPassData(undefined)\"\r\n[attr.aria-label]=\"'Close dialog without saving'\"\r\ntype=\"button\">\r\n\r\nClose\r\n</button>\r\n @if (userCanClearAccount ) {\r\n <button \r\n class=\"action-button save-button\"\r\n mat-flat-button \r\n [disabled]=\"!saveSelection\" \r\n (click)=\"saveAccount()\"\r\n [attr.aria-label]=\"saveSelection ? 'Save account selection' : 'Save disabled - account unchanged or invalid'\"\r\n type=\"button\">\r\n <mat-icon aria-hidden=\"true\">save</mat-icon>\r\n Save\r\n </button>\r\n }\r\n \r\n </mat-dialog-actions>\r\n", styles: [":host{display:flex;flex-direction:column;max-height:98vh;overflow:hidden;min-height:0;--mscoa-primary: var(--mat-sys-primary, #243D91);--mscoa-primary-light: var(--mat-sys-primary-container, #E3F2FD);--mscoa-primary-dark: var(--mat-sys-primary, #1A2E6B);--mscoa-success: var(--mat-sys-success, #4CAF50);--mscoa-error: var(--mat-sys-error, #F44336);--mscoa-warning: var(--mat-sys-warning, #FF9800);--mscoa-info: var(--mat-sys-primary, #2196F3);--mscoa-surface: var(--mat-sys-surface, #FFFFFF);--mscoa-surface-container: var(--mat-sys-surface-container, #F5F5F5);--mscoa-text-primary: var(--mat-sys-on-surface, #212121);--mscoa-text-secondary: var(--mat-sys-on-surface-variant, #757575);--mscoa-divider: var(--mat-sys-outline-variant, #E0E0E0);--mscoa-spacing-xs: 4px;--mscoa-spacing-sm: 8px;--mscoa-spacing-md: 16px;--mscoa-spacing-lg: 24px;--mscoa-spacing-xl: 32px;--mscoa-elevation-1: 0 1px 3px rgba(0,0,0,.12);--mscoa-elevation-2: 0 2px 6px rgba(0,0,0,.12);--mscoa-elevation-4: 0 4px 12px rgba(0,0,0,.12);--mscoa-computation-spacing-xs: var(--mscoa-spacing-xs);--mscoa-computation-spacing-sm: var(--mscoa-spacing-sm);--mscoa-computation-spacing-md: var(--mscoa-spacing-md);--mscoa-computation-spacing-lg: var(--mscoa-spacing-lg);--mscoa-computation-toolbar-height: 56px;--mscoa-header-height: 56px;--mscoa-search-height: 56px;--mscoa-footer-height: 58px;--mscoa-divider-height: 1px;--mscoa-computation-selected-color: var(--mscoa-primary);--mscoa-computation-border-radius: 16px;--mscoa-computation-transition: .2s ease}mat-divider{flex-shrink:0}h4{margin-top:0;margin-bottom:0;padding-left:var(--mscoa-computation-spacing-md)}.label{font-size:.875em}.selected{color:var(--mscoa-primary)!important;font-weight:600;background-color:transparent}.mat-tree-node.tree-node-selected,.mat-tree-node[aria-selected=true]{background:linear-gradient(90deg,var(--mat-sys-primary-container, var(--mscoa-primary-light)) 0%,transparent 100%)!important;box-shadow:inset 3px 0 0 var(--mat-sys-primary, var(--mscoa-primary));border-radius:0 4px 4px 0}.mat-tree-node:hover:not(.tree-node-selected):not(:has(.selected)){background-color:#00000008;transition:background-color var(--mscoa-computation-transition)}mat-tree-node{transition:all var(--mscoa-computation-transition)}mat-tree-node:has(.selected){background:linear-gradient(90deg,var(--mat-sys-primary-container, var(--mscoa-primary-light)) 0%,transparent 100%)!important;box-shadow:inset 3px 0 0 var(--mat-sys-primary, var(--mscoa-primary));border-radius:0 4px 4px 0}mat-tree-node:hover:not(:has(.selected)){background-color:#00000008}mat-tree-node mat-checkbox[checked=true] ::ng-deep .mdc-checkbox{background-color:var(--mscoa-primary, #243D91)!important;border-color:var(--mscoa-primary, #243D91)!important}.accountSeperator{margin-left:var(--mscoa-computation-spacing-xs);margin-right:var(--mscoa-computation-spacing-xs)}.loading{width:24px!important;height:24px!important;--mdc-circular-progress-size: 28px !important;--mdc-circular-progress-active-indicator-width: 24px !important;position:absolute;left:var(--mscoa-computation-spacing-sm);bottom:var(--mscoa-computation-spacing-sm)}.info{font-size:.875rem;opacity:.8;padding-left:var(--mscoa-computation-spacing-md);border-radius:4px;margin-top:10px;line-height:1.6;max-width:500px}.info strong{opacity:1}.toggle-button{height:28px;width:28px;padding:0;margin-right:var(--mscoa-computation-spacing-xs);margin-left:var(--mscoa-computation-spacing-xs)}.toggle-button:focus-visible{outline:2px solid var(--mscoa-computation-selected-color);outline-offset:2px;border-radius:4px}mat-tree{flex:1;min-height:280px;min-width:0;overflow:auto;padding:var(--mscoa-computation-spacing-md)!important;background:none}mat-tree::-webkit-scrollbar{width:8px;height:8px}mat-tree::-webkit-scrollbar-track{background:var(--mat-sys-surface-container, var(--mscoa-surface-container, #F5F5F5));border-radius:4px}mat-tree::-webkit-scrollbar-thumb{background:var(--mscoa-text-secondary, #757575);border-radius:4px;opacity:.5}mat-tree::-webkit-scrollbar-thumb:hover{opacity:.8;background:var(--mscoa-primary, #243D91)}mat-tree{scrollbar-width:thin;scrollbar-color:var(--mat-sys-on-surface-variant, #757575) var(--mat-sys-surface-container, #F5F5F5)}mat-tree-node{display:flex;align-items:flex-start;min-height:28px;padding-right:var(--mscoa-computation-spacing-md)!important;padding-top:2px!important;padding-bottom:2px!important;box-sizing:border-box;width:100%;transition:background-color var(--mscoa-computation-transition)}mat-tree-node:focus-visible{outline:2px solid var(--mscoa-computation-selected-color);outline-offset:-2px;border-radius:4px}mat-tree-node:hover:not(:has(.selected)){background-color:#0000000a}.mat-tree-node{display:flex;align-items:center;flex-wrap:nowrap;min-height:28px;padding:var(--mscoa-computation-spacing-xs) 0;box-sizing:border-box;transition:background-color var(--mscoa-computation-transition),border-color var(--mscoa-computation-transition);border-radius:4px;margin:1px 0}.mat-tree-node:hover:not(.tree-node-selected):not(:has(.selected)){background-color:#0000000a}.mat-tree-node button,.mat-tree-node mat-checkbox{flex-shrink:0;height:28px}.mat-tree-node mat-checkbox{display:flex;align-items:center;height:28px;min-height:fit-content;flex:1;min-width:0}.mat-tree-node .label{flex:1;min-width:0;word-wrap:break-word;overflow-wrap:break-word;white-space:normal;overflow:visible}.header-toolbar{flex-shrink:0;background:var(--mscoa-surface-container)!important;box-shadow:var(--mscoa-elevation-2);border-bottom:1px solid var(--mscoa-divider)}.glass{background:#ffffff26;box-shadow:0 4px 30px #0000001a;backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid rgba(255,255,255,.2)}@media(prefers-reduced-motion:reduce){.glass{backdrop-filter:none;-webkit-backdrop-filter:none}}.main-toolbar{min-width:0;padding-top:var(--mscoa-computation-spacing-md);min-height:var(--mscoa-computation-toolbar-height);overflow:hidden}.main-toolbar .toolbar-title{font-size:18px;font-weight:500;color:var(--mscoa-text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-toolbar{flex-shrink:0;height:var(--mscoa-computation-toolbar-height);min-width:0;overflow:hidden}.search-toolbar .search-field{flex:1;width:100%;max-width:100%;min-width:0;border-radius:var(--mscoa-computation-border-radius);overflow:clip}.search-toolbar .search-field.search-disabled ::ng-deep .mat-mdc-text-field-wrapper{background-color:var(--mscoa-surface-container)!important;border:1px dashed var(--mscoa-divider)}.search-toolbar .search-field.search-disabled ::ng-deep .mat-mdc-form-field-label{color:var(--mscoa-text-secondary)!important}.search-toolbar .search-field.search-disabled ::ng-deep input{cursor:not-allowed;color:var(--mscoa-text-secondary)!important}.search-toolbar .search-field.search-disabled ::ng-deep button{opacity:.5;cursor:not-allowed}.search-toolbar .search-field.search-disabled ::ng-deep .mat-mdc-form-field-hint{color:var(--mscoa-text-secondary);font-size:.75rem}.tree-breadcrumb{flex-shrink:0;display:flex;flex-wrap:wrap;align-items:center;gap:var(--mscoa-spacing-xs, 4px);padding:var(--mscoa-spacing-sm, 8px) var(--mscoa-spacing-md, 16px);margin:0 var(--mscoa-spacing-md, 16px) var(--mscoa-spacing-sm, 8px);background:var(--mat-sys-surface-container, var(--mscoa-surface-container, #F5F5F5));border-radius:6px;border-left:3px solid var(--mat-sys-primary, var(--mscoa-primary, #243D91));font-size:.8125rem;line-height:1.4;max-width:500px}.tree-breadcrumb .breadcrumb-label{color:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary, #757575));font-weight:500;margin-right:var(--mscoa-spacing-xs, 4px)}.tree-breadcrumb .breadcrumb-part{color:var(--mat-sys-on-surface, var(--mscoa-text-primary, #212121))}.tree-breadcrumb .breadcrumb-part.is-current{font-weight:600;color:var(--mat-sys-primary, var(--mscoa-primary, #243D91))}.tree-breadcrumb .breadcrumb-sep{font-size:16px;width:16px;height:16px;color:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary, #757575));margin:0 var(--mscoa-spacing-xs, 4px)}.search-results-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:var(--mscoa-spacing-sm, 8px);overflow-y:auto;flex:1;min-height:0;padding:var(--mscoa-spacing-xs, 4px) 0}.search-results-grid::-webkit-scrollbar{width:6px}.search-results-grid::-webkit-scrollbar-track{background:var(--mat-sys-surface-container, var(--mscoa-surface-container));border-radius:3px}.search-results-grid::-webkit-scrollbar-thumb{background:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary));border-radius:3px;opacity:.5}.search-results-grid::-webkit-scrollbar-thumb:hover{opacity:.8;background:var(--mat-sys-primary, var(--mscoa-primary))}.search-results-grid{scrollbar-width:thin;scrollbar-color:var(--mat-sys-on-surface-variant, #757575) var(--mat-sys-surface-container, #F5F5F5)}.path-result-item{cursor:pointer;transition:background-color var(--mscoa-computation-transition);min-height:56px;padding:var(--mscoa-spacing-sm, 8px) var(--mscoa-spacing-md, 16px);padding-right:40px;border-radius:8px;border:1px solid var(--mat-sys-outline-variant, var(--mscoa-divider));background:var(--mat-sys-surface, var(--mscoa-surface));display:flex;flex-direction:column;gap:4px;align-items:flex-start;position:relative}.path-result-item:hover,.path-result-item:focus-visible{background-color:var(--mat-sys-surface-container, rgba(0, 0, 0, .04));outline:none}.path-result-item:hover .breadcrumb-container,.path-result-item:focus-visible .breadcrumb-container{flex-wrap:wrap}.path-result-item:hover .breadcrumb-container .text-content,.path-result-item:focus-visible .breadcrumb-container .text-content{white-space:normal;max-width:none}.path-result-item:focus-visible{outline:2px solid var(--mscoa-computation-selected-color);outline-offset:-2px}.path-result-arrow{position:absolute;right:var(--mscoa-spacing-sm);top:50%;transform:translateY(-50%);font-size:18px;width:18px;height:18px;color:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary))}.breadcrumb-container{display:flex;align-items:center;flex-wrap:wrap;overflow:hidden;width:100%}.crumb-segment{display:flex;align-items:center;color:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary, #6c757d));white-space:nowrap;overflow:hidden;max-width:100%}.crumb-segment .text-content{display:inline-block;overflow:hidden;text-overflow:ellipsis;max-width:150px;vertical-align:middle}.crumb-segment .separator{font-size:1em;height:16px;width:16px;margin:0 var(--mscoa-computation-spacing-xs);color:var(--mat-sys-outline-variant, var(--mscoa-divider, #bdbdbd));flex-shrink:0}.crumb-segment.is-target{color:var(--mat-sys-on-surface, var(--mscoa-text-primary, #000));font-weight:500;flex-shrink:0}.crumb-segment.is-target .text-content{color:var(--mat-sys-on-surface, var(--mscoa-text-primary, #000));max-width:none}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--mscoa-computation-spacing-lg);text-align:center;gap:var(--mscoa-computation-spacing-md)}.empty-state .empty-icon{font-size:48px;width:48px;height:48px;opacity:.5}.empty-state .empty-message{margin:0;font-size:14px}.error-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--mscoa-computation-spacing-lg);text-align:center;gap:var(--mscoa-computation-spacing-md)}.error-container .error-icon{font-size:48px;width:48px;height:48px;color:var(--mat-sys-error)}.error-container .error-message{margin:0;font-size:14px;color:var(--mat-sys-error)}mark{background-color:#ffeb3b;color:inherit;padding:0;font-weight:500}.instructions-panel{flex-shrink:0;margin:var(--mscoa-spacing-sm, 8px) var(--mscoa-spacing-md, 16px);margin-bottom:var(--mscoa-spacing-xs, 4px);box-shadow:var(--mscoa-elevation-1);border-radius:6px;overflow:hidden;background:var(--mat-sys-surface-container, var(--mscoa-surface-container, #F5F5F5));transition:box-shadow var(--mscoa-computation-transition)}.instructions-panel.compact-instructions ::ng-deep .mat-expansion-panel-header{padding:var(--mscoa-spacing-xs, 4px) var(--mscoa-spacing-sm, 8px)!important;min-height:40px!important;height:auto!important}.instructions-panel.compact-instructions ::ng-deep .mat-expansion-panel-body{padding:var(--mscoa-spacing-xs, 4px) var(--mscoa-spacing-sm, 8px)!important}.instructions-panel:hover{box-shadow:var(--mscoa-elevation-2)}.instructions-panel ::ng-deep .mat-expansion-panel-header{padding:var(--mscoa-spacing-sm, 8px) var(--mscoa-spacing-md, 16px);background:var(--mscoa-surface-container, #F5F5F5)!important}.instructions-panel ::ng-deep .mat-expansion-panel-header:hover{background:var(--mat-sys-surface, var(--mscoa-surface, #FFFFFF))!important}.instructions-panel ::ng-deep .mat-expansion-panel-body{padding:var(--mscoa-spacing-sm, 8px) var(--mscoa-spacing-md, 16px)!important;background:var(--mat-sys-surface, var(--mscoa-surface, #FFFFFF))}.instructions-panel .instruction-icon{margin-right:var(--mscoa-spacing-xs, 4px);color:var(--mscoa-info, #2196F3);font-size:18px;width:18px;height:18px}.instructions-panel .instructions-content{padding:var(--mscoa-spacing-xs, 4px) 0;display:flex;flex-direction:column;gap:var(--mscoa-spacing-xs, 4px)}.instructions-panel .instruction-item{display:flex;align-items:center;gap:var(--mscoa-spacing-xs, 4px);font-size:.75rem;line-height:1.4;padding:var(--mscoa-spacing-xs, 4px);border-radius:4px;transition:background-color var(--mscoa-computation-transition)}.instructions-panel .instruction-item:hover{background-color:var(--mscoa-primary-light, #E3F2FD)}.instructions-panel .instruction-item .instruction-bullet{font-size:16px;width:16px;height:16px;color:var(--mscoa-primary, #243D91);flex-shrink:0}.instructions-panel .instruction-item span{flex:1}.instructions-panel .instruction-item span strong{font-weight:600}.search-results-header{display:flex;align-items:center;gap:var(--mscoa-computation-spacing-sm)}.search-results-header .search-icon{margin-right:var(--mscoa-computation-spacing-sm)}.search-results-list{padding:var(--mscoa-computation-spacing-md);display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden}.search-results-hint{font-size:.75rem;color:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary, #757575));margin:0 var(--mscoa-spacing-md, 16px) var(--mscoa-spacing-sm, 8px);padding:var(--mscoa-spacing-xs, 4px) 0}.path-result-meta{font-size:.6875rem;color:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary, #757575));text-transform:uppercase;letter-spacing:.3px}.mat-mdc-subheader{position:sticky;top:0;z-index:10;background:var(--mat-sys-surface-container)}.count-badge{margin-left:auto;font-weight:400;opacity:.7;font-size:.9em}.drawer-container{flex:1;min-height:0;overflow:hidden;max-width:100%;background:var(--mat-sys-surface-container)!important;display:flex}.drawer-container ::ng-deep .mat-drawer-content{min-height:0;overflow:auto;height:calc(100vh - 220px);flex:1 1 30%;min-width:260px}.account-drawer{min-width:420px;max-width:min(700px,65vw)!important;width:520px!important;overflow:hidden;display:flex;flex-direction:column;background:var(--mat-sys-surface-container)!important;padding:var(--mscoa-computation-spacing-md)}.account-drawer app-scoa-account-table{flex:1;min-height:0;overflow:auto;display:flex;flex-direction:column}.account-drawer .loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--mscoa-computation-spacing-lg);gap:var(--mscoa-computation-spacing-md)}.account-drawer .loading-container p{margin:0;font-size:.875rem}.skeleton-row{display:flex;align-items:center;padding:var(--mscoa-spacing-sm) var(--mscoa-spacing-md);gap:var(--mscoa-spacing-md);animation:skeleton-pulse 1.5s ease-in-out infinite}.skeleton-row .skeleton-checkbox{width:20px;height:20px;border-radius:4px;background:linear-gradient(90deg,#f0f0f0 25%,#e0e0e0,#f0f0f0 75%);background-size:200% 100%}.skeleton-row .skeleton-text{flex:1;height:16px;border-radius:4px;background:linear-gradient(90deg,#f0f0f0 25%,#e0e0e0,#f0f0f0 75%);background-size:200% 100%}.skeleton-row .skeleton-text.short{width:60%}.skeleton-row .skeleton-text.medium{width:80%}@keyframes skeleton-pulse{0%{background-position:200% 0}to{background-position:-200% 0}}.skeleton-table .skeleton-row{border-bottom:1px solid var(--mscoa-divider)}.skeleton-table .skeleton-row:last-child{border-bottom:none}.account-details-container{flex:1;min-height:0;max-width:520px;margin:0 auto;width:100%;background:#ffffff1c;-webkit-backdrop-filter:blur(2.5px);backdrop-filter:blur(2.5px);padding:var(--mscoa-spacing-xs, 4px);border:1px solid rgba(255,255,255,.3);border:1px solid var(--mat-sys-outline-variant, var(--mscoa-divider, #E0E0E0));border-radius:8px;overflow-y:auto}.account-details-container::-webkit-scrollbar{width:6px}.account-details-container::-webkit-scrollbar-track{background:var(--mat-sys-surface-container, var(--mscoa-surface-container, #F5F5F5));border-radius:3px}.account-details-container::-webkit-scrollbar-thumb{background:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary, #757575));border-radius:3px;opacity:.5}.account-details-container::-webkit-scrollbar-thumb:hover{opacity:.8;background:var(--mat-sys-primary, var(--mscoa-primary, #243D91))}.account-details-container{scrollbar-width:thin;scrollbar-color:var(--mat-sys-on-surface-variant, #757575) var(--mat-sys-surface-container, #F5F5F5)}.account-details-container ::ng-deep app-account-value{max-width:100%}.account-details-container ::ng-deep app-account-value mat-toolbar{background:var(--mat-sys-surface-container, var(--mscoa-surface-container))!important;box-shadow:var(--mscoa-elevation-1);margin-bottom:0;border-radius:8px 8px 0 0}.account-details-container ::ng-deep app-account-value .account-grid{gap:var(--mscoa-spacing-xs, 4px) var(--mscoa-spacing-sm, 8px);padding:var(--mscoa-spacing-sm, 8px);background:var(--mat-sys-surface, var(--mscoa-surface));border-radius:0 0 8px 8px;box-shadow:var(--mscoa-elevation-1)}.tree-content{min-height:280px;flex:1;min-width:0;display:flex;flex-direction:column;overflow:hidden;padding-right:var(--mscoa-computation-spacing-sm)}.footer-toolbar{flex-shrink:0;height:fit-content;padding-top:var(--mscoa-computation-spacing-md)!important;padding-bottom:var(--mscoa-computation-spacing-md)!important;min-height:58px;box-shadow:0 -2px 8px #0000000d}.footer-toolbar .footer-actions{display:flex;width:100%;gap:var(--mscoa-computation-spacing-sm);flex-direction:column;min-height:58px}.footer-toolbar .footer-actions .action-button{width:100%;font-weight:500;transition:all .2s ease}.footer-toolbar .footer-actions .action-button:focus-visible{outline:2px solid var(--mscoa-computation-selected-color);outline-offset:2px}.footer-toolbar .footer-actions .action-button:hover:not(:disabled){transform:translateY(-1px);box-shadow:var(--mscoa-elevation-2)}.footer-toolbar .footer-actions .action-button:active:not(:disabled){transform:translateY(0)}.footer-toolbar .footer-actions .action-button[disabled]{opacity:.5;cursor:not-allowed}.footer-toolbar .footer-actions .save-button{background-color:var(--mscoa-primary, #243D91)!important;color:#fff!important}@media(min-width:768px){.footer-actions{flex-direction:row}.footer-actions .action-button{width:auto;min-width:120px}.drawer-container{display:flex}}@media(prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatModulesModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3$2.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i1$1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i4$1.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: i5$1.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i5$1.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i5$1.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7$1.MatNavList, selector: "mat-nav-list", exportAs: ["matNavList"] }, { kind: "directive", type: i7$1.MatListSubheaderCssMatStyler, selector: "[mat-subheader], [matSubheader]" }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i3$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3$1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i10$2.MatDrawer, selector: "mat-drawer", inputs: ["position", "mode", "disableClose", "autoFocus", "opened"], outputs: ["openedChange", "opened", "openedStart", "closed", "closedStart", "positionChanged"], exportAs: ["matDrawer"] }, { kind: "component", type: i10$2.MatDrawerContainer, selector: "mat-drawer-container", inputs: ["autosize", "hasBackdrop"], outputs: ["backdropClick"], exportAs: ["matDrawerContainer"] }, { kind: "component", type: i5.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "directive", type: i12.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i12.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { kind: "component", type: i12.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i12.MatTreeNode, selector: "mat-tree-node", inputs: ["tabIndex", "disabled"], outputs: ["activation", "expandedChange"], exportAs: ["matTreeNode"] }, { kind: "directive", type: i13.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: AccountValueComponent, selector: "app-account-value", inputs: ["mscoaAccount", "accountInputs", "userCanClearAccount"], outputs: ["clearSelectedAccount", "updateAccount"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: ScoaAccountTableComponent, selector: "app-scoa-account-table", inputs: ["data", "selectedAccount", "segment"], outputs: ["accountSelected"] }, { kind: "ngmodule", type: _InternalFormsSharedModule }, { kind: "pipe", type: i2$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i2$1.UpperCasePipe, name: "uppercase" }] }); }
9737
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: MscoaComputationComponent, isStandalone: true, selector: "app-mscoa-computation", host: { listeners: { "keydown": "handleKeyboardNavigation($event)" } }, ngImport: i0, template: "<!-- Header Toolbar -->\r\n<mat-toolbar class=\"main-toolbar header-toolbar\" role=\"banner\">\r\n <span class=\"toolbar-title\">\r\n {{ (segment || 'No segment') | uppercase }} : {{ activeColumn | uppercase }} ACCOUNT\r\n </span>\r\n <span class=\"spacer\"></span>\r\n @if (selectedAccount) {\r\n <button mat-flat-button (click)=\"clearSelectedAccount(); cancel()\" [attr.aria-label]=\"'Change account'\">\r\n <mat-icon>arrow_back</mat-icon>\r\n Change Account\r\n </button>\r\n }\r\n</mat-toolbar>\r\n\r\n<!-- Search Bar - Hidden when account selected -->\r\n@if (!selectedAccount) {\r\n<mat-toolbar class=\"main-toolbar header-toolbar search-toolbar\" role=\"search\">\r\n <mat-form-field [subscriptSizing]=\"'dynamic'\" class=\"search-field\">\r\n <mat-label position=\"floating\">Search {{ segment || 'account' }} : {{ activeColumn || '' }} Account</mat-label>\r\n <input matInput [formControl]=\"accountSearchTextControl\"\r\n [placeholder]=\"('Search ' + segment + ' : ' + activeColumn + ' Account').toUpperCase()\"\r\n [attr.aria-label]=\"'Search for account'\" autocomplete=\"off\">\r\n <button mat-icon-button matSuffix (click)=\"clearSearch()\" [attr.aria-label]=\"'Clear search'\" type=\"button\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n</mat-toolbar>\r\n}\r\n\r\n<mat-divider></mat-divider>\r\n\r\n<!-- Account Details View -->\r\n@if (selectedAccount) {\r\n<div class=\"account-details-container\" role=\"region\" [attr.aria-label]=\"'Account details'\">\r\n <app-account-value [accountInputs]=\"accountInputs\" [userCanClearAccount]=\"userCanClearAccount\"\r\n [mscoaAccount]=\"selectedAccount\" (updateAccount)=\"updateAccount($event)\"\r\n (clearSelectedAccount)=\"clearSelectedAccount()\">\r\n </app-account-value>\r\n</div>\r\n} @else {\r\n<!-- Main Content Area with Drawer -->\r\n<mat-drawer-container class=\"drawer-container\" [attr.aria-label]=\"'Account selection interface'\">\r\n <!-- Account Table Drawer -->\r\n <mat-drawer #drawer class=\"account-drawer\" mode=\"side\" position=\"end\"\r\n [opened]=\"!searchingAccounts && !!selectedTreeNode && !accountSearchTextControl.value\">\r\n\r\n\r\n\r\n\r\n @if (searchingAccounts) {\r\n <div class=\"loading-container skeleton-table\" role=\"status\" [attr.aria-live]=\"'polite'\">\r\n @for (item of [1,2,3,4,5]; track item) {\r\n <div class=\"skeleton-row\">\r\n <div class=\"skeleton-checkbox\"></div>\r\n <div class=\"skeleton-text short\"></div>\r\n <div class=\"skeleton-text medium\"></div>\r\n <div class=\"skeleton-text\"></div>\r\n </div>\r\n }\r\n </div>\r\n } @else if (hasError) {\r\n <div class=\"error-container\" role=\"alert\" [attr.aria-live]=\"'assertive'\">\r\n <mat-icon class=\"error-icon\" aria-hidden=\"true\">error</mat-icon>\r\n <p class=\"error-message\">{{ errorMessage }}</p>\r\n <button mat-flat-button color=\"primary\" (click)=\"retryLoadAccounts()\"\r\n [attr.aria-label]=\"'Retry loading accounts'\">\r\n <mat-icon aria-hidden=\"true\">refresh</mat-icon>\r\n Retry\r\n </button>\r\n </div>\r\n } @else if (searchAccounts.length === 0 && selectedTreeNode) {\r\n <div class=\"empty-state\" role=\"status\" [attr.aria-live]=\"'polite'\">\r\n <mat-icon class=\"empty-icon\" aria-hidden=\"true\">info</mat-icon>\r\n <p class=\"empty-message\">No accounts found for this category.</p>\r\n </div>\r\n } @else {\r\n <app-scoa-account-table [selectedAccount]=\"selectedAccount\" [segment]=\"segment\"\r\n (accountSelected)=\"selectAccount($event)\" [data]=\"{\r\n accounts: searchAccounts,\r\n account: currentAccountPath || ''\r\n }\">\r\n </app-scoa-account-table>\r\n }\r\n </mat-drawer>\r\n <!-- Tree Content Area -->\r\n <div class=\"tree-content\" role=\"main\">\r\n\r\n <!-- Search Results View -->\r\n @if (accountSearchTextControl.value) {\r\n <mat-nav-list class=\"search-results-list\" role=\"list\">\r\n <div mat-subheader class=\"search-results-header\">\r\n <mat-icon class=\"search-icon\">search</mat-icon>\r\n Search Results\r\n <span class=\"count-badge\" [attr.aria-label]=\"'Number of results'\">\r\n ({{ (searchedPaths$ | async)?.length || 0 }})\r\n </span>\r\n </div>\r\n\r\n @if ((searchedPaths$ | async)?.length === 0) {\r\n <!-- Empty Search Results -->\r\n <div class=\"empty-state\" role=\"status\" [attr.aria-live]=\"'polite'\">\r\n <mat-icon class=\"empty-icon\" aria-hidden=\"true\">search_off</mat-icon>\r\n <p class=\"empty-message\">\r\n No account found for the search\r\n <strong>{{ accountSearchTextControl.value }}</strong>.\r\n </p>\r\n <button mat-flat-button (click)=\"clearSearch()\"\r\n [attr.aria-label]=\"'Clear search and show all accounts'\">\r\n Clear Search\r\n </button>\r\n </div>\r\n } @else {\r\n <p class=\"search-results-hint\">Click a result to load accounts for that category.</p>\r\n <div class=\"search-results-grid\" role=\"list\">\r\n @for (searchedItem of (searchedPaths$ | async); track searchedItem.join(':')) {\r\n\r\n @defer (on viewport) {\r\n <div class=\"path-result-item\" role=\"listitem\" (click)=\"selectPath(searchedItem)\"\r\n [attr.aria-label]=\"'Load accounts for: ' + searchedItem.join(' > ') + '. Click to select.'\"\r\n tabindex=\"0\" (keydown.enter)=\"selectPath(searchedItem)\"\r\n (keydown.space)=\"selectPath(searchedItem); $event.preventDefault()\">\r\n <div class=\"breadcrumb-container\">\r\n @for (part of searchedItem; track part; let last = $last) {\r\n <div class=\"crumb-segment\" [class.is-target]=\"last\">\r\n <span class=\"text-content\"\r\n [innerHTML]=\"accountSearchTextControl.value ? highlightSearchText(part, accountSearchTextControl.value) : part\">\r\n </span>\r\n @if (!last) {\r\n <mat-icon class=\"separator\" aria-hidden=\"true\">chevron_right</mat-icon>\r\n }\r\n </div>\r\n }\r\n </div>\r\n <span class=\"path-result-meta\">Load accounts</span>\r\n <mat-icon class=\"path-result-arrow\" aria-hidden=\"true\">arrow_forward</mat-icon>\r\n </div>\r\n }@placeholder {\r\n <div class=\"mat-spinner-container\">\r\n <mat-spinner diameter=\"16\" color=\"primary\" aria-label=\"Loading search result\"></mat-spinner>\r\n </div>\r\n\r\n }\r\n\r\n }\r\n </div>\r\n }\r\n </mat-nav-list>\r\n }\r\n\r\n <!-- Tree View -->\r\n @else {\r\n <!-- Breadcrumb: show current path when category selected (like file explorers) -->\r\n @if (selectedTreeNode?.path?.length) {\r\n <div class=\"tree-breadcrumb\" role=\"navigation\"\r\n [attr.aria-label]=\"'Current category: ' + (selectedTreeNode?.path ?? []).join(' > ')\">\r\n <span class=\"breadcrumb-label\">Category:</span>\r\n @for (part of (selectedTreeNode?.path ?? []); track $index; let last = $last) {\r\n <span class=\"breadcrumb-part\" [class.is-current]=\"last\">{{ part }}</span>\r\n @if (!last) {\r\n <mat-icon class=\"breadcrumb-sep\" aria-hidden=\"true\">chevron_right</mat-icon>\r\n }\r\n }\r\n </div>\r\n }\r\n <!-- Compact Instructions - Collapsed by default -->\r\n @if (noneIsExpanded) {\r\n <mat-expansion-panel [expanded]=\"false\" class=\"instructions-panel compact-instructions\"\r\n [attr.aria-label]=\"'How to use the account selector'\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <mat-icon class=\"instruction-icon\" aria-hidden=\"true\">info</mat-icon>\r\n <span>Quick tips</span>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <div class=\"instructions-content\">\r\n <div class=\"instruction-item\">\r\n <mat-icon class=\"instruction-bullet\" aria-hidden=\"true\">folder_open</mat-icon>\r\n <span>Expand folders to browse</span>\r\n </div>\r\n <div class=\"instruction-item\">\r\n <mat-icon class=\"instruction-bullet\" aria-hidden=\"true\">check_box</mat-icon>\r\n <span>Check category to load accounts</span>\r\n </div>\r\n <div class=\"instruction-item\">\r\n <mat-icon class=\"instruction-bullet\" aria-hidden=\"true\">search</mat-icon>\r\n <span>Use search bar to find accounts</span>\r\n </div>\r\n </div>\r\n </mat-expansion-panel>\r\n }\r\n\r\n <!-- Account Tree -->\r\n <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\" role=\"tree\"\r\n [attr.aria-label]=\"'Account category tree'\">\r\n\r\n <!-- Leaf Node (no children) -->\r\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodePadding role=\"treeitem\"\r\n [attr.data-tree-path]=\"node.path?.join(':')\">\r\n <button class=\"toggle-button\" mat-icon-button disabled aria-hidden=\"true\">\r\n </button>\r\n <mat-checkbox (change)=\"selectNode(node)\"\r\n [disabled]=\"isActivePathOrParent(node.path) && searchingAccounts\"\r\n [checked]=\"isActivePathOrParent(node.path)\"\r\n [attr.aria-label]=\"'Select ' + node.name + ' account category'\">\r\n @if (isActivePathOrParent(node.path) && searchingAccounts) {\r\n <mat-spinner color=\"primary\" class=\"loading\"\r\n [attr.aria-label]=\"'Loading accounts for ' + node.name\">\r\n </mat-spinner>\r\n <span class=\"label selected\" [attr.aria-live]=\"'polite'\">\r\n Loading <strong>{{ node.name }}</strong> accounts...\r\n </span>\r\n } @else {\r\n <span class=\"label\" [class.selected]=\"isActivePathOrParent(node.path)\">\r\n {{ node.name }}\r\n </span>\r\n }\r\n </mat-checkbox>\r\n </mat-tree-node>\r\n\r\n <!-- Branch Node (has children) -->\r\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" matTreeNodePadding role=\"treeitem\"\r\n [attr.data-tree-path]=\"node.path?.join(':')\" [attr.aria-expanded]=\"treeControl.isExpanded(node)\">\r\n <button class=\"toggle-button\" mat-icon-button\r\n [attr.aria-label]=\"(treeControl.isExpanded(node) ? 'Collapse' : 'Expand') + ' ' + node.name\"\r\n (click)=\"toggleNode(node)\" type=\"button\">\r\n <mat-icon class=\"mat-icon-rtl-mirror\">\r\n {{ treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\r\n </mat-icon>\r\n </button>\r\n\r\n @if (isActivePathOrParent(node.path)) {\r\n <mat-checkbox (change)=\"selectNode(node)\" [disabled]=\"true\" [checked]=\"true\"\r\n [attr.aria-label]=\"'Selected: ' + node.name\">\r\n <span class=\"label selected\">\r\n {{ node.name }}\r\n </span>\r\n </mat-checkbox>\r\n } @else {\r\n <mat-checkbox (change)=\"selectNode(node)\" [checked]=\"false\"\r\n [attr.aria-label]=\"'Select ' + node.name + ' account category'\">\r\n <span class=\"label\">\r\n {{ node.name }}\r\n </span>\r\n </mat-checkbox>\r\n }\r\n </mat-tree-node>\r\n </mat-tree>\r\n }\r\n\r\n </div>\r\n</mat-drawer-container>\r\n}\r\n\r\n<mat-divider></mat-divider>\r\n\r\n<!-- Footer Actions -->\r\n<mat-dialog-actions style=\" background: var(--mscoa-surface-container) !important;\" align=\"end\">\r\n <button class=\"action-button close-button\" mat-button (click)=\"closeAndPassData(undefined)\"\r\n [attr.aria-label]=\"'Close dialog without saving'\" type=\"button\">\r\n\r\n Close\r\n </button>\r\n @if (userCanClearAccount ) {\r\n <button class=\"action-button save-button\" mat-flat-button [disabled]=\"!saveSelection\" (click)=\"saveAccount()\"\r\n [attr.aria-label]=\"saveSelection ? 'Save account selection' : 'Save disabled - account unchanged or invalid'\"\r\n type=\"button\">\r\n <mat-icon aria-hidden=\"true\">save</mat-icon>\r\n Save\r\n </button>\r\n }\r\n\r\n</mat-dialog-actions>", styles: [":host{display:flex;flex-direction:column;max-height:98vh;overflow:hidden;min-height:0;--mscoa-primary: var(--mat-sys-primary, #243D91);--mscoa-primary-light: var(--mat-sys-primary-container, #E3F2FD);--mscoa-primary-dark: var(--mat-sys-primary, #1A2E6B);--mscoa-success: var(--mat-sys-success, #4CAF50);--mscoa-error: var(--mat-sys-error, #F44336);--mscoa-warning: var(--mat-sys-warning, #FF9800);--mscoa-info: var(--mat-sys-primary, #2196F3);--mscoa-surface: var(--mat-sys-surface, #FFFFFF);--mscoa-surface-container: var(--mat-sys-surface-container, #F5F5F5);--mscoa-text-primary: var(--mat-sys-on-surface, #212121);--mscoa-text-secondary: var(--mat-sys-on-surface-variant, #757575);--mscoa-divider: var(--mat-sys-outline-variant, #E0E0E0);--mscoa-spacing-xs: 4px;--mscoa-spacing-sm: 8px;--mscoa-spacing-md: 16px;--mscoa-spacing-lg: 24px;--mscoa-spacing-xl: 32px;--mscoa-elevation-1: 0 1px 3px rgba(0,0,0,.12);--mscoa-elevation-2: 0 2px 6px rgba(0,0,0,.12);--mscoa-elevation-4: 0 4px 12px rgba(0,0,0,.12);--mscoa-computation-spacing-xs: var(--mscoa-spacing-xs);--mscoa-computation-spacing-sm: var(--mscoa-spacing-sm);--mscoa-computation-spacing-md: var(--mscoa-spacing-md);--mscoa-computation-spacing-lg: var(--mscoa-spacing-lg);--mscoa-computation-toolbar-height: 56px;--mscoa-header-height: 56px;--mscoa-search-height: 56px;--mscoa-footer-height: 58px;--mscoa-divider-height: 1px;--mscoa-computation-selected-color: var(--mscoa-primary);--mscoa-computation-border-radius: 16px;--mscoa-computation-transition: .2s ease}mat-divider{flex-shrink:0}h4{margin-top:0;margin-bottom:0;padding-left:var(--mscoa-computation-spacing-md)}.label{font-size:.875em}.selected{color:var(--mscoa-primary)!important;font-weight:600;background-color:transparent}.mat-tree-node.tree-node-selected,.mat-tree-node[aria-selected=true]{background:linear-gradient(90deg,var(--mat-sys-primary-container, var(--mscoa-primary-light)) 0%,transparent 100%)!important;box-shadow:inset 3px 0 0 var(--mat-sys-primary, var(--mscoa-primary));border-radius:0 4px 4px 0}.mat-tree-node:hover:not(.tree-node-selected):not(:has(.selected)){background-color:#00000008;transition:background-color var(--mscoa-computation-transition)}mat-tree-node{transition:all var(--mscoa-computation-transition)}mat-tree-node:has(.selected){background:linear-gradient(90deg,var(--mat-sys-primary-container, var(--mscoa-primary-light)) 0%,transparent 100%)!important;box-shadow:inset 3px 0 0 var(--mat-sys-primary, var(--mscoa-primary));border-radius:0 4px 4px 0}mat-tree-node:hover:not(:has(.selected)){background-color:#00000008}mat-tree-node mat-checkbox[checked=true] ::ng-deep .mdc-checkbox{background-color:var(--mscoa-primary, #243D91)!important;border-color:var(--mscoa-primary, #243D91)!important}.accountSeperator{margin-left:var(--mscoa-computation-spacing-xs);margin-right:var(--mscoa-computation-spacing-xs)}.loading{width:24px!important;height:24px!important;--mdc-circular-progress-size: 28px !important;--mdc-circular-progress-active-indicator-width: 24px !important;position:absolute;left:var(--mscoa-computation-spacing-sm);bottom:var(--mscoa-computation-spacing-sm)}.info{font-size:.875rem;opacity:.8;padding-left:var(--mscoa-computation-spacing-md);border-radius:4px;margin-top:10px;line-height:1.6;max-width:500px}.info strong{opacity:1}.toggle-button{height:28px;width:28px;padding:0;margin-right:var(--mscoa-computation-spacing-xs);margin-left:var(--mscoa-computation-spacing-xs)}.toggle-button:focus-visible{outline:2px solid var(--mscoa-computation-selected-color);outline-offset:2px;border-radius:4px}mat-tree{flex:1;min-height:280px;min-width:0;overflow:auto;padding:var(--mscoa-computation-spacing-md)!important;background:none}mat-tree::-webkit-scrollbar{width:8px;height:8px}mat-tree::-webkit-scrollbar-track{background:var(--mat-sys-surface-container, var(--mscoa-surface-container, #F5F5F5));border-radius:4px}mat-tree::-webkit-scrollbar-thumb{background:var(--mscoa-text-secondary, #757575);border-radius:4px;opacity:.5}mat-tree::-webkit-scrollbar-thumb:hover{opacity:.8;background:var(--mscoa-primary, #243D91)}mat-tree{scrollbar-width:thin;scrollbar-color:var(--mat-sys-on-surface-variant, #757575) var(--mat-sys-surface-container, #F5F5F5)}mat-tree-node{display:flex;align-items:flex-start;min-height:28px;padding-right:var(--mscoa-computation-spacing-md)!important;padding-top:2px!important;padding-bottom:2px!important;box-sizing:border-box;width:100%;transition:background-color var(--mscoa-computation-transition)}mat-tree-node:focus-visible{outline:2px solid var(--mscoa-computation-selected-color);outline-offset:-2px;border-radius:4px}mat-tree-node:hover:not(:has(.selected)){background-color:#0000000a}.mat-tree-node{display:flex;align-items:center;flex-wrap:nowrap;min-height:28px;padding:var(--mscoa-computation-spacing-xs) 0;box-sizing:border-box;transition:background-color var(--mscoa-computation-transition),border-color var(--mscoa-computation-transition);border-radius:4px;margin:1px 0}.mat-tree-node:hover:not(.tree-node-selected):not(:has(.selected)){background-color:#0000000a}.mat-tree-node button,.mat-tree-node mat-checkbox{flex-shrink:0;height:28px}.mat-tree-node mat-checkbox{display:flex;align-items:center;height:28px;min-height:fit-content;flex:1;min-width:0}.mat-tree-node .label{flex:1;min-width:0;word-wrap:break-word;overflow-wrap:break-word;white-space:normal;overflow:visible}.header-toolbar{flex-shrink:0;background:var(--mscoa-surface-container)!important;box-shadow:var(--mscoa-elevation-2);border-bottom:1px solid var(--mscoa-divider)}.glass{background:#ffffff26;box-shadow:0 4px 30px #0000001a;backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid rgba(255,255,255,.2)}@media(prefers-reduced-motion:reduce){.glass{backdrop-filter:none;-webkit-backdrop-filter:none}}.main-toolbar{min-width:0;padding-top:var(--mscoa-computation-spacing-md);min-height:var(--mscoa-computation-toolbar-height);overflow:hidden}.main-toolbar .toolbar-title{font-size:18px;font-weight:500;color:var(--mscoa-text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-toolbar{flex-shrink:0;height:var(--mscoa-computation-toolbar-height);min-width:0;overflow:hidden}.search-toolbar .search-field{flex:1;width:100%;max-width:100%;min-width:0;border-radius:var(--mscoa-computation-border-radius);overflow:clip}.search-toolbar .search-field.search-disabled ::ng-deep .mat-mdc-text-field-wrapper{background-color:var(--mscoa-surface-container)!important;border:1px dashed var(--mscoa-divider)}.search-toolbar .search-field.search-disabled ::ng-deep .mat-mdc-form-field-label{color:var(--mscoa-text-secondary)!important}.search-toolbar .search-field.search-disabled ::ng-deep input{cursor:not-allowed;color:var(--mscoa-text-secondary)!important}.search-toolbar .search-field.search-disabled ::ng-deep button{opacity:.5;cursor:not-allowed}.search-toolbar .search-field.search-disabled ::ng-deep .mat-mdc-form-field-hint{color:var(--mscoa-text-secondary);font-size:.75rem}.tree-breadcrumb{flex-shrink:0;display:flex;flex-wrap:wrap;align-items:center;gap:var(--mscoa-spacing-xs, 4px);padding:var(--mscoa-spacing-sm, 8px) var(--mscoa-spacing-md, 16px);margin:0 var(--mscoa-spacing-md, 16px) var(--mscoa-spacing-sm, 8px);background:var(--mat-sys-surface-container, var(--mscoa-surface-container, #F5F5F5));border-radius:6px;border-left:3px solid var(--mat-sys-primary, var(--mscoa-primary, #243D91));font-size:.8125rem;line-height:1.4;max-width:500px}.tree-breadcrumb .breadcrumb-label{color:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary, #757575));font-weight:500;margin-right:var(--mscoa-spacing-xs, 4px)}.tree-breadcrumb .breadcrumb-part{color:var(--mat-sys-on-surface, var(--mscoa-text-primary, #212121))}.tree-breadcrumb .breadcrumb-part.is-current{font-weight:600;color:var(--mat-sys-primary, var(--mscoa-primary, #243D91))}.tree-breadcrumb .breadcrumb-sep{font-size:16px;width:16px;height:16px;color:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary, #757575));margin:0 var(--mscoa-spacing-xs, 4px)}.search-results-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:var(--mscoa-spacing-sm, 8px);overflow-y:auto;flex:1;min-height:0;padding:var(--mscoa-spacing-xs, 4px) 0}.search-results-grid::-webkit-scrollbar{width:6px}.search-results-grid::-webkit-scrollbar-track{background:var(--mat-sys-surface-container, var(--mscoa-surface-container));border-radius:3px}.search-results-grid::-webkit-scrollbar-thumb{background:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary));border-radius:3px;opacity:.5}.search-results-grid::-webkit-scrollbar-thumb:hover{opacity:.8;background:var(--mat-sys-primary, var(--mscoa-primary))}.search-results-grid{scrollbar-width:thin;scrollbar-color:var(--mat-sys-on-surface-variant, #757575) var(--mat-sys-surface-container, #F5F5F5)}.path-result-item{cursor:pointer;transition:background-color var(--mscoa-computation-transition);min-height:56px;padding:var(--mscoa-spacing-sm, 8px) var(--mscoa-spacing-md, 16px);padding-right:40px;border-radius:8px;border:1px solid var(--mat-sys-outline-variant, var(--mscoa-divider));background:var(--mat-sys-surface, var(--mscoa-surface));display:flex;flex-direction:column;gap:4px;align-items:flex-start;position:relative}.path-result-item:hover,.path-result-item:focus-visible{background-color:var(--mat-sys-surface-container, rgba(0, 0, 0, .04));outline:none}.path-result-item:hover .breadcrumb-container,.path-result-item:focus-visible .breadcrumb-container{flex-wrap:wrap}.path-result-item:hover .breadcrumb-container .text-content,.path-result-item:focus-visible .breadcrumb-container .text-content{white-space:normal;max-width:none}.path-result-item:focus-visible{outline:2px solid var(--mscoa-computation-selected-color);outline-offset:-2px}.path-result-arrow{position:absolute;right:var(--mscoa-spacing-sm);top:50%;transform:translateY(-50%);font-size:18px;width:18px;height:18px;color:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary))}.breadcrumb-container{display:flex;align-items:center;flex-wrap:wrap;overflow:hidden;width:100%}.crumb-segment{display:flex;align-items:center;color:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary, #6c757d));white-space:nowrap;overflow:hidden;max-width:100%}.crumb-segment .text-content{display:inline-block;overflow:hidden;text-overflow:ellipsis;max-width:150px;vertical-align:middle}.crumb-segment .separator{font-size:1em;height:16px;width:16px;margin:0 var(--mscoa-computation-spacing-xs);color:var(--mat-sys-outline-variant, var(--mscoa-divider, #bdbdbd));flex-shrink:0}.crumb-segment.is-target{color:var(--mat-sys-on-surface, var(--mscoa-text-primary, #000));font-weight:500;flex-shrink:0}.crumb-segment.is-target .text-content{color:var(--mat-sys-on-surface, var(--mscoa-text-primary, #000));max-width:none}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--mscoa-computation-spacing-lg);text-align:center;gap:var(--mscoa-computation-spacing-md)}.empty-state .empty-icon{font-size:48px;width:48px;height:48px;opacity:.5}.empty-state .empty-message{margin:0;font-size:14px}.error-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--mscoa-computation-spacing-lg);text-align:center;gap:var(--mscoa-computation-spacing-md)}.error-container .error-icon{font-size:48px;width:48px;height:48px;color:var(--mat-sys-error)}.error-container .error-message{margin:0;font-size:14px;color:var(--mat-sys-error)}mark{background-color:#ffeb3b;color:inherit;padding:0;font-weight:500}.instructions-panel{flex-shrink:0;margin:var(--mscoa-spacing-sm, 8px) var(--mscoa-spacing-md, 16px);margin-bottom:var(--mscoa-spacing-xs, 4px);box-shadow:var(--mscoa-elevation-1);border-radius:6px;overflow:hidden;background:var(--mat-sys-surface-container, var(--mscoa-surface-container, #F5F5F5));transition:box-shadow var(--mscoa-computation-transition)}.instructions-panel.compact-instructions ::ng-deep .mat-expansion-panel-header{padding:var(--mscoa-spacing-xs, 4px) var(--mscoa-spacing-sm, 8px)!important;min-height:40px!important;height:auto!important}.instructions-panel.compact-instructions ::ng-deep .mat-expansion-panel-body{padding:var(--mscoa-spacing-xs, 4px) var(--mscoa-spacing-sm, 8px)!important}.instructions-panel:hover{box-shadow:var(--mscoa-elevation-2)}.instructions-panel ::ng-deep .mat-expansion-panel-header{padding:var(--mscoa-spacing-sm, 8px) var(--mscoa-spacing-md, 16px);background:var(--mscoa-surface-container, #F5F5F5)!important}.instructions-panel ::ng-deep .mat-expansion-panel-header:hover{background:var(--mat-sys-surface, var(--mscoa-surface, #FFFFFF))!important}.instructions-panel ::ng-deep .mat-expansion-panel-body{padding:var(--mscoa-spacing-sm, 8px) var(--mscoa-spacing-md, 16px)!important;background:var(--mat-sys-surface, var(--mscoa-surface, #FFFFFF))}.instructions-panel .instruction-icon{margin-right:var(--mscoa-spacing-xs, 4px);color:var(--mscoa-info, #2196F3);font-size:18px;width:18px;height:18px}.instructions-panel .instructions-content{padding:var(--mscoa-spacing-xs, 4px) 0;display:flex;flex-direction:column;gap:var(--mscoa-spacing-xs, 4px)}.instructions-panel .instruction-item{display:flex;align-items:center;gap:var(--mscoa-spacing-xs, 4px);font-size:.75rem;line-height:1.4;padding:var(--mscoa-spacing-xs, 4px);border-radius:4px;transition:background-color var(--mscoa-computation-transition)}.instructions-panel .instruction-item:hover{background-color:var(--mscoa-primary-light, #E3F2FD)}.instructions-panel .instruction-item .instruction-bullet{font-size:16px;width:16px;height:16px;color:var(--mscoa-primary, #243D91);flex-shrink:0}.instructions-panel .instruction-item span{flex:1}.instructions-panel .instruction-item span strong{font-weight:600}.search-results-header{display:flex;align-items:center;gap:var(--mscoa-computation-spacing-sm)}.search-results-header .search-icon{margin-right:var(--mscoa-computation-spacing-sm)}.search-results-list{padding:var(--mscoa-computation-spacing-md);display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden}.search-results-hint{font-size:.75rem;color:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary, #757575));margin:0 var(--mscoa-spacing-md, 16px) var(--mscoa-spacing-sm, 8px);padding:var(--mscoa-spacing-xs, 4px) 0}.path-result-meta{font-size:.6875rem;color:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary, #757575));text-transform:uppercase;letter-spacing:.3px}.mat-mdc-subheader{position:sticky;top:0;z-index:10;background:var(--mat-sys-surface-container)}.count-badge{margin-left:auto;font-weight:400;opacity:.7;font-size:.9em}.drawer-container{flex:1;min-height:0;overflow:hidden;max-width:100%;background:var(--mat-sys-surface-container)!important;display:flex}.drawer-container ::ng-deep .mat-drawer-content{min-height:0;overflow:auto;height:calc(100vh - 220px);flex:1 1 30%;min-width:260px}.account-drawer{min-width:420px;max-width:min(700px,65vw)!important;width:520px!important;overflow:hidden;display:flex;flex-direction:column;background:var(--mat-sys-surface-container)!important;padding:var(--mscoa-computation-spacing-md)}.account-drawer app-scoa-account-table{flex:1;min-height:0;overflow:auto;display:flex;flex-direction:column}.account-drawer .loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--mscoa-computation-spacing-lg);gap:var(--mscoa-computation-spacing-md)}.account-drawer .loading-container p{margin:0;font-size:.875rem}.skeleton-row{display:flex;align-items:center;padding:var(--mscoa-spacing-sm) var(--mscoa-spacing-md);gap:var(--mscoa-spacing-md);animation:skeleton-pulse 1.5s ease-in-out infinite}.skeleton-row .skeleton-checkbox{width:20px;height:20px;border-radius:4px;background:linear-gradient(90deg,#f0f0f0 25%,#e0e0e0,#f0f0f0 75%);background-size:200% 100%}.skeleton-row .skeleton-text{flex:1;height:16px;border-radius:4px;background:linear-gradient(90deg,#f0f0f0 25%,#e0e0e0,#f0f0f0 75%);background-size:200% 100%}.skeleton-row .skeleton-text.short{width:60%}.skeleton-row .skeleton-text.medium{width:80%}@keyframes skeleton-pulse{0%{background-position:200% 0}to{background-position:-200% 0}}.skeleton-table .skeleton-row{border-bottom:1px solid var(--mscoa-divider)}.skeleton-table .skeleton-row:last-child{border-bottom:none}.account-details-container{flex:1;min-height:0;max-width:520px;margin:0 auto;width:100%;background:#ffffff1c;-webkit-backdrop-filter:blur(2.5px);backdrop-filter:blur(2.5px);padding:var(--mscoa-spacing-xs, 4px);border:1px solid rgba(255,255,255,.3);border:1px solid var(--mat-sys-outline-variant, var(--mscoa-divider, #E0E0E0));border-radius:8px;overflow-y:auto}.account-details-container::-webkit-scrollbar{width:6px}.account-details-container::-webkit-scrollbar-track{background:var(--mat-sys-surface-container, var(--mscoa-surface-container, #F5F5F5));border-radius:3px}.account-details-container::-webkit-scrollbar-thumb{background:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary, #757575));border-radius:3px;opacity:.5}.account-details-container::-webkit-scrollbar-thumb:hover{opacity:.8;background:var(--mat-sys-primary, var(--mscoa-primary, #243D91))}.account-details-container{scrollbar-width:thin;scrollbar-color:var(--mat-sys-on-surface-variant, #757575) var(--mat-sys-surface-container, #F5F5F5)}.account-details-container ::ng-deep app-account-value{max-width:100%}.account-details-container ::ng-deep app-account-value mat-toolbar{background:var(--mat-sys-surface-container, var(--mscoa-surface-container))!important;box-shadow:var(--mscoa-elevation-1);margin-bottom:0;border-radius:8px 8px 0 0}.account-details-container ::ng-deep app-account-value .account-grid{gap:var(--mscoa-spacing-xs, 4px) var(--mscoa-spacing-sm, 8px);padding:var(--mscoa-spacing-sm, 8px);background:var(--mat-sys-surface, var(--mscoa-surface));border-radius:0 0 8px 8px;box-shadow:var(--mscoa-elevation-1)}.tree-content{min-height:280px;flex:1;min-width:0;display:flex;flex-direction:column;overflow:hidden;padding-right:var(--mscoa-computation-spacing-sm)}.footer-toolbar{flex-shrink:0;height:fit-content;padding-top:var(--mscoa-computation-spacing-md)!important;padding-bottom:var(--mscoa-computation-spacing-md)!important;min-height:58px;box-shadow:0 -2px 8px #0000000d}.footer-toolbar .footer-actions{display:flex;width:100%;gap:var(--mscoa-computation-spacing-sm);flex-direction:column;min-height:58px}.footer-toolbar .footer-actions .action-button{width:100%;font-weight:500;transition:all .2s ease}.footer-toolbar .footer-actions .action-button:focus-visible{outline:2px solid var(--mscoa-computation-selected-color);outline-offset:2px}.footer-toolbar .footer-actions .action-button:hover:not(:disabled){transform:translateY(-1px);box-shadow:var(--mscoa-elevation-2)}.footer-toolbar .footer-actions .action-button:active:not(:disabled){transform:translateY(0)}.footer-toolbar .footer-actions .action-button[disabled]{opacity:.5;cursor:not-allowed}.footer-toolbar .footer-actions .save-button{background-color:var(--mscoa-primary, #243D91)!important;color:#fff!important}@media(min-width:768px){.footer-actions{flex-direction:row}.footer-actions .action-button{width:auto;min-width:120px}.drawer-container{display:flex}}@media(prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatModulesModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3$2.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i1$1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i4$1.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: i5$1.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i5$1.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i5$1.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7$1.MatNavList, selector: "mat-nav-list", exportAs: ["matNavList"] }, { kind: "directive", type: i7$1.MatListSubheaderCssMatStyler, selector: "[mat-subheader], [matSubheader]" }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i3$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3$1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i10$2.MatDrawer, selector: "mat-drawer", inputs: ["position", "mode", "disableClose", "autoFocus", "opened"], outputs: ["openedChange", "opened", "openedStart", "closed", "closedStart", "positionChanged"], exportAs: ["matDrawer"] }, { kind: "component", type: i10$2.MatDrawerContainer, selector: "mat-drawer-container", inputs: ["autosize", "hasBackdrop"], outputs: ["backdropClick"], exportAs: ["matDrawerContainer"] }, { kind: "component", type: i5.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "directive", type: i12.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i12.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { kind: "component", type: i12.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i12.MatTreeNode, selector: "mat-tree-node", inputs: ["tabIndex", "disabled"], outputs: ["activation", "expandedChange"], exportAs: ["matTreeNode"] }, { kind: "directive", type: i13.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: AccountValueComponent, selector: "app-account-value", inputs: ["mscoaAccount", "accountInputs", "userCanClearAccount"], outputs: ["clearSelectedAccount", "updateAccount"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: ScoaAccountTableComponent, selector: "app-scoa-account-table", inputs: ["data", "selectedAccount", "segment"], outputs: ["accountSelected"] }, { kind: "ngmodule", type: _InternalFormsSharedModule }, { kind: "pipe", type: i2$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i2$1.UpperCasePipe, name: "uppercase" }], deferBlockDependencies: [() => [i3.MatIcon]] }); }
9219
9738
  }
9220
9739
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: MscoaComputationComponent, decorators: [{
9221
9740
  type: Component,
@@ -9223,7 +9742,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
9223
9742
  MatModulesModule,
9224
9743
  AccountValueComponent,
9225
9744
  ReactiveFormsModule,
9226
- ScoaAccountTableComponent, _InternalFormsSharedModule], template: "<!-- Header Toolbar -->\r\n<mat-toolbar class=\"main-toolbar header-toolbar\" role=\"banner\">\r\n <span class=\"toolbar-title\">\r\n {{ (segment || 'No segment') | uppercase }} : {{ activeColumn | uppercase }} ACCOUNT\r\n </span>\r\n <span class=\"spacer\"></span>\r\n @if (selectedAccount) {\r\n <button \r\n mat-flat-button \r\n (click)=\"clearSelectedAccount(); cancel()\"\r\n [attr.aria-label]=\"'Change account'\">\r\n <mat-icon>arrow_back</mat-icon>\r\n Change Account\r\n </button>\r\n }\r\n</mat-toolbar>\r\n\r\n<!-- Search Bar - Hidden when account selected -->\r\n@if (!selectedAccount) {\r\n <mat-toolbar class=\"main-toolbar header-toolbar search-toolbar\" role=\"search\">\r\n <mat-form-field [subscriptSizing]=\"'dynamic'\" class=\"search-field\">\r\n <mat-label position=\"floating\">Search {{ segment || 'account' }} : {{ activeColumn || '' }} Account</mat-label>\r\n <input \r\n matInput \r\n [formControl]=\"accountSearchTextControl\"\r\n [placeholder]=\"('Search ' + segment + ' : ' + activeColumn + ' Account').toUpperCase()\"\r\n [attr.aria-label]=\"'Search for account'\"\r\n autocomplete=\"off\">\r\n <button \r\n mat-icon-button \r\n matSuffix \r\n (click)=\"clearSearch()\"\r\n [attr.aria-label]=\"'Clear search'\"\r\n type=\"button\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n </mat-toolbar>\r\n}\r\n\r\n<mat-divider></mat-divider>\r\n\r\n<!-- Account Details View -->\r\n@if (selectedAccount) {\r\n <div class=\"account-details-container\" role=\"region\" [attr.aria-label]=\"'Account details'\">\r\n <app-account-value \r\n [accountInputs]=\"accountInputs\" \r\n [userCanClearAccount]=\"userCanClearAccount\"\r\n [mscoaAccount]=\"selectedAccount\" \r\n (updateAccount)=\"updateAccount($event)\"\r\n (clearSelectedAccount)=\"clearSelectedAccount()\">\r\n </app-account-value>\r\n </div>\r\n} @else {\r\n <!-- Main Content Area with Drawer -->\r\n <mat-drawer-container \r\n class=\"drawer-container\"\r\n [attr.aria-label]=\"'Account selection interface'\">\r\n <!-- Account Table Drawer -->\r\n <mat-drawer \r\n #drawer \r\n class=\"account-drawer\"\r\n mode=\"side\" \r\n position=\"end\"\r\n [opened]=\"!searchingAccounts && !!selectedTreeNode && !accountSearchTextControl.value\">\r\n\r\n\r\n\r\n\r\n @if (searchingAccounts) {\r\n <div class=\"loading-container skeleton-table\" role=\"status\" [attr.aria-live]=\"'polite'\">\r\n @for (item of [1,2,3,4,5]; track item) {\r\n <div class=\"skeleton-row\">\r\n <div class=\"skeleton-checkbox\"></div>\r\n <div class=\"skeleton-text short\"></div>\r\n <div class=\"skeleton-text medium\"></div>\r\n <div class=\"skeleton-text\"></div>\r\n </div>\r\n }\r\n </div>\r\n } @else if (hasError) {\r\n <div class=\"error-container\" role=\"alert\" [attr.aria-live]=\"'assertive'\">\r\n <mat-icon class=\"error-icon\" aria-hidden=\"true\">error</mat-icon>\r\n <p class=\"error-message\">{{ errorMessage }}</p>\r\n <button \r\n mat-flat-button \r\n color=\"primary\"\r\n (click)=\"retryLoadAccounts()\"\r\n [attr.aria-label]=\"'Retry loading accounts'\">\r\n <mat-icon aria-hidden=\"true\">refresh</mat-icon>\r\n Retry\r\n </button>\r\n </div>\r\n } @else if (searchAccounts.length === 0 && selectedTreeNode) {\r\n <div class=\"empty-state\" role=\"status\" [attr.aria-live]=\"'polite'\">\r\n <mat-icon class=\"empty-icon\" aria-hidden=\"true\">info</mat-icon>\r\n <p class=\"empty-message\">No accounts found for this category.</p>\r\n </div>\r\n } @else {\r\n <app-scoa-account-table \r\n [selectedAccount]=\"selectedAccount\" \r\n [segment]=\"segment\"\r\n (accountSelected)=\"selectAccount($event)\" \r\n [data]=\"{\r\n accounts: searchAccounts,\r\n account: currentAccountPath || ''\r\n }\">\r\n </app-scoa-account-table>\r\n }\r\n </mat-drawer>\r\n <!-- Tree Content Area -->\r\n <div class=\"tree-content\" role=\"main\">\r\n\r\n <!-- Search Results View -->\r\n @if (accountSearchTextControl.value) {\r\n <mat-nav-list class=\"search-results-list\" role=\"list\">\r\n <div mat-subheader class=\"search-results-header\">\r\n <mat-icon class=\"search-icon\">search</mat-icon>\r\n Search Results\r\n <span class=\"count-badge\" [attr.aria-label]=\"'Number of results'\">\r\n ({{ (searchedPaths$ | async)?.length || 0 }})\r\n </span>\r\n </div>\r\n \r\n @if ((searchedPaths$ | async)?.length === 0) {\r\n <!-- Empty Search Results -->\r\n <div class=\"empty-state\" role=\"status\" [attr.aria-live]=\"'polite'\">\r\n <mat-icon class=\"empty-icon\" aria-hidden=\"true\">search_off</mat-icon>\r\n <p class=\"empty-message\">\r\n No account found for the search\r\n <strong>{{ accountSearchTextControl.value }}</strong>.\r\n </p>\r\n <button \r\n mat-flat-button \r\n (click)=\"clearSearch()\"\r\n [attr.aria-label]=\"'Clear search and show all accounts'\">\r\n Clear Search\r\n </button>\r\n </div>\r\n } @else {\r\n <p class=\"search-results-hint\">Click a result to load accounts for that category.</p>\r\n <div class=\"search-results-grid\" role=\"list\">\r\n @for (searchedItem of (searchedPaths$ | async); track searchedItem.join(':')) {\r\n <div \r\n class=\"path-result-item\"\r\n role=\"listitem\"\r\n (click)=\"selectPath(searchedItem)\" \r\n [attr.aria-label]=\"'Load accounts for: ' + searchedItem.join(' > ') + '. Click to select.'\"\r\n tabindex=\"0\"\r\n (keydown.enter)=\"selectPath(searchedItem)\"\r\n (keydown.space)=\"selectPath(searchedItem); $event.preventDefault()\">\r\n <div class=\"breadcrumb-container\">\r\n @for (part of searchedItem; track part; let last = $last) {\r\n <div class=\"crumb-segment\" [class.is-target]=\"last\">\r\n <span \r\n class=\"text-content\" \r\n [innerHTML]=\"accountSearchTextControl.value ? highlightSearchText(part, accountSearchTextControl.value) : part\">\r\n </span>\r\n @if (!last) {\r\n <mat-icon class=\"separator\" aria-hidden=\"true\">chevron_right</mat-icon>\r\n }\r\n </div>\r\n }\r\n </div>\r\n <span class=\"path-result-meta\">Load accounts</span>\r\n <mat-icon class=\"path-result-arrow\" aria-hidden=\"true\">arrow_forward</mat-icon>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </mat-nav-list>\r\n }\r\n\r\n <!-- Tree View -->\r\n @else {\r\n <!-- Breadcrumb: show current path when category selected (like file explorers) -->\r\n @if (selectedTreeNode?.path?.length) {\r\n <div class=\"tree-breadcrumb\" role=\"navigation\" [attr.aria-label]=\"'Current category: ' + (selectedTreeNode?.path ?? []).join(' > ')\">\r\n <span class=\"breadcrumb-label\">Category:</span>\r\n @for (part of (selectedTreeNode?.path ?? []); track $index; let last = $last) {\r\n <span class=\"breadcrumb-part\" [class.is-current]=\"last\">{{ part }}</span>\r\n @if (!last) {\r\n <mat-icon class=\"breadcrumb-sep\" aria-hidden=\"true\">chevron_right</mat-icon>\r\n }\r\n }\r\n </div>\r\n }\r\n <!-- Compact Instructions - Collapsed by default -->\r\n @if (noneIsExpanded) {\r\n <mat-expansion-panel \r\n [expanded]=\"false\"\r\n class=\"instructions-panel compact-instructions\"\r\n [attr.aria-label]=\"'How to use the account selector'\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <mat-icon class=\"instruction-icon\" aria-hidden=\"true\">info</mat-icon>\r\n <span>Quick tips</span>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <div class=\"instructions-content\">\r\n <div class=\"instruction-item\">\r\n <mat-icon class=\"instruction-bullet\" aria-hidden=\"true\">folder_open</mat-icon>\r\n <span>Expand folders to browse</span>\r\n </div>\r\n <div class=\"instruction-item\">\r\n <mat-icon class=\"instruction-bullet\" aria-hidden=\"true\">check_box</mat-icon>\r\n <span>Check category to load accounts</span>\r\n </div>\r\n <div class=\"instruction-item\">\r\n <mat-icon class=\"instruction-bullet\" aria-hidden=\"true\">search</mat-icon>\r\n <span>Use search bar to find accounts</span>\r\n </div>\r\n </div>\r\n </mat-expansion-panel>\r\n }\r\n\r\n <!-- Account Tree -->\r\n <mat-tree \r\n \r\n [dataSource]=\"dataSource\" \r\n [treeControl]=\"treeControl\"\r\n role=\"tree\"\r\n [attr.aria-label]=\"'Account category tree'\">\r\n \r\n <!-- Leaf Node (no children) -->\r\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodePadding role=\"treeitem\" \r\n [attr.data-tree-path]=\"node.path?.join(':')\">\r\n <button \r\n class=\"toggle-button\" \r\n mat-icon-button \r\n disabled\r\n aria-hidden=\"true\">\r\n </button>\r\n <mat-checkbox \r\n (change)=\"selectNode(node)\"\r\n [disabled]=\"isActivePathOrParent(node.path) && searchingAccounts\"\r\n [checked]=\"isActivePathOrParent(node.path)\"\r\n [attr.aria-label]=\"'Select ' + node.name + ' account category'\">\r\n @if (isActivePathOrParent(node.path) && searchingAccounts) {\r\n <mat-spinner \r\n color=\"primary\" \r\n class=\"loading\"\r\n [attr.aria-label]=\"'Loading accounts for ' + node.name\">\r\n </mat-spinner>\r\n <span class=\"label selected\" [attr.aria-live]=\"'polite'\">\r\n Loading <strong>{{ node.name }}</strong> accounts...\r\n </span>\r\n } @else {\r\n <span \r\n class=\"label\" \r\n [class.selected]=\"isActivePathOrParent(node.path)\">\r\n {{ node.name }}\r\n </span>\r\n }\r\n </mat-checkbox>\r\n </mat-tree-node>\r\n\r\n <!-- Branch Node (has children) -->\r\n <mat-tree-node \r\n *matTreeNodeDef=\"let node; when: hasChild\" \r\n matTreeNodePadding \r\n role=\"treeitem\"\r\n [attr.data-tree-path]=\"node.path?.join(':')\"\r\n [attr.aria-expanded]=\"treeControl.isExpanded(node)\">\r\n <button \r\n class=\"toggle-button\" \r\n mat-icon-button \r\n [attr.aria-label]=\"(treeControl.isExpanded(node) ? 'Collapse' : 'Expand') + ' ' + node.name\"\r\n (click)=\"toggleNode(node)\"\r\n type=\"button\">\r\n <mat-icon class=\"mat-icon-rtl-mirror\">\r\n {{ treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\r\n </mat-icon>\r\n </button>\r\n \r\n @if (isActivePathOrParent(node.path)) {\r\n <mat-checkbox \r\n (change)=\"selectNode(node)\" \r\n [disabled]=\"true\" \r\n [checked]=\"true\"\r\n [attr.aria-label]=\"'Selected: ' + node.name\">\r\n <span class=\"label selected\">\r\n {{ node.name }}\r\n </span>\r\n </mat-checkbox>\r\n } @else {\r\n <mat-checkbox \r\n (change)=\"selectNode(node)\"\r\n [checked]=\"false\"\r\n [attr.aria-label]=\"'Select ' + node.name + ' account category'\">\r\n <span class=\"label\">\r\n {{ node.name }}\r\n </span>\r\n </mat-checkbox>\r\n }\r\n </mat-tree-node>\r\n </mat-tree>\r\n }\r\n\r\n </div>\r\n </mat-drawer-container>\r\n}\r\n\r\n<mat-divider></mat-divider>\r\n\r\n<!-- Footer Actions -->\r\n<mat-dialog-actions\r\nstyle=\" background: var(--mscoa-surface-container) !important;\"\r\nalign=\"end\">\r\n<button \r\nclass=\"action-button close-button\"\r\nmat-button \r\n(click)=\"closeAndPassData(undefined)\"\r\n[attr.aria-label]=\"'Close dialog without saving'\"\r\ntype=\"button\">\r\n\r\nClose\r\n</button>\r\n @if (userCanClearAccount ) {\r\n <button \r\n class=\"action-button save-button\"\r\n mat-flat-button \r\n [disabled]=\"!saveSelection\" \r\n (click)=\"saveAccount()\"\r\n [attr.aria-label]=\"saveSelection ? 'Save account selection' : 'Save disabled - account unchanged or invalid'\"\r\n type=\"button\">\r\n <mat-icon aria-hidden=\"true\">save</mat-icon>\r\n Save\r\n </button>\r\n }\r\n \r\n </mat-dialog-actions>\r\n", styles: [":host{display:flex;flex-direction:column;max-height:98vh;overflow:hidden;min-height:0;--mscoa-primary: var(--mat-sys-primary, #243D91);--mscoa-primary-light: var(--mat-sys-primary-container, #E3F2FD);--mscoa-primary-dark: var(--mat-sys-primary, #1A2E6B);--mscoa-success: var(--mat-sys-success, #4CAF50);--mscoa-error: var(--mat-sys-error, #F44336);--mscoa-warning: var(--mat-sys-warning, #FF9800);--mscoa-info: var(--mat-sys-primary, #2196F3);--mscoa-surface: var(--mat-sys-surface, #FFFFFF);--mscoa-surface-container: var(--mat-sys-surface-container, #F5F5F5);--mscoa-text-primary: var(--mat-sys-on-surface, #212121);--mscoa-text-secondary: var(--mat-sys-on-surface-variant, #757575);--mscoa-divider: var(--mat-sys-outline-variant, #E0E0E0);--mscoa-spacing-xs: 4px;--mscoa-spacing-sm: 8px;--mscoa-spacing-md: 16px;--mscoa-spacing-lg: 24px;--mscoa-spacing-xl: 32px;--mscoa-elevation-1: 0 1px 3px rgba(0,0,0,.12);--mscoa-elevation-2: 0 2px 6px rgba(0,0,0,.12);--mscoa-elevation-4: 0 4px 12px rgba(0,0,0,.12);--mscoa-computation-spacing-xs: var(--mscoa-spacing-xs);--mscoa-computation-spacing-sm: var(--mscoa-spacing-sm);--mscoa-computation-spacing-md: var(--mscoa-spacing-md);--mscoa-computation-spacing-lg: var(--mscoa-spacing-lg);--mscoa-computation-toolbar-height: 56px;--mscoa-header-height: 56px;--mscoa-search-height: 56px;--mscoa-footer-height: 58px;--mscoa-divider-height: 1px;--mscoa-computation-selected-color: var(--mscoa-primary);--mscoa-computation-border-radius: 16px;--mscoa-computation-transition: .2s ease}mat-divider{flex-shrink:0}h4{margin-top:0;margin-bottom:0;padding-left:var(--mscoa-computation-spacing-md)}.label{font-size:.875em}.selected{color:var(--mscoa-primary)!important;font-weight:600;background-color:transparent}.mat-tree-node.tree-node-selected,.mat-tree-node[aria-selected=true]{background:linear-gradient(90deg,var(--mat-sys-primary-container, var(--mscoa-primary-light)) 0%,transparent 100%)!important;box-shadow:inset 3px 0 0 var(--mat-sys-primary, var(--mscoa-primary));border-radius:0 4px 4px 0}.mat-tree-node:hover:not(.tree-node-selected):not(:has(.selected)){background-color:#00000008;transition:background-color var(--mscoa-computation-transition)}mat-tree-node{transition:all var(--mscoa-computation-transition)}mat-tree-node:has(.selected){background:linear-gradient(90deg,var(--mat-sys-primary-container, var(--mscoa-primary-light)) 0%,transparent 100%)!important;box-shadow:inset 3px 0 0 var(--mat-sys-primary, var(--mscoa-primary));border-radius:0 4px 4px 0}mat-tree-node:hover:not(:has(.selected)){background-color:#00000008}mat-tree-node mat-checkbox[checked=true] ::ng-deep .mdc-checkbox{background-color:var(--mscoa-primary, #243D91)!important;border-color:var(--mscoa-primary, #243D91)!important}.accountSeperator{margin-left:var(--mscoa-computation-spacing-xs);margin-right:var(--mscoa-computation-spacing-xs)}.loading{width:24px!important;height:24px!important;--mdc-circular-progress-size: 28px !important;--mdc-circular-progress-active-indicator-width: 24px !important;position:absolute;left:var(--mscoa-computation-spacing-sm);bottom:var(--mscoa-computation-spacing-sm)}.info{font-size:.875rem;opacity:.8;padding-left:var(--mscoa-computation-spacing-md);border-radius:4px;margin-top:10px;line-height:1.6;max-width:500px}.info strong{opacity:1}.toggle-button{height:28px;width:28px;padding:0;margin-right:var(--mscoa-computation-spacing-xs);margin-left:var(--mscoa-computation-spacing-xs)}.toggle-button:focus-visible{outline:2px solid var(--mscoa-computation-selected-color);outline-offset:2px;border-radius:4px}mat-tree{flex:1;min-height:280px;min-width:0;overflow:auto;padding:var(--mscoa-computation-spacing-md)!important;background:none}mat-tree::-webkit-scrollbar{width:8px;height:8px}mat-tree::-webkit-scrollbar-track{background:var(--mat-sys-surface-container, var(--mscoa-surface-container, #F5F5F5));border-radius:4px}mat-tree::-webkit-scrollbar-thumb{background:var(--mscoa-text-secondary, #757575);border-radius:4px;opacity:.5}mat-tree::-webkit-scrollbar-thumb:hover{opacity:.8;background:var(--mscoa-primary, #243D91)}mat-tree{scrollbar-width:thin;scrollbar-color:var(--mat-sys-on-surface-variant, #757575) var(--mat-sys-surface-container, #F5F5F5)}mat-tree-node{display:flex;align-items:flex-start;min-height:28px;padding-right:var(--mscoa-computation-spacing-md)!important;padding-top:2px!important;padding-bottom:2px!important;box-sizing:border-box;width:100%;transition:background-color var(--mscoa-computation-transition)}mat-tree-node:focus-visible{outline:2px solid var(--mscoa-computation-selected-color);outline-offset:-2px;border-radius:4px}mat-tree-node:hover:not(:has(.selected)){background-color:#0000000a}.mat-tree-node{display:flex;align-items:center;flex-wrap:nowrap;min-height:28px;padding:var(--mscoa-computation-spacing-xs) 0;box-sizing:border-box;transition:background-color var(--mscoa-computation-transition),border-color var(--mscoa-computation-transition);border-radius:4px;margin:1px 0}.mat-tree-node:hover:not(.tree-node-selected):not(:has(.selected)){background-color:#0000000a}.mat-tree-node button,.mat-tree-node mat-checkbox{flex-shrink:0;height:28px}.mat-tree-node mat-checkbox{display:flex;align-items:center;height:28px;min-height:fit-content;flex:1;min-width:0}.mat-tree-node .label{flex:1;min-width:0;word-wrap:break-word;overflow-wrap:break-word;white-space:normal;overflow:visible}.header-toolbar{flex-shrink:0;background:var(--mscoa-surface-container)!important;box-shadow:var(--mscoa-elevation-2);border-bottom:1px solid var(--mscoa-divider)}.glass{background:#ffffff26;box-shadow:0 4px 30px #0000001a;backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid rgba(255,255,255,.2)}@media(prefers-reduced-motion:reduce){.glass{backdrop-filter:none;-webkit-backdrop-filter:none}}.main-toolbar{min-width:0;padding-top:var(--mscoa-computation-spacing-md);min-height:var(--mscoa-computation-toolbar-height);overflow:hidden}.main-toolbar .toolbar-title{font-size:18px;font-weight:500;color:var(--mscoa-text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-toolbar{flex-shrink:0;height:var(--mscoa-computation-toolbar-height);min-width:0;overflow:hidden}.search-toolbar .search-field{flex:1;width:100%;max-width:100%;min-width:0;border-radius:var(--mscoa-computation-border-radius);overflow:clip}.search-toolbar .search-field.search-disabled ::ng-deep .mat-mdc-text-field-wrapper{background-color:var(--mscoa-surface-container)!important;border:1px dashed var(--mscoa-divider)}.search-toolbar .search-field.search-disabled ::ng-deep .mat-mdc-form-field-label{color:var(--mscoa-text-secondary)!important}.search-toolbar .search-field.search-disabled ::ng-deep input{cursor:not-allowed;color:var(--mscoa-text-secondary)!important}.search-toolbar .search-field.search-disabled ::ng-deep button{opacity:.5;cursor:not-allowed}.search-toolbar .search-field.search-disabled ::ng-deep .mat-mdc-form-field-hint{color:var(--mscoa-text-secondary);font-size:.75rem}.tree-breadcrumb{flex-shrink:0;display:flex;flex-wrap:wrap;align-items:center;gap:var(--mscoa-spacing-xs, 4px);padding:var(--mscoa-spacing-sm, 8px) var(--mscoa-spacing-md, 16px);margin:0 var(--mscoa-spacing-md, 16px) var(--mscoa-spacing-sm, 8px);background:var(--mat-sys-surface-container, var(--mscoa-surface-container, #F5F5F5));border-radius:6px;border-left:3px solid var(--mat-sys-primary, var(--mscoa-primary, #243D91));font-size:.8125rem;line-height:1.4;max-width:500px}.tree-breadcrumb .breadcrumb-label{color:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary, #757575));font-weight:500;margin-right:var(--mscoa-spacing-xs, 4px)}.tree-breadcrumb .breadcrumb-part{color:var(--mat-sys-on-surface, var(--mscoa-text-primary, #212121))}.tree-breadcrumb .breadcrumb-part.is-current{font-weight:600;color:var(--mat-sys-primary, var(--mscoa-primary, #243D91))}.tree-breadcrumb .breadcrumb-sep{font-size:16px;width:16px;height:16px;color:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary, #757575));margin:0 var(--mscoa-spacing-xs, 4px)}.search-results-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:var(--mscoa-spacing-sm, 8px);overflow-y:auto;flex:1;min-height:0;padding:var(--mscoa-spacing-xs, 4px) 0}.search-results-grid::-webkit-scrollbar{width:6px}.search-results-grid::-webkit-scrollbar-track{background:var(--mat-sys-surface-container, var(--mscoa-surface-container));border-radius:3px}.search-results-grid::-webkit-scrollbar-thumb{background:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary));border-radius:3px;opacity:.5}.search-results-grid::-webkit-scrollbar-thumb:hover{opacity:.8;background:var(--mat-sys-primary, var(--mscoa-primary))}.search-results-grid{scrollbar-width:thin;scrollbar-color:var(--mat-sys-on-surface-variant, #757575) var(--mat-sys-surface-container, #F5F5F5)}.path-result-item{cursor:pointer;transition:background-color var(--mscoa-computation-transition);min-height:56px;padding:var(--mscoa-spacing-sm, 8px) var(--mscoa-spacing-md, 16px);padding-right:40px;border-radius:8px;border:1px solid var(--mat-sys-outline-variant, var(--mscoa-divider));background:var(--mat-sys-surface, var(--mscoa-surface));display:flex;flex-direction:column;gap:4px;align-items:flex-start;position:relative}.path-result-item:hover,.path-result-item:focus-visible{background-color:var(--mat-sys-surface-container, rgba(0, 0, 0, .04));outline:none}.path-result-item:hover .breadcrumb-container,.path-result-item:focus-visible .breadcrumb-container{flex-wrap:wrap}.path-result-item:hover .breadcrumb-container .text-content,.path-result-item:focus-visible .breadcrumb-container .text-content{white-space:normal;max-width:none}.path-result-item:focus-visible{outline:2px solid var(--mscoa-computation-selected-color);outline-offset:-2px}.path-result-arrow{position:absolute;right:var(--mscoa-spacing-sm);top:50%;transform:translateY(-50%);font-size:18px;width:18px;height:18px;color:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary))}.breadcrumb-container{display:flex;align-items:center;flex-wrap:wrap;overflow:hidden;width:100%}.crumb-segment{display:flex;align-items:center;color:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary, #6c757d));white-space:nowrap;overflow:hidden;max-width:100%}.crumb-segment .text-content{display:inline-block;overflow:hidden;text-overflow:ellipsis;max-width:150px;vertical-align:middle}.crumb-segment .separator{font-size:1em;height:16px;width:16px;margin:0 var(--mscoa-computation-spacing-xs);color:var(--mat-sys-outline-variant, var(--mscoa-divider, #bdbdbd));flex-shrink:0}.crumb-segment.is-target{color:var(--mat-sys-on-surface, var(--mscoa-text-primary, #000));font-weight:500;flex-shrink:0}.crumb-segment.is-target .text-content{color:var(--mat-sys-on-surface, var(--mscoa-text-primary, #000));max-width:none}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--mscoa-computation-spacing-lg);text-align:center;gap:var(--mscoa-computation-spacing-md)}.empty-state .empty-icon{font-size:48px;width:48px;height:48px;opacity:.5}.empty-state .empty-message{margin:0;font-size:14px}.error-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--mscoa-computation-spacing-lg);text-align:center;gap:var(--mscoa-computation-spacing-md)}.error-container .error-icon{font-size:48px;width:48px;height:48px;color:var(--mat-sys-error)}.error-container .error-message{margin:0;font-size:14px;color:var(--mat-sys-error)}mark{background-color:#ffeb3b;color:inherit;padding:0;font-weight:500}.instructions-panel{flex-shrink:0;margin:var(--mscoa-spacing-sm, 8px) var(--mscoa-spacing-md, 16px);margin-bottom:var(--mscoa-spacing-xs, 4px);box-shadow:var(--mscoa-elevation-1);border-radius:6px;overflow:hidden;background:var(--mat-sys-surface-container, var(--mscoa-surface-container, #F5F5F5));transition:box-shadow var(--mscoa-computation-transition)}.instructions-panel.compact-instructions ::ng-deep .mat-expansion-panel-header{padding:var(--mscoa-spacing-xs, 4px) var(--mscoa-spacing-sm, 8px)!important;min-height:40px!important;height:auto!important}.instructions-panel.compact-instructions ::ng-deep .mat-expansion-panel-body{padding:var(--mscoa-spacing-xs, 4px) var(--mscoa-spacing-sm, 8px)!important}.instructions-panel:hover{box-shadow:var(--mscoa-elevation-2)}.instructions-panel ::ng-deep .mat-expansion-panel-header{padding:var(--mscoa-spacing-sm, 8px) var(--mscoa-spacing-md, 16px);background:var(--mscoa-surface-container, #F5F5F5)!important}.instructions-panel ::ng-deep .mat-expansion-panel-header:hover{background:var(--mat-sys-surface, var(--mscoa-surface, #FFFFFF))!important}.instructions-panel ::ng-deep .mat-expansion-panel-body{padding:var(--mscoa-spacing-sm, 8px) var(--mscoa-spacing-md, 16px)!important;background:var(--mat-sys-surface, var(--mscoa-surface, #FFFFFF))}.instructions-panel .instruction-icon{margin-right:var(--mscoa-spacing-xs, 4px);color:var(--mscoa-info, #2196F3);font-size:18px;width:18px;height:18px}.instructions-panel .instructions-content{padding:var(--mscoa-spacing-xs, 4px) 0;display:flex;flex-direction:column;gap:var(--mscoa-spacing-xs, 4px)}.instructions-panel .instruction-item{display:flex;align-items:center;gap:var(--mscoa-spacing-xs, 4px);font-size:.75rem;line-height:1.4;padding:var(--mscoa-spacing-xs, 4px);border-radius:4px;transition:background-color var(--mscoa-computation-transition)}.instructions-panel .instruction-item:hover{background-color:var(--mscoa-primary-light, #E3F2FD)}.instructions-panel .instruction-item .instruction-bullet{font-size:16px;width:16px;height:16px;color:var(--mscoa-primary, #243D91);flex-shrink:0}.instructions-panel .instruction-item span{flex:1}.instructions-panel .instruction-item span strong{font-weight:600}.search-results-header{display:flex;align-items:center;gap:var(--mscoa-computation-spacing-sm)}.search-results-header .search-icon{margin-right:var(--mscoa-computation-spacing-sm)}.search-results-list{padding:var(--mscoa-computation-spacing-md);display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden}.search-results-hint{font-size:.75rem;color:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary, #757575));margin:0 var(--mscoa-spacing-md, 16px) var(--mscoa-spacing-sm, 8px);padding:var(--mscoa-spacing-xs, 4px) 0}.path-result-meta{font-size:.6875rem;color:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary, #757575));text-transform:uppercase;letter-spacing:.3px}.mat-mdc-subheader{position:sticky;top:0;z-index:10;background:var(--mat-sys-surface-container)}.count-badge{margin-left:auto;font-weight:400;opacity:.7;font-size:.9em}.drawer-container{flex:1;min-height:0;overflow:hidden;max-width:100%;background:var(--mat-sys-surface-container)!important;display:flex}.drawer-container ::ng-deep .mat-drawer-content{min-height:0;overflow:auto;height:calc(100vh - 220px);flex:1 1 30%;min-width:260px}.account-drawer{min-width:420px;max-width:min(700px,65vw)!important;width:520px!important;overflow:hidden;display:flex;flex-direction:column;background:var(--mat-sys-surface-container)!important;padding:var(--mscoa-computation-spacing-md)}.account-drawer app-scoa-account-table{flex:1;min-height:0;overflow:auto;display:flex;flex-direction:column}.account-drawer .loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--mscoa-computation-spacing-lg);gap:var(--mscoa-computation-spacing-md)}.account-drawer .loading-container p{margin:0;font-size:.875rem}.skeleton-row{display:flex;align-items:center;padding:var(--mscoa-spacing-sm) var(--mscoa-spacing-md);gap:var(--mscoa-spacing-md);animation:skeleton-pulse 1.5s ease-in-out infinite}.skeleton-row .skeleton-checkbox{width:20px;height:20px;border-radius:4px;background:linear-gradient(90deg,#f0f0f0 25%,#e0e0e0,#f0f0f0 75%);background-size:200% 100%}.skeleton-row .skeleton-text{flex:1;height:16px;border-radius:4px;background:linear-gradient(90deg,#f0f0f0 25%,#e0e0e0,#f0f0f0 75%);background-size:200% 100%}.skeleton-row .skeleton-text.short{width:60%}.skeleton-row .skeleton-text.medium{width:80%}@keyframes skeleton-pulse{0%{background-position:200% 0}to{background-position:-200% 0}}.skeleton-table .skeleton-row{border-bottom:1px solid var(--mscoa-divider)}.skeleton-table .skeleton-row:last-child{border-bottom:none}.account-details-container{flex:1;min-height:0;max-width:520px;margin:0 auto;width:100%;background:#ffffff1c;-webkit-backdrop-filter:blur(2.5px);backdrop-filter:blur(2.5px);padding:var(--mscoa-spacing-xs, 4px);border:1px solid rgba(255,255,255,.3);border:1px solid var(--mat-sys-outline-variant, var(--mscoa-divider, #E0E0E0));border-radius:8px;overflow-y:auto}.account-details-container::-webkit-scrollbar{width:6px}.account-details-container::-webkit-scrollbar-track{background:var(--mat-sys-surface-container, var(--mscoa-surface-container, #F5F5F5));border-radius:3px}.account-details-container::-webkit-scrollbar-thumb{background:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary, #757575));border-radius:3px;opacity:.5}.account-details-container::-webkit-scrollbar-thumb:hover{opacity:.8;background:var(--mat-sys-primary, var(--mscoa-primary, #243D91))}.account-details-container{scrollbar-width:thin;scrollbar-color:var(--mat-sys-on-surface-variant, #757575) var(--mat-sys-surface-container, #F5F5F5)}.account-details-container ::ng-deep app-account-value{max-width:100%}.account-details-container ::ng-deep app-account-value mat-toolbar{background:var(--mat-sys-surface-container, var(--mscoa-surface-container))!important;box-shadow:var(--mscoa-elevation-1);margin-bottom:0;border-radius:8px 8px 0 0}.account-details-container ::ng-deep app-account-value .account-grid{gap:var(--mscoa-spacing-xs, 4px) var(--mscoa-spacing-sm, 8px);padding:var(--mscoa-spacing-sm, 8px);background:var(--mat-sys-surface, var(--mscoa-surface));border-radius:0 0 8px 8px;box-shadow:var(--mscoa-elevation-1)}.tree-content{min-height:280px;flex:1;min-width:0;display:flex;flex-direction:column;overflow:hidden;padding-right:var(--mscoa-computation-spacing-sm)}.footer-toolbar{flex-shrink:0;height:fit-content;padding-top:var(--mscoa-computation-spacing-md)!important;padding-bottom:var(--mscoa-computation-spacing-md)!important;min-height:58px;box-shadow:0 -2px 8px #0000000d}.footer-toolbar .footer-actions{display:flex;width:100%;gap:var(--mscoa-computation-spacing-sm);flex-direction:column;min-height:58px}.footer-toolbar .footer-actions .action-button{width:100%;font-weight:500;transition:all .2s ease}.footer-toolbar .footer-actions .action-button:focus-visible{outline:2px solid var(--mscoa-computation-selected-color);outline-offset:2px}.footer-toolbar .footer-actions .action-button:hover:not(:disabled){transform:translateY(-1px);box-shadow:var(--mscoa-elevation-2)}.footer-toolbar .footer-actions .action-button:active:not(:disabled){transform:translateY(0)}.footer-toolbar .footer-actions .action-button[disabled]{opacity:.5;cursor:not-allowed}.footer-toolbar .footer-actions .save-button{background-color:var(--mscoa-primary, #243D91)!important;color:#fff!important}@media(min-width:768px){.footer-actions{flex-direction:row}.footer-actions .action-button{width:auto;min-width:120px}.drawer-container{display:flex}}@media(prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}\n"] }]
9745
+ ScoaAccountTableComponent, _InternalFormsSharedModule], template: "<!-- Header Toolbar -->\r\n<mat-toolbar class=\"main-toolbar header-toolbar\" role=\"banner\">\r\n <span class=\"toolbar-title\">\r\n {{ (segment || 'No segment') | uppercase }} : {{ activeColumn | uppercase }} ACCOUNT\r\n </span>\r\n <span class=\"spacer\"></span>\r\n @if (selectedAccount) {\r\n <button mat-flat-button (click)=\"clearSelectedAccount(); cancel()\" [attr.aria-label]=\"'Change account'\">\r\n <mat-icon>arrow_back</mat-icon>\r\n Change Account\r\n </button>\r\n }\r\n</mat-toolbar>\r\n\r\n<!-- Search Bar - Hidden when account selected -->\r\n@if (!selectedAccount) {\r\n<mat-toolbar class=\"main-toolbar header-toolbar search-toolbar\" role=\"search\">\r\n <mat-form-field [subscriptSizing]=\"'dynamic'\" class=\"search-field\">\r\n <mat-label position=\"floating\">Search {{ segment || 'account' }} : {{ activeColumn || '' }} Account</mat-label>\r\n <input matInput [formControl]=\"accountSearchTextControl\"\r\n [placeholder]=\"('Search ' + segment + ' : ' + activeColumn + ' Account').toUpperCase()\"\r\n [attr.aria-label]=\"'Search for account'\" autocomplete=\"off\">\r\n <button mat-icon-button matSuffix (click)=\"clearSearch()\" [attr.aria-label]=\"'Clear search'\" type=\"button\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n</mat-toolbar>\r\n}\r\n\r\n<mat-divider></mat-divider>\r\n\r\n<!-- Account Details View -->\r\n@if (selectedAccount) {\r\n<div class=\"account-details-container\" role=\"region\" [attr.aria-label]=\"'Account details'\">\r\n <app-account-value [accountInputs]=\"accountInputs\" [userCanClearAccount]=\"userCanClearAccount\"\r\n [mscoaAccount]=\"selectedAccount\" (updateAccount)=\"updateAccount($event)\"\r\n (clearSelectedAccount)=\"clearSelectedAccount()\">\r\n </app-account-value>\r\n</div>\r\n} @else {\r\n<!-- Main Content Area with Drawer -->\r\n<mat-drawer-container class=\"drawer-container\" [attr.aria-label]=\"'Account selection interface'\">\r\n <!-- Account Table Drawer -->\r\n <mat-drawer #drawer class=\"account-drawer\" mode=\"side\" position=\"end\"\r\n [opened]=\"!searchingAccounts && !!selectedTreeNode && !accountSearchTextControl.value\">\r\n\r\n\r\n\r\n\r\n @if (searchingAccounts) {\r\n <div class=\"loading-container skeleton-table\" role=\"status\" [attr.aria-live]=\"'polite'\">\r\n @for (item of [1,2,3,4,5]; track item) {\r\n <div class=\"skeleton-row\">\r\n <div class=\"skeleton-checkbox\"></div>\r\n <div class=\"skeleton-text short\"></div>\r\n <div class=\"skeleton-text medium\"></div>\r\n <div class=\"skeleton-text\"></div>\r\n </div>\r\n }\r\n </div>\r\n } @else if (hasError) {\r\n <div class=\"error-container\" role=\"alert\" [attr.aria-live]=\"'assertive'\">\r\n <mat-icon class=\"error-icon\" aria-hidden=\"true\">error</mat-icon>\r\n <p class=\"error-message\">{{ errorMessage }}</p>\r\n <button mat-flat-button color=\"primary\" (click)=\"retryLoadAccounts()\"\r\n [attr.aria-label]=\"'Retry loading accounts'\">\r\n <mat-icon aria-hidden=\"true\">refresh</mat-icon>\r\n Retry\r\n </button>\r\n </div>\r\n } @else if (searchAccounts.length === 0 && selectedTreeNode) {\r\n <div class=\"empty-state\" role=\"status\" [attr.aria-live]=\"'polite'\">\r\n <mat-icon class=\"empty-icon\" aria-hidden=\"true\">info</mat-icon>\r\n <p class=\"empty-message\">No accounts found for this category.</p>\r\n </div>\r\n } @else {\r\n <app-scoa-account-table [selectedAccount]=\"selectedAccount\" [segment]=\"segment\"\r\n (accountSelected)=\"selectAccount($event)\" [data]=\"{\r\n accounts: searchAccounts,\r\n account: currentAccountPath || ''\r\n }\">\r\n </app-scoa-account-table>\r\n }\r\n </mat-drawer>\r\n <!-- Tree Content Area -->\r\n <div class=\"tree-content\" role=\"main\">\r\n\r\n <!-- Search Results View -->\r\n @if (accountSearchTextControl.value) {\r\n <mat-nav-list class=\"search-results-list\" role=\"list\">\r\n <div mat-subheader class=\"search-results-header\">\r\n <mat-icon class=\"search-icon\">search</mat-icon>\r\n Search Results\r\n <span class=\"count-badge\" [attr.aria-label]=\"'Number of results'\">\r\n ({{ (searchedPaths$ | async)?.length || 0 }})\r\n </span>\r\n </div>\r\n\r\n @if ((searchedPaths$ | async)?.length === 0) {\r\n <!-- Empty Search Results -->\r\n <div class=\"empty-state\" role=\"status\" [attr.aria-live]=\"'polite'\">\r\n <mat-icon class=\"empty-icon\" aria-hidden=\"true\">search_off</mat-icon>\r\n <p class=\"empty-message\">\r\n No account found for the search\r\n <strong>{{ accountSearchTextControl.value }}</strong>.\r\n </p>\r\n <button mat-flat-button (click)=\"clearSearch()\"\r\n [attr.aria-label]=\"'Clear search and show all accounts'\">\r\n Clear Search\r\n </button>\r\n </div>\r\n } @else {\r\n <p class=\"search-results-hint\">Click a result to load accounts for that category.</p>\r\n <div class=\"search-results-grid\" role=\"list\">\r\n @for (searchedItem of (searchedPaths$ | async); track searchedItem.join(':')) {\r\n\r\n @defer (on viewport) {\r\n <div class=\"path-result-item\" role=\"listitem\" (click)=\"selectPath(searchedItem)\"\r\n [attr.aria-label]=\"'Load accounts for: ' + searchedItem.join(' > ') + '. Click to select.'\"\r\n tabindex=\"0\" (keydown.enter)=\"selectPath(searchedItem)\"\r\n (keydown.space)=\"selectPath(searchedItem); $event.preventDefault()\">\r\n <div class=\"breadcrumb-container\">\r\n @for (part of searchedItem; track part; let last = $last) {\r\n <div class=\"crumb-segment\" [class.is-target]=\"last\">\r\n <span class=\"text-content\"\r\n [innerHTML]=\"accountSearchTextControl.value ? highlightSearchText(part, accountSearchTextControl.value) : part\">\r\n </span>\r\n @if (!last) {\r\n <mat-icon class=\"separator\" aria-hidden=\"true\">chevron_right</mat-icon>\r\n }\r\n </div>\r\n }\r\n </div>\r\n <span class=\"path-result-meta\">Load accounts</span>\r\n <mat-icon class=\"path-result-arrow\" aria-hidden=\"true\">arrow_forward</mat-icon>\r\n </div>\r\n }@placeholder {\r\n <div class=\"mat-spinner-container\">\r\n <mat-spinner diameter=\"16\" color=\"primary\" aria-label=\"Loading search result\"></mat-spinner>\r\n </div>\r\n\r\n }\r\n\r\n }\r\n </div>\r\n }\r\n </mat-nav-list>\r\n }\r\n\r\n <!-- Tree View -->\r\n @else {\r\n <!-- Breadcrumb: show current path when category selected (like file explorers) -->\r\n @if (selectedTreeNode?.path?.length) {\r\n <div class=\"tree-breadcrumb\" role=\"navigation\"\r\n [attr.aria-label]=\"'Current category: ' + (selectedTreeNode?.path ?? []).join(' > ')\">\r\n <span class=\"breadcrumb-label\">Category:</span>\r\n @for (part of (selectedTreeNode?.path ?? []); track $index; let last = $last) {\r\n <span class=\"breadcrumb-part\" [class.is-current]=\"last\">{{ part }}</span>\r\n @if (!last) {\r\n <mat-icon class=\"breadcrumb-sep\" aria-hidden=\"true\">chevron_right</mat-icon>\r\n }\r\n }\r\n </div>\r\n }\r\n <!-- Compact Instructions - Collapsed by default -->\r\n @if (noneIsExpanded) {\r\n <mat-expansion-panel [expanded]=\"false\" class=\"instructions-panel compact-instructions\"\r\n [attr.aria-label]=\"'How to use the account selector'\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <mat-icon class=\"instruction-icon\" aria-hidden=\"true\">info</mat-icon>\r\n <span>Quick tips</span>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <div class=\"instructions-content\">\r\n <div class=\"instruction-item\">\r\n <mat-icon class=\"instruction-bullet\" aria-hidden=\"true\">folder_open</mat-icon>\r\n <span>Expand folders to browse</span>\r\n </div>\r\n <div class=\"instruction-item\">\r\n <mat-icon class=\"instruction-bullet\" aria-hidden=\"true\">check_box</mat-icon>\r\n <span>Check category to load accounts</span>\r\n </div>\r\n <div class=\"instruction-item\">\r\n <mat-icon class=\"instruction-bullet\" aria-hidden=\"true\">search</mat-icon>\r\n <span>Use search bar to find accounts</span>\r\n </div>\r\n </div>\r\n </mat-expansion-panel>\r\n }\r\n\r\n <!-- Account Tree -->\r\n <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\" role=\"tree\"\r\n [attr.aria-label]=\"'Account category tree'\">\r\n\r\n <!-- Leaf Node (no children) -->\r\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodePadding role=\"treeitem\"\r\n [attr.data-tree-path]=\"node.path?.join(':')\">\r\n <button class=\"toggle-button\" mat-icon-button disabled aria-hidden=\"true\">\r\n </button>\r\n <mat-checkbox (change)=\"selectNode(node)\"\r\n [disabled]=\"isActivePathOrParent(node.path) && searchingAccounts\"\r\n [checked]=\"isActivePathOrParent(node.path)\"\r\n [attr.aria-label]=\"'Select ' + node.name + ' account category'\">\r\n @if (isActivePathOrParent(node.path) && searchingAccounts) {\r\n <mat-spinner color=\"primary\" class=\"loading\"\r\n [attr.aria-label]=\"'Loading accounts for ' + node.name\">\r\n </mat-spinner>\r\n <span class=\"label selected\" [attr.aria-live]=\"'polite'\">\r\n Loading <strong>{{ node.name }}</strong> accounts...\r\n </span>\r\n } @else {\r\n <span class=\"label\" [class.selected]=\"isActivePathOrParent(node.path)\">\r\n {{ node.name }}\r\n </span>\r\n }\r\n </mat-checkbox>\r\n </mat-tree-node>\r\n\r\n <!-- Branch Node (has children) -->\r\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" matTreeNodePadding role=\"treeitem\"\r\n [attr.data-tree-path]=\"node.path?.join(':')\" [attr.aria-expanded]=\"treeControl.isExpanded(node)\">\r\n <button class=\"toggle-button\" mat-icon-button\r\n [attr.aria-label]=\"(treeControl.isExpanded(node) ? 'Collapse' : 'Expand') + ' ' + node.name\"\r\n (click)=\"toggleNode(node)\" type=\"button\">\r\n <mat-icon class=\"mat-icon-rtl-mirror\">\r\n {{ treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\r\n </mat-icon>\r\n </button>\r\n\r\n @if (isActivePathOrParent(node.path)) {\r\n <mat-checkbox (change)=\"selectNode(node)\" [disabled]=\"true\" [checked]=\"true\"\r\n [attr.aria-label]=\"'Selected: ' + node.name\">\r\n <span class=\"label selected\">\r\n {{ node.name }}\r\n </span>\r\n </mat-checkbox>\r\n } @else {\r\n <mat-checkbox (change)=\"selectNode(node)\" [checked]=\"false\"\r\n [attr.aria-label]=\"'Select ' + node.name + ' account category'\">\r\n <span class=\"label\">\r\n {{ node.name }}\r\n </span>\r\n </mat-checkbox>\r\n }\r\n </mat-tree-node>\r\n </mat-tree>\r\n }\r\n\r\n </div>\r\n</mat-drawer-container>\r\n}\r\n\r\n<mat-divider></mat-divider>\r\n\r\n<!-- Footer Actions -->\r\n<mat-dialog-actions style=\" background: var(--mscoa-surface-container) !important;\" align=\"end\">\r\n <button class=\"action-button close-button\" mat-button (click)=\"closeAndPassData(undefined)\"\r\n [attr.aria-label]=\"'Close dialog without saving'\" type=\"button\">\r\n\r\n Close\r\n </button>\r\n @if (userCanClearAccount ) {\r\n <button class=\"action-button save-button\" mat-flat-button [disabled]=\"!saveSelection\" (click)=\"saveAccount()\"\r\n [attr.aria-label]=\"saveSelection ? 'Save account selection' : 'Save disabled - account unchanged or invalid'\"\r\n type=\"button\">\r\n <mat-icon aria-hidden=\"true\">save</mat-icon>\r\n Save\r\n </button>\r\n }\r\n\r\n</mat-dialog-actions>", styles: [":host{display:flex;flex-direction:column;max-height:98vh;overflow:hidden;min-height:0;--mscoa-primary: var(--mat-sys-primary, #243D91);--mscoa-primary-light: var(--mat-sys-primary-container, #E3F2FD);--mscoa-primary-dark: var(--mat-sys-primary, #1A2E6B);--mscoa-success: var(--mat-sys-success, #4CAF50);--mscoa-error: var(--mat-sys-error, #F44336);--mscoa-warning: var(--mat-sys-warning, #FF9800);--mscoa-info: var(--mat-sys-primary, #2196F3);--mscoa-surface: var(--mat-sys-surface, #FFFFFF);--mscoa-surface-container: var(--mat-sys-surface-container, #F5F5F5);--mscoa-text-primary: var(--mat-sys-on-surface, #212121);--mscoa-text-secondary: var(--mat-sys-on-surface-variant, #757575);--mscoa-divider: var(--mat-sys-outline-variant, #E0E0E0);--mscoa-spacing-xs: 4px;--mscoa-spacing-sm: 8px;--mscoa-spacing-md: 16px;--mscoa-spacing-lg: 24px;--mscoa-spacing-xl: 32px;--mscoa-elevation-1: 0 1px 3px rgba(0,0,0,.12);--mscoa-elevation-2: 0 2px 6px rgba(0,0,0,.12);--mscoa-elevation-4: 0 4px 12px rgba(0,0,0,.12);--mscoa-computation-spacing-xs: var(--mscoa-spacing-xs);--mscoa-computation-spacing-sm: var(--mscoa-spacing-sm);--mscoa-computation-spacing-md: var(--mscoa-spacing-md);--mscoa-computation-spacing-lg: var(--mscoa-spacing-lg);--mscoa-computation-toolbar-height: 56px;--mscoa-header-height: 56px;--mscoa-search-height: 56px;--mscoa-footer-height: 58px;--mscoa-divider-height: 1px;--mscoa-computation-selected-color: var(--mscoa-primary);--mscoa-computation-border-radius: 16px;--mscoa-computation-transition: .2s ease}mat-divider{flex-shrink:0}h4{margin-top:0;margin-bottom:0;padding-left:var(--mscoa-computation-spacing-md)}.label{font-size:.875em}.selected{color:var(--mscoa-primary)!important;font-weight:600;background-color:transparent}.mat-tree-node.tree-node-selected,.mat-tree-node[aria-selected=true]{background:linear-gradient(90deg,var(--mat-sys-primary-container, var(--mscoa-primary-light)) 0%,transparent 100%)!important;box-shadow:inset 3px 0 0 var(--mat-sys-primary, var(--mscoa-primary));border-radius:0 4px 4px 0}.mat-tree-node:hover:not(.tree-node-selected):not(:has(.selected)){background-color:#00000008;transition:background-color var(--mscoa-computation-transition)}mat-tree-node{transition:all var(--mscoa-computation-transition)}mat-tree-node:has(.selected){background:linear-gradient(90deg,var(--mat-sys-primary-container, var(--mscoa-primary-light)) 0%,transparent 100%)!important;box-shadow:inset 3px 0 0 var(--mat-sys-primary, var(--mscoa-primary));border-radius:0 4px 4px 0}mat-tree-node:hover:not(:has(.selected)){background-color:#00000008}mat-tree-node mat-checkbox[checked=true] ::ng-deep .mdc-checkbox{background-color:var(--mscoa-primary, #243D91)!important;border-color:var(--mscoa-primary, #243D91)!important}.accountSeperator{margin-left:var(--mscoa-computation-spacing-xs);margin-right:var(--mscoa-computation-spacing-xs)}.loading{width:24px!important;height:24px!important;--mdc-circular-progress-size: 28px !important;--mdc-circular-progress-active-indicator-width: 24px !important;position:absolute;left:var(--mscoa-computation-spacing-sm);bottom:var(--mscoa-computation-spacing-sm)}.info{font-size:.875rem;opacity:.8;padding-left:var(--mscoa-computation-spacing-md);border-radius:4px;margin-top:10px;line-height:1.6;max-width:500px}.info strong{opacity:1}.toggle-button{height:28px;width:28px;padding:0;margin-right:var(--mscoa-computation-spacing-xs);margin-left:var(--mscoa-computation-spacing-xs)}.toggle-button:focus-visible{outline:2px solid var(--mscoa-computation-selected-color);outline-offset:2px;border-radius:4px}mat-tree{flex:1;min-height:280px;min-width:0;overflow:auto;padding:var(--mscoa-computation-spacing-md)!important;background:none}mat-tree::-webkit-scrollbar{width:8px;height:8px}mat-tree::-webkit-scrollbar-track{background:var(--mat-sys-surface-container, var(--mscoa-surface-container, #F5F5F5));border-radius:4px}mat-tree::-webkit-scrollbar-thumb{background:var(--mscoa-text-secondary, #757575);border-radius:4px;opacity:.5}mat-tree::-webkit-scrollbar-thumb:hover{opacity:.8;background:var(--mscoa-primary, #243D91)}mat-tree{scrollbar-width:thin;scrollbar-color:var(--mat-sys-on-surface-variant, #757575) var(--mat-sys-surface-container, #F5F5F5)}mat-tree-node{display:flex;align-items:flex-start;min-height:28px;padding-right:var(--mscoa-computation-spacing-md)!important;padding-top:2px!important;padding-bottom:2px!important;box-sizing:border-box;width:100%;transition:background-color var(--mscoa-computation-transition)}mat-tree-node:focus-visible{outline:2px solid var(--mscoa-computation-selected-color);outline-offset:-2px;border-radius:4px}mat-tree-node:hover:not(:has(.selected)){background-color:#0000000a}.mat-tree-node{display:flex;align-items:center;flex-wrap:nowrap;min-height:28px;padding:var(--mscoa-computation-spacing-xs) 0;box-sizing:border-box;transition:background-color var(--mscoa-computation-transition),border-color var(--mscoa-computation-transition);border-radius:4px;margin:1px 0}.mat-tree-node:hover:not(.tree-node-selected):not(:has(.selected)){background-color:#0000000a}.mat-tree-node button,.mat-tree-node mat-checkbox{flex-shrink:0;height:28px}.mat-tree-node mat-checkbox{display:flex;align-items:center;height:28px;min-height:fit-content;flex:1;min-width:0}.mat-tree-node .label{flex:1;min-width:0;word-wrap:break-word;overflow-wrap:break-word;white-space:normal;overflow:visible}.header-toolbar{flex-shrink:0;background:var(--mscoa-surface-container)!important;box-shadow:var(--mscoa-elevation-2);border-bottom:1px solid var(--mscoa-divider)}.glass{background:#ffffff26;box-shadow:0 4px 30px #0000001a;backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid rgba(255,255,255,.2)}@media(prefers-reduced-motion:reduce){.glass{backdrop-filter:none;-webkit-backdrop-filter:none}}.main-toolbar{min-width:0;padding-top:var(--mscoa-computation-spacing-md);min-height:var(--mscoa-computation-toolbar-height);overflow:hidden}.main-toolbar .toolbar-title{font-size:18px;font-weight:500;color:var(--mscoa-text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-toolbar{flex-shrink:0;height:var(--mscoa-computation-toolbar-height);min-width:0;overflow:hidden}.search-toolbar .search-field{flex:1;width:100%;max-width:100%;min-width:0;border-radius:var(--mscoa-computation-border-radius);overflow:clip}.search-toolbar .search-field.search-disabled ::ng-deep .mat-mdc-text-field-wrapper{background-color:var(--mscoa-surface-container)!important;border:1px dashed var(--mscoa-divider)}.search-toolbar .search-field.search-disabled ::ng-deep .mat-mdc-form-field-label{color:var(--mscoa-text-secondary)!important}.search-toolbar .search-field.search-disabled ::ng-deep input{cursor:not-allowed;color:var(--mscoa-text-secondary)!important}.search-toolbar .search-field.search-disabled ::ng-deep button{opacity:.5;cursor:not-allowed}.search-toolbar .search-field.search-disabled ::ng-deep .mat-mdc-form-field-hint{color:var(--mscoa-text-secondary);font-size:.75rem}.tree-breadcrumb{flex-shrink:0;display:flex;flex-wrap:wrap;align-items:center;gap:var(--mscoa-spacing-xs, 4px);padding:var(--mscoa-spacing-sm, 8px) var(--mscoa-spacing-md, 16px);margin:0 var(--mscoa-spacing-md, 16px) var(--mscoa-spacing-sm, 8px);background:var(--mat-sys-surface-container, var(--mscoa-surface-container, #F5F5F5));border-radius:6px;border-left:3px solid var(--mat-sys-primary, var(--mscoa-primary, #243D91));font-size:.8125rem;line-height:1.4;max-width:500px}.tree-breadcrumb .breadcrumb-label{color:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary, #757575));font-weight:500;margin-right:var(--mscoa-spacing-xs, 4px)}.tree-breadcrumb .breadcrumb-part{color:var(--mat-sys-on-surface, var(--mscoa-text-primary, #212121))}.tree-breadcrumb .breadcrumb-part.is-current{font-weight:600;color:var(--mat-sys-primary, var(--mscoa-primary, #243D91))}.tree-breadcrumb .breadcrumb-sep{font-size:16px;width:16px;height:16px;color:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary, #757575));margin:0 var(--mscoa-spacing-xs, 4px)}.search-results-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:var(--mscoa-spacing-sm, 8px);overflow-y:auto;flex:1;min-height:0;padding:var(--mscoa-spacing-xs, 4px) 0}.search-results-grid::-webkit-scrollbar{width:6px}.search-results-grid::-webkit-scrollbar-track{background:var(--mat-sys-surface-container, var(--mscoa-surface-container));border-radius:3px}.search-results-grid::-webkit-scrollbar-thumb{background:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary));border-radius:3px;opacity:.5}.search-results-grid::-webkit-scrollbar-thumb:hover{opacity:.8;background:var(--mat-sys-primary, var(--mscoa-primary))}.search-results-grid{scrollbar-width:thin;scrollbar-color:var(--mat-sys-on-surface-variant, #757575) var(--mat-sys-surface-container, #F5F5F5)}.path-result-item{cursor:pointer;transition:background-color var(--mscoa-computation-transition);min-height:56px;padding:var(--mscoa-spacing-sm, 8px) var(--mscoa-spacing-md, 16px);padding-right:40px;border-radius:8px;border:1px solid var(--mat-sys-outline-variant, var(--mscoa-divider));background:var(--mat-sys-surface, var(--mscoa-surface));display:flex;flex-direction:column;gap:4px;align-items:flex-start;position:relative}.path-result-item:hover,.path-result-item:focus-visible{background-color:var(--mat-sys-surface-container, rgba(0, 0, 0, .04));outline:none}.path-result-item:hover .breadcrumb-container,.path-result-item:focus-visible .breadcrumb-container{flex-wrap:wrap}.path-result-item:hover .breadcrumb-container .text-content,.path-result-item:focus-visible .breadcrumb-container .text-content{white-space:normal;max-width:none}.path-result-item:focus-visible{outline:2px solid var(--mscoa-computation-selected-color);outline-offset:-2px}.path-result-arrow{position:absolute;right:var(--mscoa-spacing-sm);top:50%;transform:translateY(-50%);font-size:18px;width:18px;height:18px;color:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary))}.breadcrumb-container{display:flex;align-items:center;flex-wrap:wrap;overflow:hidden;width:100%}.crumb-segment{display:flex;align-items:center;color:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary, #6c757d));white-space:nowrap;overflow:hidden;max-width:100%}.crumb-segment .text-content{display:inline-block;overflow:hidden;text-overflow:ellipsis;max-width:150px;vertical-align:middle}.crumb-segment .separator{font-size:1em;height:16px;width:16px;margin:0 var(--mscoa-computation-spacing-xs);color:var(--mat-sys-outline-variant, var(--mscoa-divider, #bdbdbd));flex-shrink:0}.crumb-segment.is-target{color:var(--mat-sys-on-surface, var(--mscoa-text-primary, #000));font-weight:500;flex-shrink:0}.crumb-segment.is-target .text-content{color:var(--mat-sys-on-surface, var(--mscoa-text-primary, #000));max-width:none}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--mscoa-computation-spacing-lg);text-align:center;gap:var(--mscoa-computation-spacing-md)}.empty-state .empty-icon{font-size:48px;width:48px;height:48px;opacity:.5}.empty-state .empty-message{margin:0;font-size:14px}.error-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--mscoa-computation-spacing-lg);text-align:center;gap:var(--mscoa-computation-spacing-md)}.error-container .error-icon{font-size:48px;width:48px;height:48px;color:var(--mat-sys-error)}.error-container .error-message{margin:0;font-size:14px;color:var(--mat-sys-error)}mark{background-color:#ffeb3b;color:inherit;padding:0;font-weight:500}.instructions-panel{flex-shrink:0;margin:var(--mscoa-spacing-sm, 8px) var(--mscoa-spacing-md, 16px);margin-bottom:var(--mscoa-spacing-xs, 4px);box-shadow:var(--mscoa-elevation-1);border-radius:6px;overflow:hidden;background:var(--mat-sys-surface-container, var(--mscoa-surface-container, #F5F5F5));transition:box-shadow var(--mscoa-computation-transition)}.instructions-panel.compact-instructions ::ng-deep .mat-expansion-panel-header{padding:var(--mscoa-spacing-xs, 4px) var(--mscoa-spacing-sm, 8px)!important;min-height:40px!important;height:auto!important}.instructions-panel.compact-instructions ::ng-deep .mat-expansion-panel-body{padding:var(--mscoa-spacing-xs, 4px) var(--mscoa-spacing-sm, 8px)!important}.instructions-panel:hover{box-shadow:var(--mscoa-elevation-2)}.instructions-panel ::ng-deep .mat-expansion-panel-header{padding:var(--mscoa-spacing-sm, 8px) var(--mscoa-spacing-md, 16px);background:var(--mscoa-surface-container, #F5F5F5)!important}.instructions-panel ::ng-deep .mat-expansion-panel-header:hover{background:var(--mat-sys-surface, var(--mscoa-surface, #FFFFFF))!important}.instructions-panel ::ng-deep .mat-expansion-panel-body{padding:var(--mscoa-spacing-sm, 8px) var(--mscoa-spacing-md, 16px)!important;background:var(--mat-sys-surface, var(--mscoa-surface, #FFFFFF))}.instructions-panel .instruction-icon{margin-right:var(--mscoa-spacing-xs, 4px);color:var(--mscoa-info, #2196F3);font-size:18px;width:18px;height:18px}.instructions-panel .instructions-content{padding:var(--mscoa-spacing-xs, 4px) 0;display:flex;flex-direction:column;gap:var(--mscoa-spacing-xs, 4px)}.instructions-panel .instruction-item{display:flex;align-items:center;gap:var(--mscoa-spacing-xs, 4px);font-size:.75rem;line-height:1.4;padding:var(--mscoa-spacing-xs, 4px);border-radius:4px;transition:background-color var(--mscoa-computation-transition)}.instructions-panel .instruction-item:hover{background-color:var(--mscoa-primary-light, #E3F2FD)}.instructions-panel .instruction-item .instruction-bullet{font-size:16px;width:16px;height:16px;color:var(--mscoa-primary, #243D91);flex-shrink:0}.instructions-panel .instruction-item span{flex:1}.instructions-panel .instruction-item span strong{font-weight:600}.search-results-header{display:flex;align-items:center;gap:var(--mscoa-computation-spacing-sm)}.search-results-header .search-icon{margin-right:var(--mscoa-computation-spacing-sm)}.search-results-list{padding:var(--mscoa-computation-spacing-md);display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden}.search-results-hint{font-size:.75rem;color:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary, #757575));margin:0 var(--mscoa-spacing-md, 16px) var(--mscoa-spacing-sm, 8px);padding:var(--mscoa-spacing-xs, 4px) 0}.path-result-meta{font-size:.6875rem;color:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary, #757575));text-transform:uppercase;letter-spacing:.3px}.mat-mdc-subheader{position:sticky;top:0;z-index:10;background:var(--mat-sys-surface-container)}.count-badge{margin-left:auto;font-weight:400;opacity:.7;font-size:.9em}.drawer-container{flex:1;min-height:0;overflow:hidden;max-width:100%;background:var(--mat-sys-surface-container)!important;display:flex}.drawer-container ::ng-deep .mat-drawer-content{min-height:0;overflow:auto;height:calc(100vh - 220px);flex:1 1 30%;min-width:260px}.account-drawer{min-width:420px;max-width:min(700px,65vw)!important;width:520px!important;overflow:hidden;display:flex;flex-direction:column;background:var(--mat-sys-surface-container)!important;padding:var(--mscoa-computation-spacing-md)}.account-drawer app-scoa-account-table{flex:1;min-height:0;overflow:auto;display:flex;flex-direction:column}.account-drawer .loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--mscoa-computation-spacing-lg);gap:var(--mscoa-computation-spacing-md)}.account-drawer .loading-container p{margin:0;font-size:.875rem}.skeleton-row{display:flex;align-items:center;padding:var(--mscoa-spacing-sm) var(--mscoa-spacing-md);gap:var(--mscoa-spacing-md);animation:skeleton-pulse 1.5s ease-in-out infinite}.skeleton-row .skeleton-checkbox{width:20px;height:20px;border-radius:4px;background:linear-gradient(90deg,#f0f0f0 25%,#e0e0e0,#f0f0f0 75%);background-size:200% 100%}.skeleton-row .skeleton-text{flex:1;height:16px;border-radius:4px;background:linear-gradient(90deg,#f0f0f0 25%,#e0e0e0,#f0f0f0 75%);background-size:200% 100%}.skeleton-row .skeleton-text.short{width:60%}.skeleton-row .skeleton-text.medium{width:80%}@keyframes skeleton-pulse{0%{background-position:200% 0}to{background-position:-200% 0}}.skeleton-table .skeleton-row{border-bottom:1px solid var(--mscoa-divider)}.skeleton-table .skeleton-row:last-child{border-bottom:none}.account-details-container{flex:1;min-height:0;max-width:520px;margin:0 auto;width:100%;background:#ffffff1c;-webkit-backdrop-filter:blur(2.5px);backdrop-filter:blur(2.5px);padding:var(--mscoa-spacing-xs, 4px);border:1px solid rgba(255,255,255,.3);border:1px solid var(--mat-sys-outline-variant, var(--mscoa-divider, #E0E0E0));border-radius:8px;overflow-y:auto}.account-details-container::-webkit-scrollbar{width:6px}.account-details-container::-webkit-scrollbar-track{background:var(--mat-sys-surface-container, var(--mscoa-surface-container, #F5F5F5));border-radius:3px}.account-details-container::-webkit-scrollbar-thumb{background:var(--mat-sys-on-surface-variant, var(--mscoa-text-secondary, #757575));border-radius:3px;opacity:.5}.account-details-container::-webkit-scrollbar-thumb:hover{opacity:.8;background:var(--mat-sys-primary, var(--mscoa-primary, #243D91))}.account-details-container{scrollbar-width:thin;scrollbar-color:var(--mat-sys-on-surface-variant, #757575) var(--mat-sys-surface-container, #F5F5F5)}.account-details-container ::ng-deep app-account-value{max-width:100%}.account-details-container ::ng-deep app-account-value mat-toolbar{background:var(--mat-sys-surface-container, var(--mscoa-surface-container))!important;box-shadow:var(--mscoa-elevation-1);margin-bottom:0;border-radius:8px 8px 0 0}.account-details-container ::ng-deep app-account-value .account-grid{gap:var(--mscoa-spacing-xs, 4px) var(--mscoa-spacing-sm, 8px);padding:var(--mscoa-spacing-sm, 8px);background:var(--mat-sys-surface, var(--mscoa-surface));border-radius:0 0 8px 8px;box-shadow:var(--mscoa-elevation-1)}.tree-content{min-height:280px;flex:1;min-width:0;display:flex;flex-direction:column;overflow:hidden;padding-right:var(--mscoa-computation-spacing-sm)}.footer-toolbar{flex-shrink:0;height:fit-content;padding-top:var(--mscoa-computation-spacing-md)!important;padding-bottom:var(--mscoa-computation-spacing-md)!important;min-height:58px;box-shadow:0 -2px 8px #0000000d}.footer-toolbar .footer-actions{display:flex;width:100%;gap:var(--mscoa-computation-spacing-sm);flex-direction:column;min-height:58px}.footer-toolbar .footer-actions .action-button{width:100%;font-weight:500;transition:all .2s ease}.footer-toolbar .footer-actions .action-button:focus-visible{outline:2px solid var(--mscoa-computation-selected-color);outline-offset:2px}.footer-toolbar .footer-actions .action-button:hover:not(:disabled){transform:translateY(-1px);box-shadow:var(--mscoa-elevation-2)}.footer-toolbar .footer-actions .action-button:active:not(:disabled){transform:translateY(0)}.footer-toolbar .footer-actions .action-button[disabled]{opacity:.5;cursor:not-allowed}.footer-toolbar .footer-actions .save-button{background-color:var(--mscoa-primary, #243D91)!important;color:#fff!important}@media(min-width:768px){.footer-actions{flex-direction:row}.footer-actions .action-button{width:auto;min-width:120px}.drawer-container{display:flex}}@media(prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}\n"] }]
9227
9746
  }], ctorParameters: () => [{ type: i1$1.MatDialogRef }], propDecorators: { handleKeyboardNavigation: [{
9228
9747
  type: HostListener,
9229
9748
  args: ['keydown', ['$event']]
@@ -11018,9 +11537,9 @@ class MscoaChartComponent {
11018
11537
  }
11019
11538
  }
11020
11539
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: MscoaChartComponent, deps: [{ token: MscoaComponentStore }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); }
11021
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: MscoaChartComponent, isStandalone: true, selector: "app-mscoa-chart", inputs: { inputConfig: "inputConfig", editorMode: "editorMode", readonly: "readonly", touched: "touched", formGroup: "formGroup", formBuilderFunctions: "formBuilderFunctions", segmentValues: "segmentValues", config: "config" }, outputs: { onContainerClick: "onContainerClick", segmentValuesChanged: "segmentValuesChanged", interaction: "interaction" }, ngImport: i0, template: "<section \n (click)=\"setAsTouched($event)\" \n class=\"mscoa-chart__container\"\n [class.mscoa-chart__container--touched]=\"touched\"\n *ngIf=\"(viewData$ | async) as viewData\"\n role=\"region\"\n [attr.aria-label]=\"'MSCOA Account Chart'\"\n [attr.aria-busy]=\"viewData.loading || viewData.validatingValue\">\n\n @if (viewData.loading) {\n <div class=\"mscoa-chart__loading-container\" role=\"status\" aria-live=\"polite\">\n <mat-spinner [diameter]=\"40\"></mat-spinner>\n <span class=\"sr-only\">Loading account chart data...</span>\n </div>\n } @else {\n @defer (on viewport) {\n <ng-container *ngIf=\"viewData.accountTreeKeys || viewData.cashAccountTreeKeys\">\n <div class=\"mscoa-chart__table-container\">\n @if (isDualAccountBasis) {\n <div class=\"dual-basis-container\" role=\"group\" aria-label=\"Dual accounting basis tables\">\n <div class=\"dual-basis-container__item\">\n <ng-container \n *ngTemplateOutlet=\"selectionTable; \n context: {\n accountingBasis: ACCOUNTING_BASIS.ACCRUAL,\n canCollapse: true,\n viewData: viewData\n }\">\n </ng-container>\n </div>\n \n <div class=\"dual-basis-container__item\">\n <ng-container \n *ngTemplateOutlet=\"selectionTable; \n context: {\n accountingBasis: ACCOUNTING_BASIS.CASH,\n canCollapse: true,\n viewData: viewData\n }\">\n </ng-container>\n </div>\n </div>\n } @else {\n <ng-container \n *ngTemplateOutlet=\"selectionTable; \n context: {\n accountingBasis: config?.accountingBasis,\n canCollapse: false,\n viewData: viewData\n }\">\n </ng-container>\n }\n </div>\n </ng-container>\n\n <ng-template \n #selectionTable \n let-accountingBasis=\"accountingBasis\" \n let-canCollapse=\"canCollapse\"\n let-viewData=\"viewData\">\n \n <div class=\"mscoa-chart-table\" role=\"group\" [attr.aria-label]=\"'Accounting basis: ' + (accountingBasis || 'Accrual')\">\n <!-- Toolbar -->\n <app-mscoa-chart-toolbar\n [accountingBasis]=\"accountingBasis\"\n [canCollapse]=\"canCollapse\"\n [isExpanded]=\"getExpansionState(accountingBasis || ACCOUNTING_BASIS.ACCRUAL)\"\n (toggleExpansion)=\"toggleDualBasisExpansion(accountingBasis || ACCOUNTING_BASIS.ACCRUAL)\">\n </app-mscoa-chart-toolbar>\n\n @if (shouldShowTable(isDualAccountBasis, getExpansionState(accountingBasis || ACCOUNTING_BASIS.ACCRUAL), accountingBasis)) {\n <div class=\"account-selection-table-wrapper\">\n <div\n class=\"account-selection-table-container\"\n [class.account-selection-table-container--accrual]=\"!accountingBasis || accountingBasis === ACCOUNTING_BASIS.ACCRUAL\"\n [class.account-selection-table-container--cash]=\"accountingBasis === ACCOUNTING_BASIS.CASH\"\n role=\"table\"\n [attr.aria-label]=\"'Account selection table for ' + (accountingBasis || 'Accrual') + ' basis'\">\n\n <table \n mat-table \n [dataSource]=\"accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashTableData : viewData.tableData\" \n [trackBy]=\"trackByRow\"\n class=\"table\"\n [attr.aria-label]=\"'Account selection table for ' + (accountingBasis || 'Accrual') + ' basis'\"\n [attr.aria-describedby]=\"'table-description-' + (accountingBasis || ACCOUNTING_BASIS.ACCRUAL)\"\n role=\"table\">\n <span [id]=\"'table-description-' + (accountingBasis || ACCOUNTING_BASIS.ACCRUAL)\" class=\"sr-only\">\n Use arrow keys to navigate between cells. Press Enter or Space to select an account.\n </span>\n \n @for (\n col of (accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashCols : viewData.cols); \n track trackByColumn($index, col); \n let i = $index\n ) {\n <ng-container [matColumnDef]=\"col\" [sticky]=\"i === 0\">\n <!-- Header Cell -->\n <th \n mat-header-cell \n *matHeaderCellDef\n [class.table__header-cell--segment]=\"isSegmentColumn(i)\"\n [class.table__header-cell--regular]=\"!isSegmentColumn(i)\"\n [style.width.%]=\"getColumnWidthPercent(isSegmentColumn(i), (accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashCols : viewData.cols).length)\"\n [style.min-width.px]=\"isSegmentColumn(i) ? 150 : 200\"\n [attr.aria-sort]=\"i === 0 ? 'none' : null\"\n [attr.scope]=\"'col'\"\n [attr.aria-label]=\"getHeaderText(col, i, accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashHasMultiSelect : viewData.hasMultiSelect) + ' column'\">\n {{ getHeaderText(col, i, accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashHasMultiSelect : viewData.hasMultiSelect) | titlecase | unCamelCase }}\n </th>\n\n <!-- Data Cell -->\n <td \n mat-cell\n *matCellDef=\"let row\"\n [class.table__cell--segment]=\"isSegmentColumn(i)\"\n [class.table__cell--regular]=\"!isSegmentColumn(i)\"\n [class.table__cell--active]=\"editSelection?.segment === row['segment'] && activeColumn === col\"\n [class.table__cell--business-error]=\"!isSegmentColumn(i) && getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\n [attr.aria-label]=\"'Cell for ' + row['segment'] + ' segment, ' + col + ' column'\"\n [attr.aria-selected]=\"!!row[col]\"\n [attr.aria-invalid]=\"!isSegmentColumn(i) && !!getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\n [attr.role]=\"'gridcell'\"\n [attr.tabindex]=\"isSegmentColumn(i) ? -1 : (row[col] ? 0 : -1)\">\n \n @if (isSegmentColumn(i)) {\n <!-- Segment Column -->\n <div class=\"segment-cell-content\">\n @if (editorMode && row.innerInput?.id) {\n <button \n mat-icon-button \n [matMenuTriggerData]=\"{innerInput: row.innerInput}\"\n [matMenuTriggerFor]=\"inputMenu\" \n [matTooltip]=\"'Options for: ' + row.innerInput.label\"\n [attr.aria-label]=\"'Options menu for ' + row.innerInput.label\"\n (click)=\"$event.stopPropagation()\">\n <mat-icon>more_vert</mat-icon>\n </button>\n }\n <span class=\"segment-cell-content__label\">{{ row['label'] }}</span>\n </div>\n } @else {\n <!-- Regular Column -->\n @if (row.innerInput?.id && formGroup && inputPortals[getPortalKey(row.innerInput.id)]) {\n <div class=\"portal-container\">\n <ng-template [cdkPortalOutlet]=\"inputPortals[getPortalKey(row.innerInput.id)]\"></ng-template>\n </div>\n } @else {\n @if (row[col]) {\n <!-- Account Selected -->\n @if (getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment']); as cellError) {\n <div class=\"account-cell-wrapper\" \n [class.account-cell-wrapper--expandable]=\"isTextTruncated(row[col] | unCamelCase)\">\n <button \n [disabled]=\"row['singleSelect'] === true && col === COLUMNS.CREDIT\"\n (mousedown)=\"$event.preventDefault(); $event.stopPropagation(); selectAccount(row, col, accountingBasis === ACCOUNTING_BASIS.CASH); setAsTouched($event)\"\n (keydown)=\"handleCellKeyDown($event, row, col, accountingBasis === ACCOUNTING_BASIS.CASH)\"\n color=\"primary\" \n mat-button \n class=\"cell-button cell-button--selected cell-button--business-error\"\n [attr.aria-label]=\"'Selected account: ' + (row[col] | unCamelCase) + ' for ' + row['segment'] + ' segment, ' + col + ' column. Business error: ' + cellError.message\"\n [attr.aria-invalid]=\"true\"\n [attr.aria-pressed]=\"true\"\n [matTooltip]=\"cellError.message\">\n <div class=\"content\">\n <span \n class=\"selected-acount-label selected-acount-label--tag selected-acount-label--business-error\"\n [attr.aria-label]=\"'Selected account: ' + (row[col] | unCamelCase)\">\n {{ row[col] | unCamelCase }}\n @if (shouldShowVatChip(row, col)) {\n <span \n class=\"vat-badge\"\n [attr.aria-label]=\"'VAT applicable to ' + col + ' column'\"\n [matTooltip]=\"'VAT is applicable to this ' + col + ' account selection'\">\n VAT\n </span>\n }\n </span>\n <mat-icon class=\"business-error-indicator\" aria-hidden=\"true\">error</mat-icon>\n </div>\n </button>\n </div>\n } @else {\n <div class=\"account-cell-wrapper\" \n [class.account-cell-wrapper--expandable]=\"isTextTruncated(row[col] | unCamelCase)\">\n <button \n [disabled]=\"(row['singleSelect'] === true && col === COLUMNS.CREDIT) || isCellDisabledByBusinessErrors(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\n (mousedown)=\"$event.preventDefault(); $event.stopPropagation(); selectAccount(row, col, accountingBasis === ACCOUNTING_BASIS.CASH); setAsTouched($event)\"\n (keydown)=\"handleCellKeyDown($event, row, col, accountingBasis === ACCOUNTING_BASIS.CASH)\"\n color=\"primary\" \n mat-button \n class=\"cell-button cell-button--selected\"\n [attr.aria-label]=\"'Selected account: ' + (row[col] | unCamelCase) + ' for ' + row['segment'] + ' segment, ' + col + ' column. Press Enter or Space to change'\"\n [attr.aria-invalid]=\"false\"\n [attr.aria-disabled]=\"(row['singleSelect'] === true && col === COLUMNS.CREDIT) || isCellDisabledByBusinessErrors(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\n [attr.aria-pressed]=\"true\">\n <div class=\"content\">\n <span \n class=\"selected-acount-label selected-acount-label--tag\"\n [attr.aria-label]=\"'Selected account: ' + (row[col] | unCamelCase)\">\n {{ row[col] | unCamelCase }}\n @if (shouldShowVatChip(row, col)) {\n <span \n class=\"vat-badge\"\n [attr.aria-label]=\"'VAT applicable to ' + col + ' column'\"\n [matTooltip]=\"'VAT is applicable to this ' + col + ' account selection'\">\n VAT\n </span>\n }\n </span>\n @if (showValidationSuccessIndicators) {\n <mat-icon class=\"validated-indicator\" aria-hidden=\"true\" [matTooltip]=\"'Validated'\">shield</mat-icon>\n } @else {\n <mat-icon class=\"success-indicator\" aria-hidden=\"true\">check_circle</mat-icon>\n }\n </div>\n </button>\n </div>\n }\n } @else {\n <!-- No Account Selected -->\n <div class=\"cell-button-wrapper\">\n <button \n [disabled]=\"selectionDisabled(row, col) || isCellDisabledByBusinessErrors(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\n [color]=\"\"\n (click)=\"selectAccount(row, col, accountingBasis === ACCOUNTING_BASIS.CASH); $event.stopPropagation(); setAsTouched($event)\"\n (keydown)=\"handleCellKeyDown($event, row, col, accountingBasis === ACCOUNTING_BASIS.CASH)\"\n mat-button\n class=\"cell-button\"\n [class.cell-button--business-error]=\"!!getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\n [attr.aria-label]=\"shouldShowAutoSelectedLabel(row, col) ? 'Auto selected for ' + row['segment'] + ' segment, ' + col + ' column' : 'Select account for ' + row['segment'] + ' segment, ' + col + ' column'\"\n [attr.aria-disabled]=\"selectionDisabled(row, col) || isCellDisabledByBusinessErrors(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\n [attr.aria-describedby]=\"getValidationHint(row, col, accountingBasis || ACCOUNTING_BASIS.ACCRUAL) ? 'hint-' + row['segment'] + '-' + col : null\"\n [attr.aria-invalid]=\"hasError(touched, inputConfig?.required || false, !!row[col]) || !!getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\n [attr.aria-required]=\"inputConfig?.required && !row[col]\"\n [matTooltip]=\"getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])?.message\">\n <div class=\"content\">\n <span \n class=\"selected-acount-label\"\n [class.selected-acount-label--error]=\"hasError(touched, inputConfig?.required || false, !!row[col])\"\n [class.selected-acount-label--business-error]=\"!!getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\">\n {{ (shouldShowAutoSelectedLabel(row, col) ? 'auto selected' : 'Select account') | unCamelCase }}\n @if (inputConfig?.required && !row[col]) {\n <span class=\"required-indicator\" aria-label=\"Required field\">*</span>\n }\n </span>\n @if (getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])) {\n <mat-icon class=\"business-error-indicator\" aria-hidden=\"true\">error</mat-icon>\n } @else if (shouldShowDropdownIcon(row, col)) {\n <mat-icon aria-hidden=\"true\">arrow_drop_down</mat-icon>\n }\n </div>\n </button>\n @if (getValidationHint(row, col, accountingBasis || ACCOUNTING_BASIS.ACCRUAL); as hint) {\n <span \n class=\"inline-hint\"\n [id]=\"'hint-' + row['segment'] + '-' + col\"\n role=\"tooltip\"\n aria-live=\"polite\">\n {{ hint }}\n </span>\n }\n </div>\n }\n }\n }\n </td>\n </ng-container>\n }\n\n <tr mat-header-row *matHeaderRowDef=\"accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashCols : viewData.cols\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: (accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashCols : viewData.cols)\"></tr>\n </table>\n </div>\n </div>\n\n <!-- Empty State -->\n <ng-container *ngIf=\"(accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashAccountTreeKeys : viewData.accountTreeKeys).length === 0\">\n <section class=\"empty-state\" role=\"status\" aria-live=\"polite\">\n <mat-icon aria-hidden=\"true\">info</mat-icon>\n <span>\n No account segments are currently configured.\n Please configure account segments to proceed.\n </span>\n </section>\n </ng-container>\n\n <!-- Success Messages (Temporary) -->\n @if ((successMessage$ | async); as successMessages) {\n @if (getSuccessMessage(successMessages, accountingBasis || ACCOUNTING_BASIS.ACCRUAL); as msg) {\n <app-mscoa-temporary-hint\n [message]=\"getSuccessMessage(successMessages, accountingBasis || ACCOUNTING_BASIS.ACCRUAL) ?? ''\"\n [type]=\"'info'\"\n [duration]=\"6000\"\n [showDismiss]=\"true\">\n </app-mscoa-temporary-hint>\n }\n }\n\n <!-- Business Rule Errors (Temporary display, keeps error styling) -->\n @if ((viewData.busnessRuleErrors[accountingBasis || ACCOUNTING_BASIS.ACCRUAL] || []).length > 0) {\n <app-mscoa-error-display\n [errors]=\"viewData.busnessRuleErrors[accountingBasis || ACCOUNTING_BASIS.ACCRUAL] || []\"\n type=\"error\"\n [context]=\"{ accountingBasis: accountingBasis || ACCOUNTING_BASIS.ACCRUAL }\"\n [duration]=\"6000\"\n [showDismiss]=\"true\">\n </app-mscoa-error-display>\n }\n\n <!-- Temporary Contextual Hints -->\n @if (temporaryHintMessage) {\n <app-mscoa-temporary-hint\n [message]=\"temporaryHintMessage\"\n [type]=\"temporaryHintType\"\n [duration]=\"6000\"\n [showDismiss]=\"true\">\n </app-mscoa-temporary-hint>\n }\n\n <!-- Validation Hints (Context-Aware) -->\n @if (!touched && inputConfig?.required && !viewData.busnessRuleErrors[accountingBasis || ACCOUNTING_BASIS.ACCRUAL]?.length && (!isDualAccountBasis || accountingBasis === ACCOUNTING_BASIS.ACCRUAL || !accountingBasis)) {\n <div class=\"validation-hints\" role=\"region\" aria-label=\"Validation guidance\">\n <p class=\"validation-hints__title\">Guidance:</p>\n <ul class=\"validation-hints__list\">\n <li>Account combinations are validated automatically. Select accounts that belong to compatible reporting categories.</li>\n <li>Required fields are marked with an asterisk (*). Complete all required selections to proceed.</li>\n <li>Some fields may be automatically populated based on your selections to ensure consistency.</li>\n </ul>\n </div>\n }\n }\n </div>\n </ng-template>\n } @placeholder {\n <div class=\"loading-placeholder\" role=\"status\" aria-live=\"polite\">\n <p>Loading data...</p>\n </div>\n } @loading (minimum 100ms) {\n <div class=\"loading-spinner-container\" role=\"status\" aria-live=\"polite\">\n <mat-progress-spinner mode=\"indeterminate\" [diameter]=\"40\"></mat-progress-spinner>\n <span class=\"sr-only\">Loading account chart...</span>\n </div>\n } @error {\n <div class=\"error-state\" role=\"alert\" aria-live=\"assertive\">\n <p>Error loading data. Please try again.</p>\n </div>\n }\n }\n</section>\n\n<!-- Input Menu -->\n<mat-menu #inputMenu=\"matMenu\">\n <ng-template matMenuContent let-innerInput=\"innerInput\">\n <app-mscoa-chart-input-menu\n [innerInput]=\"innerInput\"\n [countdownSeconds]=\"inputWillBeRemovedIn(innerInput.id)\"\n [hoveredId]=\"hoveredInputId\"\n (edit)=\"onInputMenuEdit($event)\"\n (delete)=\"onInputMenuDelete($event)\"\n (cancelDelete)=\"onInputMenuCancelDelete($event)\"\n (hoverStart)=\"onInputMenuHoverStart($event)\"\n (hoverEnd)=\"onInputMenuHoverEnd()\">\n </app-mscoa-chart-input-menu>\n </ng-template>\n</mat-menu>\n", styles: ["@charset \"UTF-8\";:host{--mscoa-chart-spacing-xs: 4px;--mscoa-chart-spacing-sm: 8px;--mscoa-chart-spacing-md: 16px;--mscoa-chart-spacing-lg: 24px;--mscoa-chart-spacing-xl: 32px;--mscoa-chart-border-radius: 4px;--mscoa-chart-transition: .2s ease;--mscoa-chart-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;--mscoa-chart-font-size-base: 14px;--mscoa-chart-line-height: 1.5;display:block;font-family:var(--mscoa-chart-font-family);font-size:var(--mscoa-chart-font-size-base);line-height:var(--mscoa-chart-line-height)}.mscoa-chart__container{padding:0;transition:background-color var(--mscoa-chart-transition);width:100%;max-width:100%;overflow-x:hidden;box-sizing:border-box}.mscoa-chart__loading-container{padding:var(--mscoa-chart-spacing-lg);display:flex;align-items:center;justify-content:center}.mscoa-chart__table-container{position:relative;width:100%;max-width:100%;overflow-x:auto;overflow-y:visible;box-sizing:border-box}.dual-basis-container{display:flex;flex-direction:column;gap:var(--mscoa-chart-spacing-sm)}.dual-basis-container__item{flex:1}.single-base{gap:var(--mscoa-chart-spacing-sm);height:48px;font-size:.875em;font-weight:500;transition:background-color var(--mscoa-chart-transition)}.single-base--cash{background:var(--mat-sys-inverse-primary)!important}.account-selection-table-wrapper{position:relative;width:100%}.account-selection-table-container{border-radius:var(--mscoa-chart-border-radius);overflow-x:auto;overflow-y:visible;transition:border-color var(--mscoa-chart-transition);width:100%;max-width:100%;box-sizing:border-box;display:block}.account-selection-table-container--accrual{border:solid 1px var(--mat-sys-primary)}.account-selection-table-container--cash{border:solid 1px var(--mat-sys-inverse-primary)}.account-selection-table-container::-webkit-scrollbar{height:8px}.account-selection-table-container::-webkit-scrollbar-track{background:var(--mat-sys-surface-container-low, #f7f2fa);border-radius:4px}.account-selection-table-container::-webkit-scrollbar-thumb{background:var(--mat-sys-outline-variant, #cac4d0);border-radius:4px}.account-selection-table-container::-webkit-scrollbar-thumb:hover{background:var(--mat-sys-outline, #79747e)}.table{width:100%;table-layout:fixed;font-family:var(--mscoa-chart-font-family);font-size:var(--mscoa-chart-font-size-base);line-height:var(--mscoa-chart-line-height);border-collapse:separate;border-spacing:0;display:table;box-sizing:border-box;max-width:100%}.table__header-cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;box-sizing:border-box}.table__header-cell--segment{text-align:right;padding-right:var(--mscoa-chart-spacing-md);min-width:150px;max-width:200px}.table__header-cell--regular{padding-left:var(--mscoa-chart-spacing-lg);min-width:200px;max-width:none}.table__cell{overflow:visible;box-sizing:border-box;position:relative;vertical-align:top}.table__cell--segment{background:var(--mat-list-active-indicator-color, var(--mat-sys-secondary-container));text-align:right;font-weight:500;padding-right:var(--mscoa-chart-spacing-md);min-width:150px;max-width:200px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;vertical-align:middle}.table__cell--regular{padding:0;min-width:200px;max-width:none;word-wrap:break-word;vertical-align:top;overflow:visible}.table__cell--active{background-color:var(--mat-sys-primary-container);transition:background-color var(--mscoa-chart-transition)}mat-header-cell{background:var(--mat-sys-surface-container);font-weight:600;font-size:var(--mscoa-chart-font-size-base);padding:var(--mscoa-chart-spacing-md)}.mscoa-chart-table{display:flex;flex-direction:column}.portal-container{width:100%}.account-cell-wrapper{position:relative;width:100%;max-width:100%;overflow:visible;z-index:1;min-height:38px;display:flex;flex-direction:column;gap:4px}.cell-button-wrapper{position:relative;width:100%;max-width:100%;overflow:hidden}.cell-button{height:fit-content;min-height:38px;width:100%;max-width:100%;transition:all var(--mscoa-chart-transition);font-family:var(--mscoa-chart-font-family);font-size:var(--mscoa-chart-font-size-base);line-height:var(--mscoa-chart-line-height);position:relative;overflow:visible;padding:8px}.cell-button:hover:not(:disabled){background-color:var(--mat-sys-surface-container);transform:translateY(-1px);box-shadow:0 2px 4px #0000001a}.cell-button:focus-visible{outline:3px solid var(--mat-sys-primary);outline-offset:2px;z-index:1}.cell-button:disabled{opacity:.6;cursor:not-allowed}.cell-button--selected{background-color:transparent}.cell-button--selected:hover:not(:disabled){background-color:var(--mat-sys-surface-container-low, #f7f2fa);border-color:var(--mat-sys-primary, #1976d2)}.cell-button.cell-button--selected{animation:fadeInSuccess var(--mscoa-chart-transition)}.cell-button.cell-button--business-error{border-color:var(--mat-sys-error, #ba1a1a)}.cell-button.cell-button--business-error .selected-acount-label--business-error{color:var(--mat-sys-error);border-color:var(--mat-sys-error)}.success-indicator{color:var(--mat-sys-success, #4caf50);font-size:18px;width:18px;right:-8px;top:-4px;background:#fff;border-radius:16px;position:absolute;height:18px;margin-left:var(--mscoa-chart-spacing-xs);animation:scaleIn var(--mscoa-chart-transition);flex-shrink:0}.validated-indicator{color:var(--mat-sys-primary, #1976d2);font-size:18px;width:18px;height:18px;right:-8px;top:-4px;background:#fff;border-radius:16px;position:absolute;margin-left:var(--mscoa-chart-spacing-xs);flex-shrink:0;animation:validatedShieldIn .3s ease-out forwards}.business-error-indicator{color:var(--mat-sys-error, #ba1a1a);font-size:18px;width:18px;right:-8px;top:-4px;background:#fff;border-radius:16px;position:absolute;height:18px;margin-left:var(--mscoa-chart-spacing-xs);flex-shrink:0}.required-indicator{color:var(--mat-sys-error, #ba1a1a);font-weight:600;margin-left:2px}.inline-hint{display:block;font-size:12px;color:var(--mat-sys-on-surface-variant, #49454f);margin-top:var(--mscoa-chart-spacing-xs);padding:var(--mscoa-chart-spacing-xs) var(--mscoa-chart-spacing-sm);background-color:var(--mat-sys-surface-container-low, #f7f2fa);border-radius:var(--mscoa-chart-border-radius);line-height:1.4;max-width:100%;word-wrap:break-word}.content{padding:0;display:flex;gap:6px;width:100%;max-width:100%;overflow:visible;min-width:0;flex-wrap:wrap;align-items:center}.selected-acount-label{text-align:left;flex:1;font-weight:400;transition:color var(--mscoa-chart-transition)}.selected-acount-label--error,.selected-acount-label--business-error{color:var(--mat-sys-error);font-weight:500}.selected-acount-label--tag{display:inline-block;padding:4px 10px;background-color:var(--mat-sys-primary-container, #e3f2fd);color:var(--mat-sys-on-primary-container, #001d35);border-radius:16px;font-size:13px;font-weight:500;line-height:1.5;border:1px solid var(--mat-sys-primary, #1976d2);box-shadow:0 1px 2px #0000001a;transition:all var(--mscoa-chart-transition);width:100%;max-width:100%;overflow:visible;white-space:normal;word-wrap:break-word;word-break:break-word;cursor:pointer;box-sizing:border-box;position:relative}.selected-acount-label--tag:hover{background-color:var(--mat-sys-primary-container-high, #d0e4f7);box-shadow:0 2px 4px #1976d226}.segment-cell-content{display:flex;align-items:center;justify-content:flex-end;font-weight:500}.vat-badge{display:inline-flex;align-items:center;justify-content:center;height:16px;padding:2px 6px;border-radius:8px;font-size:9px;font-weight:600;letter-spacing:.5px;text-transform:uppercase;background-color:var(--mat-sys-tertiary-container, #e0ffee);color:var(--mat-sys-on-tertiary-container, #7c5000);border:1px solid var(--mat-sys-outline-variant, #cac4d0);box-shadow:none;transition:all var(--mscoa-chart-transition);flex-shrink:0;align-self:flex-start;margin-top:2px;line-height:1}.vat-badge:hover{background-color:var(--mat-sys-tertiary-container-high, #ffe0b2);border-color:var(--mat-sys-tertiary, #f57c00)}.vat-chip-container{padding-left:var(--mscoa-chart-spacing-sm);padding-right:var(--mscoa-chart-spacing-sm);padding-bottom:var(--mscoa-chart-spacing-xs);margin-top:var(--mscoa-chart-spacing-xs)}.vat-chip{display:inline-flex;align-items:center;gap:4px;height:24px;padding:4px 8px;border-radius:12px;font-size:11px;font-weight:600;transition:all var(--mscoa-chart-transition);box-shadow:0 1px 3px #0000001f}.vat-chip--applicable{background:linear-gradient(135deg,var(--mat-sys-tertiary, #f57c00) 0%,var(--mat-sys-tertiary-container, #ff9800) 100%);color:var(--mat-sys-on-tertiary, #ffffff);border:1px solid var(--mat-sys-tertiary, #f57c00)}.vat-chip--applicable:hover{box-shadow:0 2px 6px #f57c004d;transform:translateY(-1px)}.vat-chip__icon{font-size:14px;width:14px;height:14px;opacity:.9}.vat-chip__text{font-size:11px;font-weight:600;letter-spacing:.3px;text-transform:uppercase}.info-box{display:flex;align-items:center;gap:var(--mscoa-chart-spacing-sm);padding:12px;background:azure;border-radius:var(--mscoa-chart-border-radius);margin-bottom:var(--mscoa-chart-spacing-md)}.info-icon{min-width:38px;margin:auto;margin-top:var(--mscoa-chart-spacing-sm)}.empty-state{padding:var(--mscoa-chart-spacing-md);text-align:center;display:flex;align-items:center;justify-content:center;gap:var(--mscoa-chart-spacing-sm);color:var(--mat-sys-on-surface-variant)}.validation-hints{margin-top:var(--mscoa-chart-spacing-md);padding:var(--mscoa-chart-spacing-md);background-color:var(--mat-sys-surface-container-low, #f7f2fa);border-radius:var(--mscoa-chart-border-radius);border-left:4px solid var(--mat-sys-primary, #1976d2);box-shadow:0 1px 3px #00000014}.validation-hints__title{font-weight:600;font-size:var(--mscoa-chart-font-size-base);margin:0 0 var(--mscoa-chart-spacing-sm) 0;color:var(--mat-sys-on-surface, #1c1b16);display:flex;align-items:center;gap:var(--mscoa-chart-spacing-xs)}.validation-hints__title:before{content:\"\\1f4a1\";font-size:16px}.validation-hints__list{margin:0;padding-left:var(--mscoa-chart-spacing-md);color:var(--mat-sys-on-surface-variant, #49454f);font-size:13px;line-height:1.6}.validation-hints__list li{margin-bottom:var(--mscoa-chart-spacing-sm);position:relative}.validation-hints__list li::marker{color:var(--mat-sys-primary, #1976d2)}.validation-hints__list li:last-child{margin-bottom:0}mat-error{font-size:.75em;margin-top:var(--mscoa-chart-spacing-xs)}mat-error ul{margin:0;padding-left:var(--mscoa-chart-spacing-md)}mat-error li{margin-bottom:var(--mscoa-chart-spacing-xs)}.loading-placeholder{padding:var(--mscoa-chart-spacing-md);color:var(--mat-sys-on-surface-variant)}.loading-spinner-container{display:flex;justify-content:center;align-items:center;height:256px}.error-state{padding:var(--mscoa-chart-spacing-md);color:var(--mat-sys-error)}mat-panel-description{font-size:.875em;line-height:1.4}.main-expanse-content{background:var(--mat-sys-surface-container)!important}@media(max-width:768px){.dual-basis-container{gap:var(--mscoa-chart-spacing-md)}.cell-button{min-height:44px;font-size:15px;max-width:300px}.content{padding:var(--mscoa-chart-spacing-md)}.validation-hints{font-size:13px;padding:var(--mscoa-chart-spacing-sm)}.inline-hint{font-size:11px}}.cell-button:focus-visible,button:focus-visible{outline:3px solid var(--mat-sys-primary);outline-offset:2px;outline-style:solid}@media(prefers-contrast:high){.cell-button{border:2px solid currentColor}.cell-button:focus-visible{outline-width:4px}.selected-acount-label--error{font-weight:700}}@media(prefers-reduced-motion:reduce){.cell-button,.success-indicator,.fade-in,.validated-indicator{animation:none;transition:none}}.table__cell--active{background-color:var(--mat-sys-primary-container);color:var(--mat-sys-on-primary-container)}@media(prefers-contrast:high){.table__cell--active{background-color:var(--mat-sys-primary);color:var(--mat-sys-on-primary)}}.table__cell--business-error{background-color:var(--mat-sys-error-container, #ffdad6);border-left:3px solid var(--mat-sys-error, #ba1a1a)}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeInSuccess{0%{background-color:transparent}50%{background-color:var(--mat-sys-success-container, #e8f5e9)}to{background-color:var(--mat-sys-primary-container)}}@keyframes scaleIn{0%{transform:scale(0);opacity:0}to{transform:scale(1);opacity:1}}@keyframes validatedShieldIn{0%{opacity:0;transform:scale(.6)}70%{opacity:1;transform:scale(1.1)}to{opacity:1;transform:scale(1)}}.fade-in{animation:fadeIn var(--mscoa-chart-transition)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.skeleton-loader{background:linear-gradient(90deg,var(--mat-sys-surface-container) 25%,var(--mat-sys-surface-container-high) 50%,var(--mat-sys-surface-container) 75%);background-size:200% 100%;animation:loading 1.5s ease-in-out infinite;border-radius:var(--mscoa-chart-border-radius)}@keyframes loading{0%{background-position:200% 0}to{background-position:-200% 0}}.skeleton-row{height:48px;margin-bottom:var(--mscoa-chart-spacing-xs)}.skeleton-cell{height:100%;margin-right:var(--mscoa-chart-spacing-md)}\n"], dependencies: [{ kind: "ngmodule", type: MatModulesModule }, { kind: "component", type: i6.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "directive", type: i6.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: PortalModule }, { kind: "component", type: MscoaChartInputMenuComponent, selector: "app-mscoa-chart-input-menu", inputs: ["innerInput", "countdownSeconds", "hoveredId"], outputs: ["edit", "delete", "cancelDelete", "hoverStart", "hoverEnd"] }, { kind: "pipe", type: i2$1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [i2.MatButton, i2.MatIconButton, i3.MatIcon, i6.MatMenuTrigger, i9.MatTable, i9.MatHeaderCellDef, i9.MatHeaderRowDef, i9.MatColumnDef, i9.MatCellDef, i9.MatRowDef, i9.MatHeaderCell, i9.MatCell, i9.MatHeaderRow, i9.MatRow, i4.MatTooltip, i9$1.CdkPortalOutlet, i2$1.NgIf, i2$1.NgTemplateOutlet, import('./ngx-t-forms-mscoa-chart-toolbar.component-D_umeAPL.mjs').then(m => m.MscoaChartToolbarComponent), import('./ngx-t-forms-mscoa-error-display.component-CSX2NCNU.mjs').then(m => m.MscoaErrorDisplayComponent), import('./ngx-t-forms-mscoa-temporary-hint.component-BPkjsRmH.mjs').then(m => m.MscoaTemporaryHintComponent), i2$1.AsyncPipe, i2$1.TitleCasePipe, Promise.resolve().then(function () { return daysAgo_pipe; }).then(m => m.ConvertCamelCasePipe)]] }); }
11540
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: MscoaChartComponent, isStandalone: true, selector: "app-mscoa-chart", inputs: { inputConfig: "inputConfig", editorMode: "editorMode", readonly: "readonly", touched: "touched", formGroup: "formGroup", formBuilderFunctions: "formBuilderFunctions", segmentValues: "segmentValues", config: "config" }, outputs: { onContainerClick: "onContainerClick", segmentValuesChanged: "segmentValuesChanged", interaction: "interaction" }, ngImport: i0, template: "<section \n (click)=\"setAsTouched($event)\" \n class=\"mscoa-chart__container\"\n [class.mscoa-chart__container--touched]=\"touched\"\n *ngIf=\"(viewData$ | async) as viewData\"\n role=\"region\"\n [attr.aria-label]=\"'MSCOA Account Chart'\"\n [attr.aria-busy]=\"viewData.loading || viewData.validatingValue\">\n\n @if (viewData.loading) {\n <div class=\"mscoa-chart__loading-container\" role=\"status\" aria-live=\"polite\">\n <mat-spinner [diameter]=\"40\"></mat-spinner>\n <span class=\"sr-only\">Loading account chart data...</span>\n </div>\n } @else {\n @defer (on viewport) {\n <ng-container *ngIf=\"viewData.accountTreeKeys || viewData.cashAccountTreeKeys\">\n <div class=\"mscoa-chart__table-container\">\n @if (isDualAccountBasis) {\n <div class=\"dual-basis-container\" role=\"group\" aria-label=\"Dual accounting basis tables\">\n <div class=\"dual-basis-container__item\">\n <ng-container \n *ngTemplateOutlet=\"selectionTable; \n context: {\n accountingBasis: ACCOUNTING_BASIS.ACCRUAL,\n canCollapse: true,\n viewData: viewData\n }\">\n </ng-container>\n </div>\n \n <div class=\"dual-basis-container__item\">\n <ng-container \n *ngTemplateOutlet=\"selectionTable; \n context: {\n accountingBasis: ACCOUNTING_BASIS.CASH,\n canCollapse: true,\n viewData: viewData\n }\">\n </ng-container>\n </div>\n </div>\n } @else {\n <ng-container \n *ngTemplateOutlet=\"selectionTable; \n context: {\n accountingBasis: config?.accountingBasis,\n canCollapse: false,\n viewData: viewData\n }\">\n </ng-container>\n }\n </div>\n </ng-container>\n\n <ng-template \n #selectionTable \n let-accountingBasis=\"accountingBasis\" \n let-canCollapse=\"canCollapse\"\n let-viewData=\"viewData\">\n \n <div class=\"mscoa-chart-table\" role=\"group\" [attr.aria-label]=\"'Accounting basis: ' + (accountingBasis || 'Accrual')\">\n <!-- Toolbar -->\n <app-mscoa-chart-toolbar\n [accountingBasis]=\"accountingBasis\"\n [canCollapse]=\"canCollapse\"\n [isExpanded]=\"getExpansionState(accountingBasis || ACCOUNTING_BASIS.ACCRUAL)\"\n (toggleExpansion)=\"toggleDualBasisExpansion(accountingBasis || ACCOUNTING_BASIS.ACCRUAL)\">\n </app-mscoa-chart-toolbar>\n\n @if (shouldShowTable(isDualAccountBasis, getExpansionState(accountingBasis || ACCOUNTING_BASIS.ACCRUAL), accountingBasis)) {\n <div class=\"account-selection-table-wrapper\">\n <div\n class=\"account-selection-table-container\"\n [class.account-selection-table-container--accrual]=\"!accountingBasis || accountingBasis === ACCOUNTING_BASIS.ACCRUAL\"\n [class.account-selection-table-container--cash]=\"accountingBasis === ACCOUNTING_BASIS.CASH\"\n role=\"table\"\n [attr.aria-label]=\"'Account selection table for ' + (accountingBasis || 'Accrual') + ' basis'\">\n\n <table \n mat-table \n [dataSource]=\"accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashTableData : viewData.tableData\" \n [trackBy]=\"trackByRow\"\n class=\"table\"\n [attr.aria-label]=\"'Account selection table for ' + (accountingBasis || 'Accrual') + ' basis'\"\n [attr.aria-describedby]=\"'table-description-' + (accountingBasis || ACCOUNTING_BASIS.ACCRUAL)\"\n role=\"table\">\n <span [id]=\"'table-description-' + (accountingBasis || ACCOUNTING_BASIS.ACCRUAL)\" class=\"sr-only\">\n Use arrow keys to navigate between cells. Press Enter or Space to select an account.\n </span>\n \n @for (\n col of (accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashCols : viewData.cols); \n track trackByColumn($index, col); \n let i = $index\n ) {\n <ng-container [matColumnDef]=\"col\" [sticky]=\"i === 0\">\n <!-- Header Cell -->\n <th \n mat-header-cell \n *matHeaderCellDef\n [class.table__header-cell--segment]=\"isSegmentColumn(i)\"\n [class.table__header-cell--regular]=\"!isSegmentColumn(i)\"\n [style.width.%]=\"getColumnWidthPercent(isSegmentColumn(i), (accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashCols : viewData.cols).length)\"\n [style.min-width.px]=\"isSegmentColumn(i) ? 150 : 200\"\n [attr.aria-sort]=\"i === 0 ? 'none' : null\"\n [attr.scope]=\"'col'\"\n [attr.aria-label]=\"getHeaderText(col, i, accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashHasMultiSelect : viewData.hasMultiSelect) + ' column'\">\n {{ getHeaderText(col, i, accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashHasMultiSelect : viewData.hasMultiSelect) | titlecase | unCamelCase }}\n </th>\n\n <!-- Data Cell -->\n <td \n mat-cell\n *matCellDef=\"let row\"\n [class.table__cell--segment]=\"isSegmentColumn(i)\"\n [class.table__cell--regular]=\"!isSegmentColumn(i)\"\n [class.table__cell--active]=\"editSelection?.segment === row['segment'] && activeColumn === col\"\n [class.table__cell--business-error]=\"!isSegmentColumn(i) && getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\n [attr.aria-label]=\"'Cell for ' + row['segment'] + ' segment, ' + col + ' column'\"\n [attr.aria-selected]=\"!!row[col]\"\n [attr.aria-invalid]=\"!isSegmentColumn(i) && !!getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\n [attr.role]=\"'gridcell'\"\n [attr.tabindex]=\"isSegmentColumn(i) ? -1 : (row[col] ? 0 : -1)\">\n \n @if (isSegmentColumn(i)) {\n <!-- Segment Column -->\n <div class=\"segment-cell-content\">\n @if (editorMode && row.innerInput?.id) {\n <button \n mat-icon-button \n [matMenuTriggerData]=\"{innerInput: row.innerInput}\"\n [matMenuTriggerFor]=\"inputMenu\" \n [matTooltip]=\"'Options for: ' + row.innerInput.label\"\n [attr.aria-label]=\"'Options menu for ' + row.innerInput.label\"\n (click)=\"$event.stopPropagation()\">\n <mat-icon>more_vert</mat-icon>\n </button>\n }\n <span class=\"segment-cell-content__label\">{{ row['label'] }}</span>\n </div>\n } @else {\n <!-- Regular Column -->\n @if (row.innerInput?.id && formGroup && inputPortals[getPortalKey(row.innerInput.id)]) {\n <div class=\"portal-container\">\n <ng-template [cdkPortalOutlet]=\"inputPortals[getPortalKey(row.innerInput.id)]\"></ng-template>\n </div>\n } @else {\n @if (row[col]) {\n <!-- Account Selected -->\n @if (getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment']); as cellError) {\n <div class=\"account-cell-wrapper\" \n [class.account-cell-wrapper--expandable]=\"isTextTruncated(row[col] | unCamelCase)\">\n <button \n [disabled]=\"row['singleSelect'] === true && col === COLUMNS.CREDIT\"\n (mousedown)=\"$event.preventDefault(); $event.stopPropagation(); selectAccount(row, col, accountingBasis === ACCOUNTING_BASIS.CASH); setAsTouched($event)\"\n (keydown)=\"handleCellKeyDown($event, row, col, accountingBasis === ACCOUNTING_BASIS.CASH)\"\n color=\"primary\" \n mat-button \n class=\"cell-button cell-button--selected cell-button--business-error\"\n [attr.aria-label]=\"'Selected account: ' + (row[col] | unCamelCase) + ' for ' + row['segment'] + ' segment, ' + col + ' column. Business error: ' + cellError.message\"\n [attr.aria-invalid]=\"true\"\n [attr.aria-pressed]=\"true\"\n [matTooltip]=\"cellError.message\">\n <div class=\"content\">\n <span \n class=\"selected-acount-label selected-acount-label--tag selected-acount-label--business-error\"\n [attr.aria-label]=\"'Selected account: ' + (row[col] | unCamelCase)\">\n {{ row[col] | unCamelCase }}\n @if (shouldShowVatChip(row, col)) {\n <span \n class=\"vat-badge\"\n [attr.aria-label]=\"'VAT applicable to ' + col + ' column'\"\n [matTooltip]=\"'VAT is applicable to this ' + col + ' account selection'\">\n VAT\n </span>\n }\n </span>\n <mat-icon class=\"business-error-indicator\" aria-hidden=\"true\">error</mat-icon>\n </div>\n </button>\n </div>\n } @else {\n <div class=\"account-cell-wrapper\" \n [class.account-cell-wrapper--expandable]=\"isTextTruncated(row[col] | unCamelCase)\">\n <button \n [disabled]=\"(row['singleSelect'] === true && col === COLUMNS.CREDIT) || isCellDisabledByBusinessErrors(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\n (mousedown)=\"$event.preventDefault(); $event.stopPropagation(); selectAccount(row, col, accountingBasis === ACCOUNTING_BASIS.CASH); setAsTouched($event)\"\n (keydown)=\"handleCellKeyDown($event, row, col, accountingBasis === ACCOUNTING_BASIS.CASH)\"\n color=\"primary\" \n mat-button \n class=\"cell-button cell-button--selected\"\n [attr.aria-label]=\"'Selected account: ' + (row[col] | unCamelCase) + ' for ' + row['segment'] + ' segment, ' + col + ' column. Press Enter or Space to change'\"\n [attr.aria-invalid]=\"false\"\n [attr.aria-disabled]=\"(row['singleSelect'] === true && col === COLUMNS.CREDIT) || isCellDisabledByBusinessErrors(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\n [attr.aria-pressed]=\"true\">\n <div class=\"content\">\n <span \n class=\"selected-acount-label selected-acount-label--tag\"\n [attr.aria-label]=\"'Selected account: ' + (row[col] | unCamelCase)\">\n {{ row[col] | unCamelCase }}\n @if (shouldShowVatChip(row, col)) {\n <span \n class=\"vat-badge\"\n [attr.aria-label]=\"'VAT applicable to ' + col + ' column'\"\n [matTooltip]=\"'VAT is applicable to this ' + col + ' account selection'\">\n VAT\n </span>\n }\n </span>\n @if (showValidationSuccessIndicators) {\n <mat-icon class=\"validated-indicator\" aria-hidden=\"true\" [matTooltip]=\"'Validated'\">shield</mat-icon>\n } @else {\n <mat-icon class=\"success-indicator\" aria-hidden=\"true\">check_circle</mat-icon>\n }\n </div>\n </button>\n </div>\n }\n } @else {\n <!-- No Account Selected -->\n <div class=\"cell-button-wrapper\">\n <button \n [disabled]=\"selectionDisabled(row, col) || isCellDisabledByBusinessErrors(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\n [color]=\"\"\n (click)=\"selectAccount(row, col, accountingBasis === ACCOUNTING_BASIS.CASH); $event.stopPropagation(); setAsTouched($event)\"\n (keydown)=\"handleCellKeyDown($event, row, col, accountingBasis === ACCOUNTING_BASIS.CASH)\"\n mat-button\n class=\"cell-button\"\n [class.cell-button--business-error]=\"!!getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\n [attr.aria-label]=\"shouldShowAutoSelectedLabel(row, col) ? 'Auto selected for ' + row['segment'] + ' segment, ' + col + ' column' : 'Select account for ' + row['segment'] + ' segment, ' + col + ' column'\"\n [attr.aria-disabled]=\"selectionDisabled(row, col) || isCellDisabledByBusinessErrors(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\n [attr.aria-describedby]=\"getValidationHint(row, col, accountingBasis || ACCOUNTING_BASIS.ACCRUAL) ? 'hint-' + row['segment'] + '-' + col : null\"\n [attr.aria-invalid]=\"hasError(touched, inputConfig?.required || false, !!row[col]) || !!getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\n [attr.aria-required]=\"inputConfig?.required && !row[col]\"\n [matTooltip]=\"getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])?.message\">\n <div class=\"content\">\n <span \n class=\"selected-acount-label\"\n [class.selected-acount-label--error]=\"hasError(touched, inputConfig?.required || false, !!row[col])\"\n [class.selected-acount-label--business-error]=\"!!getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\">\n {{ (shouldShowAutoSelectedLabel(row, col) ? 'auto selected' : 'Select account') | unCamelCase }}\n @if (inputConfig?.required && !row[col]) {\n <span class=\"required-indicator\" aria-label=\"Required field\">*</span>\n }\n </span>\n @if (getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])) {\n <mat-icon class=\"business-error-indicator\" aria-hidden=\"true\">error</mat-icon>\n } @else if (shouldShowDropdownIcon(row, col)) {\n <mat-icon aria-hidden=\"true\">arrow_drop_down</mat-icon>\n }\n </div>\n </button>\n @if (getValidationHint(row, col, accountingBasis || ACCOUNTING_BASIS.ACCRUAL); as hint) {\n <span \n class=\"inline-hint\"\n [id]=\"'hint-' + row['segment'] + '-' + col\"\n role=\"tooltip\"\n aria-live=\"polite\">\n {{ hint }}\n </span>\n }\n </div>\n }\n }\n }\n </td>\n </ng-container>\n }\n\n <tr mat-header-row *matHeaderRowDef=\"accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashCols : viewData.cols\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: (accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashCols : viewData.cols)\"></tr>\n </table>\n </div>\n </div>\n\n <!-- Empty State -->\n <ng-container *ngIf=\"(accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashAccountTreeKeys : viewData.accountTreeKeys).length === 0\">\n <section class=\"empty-state\" role=\"status\" aria-live=\"polite\">\n <mat-icon aria-hidden=\"true\">info</mat-icon>\n <span>\n No account segments are currently configured.\n Please configure account segments to proceed.\n </span>\n </section>\n </ng-container>\n\n <!-- Success Messages (Temporary) -->\n @if ((successMessage$ | async); as successMessages) {\n @if (getSuccessMessage(successMessages, accountingBasis || ACCOUNTING_BASIS.ACCRUAL); as msg) {\n <app-mscoa-temporary-hint\n [message]=\"getSuccessMessage(successMessages, accountingBasis || ACCOUNTING_BASIS.ACCRUAL) ?? ''\"\n [type]=\"'info'\"\n [duration]=\"6000\"\n [showDismiss]=\"true\">\n </app-mscoa-temporary-hint>\n }\n }\n\n <!-- Business Rule Errors (Temporary display, keeps error styling) -->\n @if ((viewData.busnessRuleErrors[accountingBasis || ACCOUNTING_BASIS.ACCRUAL] || []).length > 0) {\n <app-mscoa-error-display\n [errors]=\"viewData.busnessRuleErrors[accountingBasis || ACCOUNTING_BASIS.ACCRUAL] || []\"\n type=\"error\"\n [context]=\"{ accountingBasis: accountingBasis || ACCOUNTING_BASIS.ACCRUAL }\"\n [duration]=\"6000\"\n [showDismiss]=\"true\">\n </app-mscoa-error-display>\n }\n\n <!-- Temporary Contextual Hints -->\n @if (temporaryHintMessage) {\n <app-mscoa-temporary-hint\n [message]=\"temporaryHintMessage\"\n [type]=\"temporaryHintType\"\n [duration]=\"6000\"\n [showDismiss]=\"true\">\n </app-mscoa-temporary-hint>\n }\n\n <!-- Validation Hints (Context-Aware) -->\n @if (!touched && inputConfig?.required && !viewData.busnessRuleErrors[accountingBasis || ACCOUNTING_BASIS.ACCRUAL]?.length && (!isDualAccountBasis || accountingBasis === ACCOUNTING_BASIS.ACCRUAL || !accountingBasis)) {\n <div class=\"validation-hints\" role=\"region\" aria-label=\"Validation guidance\">\n <p class=\"validation-hints__title\">Guidance:</p>\n <ul class=\"validation-hints__list\">\n <li>Account combinations are validated automatically. Select accounts that belong to compatible reporting categories.</li>\n <li>Required fields are marked with an asterisk (*). Complete all required selections to proceed.</li>\n <li>Some fields may be automatically populated based on your selections to ensure consistency.</li>\n </ul>\n </div>\n }\n }\n </div>\n </ng-template>\n } @placeholder {\n <div class=\"loading-placeholder\" role=\"status\" aria-live=\"polite\">\n <p>Loading data...</p>\n </div>\n } @loading (minimum 100ms) {\n <div class=\"loading-spinner-container\" role=\"status\" aria-live=\"polite\">\n <mat-progress-spinner mode=\"indeterminate\" [diameter]=\"40\"></mat-progress-spinner>\n <span class=\"sr-only\">Loading account chart...</span>\n </div>\n } @error {\n <div class=\"error-state\" role=\"alert\" aria-live=\"assertive\">\n <p>Error loading data. Please try again.</p>\n </div>\n }\n }\n</section>\n\n<!-- Input Menu -->\n<mat-menu #inputMenu=\"matMenu\">\n <ng-template matMenuContent let-innerInput=\"innerInput\">\n <app-mscoa-chart-input-menu\n [innerInput]=\"innerInput\"\n [countdownSeconds]=\"inputWillBeRemovedIn(innerInput.id)\"\n [hoveredId]=\"hoveredInputId\"\n (edit)=\"onInputMenuEdit($event)\"\n (delete)=\"onInputMenuDelete($event)\"\n (cancelDelete)=\"onInputMenuCancelDelete($event)\"\n (hoverStart)=\"onInputMenuHoverStart($event)\"\n (hoverEnd)=\"onInputMenuHoverEnd()\">\n </app-mscoa-chart-input-menu>\n </ng-template>\n</mat-menu>\n", styles: ["@charset \"UTF-8\";:host{--mscoa-chart-spacing-xs: 4px;--mscoa-chart-spacing-sm: 8px;--mscoa-chart-spacing-md: 16px;--mscoa-chart-spacing-lg: 24px;--mscoa-chart-spacing-xl: 32px;--mscoa-chart-border-radius: 4px;--mscoa-chart-transition: .2s ease;--mscoa-chart-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;--mscoa-chart-font-size-base: 14px;--mscoa-chart-line-height: 1.5;display:block;font-family:var(--mscoa-chart-font-family);font-size:var(--mscoa-chart-font-size-base);line-height:var(--mscoa-chart-line-height)}.mscoa-chart__container{padding:0;transition:background-color var(--mscoa-chart-transition);width:100%;max-width:100%;overflow-x:hidden;box-sizing:border-box}.mscoa-chart__loading-container{padding:var(--mscoa-chart-spacing-lg);display:flex;align-items:center;justify-content:center}.mscoa-chart__table-container{position:relative;width:100%;max-width:100%;overflow-x:auto;overflow-y:visible;box-sizing:border-box}.dual-basis-container{display:flex;flex-direction:column;gap:var(--mscoa-chart-spacing-sm)}.dual-basis-container__item{flex:1}.single-base{gap:var(--mscoa-chart-spacing-sm);height:48px;font-size:.875em;font-weight:500;transition:background-color var(--mscoa-chart-transition)}.single-base--cash{background:var(--mat-sys-inverse-primary)!important}.account-selection-table-wrapper{position:relative;width:100%}.account-selection-table-container{border-radius:var(--mscoa-chart-border-radius);overflow-x:auto;overflow-y:visible;transition:border-color var(--mscoa-chart-transition);width:100%;max-width:100%;box-sizing:border-box;display:block}.account-selection-table-container--accrual{border:solid 1px var(--mat-sys-primary)}.account-selection-table-container--cash{border:solid 1px var(--mat-sys-inverse-primary)}.account-selection-table-container::-webkit-scrollbar{height:8px}.account-selection-table-container::-webkit-scrollbar-track{background:var(--mat-sys-surface-container-low, #f7f2fa);border-radius:4px}.account-selection-table-container::-webkit-scrollbar-thumb{background:var(--mat-sys-outline-variant, #cac4d0);border-radius:4px}.account-selection-table-container::-webkit-scrollbar-thumb:hover{background:var(--mat-sys-outline, #79747e)}.table{width:100%;table-layout:fixed;font-family:var(--mscoa-chart-font-family);font-size:var(--mscoa-chart-font-size-base);line-height:var(--mscoa-chart-line-height);border-collapse:separate;border-spacing:0;display:table;box-sizing:border-box;max-width:100%}.table__header-cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;box-sizing:border-box}.table__header-cell--segment{text-align:right;padding-right:var(--mscoa-chart-spacing-md);min-width:150px;max-width:200px}.table__header-cell--regular{padding-left:var(--mscoa-chart-spacing-lg);min-width:200px;max-width:none}.table__cell{overflow:visible;box-sizing:border-box;position:relative;vertical-align:top}.table__cell--segment{background:var(--mat-list-active-indicator-color, var(--mat-sys-secondary-container));text-align:right;font-weight:500;padding-right:var(--mscoa-chart-spacing-md);min-width:150px;max-width:200px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;vertical-align:middle}.table__cell--regular{padding:0;min-width:200px;max-width:none;word-wrap:break-word;vertical-align:top;overflow:visible}.table__cell--active{background-color:var(--mat-sys-primary-container);transition:background-color var(--mscoa-chart-transition)}mat-header-cell{background:var(--mat-sys-surface-container);font-weight:600;font-size:var(--mscoa-chart-font-size-base);padding:var(--mscoa-chart-spacing-md)}.mscoa-chart-table{display:flex;flex-direction:column}.portal-container{width:100%}.account-cell-wrapper{position:relative;width:100%;max-width:100%;overflow:visible;z-index:1;min-height:38px;display:flex;flex-direction:column;gap:4px}.cell-button-wrapper{position:relative;width:100%;max-width:100%;overflow:hidden}.cell-button{height:fit-content;min-height:38px;width:100%;max-width:100%;transition:all var(--mscoa-chart-transition);font-family:var(--mscoa-chart-font-family);font-size:var(--mscoa-chart-font-size-base);line-height:var(--mscoa-chart-line-height);position:relative;overflow:visible;padding:8px}.cell-button:hover:not(:disabled){background-color:var(--mat-sys-surface-container);transform:translateY(-1px);box-shadow:0 2px 4px #0000001a}.cell-button:focus-visible{outline:3px solid var(--mat-sys-primary);outline-offset:2px;z-index:1}.cell-button:disabled{opacity:.6;cursor:not-allowed}.cell-button--selected{background-color:transparent}.cell-button--selected:hover:not(:disabled){background-color:var(--mat-sys-surface-container-low, #f7f2fa);border-color:var(--mat-sys-primary, #1976d2)}.cell-button.cell-button--selected{animation:fadeInSuccess var(--mscoa-chart-transition)}.cell-button.cell-button--business-error{border-color:var(--mat-sys-error, #ba1a1a)}.cell-button.cell-button--business-error .selected-acount-label--business-error{color:var(--mat-sys-error);border-color:var(--mat-sys-error)}.success-indicator{color:var(--mat-sys-success, #4caf50);font-size:18px;width:18px;right:-8px;top:-4px;background:#fff;border-radius:16px;position:absolute;height:18px;margin-left:var(--mscoa-chart-spacing-xs);animation:scaleIn var(--mscoa-chart-transition);flex-shrink:0}.validated-indicator{color:var(--mat-sys-primary, #1976d2);font-size:18px;width:18px;height:18px;right:-8px;top:-4px;background:#fff;border-radius:16px;position:absolute;margin-left:var(--mscoa-chart-spacing-xs);flex-shrink:0;animation:validatedShieldIn .3s ease-out forwards}.business-error-indicator{color:var(--mat-sys-error, #ba1a1a);font-size:18px;width:18px;right:-8px;top:-4px;background:#fff;border-radius:16px;position:absolute;height:18px;margin-left:var(--mscoa-chart-spacing-xs);flex-shrink:0}.required-indicator{color:var(--mat-sys-error, #ba1a1a);font-weight:600;margin-left:2px}.inline-hint{display:block;font-size:12px;color:var(--mat-sys-on-surface-variant, #49454f);margin-top:var(--mscoa-chart-spacing-xs);padding:var(--mscoa-chart-spacing-xs) var(--mscoa-chart-spacing-sm);background-color:var(--mat-sys-surface-container-low, #f7f2fa);border-radius:var(--mscoa-chart-border-radius);line-height:1.4;max-width:100%;word-wrap:break-word}.content{padding:0;display:flex;gap:6px;width:100%;max-width:100%;overflow:visible;min-width:0;flex-wrap:wrap;align-items:center}.selected-acount-label{text-align:left;flex:1;font-weight:400;transition:color var(--mscoa-chart-transition)}.selected-acount-label--error,.selected-acount-label--business-error{color:var(--mat-sys-error);font-weight:500}.selected-acount-label--tag{display:inline-block;padding:4px 10px;background-color:var(--mat-sys-primary-container, #e3f2fd);color:var(--mat-sys-on-primary-container, #001d35);border-radius:16px;font-size:13px;font-weight:500;line-height:1.5;border:1px solid var(--mat-sys-primary, #1976d2);box-shadow:0 1px 2px #0000001a;transition:all var(--mscoa-chart-transition);width:100%;max-width:100%;overflow:visible;white-space:normal;word-wrap:break-word;word-break:break-word;cursor:pointer;box-sizing:border-box;position:relative}.selected-acount-label--tag:hover{background-color:var(--mat-sys-primary-container-high, #d0e4f7);box-shadow:0 2px 4px #1976d226}.segment-cell-content{display:flex;align-items:center;justify-content:flex-end;font-weight:500}.vat-badge{display:inline-flex;align-items:center;justify-content:center;height:16px;padding:2px 6px;border-radius:8px;font-size:9px;font-weight:600;letter-spacing:.5px;text-transform:uppercase;background-color:var(--mat-sys-tertiary-container, #e0ffee);color:var(--mat-sys-on-tertiary-container, #7c5000);border:1px solid var(--mat-sys-outline-variant, #cac4d0);box-shadow:none;transition:all var(--mscoa-chart-transition);flex-shrink:0;align-self:flex-start;margin-top:2px;line-height:1}.vat-badge:hover{background-color:var(--mat-sys-tertiary-container-high, #ffe0b2);border-color:var(--mat-sys-tertiary, #f57c00)}.vat-chip-container{padding-left:var(--mscoa-chart-spacing-sm);padding-right:var(--mscoa-chart-spacing-sm);padding-bottom:var(--mscoa-chart-spacing-xs);margin-top:var(--mscoa-chart-spacing-xs)}.vat-chip{display:inline-flex;align-items:center;gap:4px;height:24px;padding:4px 8px;border-radius:12px;font-size:11px;font-weight:600;transition:all var(--mscoa-chart-transition);box-shadow:0 1px 3px #0000001f}.vat-chip--applicable{background:linear-gradient(135deg,var(--mat-sys-tertiary, #f57c00) 0%,var(--mat-sys-tertiary-container, #ff9800) 100%);color:var(--mat-sys-on-tertiary, #ffffff);border:1px solid var(--mat-sys-tertiary, #f57c00)}.vat-chip--applicable:hover{box-shadow:0 2px 6px #f57c004d;transform:translateY(-1px)}.vat-chip__icon{font-size:14px;width:14px;height:14px;opacity:.9}.vat-chip__text{font-size:11px;font-weight:600;letter-spacing:.3px;text-transform:uppercase}.info-box{display:flex;align-items:center;gap:var(--mscoa-chart-spacing-sm);padding:12px;background:azure;border-radius:var(--mscoa-chart-border-radius);margin-bottom:var(--mscoa-chart-spacing-md)}.info-icon{min-width:38px;margin:auto;margin-top:var(--mscoa-chart-spacing-sm)}.empty-state{padding:var(--mscoa-chart-spacing-md);text-align:center;display:flex;align-items:center;justify-content:center;gap:var(--mscoa-chart-spacing-sm);color:var(--mat-sys-on-surface-variant)}.validation-hints{margin-top:var(--mscoa-chart-spacing-md);padding:var(--mscoa-chart-spacing-md);background-color:var(--mat-sys-surface-container-low, #f7f2fa);border-radius:var(--mscoa-chart-border-radius);border-left:4px solid var(--mat-sys-primary, #1976d2);box-shadow:0 1px 3px #00000014}.validation-hints__title{font-weight:600;font-size:var(--mscoa-chart-font-size-base);margin:0 0 var(--mscoa-chart-spacing-sm) 0;color:var(--mat-sys-on-surface, #1c1b16);display:flex;align-items:center;gap:var(--mscoa-chart-spacing-xs)}.validation-hints__title:before{content:\"\\1f4a1\";font-size:16px}.validation-hints__list{margin:0;padding-left:var(--mscoa-chart-spacing-md);color:var(--mat-sys-on-surface-variant, #49454f);font-size:13px;line-height:1.6}.validation-hints__list li{margin-bottom:var(--mscoa-chart-spacing-sm);position:relative}.validation-hints__list li::marker{color:var(--mat-sys-primary, #1976d2)}.validation-hints__list li:last-child{margin-bottom:0}mat-error{font-size:.75em;margin-top:var(--mscoa-chart-spacing-xs)}mat-error ul{margin:0;padding-left:var(--mscoa-chart-spacing-md)}mat-error li{margin-bottom:var(--mscoa-chart-spacing-xs)}.loading-placeholder{padding:var(--mscoa-chart-spacing-md);color:var(--mat-sys-on-surface-variant)}.loading-spinner-container{display:flex;justify-content:center;align-items:center;height:256px}.error-state{padding:var(--mscoa-chart-spacing-md);color:var(--mat-sys-error)}mat-panel-description{font-size:.875em;line-height:1.4}.main-expanse-content{background:var(--mat-sys-surface-container)!important}@media(max-width:768px){.dual-basis-container{gap:var(--mscoa-chart-spacing-md)}.cell-button{min-height:44px;font-size:15px;max-width:300px}.content{padding:var(--mscoa-chart-spacing-md)}.validation-hints{font-size:13px;padding:var(--mscoa-chart-spacing-sm)}.inline-hint{font-size:11px}}.cell-button:focus-visible,button:focus-visible{outline:3px solid var(--mat-sys-primary);outline-offset:2px;outline-style:solid}@media(prefers-contrast:high){.cell-button{border:2px solid currentColor}.cell-button:focus-visible{outline-width:4px}.selected-acount-label--error{font-weight:700}}@media(prefers-reduced-motion:reduce){.cell-button,.success-indicator,.fade-in,.validated-indicator{animation:none;transition:none}}.table__cell--active{background-color:var(--mat-sys-primary-container);color:var(--mat-sys-on-primary-container)}@media(prefers-contrast:high){.table__cell--active{background-color:var(--mat-sys-primary);color:var(--mat-sys-on-primary)}}.table__cell--business-error{background-color:var(--mat-sys-error-container, #ffdad6);border-left:3px solid var(--mat-sys-error, #ba1a1a)}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeInSuccess{0%{background-color:transparent}50%{background-color:var(--mat-sys-success-container, #e8f5e9)}to{background-color:var(--mat-sys-primary-container)}}@keyframes scaleIn{0%{transform:scale(0);opacity:0}to{transform:scale(1);opacity:1}}@keyframes validatedShieldIn{0%{opacity:0;transform:scale(.6)}70%{opacity:1;transform:scale(1.1)}to{opacity:1;transform:scale(1)}}.fade-in{animation:fadeIn var(--mscoa-chart-transition)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.skeleton-loader{background:linear-gradient(90deg,var(--mat-sys-surface-container) 25%,var(--mat-sys-surface-container-high) 50%,var(--mat-sys-surface-container) 75%);background-size:200% 100%;animation:loading 1.5s ease-in-out infinite;border-radius:var(--mscoa-chart-border-radius)}@keyframes loading{0%{background-position:200% 0}to{background-position:-200% 0}}.skeleton-row{height:48px;margin-bottom:var(--mscoa-chart-spacing-xs)}.skeleton-cell{height:100%;margin-right:var(--mscoa-chart-spacing-md)}\n"], dependencies: [{ kind: "ngmodule", type: MatModulesModule }, { kind: "component", type: i6.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "directive", type: i6.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: PortalModule }, { kind: "component", type: MscoaChartInputMenuComponent, selector: "app-mscoa-chart-input-menu", inputs: ["innerInput", "countdownSeconds", "hoveredId"], outputs: ["edit", "delete", "cancelDelete", "hoverStart", "hoverEnd"] }, { kind: "pipe", type: i2$1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [i2.MatButton, i2.MatIconButton, i3.MatIcon, i6.MatMenuTrigger, i9.MatTable, i9.MatHeaderCellDef, i9.MatHeaderRowDef, i9.MatColumnDef, i9.MatCellDef, i9.MatRowDef, i9.MatHeaderCell, i9.MatCell, i9.MatHeaderRow, i9.MatRow, i4.MatTooltip, i9$1.CdkPortalOutlet, i2$1.NgIf, i2$1.NgTemplateOutlet, import('./ngx-t-forms-mscoa-chart-toolbar.component-DY1QnG08.mjs').then(m => m.MscoaChartToolbarComponent), import('./ngx-t-forms-mscoa-error-display.component-CRc_4l3l.mjs').then(m => m.MscoaErrorDisplayComponent), import('./ngx-t-forms-mscoa-temporary-hint.component-GYxT-56Y.mjs').then(m => m.MscoaTemporaryHintComponent), i2$1.AsyncPipe, i2$1.TitleCasePipe, Promise.resolve().then(function () { return daysAgo_pipe; }).then(m => m.ConvertCamelCasePipe)]] }); }
11022
11541
  }
11023
- i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "21.1.5", ngImport: i0, type: MscoaChartComponent, resolveDeferredDeps: () => [import('./ngx-t-forms-mscoa-chart-toolbar.component-D_umeAPL.mjs').then(m => m.MscoaChartToolbarComponent), import('./ngx-t-forms-mscoa-error-display.component-CSX2NCNU.mjs').then(m => m.MscoaErrorDisplayComponent), import('./ngx-t-forms-mscoa-temporary-hint.component-BPkjsRmH.mjs').then(m => m.MscoaTemporaryHintComponent), Promise.resolve().then(function () { return daysAgo_pipe; }).then(m => m.ConvertCamelCasePipe)], resolveMetadata: (MscoaChartToolbarComponent, MscoaErrorDisplayComponent, MscoaTemporaryHintComponent, ConvertCamelCasePipe) => ({ decorators: [{
11542
+ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "21.1.5", ngImport: i0, type: MscoaChartComponent, resolveDeferredDeps: () => [import('./ngx-t-forms-mscoa-chart-toolbar.component-DY1QnG08.mjs').then(m => m.MscoaChartToolbarComponent), import('./ngx-t-forms-mscoa-error-display.component-CRc_4l3l.mjs').then(m => m.MscoaErrorDisplayComponent), import('./ngx-t-forms-mscoa-temporary-hint.component-GYxT-56Y.mjs').then(m => m.MscoaTemporaryHintComponent), Promise.resolve().then(function () { return daysAgo_pipe; }).then(m => m.ConvertCamelCasePipe)], resolveMetadata: (MscoaChartToolbarComponent, MscoaErrorDisplayComponent, MscoaTemporaryHintComponent, ConvertCamelCasePipe) => ({ decorators: [{
11024
11543
  type: Component,
11025
11544
  args: [{ selector: 'app-mscoa-chart', standalone: true, imports: [
11026
11545
  MatModulesModule,
@@ -13411,12 +13930,42 @@ class MultipleInputTableViewComponent {
13411
13930
  rowIsInEdit(row) {
13412
13931
  return !!this.inputConfig?.formIsOpen && this.formGroup?.controls[`${this.inputConfig?.id}.id`]?.value === row[`${this.inputConfig?.id}.id`];
13413
13932
  }
13933
+ get userCanEdit() {
13934
+ if (!this.inputConfig)
13935
+ return false;
13936
+ //NOTE: Temporary backward compatibility for older versions of the config that might not have the new property
13937
+ if (!this.inputConfig.multipleInputAvailableOperations)
13938
+ return true;
13939
+ return this.inputConfig.multipleInputAvailableOperations?.includes(MultipleInputAvailableOperations.Update);
13940
+ }
13941
+ get userCanRemove() {
13942
+ if (!this.inputConfig)
13943
+ return false;
13944
+ //NOTE: Temporary backward compatibility for older versions of the config that might not have the new property
13945
+ if (!this.inputConfig.multipleInputAvailableOperations)
13946
+ return true;
13947
+ return this.inputConfig.multipleInputAvailableOperations?.includes(MultipleInputAvailableOperations.Remove);
13948
+ }
13949
+ get userCanAdd() {
13950
+ if (!this.inputConfig)
13951
+ return false;
13952
+ //NOTE: Temporary backward compatibility for older versions of the config that might not have the new property
13953
+ if (!this.inputConfig.multipleInputAvailableOperations)
13954
+ return true;
13955
+ return this.inputConfig.multipleInputAvailableOperations?.includes(MultipleInputAvailableOperations.Add);
13956
+ }
13957
+ get userCanApplyOptionsTo() {
13958
+ const hasSomeOptionsToApply = this.userCanEdit || this.userCanRemove || this.userCanAdd;
13959
+ if (hasSomeOptionsToApply)
13960
+ return true;
13961
+ return false;
13962
+ }
13414
13963
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: MultipleInputTableViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
13415
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: MultipleInputTableViewComponent, isStandalone: true, selector: "lib-multiple-input-table-view", inputs: { inputConfig: "inputConfig", dataSource: "dataSource", applyOptionsTo: "applyOptionsTo", formGroup: "formGroup" }, outputs: { onEditItem: "onEditItem", onDeleteItem: "onDeleteItem", onCopy: "onCopy", onApplyOptionsTo: "onApplyOptionsTo" }, ngImport: i0, template: "@defer (on viewport) {\r\n\r\n@if (getColConfig.displayedColumnsInOrder.length===0) {\r\n<div style=\"\r\n padding-left: 16px;\r\n padding-right: 16px;\r\n padding-top: 16px;\r\n padding-bottom: 16px;\r\n\r\n display: flex;\r\n justify-content: center;\r\n opacity: 0.6;\r\n font-size: 0.8125em;\r\n \">\r\n No columns\r\n</div>\r\n}\r\n<div class=\"table-container\">\r\n\r\n <table mat-table [dataSource]=\"(dataSource || [])\" class=\"example-table\" matSort matSortActive=\"created\"\r\n matSortDisableClear matSortDirection=\"desc\">\r\n @for (col of (displayedColumnsInOrder||[]); track col) {\r\n <ng-container [matColumnDef]=\"col\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <span style=\"text-align: start; line-height: normal; font-size: 0.8125em\">\r\n {{ getColConfig.columnsConfig?.[col]?.[\"label\"] }}\r\n </span>\r\n @if($last){\r\n <button matTooltip=\"Show other values\" [matMenuTriggerFor]=\"colOptions\" \r\n [matMenuTriggerData]=\"{}\" mat-icon-button>\r\n <mat-icon>\r\n label\r\n </mat-icon>\r\n </button>\r\n \r\n }\r\n </th>\r\n <td [class.functionClass]=\"row['SYSTEM_KEY_PROPERTY_FOR_MULTIPLE_INPUTS_CALCULATION_FUNCTION']\"\r\n \r\n [style.background]=\"\r\n returnBackground(row, getColConfig.columnsConfig?.[col])\r\n \" mat-cell *matCellDef=\"let row\">\r\n <div *ngIf=\" getColConfig.columnsConfig?.[col]?.['type'] === 'removal'\" class=\"cellClass\">\r\n \r\n <div style=\"width: 100%; text-align: right;\" *ngIf=\"!!row['SYSTEM_KEY_PROPERTY_FOR_MULTIPLE_INPUTS_CALCULATION_FUNCTION'] &&!row['id'] && !inputConfig?.multipleInputInEditId || \r\n !!row['SYSTEM_KEY_PROPERTY_FOR_MULTIPLE_INPUTS_CALCULATION_FUNCTION'] && inputConfig?.multipleInputInEditId &&\r\n inputConfig?.multipleInputInEditId !== row['id']\">\r\n <strong>\r\n\r\n {{getCalculationFunction(row)}}\r\n </strong>\r\n\r\n </div>\r\n <button mat-icon-button\r\n [color]=\"t.menuOpen ? 'primary' : 'basic'\"\r\n *ngIf=\"\r\n !row['SYSTEM_KEY_PROPERTY_FOR_MULTIPLE_INPUTS_CALCULATION_FUNCTION'] &&\r\n row['' ] !== 'true' && !inputConfig?.readonly \r\n \r\n \" \r\n [matMenuTriggerFor]=\"rowOptions\" \r\n [matMenuTriggerData]=\"{row:row}\" \r\n #t=\"matMenuTrigger\" (click)=\"applyOptionsToFn(row)\"\r\n expand=\"block\" fill=\"clear\" style=\"margin-left: auto;margin-right:0px;display:block\">\r\n @if (rowIsInEdit(row)) {\r\n <mat-icon color=\"primary\">\r\n edit\r\n </mat-icon> \r\n\r\n }@else {\r\n <mat-icon >\r\n {{\r\n t.menuOpen ? 'close' : 'more_horiz'\r\n }}\r\n \r\n </mat-icon>\r\n }\r\n \r\n\r\n </button>\r\n\r\n\r\n <mat-chip *ngIf=\"\r\n row['SYSTEM_KEY_IN_EDIT']\r\n \r\n \">\r\n In {{ inputConfig?.readonly ? 'View' : 'Edit' }}\r\n\r\n </mat-chip>\r\n\r\n </div>\r\n <div *ngIf=\"getColConfig.columnsConfig && getColConfig.columnsConfig?.[col]?.type !== 'removal'\"\r\n class=\"cellClass\">\r\n <span >\r\n {{ row[col] |formatData: getColConfig.columnsConfig?.[col].dataType }}\r\n\r\n </span>\r\n </div>\r\n </td>\r\n </ng-container>\r\n }\r\n\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"getColConfig.displayedColumnsInOrder \"></tr>\r\n <tr [style.border-top]=\"hasTopBorder(row) ? 'solid 2px' : ''\" mat-row\r\n \r\n *matRowDef=\"let row; columns: getColConfig.displayedColumnsInOrder\"></tr>\r\n </table>\r\n \r\n <div *ngIf=\"!(dataSource?.data)||(dataSource?.data)?.length === 0\">\r\n <div style=\"\r\n padding-left: 16px;\r\n padding-right: 16px;\r\n padding-top: 16px;\r\n padding-bottom: 16px;\r\n\r\n display: flex;\r\n justify-content: center;\r\n opacity: 0.6;\r\n font-size: 0.8125em;\r\n \">\r\n <div style=\"\r\n padding-left: 16px;\r\n padding-right: 16px;\r\n padding-top: 16px;\r\n padding-bottom: 16px;\r\n\r\n display: flex;\r\n justify-content: center;\r\n opacity: 0.6;\r\n font-size: 0.8125em;\r\n \">\r\n \r\n <div style=\"margin-top: 8px; text-align: center;\">\r\n <mat-icon style=\"font-size: 1.25em; vertical-align: middle; margin-right: 8px;\">list</mat-icon>\r\n <div style=\"margin-top: 8px;\">\r\n <strong>No items yet</strong>\r\n <p style=\"margin-top: 4px; font-size: 0.8125em;\">\r\n <strong>Click the add button</strong> to create a new row. You'll be able to fill in details using a form.\r\n Each saved entry will appear as a row in this table.\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n}@placeholder {\r\n<div style=\"padding: 50px;display:flex;justify-content:center;align-items:center; text-align: center;\">\r\n <mat-spinner diameter=\"50\" />\r\n</div>\r\n}\r\n<mat-menu #colOptions=\"matMenu\">\r\n <ng-template matMenuContent >\r\n @for (label of allPossibleLabels; track label.label) {\r\n <button mat-menu-item (click)=\"toggleTepLabel($event,label.formControlName);\">\r\n <mat-icon>\r\n {{ label.selected?'check_circle':'radio_button_unchecked'}}\r\n </mat-icon>\r\n {{label.label}}\r\n \r\n </button>\r\n \r\n }\r\n\r\n </ng-template>\r\n</mat-menu>\r\n<mat-menu #rowOptions=\"matMenu\">\r\n <ng-template matMenuContent let-row=\"row\">\r\n @if(!inputConfig?.readonly){\r\n <button mat-menu-item (click)=\"editItem(row)\">\r\n <mat-icon>\r\n {{'edit'}}\r\n </mat-icon>\r\n <div class=\"option-text\">\r\n <div class=\"option-main-text\">\r\n {{ 'Edit'}}\r\n </div>\r\n <div class=\"option-sub-text\">\r\n {{inputConfig?.readonly ? 'View item properties' : 'Modify item properties'}}\r\n </div>\r\n </div>\r\n </button>\r\n\r\n <button mat-menu-item (click)=\"copy(row)\">\r\n <mat-icon>\r\n content_copy\r\n </mat-icon>\r\n <div class=\"option-text\">\r\n <div class=\"option-main-text\">\r\n Duplicate\r\n </div>\r\n <div class=\"option-sub-text\">\r\n Create a copy with same values\r\n </div>\r\n </div>\r\n </button>\r\n @if(isAboutToDeleteRow(row)){\r\n <button mat-menu-item (click)=\"multipleInputRemoveItem($event,row)\">\r\n <mat-icon color=\"accent\">\r\n cancel\r\n </mat-icon>\r\n <div class=\"option-text\">\r\n <div class=\"option-main-text\" style=\"color: #2196F3;\">\r\n Cancel Deletion\r\n </div>\r\n <div class=\"option-sub-text\">\r\n Auto-deleting in {{ secondsCountDown()}} seconds...\r\n </div>\r\n </div>\r\n </button>\r\n <div class=\"deletion-progress-container\">\r\n <mat-progress-bar color=\"warn\" mode=\"determinate\" [value]=\"getCountdownSeconds()\"></mat-progress-bar>\r\n <div class=\"deletion-message\" *ngIf=\"getCountdownSeconds() > 75\">\r\n Deleting soon...\r\n </div>\r\n </div>\r\n }@else {\r\n <button mat-menu-item (click)=\"multipleInputRemoveItem($event,row)\">\r\n <mat-icon color=\"warn\">\r\n delete_outline\r\n </mat-icon>\r\n <div class=\"option-text\">\r\n <div class=\"option-main-text\">\r\n Delete \r\n </div>\r\n <div class=\"option-sub-text\">\r\n Will delete after 3 seconds (click to cancel)\r\n </div>\r\n </div>\r\n </button>\r\n }\r\n }\r\n </ng-template>\r\n</mat-menu>\r\n", styles: [".functionClass{background:var(--mat-sys-surface-container, var(--mat-app-surface));font-weight:500}.option-text{display:flex;flex-direction:column;margin-left:8px}.option-main-text{font-size:.875em;font-weight:500;margin-bottom:2px;line-height:normal}.option-sub-text{line-height:normal;font-size:.75em;color:#0000008a;font-weight:400;line-height:1.2}.deletion-progress-container{position:relative;padding:0 16px 8px}.deletion-message{position:absolute;right:16px;top:2px;font-size:.6875em;color:#f44336;font-weight:500;line-height:1.6;animation:pulse 1s infinite}button:has(+.deletion-progress-container){border-bottom:none!important;padding-bottom:4px!important}@keyframes pulse{0%{opacity:.7}50%{opacity:1}to{opacity:.7}}@media(max-width:600px){.option-sub-text{max-width:180px;white-space:normal}}.table-container{max-width:100%!important;overflow:auto!important}\n"], dependencies: [{ kind: "ngmodule", type: MatModulesModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i6.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i6.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "component", type: i4$4.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatTableModule }], deferBlockDependencies: [() => [i2.MatIconButton, i4$3.MatChip, i3.MatIcon, i6.MatMenuTrigger, i10$1.MatSort, i9.MatTable, i9.MatHeaderCellDef, i9.MatHeaderRowDef, i9.MatColumnDef, i9.MatCellDef, i9.MatRowDef, i9.MatHeaderCell, i9.MatCell, i9.MatHeaderRow, i9.MatRow, i4.MatTooltip, i2$1.NgIf, Promise.resolve().then(function () { return formatData_pipe; }).then(m => m.FormatDataPipe)]] }); }
13964
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: MultipleInputTableViewComponent, isStandalone: true, selector: "lib-multiple-input-table-view", inputs: { inputConfig: "inputConfig", dataSource: "dataSource", applyOptionsTo: "applyOptionsTo", formGroup: "formGroup" }, outputs: { onEditItem: "onEditItem", onDeleteItem: "onDeleteItem", onCopy: "onCopy", onApplyOptionsTo: "onApplyOptionsTo" }, ngImport: i0, template: "@defer (on viewport) {\r\n\r\n@if (getColConfig.displayedColumnsInOrder.length===0) {\r\n<div style=\"\r\n padding-left: 16px;\r\n padding-right: 16px;\r\n padding-top: 16px;\r\n padding-bottom: 16px;\r\n\r\n display: flex;\r\n justify-content: center;\r\n opacity: 0.6;\r\n font-size: 0.8125em;\r\n \">\r\n No columns\r\n</div>\r\n}\r\n<div class=\"table-container\">\r\n\r\n <table mat-table [dataSource]=\"(dataSource || [])\" class=\"example-table\" matSort matSortActive=\"created\"\r\n matSortDisableClear matSortDirection=\"desc\">\r\n @for (col of (displayedColumnsInOrder||[]); track col) {\r\n <ng-container [matColumnDef]=\"col\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <span style=\"text-align: start; line-height: normal; font-size: 0.8125em\">\r\n {{ getColConfig.columnsConfig?.[col]?.[\"label\"] }}\r\n </span>\r\n @if($last){\r\n <button matTooltip=\"Show other values\" [matMenuTriggerFor]=\"colOptions\" [matMenuTriggerData]=\"{}\"\r\n mat-icon-button>\r\n <mat-icon>\r\n label\r\n </mat-icon>\r\n </button>\r\n\r\n }\r\n </th>\r\n <td [class.functionClass]=\"row['SYSTEM_KEY_PROPERTY_FOR_MULTIPLE_INPUTS_CALCULATION_FUNCTION']\"\r\n [style.background]=\"\r\n returnBackground(row, getColConfig.columnsConfig?.[col])\r\n \" mat-cell *matCellDef=\"let row\">\r\n <div *ngIf=\" getColConfig.columnsConfig?.[col]?.['type'] === 'removal'\" class=\"cellClass\">\r\n\r\n <div style=\"width: 100%; text-align: right;\" *ngIf=\"!!row['SYSTEM_KEY_PROPERTY_FOR_MULTIPLE_INPUTS_CALCULATION_FUNCTION'] &&!row['id'] && !inputConfig?.multipleInputInEditId || \r\n !!row['SYSTEM_KEY_PROPERTY_FOR_MULTIPLE_INPUTS_CALCULATION_FUNCTION'] && inputConfig?.multipleInputInEditId &&\r\n inputConfig?.multipleInputInEditId !== row['id']\">\r\n <strong>\r\n\r\n {{getCalculationFunction(row)}}\r\n </strong>\r\n\r\n </div>\r\n <button mat-icon-button [color]=\"t.menuOpen ? 'primary' : 'basic'\" *ngIf=\"\r\n userCanApplyOptionsTo &&\r\n !row['SYSTEM_KEY_PROPERTY_FOR_MULTIPLE_INPUTS_CALCULATION_FUNCTION'] &&\r\n row['' ] !== 'true' && !inputConfig?.readonly \r\n \r\n \" [matMenuTriggerFor]=\"rowOptions\" [matMenuTriggerData]=\"{row:row}\" #t=\"matMenuTrigger\"\r\n (click)=\"applyOptionsToFn(row)\" expand=\"block\" fill=\"clear\"\r\n style=\"margin-left: auto;margin-right:0px;display:block\">\r\n @if (rowIsInEdit(row)) {\r\n <mat-icon color=\"primary\">\r\n edit\r\n </mat-icon>\r\n\r\n }@else {\r\n <mat-icon>\r\n {{\r\n t.menuOpen ? 'close' : 'more_horiz'\r\n }}\r\n\r\n </mat-icon>\r\n }\r\n\r\n\r\n </button>\r\n\r\n\r\n <mat-chip *ngIf=\"\r\n row['SYSTEM_KEY_IN_EDIT']\r\n \r\n \">\r\n In {{ inputConfig?.readonly ? 'View' : 'Edit' }}\r\n\r\n </mat-chip>\r\n\r\n </div>\r\n <div *ngIf=\"getColConfig.columnsConfig && getColConfig.columnsConfig?.[col]?.type !== 'removal'\"\r\n class=\"cellClass\">\r\n <span>\r\n {{ row[col] |formatData: getColConfig.columnsConfig?.[col].dataType }}\r\n\r\n </span>\r\n </div>\r\n </td>\r\n </ng-container>\r\n }\r\n\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"getColConfig.displayedColumnsInOrder \"></tr>\r\n <tr [style.border-top]=\"hasTopBorder(row) ? 'solid 2px' : ''\" mat-row\r\n *matRowDef=\"let row; columns: getColConfig.displayedColumnsInOrder\"></tr>\r\n </table>\r\n\r\n <div *ngIf=\"!(dataSource?.data)||(dataSource?.data)?.length === 0\">\r\n <div style=\"\r\n padding-left: 16px;\r\n padding-right: 16px;\r\n padding-top: 16px;\r\n padding-bottom: 16px;\r\n\r\n display: flex;\r\n justify-content: center;\r\n opacity: 0.6;\r\n font-size: 0.8125em;\r\n \">\r\n <div style=\"\r\n padding-left: 16px;\r\n padding-right: 16px;\r\n padding-top: 16px;\r\n padding-bottom: 16px;\r\n\r\n display: flex;\r\n justify-content: center;\r\n opacity: 0.6;\r\n font-size: 0.8125em;\r\n \">\r\n\r\n <div style=\"margin-top: 8px; text-align: center;\">\r\n <mat-icon style=\"font-size: 1.25em; vertical-align: middle; margin-right: 8px;\">list</mat-icon>\r\n <div style=\"margin-top: 8px;\">\r\n <strong>No items yet</strong>\r\n <p style=\"margin-top: 4px; font-size: 0.8125em;\">\r\n <strong>Click the add button</strong> to create a new row. You'll be able to fill in details using a form.\r\n Each saved entry will appear as a row in this table.\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n}@placeholder {\r\n<div style=\"padding: 50px;display:flex;justify-content:center;align-items:center; text-align: center;\">\r\n <mat-spinner diameter=\"50\" />\r\n</div>\r\n}\r\n<mat-menu #colOptions=\"matMenu\">\r\n <ng-template matMenuContent>\r\n @for (label of allPossibleLabels; track label.label) {\r\n <button mat-menu-item (click)=\"toggleTepLabel($event,label.formControlName);\">\r\n <mat-icon>\r\n {{ label.selected?'check_circle':'radio_button_unchecked'}}\r\n </mat-icon>\r\n {{label.label}}\r\n\r\n </button>\r\n\r\n }\r\n\r\n </ng-template>\r\n</mat-menu>\r\n<mat-menu #rowOptions=\"matMenu\">\r\n <ng-template matMenuContent let-row=\"row\">\r\n @if(!inputConfig?.readonly ){\r\n @if(userCanEdit){\r\n <button mat-menu-item (click)=\"editItem(row)\">\r\n <mat-icon>\r\n {{'edit'}}\r\n </mat-icon>\r\n <div class=\"option-text\">\r\n <div class=\"option-main-text\">\r\n {{ 'Edit'}}\r\n </div>\r\n <div class=\"option-sub-text\">\r\n {{inputConfig?.readonly ? 'View item properties' : 'Modify item properties'}}\r\n </div>\r\n </div>\r\n </button>\r\n }\r\n @if(userCanAdd){\r\n <button mat-menu-item (click)=\"copy(row)\">\r\n <mat-icon>\r\n content_copy\r\n </mat-icon>\r\n <div class=\"option-text\">\r\n <div class=\"option-main-text\">\r\n Duplicate\r\n </div>\r\n <div class=\"option-sub-text\">\r\n Create a copy with same values\r\n </div>\r\n </div>\r\n </button>\r\n }\r\n\r\n\r\n @if(userCanRemove){\r\n \r\n @if(isAboutToDeleteRow(row)){\r\n <button mat-menu-item (click)=\"multipleInputRemoveItem($event,row)\">\r\n <mat-icon color=\"accent\">\r\n cancel\r\n </mat-icon>\r\n <div class=\"option-text\">\r\n <div class=\"option-main-text\" style=\"color: #2196F3;\">\r\n Cancel Deletion\r\n </div>\r\n <div class=\"option-sub-text\">\r\n Auto-deleting in {{ secondsCountDown()}} seconds...\r\n </div>\r\n </div>\r\n </button>\r\n <div class=\"deletion-progress-container\">\r\n <mat-progress-bar color=\"warn\" mode=\"determinate\" [value]=\"getCountdownSeconds()\"></mat-progress-bar>\r\n <div class=\"deletion-message\" *ngIf=\"getCountdownSeconds() > 75\">\r\n Deleting soon...\r\n </div>\r\n </div>\r\n }@else {\r\n <button mat-menu-item (click)=\"multipleInputRemoveItem($event,row)\">\r\n <mat-icon color=\"warn\">\r\n delete_outline\r\n </mat-icon>\r\n <div class=\"option-text\">\r\n <div class=\"option-main-text\">\r\n Delete\r\n </div>\r\n <div class=\"option-sub-text\">\r\n Will delete after 3 seconds (click to cancel)\r\n </div>\r\n </div>\r\n </button>\r\n }\r\n } }\r\n </ng-template>\r\n</mat-menu>", styles: [".functionClass{background:var(--mat-sys-surface-container, var(--mat-app-surface));font-weight:500}.option-text{display:flex;flex-direction:column;margin-left:8px}.option-main-text{font-size:.875em;font-weight:500;margin-bottom:2px;line-height:normal}.option-sub-text{line-height:normal;font-size:.75em;color:#0000008a;font-weight:400;line-height:1.2}.deletion-progress-container{position:relative;padding:0 16px 8px}.deletion-message{position:absolute;right:16px;top:2px;font-size:.6875em;color:#f44336;font-weight:500;line-height:1.6;animation:pulse 1s infinite}button:has(+.deletion-progress-container){border-bottom:none!important;padding-bottom:4px!important}@keyframes pulse{0%{opacity:.7}50%{opacity:1}to{opacity:.7}}@media(max-width:600px){.option-sub-text{max-width:180px;white-space:normal}}.table-container{max-width:100%!important;overflow:auto!important}\n"], dependencies: [{ kind: "ngmodule", type: MatModulesModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i6.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i6.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "component", type: i4$4.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatTableModule }], deferBlockDependencies: [() => [i2.MatIconButton, i4$3.MatChip, i3.MatIcon, i6.MatMenuTrigger, i10$1.MatSort, i9.MatTable, i9.MatHeaderCellDef, i9.MatHeaderRowDef, i9.MatColumnDef, i9.MatCellDef, i9.MatRowDef, i9.MatHeaderCell, i9.MatCell, i9.MatHeaderRow, i9.MatRow, i4.MatTooltip, i2$1.NgIf, Promise.resolve().then(function () { return formatData_pipe; }).then(m => m.FormatDataPipe)]] }); }
13416
13965
  }
13417
13966
  i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "21.1.5", ngImport: i0, type: MultipleInputTableViewComponent, resolveDeferredDeps: () => [Promise.resolve().then(function () { return formatData_pipe; }).then(m => m.FormatDataPipe)], resolveMetadata: FormatDataPipe => ({ decorators: [{
13418
13967
  type: Component,
13419
- args: [{ selector: 'lib-multiple-input-table-view', standalone: true, imports: [MatModulesModule, CommonModule, MatTableModule, FormatDataPipe], template: "@defer (on viewport) {\r\n\r\n@if (getColConfig.displayedColumnsInOrder.length===0) {\r\n<div style=\"\r\n padding-left: 16px;\r\n padding-right: 16px;\r\n padding-top: 16px;\r\n padding-bottom: 16px;\r\n\r\n display: flex;\r\n justify-content: center;\r\n opacity: 0.6;\r\n font-size: 0.8125em;\r\n \">\r\n No columns\r\n</div>\r\n}\r\n<div class=\"table-container\">\r\n\r\n <table mat-table [dataSource]=\"(dataSource || [])\" class=\"example-table\" matSort matSortActive=\"created\"\r\n matSortDisableClear matSortDirection=\"desc\">\r\n @for (col of (displayedColumnsInOrder||[]); track col) {\r\n <ng-container [matColumnDef]=\"col\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <span style=\"text-align: start; line-height: normal; font-size: 0.8125em\">\r\n {{ getColConfig.columnsConfig?.[col]?.[\"label\"] }}\r\n </span>\r\n @if($last){\r\n <button matTooltip=\"Show other values\" [matMenuTriggerFor]=\"colOptions\" \r\n [matMenuTriggerData]=\"{}\" mat-icon-button>\r\n <mat-icon>\r\n label\r\n </mat-icon>\r\n </button>\r\n \r\n }\r\n </th>\r\n <td [class.functionClass]=\"row['SYSTEM_KEY_PROPERTY_FOR_MULTIPLE_INPUTS_CALCULATION_FUNCTION']\"\r\n \r\n [style.background]=\"\r\n returnBackground(row, getColConfig.columnsConfig?.[col])\r\n \" mat-cell *matCellDef=\"let row\">\r\n <div *ngIf=\" getColConfig.columnsConfig?.[col]?.['type'] === 'removal'\" class=\"cellClass\">\r\n \r\n <div style=\"width: 100%; text-align: right;\" *ngIf=\"!!row['SYSTEM_KEY_PROPERTY_FOR_MULTIPLE_INPUTS_CALCULATION_FUNCTION'] &&!row['id'] && !inputConfig?.multipleInputInEditId || \r\n !!row['SYSTEM_KEY_PROPERTY_FOR_MULTIPLE_INPUTS_CALCULATION_FUNCTION'] && inputConfig?.multipleInputInEditId &&\r\n inputConfig?.multipleInputInEditId !== row['id']\">\r\n <strong>\r\n\r\n {{getCalculationFunction(row)}}\r\n </strong>\r\n\r\n </div>\r\n <button mat-icon-button\r\n [color]=\"t.menuOpen ? 'primary' : 'basic'\"\r\n *ngIf=\"\r\n !row['SYSTEM_KEY_PROPERTY_FOR_MULTIPLE_INPUTS_CALCULATION_FUNCTION'] &&\r\n row['' ] !== 'true' && !inputConfig?.readonly \r\n \r\n \" \r\n [matMenuTriggerFor]=\"rowOptions\" \r\n [matMenuTriggerData]=\"{row:row}\" \r\n #t=\"matMenuTrigger\" (click)=\"applyOptionsToFn(row)\"\r\n expand=\"block\" fill=\"clear\" style=\"margin-left: auto;margin-right:0px;display:block\">\r\n @if (rowIsInEdit(row)) {\r\n <mat-icon color=\"primary\">\r\n edit\r\n </mat-icon> \r\n\r\n }@else {\r\n <mat-icon >\r\n {{\r\n t.menuOpen ? 'close' : 'more_horiz'\r\n }}\r\n \r\n </mat-icon>\r\n }\r\n \r\n\r\n </button>\r\n\r\n\r\n <mat-chip *ngIf=\"\r\n row['SYSTEM_KEY_IN_EDIT']\r\n \r\n \">\r\n In {{ inputConfig?.readonly ? 'View' : 'Edit' }}\r\n\r\n </mat-chip>\r\n\r\n </div>\r\n <div *ngIf=\"getColConfig.columnsConfig && getColConfig.columnsConfig?.[col]?.type !== 'removal'\"\r\n class=\"cellClass\">\r\n <span >\r\n {{ row[col] |formatData: getColConfig.columnsConfig?.[col].dataType }}\r\n\r\n </span>\r\n </div>\r\n </td>\r\n </ng-container>\r\n }\r\n\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"getColConfig.displayedColumnsInOrder \"></tr>\r\n <tr [style.border-top]=\"hasTopBorder(row) ? 'solid 2px' : ''\" mat-row\r\n \r\n *matRowDef=\"let row; columns: getColConfig.displayedColumnsInOrder\"></tr>\r\n </table>\r\n \r\n <div *ngIf=\"!(dataSource?.data)||(dataSource?.data)?.length === 0\">\r\n <div style=\"\r\n padding-left: 16px;\r\n padding-right: 16px;\r\n padding-top: 16px;\r\n padding-bottom: 16px;\r\n\r\n display: flex;\r\n justify-content: center;\r\n opacity: 0.6;\r\n font-size: 0.8125em;\r\n \">\r\n <div style=\"\r\n padding-left: 16px;\r\n padding-right: 16px;\r\n padding-top: 16px;\r\n padding-bottom: 16px;\r\n\r\n display: flex;\r\n justify-content: center;\r\n opacity: 0.6;\r\n font-size: 0.8125em;\r\n \">\r\n \r\n <div style=\"margin-top: 8px; text-align: center;\">\r\n <mat-icon style=\"font-size: 1.25em; vertical-align: middle; margin-right: 8px;\">list</mat-icon>\r\n <div style=\"margin-top: 8px;\">\r\n <strong>No items yet</strong>\r\n <p style=\"margin-top: 4px; font-size: 0.8125em;\">\r\n <strong>Click the add button</strong> to create a new row. You'll be able to fill in details using a form.\r\n Each saved entry will appear as a row in this table.\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n}@placeholder {\r\n<div style=\"padding: 50px;display:flex;justify-content:center;align-items:center; text-align: center;\">\r\n <mat-spinner diameter=\"50\" />\r\n</div>\r\n}\r\n<mat-menu #colOptions=\"matMenu\">\r\n <ng-template matMenuContent >\r\n @for (label of allPossibleLabels; track label.label) {\r\n <button mat-menu-item (click)=\"toggleTepLabel($event,label.formControlName);\">\r\n <mat-icon>\r\n {{ label.selected?'check_circle':'radio_button_unchecked'}}\r\n </mat-icon>\r\n {{label.label}}\r\n \r\n </button>\r\n \r\n }\r\n\r\n </ng-template>\r\n</mat-menu>\r\n<mat-menu #rowOptions=\"matMenu\">\r\n <ng-template matMenuContent let-row=\"row\">\r\n @if(!inputConfig?.readonly){\r\n <button mat-menu-item (click)=\"editItem(row)\">\r\n <mat-icon>\r\n {{'edit'}}\r\n </mat-icon>\r\n <div class=\"option-text\">\r\n <div class=\"option-main-text\">\r\n {{ 'Edit'}}\r\n </div>\r\n <div class=\"option-sub-text\">\r\n {{inputConfig?.readonly ? 'View item properties' : 'Modify item properties'}}\r\n </div>\r\n </div>\r\n </button>\r\n\r\n <button mat-menu-item (click)=\"copy(row)\">\r\n <mat-icon>\r\n content_copy\r\n </mat-icon>\r\n <div class=\"option-text\">\r\n <div class=\"option-main-text\">\r\n Duplicate\r\n </div>\r\n <div class=\"option-sub-text\">\r\n Create a copy with same values\r\n </div>\r\n </div>\r\n </button>\r\n @if(isAboutToDeleteRow(row)){\r\n <button mat-menu-item (click)=\"multipleInputRemoveItem($event,row)\">\r\n <mat-icon color=\"accent\">\r\n cancel\r\n </mat-icon>\r\n <div class=\"option-text\">\r\n <div class=\"option-main-text\" style=\"color: #2196F3;\">\r\n Cancel Deletion\r\n </div>\r\n <div class=\"option-sub-text\">\r\n Auto-deleting in {{ secondsCountDown()}} seconds...\r\n </div>\r\n </div>\r\n </button>\r\n <div class=\"deletion-progress-container\">\r\n <mat-progress-bar color=\"warn\" mode=\"determinate\" [value]=\"getCountdownSeconds()\"></mat-progress-bar>\r\n <div class=\"deletion-message\" *ngIf=\"getCountdownSeconds() > 75\">\r\n Deleting soon...\r\n </div>\r\n </div>\r\n }@else {\r\n <button mat-menu-item (click)=\"multipleInputRemoveItem($event,row)\">\r\n <mat-icon color=\"warn\">\r\n delete_outline\r\n </mat-icon>\r\n <div class=\"option-text\">\r\n <div class=\"option-main-text\">\r\n Delete \r\n </div>\r\n <div class=\"option-sub-text\">\r\n Will delete after 3 seconds (click to cancel)\r\n </div>\r\n </div>\r\n </button>\r\n }\r\n }\r\n </ng-template>\r\n</mat-menu>\r\n", styles: [".functionClass{background:var(--mat-sys-surface-container, var(--mat-app-surface));font-weight:500}.option-text{display:flex;flex-direction:column;margin-left:8px}.option-main-text{font-size:.875em;font-weight:500;margin-bottom:2px;line-height:normal}.option-sub-text{line-height:normal;font-size:.75em;color:#0000008a;font-weight:400;line-height:1.2}.deletion-progress-container{position:relative;padding:0 16px 8px}.deletion-message{position:absolute;right:16px;top:2px;font-size:.6875em;color:#f44336;font-weight:500;line-height:1.6;animation:pulse 1s infinite}button:has(+.deletion-progress-container){border-bottom:none!important;padding-bottom:4px!important}@keyframes pulse{0%{opacity:.7}50%{opacity:1}to{opacity:.7}}@media(max-width:600px){.option-sub-text{max-width:180px;white-space:normal}}.table-container{max-width:100%!important;overflow:auto!important}\n"] }]
13968
+ args: [{ selector: 'lib-multiple-input-table-view', standalone: true, imports: [MatModulesModule, CommonModule, MatTableModule, FormatDataPipe], template: "@defer (on viewport) {\r\n\r\n@if (getColConfig.displayedColumnsInOrder.length===0) {\r\n<div style=\"\r\n padding-left: 16px;\r\n padding-right: 16px;\r\n padding-top: 16px;\r\n padding-bottom: 16px;\r\n\r\n display: flex;\r\n justify-content: center;\r\n opacity: 0.6;\r\n font-size: 0.8125em;\r\n \">\r\n No columns\r\n</div>\r\n}\r\n<div class=\"table-container\">\r\n\r\n <table mat-table [dataSource]=\"(dataSource || [])\" class=\"example-table\" matSort matSortActive=\"created\"\r\n matSortDisableClear matSortDirection=\"desc\">\r\n @for (col of (displayedColumnsInOrder||[]); track col) {\r\n <ng-container [matColumnDef]=\"col\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <span style=\"text-align: start; line-height: normal; font-size: 0.8125em\">\r\n {{ getColConfig.columnsConfig?.[col]?.[\"label\"] }}\r\n </span>\r\n @if($last){\r\n <button matTooltip=\"Show other values\" [matMenuTriggerFor]=\"colOptions\" [matMenuTriggerData]=\"{}\"\r\n mat-icon-button>\r\n <mat-icon>\r\n label\r\n </mat-icon>\r\n </button>\r\n\r\n }\r\n </th>\r\n <td [class.functionClass]=\"row['SYSTEM_KEY_PROPERTY_FOR_MULTIPLE_INPUTS_CALCULATION_FUNCTION']\"\r\n [style.background]=\"\r\n returnBackground(row, getColConfig.columnsConfig?.[col])\r\n \" mat-cell *matCellDef=\"let row\">\r\n <div *ngIf=\" getColConfig.columnsConfig?.[col]?.['type'] === 'removal'\" class=\"cellClass\">\r\n\r\n <div style=\"width: 100%; text-align: right;\" *ngIf=\"!!row['SYSTEM_KEY_PROPERTY_FOR_MULTIPLE_INPUTS_CALCULATION_FUNCTION'] &&!row['id'] && !inputConfig?.multipleInputInEditId || \r\n !!row['SYSTEM_KEY_PROPERTY_FOR_MULTIPLE_INPUTS_CALCULATION_FUNCTION'] && inputConfig?.multipleInputInEditId &&\r\n inputConfig?.multipleInputInEditId !== row['id']\">\r\n <strong>\r\n\r\n {{getCalculationFunction(row)}}\r\n </strong>\r\n\r\n </div>\r\n <button mat-icon-button [color]=\"t.menuOpen ? 'primary' : 'basic'\" *ngIf=\"\r\n userCanApplyOptionsTo &&\r\n !row['SYSTEM_KEY_PROPERTY_FOR_MULTIPLE_INPUTS_CALCULATION_FUNCTION'] &&\r\n row['' ] !== 'true' && !inputConfig?.readonly \r\n \r\n \" [matMenuTriggerFor]=\"rowOptions\" [matMenuTriggerData]=\"{row:row}\" #t=\"matMenuTrigger\"\r\n (click)=\"applyOptionsToFn(row)\" expand=\"block\" fill=\"clear\"\r\n style=\"margin-left: auto;margin-right:0px;display:block\">\r\n @if (rowIsInEdit(row)) {\r\n <mat-icon color=\"primary\">\r\n edit\r\n </mat-icon>\r\n\r\n }@else {\r\n <mat-icon>\r\n {{\r\n t.menuOpen ? 'close' : 'more_horiz'\r\n }}\r\n\r\n </mat-icon>\r\n }\r\n\r\n\r\n </button>\r\n\r\n\r\n <mat-chip *ngIf=\"\r\n row['SYSTEM_KEY_IN_EDIT']\r\n \r\n \">\r\n In {{ inputConfig?.readonly ? 'View' : 'Edit' }}\r\n\r\n </mat-chip>\r\n\r\n </div>\r\n <div *ngIf=\"getColConfig.columnsConfig && getColConfig.columnsConfig?.[col]?.type !== 'removal'\"\r\n class=\"cellClass\">\r\n <span>\r\n {{ row[col] |formatData: getColConfig.columnsConfig?.[col].dataType }}\r\n\r\n </span>\r\n </div>\r\n </td>\r\n </ng-container>\r\n }\r\n\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"getColConfig.displayedColumnsInOrder \"></tr>\r\n <tr [style.border-top]=\"hasTopBorder(row) ? 'solid 2px' : ''\" mat-row\r\n *matRowDef=\"let row; columns: getColConfig.displayedColumnsInOrder\"></tr>\r\n </table>\r\n\r\n <div *ngIf=\"!(dataSource?.data)||(dataSource?.data)?.length === 0\">\r\n <div style=\"\r\n padding-left: 16px;\r\n padding-right: 16px;\r\n padding-top: 16px;\r\n padding-bottom: 16px;\r\n\r\n display: flex;\r\n justify-content: center;\r\n opacity: 0.6;\r\n font-size: 0.8125em;\r\n \">\r\n <div style=\"\r\n padding-left: 16px;\r\n padding-right: 16px;\r\n padding-top: 16px;\r\n padding-bottom: 16px;\r\n\r\n display: flex;\r\n justify-content: center;\r\n opacity: 0.6;\r\n font-size: 0.8125em;\r\n \">\r\n\r\n <div style=\"margin-top: 8px; text-align: center;\">\r\n <mat-icon style=\"font-size: 1.25em; vertical-align: middle; margin-right: 8px;\">list</mat-icon>\r\n <div style=\"margin-top: 8px;\">\r\n <strong>No items yet</strong>\r\n <p style=\"margin-top: 4px; font-size: 0.8125em;\">\r\n <strong>Click the add button</strong> to create a new row. You'll be able to fill in details using a form.\r\n Each saved entry will appear as a row in this table.\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n}@placeholder {\r\n<div style=\"padding: 50px;display:flex;justify-content:center;align-items:center; text-align: center;\">\r\n <mat-spinner diameter=\"50\" />\r\n</div>\r\n}\r\n<mat-menu #colOptions=\"matMenu\">\r\n <ng-template matMenuContent>\r\n @for (label of allPossibleLabels; track label.label) {\r\n <button mat-menu-item (click)=\"toggleTepLabel($event,label.formControlName);\">\r\n <mat-icon>\r\n {{ label.selected?'check_circle':'radio_button_unchecked'}}\r\n </mat-icon>\r\n {{label.label}}\r\n\r\n </button>\r\n\r\n }\r\n\r\n </ng-template>\r\n</mat-menu>\r\n<mat-menu #rowOptions=\"matMenu\">\r\n <ng-template matMenuContent let-row=\"row\">\r\n @if(!inputConfig?.readonly ){\r\n @if(userCanEdit){\r\n <button mat-menu-item (click)=\"editItem(row)\">\r\n <mat-icon>\r\n {{'edit'}}\r\n </mat-icon>\r\n <div class=\"option-text\">\r\n <div class=\"option-main-text\">\r\n {{ 'Edit'}}\r\n </div>\r\n <div class=\"option-sub-text\">\r\n {{inputConfig?.readonly ? 'View item properties' : 'Modify item properties'}}\r\n </div>\r\n </div>\r\n </button>\r\n }\r\n @if(userCanAdd){\r\n <button mat-menu-item (click)=\"copy(row)\">\r\n <mat-icon>\r\n content_copy\r\n </mat-icon>\r\n <div class=\"option-text\">\r\n <div class=\"option-main-text\">\r\n Duplicate\r\n </div>\r\n <div class=\"option-sub-text\">\r\n Create a copy with same values\r\n </div>\r\n </div>\r\n </button>\r\n }\r\n\r\n\r\n @if(userCanRemove){\r\n \r\n @if(isAboutToDeleteRow(row)){\r\n <button mat-menu-item (click)=\"multipleInputRemoveItem($event,row)\">\r\n <mat-icon color=\"accent\">\r\n cancel\r\n </mat-icon>\r\n <div class=\"option-text\">\r\n <div class=\"option-main-text\" style=\"color: #2196F3;\">\r\n Cancel Deletion\r\n </div>\r\n <div class=\"option-sub-text\">\r\n Auto-deleting in {{ secondsCountDown()}} seconds...\r\n </div>\r\n </div>\r\n </button>\r\n <div class=\"deletion-progress-container\">\r\n <mat-progress-bar color=\"warn\" mode=\"determinate\" [value]=\"getCountdownSeconds()\"></mat-progress-bar>\r\n <div class=\"deletion-message\" *ngIf=\"getCountdownSeconds() > 75\">\r\n Deleting soon...\r\n </div>\r\n </div>\r\n }@else {\r\n <button mat-menu-item (click)=\"multipleInputRemoveItem($event,row)\">\r\n <mat-icon color=\"warn\">\r\n delete_outline\r\n </mat-icon>\r\n <div class=\"option-text\">\r\n <div class=\"option-main-text\">\r\n Delete\r\n </div>\r\n <div class=\"option-sub-text\">\r\n Will delete after 3 seconds (click to cancel)\r\n </div>\r\n </div>\r\n </button>\r\n }\r\n } }\r\n </ng-template>\r\n</mat-menu>", styles: [".functionClass{background:var(--mat-sys-surface-container, var(--mat-app-surface));font-weight:500}.option-text{display:flex;flex-direction:column;margin-left:8px}.option-main-text{font-size:.875em;font-weight:500;margin-bottom:2px;line-height:normal}.option-sub-text{line-height:normal;font-size:.75em;color:#0000008a;font-weight:400;line-height:1.2}.deletion-progress-container{position:relative;padding:0 16px 8px}.deletion-message{position:absolute;right:16px;top:2px;font-size:.6875em;color:#f44336;font-weight:500;line-height:1.6;animation:pulse 1s infinite}button:has(+.deletion-progress-container){border-bottom:none!important;padding-bottom:4px!important}@keyframes pulse{0%{opacity:.7}50%{opacity:1}to{opacity:.7}}@media(max-width:600px){.option-sub-text{max-width:180px;white-space:normal}}.table-container{max-width:100%!important;overflow:auto!important}\n"] }]
13420
13969
  }], ctorParameters: null, propDecorators: { inputConfig: [{
13421
13970
  type: Input
13422
13971
  }], dataSource: [{
@@ -13559,11 +14108,11 @@ class MultipleInputTableEditComponent {
13559
14108
  return !!this.inputConfig?.formIsOpen && !!this.formGroup?.controls[`${this.inputConfig?.id}.id`]?.value;
13560
14109
  }
13561
14110
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: MultipleInputTableEditComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
13562
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: MultipleInputTableEditComponent, isStandalone: true, selector: "lib-multiple-input-table-edit", inputs: { inputConfig: "inputConfig", editorMode: "editorMode", formGroup: "formGroup", formBuilderFunctions: "formBuilderFunctions" }, outputs: { onSaveMultipleInputForm: "onSaveMultipleInputForm", editMultipleInput: "editMultipleInput", deleteInput: "deleteInput", showItemAsLabel: "showItemAsLabel", addFunction: "addFunction", reorderItems: "reorderItems" }, ngImport: i0, template: "\r\n<mat-card appearance=\"outlined\" style=\" margin-top: 8px;background:var(--mat-sys-surface-container)\" class=\" mat-elevation-z4\">\r\n <mat-card-content>\r\n <div class=\"list\" (cdkDropListDropped)=\"dropItems($event)\"\r\n \r\n [cdkDropListData]=\"innerInputs\" cdkDropList\r\n \r\n #InputList=\"cdkDropList\" class=\"row\">\r\n @for( innerInput of innerInputs|| [];track innerInput.id\r\n ){\r\n <ng-container>\r\n @if(editorMode){\r\n <mat-card (mouseover)=\"activeInput = innerInput.id\" *ngIf=\"!!formGroup\" cdkDrag\r\n (cdkDragStarted)=\"dragging =true\" (cdkDragReleased)=\"dragging =false\"\r\n [class.inputCardElevated]=\"activeInput ===innerInput.id\"\r\n [class.inputCard]=\"activeInput !==innerInput.id\"\r\n [class]=\"'col-md-'+(dragging?'12':innerInput.colSize)\" class=\"box\">\r\n <div class=\"custom-placeholder\" *cdkDragPlaceholder></div>\r\n <ng-container *ngComponentOutlet=\"InputComponent; \r\n inputs: {\r\n inputConfig: innerInput,\r\n formGroup: formGroup,\r\n formBuilderFunctions: formBuilderFunctions,\r\n }\">\r\n </ng-container>\r\n <mat-card-actions *ngIf=\"activeInput === innerInput.id\">\r\n <span class=\"spacer\"></span>\r\n <button [matTooltip]=\"'Edit Input: ' + innerInput.label \"\r\n (click)=\"editInput(innerInput)\" mat-icon-button>\r\n <mat-icon>\r\n edit\r\n </mat-icon>\r\n\r\n </button>\r\n @if(!!inputWillBeRemovedIn(innerInput.id) ){\r\n <button (mouseover)=\"overId = innerInput.id\" (mouseout)=\"overId = null\"\r\n (click)=\"removeInput(innerInput)\" color=\"warn\" mat-stroked-button>\r\n <div style=\"display: flex; align-items: center;\">\r\n <mat-progress-spinner style=\"margin-right: 5px;\" color=\"primary\" class=\"cancelProgress\"\r\n [value]=\"((inputWillBeRemovedIn(innerInput.id)||0)/5)*100\">\r\n </mat-progress-spinner>\r\n\r\n {{overId === innerInput.id ? 'Click to cancel':'Deleting in'}}\r\n {{inputWillBeRemovedIn(innerInput.id)}}\r\n </div>\r\n\r\n </button>\r\n\r\n }@else if(inputConfig?.systemDefault !== true && innerInput.systemDefault !== true) {\r\n <button [matTooltip]=\"'Delete input ' + innerInput.label \"\r\n (click)=\"removeInput(innerInput)\" mat-icon-button>\r\n\r\n <mat-icon>\r\n delete\r\n </mat-icon>\r\n </button>\r\n }\r\n |\r\n <button *ngIf=\"!!innerInput.showAsLabel && innerInput.dataType=== 'number' ||!!innerInput.showAsLabel && innerInput.type === 'number'\"\r\n [matMenuTriggerFor]=\"calculationMenu\" \r\n [matMenuTriggerData]=\"{inputId:innerInput.originalId || innerInput.id}\"\r\n [matTooltip]=\"'calculate sum,avg,min,max'\"\r\n mat-icon-button>\r\n\r\n <mat-icon>\r\n calculate\r\n </mat-icon>\r\n </button>\r\n <button [color]=\"innerInput.showAsLabel? 'primary' : ''\"\r\n (click)=\"toggleLabel(innerInput)\"\r\n [matTooltip]=\"innerInput.showAsLabel? 'Hide as label' : 'Show as label'\"\r\n mat-icon-button>\r\n\r\n <mat-icon>\r\n label\r\n </mat-icon>\r\n </button>\r\n <span class=\"spacer\"></span>\r\n </mat-card-actions>\r\n </mat-card>\r\n }@else {\r\n \r\n <div [class]=\"'col-md-'+(dragging?'12':innerInput.colSize)\" class=\"box\">\r\n <ng-container *ngComponentOutlet=\"InputComponent; \r\n inputs: {\r\n inputConfig: innerInput,\r\n formGroup: formGroup,\r\n formBuilderFunctions: formBuilderFunctions,\r\n }\">\r\n </ng-container>\r\n </div>\r\n \r\n }\r\n\r\n </ng-container>\r\n }\r\n @if (!!editorMode && ( innerInputs|| []).length === 0) {\r\n\r\n <div class=\"tree-instructions\">\r\n <mat-icon style=\"margin-top: 4px;margin-bottom:auto\" class=\"info-icon\" color=\"primary\">info</mat-icon>\r\n <span>\r\n <strong>Add Form Input</strong>\r\n <br>\r\n Manage your list by adding, editing, or removing items. Each item is customizable through a form.\r\n </span>\r\n </div>\r\n\r\n }\r\n\r\n </div>\r\n </mat-card-content>\r\n @if ( ( innerInputs|| []).length !== 0) {\r\n <br>\r\n <mat-divider></mat-divider>\r\n <mat-card-actions align=\"end\" class=\"ion-margin-top\">\r\n <button [color]=\"areYouSure ? 'warn' : ''\" class=\"ion-margin-end\"\r\n [style.text-decoration]=\"areYouSure ? 'underline' : ''\" mat-flat-button\r\n (click)=\"closeMultipleInput()\">\r\n {{ areYouSure ? \"leave without saving\" : \"cancel\" }}\r\n </button>\r\n @if(!inputConfig?.readonly){\r\n <button [disabled]=\"!!formInvalid\" style=\"min-width: 10em\" color=\"primary\" (click)=\"saveMultipleInputForm()\" class=\"ion-padding-horizontal\"\r\n mat-raised-button>\r\n {{\r\n rowInUpdate\r\n ? \"Update\"\r\n : \"save\"\r\n }}\r\n </button>\r\n }\r\n\r\n </mat-card-actions>\r\n }\r\n\r\n</mat-card>\r\n\r\n\r\n<mat-menu #calculationMenu=\"matMenu\">\r\n <ng-template matMenuContent let-inputId=\"sectionId\">\r\n <button (click)=\"toggleFunction(func,inputId)\" mat-menu-item *ngFor=\"let func of calculationFunctions\">\r\n {{ func }}\r\n <mat-icon color=\"primary\" *ngIf=\"selectedFunction(func)\">check_circle</mat-icon>\r\n </button>\r\n </ng-template>\r\n</mat-menu> ", styles: [".inputCardElevated{background:var(--mat-sys-surface-container, var(--mat-app-surface));box-shadow:var(--mdc-elevated-card-container-elevation)}.inputCard{box-shadow:none}.list{min-height:60px;display:block}.box{padding:4px;cursor:move}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.box:last-child{border:none}.list.cdk-drop-list-dragging .example-box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.custom-placeholder{background:#ccc;border:dotted 3px #999;min-width:100%;min-height:60px;transition:transform .25s cubic-bezier(0,0,.2,1)}.cancelProgress{height:24px!important;width:24px!important}.tree-instructions{display:flex;align-items:center;gap:8px;padding:12px;background:azure;border-radius:4px;margin-bottom:16px}.info-icon{min-width:38px!important;display:block}\n"], dependencies: [{ kind: "ngmodule", type: MatModulesModule }, { kind: "directive", type: i1$2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i1$2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i1$2.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3$3.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i3$3.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: i3$3.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i4$1.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i6.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i6.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i6.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i2$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: DragDropModule }] }); }
14111
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: MultipleInputTableEditComponent, isStandalone: true, selector: "lib-multiple-input-table-edit", inputs: { inputConfig: "inputConfig", editorMode: "editorMode", formGroup: "formGroup", formBuilderFunctions: "formBuilderFunctions" }, outputs: { onSaveMultipleInputForm: "onSaveMultipleInputForm", editMultipleInput: "editMultipleInput", deleteInput: "deleteInput", showItemAsLabel: "showItemAsLabel", addFunction: "addFunction", reorderItems: "reorderItems" }, ngImport: i0, template: "\r\n<mat-card appearance=\"outlined\" style=\" margin-top: 8px;background:var(--mat-sys-surface-container)\" class=\" mat-elevation-z4\">\r\n <mat-card-content>\r\n <div class=\"list\" (cdkDropListDropped)=\"dropItems($event)\"\r\n \r\n [cdkDropListData]=\"innerInputs\" cdkDropList\r\n \r\n #InputList=\"cdkDropList\" class=\"row\">\r\n @for( innerInput of innerInputs|| [];track innerInput.id\r\n ){\r\n <ng-container>\r\n @if(editorMode){\r\n <mat-card (mouseover)=\"activeInput = innerInput.id\" *ngIf=\"!!formGroup\" cdkDrag\r\n (cdkDragStarted)=\"dragging =true\" (cdkDragReleased)=\"dragging =false\"\r\n [class.inputCardElevated]=\"activeInput ===innerInput.id\"\r\n [class.inputCard]=\"activeInput !==innerInput.id\"\r\n [class]=\"'col-md-'+(dragging?'12':innerInput.colSize)\" class=\"box\">\r\n <ng-container *ngComponentOutlet=\"InputComponent; \r\n inputs: {\r\n inputConfig: innerInput,\r\n formGroup: formGroup,\r\n formBuilderFunctions: formBuilderFunctions,\r\n }\">\r\n </ng-container>\r\n <mat-card-actions *ngIf=\"activeInput === innerInput.id\">\r\n <span class=\"spacer\"></span>\r\n <button [matTooltip]=\"'Edit Input: ' + innerInput.label \"\r\n (click)=\"editInput(innerInput)\" mat-icon-button>\r\n <mat-icon>\r\n edit\r\n </mat-icon>\r\n\r\n </button>\r\n @if(!!inputWillBeRemovedIn(innerInput.id) ){\r\n <button (mouseover)=\"overId = innerInput.id\" (mouseout)=\"overId = null\"\r\n (click)=\"removeInput(innerInput)\" color=\"warn\" mat-stroked-button>\r\n <div style=\"display: flex; align-items: center;\">\r\n <mat-progress-spinner style=\"margin-right: 5px;\" color=\"primary\" class=\"cancelProgress\"\r\n [value]=\"((inputWillBeRemovedIn(innerInput.id)||0)/5)*100\">\r\n </mat-progress-spinner>\r\n\r\n {{overId === innerInput.id ? 'Click to cancel':'Deleting in'}}\r\n {{inputWillBeRemovedIn(innerInput.id)}}\r\n </div>\r\n\r\n </button>\r\n\r\n }@else if(inputConfig?.systemDefault !== true && innerInput.systemDefault !== true) {\r\n <button [matTooltip]=\"'Delete input ' + innerInput.label \"\r\n (click)=\"removeInput(innerInput)\" mat-icon-button>\r\n\r\n <mat-icon>\r\n delete\r\n </mat-icon>\r\n </button>\r\n }\r\n |\r\n <button *ngIf=\"!!innerInput.showAsLabel && innerInput.dataType=== 'number' ||!!innerInput.showAsLabel && innerInput.type === 'number'\"\r\n [matMenuTriggerFor]=\"calculationMenu\" \r\n [matMenuTriggerData]=\"{inputId:innerInput.originalId || innerInput.id}\"\r\n [matTooltip]=\"'calculate sum,avg,min,max'\"\r\n mat-icon-button>\r\n\r\n <mat-icon>\r\n calculate\r\n </mat-icon>\r\n </button>\r\n <button [color]=\"innerInput.showAsLabel? 'primary' : ''\"\r\n (click)=\"toggleLabel(innerInput)\"\r\n [matTooltip]=\"innerInput.showAsLabel? 'Hide as label' : 'Show as label'\"\r\n mat-icon-button>\r\n\r\n <mat-icon>\r\n label\r\n </mat-icon>\r\n </button>\r\n <span class=\"spacer\"></span>\r\n </mat-card-actions>\r\n </mat-card>\r\n }@else {\r\n \r\n <div [class]=\"'col-md-'+(dragging?'12':innerInput.colSize)\" class=\"box\">\r\n <ng-container *ngComponentOutlet=\"InputComponent; \r\n inputs: {\r\n inputConfig: innerInput,\r\n formGroup: formGroup,\r\n formBuilderFunctions: formBuilderFunctions,\r\n }\">\r\n </ng-container>\r\n </div>\r\n \r\n }\r\n\r\n </ng-container>\r\n }\r\n @if (!!editorMode && ( innerInputs|| []).length === 0) {\r\n\r\n <div class=\"tree-instructions\">\r\n <mat-icon style=\"margin-top: 4px;margin-bottom:auto\" class=\"info-icon\" color=\"primary\">info</mat-icon>\r\n <span>\r\n <strong>Add Form Input</strong>\r\n <br>\r\n Manage your list by adding, editing, or removing items. Each item is customizable through a form.\r\n </span>\r\n </div>\r\n\r\n }\r\n\r\n </div>\r\n </mat-card-content>\r\n @if ( ( innerInputs|| []).length !== 0) {\r\n <br>\r\n <mat-divider></mat-divider>\r\n <mat-card-actions align=\"end\" class=\"ion-margin-top\">\r\n <button [color]=\"areYouSure ? 'warn' : ''\" class=\"ion-margin-end\"\r\n [style.text-decoration]=\"areYouSure ? 'underline' : ''\" mat-flat-button\r\n (click)=\"closeMultipleInput()\">\r\n {{ areYouSure ? \"leave without saving\" : \"cancel\" }}\r\n </button>\r\n @if(!inputConfig?.readonly){\r\n <button [disabled]=\"!!formInvalid\" style=\"min-width: 10em\" color=\"primary\" (click)=\"saveMultipleInputForm()\" class=\"ion-padding-horizontal\"\r\n mat-raised-button>\r\n {{\r\n rowInUpdate\r\n ? \"Update\"\r\n : \"save\"\r\n }}\r\n </button>\r\n }\r\n\r\n </mat-card-actions>\r\n }\r\n\r\n</mat-card>\r\n\r\n\r\n<mat-menu #calculationMenu=\"matMenu\">\r\n <ng-template matMenuContent let-inputId=\"sectionId\">\r\n <button (click)=\"toggleFunction(func,inputId)\" mat-menu-item *ngFor=\"let func of calculationFunctions\">\r\n {{ func }}\r\n <mat-icon color=\"primary\" *ngIf=\"selectedFunction(func)\">check_circle</mat-icon>\r\n </button>\r\n </ng-template>\r\n</mat-menu> ", styles: [".inputCardElevated{background:var(--mat-sys-surface-container, var(--mat-app-surface));box-shadow:var(--mdc-elevated-card-container-elevation)}.inputCard{box-shadow:none}.list{min-height:60px;display:block}.box{padding:4px;cursor:move}.cdk-drag-preview{box-sizing:border-box;border:none;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.box:last-child{border:none}.list.cdk-drop-list-dragging .box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.cancelProgress{height:24px!important;width:24px!important}.tree-instructions{display:flex;align-items:center;gap:8px;padding:12px;background:azure;border-radius:4px;margin-bottom:16px}.info-icon{min-width:38px!important;display:block}\n"], dependencies: [{ kind: "ngmodule", type: MatModulesModule }, { kind: "directive", type: i1$2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i1$2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3$3.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i3$3.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: i3$3.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i4$1.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i6.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i6.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i6.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i2$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: DragDropModule }] }); }
13563
14112
  }
13564
14113
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: MultipleInputTableEditComponent, decorators: [{
13565
14114
  type: Component,
13566
- args: [{ selector: 'lib-multiple-input-table-edit', standalone: true, imports: [MatModulesModule, CommonModule, DragDropModule,], template: "\r\n<mat-card appearance=\"outlined\" style=\" margin-top: 8px;background:var(--mat-sys-surface-container)\" class=\" mat-elevation-z4\">\r\n <mat-card-content>\r\n <div class=\"list\" (cdkDropListDropped)=\"dropItems($event)\"\r\n \r\n [cdkDropListData]=\"innerInputs\" cdkDropList\r\n \r\n #InputList=\"cdkDropList\" class=\"row\">\r\n @for( innerInput of innerInputs|| [];track innerInput.id\r\n ){\r\n <ng-container>\r\n @if(editorMode){\r\n <mat-card (mouseover)=\"activeInput = innerInput.id\" *ngIf=\"!!formGroup\" cdkDrag\r\n (cdkDragStarted)=\"dragging =true\" (cdkDragReleased)=\"dragging =false\"\r\n [class.inputCardElevated]=\"activeInput ===innerInput.id\"\r\n [class.inputCard]=\"activeInput !==innerInput.id\"\r\n [class]=\"'col-md-'+(dragging?'12':innerInput.colSize)\" class=\"box\">\r\n <div class=\"custom-placeholder\" *cdkDragPlaceholder></div>\r\n <ng-container *ngComponentOutlet=\"InputComponent; \r\n inputs: {\r\n inputConfig: innerInput,\r\n formGroup: formGroup,\r\n formBuilderFunctions: formBuilderFunctions,\r\n }\">\r\n </ng-container>\r\n <mat-card-actions *ngIf=\"activeInput === innerInput.id\">\r\n <span class=\"spacer\"></span>\r\n <button [matTooltip]=\"'Edit Input: ' + innerInput.label \"\r\n (click)=\"editInput(innerInput)\" mat-icon-button>\r\n <mat-icon>\r\n edit\r\n </mat-icon>\r\n\r\n </button>\r\n @if(!!inputWillBeRemovedIn(innerInput.id) ){\r\n <button (mouseover)=\"overId = innerInput.id\" (mouseout)=\"overId = null\"\r\n (click)=\"removeInput(innerInput)\" color=\"warn\" mat-stroked-button>\r\n <div style=\"display: flex; align-items: center;\">\r\n <mat-progress-spinner style=\"margin-right: 5px;\" color=\"primary\" class=\"cancelProgress\"\r\n [value]=\"((inputWillBeRemovedIn(innerInput.id)||0)/5)*100\">\r\n </mat-progress-spinner>\r\n\r\n {{overId === innerInput.id ? 'Click to cancel':'Deleting in'}}\r\n {{inputWillBeRemovedIn(innerInput.id)}}\r\n </div>\r\n\r\n </button>\r\n\r\n }@else if(inputConfig?.systemDefault !== true && innerInput.systemDefault !== true) {\r\n <button [matTooltip]=\"'Delete input ' + innerInput.label \"\r\n (click)=\"removeInput(innerInput)\" mat-icon-button>\r\n\r\n <mat-icon>\r\n delete\r\n </mat-icon>\r\n </button>\r\n }\r\n |\r\n <button *ngIf=\"!!innerInput.showAsLabel && innerInput.dataType=== 'number' ||!!innerInput.showAsLabel && innerInput.type === 'number'\"\r\n [matMenuTriggerFor]=\"calculationMenu\" \r\n [matMenuTriggerData]=\"{inputId:innerInput.originalId || innerInput.id}\"\r\n [matTooltip]=\"'calculate sum,avg,min,max'\"\r\n mat-icon-button>\r\n\r\n <mat-icon>\r\n calculate\r\n </mat-icon>\r\n </button>\r\n <button [color]=\"innerInput.showAsLabel? 'primary' : ''\"\r\n (click)=\"toggleLabel(innerInput)\"\r\n [matTooltip]=\"innerInput.showAsLabel? 'Hide as label' : 'Show as label'\"\r\n mat-icon-button>\r\n\r\n <mat-icon>\r\n label\r\n </mat-icon>\r\n </button>\r\n <span class=\"spacer\"></span>\r\n </mat-card-actions>\r\n </mat-card>\r\n }@else {\r\n \r\n <div [class]=\"'col-md-'+(dragging?'12':innerInput.colSize)\" class=\"box\">\r\n <ng-container *ngComponentOutlet=\"InputComponent; \r\n inputs: {\r\n inputConfig: innerInput,\r\n formGroup: formGroup,\r\n formBuilderFunctions: formBuilderFunctions,\r\n }\">\r\n </ng-container>\r\n </div>\r\n \r\n }\r\n\r\n </ng-container>\r\n }\r\n @if (!!editorMode && ( innerInputs|| []).length === 0) {\r\n\r\n <div class=\"tree-instructions\">\r\n <mat-icon style=\"margin-top: 4px;margin-bottom:auto\" class=\"info-icon\" color=\"primary\">info</mat-icon>\r\n <span>\r\n <strong>Add Form Input</strong>\r\n <br>\r\n Manage your list by adding, editing, or removing items. Each item is customizable through a form.\r\n </span>\r\n </div>\r\n\r\n }\r\n\r\n </div>\r\n </mat-card-content>\r\n @if ( ( innerInputs|| []).length !== 0) {\r\n <br>\r\n <mat-divider></mat-divider>\r\n <mat-card-actions align=\"end\" class=\"ion-margin-top\">\r\n <button [color]=\"areYouSure ? 'warn' : ''\" class=\"ion-margin-end\"\r\n [style.text-decoration]=\"areYouSure ? 'underline' : ''\" mat-flat-button\r\n (click)=\"closeMultipleInput()\">\r\n {{ areYouSure ? \"leave without saving\" : \"cancel\" }}\r\n </button>\r\n @if(!inputConfig?.readonly){\r\n <button [disabled]=\"!!formInvalid\" style=\"min-width: 10em\" color=\"primary\" (click)=\"saveMultipleInputForm()\" class=\"ion-padding-horizontal\"\r\n mat-raised-button>\r\n {{\r\n rowInUpdate\r\n ? \"Update\"\r\n : \"save\"\r\n }}\r\n </button>\r\n }\r\n\r\n </mat-card-actions>\r\n }\r\n\r\n</mat-card>\r\n\r\n\r\n<mat-menu #calculationMenu=\"matMenu\">\r\n <ng-template matMenuContent let-inputId=\"sectionId\">\r\n <button (click)=\"toggleFunction(func,inputId)\" mat-menu-item *ngFor=\"let func of calculationFunctions\">\r\n {{ func }}\r\n <mat-icon color=\"primary\" *ngIf=\"selectedFunction(func)\">check_circle</mat-icon>\r\n </button>\r\n </ng-template>\r\n</mat-menu> ", styles: [".inputCardElevated{background:var(--mat-sys-surface-container, var(--mat-app-surface));box-shadow:var(--mdc-elevated-card-container-elevation)}.inputCard{box-shadow:none}.list{min-height:60px;display:block}.box{padding:4px;cursor:move}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.box:last-child{border:none}.list.cdk-drop-list-dragging .example-box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.custom-placeholder{background:#ccc;border:dotted 3px #999;min-width:100%;min-height:60px;transition:transform .25s cubic-bezier(0,0,.2,1)}.cancelProgress{height:24px!important;width:24px!important}.tree-instructions{display:flex;align-items:center;gap:8px;padding:12px;background:azure;border-radius:4px;margin-bottom:16px}.info-icon{min-width:38px!important;display:block}\n"] }]
14115
+ args: [{ selector: 'lib-multiple-input-table-edit', standalone: true, imports: [MatModulesModule, CommonModule, DragDropModule,], template: "\r\n<mat-card appearance=\"outlined\" style=\" margin-top: 8px;background:var(--mat-sys-surface-container)\" class=\" mat-elevation-z4\">\r\n <mat-card-content>\r\n <div class=\"list\" (cdkDropListDropped)=\"dropItems($event)\"\r\n \r\n [cdkDropListData]=\"innerInputs\" cdkDropList\r\n \r\n #InputList=\"cdkDropList\" class=\"row\">\r\n @for( innerInput of innerInputs|| [];track innerInput.id\r\n ){\r\n <ng-container>\r\n @if(editorMode){\r\n <mat-card (mouseover)=\"activeInput = innerInput.id\" *ngIf=\"!!formGroup\" cdkDrag\r\n (cdkDragStarted)=\"dragging =true\" (cdkDragReleased)=\"dragging =false\"\r\n [class.inputCardElevated]=\"activeInput ===innerInput.id\"\r\n [class.inputCard]=\"activeInput !==innerInput.id\"\r\n [class]=\"'col-md-'+(dragging?'12':innerInput.colSize)\" class=\"box\">\r\n <ng-container *ngComponentOutlet=\"InputComponent; \r\n inputs: {\r\n inputConfig: innerInput,\r\n formGroup: formGroup,\r\n formBuilderFunctions: formBuilderFunctions,\r\n }\">\r\n </ng-container>\r\n <mat-card-actions *ngIf=\"activeInput === innerInput.id\">\r\n <span class=\"spacer\"></span>\r\n <button [matTooltip]=\"'Edit Input: ' + innerInput.label \"\r\n (click)=\"editInput(innerInput)\" mat-icon-button>\r\n <mat-icon>\r\n edit\r\n </mat-icon>\r\n\r\n </button>\r\n @if(!!inputWillBeRemovedIn(innerInput.id) ){\r\n <button (mouseover)=\"overId = innerInput.id\" (mouseout)=\"overId = null\"\r\n (click)=\"removeInput(innerInput)\" color=\"warn\" mat-stroked-button>\r\n <div style=\"display: flex; align-items: center;\">\r\n <mat-progress-spinner style=\"margin-right: 5px;\" color=\"primary\" class=\"cancelProgress\"\r\n [value]=\"((inputWillBeRemovedIn(innerInput.id)||0)/5)*100\">\r\n </mat-progress-spinner>\r\n\r\n {{overId === innerInput.id ? 'Click to cancel':'Deleting in'}}\r\n {{inputWillBeRemovedIn(innerInput.id)}}\r\n </div>\r\n\r\n </button>\r\n\r\n }@else if(inputConfig?.systemDefault !== true && innerInput.systemDefault !== true) {\r\n <button [matTooltip]=\"'Delete input ' + innerInput.label \"\r\n (click)=\"removeInput(innerInput)\" mat-icon-button>\r\n\r\n <mat-icon>\r\n delete\r\n </mat-icon>\r\n </button>\r\n }\r\n |\r\n <button *ngIf=\"!!innerInput.showAsLabel && innerInput.dataType=== 'number' ||!!innerInput.showAsLabel && innerInput.type === 'number'\"\r\n [matMenuTriggerFor]=\"calculationMenu\" \r\n [matMenuTriggerData]=\"{inputId:innerInput.originalId || innerInput.id}\"\r\n [matTooltip]=\"'calculate sum,avg,min,max'\"\r\n mat-icon-button>\r\n\r\n <mat-icon>\r\n calculate\r\n </mat-icon>\r\n </button>\r\n <button [color]=\"innerInput.showAsLabel? 'primary' : ''\"\r\n (click)=\"toggleLabel(innerInput)\"\r\n [matTooltip]=\"innerInput.showAsLabel? 'Hide as label' : 'Show as label'\"\r\n mat-icon-button>\r\n\r\n <mat-icon>\r\n label\r\n </mat-icon>\r\n </button>\r\n <span class=\"spacer\"></span>\r\n </mat-card-actions>\r\n </mat-card>\r\n }@else {\r\n \r\n <div [class]=\"'col-md-'+(dragging?'12':innerInput.colSize)\" class=\"box\">\r\n <ng-container *ngComponentOutlet=\"InputComponent; \r\n inputs: {\r\n inputConfig: innerInput,\r\n formGroup: formGroup,\r\n formBuilderFunctions: formBuilderFunctions,\r\n }\">\r\n </ng-container>\r\n </div>\r\n \r\n }\r\n\r\n </ng-container>\r\n }\r\n @if (!!editorMode && ( innerInputs|| []).length === 0) {\r\n\r\n <div class=\"tree-instructions\">\r\n <mat-icon style=\"margin-top: 4px;margin-bottom:auto\" class=\"info-icon\" color=\"primary\">info</mat-icon>\r\n <span>\r\n <strong>Add Form Input</strong>\r\n <br>\r\n Manage your list by adding, editing, or removing items. Each item is customizable through a form.\r\n </span>\r\n </div>\r\n\r\n }\r\n\r\n </div>\r\n </mat-card-content>\r\n @if ( ( innerInputs|| []).length !== 0) {\r\n <br>\r\n <mat-divider></mat-divider>\r\n <mat-card-actions align=\"end\" class=\"ion-margin-top\">\r\n <button [color]=\"areYouSure ? 'warn' : ''\" class=\"ion-margin-end\"\r\n [style.text-decoration]=\"areYouSure ? 'underline' : ''\" mat-flat-button\r\n (click)=\"closeMultipleInput()\">\r\n {{ areYouSure ? \"leave without saving\" : \"cancel\" }}\r\n </button>\r\n @if(!inputConfig?.readonly){\r\n <button [disabled]=\"!!formInvalid\" style=\"min-width: 10em\" color=\"primary\" (click)=\"saveMultipleInputForm()\" class=\"ion-padding-horizontal\"\r\n mat-raised-button>\r\n {{\r\n rowInUpdate\r\n ? \"Update\"\r\n : \"save\"\r\n }}\r\n </button>\r\n }\r\n\r\n </mat-card-actions>\r\n }\r\n\r\n</mat-card>\r\n\r\n\r\n<mat-menu #calculationMenu=\"matMenu\">\r\n <ng-template matMenuContent let-inputId=\"sectionId\">\r\n <button (click)=\"toggleFunction(func,inputId)\" mat-menu-item *ngFor=\"let func of calculationFunctions\">\r\n {{ func }}\r\n <mat-icon color=\"primary\" *ngIf=\"selectedFunction(func)\">check_circle</mat-icon>\r\n </button>\r\n </ng-template>\r\n</mat-menu> ", styles: [".inputCardElevated{background:var(--mat-sys-surface-container, var(--mat-app-surface));box-shadow:var(--mdc-elevated-card-container-elevation)}.inputCard{box-shadow:none}.list{min-height:60px;display:block}.box{padding:4px;cursor:move}.cdk-drag-preview{box-sizing:border-box;border:none;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.box:last-child{border:none}.list.cdk-drop-list-dragging .box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.cancelProgress{height:24px!important;width:24px!important}.tree-instructions{display:flex;align-items:center;gap:8px;padding:12px;background:azure;border-radius:4px;margin-bottom:16px}.info-icon{min-width:38px!important;display:block}\n"] }]
13567
14116
  }], ctorParameters: () => [], propDecorators: { inputConfig: [{
13568
14117
  type: Input
13569
14118
  }], editorMode: [{
@@ -13844,8 +14393,16 @@ class MultipleInputTableComponent extends BaseCustomInput {
13844
14393
  get parentFormGroup() {
13845
14394
  return this.ngControl?.control?.parent;
13846
14395
  }
14396
+ get canAddRecords() {
14397
+ if (!this.inputConfig)
14398
+ return false;
14399
+ //NOTE: Temporary backward compatibility for older versions of the config that might not have the new property
14400
+ if (!this.inputConfig.multipleInputAvailableOperations)
14401
+ return true;
14402
+ return this.inputConfig.multipleInputAvailableOperations?.includes(MultipleInputAvailableOperations.Add);
14403
+ }
13847
14404
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: MultipleInputTableComponent, deps: [{ token: i1$3.NgControl, optional: true, self: true }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
13848
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: MultipleInputTableComponent, isStandalone: true, selector: "app-multiple-input-table", inputs: { editorMode: "editorMode", formGroup: "formGroup", inputConfig: "inputConfig", formBuilderFunctions: "formBuilderFunctions" }, providers: [{ provide: MatFormFieldControl, useExisting: MultipleInputTableComponent }], usesInheritance: true, ngImport: i0, template: "\r\n<lib-multiple-input-table-view\r\n\r\n[inputConfig]=\"inputConfig\"\r\n[dataSource]=\"dataSource\"\r\n[applyOptionsTo]=\"applyOptionsTo\"\r\n[formGroup]=\"parentFormGroup\"\r\n(onEditItem)=\"editRow($event)\"\r\n\r\n(onDeleteItem)=\"multipleInputRemoveItem(applyOptionsTo)\"\r\n(onCopy)=\"copy($event)\"\r\n(onApplyOptionsTo)=\"applyOptionsTo = $event\"\r\n></lib-multiple-input-table-view>\r\n@if(!!inputConfig.formIsOpen || !!rowInViewOnly){\r\n<lib-multiple-input-table-edit \r\n[editorMode]=\"editorMode\"\r\n(editMultipleInput)=\"editInput($event)\"\r\n(deleteInput)=\" deleteItemInput($event)\"\r\n(addFunction)=\"addFunction($event)\"\r\n(showItemAsLabel)=\"showItemAsLabel($event)\"\r\n(onSaveMultipleInputForm)=\"saveMultipleInputForm()\"\r\n(reorderItems)=\"reorderItems($event)\"\r\n[formBuilderFunctions]=\"formBuilderFunctions\"\r\n[formGroup]=\"parentFormGroup\"\r\n[inputConfig]=\"inputConfig\"\r\n></lib-multiple-input-table-edit>\r\n\r\n}\r\n\r\n@if (\r\n !inputConfig.readonly &&\r\n !inputConfig.formIsOpen\r\n) {\r\n <section >\r\n <button \r\n color=\"primary\" \r\n style=\" display: block;\r\n margin-top: 8px;\r\n width: 100%;\" (click)=\"generateMultipleInputForm()\" mat-flat-button>\r\n \r\n {{handleLabel}}\r\n <mat-icon matPrefix>{{\r\n handleIcon()\r\n }}</mat-icon>\r\n \r\n \r\n </button>\r\n </section>\r\n \r\n}\r\n", styles: [".table-container{position:relative;max-height:400px;overflow:auto}table{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatModulesModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3$1.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "component", type: MultipleInputTableEditComponent, selector: "lib-multiple-input-table-edit", inputs: ["inputConfig", "editorMode", "formGroup", "formBuilderFunctions"], outputs: ["onSaveMultipleInputForm", "editMultipleInput", "deleteInput", "showItemAsLabel", "addFunction", "reorderItems"] }, { kind: "component", type: MultipleInputTableViewComponent, selector: "lib-multiple-input-table-view", inputs: ["inputConfig", "dataSource", "applyOptionsTo", "formGroup"], outputs: ["onEditItem", "onDeleteItem", "onCopy", "onApplyOptionsTo"] }] }); }
14405
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: MultipleInputTableComponent, isStandalone: true, selector: "app-multiple-input-table", inputs: { editorMode: "editorMode", formGroup: "formGroup", inputConfig: "inputConfig", formBuilderFunctions: "formBuilderFunctions" }, providers: [{ provide: MatFormFieldControl, useExisting: MultipleInputTableComponent }], usesInheritance: true, ngImport: i0, template: "\r\n<lib-multiple-input-table-view\r\n\r\n[inputConfig]=\"inputConfig\"\r\n[dataSource]=\"dataSource\"\r\n[applyOptionsTo]=\"applyOptionsTo\"\r\n[formGroup]=\"parentFormGroup\"\r\n(onEditItem)=\"editRow($event)\"\r\n\r\n(onDeleteItem)=\"multipleInputRemoveItem(applyOptionsTo)\"\r\n(onCopy)=\"copy($event)\"\r\n(onApplyOptionsTo)=\"applyOptionsTo = $event\"\r\n></lib-multiple-input-table-view>\r\n@if(!!inputConfig.formIsOpen || !!rowInViewOnly){\r\n<lib-multiple-input-table-edit \r\n[editorMode]=\"editorMode\"\r\n(editMultipleInput)=\"editInput($event)\"\r\n(deleteInput)=\" deleteItemInput($event)\"\r\n(addFunction)=\"addFunction($event)\"\r\n(showItemAsLabel)=\"showItemAsLabel($event)\"\r\n(onSaveMultipleInputForm)=\"saveMultipleInputForm()\"\r\n(reorderItems)=\"reorderItems($event)\"\r\n[formBuilderFunctions]=\"formBuilderFunctions\"\r\n[formGroup]=\"parentFormGroup\"\r\n[inputConfig]=\"inputConfig\"\r\n></lib-multiple-input-table-edit>\r\n\r\n}\r\n\r\n@if (\r\n !inputConfig.readonly &&\r\n !inputConfig.formIsOpen && \r\n canAddRecords\r\n) {\r\n <section >\r\n <button \r\n color=\"primary\" \r\n style=\" display: block;\r\n margin-top: 8px;\r\n width: 100%;\" (click)=\"generateMultipleInputForm()\" mat-flat-button>\r\n \r\n {{handleLabel}}\r\n <mat-icon matPrefix>{{\r\n handleIcon()\r\n }}</mat-icon>\r\n \r\n \r\n </button>\r\n </section>\r\n \r\n}\r\n", styles: [".table-container{position:relative;max-height:400px;overflow:auto}table{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatModulesModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3$1.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "component", type: MultipleInputTableEditComponent, selector: "lib-multiple-input-table-edit", inputs: ["inputConfig", "editorMode", "formGroup", "formBuilderFunctions"], outputs: ["onSaveMultipleInputForm", "editMultipleInput", "deleteInput", "showItemAsLabel", "addFunction", "reorderItems"] }, { kind: "component", type: MultipleInputTableViewComponent, selector: "lib-multiple-input-table-view", inputs: ["inputConfig", "dataSource", "applyOptionsTo", "formGroup"], outputs: ["onEditItem", "onDeleteItem", "onCopy", "onApplyOptionsTo"] }] }); }
13849
14406
  }
13850
14407
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: MultipleInputTableComponent, decorators: [{
13851
14408
  type: Component,
@@ -13854,7 +14411,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
13854
14411
  MatModulesModule,
13855
14412
  MultipleInputTableEditComponent,
13856
14413
  MultipleInputTableViewComponent,
13857
- ], providers: [{ provide: MatFormFieldControl, useExisting: MultipleInputTableComponent }], template: "\r\n<lib-multiple-input-table-view\r\n\r\n[inputConfig]=\"inputConfig\"\r\n[dataSource]=\"dataSource\"\r\n[applyOptionsTo]=\"applyOptionsTo\"\r\n[formGroup]=\"parentFormGroup\"\r\n(onEditItem)=\"editRow($event)\"\r\n\r\n(onDeleteItem)=\"multipleInputRemoveItem(applyOptionsTo)\"\r\n(onCopy)=\"copy($event)\"\r\n(onApplyOptionsTo)=\"applyOptionsTo = $event\"\r\n></lib-multiple-input-table-view>\r\n@if(!!inputConfig.formIsOpen || !!rowInViewOnly){\r\n<lib-multiple-input-table-edit \r\n[editorMode]=\"editorMode\"\r\n(editMultipleInput)=\"editInput($event)\"\r\n(deleteInput)=\" deleteItemInput($event)\"\r\n(addFunction)=\"addFunction($event)\"\r\n(showItemAsLabel)=\"showItemAsLabel($event)\"\r\n(onSaveMultipleInputForm)=\"saveMultipleInputForm()\"\r\n(reorderItems)=\"reorderItems($event)\"\r\n[formBuilderFunctions]=\"formBuilderFunctions\"\r\n[formGroup]=\"parentFormGroup\"\r\n[inputConfig]=\"inputConfig\"\r\n></lib-multiple-input-table-edit>\r\n\r\n}\r\n\r\n@if (\r\n !inputConfig.readonly &&\r\n !inputConfig.formIsOpen\r\n) {\r\n <section >\r\n <button \r\n color=\"primary\" \r\n style=\" display: block;\r\n margin-top: 8px;\r\n width: 100%;\" (click)=\"generateMultipleInputForm()\" mat-flat-button>\r\n \r\n {{handleLabel}}\r\n <mat-icon matPrefix>{{\r\n handleIcon()\r\n }}</mat-icon>\r\n \r\n \r\n </button>\r\n </section>\r\n \r\n}\r\n", styles: [".table-container{position:relative;max-height:400px;overflow:auto}table{width:100%}\n"] }]
14414
+ ], providers: [{ provide: MatFormFieldControl, useExisting: MultipleInputTableComponent }], template: "\r\n<lib-multiple-input-table-view\r\n\r\n[inputConfig]=\"inputConfig\"\r\n[dataSource]=\"dataSource\"\r\n[applyOptionsTo]=\"applyOptionsTo\"\r\n[formGroup]=\"parentFormGroup\"\r\n(onEditItem)=\"editRow($event)\"\r\n\r\n(onDeleteItem)=\"multipleInputRemoveItem(applyOptionsTo)\"\r\n(onCopy)=\"copy($event)\"\r\n(onApplyOptionsTo)=\"applyOptionsTo = $event\"\r\n></lib-multiple-input-table-view>\r\n@if(!!inputConfig.formIsOpen || !!rowInViewOnly){\r\n<lib-multiple-input-table-edit \r\n[editorMode]=\"editorMode\"\r\n(editMultipleInput)=\"editInput($event)\"\r\n(deleteInput)=\" deleteItemInput($event)\"\r\n(addFunction)=\"addFunction($event)\"\r\n(showItemAsLabel)=\"showItemAsLabel($event)\"\r\n(onSaveMultipleInputForm)=\"saveMultipleInputForm()\"\r\n(reorderItems)=\"reorderItems($event)\"\r\n[formBuilderFunctions]=\"formBuilderFunctions\"\r\n[formGroup]=\"parentFormGroup\"\r\n[inputConfig]=\"inputConfig\"\r\n></lib-multiple-input-table-edit>\r\n\r\n}\r\n\r\n@if (\r\n !inputConfig.readonly &&\r\n !inputConfig.formIsOpen && \r\n canAddRecords\r\n) {\r\n <section >\r\n <button \r\n color=\"primary\" \r\n style=\" display: block;\r\n margin-top: 8px;\r\n width: 100%;\" (click)=\"generateMultipleInputForm()\" mat-flat-button>\r\n \r\n {{handleLabel}}\r\n <mat-icon matPrefix>{{\r\n handleIcon()\r\n }}</mat-icon>\r\n \r\n \r\n </button>\r\n </section>\r\n \r\n}\r\n", styles: [".table-container{position:relative;max-height:400px;overflow:auto}table{width:100%}\n"] }]
13858
14415
  }], ctorParameters: () => [{ type: i1$3.NgControl, decorators: [{
13859
14416
  type: Optional
13860
14417
  }, {
@@ -16444,7 +17001,7 @@ class PaginatedSelectionTable {
16444
17001
  return getInputErrorMessage(this.inputConfig, this.formGroup);
16445
17002
  }
16446
17003
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: PaginatedSelectionTable, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
16447
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: PaginatedSelectionTable, isStandalone: true, selector: "lib-paginated-selection-table", inputs: { inputConfig: "inputConfig", formGroup: "formGroup" }, outputs: { reload: "reload" }, ngImport: i0, template: "<ng-container [formGroup]=\"formGroup\">\r\n <mat-form-field [appearance]=\"this.inputConfig.appearance ||'fill' \" subscriptSizing=\"dynamic\"\r\n *ngIf=\"this.inputConfig as inputConfig\">\r\n <mat-label>\r\n {{this.inputConfig.label }}\r\n <lib-t-form-input-status [inputConfig]=\"this.inputConfig\"></lib-t-form-input-status>\r\n </mat-label>\r\n \r\n <lib-paginated-selection-table-reactive-input [inputConfig]=\"this.inputConfig\"\r\n [disabled]=\"!!this.inputConfig.disabled\"\r\n [required]=\"this.inputConfig.required\"\r\n [canReload]=\"!!this.inputConfig.canReload.canReload || false\"\r\n (reloadData)=\"this.inputConfig.canReload.emit()\"\r\n [formControlName]=\"this.inputConfig.id\">\r\n </lib-paginated-selection-table-reactive-input>\r\n @if(inputConfig.hintLabel || inputConfig.temporaryHint ){\r\n <mat-hint class=\"inputHint\">\r\n {{ inputConfig.temporaryHint || inputConfig.hintLabel}}\r\n </mat-hint>\r\n }\r\n \r\n \r\n <mat-error class=\"oneLineTextEllipsis\" matTooltipClass=\"errorToolTip\">{{errorMessage}}</mat-error>\r\n \r\n \r\n <!-- Prefix Icon -->\r\n <mat-icon *ngIf=\"inputConfig.prefixIcon\" matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\r\n \r\n <!-- Suffix Icon or Password Visibility Toggle -->\r\n <ng-container *ngIf=\"inputConfig.suffixIcon\">\r\n <mat-icon *ngIf=\"inputConfig.id !== 'password'\" matSuffix>{{ inputConfig.suffixIcon\r\n }}</mat-icon>\r\n <!-- <button *ngIf=\"inputConfig.id === 'password'\" (click)=\"inputConfig.togglePasswordVisibility()\"\r\n mat-icon-button matSuffix>\r\n <mat-icon>{{ inputConfig.showPassword ? 'remove_red_eye' : 'eye_off' }}</mat-icon>\r\n </button> -->\r\n </ng-container>\r\n \r\n <!-- Prefix & Suffix Text -->\r\n <span *ngIf=\"inputConfig.prefixText\" matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\r\n <span *ngIf=\"inputConfig.suffixText\" matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText\r\n }}</span>\r\n \r\n <!-- Character Count Hint -->\r\n <mat-hint *ngIf=\"inputConfig.maxLength && formGroup\" align=\"end\">\r\n {{ (formGroup.controls[inputConfig.id]?.value?.length || 0) + '/' + inputConfig.maxLength\r\n }}\r\n </mat-hint>\r\n \r\n \r\n \r\n </mat-form-field>\r\n </ng-container>\r\n ", styles: ["mat-form-field{width:100%}mat-form-field .input-sync-button{display:none}mat-form-field:hover .input-sync-button{display:inline-block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatModulesModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3$1.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i3$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i3$1.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i3$1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: TFormInputStatusComponent, selector: "lib-t-form-input-status", inputs: ["inputConfig"] }, { kind: "component", type: PaginatedSelectionTableReactiveInput, selector: "lib-paginated-selection-table-reactive-input", inputs: ["formBuilderFunctions", "canReload", "loading", "searchPlaceholder", "emptyMessage", "inputConfig"], outputs: ["reloadData"] }] }); }
17004
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: PaginatedSelectionTable, isStandalone: true, selector: "lib-paginated-selection-table", inputs: { inputConfig: "inputConfig", formGroup: "formGroup" }, outputs: { reload: "reload" }, ngImport: i0, template: "<ng-container [formGroup]=\"formGroup\">\r\n <mat-form-field [appearance]=\"this.inputConfig.appearance ||'fill' \" subscriptSizing=\"dynamic\"\r\n *ngIf=\"this.inputConfig as inputConfig\">\r\n <mat-label>\r\n {{this.inputConfig.label }}\r\n <lib-t-form-input-status [inputConfig]=\"this.inputConfig\"></lib-t-form-input-status>\r\n </mat-label>\r\n \r\n <lib-paginated-selection-table-reactive-input [inputConfig]=\"this.inputConfig\"\r\n [disabled]=\"!!this.inputConfig.disabled\"\r\n [required]=\"this.inputConfig.required\"\r\n [canReload]=\"!!this.inputConfig.canReload?.canReload || false\"\r\n (reloadData)=\"this.inputConfig.canReload.emit()\"\r\n [formControlName]=\"this.inputConfig.id\">\r\n </lib-paginated-selection-table-reactive-input>\r\n @if(inputConfig.hintLabel || inputConfig.temporaryHint ){\r\n <mat-hint class=\"inputHint\">\r\n {{ inputConfig.temporaryHint || inputConfig.hintLabel}}\r\n </mat-hint>\r\n }\r\n \r\n \r\n <mat-error class=\"oneLineTextEllipsis\" matTooltipClass=\"errorToolTip\">{{errorMessage}}</mat-error>\r\n \r\n \r\n <!-- Prefix Icon -->\r\n <mat-icon *ngIf=\"inputConfig.prefixIcon\" matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\r\n \r\n <!-- Suffix Icon or Password Visibility Toggle -->\r\n <ng-container *ngIf=\"inputConfig.suffixIcon\">\r\n <mat-icon *ngIf=\"inputConfig.id !== 'password'\" matSuffix>{{ inputConfig.suffixIcon\r\n }}</mat-icon>\r\n <!-- <button *ngIf=\"inputConfig.id === 'password'\" (click)=\"inputConfig.togglePasswordVisibility()\"\r\n mat-icon-button matSuffix>\r\n <mat-icon>{{ inputConfig.showPassword ? 'remove_red_eye' : 'eye_off' }}</mat-icon>\r\n </button> -->\r\n </ng-container>\r\n \r\n <!-- Prefix & Suffix Text -->\r\n <span *ngIf=\"inputConfig.prefixText\" matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\r\n <span *ngIf=\"inputConfig.suffixText\" matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText\r\n }}</span>\r\n \r\n <!-- Character Count Hint -->\r\n <mat-hint *ngIf=\"inputConfig.maxLength && formGroup\" align=\"end\">\r\n {{ (formGroup.controls[inputConfig.id]?.value?.length || 0) + '/' + inputConfig.maxLength\r\n }}\r\n </mat-hint>\r\n \r\n \r\n \r\n </mat-form-field>\r\n </ng-container>\r\n ", styles: ["mat-form-field{width:100%}mat-form-field .input-sync-button{display:none}mat-form-field:hover .input-sync-button{display:inline-block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatModulesModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3$1.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i3$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i3$1.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i3$1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: TFormInputStatusComponent, selector: "lib-t-form-input-status", inputs: ["inputConfig"] }, { kind: "component", type: PaginatedSelectionTableReactiveInput, selector: "lib-paginated-selection-table-reactive-input", inputs: ["formBuilderFunctions", "canReload", "loading", "searchPlaceholder", "emptyMessage", "inputConfig"], outputs: ["reloadData"] }] }); }
16448
17005
  }
16449
17006
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: PaginatedSelectionTable, decorators: [{
16450
17007
  type: Component,
@@ -16454,7 +17011,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
16454
17011
  ReactiveFormsModule,
16455
17012
  TFormInputStatusComponent,
16456
17013
  PaginatedSelectionTableReactiveInput,
16457
- ], template: "<ng-container [formGroup]=\"formGroup\">\r\n <mat-form-field [appearance]=\"this.inputConfig.appearance ||'fill' \" subscriptSizing=\"dynamic\"\r\n *ngIf=\"this.inputConfig as inputConfig\">\r\n <mat-label>\r\n {{this.inputConfig.label }}\r\n <lib-t-form-input-status [inputConfig]=\"this.inputConfig\"></lib-t-form-input-status>\r\n </mat-label>\r\n \r\n <lib-paginated-selection-table-reactive-input [inputConfig]=\"this.inputConfig\"\r\n [disabled]=\"!!this.inputConfig.disabled\"\r\n [required]=\"this.inputConfig.required\"\r\n [canReload]=\"!!this.inputConfig.canReload.canReload || false\"\r\n (reloadData)=\"this.inputConfig.canReload.emit()\"\r\n [formControlName]=\"this.inputConfig.id\">\r\n </lib-paginated-selection-table-reactive-input>\r\n @if(inputConfig.hintLabel || inputConfig.temporaryHint ){\r\n <mat-hint class=\"inputHint\">\r\n {{ inputConfig.temporaryHint || inputConfig.hintLabel}}\r\n </mat-hint>\r\n }\r\n \r\n \r\n <mat-error class=\"oneLineTextEllipsis\" matTooltipClass=\"errorToolTip\">{{errorMessage}}</mat-error>\r\n \r\n \r\n <!-- Prefix Icon -->\r\n <mat-icon *ngIf=\"inputConfig.prefixIcon\" matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\r\n \r\n <!-- Suffix Icon or Password Visibility Toggle -->\r\n <ng-container *ngIf=\"inputConfig.suffixIcon\">\r\n <mat-icon *ngIf=\"inputConfig.id !== 'password'\" matSuffix>{{ inputConfig.suffixIcon\r\n }}</mat-icon>\r\n <!-- <button *ngIf=\"inputConfig.id === 'password'\" (click)=\"inputConfig.togglePasswordVisibility()\"\r\n mat-icon-button matSuffix>\r\n <mat-icon>{{ inputConfig.showPassword ? 'remove_red_eye' : 'eye_off' }}</mat-icon>\r\n </button> -->\r\n </ng-container>\r\n \r\n <!-- Prefix & Suffix Text -->\r\n <span *ngIf=\"inputConfig.prefixText\" matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\r\n <span *ngIf=\"inputConfig.suffixText\" matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText\r\n }}</span>\r\n \r\n <!-- Character Count Hint -->\r\n <mat-hint *ngIf=\"inputConfig.maxLength && formGroup\" align=\"end\">\r\n {{ (formGroup.controls[inputConfig.id]?.value?.length || 0) + '/' + inputConfig.maxLength\r\n }}\r\n </mat-hint>\r\n \r\n \r\n \r\n </mat-form-field>\r\n </ng-container>\r\n ", styles: ["mat-form-field{width:100%}mat-form-field .input-sync-button{display:none}mat-form-field:hover .input-sync-button{display:inline-block}\n"] }]
17014
+ ], template: "<ng-container [formGroup]=\"formGroup\">\r\n <mat-form-field [appearance]=\"this.inputConfig.appearance ||'fill' \" subscriptSizing=\"dynamic\"\r\n *ngIf=\"this.inputConfig as inputConfig\">\r\n <mat-label>\r\n {{this.inputConfig.label }}\r\n <lib-t-form-input-status [inputConfig]=\"this.inputConfig\"></lib-t-form-input-status>\r\n </mat-label>\r\n \r\n <lib-paginated-selection-table-reactive-input [inputConfig]=\"this.inputConfig\"\r\n [disabled]=\"!!this.inputConfig.disabled\"\r\n [required]=\"this.inputConfig.required\"\r\n [canReload]=\"!!this.inputConfig.canReload?.canReload || false\"\r\n (reloadData)=\"this.inputConfig.canReload.emit()\"\r\n [formControlName]=\"this.inputConfig.id\">\r\n </lib-paginated-selection-table-reactive-input>\r\n @if(inputConfig.hintLabel || inputConfig.temporaryHint ){\r\n <mat-hint class=\"inputHint\">\r\n {{ inputConfig.temporaryHint || inputConfig.hintLabel}}\r\n </mat-hint>\r\n }\r\n \r\n \r\n <mat-error class=\"oneLineTextEllipsis\" matTooltipClass=\"errorToolTip\">{{errorMessage}}</mat-error>\r\n \r\n \r\n <!-- Prefix Icon -->\r\n <mat-icon *ngIf=\"inputConfig.prefixIcon\" matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\r\n \r\n <!-- Suffix Icon or Password Visibility Toggle -->\r\n <ng-container *ngIf=\"inputConfig.suffixIcon\">\r\n <mat-icon *ngIf=\"inputConfig.id !== 'password'\" matSuffix>{{ inputConfig.suffixIcon\r\n }}</mat-icon>\r\n <!-- <button *ngIf=\"inputConfig.id === 'password'\" (click)=\"inputConfig.togglePasswordVisibility()\"\r\n mat-icon-button matSuffix>\r\n <mat-icon>{{ inputConfig.showPassword ? 'remove_red_eye' : 'eye_off' }}</mat-icon>\r\n </button> -->\r\n </ng-container>\r\n \r\n <!-- Prefix & Suffix Text -->\r\n <span *ngIf=\"inputConfig.prefixText\" matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\r\n <span *ngIf=\"inputConfig.suffixText\" matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText\r\n }}</span>\r\n \r\n <!-- Character Count Hint -->\r\n <mat-hint *ngIf=\"inputConfig.maxLength && formGroup\" align=\"end\">\r\n {{ (formGroup.controls[inputConfig.id]?.value?.length || 0) + '/' + inputConfig.maxLength\r\n }}\r\n </mat-hint>\r\n \r\n \r\n \r\n </mat-form-field>\r\n </ng-container>\r\n ", styles: ["mat-form-field{width:100%}mat-form-field .input-sync-button{display:none}mat-form-field:hover .input-sync-button{display:inline-block}\n"] }]
16458
17015
  }], propDecorators: { inputConfig: [{
16459
17016
  type: Input
16460
17017
  }], formGroup: [{
@@ -16840,5 +17397,5 @@ console.debug = () => { };
16840
17397
  * Generated bundle index. Do not edit.
16841
17398
  */
16842
17399
 
16843
- export { returnDeepProperty as $, ACCOUNTING_BASIS as A, NgxTFormsComponent as B, NgxTFormsService as C, DaysAgoPipe as D, SignatureInputElementComponent as E, FormsStoreService as F, TFormInputComponent as G, UserFormStepperComponent as H, createFileFromBase64 as I, JsonEditorComponent as J, formGenerator as K, getPipedValueFromDataType as L, MatModulesModule as M, NGX_T_FORMS_CONFIG_TOKEN as N, getSampleValueForInput as O, PropertyAccessError as P, getSectionElements as Q, getSignatureImage as R, SearchListPipe as S, TDynamicDataEditComponent as T, UTILS_OBJECT_TOKEN as U, ValidationExpressioCreatorComponent as V, getUrl as W, getValueFromValueAccessor as X, initFormConfigToV2 as Y, provideNgxTForms as Z, _isEqual as _, assignDeepPropertyToObject as a, returnMappedPathValue as a0, textIconsForUserHints as a1, validateExpressionSyntax as a2, validateObjectAgainstString as a3, index as a4, TDynamicDataViewComponent as b, FormTowerControllerService as c, TourManagerService as d, getSubmissionStatusFn as e, getInputIllustration as f, getAvatar as g, TreeComponent as h, convertPostmanFolderItemsToTree as i, DataTreeComponent as j, getToolbarColor as k, getToolbarBackground as l, getToolbarIconColor as m, DialogTemplateComponent as n, FORM_ACTIONS_TOKEN as o, FORM_CONFIG_TOKEN as p, FORM_INPUTS_TOKEN as q, FORM_SLIDES_TOKEN as r, safeReturnDeepProperty as s, testAgainstItem as t, FormBuilderComponent as u, FormatDataPipe as v, FormsComponent as w, MSCOA_TREE_PROVIDER as x, MULTIPLE_FORM_INPUT_TOKEN as y, MscoaFormInputComponent as z };
16844
- //# sourceMappingURL=ngx-t-forms-ngx-t-forms-D9qmig6g.mjs.map
17400
+ export { provideNgxTForms as $, ACCOUNTING_BASIS as A, NgxTFormsComponent as B, NgxTFormsService as C, DaysAgoPipe as D, SignatureInputElementComponent as E, FormsStoreService as F, TFormImportController as G, TFormInputComponent as H, UserFormStepperComponent as I, JsonEditorComponent as J, createFileFromBase64 as K, formGenerator as L, MatModulesModule as M, NGX_T_FORMS_CONFIG_TOKEN as N, getPipedValueFromDataType as O, PropertyAccessError as P, getSampleValueForInput as Q, getSectionElements as R, SearchListPipe as S, TDynamicDataEditComponent as T, UTILS_OBJECT_TOKEN as U, ValidationExpressioCreatorComponent as V, getSignatureImage as W, getUrl as X, getValueFromValueAccessor as Y, initFormConfigToV2 as Z, _isEqual as _, assignDeepPropertyToObject as a, returnDeepProperty as a0, returnMappedPathValue as a1, textIconsForUserHints as a2, validateExpressionSyntax as a3, validateObjectAgainstString as a4, index as a5, TDynamicDataViewComponent as b, FormTowerControllerService as c, TourManagerService as d, getSubmissionStatusFn as e, getInputIllustration as f, getAvatar as g, TreeComponent as h, convertPostmanFolderItemsToTree as i, DataTreeComponent as j, getToolbarColor as k, getToolbarBackground as l, getToolbarIconColor as m, DialogTemplateComponent as n, FORM_ACTIONS_TOKEN as o, FORM_CONFIG_TOKEN as p, FORM_INPUTS_TOKEN as q, FORM_SLIDES_TOKEN as r, safeReturnDeepProperty as s, testAgainstItem as t, FormBuilderComponent as u, FormatDataPipe as v, FormsComponent as w, MSCOA_TREE_PROVIDER as x, MULTIPLE_FORM_INPUT_TOKEN as y, MscoaFormInputComponent as z };
17401
+ //# sourceMappingURL=ngx-t-forms-ngx-t-forms-DP2koSL5.mjs.map