@sdcorejs/angular 20.1.5 → 20.2.0

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 (208) hide show
  1. package/README.md +12 -4
  2. package/assets/scss/core/menu.scss +18 -0
  3. package/assets/scss/core/utilities/_misc.scss +15 -0
  4. package/assets/scss/sd-core.scss +1 -0
  5. package/components/anchor/index.d.ts +3 -1
  6. package/components/badge/index.d.ts +1 -0
  7. package/components/ckeditor-styles/index.d.ts +1 -1
  8. package/components/form-generic/index.d.ts +44 -33
  9. package/components/import-excel/index.d.ts +1 -0
  10. package/components/index.d.ts +6 -1
  11. package/components/mini-editor/index.d.ts +1 -1
  12. package/components/modal/index.d.ts +3 -2
  13. package/components/modal-resizable/index.d.ts +92 -0
  14. package/components/org-chart/index.d.ts +6 -0
  15. package/components/preview/index.d.ts +1 -0
  16. package/components/query-bar/index.d.ts +55 -17
  17. package/components/query-builder/index.d.ts +150 -98
  18. package/components/section/index.d.ts +3 -0
  19. package/components/tab-router/index.d.ts +19 -19
  20. package/components/table/index.d.ts +252 -110
  21. package/components/tree/index.d.ts +48 -30
  22. package/components/upload-file/index.d.ts +6 -3
  23. package/configurations/index.d.ts +1 -2
  24. package/fesm2022/sdcorejs-angular-components-anchor.mjs +37 -13
  25. package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
  26. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs +2 -2
  27. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs.map +1 -1
  28. package/fesm2022/sdcorejs-angular-components-badge.mjs +15 -2
  29. package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
  30. package/fesm2022/sdcorejs-angular-components-button.mjs +2 -2
  31. package/fesm2022/sdcorejs-angular-components-button.mjs.map +1 -1
  32. package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs +1 -1
  33. package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs.map +1 -1
  34. package/fesm2022/sdcorejs-angular-components-code-editor.mjs +3 -3
  35. package/fesm2022/sdcorejs-angular-components-code-editor.mjs.map +1 -1
  36. package/fesm2022/sdcorejs-angular-components-data-state.mjs +3 -3
  37. package/fesm2022/sdcorejs-angular-components-data-state.mjs.map +1 -1
  38. package/fesm2022/sdcorejs-angular-components-editor.mjs +2 -2
  39. package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
  40. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +324 -192
  41. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  42. package/fesm2022/sdcorejs-angular-components-history.mjs +4 -4
  43. package/fesm2022/sdcorejs-angular-components-history.mjs.map +1 -1
  44. package/fesm2022/sdcorejs-angular-components-import-excel.mjs +13 -5
  45. package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
  46. package/fesm2022/sdcorejs-angular-components-inform.mjs +3 -3
  47. package/fesm2022/sdcorejs-angular-components-inform.mjs.map +1 -1
  48. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs +164 -8
  49. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs.map +1 -1
  50. package/fesm2022/sdcorejs-angular-components-modal.mjs +30 -18
  51. package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
  52. package/fesm2022/sdcorejs-angular-components-org-chart.mjs +60 -13
  53. package/fesm2022/sdcorejs-angular-components-org-chart.mjs.map +1 -1
  54. package/fesm2022/sdcorejs-angular-components-preview.mjs +58 -19
  55. package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
  56. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +192 -30
  57. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  58. package/fesm2022/sdcorejs-angular-components-query-builder.mjs +187 -127
  59. package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
  60. package/fesm2022/sdcorejs-angular-components-section.mjs +16 -2
  61. package/fesm2022/sdcorejs-angular-components-section.mjs.map +1 -1
  62. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +83 -24
  63. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
  64. package/fesm2022/sdcorejs-angular-components-splitter.mjs +57 -21
  65. package/fesm2022/sdcorejs-angular-components-splitter.mjs.map +1 -1
  66. package/fesm2022/sdcorejs-angular-components-stepper.mjs +2 -2
  67. package/fesm2022/sdcorejs-angular-components-stepper.mjs.map +1 -1
  68. package/fesm2022/sdcorejs-angular-components-tab-router.mjs +68 -20
  69. package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
  70. package/fesm2022/sdcorejs-angular-components-tab.mjs +3 -2
  71. package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
  72. package/fesm2022/sdcorejs-angular-components-table.mjs +557 -255
  73. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  74. package/fesm2022/sdcorejs-angular-components-tree.mjs +80 -17
  75. package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
  76. package/fesm2022/sdcorejs-angular-components-upload-file.mjs +48 -13
  77. package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
  78. package/fesm2022/sdcorejs-angular-components.mjs +6 -1
  79. package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
  80. package/fesm2022/sdcorejs-angular-configurations.mjs.map +1 -1
  81. package/fesm2022/sdcorejs-angular-directives.mjs +45 -8
  82. package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -1
  83. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +40 -29
  84. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  85. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +5 -5
  86. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
  87. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +67 -50
  88. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
  89. package/fesm2022/sdcorejs-angular-forms-chip.mjs +57 -43
  90. package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
  91. package/fesm2022/sdcorejs-angular-forms-date-range.mjs +234 -64
  92. package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
  93. package/fesm2022/sdcorejs-angular-forms-date.mjs +209 -42
  94. package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
  95. package/fesm2022/sdcorejs-angular-forms-datetime.mjs +131 -27
  96. package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
  97. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs +40 -16
  98. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs.map +1 -1
  99. package/fesm2022/sdcorejs-angular-forms-input-color.mjs +16 -5
  100. package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -1
  101. package/fesm2022/sdcorejs-angular-forms-input-number.mjs +24 -9
  102. package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
  103. package/fesm2022/sdcorejs-angular-forms-input.mjs +58 -10
  104. package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
  105. package/fesm2022/sdcorejs-angular-forms-models.mjs +279 -6
  106. package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
  107. package/fesm2022/sdcorejs-angular-forms-radio.mjs +4 -4
  108. package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
  109. package/fesm2022/sdcorejs-angular-forms-select.mjs +136 -38
  110. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  111. package/fesm2022/sdcorejs-angular-forms-switch.mjs +18 -3
  112. package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
  113. package/fesm2022/sdcorejs-angular-forms-textarea.mjs +51 -62
  114. package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
  115. package/fesm2022/sdcorejs-angular-forms-time-range.mjs +57 -12
  116. package/fesm2022/sdcorejs-angular-forms-time-range.mjs.map +1 -1
  117. package/fesm2022/sdcorejs-angular-forms-time.mjs +16 -5
  118. package/fesm2022/sdcorejs-angular-forms-time.mjs.map +1 -1
  119. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs +100 -9
  120. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs.map +1 -1
  121. package/fesm2022/sdcorejs-angular-forms.mjs +91 -46
  122. package/fesm2022/sdcorejs-angular-forms.mjs.map +1 -1
  123. package/fesm2022/sdcorejs-angular-handlers.mjs +18 -3
  124. package/fesm2022/sdcorejs-angular-handlers.mjs.map +1 -1
  125. package/fesm2022/sdcorejs-angular-i18n.mjs +510 -68
  126. package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
  127. package/fesm2022/sdcorejs-angular-interceptors.mjs +87 -29
  128. package/fesm2022/sdcorejs-angular-interceptors.mjs.map +1 -1
  129. package/fesm2022/sdcorejs-angular-modules-auth.mjs +25 -15
  130. package/fesm2022/sdcorejs-angular-modules-auth.mjs.map +1 -1
  131. package/fesm2022/sdcorejs-angular-modules-icon.mjs +2 -2
  132. package/fesm2022/sdcorejs-angular-modules-icon.mjs.map +1 -1
  133. package/fesm2022/sdcorejs-angular-modules-keycloak.mjs +32 -3
  134. package/fesm2022/sdcorejs-angular-modules-keycloak.mjs.map +1 -1
  135. package/fesm2022/sdcorejs-angular-modules-layout.mjs +441 -135
  136. package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
  137. package/fesm2022/sdcorejs-angular-modules-permission.mjs +177 -40
  138. package/fesm2022/sdcorejs-angular-modules-permission.mjs.map +1 -1
  139. package/fesm2022/sdcorejs-angular-pipes.mjs +62 -28
  140. package/fesm2022/sdcorejs-angular-pipes.mjs.map +1 -1
  141. package/fesm2022/sdcorejs-angular-services-api.mjs +123 -13
  142. package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
  143. package/fesm2022/sdcorejs-angular-services-cache.mjs +53 -3
  144. package/fesm2022/sdcorejs-angular-services-cache.mjs.map +1 -1
  145. package/fesm2022/sdcorejs-angular-services-confirm.mjs +25 -73
  146. package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
  147. package/fesm2022/sdcorejs-angular-services-excel.mjs +12 -10
  148. package/fesm2022/sdcorejs-angular-services-excel.mjs.map +1 -1
  149. package/fesm2022/sdcorejs-angular-services-loading.mjs +75 -84
  150. package/fesm2022/sdcorejs-angular-services-loading.mjs.map +1 -1
  151. package/fesm2022/sdcorejs-angular-services-notify.mjs +46 -5
  152. package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -1
  153. package/fesm2022/sdcorejs-angular-services-storage.mjs +4 -0
  154. package/fesm2022/sdcorejs-angular-services-storage.mjs.map +1 -1
  155. package/fesm2022/sdcorejs-angular-services.mjs +0 -1
  156. package/fesm2022/sdcorejs-angular-services.mjs.map +1 -1
  157. package/fesm2022/sdcorejs-angular-utilities-extensions.mjs +225 -80
  158. package/fesm2022/sdcorejs-angular-utilities-extensions.mjs.map +1 -1
  159. package/fesm2022/sdcorejs-angular-utilities-models.mjs +1 -63
  160. package/fesm2022/sdcorejs-angular-utilities-models.mjs.map +1 -1
  161. package/fesm2022/sdcorejs-angular.mjs +17 -10
  162. package/fesm2022/sdcorejs-angular.mjs.map +1 -1
  163. package/forms/autocomplete/index.d.ts +5 -2
  164. package/forms/chip-calendar/index.d.ts +10 -0
  165. package/forms/date/index.d.ts +21 -3
  166. package/forms/date-range/index.d.ts +14 -2
  167. package/forms/datetime/index.d.ts +13 -2
  168. package/forms/entity-picker/index.d.ts +9 -3
  169. package/forms/index.d.ts +22 -13
  170. package/forms/input/index.d.ts +3 -0
  171. package/forms/input-color/index.d.ts +4 -0
  172. package/forms/input-number/index.d.ts +3 -0
  173. package/forms/models/index.d.ts +146 -5
  174. package/forms/select/index.d.ts +27 -4
  175. package/forms/switch/index.d.ts +7 -1
  176. package/forms/textarea/index.d.ts +5 -3
  177. package/forms/time-range/index.d.ts +22 -1
  178. package/forms/tree-select/index.d.ts +36 -5
  179. package/i18n/index.d.ts +99 -16
  180. package/index.d.ts +11 -2
  181. package/interceptors/index.d.ts +13 -3
  182. package/modules/auth/index.d.ts +1 -1
  183. package/modules/keycloak/index.d.ts +1 -0
  184. package/modules/layout/index.d.ts +103 -28
  185. package/modules/permission/index.d.ts +66 -4
  186. package/package.json +40 -25
  187. package/pipes/index.d.ts +27 -5
  188. package/services/api/index.d.ts +21 -1
  189. package/services/cache/index.d.ts +11 -1
  190. package/services/index.d.ts +0 -1
  191. package/services/notify/index.d.ts +1 -1
  192. package/utilities/extensions/index.d.ts +83 -61
  193. package/utilities/models/index.d.ts +2 -76
  194. package/components/base/index.d.ts +0 -11
  195. package/components/document-builder/index.d.ts +0 -252
  196. package/fesm2022/sdcorejs-angular-components-base.mjs +0 -23
  197. package/fesm2022/sdcorejs-angular-components-base.mjs.map +0 -1
  198. package/fesm2022/sdcorejs-angular-components-document-builder.mjs +0 -5038
  199. package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +0 -1
  200. package/fesm2022/sdcorejs-angular-models.mjs +0 -6
  201. package/fesm2022/sdcorejs-angular-models.mjs.map +0 -1
  202. package/fesm2022/sdcorejs-angular-services-docx.mjs +0 -291
  203. package/fesm2022/sdcorejs-angular-services-docx.mjs.map +0 -1
  204. package/fesm2022/sdcorejs-angular-services-license.mjs +0 -97
  205. package/fesm2022/sdcorejs-angular-services-license.mjs.map +0 -1
  206. package/models/index.d.ts +0 -2
  207. package/services/docx/index.d.ts +0 -27
  208. package/services/license/index.d.ts +0 -12
