ngx-t-forms 2.0.24 → 2.0.26

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 (149) hide show
  1. package/README.md +177 -16
  2. package/fesm2022/ngx-t-forms-calculated-field-rules.component-Cs_Lhz_D.mjs +313 -0
  3. package/fesm2022/ngx-t-forms-calculated-field-rules.component-Cs_Lhz_D.mjs.map +1 -0
  4. package/fesm2022/{ngx-t-forms-chip-options-creator-editor.component-C00n6tFs.mjs → ngx-t-forms-chip-options-creator-editor.component-DkTpG5yQ.mjs} +6 -6
  5. package/fesm2022/{ngx-t-forms-chip-options-creator-editor.component-C00n6tFs.mjs.map → ngx-t-forms-chip-options-creator-editor.component-DkTpG5yQ.mjs.map} +1 -1
  6. package/fesm2022/{ngx-t-forms-config-mscoa-additional-inputs.component-DtfUKZL-.mjs → ngx-t-forms-config-mscoa-additional-inputs.component-DJ9d3Oy9.mjs} +9 -9
  7. package/fesm2022/{ngx-t-forms-config-mscoa-additional-inputs.component-DtfUKZL-.mjs.map → ngx-t-forms-config-mscoa-additional-inputs.component-DJ9d3Oy9.mjs.map} +1 -1
  8. package/fesm2022/{ngx-t-forms-data-source-picker.component-BBEQuzn2.mjs → ngx-t-forms-data-source-picker.component-CFQ_GVPG.mjs} +11 -11
  9. package/fesm2022/{ngx-t-forms-data-source-picker.component-BBEQuzn2.mjs.map → ngx-t-forms-data-source-picker.component-CFQ_GVPG.mjs.map} +1 -1
  10. package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-CPF_BLRA.mjs +291 -0
  11. package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-CPF_BLRA.mjs.map +1 -0
  12. package/fesm2022/{ngx-t-forms-form-input-selector.component-CniLZN1h.mjs → ngx-t-forms-form-input-selector.component-C38FXT55.mjs} +8 -8
  13. package/fesm2022/{ngx-t-forms-form-input-selector.component-CniLZN1h.mjs.map → ngx-t-forms-form-input-selector.component-C38FXT55.mjs.map} +1 -1
  14. package/fesm2022/{ngx-t-forms-form-json-view.component-bnjkxqgV.mjs → ngx-t-forms-form-json-view.component-C7i6JZ-l.mjs} +6 -6
  15. package/fesm2022/{ngx-t-forms-form-json-view.component-bnjkxqgV.mjs.map → ngx-t-forms-form-json-view.component-C7i6JZ-l.mjs.map} +1 -1
  16. package/fesm2022/ngx-t-forms-form-section-stepper.component-CJz0yr78.mjs +264 -0
  17. package/fesm2022/ngx-t-forms-form-section-stepper.component-CJz0yr78.mjs.map +1 -0
  18. package/fesm2022/ngx-t-forms-forms-builder-menu.component-G3Agd-vE.mjs +349 -0
  19. package/fesm2022/ngx-t-forms-forms-builder-menu.component-G3Agd-vE.mjs.map +1 -0
  20. package/fesm2022/{ngx-t-forms-input-editor.component-BBP90B_e.mjs → ngx-t-forms-input-editor.component-B12zbXE1.mjs} +19 -19
  21. package/fesm2022/{ngx-t-forms-input-editor.component-BBP90B_e.mjs.map → ngx-t-forms-input-editor.component-B12zbXE1.mjs.map} +1 -1
  22. package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-dIY3BX1u.mjs +106 -0
  23. package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-dIY3BX1u.mjs.map +1 -0
  24. package/fesm2022/{ngx-t-forms-mat-slider-editor.component-CIiYyxkb.mjs → ngx-t-forms-mat-slider-editor.component-yMRCg8fo.mjs} +5 -5
  25. package/fesm2022/{ngx-t-forms-mat-slider-editor.component-CIiYyxkb.mjs.map → ngx-t-forms-mat-slider-editor.component-yMRCg8fo.mjs.map} +1 -1
  26. package/fesm2022/{ngx-t-forms-mat-slider-toggle-editor.component-DDR2JurF.mjs → ngx-t-forms-mat-slider-toggle-editor.component-0aUVP9A6.mjs} +7 -7
  27. package/fesm2022/ngx-t-forms-mat-slider-toggle-editor.component-0aUVP9A6.mjs.map +1 -0
  28. package/fesm2022/{ngx-t-forms-missing-form-configs.component-CYN9mVz9.mjs → ngx-t-forms-missing-form-configs.component-CsPMQZqg.mjs} +9 -9
  29. package/fesm2022/{ngx-t-forms-missing-form-configs.component-CYN9mVz9.mjs.map → ngx-t-forms-missing-form-configs.component-CsPMQZqg.mjs.map} +1 -1
  30. package/fesm2022/ngx-t-forms-mscoa-chart-toolbar.component-D8a9-6lt.mjs +43 -0
  31. package/fesm2022/ngx-t-forms-mscoa-chart-toolbar.component-D8a9-6lt.mjs.map +1 -0
  32. package/fesm2022/ngx-t-forms-mscoa-error-display.component-DwbyXd_D.mjs +116 -0
  33. package/fesm2022/ngx-t-forms-mscoa-error-display.component-DwbyXd_D.mjs.map +1 -0
  34. package/fesm2022/ngx-t-forms-mscoa-segment-config.component-BXPghOuH.mjs +299 -0
  35. package/fesm2022/ngx-t-forms-mscoa-segment-config.component-BXPghOuH.mjs.map +1 -0
  36. package/fesm2022/ngx-t-forms-mscoa-temporary-hint.component-CBRfWvfD.mjs +83 -0
  37. package/fesm2022/ngx-t-forms-mscoa-temporary-hint.component-CBRfWvfD.mjs.map +1 -0
  38. package/fesm2022/{ngx-t-forms-ngx-t-forms-DwsbmVlY.mjs → ngx-t-forms-ngx-t-forms-CD9InaXz.mjs} +3364 -931
  39. package/fesm2022/ngx-t-forms-ngx-t-forms-CD9InaXz.mjs.map +1 -0
  40. package/fesm2022/ngx-t-forms-pipeline-generator.component-QE-I58e4.mjs +637 -0
  41. package/fesm2022/ngx-t-forms-pipeline-generator.component-QE-I58e4.mjs.map +1 -0
  42. package/fesm2022/ngx-t-forms-record-list-manager.component-D4wlLtdc.mjs +270 -0
  43. package/fesm2022/ngx-t-forms-record-list-manager.component-D4wlLtdc.mjs.map +1 -0
  44. package/fesm2022/ngx-t-forms-required-inputs.component-BoqmVDp2.mjs +192 -0
  45. package/fesm2022/ngx-t-forms-required-inputs.component-BoqmVDp2.mjs.map +1 -0
  46. package/fesm2022/{ngx-t-forms-rest-api-call-setup.component-BcItch1n.mjs → ngx-t-forms-rest-api-call-setup.component-CtfudSGT.mjs} +15 -15
  47. package/fesm2022/{ngx-t-forms-rest-api-call-setup.component-BcItch1n.mjs.map → ngx-t-forms-rest-api-call-setup.component-CtfudSGT.mjs.map} +1 -1
  48. package/fesm2022/{ngx-t-forms-section-report.component-Cn_oWXBX.mjs → ngx-t-forms-section-report.component-Dntm1m5b.mjs} +10 -10
  49. package/fesm2022/{ngx-t-forms-section-report.component-Cn_oWXBX.mjs.map → ngx-t-forms-section-report.component-Dntm1m5b.mjs.map} +1 -1
  50. package/fesm2022/{ngx-t-forms-selection-options-editor.component-Cc41XG4s.mjs → ngx-t-forms-selection-options-editor.component-Cc_qCtW2.mjs} +11 -11
  51. package/fesm2022/{ngx-t-forms-selection-options-editor.component-Cc41XG4s.mjs.map → ngx-t-forms-selection-options-editor.component-Cc_qCtW2.mjs.map} +1 -1
  52. package/fesm2022/ngx-t-forms-t-workflow-picker.component-xvX8t0pu.mjs +187 -0
  53. package/fesm2022/ngx-t-forms-t-workflow-picker.component-xvX8t0pu.mjs.map +1 -0
  54. package/fesm2022/{ngx-t-forms-validators-config.component-4Iy5uJj3.mjs → ngx-t-forms-validators-config.component-D6JG1p81.mjs} +13 -13
  55. package/fesm2022/{ngx-t-forms-validators-config.component-4Iy5uJj3.mjs.map → ngx-t-forms-validators-config.component-D6JG1p81.mjs.map} +1 -1
  56. package/fesm2022/ngx-t-forms.mjs +1 -1
  57. package/lib/components/form-builder/elements/form-section-stepper/form-section-stepper.component.d.ts +4 -1
  58. package/lib/components/form-builder/elements/form-submissions-config/form-submissions-config.component.d.ts +1 -1
  59. package/lib/components/form-builder/elements/input-element-editor/input-element-editor.component.d.ts +6 -2
  60. package/lib/components/forms/forms.component.d.ts +8 -0
  61. package/lib/components/forms/store/Form-actions-formBuilder.d.ts +1 -0
  62. package/lib/components/forms/store/Form-selectors-FormBuilder.d.ts +3 -1
  63. package/lib/components/forms/store/Forms-Effects.d.ts +7 -1
  64. package/lib/components/forms/store/forms-store.service.d.ts +19 -53
  65. package/lib/components/index.d.ts +2 -1
  66. package/lib/components/t-dynamic-data-edit/elements/api-value-access-rules/api-value-access-rules.component.d.ts +40 -20
  67. package/lib/components/t-dynamic-data-edit/elements/calculated-field-rules/calculated-field-rules.component.d.ts +51 -63
  68. package/lib/components/t-dynamic-data-edit/elements/document-list-label-config-editor/document-list-label-config-editor.component.d.ts +8 -1
  69. package/lib/components/t-dynamic-data-edit/elements/json-editor/json-editor.component.d.ts +37 -9
  70. package/lib/components/t-dynamic-data-edit/elements/mat-chip-list-editor/mat-chip-list-editor.component.d.ts +2 -1
  71. package/lib/components/t-dynamic-data-edit/elements/mscoa-segment-config/mscoa-segment-config.component.d.ts +4 -1
  72. package/lib/components/t-dynamic-data-edit/elements/pipeline-generator/pipeline-generator.component.d.ts +2 -0
  73. package/lib/components/t-dynamic-data-edit/elements/record-list-manager/record-list-manager.component.d.ts +75 -0
  74. package/lib/components/t-dynamic-data-edit/elements/required-inputs/required-inputs.component.d.ts +1 -0
  75. package/lib/components/t-dynamic-data-edit/elements/t-workflow-picker/t-workflow-picker.component.d.ts +7 -3
  76. package/lib/components/t-dynamic-data-edit/t-dynamic-data-edit.component.d.ts +1 -0
  77. package/lib/components/t-form-input/elements/Geo-location-form-input/geo-location.component.d.ts +1 -1
  78. package/lib/components/t-form-input/elements/auto-complete-input-element/auto-complete-input-element.component.d.ts +1 -1
  79. package/lib/components/t-form-input/elements/basic-input-input-element/basic-input-input-element.component.d.ts +2 -1
  80. package/lib/components/t-form-input/elements/basic-input-input-element/core/input-custom/input-custom.component.d.ts +2 -1
  81. package/lib/components/t-form-input/elements/date-picker-input-element/date-picker-input-element.component.d.ts +1 -1
  82. package/lib/components/t-form-input/elements/date-range-picker-input-element/date-range-picker-input-element.component.d.ts +1 -1
  83. package/lib/components/t-form-input/elements/document-picker/document-picker.component.d.ts +1 -1
  84. package/lib/components/t-form-input/elements/editor-input-element/editor-input-element.component.d.ts +1 -1
  85. package/lib/components/t-form-input/elements/file-upload-input-element/file-upload-input-element.component.d.ts +1 -1
  86. package/lib/components/t-form-input/elements/image-capture-input-element/image-capture-input-element.component.d.ts +1 -1
  87. package/lib/components/t-form-input/elements/mscoa-form-input/elements/account-value/account-value.component.d.ts +8 -0
  88. package/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-chart/components/mscoa-chart-input-menu/mscoa-chart-input-menu.component.d.ts +23 -0
  89. package/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-chart/components/mscoa-chart-toolbar/mscoa-chart-toolbar.component.d.ts +22 -0
  90. package/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-chart/components/mscoa-error-display/mscoa-error-display.component.d.ts +34 -0
  91. package/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-chart/components/mscoa-temporary-hint/mscoa-temporary-hint.component.d.ts +21 -0
  92. package/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-chart/extractCols.d.ts +22 -0
  93. package/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-chart/mscoa-chart.component.d.ts +299 -86
  94. package/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-chart/utils/mscoa-chart.constants.d.ts +47 -0
  95. package/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-chart/utils/mscoa-chart.helpers.d.ts +87 -0
  96. package/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-chart/utils/mscoa-chart.types.d.ts +51 -0
  97. package/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-chart/utils/mscoa-message-formatter.d.ts +87 -0
  98. package/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-computation/mscoa-computation.component.d.ts +149 -22
  99. package/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-reactive-form-field/mscoa-reactive-form-field.component.d.ts +11 -0
  100. package/lib/components/t-form-input/elements/mscoa-form-input/elements/scoa-account-table/scoa-account-table.component.d.ts +4 -0
  101. package/lib/components/t-form-input/elements/mscoa-form-input/mscoa-form-input.component.d.ts +1 -1
  102. package/lib/components/t-form-input/elements/mscoa-form-input/store/accountConstants.d.ts +7 -2
  103. package/lib/components/t-form-input/elements/mscoa-form-input/store/mscoa-actions.d.ts +13 -2
  104. package/lib/components/t-form-input/elements/mscoa-form-input/store/mscoa-component-store.service.d.ts +45 -8
  105. package/lib/components/t-form-input/elements/mscoa-form-input/store/mscoa-effects.d.ts +1 -0
  106. package/lib/components/t-form-input/elements/mscoa-form-input/store/mscoa-selectors.d.ts +33 -8
  107. package/lib/components/t-form-input/elements/multiple-input-input-element/multiple-input-input-element.component.d.ts +1 -1
  108. package/lib/components/t-form-input/elements/select-input-element/select-input-element.component.d.ts +1 -1
  109. package/lib/components/t-form-input/elements/signature-input-element/core/signature-pad-input/functions/getSignatureImage.d.ts +3 -0
  110. package/lib/components/t-form-input/elements/signature-input-element/signature-input-element.component.d.ts +1 -1
  111. package/lib/components/t-form-input/elements/textarea-input-element/core/text-area-reactive-input/text-area-reactive-input.component.d.ts +1 -2
  112. package/lib/components/t-form-input/elements/textarea-input-element/textarea-input-element.component.d.ts +1 -1
  113. package/lib/components/t-form-input/elements/toggle-input-element/toggle-input-element.component.d.ts +1 -1
  114. package/lib/components/t-form-input/elements/workflow-adjudication/workflow-adjudication.component.d.ts +1 -1
  115. package/lib/services/core/t-form-builder/functions/deleteSection.d.ts +1 -0
  116. package/lib/services/core/t-form-builder/functions/inputElementEditorConfigs.d.ts +9 -3
  117. package/lib/services/core/t-form-builder/functions/removeItem.d.ts +1 -0
  118. package/lib/services/core/t-form-builder/functions/stepTitleChangeStep.d.ts +1 -0
  119. package/lib/services/core/t-form-controller/function/calculateInputValue.d.ts +1 -1
  120. package/lib/services/core/t-form-controller/function/getInputSourcedValue.d.ts +4 -0
  121. package/lib/services/core/t-form-tower-controller/functions/runMultipleInputPrepopulationFunctions.d.ts +11 -0
  122. package/lib/services/core/t-form-tower-controller/functions/updateFormInputConfig.d.ts +7 -0
  123. package/lib/services/core/t-input-controller/functions/baseCustomInput.d.ts +4 -2
  124. package/lib/services/core/t-input-controller/functions/inputErrorMessage.d.ts +1 -1
  125. package/lib/shared/functions/convertElementEditorTypesToInputType.d.ts +3 -0
  126. package/lib/shared/functions/fuzzyTextSearch.d.ts +4 -0
  127. package/lib/shared/functions/getPipedValueFromDataType.d.ts +2 -0
  128. package/lib/shared/index.d.ts +2 -1
  129. package/package.json +2 -2
  130. package/fesm2022/ngx-t-forms-calculated-field-rules.component-BUKzXsXn.mjs +0 -316
  131. package/fesm2022/ngx-t-forms-calculated-field-rules.component-BUKzXsXn.mjs.map +0 -1
  132. package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-D6kwe89h.mjs +0 -238
  133. package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-D6kwe89h.mjs.map +0 -1
  134. package/fesm2022/ngx-t-forms-form-section-stepper.component-DFbYNeAi.mjs +0 -261
  135. package/fesm2022/ngx-t-forms-form-section-stepper.component-DFbYNeAi.mjs.map +0 -1
  136. package/fesm2022/ngx-t-forms-forms-builder-menu.component-DBEgmcSi.mjs +0 -348
  137. package/fesm2022/ngx-t-forms-forms-builder-menu.component-DBEgmcSi.mjs.map +0 -1
  138. package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-CQ76110I.mjs +0 -103
  139. package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-CQ76110I.mjs.map +0 -1
  140. package/fesm2022/ngx-t-forms-mat-slider-toggle-editor.component-DDR2JurF.mjs.map +0 -1
  141. package/fesm2022/ngx-t-forms-mscoa-segment-config.component-C9zKzzzX.mjs +0 -281
  142. package/fesm2022/ngx-t-forms-mscoa-segment-config.component-C9zKzzzX.mjs.map +0 -1
  143. package/fesm2022/ngx-t-forms-ngx-t-forms-DwsbmVlY.mjs.map +0 -1
  144. package/fesm2022/ngx-t-forms-pipeline-generator.component-CGKxfvvC.mjs +0 -727
  145. package/fesm2022/ngx-t-forms-pipeline-generator.component-CGKxfvvC.mjs.map +0 -1
  146. package/fesm2022/ngx-t-forms-required-inputs.component-Bktx1QGr.mjs +0 -188
  147. package/fesm2022/ngx-t-forms-required-inputs.component-Bktx1QGr.mjs.map +0 -1
  148. package/fesm2022/ngx-t-forms-t-workflow-picker.component-CezFgp2z.mjs +0 -171
  149. package/fesm2022/ngx-t-forms-t-workflow-picker.component-CezFgp2z.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngx-t-forms-pipeline-generator.component-QE-I58e4.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/pipeline-generator/elements/aggregate-stage-editor/aggregate-stage-editor.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/pipeline-generator/elements/aggregate-stage-editor/aggregate-stage-editor.component.html","../../../projects/ngx-t-forms/src/lib/services/hhtpResources/Pipeline/pipeline.service.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/pipeline-generator/pipeline-generator.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/pipeline-generator/pipeline-generator.component.html"],"sourcesContent":["import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport PipelineBuilder from \"db-aggregation-pipeline-builder\"\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { JsonEditorComponent } from '../../../json-editor/json-editor.component';\nimport { IAllowedStage } from '../../../../../../services/hhtpResources/Pipeline/pipeline.service';\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\n\nimport { MatSelectChange } from '@angular/material/select';\n\n@Component({\n selector: 'app-aggregate-stage-editor',\n templateUrl: './aggregate-stage-editor.component.html',\n styleUrls: ['./aggregate-stage-editor.component.scss'],\n standalone: true,\n\n imports: [\n MatModulesModule,\n CommonModule,\n FormsModule,\n JsonEditorComponent\n ]\n})\nexport class AggregateStageEditorComponent implements OnInit {\n subscription = new Subscription();\n @Input() selectedStage:any\n @Input() isRunningPipeline: boolean = false\n @Output() saveStage = new EventEmitter<IAllowedStage | undefined>()\n @Output() deleteStage = new EventEmitter<void>()\n ngOnDestroy(): void {\n this.subscription.unsubscribe()\n }\n\n constructor() {\n\n }\n activeStage: IAllowedStage | undefined = undefined; // Define the type appropriately if possible\n allowedStages: { stage: string; description: string; config: any }[] = [];\n configValidationError: string | undefined\n\n\n ngOnInit() {\n // Debounce the config change to optimize performance\n\n this.allowedStages = PipelineBuilder.getViewOnlyStages() as any\n }\n\n handleChange(event: MatSelectChange): void {\n \n const selectedStage = event.value\n if (this.activeStage === undefined) {\n this.activeStage = {\n stage: selectedStage,\n ...this.selectedStage || {},\n\n } as IAllowedStage\n } else {\n this.activeStage = {\n config : this.activeStage?.config|| this.selectedStage ?.config,\n stage: selectedStage\n } as IAllowedStage\n\n }\n { }\n if (this.activeStage?.config as any && !!this.activeStage?.stage) {\n\n this.validateConfig();\n\n }\n }\n\n handleConfigChange(event: any): void {\n if (!this.activeStage) {\n this.activeStage = {\n ...this.selectedStage || {},\n } as IAllowedStage\n }\n this.activeStage = {\n stage:this.activeStage?.stage || this.selectedStage ?.name,\n config: event.value\n } as IAllowedStage\n this.validateConfig();\n\n }\n validateConfig(): void {\n this.configValidationError = undefined\n const { config, stage } = this.activeStage || {} as IAllowedStage;\n\n // Check if config and stage are defined\n if (!config && config !== 0 || !stage) {\n console.error('Config or stage is not defined', config, stage);\n this.activeStage!.valid = false;\n return; // Early exit if validation fails\n }\n\n try {\n const valid = PipelineBuilder.validateStageConfig(stage as any, config);\n this.activeStage!.valid = valid;\n\n // Set error message if config is invalid\n if (!valid) {\n this.configValidationError = undefined\n return;\n }\n } catch (error: any) {\n // Catch and handle errors from validation\n this.configValidationError = error.message || JSON.stringify(error) || 'An unknown error occurred';\n this.activeStage!.valid = false;\n console.error('Validation Error:', this.configValidationError);\n }\n }\n\n canSaveConfig(): boolean {\n return !!this.activeStage && !this.configValidationError;\n }\n\n saveConfiguration(): void {\n // Logic for saving the configuration\n if (this.canSaveConfig()) {\n this.saveStage.emit(this.activeStage as IAllowedStage);\n \n }\n }\n\n trackByStage(index: number, stage: any): string {\n return stage.stage;\n }\n\n get allowedStageNames(): string[] {\n return this.allowedStages.map(stage => stage.stage);\n }\n\n\n get activeDescription() {\n return this.allowedStages.find(stage => stage.stage === this.activeStage?.stage)?.description\n\n\n }\n\n deleteActive() {\n this.deleteStage.emit()\n }\n // close() {\n // this.pipeline.setActiveStage(undefined)\n // }\n\n}\n","<mat-card style=\"margin-bottom:8px\">\n <mat-card-content>\n\n <h5>\n Aggregate Pipeline Stage Configuration\n </h5>\n\n\n\n <mat-form-field style=\" margin-bottom: 8px;\" appearance=\"outline\" subscriptSizing=\"dynamic\" >\n <mat-label>Select Aggregate Stage</mat-label>\n <mat-select matNativeControl [value]=\"selectedStage?.name\" (selectionChange)=\"handleChange($event)\"\n placeholder=\"ChooseFunctionToRun\">\n <mat-option *ngFor=\"let stage of allowedStages; trackBy: trackByStage\" [value]=\"stage.stage\">\n {{stage.stage}}</mat-option>\n\n\n\n </mat-select>\n <mat-hint>\n {{activeDescription ?\n 'Hover over the info icon to view stage details .'\n : 'Please select an aggregation function from the list.'}}\n </mat-hint>\n <mat-hint *ngIf=\"activeDescription\" align=\"end\">\n <mat-icon matTooltipHideDelay=\"1000\" [matTooltip]=\"activeDescription\" matSuffix>info</mat-icon>\n </mat-hint>\n </mat-form-field>\n\n\n\n <div class=\"tree-instructions\" style=\"background: cornsilk;\" *ngIf=\"configValidationError\">\n <mat-icon style=\"margin-top: 4px;margin-bottom:auto\" class=\"info-icon\" color=\"warn\">warning</mat-icon>\n <span>{{ configValidationError }}</span>\n </div>\n\n\n\n\n\n <div class=\"config-container\" *ngIf=\"activeStage ||selectedStage?.config\">\n <app-json-editor [value]=\"selectedStage?.config\" (valueChange)=\"handleConfigChange($event)\"></app-json-editor>\n </div>\n\n <br>\n\n\n\n </mat-card-content>\n <mat-divider>\n </mat-divider>\n <mat-card-actions>\n\n <span class=\"spacer\"></span>\n <button color=\"warn\" [disabled]=\"isRunningPipeline\" mat-button (click)=\"deleteActive()\">\n Delete\n <mat-icon >delete</mat-icon>\n </button>\n <button style=\"margin-left:8px;\" color=\"primary\" mat-flat-button (click)=\"saveConfiguration()\"\n [disabled]=\"isRunningPipeline ||!activeStage?.valid \">\n Save\n <mat-icon> save</mat-icon>\n </button>\n </mat-card-actions>\n</mat-card>","import { HttpClient } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { BehaviorSubject, catchError, combineLatest, filter, finalize, map, Observable, switchMap, take, tap, throwError } from 'rxjs';\r\nimport { PipelineStage } from 'mongoose'\r\n\r\nimport PipelineBuilder from \"db-aggregation-pipeline-builder\"\r\nimport { IPipelineGenerationError, IPipelineGenerationResponse, IRunPipelineResponse, PipelineStageEnum } from 'ngx-t-forms-types';\r\nexport interface IAllowedStage {\r\n stage: PipelineStageEnum,\r\n description: string,\r\n config: any,\r\n valid?:boolean\r\n\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PipelineService {\r\n //LOADING INDICATORS\r\n isRunningPipeline: boolean = false\r\n aiIsGeneratingPipeline: boolean = false\r\n isLoadingAllowedStages: boolean = false\r\n isLoadingWorkflowSchema: boolean = false\r\n\r\n //States \r\n workflowId$ = new BehaviorSubject<string|undefined>(undefined)\r\n activeStage$ = new BehaviorSubject<number|undefined>(undefined)\r\n prompt$ = new BehaviorSubject<string|undefined>(undefined)\r\n schemaLoadError$ = new BehaviorSubject<string|undefined>(undefined)\r\n \r\n\r\n pipeline$ = new BehaviorSubject<PipelineStage[]>([])\r\n threadId$ = new BehaviorSubject<string|undefined>(undefined)\r\n schema$ = new BehaviorSubject<Object|undefined>(undefined)\r\n allowedStages$ = new BehaviorSubject<IAllowedStage[]>([])\r\n pipeLineResult$ = new BehaviorSubject<unknown>([])\r\n chatHistory$ = new BehaviorSubject<{\r\n user: string,\r\n assistance:IPipelineGenerationResponse,\r\n date:Date\r\n }[]>([])\r\n http = inject(HttpClient)\r\n constructor() { \r\n //Set local storage threadId\r\n const threadId = localStorage.getItem('threadId')\r\n if(threadId){\r\n this.threadId$.next(threadId)\r\n }\r\n }\r\n\r\n get config$() {\r\n return this.workflowId$.pipe(\r\n switchMap(workflowId => this.pipeline$.pipe(\r\n switchMap(pipeline => this.pipeLineResult$.pipe(\r\n map(responseBody => ({ workflowId, pipeline, responseBody }))\r\n ))\r\n ))\r\n );\r\n }\r\n /**\r\n * Fetch available pipeline stages for the user to select and generate pipelines.\r\n * Ideally, this could be static or fetched from a backend.\r\n */\r\n runPipeLine(pipeline: PipelineStage[],workflowId:string): Observable<IRunPipelineResponse> {\r\n const url = \"http://localhost:5000/api/v1/pipelineBuilder/runPipeline\"\r\n // For now, returning a static list of pipeline stages. In a real application, you can fetch from an API.\r\n\r\n this.isRunningPipeline = true\r\n return this.http.post<IRunPipelineResponse>(\r\n url,\r\n { pipeline,workflowId }\r\n ).pipe(\r\n take(1),\r\n catchError(this.handleError), // Error handling for the HTTP request,\r\n finalize(() => this.isRunningPipeline = false)\r\n );\r\n }\r\n\r\n /**\r\n * Generate a MongoDB pipeline based on the given user prompt.\r\n * \r\n * @param prompt The user's input or description of the desired pipeline.\r\n */\r\n private generatePipeline(query: string, schema: Object | undefined,\r\n threadId:string|undefined, existingPipeline: PipelineStage[],previousError:string): Observable<IPipelineGenerationResponse> {\r\n if (!schema) {\r\n throw new Error(\"Schema is required\")\r\n }\r\n const payload = { query, schema ,threadId, existingPipeline ,previousError};\r\n const url = \"http://localhost:5000/api/v1/pipelineBuilder/generatePipeline\";\r\n this.aiIsGeneratingPipeline = true\r\n return this.http.post<IPipelineGenerationResponse>(`${url}`, payload)\r\n .pipe(\r\n take(1),\r\n catchError(this.handleError),// Error handling for the HTTP request,\r\n finalize(() => this.aiIsGeneratingPipeline = false)\r\n );\r\n }\r\n\r\n /**\r\n * Handle any errors from the HTTP request.\r\n * \r\n * @param error The error response from the HTTP request\r\n */\r\n private handleError(error: any): Observable<never> {\r\n console.error('An error occurred', error);\r\n // Return an observable with a user-facing error message\r\n return throwError(() => new Error('Something went wrong with the pipeline generation; please try again later.'));\r\n\r\n }\r\n\r\n\r\n private getSchema(workflowId: string): Observable<{\r\n schema: object\r\n }> {\r\n if(!workflowId){\r\n throw new Error(\"WorkflowId is required\")\r\n }\r\n const url = \"http://localhost:5000/api/v1/pipelineBuilder/getSchema\";\r\n return this.http.get<{ schema: object }>(`${url}`, { params: { workflowId: workflowId } }).pipe(\r\n take(1),\r\n catchError(this.handleError) // Error handling for the HTTP request\r\n )\r\n }\r\n/** OPERATIONS */\r\nisSchemaEmpty(object:object){\r\n\r\n}\r\n workflowChanged(event: any) {\r\n this.workflowId$.next(event)\r\n if(!event){\r\n return \r\n }\r\n this.getSchema(event).pipe(\r\n take(1),\r\n tap(({ schema }) => {\r\n this.schema$.next(schema)\r\n const isEmptySchema = Object.keys( schema)[0] === \"\" && Object.values(schema)[0] === \"Array<>\"\r\n const error = isEmptySchema \r\n ? \"Document schema is missing. Please ensure at least one document exists for the selected workflow.\" \r\n : undefined\r\n this.schemaLoadError$.next(error)\r\n console.log(\"Workflow schema loaded,run pipeline\")\r\n this.runActivePipeline()\r\n }),\r\n catchError((error) => {\r\n this.schemaLoadError$.next(\"Error loading schema\");\r\n return this.handleError(error);\r\n })\r\n ).subscribe()\r\n }\r\n\r\n \r\n setActiveStage(i:number|undefined){\r\n const index = this.activeStage$.getValue()\r\n if(index === i){\r\n this.activeStage$.next(undefined)\r\n return\r\n }\r\n this.activeStage$.next(i)\r\n\r\n \r\n }\r\n addStage(){\r\n const newPipeline = this.pipeline$.getValue().concat({} as any)\r\n this.pipeline$.next(newPipeline)\r\n }\r\n onTextChange(event: any) {\r\n this.prompt$.next(event)\r\n console.log(event)\r\n }\r\n promptSubmit() {\r\n // Use combineLatest to fetch the latest values from multiple sources\r\n combineLatest([this.schema$, this.threadId$, this.pipeline$,this.prompt$,this.chatHistory$])\r\n .pipe(\r\n take(1),\r\n tap(([schema, threadId, pipeline,prompt,history]) => {\r\n if (!schema || !prompt) {\r\n console.warn(`Missing values: schema ${schema} prompt ${prompt}`);\r\n }\r\n }),\r\n filter(([schema,,,prompt]) => !!schema && !!prompt ),\r\n switchMap(([schema, threadId, pipeline,prompt,history]) => {\r\n // Use a shallow copy of the pipeline\r\n const previousError = (history[history.length-1]?.assistance as any )?.error\r\n const pipelineCopy = pipeline.map(stage => JSON.parse(JSON.stringify(stage))) || [];\r\n console.info('Generating pipeline with prompt:',\r\n prompt, 'schema:', schema, 'threadId:', threadId, 'pipeline:', pipeline)\r\n return this.generatePipeline(prompt!, schema, threadId, pipelineCopy,previousError).pipe(\r\n map((response) => ({ ...response,history,prompt}))\r\n )\r\n }),\r\n tap((response) => {\r\n const { pipeline, threadId,history,prompt } = response;\r\n const historyRecord = {\r\n user: prompt as any,\r\n assistance: response,\r\n date:new Date()\r\n };\r\n \r\n // Use next with a concatenated value for chat history\r\n this.chatHistory$.next([...(history||[]), historyRecord]);\r\n this.pipeline$.next(pipeline);\r\n this.threadId$.next(threadId);\r\n \r\n // Store threadID locally\r\n localStorage.setItem('threadId', threadId);\r\n \r\n // Run the active pipeline after all state updates are complete\r\n console.log(\"prompt submitted run pipeline\")\r\n this.runActivePipeline();\r\n }),\r\n catchError((error:IPipelineGenerationError) => {\r\n \r\n console.error('Error response:', error.message || error);\r\n return this.handleError(error);\r\n })\r\n ).subscribe();\r\n\r\n }\r\n \r\n runActivePipeline() {\r\n const pipeline = [...(this.pipeline$.getValue().map(stage => (JSON.parse(JSON.stringify(stage))))||[])]\r\n const someAreNotValid = pipeline.some(stage=>Object.keys(stage).length ===0)\r\n if(pipeline.length === 0 || someAreNotValid ){\r\n return\r\n }\r\n try {\r\n PipelineBuilder.validatePipeline(pipeline)\r\n } catch (error) {\r\n console.error(error,pipeline)\r\n return\r\n }\r\n const workflowId = this.workflowId$.getValue()\r\n if (!workflowId) {\r\n return\r\n }\r\n \r\n this.runPipeLine(pipeline,workflowId).pipe(\r\n take(1),\r\n tap(({ results }) => {\r\n this.pipeLineResult$.next(results)\r\n }),\r\n catchError((error) => {\r\n console.error('Error response:', error);\r\n const err = JSON.parse(JSON.stringify(error))\r\n const errorMessage = err.error\r\n if(errorMessage){\r\n this.pipelineErrorLogAndRetry(errorMessage)\r\n }\r\n return this.handleError(error);\r\n })\r\n ).subscribe()\r\n }\r\n\r\n pipelineErrorLogAndRetry(message:string){\r\n const history = this.chatHistory$.getValue() \r\n const prompt = this.prompt$.getValue ()\r\n const historyRecord = {\r\n user: prompt as any,\r\n assistance: {\r\n message\r\n } as any,\r\n date:new Date()\r\n };\r\n this.chatHistory$.next([...(history||[]), historyRecord]);\r\n\r\n }\r\n get activeStage():Observable<{name:string,config:PipelineStage}|undefined>{\r\n return this.pipeline$.asObservable().pipe(\r\n switchMap(pipeline=>this.activeStage$.pipe(\r\n map(activeIndex=>activeIndex === undefined ? undefined : {\r\n name:Object.keys(pipeline[activeIndex]||{})[0] || '',\r\n config:(pipeline[activeIndex] as any)[Object.keys(pipeline[activeIndex]||{})?.[0]||'']\r\n })\r\n ))\r\n )\r\n \r\n }\r\n saveStage(index:number,stage: IAllowedStage | undefined) {\r\n const pipeline = this.pipeline$.getValue()\r\n if(index === undefined){\r\n return\r\n }\r\n const newPipeline = pipeline.map((s, i) => {\r\n if (i === index) {\r\n return stage ? {\r\n [stage.stage]: stage.config\r\n } : s;\r\n }\r\n return s;\r\n });\r\n\r\n console.log(\"newPipeline\",newPipeline)\r\n this.pipeline$.next(newPipeline as any)\r\n this.activeStage$.next(undefined)\r\n console.log(\"stage saved run pipeline\")\r\n this.runActivePipeline()\r\n \r\n }\r\n deleteStage(index:number){\r\n const pipeline = this.pipeline$.getValue()\r\n\r\n if(index === undefined){\r\n return\r\n }\r\n const newPipeline = pipeline.filter((s, i) => i !== index);\r\n console.log(\"newPipeline\",newPipeline)\r\n this.pipeline$.next(newPipeline as any)\r\n this.activeStage$.next(undefined)\r\n console.log(\"stage deleted run pipeline\")\r\n this.runActivePipeline()\r\n }\r\n get pipelineGeneralValid(){\r\n return this.pipeline$.asObservable().pipe(\r\n map(pipeline=>{\r\n const allHaveTypes = pipeline.every(stage=>Object.keys(stage).length === 1)\r\n if(!allHaveTypes){\r\n return {\r\n valid:false,\r\n message:\"All stages must be a valid pipeline stage\"\r\n }\r\n }\r\n const AllStagesMustHaveConfig = pipeline.every((stage: { [key: string]: any }) => stage[Object.keys(stage)?.[0]||''] !== undefined)\r\n if(!AllStagesMustHaveConfig){\r\n return {\r\n valid:false,\r\n message:\"All stages must have a configuration\"\r\n }\r\n }\r\n return {\r\n valid:true\r\n }\r\n })\r\n )\r\n }\r\n}","import { CommonModule } from '@angular/common';\r\n\r\nimport { Component, ElementRef, EventEmitter, HostBinding, inject, Input, OnDestroy, OnInit, Optional, Output, Self, ViewChild } from '@angular/core';\r\nimport { FormsModule, NgControl } from '@angular/forms';\r\n\r\n\r\n\r\n\r\nimport { AggregateStageEditorComponent } from './elements/aggregate-stage-editor/aggregate-stage-editor.component';\r\nimport { map, Subject, takeUntil, take, tap, Observable, distinctUntilChanged } from 'rxjs';\r\nimport { MongoDbPipeLineConfigInterface } from \"ngx-t-forms-types\";\r\n\r\nimport { TDynamicDataViewComponent } from '../../../t-dynamic-data-view/t-dynamic-data-view.component';\r\nimport { MatModulesModule } from '../../../../shared/modules/mat-modules.module';\r\nimport { TWorkflowPickerComponent } from '../t-workflow-picker/t-workflow-picker.component';\r\nimport { IWorkflowOption } from \"ngx-t-forms-types\";\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { IConfigElementError } from '../../t-dynamic-data-edit.component';\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../../../lib/injection-tokens';\r\nimport { PipelineService } from '../../../../../lib/services/hhtpResources/Pipeline/pipeline.service';\r\nimport { DaysAgoPipe } from '../../../../../lib/shared/pipes/date/days-ago.pipe';\r\n\r\nimport { OverlayModule } from '@angular/cdk/overlay';\r\n@Component({\r\n selector: 'app-pipeline-generator',\r\n templateUrl: './pipeline-generator.component.html',\r\n styleUrls: ['./pipeline-generator.component.scss'],\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n TWorkflowPickerComponent,\r\n FormsModule,\r\n TDynamicDataViewComponent,\r\n MatModulesModule,\r\n AggregateStageEditorComponent,\r\n DaysAgoPipe,\r\n OverlayModule\r\n\r\n ],\r\n providers: [{ provide: MatFormFieldControl, useExisting: PipelineGeneratorComponent }],\r\n})\r\nexport class PipelineGeneratorComponent implements OnInit, OnDestroy, MatFormFieldControl<MongoDbPipeLineConfigInterface> {\r\n static nextId = 0;\r\n stateChanges = new Subject<void>();\r\n NGX_T_FORMS_CONFIG = inject(NGX_T_FORMS_CONFIG_TOKEN)\r\n @HostBinding() id = `app-pipeline-generator-${PipelineGeneratorComponent.nextId++}`;\r\n constructor(@Optional() @Self() public ngControl: NgControl, private _elementRef: ElementRef<HTMLElement>,) {\r\n }\r\n placeholder: string = ''\r\n\r\n focused: boolean = false;\r\n get empty() {\r\n return !this.value\r\n }\r\n get shouldLabelFloat() {\r\n return this.focused || !this.empty;\r\n }\r\n required: boolean = false;\r\n @Input() disabled: boolean = false;\r\n get errorState(): boolean {\r\n const hasError = !!this.ngControl?.control?.errors || (this.errors || []).length > 0 && this.touched\r\n\r\n return !this.value && !!this.required || hasError\r\n }\r\n\r\n controlType?: string | undefined;\r\n autofilled?: boolean | undefined;\r\n userAriaDescribedBy?: string | undefined;\r\n disableAutomaticLabeling?: boolean | undefined;\r\n setDescribedByIds(ids: string[]) {\r\n // Ensure the component view is initialized\r\n if (this._elementRef && this._elementRef.nativeElement) {\r\n const controlElement = this._elementRef.nativeElement.querySelector('.app-pipeline-generator');\r\n // Check if the controlElement exists before attempting to set its attribute\r\n if (controlElement) {\r\n controlElement.setAttribute('aria-describedby', ids.join(' '));\r\n }\r\n }\r\n }\r\n onContainerClick(event: MouseEvent): void {\r\n this.markAsTouched();\r\n this.stateChanges.next();\r\n }\r\n\r\n touched: boolean = false;\r\n onTouched = () => { };\r\n markAsTouched() {\r\n console.log('markAsTouched')\r\n if (!this.touched) {\r\n this.onTouched();\r\n this.touched = true;\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n //@ViewChild('textarea', { static: false }) textareaRef!: HTMLTextAreaElement\r\n @ViewChild('textarea', { read: ElementRef, static: false }) textareaElementRef!: ElementRef;\r\n @Input() set value(value: MongoDbPipeLineConfigInterface) {\r\n const workflowIdChanged = this._value?.workflowId !== value?.workflowId\r\n const pipelineLengthChanged = this._value?.pipeline?.length !== value?.pipeline?.length\r\n const pipeLineContentChanged = JSON.stringify(this._value?.pipeline) !== JSON.stringify(value?.pipeline)\r\n if (workflowIdChanged || pipelineLengthChanged || pipeLineContentChanged) {\r\n\r\n this._value = value\r\n if (value?.workflowId) {\r\n this.workflowChanged(value?.workflowId)\r\n }\r\n\r\n console.log('Pipeline value changed', value, this.pipeline.pipeline$.value)\r\n if (value?.pipeline) {\r\n this.pipeline.pipeline$.next(value?.pipeline || [])\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n\r\n\r\n workflows$: Observable<IWorkflowOption[] | undefined> | undefined\r\n @Input() set getWorkflowOptions(options$: Observable<IWorkflowOption[] | undefined> | undefined) {\r\n this.workflows$ = options$\r\n\r\n }\r\n @Input() userName: string | undefined\r\n _value!: MongoDbPipeLineConfigInterface\r\n @Output() valueChanged = new EventEmitter<MongoDbPipeLineConfigInterface>()\r\n\r\n @Input() errors: IConfigElementError[] | undefined = [];\r\n destroy$ = new Subject<void>()\r\n private pipeline: PipelineService = new PipelineService()\r\n\r\n ngOnInit(): void {\r\n this.initiateSubscription()\r\n\r\n\r\n }\r\n initiated: boolean = false\r\n initiateSubscription = () => {\r\n this.pipeline.config$.pipe(\r\n takeUntil(this.destroy$),\r\n distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr))\r\n ).subscribe(config => {\r\n if (!this.initiated) {\r\n this.initiated = true\r\n return\r\n }\r\n\r\n const newConfig: any = {\r\n ...this._value,\r\n ...config,\r\n name: this._workflowName || 'Unnamed Pipeline',\r\n \"source\": \"mongoPipeline\",\r\n\r\n }\r\n console.log('Pipeline config changed', newConfig)\r\n this.valueChanged.emit(newConfig)\r\n })\r\n\r\n\r\n }\r\n ngOnDestroy(): void {\r\n this.destroy$.next()\r\n this.destroy$.complete()\r\n }\r\n workflowChanged(event: any) {\r\n this.pipeline.workflowChanged(event)\r\n }\r\n _workflowName: string | undefined\r\n workflowNameChanged(event: string | undefined) {\r\n this._workflowName = event\r\n\r\n }\r\n\r\n get workflowId() {\r\n return this.pipeline.workflowId$.asObservable()\r\n }\r\n get stages() {\r\n return this.pipeline.pipeline$.asObservable().pipe(\r\n map(stages => stages.map(stage => ({\r\n name: Object.keys(stage)[0],\r\n stage: Object.keys(stage)[0],\r\n config: (stage as any)[Object.keys(stage)?.[0] || ''],\r\n valid: !!Object.keys(stage)[0] && !!(stage as any)[Object.keys(stage)?.[0] || '']\r\n })))\r\n )\r\n }\r\n get pipeLineResults() {\r\n return this.pipeline.pipeLineResult$.asObservable()\r\n }\r\n get prompt() {\r\n return this.pipeline.prompt$.asObservable()\r\n }\r\n get aiIsGeneratingPipeline() {\r\n return this.pipeline.aiIsGeneratingPipeline\r\n }\r\n get activeStageIndex() {\r\n return this.pipeline.activeStage$.asObservable()\r\n }\r\n get activeStage() {\r\n console.log(this.pipeline.activeStage)\r\n return this.pipeline.activeStage\r\n }\r\n get isRunningPipeline() {\r\n return this.pipeline.isRunningPipeline\r\n }\r\n get cannotAddStage() {\r\n return this.pipeline.pipelineGeneralValid.pipe(\r\n map(valid => !valid)\r\n )\r\n }\r\n get schemaLoadError$() {\r\n return this.pipeline.schemaLoadError$.asObservable()\r\n }\r\n get chatHistory() {\r\n return this.pipeline.chatHistory$.asObservable()\r\n }\r\n cursorPosition = 0\r\n showSuggestions = false;\r\n onTextChange(event: Event) {\r\n if (!this.textareaElementRef?.nativeElement) {\r\n return;\r\n }\r\n console.log('onTextChange', event)\r\n const newValue = (event.target as HTMLInputElement).value;\r\n const textarea = this.textareaElementRef.nativeElement;\r\n this.cursorPosition = textarea.selectionStart || 0;\r\n\r\n const lastChar = newValue[this.cursorPosition - 1];\r\n const match = newValue.slice(0, this.cursorPosition).match(/\\$(\\w*)$/);\r\n\r\n if (lastChar === '$' || (match && match[1] !== undefined)) {\r\n this.showSuggestions = true;\r\n this.optionsSearch = match ? match?.[1] || '' : '';\r\n } else {\r\n this.showSuggestions = false;\r\n this.optionsSearch = '';\r\n }\r\n\r\n this.pipeline.onTextChange(newValue);\r\n }\r\n selectSuggestionInput(suggestion: string) {\r\n this.pipeline.prompt$.asObservable().pipe(\r\n take(1),\r\n tap(prompt => {\r\n const match = prompt?.slice(0, this.cursorPosition).match(/\\$(\\w*)$/);\r\n const beforeCursor = prompt?.slice(0, match ? match.index : this.cursorPosition - 1);\r\n const afterCursor = prompt?.slice(this.cursorPosition);\r\n prompt = beforeCursor + suggestion + ' ' + afterCursor;\r\n this.pipeline.prompt$.next(prompt);\r\n this.applyNewValueToPrompt(suggestion);\r\n })\r\n ).subscribe();\r\n }\r\n applyNewValueToPrompt(suggestion: any) {\r\n this.showSuggestions = false;\r\n\r\n const textarea = this.textareaElementRef.nativeElement;\r\n textarea.focus();\r\n const newCursorPosition = this.cursorPosition + suggestion.length;\r\n setTimeout(() => {\r\n textarea.setSelectionRange(newCursorPosition, newCursorPosition);\r\n }, 0);\r\n }\r\n optionsSearch = ''\r\n onSearchChange(event: any) {\r\n this.optionsSearch = event.detail.value\r\n\r\n }\r\n promptSubmit() {\r\n this.pipeline.promptSubmit()\r\n console.log('promptSubmit')\r\n }\r\n trackById = (index: number, stage: any) => index\r\n\r\n setActiveStage(index: number | undefined) {\r\n\r\n this.pipeline.setActiveStage(index)\r\n }\r\n addStage() {\r\n this.pipeline.addStage()\r\n }\r\n get getSchemaProperties() {\r\n return this.pipeline.schema$.asObservable().pipe(\r\n map(schema =>\r\n Object.keys(schema || {}).map(key => ({ label: key, value: key, })).filter(key => this.optionsSearch ? key.label.toLowerCase().includes(this.optionsSearch.toLowerCase()) : true)\r\n )\r\n )\r\n }\r\n deleteStage(index: number) {\r\n this.pipeline.deleteStage(index)\r\n }\r\n saveStage(index: number, stage: any) {\r\n this.pipeline.saveStage(index, stage)\r\n this.setActiveStage(undefined)\r\n }\r\n}\r\n","\r\n\r\n\r\n<section class=\"ion-margin\">\r\n <p>MongoDB aggregation pipeline builder for selected workflows. </p>\r\n</section>\r\n<lib-t-workflow-picker \r\n(valueChanged)=\"workflowChanged($event)\"\r\n(workflowNameChanged)=\"workflowNameChanged($event)\" \r\n[getWorkflowOptions]=\" workflows$\"\r\n [value]=\"(workflowId|async)||undefined\">\r\n</lib-t-workflow-picker>\r\n<mat-accordion multi *ngIf=\"workflowId|async\">\r\n <!-- Pipeline Accordion -->\r\n <mat-expansion-panel value=\"pipeline\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <mat-spinner color=\"accent\" *ngIf=\"isRunningPipeline\" class=\"header-spinner\"></mat-spinner>\r\n <mat-icon class=\"title-icon\">\r\n dynamic_form\r\n </mat-icon>\r\n {{isRunningPipeline?'Executing current Data pipeline...':'Data retrieval pipeline'}}\r\n </mat-panel-title>\r\n\r\n </mat-expansion-panel-header>\r\n <div class=\"content\">\r\n <!-- Mongodb aggregate pipelione stages management and edit start-->\r\n <div *ngIf=\"((stages | async)?.length || 0) ===0\" class=\"tree-instructions\">\r\n <mat-icon class=\"info-icon\" color=\"primary\">info</mat-icon>\r\n <span>\r\n Add stages to the pipeline below.<br>\r\n Each stage processes input documents by filtering, grouping, or calculating values. The output documents from\r\n one stage are passed to the next stage in the pipeline.\r\n </span>\r\n </div>\r\n\r\n <mat-nav-list style=\" background: var(--mat-tree-container-background-color);padding:0px;border-radius:8px\">\r\n\r\n\r\n <ng-container *ngFor=\"let stage of stages | async; trackBy: trackById;index as $index;last as isLast\">\r\n <mat-list-item [style.margin-top]=\"(activeStageIndex|async) ===$index?'4px':'0px'\"\r\n [class.mat-elevation-z8]=\"(activeStageIndex|async) ===$index\" class=\"stage-item\"\r\n (click)=\"setActiveStage($index)\" [activated]=\" (activeStageIndex|async) ===$index\">\r\n <span class=\"stage-index\" matListItemAvatar>{{$index + 1}} </span>\r\n <div matListItemTitle>\r\n <div style=\"line-height: normal;\">\r\n {{ stage.name || 'Stage ' }}\r\n </div>\r\n <div class=\"stage-inner-message\" *ngIf=\"!stage.name && (activeStageIndex|async) !==$index \">\r\n Incomplete , click to edit\r\n </div>\r\n\r\n </div>\r\n\r\n <button *ngIf=\"(activeStageIndex|async) ===$index||!stage.valid && (activeStageIndex|async) !==$index\"\r\n mat-icon-button matListItemMeta>\r\n <mat-icon color=\"primary\" *ngIf=\"(activeStageIndex|async) ===$index\">check_circle</mat-icon>\r\n\r\n <mat-icon color=\"warn\" *ngIf=\"!stage.valid && (activeStageIndex|async) !==$index\">\r\n warning\r\n </mat-icon>\r\n </button>\r\n </mat-list-item>\r\n <mat-divider></mat-divider>\r\n\r\n <app-aggregate-stage-editor [selectedStage]=\"stage\" [isRunningPipeline]=\"isRunningPipeline\"\r\n (deleteStage)=\"deleteStage($index)\" (saveStage)=\"saveStage($index,$event)\"\r\n *ngIf=\"(activeStageIndex|async) ===$index\"></app-aggregate-stage-editor>\r\n\r\n\r\n </ng-container>\r\n\r\n <mat-toolbar style=\"padding: 0px;\">\r\n\r\n <span class=\"spacer\"></span>\r\n <button class=\"stage-button\" [disabled]=\"isRunningPipeline\" color=\"primary\" (click)=\"addStage()\"\r\n mat-raised-button>\r\n Add\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n </mat-toolbar>\r\n </mat-nav-list>\r\n\r\n <!-- Mongodb aggregate pipelione stages management and edit end -->\r\n </div>\r\n </mat-expansion-panel>\r\n\r\n <!-- Results Accordion -->\r\n <mat-expansion-panel value=\"results\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <mat-spinner color=\"accent\" *ngIf=\"isRunningPipeline\" class=\"header-spinner\"></mat-spinner>\r\n <mat-icon class=\"title-icon\">dataset</mat-icon>\r\n {{isRunningPipeline?'Running pipeline...':'Data Results'}}\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <div class=\"content\">\r\n <ng-container *ngIf=\"pipeLineResults | async as results; else noResults\">\r\n\r\n <lib-t-dynamic-data-view *ngIf=\"results\" [data]=\"results\"></lib-t-dynamic-data-view>\r\n <p *ngIf=\"!results\" color=\"medium\">\r\n\r\n No results available\r\n\r\n </p>\r\n\r\n </ng-container>\r\n <ng-template #noResults>\r\n <p color=\"medium\">No results available</p>\r\n </ng-template>\r\n </div>\r\n </mat-expansion-panel>\r\n\r\n <!-- AI Agent Accordion -->\r\n <mat-expansion-panel value=\"ai\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <mat-spinner *ngIf=\" aiIsGeneratingPipeline \" style=\"position: absolute;\" class=\"header-spinner\"></mat-spinner>\r\n <mat-icon class=\"title-icon\">tips_and_updates</mat-icon>\r\n {{ aiIsGeneratingPipeline ? 'Agent busy ...' : 'AI AGENT prompt' }}\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <div class=\"content\">\r\n @if( schemaLoadError$ | async){\r\n <div class=\"tree-instructions\" style=\"background: antiquewhite !important;\">\r\n <mat-icon class=\"info-icon\" color=\"warn\">error</mat-icon>\r\n <span> {{ schemaLoadError$ | async }}</span>\r\n </div>\r\n \r\n }\r\n <mat-list *ngFor=\"let chat of chatHistory|async;\">\r\n\r\n <mat-list-item class=\"chatContent chatItem\">\r\n <div class=\"chat\" style=\"background:bisque;text-align:end;\r\n border-radius: 18px 18px 0px 18px;\" matListItemTitle>\r\n <div>\r\n {{chat.user}}\r\n </div>\r\n <div style=\"opacity:0.6;line-height: normal;display: flex;align-items: center;justify-content: flex-end;\">\r\n {{chat.date|daysAgo}}\r\n <mat-icon class=\"sent-icon\">\r\n done_all\r\n </mat-icon>\r\n </div>\r\n </div>\r\n </mat-list-item>\r\n\r\n <mat-list-item style=\"margin-top: 16px;\" class=\"chatContent chatItem\" color=\"light\" lines=\"full\">\r\n <mat-icon style=\" margin-left: 0px;\r\n margin-top: 16px;\r\n margin-bottom: auto;\" matListItemIcon>smart_toy</mat-icon>\r\n <div class=\"chat\" style=\"text-align: left; \r\n padding-left: 16px; \r\n background: azure;\r\n border-radius: 0px 18px 18px 18px;\" *ngIf=\"!chat.assistance?.error\" matListItemTitle>\r\n <pre>\r\n {{chat. assistance.pipeline |json}}\r\n </pre>\r\n </div>\r\n <div *ngIf=\"chat.assistance?.error\" matListItemTitle>\r\n {{chat.assistance.error}}\r\n </div>\r\n </mat-list-item>\r\n\r\n\r\n </mat-list>\r\n <mat-list>\r\n <mat-list-item class=\"chatContent chatItem\">\r\n <textarea matListItemTitle #textarea style=\" width: calc(100% - 13px);\r\n border-radius: 14px;\r\n padding-right: 3px;\r\n padding-left: 8px;\" class=\"chat\" [value]=\" prompt|async\" (input)=\"onTextChange($event)\"\r\n placeholder=\"Provide a pipeline generation prompt\"></textarea>\r\n <button matListItemMeta style=\" margin-left: 4px;\r\n margin-right: 0px;\" color=\"primary\" mat-mini-fab [disabled]=\"aiIsGeneratingPipeline\" (click)=\"promptSubmit()\">\r\n\r\n <mat-icon style=\"margin: 0px !important;color:white\">send</mat-icon>\r\n <mat-spinner color=\"accent\" *ngIf=\" aiIsGeneratingPipeline \" \r\n class=\"submit-spinner\" ></mat-spinner>\r\n </button>\r\n \r\n </mat-list-item>\r\n\r\n </mat-list>\r\n\r\n\r\n <section *ngIf=\"showSuggestions\" class=\"showSuggestionContainer\">\r\n <!-- <mat-toolbar class=\"search-container\" style=\"background: inherit;\">\r\n\r\n\r\n <input type=\"search\" placeholder=\"Search options\" class=\"search-field\" (change)=\"onSearchChange($event)\">\r\n\r\n <mat-icon>\r\n search\r\n </mat-icon>\r\n </mat-toolbar> -->\r\n <mat-divider></mat-divider>\r\n <div style=\"padding: 8px;\">\r\n <div class=\"suggestion-container\">\r\n <div class=\"suggestion-column\">\r\n <h5>Collection document properties</h5>\r\n <div class=\"button-container\">\r\n <button *ngFor=\"let method of getSchemaProperties | async;trackBy: trackById\"\r\n (click)=\"selectSuggestionInput(method.value)\" color=\"accent\" mat-flat-button\r\n class=\"suggestion-button\">\r\n {{ method.label | titlecase }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n </div>\r\n </section>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n </div>\r\n </mat-expansion-panel>\r\n</mat-accordion>\r\n\r\n\r\n\r\n\r\n<ng-template\r\n cdkConnectedOverlay\r\n [cdkConnectedOverlayOpen]=\"disabled\"\r\n>\r\n<div style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5);\">\r\n\r\n\r\n</div>\r\n</ng-template>\r\n"],"names":["i8","i2","i3","i6","i9","i10"],"mappings":"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"}
