ngx-t-forms 2.0.29 → 2.0.31

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 (161) hide show
  1. package/fesm2022/ngx-t-forms-auto-complete-input-element.component-DCKuXHAW.mjs +104 -0
  2. package/fesm2022/ngx-t-forms-auto-complete-input-element.component-DCKuXHAW.mjs.map +1 -0
  3. package/fesm2022/ngx-t-forms-basic-input-input-element.component-Ce4ipSUc.mjs +85 -0
  4. package/fesm2022/ngx-t-forms-basic-input-input-element.component-Ce4ipSUc.mjs.map +1 -0
  5. package/fesm2022/ngx-t-forms-calculated-field-rules.component-C5TPddVe.mjs +643 -0
  6. package/fesm2022/ngx-t-forms-calculated-field-rules.component-C5TPddVe.mjs.map +1 -0
  7. package/fesm2022/ngx-t-forms-chip-options-creator-editor.component-CICQaqz6.mjs +97 -0
  8. package/fesm2022/ngx-t-forms-chip-options-creator-editor.component-CICQaqz6.mjs.map +1 -0
  9. package/fesm2022/ngx-t-forms-config-mscoa-additional-inputs.component-CzisLSIP.mjs +195 -0
  10. package/fesm2022/ngx-t-forms-config-mscoa-additional-inputs.component-CzisLSIP.mjs.map +1 -0
  11. package/fesm2022/ngx-t-forms-data-source-picker.component-Dzz_o6fJ.mjs +261 -0
  12. package/fesm2022/ngx-t-forms-data-source-picker.component-Dzz_o6fJ.mjs.map +1 -0
  13. package/fesm2022/ngx-t-forms-date-picker-input-element.component-CYUbVyzP.mjs +85 -0
  14. package/fesm2022/ngx-t-forms-date-picker-input-element.component-CYUbVyzP.mjs.map +1 -0
  15. package/fesm2022/ngx-t-forms-date-range-picker-input-element.component-CmoquQGV.mjs +156 -0
  16. package/fesm2022/ngx-t-forms-date-range-picker-input-element.component-CmoquQGV.mjs.map +1 -0
  17. package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-CLUOXreG.mjs +368 -0
  18. package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-CLUOXreG.mjs.map +1 -0
  19. package/fesm2022/ngx-t-forms-document-picker.component-qObjcqhE.mjs +704 -0
  20. package/fesm2022/ngx-t-forms-document-picker.component-qObjcqhE.mjs.map +1 -0
  21. package/fesm2022/ngx-t-forms-editor-input-element.component-BLXlfb6F.mjs +294 -0
  22. package/fesm2022/ngx-t-forms-editor-input-element.component-BLXlfb6F.mjs.map +1 -0
  23. package/fesm2022/ngx-t-forms-editor-js-input.component-BQL0AH7H.mjs +240 -0
  24. package/fesm2022/ngx-t-forms-editor-js-input.component-BQL0AH7H.mjs.map +1 -0
  25. package/fesm2022/ngx-t-forms-file-upload-input-element.component-C7mMeEjF.mjs +205 -0
  26. package/fesm2022/ngx-t-forms-file-upload-input-element.component-C7mMeEjF.mjs.map +1 -0
  27. package/fesm2022/ngx-t-forms-form-input-selector.component-C9u8zq9B.mjs +86 -0
  28. package/fesm2022/ngx-t-forms-form-input-selector.component-C9u8zq9B.mjs.map +1 -0
  29. package/fesm2022/ngx-t-forms-form-json-view.component-856Hx1Bg.mjs +22 -0
  30. package/fesm2022/ngx-t-forms-form-json-view.component-856Hx1Bg.mjs.map +1 -0
  31. package/fesm2022/ngx-t-forms-form-payload-projection.component-CDkTuX9S.mjs +179 -0
  32. package/fesm2022/ngx-t-forms-form-payload-projection.component-CDkTuX9S.mjs.map +1 -0
  33. package/fesm2022/ngx-t-forms-form-section-stepper.component-Bs50-nEB.mjs +319 -0
  34. package/fesm2022/ngx-t-forms-form-section-stepper.component-Bs50-nEB.mjs.map +1 -0
  35. package/fesm2022/ngx-t-forms-forms-builder-menu.component-qrhM0jGL.mjs +379 -0
  36. package/fesm2022/ngx-t-forms-forms-builder-menu.component-qrhM0jGL.mjs.map +1 -0
  37. package/fesm2022/ngx-t-forms-geo-location.component-Bosp1UzR.mjs +124 -0
  38. package/fesm2022/ngx-t-forms-geo-location.component-Bosp1UzR.mjs.map +1 -0
  39. package/fesm2022/ngx-t-forms-getInputIcon-B4ADgevZ.mjs +31 -0
  40. package/fesm2022/ngx-t-forms-getInputIcon-B4ADgevZ.mjs.map +1 -0
  41. package/fesm2022/ngx-t-forms-image-capture-input-element.component-C1g7Z0cK.mjs +180 -0
  42. package/fesm2022/ngx-t-forms-image-capture-input-element.component-C1g7Z0cK.mjs.map +1 -0
  43. package/fesm2022/ngx-t-forms-index-dDSobs6A.mjs +2 -0
  44. package/fesm2022/ngx-t-forms-index-dDSobs6A.mjs.map +1 -0
  45. package/fesm2022/ngx-t-forms-input-custom.component-BkbHFAyR.mjs +105 -0
  46. package/fesm2022/ngx-t-forms-input-custom.component-BkbHFAyR.mjs.map +1 -0
  47. package/fesm2022/ngx-t-forms-input-editor.component-BPUOM9kQ.mjs +181 -0
  48. package/fesm2022/ngx-t-forms-input-editor.component-BPUOM9kQ.mjs.map +1 -0
  49. package/fesm2022/{ngx-t-forms-map-mat-options-keys-CbdW82su.mjs → ngx-t-forms-map-mat-options-keys-B6hJ7Io5.mjs} +12 -14
  50. package/fesm2022/ngx-t-forms-map-mat-options-keys-B6hJ7Io5.mjs.map +1 -0
  51. package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-c7uZT1sr.mjs +66 -0
  52. package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-c7uZT1sr.mjs.map +1 -0
  53. package/fesm2022/ngx-t-forms-mat-slider-editor.component-CTSBrM-j.mjs +211 -0
  54. package/fesm2022/ngx-t-forms-mat-slider-editor.component-CTSBrM-j.mjs.map +1 -0
  55. package/fesm2022/ngx-t-forms-mat-slider-toggle-editor.component-CcYiwx-8.mjs +165 -0
  56. package/fesm2022/ngx-t-forms-mat-slider-toggle-editor.component-CcYiwx-8.mjs.map +1 -0
  57. package/fesm2022/ngx-t-forms-missing-form-configs.component-DrnH8qdG.mjs +38 -0
  58. package/fesm2022/ngx-t-forms-missing-form-configs.component-DrnH8qdG.mjs.map +1 -0
  59. package/fesm2022/ngx-t-forms-mscoa-chart-toolbar.component-C_abEBQ5.mjs +38 -0
  60. package/fesm2022/ngx-t-forms-mscoa-chart-toolbar.component-C_abEBQ5.mjs.map +1 -0
  61. package/fesm2022/ngx-t-forms-mscoa-error-display.component-99DpVSy7.mjs +126 -0
  62. package/fesm2022/ngx-t-forms-mscoa-error-display.component-99DpVSy7.mjs.map +1 -0
  63. package/fesm2022/ngx-t-forms-mscoa-segment-config.component-C0qsMfsq.mjs +336 -0
  64. package/fesm2022/ngx-t-forms-mscoa-segment-config.component-C0qsMfsq.mjs.map +1 -0
  65. package/fesm2022/ngx-t-forms-mscoa-temporary-hint.component-B1Z-IXSL.mjs +74 -0
  66. package/fesm2022/ngx-t-forms-mscoa-temporary-hint.component-B1Z-IXSL.mjs.map +1 -0
  67. package/fesm2022/ngx-t-forms-multiple-input-input-element.component-C7y1OGPx.mjs +905 -0
  68. package/fesm2022/ngx-t-forms-multiple-input-input-element.component-C7y1OGPx.mjs.map +1 -0
  69. package/fesm2022/ngx-t-forms-ngx-t-forms-u_kigDid.mjs +19461 -0
  70. package/fesm2022/ngx-t-forms-ngx-t-forms-u_kigDid.mjs.map +1 -0
  71. package/fesm2022/ngx-t-forms-paginated-selection-table-AQZSMmhr.mjs +555 -0
  72. package/fesm2022/ngx-t-forms-paginated-selection-table-AQZSMmhr.mjs.map +1 -0
  73. package/fesm2022/ngx-t-forms-pipeline-generator.component-DmNSc5aw.mjs +748 -0
  74. package/fesm2022/ngx-t-forms-pipeline-generator.component-DmNSc5aw.mjs.map +1 -0
  75. package/fesm2022/ngx-t-forms-record-list-manager.component-CUMMvMch.mjs +358 -0
  76. package/fesm2022/ngx-t-forms-record-list-manager.component-CUMMvMch.mjs.map +1 -0
  77. package/fesm2022/ngx-t-forms-required-inputs.component-Ch2yNcIS.mjs +272 -0
  78. package/fesm2022/ngx-t-forms-required-inputs.component-Ch2yNcIS.mjs.map +1 -0
  79. package/fesm2022/ngx-t-forms-rest-api-call-setup.component-C_aFtdvW.mjs +398 -0
  80. package/fesm2022/ngx-t-forms-rest-api-call-setup.component-C_aFtdvW.mjs.map +1 -0
  81. package/fesm2022/ngx-t-forms-search-field.component-B2ZO7lqO.mjs +38 -0
  82. package/fesm2022/ngx-t-forms-search-field.component-B2ZO7lqO.mjs.map +1 -0
  83. package/fesm2022/ngx-t-forms-section-report.component-BxOhR6C0.mjs +98 -0
  84. package/fesm2022/ngx-t-forms-section-report.component-BxOhR6C0.mjs.map +1 -0
  85. package/fesm2022/ngx-t-forms-select-input-element.component-DbgZdNoe.mjs +150 -0
  86. package/fesm2022/ngx-t-forms-select-input-element.component-DbgZdNoe.mjs.map +1 -0
  87. package/fesm2022/ngx-t-forms-selection-options-editor.component-Dhln81DL.mjs +169 -0
  88. package/fesm2022/ngx-t-forms-selection-options-editor.component-Dhln81DL.mjs.map +1 -0
  89. package/fesm2022/ngx-t-forms-t-workflow-picker.component-leBokXvM.mjs +204 -0
  90. package/fesm2022/ngx-t-forms-t-workflow-picker.component-leBokXvM.mjs.map +1 -0
  91. package/fesm2022/ngx-t-forms-textarea-input-element.component-BEbXJjFA.mjs +95 -0
  92. package/fesm2022/ngx-t-forms-textarea-input-element.component-BEbXJjFA.mjs.map +1 -0
  93. package/fesm2022/ngx-t-forms-toggle-input-element.component-DDErRUJd.mjs +82 -0
  94. package/fesm2022/ngx-t-forms-toggle-input-element.component-DDErRUJd.mjs.map +1 -0
  95. package/fesm2022/ngx-t-forms-validators-config.component-oGjQVGE2.mjs +733 -0
  96. package/fesm2022/ngx-t-forms-validators-config.component-oGjQVGE2.mjs.map +1 -0
  97. package/fesm2022/ngx-t-forms-workflow-adjudication.component-CtU8dECN.mjs +1303 -0
  98. package/fesm2022/ngx-t-forms-workflow-adjudication.component-CtU8dECN.mjs.map +1 -0
  99. package/fesm2022/ngx-t-forms.mjs +2 -1
  100. package/fesm2022/ngx-t-forms.mjs.map +1 -1
  101. package/package.json +20 -18
  102. package/styles/_editor-mixins.scss +62 -0
  103. package/styles/_json-editor-syntax.scss +26 -0
  104. package/styles/_signature-pad.scss +26 -0
  105. package/styles/_tokens.scss +148 -0
  106. package/types/ngx-t-forms.d.ts +1767 -621
  107. package/fesm2022/ngx-t-forms-calculated-field-rules.component-D-SBMdYg.mjs +0 -313
  108. package/fesm2022/ngx-t-forms-calculated-field-rules.component-D-SBMdYg.mjs.map +0 -1
  109. package/fesm2022/ngx-t-forms-chip-options-creator-editor.component-1cpszpPN.mjs +0 -191
  110. package/fesm2022/ngx-t-forms-chip-options-creator-editor.component-1cpszpPN.mjs.map +0 -1
  111. package/fesm2022/ngx-t-forms-config-mscoa-additional-inputs.component-DFdAVWTg.mjs +0 -207
  112. package/fesm2022/ngx-t-forms-config-mscoa-additional-inputs.component-DFdAVWTg.mjs.map +0 -1
  113. package/fesm2022/ngx-t-forms-data-source-picker.component-DxORinAD.mjs +0 -204
  114. package/fesm2022/ngx-t-forms-data-source-picker.component-DxORinAD.mjs.map +0 -1
  115. package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-DcWS1txl.mjs +0 -289
  116. package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-DcWS1txl.mjs.map +0 -1
  117. package/fesm2022/ngx-t-forms-form-input-selector.component-B2QEnvkq.mjs +0 -134
  118. package/fesm2022/ngx-t-forms-form-input-selector.component-B2QEnvkq.mjs.map +0 -1
  119. package/fesm2022/ngx-t-forms-form-json-view.component-DePf44w6.mjs +0 -22
  120. package/fesm2022/ngx-t-forms-form-json-view.component-DePf44w6.mjs.map +0 -1
  121. package/fesm2022/ngx-t-forms-form-section-stepper.component-BTkcSjg7.mjs +0 -270
  122. package/fesm2022/ngx-t-forms-form-section-stepper.component-BTkcSjg7.mjs.map +0 -1
  123. package/fesm2022/ngx-t-forms-forms-builder-menu.component-Wamzf_sq.mjs +0 -345
  124. package/fesm2022/ngx-t-forms-forms-builder-menu.component-Wamzf_sq.mjs.map +0 -1
  125. package/fesm2022/ngx-t-forms-input-editor.component-D4xHO76K.mjs +0 -147
  126. package/fesm2022/ngx-t-forms-input-editor.component-D4xHO76K.mjs.map +0 -1
  127. package/fesm2022/ngx-t-forms-map-mat-options-keys-CbdW82su.mjs.map +0 -1
  128. package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-DmTyO9Wi.mjs +0 -105
  129. package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-DmTyO9Wi.mjs.map +0 -1
  130. package/fesm2022/ngx-t-forms-mat-slider-editor.component-DZ4TenrI.mjs +0 -109
  131. package/fesm2022/ngx-t-forms-mat-slider-editor.component-DZ4TenrI.mjs.map +0 -1
  132. package/fesm2022/ngx-t-forms-mat-slider-toggle-editor.component-DPyBYE4p.mjs +0 -155
  133. package/fesm2022/ngx-t-forms-mat-slider-toggle-editor.component-DPyBYE4p.mjs.map +0 -1
  134. package/fesm2022/ngx-t-forms-missing-form-configs.component-BRmnwAK6.mjs +0 -28
  135. package/fesm2022/ngx-t-forms-missing-form-configs.component-BRmnwAK6.mjs.map +0 -1
  136. package/fesm2022/ngx-t-forms-mscoa-chart-toolbar.component-D_umeAPL.mjs +0 -43
  137. package/fesm2022/ngx-t-forms-mscoa-chart-toolbar.component-D_umeAPL.mjs.map +0 -1
  138. package/fesm2022/ngx-t-forms-mscoa-error-display.component-CSX2NCNU.mjs +0 -116
  139. package/fesm2022/ngx-t-forms-mscoa-error-display.component-CSX2NCNU.mjs.map +0 -1
  140. package/fesm2022/ngx-t-forms-mscoa-segment-config.component-B6IF8kGg.mjs +0 -296
  141. package/fesm2022/ngx-t-forms-mscoa-segment-config.component-B6IF8kGg.mjs.map +0 -1
  142. package/fesm2022/ngx-t-forms-mscoa-temporary-hint.component-BPkjsRmH.mjs +0 -83
  143. package/fesm2022/ngx-t-forms-mscoa-temporary-hint.component-BPkjsRmH.mjs.map +0 -1
  144. package/fesm2022/ngx-t-forms-ngx-t-forms-D9qmig6g.mjs +0 -16844
  145. package/fesm2022/ngx-t-forms-ngx-t-forms-D9qmig6g.mjs.map +0 -1
  146. package/fesm2022/ngx-t-forms-pipeline-generator.component-DBJEyCbd.mjs +0 -613
  147. package/fesm2022/ngx-t-forms-pipeline-generator.component-DBJEyCbd.mjs.map +0 -1
  148. package/fesm2022/ngx-t-forms-record-list-manager.component-Dgs9lNSr.mjs +0 -269
  149. package/fesm2022/ngx-t-forms-record-list-manager.component-Dgs9lNSr.mjs.map +0 -1
  150. package/fesm2022/ngx-t-forms-required-inputs.component-CSIJvSHq.mjs +0 -190
  151. package/fesm2022/ngx-t-forms-required-inputs.component-CSIJvSHq.mjs.map +0 -1
  152. package/fesm2022/ngx-t-forms-rest-api-call-setup.component-CY-JSkGs.mjs +0 -291
  153. package/fesm2022/ngx-t-forms-rest-api-call-setup.component-CY-JSkGs.mjs.map +0 -1
  154. package/fesm2022/ngx-t-forms-section-report.component-12-KdKT6.mjs +0 -156
  155. package/fesm2022/ngx-t-forms-section-report.component-12-KdKT6.mjs.map +0 -1
  156. package/fesm2022/ngx-t-forms-selection-options-editor.component-Be3QAG_L.mjs +0 -186
  157. package/fesm2022/ngx-t-forms-selection-options-editor.component-Be3QAG_L.mjs.map +0 -1
  158. package/fesm2022/ngx-t-forms-t-workflow-picker.component-a4f1r8gH.mjs +0 -187
  159. package/fesm2022/ngx-t-forms-t-workflow-picker.component-a4f1r8gH.mjs.map +0 -1
  160. package/fesm2022/ngx-t-forms-validators-config.component-B3j9Dmgu.mjs +0 -215
  161. package/fesm2022/ngx-t-forms-validators-config.component-B3j9Dmgu.mjs.map +0 -1
