@sdcorejs/angular 21.1.6 → 21.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/fesm2022/sdcorejs-angular-components-anchor.mjs +37 -13
  6. package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
  7. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs +2 -2
  8. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs.map +1 -1
  9. package/fesm2022/sdcorejs-angular-components-badge.mjs +15 -2
  10. package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
  11. package/fesm2022/sdcorejs-angular-components-button.mjs +2 -2
  12. package/fesm2022/sdcorejs-angular-components-button.mjs.map +1 -1
  13. package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs +1 -1
  14. package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs.map +1 -1
  15. package/fesm2022/sdcorejs-angular-components-code-editor.mjs +3 -3
  16. package/fesm2022/sdcorejs-angular-components-code-editor.mjs.map +1 -1
  17. package/fesm2022/sdcorejs-angular-components-data-state.mjs +3 -3
  18. package/fesm2022/sdcorejs-angular-components-data-state.mjs.map +1 -1
  19. package/fesm2022/sdcorejs-angular-components-editor.mjs +2 -2
  20. package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
  21. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +324 -192
  22. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  23. package/fesm2022/sdcorejs-angular-components-history.mjs +4 -4
  24. package/fesm2022/sdcorejs-angular-components-history.mjs.map +1 -1
  25. package/fesm2022/sdcorejs-angular-components-import-excel.mjs +13 -5
  26. package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
  27. package/fesm2022/sdcorejs-angular-components-inform.mjs +3 -3
  28. package/fesm2022/sdcorejs-angular-components-inform.mjs.map +1 -1
  29. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs +164 -8
  30. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs.map +1 -1
  31. package/fesm2022/sdcorejs-angular-components-modal.mjs +30 -18
  32. package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
  33. package/fesm2022/sdcorejs-angular-components-org-chart.mjs +60 -13
  34. package/fesm2022/sdcorejs-angular-components-org-chart.mjs.map +1 -1
  35. package/fesm2022/sdcorejs-angular-components-preview.mjs +27 -17
  36. package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
  37. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +192 -30
  38. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  39. package/fesm2022/sdcorejs-angular-components-query-builder.mjs +187 -127
  40. package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
  41. package/fesm2022/sdcorejs-angular-components-section.mjs +16 -2
  42. package/fesm2022/sdcorejs-angular-components-section.mjs.map +1 -1
  43. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +83 -24
  44. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
  45. package/fesm2022/sdcorejs-angular-components-splitter.mjs +57 -21
  46. package/fesm2022/sdcorejs-angular-components-splitter.mjs.map +1 -1
  47. package/fesm2022/sdcorejs-angular-components-stepper.mjs +2 -2
  48. package/fesm2022/sdcorejs-angular-components-stepper.mjs.map +1 -1
  49. package/fesm2022/sdcorejs-angular-components-tab-router.mjs +68 -20
  50. package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
  51. package/fesm2022/sdcorejs-angular-components-tab.mjs +3 -2
  52. package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
  53. package/fesm2022/sdcorejs-angular-components-table.mjs +542 -255
  54. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  55. package/fesm2022/sdcorejs-angular-components-tree.mjs +80 -17
  56. package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
  57. package/fesm2022/sdcorejs-angular-components-upload-file.mjs +48 -13
  58. package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
  59. package/fesm2022/sdcorejs-angular-components.mjs +6 -1
  60. package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
  61. package/fesm2022/sdcorejs-angular-configurations.mjs.map +1 -1
  62. package/fesm2022/sdcorejs-angular-directives.mjs +45 -8
  63. package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -1
  64. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +40 -29
  65. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  66. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +5 -5
  67. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
  68. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +67 -50
  69. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
  70. package/fesm2022/sdcorejs-angular-forms-chip.mjs +57 -43
  71. package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
  72. package/fesm2022/sdcorejs-angular-forms-date-range.mjs +232 -61
  73. package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
  74. package/fesm2022/sdcorejs-angular-forms-date.mjs +96 -24
  75. package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
  76. package/fesm2022/sdcorejs-angular-forms-datetime.mjs +131 -27
  77. package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
  78. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs +40 -16
  79. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs.map +1 -1
  80. package/fesm2022/sdcorejs-angular-forms-input-color.mjs +16 -5
  81. package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -1
  82. package/fesm2022/sdcorejs-angular-forms-input-number.mjs +24 -9
  83. package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
  84. package/fesm2022/sdcorejs-angular-forms-input.mjs +58 -10
  85. package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
  86. package/fesm2022/sdcorejs-angular-forms-models.mjs +227 -6
  87. package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
  88. package/fesm2022/sdcorejs-angular-forms-radio.mjs +4 -4
  89. package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
  90. package/fesm2022/sdcorejs-angular-forms-select.mjs +136 -38
  91. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  92. package/fesm2022/sdcorejs-angular-forms-switch.mjs +18 -3
  93. package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
  94. package/fesm2022/sdcorejs-angular-forms-textarea.mjs +51 -62
  95. package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
  96. package/fesm2022/sdcorejs-angular-forms-time-range.mjs +57 -12
  97. package/fesm2022/sdcorejs-angular-forms-time-range.mjs.map +1 -1
  98. package/fesm2022/sdcorejs-angular-forms-time.mjs +16 -5
  99. package/fesm2022/sdcorejs-angular-forms-time.mjs.map +1 -1
  100. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs +100 -9
  101. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs.map +1 -1
  102. package/fesm2022/sdcorejs-angular-forms.mjs +91 -46
  103. package/fesm2022/sdcorejs-angular-forms.mjs.map +1 -1
  104. package/fesm2022/sdcorejs-angular-handlers.mjs +18 -3
  105. package/fesm2022/sdcorejs-angular-handlers.mjs.map +1 -1
  106. package/fesm2022/sdcorejs-angular-i18n.mjs +490 -68
  107. package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
  108. package/fesm2022/sdcorejs-angular-interceptors.mjs +87 -29
  109. package/fesm2022/sdcorejs-angular-interceptors.mjs.map +1 -1
  110. package/fesm2022/sdcorejs-angular-modules-auth.mjs +25 -15
  111. package/fesm2022/sdcorejs-angular-modules-auth.mjs.map +1 -1
  112. package/fesm2022/sdcorejs-angular-modules-icon.mjs +2 -2
  113. package/fesm2022/sdcorejs-angular-modules-icon.mjs.map +1 -1
  114. package/fesm2022/sdcorejs-angular-modules-keycloak.mjs +32 -3
  115. package/fesm2022/sdcorejs-angular-modules-keycloak.mjs.map +1 -1
  116. package/fesm2022/sdcorejs-angular-modules-layout.mjs +332 -111
  117. package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
  118. package/fesm2022/sdcorejs-angular-modules-permission.mjs +177 -40
  119. package/fesm2022/sdcorejs-angular-modules-permission.mjs.map +1 -1
  120. package/fesm2022/sdcorejs-angular-pipes.mjs +62 -28
  121. package/fesm2022/sdcorejs-angular-pipes.mjs.map +1 -1
  122. package/fesm2022/sdcorejs-angular-services-api.mjs +123 -13
  123. package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
  124. package/fesm2022/sdcorejs-angular-services-cache.mjs +53 -3
  125. package/fesm2022/sdcorejs-angular-services-cache.mjs.map +1 -1
  126. package/fesm2022/sdcorejs-angular-services-confirm.mjs +25 -73
  127. package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
  128. package/fesm2022/sdcorejs-angular-services-excel.mjs +12 -10
  129. package/fesm2022/sdcorejs-angular-services-excel.mjs.map +1 -1
  130. package/fesm2022/sdcorejs-angular-services-loading.mjs +75 -84
  131. package/fesm2022/sdcorejs-angular-services-loading.mjs.map +1 -1
  132. package/fesm2022/sdcorejs-angular-services-notify.mjs +46 -5
  133. package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -1
  134. package/fesm2022/sdcorejs-angular-services-storage.mjs +4 -0
  135. package/fesm2022/sdcorejs-angular-services-storage.mjs.map +1 -1
  136. package/fesm2022/sdcorejs-angular-services.mjs +0 -1
  137. package/fesm2022/sdcorejs-angular-services.mjs.map +1 -1
  138. package/fesm2022/sdcorejs-angular-utilities-extensions.mjs +225 -80
  139. package/fesm2022/sdcorejs-angular-utilities-extensions.mjs.map +1 -1
  140. package/fesm2022/sdcorejs-angular-utilities-models.mjs +1 -63
  141. package/fesm2022/sdcorejs-angular-utilities-models.mjs.map +1 -1
  142. package/fesm2022/sdcorejs-angular.mjs +17 -10
  143. package/fesm2022/sdcorejs-angular.mjs.map +1 -1
  144. package/package.json +32 -25
  145. package/types/sdcorejs-angular-components-anchor.d.ts +3 -1
  146. package/types/sdcorejs-angular-components-badge.d.ts +1 -0
  147. package/types/sdcorejs-angular-components-ckeditor-styles.d.ts +1 -1
  148. package/types/sdcorejs-angular-components-form-generic.d.ts +44 -33
  149. package/types/sdcorejs-angular-components-import-excel.d.ts +1 -0
  150. package/types/sdcorejs-angular-components-mini-editor.d.ts +1 -1
  151. package/types/sdcorejs-angular-components-modal-resizable.d.ts +92 -0
  152. package/types/sdcorejs-angular-components-modal.d.ts +3 -2
  153. package/types/sdcorejs-angular-components-org-chart.d.ts +6 -0
  154. package/types/sdcorejs-angular-components-preview.d.ts +1 -0
  155. package/types/sdcorejs-angular-components-query-bar.d.ts +55 -17
  156. package/types/sdcorejs-angular-components-query-builder.d.ts +150 -98
  157. package/types/sdcorejs-angular-components-section.d.ts +3 -0
  158. package/types/sdcorejs-angular-components-tab-router.d.ts +19 -19
  159. package/types/sdcorejs-angular-components-table.d.ts +251 -109
  160. package/types/sdcorejs-angular-components-tree.d.ts +48 -30
  161. package/types/sdcorejs-angular-components-upload-file.d.ts +6 -3
  162. package/types/sdcorejs-angular-components.d.ts +6 -1
  163. package/types/sdcorejs-angular-configurations.d.ts +1 -2
  164. package/types/sdcorejs-angular-forms-autocomplete.d.ts +5 -2
  165. package/types/sdcorejs-angular-forms-chip-calendar.d.ts +10 -0
  166. package/types/sdcorejs-angular-forms-date-range.d.ts +14 -2
  167. package/types/sdcorejs-angular-forms-date.d.ts +13 -2
  168. package/types/sdcorejs-angular-forms-datetime.d.ts +13 -2
  169. package/types/sdcorejs-angular-forms-entity-picker.d.ts +9 -3
  170. package/types/sdcorejs-angular-forms-input-color.d.ts +4 -0
  171. package/types/sdcorejs-angular-forms-input-number.d.ts +3 -0
  172. package/types/sdcorejs-angular-forms-input.d.ts +3 -0
  173. package/types/sdcorejs-angular-forms-models.d.ts +119 -4
  174. package/types/sdcorejs-angular-forms-select.d.ts +27 -4
  175. package/types/sdcorejs-angular-forms-switch.d.ts +7 -1
  176. package/types/sdcorejs-angular-forms-textarea.d.ts +5 -3
  177. package/types/sdcorejs-angular-forms-time-range.d.ts +22 -1
  178. package/types/sdcorejs-angular-forms-tree-select.d.ts +36 -5
  179. package/types/sdcorejs-angular-forms.d.ts +22 -13
  180. package/types/sdcorejs-angular-i18n.d.ts +95 -16
  181. package/types/sdcorejs-angular-interceptors.d.ts +13 -3
  182. package/types/sdcorejs-angular-modules-auth.d.ts +1 -1
  183. package/types/sdcorejs-angular-modules-keycloak.d.ts +1 -0
  184. package/types/sdcorejs-angular-modules-layout.d.ts +94 -28
  185. package/types/sdcorejs-angular-modules-permission.d.ts +66 -4
  186. package/types/sdcorejs-angular-pipes.d.ts +27 -5
  187. package/types/sdcorejs-angular-services-api.d.ts +21 -1
  188. package/types/sdcorejs-angular-services-cache.d.ts +11 -1
  189. package/types/sdcorejs-angular-services-notify.d.ts +1 -1
  190. package/types/sdcorejs-angular-services.d.ts +0 -1
  191. package/types/sdcorejs-angular-utilities-extensions.d.ts +83 -61
  192. package/types/sdcorejs-angular-utilities-models.d.ts +2 -76
  193. package/types/sdcorejs-angular.d.ts +11 -2
  194. package/fesm2022/sdcorejs-angular-components-base.mjs +0 -23
  195. package/fesm2022/sdcorejs-angular-components-base.mjs.map +0 -1
  196. package/fesm2022/sdcorejs-angular-components-document-builder.mjs +0 -5038
  197. package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +0 -1
  198. package/fesm2022/sdcorejs-angular-models.mjs +0 -6
  199. package/fesm2022/sdcorejs-angular-models.mjs.map +0 -1
  200. package/fesm2022/sdcorejs-angular-services-docx.mjs +0 -291
  201. package/fesm2022/sdcorejs-angular-services-docx.mjs.map +0 -1
  202. package/fesm2022/sdcorejs-angular-services-license.mjs +0 -97
  203. package/fesm2022/sdcorejs-angular-services-license.mjs.map +0 -1
  204. package/types/sdcorejs-angular-components-base.d.ts +0 -11
  205. package/types/sdcorejs-angular-components-document-builder.d.ts +0 -252
  206. package/types/sdcorejs-angular-models.d.ts +0 -2
  207. package/types/sdcorejs-angular-services-docx.d.ts +0 -27
  208. package/types/sdcorejs-angular-services-license.d.ts +0 -12