@@ -1,71 +1,9 @@
1
- import { EMPTY_STR } from '@sdcorejs/utils/constants';
2
- export { EMPTY_STR, VALIDATION_PATTERNS } from '@sdcorejs/utils/constants';
3
- import { StringUtilities } from '@sdcorejs/utils/fns';
4
- import { resolveMaybeAsync, normalizeAsync } from '@sdcorejs/utils/models';
5
- export { normalizeAsync, resolveMaybeAsync } from '@sdcorejs/utils/models';
6
-
7
1
  const DefaultSdIconSet = 'material-icons-outlined';
8
2
  const DefaultSdMaterialIconSet = 'material-icons-outlined';
9
3
 
10
- // `name` và `errorMessage` chứa i18n KEY (không phải chuỗi đã dịch).
11
- /** @deprecated Use `VALIDATION_PATTERNS` from `@sdcorejs/utils/constants` instead. */
12
- const SdPatternCommons = [
13
- { type: 'EMAIL', name: 'core.validator.email.name', regex: StringUtilities.REGEX_EMAIL, errorMessage: 'core.validator.email.error' },
14
- { type: 'PHONE', name: 'core.validator.phone.name', regex: StringUtilities.REGEX_PHONE, errorMessage: 'core.validator.phone.error' },
15
- {
16
- type: 'PHONE_VN',
17
- name: 'core.validator.phone-vn.name',
18
- regex: StringUtilities.REGEX_VN_PHONE,
19
- errorMessage: 'core.validator.phone-vn.error',
20
- },
21
- { type: 'IDVN', name: 'core.validator.cccd.name', regex: StringUtilities.REGEX_VN_ID, errorMessage: 'core.validator.cccd.error' },
22
- {
23
- type: 'PASSPORT',
24
- name: 'core.validator.passport.name',
25
- regex: StringUtilities.REGEX_PASSPORT,
26
- errorMessage: 'core.validator.passport.error',
27
- },
28
- {
29
- type: 'IDVN_OR_PASSPORT',
30
- name: 'core.validator.id-vn.name',
31
- regex: StringUtilities.REGEX_VN_ID_OR_PASSPORT,
32
- errorMessage: 'core.validator.id-vn.error',
33
- },
34
- { type: 'TIME', name: 'core.validator.time.name', regex: StringUtilities.REGEX_TIME, errorMessage: 'core.validator.time.error' },
35
- ];
36
-
37
- /** @deprecated Use {@link EMPTY_STR} from `@sdcorejs/utils/constants` instead */
38
- const SD_EMPTY_STR = EMPTY_STR;
39
-
40
- /** @deprecated Use {@link resolveMaybeAsync} from `@sdcorejs/utils/models` instead */
41
- const SdResolveMaybeAsync = resolveMaybeAsync;
42
- /** @deprecated Use {@link normalizeAsync} from `@sdcorejs/utils/models` instead */
43
- const SdNormalizeAsync = normalizeAsync;
44
-
45
- // `display` chứa i18n KEY (không phải chuỗi đã dịch).
46
- // Consumer phải gọi i18n.t(display) trước khi render ra UI.
47
- // @deprecated Use `OPERATORS` from `@sdcorejs/utils/constants` instead.
48
- // Note: OPERATORS has translated display labels; SdOperators uses i18n keys.
49
- const SdOperators = [
50
- { value: 'EQUAL', symbol: '=', display: 'core.operator.equal.display' },
51
- { value: 'NOT_EQUAL', symbol: '≠', display: 'core.operator.not-equal.display' },
52
- { value: 'GREATER_THAN', symbol: '>', display: 'core.operator.greater-than.display' },
53
- { value: 'LESS_THAN', symbol: '<', display: 'core.operator.less-than.display' },
54
- { value: 'GREATER_OR_EQUAL', symbol: '≥', display: 'core.operator.greater-or-equal.display' },
55
- { value: 'LESS_OR_EQUAL', symbol: '≤', display: 'core.operator.less-or-equal.display' },
56
- { value: 'CONTAIN', symbol: 'join_inner', display: 'core.operator.contain.display' },
57
- { value: 'NOT_CONTAIN', symbol: 'join', display: 'core.operator.not-contain.display' },
58
- { value: 'START_WITH', symbol: 'line_start_circle', display: 'core.operator.start-with.display' },
59
- { value: 'END_WITH', symbol: 'line_end_circle', display: 'core.operator.end-with.display' },
60
- { value: 'IN', symbol: 'checklist_rtl', display: 'core.operator.in.display' },
61
- { value: 'NOT_IN', symbol: 'event_list', display: 'core.operator.not-in.display' },
62
- { value: 'NULL', symbol: 'motion_photos_off', display: 'core.operator.null.display' },
63
- { value: 'NOT_NULL', symbol: 'adjust', display: 'core.operator.not-null.display' },
64
- ];
65
-
66
4
  /**
67
5
  * Generated bundle index. Do not edit.
68
6
  */