@@ -0,0 +1,368 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, output, signal, computed, Input, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { NgControl } from '@angular/forms';
4
+ import * as i5$1 from '@angular/material/autocomplete';
5
+ import { MatAutocompleteModule } from '@angular/material/autocomplete';
6
+ import * as i1$1 from '@angular/material/button';
7
+ import { MatButtonModule } from '@angular/material/button';
8
+ import * as i3$1 from '@angular/material/card';
9
+ import { MatCardModule } from '@angular/material/card';
10
+ import { MatFormFieldModule, MatFormFieldControl } from '@angular/material/form-field';
11
+ import * as i3 from '@angular/material/icon';
12
+ import { MatIconModule } from '@angular/material/icon';
13
+ import { MatInputModule } from '@angular/material/input';
14
+ import * as i4 from '@angular/material/list';
15
+ import { MatListModule } from '@angular/material/list';
16
+ import * as i5 from '@angular/material/tooltip';
17
+ import { MatTooltipModule } from '@angular/material/tooltip';
18
+ import * as i1 from '@angular/cdk/clipboard';
19
+ import { ClipboardModule } from '@angular/cdk/clipboard';
20
+ import { CdkDropList, CdkDrag } from '@angular/cdk/drag-drop';
21
+ import { Subject } from 'rxjs';
22
+ import { DocumentLitsLabelConfigInterfaceValueType, ReportTypes, InputDataTypes, InputTypes, InputPipeTypes, ElementTypes } from 'ngx-t-forms-types';
23
+ import { MatChipListEditorComponent } from './ngx-t-forms-mat-chip-list-editor.component-c7uZT1sr.mjs';
24
+ import { MatSliderToggleEditorComponent } from './ngx-t-forms-mat-slider-toggle-editor.component-CcYiwx-8.mjs';
25
+ import { E as EmptyStateComponent } from './ngx-t-forms-ngx-t-forms-u_kigDid.mjs';
26
+ import * as i8 from '@angular/material/select';
27
+
28
+ /** Title-cases an enum key: `daysAgo` → `Days Ago`. */
29
+ function humaniseKey(key) {
30
+ return key
31
+ .replace(/([A-Z])/g, ' $1')
32
+ .trim()
33
+ .toLowerCase()
34
+ .replace(/^\w/, (c) => c.toUpperCase());
35
+ }
36
+ /** Derives a readable label from a camelCase control name: `taxRate` → `tax Rate`. */
37
+ function controlNameToLabel(name) {
38
+ return name
39
+ .replace(/([a-z])([A-Z])/g, '$1 $2')
40
+ .replace(/([A-Z])([A-Z][a-z])/g, '$1 $2');
41
+ }
42
+ /**
43
+ * Document-list label-configuration editor: builds the ordered list of column
44
+ * label definitions (`DocumentLitsLabelConfigInterface[]`) used to render a
45
+ * document list. Columns can be added, edited inline, removed, and reordered by
46
+ * drag-and-drop.
47
+ *
48
+ * Implements `MatFormFieldControl<DocumentLitsLabelConfigInterface[]>`, so it
49
+ * renders inside the parent's `<mat-form-field>` — `t-dynamic-data-edit` owns
50
+ * the field label, hint, and validation errors; this component owns only the
51
+ * column list and the add/edit form.
52
+ *
53
+ * NOTE: `MatFormFieldControl<T>` mandates plain mutable `value` / `disabled` /
54
+ * `required` / `placeholder` / `id` members, `@Input()` decorators, the
55
+ * `focused` / `touched` / `stateChanges` members, and the `useExisting`
56
+ * provider. These are framework wiring, not defects — the CLAUDE.md bans on
57
+ * `@Input()` / `useExisting` do not apply to MatFormFieldControl integration.
58
+ * Genuinely-internal state (the in-edit draft, derived option lists) uses
59
+ * `signal()` / `computed()`.
60
+ */
61
+ class DocumentListLabelConfigEditorComponent {
62
+ constructor() {
63
+ /** Emits whenever a piece of `MatFormFieldControl` state changes. */
64
+ this.stateChanges = new Subject();
65
+ this.controlType = 'lib-document-list-label-config-editor';
66
+ this.id = `lib-document-list-label-config-editor-${DocumentListLabelConfigEditorComponent.nextId++}`;
67
+ this.placeholder = '';
68
+ this.focused = false;
69
+ this.touched = false;
70
+ this.describedBy = '';
71
+ this.autofilled = false;
72
+ this.userAriaDescribedBy = undefined;
73
+ this.disableAutomaticLabeling = undefined;
74
+ this.ngControl = inject(NgControl, { self: true, optional: true });
75
+ /** Validation errors surfaced by the parent for error-state derivation. */
76
+ this.errors = [];
77
+ /** Available form inputs used to auto-derive a column's value type. */
78
+ this.formInputs = [];
79
+ /** Editor configuration supplied by the parent (placeholder/required/etc.). */
80
+ this.editorConfig = undefined;
81
+ /** Candidate control names offered in the form-control autocomplete. */
82
+ this.mapToData = [];
83
+ /** Emits the column list whenever it changes. */
84
+ this.valueChange = output();
85
+ this.#value = [];
86
+ this.#disabled = false;
87
+ this.#required = false;
88
+ // ---- internal signal state ---------------------------------------------
89
+ /** The label draft currently being added/edited (see {@link LabelDraft}). */
90
+ this.labelInEdit = signal(null, ...(ngDevMode ? [{ debugName: "labelInEdit" }] : /* istanbul ignore next */ []));
91
+ /** Value-type chip options (all enum members, humanised). */
92
+ this.valueTypes = Object.keys(DocumentLitsLabelConfigInterfaceValueType).map((key) => ({ label: humaniseKey(key), value: key }));
93
+ /**
94
+ * Autocomplete options filtered by the draft's `formControlName`. Empty term
95
+ * shows the full list; otherwise matches a substring or a word-prefix.
96
+ */
97
+ this.filteredControlNames = computed(() => {
98
+ const source = this.mapToData ?? [];
99
+ const term = (this.labelInEdit()?.formControlName ?? '').trim().toLowerCase();
100
+ if (!term) {
101
+ return source;
102
+ }
103
+ return source.filter((option) => {
104
+ const text = option.toLowerCase();
105
+ if (text.includes(term)) {
106
+ return true;
107
+ }
108
+ return text.split(/\s+/).some((word) => word.startsWith(term));
109
+ });
110
+ }, ...(ngDevMode ? [{ debugName: "filteredControlNames" }] : /* istanbul ignore next */ []));
111
+ /**
112
+ * Report-type chip options derived from the draft's `valueType`. `undefined`
113
+ * when no value type is chosen, which hides the report-types section.
114
+ *
115
+ * - currency / number → aggregation reports (avg, highest, lowest, sum)
116
+ * - string → category report
117
+ */
118
+ this.reportTypes = computed(() => {
119
+ const valueType = this.labelInEdit()?.valueType;
120
+ if (!valueType) {
121
+ return undefined;
122
+ }
123
+ return Object.values(ReportTypes)
124
+ .filter((reportType) => {
125
+ if (valueType === DocumentLitsLabelConfigInterfaceValueType.currency ||
126
+ valueType === DocumentLitsLabelConfigInterfaceValueType.number) {
127
+ return (reportType === ReportTypes.Avg ||
128
+ reportType === ReportTypes.Highest ||
129
+ reportType === ReportTypes.Lowest ||
130
+ reportType === ReportTypes.Sum);
131
+ }
132
+ if (valueType === DocumentLitsLabelConfigInterfaceValueType.string) {
133
+ return reportType === ReportTypes.Category;
134
+ }
135
+ return false;
136
+ })
137
+ .map((key) => ({ label: humaniseKey(key), value: key }));
138
+ }, ...(ngDevMode ? [{ debugName: "reportTypes" }] : /* istanbul ignore next */ []));
139
+ /** Whether the save action is blocked (draft missing required fields). */
140
+ this.labelSaveDisabled = computed(() => {
141
+ const draft = this.labelInEdit();
142
+ return !draft || !draft.label || !draft.formControlName || !draft.valueType;
143
+ }, ...(ngDevMode ? [{ debugName: "labelSaveDisabled" }] : /* istanbul ignore next */ []));
144
+ this.onTouched = () => { };
145
+ }
146
+ static { this.nextId = 0; }
147
+ #value;
148
+ /** Current column configuration list. */
149
+ get value() {
150
+ return this.#value;
151
+ }
152
+ set value(value) {
153
+ this.#value = value ?? [];
154
+ this.stateChanges.next();
155
+ }
156
+ #disabled;
157
+ /** Whether the editor is inert. */
158
+ get disabled() {
159
+ return this.#disabled;
160
+ }
161
+ set disabled(value) {
162
+ this.#disabled = value;
163
+ this.stateChanges.next();
164
+ }
165
+ #required;
166
+ /** Whether at least one column is required. */
167
+ get required() {
168
+ return this.#required;
169
+ }
170
+ set required(value) {
171
+ this.#required = value;
172
+ this.stateChanges.next();
173
+ }
174
+ // ---- MatFormFieldControl getters (read by the framework) ----------------
175
+ get empty() {
176
+ return this.#value.length === 0;
177
+ }
178
+ get shouldLabelFloat() {
179
+ return this.focused || !this.empty;
180
+ }
181
+ get errorState() {
182
+ const requiredUnset = this.empty && this.#required;
183
+ const ngControlError = this.ngControl?.errors != null;
184
+ const externalError = (this.errors?.length ?? 0) > 0 && this.touched;
185
+ return requiredUnset || ngControlError || externalError;
186
+ }
187
+ setDescribedByIds(ids) {
188
+ this.describedBy = ids.join(' ');
189
+ this.stateChanges.next();
190
+ }
191
+ onContainerClick() {
192
+ this.markAsTouched();
193
+ if (!this.focused) {
194
+ this.focused = true;
195
+ }
196
+ this.stateChanges.next();
197
+ }
198
+ markAsTouched() {
199
+ if (!this.touched) {
200
+ this.touched = true;
201
+ this.onTouched();
202
+ this.stateChanges.next();
203
+ }
204
+ }
205
+ // ---- editing ------------------------------------------------------------
206
+ /** Begin a fresh column draft. */
207
+ startNewLabel() {
208
+ this.labelInEdit.set({});
209
+ }
210
+ /** Discard the current draft. */
211
+ cancelEdit() {
212
+ this.labelInEdit.set(null);
213
+ }
214
+ /** Update the draft's display label from the name input. */
215
+ nameChange(event) {
216
+ const label = event.target?.value ?? '';
217
+ this.labelInEdit.update((draft) => ({ ...draft, label }));
218
+ }
219
+ /**
220
+ * Update the draft's form control name (free-text typing). Re-derives the
221
+ * value type from the matching form input, if any.
222
+ */
223
+ formControlNameChange(event) {
224
+ const formControlName = event.target?.value ?? '';
225
+ const input = this.formInputs.find((i) => i.formControlName === formControlName);
226
+ this.labelInEdit.update((draft) => ({
227
+ ...draft,
228
+ formControlName,
229
+ valueType: this.#valueTypeFromInput(input),
230
+ }));
231
+ }
232
+ /** Apply an autocomplete selection, defaulting the label from the name. */
233
+ formControlSelected(event) {
234
+ const formControlName = String(event.option.value);
235
+ this.labelInEdit.update((draft) => ({
236
+ ...draft,
237
+ formControlName,
238
+ label: draft?.label || controlNameToLabel(formControlName),
239
+ }));
240
+ }
241
+ /** Set the draft's value type from the chip selection. */
242
+ valueTypeChanged(value) {
243
+ this.labelInEdit.update((draft) => ({
244
+ ...draft,
245
+ valueType: value,
246
+ }));
247
+ }
248
+ /**
249
+ * Set the draft's report types. The chip editor is multi-select, so it emits
250
+ * an array; a single value is normalised into one.
251
+ */
252
+ reportTypeChanged(value) {
253
+ const reportType = Array.isArray(value)
254
+ ? value
255
+ : value == null
256
+ ? []
257
+ : [value];
258
+ this.labelInEdit.update((draft) => ({ ...draft, reportType }));
259
+ }
260
+ /** Toggle the draft's hidden flag. */
261
+ isHiddenChanged(isHidden) {
262
+ this.labelInEdit.update((draft) => ({ ...draft, isHidden }));
263
+ }
264
+ /** Commit the draft into the list (replacing a matching column, or appending). */
265
+ saveHeader() {
266
+ const draft = this.labelInEdit();
267
+ if (!draft) {
268
+ return;
269
+ }
270
+ const next = [...this.#value];
271
+ const index = next.findIndex((item) => item.formControlName === draft.formControlName);
272
+ const column = draft;
273
+ if (index !== -1) {
274
+ next[index] = column;
275
+ }
276
+ else {
277
+ next.push(column);
278
+ }
279
+ this.#commit(next);
280
+ this.labelInEdit.set(null);
281
+ }
282
+ /** Remove a column by its form control name. */
283
+ removeLabel(label) {
284
+ this.#commit(this.#value.filter((item) => item.formControlName !== label.formControlName));
285
+ }
286
+ /** Reorder the list after a drag-and-drop. */
287
+ drop(event) {
288
+ const { previousIndex, currentIndex } = event;
289
+ const moved = this.#value.at(previousIndex);
290
+ if (moved === undefined || previousIndex === currentIndex) {
291
+ return;
292
+ }
293
+ const next = [...this.#value];
294
+ next.splice(previousIndex, 1);
295
+ next.splice(currentIndex, 0, moved);
296
+ this.#commit(next);
297
+ }
298
+ /** Write a new list value, emit the change, and mark the control touched. */
299
+ #commit(next) {
300
+ this.value = next;
301
+ this.valueChange.emit(next);
302
+ this.markAsTouched();
303
+ }
304
+ /** Derive the value type from a form input's data/element type and pipe. */
305
+ #valueTypeFromInput(input) {
306
+ if (!input) {
307
+ return DocumentLitsLabelConfigInterfaceValueType.string;
308
+ }
309
+ if (input.dataType === InputDataTypes.Number ||
310
+ input.type === InputTypes.Number ||
311
+ input.pipe?.pipeType === InputPipeTypes.Number) {
312
+ return DocumentLitsLabelConfigInterfaceValueType.number;
313
+ }
314
+ if (input.pipe?.pipeType === InputPipeTypes.Currency) {
315
+ return DocumentLitsLabelConfigInterfaceValueType.currency;
316
+ }
317
+ if (input.dataType === InputDataTypes.Boolean || input.element === ElementTypes.Toggle) {
318
+ return DocumentLitsLabelConfigInterfaceValueType.boolean;
319
+ }
320
+ return DocumentLitsLabelConfigInterfaceValueType.string;
321
+ }
322
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: DocumentListLabelConfigEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
323
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.12", type: DocumentListLabelConfigEditorComponent, isStandalone: true, selector: "lib-document-list-label-config-editor", inputs: { errors: "errors", formInputs: "formInputs", editorConfig: "editorConfig", mapToData: "mapToData", value: "value", disabled: "disabled", required: "required" }, outputs: { valueChange: "valueChange" }, host: { properties: { "id": "id", "attr.aria-describedby": "describedBy" }, classAttribute: "lib-document-list-label-config-editor" }, providers: [
324
+ { provide: MatFormFieldControl, useExisting: DocumentListLabelConfigEditorComponent },
325
+ ], ngImport: i0, template: "<mat-nav-list\n cdkDropList\n [cdkDropListData]=\"value\"\n (cdkDropListDropped)=\"drop($event)\"\n class=\"lib-document-list-label-config-editor__list\"\n>\n @if (value.length === 0) {\n <lib-empty-state\n icon=\"view_column\"\n message=\"No columns configured. Add one below.\"\n ></lib-empty-state>\n } @else {\n @for (label of value; track label.formControlName) {\n <mat-list-item\n cdkDrag\n class=\"lib-document-list-label-config-editor__item\"\n [matTooltip]=\"'Click to copy ' + label.formControlName\"\n [cdkCopyToClipboard]=\"label.formControlName\"\n matTooltipPosition=\"before\"\n >\n <mat-icon matListItemIcon>view_column</mat-icon>\n\n <div matListItemTitle class=\"lib-document-list-label-config-editor__title\">\n <span class=\"lib-document-list-label-config-editor__label\">{{ label.label }}</span>\n <span class=\"lib-document-list-label-config-editor__meta\">\n <code>{{ label.formControlName }}</code> \u00B7 {{ label.valueType }}\n </span>\n </div>\n\n <button\n matListItemMeta\n mat-icon-button\n type=\"button\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"'Remove ' + label.label\"\n (click)=\"removeLabel(label)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </mat-list-item>\n }\n }\n</mat-nav-list>\n\n@if (labelInEdit(); as draft) {\n <mat-card appearance=\"outlined\" class=\"lib-document-list-label-config-editor__form\">\n <mat-card-content class=\"lib-document-list-label-config-editor__fields\">\n <label class=\"lib-document-list-label-config-editor__field-label\" [attr.for]=\"id + '-fcn'\">\n Form control name\n </label>\n <input\n class=\"lib-document-list-label-config-editor__input\"\n type=\"text\"\n [id]=\"id + '-fcn'\"\n placeholder=\"Pick one\"\n aria-label=\"Form control name\"\n [value]=\"draft.formControlName || ''\"\n (input)=\"formControlNameChange($event)\"\n [matAutocomplete]=\"auto\"\n />\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n autoActiveFirstOption\n (optionSelected)=\"formControlSelected($event)\"\n >\n @for (option of filteredControlNames(); track option) {\n <mat-option [value]=\"option\">{{ option }}</mat-option>\n }\n </mat-autocomplete>\n\n <label class=\"lib-document-list-label-config-editor__field-label\" [attr.for]=\"id + '-name'\">\n Name\n </label>\n <input\n class=\"lib-document-list-label-config-editor__input\"\n type=\"text\"\n [id]=\"id + '-name'\"\n placeholder=\"Enter label name\"\n [value]=\"draft.label || ''\"\n (input)=\"nameChange($event)\"\n />\n\n <label class=\"lib-document-list-label-config-editor__field-label\" [id]=\"id + '-vt-label'\">\n Value type\n </label>\n <lib-mat-chip-list-editor\n [id]=\"id + '-vt'\"\n [errors]=\"[]\"\n [value]=\"draft.valueType\"\n [options]=\"valueTypes\"\n (valueChange)=\"valueTypeChanged($event)\"\n ></lib-mat-chip-list-editor>\n\n @if (reportTypes(); as types) {\n @if (types.length > 0) {\n <label class=\"lib-document-list-label-config-editor__field-label\" [id]=\"id + '-rt-label'\">\n Report types\n </label>\n <lib-mat-chip-list-editor\n [id]=\"id + '-rt'\"\n [errors]=\"[]\"\n [multiple]=\"true\"\n [value]=\"draft.reportType\"\n [options]=\"types\"\n (valueChange)=\"reportTypeChanged($event)\"\n ></lib-mat-chip-list-editor>\n }\n }\n\n <lib-mat-slider-toggle-editor\n [id]=\"id + '-hidden'\"\n label=\"Is hidden\"\n [value]=\"draft.isHidden || false\"\n [errors]=\"[]\"\n (valueChange)=\"isHiddenChanged(!!$event)\"\n ></lib-mat-slider-toggle-editor>\n </mat-card-content>\n\n <mat-card-actions class=\"lib-document-list-label-config-editor__actions\">\n <button\n mat-flat-button\n color=\"primary\"\n type=\"button\"\n [disabled]=\"labelSaveDisabled()\"\n (click)=\"saveHeader()\"\n >\n Save header\n </button>\n <span class=\"lib-document-list-label-config-editor__spacer\"></span>\n <button mat-button color=\"warn\" type=\"button\" (click)=\"cancelEdit()\">Cancel</button>\n </mat-card-actions>\n </mat-card>\n} @else {\n <button\n mat-stroked-button\n color=\"primary\"\n type=\"button\"\n class=\"lib-document-list-label-config-editor__add\"\n [disabled]=\"disabled\"\n (click)=\"startNewLabel()\"\n >\n Add new column\n </button>\n}\n", styles: [":host{display:block;color:var(--lib-forms-on-surface)}.lib-document-list-label-config-editor__list{display:block;max-height:25rem;overflow:auto;padding:0}.lib-document-list-label-config-editor__item{cursor:grab}.lib-document-list-label-config-editor__item:active{cursor:grabbing}.lib-document-list-label-config-editor__title{display:flex;flex-direction:column;gap:.25rem;min-width:0}.lib-document-list-label-config-editor__label{font-size:.9375rem;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.lib-document-list-label-config-editor__meta{font-size:.8125rem;color:var(--lib-forms-on-surface-variant)}.lib-document-list-label-config-editor__meta code{font-family:monospace}.lib-document-list-label-config-editor__form{margin-top:1.5rem;background:var(--lib-forms-surface);border:1px solid color-mix(in srgb,var(--lib-forms-outline) 15%,transparent);border-radius:var(--lib-forms-radius-lg, 12px);box-shadow:var(--lib-forms-shadow-resting)}.lib-document-list-label-config-editor__fields{display:flex;flex-direction:column;gap:.75rem;padding-top:.5rem}.lib-document-list-label-config-editor__field-label{display:block;font-size:.625rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--lib-forms-on-surface-variant)}.lib-document-list-label-config-editor__input{min-height:2.25rem;padding:.5rem .75rem;border:1px solid var(--lib-forms-outline);border-radius:var(--lib-forms-radius-sm, 8px);background:var(--lib-forms-surface);font-size:.875rem;color:var(--lib-forms-on-surface);transition:border-color var(--lib-forms-duration-hover, .3s) var(--lib-forms-easing),box-shadow var(--lib-forms-duration-hover, .3s) var(--lib-forms-easing)}.lib-document-list-label-config-editor__input:focus{outline:none;border-color:var(--lib-forms-primary);box-shadow:0 0 0 2px color-mix(in srgb,var(--lib-forms-primary) 25%,transparent)}.lib-document-list-label-config-editor__input{width:100%}.lib-document-list-label-config-editor__input::placeholder{color:var(--lib-forms-on-surface-variant);opacity:.7}.lib-document-list-label-config-editor__actions{display:flex;align-items:center;gap:.5rem}.lib-document-list-label-config-editor__spacer{flex:1 1 auto}.lib-document-list-label-config-editor__add{width:100%;margin-top:1.5rem}.cdk-drag-preview{box-sizing:border-box;border-radius:var(--lib-forms-radius-sm, 8px);box-shadow:var(--lib-forms-shadow-floating)}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform var(--lib-forms-duration) var(--lib-forms-easing)}.lib-document-list-label-config-editor__list.cdk-drop-list-dragging .lib-document-list-label-config-editor__item:not(.cdk-drag-placeholder){transition:transform var(--lib-forms-duration) var(--lib-forms-easing)}\n"], dependencies: [{ kind: "ngmodule", type: MatListModule }, { kind: "component", type: i4.MatNavList, selector: "mat-nav-list", exportAs: ["matNavList"] }, { kind: "component", type: i4.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "directive", type: i4.MatListItemIcon, selector: "[matListItemIcon]" }, { kind: "directive", type: i4.MatListItemTitle, selector: "[matListItemTitle]" }, { kind: "directive", type: i4.MatListItemMeta, selector: "[matListItemMeta]" }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: ClipboardModule }, { kind: "directive", type: i1.CdkCopyToClipboard, selector: "[cdkCopyToClipboard]", inputs: ["cdkCopyToClipboard", "cdkCopyToClipboardAttempts"], outputs: ["cdkCopyToClipboardCopied"] }, { kind: "component", type: MatSliderToggleEditorComponent, selector: "lib-mat-slider-toggle-editor", inputs: ["name", "label", "errors", "disabled", "required", "value", "placeholder"], outputs: ["valueChange"] }, { kind: "component", type: MatChipListEditorComponent, selector: "lib-mat-chip-list-editor", inputs: ["disabled", "multiple", "required", "errors", "value", "options"], outputs: ["valueChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$1.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i1$1.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i5$1.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i8.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i5$1.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i3$1.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i3$1.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: i3$1.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: EmptyStateComponent, selector: "lib-empty-state", inputs: ["icon", "message"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
326
+ }
327
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: DocumentListLabelConfigEditorComponent, decorators: [{
328
+ type: Component,
329
+ args: [{ selector: 'lib-document-list-label-config-editor', imports: [
330
+ MatListModule,
331
+ MatTooltipModule,
332
+ ClipboardModule,
333
+ MatSliderToggleEditorComponent,
334
+ MatChipListEditorComponent,
335
+ MatFormFieldModule,
336
+ MatButtonModule,
337
+ MatAutocompleteModule,
338
+ MatInputModule,
339
+ MatIconModule,
340
+ MatCardModule,
341
+ CdkDropList,
342
+ CdkDrag,
343
+ EmptyStateComponent,
344
+ ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, host: {
345
+ 'class': 'lib-document-list-label-config-editor',
346
+ '[id]': 'id',
347
+ '[attr.aria-describedby]': 'describedBy',
348
+ }, providers: [
349
+ { provide: MatFormFieldControl, useExisting: DocumentListLabelConfigEditorComponent },
350
+ ], template: "<mat-nav-list\n cdkDropList\n [cdkDropListData]=\"value\"\n (cdkDropListDropped)=\"drop($event)\"\n class=\"lib-document-list-label-config-editor__list\"\n>\n @if (value.length === 0) {\n <lib-empty-state\n icon=\"view_column\"\n message=\"No columns configured. Add one below.\"\n ></lib-empty-state>\n } @else {\n @for (label of value; track label.formControlName) {\n <mat-list-item\n cdkDrag\n class=\"lib-document-list-label-config-editor__item\"\n [matTooltip]=\"'Click to copy ' + label.formControlName\"\n [cdkCopyToClipboard]=\"label.formControlName\"\n matTooltipPosition=\"before\"\n >\n <mat-icon matListItemIcon>view_column</mat-icon>\n\n <div matListItemTitle class=\"lib-document-list-label-config-editor__title\">\n <span class=\"lib-document-list-label-config-editor__label\">{{ label.label }}</span>\n <span class=\"lib-document-list-label-config-editor__meta\">\n <code>{{ label.formControlName }}</code> \u00B7 {{ label.valueType }}\n </span>\n </div>\n\n <button\n matListItemMeta\n mat-icon-button\n type=\"button\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"'Remove ' + label.label\"\n (click)=\"removeLabel(label)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </mat-list-item>\n }\n }\n</mat-nav-list>\n\n@if (labelInEdit(); as draft) {\n <mat-card appearance=\"outlined\" class=\"lib-document-list-label-config-editor__form\">\n <mat-card-content class=\"lib-document-list-label-config-editor__fields\">\n <label class=\"lib-document-list-label-config-editor__field-label\" [attr.for]=\"id + '-fcn'\">\n Form control name\n </label>\n <input\n class=\"lib-document-list-label-config-editor__input\"\n type=\"text\"\n [id]=\"id + '-fcn'\"\n placeholder=\"Pick one\"\n aria-label=\"Form control name\"\n [value]=\"draft.formControlName || ''\"\n (input)=\"formControlNameChange($event)\"\n [matAutocomplete]=\"auto\"\n />\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n autoActiveFirstOption\n (optionSelected)=\"formControlSelected($event)\"\n >\n @for (option of filteredControlNames(); track option) {\n <mat-option [value]=\"option\">{{ option }}</mat-option>\n }\n </mat-autocomplete>\n\n <label class=\"lib-document-list-label-config-editor__field-label\" [attr.for]=\"id + '-name'\">\n Name\n </label>\n <input\n class=\"lib-document-list-label-config-editor__input\"\n type=\"text\"\n [id]=\"id + '-name'\"\n placeholder=\"Enter label name\"\n [value]=\"draft.label || ''\"\n (input)=\"nameChange($event)\"\n />\n\n <label class=\"lib-document-list-label-config-editor__field-label\" [id]=\"id + '-vt-label'\">\n Value type\n </label>\n <lib-mat-chip-list-editor\n [id]=\"id + '-vt'\"\n [errors]=\"[]\"\n [value]=\"draft.valueType\"\n [options]=\"valueTypes\"\n (valueChange)=\"valueTypeChanged($event)\"\n ></lib-mat-chip-list-editor>\n\n @if (reportTypes(); as types) {\n @if (types.length > 0) {\n <label class=\"lib-document-list-label-config-editor__field-label\" [id]=\"id + '-rt-label'\">\n Report types\n </label>\n <lib-mat-chip-list-editor\n [id]=\"id + '-rt'\"\n [errors]=\"[]\"\n [multiple]=\"true\"\n [value]=\"draft.reportType\"\n [options]=\"types\"\n (valueChange)=\"reportTypeChanged($event)\"\n ></lib-mat-chip-list-editor>\n }\n }\n\n <lib-mat-slider-toggle-editor\n [id]=\"id + '-hidden'\"\n label=\"Is hidden\"\n [value]=\"draft.isHidden || false\"\n [errors]=\"[]\"\n (valueChange)=\"isHiddenChanged(!!$event)\"\n ></lib-mat-slider-toggle-editor>\n </mat-card-content>\n\n <mat-card-actions class=\"lib-document-list-label-config-editor__actions\">\n <button\n mat-flat-button\n color=\"primary\"\n type=\"button\"\n [disabled]=\"labelSaveDisabled()\"\n (click)=\"saveHeader()\"\n >\n Save header\n </button>\n <span class=\"lib-document-list-label-config-editor__spacer\"></span>\n <button mat-button color=\"warn\" type=\"button\" (click)=\"cancelEdit()\">Cancel</button>\n </mat-card-actions>\n </mat-card>\n} @else {\n <button\n mat-stroked-button\n color=\"primary\"\n type=\"button\"\n class=\"lib-document-list-label-config-editor__add\"\n [disabled]=\"disabled\"\n (click)=\"startNewLabel()\"\n >\n Add new column\n </button>\n}\n", styles: [":host{display:block;color:var(--lib-forms-on-surface)}.lib-document-list-label-config-editor__list{display:block;max-height:25rem;overflow:auto;padding:0}.lib-document-list-label-config-editor__item{cursor:grab}.lib-document-list-label-config-editor__item:active{cursor:grabbing}.lib-document-list-label-config-editor__title{display:flex;flex-direction:column;gap:.25rem;min-width:0}.lib-document-list-label-config-editor__label{font-size:.9375rem;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.lib-document-list-label-config-editor__meta{font-size:.8125rem;color:var(--lib-forms-on-surface-variant)}.lib-document-list-label-config-editor__meta code{font-family:monospace}.lib-document-list-label-config-editor__form{margin-top:1.5rem;background:var(--lib-forms-surface);border:1px solid color-mix(in srgb,var(--lib-forms-outline) 15%,transparent);border-radius:var(--lib-forms-radius-lg, 12px);box-shadow:var(--lib-forms-shadow-resting)}.lib-document-list-label-config-editor__fields{display:flex;flex-direction:column;gap:.75rem;padding-top:.5rem}.lib-document-list-label-config-editor__field-label{display:block;font-size:.625rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--lib-forms-on-surface-variant)}.lib-document-list-label-config-editor__input{min-height:2.25rem;padding:.5rem .75rem;border:1px solid var(--lib-forms-outline);border-radius:var(--lib-forms-radius-sm, 8px);background:var(--lib-forms-surface);font-size:.875rem;color:var(--lib-forms-on-surface);transition:border-color var(--lib-forms-duration-hover, .3s) var(--lib-forms-easing),box-shadow var(--lib-forms-duration-hover, .3s) var(--lib-forms-easing)}.lib-document-list-label-config-editor__input:focus{outline:none;border-color:var(--lib-forms-primary);box-shadow:0 0 0 2px color-mix(in srgb,var(--lib-forms-primary) 25%,transparent)}.lib-document-list-label-config-editor__input{width:100%}.lib-document-list-label-config-editor__input::placeholder{color:var(--lib-forms-on-surface-variant);opacity:.7}.lib-document-list-label-config-editor__actions{display:flex;align-items:center;gap:.5rem}.lib-document-list-label-config-editor__spacer{flex:1 1 auto}.lib-document-list-label-config-editor__add{width:100%;margin-top:1.5rem}.cdk-drag-preview{box-sizing:border-box;border-radius:var(--lib-forms-radius-sm, 8px);box-shadow:var(--lib-forms-shadow-floating)}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform var(--lib-forms-duration) var(--lib-forms-easing)}.lib-document-list-label-config-editor__list.cdk-drop-list-dragging .lib-document-list-label-config-editor__item:not(.cdk-drag-placeholder){transition:transform var(--lib-forms-duration) var(--lib-forms-easing)}\n"] }]
351
+ }], propDecorators: { errors: [{
352
+ type: Input
353
+ }], formInputs: [{
354
+ type: Input
355
+ }], editorConfig: [{
356
+ type: Input
357
+ }], mapToData: [{
358
+ type: Input
359
+ }], valueChange: [{ type: i0.Output, args: ["valueChange"] }], value: [{
360
+ type: Input
361
+ }], disabled: [{
362
+ type: Input
363
+ }], required: [{
364
+ type: Input
365
+ }] } });
366
+
367
+ export { DocumentListLabelConfigEditorComponent };
368
+ //# sourceMappingURL=ngx-t-forms-document-list-label-config-editor.component-CLUOXreG.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngx-t-forms-document-list-label-config-editor.component-CLUOXreG.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/document-list-label-config-editor/document-list-label-config-editor.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/document-list-label-config-editor/document-list-label-config-editor.component.html"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n Input,\n ViewEncapsulation,\n computed,\n inject,\n output,\n signal,\n} from '@angular/core';\nimport { NgControl } from '@angular/forms';\nimport { MatAutocompleteModule, MatAutocompleteSelectedEvent } from '@angular/material/autocomplete';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatFormFieldControl, MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatListModule } from '@angular/material/list';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { ClipboardModule } from '@angular/cdk/clipboard';\nimport { CdkDrag, CdkDragDrop, CdkDropList } from '@angular/cdk/drag-drop';\nimport { Subject } from 'rxjs';\nimport {\n DocumentLitsLabelConfigInterfaceValueType,\n ElementTypes,\n InputDataTypes,\n InputPipeTypes,\n InputTypes,\n ReportTypes,\n} from 'ngx-t-forms-types';\nimport type {\n DocumentLitsLabelConfigInterface,\n ElementEditorInnerSectionElementInterface,\n FormColumnInputs,\n} from 'ngx-t-forms-types';\n\nimport type { IConfigElementError } from '../../t-dynamic-data-edit.component';\nimport { MatChipListEditorComponent } from '../mat-chip-list-editor/mat-chip-list-editor.component';\nimport { MatSliderToggleEditorComponent } from '../mat-slider-toggle-editor/mat-slider-toggle-editor.component';\nimport { EmptyStateComponent } from '../_shared/empty-state/empty-state.component';\n\n/** Picker chip option (label + value), as consumed by `lib-mat-chip-list-editor`. */\ninterface ChipOption {\n readonly label: string;\n readonly value: string;\n}\n\n/**\n * Working buffer for the label currently being added or edited. The three\n * distinct states of `labelInEdit` drive the editor UI:\n *\n * - `null` → not editing; the \"Add new column\" button is shown.\n * - `{}` (empty) → a fresh, not-yet-populated draft (the create form).\n * - populated draft → an existing or in-progress column being edited.\n */\ntype LabelDraft = Partial<DocumentLitsLabelConfigInterface>;\n\n/** Title-cases an enum key: `daysAgo` → `Days Ago`. */\nfunction humaniseKey(key: string): string {\n return key\n .replace(/([A-Z])/g, ' $1')\n .trim()\n .toLowerCase()\n .replace(/^\\w/, (c) => c.toUpperCase());\n}\n\n/** Derives a readable label from a camelCase control name: `taxRate` → `tax Rate`. */\nfunction controlNameToLabel(name: string): string {\n return name\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/([A-Z])([A-Z][a-z])/g, '$1 $2');\n}\n\n/**\n * Document-list label-configuration editor: builds the ordered list of column\n * label definitions (`DocumentLitsLabelConfigInterface[]`) used to render a\n * document list. Columns can be added, edited inline, removed, and reordered by\n * drag-and-drop.\n *\n * Implements `MatFormFieldControl<DocumentLitsLabelConfigInterface[]>`, so it\n * renders inside the parent's `<mat-form-field>` — `t-dynamic-data-edit` owns\n * the field label, hint, and validation errors; this component owns only the\n * column list and the add/edit form.\n *\n * NOTE: `MatFormFieldControl<T>` mandates plain mutable `value` / `disabled` /\n * `required` / `placeholder` / `id` members, `@Input()` decorators, the\n * `focused` / `touched` / `stateChanges` members, and the `useExisting`\n * provider. These are framework wiring, not defects — the CLAUDE.md bans on\n * `@Input()` / `useExisting` do not apply to MatFormFieldControl integration.\n * Genuinely-internal state (the in-edit draft, derived option lists) uses\n * `signal()` / `computed()`.\n */\n@Component({\n selector: 'lib-document-list-label-config-editor',\n imports: [\n MatListModule,\n MatTooltipModule,\n ClipboardModule,\n MatSliderToggleEditorComponent,\n MatChipListEditorComponent,\n MatFormFieldModule,\n MatButtonModule,\n MatAutocompleteModule,\n MatInputModule,\n MatIconModule,\n MatCardModule,\n CdkDropList,\n CdkDrag,\n EmptyStateComponent,\n ],\n templateUrl: './document-list-label-config-editor.component.html',\n styleUrl: './document-list-label-config-editor.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n 'class': 'lib-document-list-label-config-editor',\n '[id]': 'id',\n '[attr.aria-describedby]': 'describedBy',\n },\n providers: [\n { provide: MatFormFieldControl, useExisting: DocumentListLabelConfigEditorComponent },\n ],\n})\nexport class DocumentListLabelConfigEditorComponent\n implements MatFormFieldControl<Array<DocumentLitsLabelConfigInterface>>\n{\n static nextId = 0;\n\n /** Emits whenever a piece of `MatFormFieldControl` state changes. */\n readonly stateChanges = new Subject<void>();\n readonly controlType = 'lib-document-list-label-config-editor';\n\n id = `lib-document-list-label-config-editor-${DocumentListLabelConfigEditorComponent.nextId++}`;\n placeholder = '';\n focused = false;\n touched = false;\n describedBy = '';\n autofilled = false;\n userAriaDescribedBy: string | undefined = undefined;\n disableAutomaticLabeling: boolean | undefined = undefined;\n\n readonly ngControl = inject(NgControl, { self: true, optional: true });\n\n /** Validation errors surfaced by the parent for error-state derivation. */\n @Input() errors: IConfigElementError[] | undefined = [];\n /** Available form inputs used to auto-derive a column's value type. */\n @Input() formInputs: Array<FormColumnInputs> = [];\n /** Editor configuration supplied by the parent (placeholder/required/etc.). */\n @Input() editorConfig: ElementEditorInnerSectionElementInterface | undefined = undefined;\n /** Candidate control names offered in the form-control autocomplete. */\n @Input() mapToData: string[] | undefined = [];\n\n /** Emits the column list whenever it changes. */\n readonly valueChange = output<Array<DocumentLitsLabelConfigInterface>>();\n\n #value: Array<DocumentLitsLabelConfigInterface> = [];\n /** Current column configuration list. */\n @Input()\n get value(): Array<DocumentLitsLabelConfigInterface> {\n return this.#value;\n }\n set value(value: Array<DocumentLitsLabelConfigInterface>) {\n this.#value = value ?? [];\n this.stateChanges.next();\n }\n\n #disabled = false;\n /** Whether the editor is inert. */\n @Input()\n get disabled(): boolean {\n return this.#disabled;\n }\n set disabled(value: boolean) {\n this.#disabled = value;\n this.stateChanges.next();\n }\n\n #required = false;\n /** Whether at least one column is required. */\n @Input()\n get required(): boolean {\n return this.#required;\n }\n set required(value: boolean) {\n this.#required = value;\n this.stateChanges.next();\n }\n\n // ---- internal signal state ---------------------------------------------\n\n /** The label draft currently being added/edited (see {@link LabelDraft}). */\n protected readonly labelInEdit = signal<LabelDraft | null>(null);\n\n /** Value-type chip options (all enum members, humanised). */\n protected readonly valueTypes: ChipOption[] = Object.keys(\n DocumentLitsLabelConfigInterfaceValueType,\n ).map((key) => ({ label: humaniseKey(key), value: key }));\n\n /**\n * Autocomplete options filtered by the draft's `formControlName`. Empty term\n * shows the full list; otherwise matches a substring or a word-prefix.\n */\n protected readonly filteredControlNames = computed<readonly string[]>(() => {\n const source = this.mapToData ?? [];\n const term = (this.labelInEdit()?.formControlName ?? '').trim().toLowerCase();\n if (!term) {\n return source;\n }\n return source.filter((option) => {\n const text = option.toLowerCase();\n if (text.includes(term)) {\n return true;\n }\n return text.split(/\\s+/).some((word) => word.startsWith(term));\n });\n });\n\n /**\n * Report-type chip options derived from the draft's `valueType`. `undefined`\n * when no value type is chosen, which hides the report-types section.\n *\n * - currency / number → aggregation reports (avg, highest, lowest, sum)\n * - string → category report\n */\n protected readonly reportTypes = computed<ChipOption[] | undefined>(() => {\n const valueType = this.labelInEdit()?.valueType;\n if (!valueType) {\n return undefined;\n }\n return Object.values(ReportTypes)\n .filter((reportType) => {\n if (\n valueType === DocumentLitsLabelConfigInterfaceValueType.currency ||\n valueType === DocumentLitsLabelConfigInterfaceValueType.number\n ) {\n return (\n reportType === ReportTypes.Avg ||\n reportType === ReportTypes.Highest ||\n reportType === ReportTypes.Lowest ||\n reportType === ReportTypes.Sum\n );\n }\n if (valueType === DocumentLitsLabelConfigInterfaceValueType.string) {\n return reportType === ReportTypes.Category;\n }\n return false;\n })\n .map((key) => ({ label: humaniseKey(key), value: key }));\n });\n\n /** Whether the save action is blocked (draft missing required fields). */\n protected readonly labelSaveDisabled = computed<boolean>(() => {\n const draft = this.labelInEdit();\n return !draft || !draft.label || !draft.formControlName || !draft.valueType;\n });\n\n // ---- MatFormFieldControl getters (read by the framework) ----------------\n\n get empty(): boolean {\n return this.#value.length === 0;\n }\n\n get shouldLabelFloat(): boolean {\n return this.focused || !this.empty;\n }\n\n get errorState(): boolean {\n const requiredUnset = this.empty && this.#required;\n const ngControlError = this.ngControl?.errors != null;\n const externalError = (this.errors?.length ?? 0) > 0 && this.touched;\n return requiredUnset || ngControlError || externalError;\n }\n\n onTouched: () => void = () => {};\n\n setDescribedByIds(ids: string[]): void {\n this.describedBy = ids.join(' ');\n this.stateChanges.next();\n }\n\n onContainerClick(): void {\n this.markAsTouched();\n if (!this.focused) {\n this.focused = true;\n }\n this.stateChanges.next();\n }\n\n markAsTouched(): void {\n if (!this.touched) {\n this.touched = true;\n this.onTouched();\n this.stateChanges.next();\n }\n }\n\n // ---- editing ------------------------------------------------------------\n\n /** Begin a fresh column draft. */\n protected startNewLabel(): void {\n this.labelInEdit.set({});\n }\n\n /** Discard the current draft. */\n protected cancelEdit(): void {\n this.labelInEdit.set(null);\n }\n\n /** Update the draft's display label from the name input. */\n protected nameChange(event: Event): void {\n const label = (event.target as HTMLInputElement | null)?.value ?? '';\n this.labelInEdit.update((draft) => ({ ...draft, label }));\n }\n\n /**\n * Update the draft's form control name (free-text typing). Re-derives the\n * value type from the matching form input, if any.\n */\n protected formControlNameChange(event: Event): void {\n const formControlName = (event.target as HTMLInputElement | null)?.value ?? '';\n const input = this.formInputs.find((i) => i.formControlName === formControlName);\n this.labelInEdit.update((draft) => ({\n ...draft,\n formControlName,\n valueType: this.#valueTypeFromInput(input),\n }));\n }\n\n /** Apply an autocomplete selection, defaulting the label from the name. */\n protected formControlSelected(event: MatAutocompleteSelectedEvent): void {\n const formControlName = String(event.option.value);\n this.labelInEdit.update((draft) => ({\n ...draft,\n formControlName,\n label: draft?.label || controlNameToLabel(formControlName),\n }));\n }\n\n /** Set the draft's value type from the chip selection. */\n protected valueTypeChanged(value: unknown): void {\n this.labelInEdit.update((draft) => ({\n ...draft,\n valueType: value as DocumentLitsLabelConfigInterfaceValueType,\n }));\n }\n\n /**\n * Set the draft's report types. The chip editor is multi-select, so it emits\n * an array; a single value is normalised into one.\n */\n protected reportTypeChanged(value: unknown): void {\n const reportType = Array.isArray(value)\n ? (value as ReportTypes[])\n : value == null\n ? []\n : [value as ReportTypes];\n this.labelInEdit.update((draft) => ({ ...draft, reportType }));\n }\n\n /** Toggle the draft's hidden flag. */\n protected isHiddenChanged(isHidden: boolean): void {\n this.labelInEdit.update((draft) => ({ ...draft, isHidden }));\n }\n\n /** Commit the draft into the list (replacing a matching column, or appending). */\n protected saveHeader(): void {\n const draft = this.labelInEdit();\n if (!draft) {\n return;\n }\n const next = [...this.#value];\n const index = next.findIndex((item) => item.formControlName === draft.formControlName);\n const column = draft as DocumentLitsLabelConfigInterface;\n if (index !== -1) {\n next[index] = column;\n } else {\n next.push(column);\n }\n this.#commit(next);\n this.labelInEdit.set(null);\n }\n\n /** Remove a column by its form control name. */\n protected removeLabel(label: DocumentLitsLabelConfigInterface): void {\n this.#commit(this.#value.filter((item) => item.formControlName !== label.formControlName));\n }\n\n /** Reorder the list after a drag-and-drop. */\n protected drop(event: CdkDragDrop<DocumentLitsLabelConfigInterface[]>): void {\n const { previousIndex, currentIndex } = event;\n const moved = this.#value.at(previousIndex);\n if (moved === undefined || previousIndex === currentIndex) {\n return;\n }\n const next = [...this.#value];\n next.splice(previousIndex, 1);\n next.splice(currentIndex, 0, moved);\n this.#commit(next);\n }\n\n /** Write a new list value, emit the change, and mark the control touched. */\n #commit(next: Array<DocumentLitsLabelConfigInterface>): void {\n this.value = next;\n this.valueChange.emit(next);\n this.markAsTouched();\n }\n\n /** Derive the value type from a form input's data/element type and pipe. */\n #valueTypeFromInput(\n input: FormColumnInputs | undefined,\n ): DocumentLitsLabelConfigInterfaceValueType {\n if (!input) {\n return DocumentLitsLabelConfigInterfaceValueType.string;\n }\n if (\n input.dataType === InputDataTypes.Number ||\n input.type === InputTypes.Number ||\n input.pipe?.pipeType === InputPipeTypes.Number\n ) {\n return DocumentLitsLabelConfigInterfaceValueType.number;\n }\n if (input.pipe?.pipeType === InputPipeTypes.Currency) {\n return DocumentLitsLabelConfigInterfaceValueType.currency;\n }\n if (input.dataType === InputDataTypes.Boolean || input.element === ElementTypes.Toggle) {\n return DocumentLitsLabelConfigInterfaceValueType.boolean;\n }\n return DocumentLitsLabelConfigInterfaceValueType.string;\n }\n}\n","<mat-nav-list\n cdkDropList\n [cdkDropListData]=\"value\"\n (cdkDropListDropped)=\"drop($event)\"\n class=\"lib-document-list-label-config-editor__list\"\n>\n @if (value.length === 0) {\n <lib-empty-state\n icon=\"view_column\"\n message=\"No columns configured. Add one below.\"\n ></lib-empty-state>\n } @else {\n @for (label of value; track label.formControlName) {\n <mat-list-item\n cdkDrag\n class=\"lib-document-list-label-config-editor__item\"\n [matTooltip]=\"'Click to copy ' + label.formControlName\"\n [cdkCopyToClipboard]=\"label.formControlName\"\n matTooltipPosition=\"before\"\n >\n <mat-icon matListItemIcon>view_column</mat-icon>\n\n <div matListItemTitle class=\"lib-document-list-label-config-editor__title\">\n <span class=\"lib-document-list-label-config-editor__label\">{{ label.label }}</span>\n <span class=\"lib-document-list-label-config-editor__meta\">\n <code>{{ label.formControlName }}</code> · {{ label.valueType }}\n </span>\n </div>\n\n <button\n matListItemMeta\n mat-icon-button\n type=\"button\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"'Remove ' + label.label\"\n (click)=\"removeLabel(label)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </mat-list-item>\n }\n }\n</mat-nav-list>\n\n@if (labelInEdit(); as draft) {\n <mat-card appearance=\"outlined\" class=\"lib-document-list-label-config-editor__form\">\n <mat-card-content class=\"lib-document-list-label-config-editor__fields\">\n <label class=\"lib-document-list-label-config-editor__field-label\" [attr.for]=\"id + '-fcn'\">\n Form control name\n </label>\n <input\n class=\"lib-document-list-label-config-editor__input\"\n type=\"text\"\n [id]=\"id + '-fcn'\"\n placeholder=\"Pick one\"\n aria-label=\"Form control name\"\n [value]=\"draft.formControlName || ''\"\n (input)=\"formControlNameChange($event)\"\n [matAutocomplete]=\"auto\"\n />\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n autoActiveFirstOption\n (optionSelected)=\"formControlSelected($event)\"\n >\n @for (option of filteredControlNames(); track option) {\n <mat-option [value]=\"option\">{{ option }}</mat-option>\n }\n </mat-autocomplete>\n\n <label class=\"lib-document-list-label-config-editor__field-label\" [attr.for]=\"id + '-name'\">\n Name\n </label>\n <input\n class=\"lib-document-list-label-config-editor__input\"\n type=\"text\"\n [id]=\"id + '-name'\"\n placeholder=\"Enter label name\"\n [value]=\"draft.label || ''\"\n (input)=\"nameChange($event)\"\n />\n\n <label class=\"lib-document-list-label-config-editor__field-label\" [id]=\"id + '-vt-label'\">\n Value type\n </label>\n <lib-mat-chip-list-editor\n [id]=\"id + '-vt'\"\n [errors]=\"[]\"\n [value]=\"draft.valueType\"\n [options]=\"valueTypes\"\n (valueChange)=\"valueTypeChanged($event)\"\n ></lib-mat-chip-list-editor>\n\n @if (reportTypes(); as types) {\n @if (types.length > 0) {\n <label class=\"lib-document-list-label-config-editor__field-label\" [id]=\"id + '-rt-label'\">\n Report types\n </label>\n <lib-mat-chip-list-editor\n [id]=\"id + '-rt'\"\n [errors]=\"[]\"\n [multiple]=\"true\"\n [value]=\"draft.reportType\"\n [options]=\"types\"\n (valueChange)=\"reportTypeChanged($event)\"\n ></lib-mat-chip-list-editor>\n }\n }\n\n <lib-mat-slider-toggle-editor\n [id]=\"id + '-hidden'\"\n label=\"Is hidden\"\n [value]=\"draft.isHidden || false\"\n [errors]=\"[]\"\n (valueChange)=\"isHiddenChanged(!!$event)\"\n ></lib-mat-slider-toggle-editor>\n </mat-card-content>\n\n <mat-card-actions class=\"lib-document-list-label-config-editor__actions\">\n <button\n mat-flat-button\n color=\"primary\"\n type=\"button\"\n [disabled]=\"labelSaveDisabled()\"\n (click)=\"saveHeader()\"\n >\n Save header\n </button>\n <span class=\"lib-document-list-label-config-editor__spacer\"></span>\n <button mat-button color=\"warn\" type=\"button\" (click)=\"cancelEdit()\">Cancel</button>\n </mat-card-actions>\n </mat-card>\n} @else {\n <button\n mat-stroked-button\n color=\"primary\"\n type=\"button\"\n class=\"lib-document-list-label-config-editor__add\"\n [disabled]=\"disabled\"\n (click)=\"startNewLabel()\"\n >\n Add new column\n </button>\n}\n"],"names":["i1","i2","i3","i4","i5","i6","i7","i8"],"mappings":"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"}