@@ -1,14 +1,19 @@
1
+ import { SdSuffixDefDirective, SdLabelDefDirective, SdViewDefDirective, SdItemDefDefDirective } from '@sdcorejs/angular/forms/directives';
1
2
  export * from '@sdcorejs/angular/forms/directives';
2
3
  export * from '@sdcorejs/angular/forms/models';
4
+ import { SdLabel } from '@sdcorejs/angular/forms/label';
3
5
  export * from '@sdcorejs/angular/forms/label';
4
6
  import { SdInput } from '@sdcorejs/angular/forms/input';
5
7
  export * from '@sdcorejs/angular/forms/input';
8
+ import { SdInputColor } from '@sdcorejs/angular/forms/input-color';
6
9
  export * from '@sdcorejs/angular/forms/input-color';
10
+ import { SdInlineText } from '@sdcorejs/angular/forms/inline-text';
7
11
  export * from '@sdcorejs/angular/forms/inline-text';
8
12
  import { SdInputNumber } from '@sdcorejs/angular/forms/input-number';
9
13
  export * from '@sdcorejs/angular/forms/input-number';
10
14
  import { SdDate } from '@sdcorejs/angular/forms/date';
11
15
  export * from '@sdcorejs/angular/forms/date';
16
+ import { SdDatetime } from '@sdcorejs/angular/forms/datetime';
12
17
  export * from '@sdcorejs/angular/forms/datetime';