69
7
 
70
- export { DefaultSdIconSet, DefaultSdMaterialIconSet, SD_EMPTY_STR, SdNormalizeAsync, SdOperators, SdPatternCommons, SdResolveMaybeAsync };
8
+ export { DefaultSdIconSet, DefaultSdMaterialIconSet };
71
9
  //# sourceMappingURL=sdcorejs-angular-utilities-models.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"sdcorejs-angular-utilities-models.mjs","sources":["../../../projects/sdcorejs-angular/utilities/models/src/icon.model.ts","../../../projects/sdcorejs-angular/utilities/models/src/pattern.model.ts","../../../projects/sdcorejs-angular/utilities/models/src/empty.model.ts","../../../projects/sdcorejs-angular/utilities/models/src/maybe-async.model.ts","../../../projects/sdcorejs-angular/utilities/models/src/operator.model.ts","../../../projects/sdcorejs-angular/utilities/models/sdcorejs-angular-utilities-models.ts"],"sourcesContent":["export type SdIconSet = 'material-icons' | 'material-icons-outlined' | 'material-icons-round' | 'material-icons-sharp' | 'lucide';\nexport type SdMaterialIconSet = Exclude<SdIconSet, 'lucide'>;\nexport const DefaultSdIconSet: SdIconSet = 'material-icons-outlined';\nexport const DefaultSdMaterialIconSet: SdMaterialIconSet = 'material-icons-outlined';\n","import type { ValidationPatternType, ValidationPattern } from '@sdcorejs/utils/models';\nimport { VALIDATION_PATTERNS } from '@sdcorejs/utils/constants';\nimport { StringUtilities } from '@sdcorejs/utils/fns';\nexport type { ValidationPatternType, ValidationPattern };\nexport { VALIDATION_PATTERNS };\n\n/**\n * @deprecated Use {@link ValidationPatternType} from `@sdcorejs/utils/models` instead.\n * Note: member names changed — PHONE_VN → VN_PHONE, IDVN → VN_ID, IDVN_OR_PASSPORT → VN_ID_OR_PASSPORT.\n */\nexport type SdPatternType = 'EMAIL' | 'PHONE' | 'PHONE_VN' | 'IDVN' | 'PASSPORT' | 'IDVN_OR_PASSPORT' | 'TIME';\n\n/**\n * @deprecated Use {@link ValidationPattern} from `@sdcorejs/utils/models` instead.\n * Note: `regex` field renamed to `pattern` to align with Angular `Validators.pattern()`.\n */\nexport interface SdPatternCommon {\n type: SdPatternType;\n name: string;\n regex: string;\n errorMessage: string;\n}\n\n// `name` và `errorMessage` chứa i18n KEY (không phải chuỗi đã dịch).\n/** @deprecated Use `VALIDATION_PATTERNS` from `@sdcorejs/utils/constants` instead. */\nexport const SdPatternCommons: SdPatternCommon[] = [\n { type: 'EMAIL', name: 'core.validator.email.name', regex: StringUtilities.REGEX_EMAIL, errorMessage: 'core.validator.email.error' },\n { type: 'PHONE', name: 'core.validator.phone.name', regex: StringUtilities.REGEX_PHONE, errorMessage: 'core.validator.phone.error' },\n {\n type: 'PHONE_VN',\n name: 'core.validator.phone-vn.name',\n regex: StringUtilities.REGEX_VN_PHONE,\n errorMessage: 'core.validator.phone-vn.error',\n },\n { type: 'IDVN', name: 'core.validator.cccd.name', regex: StringUtilities.REGEX_VN_ID, errorMessage: 'core.validator.cccd.error' },\n {\n type: 'PASSPORT',\n name: 'core.validator.passport.name',\n regex: StringUtilities.REGEX_PASSPORT,\n errorMessage: 'core.validator.passport.error',\n },\n {\n type: 'IDVN_OR_PASSPORT',\n name: 'core.validator.id-vn.name',\n regex: StringUtilities.REGEX_VN_ID_OR_PASSPORT,\n errorMessage: 'core.validator.id-vn.error',\n },\n { type: 'TIME', name: 'core.validator.time.name', regex: StringUtilities.REGEX_TIME, errorMessage: 'core.validator.time.error' },\n];\n","import { EMPTY_STR } from '@sdcorejs/utils/constants';\nexport { EMPTY_STR };\n\n/** @deprecated Use {@link EMPTY_STR} from `@sdcorejs/utils/constants` instead */\nexport const SD_EMPTY_STR = EMPTY_STR;\n","import type { MaybeAsync } from '@sdcorejs/utils/models';\nimport { resolveMaybeAsync, normalizeAsync } from '@sdcorejs/utils/models';\nexport type { MaybeAsync };\nexport { resolveMaybeAsync, normalizeAsync };\n\n/** @deprecated Use {@link MaybeAsync} from `@sdcorejs/utils/models` instead */\nexport type SdMaybeAsync<T> = MaybeAsync<T>;\n/** @deprecated Use {@link resolveMaybeAsync} from `@sdcorejs/utils/models` instead */\nexport const SdResolveMaybeAsync = resolveMaybeAsync;\n/** @deprecated Use {@link normalizeAsync} from `@sdcorejs/utils/models` instead */\nexport const SdNormalizeAsync = normalizeAsync;\n","import type { Operator, OperatorHasData, OperatorNoData } from '@sdcorejs/utils/models';\nexport type { Operator, OperatorHasData, OperatorNoData };\n\n/** @deprecated Use {@link Operator} from `@sdcorejs/utils/models` instead */\nexport type SdOperator = Operator;\n/** @deprecated Use {@link OperatorHasData} from `@sdcorejs/utils/models` instead */\nexport type SdOperatorHasData = OperatorHasData;\n/** @deprecated Use {@link OperatorNoData} from `@sdcorejs/utils/models` instead */\nexport type SdOperatorNoData = OperatorNoData;\n\n// `display` chứa i18n KEY (không phải chuỗi đã dịch).\n// Consumer phải gọi i18n.t(display) trước khi render ra UI.\n// @deprecated Use `OPERATORS` from `@sdcorejs/utils/constants` instead.\n// Note: OPERATORS has translated display labels; SdOperators uses i18n keys.\nexport const SdOperators: {\n value: Operator;\n symbol?: string;\n display: string;\n}[] = [\n { value: 'EQUAL', symbol: '=', display: 'core.operator.equal.display' },\n { value: 'NOT_EQUAL', symbol: '≠', display: 'core.operator.not-equal.display' },\n { value: 'GREATER_THAN', symbol: '>', display: 'core.operator.greater-than.display' },\n { value: 'LESS_THAN', symbol: '<', display: 'core.operator.less-than.display' },\n { value: 'GREATER_OR_EQUAL', symbol: '≥', display: 'core.operator.greater-or-equal.display' },\n { value: 'LESS_OR_EQUAL', symbol: '≤', display: 'core.operator.less-or-equal.display' },\n { value: 'CONTAIN', symbol: 'join_inner', display: 'core.operator.contain.display' },\n { value: 'NOT_CONTAIN', symbol: 'join', display: 'core.operator.not-contain.display' },\n { value: 'START_WITH', symbol: 'line_start_circle', display: 'core.operator.start-with.display' },\n { value: 'END_WITH', symbol: 'line_end_circle', display: 'core.operator.end-with.display' },\n { value: 'IN', symbol: 'checklist_rtl', display: 'core.operator.in.display' },\n { value: 'NOT_IN', symbol: 'event_list', display: 'core.operator.not-in.display' },\n { value: 'NULL', symbol: 'motion_photos_off', display: 'core.operator.null.display' },\n { value: 'NOT_NULL', symbol: 'adjust', display: 'core.operator.not-null.display' },\n];\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;AAEO,MAAM,gBAAgB,GAAc;AACpC,MAAM,wBAAwB,GAAsB;;ACoB3D;AACA;AACO,MAAM,gBAAgB,GAAsB;AACjD,IAAA,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,2BAA2B,EAAE,KAAK,EAAE,eAAe,CAAC,WAAW,EAAE,YAAY,EAAE,4BAA4B,EAAE;AACpI,IAAA,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,2BAA2B,EAAE,KAAK,EAAE,eAAe,CAAC,WAAW,EAAE,YAAY,EAAE,4BAA4B,EAAE;AACpI,IAAA;AACE,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,IAAI,EAAE,8BAA8B;QACpC,KAAK,EAAE,eAAe,CAAC,cAAc;AACrC,QAAA,YAAY,EAAE,+BAA+B;AAC9C,KAAA;AACD,IAAA,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,EAAE,KAAK,EAAE,eAAe,CAAC,WAAW,EAAE,YAAY,EAAE,2BAA2B,EAAE;AACjI,IAAA;AACE,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,IAAI,EAAE,8BAA8B;QACpC,KAAK,EAAE,eAAe,CAAC,cAAc;AACrC,QAAA,YAAY,EAAE,+BAA+B;AAC9C,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,kBAAkB;AACxB,QAAA,IAAI,EAAE,2BAA2B;QACjC,KAAK,EAAE,eAAe,CAAC,uBAAuB;AAC9C,QAAA,YAAY,EAAE,4BAA4B;AAC3C,KAAA;AACD,IAAA,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,EAAE,KAAK,EAAE,eAAe,CAAC,UAAU,EAAE,YAAY,EAAE,2BAA2B,EAAE;;;AC5ClI;AACO,MAAM,YAAY,GAAG;;ACG5B;AACO,MAAM,mBAAmB,GAAG;AACnC;AACO,MAAM,gBAAgB,GAAG;;ACAhC;AACA;AACA;AACA;AACO,MAAM,WAAW,GAIlB;IACJ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,6BAA6B,EAAE;IACvE,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,iCAAiC,EAAE;IAC/E,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,oCAAoC,EAAE;IACrF,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,iCAAiC,EAAE;IAC/E,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,wCAAwC,EAAE;IAC7F,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,qCAAqC,EAAE;IACvF,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,+BAA+B,EAAE;IACpF,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,mCAAmC,EAAE;IACtF,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,kCAAkC,EAAE;IACjG,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,gCAAgC,EAAE;IAC3F,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,0BAA0B,EAAE;IAC7E,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,8BAA8B,EAAE;IAClF,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,4BAA4B,EAAE;IACrF,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,gCAAgC,EAAE;;;AChCpF;;AAEG;;;;"}