@@ -0,0 +1,270 @@
1
+ import * as i2 from '@angular/common';
2
+ import { CommonModule } from '@angular/common';
3
+ import * as i0 from '@angular/core';
4
+ import { EventEmitter, Output, Input, HostBinding, Optional, Self, Component } from '@angular/core';
5
+ import { MatFormFieldControl } from '@angular/material/form-field';
6
+ import { _ as _isEqual, T as TDynamicDataEditComponent, a as assignDeepPropertyToObject, s as safeReturnDeepProperty, M as MatModulesModule } from './ngx-t-forms-ngx-t-forms-CD9InaXz.mjs';
7
+ import { Subject } from 'rxjs';
8
+ import { coerceBooleanProperty } from '@angular/cdk/coercion';
9
+ import * as i9 from '@angular/cdk/portal';
10
+ import { ComponentPortal } from '@angular/cdk/portal';
11
+ import * as i9$1 from '@angular/material/table';
12
+ import { MatTableDataSource } from '@angular/material/table';
13
+ import * as i1 from '@angular/forms';
14
+ import * as i2$1 from '@angular/material/button';
15
+ import * as i3 from '@angular/material/card';
16
+ import * as i4 from '@angular/material/divider';
17
+ import * as i5 from '@angular/material/expansion';
18
+ import * as i2$2 from '@angular/material/icon';
19
+ import * as i3$1 from '@angular/material/progress-spinner';
20
+ import * as i8 from '@angular/material/tooltip';
21
+
22
+ class RecordListManagerComponent {
23
+ static { this.nextId = 0; }
24
+ get required() {
25
+ return this._required;
26
+ }
27
+ set required(value) {
28
+ this._required = coerceBooleanProperty(value);
29
+ this.stateChanges.next();
30
+ }
31
+ get value() {
32
+ return this.dataSource.data;
33
+ }
34
+ set value(val) {
35
+ this.dataSource.data = val || [];
36
+ this.onChange(val); // Notify Angular Forms of the change
37
+ this.stateChanges.next();
38
+ }
39
+ get placeholder() {
40
+ return this._placeholder;
41
+ }
42
+ set placeholder(value) {
43
+ this._placeholder = value;
44
+ this.stateChanges.next();
45
+ }
46
+ get shouldLabelFloat() {
47
+ return this.focused || !this.empty;
48
+ }
49
+ get empty() {
50
+ return !this.value || this.value.length === 0;
51
+ }
52
+ get errorState() {
53
+ return !this.value && this.required && this.touched || !!this.ngControl?.errors || (this.errors || []).length > 0;
54
+ }
55
+ // --- ControlValueAccessor & Lifecycle ---
56
+ constructor(ngControl, _elementRef) {
57
+ this.ngControl = ngControl;
58
+ this._elementRef = _elementRef;
59
+ // --- MatFormFieldControl Boilerplate ---
60
+ this.stateChanges = new Subject();
61
+ this.focused = false;
62
+ this.touched = false;
63
+ this.disabled = false;
64
+ this.controlType = 'lib-record-list-manager';
65
+ this.autofilled = false;
66
+ this.errors = [];
67
+ // REMOVED: Redundant valueChange EventEmitter. ControlValueAccessor's `onChange` handles this.
68
+ this._required = false;
69
+ this._placeholder = '';
70
+ this.id = `lib-record-list-manager-${RecordListManagerComponent.nextId++}`;
71
+ this.describedBy = '';
72
+ // ControlValueAccessor methods
73
+ this.onChange = (_) => { };
74
+ this.onTouched = () => { };
75
+ // --- Component-Specific Properties & Logic ---
76
+ this.dataSource = new MatTableDataSource();
77
+ this.formInputs = [];
78
+ this._secondaryElementEditorConfig = [];
79
+ // State for the item currently being added or edited
80
+ this.inEdit = null;
81
+ this.dynamicEditorPortals = {};
82
+ this.portalSubscriptions = new Map();
83
+ this.valueChange = new EventEmitter();
84
+ if (this.ngControl != null) {
85
+ this.ngControl.valueAccessor = this;
86
+ }
87
+ }
88
+ ngOnDestroy() {
89
+ this.stateChanges.complete();
90
+ this.portalSubscriptions.forEach(sub => sub.unsubscribe());
91
+ this.portalSubscriptions.clear();
92
+ }
93
+ writeValue(value) {
94
+ this.dataSource.data = value || [];
95
+ this.stateChanges.next();
96
+ }
97
+ registerOnChange(fn) {
98
+ this.onChange = fn;
99
+ }
100
+ registerOnTouched(fn) {
101
+ this.onTouched = fn;
102
+ }
103
+ setDisabledState(isDisabled) {
104
+ this.disabled = isDisabled;
105
+ this.stateChanges.next();
106
+ }
107
+ // MatFormFieldControl methods
108
+ setDescribedByIds(ids) {
109
+ this._elementRef?.nativeElement.setAttribute('aria-describedby', ids.join(' '));
110
+ }
111
+ onContainerClick(event) {
112
+ if (!this.focused) {
113
+ this.focused = true;
114
+ this.stateChanges.next();
115
+ }
116
+ }
117
+ markAsTouched() {
118
+ if (!this.touched) {
119
+ this.touched = true;
120
+ this.onTouched();
121
+ this.stateChanges.next();
122
+ }
123
+ }
124
+ set editorConfig(value) {
125
+ if (!_isEqual(this._editorConfig, value)) {
126
+ this._editorConfig = value;
127
+ this.secondaryElementEditorConfig = value?.secondaryElementEditorConfig || [];
128
+ }
129
+ }
130
+ get editorConfig() {
131
+ return this._editorConfig;
132
+ }
133
+ set secondaryElementEditorConfig(value) {
134
+ if (_isEqual(this._secondaryElementEditorConfig, value))
135
+ return;
136
+ this._secondaryElementEditorConfig = value;
137
+ this.dynamicEditorPortals = {};
138
+ this._secondaryElementEditorConfig.forEach(section => {
139
+ section.elements.forEach(ele => {
140
+ this.dynamicEditorPortals[ele.id] = new ComponentPortal(TDynamicDataEditComponent);
141
+ });
142
+ });
143
+ }
144
+ get secondaryElementEditorConfig() {
145
+ return this._secondaryElementEditorConfig;
146
+ }
147
+ get tableColsConfig() {
148
+ return [
149
+ ...(this.editorConfig?.options || []),
150
+ { label: ' ', value: 'actions' }
151
+ ];
152
+ }
153
+ get displayedColumns() {
154
+ return this.tableColsConfig.map(c => c.value);
155
+ }
156
+ // --- Component Methods ---
157
+ addNewItem() {
158
+ this.inEdit = {};
159
+ }
160
+ saveRecord() {
161
+ if (!this.inEdit)
162
+ return;
163
+ let newValue;
164
+ if (this.inEdit.id) {
165
+ // Update existing item
166
+ newValue = this.value.map(item => item.id === this.inEdit.id ? this.inEdit : item);
167
+ }
168
+ else {
169
+ // Add new item
170
+ const newItem = { ...this.inEdit, id: crypto.randomUUID() };
171
+ newValue = [...this.value, newItem];
172
+ }
173
+ this.value = newValue; // This setter will call `onChange` to update the form model.
174
+ this.inEdit = null;
175
+ this.valueChange.emit(this.value);
176
+ }
177
+ removeItem(item) {
178
+ this.value = this.value.filter(i => i.id !== item.id);
179
+ if (this.inEdit?.id === item.id) {
180
+ this.inEdit = null;
181
+ }
182
+ this.valueChange.emit(this.value);
183
+ }
184
+ onPortalAttached(portalRef, element) {
185
+ const componentRef = portalRef;
186
+ // 1. Set inputs on the dynamically created component
187
+ componentRef.instance.formInputs = this.formInputs;
188
+ componentRef.instance.editorConfig = element;
189
+ componentRef.instance.data = this.inEdit;
190
+ // 2. Subscribe to the dynamic component's output
191
+ const sub = componentRef.instance.valueChange.subscribe(event => {
192
+ const newinEdit = JSON.parse(JSON.stringify(this.inEdit));
193
+ assignDeepPropertyToObject(newinEdit, element.deepBind, event);
194
+ this.inEdit = newinEdit;
195
+ componentRef.instance.data = this.inEdit;
196
+ //mark for check
197
+ componentRef.changeDetectorRef.markForCheck();
198
+ console.error('inEdit updated:', this.inEdit, event);
199
+ });
200
+ // 3. Store subscription for cleanup in ngOnDestroy
201
+ this.portalSubscriptions.set(element.id, sub);
202
+ }
203
+ /**
204
+ * Determines if the record is in a savable state by checking that all
205
+ * required fields have a valid, non-empty value.
206
+ * @returns {boolean} True if the record can be saved, otherwise false.
207
+ */
208
+ get canSaveRecord() {
209
+ // Guard clause: Exit early if not in an editable state.
210
+ if (!this.inEdit || !this.editorConfig) {
211
+ return false;
212
+ }
213
+ // Iterate through each section and its elements directly.
214
+ for (const section of this.secondaryElementEditorConfig) {
215
+ for (const element of section.elements) {
216
+ // If an element is required, check its value.
217
+ if (element.required) {
218
+ const { value } = safeReturnDeepProperty(this.inEdit, element.deepBind || []);
219
+ // If any required value is empty (null, undefined, or ''),
220
+ // the record cannot be saved. We can stop checking immediately.
221
+ // Note: `value == null` checks for both `null` and `undefined`.
222
+ if (value == null || value === '') {
223
+ return false;
224
+ }
225
+ }
226
+ }
227
+ }
228
+ // If the loop completes, it means all required fields have valid values.
229
+ return true;
230
+ }
231
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: RecordListManagerComponent, deps: [{ token: i1.NgControl, optional: true, self: true }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
232
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: RecordListManagerComponent, isStandalone: true, selector: "lib-record-list-manager", inputs: { mapToData: "mapToData", disabled: "disabled", errors: "errors", required: "required", value: "value", placeholder: "placeholder", formInputs: "formInputs", editorConfig: "editorConfig" }, outputs: { valueChange: "valueChange" }, host: { properties: { "id": "this.id", "attr.aria-describedby": "this.describedBy", "class.floating": "this.shouldLabelFloat" } }, providers: [{ provide: MatFormFieldControl, useExisting: RecordListManagerComponent, }], ngImport: i0, template: "<!--- Secondary config -->\r\n\r\n<mat-card>\r\n <div class=\"table-container\">\r\n <table mat-table [dataSource]=\"dataSource\" class=\"example-table \">\r\n <!-- Number Column -->\r\n @for (col of tableColsConfig; track col.value) {\r\n <ng-container [matColumnDef]=\"col.value\">\r\n <th mat-header-cell *matHeaderCellDef>{{col.label}}</th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n @if(col.value === 'actions') {\r\n <button\r\n (click)=\"inEdit = row\"\r\n mat-icon-button matTooltip=\"Edit\" aria-label=\"edit record\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button (click)=\"removeItem(row)\" mat-icon-button color=\"warn\" matTooltip=\"Delete\"\r\n aria-label=\"Delete record\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }@else {\r\n {{row[col.value]}}\r\n }\r\n\r\n </td>\r\n </ng-container>\r\n }\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\r\n </table>\r\n @if(value.length === 0 ){\r\n <div style=\" display: flex;align-items: center;gap: 8px;padding: 16px;\" class=\"empty-message\">\r\n <mat-icon style=\"min-width: 24px;\">\r\n info</mat-icon>\r\n <span>\r\n No records found. Click the <strong>Add</strong> button to get started.\r\n\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n\r\n\r\n\r\n @if(inEdit){\r\n <div class=\"table-container\">\r\n <ng-container *ngTemplateOutlet=\"itemEdit\">\r\n </ng-container>\r\n </div>\r\n\r\n <mat-card-actions align=\"end\">\r\n <button (click)=\"inEdit=null\" mat-button color=\"primary\">\r\n Cancel\r\n </button>\r\n <button (click)=\"saveRecord()\" [disabled]=\"canSaveRecord === false\" mat-stroked-button color=\"primary\">\r\n {{inEdit.id? 'Update':'Save new'}} Record \r\n <mat-icon>\r\n save\r\n </mat-icon>\r\n </button>\r\n </mat-card-actions>\r\n }@else{\r\n <mat-card-actions>\r\n <span class=\"spacer\"></span>\r\n <span style=\"font-size: small;\r\n opacity: 0.6; margin-right: 16px;\">\r\n Records ({{ (value || []).length }}):\r\n </span>\r\n \r\n <button (click)=\"addNewItem()\" mat-stroked-button color=\"primary\" matTooltip=\"Add a new record\"\r\n aria-label=\"Add a new record\">\r\n <mat-icon>add</mat-icon>\r\n Add Record\r\n </button>\r\n </mat-card-actions>\r\n }\r\n\r\n</mat-card>\r\n\r\n\r\n<ng-template #itemEdit>\r\n\r\n <mat-accordion class=\"record-editor\" togglePosition=\"after\">\r\n @for(section of (secondaryElementEditorConfig||[]); track section.id) {\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{section.label}}\r\n <span class=\"spacer\"></span>\r\n\r\n <span class=\"showItemValue\" *ngIf=\"section.showItemValue && !!(inEdit)\">\r\n {{inEdit[section.showItemValue]}}\r\n </span>\r\n <mat-divider style=\"position: absolute; left:0px; width:100%; bottom:0px;\"></mat-divider>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n\r\n <!-- Element type selector (only in first section) -->\r\n @for(element of section.elements; track element.id) {\r\n <p style=\"margin-bottom: 16px; margin-top: 8px;\">\r\n\r\n @defer (on viewport) {\r\n <ng-template (attached)=\"onPortalAttached($event, element)\"\r\n [cdkPortalOutlet]=\"dynamicEditorPortals[element.id]\"></ng-template>\r\n\r\n\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=\"18\"></mat-spinner>\r\n </div>\r\n }\r\n </p>\r\n }\r\n </mat-expansion-panel>\r\n }\r\n </mat-accordion>\r\n\r\n\r\n</ng-template>", styles: [".record-list-item{height:38px;padding-left:4px}.remove-button{visibility:hidden}.record-list-item:hover{.remove-button{visibility:visible}}.item-edit-container{padding-left:8px;width:100%;display:flex;flex-direction:column}.table-container{padding:8px}.mat-column-actions{max-width:52px;padding:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatModulesModule }, { kind: "component", type: i2$1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i2$1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i3.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i3.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "component", type: i4.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i5.MatAccordion, selector: "mat-accordion", inputs: ["hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i5.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i5.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i5.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "component", type: i2$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3$1.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i9$1.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i9$1.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i9$1.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i9$1.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i9$1.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i9$1.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i9$1.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i9$1.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i9$1.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i9$1.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], deferBlockDependencies: [() => [i9.CdkPortalOutlet]] }); }
233
+ }
234
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: RecordListManagerComponent, decorators: [{
235
+ type: Component,
236
+ args: [{ selector: 'lib-record-list-manager', imports: [CommonModule, MatModulesModule], providers: [{ provide: MatFormFieldControl, useExisting: RecordListManagerComponent, }], template: "<!--- Secondary config -->\r\n\r\n<mat-card>\r\n <div class=\"table-container\">\r\n <table mat-table [dataSource]=\"dataSource\" class=\"example-table \">\r\n <!-- Number Column -->\r\n @for (col of tableColsConfig; track col.value) {\r\n <ng-container [matColumnDef]=\"col.value\">\r\n <th mat-header-cell *matHeaderCellDef>{{col.label}}</th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n @if(col.value === 'actions') {\r\n <button\r\n (click)=\"inEdit = row\"\r\n mat-icon-button matTooltip=\"Edit\" aria-label=\"edit record\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button (click)=\"removeItem(row)\" mat-icon-button color=\"warn\" matTooltip=\"Delete\"\r\n aria-label=\"Delete record\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }@else {\r\n {{row[col.value]}}\r\n }\r\n\r\n </td>\r\n </ng-container>\r\n }\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\r\n </table>\r\n @if(value.length === 0 ){\r\n <div style=\" display: flex;align-items: center;gap: 8px;padding: 16px;\" class=\"empty-message\">\r\n <mat-icon style=\"min-width: 24px;\">\r\n info</mat-icon>\r\n <span>\r\n No records found. Click the <strong>Add</strong> button to get started.\r\n\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n\r\n\r\n\r\n @if(inEdit){\r\n <div class=\"table-container\">\r\n <ng-container *ngTemplateOutlet=\"itemEdit\">\r\n </ng-container>\r\n </div>\r\n\r\n <mat-card-actions align=\"end\">\r\n <button (click)=\"inEdit=null\" mat-button color=\"primary\">\r\n Cancel\r\n </button>\r\n <button (click)=\"saveRecord()\" [disabled]=\"canSaveRecord === false\" mat-stroked-button color=\"primary\">\r\n {{inEdit.id? 'Update':'Save new'}} Record \r\n <mat-icon>\r\n save\r\n </mat-icon>\r\n </button>\r\n </mat-card-actions>\r\n }@else{\r\n <mat-card-actions>\r\n <span class=\"spacer\"></span>\r\n <span style=\"font-size: small;\r\n opacity: 0.6; margin-right: 16px;\">\r\n Records ({{ (value || []).length }}):\r\n </span>\r\n \r\n <button (click)=\"addNewItem()\" mat-stroked-button color=\"primary\" matTooltip=\"Add a new record\"\r\n aria-label=\"Add a new record\">\r\n <mat-icon>add</mat-icon>\r\n Add Record\r\n </button>\r\n </mat-card-actions>\r\n }\r\n\r\n</mat-card>\r\n\r\n\r\n<ng-template #itemEdit>\r\n\r\n <mat-accordion class=\"record-editor\" togglePosition=\"after\">\r\n @for(section of (secondaryElementEditorConfig||[]); track section.id) {\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{section.label}}\r\n <span class=\"spacer\"></span>\r\n\r\n <span class=\"showItemValue\" *ngIf=\"section.showItemValue && !!(inEdit)\">\r\n {{inEdit[section.showItemValue]}}\r\n </span>\r\n <mat-divider style=\"position: absolute; left:0px; width:100%; bottom:0px;\"></mat-divider>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n\r\n <!-- Element type selector (only in first section) -->\r\n @for(element of section.elements; track element.id) {\r\n <p style=\"margin-bottom: 16px; margin-top: 8px;\">\r\n\r\n @defer (on viewport) {\r\n <ng-template (attached)=\"onPortalAttached($event, element)\"\r\n [cdkPortalOutlet]=\"dynamicEditorPortals[element.id]\"></ng-template>\r\n\r\n\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=\"18\"></mat-spinner>\r\n </div>\r\n }\r\n </p>\r\n }\r\n </mat-expansion-panel>\r\n }\r\n </mat-accordion>\r\n\r\n\r\n</ng-template>", styles: [".record-list-item{height:38px;padding-left:4px}.remove-button{visibility:hidden}.record-list-item:hover{.remove-button{visibility:visible}}.item-edit-container{padding-left:8px;width:100%;display:flex;flex-direction:column}.table-container{padding:8px}.mat-column-actions{max-width:52px;padding:0}\n"] }]
237
+ }], ctorParameters: () => [{ type: i1.NgControl, decorators: [{
238
+ type: Optional
239
+ }, {
240
+ type: Self
241
+ }] }, { type: i0.ElementRef }], propDecorators: { mapToData: [{
242
+ type: Input
243
+ }], disabled: [{
244
+ type: Input
245
+ }], errors: [{
246
+ type: Input
247
+ }], required: [{
248
+ type: Input
249
+ }], value: [{
250
+ type: Input
251
+ }], placeholder: [{
252
+ type: Input
253
+ }], id: [{
254
+ type: HostBinding
255
+ }], describedBy: [{
256
+ type: HostBinding,
257
+ args: ['attr.aria-describedby']
258
+ }], shouldLabelFloat: [{
259
+ type: HostBinding,
260
+ args: ['class.floating']
261
+ }], formInputs: [{
262
+ type: Input
263
+ }], editorConfig: [{
264
+ type: Input
265
+ }], valueChange: [{
266
+ type: Output
267
+ }] } });
268
+
269
+ export { RecordListManagerComponent };
270
+ //# sourceMappingURL=ngx-t-forms-record-list-manager.component-D4wlLtdc.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngx-t-forms-record-list-manager.component-D4wlLtdc.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/record-list-manager/record-list-manager.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/record-list-manager/record-list-manager.component.html"],"sourcesContent":["import { CommonModule } from '@angular/common';\r\nimport { Component, ComponentRef, ElementRef, EventEmitter, HostBinding, Input, OnDestroy, Optional, Output, Self } from '@angular/core';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { MatModulesModule } from '../../../../shared/modules/mat-modules.module';\r\n\r\nimport { NgControl } from '@angular/forms';\r\nimport { Subject, Subscription } from 'rxjs';\r\nimport { IConfigElementError, TDynamicDataEditComponent } from '../../t-dynamic-data-edit.component';\r\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport { ElementEditorConfigSectionInterface, ElementEditorInnerSectionElementInterface, FormColumnInputs } from 'ngx-t-forms-types';\r\nimport { CdkPortalOutletAttachedRef, ComponentPortal } from '@angular/cdk/portal';\r\nimport { _isEqual } from '../../../../shared/functions/isEqual';\r\nimport { MatTableDataSource } from '@angular/material/table';\r\nimport { assignDeepPropertyToObject } from '../../../../shared/functions/assignDeepPropertyToObject';\r\nimport { safeReturnDeepProperty } from '../../../../shared/functions/getDeepObject';\r\n\r\n@Component({\r\n selector: 'lib-record-list-manager',\r\n imports: [CommonModule, MatModulesModule],\r\n templateUrl: './record-list-manager.component.html',\r\n styleUrl: './record-list-manager.component.css',\r\n providers: [{ provide: MatFormFieldControl, useExisting: RecordListManagerComponent, }],\r\n})\r\nexport class RecordListManagerComponent implements MatFormFieldControl<any[]>, OnDestroy {\r\n static nextId = 0;\r\n // --- MatFormFieldControl Boilerplate ---\r\n stateChanges = new Subject<void>();\r\n focused = false;\r\n touched = false;\r\n @Input() mapToData: any\r\n @Input() disabled = false;\r\n controlType = 'lib-record-list-manager';\r\n autofilled = false;\r\n\r\n @Input() errors: IConfigElementError[] | undefined = [];\r\n\r\n // REMOVED: Redundant valueChange EventEmitter. ControlValueAccessor's `onChange` handles this.\r\n\r\n private _required = false;\r\n @Input()\r\n get required(): boolean {\r\n return this._required;\r\n }\r\n set required(value: boolean) {\r\n this._required = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n\r\n @Input()\r\n get value(): any[] {\r\n return this.dataSource.data;\r\n }\r\n set value(val: any[]) {\r\n\r\n this.dataSource.data = val || [];\r\n this.onChange(val); // Notify Angular Forms of the change\r\n this.stateChanges.next()\r\n }\r\n\r\n private _placeholder: string = '';\r\n @Input()\r\n get placeholder(): string {\r\n return this._placeholder;\r\n }\r\n set placeholder(value: string) {\r\n this._placeholder = value;\r\n this.stateChanges.next();\r\n }\r\n\r\n @HostBinding() id = `lib-record-list-manager-${RecordListManagerComponent.nextId++}`;\r\n @HostBinding('attr.aria-describedby') describedBy = '';\r\n @HostBinding('class.floating') get shouldLabelFloat() {\r\n return this.focused || !this.empty;\r\n }\r\n\r\n get empty(): boolean {\r\n return !this.value || this.value.length === 0;\r\n }\r\n\r\n get errorState(): boolean {\r\n return !this.value && this.required && this.touched || !!this.ngControl?.errors || (this.errors || []).length > 0;\r\n }\r\n\r\n // --- ControlValueAccessor & Lifecycle ---\r\n constructor(\r\n @Optional() @Self() public ngControl: NgControl,\r\n private _elementRef: ElementRef<HTMLElement>,\r\n ) {\r\n if (this.ngControl != null) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.stateChanges.complete();\r\n this.portalSubscriptions.forEach(sub => sub.unsubscribe());\r\n this.portalSubscriptions.clear();\r\n }\r\n\r\n // ControlValueAccessor methods\r\n onChange = (_: any) => { };\r\n onTouched = () => { };\r\n\r\n writeValue(value: any[]): void {\r\n this.dataSource.data = value || [];\r\n this.stateChanges.next();\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this.stateChanges.next();\r\n }\r\n\r\n // MatFormFieldControl methods\r\n setDescribedByIds(ids: string[]): void {\r\n this._elementRef?.nativeElement.setAttribute('aria-describedby', ids.join(' '));\r\n }\r\n\r\n onContainerClick(event: MouseEvent): void {\r\n if (!this.focused) {\r\n this.focused = true;\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n markAsTouched(): void {\r\n if (!this.touched) {\r\n this.touched = true;\r\n this.onTouched();\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n // --- Component-Specific Properties & Logic ---\r\n dataSource = new MatTableDataSource<any[]>();\r\n @Input() formInputs: Array<FormColumnInputs> = [];\r\n\r\n private _editorConfig: ElementEditorInnerSectionElementInterface | undefined;\r\n @Input() set editorConfig(value: ElementEditorInnerSectionElementInterface | undefined) {\r\n if (!_isEqual(this._editorConfig, value)) {\r\n this._editorConfig = value;\r\n this.secondaryElementEditorConfig = value?.secondaryElementEditorConfig || [];\r\n }\r\n }\r\n get editorConfig(): ElementEditorInnerSectionElementInterface | undefined {\r\n return this._editorConfig;\r\n }\r\n\r\n private _secondaryElementEditorConfig: ElementEditorConfigSectionInterface[] = [];\r\n set secondaryElementEditorConfig(value: ElementEditorConfigSectionInterface[]) {\r\n if (_isEqual(this._secondaryElementEditorConfig, value)) return;\r\n this._secondaryElementEditorConfig = value;\r\n this.dynamicEditorPortals = {};\r\n this._secondaryElementEditorConfig.forEach(section => {\r\n section.elements.forEach(ele => {\r\n this.dynamicEditorPortals[ele.id] = new ComponentPortal(TDynamicDataEditComponent);\r\n });\r\n });\r\n }\r\n get secondaryElementEditorConfig(): ElementEditorConfigSectionInterface[] {\r\n return this._secondaryElementEditorConfig;\r\n }\r\n\r\n get tableColsConfig(): { label: string; value: any; }[] {\r\n return [\r\n ...(this.editorConfig?.options || []),\r\n { label: ' ', value: 'actions' }\r\n ];\r\n }\r\n\r\n get displayedColumns(): string[] {\r\n return this.tableColsConfig.map(c => c.value);\r\n }\r\n\r\n // State for the item currently being added or edited\r\n inEdit: any = null;\r\n dynamicEditorPortals: Record<string, ComponentPortal<any>> = {};\r\n private portalSubscriptions = new Map<string, Subscription>();\r\n\r\n\r\n\r\n\r\n // --- Component Methods ---\r\n addNewItem(): void {\r\n this.inEdit = {};\r\n }\r\n @Output() valueChange = new EventEmitter<any[]>()\r\n saveRecord(): void {\r\n if (!this.inEdit) return;\r\n let newValue: any[];\r\n if (this.inEdit.id) {\r\n // Update existing item\r\n newValue = this.value.map(item =>\r\n item.id === this.inEdit.id ? this.inEdit : item\r\n );\r\n } else {\r\n // Add new item\r\n const newItem = { ...this.inEdit, id: crypto.randomUUID() };\r\n newValue = [...this.value, newItem];\r\n }\r\n this.value = newValue; // This setter will call `onChange` to update the form model.\r\n this.inEdit = null;\r\n this.valueChange.emit(this.value)\r\n }\r\n removeItem(item: any): void {\r\n this.value = this.value.filter(i => i.id !== item.id);\r\n if (this.inEdit?.id === item.id) {\r\n this.inEdit = null;\r\n }\r\n this.valueChange.emit(this.value)\r\n }\r\n onPortalAttached(portalRef: CdkPortalOutletAttachedRef, element: any): void {\r\n\r\n const componentRef = portalRef as ComponentRef<TDynamicDataEditComponent>;\r\n // 1. Set inputs on the dynamically created component\r\n componentRef.instance.formInputs = this.formInputs;\r\n componentRef.instance.editorConfig = element;\r\n componentRef.instance.data = this.inEdit;\r\n\r\n // 2. Subscribe to the dynamic component's output\r\n const sub = componentRef.instance.valueChange.subscribe(event => {\r\n const newinEdit = JSON.parse(JSON.stringify(this.inEdit));\r\n assignDeepPropertyToObject(newinEdit, element.deepBind, event);\r\n this.inEdit = newinEdit;\r\n\r\n componentRef.instance.data = this.inEdit;\r\n //mark for check\r\n componentRef.changeDetectorRef.markForCheck();\r\n console.error('inEdit updated:', this.inEdit,event);\r\n\r\n\r\n });\r\n // 3. Store subscription for cleanup in ngOnDestroy\r\n this.portalSubscriptions.set(element.id, sub);\r\n }\r\n /**\r\n * Determines if the record is in a savable state by checking that all\r\n * required fields have a valid, non-empty value.\r\n * @returns {boolean} True if the record can be saved, otherwise false.\r\n */\r\n get canSaveRecord(): boolean {\r\n // Guard clause: Exit early if not in an editable state.\r\n if (!this.inEdit || !this.editorConfig) {\r\n return false;\r\n }\r\n // Iterate through each section and its elements directly.\r\n for (const section of this.secondaryElementEditorConfig) {\r\n for (const element of section.elements) {\r\n // If an element is required, check its value.\r\n if (element.required) {\r\n const { value } = safeReturnDeepProperty(this.inEdit, element.deepBind || []);\r\n // If any required value is empty (null, undefined, or ''),\r\n // the record cannot be saved. We can stop checking immediately.\r\n // Note: `value == null` checks for both `null` and `undefined`.\r\n if (value == null || value === '') {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n // If the loop completes, it means all required fields have valid values.\r\n return true;\r\n }\r\n}","<!--- Secondary config -->\r\n\r\n<mat-card>\r\n <div class=\"table-container\">\r\n <table mat-table [dataSource]=\"dataSource\" class=\"example-table \">\r\n <!-- Number Column -->\r\n @for (col of tableColsConfig; track col.value) {\r\n <ng-container [matColumnDef]=\"col.value\">\r\n <th mat-header-cell *matHeaderCellDef>{{col.label}}</th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n @if(col.value === 'actions') {\r\n <button\r\n (click)=\"inEdit = row\"\r\n mat-icon-button matTooltip=\"Edit\" aria-label=\"edit record\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button (click)=\"removeItem(row)\" mat-icon-button color=\"warn\" matTooltip=\"Delete\"\r\n aria-label=\"Delete record\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }@else {\r\n {{row[col.value]}}\r\n }\r\n\r\n </td>\r\n </ng-container>\r\n }\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\r\n </table>\r\n @if(value.length === 0 ){\r\n <div style=\" display: flex;align-items: center;gap: 8px;padding: 16px;\" class=\"empty-message\">\r\n <mat-icon style=\"min-width: 24px;\">\r\n info</mat-icon>\r\n <span>\r\n No records found. Click the <strong>Add</strong> button to get started.\r\n\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n\r\n\r\n\r\n @if(inEdit){\r\n <div class=\"table-container\">\r\n <ng-container *ngTemplateOutlet=\"itemEdit\">\r\n </ng-container>\r\n </div>\r\n\r\n <mat-card-actions align=\"end\">\r\n <button (click)=\"inEdit=null\" mat-button color=\"primary\">\r\n Cancel\r\n </button>\r\n <button (click)=\"saveRecord()\" [disabled]=\"canSaveRecord === false\" mat-stroked-button color=\"primary\">\r\n {{inEdit.id? 'Update':'Save new'}} Record \r\n <mat-icon>\r\n save\r\n </mat-icon>\r\n </button>\r\n </mat-card-actions>\r\n }@else{\r\n <mat-card-actions>\r\n <span class=\"spacer\"></span>\r\n <span style=\"font-size: small;\r\n opacity: 0.6; margin-right: 16px;\">\r\n Records ({{ (value || []).length }}):\r\n </span>\r\n \r\n <button (click)=\"addNewItem()\" mat-stroked-button color=\"primary\" matTooltip=\"Add a new record\"\r\n aria-label=\"Add a new record\">\r\n <mat-icon>add</mat-icon>\r\n Add Record\r\n </button>\r\n </mat-card-actions>\r\n }\r\n\r\n</mat-card>\r\n\r\n\r\n<ng-template #itemEdit>\r\n\r\n <mat-accordion class=\"record-editor\" togglePosition=\"after\">\r\n @for(section of (secondaryElementEditorConfig||[]); track section.id) {\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{section.label}}\r\n <span class=\"spacer\"></span>\r\n\r\n <span class=\"showItemValue\" *ngIf=\"section.showItemValue && !!(inEdit)\">\r\n {{inEdit[section.showItemValue]}}\r\n </span>\r\n <mat-divider style=\"position: absolute; left:0px; width:100%; bottom:0px;\"></mat-divider>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n\r\n <!-- Element type selector (only in first section) -->\r\n @for(element of section.elements; track element.id) {\r\n <p style=\"margin-bottom: 16px; margin-top: 8px;\">\r\n\r\n @defer (on viewport) {\r\n <ng-template (attached)=\"onPortalAttached($event, element)\"\r\n [cdkPortalOutlet]=\"dynamicEditorPortals[element.id]\"></ng-template>\r\n\r\n\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=\"18\"></mat-spinner>\r\n </div>\r\n }\r\n </p>\r\n }\r\n </mat-expansion-panel>\r\n }\r\n </mat-accordion>\r\n\r\n\r\n</ng-template>"],"names":["i3","i4","i5","i6","i7","i8","i9","i10","i11"],"mappings":"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"}