13
18
  import { SdDateRange } from '@sdcorejs/angular/forms/date-range';
14
19
  export * from '@sdcorejs/angular/forms/date-range';
@@ -16,30 +21,79 @@ import { SdTime } from '@sdcorejs/angular/forms/time';
16
21
  export * from '@sdcorejs/angular/forms/time';
17
22
  import { SdTimeRange } from '@sdcorejs/angular/forms/time-range';
18
23
  export * from '@sdcorejs/angular/forms/time-range';
19
- import { SdEntityPicker } from '@sdcorejs/angular/forms/entity-picker';
24
+ import { SdEntityPicker, SdEntityPickerSelectedTemplateDirective, SdEntityPickerRowTemplateDirective, SdEntityPickerDetailTemplateDirective } from '@sdcorejs/angular/forms/entity-picker';
20
25
  export * from '@sdcorejs/angular/forms/entity-picker';
21
- import { SdTreeSelect } from '@sdcorejs/angular/forms/tree-select';
26
+ import { SdTreeSelect, SdTreeSelectNodeTemplateDirective } from '@sdcorejs/angular/forms/tree-select';
22
27
  export * from '@sdcorejs/angular/forms/tree-select';
23
- import { SdSelect } from '@sdcorejs/angular/forms/select';
28
+ import { SdSelect, SdSelectFooterActionDirective } from '@sdcorejs/angular/forms/select';
24
29
  export * from '@sdcorejs/angular/forms/select';
25
30
  import { SdAutocomplete } from '@sdcorejs/angular/forms/autocomplete';
26
31
  export * from '@sdcorejs/angular/forms/autocomplete';
32
+ import { SdSwitch } from '@sdcorejs/angular/forms/switch';
27
33
  export * from '@sdcorejs/angular/forms/switch';
28
34
  import { SdRadio } from '@sdcorejs/angular/forms/radio';
29
35
  export * from '@sdcorejs/angular/forms/radio';
30
36
  import { SdTextarea } from '@sdcorejs/angular/forms/textarea';
31
37
  export * from '@sdcorejs/angular/forms/textarea';
38
+ import { SdChip } from '@sdcorejs/angular/forms/chip';
32
39
  export * from '@sdcorejs/angular/forms/chip';
40
+ import { SdChipCalendar } from '@sdcorejs/angular/forms/chip-calendar';
33
41
  export * from '@sdcorejs/angular/forms/chip-calendar';
42
+ import { SdCheckbox } from '@sdcorejs/angular/forms/checkbox';
34
43
  export * from '@sdcorejs/angular/forms/checkbox';
35
44
  import * as i0 from '@angular/core';
36
45
  import { NgModule } from '@angular/core';
37
46
 
