@sd-angular/core 19.0.0-beta.98 → 19.0.0-beta.99

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 (166) hide show
  1. package/README.md +722 -716
  2. package/components/anchor/src/components/anchor/anchor.component.d.ts +5 -5
  3. package/components/anchor/src/components/anchor-nav/anchor-nav.component.d.ts +21 -0
  4. package/components/editor/src/editor.component.d.ts +2 -0
  5. package/components/modal/src/modal.component.d.ts +1 -0
  6. package/components/side-drawer/src/side-drawer.component.d.ts +7 -3
  7. package/components/table/index.d.ts.map +1 -0
  8. package/components/table/sd-angular-core-components-table.d.ts.map +1 -0
  9. package/components/table/src/components/column-title/column-title.component.d.ts.map +1 -0
  10. package/components/table/src/components/command/desktop-command.component.d.ts +14 -0
  11. package/components/table/src/components/command/desktop-command.component.d.ts.map +1 -0
  12. package/components/table/src/components/command/pipes/command.pipe.d.ts +30 -0
  13. package/components/table/src/components/command/pipes/command.pipe.d.ts.map +1 -0
  14. package/components/table/src/components/command/pipes/filter.pipe.d.ts +35 -0
  15. package/components/table/src/components/command/pipes/filter.pipe.d.ts.map +1 -0
  16. package/components/table/src/components/config/config.component.d.ts +7 -14
  17. package/components/table/src/components/config/config.component.d.ts.map +1 -0
  18. package/components/table/src/components/desktop-cell/desktop-cell.component.d.ts +2 -2
  19. package/components/table/src/components/desktop-cell/desktop-cell.component.d.ts.map +1 -0
  20. package/components/table/src/components/desktop-cell/view/view.component.d.ts.map +1 -0
  21. package/components/table/src/components/filter/column-filter/column-filter.component.d.ts +36 -0
  22. package/components/table/src/components/filter/column-filter/column-filter.component.d.ts.map +1 -0
  23. package/components/table/src/components/filter/external-filter/external-filter.component.d.ts +27 -0
  24. package/components/table/src/components/filter/external-filter/external-filter.component.d.ts.map +1 -0
  25. package/components/table/src/components/filter/index.d.ts +3 -0
  26. package/components/table/src/components/filter/index.d.ts.map +1 -0
  27. package/components/table/src/components/filter/mobile-filter/mobile-filter.component.d.ts +42 -0
  28. package/components/table/src/components/filter/mobile-filter/mobile-filter.component.d.ts.map +1 -0
  29. package/components/table/src/components/index.d.ts +1 -2
  30. package/components/table/src/components/index.d.ts.map +1 -0
  31. package/components/table/src/components/popup-export/popup-export.component.d.ts.map +1 -0
  32. package/components/table/src/components/selector-action/action-filter.pipe.d.ts.map +1 -0
  33. package/components/table/src/components/selector-action/selector-action.component.d.ts +2 -4
  34. package/components/table/src/components/selector-action/selector-action.component.d.ts.map +1 -0
  35. package/components/table/src/configurations/index.d.ts.map +1 -0
  36. package/components/table/src/configurations/table.configuration.d.ts.map +1 -0
  37. package/components/table/src/directives/index.d.ts.map +1 -0
  38. package/components/table/src/directives/sd-column-resize.directive.d.ts.map +1 -0
  39. package/components/table/src/directives/sd-table-cell-def.directive.d.ts +4 -4
  40. package/components/table/src/directives/sd-table-cell-def.directive.d.ts.map +1 -0
  41. package/components/table/src/directives/sd-table-column-filter-def.directive.d.ts +2 -2
  42. package/components/table/src/directives/sd-table-column-filter-def.directive.d.ts.map +1 -0
  43. package/components/table/src/directives/sd-table-expand-def.directive.d.ts +3 -3
  44. package/components/table/src/directives/sd-table-expand-def.directive.d.ts.map +1 -0
  45. package/components/table/src/directives/sd-table-filter-def.directive.d.ts +2 -2
  46. package/components/table/src/directives/sd-table-filter-def.directive.d.ts.map +1 -0
  47. package/components/table/src/directives/sd-table-footer-def.directive.d.ts +2 -2
  48. package/components/table/src/directives/sd-table-footer-def.directive.d.ts.map +1 -0
  49. package/components/table/src/directives/sd-table-title-def.directive.d.ts +2 -2
  50. package/components/table/src/directives/sd-table-title-def.directive.d.ts.map +1 -0
  51. package/components/table/src/directives/sticky-shadow.directive.d.ts.map +1 -0
  52. package/components/table/src/models/index.d.ts.map +1 -0
  53. package/components/table/src/models/table-column.model.d.ts.map +1 -0
  54. package/components/table/src/models/table-command.model.d.ts.map +1 -0
  55. package/components/table/src/models/table-item.model.d.ts.map +1 -0
  56. package/components/table/src/models/table-option-config.model.d.ts.map +1 -0
  57. package/components/table/src/models/table-option-expand.model.d.ts.map +1 -0
  58. package/components/table/src/models/table-option-export.model.d.ts.map +1 -0
  59. package/components/table/src/models/table-option-group.model.d.ts.map +1 -0
  60. package/components/table/src/models/table-option-paginate.model.d.ts.map +1 -0
  61. package/components/table/src/models/table-option-reload.model.d.ts.map +1 -0
  62. package/components/table/src/models/table-option-selector.model.d.ts.map +1 -0
  63. package/components/table/src/models/table-option-sort.model.d.ts.map +1 -0
  64. package/components/table/src/models/table-option-style.model.d.ts.map +1 -0
  65. package/components/table/src/models/table-option-tree.model.d.ts.map +1 -0
  66. package/components/table/src/models/table-option.model.d.ts +13 -0
  67. package/components/table/src/models/table-option.model.d.ts.map +1 -0
  68. package/components/table/src/pipes/filter-values.pipe.d.ts.map +1 -0
  69. package/components/table/src/pipes/index.d.ts.map +1 -0
  70. package/components/table/src/pipes/sd-group.pipe.d.ts.map +1 -0
  71. package/components/table/src/pipes/sd-tree.pipe.d.ts.map +1 -0
  72. package/components/table/src/pipes/selection-disabled.pipe.d.ts.map +1 -0
  73. package/components/table/src/pipes/selection-visible-select-all.pipe.d.ts.map +1 -0
  74. package/components/table/src/pipes/selection-visible.pipe.d.ts.map +1 -0
  75. package/components/table/src/services/column-width.util.d.ts.map +1 -0
  76. package/components/table/src/services/config.service.d.ts.map +1 -0
  77. package/components/table/src/services/index.d.ts.map +1 -0
  78. package/components/table/src/services/table-export/table-export.service.d.ts.map +1 -0
  79. package/components/table/src/services/table-filter/table-filter.model.d.ts.map +1 -0
  80. package/components/table/src/services/table-filter/table-filter.service.d.ts.map +1 -0
  81. package/components/table/src/services/table-format/table-format.service.d.ts.map +1 -0
  82. package/components/table/src/services/tree/tree.util.d.ts.map +1 -0
  83. package/components/table/src/table.component.d.ts +10 -7
  84. package/components/table/src/table.component.d.ts.map +1 -0
  85. package/components/upload-file/src/upload-file.component.d.ts +3 -0
  86. package/fesm2022/sd-angular-core-components-anchor.mjs +23 -16
  87. package/fesm2022/sd-angular-core-components-anchor.mjs.map +1 -1
  88. package/fesm2022/sd-angular-core-components-autoid-inspector.mjs +2 -2
  89. package/fesm2022/sd-angular-core-components-autoid-inspector.mjs.map +1 -1
  90. package/fesm2022/sd-angular-core-components-button.mjs +2 -2
  91. package/fesm2022/sd-angular-core-components-button.mjs.map +1 -1
  92. package/fesm2022/sd-angular-core-components-editor.mjs +5 -2
  93. package/fesm2022/sd-angular-core-components-editor.mjs.map +1 -1
  94. package/fesm2022/sd-angular-core-components-form-generic.mjs +3 -3
  95. package/fesm2022/sd-angular-core-components-form-generic.mjs.map +1 -1
  96. package/fesm2022/sd-angular-core-components-modal.mjs +3 -2
  97. package/fesm2022/sd-angular-core-components-modal.mjs.map +1 -1
  98. package/fesm2022/sd-angular-core-components-side-drawer.mjs +17 -11
  99. package/fesm2022/sd-angular-core-components-side-drawer.mjs.map +1 -1
  100. package/fesm2022/sd-angular-core-components-table.mjs +631 -572
  101. package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
  102. package/fesm2022/sd-angular-core-components-upload-file.mjs +7 -2
  103. package/fesm2022/sd-angular-core-components-upload-file.mjs.map +1 -1
  104. package/fesm2022/sd-angular-core-forms-autocomplete.mjs +11 -3
  105. package/fesm2022/sd-angular-core-forms-autocomplete.mjs.map +1 -1
  106. package/fesm2022/sd-angular-core-forms-checkbox.mjs +8 -2
  107. package/fesm2022/sd-angular-core-forms-checkbox.mjs.map +1 -1
  108. package/fesm2022/sd-angular-core-forms-chip-calendar.mjs +12 -3
  109. package/fesm2022/sd-angular-core-forms-chip-calendar.mjs.map +1 -1
  110. package/fesm2022/sd-angular-core-forms-chip.mjs +12 -3
  111. package/fesm2022/sd-angular-core-forms-chip.mjs.map +1 -1
  112. package/fesm2022/sd-angular-core-forms-date-range.mjs +13 -3
  113. package/fesm2022/sd-angular-core-forms-date-range.mjs.map +1 -1
  114. package/fesm2022/sd-angular-core-forms-date.mjs +9 -3
  115. package/fesm2022/sd-angular-core-forms-date.mjs.map +1 -1
  116. package/fesm2022/sd-angular-core-forms-datetime.mjs +9 -3
  117. package/fesm2022/sd-angular-core-forms-datetime.mjs.map +1 -1
  118. package/fesm2022/sd-angular-core-forms-input-number.mjs +9 -3
  119. package/fesm2022/sd-angular-core-forms-input-number.mjs.map +1 -1
  120. package/fesm2022/sd-angular-core-forms-input.mjs +13 -3
  121. package/fesm2022/sd-angular-core-forms-input.mjs.map +1 -1
  122. package/fesm2022/sd-angular-core-forms-models.mjs +65 -2
  123. package/fesm2022/sd-angular-core-forms-models.mjs.map +1 -1
  124. package/fesm2022/sd-angular-core-forms-radio.mjs +8 -3
  125. package/fesm2022/sd-angular-core-forms-radio.mjs.map +1 -1
  126. package/fesm2022/sd-angular-core-forms-select.mjs +11 -3
  127. package/fesm2022/sd-angular-core-forms-select.mjs.map +1 -1
  128. package/fesm2022/sd-angular-core-forms-switch.mjs +8 -3
  129. package/fesm2022/sd-angular-core-forms-switch.mjs.map +1 -1
  130. package/fesm2022/sd-angular-core-forms-textarea.mjs +9 -3
  131. package/fesm2022/sd-angular-core-forms-textarea.mjs.map +1 -1
  132. package/fesm2022/sd-angular-core-i18n.mjs +205 -20
  133. package/fesm2022/sd-angular-core-i18n.mjs.map +1 -1
  134. package/fesm2022/sd-angular-core-utilities-data-state.mjs +38 -0
  135. package/fesm2022/sd-angular-core-utilities-data-state.mjs.map +1 -0
  136. package/fesm2022/sd-angular-core-utilities.mjs +1 -0
  137. package/fesm2022/sd-angular-core-utilities.mjs.map +1 -1
  138. package/forms/autocomplete/src/autocomplete.component.d.ts +5 -0
  139. package/forms/checkbox/src/checkbox.component.d.ts +3 -0
  140. package/forms/chip/src/chip.component.d.ts +4 -0
  141. package/forms/chip-calendar/src/chip-calendar.component.d.ts +4 -0
  142. package/forms/date/src/date.component.d.ts +4 -0
  143. package/forms/date-range/src/date-range.component.d.ts +4 -0
  144. package/forms/datetime/src/datetime.component.d.ts +4 -0
  145. package/forms/input/src/input.component.d.ts +4 -0
  146. package/forms/input-number/src/input-number.component.d.ts +6 -2
  147. package/forms/models/index.d.ts +1 -0
  148. package/forms/models/src/form-control-state.d.ts +23 -0
  149. package/forms/radio/src/radio.component.d.ts +3 -0
  150. package/forms/select/src/select.component.d.ts +5 -0
  151. package/forms/switch/src/switch.component.d.ts +3 -0
  152. package/forms/textarea/src/textarea.component.d.ts +4 -0
  153. package/i18n/src/en.d.ts +39 -3
  154. package/package.json +35 -31
  155. package/sd-angular-core-19.0.0-beta.99.tgz +0 -0
  156. package/utilities/data-state/index.d.ts +1 -0
  157. package/utilities/data-state/src/data-state.d.ts +11 -0
  158. package/utilities/index.d.ts +1 -0
  159. package/components/anchor/src/components/anchor-vertical/anchor-vertical-list.component.d.ts +0 -18
  160. package/components/table/src/components/column-filter/column-filter.component.d.ts +0 -40
  161. package/components/table/src/components/desktop-command/desktop-command.component.d.ts +0 -15
  162. package/components/table/src/components/external-filter/external-filter.component.d.ts +0 -36
  163. package/components/table/src/pipes/command-disable.pipe.d.ts +0 -9
  164. package/components/table/src/pipes/command-filter.pipe.d.ts +0 -25
  165. package/components/table/src/pipes/command-title.pipe.d.ts +0 -9
  166. package/sd-angular-core-19.0.0-beta.98.tgz +0 -0
