@sdcorejs/angular 20.1.6 → 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 +10 -0
  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 +251 -109
  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 +27 -17
  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 +542 -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 +232 -61
  92. package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
  93. package/fesm2022/sdcorejs-angular-forms-date.mjs +96 -24
  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 +227 -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 +490 -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 +332 -111
  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 +13 -2
  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 +119 -4
  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 +95 -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 +94 -28
  185. package/modules/permission/index.d.ts +66 -4
  186. package/package.json +32 -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 +1 @@
1
- {"version":3,"file":"sdcorejs-angular-forms-input.mjs","sources":["../../../projects/sdcorejs-angular/forms/input/src/input-mask.ts","../../../projects/sdcorejs-angular/forms/input/src/input.component.ts","../../../projects/sdcorejs-angular/forms/input/src/input.component.html","../../../projects/sdcorejs-angular/forms/input/sdcorejs-angular-forms-input.ts"],"sourcesContent":["export type SdInputMaskStatus = 'empty' | 'incomplete' | 'valid' | 'invalid';\n\nexport type SdInputMaskInputMode = 'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url';\n\nexport interface SdInputMaskResult {\n readonly raw: string;\n readonly display: string;\n readonly status: SdInputMaskStatus;\n readonly selectionStart: number;\n readonly selectionEnd: number;\n}\n\nexport interface SdInputMaskAdapter {\n readonly inputMode?: SdInputMaskInputMode;\n readonly maxDisplayLength?: number;\n format(raw: string | null | undefined): SdInputMaskResult;\n parse(display: string, selectionStart?: number | null, selectionEnd?: number | null): SdInputMaskResult;\n}\n\nexport interface SdInputMaskToken {\n readonly pattern: RegExp;\n readonly optional?: boolean;\n readonly transform?: (value: string) => string;\n}\n\nexport interface SdCreateInputMaskOptions {\n readonly tokens?: Readonly<Record<string, SdInputMaskToken>>;\n readonly inputMode?: SdInputMaskInputMode;\n}\n\ninterface MaskSlot {\n readonly unitIndex: number;\n readonly slotIndex: number;\n readonly token: SdInputMaskToken;\n}\n\ninterface MaskLiteral {\n readonly unitIndex: number;\n readonly value: string;\n}\n\ninterface AssignedSlot {\n readonly slotIndex: number;\n readonly unitIndex: number;\n readonly value: string;\n readonly sourceIndex: number;\n}\n\nconst DEFAULT_TOKENS: Readonly<Record<string, SdInputMaskToken>> = {\n '#': { pattern: /[0-9]/ },\n '9': { pattern: /[0-9]/, optional: true },\n A: { pattern: /[A-Za-z]/ },\n a: { pattern: /[A-Za-z]/, optional: true },\n '*': { pattern: /[A-Za-z0-9]/ },\n '?': { pattern: /[A-Za-z0-9]/, optional: true },\n};\n\nfunction tokenAccepts(token: SdInputMaskToken, value: string): boolean {\n token.pattern.lastIndex = 0;\n const accepted = token.pattern.test(value);\n token.pattern.lastIndex = 0;\n return accepted;\n}\n\n/**\n * Creates a dependency-free slot mask.\n *\n * Default tokens: `#` required digit, `9` optional digit, `A`/`a` required/optional\n * letter, and `*`/`?` required/optional alphanumeric. Every other character is a\n * display literal and never leaks into the raw model.\n */\nexport function sdCreateInputMask(pattern: string, options: SdCreateInputMaskOptions = {}): SdInputMaskAdapter {\n if (!pattern) throw new Error('Input mask pattern must not be empty.');\n\n const tokens = { ...DEFAULT_TOKENS, ...options.tokens };\n const slots: MaskSlot[] = [];\n const literals: MaskLiteral[] = [];\n const units = Array.from(pattern, (value, unitIndex) => {\n const token = tokens[value];\n if (token) {\n const slot = { unitIndex, slotIndex: slots.length, token } satisfies MaskSlot;\n slots.push(slot);\n return slot;\n }\n const literal = { unitIndex, value } satisfies MaskLiteral;\n literals.push(literal);\n return literal;\n });\n if (slots.length === 0) throw new Error('Input mask pattern must contain at least one token.');\n\n const literalValues = new Set(literals.map(item => item.value));\n\n const convert = (\n source: string,\n sourceSelectionStart: number,\n sourceSelectionEnd: number,\n sourceIsDisplay: boolean\n ): SdInputMaskResult => {\n const assigned: AssignedSlot[] = [];\n let unitCursor = 0;\n let invalid = false;\n\n for (let sourceIndex = 0; sourceIndex < source.length; sourceIndex += 1) {\n const value = source[sourceIndex];\n let consumed = false;\n\n // why: literals are consumed at the pattern cursor, not filtered globally;\n // a global filter would corrupt raw digits in masks with prefixes such as `+84`.\n while (unitCursor < units.length) {\n const unit = units[unitCursor];\n\n if ('value' in unit) {\n unitCursor += 1;\n if (sourceIsDisplay && value === unit.value) {\n consumed = true;\n break;\n }\n continue;\n }\n\n if (tokenAccepts(unit.token, value)) {\n assigned.push({\n slotIndex: unit.slotIndex,\n unitIndex: unit.unitIndex,\n value: unit.token.transform?.(value) ?? value,\n sourceIndex,\n });\n unitCursor += 1;\n consumed = true;\n break;\n }\n\n if (sourceIsDisplay && literalValues.has(value)) {\n consumed = true;\n break;\n }\n\n if (unit.token.optional) {\n unitCursor += 1;\n continue;\n }\n\n invalid = true;\n consumed = true;\n break;\n }\n\n if (!consumed) invalid = true;\n }\n\n const assignedByUnit = new Map(assigned.map(item => [item.unitIndex, item] as const));\n const lastFilledUnit = assigned.at(-1)?.unitIndex ?? -1;\n let display = '';\n let acceptedCount = 0;\n const displayPositionByAcceptedCount = new Map<number, number>([[0, 0]]);\n\n for (const unit of units) {\n if ('token' in unit) {\n const item = assignedByUnit.get(unit.unitIndex);\n if (!item) continue;\n display += item.value;\n acceptedCount += 1;\n displayPositionByAcceptedCount.set(acceptedCount, display.length);\n } else if (unit.unitIndex < lastFilledUnit) {\n display += unit.value;\n }\n }\n\n const raw = assigned.map(item => item.value).join('');\n const hasEveryRequiredSlot = slots.every((slot, index) => slot.token.optional || assigned.some(item => item.slotIndex === index));\n const status: SdInputMaskStatus = invalid ? 'invalid' : raw.length === 0 ? 'empty' : hasEveryRequiredSlot ? 'valid' : 'incomplete';\n\n const acceptedBefore = (position: number): number => assigned.filter(item => item.sourceIndex < Math.max(0, position)).length;\n const mapSelection = (position: number): number => {\n const count = acceptedBefore(position);\n return displayPositionByAcceptedCount.get(count) ?? display.length;\n };\n\n return {\n raw,\n display,\n status,\n selectionStart: mapSelection(sourceSelectionStart),\n selectionEnd: mapSelection(sourceSelectionEnd),\n };\n };\n\n return {\n inputMode: options.inputMode ?? (slots.every(slot => tokenAccepts(slot.token, '0')) ? 'numeric' : 'text'),\n maxDisplayLength: pattern.length,\n format: raw => {\n const source = raw == null ? '' : String(raw);\n return convert(source, source.length, source.length, false);\n },\n parse: (display, selectionStart = display.length, selectionEnd = selectionStart) =>\n convert(display, selectionStart ?? display.length, selectionEnd ?? selectionStart ?? display.length, true),\n };\n}\n\n/** Common business masks. Models remain raw strings; separators are display-only. */\nexport const SD_INPUT_MASKS = {\n VN_PHONE: sdCreateInputMask('#### ### ###', { inputMode: 'tel' }),\n VN_ID: sdCreateInputMask('#### #### ####', { inputMode: 'numeric' }),\n VN_TAX_CODE: sdCreateInputMask('##########-999', { inputMode: 'numeric' }),\n BANK_ACCOUNT: sdCreateInputMask('######99999999999999', { inputMode: 'numeric' }),\n BUSINESS_CODE: sdCreateInputMask('****-????????????', { inputMode: 'text' }),\n} as const satisfies Readonly<Record<string, SdInputMaskAdapter>>;\n\nexport type SdInputMaskPreset = keyof typeof SD_INPUT_MASKS;\nexport type SdInputMask = SdInputMaskAdapter | SdInputMaskPreset;\n\nexport function sdResolveInputMask(mask: SdInputMask | null | undefined): SdInputMaskAdapter | undefined {\n if (!mask) return undefined;\n return typeof mask === 'string' ? SD_INPUT_MASKS[mask] : mask;\n}\n","import { CommonModule } from '@angular/common';\nimport {\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n computed,\n contentChild,\n effect,\n ElementRef,\n EventEmitter,\n inject,\n input,\n model,\n OnDestroy,\n OnInit,\n Output,\n output,\n signal,\n TemplateRef,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { AsyncValidatorFn, FormGroup, FormsModule, NgForm, ReactiveFormsModule, ValidatorFn, Validators } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { FloatLabelType, MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { SdView } from '@sdcorejs/angular/components/view';\nimport { SdInlineText } from '@sdcorejs/angular/forms/inline-text';\nimport { SdSuffixDefDirective, SdViewDefDirective } from '@sdcorejs/angular/forms/directives';\nimport { SdLabel } from '@sdcorejs/angular/forms/label';\nimport {\n HandleSdCustomValidator,\n SD_FORM_CONFIGURATION,\n SdCustomValidator,\n SdFormControl,\n sdFormControlState,\n SdInlineErrorValidator,\n SdViewed,\n SdViewedInput,\n sdViewedInline,\n sdViewedTransform,\n ɵsdFormControlConnector,\n} from '@sdcorejs/angular/forms/models';\nimport { sdSerializeDataValue, sdIsEmpty } from '@sdcorejs/angular/utilities/data-state';\nimport { I18nService, TranslatePipe } from '@sdcorejs/angular/i18n';\nimport { Size } from '@sdcorejs/utils/models';\nimport type { ValidationPatternType } from '@sdcorejs/utils/models';\nimport { VALIDATION_PATTERNS } from '@sdcorejs/utils/constants';\n\n// Back-compat: SdPatternType cũ → ValidationPatternType mới.\n// 3 key đã đổi tên trong @sdcorejs/utils v1.x.\nconst LEGACY_PATTERN_ALIAS: Record<string, ValidationPatternType> = {\n PHONE_VN: 'VN_PHONE',\n IDVN: 'VN_ID',\n IDVN_OR_PASSPORT: 'VN_ID_OR_PASSPORT',\n};\nimport { Subscription } from 'rxjs';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\nimport { SdInputMask, SdInputMaskResult, SdInputMaskStatus, sdResolveInputMask } from './input-mask';\n\n@Component({\n selector: 'sd-input',\n templateUrl: './input.component.html',\n styleUrl: './input.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n host: { '[class.sd-has-label]': '!!label()', '[class.sd-viewed]': 'isViewed() || isInline()' },\n imports: [\n SdIcon,\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatTooltipModule,\n MatButtonModule,\n SdLabel,\n SdView,\n SdInlineText,\n TranslatePipe,\n ],\n})\nexport class SdInput implements OnDestroy, OnInit, AfterViewInit {\n id = `I${Utilities.generateUuid()}`;\n\n // ==========================================\n // 1. SIGNAL QUERIES (Thay thế @ViewChild / @ContentChild)\n // ==========================================\n control = viewChild<ElementRef<HTMLInputElement>>('control');\n /** The inline primitive — only present when `viewed='inline'`; drives focus/blur in that mode. */\n inlineRef = viewChild(SdInlineText);\n sdLabelTemplate = contentChild<TemplateRef<any>>('sdLabel');\n sdValueTemplate = contentChild<TemplateRef<any>>('sdValue');\n sdSuffixDef = contentChild(SdSuffixDefDirective);\n sdViewDef = contentChild(SdViewDefDirective);\n\n // ==========================================\n // 2. SIGNAL INPUTS & MODEL\n // ==========================================\n autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\n autoId = computed(() => (this.autoIdInput() ? `forms-input-${this.autoIdInput()}` : undefined));\n\n readonly #state = sdFormControlState(computed(() => this.formControl));\n readonly dataDisabled = computed(() => (this.#state().disabled ? 'true' : 'false'));\n readonly dataInvalid = computed(() => (this.#state().invalid ? 'true' : 'false'));\n readonly dataEmpty = computed(() => (sdIsEmpty(this.#state().value) ? 'true' : 'false'));\n readonly dataValue = computed<string | null>(() => {\n if (this.type() === 'password') return null;\n return sdSerializeDataValue(this.#state().value);\n });\n\n readonly dataRequired = computed(() => (this.required() ? 'true' : 'false'));\n readonly dataMaxLength = computed(() => {\n const v = this.maxlength();\n return v == null ? null : String(v);\n });\n readonly dataMinLength = computed(() => {\n const v = this.minlength();\n return v == null ? null : String(v);\n });\n readonly dataPattern = computed(() => {\n const v = this.pattern();\n return v == null || v === '' ? null : String(v);\n });\n readonly dataErrorMessage = computed(() => {\n void this.#state();\n const msg = this.errorMessage();\n return msg && msg.length > 0 ? msg : null;\n });\n\n name = input<string>(Utilities.generateUuid());\n\n // ==========================================\n // 3. INJECT (Thay thế Constructor DI)\n // ==========================================\n #ref = inject(ChangeDetectorRef);\n #formConfig = inject(SD_FORM_CONFIGURATION, { optional: true });\n readonly #i18n = inject(I18nService);\n\n appearanceInput = input<MatFormFieldAppearance | undefined>(undefined, { alias: 'appearance' });\n appearance = computed(() => this.appearanceInput() ?? this.#formConfig?.appearance ?? 'outline');\n\n floatLabel = input<FloatLabelType>('auto');\n\n size = input<Size>('md');\n // Ghi (TransformT): any (để không bị lỗi typing khi cha truyền vào)\n form = input<FormGroup | undefined, any>(undefined, {\n transform: (val: any): FormGroup | undefined => {\n if (!val) return undefined;\n // Nếu cha truyền vào NgForm (template-driven) -> Bóc lấy FormGroup bên trong\n if (val instanceof NgForm) return val.form;\n // Nếu cha truyền sẵn FormGroup (reactive) -> Lấy luôn\n if (val instanceof FormGroup) return val;\n // Fallback an toàn phòng trường hợp cha truyền 1 object chứa form\n if (val?.form instanceof FormGroup) return val.form;\n return undefined;\n },\n });\n label = input<string | undefined>();\n helperText = input<string | undefined>();\n placeholder = input<string | undefined>();\n type = input<'text' | 'number' | 'password' | 'email'>('text');\n mask = input<SdInputMask | null | undefined>();\n readonly maskAdapter = computed(() => sdResolveInputMask(this.mask()));\n readonly effectiveType = computed(() => (this.maskAdapter() ? 'text' : this.type()));\n readonly inputMode = computed(() => this.maskAdapter()?.inputMode);\n readonly maxDisplayLength = computed(() => this.maskAdapter()?.maxDisplayLength);\n\n hideInlineError = input(false, { transform: booleanAttribute });\n blurOnEnter = input(false, { transform: booleanAttribute });\n /** Whether to show the value-gated clear button in edit and inline modes. */\n clearable = input(false, { transform: booleanAttribute });\n required = input(false, { transform: booleanAttribute });\n readonly = input(false, { transform: booleanAttribute });\n disabled = input(false, { transform: booleanAttribute });\n /** Display mode: `false` edit · `true` static view · `'inline'` borderless inline-edit (no panel — the input IS the face). */\n viewed = input<SdViewed, SdViewedInput>(false, { transform: sdViewedTransform });\n\n /** Focus whichever input is live: the inline primitive in `'inline'` mode, else the mat input. */\n #focusActiveInput = (): void => {\n const inline = this.inlineRef();\n if (inline) inline.focus();\n else this.control()?.nativeElement?.focus();\n };\n /** View display template: `sdViewDef` overrides the projected `#sdValue` for the static view (unified). */\n readonly viewTemplate = computed<TemplateRef<any> | undefined>(() => this.sdViewDef()?.templateRef ?? this.sdValueTemplate());\n\n minlength = input<number | undefined, unknown>(undefined, { transform: v => (v == null ? undefined : Number(v)) });\n maxlength = input<number | undefined, unknown>(undefined, { transform: v => (v == null ? undefined : Number(v)) });\n\n pattern = input<ValidationPatternType | string | undefined | null>();\n patternErrorMessage = input<string | undefined | null>();\n\n // Bỏ qua nếu val không phải string (number/boolean/object truyền nhầm → tránh validator hỏng)\n #lookupPattern = (val: unknown) => {\n if (typeof val !== 'string') return undefined;\n const key = (LEGACY_PATTERN_ALIAS[val] ?? val) as ValidationPatternType;\n return VALIDATION_PATTERNS.find(e => e.type === key);\n };\n\n resolvedPattern = computed(() => {\n const val = this.pattern();\n if (typeof val !== 'string') return undefined;\n const patternObj = this.#lookupPattern(val);\n return patternObj ? patternObj.pattern : val;\n });\n\n resolvedPatternErrorMsg = computed(() => {\n // patternObj.errorMessage là i18n key (vd 'core.validator.email.error') → wrap qua i18n.t() để hiển thị string đã dịch\n const customMsg = this.patternErrorMessage();\n if (customMsg) return customMsg;\n const patternObj = this.#lookupPattern(this.pattern());\n return patternObj ? this.#i18n.t(patternObj.errorMessage) : undefined;\n });\n\n /**\n * First active error message for tooltip display when `hideInlineError = true`.\n * Re-runs only when `#state` ticks (value / status / touched change) — no longer\n * invoked on every change-detection cycle as a getter would be.\n */\n readonly errorMessage = computed<string | undefined>(() => {\n // Subscribe to form-state changes so the computed re-evaluates correctly.\n void this.#state();\n const errors = this.formControl.errors;\n if (!errors) return undefined;\n\n if (errors['required']) return this.#i18n.t('core.form.input.required');\n if (errors['maxlength']) return this.#i18n.t('core.form.input.maxlength', { max: this.maxlength() ?? '' });\n if (errors['maskIncomplete']) return this.#i18n.t('core.form.input.mask-incomplete');\n if (errors['maskInvalid']) return this.#i18n.t('core.form.input.mask-invalid');\n if (errors['pattern']) return this.resolvedPatternErrorMsg() || this.#i18n.t('core.form.input.invalid-pattern');\n if (errors['customValidator']) return errors['customValidator'] as string;\n if (errors['inlineError']) return this.inlineError();\n return undefined;\n });\n\n validator = input<SdCustomValidator | undefined>();\n inlineError = input<string | undefined>();\n hyperlink = input<string | null | undefined>();\n\n valueModel = model<any>(undefined, { alias: 'model' });\n\n // ==========================================\n // 4. SIGNAL OUTPUTS (Thay thế @Output)\n // ==========================================\n sdChange = output<any>();\n sdFocus = output<void>(); // Đổi sang void vì không truyền data\n sdBlur = output<any>();\n keyupEnter = output<any>();\n // why: sdChange fire per-keystroke nên consumer KHÔNG dùng nó để trigger\n // \"commit filter\" (sẽ over-reload). `cleared` là intent rõ ràng cho action\n // X (clear button) — consumer như column-filter dùng để fire reload ngay.\n cleared = output<void>();\n\n // why: focus handling reads EventEmitter.observed before emitting a forced blur event.\n @Output() readonly sdFocusForceBlur = new EventEmitter<void>();\n\n formControl = new SdFormControl();\n /** Display-only control used by the input element while a mask is active. */\n readonly displayControl = new SdFormControl();\n readonly activeControl = computed(() => (this.maskAdapter() ? this.displayControl : this.formControl));\n readonly maskStatus = signal<SdInputMaskStatus>('empty');\n readonly displayValue = computed(() => {\n const adapter = this.maskAdapter();\n return adapter ? adapter.format(this.formControl.value == null ? '' : String(this.formControl.value)).display : this.formControl.value;\n });\n #subscription = new Subscription();\n #isComposing = false;\n #pendingMaskResult: SdInputMaskResult | undefined;\n isFocused = false;\n readonly #validators = computed<readonly ValidatorFn[]>(() => {\n const validators: ValidatorFn[] = [];\n const min = this.minlength();\n const max = this.maxlength();\n const pattern = this.resolvedPattern();\n\n if (min && min > 0) validators.push(Validators.minLength(min));\n if (max && max > 0) validators.push(Validators.maxLength(max));\n if (pattern) validators.push(Validators.pattern(pattern));\n if (this.maskAdapter()) {\n const maskStatus = this.maskStatus();\n validators.push(() => {\n if (maskStatus === 'invalid') return { maskInvalid: true };\n if (maskStatus === 'incomplete') return { maskIncomplete: true };\n return null;\n });\n }\n if (this.inlineError()) validators.push(SdInlineErrorValidator);\n return validators;\n });\n readonly #asyncValidators = computed<readonly AsyncValidatorFn[]>(() => {\n const validator = this.validator();\n return validator ? [HandleSdCustomValidator(validator)] : [];\n });\n readonly #formConnector = ɵsdFormControlConnector<unknown, unknown>({\n form: this.form,\n name: this.name,\n control: computed(() => this.formControl),\n validators: this.#validators,\n asyncValidators: this.#asyncValidators,\n required: this.required,\n disabled: this.disabled,\n readonly: this.readonly,\n viewed: this.viewed,\n validationError: computed(() => this.errorMessage()),\n });\n /** Shared reactive form policy consumed by template-facing state below. */\n readonly connectorState = this.#formConnector.state;\n readonly isReadonly = computed(() => this.connectorState().readonly);\n readonly visibleErrorMessage = computed(() => this.connectorState().validationError);\n\n // Tri-state `viewed` — shared primitive. Input has NO panel; in `'inline'` the input is rendered\n // borderless/transparent (looks like text), always editable — clicking/focusing it edits directly.\n readonly #viewedState = sdViewedInline(\n computed(() => this.connectorState().viewed),\n () => this.#focusActiveInput(),\n this.disabled\n );\n /** `true` when `viewed === 'inline'`. */\n readonly isInline = this.#viewedState.isInline;\n /** `true` when `viewed === true` (static view, no input). */\n readonly isViewed = this.#viewedState.isViewed;\n /** Focus the inline input. No-op unless `viewed='inline'`. */\n enterInlineEdit = (): void => this.#viewedState.enterInlineEdit();\n\n constructor() {\n effect(() => {\n const val = this.valueModel();\n const adapter = this.maskAdapter();\n untracked(() => {\n if (this.formControl.value !== val) {\n this.formControl.setValue(val, { emitEvent: false });\n }\n if (adapter) {\n const rawValue = val == null ? '' : String(val);\n const result = this.#pendingMaskResult?.raw === rawValue ? this.#pendingMaskResult : adapter.format(rawValue);\n this.#pendingMaskResult = undefined;\n this.maskStatus.set(result.status);\n if (this.displayControl.value !== result.display) {\n this.displayControl.setValue(result.display, { emitEvent: false });\n }\n } else {\n this.maskStatus.set('empty');\n }\n });\n });\n\n effect(() => {\n const masked = !!this.maskAdapter();\n const disabled = this.disabled();\n untracked(() => {\n if (masked && disabled) this.displayControl.disable({ emitEvent: false });\n else this.displayControl.enable({ emitEvent: false });\n });\n });\n }\n\n ngOnInit() {\n this.#subscription.add(\n this.formControl.sdChanges.subscribe(() => {\n this.#ref.markForCheck();\n })\n );\n }\n\n ngAfterViewInit() {\n this.#subscription.add(this.formControl.valueChanges.subscribe(this.#onChange));\n this.#subscription.add(this.displayControl.valueChanges.subscribe(value => this.#onMaskedDisplayChange(value)));\n\n this.#ref.detectChanges();\n }\n\n ngOnDestroy() {\n this.#subscription.unsubscribe();\n }\n\n reValidate = () => {\n this.formControl.updateValueAndValidity();\n };\n\n getCurrentLength = (): number => {\n return (this.formControl.value ?? '').toString().length;\n };\n\n isMaxlengthExceeded = (): boolean => {\n const max = this.maxlength();\n return !!(max && max > 0 && this.getCurrentLength() > max);\n };\n\n #onChange = () => {\n const value = this.formControl.value ?? '';\n\n this.valueModel.set(value);\n this.sdChange.emit(value);\n };\n\n #onMaskedDisplayChange(value: unknown): void {\n const adapter = this.maskAdapter();\n if (!adapter || this.#isComposing) return;\n\n const nativeInput = this.control()?.nativeElement;\n const display = value == null ? '' : String(value);\n const result = adapter.parse(display, nativeInput?.selectionStart, nativeInput?.selectionEnd);\n this.#applyMaskResult(result);\n }\n\n #applyMaskResult(result: SdInputMaskResult): void {\n this.maskStatus.set(result.status);\n if (this.displayControl.value !== result.display) {\n this.displayControl.setValue(result.display, { emitEvent: false });\n }\n if (this.formControl.value !== result.raw) {\n this.#pendingMaskResult = this.valueModel() === result.raw ? undefined : result;\n this.formControl.setValue(result.raw);\n } else {\n this.#pendingMaskResult = undefined;\n this.formControl.updateValueAndValidity({ emitEvent: false });\n }\n\n queueMicrotask(() => {\n const nativeInput = this.control()?.nativeElement;\n if (nativeInput) {\n nativeInput.setSelectionRange(result.selectionStart, result.selectionEnd);\n }\n });\n }\n\n onCompositionStart(): void {\n if (this.maskAdapter()) this.#isComposing = true;\n }\n\n onCompositionEnd(event: CompositionEvent): void {\n const adapter = this.maskAdapter();\n if (!adapter) return;\n this.#isComposing = false;\n const target = event.target as HTMLInputElement | null;\n const display = target?.value ?? String(this.displayControl.value ?? '');\n this.#applyMaskResult(adapter.parse(display, target?.selectionStart, target?.selectionEnd));\n }\n\n // why: dựa trên valueModel() (signal model-input) thay vì formControl.value —\n // khi bị wrap (vd <sd-input-color>) effect set formControl chạy SAU lúc template\n // eval nên formControl.value chưa kịp có; valueModel() thì có ngay. Method (không\n // computed) để re-eval mỗi CD. clearable là opt-in; required không được clear;\n // disabled/readonly ẩn nút.\n showClear = (): boolean => {\n if (!this.clearable() || this.required() || this.disabled() || this.readonly()) return false;\n return !sdIsEmpty(this.valueModel());\n };\n\n clear = ($event?: Event) => {\n $event?.stopPropagation();\n if (sdIsEmpty(this.valueModel()) && sdIsEmpty(this.formControl.value)) return;\n // why: clear là thao tác chủ động → model về null (không phải '' hay undefined).\n // undefined chỉ dành cho trạng thái pristine chưa từng nhập.\n this.formControl.setValue(null, { emitEvent: false });\n this.displayControl.setValue('', { emitEvent: false });\n this.maskStatus.set('empty');\n this.valueModel.set(null);\n this.sdChange.emit(null);\n this.cleared.emit();\n };\n\n onKeyupEnter = () => {\n const val: string = (this.formControl.value ?? '').toString();\n if (!this.maskAdapter() && val.length > val.trim().length) {\n this.formControl.setValue(val.trim());\n }\n this.keyupEnter.emit(this.formControl.value);\n if (this.blurOnEnter()) {\n this.blur();\n }\n };\n\n onFocus = () => {\n this.isFocused = true;\n this.sdFocus.emit(); // Gọi .emit() y hệt như cũ\n\n if (this.sdFocusForceBlur.observed) {\n this.blur();\n this.sdFocusForceBlur.emit();\n }\n };\n\n onBlur = () => {\n this.isFocused = false;\n const val: string = (this.formControl.value ?? '').toString();\n if (!this.maskAdapter() && val.length > val.trim().length) {\n this.formControl.setValue(val.trim());\n }\n this.sdBlur.emit(this.formControl.value);\n };\n\n onClick = () => {\n // 🚨 GỌI SIGNAL: Phải thêm () vào sdViewDef\n if (this.sdViewDef()?.templateRef) {\n if (!this.formControl.disabled && !this.isFocused) {\n this.focus();\n }\n }\n };\n\n blur = () => {\n this.isFocused = false;\n const inline = this.inlineRef();\n if (inline) inline.blur();\n else this.control()?.nativeElement?.blur();\n };\n\n focus = () => {\n this.isFocused = true;\n setTimeout(() => {\n this.#focusActiveInput();\n }, 100);\n };\n}\n","@let _label = label();\n@let _appearance = appearance();\n@let _hideInlineError = hideInlineError();\n@let _helperText = helperText();\n@let _maxLength = maxlength();\n@let _errorMessage = visibleErrorMessage();\n@let _required = required();\n@let _isInline = isInline();\n\n@if (isViewed()) {\n <sd-view\n [label]=\"_label\"\n [labelTemplate]=\"sdLabelTemplate()\"\n [value]=\"formControl.value\"\n [display]=\"displayValue()\"\n [hyperlink]=\"hyperlink()\"\n [valueTemplate]=\"viewTemplate()\">\n </sd-view>\n} @else if (_isInline) {\n <sd-inline-text\n [control]=\"activeControl()\"\n [placeholder]=\"placeholder() || _label || ''\"\n [clearable]=\"clearable() && !_required\"\n [autoId]=\"autoId()\"\n [state]=\"connectorState().invalid ? 'error' : 'auto'\"\n (sdFocus)=\"onFocus()\"\n (sdBlur)=\"onBlur()\"\n (keyupEnter)=\"onKeyupEnter()\"\n (cleared)=\"cleared.emit()\">\n </sd-inline-text>\n} @else {\n @if (!_appearance) {\n <ng-content select=\"[sdLabel]\">\n @if (_label) {\n <sd-label [label]=\"_label\" [required]=\"_required\"></sd-label>\n }\n </ng-content>\n }\n\n <div\n class=\"d-flex align-items-center sd-input-container\"\n [class.c-focused]=\"isFocused\"\n [class.c-disabled]=\"formControl.disabled\"\n (click)=\"onClick()\"\n aria-hidden=\"true\">\n <div class=\"sd-input-field-wrap\">\n <mat-form-field\n [class.sd-md]=\"size() === 'md'\"\n [class.sd-sm]=\"size() === 'sm'\"\n [class.hide-inline-error]=\"_hideInlineError\"\n [appearance]=\"_appearance!\"\n [floatLabel]=\"floatLabel()\">\n @if (_appearance && _label) {\n <mat-label class=\"sd-form-field-label\">\n <span>{{ _label }}</span>\n @if (_helperText) {\n <sd-icon [matTooltip]=\"_helperText\" matTooltipPosition=\"below\" name=\"info\"></sd-icon>\n }\n </mat-label>\n }\n\n <input\n aria-hidden=\"true\"\n [id]=\"id\"\n [formControl]=\"activeControl()\"\n [type]=\"effectiveType()\"\n #control\n matInput\n [placeholder]=\"placeholder() || _label || ''\"\n (keyup.enter)=\"onKeyupEnter()\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n [required]=\"_required\"\n [readonly]=\"isReadonly()\"\n [autocomplete]=\"id\"\n autocorrect=\"off\"\n [step]=\"1\"\n [attr.inputmode]=\"inputMode()\"\n [attr.maxlength]=\"maxDisplayLength()\"\n [attr.data-autoId]=\"autoId()\"\n [attr.data-disabled]=\"dataDisabled()\"\n [attr.data-invalid]=\"dataInvalid()\"\n [attr.data-empty]=\"dataEmpty()\"\n [attr.data-value]=\"dataValue()\"\n [attr.data-required]=\"dataRequired()\"\n [attr.data-maxlength]=\"dataMaxLength()\"\n [attr.data-minlength]=\"dataMinLength()\"\n [attr.data-pattern]=\"dataPattern()\"\n [attr.data-error-message]=\"dataErrorMessage()\"\n (compositionstart)=\"onCompositionStart()\"\n (compositionend)=\"onCompositionEnd($event)\" />\n\n @if (!_hideInlineError && _errorMessage) {\n <mat-error>{{ _errorMessage }}</mat-error>\n }\n\n <!-- why: nút clear render TRƯỚC error icon. Clear hover-gated (visibility:hidden) vẫn\n chiếm chỗ trong layout → nếu đứng sau sẽ đẩy error icon \"tụt vào trong\". Đứng trước\n thì error icon nằm sát mép phải, clear giữ slot vô hình bên trái. -->\n @if (showClear()) {\n <button type=\"button\" class=\"sd-clear-btn sd-hover\" matSuffix (click)=\"clear($event)\" title=\"Xóa\" aria-label=\"Xóa\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n }\n\n @if (_hideInlineError && _errorMessage) {\n <sd-icon matSuffix class=\"sd-error-icon\" [matTooltip]=\"_errorMessage\" matTooltipPosition=\"above\" name=\"error\"></sd-icon>\n }\n\n @if (sdSuffixDef()?.templateRef; as suffixRef) {\n <ng-container matSuffix>\n <ng-container *ngTemplateOutlet=\"suffixRef\"></ng-container>\n </ng-container>\n }\n <!-- <ng-container matSuffix>\n <ng-content select=\"[sdSuffix]\"></ng-content>\n </ng-container> -->\n </mat-form-field>\n\n @if (_maxLength && !_hideInlineError && !formControl.disabled) {\n <div\n class=\"sd-maxlength-counter\"\n [class.sd-maxlength-counter--visible]=\"isFocused\"\n [class.sd-maxlength-counter--exceeded]=\"isMaxlengthExceeded()\"\n [attr.title]=\"isMaxlengthExceeded() ? ('core.form.input.exceeded' | translate) : null\">\n {{ getCurrentLength() }}/{{ _maxLength }}\n </div>\n }\n </div>\n </div>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["ɵsdFormControlConnector"],"mappings":"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"}
1
+ {"version":3,"file":"sdcorejs-angular-forms-input.mjs","sources":["../../../projects/sdcorejs-angular/forms/input/src/input-mask.ts","../../../projects/sdcorejs-angular/forms/input/src/input.component.ts","../../../projects/sdcorejs-angular/forms/input/src/input.component.html","../../../projects/sdcorejs-angular/forms/input/sdcorejs-angular-forms-input.ts"],"sourcesContent":["export type SdInputMaskStatus = 'empty' | 'incomplete' | 'valid' | 'invalid';\n\nexport type SdInputMaskInputMode = 'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url';\n\nexport interface SdInputMaskResult {\n readonly raw: string;\n readonly display: string;\n readonly status: SdInputMaskStatus;\n readonly selectionStart: number;\n readonly selectionEnd: number;\n}\n\nexport interface SdInputMaskAdapter {\n readonly inputMode?: SdInputMaskInputMode;\n readonly maxDisplayLength?: number;\n format(raw: string | null | undefined): SdInputMaskResult;\n parse(display: string, selectionStart?: number | null, selectionEnd?: number | null): SdInputMaskResult;\n}\n\nexport interface SdInputMaskToken {\n readonly pattern: RegExp;\n readonly optional?: boolean;\n readonly transform?: (value: string) => string;\n}\n\nexport interface SdCreateInputMaskOptions {\n readonly tokens?: Readonly<Record<string, SdInputMaskToken>>;\n readonly inputMode?: SdInputMaskInputMode;\n}\n\ninterface MaskSlot {\n readonly unitIndex: number;\n readonly slotIndex: number;\n readonly token: SdInputMaskToken;\n}\n\ninterface MaskLiteral {\n readonly unitIndex: number;\n readonly value: string;\n}\n\ninterface AssignedSlot {\n readonly slotIndex: number;\n readonly unitIndex: number;\n readonly value: string;\n readonly sourceIndex: number;\n}\n\nconst DEFAULT_TOKENS: Readonly<Record<string, SdInputMaskToken>> = {\n '#': { pattern: /[0-9]/ },\n '9': { pattern: /[0-9]/, optional: true },\n A: { pattern: /[A-Za-z]/ },\n a: { pattern: /[A-Za-z]/, optional: true },\n '*': { pattern: /[A-Za-z0-9]/ },\n '?': { pattern: /[A-Za-z0-9]/, optional: true },\n};\n\nfunction tokenAccepts(token: SdInputMaskToken, value: string): boolean {\n token.pattern.lastIndex = 0;\n const accepted = token.pattern.test(value);\n token.pattern.lastIndex = 0;\n return accepted;\n}\n\n/**\n * Creates a dependency-free slot mask.\n *\n * Default tokens: `#` required digit, `9` optional digit, `A`/`a` required/optional\n * letter, and `*`/`?` required/optional alphanumeric. Every other character is a\n * display literal and never leaks into the raw model.\n */\nexport function sdCreateInputMask(pattern: string, options: SdCreateInputMaskOptions = {}): SdInputMaskAdapter {\n if (!pattern) throw new Error('Input mask pattern must not be empty.');\n\n const tokens = { ...DEFAULT_TOKENS, ...options.tokens };\n const slots: MaskSlot[] = [];\n const literals: MaskLiteral[] = [];\n const units = Array.from(pattern, (value, unitIndex) => {\n const token = tokens[value];\n if (token) {\n const slot = { unitIndex, slotIndex: slots.length, token } satisfies MaskSlot;\n slots.push(slot);\n return slot;\n }\n const literal = { unitIndex, value } satisfies MaskLiteral;\n literals.push(literal);\n return literal;\n });\n if (slots.length === 0) throw new Error('Input mask pattern must contain at least one token.');\n\n const literalValues = new Set(literals.map(item => item.value));\n\n const convert = (\n source: string,\n sourceSelectionStart: number,\n sourceSelectionEnd: number,\n sourceIsDisplay: boolean\n ): SdInputMaskResult => {\n const assigned: AssignedSlot[] = [];\n let unitCursor = 0;\n let invalid = false;\n\n for (let sourceIndex = 0; sourceIndex < source.length; sourceIndex += 1) {\n const value = source[sourceIndex];\n let consumed = false;\n\n // why: literals are consumed at the pattern cursor, not filtered globally;\n // a global filter would corrupt raw digits in masks with prefixes such as `+84`.\n while (unitCursor < units.length) {\n const unit = units[unitCursor];\n\n if ('value' in unit) {\n unitCursor += 1;\n if (sourceIsDisplay && value === unit.value) {\n consumed = true;\n break;\n }\n continue;\n }\n\n if (tokenAccepts(unit.token, value)) {\n assigned.push({\n slotIndex: unit.slotIndex,\n unitIndex: unit.unitIndex,\n value: unit.token.transform?.(value) ?? value,\n sourceIndex,\n });\n unitCursor += 1;\n consumed = true;\n break;\n }\n\n if (sourceIsDisplay && literalValues.has(value)) {\n consumed = true;\n break;\n }\n\n if (unit.token.optional) {\n unitCursor += 1;\n continue;\n }\n\n invalid = true;\n consumed = true;\n break;\n }\n\n if (!consumed) invalid = true;\n }\n\n const assignedByUnit = new Map(assigned.map(item => [item.unitIndex, item] as const));\n const lastFilledUnit = assigned.at(-1)?.unitIndex ?? -1;\n let display = '';\n let acceptedCount = 0;\n const displayPositionByAcceptedCount = new Map<number, number>([[0, 0]]);\n\n for (const unit of units) {\n if ('token' in unit) {\n const item = assignedByUnit.get(unit.unitIndex);\n if (!item) continue;\n display += item.value;\n acceptedCount += 1;\n displayPositionByAcceptedCount.set(acceptedCount, display.length);\n } else if (unit.unitIndex < lastFilledUnit) {\n display += unit.value;\n }\n }\n\n const raw = assigned.map(item => item.value).join('');\n const hasEveryRequiredSlot = slots.every((slot, index) => slot.token.optional || assigned.some(item => item.slotIndex === index));\n const status: SdInputMaskStatus = invalid ? 'invalid' : raw.length === 0 ? 'empty' : hasEveryRequiredSlot ? 'valid' : 'incomplete';\n\n const acceptedBefore = (position: number): number => assigned.filter(item => item.sourceIndex < Math.max(0, position)).length;\n const mapSelection = (position: number): number => {\n const count = acceptedBefore(position);\n return displayPositionByAcceptedCount.get(count) ?? display.length;\n };\n\n return {\n raw,\n display,\n status,\n selectionStart: mapSelection(sourceSelectionStart),\n selectionEnd: mapSelection(sourceSelectionEnd),\n };\n };\n\n return {\n inputMode: options.inputMode ?? (slots.every(slot => tokenAccepts(slot.token, '0')) ? 'numeric' : 'text'),\n maxDisplayLength: pattern.length,\n format: raw => {\n const source = raw == null ? '' : String(raw);\n return convert(source, source.length, source.length, false);\n },\n parse: (display, selectionStart = display.length, selectionEnd = selectionStart) =>\n convert(display, selectionStart ?? display.length, selectionEnd ?? selectionStart ?? display.length, true),\n };\n}\n\n/** Common business masks. Models remain raw strings; separators are display-only. */\nexport const SD_INPUT_MASKS = {\n VN_PHONE: sdCreateInputMask('#### ### ###', { inputMode: 'tel' }),\n VN_ID: sdCreateInputMask('#### #### ####', { inputMode: 'numeric' }),\n VN_TAX_CODE: sdCreateInputMask('##########-999', { inputMode: 'numeric' }),\n BANK_ACCOUNT: sdCreateInputMask('######99999999999999', { inputMode: 'numeric' }),\n BUSINESS_CODE: sdCreateInputMask('****-????????????', { inputMode: 'text' }),\n} as const satisfies Readonly<Record<string, SdInputMaskAdapter>>;\n\nexport type SdInputMaskPreset = keyof typeof SD_INPUT_MASKS;\nexport type SdInputMask = SdInputMaskAdapter | SdInputMaskPreset;\n\nexport function sdResolveInputMask(mask: SdInputMask | null | undefined): SdInputMaskAdapter | undefined {\n if (!mask) return undefined;\n return typeof mask === 'string' ? SD_INPUT_MASKS[mask] : mask;\n}\n","import { CommonModule } from '@angular/common';\nimport {\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n computed,\n contentChild,\n effect,\n ElementRef,\n EventEmitter,\n inject,\n input,\n model,\n OnDestroy,\n OnInit,\n Output,\n output,\n signal,\n TemplateRef,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { AsyncValidatorFn, FormGroup, FormsModule, NgForm, ReactiveFormsModule, ValidatorFn, Validators } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { FloatLabelType, MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { SdView } from '@sdcorejs/angular/components/view';\nimport { SdInlineText } from '@sdcorejs/angular/forms/inline-text';\nimport { SdSuffixDefDirective, SdViewDefDirective } from '@sdcorejs/angular/forms/directives';\nimport { SdLabel } from '@sdcorejs/angular/forms/label';\nimport {\n HandleSdCustomValidator,\n SD_FORM_CONFIGURATION,\n SdCustomValidator,\n SdFormControl,\n sdFormControlState,\n SdInlineErrorValidator,\n SdViewed,\n SdViewedInput,\n sdViewedInline,\n sdViewedTransform,\n ɵsdFormControlConnector,\n ɵsdTimerScope,\n} from '@sdcorejs/angular/forms/models';\nimport { sdSerializeDataValue, sdIsEmpty } from '@sdcorejs/angular/utilities/data-state';\nimport { I18nService, SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { Size } from '@sdcorejs/utils/models';\nimport type { ValidationPatternType } from '@sdcorejs/utils/models';\nimport { VALIDATION_PATTERNS } from '@sdcorejs/utils/constants';\n\n// Back-compat: SdPatternType cũ → ValidationPatternType mới.\n// 3 key đã đổi tên trong @sdcorejs/utils v1.x.\nconst LEGACY_PATTERN_ALIAS: Record<string, ValidationPatternType> = {\n PHONE_VN: 'VN_PHONE',\n IDVN: 'VN_ID',\n IDVN_OR_PASSPORT: 'VN_ID_OR_PASSPORT',\n};\nimport { Subscription } from 'rxjs';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\nimport { SdInputMask, SdInputMaskResult, SdInputMaskStatus, sdResolveInputMask } from './input-mask';\n\n@Component({\n selector: 'sd-input',\n templateUrl: './input.component.html',\n styleUrl: './input.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n host: { '[class.sd-has-label]': '!!label()', '[class.sd-viewed]': 'isViewed() || isInline()' },\n imports: [\n SdIcon,\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatTooltipModule,\n MatButtonModule,\n SdLabel,\n SdView,\n SdInlineText,\n SdTranslatePipe,\n ],\n})\nexport class SdInput implements OnDestroy, OnInit, AfterViewInit {\n id = `I${Utilities.generateUuid()}`;\n /** why: id ổn định của <mat-error> để `<input>` trỏ `aria-describedby` sang — thông báo lỗi\n * phải đọc được từ chính control, không chỉ hiện ra màn hình. */\n readonly errorId = `${this.id}-error`;\n\n // ==========================================\n // 1. SIGNAL QUERIES (Thay thế @ViewChild / @ContentChild)\n // ==========================================\n control = viewChild<ElementRef<HTMLInputElement>>('control');\n /** The inline primitive — only present when `viewed='inline'`; drives focus/blur in that mode. */\n inlineRef = viewChild(SdInlineText);\n sdLabelTemplate = contentChild<TemplateRef<any>>('sdLabel');\n sdValueTemplate = contentChild<TemplateRef<any>>('sdValue');\n sdSuffixDef = contentChild(SdSuffixDefDirective);\n sdViewDef = contentChild(SdViewDefDirective);\n\n // ==========================================\n // 2. SIGNAL INPUTS & MODEL\n // ==========================================\n autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\n autoId = computed(() => (this.autoIdInput() ? `forms-input-${this.autoIdInput()}` : undefined));\n\n readonly #state = sdFormControlState(computed(() => this.formControl));\n readonly dataDisabled = computed(() => (this.#state().disabled ? 'true' : 'false'));\n readonly dataInvalid = computed(() => (this.#state().invalid ? 'true' : 'false'));\n readonly dataEmpty = computed(() => (sdIsEmpty(this.#state().value) ? 'true' : 'false'));\n readonly dataValue = computed<string | null>(() => {\n if (this.type() === 'password') return null;\n return sdSerializeDataValue(this.#state().value);\n });\n\n readonly dataRequired = computed(() => (this.required() ? 'true' : 'false'));\n readonly dataMaxLength = computed(() => {\n const v = this.maxlength();\n return v == null ? null : String(v);\n });\n readonly dataMinLength = computed(() => {\n const v = this.minlength();\n return v == null ? null : String(v);\n });\n readonly dataPattern = computed(() => {\n const v = this.pattern();\n return v == null || v === '' ? null : String(v);\n });\n readonly dataErrorMessage = computed(() => {\n void this.#state();\n const msg = this.errorMessage();\n return msg && msg.length > 0 ? msg : null;\n });\n\n name = input<string>(Utilities.generateUuid());\n\n // ==========================================\n // 3. INJECT (Thay thế Constructor DI)\n // ==========================================\n #ref = inject(ChangeDetectorRef);\n #formConfig = inject(SD_FORM_CONFIGURATION, { optional: true });\n readonly #i18n = inject(I18nService);\n // why: focus bị hoãn 100ms; handle phải bị clear khi destroy, nếu không timer vẫn chạy\n // trên view đã tháo (đổi route nhanh là đủ tái hiện).\n readonly #timers = ɵsdTimerScope();\n\n appearanceInput = input<MatFormFieldAppearance | undefined>(undefined, { alias: 'appearance' });\n appearance = computed(() => this.appearanceInput() ?? this.#formConfig?.appearance ?? 'outline');\n\n floatLabel = input<FloatLabelType>('auto');\n\n size = input<Size>('md');\n // Ghi (TransformT): any (để không bị lỗi typing khi cha truyền vào)\n form = input<FormGroup | undefined, any>(undefined, {\n transform: (val: any): FormGroup | undefined => {\n if (!val) return undefined;\n // Nếu cha truyền vào NgForm (template-driven) -> Bóc lấy FormGroup bên trong\n if (val instanceof NgForm) return val.form;\n // Nếu cha truyền sẵn FormGroup (reactive) -> Lấy luôn\n if (val instanceof FormGroup) return val;\n // Fallback an toàn phòng trường hợp cha truyền 1 object chứa form\n if (val?.form instanceof FormGroup) return val.form;\n return undefined;\n },\n });\n label = input<string | undefined>();\n helperText = input<string | undefined>();\n placeholder = input<string | undefined>();\n type = input<'text' | 'number' | 'password' | 'email'>('text');\n mask = input<SdInputMask | null | undefined>();\n readonly maskAdapter = computed(() => sdResolveInputMask(this.mask()));\n readonly effectiveType = computed(() => (this.maskAdapter() ? 'text' : this.type()));\n readonly inputMode = computed(() => this.maskAdapter()?.inputMode);\n readonly maxDisplayLength = computed(() => this.maskAdapter()?.maxDisplayLength);\n\n hideInlineError = input(false, { transform: booleanAttribute });\n blurOnEnter = input(false, { transform: booleanAttribute });\n /** Whether to show the value-gated clear button in edit and inline modes. */\n clearable = input(false, { transform: booleanAttribute });\n required = input(false, { transform: booleanAttribute });\n readonly = input(false, { transform: booleanAttribute });\n disabled = input(false, { transform: booleanAttribute });\n /** Display mode: `false` edit · `true` static view · `'inline'` borderless inline-edit (no panel — the input IS the face). */\n viewed = input<SdViewed, SdViewedInput>(false, { transform: sdViewedTransform });\n\n /** Focus whichever input is live: the inline primitive in `'inline'` mode, else the mat input. */\n #focusActiveInput = (): void => {\n const inline = this.inlineRef();\n if (inline) inline.focus();\n else this.control()?.nativeElement?.focus();\n };\n /** View display template: `sdViewDef` overrides the projected `#sdValue` for the static view (unified). */\n readonly viewTemplate = computed<TemplateRef<any> | undefined>(() => this.sdViewDef()?.templateRef ?? this.sdValueTemplate());\n\n minlength = input<number | undefined, unknown>(undefined, { transform: v => (v == null ? undefined : Number(v)) });\n maxlength = input<number | undefined, unknown>(undefined, { transform: v => (v == null ? undefined : Number(v)) });\n\n pattern = input<ValidationPatternType | string | undefined | null>();\n patternErrorMessage = input<string | undefined | null>();\n\n // Bỏ qua nếu val không phải string (number/boolean/object truyền nhầm → tránh validator hỏng)\n #lookupPattern = (val: unknown) => {\n if (typeof val !== 'string') return undefined;\n const key = (LEGACY_PATTERN_ALIAS[val] ?? val) as ValidationPatternType;\n return VALIDATION_PATTERNS.find(e => e.type === key);\n };\n\n resolvedPattern = computed(() => {\n const val = this.pattern();\n if (typeof val !== 'string') return undefined;\n const patternObj = this.#lookupPattern(val);\n return patternObj ? patternObj.pattern : val;\n });\n\n resolvedPatternErrorMsg = computed(() => {\n // patternObj.errorMessage là i18n key (vd 'core.validator.email.error') → wrap qua i18n.t() để hiển thị string đã dịch\n const customMsg = this.patternErrorMessage();\n if (customMsg) return customMsg;\n const patternObj = this.#lookupPattern(this.pattern());\n return patternObj ? this.#i18n.t(patternObj.errorMessage) : undefined;\n });\n\n /**\n * First active error message for tooltip display when `hideInlineError = true`.\n * Re-runs only when `#state` ticks (value / status / touched change) — no longer\n * invoked on every change-detection cycle as a getter would be.\n */\n readonly errorMessage = computed<string | undefined>(() => {\n // Subscribe to form-state changes so the computed re-evaluates correctly.\n void this.#state();\n // why: `#state` KHÔNG đủ. Connector cài/gỡ validator bằng `updateValueAndValidity({\n // emitEvent: false })` → `formControl.errors` đổi mà không phát event nào → `#state` không\n // tick. Nên phải đọc VÔ ĐIỀU KIỆN cả `required` lẫn danh sách validator do component sở hữu\n // (`#validators` gói min/max/pattern/mask/inlineError, mảng mới mỗi lần đổi) làm dependency.\n // Không có 2 dòng này thì bật `[required]` lúc RUNTIME cho ra control invalid + viền đỏ nhưng\n // message giữ nguyên giá trị cũ dưới OnPush.\n void this.required();\n void this.#validators();\n const errors = this.formControl.errors;\n if (!errors) return undefined;\n\n if (errors['required']) return this.#i18n.t('core.form.input.required');\n if (errors['maxlength']) return this.#i18n.t('core.form.input.maxlength', { max: this.maxlength() ?? '' });\n if (errors['maskIncomplete']) return this.#i18n.t('core.form.input.mask-incomplete');\n if (errors['maskInvalid']) return this.#i18n.t('core.form.input.mask-invalid');\n if (errors['pattern']) return this.resolvedPatternErrorMsg() || this.#i18n.t('core.form.input.invalid-pattern');\n if (errors['customValidator']) return errors['customValidator'] as string;\n if (errors['inlineError']) return this.inlineError();\n return undefined;\n });\n\n validator = input<SdCustomValidator | undefined>();\n inlineError = input<string | undefined>();\n hyperlink = input<string | null | undefined>();\n\n valueModel = model<any>(undefined, { alias: 'model' });\n\n // ==========================================\n // 4. SIGNAL OUTPUTS (Thay thế @Output)\n // ==========================================\n sdChange = output<any>();\n sdFocus = output<void>(); // Đổi sang void vì không truyền data\n sdBlur = output<any>();\n keyupEnter = output<any>();\n // why: sdChange fire per-keystroke nên consumer KHÔNG dùng nó để trigger\n // \"commit filter\" (sẽ over-reload). `cleared` là intent rõ ràng cho action\n // X (clear button) — consumer như column-filter dùng để fire reload ngay.\n cleared = output<void>();\n\n // why: focus handling reads EventEmitter.observed before emitting a forced blur event.\n @Output() readonly sdFocusForceBlur = new EventEmitter<void>();\n\n formControl = new SdFormControl();\n /** Display-only control used by the input element while a mask is active. */\n readonly displayControl = new SdFormControl();\n readonly activeControl = computed(() => (this.maskAdapter() ? this.displayControl : this.formControl));\n readonly maskStatus = signal<SdInputMaskStatus>('empty');\n readonly displayValue = computed(() => {\n const adapter = this.maskAdapter();\n return adapter ? adapter.format(this.formControl.value == null ? '' : String(this.formControl.value)).display : this.formControl.value;\n });\n #subscription = new Subscription();\n #isComposing = false;\n #pendingMaskResult: SdInputMaskResult | undefined;\n isFocused = false;\n readonly #validators = computed<readonly ValidatorFn[]>(() => {\n const validators: ValidatorFn[] = [];\n const min = this.minlength();\n const max = this.maxlength();\n const pattern = this.resolvedPattern();\n\n if (min && min > 0) validators.push(Validators.minLength(min));\n if (max && max > 0) validators.push(Validators.maxLength(max));\n if (pattern) validators.push(Validators.pattern(pattern));\n if (this.maskAdapter()) {\n const maskStatus = this.maskStatus();\n validators.push(() => {\n if (maskStatus === 'invalid') return { maskInvalid: true };\n if (maskStatus === 'incomplete') return { maskIncomplete: true };\n return null;\n });\n }\n if (this.inlineError()) validators.push(SdInlineErrorValidator);\n return validators;\n });\n readonly #asyncValidators = computed<readonly AsyncValidatorFn[]>(() => {\n const validator = this.validator();\n return validator ? [HandleSdCustomValidator(validator)] : [];\n });\n readonly #formConnector = ɵsdFormControlConnector<unknown, unknown>({\n form: this.form,\n name: this.name,\n control: computed(() => this.formControl),\n validators: this.#validators,\n asyncValidators: this.#asyncValidators,\n required: this.required,\n disabled: this.disabled,\n readonly: this.readonly,\n viewed: this.viewed,\n validationError: computed(() => this.errorMessage()),\n });\n /** Shared reactive form policy consumed by template-facing state below. */\n readonly connectorState = this.#formConnector.state;\n readonly isReadonly = computed(() => this.connectorState().readonly);\n // why: KHÔNG lấy `connectorState().validationError`. Cổng hiển thị của connector là\n // `snapshot.invalid` — snapshot đó do sdFormControlState memo hoá và chỉ đổi khi control PHÁT\n // event. Connector lại cài validator im lặng (`emitEvent: false`), nên bật `[required]` lúc\n // runtime làm control invalid thật mà snapshot vẫn \"valid\" → message bị nuốt (viền đỏ, không\n // chữ). Đọc trực tiếp `formControl` cho trạng thái tươi, vẫn giữ nguyên luật interaction-gated\n // (chỉ hiện sau khi người dùng đã chạm/sửa) như connector.\n readonly visibleErrorMessage = computed(() => {\n const message = this.errorMessage();\n if (!message) return undefined;\n void this.#state();\n const control = this.formControl;\n return control.invalid && (control.touched || control.dirty) ? message : undefined;\n });\n\n // Tri-state `viewed` — shared primitive. Input has NO panel; in `'inline'` the input is rendered\n // borderless/transparent (looks like text), always editable — clicking/focusing it edits directly.\n readonly #viewedState = sdViewedInline(\n computed(() => this.connectorState().viewed),\n () => this.#focusActiveInput(),\n this.disabled\n );\n /** `true` when `viewed === 'inline'`. */\n readonly isInline = this.#viewedState.isInline;\n /** `true` when `viewed === true` (static view, no input). */\n readonly isViewed = this.#viewedState.isViewed;\n /** Focus the inline input. No-op unless `viewed='inline'`. */\n enterInlineEdit = (): void => this.#viewedState.enterInlineEdit();\n\n constructor() {\n effect(() => {\n const val = this.valueModel();\n const adapter = this.maskAdapter();\n untracked(() => {\n if (this.formControl.value !== val) {\n this.formControl.setValue(val, { emitEvent: false });\n }\n if (adapter) {\n const rawValue = val == null ? '' : String(val);\n const result = this.#pendingMaskResult?.raw === rawValue ? this.#pendingMaskResult : adapter.format(rawValue);\n this.#pendingMaskResult = undefined;\n this.maskStatus.set(result.status);\n if (this.displayControl.value !== result.display) {\n this.displayControl.setValue(result.display, { emitEvent: false });\n }\n } else {\n this.maskStatus.set('empty');\n }\n });\n });\n\n effect(() => {\n const masked = !!this.maskAdapter();\n const disabled = this.disabled();\n untracked(() => {\n if (masked && disabled) this.displayControl.disable({ emitEvent: false });\n else this.displayControl.enable({ emitEvent: false });\n });\n });\n }\n\n ngOnInit() {\n this.#subscription.add(\n this.formControl.sdChanges.subscribe(() => {\n this.#ref.markForCheck();\n })\n );\n }\n\n ngAfterViewInit() {\n this.#subscription.add(this.formControl.valueChanges.subscribe(this.#onChange));\n this.#subscription.add(this.displayControl.valueChanges.subscribe(value => this.#onMaskedDisplayChange(value)));\n\n this.#ref.detectChanges();\n }\n\n ngOnDestroy() {\n this.#subscription.unsubscribe();\n }\n\n reValidate = () => {\n this.formControl.updateValueAndValidity();\n };\n\n getCurrentLength = (): number => {\n return (this.formControl.value ?? '').toString().length;\n };\n\n isMaxlengthExceeded = (): boolean => {\n const max = this.maxlength();\n return !!(max && max > 0 && this.getCurrentLength() > max);\n };\n\n // why: clear() phải để formControl phát event (xem comment ở clear()), nhưng nó ĐÃ tự\n // set model + emit sdChange(null) rồi. Không chặn thì #onChange chạy thêm một vòng với\n // `null ?? ''` → consumer nhận thừa một sdChange('') trước sdChange(null) và model bị\n // nhảy '' → null. Cờ chỉ sống trong đúng lời gọi setValue đồng bộ của clear().\n #isClearing = false;\n\n #onChange = () => {\n if (this.#isClearing) return;\n const value = this.formControl.value ?? '';\n\n this.valueModel.set(value);\n this.sdChange.emit(value);\n };\n\n #onMaskedDisplayChange(value: unknown): void {\n const adapter = this.maskAdapter();\n if (!adapter || this.#isComposing) return;\n\n const nativeInput = this.control()?.nativeElement;\n const display = value == null ? '' : String(value);\n const result = adapter.parse(display, nativeInput?.selectionStart, nativeInput?.selectionEnd);\n this.#applyMaskResult(result);\n }\n\n #applyMaskResult(result: SdInputMaskResult): void {\n this.maskStatus.set(result.status);\n if (this.displayControl.value !== result.display) {\n this.displayControl.setValue(result.display, { emitEvent: false });\n }\n if (this.formControl.value !== result.raw) {\n this.#pendingMaskResult = this.valueModel() === result.raw ? undefined : result;\n this.formControl.setValue(result.raw);\n } else {\n this.#pendingMaskResult = undefined;\n this.formControl.updateValueAndValidity({ emitEvent: false });\n }\n\n queueMicrotask(() => {\n const nativeInput = this.control()?.nativeElement;\n if (nativeInput) {\n nativeInput.setSelectionRange(result.selectionStart, result.selectionEnd);\n }\n });\n }\n\n onCompositionStart(): void {\n if (this.maskAdapter()) this.#isComposing = true;\n }\n\n onCompositionEnd(event: CompositionEvent): void {\n const adapter = this.maskAdapter();\n if (!adapter) return;\n this.#isComposing = false;\n const target = event.target as HTMLInputElement | null;\n const display = target?.value ?? String(this.displayControl.value ?? '');\n this.#applyMaskResult(adapter.parse(display, target?.selectionStart, target?.selectionEnd));\n }\n\n // why: dựa trên valueModel() (signal model-input) thay vì formControl.value —\n // khi bị wrap (vd <sd-input-color>) effect set formControl chạy SAU lúc template\n // eval nên formControl.value chưa kịp có; valueModel() thì có ngay. Method (không\n // computed) để re-eval mỗi CD. clearable là opt-in; required không được clear;\n // disabled/readonly ẩn nút.\n showClear = (): boolean => {\n if (!this.clearable() || this.required() || this.disabled() || this.readonly()) return false;\n return !sdIsEmpty(this.valueModel());\n };\n\n clear = ($event?: Event) => {\n $event?.stopPropagation();\n if (sdIsEmpty(this.valueModel()) && sdIsEmpty(this.formControl.value)) return;\n // why: clear là thao tác chủ động → model về null (không phải '' hay undefined).\n // undefined chỉ dành cho trạng thái pristine chưa từng nhập.\n // why: KHÔNG dùng { emitEvent: false } cho formControl. Control này mang required /\n // pattern / mask validator và cả async validator ([validator] → HandleSdCustomValidator).\n // Chặn event thì AbstractControl.events không phát → #state (sdFormControlState) không\n // tick → errorMessage / dataEmpty / dataValue / visibleErrorMessage giữ nguyên giá trị\n // cũ → xoá xong field rỗng nhưng lỗi required KHÔNG hiện (chỉ còn viền đỏ). Đây đúng là\n // lỗi đã sửa ở #onChange của sd-input-number, chỉ sót nhánh clear().\n // displayControl thì VẪN giữ emitEvent:false — valueChanges của nó có subscriber\n // (#onMaskedDisplayChange) sẽ parse ngược và ghi đè lại formControl.\n this.#isClearing = true;\n try {\n this.formControl.setValue(null);\n } finally {\n this.#isClearing = false;\n }\n this.displayControl.setValue('', { emitEvent: false });\n this.maskStatus.set('empty');\n this.valueModel.set(null);\n this.sdChange.emit(null);\n this.cleared.emit();\n };\n\n onKeyupEnter = () => {\n const val: string = (this.formControl.value ?? '').toString();\n if (!this.maskAdapter() && val.length > val.trim().length) {\n this.formControl.setValue(val.trim());\n }\n this.keyupEnter.emit(this.formControl.value);\n if (this.blurOnEnter()) {\n this.blur();\n }\n };\n\n onFocus = () => {\n this.isFocused = true;\n this.sdFocus.emit(); // Gọi .emit() y hệt như cũ\n\n if (this.sdFocusForceBlur.observed) {\n this.blur();\n this.sdFocusForceBlur.emit();\n }\n };\n\n onBlur = () => {\n this.isFocused = false;\n const val: string = (this.formControl.value ?? '').toString();\n if (!this.maskAdapter() && val.length > val.trim().length) {\n this.formControl.setValue(val.trim());\n }\n this.sdBlur.emit(this.formControl.value);\n };\n\n onClick = () => {\n // 🚨 GỌI SIGNAL: Phải thêm () vào sdViewDef\n if (this.sdViewDef()?.templateRef) {\n if (!this.formControl.disabled && !this.isFocused) {\n this.focus();\n }\n }\n };\n\n blur = () => {\n this.isFocused = false;\n const inline = this.inlineRef();\n if (inline) inline.blur();\n else this.control()?.nativeElement?.blur();\n };\n\n focus = () => {\n this.isFocused = true;\n // why: vẫn 100ms như cũ (chờ Material dựng xong input mới focus) — chỉ khác là handle\n // được scope theo DestroyRef nên không còn chạy sau destroy.\n this.#timers.schedule(() => this.#focusActiveInput(), 100);\n };\n}\n","@let _label = label();\r\n@let _appearance = appearance();\r\n@let _hideInlineError = hideInlineError();\r\n@let _helperText = helperText();\r\n@let _maxLength = maxlength();\r\n@let _errorMessage = visibleErrorMessage();\r\n@let _required = required();\r\n@let _isInline = isInline();\r\n<!-- why: cùng MỘT cổng gate cho cả 3 thứ — hiện <mat-error>, bật aria-invalid, và trỏ\r\n aria-describedby. Trước đây message hiện mà control không hề báo invalid, nên screen\r\n reader đọc xong ô nhập vẫn không biết là đang lỗi. -->\r\n@let _showInlineError = !_hideInlineError && !!_errorMessage;\r\n\r\n@if (isViewed()) {\r\n <sd-view\r\n [label]=\"_label\"\r\n [labelTemplate]=\"sdLabelTemplate()\"\r\n [value]=\"formControl.value\"\r\n [display]=\"displayValue()\"\r\n [hyperlink]=\"hyperlink()\"\r\n [valueTemplate]=\"viewTemplate()\">\r\n </sd-view>\r\n} @else if (_isInline) {\r\n <!-- why: nhánh inline PHẢI project `sdSuffixDef` giống nhánh mat-form-field. Trước đây chỉ\r\n <sd-inline-text> được render, nên <sd-input-color viewed=\"'inline'\"> mất luôn swatch và\r\n <input type=\"color\"> ẩn — openPicker() gọi được nhưng không có element nào để click, tức\r\n là no-op câm. <sd-inline-text> là inline-flex tự hug nội dung nên chỉ cần một hàng flex. -->\r\n <div class=\"sd-input-inline\">\r\n <sd-inline-text\r\n [control]=\"activeControl()\"\r\n [placeholder]=\"placeholder() || _label || ''\"\r\n [clearable]=\"clearable() && !_required\"\r\n [autoId]=\"autoId()\"\r\n [state]=\"connectorState().invalid ? 'error' : 'auto'\"\r\n (sdFocus)=\"onFocus()\"\r\n (sdBlur)=\"onBlur()\"\r\n (keyupEnter)=\"onKeyupEnter()\"\r\n (cleared)=\"cleared.emit()\">\r\n </sd-inline-text>\r\n\r\n @if (sdSuffixDef()?.templateRef; as suffixRef) {\r\n <span class=\"sd-input-inline__suffix\">\r\n <ng-container *ngTemplateOutlet=\"suffixRef\"></ng-container>\r\n </span>\r\n }\r\n </div>\r\n} @else {\r\n @if (!_appearance) {\r\n <ng-content select=\"[sdLabel]\">\r\n @if (_label) {\r\n <sd-label [label]=\"_label\" [required]=\"_required\"></sd-label>\r\n }\r\n </ng-content>\r\n }\r\n\r\n <!-- why: div này CHỈ là hộp layout. Nó từng mang aria-hidden=\"true\" để dập cảnh báo lint —\r\n và aria-hidden ẩn CẢ cây con, nên label, <input>, <mat-error> lẫn nút clear biến mất\r\n khỏi accessibility tree cùng lúc. role=\"presentation\" chỉ vô hiệu hoá chính div (KHÔNG\r\n lan xuống con), còn (click) chỉ là tiện ích chuột: bàn phím Tab thẳng vào <input> và\r\n nhận đúng kết quả đó, nên không cần thêm key handler. -->\r\n <div\r\n class=\"d-flex align-items-center sd-input-container\"\r\n role=\"presentation\"\r\n [class.c-focused]=\"isFocused\"\r\n [class.c-disabled]=\"formControl.disabled\"\r\n (click)=\"onClick()\">\r\n <div class=\"sd-input-field-wrap\">\r\n <mat-form-field\r\n [class.sd-md]=\"size() === 'md'\"\r\n [class.sd-sm]=\"size() === 'sm'\"\r\n [class.hide-inline-error]=\"_hideInlineError\"\r\n [appearance]=\"_appearance!\"\r\n [floatLabel]=\"floatLabel()\">\r\n @if (_appearance && _label) {\r\n <mat-label class=\"sd-form-field-label\">\r\n <span>{{ _label }}</span>\r\n @if (_helperText) {\r\n <sd-icon [matTooltip]=\"_helperText\" matTooltipPosition=\"below\" name=\"info\"></sd-icon>\r\n }\r\n </mat-label>\r\n }\r\n\r\n <!-- why: BỎ aria-hidden trên chính <input>. Input vẫn focus được bằng Tab, nên\r\n aria-hidden khiến screen reader đọc ra… không gì cả — tệ hơn là không làm gì. -->\r\n <input\r\n [id]=\"id\"\r\n [formControl]=\"activeControl()\"\r\n [type]=\"effectiveType()\"\r\n #control\r\n matInput\r\n [placeholder]=\"placeholder() || _label || ''\"\r\n (keyup.enter)=\"onKeyupEnter()\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n [required]=\"_required\"\r\n [readonly]=\"isReadonly()\"\r\n [autocomplete]=\"id\"\r\n autocorrect=\"off\"\r\n [step]=\"1\"\r\n [attr.inputmode]=\"inputMode()\"\r\n [attr.maxlength]=\"maxDisplayLength()\"\r\n [attr.data-autoId]=\"autoId()\"\r\n [attr.data-disabled]=\"dataDisabled()\"\r\n [attr.data-invalid]=\"dataInvalid()\"\r\n [attr.data-empty]=\"dataEmpty()\"\r\n [attr.data-value]=\"dataValue()\"\r\n [attr.data-required]=\"dataRequired()\"\r\n [attr.data-maxlength]=\"dataMaxLength()\"\r\n [attr.data-minlength]=\"dataMinLength()\"\r\n [attr.data-pattern]=\"dataPattern()\"\r\n [attr.data-error-message]=\"dataErrorMessage()\"\r\n [attr.aria-invalid]=\"_errorMessage ? 'true' : null\"\r\n [attr.aria-describedby]=\"_errorMessage ? errorId : null\"\r\n (compositionstart)=\"onCompositionStart()\"\r\n (compositionend)=\"onCompositionEnd($event)\" />\r\n\r\n @if (_showInlineError) {\r\n <mat-error [id]=\"errorId\">{{ _errorMessage }}</mat-error>\r\n }\r\n\r\n <!-- why: nút clear render TRƯỚC error icon. Clear hover-gated (visibility:hidden) vẫn\r\n chiếm chỗ trong layout → nếu đứng sau sẽ đẩy error icon \"tụt vào trong\". Đứng trước\r\n thì error icon nằm sát mép phải, clear giữ slot vô hình bên trái. -->\r\n @if (showClear()) {\r\n <button type=\"button\" class=\"sd-clear-btn sd-hover\" matSuffix (click)=\"clear($event)\" title=\"Xóa\" aria-label=\"Xóa\">\r\n <sd-icon name=\"close\"></sd-icon>\r\n </button>\r\n }\r\n\r\n @if (_hideInlineError && _errorMessage) {\r\n <sd-icon matSuffix class=\"sd-error-icon\" [matTooltip]=\"_errorMessage\" matTooltipPosition=\"above\" name=\"error\"></sd-icon>\n }\r\n @if (_hideInlineError && _errorMessage) {\r\n <span class=\"sd-visually-hidden\" [id]=\"errorId\" matSuffix>{{ _errorMessage }}</span>\r\r\n }\r\n\r\n @if (sdSuffixDef()?.templateRef; as suffixRef) {\r\n <ng-container matSuffix>\r\n <ng-container *ngTemplateOutlet=\"suffixRef\"></ng-container>\r\n </ng-container>\r\n }\r\n <!-- <ng-container matSuffix>\r\n <ng-content select=\"[sdSuffix]\"></ng-content>\r\n </ng-container> -->\r\n </mat-form-field>\r\n\r\n @if (_maxLength && !_hideInlineError && !formControl.disabled) {\r\n <div\r\n class=\"sd-maxlength-counter\"\r\n [class.sd-maxlength-counter--visible]=\"isFocused\"\r\n [class.sd-maxlength-counter--exceeded]=\"isMaxlengthExceeded()\"\r\n [attr.title]=\"isMaxlengthExceeded() ? ('core.form.input.exceeded' | sdTranslate) : null\">\r\n {{ getCurrentLength() }}/{{ _maxLength }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["ɵsdTimerScope","ɵsdFormControlConnector"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, signal, inject, DestroyRef, effect, untracked, computed, booleanAttribute, Injectable } from '@angular/core';
2
+ import { InjectionToken, signal, inject, DestroyRef, effect, untracked, computed, booleanAttribute, isDevMode, Injectable } from '@angular/core';
3
3
  import { FormControl, NgForm, FormGroup, Validators } from '@angular/forms';
4
4
  import { Subject } from 'rxjs';
5
5
  import { startWith } from 'rxjs/operators';
@@ -163,6 +163,188 @@ function sdViewedInline(viewed, open, disabled) {
163
163
  return { isInline, isViewed, enterInlineEdit };
164
164
  }
165
165
 
166
+ /**
167
+ * why: một `Record` khoá bằng chính union — thêm literal mới vào `SdTemporalValueTransform` mà quên
168
+ * serializer là lỗi compile ngay tại đây, không phải một `switch` thiếu nhánh chạy im lặng ở runtime.
169
+ * Ba component chỉ gọi `sdSerializeTemporalValue`, nên không có bản sao logic nào rải rác.
170
+ */
171
+ const SD_TEMPORAL_TRANSFORM_STRATEGIES = {
172
+ ISOString: value => value.toISOString(),
173
+ UTCString: value => value.toUTCString(),
174
+ };
175
+ /** Every supported strategy, derived from the strategy map so the two can never drift. */
176
+ const SD_TEMPORAL_VALUE_TRANSFORMS = Object.keys(SD_TEMPORAL_TRANSFORM_STRATEGIES);
177
+ function sdIsTemporalValueTransform(value) {
178
+ return typeof value === 'string' && value in SD_TEMPORAL_TRANSFORM_STRATEGIES;
179
+ }
180
+ function isValidDate(value) {
181
+ return value instanceof Date && !Number.isNaN(value.getTime());
182
+ }
183
+ /**
184
+ * Serializes a committed value with the active strategy.
185
+ *
186
+ * Returns `null` for anything that is not a usable `Date`, so an invalid value can never reach a
187
+ * serializer and produce the string `"Invalid Date"`. Callers treat `null` as "keep the existing
188
+ * representation".
189
+ */
190
+ function sdSerializeTemporalValue(value, transform) {
191
+ if (!transform || !isValidDate(value))
192
+ return null;
193
+ return SD_TEMPORAL_TRANSFORM_STRATEGIES[transform](value);
194
+ }
195
+ /** Local midnight of the given day. Date-only controls serialize this instant, never the raw value. */
196
+ function sdLocalStartOfDay(value) {
197
+ return new Date(value.getFullYear(), value.getMonth(), value.getDate(), 0, 0, 0, 0);
198
+ }
199
+ // why: ISO 8601 với phần giờ tuỳ chọn. Nhánh date-only được tách riêng bên dưới vì
200
+ // `new Date('2026-08-15')` được JS hiểu là NỬA ĐÊM UTC — ở múi giờ âm nó lùi về ngày hôm trước,
201
+ // tức là chỉ render thôi đã đổi mất ngày trên lịch của người dùng.
202
+ const ISO_DATE_ONLY = /^(\d{4})-(\d{2})-(\d{2})$/;
203
+ const ISO_DATE_TIME = /^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:?\d{2})?$/;
204
+ // RFC 1123, đúng shape mà `Date.prototype.toUTCString()` phát ra: `Sat, 15 Aug 2026 03:20:30 GMT`.
205
+ const RFC_1123_UTC = /^[A-Za-z]{3},\s\d{1,2}\s[A-Za-z]{3}\s\d{4}\s\d{2}:\d{2}:\d{2}\sGMT$/;
206
+ /**
207
+ * Parses the wire formats these transforms emit, so a component can read back its own output.
208
+ *
209
+ * Deliberately narrow: only ISO 8601 and the RFC-1123 shape `toUTCString()` produces are accepted.
210
+ * Handing the whole job to `new Date(text)` would make every loosely date-shaped string parse
211
+ * differently per browser, and would swallow the legacy canonical formats the components already
212
+ * parse with their own strict parsers. Returns `null` when the text is not one of these.
213
+ */
214
+ function sdParseTransformedTemporal(value) {
215
+ if (typeof value !== 'string')
216
+ return null;
217
+ const text = value.trim();
218
+ if (!text)
219
+ return null;
220
+ const dateOnly = ISO_DATE_ONLY.exec(text);
221
+ if (dateOnly) {
222
+ const [, year, month, day] = dateOnly;
223
+ const parsed = new Date(Number(year), Number(month) - 1, Number(day), 0, 0, 0, 0);
224
+ return isValidDate(parsed) ? parsed : null;
225
+ }
226
+ if (!ISO_DATE_TIME.test(text) && !RFC_1123_UTC.test(text))
227
+ return null;
228
+ const parsed = new Date(text);
229
+ return isValidDate(parsed) ? parsed : null;
230
+ }
231
+
232
+ /**
233
+ * A second control that carries the **public model** so it can be registered in the parent form in
234
+ * place of the editor-facing control.
235
+ *
236
+ * why: `<sd-date>` and friends bind their control directly to the Material editor, so that control
237
+ * necessarily holds a `Date` or a display string. That is invisible until `transform` is set — at
238
+ * which point the consumer is told `form.get(name).value` equals `model`, and finding a raw `Date`
239
+ * there instead makes the promise false. Rather than reshaping the editor binding (which would
240
+ * change behaviour for every existing consumer), this mirrors the model into a control of its own
241
+ * and hands *that* one to the form.
242
+ *
243
+ * Both directions are wired, and neither can feed back on the other:
244
+ * - model changes are pushed in with `emitEvent: false`, so they raise no `valueChanges`;
245
+ * - a write that arrives on this control goes to `writeModel`, exactly like a write on the editor
246
+ * control would, so `modelChange` / `sdChange` still fire once.
247
+ *
248
+ * Validity, disabled and touched/dirty are mirrored from `source`, so registering this control does
249
+ * not quietly drop the editor's validators (min/max, parse errors, required) from the parent form.
250
+ *
251
+ * Must be called from an injection context.
252
+ */
253
+ function ɵsdModelFacingControl(options) {
254
+ const control = new SdFormControl();
255
+ const modelEquals = options.modelEquals ?? Object.is;
256
+ const sourceState = sdFormControlState(options.source);
257
+ // Model → control. `emitEvent: false` is what keeps a user commit from bouncing back as a second
258
+ // `modelChange`; the value is already the committed one by the time it lands here.
259
+ effect(() => {
260
+ const value = options.model();
261
+ untracked(() => {
262
+ if (!modelEquals(control.value, value)) {
263
+ control.setValue(value, { emitEvent: false });
264
+ }
265
+ });
266
+ });
267
+ // Control → model, for writes the consumer makes through the registered control.
268
+ effect(onCleanup => {
269
+ const subscription = control.valueChanges.subscribe(value => {
270
+ if (!modelEquals(options.model(), value))
271
+ options.writeModel(value);
272
+ });
273
+ onCleanup(() => subscription.unsubscribe());
274
+ });
275
+ // why: control này KHÔNG mang validator nào của riêng nó — nó chỉ phản chiếu. Nếu không copy
276
+ // `errors` sang, đăng ký nó vào form cha sẽ làm `form.valid` bỏ qua required/min/max/parse của
277
+ // editor, tức là form submit được trong khi field đang đỏ.
278
+ effect(() => {
279
+ const snapshot = sourceState();
280
+ const source = options.source();
281
+ untracked(() => {
282
+ const errors = source.errors;
283
+ const currentErrors = control.errors;
284
+ const changed = JSON.stringify(errors ?? null) !== JSON.stringify(currentErrors ?? null);
285
+ if (changed)
286
+ control.setErrors(errors, { emitEvent: false });
287
+ if (snapshot.disabled !== control.disabled) {
288
+ if (snapshot.disabled)
289
+ control.disable({ emitEvent: false });
290
+ else
291
+ control.enable({ emitEvent: false });
292
+ }
293
+ if (source.touched && !control.touched)
294
+ control.markAsTouched({ emitEvent: false });
295
+ if (!source.touched && control.touched)
296
+ control.markAsUntouched({ emitEvent: false });
297
+ if (source.dirty && !control.dirty)
298
+ control.markAsDirty({ onlySelf: true });
299
+ if (!source.dirty && control.dirty)
300
+ control.markAsPristine({ emitEvent: false });
301
+ });
302
+ });
303
+ return { control, registered: computed(() => (options.active() ? control : null)) };
304
+ }
305
+
306
+ /**
307
+ * @internal Creates a destroy-scoped timer bag. MUST be called from an injection context
308
+ * (class field initializer or constructor) because it resolves `DestroyRef`.
309
+ *
310
+ * why: gần như mọi form control đều hoãn focus / mở panel bằng `setTimeout(..., 100)` để chờ
311
+ * Material dựng xong DOM. Handle không được giữ lại nên callback vẫn chạy sau khi host view đã
312
+ * destroy — route đổi nhanh hoặc chip bị gỡ giữa lúc focus là đủ để `detectChanges()` ném
313
+ * `ViewDestroyedError`, hoặc để một output bắn ra sau khi consumer đã unsubscribe. Gom vào một
314
+ * scope duy nhất để nơi dùng chỉ cần đổi `setTimeout(fn, ms)` → `#timers.schedule(fn, ms)`,
315
+ * KHÔNG đổi độ trễ (đây là fix vòng đời, không phải fix hành vi).
316
+ */
317
+ function ɵsdTimerScope() {
318
+ const handles = new Set();
319
+ let destroyed = false;
320
+ const clear = () => {
321
+ handles.forEach(handle => clearTimeout(handle));
322
+ handles.clear();
323
+ };
324
+ inject(DestroyRef).onDestroy(() => {
325
+ destroyed = true;
326
+ clear();
327
+ });
328
+ return {
329
+ schedule(handler, delayMs = 0) {
330
+ if (destroyed)
331
+ return;
332
+ // why: `handles.delete` chạy TRƯỚC handler — handler có thể tự schedule tiếp, xoá sau
333
+ // sẽ vứt nhầm handle mới nếu runtime tái sử dụng id (Node trả object nên an toàn, browser
334
+ // trả number thì không).
335
+ const handle = setTimeout(() => {
336
+ handles.delete(handle);
337
+ handler();
338
+ }, delayMs);
339
+ handles.add(handle);
340
+ },
341
+ clear,
342
+ get pending() {
343
+ return handles.size;
344
+ },
345
+ };
346
+ }
347
+
166
348
  /** Coerces the form shapes accepted by SDCoreJS controls into one FormGroup. */
167
349
  function ɵsdCoerceFormGroup(value) {
168
350
  if (value instanceof NgForm)
@@ -222,16 +404,55 @@ function ɵsdFormControlConnector(options) {
222
404
  effect(onCleanup => {
223
405
  const formGroup = ɵsdCoerceFormGroup(options.form());
224
406
  const name = options.name();
225
- const control = options.control();
407
+ // why: `?? options.control()` chứ không phải một nhánh riêng — không khai `registeredControl`
408
+ // (hoặc trả null) là đi đúng đường cũ, nên mọi control hiện có giữ nguyên control đã đăng ký.
409
+ const control = options.registeredControl?.() ?? options.control();
226
410
  if (!formGroup || !name)
227
411
  return;
228
412
  const current = formGroup.get(name);
229
- const ownsRegistration = !current;
230
- if (ownsRegistration)
413
+ // why: trước đây là `const ownsRegistration = !current; if (ownsRegistration) addControl(...)`
414
+ // — tức là khi FormGroup cha ĐÃ có control trùng `name`, control nội bộ của component không bao
415
+ // giờ được đăng ký. Hậu quả im lặng: người dùng gõ vào field, nhưng `form.value[name]` không bao
416
+ // giờ đổi, form submit rỗng và không có bất kỳ cảnh báo nào. Trùng `name` gần như luôn là lỗi
417
+ // của consumer (khai control thủ công rồi lại truyền `[form]`+`name`, hoặc 2 control cùng tên).
418
+ // Giờ: thay control bằng `setControl` để giá trị THỰC SỰ tới được form, cộng thêm lỗi dev-mode
419
+ // chỉ đúng tên field để consumer gỡ khai báo thừa.
420
+ // Ba trường hợp, và chỉ trường hợp thứ ba là thay đổi hành vi:
421
+ // 1. chưa có gì ở `name` → tự đăng ký, TA sở hữu, gỡ khi cleanup.
422
+ // 2. đã có ĐÚNG control này → consumer chủ động đăng ký hộ; ta KHÔNG sở hữu nên
423
+ // không được gỡ khi destroy (nếu không sẽ xoá control
424
+ // mà consumer đang chủ ý giữ).
425
+ // 3. đã có control KHÁC → xung đột tên. Trước đây im lặng bỏ qua, nên giá trị người
426
+ // dùng gõ không bao giờ tới được form và submit ra rỗng.
427
+ const ownsRegistration = current == null;
428
+ // why: control bị ta đẩy ra (nếu có) phải được GHI NHỚ để trả lại khi cleanup. Nếu không, đổi
429
+ // `name` hoặc destroy component sẽ để control của ta nằm lại vĩnh viễn trong FormGroup của
430
+ // consumer, còn control gốc của họ thì mất hẳn — tệ hơn cả bug ban đầu.
431
+ const displaced = !ownsRegistration && current !== control ? current : undefined;
432
+ if (ownsRegistration) {
231
433
  formGroup.addControl(name, control);
434
+ }
435
+ else if (current !== control) {
436
+ if (isDevMode()) {
437
+ console.error(`[sd-forms] FormGroup đã có control tên "${name}" và nó KHÔNG phải control của <sd-*> này. ` +
438
+ `Control cũ bị thay thế để giá trị nhập vào thực sự tới được form — trước đây trường hợp này ` +
439
+ `bị bỏ qua im lặng và form submit ra rỗng. Bỏ khai báo control "${name}" thủ công, hoặc đổi ` +
440
+ `\`name\` của component.`);
441
+ }
442
+ formGroup.setControl(name, control);
443
+ }
232
444
  onCleanup(() => {
233
- if (ownsRegistration && formGroup.get(name) === control)
445
+ // Nếu ai đó đã đăng ký chồng lên sau ta thì không đụng vào.
446
+ if (formGroup.get(name) !== control)
447
+ return;
448
+ if (displaced) {
449
+ // Trả lại đúng control ban đầu của consumer.
450
+ formGroup.setControl(name, displaced);
451
+ }
452
+ else if (ownsRegistration) {
234
453
  formGroup.removeControl(name);
454
+ }
455
+ // Trường hợp còn lại: consumer tự đăng ký ĐÚNG control này — ta không sở hữu nên không gỡ.
235
456
  });
236
457
  });
237
458
  if (hasModelBinding(options)) {
@@ -368,5 +589,5 @@ function provideSdStrictDateFnsAdapter(formats) {
368
589
  * Generated bundle index. Do not edit.
369
590
  */
370
591
 
371
- export { HandleSdCustomValidator, SD_FORM_CONFIGURATION, SdFormControl, SdInlineErrorValidator, SdStrictDateFnsAdapter, provideSdStrictDateFnsAdapter, sdFormControlState, sdViewedInline, sdViewedTransform, ɵsdCoerceFormGroup, ɵsdFormControlConnector };
592
+ export { HandleSdCustomValidator, SD_FORM_CONFIGURATION, SD_TEMPORAL_VALUE_TRANSFORMS, SdFormControl, SdInlineErrorValidator, SdStrictDateFnsAdapter, provideSdStrictDateFnsAdapter, sdFormControlState, sdIsTemporalValueTransform, sdLocalStartOfDay, sdParseTransformedTemporal, sdSerializeTemporalValue, sdViewedInline, sdViewedTransform, ɵsdCoerceFormGroup, ɵsdFormControlConnector, ɵsdModelFacingControl, ɵsdTimerScope };
372
593
  //# sourceMappingURL=sdcorejs-angular-forms-models.mjs.map