1
+ {"version":3,"file":"sdcorejs-angular-utilities-models.mjs","sources":["../../../projects/sdcorejs-angular/utilities/models/src/icon.model.ts","../../../projects/sdcorejs-angular/utilities/models/sdcorejs-angular-utilities-models.ts"],"sourcesContent":["export type SdIconSet = 'material-icons' | 'material-icons-outlined' | 'material-icons-round' | 'material-icons-sharp' | 'lucide';\nexport type SdMaterialIconSet = Exclude<SdIconSet, 'lucide'>;\nexport const DefaultSdIconSet: SdIconSet = 'material-icons-outlined';\nexport const DefaultSdMaterialIconSet: SdMaterialIconSet = 'material-icons-outlined';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"AAEO,MAAM,gBAAgB,GAAc;AACpC,MAAM,wBAAwB,GAAsB;;ACH3D;;AAEG;;;;"}
@@ -1,16 +1,23 @@
1
- import '@sdcorejs/angular/configurations';
2
- import '@sdcorejs/angular/utilities';
3
- import '@sdcorejs/angular/pipes';
4
- import '@sdcorejs/angular/directives';
5
- import '@sdcorejs/angular/services';
6
- import '@sdcorejs/angular/interceptors';
7
- import '@sdcorejs/angular/handlers';
8
- import '@sdcorejs/angular/components';
9
- import '@sdcorejs/angular/forms';
10
- import '@sdcorejs/angular/modules';
1
+ export * from '@sdcorejs/angular/configurations';
2
+ export * from '@sdcorejs/angular/i18n';
3
+ export * from '@sdcorejs/angular/utilities';
4
+ export * from '@sdcorejs/angular/pipes';
5
+ export * from '@sdcorejs/angular/directives';
6
+ export * from '@sdcorejs/angular/services';
7
+ export * from '@sdcorejs/angular/interceptors';
8
+ export * from '@sdcorejs/angular/handlers';
9
+ export * from '@sdcorejs/angular/components';
10
+ export * from '@sdcorejs/angular/forms';
11
+ export * from '@sdcorejs/angular/modules';
11
12
 
12
13
  /*
13
14
  * Public API Surface of sd-angular
15
+ *
16
+ * why: these were previously bare `import '...'` statements, which meant the primary
17
+ * entry point re-exported NOTHING — `import { SdButton } from '@sdcorejs/angular'`
18
+ * resolved to nothing for every symbol, and the built FESM bundle was 517 bytes with
19
+ * no `export` statement. Deep imports (`@sdcorejs/angular/components/button`) remain
20
+ * the recommended path for bundle size; this barrel exists so the root import works.
14
21
  */
15
22
 
16
23
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"sdcorejs-angular.mjs","sources":["../../../projects/sdcorejs-angular/src/public-api.ts","../../../projects/sdcorejs-angular/src/sdcorejs-angular.ts"],"sourcesContent":["/*\n * Public API Surface of sd-angular\n */\nimport '@sdcorejs/angular/configurations';\nimport '@sdcorejs/angular/utilities';\nimport '@sdcorejs/angular/pipes';\nimport '@sdcorejs/angular/directives';\nimport '@sdcorejs/angular/services';\nimport '@sdcorejs/angular/interceptors';\nimport '@sdcorejs/angular/handlers';\nimport '@sdcorejs/angular/components';\nimport '@sdcorejs/angular/forms';\nimport '@sdcorejs/angular/modules';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;AAAA;;AAEG;;ACFH;;AAEG"}
1
+ {"version":3,"file":"sdcorejs-angular.mjs","sources":["../../../projects/sdcorejs-angular/src/public-api.ts","../../../projects/sdcorejs-angular/src/sdcorejs-angular.ts"],"sourcesContent":["/*\n * Public API Surface of sd-angular\n *\n * why: these were previously bare `import '...'` statements, which meant the primary\n * entry point re-exported NOTHING — `import { SdButton } from '@sdcorejs/angular'`\n * resolved to nothing for every symbol, and the built FESM bundle was 517 bytes with\n * no `export` statement. Deep imports (`@sdcorejs/angular/components/button`) remain\n * the recommended path for bundle size; this barrel exists so the root import works.\n */\nexport * from '@sdcorejs/angular/configurations';\nexport * from '@sdcorejs/angular/i18n';\nexport * from '@sdcorejs/angular/utilities';\nexport * from '@sdcorejs/angular/pipes';\nexport * from '@sdcorejs/angular/directives';\nexport * from '@sdcorejs/angular/services';\nexport * from '@sdcorejs/angular/interceptors';\nexport * from '@sdcorejs/angular/handlers';\nexport * from '@sdcorejs/angular/components';\nexport * from '@sdcorejs/angular/forms';\nexport * from '@sdcorejs/angular/modules';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;AAAA;;;;;;;;AAQG;;ACRH;;AAEG"}
@@ -13,9 +13,12 @@ declare class SdAutocompleteErrotStateMatcher implements ErrorStateMatcher {
13
13
  constructor(formControl: FormControl);
14
14
  isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean;
15
15
  }
16
- declare class SdAutocomplete<T = any> implements OnInit, OnDestroy {
16
+ declare class SdAutocomplete<T = unknown> implements OnInit, OnDestroy {
17
17
  #private;
18
18
  id: string;
19
+ /** why: id ổn định của <mat-error> để control trỏ `aria-describedby` sang — thông báo lỗi
20
+ * phải đọc được từ chính control, không chỉ hiện ra màn hình. */
21
+ readonly errorId: string;
19
22
  inputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
20
23
  autocompleteTrigger: _angular_core.Signal<MatAutocompleteTrigger | undefined>;
21
24
  sdLabelTemplate: _angular_core.Signal<TemplateRef<any> | undefined>;
@@ -72,7 +75,7 @@ declare class SdAutocomplete<T = any> implements OnInit, OnDestroy {
72
75
  appearance: _angular_core.Signal<MatFormFieldAppearance>;
73
76
  valueModel: _angular_core.ModelSignal<string | number | null | undefined>;
74
77
  sdChange: _angular_core.OutputEmitterRef<string | number | null>;
75
- sdSelection: _angular_core.OutputEmitterRef<SdSelectionData<any>>;
78
+ sdSelection: _angular_core.OutputEmitterRef<SdSelectionData<unknown>>;
76
79
  readonly sdAdd: EventEmitter<void>;
77
80
  loading: _angular_core.WritableSignal<boolean>;
78
81
  isFocused: boolean;
@@ -17,6 +17,9 @@ declare class SdChipCalendarErrorStateMatcher implements ErrorStateMatcher {
17
17
  }
18
18
  declare class SdChipCalendar implements AfterViewInit, OnDestroy {
19
19
  #private;
20
+ /** why: id ổn định của <mat-error> để ô nhập chip trỏ `aria-describedby` sang — thông báo
21
+ * lỗi phải đọc được từ chính control, không chỉ hiện ra màn hình. */
22
+ readonly errorId: string;
20
23
  menuTrigger: _angular_core.Signal<MatMenuTrigger | undefined>;
21
24
  calendar: _angular_core.Signal<MatCalendar<Date> | undefined>;
22
25
  autoIdInput: _angular_core.InputSignalWithTransform<string | undefined, string | null | undefined>;
@@ -65,6 +68,13 @@ declare class SdChipCalendar implements AfterViewInit, OnDestroy {
65
68
  onRemove: (item: string) => void;
66
69
  onSelect: (event: MatAutocompleteSelectedEvent) => void;
67
70
  onClick: () => void;
71
+ /**
72
+ * why: khi `sdViewDef` đang hiển thị thì bên trong KHÔNG còn phần tử nào focus được, nên
73
+ * click là lối vào DUY NHẤT để chuyển sang chế độ sửa. Bàn phím phải mở được y hệt chuột
74
+ * → Enter/Space chạy chung handler. preventDefault chặn Space cuộn trang (hành vi mặc
75
+ * định của phần tử không phải <button>).
76
+ */
77
+ onViewKeydown: (event: Event) => void;
68
78
  onClear: (evt?: any) => void;
69
79
  onSelectDate: (date: Date | null) => void;
70
80
  onCloseCalendar: () => void;
@@ -4,13 +4,21 @@ import { FormGroup } from '@angular/forms';
4
4
  import { MatDatepicker, MatDatepickerInputEvent } from '@angular/material/datepicker';
5
5
  import { MatFormFieldAppearance, FloatLabelType } from '@angular/material/form-field';
6
6
  import { SdViewDefDirective, SdLabelDefDirective } from '@sdcorejs/angular/forms/directives';
7
- import { SdViewed, SdViewedInput, SdFormControl } from '@sdcorejs/angular/forms/models';
7
+ import { SdViewed, SdViewedInput, SdTemporalValueTransform, SdFormControl } from '@sdcorejs/angular/forms/models';
8
8
  import { Size } from '@sdcorejs/utils/models';
9
9
 
10
10
  type SdDateModelValue = string | number | Date | undefined | null;
11
+ type SdDateKeyupEvent = Event | {
12
+ target?: {
13
+ value?: string | null;
14
+ };
15
+ };
11
16
  declare class SdDate implements OnDestroy, OnInit {
12
17
  #private;
13
18
  id: string;
19
+ /** why: id ổn định của <mat-error> để control trỏ `aria-describedby` sang — thông báo lỗi
20
+ * phải đọc được từ chính control, không chỉ hiện ra màn hình. */
21
+ readonly errorId: string;
14
22
  inputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
15
23
  datePicker: _angular_core.Signal<MatDatepicker<Date> | undefined>;
16
24
  sdLabelTemplate: _angular_core.Signal<TemplateRef<any> | undefined>;
@@ -63,11 +71,19 @@ declare class SdDate implements OnDestroy, OnInit {
63
71
  maxInput: _angular_core.InputSignal<any>;
64
72
  maxDateInput: _angular_core.InputSignal<any>;
65
73
  resolvedMax: _angular_core.Signal<Date | null>;
74
+ /**
75
+ * Output serialization strategy for the committed value. Affects `model` / `modelChange` /
76
+ * `sdChange` and the registered form field only — the input keeps showing `dd/MM/yyyy`.
77
+ * Left unset, the component keeps emitting its canonical `yyyy/MM/dd` string.
78
+ */
79
+ transform: _angular_core.InputSignal<SdTemporalValueTransform | undefined>;
66
80
  valueModel: _angular_core.ModelSignal<SdDateModelValue>;
67
81
  sdChange: _angular_core.OutputEmitterRef<any>;
68
82
  sdFocus: _angular_core.OutputEmitterRef<void>;
69
83
  isMobileOrTablet: boolean;
70
84
  formControl: SdFormControl;
85
+ /** Control registered in the parent form while a `transform` is active; holds the public model. */
86
+ readonly modelControl: SdFormControl;
71
87
  isFocused: boolean;
72
88
  isValid?: boolean;
73
89
  ngOnInit(): void;
@@ -81,11 +97,13 @@ declare class SdDate implements OnDestroy, OnInit {
81
97
  open: () => void;
82
98
  focusInputElement(): void;
83
99
  onKeyDown: (event: KeyboardEvent) => boolean;
84
- onKeyup: (event: any) => void;
100
+ onInput: (event: Event) => void;
101
+ /** Kept as a compatibility entry point for callers that used the old keyup handler. */
102
+ onKeyup: (event: SdDateKeyupEvent) => void;
85
103
  onChange: (event: MatDatepickerInputEvent<Date>) => void;
86
104
  clear: ($event: any) => void;
87
105
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdDate, never>;
88
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdDate, "sd-date", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "form": { "alias": "form"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "hideInlineError": { "alias": "hideInlineError"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "viewed": { "alias": "viewed"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "inlineError": { "alias": "inlineError"; "required": false; "isSignal": true; }; "hyperlink": { "alias": "hyperlink"; "required": false; "isSignal": true; }; "appearanceInput": { "alias": "appearance"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "required": false; "isSignal": true; }; "minInput": { "alias": "min"; "required": false; "isSignal": true; }; "minDateInput": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxInput": { "alias": "max"; "required": false; "isSignal": true; }; "maxDateInput": { "alias": "maxDate"; "required": false; "isSignal": true; }; "valueModel": { "alias": "model"; "required": false; "isSignal": true; }; }, { "valueModel": "modelChange"; "sdChange": "sdChange"; "sdFocus": "sdFocus"; }, ["sdLabelTemplate", "sdValueTemplate", "sdViewDef", "sdLabelDef"], ["[sdLabel]"], true, never>;
106
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdDate, "sd-date", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "form": { "alias": "form"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "hideInlineError": { "alias": "hideInlineError"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "viewed": { "alias": "viewed"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "inlineError": { "alias": "inlineError"; "required": false; "isSignal": true; }; "hyperlink": { "alias": "hyperlink"; "required": false; "isSignal": true; }; "appearanceInput": { "alias": "appearance"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "required": false; "isSignal": true; }; "minInput": { "alias": "min"; "required": false; "isSignal": true; }; "minDateInput": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxInput": { "alias": "max"; "required": false; "isSignal": true; }; "maxDateInput": { "alias": "maxDate"; "required": false; "isSignal": true; }; "transform": { "alias": "transform"; "required": false; "isSignal": true; }; "valueModel": { "alias": "model"; "required": false; "isSignal": true; }; }, { "valueModel": "modelChange"; "sdChange": "sdChange"; "sdFocus": "sdFocus"; }, ["sdLabelTemplate", "sdValueTemplate", "sdViewDef", "sdLabelDef"], ["[sdLabel]"], true, never>;
89
107
  }
90
108
 
91
109
  export { SdDate };
@@ -1,10 +1,11 @@
1
+ import * as _sdcorejs_angular_forms_models from '@sdcorejs/angular/forms/models';
2
+ import { SdViewed, SdViewedInput, SdTemporalValueTransform } from '@sdcorejs/angular/forms/models';
1
3
  import * as _angular_core from '@angular/core';
2
4
  import { TemplateRef } from '@angular/core';
3
5
  import { FormGroup, FormControl } from '@angular/forms';
4
6
  import { MatDateRangePicker, MatDatepickerInputEvent } from '@angular/material/datepicker';
5
7
  import { MatFormFieldAppearance, FloatLabelType } from '@angular/material/form-field';
6
8
  import { SdLabelDefDirective } from '@sdcorejs/angular/forms/directives';
7
- import { SdViewed, SdViewedInput } from '@sdcorejs/angular/forms/models';
8
9
  import { Size } from '@sdcorejs/utils/models';
9
10
 
10
11
  interface SdDateRangeValue {
@@ -15,6 +16,9 @@ declare class SdDateRange {
15
16
  #private;
16
17
  id1: string;
17
18
  id2: string;
19
+ /** why: id ổn định của <mat-error> để hai ô nhập trỏ `aria-describedby` sang — thông báo
20
+ * lỗi phải đọc được từ chính control, không chỉ hiện ra màn hình. */
21
+ readonly errorId: string;
18
22
  picker: _angular_core.Signal<MatDateRangePicker<Date> | undefined>;
19
23
  sdLabelDef: _angular_core.Signal<SdLabelDefDirective | undefined>;
20
24
  private cdRef;
@@ -68,12 +72,20 @@ declare class SdDateRange {
68
72
  resolvedMin: _angular_core.Signal<Date | null>;
69
73
  maxInput: _angular_core.InputSignal<any>;
70
74
  resolvedMax: _angular_core.Signal<Date | null>;
75
+ /**
76
+ * Output serialization strategy applied to **each endpoint** of the committed range. Affects
77
+ * `model` / `modelChange` / `sdChange` and the registered form field only — the field keeps
78
+ * showing `dd/MM/yyyy → dd/MM/yyyy`. Left unset, endpoints stay canonical `yyyy/MM/dd` strings.
79
+ */
80
+ transform: _angular_core.InputSignal<SdTemporalValueTransform | undefined>;
71
81
  valueModel: _angular_core.ModelSignal<SdDateRangeValue | null | undefined>;
72
82
  sdChange: _angular_core.OutputEmitterRef<SdDateRangeValue | null | undefined>;
73
83
  isMobileOrTablet: boolean;
74
84
  formControl: FormControl<any>;
75
85
  control1: FormControl<any>;
76
86
  control2: FormControl<any>;
87
+ /** Control registered in the parent form while a `transform` is active; holds the public model. */
88
+ readonly modelControl: _sdcorejs_angular_forms_models.SdFormControl;
77
89
  constructor();
78
90
  onStartChange: (event: MatDatepickerInputEvent<Date>) => void;
79
91
  onEndChange: (event: MatDatepickerInputEvent<Date>) => void;
@@ -84,7 +96,7 @@ declare class SdDateRange {
84
96
  onClosePicker: () => void;
85
97
  onOpenPicker: (event: MouseEvent) => void;
86
98
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdDateRange, never>;
87
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdDateRange, "sd-date-range", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "form": { "alias": "form"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "hideInlineError": { "alias": "hideInlineError"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "viewed": { "alias": "viewed"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "appearanceInput": { "alias": "appearance"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "required": false; "isSignal": true; }; "minInput": { "alias": "min"; "required": false; "isSignal": true; }; "maxInput": { "alias": "max"; "required": false; "isSignal": true; }; "valueModel": { "alias": "model"; "required": false; "isSignal": true; }; }, { "valueModel": "modelChange"; "sdChange": "sdChange"; }, ["sdLabelDef", "sdValueTemplate"], never, true, never>;
99
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdDateRange, "sd-date-range", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "form": { "alias": "form"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "hideInlineError": { "alias": "hideInlineError"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "viewed": { "alias": "viewed"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "appearanceInput": { "alias": "appearance"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "required": false; "isSignal": true; }; "minInput": { "alias": "min"; "required": false; "isSignal": true; }; "maxInput": { "alias": "max"; "required": false; "isSignal": true; }; "transform": { "alias": "transform"; "required": false; "isSignal": true; }; "valueModel": { "alias": "model"; "required": false; "isSignal": true; }; }, { "valueModel": "modelChange"; "sdChange": "sdChange"; }, ["sdLabelDef", "sdValueTemplate"], never, true, never>;
88
100
  }
89
101
 
90
102
  export { SdDateRange };
@@ -3,13 +3,16 @@ import { OnDestroy, OnInit, ElementRef, TemplateRef } from '@angular/core';
3
3
  import { FormGroup } from '@angular/forms';
4
4
  import { MatFormFieldAppearance, FloatLabelType } from '@angular/material/form-field';
5
5
  import { SdViewDefDirective } from '@sdcorejs/angular/forms/directives';
6
- import { SdViewed, SdViewedInput, SdFormControl } from '@sdcorejs/angular/forms/models';
6
+ import { SdViewed, SdViewedInput, SdTemporalValueTransform, SdFormControl } from '@sdcorejs/angular/forms/models';
7
7
  import { Size } from '@sdcorejs/utils/models';
8
8
 
9
9
  type SdDatetimeModelValue = string | number | Date | undefined | null;
10
10
  declare class SdDatetime implements OnDestroy, OnInit {
11
11
  #private;
12
12
  id: string;
13
+ /** why: id ổn định của <mat-error> để control trỏ `aria-describedby` sang — thông báo lỗi
14
+ * phải đọc được từ chính control, không chỉ hiện ra màn hình. */
15
+ readonly errorId: string;
13
16
  inputRef: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
14
17
  private readonly dateTimePicker;
15
18
  sdLabelTemplate: _angular_core.Signal<TemplateRef<any> | undefined>;
@@ -64,12 +67,20 @@ declare class SdDatetime implements OnDestroy, OnInit {
64
67
  maxInput: _angular_core.InputSignal<any>;
65
68
  maxDateInput: _angular_core.InputSignal<any>;
66
69
  resolvedMax: _angular_core.Signal<Date | null>;
70
+ /**
71
+ * Output serialization strategy for the committed value. Affects `model` / `modelChange` /
72
+ * `sdChange` and the registered form field only — the field keeps displaying
73
+ * `dd/MM/yyyy HH:mm[:ss]` per `showSeconds`. Left unset, the canonical string is emitted.
74
+ */
75
+ transform: _angular_core.InputSignal<SdTemporalValueTransform | undefined>;
67
76
  valueModel: _angular_core.ModelSignal<SdDatetimeModelValue>;
68
77
  viewedDate: _angular_core.Signal<Date | null>;
69
78
  sdChange: _angular_core.OutputEmitterRef<any>;
70
79
  sdFocus: _angular_core.OutputEmitterRef<void>;
71
80
  isMobileOrTablet: boolean;
72
81
  formControl: SdFormControl;
82
+ /** Control registered in the parent form while a `transform` is active; holds the public model. */
83
+ readonly modelControl: SdFormControl;
73
84
  isFocused: boolean;
74
85
  isValid?: boolean;
75
86
  /** State popup — true khi picker package đang mở. */
@@ -95,7 +106,7 @@ declare class SdDatetime implements OnDestroy, OnInit {
95
106
  onConfirmInput: (event: any) => void;
96
107
  clear: ($event: any) => void;
97
108
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdDatetime, never>;
98
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdDatetime, "sd-datetime", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "form": { "alias": "form"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "hideInlineError": { "alias": "hideInlineError"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "viewed": { "alias": "viewed"; "required": false; "isSignal": true; }; "showSeconds": { "alias": "showSeconds"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "inlineError": { "alias": "inlineError"; "required": false; "isSignal": true; }; "hyperlink": { "alias": "hyperlink"; "required": false; "isSignal": true; }; "appearanceInput": { "alias": "appearance"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "required": false; "isSignal": true; }; "minInput": { "alias": "min"; "required": false; "isSignal": true; }; "minDateInput": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxInput": { "alias": "max"; "required": false; "isSignal": true; }; "maxDateInput": { "alias": "maxDate"; "required": false; "isSignal": true; }; "valueModel": { "alias": "model"; "required": false; "isSignal": true; }; }, { "valueModel": "modelChange"; "sdChange": "sdChange"; "sdFocus": "sdFocus"; }, ["sdLabelTemplate", "sdValueTemplate", "sdViewDef"], ["[sdLabel]"], true, never>;
109
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdDatetime, "sd-datetime", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "form": { "alias": "form"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "hideInlineError": { "alias": "hideInlineError"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "viewed": { "alias": "viewed"; "required": false; "isSignal": true; }; "showSeconds": { "alias": "showSeconds"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "inlineError": { "alias": "inlineError"; "required": false; "isSignal": true; }; "hyperlink": { "alias": "hyperlink"; "required": false; "isSignal": true; }; "appearanceInput": { "alias": "appearance"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "required": false; "isSignal": true; }; "minInput": { "alias": "min"; "required": false; "isSignal": true; }; "minDateInput": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxInput": { "alias": "max"; "required": false; "isSignal": true; }; "maxDateInput": { "alias": "maxDate"; "required": false; "isSignal": true; }; "transform": { "alias": "transform"; "required": false; "isSignal": true; }; "valueModel": { "alias": "model"; "required": false; "isSignal": true; }; }, { "valueModel": "modelChange"; "sdChange": "sdChange"; "sdFocus": "sdFocus"; }, ["sdLabelTemplate", "sdValueTemplate", "sdViewDef"], ["[sdLabel]"], true, never>;
99
110
  }
100
111
 
101
112
  export { SdDatetime };
@@ -60,6 +60,7 @@ declare class SdEntityPicker<T = unknown, TKey = string | number> {
60
60
  readonly selectedTemplate: _angular_core.Signal<SdEntityPickerSelectedTemplateDirective<any, any> | undefined>;
61
61
  readonly rowTemplate: _angular_core.Signal<SdEntityPickerRowTemplateDirective<any> | undefined>;
62
62
  readonly detailTemplate: _angular_core.Signal<SdEntityPickerDetailTemplateDirective<any, any> | undefined>;
63
+ readonly errorId: string;
63
64
  readonly autoIdInput: _angular_core.InputSignal<string | null | undefined>;
64
65
  readonly autoId: _angular_core.Signal<string | undefined>;
65
66
  readonly name: _angular_core.InputSignal<string>;
@@ -80,6 +81,8 @@ declare class SdEntityPicker<T = unknown, TKey = string | number> {
80
81
  readonly disabledEntity: _angular_core.InputSignal<((item: T) => boolean) | undefined>;
81
82
  readonly multiple: _angular_core.InputSignalWithTransform<boolean, unknown>;
82
83
  readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
84
+ /** Component-local error text. Set it to force the control invalid and render the message. */
85
+ readonly inlineError: _angular_core.InputSignal<string | undefined>;
83
86
  readonly clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
84
87
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
85
88
  readonly readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -88,11 +91,14 @@ declare class SdEntityPicker<T = unknown, TKey = string | number> {
88
91
  readonly model: _angular_core.ModelSignal<SdEntityPickerModel<TKey>>;
89
92
  readonly sdChange: _angular_core.OutputEmitterRef<SdEntityPickerModel<TKey>>;
90
93
  readonly sdAdd: _angular_core.OutputEmitterRef<void>;
91
- readonly sdLoadError: _angular_core.OutputEmitterRef<unknown>;
94
+ readonly loadError: _angular_core.OutputEmitterRef<unknown>;
92
95
  readonly formControl: SdFormControl;
96
+ readonly errorMessage: _angular_core.Signal<string | undefined>;
93
97
  readonly connectorState: _angular_core.Signal<_sdcorejs_angular_forms_models.ɵSdFormControlConnectorState<SdEntityPickerModel<TKey>>>;
98
+ /** Interaction-gated validation message; `undefined` until the control is touched/dirty. */
99
+ readonly visibleErrorMessage: _angular_core.Signal<string | undefined>;
94
100
  readonly draftKeys: _angular_core.WritableSignal<TKey[]>;
95
- readonly loadError: _angular_core.WritableSignal<unknown>;
101
+ readonly loadErrorState: _angular_core.WritableSignal<unknown>;
96
102
  readonly loading: _angular_core.WritableSignal<boolean>;
97
103
  readonly hydrating: _angular_core.WritableSignal<boolean>;
98
104
  readonly query: _angular_core.WritableSignal<SdQuery<T>>;
@@ -120,7 +126,7 @@ declare class SdEntityPicker<T = unknown, TKey = string | number> {
120
126
  keyOf(item: T): TKey;
121
127
  displayEntity(item: T): string;
122
128
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SdEntityPicker<any, any>, never>;
123
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdEntityPicker<any, any>, "sd-entity-picker", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "form": { "alias": "form"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "modalTitle": { "alias": "modalTitle"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "provider": { "alias": "provider"; "required": false; "isSignal": true; }; "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "queryFields": { "alias": "queryFields"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "valueField": { "alias": "valueField"; "required": false; "isSignal": true; }; "keySelector": { "alias": "keySelector"; "required": false; "isSignal": true; }; "displayField": { "alias": "displayField"; "required": false; "isSignal": true; }; "displayWith": { "alias": "displayWith"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "disabledEntity": { "alias": "disabledEntity"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "viewed": { "alias": "viewed"; "required": false; "isSignal": true; }; "addable": { "alias": "addable"; "required": false; "isSignal": true; }; "model": { "alias": "model"; "required": false; "isSignal": true; }; }, { "model": "modelChange"; "sdChange": "sdChange"; "sdAdd": "sdAdd"; "sdLoadError": "sdLoadError"; }, ["selectedTemplate", "rowTemplate", "detailTemplate"], never, true, never>;
129
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SdEntityPicker<any, any>, "sd-entity-picker", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "form": { "alias": "form"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "modalTitle": { "alias": "modalTitle"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "provider": { "alias": "provider"; "required": false; "isSignal": true; }; "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "queryFields": { "alias": "queryFields"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "valueField": { "alias": "valueField"; "required": false; "isSignal": true; }; "keySelector": { "alias": "keySelector"; "required": false; "isSignal": true; }; "displayField": { "alias": "displayField"; "required": false; "isSignal": true; }; "displayWith": { "alias": "displayWith"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "disabledEntity": { "alias": "disabledEntity"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "inlineError": { "alias": "inlineError"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "viewed": { "alias": "viewed"; "required": false; "isSignal": true; }; "addable": { "alias": "addable"; "required": false; "isSignal": true; }; "model": { "alias": "model"; "required": false; "isSignal": true; }; }, { "model": "modelChange"; "sdChange": "sdChange"; "sdAdd": "sdAdd"; "loadError": "loadError"; }, ["selectedTemplate", "rowTemplate", "detailTemplate"], never, true, never>;
124
130
  }
125
131
  declare function normalizePickerKeys<TKey>(value: SdEntityPickerModel<TKey>, multiple: boolean): TKey[];
126
132
 
package/forms/index.d.ts CHANGED
@@ -1,42 +1,51 @@
1
+ import * as i21 from '@sdcorejs/angular/forms/directives';
1
2
  export * from '@sdcorejs/angular/forms/directives';
2
3
  export * from '@sdcorejs/angular/forms/models';
4
+ import * as i1 from '@sdcorejs/angular/forms/label';
3
5
  export * from '@sdcorejs/angular/forms/label';
4
- import * as i1 from '@sdcorejs/angular/forms/input';
6
+ import * as i2 from '@sdcorejs/angular/forms/input';
5
7
  export * from '@sdcorejs/angular/forms/input';
8
+ import * as i3 from '@sdcorejs/angular/forms/input-color';
6
9
  export * from '@sdcorejs/angular/forms/input-color';
10
+ import * as i4 from '@sdcorejs/angular/forms/inline-text';
7
11
  export * from '@sdcorejs/angular/forms/inline-text';
8
- import * as i2 from '@sdcorejs/angular/forms/input-number';
12
+ import * as i5 from '@sdcorejs/angular/forms/input-number';
9
13
  export * from '@sdcorejs/angular/forms/input-number';
10
- import * as i3 from '@sdcorejs/angular/forms/date';
14
+ import * as i6 from '@sdcorejs/angular/forms/date';
11
15
  export * from '@sdcorejs/angular/forms/date';
16
+ import * as i7 from '@sdcorejs/angular/forms/datetime';
12
17
  export * from '@sdcorejs/angular/forms/datetime';
13
- import * as i4 from '@sdcorejs/angular/forms/date-range';
18
+ import * as i8 from '@sdcorejs/angular/forms/date-range';
14
19
  export * from '@sdcorejs/angular/forms/date-range';
15
- import * as i5 from '@sdcorejs/angular/forms/time';
20
+ import * as i9 from '@sdcorejs/angular/forms/time';
16
21
  export * from '@sdcorejs/angular/forms/time';
17
- import * as i6 from '@sdcorejs/angular/forms/time-range';
22
+ import * as i10 from '@sdcorejs/angular/forms/time-range';
18
23
  export * from '@sdcorejs/angular/forms/time-range';
19
- import * as i7 from '@sdcorejs/angular/forms/entity-picker';
24
+ import * as i11 from '@sdcorejs/angular/forms/entity-picker';
20
25
  export * from '@sdcorejs/angular/forms/entity-picker';
21
- import * as i8 from '@sdcorejs/angular/forms/tree-select';
26
+ import * as i12 from '@sdcorejs/angular/forms/tree-select';
22
27
  export * from '@sdcorejs/angular/forms/tree-select';
23
- import * as i9 from '@sdcorejs/angular/forms/select';
28
+ import * as i13 from '@sdcorejs/angular/forms/select';
24
29
  export * from '@sdcorejs/angular/forms/select';
25
- import * as i10 from '@sdcorejs/angular/forms/autocomplete';
30
+ import * as i14 from '@sdcorejs/angular/forms/autocomplete';
26
31
  export * from '@sdcorejs/angular/forms/autocomplete';
32
+ import * as i15 from '@sdcorejs/angular/forms/switch';
27
33
  export * from '@sdcorejs/angular/forms/switch';
28
- import * as i11 from '@sdcorejs/angular/forms/radio';
34
+ import * as i16 from '@sdcorejs/angular/forms/radio';
29
35
  export * from '@sdcorejs/angular/forms/radio';
30
- import * as i12 from '@sdcorejs/angular/forms/textarea';
36
+ import * as i17 from '@sdcorejs/angular/forms/textarea';
31
37
  export * from '@sdcorejs/angular/forms/textarea';
38
+ import * as i18 from '@sdcorejs/angular/forms/chip';
32
39
  export * from '@sdcorejs/angular/forms/chip';
40
+ import * as i19 from '@sdcorejs/angular/forms/chip-calendar';
33
41
  export * from '@sdcorejs/angular/forms/chip-calendar';
42
+ import * as i20 from '@sdcorejs/angular/forms/checkbox';
34
43
  export * from '@sdcorejs/angular/forms/checkbox';
35
44
  import * as i0 from '@angular/core';
36
45
 
37
46
  declare class SdFormsModule {
38
47
  static ɵfac: i0.ɵɵFactoryDeclaration<SdFormsModule, never>;
39
- static ɵmod: i0.ɵɵNgModuleDeclaration<SdFormsModule, never, [typeof i1.SdInput, typeof i2.SdInputNumber, typeof i3.SdDate, typeof i4.SdDateRange, typeof i5.SdTime, typeof i6.SdTimeRange, typeof i7.SdEntityPicker, typeof i8.SdTreeSelect, typeof i9.SdSelect, typeof i10.SdAutocomplete, typeof i11.SdRadio, typeof i12.SdTextarea], [typeof i1.SdInput, typeof i2.SdInputNumber, typeof i3.SdDate, typeof i4.SdDateRange, typeof i5.SdTime, typeof i6.SdTimeRange, typeof i7.SdEntityPicker, typeof i8.SdTreeSelect, typeof i9.SdSelect, typeof i10.SdAutocomplete, typeof i11.SdRadio, typeof i12.SdTextarea]>;
48
+ static ɵmod: i0.ɵɵNgModuleDeclaration<SdFormsModule, never, [typeof i1.SdLabel, typeof i2.SdInput, typeof i3.SdInputColor, typeof i4.SdInlineText, typeof i5.SdInputNumber, typeof i6.SdDate, typeof i7.SdDatetime, typeof i8.SdDateRange, typeof i9.SdTime, typeof i10.SdTimeRange, typeof i11.SdEntityPicker, typeof i12.SdTreeSelect, typeof i13.SdSelect, typeof i14.SdAutocomplete, typeof i15.SdSwitch, typeof i16.SdRadio, typeof i17.SdTextarea, typeof i18.SdChip, typeof i19.SdChipCalendar, typeof i20.SdCheckbox, typeof i21.SdSuffixDefDirective, typeof i21.SdLabelDefDirective, typeof i21.SdViewDefDirective, typeof i21.SdItemDefDefDirective, typeof i13.SdSelectFooterActionDirective, typeof i11.SdEntityPickerSelectedTemplateDirective, typeof i11.SdEntityPickerRowTemplateDirective, typeof i11.SdEntityPickerDetailTemplateDirective, typeof i12.SdTreeSelectNodeTemplateDirective], [typeof i1.SdLabel, typeof i2.SdInput, typeof i3.SdInputColor, typeof i4.SdInlineText, typeof i5.SdInputNumber, typeof i6.SdDate, typeof i7.SdDatetime, typeof i8.SdDateRange, typeof i9.SdTime, typeof i10.SdTimeRange, typeof i11.SdEntityPicker, typeof i12.SdTreeSelect, typeof i13.SdSelect, typeof i14.SdAutocomplete, typeof i15.SdSwitch, typeof i16.SdRadio, typeof i17.SdTextarea, typeof i18.SdChip, typeof i19.SdChipCalendar, typeof i20.SdCheckbox, typeof i21.SdSuffixDefDirective, typeof i21.SdLabelDefDirective, typeof i21.SdViewDefDirective, typeof i21.SdItemDefDefDirective, typeof i13.SdSelectFooterActionDirective, typeof i11.SdEntityPickerSelectedTemplateDirective, typeof i11.SdEntityPickerRowTemplateDirective, typeof i11.SdEntityPickerDetailTemplateDirective, typeof i12.SdTreeSelectNodeTemplateDirective]>;
40
49
  static ɵinj: i0.ɵɵInjectorDeclaration<SdFormsModule>;
41
50
  }
42
51
 
@@ -56,6 +56,9 @@ declare function sdResolveInputMask(mask: SdInputMask | null | undefined): SdInp
56
56
  declare class SdInput implements OnDestroy, OnInit, AfterViewInit {
57
57
  #private;
58
58
  id: string;
59
+ /** why: id ổn định của <mat-error> để `<input>` trỏ `aria-describedby` sang — thông báo lỗi
60
+ * phải đọc được từ chính control, không chỉ hiện ra màn hình. */
61
+ readonly errorId: string;
59
62
  control: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
60
63
  /** The inline primitive — only present when `viewed='inline'`; drives focus/blur in that mode. */
61
64
  inlineRef: _angular_core.Signal<SdInlineText | undefined>;
@@ -24,6 +24,10 @@ declare class SdInputColor {
24
24
  readonly hideInlineError: _angular_core.InputSignalWithTransform<boolean, unknown>;
25
25
  /** Display mode — forwarded to the inner `<sd-input>`. `'inline'` = borderless inline-edit; disabled `'inline'` → static. */
26
26
  readonly viewed: _angular_core.InputSignalWithTransform<SdViewed, SdViewedInput>;
27
+ /** `true` when `viewed === true` (static view — no editor, no picker). */
28
+ readonly isViewed: _angular_core.Signal<boolean>;
29
+ /** `true` when `viewed === 'inline'` and the control is still editable. */
30
+ readonly isInline: _angular_core.Signal<boolean>;
27
31
  readonly valueModel: _angular_core.ModelSignal<string | null | undefined>;
28
32
  readonly sdChange: _angular_core.OutputEmitterRef<string | null | undefined>;
29
33
  readonly picker: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
@@ -16,6 +16,9 @@ declare class SdInputNumberErrotStateMatcher implements ErrorStateMatcher {
16
16
  declare class SdInputNumber implements OnDestroy, OnInit, AfterViewInit {
17
17
  #private;
18
18
  id: string;
19
+ /** why: id ổn định của <mat-error> để control trỏ `aria-describedby` sang — thông báo lỗi
20
+ * phải đọc được từ chính control, không chỉ hiện ra màn hình. */
21
+ readonly errorId: string;
19
22
  control: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
20
23
  /** The inline primitive — only present when `viewed='inline'`; drives focus/blur in that mode. */
21
24
  inlineRef: _angular_core.Signal<SdInlineText | undefined>;