@@ -1,6 +1,7 @@
1
- import { InjectionToken } from '@angular/core';
1
+ import { InjectionToken, signal, inject, DestroyRef, effect, untracked, computed } from '@angular/core';
2
2
  import { FormControl } from '@angular/forms';
3
3
  import { Subject } from 'rxjs';
4
+ import { startWith } from 'rxjs/operators';
4
5
 
5
6
  const SD_FORM_CONFIGURATION = new InjectionToken('sd.form.configuration');
6
7
 
@@ -54,9 +55,71 @@ const HandleSdCustomValidator = (func) => {
54
55
  };
55
56
  };
56
57
 
58
+ /**
59
+ * Wrap an AbstractControl Signal into a reactive snapshot signal.
60
+ *
61
+ * Re-emits on every value, status, touched, or dirty change so
62
+ * downstream consumers can derive `data-disabled`, `data-value`,
63
+ * `data-empty`, and `data-invalid` host-binding attributes from a
64
+ * single, lazily evaluated signal.
65
+ *
66
+ * "invalid" is intentionally gated on `touched || dirty` so validation
67
+ * errors are not surfaced until the user has interacted with the field.
68
+ *
69
+ * Must be called inside an Angular injection context (constructor,
70
+ * field initialiser, or `runInInjectionContext`).
71
+ */
72
+ function sdFormControlState(control) {
73
+ // A tick counter incremented on every control event (value, status,
74
+ // touched, dirty). Written only from the effect below — never inside
75
+ // a computed() — satisfying Angular's no-side-effect-in-reactive rule.
76
+ const tick = signal(0);
77
+ const destroyRef = inject(DestroyRef);
78
+ // Holds the active RxJS subscription so it can be torn down when the
79
+ // control instance changes or the host component is destroyed.
80
+ let subscription = null;
81
+ // An effect re-runs whenever the control Signal changes, tears down the
82
+ // old subscription and creates a fresh one for the incoming control.
83
+ // `AbstractControl.events` (Angular 14+) covers value, status, touched,
84
+ // and dirty changes — a superset of valueChanges + statusChanges.
85
+ const effectRef = effect(() => {
86
+ const c = control(); // tracked — effect re-runs on change
87
+ // effect() runs asynchronously; the old subscription is torn down on the next
88
+ // scheduled run, not synchronously on signal change. A one-tick window of
89
+ // double-subscription is harmless due to computed() memoization.
90
+ subscription?.unsubscribe();
91
+ subscription = null;
92
+ if (c) {
93
+ subscription = c.events.pipe(startWith(null)).subscribe(() => {
94
+ // Increment outside reactive context to avoid Angular's
95
+ // "signal written from computed / template" error.
96
+ untracked(() => tick.update(n => n + 1));
97
+ });
98
+ }
99
+ });
100
+ // Clean up effect and subscription when host component is destroyed.
101
+ destroyRef.onDestroy(() => {
102
+ effectRef.destroy();
103
+ subscription?.unsubscribe();
104
+ });
105
+ return computed(() => {
106
+ const _control = control();
107
+ tick(); // reactive dependency — recomputes on every control event
108
+ if (!_control) {
109
+ return { value: undefined, disabled: false, invalid: false, touched: false };
110
+ }
111
+ return {
112
+ value: _control.value,
113
+ disabled: _control.disabled,
114
+ invalid: _control.invalid && (_control.touched || _control.dirty),
115
+ touched: _control.touched,
116
+ };
117
+ });
118
+ }
119
+
57
120
  /**
58
121
  * Generated bundle index. Do not edit.
59
122
  */