47
+ // why: mọi control standalone re-export từ `forms/index.ts` PHẢI có mặt ở đây. Trước đây module
48
+ // chỉ khai 12/20 control (thiếu datetime / checkbox / switch / chip / chip-calendar / input-color /
49
+ // inline-text / label), nên consumer dùng NgModule chỉ import `SdFormsModule` vẫn không compile
50
+ // được một nửa thư viện ("is not a known element") dù package đã export class. Danh sách này bám
51
+ // 1:1 theo `forms/index.ts` — thêm entry point mới thì phải thêm cả ở đây.
52
+ const SD_FORM_CONTROLS = [
53
+ SdLabel,
54
+ SdInput,
55
+ SdInputColor,
56
+ SdInlineText,
57
+ SdInputNumber,
58
+ SdDate,
59
+ SdDatetime,
60
+ SdDateRange,
61
+ SdTime,
62
+ SdTimeRange,
63
+ SdEntityPicker,
64
+ SdTreeSelect,
65
+ SdSelect,
66
+ SdAutocomplete,
67
+ SdSwitch,
68
+ SdRadio,
69
+ SdTextarea,
70
+ SdChip,
71
+ SdChipCalendar,
72
+ SdCheckbox,
73
+ ];
74
+ // why: các directive projection (`sdViewDef`, `sdLabelDef`, `sdItemDef`, `sdSuffixDef`, footer
75
+ // action của select, template của entity-picker/tree-select) là một phần API của chính các control
76
+ // trên — không export thì consumer NgModule dựng được control nhưng không tuỳ biến được nội dung.
77
+ const SD_FORM_DIRECTIVES = [
78
+ SdSuffixDefDirective,
79
+ SdLabelDefDirective,
80
+ SdViewDefDirective,
81
+ SdItemDefDefDirective,
82
+ SdSelectFooterActionDirective,
83
+ SdEntityPickerSelectedTemplateDirective,
84
+ SdEntityPickerRowTemplateDirective,
85
+ SdEntityPickerDetailTemplateDirective,
86
+ SdTreeSelectNodeTemplateDirective,
87
+ ];
38
88
  class SdFormsModule {
39
89
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SdFormsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
40
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.17", ngImport: i0, type: SdFormsModule, imports: [SdInput,
90
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.17", ngImport: i0, type: SdFormsModule, imports: [SdLabel,
91
+ SdInput,
92
+ SdInputColor,
93
+ SdInlineText,
41
94
  SdInputNumber,
42
95
  SdDate,
96
+ SdDatetime,
43
97
  SdDateRange,
44
98
  SdTime,
45
99
  SdTimeRange,
@@ -47,10 +101,26 @@ class SdFormsModule {
47
101
  SdTreeSelect,
48
102
  SdSelect,
49
103
  SdAutocomplete,
104
+ SdSwitch,
50
105
  SdRadio,
51
- SdTextarea], exports: [SdInput,
106
+ SdTextarea,
107
+ SdChip,
108
+ SdChipCalendar,
109
+ SdCheckbox, SdSuffixDefDirective,
110
+ SdLabelDefDirective,
111
+ SdViewDefDirective,
112
+ SdItemDefDefDirective,
113
+ SdSelectFooterActionDirective,
114
+ SdEntityPickerSelectedTemplateDirective,
115
+ SdEntityPickerRowTemplateDirective,
116
+ SdEntityPickerDetailTemplateDirective,
117
+ SdTreeSelectNodeTemplateDirective], exports: [SdLabel,
118
+ SdInput,
119
+ SdInputColor,
120
+ SdInlineText,
52
121
  SdInputNumber,
53
122
  SdDate,
123
+ SdDatetime,
54
124
  SdDateRange,
55
125
  SdTime,
56
126
  SdTimeRange,
@@ -58,54 +128,29 @@ class SdFormsModule {
58
128
  SdTreeSelect,
59
129
  SdSelect,
60
130
  SdAutocomplete,
131
+ SdSwitch,
61
132
  SdRadio,
62
- SdTextarea] });
63
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SdFormsModule, imports: [SdInput,
64
- SdInputNumber,
65
- SdDate,
66
- SdDateRange,
67
- SdTime,
68
- SdTimeRange,
69
- SdEntityPicker,
70
- SdTreeSelect,
71
- SdSelect,
72
- SdAutocomplete,
73
- SdRadio,
74
- SdTextarea] });
133
+ SdTextarea,
134
+ SdChip,
135
+ SdChipCalendar,
136
+ SdCheckbox, SdSuffixDefDirective,
137
+ SdLabelDefDirective,
138
+ SdViewDefDirective,
139
+ SdItemDefDefDirective,
140
+ SdSelectFooterActionDirective,
141
+ SdEntityPickerSelectedTemplateDirective,
142
+ SdEntityPickerRowTemplateDirective,
143
+ SdEntityPickerDetailTemplateDirective,
144
+ SdTreeSelectNodeTemplateDirective] });
145
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SdFormsModule, imports: [SD_FORM_CONTROLS] });
75
146
  }
76
147
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SdFormsModule, decorators: [{
77
148
  type: NgModule,
78
149
  args: [{
79
- imports: [
80
- SdInput,
81
- SdInputNumber,
82
- SdDate,
83
- SdDateRange,
84
- SdTime,
85
- SdTimeRange,
86
- SdEntityPicker,
87
- SdTreeSelect,
88
- SdSelect,
89
- SdAutocomplete,
90
- SdRadio,
91
- SdTextarea,
92
- ],
150
+ imports: [...SD_FORM_CONTROLS, ...SD_FORM_DIRECTIVES],
93
151
  declarations: [],
94
152
  providers: [],
95
- exports: [
96
- SdInput,
97
- SdInputNumber,
98
- SdDate,
99
- SdDateRange,
100
- SdTime,
101
- SdTimeRange,
102
- SdEntityPicker,
103
- SdTreeSelect,
104
- SdSelect,
105
- SdAutocomplete,
106
- SdRadio,
107
- SdTextarea,
108
- ],
153
+ exports: [...SD_FORM_CONTROLS, ...SD_FORM_DIRECTIVES],
109
154
  }]
110
155
  }] });
111
156
 
