ngx-t-forms 2.0.18 → 2.0.20

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 (120) hide show
  1. package/fesm2022/{ngx-t-forms-calculated-field-rules.component-Byim7p5A.mjs → ngx-t-forms-calculated-field-rules.component-Bfxttbln.mjs} +9 -9
  2. package/fesm2022/{ngx-t-forms-calculated-field-rules.component-Byim7p5A.mjs.map → ngx-t-forms-calculated-field-rules.component-Bfxttbln.mjs.map} +1 -1
  3. package/fesm2022/{ngx-t-forms-chip-options-creator-editor.component-DJdo617E.mjs → ngx-t-forms-chip-options-creator-editor.component-DdJJ_42g.mjs} +2 -2
  4. package/fesm2022/{ngx-t-forms-chip-options-creator-editor.component-DJdo617E.mjs.map → ngx-t-forms-chip-options-creator-editor.component-DdJJ_42g.mjs.map} +1 -1
  5. package/fesm2022/{ngx-t-forms-config-mscoa-additional-inputs.component-D9iDMGP4.mjs → ngx-t-forms-config-mscoa-additional-inputs.component-kX-Om4Fk.mjs} +5 -5
  6. package/fesm2022/{ngx-t-forms-config-mscoa-additional-inputs.component-D9iDMGP4.mjs.map → ngx-t-forms-config-mscoa-additional-inputs.component-kX-Om4Fk.mjs.map} +1 -1
  7. package/fesm2022/{ngx-t-forms-data-source-picker.component-baq9XVW_.mjs → ngx-t-forms-data-source-picker.component-CMfslgTo.mjs} +7 -7
  8. package/fesm2022/{ngx-t-forms-data-source-picker.component-baq9XVW_.mjs.map → ngx-t-forms-data-source-picker.component-CMfslgTo.mjs.map} +1 -1
  9. package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-C81MpbQk.mjs +238 -0
  10. package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-C81MpbQk.mjs.map +1 -0
  11. package/fesm2022/{ngx-t-forms-form-input-selector.component-DdTRH1a0.mjs → ngx-t-forms-form-input-selector.component-DKA3JT53.mjs} +4 -5
  12. package/fesm2022/{ngx-t-forms-form-input-selector.component-DdTRH1a0.mjs.map → ngx-t-forms-form-input-selector.component-DKA3JT53.mjs.map} +1 -1
  13. package/fesm2022/{ngx-t-forms-form-json-view.component-BAcSfl3f.mjs → ngx-t-forms-form-json-view.component-D4B6gRiR.mjs} +2 -2
  14. package/fesm2022/{ngx-t-forms-form-json-view.component-BAcSfl3f.mjs.map → ngx-t-forms-form-json-view.component-D4B6gRiR.mjs.map} +1 -1
  15. package/fesm2022/ngx-t-forms-form-section-stepper.component-DauM50Lq.mjs +255 -0
  16. package/fesm2022/ngx-t-forms-form-section-stepper.component-DauM50Lq.mjs.map +1 -0
  17. package/fesm2022/{ngx-t-forms-forms-builder-menu.component-DIHHOIPI.mjs → ngx-t-forms-forms-builder-menu.component-DYP-_7bZ.mjs} +8 -9
  18. package/fesm2022/ngx-t-forms-forms-builder-menu.component-DYP-_7bZ.mjs.map +1 -0
  19. package/fesm2022/{ngx-t-forms-input-editor.component-BCRKxzzO.mjs → ngx-t-forms-input-editor.component-KmUcZsa3.mjs} +5 -5
  20. package/fesm2022/ngx-t-forms-input-editor.component-KmUcZsa3.mjs.map +1 -0
  21. package/fesm2022/{ngx-t-forms-mat-chip-list-editor.component-CK-W-ltG.mjs → ngx-t-forms-mat-chip-list-editor.component-RLWcb-CD.mjs} +2 -2
  22. package/fesm2022/{ngx-t-forms-mat-chip-list-editor.component-CK-W-ltG.mjs.map → ngx-t-forms-mat-chip-list-editor.component-RLWcb-CD.mjs.map} +1 -1
  23. package/fesm2022/{ngx-t-forms-mat-slider-editor.component-T764zgZ1.mjs → ngx-t-forms-mat-slider-editor.component-Ip2A9KcV.mjs} +2 -2
  24. package/fesm2022/{ngx-t-forms-mat-slider-editor.component-T764zgZ1.mjs.map → ngx-t-forms-mat-slider-editor.component-Ip2A9KcV.mjs.map} +1 -1
  25. package/fesm2022/{ngx-t-forms-mat-slider-toggle-editor.component-DfTrKkE_.mjs → ngx-t-forms-mat-slider-toggle-editor.component-gU5cXWEY.mjs} +2 -2
  26. package/fesm2022/{ngx-t-forms-mat-slider-toggle-editor.component-DfTrKkE_.mjs.map → ngx-t-forms-mat-slider-toggle-editor.component-gU5cXWEY.mjs.map} +1 -1
  27. package/fesm2022/{ngx-t-forms-missing-form-configs.component-BXGNkL4Z.mjs → ngx-t-forms-missing-form-configs.component-DqfXze2Z.mjs} +4 -4
  28. package/fesm2022/{ngx-t-forms-missing-form-configs.component-BXGNkL4Z.mjs.map → ngx-t-forms-missing-form-configs.component-DqfXze2Z.mjs.map} +1 -1
  29. package/fesm2022/{ngx-t-forms-mscoa-segment-config.component-DqCaJoe6.mjs → ngx-t-forms-mscoa-segment-config.component-Yp_xSVSu.mjs} +7 -7
  30. package/fesm2022/{ngx-t-forms-mscoa-segment-config.component-DqCaJoe6.mjs.map → ngx-t-forms-mscoa-segment-config.component-Yp_xSVSu.mjs.map} +1 -1
  31. package/fesm2022/{ngx-t-forms-ngx-t-forms-B4C0NbAb.mjs → ngx-t-forms-ngx-t-forms--NcMk6t2.mjs} +1915 -463
  32. package/fesm2022/ngx-t-forms-ngx-t-forms--NcMk6t2.mjs.map +1 -0
  33. package/fesm2022/{ngx-t-forms-pipeline-generator.component-CLs9AZ8p.mjs → ngx-t-forms-pipeline-generator.component-DWJ_pzQQ.mjs} +11 -11
  34. package/fesm2022/{ngx-t-forms-pipeline-generator.component-CLs9AZ8p.mjs.map → ngx-t-forms-pipeline-generator.component-DWJ_pzQQ.mjs.map} +1 -1
  35. package/fesm2022/{ngx-t-forms-required-inputs.component-DDHYfkyu.mjs → ngx-t-forms-required-inputs.component-U3LicAep.mjs} +8 -9
  36. package/fesm2022/{ngx-t-forms-required-inputs.component-DDHYfkyu.mjs.map → ngx-t-forms-required-inputs.component-U3LicAep.mjs.map} +1 -1
  37. package/fesm2022/{ngx-t-forms-rest-api-call-setup.component-BqiD8UGC.mjs → ngx-t-forms-rest-api-call-setup.component-D_ySLlQj.mjs} +7 -8
  38. package/fesm2022/{ngx-t-forms-rest-api-call-setup.component-BqiD8UGC.mjs.map → ngx-t-forms-rest-api-call-setup.component-D_ySLlQj.mjs.map} +1 -1
  39. package/fesm2022/{ngx-t-forms-section-report.component-Cl3KWTOq.mjs → ngx-t-forms-section-report.component-D-jjE9pS.mjs} +2 -2
  40. package/fesm2022/{ngx-t-forms-section-report.component-Cl3KWTOq.mjs.map → ngx-t-forms-section-report.component-D-jjE9pS.mjs.map} +1 -1
  41. package/fesm2022/{ngx-t-forms-selection-options-editor.component-BZFa1mmi.mjs → ngx-t-forms-selection-options-editor.component-C1d3tc9r.mjs} +4 -4
  42. package/fesm2022/{ngx-t-forms-selection-options-editor.component-BZFa1mmi.mjs.map → ngx-t-forms-selection-options-editor.component-C1d3tc9r.mjs.map} +1 -1
  43. package/fesm2022/{ngx-t-forms-t-workflow-picker.component-DQA2XovD.mjs → ngx-t-forms-t-workflow-picker.component-CdAo5d0s.mjs} +2 -2
  44. package/fesm2022/{ngx-t-forms-t-workflow-picker.component-DQA2XovD.mjs.map → ngx-t-forms-t-workflow-picker.component-CdAo5d0s.mjs.map} +1 -1
  45. package/fesm2022/{ngx-t-forms-validators-config.component-BkzKKK07.mjs → ngx-t-forms-validators-config.component-tcjhuqdU.mjs} +6 -7
  46. package/fesm2022/{ngx-t-forms-validators-config.component-BkzKKK07.mjs.map → ngx-t-forms-validators-config.component-tcjhuqdU.mjs.map} +1 -1
  47. package/fesm2022/ngx-t-forms.mjs +1 -1
  48. package/lib/components/form-builder/elements/input-element-editor/input-element-editor.component.d.ts +62 -2
  49. package/lib/components/forms/forms.component.d.ts +1 -1
  50. package/lib/components/forms/store/Form-selectors-FormBuilder.d.ts +31 -1
  51. package/lib/components/forms/store/forms-store.service.d.ts +31 -1
  52. package/lib/components/index.d.ts +3 -1
  53. package/lib/components/t-dynamic-data-edit/elements/api-value-access-rules/elements/data-tree/data-tree.component.d.ts +9 -13
  54. package/lib/components/t-dynamic-data-edit/elements/api-value-access-rules/elements/validation-expressio-creator/validation-expressio-creator.component.d.ts +50 -0
  55. package/lib/components/t-dynamic-data-edit/elements/api-value-access-rules/functions/convertDataToTree.d.ts +1 -6
  56. package/lib/components/t-dynamic-data-edit/elements/api-value-access-rules/functions/validateExpression.d.ts +6 -0
  57. package/lib/components/t-dynamic-data-edit/t-dynamic-data-edit.component.d.ts +1 -0
  58. package/lib/components/t-form-input/elements/Geo-location-form-input/elements/geo-location-form-input/geo-location-form-input.component.d.ts +2 -3
  59. package/lib/components/t-form-input/elements/Geo-location-form-input/geo-location.component.d.ts +3 -5
  60. package/lib/components/t-form-input/elements/auto-complete-input-element/auto-complete-input-element.component.d.ts +3 -4
  61. package/lib/components/t-form-input/elements/auto-complete-input-element/core/auto-complet-reactive-input/auto-complet-reactive-input.component.d.ts +2 -2
  62. package/lib/components/t-form-input/elements/basic-input-input-element/basic-input-input-element.component.d.ts +3 -4
  63. package/lib/components/t-form-input/elements/basic-input-input-element/core/input-custom/input-custom.component.d.ts +2 -2
  64. package/lib/components/t-form-input/elements/date-picker-input-element/core/date-picker-reactive-input/date-picker-reactive-input.component.d.ts +2 -2
  65. package/lib/components/t-form-input/elements/date-picker-input-element/date-picker-input-element.component.d.ts +3 -4
  66. package/lib/components/t-form-input/elements/date-range-picker-input-element/core/date-range-picker-reactive-input/date-range-picker-reactive-input.component.d.ts +2 -2
  67. package/lib/components/t-form-input/elements/date-range-picker-input-element/date-range-picker-input-element.component.d.ts +3 -4
  68. package/lib/components/t-form-input/elements/document-picker/core/document-picker-reactive-input/document-picker-reactive-input.component.d.ts +3 -3
  69. package/lib/components/t-form-input/elements/document-picker/document-picker.component.d.ts +3 -4
  70. package/lib/components/t-form-input/elements/editor-input-element/core/editor-js-input/editor-js-input.component.d.ts +2 -2
  71. package/lib/components/t-form-input/elements/editor-input-element/editor-input-element.component.d.ts +3 -4
  72. package/lib/components/t-form-input/elements/file-upload-input-element/core/file-uploader/file-uploader.component.d.ts +2 -2
  73. package/lib/components/t-form-input/elements/file-upload-input-element/file-upload-input-element.component.d.ts +3 -4
  74. package/lib/components/t-form-input/elements/image-capture-input-element/core/camera-capture/camera-capture.component.d.ts +2 -3
  75. package/lib/components/t-form-input/elements/image-capture-input-element/image-capture-input-element.component.d.ts +3 -4
  76. package/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-chart/mscoa-chart.component.d.ts +2 -2
  77. package/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-reactive-form-field/mscoa-reactive-form-field.component.d.ts +3 -4
  78. package/lib/components/t-form-input/elements/mscoa-form-input/mscoa-form-input.component.d.ts +3 -4
  79. package/lib/components/t-form-input/elements/multiple-input-input-element/core/multiple-input-table/multiple-input-table.component.d.ts +8 -9
  80. package/lib/components/t-form-input/elements/multiple-input-input-element/core/multiple-input-table-edit/multiple-input-table-edit.component.d.ts +12 -13
  81. package/lib/components/t-form-input/elements/multiple-input-input-element/core/multiple-input-table-view/multiple-input-table-view.component.d.ts +3 -2
  82. package/lib/components/t-form-input/elements/multiple-input-input-element/multiple-input-input-element.component.d.ts +3 -4
  83. package/lib/components/t-form-input/elements/section-title/section-title.component.d.ts +2 -2
  84. package/lib/components/t-form-input/elements/select-input-element/elements/select-input/select-input.component.d.ts +2 -2
  85. package/lib/components/t-form-input/elements/select-input-element/select-input-element.component.d.ts +3 -4
  86. package/lib/components/t-form-input/elements/signature-input-element/signature-input-element.component.d.ts +3 -4
  87. package/lib/components/t-form-input/elements/textarea-input-element/core/text-area-reactive-input/text-area-reactive-input.component.d.ts +2 -2
  88. package/lib/components/t-form-input/elements/textarea-input-element/textarea-input-element.component.d.ts +3 -4
  89. package/lib/components/t-form-input/elements/toggle-input-element/core/toggle/toggle.component.d.ts +2 -2
  90. package/lib/components/t-form-input/elements/toggle-input-element/toggle-input-element.component.d.ts +3 -4
  91. package/lib/components/t-form-input/elements/workflow-adjudication/elements/points-creation/points-creation.component.d.ts +31 -0
  92. package/lib/components/t-form-input/elements/workflow-adjudication/elements/workflow-adjudication-reactive-input/workflow-adjudication-reactive-input.component.d.ts +19 -0
  93. package/lib/components/t-form-input/elements/workflow-adjudication/workflow-adjudication.component.d.ts +14 -0
  94. package/lib/components/t-form-input/t-form-input.component.d.ts +3 -5
  95. package/lib/components/t-form-input-status/t-form-input-status.component.d.ts +2 -2
  96. package/lib/services/core/t-form-builder/functions/inputElementEditorConfigs.d.ts +31 -1
  97. package/lib/services/core/t-form-section-controller/Functions/getValueFromPathMap.d.ts +1 -3
  98. package/lib/services/core/t-form-tower-controller/form-tower-controller.service.d.ts +1 -0
  99. package/lib/services/core/t-form-tower-controller/functions/getFormValue.d.ts +1 -0
  100. package/lib/services/index.d.ts +2 -1
  101. package/lib/shared/functions/createFileUploadSample.d.ts +10 -0
  102. package/lib/shared/functions/getDeepObject.d.ts +1 -1
  103. package/lib/shared/functions/getformInputsSampleValue.d.ts +10 -0
  104. package/lib/shared/index.d.ts +4 -2
  105. package/lib/shared/modules/stringJsonValidator/getObjectValidations.d.ts +2 -1
  106. package/lib/shared/pipes/list-search.pipe.d.ts +7 -0
  107. package/package.json +2 -2
  108. package/fesm2022/ngx-t-forms-api-value-access-rules.component-Drlk8YPy.mjs +0 -439
  109. package/fesm2022/ngx-t-forms-api-value-access-rules.component-Drlk8YPy.mjs.map +0 -1
  110. package/fesm2022/ngx-t-forms-convertPostmanCollectionToTree-DktdVBeQ.mjs +0 -29
  111. package/fesm2022/ngx-t-forms-convertPostmanCollectionToTree-DktdVBeQ.mjs.map +0 -1
  112. package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-O0z6NtqG.mjs +0 -238
  113. package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-O0z6NtqG.mjs.map +0 -1
  114. package/fesm2022/ngx-t-forms-form-section-stepper.component-npSCBik4.mjs +0 -257
  115. package/fesm2022/ngx-t-forms-form-section-stepper.component-npSCBik4.mjs.map +0 -1
  116. package/fesm2022/ngx-t-forms-forms-builder-menu.component-DIHHOIPI.mjs.map +0 -1
  117. package/fesm2022/ngx-t-forms-getInputIllustration-GCSKx5e5.mjs +0 -9
  118. package/fesm2022/ngx-t-forms-getInputIllustration-GCSKx5e5.mjs.map +0 -1
  119. package/fesm2022/ngx-t-forms-input-editor.component-BCRKxzzO.mjs.map +0 -1
  120. package/fesm2022/ngx-t-forms-ngx-t-forms-B4C0NbAb.mjs.map +0 -1