60
123
 
61
- export { HandleSdCustomValidator, SD_FORM_CONFIGURATION, SdFormControl };
124
+ export { HandleSdCustomValidator, SD_FORM_CONFIGURATION, SdFormControl, sdFormControlState };
62
125
  //# sourceMappingURL=sd-angular-core-forms-models.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"sd-angular-core-forms-models.mjs","sources":["../../../projects/sd-angular/forms/models/src/sd-form.configuration.ts","../../../projects/sd-angular/forms/models/src/sd-form-control.model.ts","../../../projects/sd-angular/forms/models/src/sd-custom-validator.model.ts","../../../projects/sd-angular/forms/models/sd-angular-core-forms-models.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { MatFormFieldAppearance } from '@angular/material/form-field';\n\nexport interface ISdFormConfiguration {\n appearance?: MatFormFieldAppearance;\n}\n\nexport const SD_FORM_CONFIGURATION = new InjectionToken<ISdFormConfiguration>('sd.form.configuration');\n","import { FormControl, AsyncValidatorFn, ValidatorFn, FormControlOptions, FormControlState } from '@angular/forms';\nimport { Subject } from 'rxjs';\n\nexport class SdFormControl extends FormControl {\n sdChanges: Subject<boolean> = new Subject<boolean>();\n untouchChanges: Subject<boolean> = new Subject<boolean>();\n touchChanges: Subject<boolean> = new Subject<boolean>();\n pristineChanges: Subject<boolean> = new Subject<boolean>();\n constructor(\n formState?: FormControlState<any>,\n validatorOrOpts?: ValidatorFn | ValidatorFn[] | FormControlOptions | null,\n asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null\n ) {\n super(formState, validatorOrOpts, asyncValidator);\n }\n\n override markAsUntouched(opts?: { onlySelf?: boolean; emitEvent?: boolean }): void {\n super.markAsUntouched(opts);\n this.untouchChanges.next(true);\n this.sdChanges.next(true);\n }\n\n override markAsTouched(opts?: { onlySelf?: boolean; emitEvent?: boolean }): void {\n super.markAsTouched(opts);\n this.touchChanges.next(true);\n this.sdChanges.next(true);\n }\n\n override markAsPristine(opts?: { onlySelf?: boolean; emitEvent?: boolean }): void {\n super.markAsPristine(opts);\n this.pristineChanges.next(true);\n this.sdChanges.next(true);\n }\n}\n","import { AbstractControl, AsyncValidatorFn } from '@angular/forms';\r\n\r\nexport type SdCustomValidator = (value: any) => string | Promise<string>;\r\nexport const HandleSdCustomValidator = (func: SdCustomValidator): AsyncValidatorFn => {\r\n return async (c: AbstractControl): Promise<Record<string, any> | null> => { \r\n const value = c.value===0 ? c.value : c.value || null;\r\n if (func && typeof func === 'function') {\r\n const result = func(value);\r\n if (result instanceof Promise) {\r\n const message = await result;\r\n if (message) {\r\n return {\r\n customValidator: message,\r\n };\r\n }\r\n return null;\r\n }\r\n if (result) {\r\n return {\r\n customValidator: result,\r\n };\r\n }\r\n return null;\r\n }\r\n return null;\r\n };\r\n};\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;MAOa,qBAAqB,GAAG,IAAI,cAAc,CAAuB,uBAAuB;;ACJ/F,MAAO,aAAc,SAAQ,WAAW,CAAA;AAC5C,IAAA,SAAS,GAAqB,IAAI,OAAO,EAAW;AACpD,IAAA,cAAc,GAAqB,IAAI,OAAO,EAAW;AACzD,IAAA,YAAY,GAAqB,IAAI,OAAO,EAAW;AACvD,IAAA,eAAe,GAAqB,IAAI,OAAO,EAAW;AAC1D,IAAA,WAAA,CACE,SAAiC,EACjC,eAAyE,EACzE,cAA6D,EAAA;AAE7D,QAAA,KAAK,CAAC,SAAS,EAAE,eAAe,EAAE,cAAc,CAAC;IACnD;AAES,IAAA,eAAe,CAAC,IAAkD,EAAA;AACzE,QAAA,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC;AAC3B,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;AAC9B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;IAC3B;AAES,IAAA,aAAa,CAAC,IAAkD,EAAA;AACvE,QAAA,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;AAC5B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;IAC3B;AAES,IAAA,cAAc,CAAC,IAAkD,EAAA;AACxE,QAAA,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;AAC/B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;IAC3B;AACD;;AC9BM,MAAM,uBAAuB,GAAG,CAAC,IAAuB,KAAsB;AACnF,IAAA,OAAO,OAAO,CAAkB,KAAyC;QACvE,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,KAAG,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI;AACrD,QAAA,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE;AACtC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;AAC1B,YAAA,IAAI,MAAM,YAAY,OAAO,EAAE;AAC7B,gBAAA,MAAM,OAAO,GAAG,MAAM,MAAM;gBAC5B,IAAI,OAAO,EAAE;oBACX,OAAO;AACL,wBAAA,eAAe,EAAE,OAAO;qBACzB;gBACH;AACA,gBAAA,OAAO,IAAI;YACb;YACA,IAAI,MAAM,EAAE;gBACV,OAAO;AACL,oBAAA,eAAe,EAAE,MAAM;iBACxB;YACH;AACA,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;AACH;;AC1BA;;AAEG;;;;"}