@@ -1 +1 @@
1
- {"version":3,"file":"sdcorejs-angular-forms.mjs","sources":["../../../projects/sdcorejs-angular/forms/src/forms.module.ts","../../../projects/sdcorejs-angular/forms/sdcorejs-angular-forms.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { SdInput } from '@sdcorejs/angular/forms/input';\nimport { SdInputNumber } from '@sdcorejs/angular/forms/input-number';\nimport { SdDate } from '@sdcorejs/angular/forms/date';\nimport { SdSelect } from '@sdcorejs/angular/forms/select';\nimport { SdAutocomplete } from '@sdcorejs/angular/forms/autocomplete';\nimport { SdRadio } from '@sdcorejs/angular/forms/radio';\nimport { SdTextarea } from '@sdcorejs/angular/forms/textarea';\nimport { SdDateRange } from '@sdcorejs/angular/forms/date-range';\nimport { SdTime } from '@sdcorejs/angular/forms/time';\nimport { SdTimeRange } from '@sdcorejs/angular/forms/time-range';\nimport { SdEntityPicker } from '@sdcorejs/angular/forms/entity-picker';\nimport { SdTreeSelect } from '@sdcorejs/angular/forms/tree-select';\n\n@NgModule({\n imports: [\n SdInput,\n SdInputNumber,\n SdDate,\n SdDateRange,\n SdTime,\n SdTimeRange,\n SdEntityPicker,\n SdTreeSelect,\n SdSelect,\n SdAutocomplete,\n SdRadio,\n SdTextarea,\n ],\n declarations: [],\n providers: [],\n exports: [\n SdInput,\n SdInputNumber,\n SdDate,\n SdDateRange,\n SdTime,\n SdTimeRange,\n SdEntityPicker,\n SdTreeSelect,\n SdSelect,\n SdAutocomplete,\n SdRadio,\n SdTextarea,\n ],\n})\nexport class SdFormsModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA8Ca,aAAa,CAAA;wGAAb,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,YA9BtB,OAAO;YACP,aAAa;YACb,MAAM;YACN,WAAW;YACX,MAAM;YACN,WAAW;YACX,cAAc;YACd,YAAY;YACZ,QAAQ;YACR,cAAc;YACd,OAAO;AACP,YAAA,UAAU,aAKV,OAAO;YACP,aAAa;YACb,MAAM;YACN,WAAW;YACX,MAAM;YACN,WAAW;YACX,cAAc;YACd,YAAY;YACZ,QAAQ;YACR,cAAc;YACd,OAAO;YACP,UAAU,CAAA,EAAA,CAAA;AAGD,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,YA9BtB,OAAO;YACP,aAAa;YACb,MAAM;YACN,WAAW;YACX,MAAM;YACN,WAAW;YACX,cAAc;YACd,YAAY;YACZ,QAAQ;YACR,cAAc;YACd,OAAO;YACP,UAAU,CAAA,EAAA,CAAA;;4FAmBD,aAAa,EAAA,UAAA,EAAA,CAAA;kBAhCzB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP,OAAO;wBACP,aAAa;wBACb,MAAM;wBACN,WAAW;wBACX,MAAM;wBACN,WAAW;wBACX,cAAc;wBACd,YAAY;wBACZ,QAAQ;wBACR,cAAc;wBACd,OAAO;wBACP,UAAU;AACX,qBAAA;AACD,oBAAA,YAAY,EAAE,EAAE;AAChB,oBAAA,SAAS,EAAE,EAAE;AACb,oBAAA,OAAO,EAAE;wBACP,OAAO;wBACP,aAAa;wBACb,MAAM;wBACN,WAAW;wBACX,MAAM;wBACN,WAAW;wBACX,cAAc;wBACd,YAAY;wBACZ,QAAQ;wBACR,cAAc;wBACd,OAAO;wBACP,UAAU;AACX,qBAAA;AACF,iBAAA;;;AC7CD;;AAEG;;;;"}
1
+ {"version":3,"file":"sdcorejs-angular-forms.mjs","sources":["../../../projects/sdcorejs-angular/forms/src/forms.module.ts","../../../projects/sdcorejs-angular/forms/sdcorejs-angular-forms.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { SdInput } from '@sdcorejs/angular/forms/input';\nimport { SdInputColor } from '@sdcorejs/angular/forms/input-color';\nimport { SdInputNumber } from '@sdcorejs/angular/forms/input-number';\nimport { SdInlineText } from '@sdcorejs/angular/forms/inline-text';\nimport { SdLabel } from '@sdcorejs/angular/forms/label';\nimport { SdDate } from '@sdcorejs/angular/forms/date';\nimport { SdDatetime } from '@sdcorejs/angular/forms/datetime';\nimport { SdSelect, SdSelectFooterActionDirective } from '@sdcorejs/angular/forms/select';\nimport { SdAutocomplete } from '@sdcorejs/angular/forms/autocomplete';\nimport { SdRadio } from '@sdcorejs/angular/forms/radio';\nimport { SdCheckbox } from '@sdcorejs/angular/forms/checkbox';\nimport { SdSwitch } from '@sdcorejs/angular/forms/switch';\nimport { SdChip } from '@sdcorejs/angular/forms/chip';\nimport { SdChipCalendar } from '@sdcorejs/angular/forms/chip-calendar';\nimport { SdTextarea } from '@sdcorejs/angular/forms/textarea';\nimport { SdDateRange } from '@sdcorejs/angular/forms/date-range';\nimport { SdTime } from '@sdcorejs/angular/forms/time';\nimport { SdTimeRange } from '@sdcorejs/angular/forms/time-range';\nimport {\n SdEntityPicker,\n SdEntityPickerDetailTemplateDirective,\n SdEntityPickerRowTemplateDirective,\n SdEntityPickerSelectedTemplateDirective,\n} from '@sdcorejs/angular/forms/entity-picker';\nimport { SdTreeSelect, SdTreeSelectNodeTemplateDirective } from '@sdcorejs/angular/forms/tree-select';\nimport { SdItemDefDefDirective, SdLabelDefDirective, SdSuffixDefDirective, SdViewDefDirective } from '@sdcorejs/angular/forms/directives';\n\n// why: mọi control standalone re-export từ `forms/index.ts` PHẢI có mặt ở đây. Trước đây module\n// chỉ khai 12/20 control (thiếu datetime / checkbox / switch / chip / chip-calendar / input-color /\n// inline-text / label), nên consumer dùng NgModule chỉ import `SdFormsModule` vẫn không compile\n// được một nửa thư viện (\"is not a known element\") dù package đã export class. Danh sách này bám\n// 1:1 theo `forms/index.ts` — thêm entry point mới thì phải thêm cả ở đây.\nconst SD_FORM_CONTROLS = [\n SdLabel,\n SdInput,\n SdInputColor,\n SdInlineText,\n SdInputNumber,\n SdDate,\n SdDatetime,\n SdDateRange,\n SdTime,\n SdTimeRange,\n SdEntityPicker,\n SdTreeSelect,\n SdSelect,\n SdAutocomplete,\n SdSwitch,\n SdRadio,\n SdTextarea,\n SdChip,\n SdChipCalendar,\n SdCheckbox,\n];\n\n// why: các directive projection (`sdViewDef`, `sdLabelDef`, `sdItemDef`, `sdSuffixDef`, footer\n// action của select, template của entity-picker/tree-select) là một phần API của chính các control\n// trên — không export thì consumer NgModule dựng được control nhưng không tuỳ biến được nội dung.\nconst SD_FORM_DIRECTIVES = [\n SdSuffixDefDirective,\n SdLabelDefDirective,\n SdViewDefDirective,\n SdItemDefDefDirective,\n SdSelectFooterActionDirective,\n SdEntityPickerSelectedTemplateDirective,\n SdEntityPickerRowTemplateDirective,\n SdEntityPickerDetailTemplateDirective,\n SdTreeSelectNodeTemplateDirective,\n];\n\n@NgModule({\n imports: [...SD_FORM_CONTROLS, ...SD_FORM_DIRECTIVES],\n declarations: [],\n providers: [],\n exports: [...SD_FORM_CONTROLS, ...SD_FORM_DIRECTIVES],\n})\nexport class SdFormsModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA;AACA;AACA;AACA;AACA;AACA,MAAM,gBAAgB,GAAG;IACvB,OAAO;IACP,OAAO;IACP,YAAY;IACZ,YAAY;IACZ,aAAa;IACb,MAAM;IACN,UAAU;IACV,WAAW;IACX,MAAM;IACN,WAAW;IACX,cAAc;IACd,YAAY;IACZ,QAAQ;IACR,cAAc;IACd,QAAQ;IACR,OAAO;IACP,UAAU;IACV,MAAM;IACN,cAAc;IACd,UAAU;CACX;AAED;AACA;AACA;AACA,MAAM,kBAAkB,GAAG;IACzB,oBAAoB;IACpB,mBAAmB;IACnB,kBAAkB;IAClB,qBAAqB;IACrB,6BAA6B;IAC7B,uCAAuC;IACvC,kCAAkC;IAClC,qCAAqC;IACrC,iCAAiC;CAClC;MAQY,aAAa,CAAA;wGAAb,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,YA3CxB,OAAO;YACP,OAAO;YACP,YAAY;YACZ,YAAY;YACZ,aAAa;YACb,MAAM;YACN,UAAU;YACV,WAAW;YACX,MAAM;YACN,WAAW;YACX,cAAc;YACd,YAAY;YACZ,QAAQ;YACR,cAAc;YACd,QAAQ;YACR,OAAO;YACP,UAAU;YACV,MAAM;YACN,cAAc;AACd,YAAA,UAAU,EAOV,oBAAoB;YACpB,mBAAmB;YACnB,kBAAkB;YAClB,qBAAqB;YACrB,6BAA6B;YAC7B,uCAAuC;YACvC,kCAAkC;YAClC,qCAAqC;AACrC,YAAA,iCAAiC,aAlCjC,OAAO;YACP,OAAO;YACP,YAAY;YACZ,YAAY;YACZ,aAAa;YACb,MAAM;YACN,UAAU;YACV,WAAW;YACX,MAAM;YACN,WAAW;YACX,cAAc;YACd,YAAY;YACZ,QAAQ;YACR,cAAc;YACd,QAAQ;YACR,OAAO;YACP,UAAU;YACV,MAAM;YACN,cAAc;AACd,YAAA,UAAU,EAOV,oBAAoB;YACpB,mBAAmB;YACnB,kBAAkB;YAClB,qBAAqB;YACrB,6BAA6B;YAC7B,uCAAuC;YACvC,kCAAkC;YAClC,qCAAqC;YACrC,iCAAiC,CAAA,EAAA,CAAA;AAStB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,YALX,gBAAgB,CAAA,EAAA,CAAA;;4FAKlB,aAAa,EAAA,UAAA,EAAA,CAAA;kBANzB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,CAAC,GAAG,gBAAgB,EAAE,GAAG,kBAAkB,CAAC;AACrD,oBAAA,YAAY,EAAE,EAAE;AAChB,oBAAA,SAAS,EAAE,EAAE;AACb,oBAAA,OAAO,EAAE,CAAC,GAAG,gBAAgB,EAAE,GAAG,kBAAkB,CAAC;AACtD,iBAAA;;;AC5ED;;AAEG;;;;"}
@@ -1,11 +1,15 @@
1
+ import { isPlatformBrowser } from '@angular/common';
1
2
  import * as i0 from '@angular/core';
2
- import { inject, Injectable } from '@angular/core';
3
+ import { inject, PLATFORM_ID, isDevMode, Injectable } from '@angular/core';
3
4
  import { I18nService } from '@sdcorejs/angular/i18n';
4
5
 
5
6
  // Sử dụng Global Handler để đảm bảo khi có bản build mới sẽ báo cho người dùng biết để tải lại
6
7
  // Cách sử dụng: providers: [{ provide: ErrorHandler, useClass: GlobalErrorHandler }],
7
8
  class SdGlobalErrorHandler {
8
9
  #i18n = inject(I18nService);
10
+ // why: `window.confirm` / `window.location.reload` không tồn tại khi render trên server. Gọi
11
+ // thẳng sẽ làm CHÍNH ErrorHandler ném lỗi, và lỗi gốc bị che mất hoàn toàn.
12
+ #isBrowser = isPlatformBrowser(inject(PLATFORM_ID));
9
13
  constructor() { }
10
14
  handleError(error) {
11
15
  // Lấy message lỗi an toàn
@@ -22,14 +26,25 @@ class SdGlobalErrorHandler {
22
26
  // Kiểm tra xem lỗi có chứa từ khóa nào không
23
27
  const isChunkError = chunkErrorSignatures.some(signature => errorMessage.includes(signature.toLowerCase()));
24
28
  if (isChunkError) {
25
- console.warn('=> Chunk Load error detected:', errorMessage);
29
+ // why: đây là log chẩn đoán dài dòng cho dev (dump nguyên message đã lowercase) và nhánh này
30
+ // đã có UI riêng — hộp thoại xác nhận tải lại. Gate theo dev mode là hợp lý.
31
+ if (isDevMode())
32
+ console.warn('=> Chunk Load error detected:', errorMessage);
33
+ // why: trên server không có gì để reload — thoát sớm để lỗi gốc vẫn nổi lên nguyên vẹn.
34
+ if (!this.#isBrowser)
35
+ return;
26
36
  const wantReload = window.confirm(this.#i18n.t('core.handler.global-error.update-title') + '\n\n' + this.#i18n.t('core.handler.global-error.update-body'));
27
37
  if (wantReload) {
28
38
  window.location.reload();
29
39
  }
30
40
  }
31
41
  else {
32
- // Log lỗi thường
42
+ // why: KHÔNG gate `console.error` theo `isDevMode()`. Đăng ký `ErrorHandler` này là THAY THẾ
43
+ // ErrorHandler mặc định của Angular — thứ vốn luôn log. Gate lại thì bản production nuốt sạch
44
+ // mọi lỗi ứng dụng: không còn gì trong console, không còn gì cho công cụ thu thập log của
45
+ // trình duyệt, và bug production trở nên vô hình. Log lỗi chính là toàn bộ giá trị chẩn đoán
46
+ // của một ErrorHandler; muốn giấu thì là việc của app (thay ErrorHandler khác), không phải
47
+ // hành vi mặc định của thư viện.
33
48
  console.error('Application error:', error);
34
49
  }
35
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sdcorejs-angular-handlers.mjs","sources":["../../../projects/sdcorejs-angular/handlers/global-error.handler.ts","../../../projects/sdcorejs-angular/handlers/sdcorejs-angular-handlers.ts"],"sourcesContent":["import { ErrorHandler, inject, Injectable } from '@angular/core';\nimport { I18nService } from '@sdcorejs/angular/i18n';\n\n// Sử dụng Global Handler để đảm bảo khi có bản build mới sẽ báo cho người dùng biết để tải lại\n// Cách sử dụng: providers: [{ provide: ErrorHandler, useClass: GlobalErrorHandler }],\n@Injectable()\nexport class SdGlobalErrorHandler implements ErrorHandler {\n readonly #i18n = inject(I18nService);\n\n constructor() {}\n\n handleError(error: any): void {\n // Lấy message lỗi an toàn\n const errorMessage = this.#extractErrorMessage(error);\n\n // Danh sách các từ khóa nhận diện lỗi mất file JS/Chunk\n // Cần bao gồm nhiều biến thể do trình duyệt/bundler khác nhau\n const chunkErrorSignatures = [\n 'Loading chunk', // Webpack cũ\n 'Importing a module script failed', // Một số trình duyệt\n 'Failed to fetch dynamically imported module', // <-- Lỗi bạn đang gặp (Angular mới/Vite/Esbuild)\n 'error loading dynamically imported module', // Firefox/Safari biến thể\n 'missing source map', // Đôi khi đi kèm\n ];\n\n // Kiểm tra xem lỗi có chứa từ khóa nào không\n const isChunkError = chunkErrorSignatures.some(signature => errorMessage.includes(signature.toLowerCase()));\n\n if (isChunkError) {\n console.warn('=> Chunk Load error detected:', errorMessage);\n\n const wantReload = window.confirm(\n this.#i18n.t('core.handler.global-error.update-title') + '\\n\\n' + this.#i18n.t('core.handler.global-error.update-body')\n );\n\n if (wantReload) {\n window.location.reload();\n }\n } else {\n // Log lỗi thường\n console.error('Application error:', error);\n }\n }\n\n // Hàm phụ trợ để lấy text lỗi từ object error bất kỳ\n #extractErrorMessage = (error: any): string => {\n if (!error) return '';\n\n // Nếu là chuỗi\n if (typeof error === 'string') return error.toLowerCase();\n\n // Nếu là Error Object chuẩn\n if (error.message) return error.message.toLowerCase();\n\n // Nếu lỗi nằm trong rejection (Promise)\n if (error.rejection) {\n return typeof error.rejection === 'string' ? error.rejection.toLowerCase() : (error.rejection.message || '').toLowerCase();\n }\n return '';\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAGA;AACA;MAEa,oBAAoB,CAAA;AACtB,IAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;AAEpC,IAAA,WAAA,GAAA,EAAe;AAEf,IAAA,WAAW,CAAC,KAAU,EAAA;;QAEpB,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;;;AAIrD,QAAA,MAAM,oBAAoB,GAAG;AAC3B,YAAA,eAAe;AACf,YAAA,kCAAkC;AAClC,YAAA,6CAA6C;AAC7C,YAAA,2CAA2C;AAC3C,YAAA,oBAAoB;SACrB;;QAGD,MAAM,YAAY,GAAG,oBAAoB,CAAC,IAAI,CAAC,SAAS,IAAI,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;QAE3G,IAAI,YAAY,EAAE;AAChB,YAAA,OAAO,CAAC,IAAI,CAAC,+BAA+B,EAAE,YAAY,CAAC;YAE3D,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAC/B,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,wCAAwC,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,uCAAuC,CAAC,CACxH;YAED,IAAI,UAAU,EAAE;AACd,gBAAA,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE;YAC1B;QACF;aAAO;;AAEL,YAAA,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC;QAC5C;IACF;;AAGA,IAAA,oBAAoB,GAAG,CAAC,KAAU,KAAY;AAC5C,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,EAAE;;QAGrB,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,YAAA,OAAO,KAAK,CAAC,WAAW,EAAE;;QAGzD,IAAI,KAAK,CAAC,OAAO;AAAE,YAAA,OAAO,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE;;AAGrD,QAAA,IAAI,KAAK,CAAC,SAAS,EAAE;AACnB,YAAA,OAAO,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,EAAE,WAAW,EAAE;QAC5H;AACA,QAAA,OAAO,EAAE;AACX,IAAA,CAAC;wGArDU,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAApB,oBAAoB,EAAA,CAAA;;4FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC;;;ACLD;;AAEG;;;;"}
1
+ {"version":3,"file":"sdcorejs-angular-handlers.mjs","sources":["../../../projects/sdcorejs-angular/handlers/global-error.handler.ts","../../../projects/sdcorejs-angular/handlers/sdcorejs-angular-handlers.ts"],"sourcesContent":["import { isPlatformBrowser } from '@angular/common';\nimport { ErrorHandler, inject, Injectable, isDevMode, PLATFORM_ID } from '@angular/core';\nimport { I18nService } from '@sdcorejs/angular/i18n';\n\n// Sử dụng Global Handler để đảm bảo khi có bản build mới sẽ báo cho người dùng biết để tải lại\n// Cách sử dụng: providers: [{ provide: ErrorHandler, useClass: GlobalErrorHandler }],\n@Injectable()\nexport class SdGlobalErrorHandler implements ErrorHandler {\n readonly #i18n = inject(I18nService);\n\n // why: `window.confirm` / `window.location.reload` không tồn tại khi render trên server. Gọi\n // thẳng sẽ làm CHÍNH ErrorHandler ném lỗi, và lỗi gốc bị che mất hoàn toàn.\n readonly #isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n constructor() {}\n\n handleError(error: any): void {\n // Lấy message lỗi an toàn\n const errorMessage = this.#extractErrorMessage(error);\n\n // Danh sách các từ khóa nhận diện lỗi mất file JS/Chunk\n // Cần bao gồm nhiều biến thể do trình duyệt/bundler khác nhau\n const chunkErrorSignatures = [\n 'Loading chunk', // Webpack cũ\n 'Importing a module script failed', // Một số trình duyệt\n 'Failed to fetch dynamically imported module', // <-- Lỗi bạn đang gặp (Angular mới/Vite/Esbuild)\n 'error loading dynamically imported module', // Firefox/Safari biến thể\n 'missing source map', // Đôi khi đi kèm\n ];\n\n // Kiểm tra xem lỗi có chứa từ khóa nào không\n const isChunkError = chunkErrorSignatures.some(signature => errorMessage.includes(signature.toLowerCase()));\n\n if (isChunkError) {\n // why: đây là log chẩn đoán dài dòng cho dev (dump nguyên message đã lowercase) và nhánh này\n // đã có UI riêng — hộp thoại xác nhận tải lại. Gate theo dev mode là hợp lý.\n if (isDevMode()) console.warn('=> Chunk Load error detected:', errorMessage);\n\n // why: trên server không có gì để reload — thoát sớm để lỗi gốc vẫn nổi lên nguyên vẹn.\n if (!this.#isBrowser) return;\n\n const wantReload = window.confirm(\n this.#i18n.t('core.handler.global-error.update-title') + '\\n\\n' + this.#i18n.t('core.handler.global-error.update-body')\n );\n\n if (wantReload) {\n window.location.reload();\n }\n } else {\n // why: KHÔNG gate `console.error` theo `isDevMode()`. Đăng ký `ErrorHandler` này là THAY THẾ\n // ErrorHandler mặc định của Angular — thứ vốn luôn log. Gate lại thì bản production nuốt sạch\n // mọi lỗi ứng dụng: không còn gì trong console, không còn gì cho công cụ thu thập log của\n // trình duyệt, và bug production trở nên vô hình. Log lỗi chính là toàn bộ giá trị chẩn đoán\n // của một ErrorHandler; muốn giấu thì là việc của app (thay ErrorHandler khác), không phải\n // hành vi mặc định của thư viện.\n console.error('Application error:', error);\n }\n }\n\n // Hàm phụ trợ để lấy text lỗi từ object error bất kỳ\n #extractErrorMessage = (error: any): string => {\n if (!error) return '';\n\n // Nếu là chuỗi\n if (typeof error === 'string') return error.toLowerCase();\n\n // Nếu là Error Object chuẩn\n if (error.message) return error.message.toLowerCase();\n\n // Nếu lỗi nằm trong rejection (Promise)\n if (error.rejection) {\n return typeof error.rejection === 'string' ? error.rejection.toLowerCase() : (error.rejection.message || '').toLowerCase();\n }\n return '';\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AAIA;AACA;MAEa,oBAAoB,CAAA;AACtB,IAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;;;IAI3B,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAE5D,IAAA,WAAA,GAAA,EAAe;AAEf,IAAA,WAAW,CAAC,KAAU,EAAA;;QAEpB,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;;;AAIrD,QAAA,MAAM,oBAAoB,GAAG;AAC3B,YAAA,eAAe;AACf,YAAA,kCAAkC;AAClC,YAAA,6CAA6C;AAC7C,YAAA,2CAA2C;AAC3C,YAAA,oBAAoB;SACrB;;QAGD,MAAM,YAAY,GAAG,oBAAoB,CAAC,IAAI,CAAC,SAAS,IAAI,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;QAE3G,IAAI,YAAY,EAAE;;;AAGhB,YAAA,IAAI,SAAS,EAAE;AAAE,gBAAA,OAAO,CAAC,IAAI,CAAC,+BAA+B,EAAE,YAAY,CAAC;;YAG5E,IAAI,CAAC,IAAI,CAAC,UAAU;gBAAE;YAEtB,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAC/B,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,wCAAwC,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,uCAAuC,CAAC,CACxH;YAED,IAAI,UAAU,EAAE;AACd,gBAAA,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE;YAC1B;QACF;aAAO;;;;;;;AAOL,YAAA,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC;QAC5C;IACF;;AAGA,IAAA,oBAAoB,GAAG,CAAC,KAAU,KAAY;AAC5C,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,EAAE;;QAGrB,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,YAAA,OAAO,KAAK,CAAC,WAAW,EAAE;;QAGzD,IAAI,KAAK,CAAC,OAAO;AAAE,YAAA,OAAO,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE;;AAGrD,QAAA,IAAI,KAAK,CAAC,SAAS,EAAE;AACnB,YAAA,OAAO,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,EAAE,WAAW,EAAE;QAC5H;AACA,QAAA,OAAO,EAAE;AACX,IAAA,CAAC;wGAnEU,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAApB,oBAAoB,EAAA,CAAA;;4FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC;;;ACND;;AAEG;;;;"}