@@ -1,439 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { EventEmitter, ElementRef, ViewChild, Output, Input, Component, HostBinding, Optional, Self } from '@angular/core';
3
- import * as i2 from '@angular/common';
4
- import { CommonModule } from '@angular/common';
5
- import * as i1 from '@angular/forms';
6
- import { FormsModule } from '@angular/forms';
7
- import { e as TreeComponent, M as MatModulesModule } from './ngx-t-forms-ngx-t-forms-B4C0NbAb.mjs';
8
- import * as i3 from '@angular/material/autocomplete';
9
- import * as i2$1 from '@angular/material/button';
10
- import * as i4 from '@angular/material/checkbox';
11
- import * as i4$1 from '@angular/material/divider';
12
- import * as i5 from '@angular/material/expansion';
13
- import * as i5$1 from '@angular/material/icon';
14
- import * as i6 from '@angular/material/list';
15
- import * as i3$1 from '@angular/material/select';
16
- import * as i9 from '@angular/material/toolbar';
17
- import * as i4$2 from '@angular/material/tooltip';
18
- import * as i3$2 from '@angular/material/tree';
19
- import * as i12 from '@angular/material/input';
20
- import { MatFormFieldControl } from '@angular/material/form-field';
21
- import { Subject, take, tap, catchError, throwError } from 'rxjs';
22
- import * as i1$1 from '@angular/common/http';
23
- import { HttpErrorResponse } from '@angular/common/http';
24
- import _ from 'lodash';
25
- import { f as flatApiList } from './ngx-t-forms-convertPostmanCollectionToTree-DktdVBeQ.mjs';
26
- import * as i5$2 from '@angular/cdk/overlay';
27
- import { OverlayModule } from '@angular/cdk/overlay';
28
-
29
- function searchAndOrderArray(arr, searchTerm, filterBy) {
30
- // Filter the array based on the search term
31
- const filteredArr = arr.filter((obj) => searchTerm
32
- ? obj[filterBy].toLowerCase().includes(searchTerm.toLowerCase())
33
- : true);
34
- // Order the filtered array alphabetically by name
35
- const orderedArr = filteredArr.sort((a, b) => a[filterBy].localeCompare(b[filterBy]));
36
- return orderedArr;
37
- }
38
-
39
- ;
40
- class DataTreeComponent {
41
- constructor() {
42
- this.value = [];
43
- this.formInputs = [];
44
- this.pathChanged = new EventEmitter();
45
- this._value = [];
46
- this.showSuggestions = false;
47
- this.suggestions = ['$option1', '$option2', '$option3', '$custom'];
48
- this.filteredSuggestions = [];
49
- this.cursorPosition = 0;
50
- this.methods = [
51
- // Logical Operators
52
- {
53
- label: 'logical AND (&&)',
54
- value: '&&'
55
- },
56
- {
57
- label: 'logical OR (||)',
58
- value: '||'
59
- },
60
- // Comparison Operators
61
- {
62
- label: 'strict equality (===)',
63
- value: '==='
64
- },
65
- {
66
- label: 'loose equality (==)',
67
- value: '=='
68
- },
69
- {
70
- label: 'strict inequality (!==)',
71
- value: '!=='
72
- },
73
- {
74
- label: 'loose inequality (!=)',
75
- value: '!='
76
- },
77
- {
78
- label: 'greater than (>)',
79
- value: '>'
80
- },
81
- {
82
- label: 'less than (<)',
83
- value: '<'
84
- },
85
- {
86
- label: 'greater than or equal to (>=)',
87
- value: '>='
88
- },
89
- {
90
- label: 'less than or equal to (<=)',
91
- value: '<='
92
- }
93
- ];
94
- this.showValue = false;
95
- this.treeClass = new TreeComponent();
96
- }
97
- ngOnChanges(changes) {
98
- if (changes['data']) {
99
- if (JSON.stringify(this._data) !== JSON.stringify(changes['data'].currentValue)) {
100
- this._data = changes['data'].currentValue;
101
- this.treeClass.computeTreeData(changes['data'].currentValue);
102
- if (this.value && Array.isArray(this.value) && this.value.length > 0 && 'functions' in (this.value?.[0] || {})) {
103
- this.treeClass.updateStateFromPath(this.value);
104
- }
105
- }
106
- }
107
- if (changes['value']) {
108
- this.valueChangedSetPath(changes['value'].currentValue);
109
- }
110
- }
111
- ngOnInit() {
112
- }
113
- valueChangedSetPath(newPath) {
114
- const isSameAsNewPath = typeof newPath === typeof this._value && JSON.stringify(newPath) === JSON.stringify(this._value);
115
- if (!isSameAsNewPath && Array.isArray(newPath)) {
116
- this._value = newPath;
117
- this.treeClass.updateStateFromPath(newPath);
118
- }
119
- }
120
- async onTextChange(event) {
121
- const newValue = event.target.value;
122
- const functions = this.treeClass.pathInEdit.functions.find(f => f.inEdit);
123
- functions.expression = newValue;
124
- this.treeClass.pathInEdit.functions.map(f => {
125
- if (f.inEdit) {
126
- return functions;
127
- }
128
- return f;
129
- });
130
- const textarea = this.textareaElementRef.nativeElement;
131
- this.cursorPosition = textarea.selectionStart || 0;
132
- const lastChar = newValue[this.cursorPosition - 1];
133
- if (lastChar === '$') {
134
- this.showSuggestions = true;
135
- this.filteredSuggestions = this.suggestions;
136
- }
137
- else {
138
- this.showSuggestions = false;
139
- }
140
- }
141
- functionChanged(event) {
142
- this.treeClass.functionChanged(event.value);
143
- }
144
- addNewFunction() {
145
- this.treeClass.addNewFunction();
146
- }
147
- editFunction(id) {
148
- this.treeClass.pathInEdit.functions = this.treeClass.pathInEdit.functions?.map(f => {
149
- if (f.id === id) {
150
- return { ...f, inEdit: true };
151
- }
152
- return { ...f, inEdit: false };
153
- });
154
- }
155
- selectSuggestionInput(suggestion) {
156
- const functions = this.treeClass.pathInEdit.functions.find(f => f.inEdit) || {};
157
- const value = functions?.expression || '';
158
- const beforeCursor = value.slice(0, this.cursorPosition - 1);
159
- const afterCursor = value.slice(this.cursorPosition);
160
- functions.expression = beforeCursor + suggestion + ' ' + afterCursor;
161
- this.treeClass.pathInEdit.functions.map(f => {
162
- if (f.inEdit) {
163
- return functions;
164
- }
165
- return f;
166
- });
167
- this.showSuggestions = false;
168
- const textarea = this.textareaElementRef.nativeElement;
169
- textarea.focus();
170
- const newCursorPosition = this.cursorPosition + suggestion.length;
171
- setTimeout(() => {
172
- textarea.setSelectionRange(newCursorPosition, newCursorPosition);
173
- }, 0);
174
- }
175
- onFocus(event) {
176
- const textarea = this.textareaElementRef.nativeElement;
177
- this.cursorPosition = textarea.selectionStart || 0;
178
- }
179
- nodeIsChecked(node) {
180
- return this.treeClass.nodeIsChecked(node);
181
- }
182
- hasANodeInEdit() {
183
- return this.treeClass.hasANodeInEdit();
184
- }
185
- showNode(node) {
186
- return this.treeClass.showNode(node);
187
- }
188
- onSearchChange(event) {
189
- this.optionsSearch = event.target.value;
190
- }
191
- getMethods() {
192
- return searchAndOrderArray(this.methods, this.optionsSearch, 'label');
193
- }
194
- getNodeValueColor(v) {
195
- const valueType = typeof v;
196
- switch (valueType) {
197
- case 'string':
198
- return '#c56100';
199
- case 'number':
200
- return 'mediumblue';
201
- case 'boolean':
202
- return 'forestgreen';
203
- case 'object':
204
- return '#005959';
205
- default:
206
- return 'currentcolor';
207
- }
208
- }
209
- setupPath(node) {
210
- return this.treeClass.setupPath(node);
211
- }
212
- trackByFn(index, node) {
213
- return node.path.join('.');
214
- }
215
- getAllInputs() {
216
- const inputs = this.formInputs
217
- .filter((inp) => !inp.multipleInputInEditId);
218
- return searchAndOrderArray(inputs || [], this.optionsSearch, 'label');
219
- }
220
- getValueVariables() {
221
- const isObject = typeof this.value === 'object';
222
- if (!this.value) {
223
- return [];
224
- }
225
- if (!isObject && !!this.value) {
226
- return [this.value];
227
- }
228
- if (Array.isArray(this.value)) {
229
- return this.value.map((v, i) => (i));
230
- }
231
- return Object.keys(this.value);
232
- }
233
- saveNodeInEdit() {
234
- const newP = this.treeClass.saveNodeInEdit();
235
- if (newP) {
236
- this.pathChanged.emit(newP);
237
- }
238
- }
239
- closeEdit() {
240
- this.treeClass.closeEdit();
241
- }
242
- reset() {
243
- this.treeClass.resetNode();
244
- }
245
- getFunctionInEdit() {
246
- const node = this.treeClass.pathInEdit;
247
- return node?.functions?.find(f => f.inEdit);
248
- }
249
- get getValue() {
250
- return this.treeClass.getValue();
251
- }
252
- removeFunction(id) {
253
- this.treeClass.removeFunction(id);
254
- }
255
- update(node) {
256
- const path = this.treeClass.selectNode(node)?.map(p => ({
257
- ...p,
258
- children: undefined,
259
- value: undefined
260
- }));
261
- this.pathChanged.emit(path);
262
- }
263
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.6", ngImport: i0, type: DataTreeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
264
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.6", type: DataTreeComponent, isStandalone: true, selector: "app-data-tree", inputs: { data: "data", value: "value", formInputs: "formInputs" }, outputs: { pathChanged: "pathChanged" }, viewQueries: [{ propertyName: "textareaElementRef", first: true, predicate: ["textarea"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<mat-accordion multi>\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"title-icon\">dataset_linked</mat-icon>\n Navigate and select data fields for mapping\n </mat-panel-title>\n </mat-expansion-panel-header>\n\n <div class=\"content\">\n <div class=\"tree-instructions\">\n <mat-icon class=\"info-icon\" color=\"primary\">info</mat-icon>\n <span>Click checkboxes to select fields for mapping. Selected paths will be highlighted.</span>\n </div>\n <mat-divider></mat-divider>\n\n <mat-tree [dataSource]=\"treeClass.dataSource\" \n [treeControl]=\"treeClass.treeControl\">\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodePadding>\n <button disabled class=\"node-spacer\" aria-hidden=\"true\" mat-icon-button>\n\n </button>\n <mat-checkbox (change)=\"update(node)\" [checked]=\"nodeIsChecked(node)\" class=\"node-checkbox\"\n [matTooltip]=\"'Map data field: ' + node.key\">\n <span class=\"node-key\" [attr.aria-label]=\"'Field name: ' + node.key\">{{ node.key }}:</span>\n <span [attr.aria-label]=\"'Field value: ' + node.value\" style=\" white-space: nowrap;\" class=\"node-value\"\n [style.color]=\"getNodeValueColor(node.value)\">\n {{ node.value }}\n </span>\n </mat-checkbox>\n </mat-tree-node>\n\n <mat-tree-node *matTreeNodeDef=\"let node; when: treeClass.hasChild\" matTreeNodePadding>\n <button style=\"padding: 0px; \n width: 24px;\" mat-icon-button matTreeNodeToggle [attr.aria-label]=\"'Toggle ' + node.key\">\n <mat-icon>\n {{ treeClass.treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\n </mat-icon>\n </button>\n <mat-checkbox (change)=\"update(node)\" [checked]=\"nodeIsChecked(node)\" [matTooltip]=\"'Select ' + node.key\">\n <span class=\"node-key\">{{ node.key }}</span>\n </mat-checkbox>\n </mat-tree-node>\n </mat-tree>\n </div>\n </mat-expansion-panel>\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"title-icon\">rebase_edit</mat-icon>\n Configure and transform your data path\n </mat-panel-title>\n </mat-expansion-panel-header>\n\n <div class=\"content\">\n <div class=\"tree-instructions\" *ngIf=\"treeClass.activePath.length === 0\">\n <mat-icon class=\"info-icon\" color=\"primary\">info</mat-icon>\n <span>Select a node from the tree above to begin mapping data</span>\n </div>\n <mat-divider></mat-divider>\n <mat-toolbar style=\" height: fit-content; background: inherit;\">\n <div class=\"breadcrumb-container\">\n\n <ng-container *ngFor=\"let path of treeClass.activePath; trackBy: trackByFn; last as isLast; index as i\">\n <button *ngIf=\"!path.inEdit\" matTooltip=\"Click to edit\" (click)=\"setupPath(path)\" mat-button\n [disabled]=\"!path.keyIsArrayIndex\" [color]=\"path.functions.length> 0 ? 'accent' : ''\"\n class=\"breadcrumb-item\">\n <mat-icon>{{ path.keyIsArrayIndex ? 'filter_none' : 'folder' }}</mat-icon>\n <span>{{ path.key }}</span>\n </button>\n\n\n <button *ngIf=\"!!path.inEdit\" matTooltip=\"Currently editing\" (click)=\"removeFunction(path.key)\"\n mat-raised-button color=\"primary\" class=\"breadcrumb-item\">\n <mat-icon>check_circle</mat-icon>\n <span>{{ path.key }}</span>\n </button>\n <mat-icon *ngIf=\"!isLast\" class=\"breadcrumb-separator\">chevron_right</mat-icon>\n </ng-container>\n </div>\n </mat-toolbar>\n <div *ngIf=\"!!hasANodeInEdit()\">\n\n <mat-nav-list>\n\n <ng-container *ngFor=\"let function of this.treeClass.pathInEdit?.functions;index as i\">\n <mat-list-item \n [activated]=\"!!function.inEdit\"\n class=\"functions\" style=\"height: fit-content;\">\n <span matListItemIcon class=\"function-number\" > \n <strong> {{i+1}} </strong>\n </span>\n <a \n\n (click)=\"editFunction(function.id)\"\n \n style=\"font-size: 14px; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;\"\n matListItemTitle> {{ (function.function |titlecase) ||\n 'Function configurations required'}}</a>\n <button mat-icon-button \n (click)=\"removeFunction(function.id)\" matListItemMeta>\n\n <mat-icon [color]=\"function.function && function.expression?'':'warn'\">{{!function.inEdit? 'close':'check_circle'}}</mat-icon>\n </button>\n \n \n </mat-list-item>\n \n <div class=\"function-edit-container\" *ngIf=\"function.inEdit\">\n <mat-divider></mat-divider>\n <mat-form-field subscriptSizing=\"dynamic\" style=\" margin-bottom: 8px;\" appearance=\"outline\" *ngIf=\"this.treeClass.pathInEdit?.functions\">\n <mat-label>Array function</mat-label>\n <mat-select matNativeControl [value]=\"getFunctionInEdit()?.function\"\n (selectionChange)=\"functionChanged($event)\" placeholder=\"ChooseFunctionToRun\">\n <mat-option value=\"filter\">filter</mat-option>\n <mat-option value=\"find\">find</mat-option>\n <mat-option value=\"map\">map</mat-option>\n </mat-select>\n <mat-hint>\n Choose a function to run on the array\n </mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"outline\" *ngIf=\"this.treeClass.pathInEdit?.functions\">\n <mat-label >Condition expression</mat-label>\n <textarea matInput #textarea \n [value]=\"getFunctionInEdit()?.expression\"\n (input)=\"onTextChange($event)\" (focus)=\"onFocus($event)\"\n \n placeholder=\"Enter a validation string for the function\"></textarea>\n <mat-hint>\n {{ showSuggestions ? 'Suggestions are enabled' : 'Enter a condition expression to transform the array' }}\n </mat-hint>\n </mat-form-field>\n <section *ngIf=\"showSuggestions\" \n class=\"showSuggestionContainer\">\n <!-- <mat-toolbar class=\"search-container\" style=\"background: inherit;\">\n \n \n <input type=\"search\" \n placeholder=\"Search api\" \n class=\"search-field\"\n (change)=\"onSearchChange($event)\"> \n \n <mat-icon>\n search\n </mat-icon>\n </mat-toolbar> -->\n <mat-divider></mat-divider>\n <div style=\"padding: 8px;\" class=\"\">\n <div class=\"suggestion-container\">\n <div class=\"suggestion-column\">\n <h5>Logical Operators</h5>\n <div class=\"button-container\">\n <button \n color=\"primary\" \n mat-flat-button *ngFor=\"let method of getMethods()\"\n (click)=\"selectSuggestionInput(method.value)\" class=\"suggestion-button\">\n {{ method.label | titlecase }}\n </button>\n </div>\n </div>\n <div class=\"suggestion-column\">\n <h5>Add Input as a Variable</h5>\n <div class=\"button-container\">\n <button *ngFor=\"let input of getAllInputs()\"\n mat-flat-button\n (click)=\"selectSuggestionInput(input.formControlName)\" class=\"suggestion-button\">\n {{ input.label | titlecase }}\n </button>\n </div>\n </div>\n <!-- <div class=\"suggestion-column\">\n <h5>Array path Object </h5>\n <div class=\"button-container\">\n <button *ngFor=\"let input of getValueVariables()\"\n color=\"accent\"\n mat-flat-button\n (click)=\"selectSuggestionInput(input)\" class=\"suggestion-button\">\n {{ input}}\n </button>\n </div>\n </div> -->\n </div>\n <div class=\"suggestion-container\">\n \n </div>\n \n </div>\n </section>\n \n\n <mat-toolbar style=\"background:none\">\n <span class=\"spacer\"></span>\n\n <button (click)=\"reset()\" mat-flat-button>\n reset\n </button>\n <button (click)=\"saveNodeInEdit()\" [disabled]=\"!function.expression && !function.function\" mat-flat-button\n color=\"primary\">\n save\n </button>\n\n </mat-toolbar>\n </div>\n <mat-divider></mat-divider>\n </ng-container>\n\n </mat-nav-list>\n <ol>\n\n </ol>\n <button (click)=\"addNewFunction()\" mat-button>+ Add function </button>\n </div>\n </div>\n </mat-expansion-panel>\n\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"title-icon\">dataset</mat-icon>\n Mapped Data Value Based on the Active Path\n </mat-panel-title>\n\n </mat-expansion-panel-header>\n\n <div class=\"content\">\n <mat-divider></mat-divider>\n\n <div style=\"padding: 16px;background: black;\n color: cadetblue; border-radius:8px;min-width:fit-content\">\n <pre>{{getValue|json}}</pre>\n </div>\n </div>\n </mat-expansion-panel>\n\n\n</mat-accordion>", styles: ["mat-tree{min-width:fit-content;background:azure}mat-tree-node{min-height:28px!important;height:32px!important}.breadcrumb-container{display:flex;align-items:center;flex-wrap:wrap;padding:8px 0}.breadcrumb-item{display:inline-flex;align-items:center;margin:0;transition:background-color .3s ease}.breadcrumb-separator{margin:0}.breadcrumb-separator .mat-icon{font-size:16px;width:16px;height:16px}.info-icon{width:38px}mat-expansion-panel-header{padding-left:16px;padding-right:16px}mat-expansion-panel{background:var(--mat-sys-surface-container, var(--mat-app-surface))}.tree-instructions{display:flex;align-items:center;gap:8px;padding:12px;background:var(--mdc-elevated-card-container-color, var(--mat-app-surface-container-low));border-radius:4px;margin-bottom:16px}.node-spacer{width:24px;padding:0}.node-checkbox{width:100%}.node-key{font-weight:500;color:#2c2c2c}.node-value{font-family:monospace;padding:2px 6px;background:#f8f9fa;border-radius:3px;font-size:.9em}.suggestion-container{display:flex;width:100%;gap:14px}.suggestion-column{flex:1;min-width:0}.button-container{display:flex;flex-wrap:wrap}.suggestion-button{height:auto;text-transform:capitalize;margin:2px;padding:8px;line-height:normal;text-align:left;font-size:.8em}h5{margin-bottom:8px;font-size:1em}.title-icon{margin-right:8px;vertical-align:middle}mat-form-field{width:100%;background:azure}.functions{color:var(--mat-full-pseudo-checkbox-selected-icon-color)}.function-number{font-size:smaller;display:flex;align-items:center;justify-content:center;margin-right:8px;margin-left:8px}.search-field{width:100%;padding:8px;border:1px solid var(--mat-divider-color, var(--mat-app-outline));border-radius:4px;margin-left:0}.search-container{padding-left:8px;padding-right:8px;height:48px;background:inherit;margin-top:0;height:fit-content}.showSuggestionContainer{background:azure}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.JsonPipe, name: "json" }, { kind: "pipe", type: i2.TitleCasePipe, name: "titlecase" }, { kind: "ngmodule", type: MatModulesModule }, { kind: "component", type: i3.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { 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: i4.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: "component", type: i4$1.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: i5$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.MatNavList, selector: "mat-nav-list", exportAs: ["matNavList"] }, { kind: "component", type: i6.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "directive", type: i6.MatListItemIcon, selector: "[matListItemIcon]" }, { kind: "directive", type: i6.MatListItemTitle, selector: "[matListItemTitle]" }, { kind: "directive", type: i6.MatListItemMeta, selector: "[matListItemMeta]" }, { 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: "component", type: i3$1.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i9.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "directive", type: i4$2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i3$2.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i3$2.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { kind: "directive", type: i3$2.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i3$2.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i3$2.MatTreeNode, selector: "mat-tree-node", inputs: ["tabIndex", "disabled"], outputs: ["activation", "expandedChange"], exportAs: ["matTreeNode"] }, { kind: "directive", type: i12.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: "ngmodule", type: FormsModule }] }); }
265
- }
266
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.6", ngImport: i0, type: DataTreeComponent, decorators: [{
267
- type: Component,
268
- args: [{ selector: 'app-data-tree', standalone: true, imports: [CommonModule, MatModulesModule, FormsModule], template: "<mat-accordion multi>\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"title-icon\">dataset_linked</mat-icon>\n Navigate and select data fields for mapping\n </mat-panel-title>\n </mat-expansion-panel-header>\n\n <div class=\"content\">\n <div class=\"tree-instructions\">\n <mat-icon class=\"info-icon\" color=\"primary\">info</mat-icon>\n <span>Click checkboxes to select fields for mapping. Selected paths will be highlighted.</span>\n </div>\n <mat-divider></mat-divider>\n\n <mat-tree [dataSource]=\"treeClass.dataSource\" \n [treeControl]=\"treeClass.treeControl\">\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodePadding>\n <button disabled class=\"node-spacer\" aria-hidden=\"true\" mat-icon-button>\n\n </button>\n <mat-checkbox (change)=\"update(node)\" [checked]=\"nodeIsChecked(node)\" class=\"node-checkbox\"\n [matTooltip]=\"'Map data field: ' + node.key\">\n <span class=\"node-key\" [attr.aria-label]=\"'Field name: ' + node.key\">{{ node.key }}:</span>\n <span [attr.aria-label]=\"'Field value: ' + node.value\" style=\" white-space: nowrap;\" class=\"node-value\"\n [style.color]=\"getNodeValueColor(node.value)\">\n {{ node.value }}\n </span>\n </mat-checkbox>\n </mat-tree-node>\n\n <mat-tree-node *matTreeNodeDef=\"let node; when: treeClass.hasChild\" matTreeNodePadding>\n <button style=\"padding: 0px; \n width: 24px;\" mat-icon-button matTreeNodeToggle [attr.aria-label]=\"'Toggle ' + node.key\">\n <mat-icon>\n {{ treeClass.treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\n </mat-icon>\n </button>\n <mat-checkbox (change)=\"update(node)\" [checked]=\"nodeIsChecked(node)\" [matTooltip]=\"'Select ' + node.key\">\n <span class=\"node-key\">{{ node.key }}</span>\n </mat-checkbox>\n </mat-tree-node>\n </mat-tree>\n </div>\n </mat-expansion-panel>\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"title-icon\">rebase_edit</mat-icon>\n Configure and transform your data path\n </mat-panel-title>\n </mat-expansion-panel-header>\n\n <div class=\"content\">\n <div class=\"tree-instructions\" *ngIf=\"treeClass.activePath.length === 0\">\n <mat-icon class=\"info-icon\" color=\"primary\">info</mat-icon>\n <span>Select a node from the tree above to begin mapping data</span>\n </div>\n <mat-divider></mat-divider>\n <mat-toolbar style=\" height: fit-content; background: inherit;\">\n <div class=\"breadcrumb-container\">\n\n <ng-container *ngFor=\"let path of treeClass.activePath; trackBy: trackByFn; last as isLast; index as i\">\n <button *ngIf=\"!path.inEdit\" matTooltip=\"Click to edit\" (click)=\"setupPath(path)\" mat-button\n [disabled]=\"!path.keyIsArrayIndex\" [color]=\"path.functions.length> 0 ? 'accent' : ''\"\n class=\"breadcrumb-item\">\n <mat-icon>{{ path.keyIsArrayIndex ? 'filter_none' : 'folder' }}</mat-icon>\n <span>{{ path.key }}</span>\n </button>\n\n\n <button *ngIf=\"!!path.inEdit\" matTooltip=\"Currently editing\" (click)=\"removeFunction(path.key)\"\n mat-raised-button color=\"primary\" class=\"breadcrumb-item\">\n <mat-icon>check_circle</mat-icon>\n <span>{{ path.key }}</span>\n </button>\n <mat-icon *ngIf=\"!isLast\" class=\"breadcrumb-separator\">chevron_right</mat-icon>\n </ng-container>\n </div>\n </mat-toolbar>\n <div *ngIf=\"!!hasANodeInEdit()\">\n\n <mat-nav-list>\n\n <ng-container *ngFor=\"let function of this.treeClass.pathInEdit?.functions;index as i\">\n <mat-list-item \n [activated]=\"!!function.inEdit\"\n class=\"functions\" style=\"height: fit-content;\">\n <span matListItemIcon class=\"function-number\" > \n <strong> {{i+1}} </strong>\n </span>\n <a \n\n (click)=\"editFunction(function.id)\"\n \n style=\"font-size: 14px; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;\"\n matListItemTitle> {{ (function.function |titlecase) ||\n 'Function configurations required'}}</a>\n <button mat-icon-button \n (click)=\"removeFunction(function.id)\" matListItemMeta>\n\n <mat-icon [color]=\"function.function && function.expression?'':'warn'\">{{!function.inEdit? 'close':'check_circle'}}</mat-icon>\n </button>\n \n \n </mat-list-item>\n \n <div class=\"function-edit-container\" *ngIf=\"function.inEdit\">\n <mat-divider></mat-divider>\n <mat-form-field subscriptSizing=\"dynamic\" style=\" margin-bottom: 8px;\" appearance=\"outline\" *ngIf=\"this.treeClass.pathInEdit?.functions\">\n <mat-label>Array function</mat-label>\n <mat-select matNativeControl [value]=\"getFunctionInEdit()?.function\"\n (selectionChange)=\"functionChanged($event)\" placeholder=\"ChooseFunctionToRun\">\n <mat-option value=\"filter\">filter</mat-option>\n <mat-option value=\"find\">find</mat-option>\n <mat-option value=\"map\">map</mat-option>\n </mat-select>\n <mat-hint>\n Choose a function to run on the array\n </mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"outline\" *ngIf=\"this.treeClass.pathInEdit?.functions\">\n <mat-label >Condition expression</mat-label>\n <textarea matInput #textarea \n [value]=\"getFunctionInEdit()?.expression\"\n (input)=\"onTextChange($event)\" (focus)=\"onFocus($event)\"\n \n placeholder=\"Enter a validation string for the function\"></textarea>\n <mat-hint>\n {{ showSuggestions ? 'Suggestions are enabled' : 'Enter a condition expression to transform the array' }}\n </mat-hint>\n </mat-form-field>\n <section *ngIf=\"showSuggestions\" \n class=\"showSuggestionContainer\">\n <!-- <mat-toolbar class=\"search-container\" style=\"background: inherit;\">\n \n \n <input type=\"search\" \n placeholder=\"Search api\" \n class=\"search-field\"\n (change)=\"onSearchChange($event)\"> \n \n <mat-icon>\n search\n </mat-icon>\n </mat-toolbar> -->\n <mat-divider></mat-divider>\n <div style=\"padding: 8px;\" class=\"\">\n <div class=\"suggestion-container\">\n <div class=\"suggestion-column\">\n <h5>Logical Operators</h5>\n <div class=\"button-container\">\n <button \n color=\"primary\" \n mat-flat-button *ngFor=\"let method of getMethods()\"\n (click)=\"selectSuggestionInput(method.value)\" class=\"suggestion-button\">\n {{ method.label | titlecase }}\n </button>\n </div>\n </div>\n <div class=\"suggestion-column\">\n <h5>Add Input as a Variable</h5>\n <div class=\"button-container\">\n <button *ngFor=\"let input of getAllInputs()\"\n mat-flat-button\n (click)=\"selectSuggestionInput(input.formControlName)\" class=\"suggestion-button\">\n {{ input.label | titlecase }}\n </button>\n </div>\n </div>\n <!-- <div class=\"suggestion-column\">\n <h5>Array path Object </h5>\n <div class=\"button-container\">\n <button *ngFor=\"let input of getValueVariables()\"\n color=\"accent\"\n mat-flat-button\n (click)=\"selectSuggestionInput(input)\" class=\"suggestion-button\">\n {{ input}}\n </button>\n </div>\n </div> -->\n </div>\n <div class=\"suggestion-container\">\n \n </div>\n \n </div>\n </section>\n \n\n <mat-toolbar style=\"background:none\">\n <span class=\"spacer\"></span>\n\n <button (click)=\"reset()\" mat-flat-button>\n reset\n </button>\n <button (click)=\"saveNodeInEdit()\" [disabled]=\"!function.expression && !function.function\" mat-flat-button\n color=\"primary\">\n save\n </button>\n\n </mat-toolbar>\n </div>\n <mat-divider></mat-divider>\n </ng-container>\n\n </mat-nav-list>\n <ol>\n\n </ol>\n <button (click)=\"addNewFunction()\" mat-button>+ Add function </button>\n </div>\n </div>\n </mat-expansion-panel>\n\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"title-icon\">dataset</mat-icon>\n Mapped Data Value Based on the Active Path\n </mat-panel-title>\n\n </mat-expansion-panel-header>\n\n <div class=\"content\">\n <mat-divider></mat-divider>\n\n <div style=\"padding: 16px;background: black;\n color: cadetblue; border-radius:8px;min-width:fit-content\">\n <pre>{{getValue|json}}</pre>\n </div>\n </div>\n </mat-expansion-panel>\n\n\n</mat-accordion>", styles: ["mat-tree{min-width:fit-content;background:azure}mat-tree-node{min-height:28px!important;height:32px!important}.breadcrumb-container{display:flex;align-items:center;flex-wrap:wrap;padding:8px 0}.breadcrumb-item{display:inline-flex;align-items:center;margin:0;transition:background-color .3s ease}.breadcrumb-separator{margin:0}.breadcrumb-separator .mat-icon{font-size:16px;width:16px;height:16px}.info-icon{width:38px}mat-expansion-panel-header{padding-left:16px;padding-right:16px}mat-expansion-panel{background:var(--mat-sys-surface-container, var(--mat-app-surface))}.tree-instructions{display:flex;align-items:center;gap:8px;padding:12px;background:var(--mdc-elevated-card-container-color, var(--mat-app-surface-container-low));border-radius:4px;margin-bottom:16px}.node-spacer{width:24px;padding:0}.node-checkbox{width:100%}.node-key{font-weight:500;color:#2c2c2c}.node-value{font-family:monospace;padding:2px 6px;background:#f8f9fa;border-radius:3px;font-size:.9em}.suggestion-container{display:flex;width:100%;gap:14px}.suggestion-column{flex:1;min-width:0}.button-container{display:flex;flex-wrap:wrap}.suggestion-button{height:auto;text-transform:capitalize;margin:2px;padding:8px;line-height:normal;text-align:left;font-size:.8em}h5{margin-bottom:8px;font-size:1em}.title-icon{margin-right:8px;vertical-align:middle}mat-form-field{width:100%;background:azure}.functions{color:var(--mat-full-pseudo-checkbox-selected-icon-color)}.function-number{font-size:smaller;display:flex;align-items:center;justify-content:center;margin-right:8px;margin-left:8px}.search-field{width:100%;padding:8px;border:1px solid var(--mat-divider-color, var(--mat-app-outline));border-radius:4px;margin-left:0}.search-container{padding-left:8px;padding-right:8px;height:48px;background:inherit;margin-top:0;height:fit-content}.showSuggestionContainer{background:azure}\n"] }]
269
- }], ctorParameters: () => [], propDecorators: { data: [{
270
- type: Input
271
- }], value: [{
272
- type: Input
273
- }], formInputs: [{
274
- type: Input
275
- }], pathChanged: [{
276
- type: Output
277
- }], textareaElementRef: [{
278
- type: ViewChild,
279
- args: ['textarea', { read: ElementRef, static: false }]
280
- }] } });
281
-
282
- class ApiValueAccessRulesComponent {
283
- static { this.nextId = 0; }
284
- constructor(ngControl, _elementRef, httpClient) {
285
- this.ngControl = ngControl;
286
- this._elementRef = _elementRef;
287
- this.httpClient = httpClient;
288
- this.stateChanges = new Subject();
289
- this.id = `app-api-value-access-rules-${ApiValueAccessRulesComponent.nextId++}`;
290
- this.placeholder = '';
291
- this.focused = false;
292
- this.required = false;
293
- this.disabled = false;
294
- this.touched = false;
295
- this.onTouched = () => { };
296
- this.errors = [];
297
- this.value = [];
298
- this.formInputs = [];
299
- this.valueChanged = new EventEmitter();
300
- this.reload = new EventEmitter();
301
- this.loading = false;
302
- this.postManFolderItems = [];
303
- }
304
- get empty() {
305
- return !this.value;
306
- }
307
- get shouldLabelFloat() {
308
- return this.focused || !this.empty;
309
- }
310
- get errorState() {
311
- const hasError = !!this.ngControl?.control?.errors || (this.errors || []).length > 0 && this.touched;
312
- return !this.value && !!this.required || hasError;
313
- }
314
- setDescribedByIds(ids) {
315
- // Ensure the component view is initialized
316
- if (this._elementRef && this._elementRef.nativeElement) {
317
- const controlElement = this._elementRef.nativeElement.querySelector('.app-api-value-access-rules');
318
- // Check if the controlElement exists before attempting to set its attribute
319
- if (controlElement) {
320
- controlElement.setAttribute('aria-describedby', ids.join(' '));
321
- }
322
- }
323
- }
324
- onContainerClick(event) {
325
- this.markAsTouched();
326
- this.stateChanges.next();
327
- }
328
- markAsTouched() {
329
- console.log('markAsTouched');
330
- if (!this.touched) {
331
- this.onTouched();
332
- this.touched = true;
333
- }
334
- }
335
- set postmanCollectionConfig(postmanCollectionConfig) {
336
- if (!_.isEqual(this._postManCollectionConfig, postmanCollectionConfig)) {
337
- this._postManCollectionConfig = postmanCollectionConfig;
338
- this.initializePostmanService();
339
- }
340
- }
341
- get postmanCollectionConfig() {
342
- return this._postManCollectionConfig;
343
- }
344
- get computedValue() {
345
- const invalidType = this.value instanceof Array || typeof this.value === 'string';
346
- if (this.multipleBind && invalidType && !this.value) {
347
- return {};
348
- }
349
- return this.value;
350
- }
351
- pathChanged(path, control) {
352
- if (!Array.isArray(path)) {
353
- return;
354
- }
355
- if (!control) {
356
- this.valueChanged.emit(path);
357
- return;
358
- }
359
- if (this.value instanceof Array || typeof this.value === 'string') {
360
- this.value = {};
361
- }
362
- const newValue = { ...this.value };
363
- newValue[control] = path;
364
- this.valueChanged.emit(newValue);
365
- }
366
- isValidConfig(config) {
367
- return Boolean(config?.collectionUrl && config?.collectionKey);
368
- }
369
- initializePostmanService() {
370
- 8;
371
- const isValidConfig = this.isValidConfig(this.postmanCollectionConfig);
372
- if (!isValidConfig) {
373
- this.error = new HttpErrorResponse({
374
- error: 'Invalid Postman Collection Config',
375
- });
376
- return;
377
- }
378
- const { collectionUrl, collectionKey } = this.postmanCollectionConfig;
379
- const requestOptions = {
380
- params: {
381
- apikey: collectionKey,
382
- clearSystemHeaders: true
383
- },
384
- headers: {
385
- 'Content-Type': 'application/json',
386
- }
387
- };
388
- this.loading = true;
389
- this.httpClient.get(collectionUrl, requestOptions).pipe(take(1), tap((data) => {
390
- // To ensure the data can be shown as a tree
391
- this.postManFolderItems = flatApiList(data.collection.item);
392
- this.error = undefined;
393
- this.loading = false;
394
- }), catchError((err) => {
395
- this.loading = false;
396
- this.error = err;
397
- console.error(err);
398
- return throwError(err);
399
- })).subscribe();
400
- }
401
- get postmanResponseBody() {
402
- const { response } = this.postManFolderItems.find((item) => item.id === this.mapToData) || {};
403
- let responseBody = JSON.parse(response?.[0]?.body || '{}');
404
- return responseBody;
405
- }
406
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.6", ngImport: i0, type: ApiValueAccessRulesComponent, deps: [{ token: i1.NgControl, optional: true, self: true }, { token: i0.ElementRef }, { token: i1$1.HttpClient }], target: i0.ɵɵFactoryTarget.Component }); }
407
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.6", type: ApiValueAccessRulesComponent, isStandalone: true, selector: "app-api-value-access-rules", inputs: { disabled: "disabled", multipleBind: "multipleBind", errors: "errors", value: "value", mapToData: "mapToData", formInputs: "formInputs", postmanCollectionConfig: "postmanCollectionConfig" }, outputs: { valueChanged: "valueChanged", reload: "reload" }, host: { properties: { "id": "this.id" } }, providers: [{ provide: MatFormFieldControl, useExisting: ApiValueAccessRulesComponent }], ngImport: i0, template: "\r\n\r\n\r\n<section *ngFor=\"let controlName of multipleBind||[]\">\r\n <label [for]=\"controlName\">Map <strong>{{controlName}}</strong></label>\r\n <app-data-tree \r\n [formInputs]=\"formInputs\"\r\n (pathChanged)=\"pathChanged($event,controlName)\" \r\n [data]=\"postmanResponseBody\" [value]=\"computedValue[controlName]||''\" ></app-data-tree>\r\n</section>\r\n\r\n\r\n<app-data-tree \r\n*ngIf=\"!multipleBind\"\r\n(pathChanged)=\"pathChanged($event)\" \r\n [formInputs]=\"formInputs\"\r\n[data]=\"postmanResponseBody\" [value]=\"computedValue\"></app-data-tree>\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", styles: [".labelM{font-size:13px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: DataTreeComponent, selector: "app-data-tree", inputs: ["data", "value", "formInputs"], outputs: ["pathChanged"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i5$2.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }] }); }
408
- }
409
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.6", ngImport: i0, type: ApiValueAccessRulesComponent, decorators: [{
410
- type: Component,
411
- args: [{ selector: 'app-api-value-access-rules', standalone: true, imports: [CommonModule, DataTreeComponent, OverlayModule], providers: [{ provide: MatFormFieldControl, useExisting: ApiValueAccessRulesComponent }], template: "\r\n\r\n\r\n<section *ngFor=\"let controlName of multipleBind||[]\">\r\n <label [for]=\"controlName\">Map <strong>{{controlName}}</strong></label>\r\n <app-data-tree \r\n [formInputs]=\"formInputs\"\r\n (pathChanged)=\"pathChanged($event,controlName)\" \r\n [data]=\"postmanResponseBody\" [value]=\"computedValue[controlName]||''\" ></app-data-tree>\r\n</section>\r\n\r\n\r\n<app-data-tree \r\n*ngIf=\"!multipleBind\"\r\n(pathChanged)=\"pathChanged($event)\" \r\n [formInputs]=\"formInputs\"\r\n[data]=\"postmanResponseBody\" [value]=\"computedValue\"></app-data-tree>\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", styles: [".labelM{font-size:13px}\n"] }]
412
- }], ctorParameters: () => [{ type: i1.NgControl, decorators: [{
413
- type: Optional
414
- }, {
415
- type: Self
416
- }] }, { type: i0.ElementRef }, { type: i1$1.HttpClient }], propDecorators: { id: [{
417
- type: HostBinding
418
- }], disabled: [{
419
- type: Input
420
- }], multipleBind: [{
421
- type: Input
422
- }], errors: [{
423
- type: Input
424
- }], value: [{
425
- type: Input
426
- }], mapToData: [{
427
- type: Input
428
- }], formInputs: [{
429
- type: Input
430
- }], valueChanged: [{
431
- type: Output
432
- }], reload: [{
433
- type: Output
434
- }], postmanCollectionConfig: [{
435
- type: Input
436
- }] } });
437
-
438
- export { ApiValueAccessRulesComponent };
439
- //# sourceMappingURL=ngx-t-forms-api-value-access-rules.component-Drlk8YPy.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ngx-t-forms-api-value-access-rules.component-Drlk8YPy.mjs","sources":["../../../projects/ngx-t-forms/src/lib/shared/functions/searchArray.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/api-value-access-rules/elements/data-tree/data-tree.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/api-value-access-rules/elements/data-tree/data-tree.component.html","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/api-value-access-rules/api-value-access-rules.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/api-value-access-rules/api-value-access-rules.component.html"],"sourcesContent":["export function searchAndOrderArray(\r\n arr: any[],\r\n searchTerm: string,\r\n filterBy: string\r\n): any[] {\r\n // Filter the array based on the search term\r\n const filteredArr = arr.filter((obj) =>\r\n searchTerm\r\n ? obj[filterBy].toLowerCase().includes(searchTerm.toLowerCase())\r\n : true\r\n );\r\n\r\n // Order the filtered array alphabetically by name\r\n const orderedArr = filteredArr.sort((a, b) =>\r\n a[filterBy].localeCompare(b[filterBy])\r\n );\r\n\r\n return orderedArr;\r\n}\r\n","import { Component, ElementRef, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild } from '@angular/core';\r\n\r\nimport { CommonModule } from '@angular/common';\r\n\r\n\r\nimport { FormsModule } from '@angular/forms';\r\n\r\n\r\n\r\nimport { TreeComponent } from '../../functions/convertDataToTree';\r\nimport { FlatNode, TreeNode } from 'ngx-t-forms-types';\r\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\r\nimport { searchAndOrderArray } from '../../../../../../shared/functions/searchArray';\r\nimport { FormColumnInputs } from 'ngx-t-forms-types';;\r\nimport { MatSelectChange } from '@angular/material/select';\r\n\r\n\r\n@Component({\r\n selector: 'app-data-tree',\r\n templateUrl: './data-tree.component.html',\r\n styleUrls: ['./data-tree.component.scss'],\r\n standalone: true,\r\n imports: [CommonModule, MatModulesModule, FormsModule]\r\n})\r\nexport class DataTreeComponent implements OnInit, OnChanges {\r\n treeClass!: TreeComponent\r\n @Input() data: any;\r\n @Input() value: TreeNode[] | string = [];\r\n @Input() formInputs:FormColumnInputs[] = []\r\n @Output() pathChanged = new EventEmitter<TreeNode[] | string>()\r\n\r\n constructor() {\r\n this.treeClass = new TreeComponent();\r\n }\r\n _data: any\r\n _value: TreeNode[] | string = []\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['data']) {\r\n if (JSON.stringify(this._data) !== JSON.stringify(changes['data'].currentValue)) {\r\n this._data = changes['data'].currentValue\r\n this.treeClass.computeTreeData(changes['data'].currentValue)\r\n \r\n if (this.value && Array.isArray(this.value) && this.value.length > 0 && 'functions' in (this.value?.[0]||{})) {\r\n this.treeClass.updateStateFromPath(this.value as TreeNode[])\r\n }\r\n }\r\n }\r\n if (changes['value']) {\r\n this.valueChangedSetPath(changes['value'].currentValue)\r\n }\r\n }\r\n ngOnInit() {\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\r\n\r\n showSuggestions = false;\r\n suggestions = ['$option1', '$option2', '$option3', '$custom'];\r\n filteredSuggestions: string[] = [];\r\n cursorPosition = 0;\r\n valueChangedSetPath(newPath: TreeNode[] | string) {\r\n const isSameAsNewPath = typeof newPath === typeof this._value && JSON.stringify(newPath) === JSON.stringify(this._value)\r\n if (!isSameAsNewPath && Array.isArray(newPath)) {\r\n this._value = newPath\r\n this.treeClass.updateStateFromPath(newPath as TreeNode[])\r\n }\r\n }\r\n async onTextChange(event: Event) {\r\n const newValue =(event.target as HTMLInputElement).value;\r\n const functions = this.treeClass.pathInEdit!.functions!.find(f => f.inEdit)\r\n functions!.expression = newValue;\r\n this.treeClass.pathInEdit!.functions.map(f => {\r\n if (f.inEdit) {\r\n return functions\r\n }\r\n return f\r\n })\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 if (lastChar === '$') {\r\n this.showSuggestions = true;\r\n this.filteredSuggestions = this.suggestions;\r\n } else {\r\n this.showSuggestions = false;\r\n }\r\n }\r\n functionChanged(event:MatSelectChange) {\r\n this.treeClass.functionChanged(event.value)\r\n }\r\n addNewFunction() {\r\n\r\n this.treeClass.addNewFunction()\r\n\r\n }\r\n editFunction(id: string) {\r\n\r\n\r\n this.treeClass.pathInEdit!.functions = this.treeClass.pathInEdit!.functions?.map(f => {\r\n if (f.id === id) {\r\n return { ...f, inEdit: true }\r\n }\r\n return { ...f, inEdit: false }\r\n\r\n })\r\n\r\n }\r\n selectSuggestionInput(suggestion: string) {\r\n\r\n const functions = this.treeClass.pathInEdit!.functions.find(f => f.inEdit) || {} as any\r\n const value = functions?.expression || ''\r\n const beforeCursor = value.slice(0, this.cursorPosition - 1);\r\n const afterCursor = value.slice(this.cursorPosition);\r\n functions.expression = beforeCursor + suggestion + ' ' + afterCursor;\r\n this.treeClass.pathInEdit!.functions.map(f => {\r\n if (f.inEdit) {\r\n return functions\r\n }\r\n return f\r\n })\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\r\n onFocus(event:FocusEvent) {\r\n const textarea = this.textareaElementRef.nativeElement;\r\n this.cursorPosition = textarea.selectionStart || 0;\r\n }\r\n nodeIsChecked(node: FlatNode) {\r\n return this.treeClass.nodeIsChecked(node)\r\n }\r\n hasANodeInEdit() {\r\n return this.treeClass.hasANodeInEdit()\r\n }\r\n showNode(node: FlatNode) {\r\n return this.treeClass.showNode(node)\r\n }\r\n onSearchChange(event: Event) {\r\n this.optionsSearch = (event.target as HTMLInputElement).value;\r\n\r\n }\r\n\r\n methods = [\r\n // Logical Operators\r\n {\r\n label: 'logical AND (&&)',\r\n value: '&&'\r\n },\r\n {\r\n label: 'logical OR (||)',\r\n value: '||'\r\n },\r\n\r\n // Comparison Operators\r\n {\r\n label: 'strict equality (===)',\r\n value: '==='\r\n },\r\n {\r\n label: 'loose equality (==)',\r\n value: '=='\r\n },\r\n {\r\n label: 'strict inequality (!==)',\r\n value: '!=='\r\n },\r\n {\r\n label: 'loose inequality (!=)',\r\n value: '!='\r\n },\r\n {\r\n label: 'greater than (>)',\r\n value: '>'\r\n },\r\n {\r\n label: 'less than (<)',\r\n value: '<'\r\n },\r\n {\r\n label: 'greater than or equal to (>=)',\r\n value: '>='\r\n },\r\n {\r\n label: 'less than or equal to (<=)',\r\n value: '<='\r\n }\r\n ];\r\n getMethods() {\r\n return searchAndOrderArray(this.methods, this.optionsSearch, 'label');\r\n }\r\n getNodeValueColor(v: any) {\r\n const valueType = typeof v\r\n switch (valueType) {\r\n case 'string':\r\n return '#c56100'\r\n case 'number':\r\n return 'mediumblue'\r\n case 'boolean':\r\n return 'forestgreen'\r\n case 'object':\r\n return '#005959'\r\n default:\r\n return 'currentcolor'\r\n }\r\n }\r\n setupPath(node: TreeNode) {\r\n return this.treeClass.setupPath(node)\r\n }\r\n trackByFn(index: number, node: TreeNode): string {\r\n return node.path.join('.')\r\n }\r\n showValue: boolean = false\r\n optionsSearch!: string\r\n getAllInputs() {\r\n const inputs = this.formInputs\r\n .filter((inp) => !inp.multipleInputInEditId);\r\n return searchAndOrderArray(inputs||[], this.optionsSearch, 'label');\r\n }\r\n getValueVariables(): string[] {\r\n const isObject = typeof this.value === 'object'\r\n if(!this.value){\r\n return []\r\n }\r\n if(!isObject && !!this.value){\r\n return [this.value as any]\r\n }\r\n if(Array.isArray(this.value)){\r\n return this.value.map((v,i) => (i)) as any\r\n }\r\n return Object.keys(this.value)\r\n }\r\n saveNodeInEdit() {\r\n const newP = this.treeClass.saveNodeInEdit()\r\n if(newP){\r\n this.pathChanged.emit(newP)\r\n }\r\n \r\n }\r\n closeEdit() {\r\n this.treeClass.closeEdit()\r\n\r\n\r\n }\r\n reset() {\r\n this.treeClass.resetNode()\r\n }\r\n getFunctionInEdit() {\r\n const node = this.treeClass.pathInEdit\r\n return node?.functions?.find(f => f.inEdit)\r\n }\r\n get getValue (){\r\n return this.treeClass.getValue()\r\n }\r\n removeFunction(id: string) {\r\n this.treeClass.removeFunction(id)\r\n }\r\n update(node: any) {\r\n\r\n const path = this.treeClass.selectNode(node)?.map(p => ({\r\n ...p,\r\n children: undefined,\r\n value: undefined\r\n }))\r\n\r\n\r\n this.pathChanged.emit(path)\r\n }\r\n}\r\n","<mat-accordion multi>\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"title-icon\">dataset_linked</mat-icon>\n Navigate and select data fields for mapping\n </mat-panel-title>\n </mat-expansion-panel-header>\n\n <div class=\"content\">\n <div class=\"tree-instructions\">\n <mat-icon class=\"info-icon\" color=\"primary\">info</mat-icon>\n <span>Click checkboxes to select fields for mapping. Selected paths will be highlighted.</span>\n </div>\n <mat-divider></mat-divider>\n\n <mat-tree [dataSource]=\"treeClass.dataSource\" \n [treeControl]=\"treeClass.treeControl\">\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodePadding>\n <button disabled class=\"node-spacer\" aria-hidden=\"true\" mat-icon-button>\n\n </button>\n <mat-checkbox (change)=\"update(node)\" [checked]=\"nodeIsChecked(node)\" class=\"node-checkbox\"\n [matTooltip]=\"'Map data field: ' + node.key\">\n <span class=\"node-key\" [attr.aria-label]=\"'Field name: ' + node.key\">{{ node.key }}:</span>\n <span [attr.aria-label]=\"'Field value: ' + node.value\" style=\" white-space: nowrap;\" class=\"node-value\"\n [style.color]=\"getNodeValueColor(node.value)\">\n {{ node.value }}\n </span>\n </mat-checkbox>\n </mat-tree-node>\n\n <mat-tree-node *matTreeNodeDef=\"let node; when: treeClass.hasChild\" matTreeNodePadding>\n <button style=\"padding: 0px; \n width: 24px;\" mat-icon-button matTreeNodeToggle [attr.aria-label]=\"'Toggle ' + node.key\">\n <mat-icon>\n {{ treeClass.treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\n </mat-icon>\n </button>\n <mat-checkbox (change)=\"update(node)\" [checked]=\"nodeIsChecked(node)\" [matTooltip]=\"'Select ' + node.key\">\n <span class=\"node-key\">{{ node.key }}</span>\n </mat-checkbox>\n </mat-tree-node>\n </mat-tree>\n </div>\n </mat-expansion-panel>\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"title-icon\">rebase_edit</mat-icon>\n Configure and transform your data path\n </mat-panel-title>\n </mat-expansion-panel-header>\n\n <div class=\"content\">\n <div class=\"tree-instructions\" *ngIf=\"treeClass.activePath.length === 0\">\n <mat-icon class=\"info-icon\" color=\"primary\">info</mat-icon>\n <span>Select a node from the tree above to begin mapping data</span>\n </div>\n <mat-divider></mat-divider>\n <mat-toolbar style=\" height: fit-content; background: inherit;\">\n <div class=\"breadcrumb-container\">\n\n <ng-container *ngFor=\"let path of treeClass.activePath; trackBy: trackByFn; last as isLast; index as i\">\n <button *ngIf=\"!path.inEdit\" matTooltip=\"Click to edit\" (click)=\"setupPath(path)\" mat-button\n [disabled]=\"!path.keyIsArrayIndex\" [color]=\"path.functions.length> 0 ? 'accent' : ''\"\n class=\"breadcrumb-item\">\n <mat-icon>{{ path.keyIsArrayIndex ? 'filter_none' : 'folder' }}</mat-icon>\n <span>{{ path.key }}</span>\n </button>\n\n\n <button *ngIf=\"!!path.inEdit\" matTooltip=\"Currently editing\" (click)=\"removeFunction(path.key)\"\n mat-raised-button color=\"primary\" class=\"breadcrumb-item\">\n <mat-icon>check_circle</mat-icon>\n <span>{{ path.key }}</span>\n </button>\n <mat-icon *ngIf=\"!isLast\" class=\"breadcrumb-separator\">chevron_right</mat-icon>\n </ng-container>\n </div>\n </mat-toolbar>\n <div *ngIf=\"!!hasANodeInEdit()\">\n\n <mat-nav-list>\n\n <ng-container *ngFor=\"let function of this.treeClass.pathInEdit?.functions;index as i\">\n <mat-list-item \n [activated]=\"!!function.inEdit\"\n class=\"functions\" style=\"height: fit-content;\">\n <span matListItemIcon class=\"function-number\" > \n <strong> {{i+1}} </strong>\n </span>\n <a \n\n (click)=\"editFunction(function.id)\"\n \n style=\"font-size: 14px; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;\"\n matListItemTitle> {{ (function.function |titlecase) ||\n 'Function configurations required'}}</a>\n <button mat-icon-button \n (click)=\"removeFunction(function.id)\" matListItemMeta>\n\n <mat-icon [color]=\"function.function && function.expression?'':'warn'\">{{!function.inEdit? 'close':'check_circle'}}</mat-icon>\n </button>\n \n \n </mat-list-item>\n \n <div class=\"function-edit-container\" *ngIf=\"function.inEdit\">\n <mat-divider></mat-divider>\n <mat-form-field subscriptSizing=\"dynamic\" style=\" margin-bottom: 8px;\" appearance=\"outline\" *ngIf=\"this.treeClass.pathInEdit?.functions\">\n <mat-label>Array function</mat-label>\n <mat-select matNativeControl [value]=\"getFunctionInEdit()?.function\"\n (selectionChange)=\"functionChanged($event)\" placeholder=\"ChooseFunctionToRun\">\n <mat-option value=\"filter\">filter</mat-option>\n <mat-option value=\"find\">find</mat-option>\n <mat-option value=\"map\">map</mat-option>\n </mat-select>\n <mat-hint>\n Choose a function to run on the array\n </mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"outline\" *ngIf=\"this.treeClass.pathInEdit?.functions\">\n <mat-label >Condition expression</mat-label>\n <textarea matInput #textarea \n [value]=\"getFunctionInEdit()?.expression\"\n (input)=\"onTextChange($event)\" (focus)=\"onFocus($event)\"\n \n placeholder=\"Enter a validation string for the function\"></textarea>\n <mat-hint>\n {{ showSuggestions ? 'Suggestions are enabled' : 'Enter a condition expression to transform the array' }}\n </mat-hint>\n </mat-form-field>\n <section *ngIf=\"showSuggestions\" \n class=\"showSuggestionContainer\">\n <!-- <mat-toolbar class=\"search-container\" style=\"background: inherit;\">\n \n \n <input type=\"search\" \n placeholder=\"Search api\" \n class=\"search-field\"\n (change)=\"onSearchChange($event)\"> \n \n <mat-icon>\n search\n </mat-icon>\n </mat-toolbar> -->\n <mat-divider></mat-divider>\n <div style=\"padding: 8px;\" class=\"\">\n <div class=\"suggestion-container\">\n <div class=\"suggestion-column\">\n <h5>Logical Operators</h5>\n <div class=\"button-container\">\n <button \n color=\"primary\" \n mat-flat-button *ngFor=\"let method of getMethods()\"\n (click)=\"selectSuggestionInput(method.value)\" class=\"suggestion-button\">\n {{ method.label | titlecase }}\n </button>\n </div>\n </div>\n <div class=\"suggestion-column\">\n <h5>Add Input as a Variable</h5>\n <div class=\"button-container\">\n <button *ngFor=\"let input of getAllInputs()\"\n mat-flat-button\n (click)=\"selectSuggestionInput(input.formControlName)\" class=\"suggestion-button\">\n {{ input.label | titlecase }}\n </button>\n </div>\n </div>\n <!-- <div class=\"suggestion-column\">\n <h5>Array path Object </h5>\n <div class=\"button-container\">\n <button *ngFor=\"let input of getValueVariables()\"\n color=\"accent\"\n mat-flat-button\n (click)=\"selectSuggestionInput(input)\" class=\"suggestion-button\">\n {{ input}}\n </button>\n </div>\n </div> -->\n </div>\n <div class=\"suggestion-container\">\n \n </div>\n \n </div>\n </section>\n \n\n <mat-toolbar style=\"background:none\">\n <span class=\"spacer\"></span>\n\n <button (click)=\"reset()\" mat-flat-button>\n reset\n </button>\n <button (click)=\"saveNodeInEdit()\" [disabled]=\"!function.expression && !function.function\" mat-flat-button\n color=\"primary\">\n save\n </button>\n\n </mat-toolbar>\n </div>\n <mat-divider></mat-divider>\n </ng-container>\n\n </mat-nav-list>\n <ol>\n\n </ol>\n <button (click)=\"addNewFunction()\" mat-button>+ Add function </button>\n </div>\n </div>\n </mat-expansion-panel>\n\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"title-icon\">dataset</mat-icon>\n Mapped Data Value Based on the Active Path\n </mat-panel-title>\n\n </mat-expansion-panel-header>\n\n <div class=\"content\">\n <mat-divider></mat-divider>\n\n <div style=\"padding: 16px;background: black;\n color: cadetblue; border-radius:8px;min-width:fit-content\">\n <pre>{{getValue|json}}</pre>\n </div>\n </div>\n </mat-expansion-panel>\n\n\n</mat-accordion>","import {\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n HostBinding,\r\n Input,\r\n\r\n Optional,\r\n\r\n Output,\r\n Self,\r\n} from '@angular/core';\r\nimport { TreeNode } from \"ngx-t-forms-types\";\r\nimport { CommonModule } from '@angular/common';\r\nimport { DataTreeComponent } from './elements/data-tree/data-tree.component';\r\nimport { FormColumnInputs } from 'ngx-t-forms-types';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { catchError, Subject, take, tap, throwError } from 'rxjs';\r\nimport { NgControl } from '@angular/forms';\r\nimport { IConfigElementError } from '../../t-dynamic-data-edit.component';\r\nimport { IFolderItem, IGetPostmanCollections, IPostmanCollectionConfig } from \"ngx-t-forms-types\";\r\nimport { HttpClient, HttpErrorResponse } from '@angular/common/http';\r\nimport _ from 'lodash';\r\nimport { flatApiList } from '../postman-collections/functions/convertPostmanCollectionToTree';\r\nimport { OverlayModule } from '@angular/cdk/overlay';\r\n\r\n\r\n\r\n\r\n\r\n@Component({\r\n selector: 'app-api-value-access-rules',\r\n templateUrl: './api-value-access-rules.component.html',\r\n styleUrls: ['./api-value-access-rules.component.scss'],\r\n standalone: true,\r\n imports: [CommonModule, DataTreeComponent,OverlayModule ],\r\n providers: [{ provide: MatFormFieldControl, useExisting: ApiValueAccessRulesComponent}],\r\n})\r\nexport class ApiValueAccessRulesComponent implements MatFormFieldControl<TreeNode[] | string | {[key:string]:TreeNode[] | string}> {\r\n\r\n\r\n static nextId = 0;\r\n stateChanges = new Subject<void>();\r\n\r\n @HostBinding() id = `app-api-value-access-rules-${ApiValueAccessRulesComponent .nextId++}`;\r\n \r\n placeholder: string = ''\r\n constructor(@Optional() @Self() public ngControl: NgControl, private _elementRef: ElementRef<HTMLElement>,private readonly httpClient: HttpClient) { }\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\nget errorState(): boolean {\r\n const hasError = !!this.ngControl?.control?.errors || (this.errors||[]).length > 0 && this.touched\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-api-value-access-rules');\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\r\n\r\n\r\n // currently mapped value\r\n @Input() multipleBind:string[] | undefined\r\n @Input() errors:IConfigElementError[] |undefined = [];\r\n @Input() value: TreeNode[] | string | {[key:string]:TreeNode[] | string} = [];\r\n @Input() mapToData: any\r\n @Input() formInputs:FormColumnInputs[] = []\r\n @Output() valueChanged = new EventEmitter();\r\n @Output() reload = new EventEmitter();\r\n _postManCollectionConfig: IPostmanCollectionConfig | undefined\r\n @Input() set postmanCollectionConfig(postmanCollectionConfig: IPostmanCollectionConfig | undefined){\r\n if(!_.isEqual(this._postManCollectionConfig,postmanCollectionConfig)){\r\n this._postManCollectionConfig = postmanCollectionConfig\r\n this.initializePostmanService()\r\n }\r\n \r\n }\r\n\r\n get postmanCollectionConfig(): IPostmanCollectionConfig | undefined{\r\n return this._postManCollectionConfig\r\n }\r\n \r\n get computedValue():any{\r\n const invalidType =this.value instanceof Array || typeof this.value === 'string' \r\n if(this.multipleBind && invalidType && !this.value){\r\n return {}\r\n }\r\n return this.value\r\n }\r\n pathChanged(path:TreeNode[]|string,control?:string){\r\n if(!Array.isArray(path)){\r\n return\r\n }\r\n if(!control){\r\n this.valueChanged.emit(path)\r\n return\r\n }\r\n if(this.value instanceof Array || typeof this.value === 'string'){\r\n this.value = {}\r\n }\r\n const newValue = {...this.value }\r\n newValue[control] = path\r\n this.valueChanged.emit(newValue)\r\n }\r\n private isValidConfig(config: IPostmanCollectionConfig | undefined): boolean {\r\n return Boolean(config?.collectionUrl && config?.collectionKey);\r\n }\r\n error: HttpErrorResponse | undefined\r\n loading: boolean = false\r\n postManFolderItems:IFolderItem[] = []\r\n private initializePostmanService(): void {\r\n8\r\n const isValidConfig = this.isValidConfig(this.postmanCollectionConfig)\r\n if (!isValidConfig) {\r\n this.error = new HttpErrorResponse({\r\n error: 'Invalid Postman Collection Config',\r\n })\r\n return\r\n }\r\n const { collectionUrl, collectionKey } = this.postmanCollectionConfig!\r\n \r\n const requestOptions = {\r\n params: {\r\n apikey: collectionKey,\r\n clearSystemHeaders: true\r\n },\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n \r\n }\r\n }\r\n this.loading = true\r\n\r\n this.httpClient.get<IGetPostmanCollections>(\r\n collectionUrl,\r\n requestOptions\r\n ).pipe(\r\n take(1),\r\n tap((data) => {\r\n // To ensure the data can be shown as a tree\r\n this.postManFolderItems= flatApiList(data.collection.item) \r\n \r\n this.error = undefined\r\n this.loading = false\r\n }),\r\n catchError((err: HttpErrorResponse) => {\r\n this.loading = false\r\n this.error = err\r\n console.error(err)\r\n return throwError(err)\r\n })\r\n ).subscribe();\r\n }\r\n \r\n get postmanResponseBody(){\r\n \r\n const {response} = this.postManFolderItems.find((item) => item.id === this.mapToData) ||{}\r\n let responseBody = JSON.parse(response?.[0]?.body || '{}')\r\n return responseBody\r\n }\r\n\r\n}\r\n","\r\n\r\n\r\n<section *ngFor=\"let controlName of multipleBind||[]\">\r\n <label [for]=\"controlName\">Map <strong>{{controlName}}</strong></label>\r\n <app-data-tree \r\n [formInputs]=\"formInputs\"\r\n (pathChanged)=\"pathChanged($event,controlName)\" \r\n [data]=\"postmanResponseBody\" [value]=\"computedValue[controlName]||''\" ></app-data-tree>\r\n</section>\r\n\r\n\r\n<app-data-tree \r\n*ngIf=\"!multipleBind\"\r\n(pathChanged)=\"pathChanged($event)\" \r\n [formInputs]=\"formInputs\"\r\n[data]=\"postmanResponseBody\" [value]=\"computedValue\"></app-data-tree>\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":["i1","i2","i3","i5","i6","i7","i8","i9","i10","i11","i12","i13","i4"],"mappings":"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"}