1
+ {"version":3,"file":"sd-angular-core-forms-models.mjs","sources":["../../../projects/sd-angular/forms/models/src/sd-form.configuration.ts","../../../projects/sd-angular/forms/models/src/sd-form-control.model.ts","../../../projects/sd-angular/forms/models/src/sd-custom-validator.model.ts","../../../projects/sd-angular/forms/models/src/form-control-state.ts","../../../projects/sd-angular/forms/models/sd-angular-core-forms-models.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { MatFormFieldAppearance } from '@angular/material/form-field';\n\nexport interface ISdFormConfiguration {\n appearance?: MatFormFieldAppearance;\n}\n\nexport const SD_FORM_CONFIGURATION = new InjectionToken<ISdFormConfiguration>('sd.form.configuration');\n","import { FormControl, AsyncValidatorFn, ValidatorFn, FormControlOptions, FormControlState } from '@angular/forms';\nimport { Subject } from 'rxjs';\n\nexport class SdFormControl extends FormControl {\n sdChanges: Subject<boolean> = new Subject<boolean>();\n untouchChanges: Subject<boolean> = new Subject<boolean>();\n touchChanges: Subject<boolean> = new Subject<boolean>();\n pristineChanges: Subject<boolean> = new Subject<boolean>();\n constructor(\n formState?: FormControlState<any>,\n validatorOrOpts?: ValidatorFn | ValidatorFn[] | FormControlOptions | null,\n asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null\n ) {\n super(formState, validatorOrOpts, asyncValidator);\n }\n\n override markAsUntouched(opts?: { onlySelf?: boolean; emitEvent?: boolean }): void {\n super.markAsUntouched(opts);\n this.untouchChanges.next(true);\n this.sdChanges.next(true);\n }\n\n override markAsTouched(opts?: { onlySelf?: boolean; emitEvent?: boolean }): void {\n super.markAsTouched(opts);\n this.touchChanges.next(true);\n this.sdChanges.next(true);\n }\n\n override markAsPristine(opts?: { onlySelf?: boolean; emitEvent?: boolean }): void {\n super.markAsPristine(opts);\n this.pristineChanges.next(true);\n this.sdChanges.next(true);\n }\n}\n","import { AbstractControl, AsyncValidatorFn } from '@angular/forms';\r\n\r\nexport type SdCustomValidator = (value: any) => string | Promise<string>;\r\nexport const HandleSdCustomValidator = (func: SdCustomValidator): AsyncValidatorFn => {\r\n return async (c: AbstractControl): Promise<Record<string, any> | null> => { \r\n const value = c.value===0 ? c.value : c.value || null;\r\n if (func && typeof func === 'function') {\r\n const result = func(value);\r\n if (result instanceof Promise) {\r\n const message = await result;\r\n if (message) {\r\n return {\r\n customValidator: message,\r\n };\r\n }\r\n return null;\r\n }\r\n if (result) {\r\n return {\r\n customValidator: result,\r\n };\r\n }\r\n return null;\r\n }\r\n return null;\r\n };\r\n};\r\n","import { DestroyRef, EffectRef, Signal, computed, effect, inject, signal, untracked } from '@angular/core';\r\nimport { AbstractControl } from '@angular/forms';\r\nimport { Subscription } from 'rxjs';\r\nimport { startWith } from 'rxjs/operators';\r\n\r\nexport interface SdFormControlSnapshot<T> {\r\n value: T | undefined;\r\n disabled: boolean;\r\n invalid: boolean;\r\n touched: boolean;\r\n}\r\n\r\n/**\r\n * Wrap an AbstractControl Signal into a reactive snapshot signal.\r\n *\r\n * Re-emits on every value, status, touched, or dirty change so\r\n * downstream consumers can derive `data-disabled`, `data-value`,\r\n * `data-empty`, and `data-invalid` host-binding attributes from a\r\n * single, lazily evaluated signal.\r\n *\r\n * \"invalid\" is intentionally gated on `touched || dirty` so validation\r\n * errors are not surfaced until the user has interacted with the field.\r\n *\r\n * Must be called inside an Angular injection context (constructor,\r\n * field initialiser, or `runInInjectionContext`).\r\n */\r\nexport function sdFormControlState<T = unknown>(\r\n control: Signal<AbstractControl<T> | null | undefined>\r\n): Signal<SdFormControlSnapshot<T>> {\r\n // A tick counter incremented on every control event (value, status,\r\n // touched, dirty). Written only from the effect below — never inside\r\n // a computed() — satisfying Angular's no-side-effect-in-reactive rule.\r\n const tick = signal(0);\r\n const destroyRef = inject(DestroyRef);\r\n\r\n // Holds the active RxJS subscription so it can be torn down when the\r\n // control instance changes or the host component is destroyed.\r\n let subscription: Subscription | null = null;\r\n\r\n // An effect re-runs whenever the control Signal changes, tears down the\r\n // old subscription and creates a fresh one for the incoming control.\r\n // `AbstractControl.events` (Angular 14+) covers value, status, touched,\r\n // and dirty changes — a superset of valueChanges + statusChanges.\r\n const effectRef: EffectRef = effect(() => {\r\n const c = control(); // tracked — effect re-runs on change\r\n // effect() runs asynchronously; the old subscription is torn down on the next\r\n // scheduled run, not synchronously on signal change. A one-tick window of\r\n // double-subscription is harmless due to computed() memoization.\r\n subscription?.unsubscribe();\r\n subscription = null;\r\n\r\n if (c) {\r\n subscription = c.events.pipe(startWith(null)).subscribe(() => {\r\n // Increment outside reactive context to avoid Angular's\r\n // \"signal written from computed / template\" error.\r\n untracked(() => tick.update(n => n + 1));\r\n });\r\n }\r\n });\r\n\r\n // Clean up effect and subscription when host component is destroyed.\r\n destroyRef.onDestroy(() => {\r\n effectRef.destroy();\r\n subscription?.unsubscribe();\r\n });\r\n\r\n return computed((): SdFormControlSnapshot<T> => {\r\n const _control = control();\r\n tick(); // reactive dependency — recomputes on every control event\r\n\r\n if (!_control) {\r\n return { value: undefined, disabled: false, invalid: false, touched: false };\r\n }\r\n\r\n return {\r\n value: _control.value as T,\r\n disabled: _control.disabled,\r\n invalid: _control.invalid && (_control.touched || _control.dirty),\r\n touched: _control.touched,\r\n };\r\n });\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;MAOa,qBAAqB,GAAG,IAAI,cAAc,CAAuB,uBAAuB;;ACJ/F,MAAO,aAAc,SAAQ,WAAW,CAAA;AAC5C,IAAA,SAAS,GAAqB,IAAI,OAAO,EAAW;AACpD,IAAA,cAAc,GAAqB,IAAI,OAAO,EAAW;AACzD,IAAA,YAAY,GAAqB,IAAI,OAAO,EAAW;AACvD,IAAA,eAAe,GAAqB,IAAI,OAAO,EAAW;AAC1D,IAAA,WAAA,CACE,SAAiC,EACjC,eAAyE,EACzE,cAA6D,EAAA;AAE7D,QAAA,KAAK,CAAC,SAAS,EAAE,eAAe,EAAE,cAAc,CAAC;IACnD;AAES,IAAA,eAAe,CAAC,IAAkD,EAAA;AACzE,QAAA,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC;AAC3B,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;AAC9B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;IAC3B;AAES,IAAA,aAAa,CAAC,IAAkD,EAAA;AACvE,QAAA,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;AAC5B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;IAC3B;AAES,IAAA,cAAc,CAAC,IAAkD,EAAA;AACxE,QAAA,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;AAC/B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;IAC3B;AACD;;AC9BM,MAAM,uBAAuB,GAAG,CAAC,IAAuB,KAAsB;AACnF,IAAA,OAAO,OAAO,CAAkB,KAAyC;QACvE,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,KAAG,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI;AACrD,QAAA,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE;AACtC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;AAC1B,YAAA,IAAI,MAAM,YAAY,OAAO,EAAE;AAC7B,gBAAA,MAAM,OAAO,GAAG,MAAM,MAAM;gBAC5B,IAAI,OAAO,EAAE;oBACX,OAAO;AACL,wBAAA,eAAe,EAAE,OAAO;qBACzB;gBACH;AACA,gBAAA,OAAO,IAAI;YACb;YACA,IAAI,MAAM,EAAE;gBACV,OAAO;AACL,oBAAA,eAAe,EAAE,MAAM;iBACxB;YACH;AACA,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;AACH;;ACdA;;;;;;;;;;;;;AAaG;AACG,SAAU,kBAAkB,CAChC,OAAsD,EAAA;;;;AAKtD,IAAA,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC;AACtB,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;;;IAIrC,IAAI,YAAY,GAAwB,IAAI;;;;;AAM5C,IAAA,MAAM,SAAS,GAAc,MAAM,CAAC,MAAK;AACvC,QAAA,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;;;;QAIpB,YAAY,EAAE,WAAW,EAAE;QAC3B,YAAY,GAAG,IAAI;QAEnB,IAAI,CAAC,EAAE;AACL,YAAA,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,MAAK;;;AAG3D,gBAAA,SAAS,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1C,YAAA,CAAC,CAAC;QACJ;AACF,IAAA,CAAC,CAAC;;AAGF,IAAA,UAAU,CAAC,SAAS,CAAC,MAAK;QACxB,SAAS,CAAC,OAAO,EAAE;QACnB,YAAY,EAAE,WAAW,EAAE;AAC7B,IAAA,CAAC,CAAC;IAEF,OAAO,QAAQ,CAAC,MAA+B;AAC7C,QAAA,MAAM,QAAQ,GAAG,OAAO,EAAE;QAC1B,IAAI,EAAE,CAAC;QAEP,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE;QAC9E;QAEA,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,KAAU;YAC1B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;AAC3B,YAAA,OAAO,EAAE,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC;YACjE,OAAO,EAAE,QAAQ,CAAC,OAAO;SAC1B;AACH,IAAA,CAAC,CAAC;AACJ;;ACjFA;;AAEG;;;;"}
@@ -13,7 +13,8 @@ import { MatTooltipModule } from '@angular/material/tooltip';
13
13
  import { Subscription } from 'rxjs';
14
14
  import * as uuid from 'uuid';
15
15
  import { SdSuffixDefDirective, SdLabelDefDirective, SdViewDefDirective } from '@sd-angular/core/forms/directives';
16
- import { SdFormControl } from '@sd-angular/core/forms/models';
16
+ import { sdFormControlState, SdFormControl } from '@sd-angular/core/forms/models';
17
+ import { sdIsEmpty, sdSerializeDataValue } from '@sd-angular/core/utilities/data-state';
17
18
  import { TranslatePipe } from '@sd-angular/core/i18n';
18
19
  import { SdEmptyPipe } from '@sd-angular/core/pipes';
19
20
  import { SdLabel } from '@sd-angular/core/forms/label';
@@ -27,6 +28,10 @@ class SdRadio {
27
28
  id = `I${uuid.v4()}`;
28
29
  autoIdInput = input(undefined, { alias: 'autoId' });
29
30
  autoId = computed(() => (this.autoIdInput() ? `forms-radio-${this.autoIdInput()}` : undefined));
31
+ #state = sdFormControlState(computed(() => this.formControl));
32
+ dataDisabled = computed(() => (this.#state().disabled ? 'true' : 'false'));
33
+ dataEmpty = computed(() => (sdIsEmpty(this.#state().value) ? 'true' : 'false'));
34
+ dataValue = computed(() => sdSerializeDataValue(this.#state().value));
30
35
  #name = uuid.v4();
31
36
  set name(val) {
32
37
  if (val) {
@@ -170,11 +175,11 @@ class SdRadio {
170
175
  this.formControl.updateValueAndValidity({ emitEvent: true });
171
176
  };
172
177
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdRadio, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
173
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdRadio, isStandalone: true, selector: "sd-radio", inputs: { autoIdInput: { classPropertyName: "autoIdInput", publicName: "autoId", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: false, isRequired: false, transformFunction: null }, form: { classPropertyName: "form", publicName: "form", isSignal: false, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: false, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: false, isRequired: false, transformFunction: null }, _display: { classPropertyName: "_display", publicName: "display", isSignal: false, isRequired: false, transformFunction: null }, model: { classPropertyName: "model", publicName: "model", isSignal: false, isRequired: false, transformFunction: null }, pItems: { classPropertyName: "pItems", publicName: "items", isSignal: false, isRequired: false, transformFunction: null }, valueField: { classPropertyName: "valueField", publicName: "valueField", isSignal: false, isRequired: true, transformFunction: null }, displayField: { classPropertyName: "displayField", publicName: "displayField", isSignal: false, isRequired: true, transformFunction: null }, _required: { classPropertyName: "_required", publicName: "required", isSignal: false, isRequired: false, transformFunction: null }, _inlineError: { classPropertyName: "_inlineError", publicName: "inlineError", isSignal: false, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: null }, _viewed: { classPropertyName: "_viewed", publicName: "viewed", isSignal: false, isRequired: false, transformFunction: null }, hyperlink: { classPropertyName: "hyperlink", publicName: "hyperlink", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { modelChange: "modelChange", sdChange: "sdChange", sdSelection: "sdSelection" }, queries: [{ propertyName: "sdSuffixDef", first: true, predicate: SdSuffixDefDirective, descendants: true }, { propertyName: "sdLabelDef", first: true, predicate: SdLabelDefDirective, descendants: true }, { propertyName: "sdViewDef", first: true, predicate: SdViewDefDirective, descendants: true }], ngImport: i0, template: "@if (viewed) {\r\n @if (sdLabelDef?.templateRef) {\r\n <ng-container *ngTemplateOutlet=\"sdLabelDef!.templateRef\"> </ng-container>\r\n } @else if (label) {\r\n <div class=\"T14R text-black400\">{{ label }}</div>\r\n }\r\n @if (hyperlink) {\r\n <!-- N\u1EBFu c\u00F3 hyperlink th\u00EC d\u00F9ng th\u1EBB a -->\r\n <a [sdHref]=\"hyperlink\">{{ viewedText }}</a>\r\n } @else {\r\n <!-- Ngo\u00E0i ra d\u00F9ng th\u1EBB m\u1EB7c \u0111\u1ECBnh -->\r\n <div class=\"T14M\">{{ viewedText | sdEmpty }}</div>\r\n }\r\n} @else {\r\n <section [ngClass]=\"{ 'c-section': display === 'row' }\">\r\n @if (sdLabelDef?.templateRef) {\r\n <ng-container *ngTemplateOutlet=\"sdLabelDef!.templateRef\"> </ng-container>\r\n } @else if (label) {\r\n <sd-label [label]=\"label\" [required]=\"required\"></sd-label>\r\n }\r\n <mat-radio-group\r\n [class.c-radio-group-column]=\"display === 'column'\"\r\n [class.c-radio-group-row]=\"display === 'row'\"\r\n [formControl]=\"formControl\"\r\n [attr.data-autoId]=\"autoId()\">\r\n @for (item of items; track item[valueField]) {\r\n <mat-radio-button color=\"primary\" [class.m-0]=\"display === 'column'\" [class.mr-16]=\"display === 'row'\" [value]=\"item[valueField]\">\r\n {{ item[displayField] }}\r\n </mat-radio-button>\r\n }\r\n </mat-radio-group>\r\n\r\n @if (formControl.errors?.['required'] && formControl.touched) {\r\n <mat-error>\r\n {{ 'core.form.radio.required' | translate }}\r\n </mat-error>\r\n } @else if (formControl.errors?.['inlineError'] && formControl.touched) {\r\n <mat-error>\r\n {{ inlineError }}\r\n </mat-error>\r\n }\r\n </section>\r\n}\r\n", styles: [":host{height:100%;display:flex;flex-direction:column}:host ::ng-deep label.mdc-label{margin-bottom:0}.c-section{align-content:center;align-items:center}.c-radio-group-column{flex:1;display:flex;flex-direction:column;align-items:flex-start}.c-radio-group-row{flex:1;display:flex;flex-direction:row;align-items:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i4.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i4.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "component", type: SdLabel, selector: "sd-label", inputs: ["label", "description", "required", "helperText"] }, { kind: "pipe", type: SdEmptyPipe, name: "sdEmpty" }, { kind: "directive", type: SdHrefDirective, selector: "a[sdHref]", inputs: ["sdHref"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
178
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdRadio, isStandalone: true, selector: "sd-radio", inputs: { autoIdInput: { classPropertyName: "autoIdInput", publicName: "autoId", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: false, isRequired: false, transformFunction: null }, form: { classPropertyName: "form", publicName: "form", isSignal: false, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: false, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: false, isRequired: false, transformFunction: null }, _display: { classPropertyName: "_display", publicName: "display", isSignal: false, isRequired: false, transformFunction: null }, model: { classPropertyName: "model", publicName: "model", isSignal: false, isRequired: false, transformFunction: null }, pItems: { classPropertyName: "pItems", publicName: "items", isSignal: false, isRequired: false, transformFunction: null }, valueField: { classPropertyName: "valueField", publicName: "valueField", isSignal: false, isRequired: true, transformFunction: null }, displayField: { classPropertyName: "displayField", publicName: "displayField", isSignal: false, isRequired: true, transformFunction: null }, _required: { classPropertyName: "_required", publicName: "required", isSignal: false, isRequired: false, transformFunction: null }, _inlineError: { classPropertyName: "_inlineError", publicName: "inlineError", isSignal: false, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: null }, _viewed: { classPropertyName: "_viewed", publicName: "viewed", isSignal: false, isRequired: false, transformFunction: null }, hyperlink: { classPropertyName: "hyperlink", publicName: "hyperlink", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { modelChange: "modelChange", sdChange: "sdChange", sdSelection: "sdSelection" }, queries: [{ propertyName: "sdSuffixDef", first: true, predicate: SdSuffixDefDirective, descendants: true }, { propertyName: "sdLabelDef", first: true, predicate: SdLabelDefDirective, descendants: true }, { propertyName: "sdViewDef", first: true, predicate: SdViewDefDirective, descendants: true }], ngImport: i0, template: "@if (viewed) {\r\n @if (sdLabelDef?.templateRef) {\r\n <ng-container *ngTemplateOutlet=\"sdLabelDef!.templateRef\"> </ng-container>\r\n } @else if (label) {\r\n <div class=\"T14R text-black400\">{{ label }}</div>\r\n }\r\n @if (hyperlink) {\r\n <!-- N\u1EBFu c\u00F3 hyperlink th\u00EC d\u00F9ng th\u1EBB a -->\r\n <a [sdHref]=\"hyperlink\">{{ viewedText }}</a>\r\n } @else {\r\n <!-- Ngo\u00E0i ra d\u00F9ng th\u1EBB m\u1EB7c \u0111\u1ECBnh -->\r\n <div class=\"T14M\">{{ viewedText | sdEmpty }}</div>\r\n }\r\n} @else {\r\n <section [ngClass]=\"{ 'c-section': display === 'row' }\">\r\n @if (sdLabelDef?.templateRef) {\r\n <ng-container *ngTemplateOutlet=\"sdLabelDef!.templateRef\"> </ng-container>\r\n } @else if (label) {\r\n <sd-label [label]=\"label\" [required]=\"required\"></sd-label>\r\n }\r\n <mat-radio-group\r\n [class.c-radio-group-column]=\"display === 'column'\"\r\n [class.c-radio-group-row]=\"display === 'row'\"\r\n [formControl]=\"formControl\"\r\n [attr.data-autoId]=\"autoId()\"\r\n [attr.data-disabled]=\"dataDisabled()\"\r\n [attr.data-empty]=\"dataEmpty()\"\r\n [attr.data-value]=\"dataValue()\">\r\n @for (item of items; track item[valueField]) {\r\n <mat-radio-button color=\"primary\" [class.m-0]=\"display === 'column'\" [class.mr-16]=\"display === 'row'\" [value]=\"item[valueField]\">\r\n {{ item[displayField] }}\r\n </mat-radio-button>\r\n }\r\n </mat-radio-group>\r\n\r\n @if (formControl.errors?.['required'] && formControl.touched) {\r\n <mat-error>\r\n {{ 'core.form.radio.required' | translate }}\r\n </mat-error>\r\n } @else if (formControl.errors?.['inlineError'] && formControl.touched) {\r\n <mat-error>\r\n {{ inlineError }}\r\n </mat-error>\r\n }\r\n </section>\r\n}\r\n", styles: [":host{height:100%;display:flex;flex-direction:column}:host ::ng-deep label.mdc-label{margin-bottom:0}.c-section{align-content:center;align-items:center}.c-radio-group-column{flex:1;display:flex;flex-direction:column;align-items:flex-start}.c-radio-group-row{flex:1;display:flex;flex-direction:row;align-items:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i4.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i4.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "component", type: SdLabel, selector: "sd-label", inputs: ["label", "description", "required", "helperText"] }, { kind: "pipe", type: SdEmptyPipe, name: "sdEmpty" }, { kind: "directive", type: SdHrefDirective, selector: "a[sdHref]", inputs: ["sdHref"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
174
179
  }
175
180
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdRadio, decorators: [{
176
181
  type: Component,
177
- args: [{ selector: 'sd-radio', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, ReactiveFormsModule, MatTooltipModule, MatFormFieldModule, MatIconModule, MatRadioModule, SdLabel, SdEmptyPipe, SdHrefDirective, TranslatePipe], template: "@if (viewed) {\r\n @if (sdLabelDef?.templateRef) {\r\n <ng-container *ngTemplateOutlet=\"sdLabelDef!.templateRef\"> </ng-container>\r\n } @else if (label) {\r\n <div class=\"T14R text-black400\">{{ label }}</div>\r\n }\r\n @if (hyperlink) {\r\n <!-- N\u1EBFu c\u00F3 hyperlink th\u00EC d\u00F9ng th\u1EBB a -->\r\n <a [sdHref]=\"hyperlink\">{{ viewedText }}</a>\r\n } @else {\r\n <!-- Ngo\u00E0i ra d\u00F9ng th\u1EBB m\u1EB7c \u0111\u1ECBnh -->\r\n <div class=\"T14M\">{{ viewedText | sdEmpty }}</div>\r\n }\r\n} @else {\r\n <section [ngClass]=\"{ 'c-section': display === 'row' }\">\r\n @if (sdLabelDef?.templateRef) {\r\n <ng-container *ngTemplateOutlet=\"sdLabelDef!.templateRef\"> </ng-container>\r\n } @else if (label) {\r\n <sd-label [label]=\"label\" [required]=\"required\"></sd-label>\r\n }\r\n <mat-radio-group\r\n [class.c-radio-group-column]=\"display === 'column'\"\r\n [class.c-radio-group-row]=\"display === 'row'\"\r\n [formControl]=\"formControl\"\r\n [attr.data-autoId]=\"autoId()\">\r\n @for (item of items; track item[valueField]) {\r\n <mat-radio-button color=\"primary\" [class.m-0]=\"display === 'column'\" [class.mr-16]=\"display === 'row'\" [value]=\"item[valueField]\">\r\n {{ item[displayField] }}\r\n </mat-radio-button>\r\n }\r\n </mat-radio-group>\r\n\r\n @if (formControl.errors?.['required'] && formControl.touched) {\r\n <mat-error>\r\n {{ 'core.form.radio.required' | translate }}\r\n </mat-error>\r\n } @else if (formControl.errors?.['inlineError'] && formControl.touched) {\r\n <mat-error>\r\n {{ inlineError }}\r\n </mat-error>\r\n }\r\n </section>\r\n}\r\n", styles: [":host{height:100%;display:flex;flex-direction:column}:host ::ng-deep label.mdc-label{margin-bottom:0}.c-section{align-content:center;align-items:center}.c-radio-group-column{flex:1;display:flex;flex-direction:column;align-items:flex-start}.c-radio-group-row{flex:1;display:flex;flex-direction:row;align-items:center}\n"] }]
182
+ args: [{ selector: 'sd-radio', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, ReactiveFormsModule, MatTooltipModule, MatFormFieldModule, MatIconModule, MatRadioModule, SdLabel, SdEmptyPipe, SdHrefDirective, TranslatePipe], template: "@if (viewed) {\r\n @if (sdLabelDef?.templateRef) {\r\n <ng-container *ngTemplateOutlet=\"sdLabelDef!.templateRef\"> </ng-container>\r\n } @else if (label) {\r\n <div class=\"T14R text-black400\">{{ label }}</div>\r\n }\r\n @if (hyperlink) {\r\n <!-- N\u1EBFu c\u00F3 hyperlink th\u00EC d\u00F9ng th\u1EBB a -->\r\n <a [sdHref]=\"hyperlink\">{{ viewedText }}</a>\r\n } @else {\r\n <!-- Ngo\u00E0i ra d\u00F9ng th\u1EBB m\u1EB7c \u0111\u1ECBnh -->\r\n <div class=\"T14M\">{{ viewedText | sdEmpty }}</div>\r\n }\r\n} @else {\r\n <section [ngClass]=\"{ 'c-section': display === 'row' }\">\r\n @if (sdLabelDef?.templateRef) {\r\n <ng-container *ngTemplateOutlet=\"sdLabelDef!.templateRef\"> </ng-container>\r\n } @else if (label) {\r\n <sd-label [label]=\"label\" [required]=\"required\"></sd-label>\r\n }\r\n <mat-radio-group\r\n [class.c-radio-group-column]=\"display === 'column'\"\r\n [class.c-radio-group-row]=\"display === 'row'\"\r\n [formControl]=\"formControl\"\r\n [attr.data-autoId]=\"autoId()\"\r\n [attr.data-disabled]=\"dataDisabled()\"\r\n [attr.data-empty]=\"dataEmpty()\"\r\n [attr.data-value]=\"dataValue()\">\r\n @for (item of items; track item[valueField]) {\r\n <mat-radio-button color=\"primary\" [class.m-0]=\"display === 'column'\" [class.mr-16]=\"display === 'row'\" [value]=\"item[valueField]\">\r\n {{ item[displayField] }}\r\n </mat-radio-button>\r\n }\r\n </mat-radio-group>\r\n\r\n @if (formControl.errors?.['required'] && formControl.touched) {\r\n <mat-error>\r\n {{ 'core.form.radio.required' | translate }}\r\n </mat-error>\r\n } @else if (formControl.errors?.['inlineError'] && formControl.touched) {\r\n <mat-error>\r\n {{ inlineError }}\r\n </mat-error>\r\n }\r\n </section>\r\n}\r\n", styles: [":host{height:100%;display:flex;flex-direction:column}:host ::ng-deep label.mdc-label{margin-bottom:0}.c-section{align-content:center;align-items:center}.c-radio-group-column{flex:1;display:flex;flex-direction:column;align-items:flex-start}.c-radio-group-row{flex:1;display:flex;flex-direction:row;align-items:center}\n"] }]
178
183
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { name: [{
179
184
  type: Input
180
185
  }], form: [{
@@ -1 +1 @@
1
- {"version":3,"file":"sd-angular-core-forms-radio.mjs","sources":["../../../projects/sd-angular/forms/radio/src/radio.component.ts","../../../projects/sd-angular/forms/radio/src/radio.component.html","../../../projects/sd-angular/forms/radio/sd-angular-core-forms-radio.ts"],"sourcesContent":["/* eslint-disable @angular-eslint/no-input-rename */\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n computed,\r\n ContentChild,\r\n EventEmitter,\r\n Input,\r\n input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n} from '@angular/core';\r\nimport { FormGroup, NgForm, ReactiveFormsModule, ValidatorFn, Validators } from '@angular/forms';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { Subscription } from 'rxjs';\r\nimport * as uuid from 'uuid';\r\n\r\nimport { SdLabelDefDirective, SdSuffixDefDirective, SdViewDefDirective } from '@sd-angular/core/forms/directives';\r\n\r\nimport { SdFormControl } from '@sd-angular/core/forms/models';\r\nimport { TranslatePipe } from '@sd-angular/core/i18n';\r\nimport { SdEmptyPipe } from '@sd-angular/core/pipes';\r\nimport { SdLabel } from '@sd-angular/core/forms/label';\r\nimport { SdHrefDirective } from \"@sd-angular/core/directives\";\r\n\r\n@Component({\r\n selector: 'sd-radio',\r\n templateUrl: './radio.component.html',\r\n styleUrls: ['./radio.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule, MatTooltipModule, MatFormFieldModule, MatIconModule, MatRadioModule, SdLabel, SdEmptyPipe, SdHrefDirective, TranslatePipe],\r\n})\r\n// eslint-disable-next-line @angular-eslint/component-class-suffix\r\nexport class SdRadio implements OnInit, AfterViewInit, OnDestroy {\r\n id = `I${uuid.v4()}`;\r\n readonly autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\r\n readonly autoId = computed(() => (this.autoIdInput() ? `forms-radio-${this.autoIdInput()}` : undefined));\r\n\r\n #name = uuid.v4();\r\n @Input() set name(val: string | undefined) {\r\n if (val) {\r\n this.#name = val;\r\n }\r\n }\r\n formControl = new SdFormControl();\r\n // get isNumber() {\r\n // if (this.#model || this.#model === 0) {\r\n // return typeof (this.#model) === 'number';\r\n // }\r\n // if (this.items?.length) {\r\n // if (this.valueField) {\r\n // return typeof (this.items[0][this.valueField]) === 'number';\r\n // } else {\r\n // return typeof (this.items[0]) === 'number';\r\n // }\r\n // }\r\n // return false;\r\n // }\r\n #form?: FormGroup;\r\n @Input() set form(val: NgForm | FormGroup | undefined | null) {\r\n if (val) {\r\n if (val instanceof NgForm) {\r\n this.#form = val.form;\r\n } else {\r\n this.#form = val;\r\n }\r\n }\r\n }\r\n @Input() label?: string;\r\n @Input() placeholder?: string;\r\n display: 'row' | 'column' = 'row';\r\n @Input('display') set _display(display: 'row' | 'column' | undefined | null) {\r\n this.display = display || 'row';\r\n }\r\n // Model\r\n @Input() set model(value: number | string | boolean) {\r\n if (value !== this.formControl.value) {\r\n this.formControl.setValue(value, {\r\n emitEvent: false,\r\n });\r\n }\r\n }\r\n // Items\r\n items: any[] = [];\r\n @Input('items') set pItems(items: any[] | undefined) {\r\n if (!Array.isArray(items)) {\r\n this.items = [];\r\n } else {\r\n this.items = items;\r\n }\r\n }\r\n @Input({ required: true }) valueField!: string;\r\n @Input({ required: true }) displayField!: string;\r\n\r\n // Validator\r\n required = false;\r\n @Input('required') set _required(val: boolean | '' | undefined | null) {\r\n this.required = val === '' || !!val;\r\n this.#updateValidator();\r\n }\r\n\r\n inlineError?: string;\r\n @Input('inlineError') set _inlineError(val: string) {\r\n this.inlineError = val;\r\n this.#updateValidator();\r\n }\r\n\r\n // Optional\r\n @Input() set disabled(val: boolean | '' | undefined | null) {\r\n val = val === '' || val;\r\n if (val) {\r\n this.formControl.disable();\r\n } else {\r\n this.formControl.enable();\r\n }\r\n }\r\n\r\n viewed = false;\r\n @Input('viewed') set _viewed(val: boolean | '' | undefined | null) {\r\n this.viewed = val === '' || !!val;\r\n }\r\n @Input() hyperlink?: string | null;\r\n\r\n @ContentChild(SdSuffixDefDirective) sdSuffixDef?: SdSuffixDefDirective;\r\n @ContentChild(SdLabelDefDirective) sdLabelDef?: SdLabelDefDirective;\r\n @ContentChild(SdViewDefDirective) sdViewDef?: SdViewDefDirective;\r\n\r\n @Output() modelChange = new EventEmitter();\r\n @Output() sdChange = new EventEmitter();\r\n @Output() sdSelection = new EventEmitter<{\r\n value: any | any[];\r\n item?: any;\r\n }>();\r\n #subscription = new Subscription();\r\n constructor(public ref: ChangeDetectorRef) {}\r\n\r\n get viewedText() {\r\n return this.items?.find(e => this.formControl?.value?.toString() === e?.[this.valueField]?.toString()) ?? '';\r\n }\r\n\r\n ngOnInit() {\r\n this.#subscription.add(\r\n this.formControl.sdChanges.subscribe(() => {\r\n // this.formControl.updateValueAndValidity();\r\n this.ref.markForCheck();\r\n })\r\n );\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.#subscription.add(\r\n this.formControl.valueChanges.subscribe(value => {\r\n const val = value;\r\n // if (this.isNumber && Number.isNumber(value)) {\r\n // val = +value;\r\n // }\r\n this.modelChange.emit(val);\r\n this.sdChange.emit(val);\r\n this.sdSelection.emit({\r\n value: val,\r\n item: this.items?.find(e => val?.toString() === e?.[this.valueField]?.toString()),\r\n });\r\n })\r\n );\r\n this.#form?.addControl(this.#name, this.formControl);\r\n }\r\n\r\n ngOnDestroy() {\r\n this.#subscription.unsubscribe();\r\n this.#form?.removeControl(this.#name);\r\n }\r\n\r\n #updateValidator = () => {\r\n this.formControl.clearValidators();\r\n const validators: ValidatorFn[] = [];\r\n if (this.required) {\r\n validators.push(Validators.required);\r\n }\r\n if (this.inlineError) {\r\n validators.push(this.customInlineErrorValidator());\r\n }\r\n this.formControl.setValidators(validators);\r\n this.formControl.updateValueAndValidity();\r\n };\r\n\r\n // Hàm tạo Validators tùy chỉnh cho inlineError\r\n customInlineErrorValidator(): ValidatorFn {\r\n return (): Record<string, any> | null => {\r\n return { inlineError: true };\r\n };\r\n }\r\n\r\n reValidate = () => {\r\n this.formControl.updateValueAndValidity({ emitEvent: true });\r\n };\r\n}\r\n","@if (viewed) {\r\n @if (sdLabelDef?.templateRef) {\r\n <ng-container *ngTemplateOutlet=\"sdLabelDef!.templateRef\"> </ng-container>\r\n } @else if (label) {\r\n <div class=\"T14R text-black400\">{{ label }}</div>\r\n }\r\n @if (hyperlink) {\r\n <!-- Nếu có hyperlink thì dùng thẻ a -->\r\n <a [sdHref]=\"hyperlink\">{{ viewedText }}</a>\r\n } @else {\r\n <!-- Ngoài ra dùng thẻ mặc định -->\r\n <div class=\"T14M\">{{ viewedText | sdEmpty }}</div>\r\n }\r\n} @else {\r\n <section [ngClass]=\"{ 'c-section': display === 'row' }\">\r\n @if (sdLabelDef?.templateRef) {\r\n <ng-container *ngTemplateOutlet=\"sdLabelDef!.templateRef\"> </ng-container>\r\n } @else if (label) {\r\n <sd-label [label]=\"label\" [required]=\"required\"></sd-label>\r\n }\r\n <mat-radio-group\r\n [class.c-radio-group-column]=\"display === 'column'\"\r\n [class.c-radio-group-row]=\"display === 'row'\"\r\n [formControl]=\"formControl\"\r\n [attr.data-autoId]=\"autoId()\">\r\n @for (item of items; track item[valueField]) {\r\n <mat-radio-button color=\"primary\" [class.m-0]=\"display === 'column'\" [class.mr-16]=\"display === 'row'\" [value]=\"item[valueField]\">\r\n {{ item[displayField] }}\r\n </mat-radio-button>\r\n }\r\n </mat-radio-group>\r\n\r\n @if (formControl.errors?.['required'] && formControl.touched) {\r\n <mat-error>\r\n {{ 'core.form.radio.required' | translate }}\r\n </mat-error>\r\n } @else if (formControl.errors?.['inlineError'] && formControl.touched) {\r\n <mat-error>\r\n {{ inlineError }}\r\n </mat-error>\r\n }\r\n </section>\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sd-angular-core-forms-radio.mjs","sources":["../../../projects/sd-angular/forms/radio/src/radio.component.ts","../../../projects/sd-angular/forms/radio/src/radio.component.html","../../../projects/sd-angular/forms/radio/sd-angular-core-forms-radio.ts"],"sourcesContent":["/* eslint-disable @angular-eslint/no-input-rename */\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n computed,\r\n ContentChild,\r\n EventEmitter,\r\n Input,\r\n input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n} from '@angular/core';\r\nimport { FormGroup, NgForm, ReactiveFormsModule, ValidatorFn, Validators } from '@angular/forms';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { Subscription } from 'rxjs';\r\nimport * as uuid from 'uuid';\r\n\r\nimport { SdLabelDefDirective, SdSuffixDefDirective, SdViewDefDirective } from '@sd-angular/core/forms/directives';\r\n\r\nimport { SdFormControl } from '@sd-angular/core/forms/models';\r\nimport { sdFormControlState } from '@sd-angular/core/forms/models';\r\nimport { sdIsEmpty, sdSerializeDataValue } from '@sd-angular/core/utilities/data-state';\r\nimport { TranslatePipe } from '@sd-angular/core/i18n';\r\nimport { SdEmptyPipe } from '@sd-angular/core/pipes';\r\nimport { SdLabel } from '@sd-angular/core/forms/label';\r\nimport { SdHrefDirective } from \"@sd-angular/core/directives\";\r\n\r\n@Component({\r\n selector: 'sd-radio',\r\n templateUrl: './radio.component.html',\r\n styleUrls: ['./radio.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule, MatTooltipModule, MatFormFieldModule, MatIconModule, MatRadioModule, SdLabel, SdEmptyPipe, SdHrefDirective, TranslatePipe],\r\n})\r\n// eslint-disable-next-line @angular-eslint/component-class-suffix\r\nexport class SdRadio implements OnInit, AfterViewInit, OnDestroy {\r\n id = `I${uuid.v4()}`;\r\n readonly autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\r\n readonly autoId = computed(() => (this.autoIdInput() ? `forms-radio-${this.autoIdInput()}` : undefined));\r\n readonly #state = sdFormControlState(computed(() => this.formControl));\r\n readonly dataDisabled = computed(() => (this.#state().disabled ? 'true' : 'false'));\r\n readonly dataEmpty = computed(() => (sdIsEmpty(this.#state().value) ? 'true' : 'false'));\r\n readonly dataValue = computed(() => sdSerializeDataValue(this.#state().value));\r\n\r\n #name = uuid.v4();\r\n @Input() set name(val: string | undefined) {\r\n if (val) {\r\n this.#name = val;\r\n }\r\n }\r\n formControl = new SdFormControl();\r\n // get isNumber() {\r\n // if (this.#model || this.#model === 0) {\r\n // return typeof (this.#model) === 'number';\r\n // }\r\n // if (this.items?.length) {\r\n // if (this.valueField) {\r\n // return typeof (this.items[0][this.valueField]) === 'number';\r\n // } else {\r\n // return typeof (this.items[0]) === 'number';\r\n // }\r\n // }\r\n // return false;\r\n // }\r\n #form?: FormGroup;\r\n @Input() set form(val: NgForm | FormGroup | undefined | null) {\r\n if (val) {\r\n if (val instanceof NgForm) {\r\n this.#form = val.form;\r\n } else {\r\n this.#form = val;\r\n }\r\n }\r\n }\r\n @Input() label?: string;\r\n @Input() placeholder?: string;\r\n display: 'row' | 'column' = 'row';\r\n @Input('display') set _display(display: 'row' | 'column' | undefined | null) {\r\n this.display = display || 'row';\r\n }\r\n // Model\r\n @Input() set model(value: number | string | boolean) {\r\n if (value !== this.formControl.value) {\r\n this.formControl.setValue(value, {\r\n emitEvent: false,\r\n });\r\n }\r\n }\r\n // Items\r\n items: any[] = [];\r\n @Input('items') set pItems(items: any[] | undefined) {\r\n if (!Array.isArray(items)) {\r\n this.items = [];\r\n } else {\r\n this.items = items;\r\n }\r\n }\r\n @Input({ required: true }) valueField!: string;\r\n @Input({ required: true }) displayField!: string;\r\n\r\n // Validator\r\n required = false;\r\n @Input('required') set _required(val: boolean | '' | undefined | null) {\r\n this.required = val === '' || !!val;\r\n this.#updateValidator();\r\n }\r\n\r\n inlineError?: string;\r\n @Input('inlineError') set _inlineError(val: string) {\r\n this.inlineError = val;\r\n this.#updateValidator();\r\n }\r\n\r\n // Optional\r\n @Input() set disabled(val: boolean | '' | undefined | null) {\r\n val = val === '' || val;\r\n if (val) {\r\n this.formControl.disable();\r\n } else {\r\n this.formControl.enable();\r\n }\r\n }\r\n\r\n viewed = false;\r\n @Input('viewed') set _viewed(val: boolean | '' | undefined | null) {\r\n this.viewed = val === '' || !!val;\r\n }\r\n @Input() hyperlink?: string | null;\r\n\r\n @ContentChild(SdSuffixDefDirective) sdSuffixDef?: SdSuffixDefDirective;\r\n @ContentChild(SdLabelDefDirective) sdLabelDef?: SdLabelDefDirective;\r\n @ContentChild(SdViewDefDirective) sdViewDef?: SdViewDefDirective;\r\n\r\n @Output() modelChange = new EventEmitter();\r\n @Output() sdChange = new EventEmitter();\r\n @Output() sdSelection = new EventEmitter<{\r\n value: any | any[];\r\n item?: any;\r\n }>();\r\n #subscription = new Subscription();\r\n constructor(public ref: ChangeDetectorRef) {}\r\n\r\n get viewedText() {\r\n return this.items?.find(e => this.formControl?.value?.toString() === e?.[this.valueField]?.toString()) ?? '';\r\n }\r\n\r\n ngOnInit() {\r\n this.#subscription.add(\r\n this.formControl.sdChanges.subscribe(() => {\r\n // this.formControl.updateValueAndValidity();\r\n this.ref.markForCheck();\r\n })\r\n );\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.#subscription.add(\r\n this.formControl.valueChanges.subscribe(value => {\r\n const val = value;\r\n // if (this.isNumber && Number.isNumber(value)) {\r\n // val = +value;\r\n // }\r\n this.modelChange.emit(val);\r\n this.sdChange.emit(val);\r\n this.sdSelection.emit({\r\n value: val,\r\n item: this.items?.find(e => val?.toString() === e?.[this.valueField]?.toString()),\r\n });\r\n })\r\n );\r\n this.#form?.addControl(this.#name, this.formControl);\r\n }\r\n\r\n ngOnDestroy() {\r\n this.#subscription.unsubscribe();\r\n this.#form?.removeControl(this.#name);\r\n }\r\n\r\n #updateValidator = () => {\r\n this.formControl.clearValidators();\r\n const validators: ValidatorFn[] = [];\r\n if (this.required) {\r\n validators.push(Validators.required);\r\n }\r\n if (this.inlineError) {\r\n validators.push(this.customInlineErrorValidator());\r\n }\r\n this.formControl.setValidators(validators);\r\n this.formControl.updateValueAndValidity();\r\n };\r\n\r\n // Hàm tạo Validators tùy chỉnh cho inlineError\r\n customInlineErrorValidator(): ValidatorFn {\r\n return (): Record<string, any> | null => {\r\n return { inlineError: true };\r\n };\r\n }\r\n\r\n reValidate = () => {\r\n this.formControl.updateValueAndValidity({ emitEvent: true });\r\n };\r\n}\r\n","@if (viewed) {\r\n @if (sdLabelDef?.templateRef) {\r\n <ng-container *ngTemplateOutlet=\"sdLabelDef!.templateRef\"> </ng-container>\r\n } @else if (label) {\r\n <div class=\"T14R text-black400\">{{ label }}</div>\r\n }\r\n @if (hyperlink) {\r\n <!-- Nếu có hyperlink thì dùng thẻ a -->\r\n <a [sdHref]=\"hyperlink\">{{ viewedText }}</a>\r\n } @else {\r\n <!-- Ngoài ra dùng thẻ mặc định -->\r\n <div class=\"T14M\">{{ viewedText | sdEmpty }}</div>\r\n }\r\n} @else {\r\n <section [ngClass]=\"{ 'c-section': display === 'row' }\">\r\n @if (sdLabelDef?.templateRef) {\r\n <ng-container *ngTemplateOutlet=\"sdLabelDef!.templateRef\"> </ng-container>\r\n } @else if (label) {\r\n <sd-label [label]=\"label\" [required]=\"required\"></sd-label>\r\n }\r\n <mat-radio-group\r\n [class.c-radio-group-column]=\"display === 'column'\"\r\n [class.c-radio-group-row]=\"display === 'row'\"\r\n [formControl]=\"formControl\"\r\n [attr.data-autoId]=\"autoId()\"\r\n [attr.data-disabled]=\"dataDisabled()\"\r\n [attr.data-empty]=\"dataEmpty()\"\r\n [attr.data-value]=\"dataValue()\">\r\n @for (item of items; track item[valueField]) {\r\n <mat-radio-button color=\"primary\" [class.m-0]=\"display === 'column'\" [class.mr-16]=\"display === 'row'\" [value]=\"item[valueField]\">\r\n {{ item[displayField] }}\r\n </mat-radio-button>\r\n }\r\n </mat-radio-group>\r\n\r\n @if (formControl.errors?.['required'] && formControl.touched) {\r\n <mat-error>\r\n {{ 'core.form.radio.required' | translate }}\r\n </mat-error>\r\n } @else if (formControl.errors?.['inlineError'] && formControl.touched) {\r\n <mat-error>\r\n {{ inlineError }}\r\n </mat-error>\r\n }\r\n </section>\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}