@sdcorejs/angular 19.1.6 → 19.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 (354) 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/src/components/anchor/anchor.component.d.ts +3 -1
  6. package/components/badge/src/badge.component.d.ts +1 -0
  7. package/components/ckeditor-styles/src/ckeditor-styles.component.d.ts +1 -1
  8. package/components/form-generic/src/components/form-builder/components/expression-builder/expression-builder.component.d.ts +2 -1
  9. package/components/form-generic/src/components/form-builder/form-builder.component.d.ts +3 -1
  10. package/components/form-generic/src/components/form-render/components/item/components/checkbox/checkbox.component.d.ts +34 -0
  11. package/components/form-generic/src/components/form-render/components/item/components/index.d.ts +1 -0
  12. package/components/form-generic/src/components/form-render/components/item/components/table/table.component.d.ts +6 -1
  13. package/components/form-generic/src/components/sd-feel-expression/sd-feel-expression.component.d.ts +1 -1
  14. package/components/form-generic/src/configurations/form.configuration.d.ts +1 -1
  15. package/components/form-generic/src/models/form-generic-component.model.d.ts +8 -8
  16. package/components/form-generic/src/models/form-generic-definition-selection.model.d.ts +5 -5
  17. package/components/form-generic/src/models/form-generic-expression.model.d.ts +12 -12
  18. package/components/form-generic/src/models/index.d.ts +1 -0
  19. package/components/form-generic/src/services/form-generic.service.d.ts +2 -2
  20. package/components/import-excel/src/import-excel.component.d.ts +1 -0
  21. package/components/index.d.ts +6 -1
  22. package/components/mini-editor/src/mini-editor.model.d.ts +1 -1
  23. package/components/modal/src/modal.component.d.ts +3 -2
  24. package/components/modal-resizable/src/modal-resizable.component.d.ts +92 -0
  25. package/components/modal-resizable/src/modal-resizable.registry.d.ts +22 -0
  26. package/components/org-chart/src/org-chart.component.d.ts +6 -0
  27. package/components/preview/src/preview-image/preview-image.component.d.ts +1 -0
  28. package/components/query-bar/src/components/actions-bar/actions-bar.component.d.ts +6 -2
  29. package/components/query-bar/src/components/build-chip/build-chip.component.d.ts +4 -1
  30. package/components/query-bar/src/components/chip-popover/chip-popover.component.d.ts +8 -0
  31. package/components/query-bar/src/components/field-picker/field-picker.component.d.ts +2 -0
  32. package/components/query-bar/src/components/inline-chip/inline-chip.component.d.ts +2 -0
  33. package/components/query-bar/src/components/inline-value-chip/inline-value-chip.component.d.ts +3 -3
  34. package/components/query-bar/src/components/saved-filters-menu/saved-filters-menu.component.d.ts +9 -4
  35. package/components/query-bar/src/query-bar.component.d.ts +32 -5
  36. package/components/query-bar/src/query-bar.model.d.ts +15 -12
  37. package/components/query-builder/src/query-builder.component.d.ts +76 -39
  38. package/components/query-builder/src/query-builder.model.d.ts +59 -52
  39. package/components/query-builder/src/query-builder.serializer.d.ts +15 -6
  40. package/components/section/src/section.component.d.ts +3 -0
  41. package/components/side-drawer/src/body-scroll-lock.service.d.ts +10 -0
  42. package/components/splitter/src/splitter-handle/splitter-handle.component.d.ts +1 -0
  43. package/components/tab-router/index.d.ts +2 -1
  44. package/components/tab-router/src/actions/tab-router.action.d.ts +2 -2
  45. package/components/tab-router/src/components/tab-router-item/tab-router-item.component.d.ts +2 -2
  46. package/components/tab-router/src/components/tab-router-nav/tab-router-nav.component.d.ts +3 -3
  47. package/components/tab-router/src/components/tab-router-outlet/tab-router-outlet.component.d.ts +3 -3
  48. package/components/tab-router/src/decorators/tab.decorator.d.ts +13 -1
  49. package/components/tab-router/src/events/tab-router.event.d.ts +3 -3
  50. package/components/tab-router/src/models/tab-router.model.d.ts +2 -2
  51. package/components/tab-router/src/pipes/tab-info.pipe.d.ts +2 -2
  52. package/components/tab-router/src/services/tab-router.service.d.ts +9 -9
  53. package/components/table/index.d.ts +1 -0
  54. package/components/table/src/components/config/config.component.d.ts +6 -1
  55. package/components/table/src/components/desktop-cell/view/view.component.d.ts +1 -0
  56. package/components/table/src/components/filter/external-filter/external-filter.component.d.ts +1 -1
  57. package/components/table/src/components/filter/mobile-filter/mobile-filter.component.d.ts +1 -1
  58. package/components/table/src/components/selector-action/action-filter.pipe.d.ts +8 -1
  59. package/components/table/src/components/selector-action/selector-action.component.d.ts +2 -0
  60. package/components/table/src/directives/index.d.ts +1 -0
  61. package/components/table/src/directives/sd-table-command-header-def.directive.d.ts +24 -0
  62. package/components/table/src/models/table-column.model.d.ts +30 -13
  63. package/components/table/src/models/table-item.model.d.ts +30 -1
  64. package/components/table/src/models/table-option-selector.model.d.ts +5 -4
  65. package/components/table/src/models/table-option.model.d.ts +12 -0
  66. package/components/table/src/pipes/sd-group.pipe.d.ts +6 -2
  67. package/components/table/src/services/table-filter/table-filter.model.d.ts +15 -15
  68. package/components/table/src/services/table-filter/table-filter.service.d.ts +2 -2
  69. package/components/table/src/services/table-format/table-format.service.d.ts +1 -1
  70. package/components/table/src/services/table-selection/selection-action.util.d.ts +24 -0
  71. package/components/table/src/services/table-selection/table-selection.util.d.ts +31 -0
  72. package/components/table/src/services/tree/tree.util.d.ts +3 -2
  73. package/components/table/src/table.component.d.ts +51 -5
  74. package/components/tree/src/tree-item-def.directive.d.ts +1 -1
  75. package/components/tree/src/tree.component.d.ts +16 -4
  76. package/components/tree/src/tree.model.d.ts +31 -25
  77. package/components/upload-file/src/configurations/upload-file.configuration.d.ts +2 -2
  78. package/components/upload-file/src/upload-file.component.d.ts +4 -1
  79. package/configurations/src/sd-core.configuration.d.ts +1 -2
  80. package/fesm2022/sdcorejs-angular-components-anchor.mjs +36 -12
  81. package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
  82. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs +2 -2
  83. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs.map +1 -1
  84. package/fesm2022/sdcorejs-angular-components-badge.mjs +15 -2
  85. package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
  86. package/fesm2022/sdcorejs-angular-components-button.mjs +2 -2
  87. package/fesm2022/sdcorejs-angular-components-button.mjs.map +1 -1
  88. package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs +1 -1
  89. package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs.map +1 -1
  90. package/fesm2022/sdcorejs-angular-components-code-editor.mjs +3 -3
  91. package/fesm2022/sdcorejs-angular-components-code-editor.mjs.map +1 -1
  92. package/fesm2022/sdcorejs-angular-components-data-state.mjs +3 -3
  93. package/fesm2022/sdcorejs-angular-components-data-state.mjs.map +1 -1
  94. package/fesm2022/sdcorejs-angular-components-editor.mjs +2 -2
  95. package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
  96. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +324 -192
  97. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  98. package/fesm2022/sdcorejs-angular-components-history.mjs +4 -4
  99. package/fesm2022/sdcorejs-angular-components-history.mjs.map +1 -1
  100. package/fesm2022/sdcorejs-angular-components-import-excel.mjs +13 -5
  101. package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
  102. package/fesm2022/sdcorejs-angular-components-inform.mjs +3 -3
  103. package/fesm2022/sdcorejs-angular-components-inform.mjs.map +1 -1
  104. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs +164 -8
  105. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs.map +1 -1
  106. package/fesm2022/sdcorejs-angular-components-modal.mjs +30 -18
  107. package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
  108. package/fesm2022/sdcorejs-angular-components-org-chart.mjs +60 -13
  109. package/fesm2022/sdcorejs-angular-components-org-chart.mjs.map +1 -1
  110. package/fesm2022/sdcorejs-angular-components-preview.mjs +27 -17
  111. package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
  112. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +192 -30
  113. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  114. package/fesm2022/sdcorejs-angular-components-query-builder.mjs +187 -127
  115. package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
  116. package/fesm2022/sdcorejs-angular-components-section.mjs +16 -2
  117. package/fesm2022/sdcorejs-angular-components-section.mjs.map +1 -1
  118. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +83 -24
  119. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
  120. package/fesm2022/sdcorejs-angular-components-splitter.mjs +57 -21
  121. package/fesm2022/sdcorejs-angular-components-splitter.mjs.map +1 -1
  122. package/fesm2022/sdcorejs-angular-components-stepper.mjs +2 -2
  123. package/fesm2022/sdcorejs-angular-components-stepper.mjs.map +1 -1
  124. package/fesm2022/sdcorejs-angular-components-tab-router.mjs +68 -20
  125. package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
  126. package/fesm2022/sdcorejs-angular-components-tab.mjs +3 -2
  127. package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
  128. package/fesm2022/sdcorejs-angular-components-table.mjs +541 -254
  129. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  130. package/fesm2022/sdcorejs-angular-components-tree.mjs +80 -17
  131. package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
  132. package/fesm2022/sdcorejs-angular-components-upload-file.mjs +48 -13
  133. package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
  134. package/fesm2022/sdcorejs-angular-components.mjs +6 -1
  135. package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
  136. package/fesm2022/sdcorejs-angular-configurations.mjs.map +1 -1
  137. package/fesm2022/sdcorejs-angular-directives.mjs +45 -8
  138. package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -1
  139. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +40 -29
  140. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  141. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +5 -5
  142. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
  143. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +67 -50
  144. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
  145. package/fesm2022/sdcorejs-angular-forms-chip.mjs +57 -43
  146. package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
  147. package/fesm2022/sdcorejs-angular-forms-date-range.mjs +231 -60
  148. package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
  149. package/fesm2022/sdcorejs-angular-forms-date.mjs +95 -23
  150. package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
  151. package/fesm2022/sdcorejs-angular-forms-datetime.mjs +130 -26
  152. package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
  153. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs +39 -15
  154. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs.map +1 -1
  155. package/fesm2022/sdcorejs-angular-forms-input-color.mjs +16 -5
  156. package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -1
  157. package/fesm2022/sdcorejs-angular-forms-input-number.mjs +24 -9
  158. package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
  159. package/fesm2022/sdcorejs-angular-forms-input.mjs +58 -10
  160. package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
  161. package/fesm2022/sdcorejs-angular-forms-models.mjs +227 -6
  162. package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
  163. package/fesm2022/sdcorejs-angular-forms-radio.mjs +4 -4
  164. package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
  165. package/fesm2022/sdcorejs-angular-forms-select.mjs +135 -37
  166. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  167. package/fesm2022/sdcorejs-angular-forms-switch.mjs +18 -3
  168. package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
  169. package/fesm2022/sdcorejs-angular-forms-textarea.mjs +51 -62
  170. package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
  171. package/fesm2022/sdcorejs-angular-forms-time-range.mjs +57 -12
  172. package/fesm2022/sdcorejs-angular-forms-time-range.mjs.map +1 -1
  173. package/fesm2022/sdcorejs-angular-forms-time.mjs +16 -5
  174. package/fesm2022/sdcorejs-angular-forms-time.mjs.map +1 -1
  175. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs +100 -9
  176. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs.map +1 -1
  177. package/fesm2022/sdcorejs-angular-forms.mjs +91 -46
  178. package/fesm2022/sdcorejs-angular-forms.mjs.map +1 -1
  179. package/fesm2022/sdcorejs-angular-handlers.mjs +18 -3
  180. package/fesm2022/sdcorejs-angular-handlers.mjs.map +1 -1
  181. package/fesm2022/sdcorejs-angular-i18n.mjs +490 -68
  182. package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
  183. package/fesm2022/sdcorejs-angular-interceptors.mjs +87 -29
  184. package/fesm2022/sdcorejs-angular-interceptors.mjs.map +1 -1
  185. package/fesm2022/sdcorejs-angular-modules-auth.mjs +25 -15
  186. package/fesm2022/sdcorejs-angular-modules-auth.mjs.map +1 -1
  187. package/fesm2022/sdcorejs-angular-modules-icon.mjs +2 -2
  188. package/fesm2022/sdcorejs-angular-modules-icon.mjs.map +1 -1
  189. package/fesm2022/sdcorejs-angular-modules-keycloak.mjs +32 -3
  190. package/fesm2022/sdcorejs-angular-modules-keycloak.mjs.map +1 -1
  191. package/fesm2022/sdcorejs-angular-modules-layout.mjs +332 -111
  192. package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
  193. package/fesm2022/sdcorejs-angular-modules-permission.mjs +177 -40
  194. package/fesm2022/sdcorejs-angular-modules-permission.mjs.map +1 -1
  195. package/fesm2022/sdcorejs-angular-pipes.mjs +62 -28
  196. package/fesm2022/sdcorejs-angular-pipes.mjs.map +1 -1
  197. package/fesm2022/sdcorejs-angular-services-api.mjs +123 -13
  198. package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
  199. package/fesm2022/sdcorejs-angular-services-cache.mjs +53 -3
  200. package/fesm2022/sdcorejs-angular-services-cache.mjs.map +1 -1
  201. package/fesm2022/sdcorejs-angular-services-confirm.mjs +25 -73
  202. package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
  203. package/fesm2022/sdcorejs-angular-services-excel.mjs +12 -10
  204. package/fesm2022/sdcorejs-angular-services-excel.mjs.map +1 -1
  205. package/fesm2022/sdcorejs-angular-services-loading.mjs +75 -84
  206. package/fesm2022/sdcorejs-angular-services-loading.mjs.map +1 -1
  207. package/fesm2022/sdcorejs-angular-services-notify.mjs +46 -5
  208. package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -1
  209. package/fesm2022/sdcorejs-angular-services-storage.mjs +4 -0
  210. package/fesm2022/sdcorejs-angular-services-storage.mjs.map +1 -1
  211. package/fesm2022/sdcorejs-angular-services.mjs +0 -1
  212. package/fesm2022/sdcorejs-angular-services.mjs.map +1 -1
  213. package/fesm2022/sdcorejs-angular-utilities-extensions.mjs +225 -80
  214. package/fesm2022/sdcorejs-angular-utilities-extensions.mjs.map +1 -1
  215. package/fesm2022/sdcorejs-angular-utilities-models.mjs +1 -63
  216. package/fesm2022/sdcorejs-angular-utilities-models.mjs.map +1 -1
  217. package/fesm2022/sdcorejs-angular.mjs +17 -10
  218. package/fesm2022/sdcorejs-angular.mjs.map +1 -1
  219. package/forms/autocomplete/src/autocomplete.component.d.ts +5 -2
  220. package/forms/chip-calendar/src/chip-calendar.component.d.ts +10 -0
  221. package/forms/date/src/date.component.d.ts +13 -2
  222. package/forms/date-range/src/date-range.component.d.ts +13 -2
  223. package/forms/datetime/src/datetime.component.d.ts +13 -2
  224. package/forms/entity-picker/src/entity-picker.component.d.ts +9 -3
  225. package/forms/input/src/input.component.d.ts +3 -0
  226. package/forms/input-color/src/input-color.component.d.ts +4 -0
  227. package/forms/input-number/src/input-number.component.d.ts +3 -0
  228. package/forms/models/index.d.ts +3 -0
  229. package/forms/models/src/sd-form-control-connector.d.ts +12 -0
  230. package/forms/models/src/sd-model-facing-control.d.ts +43 -0
  231. package/forms/models/src/sd-search.model.d.ts +1 -1
  232. package/forms/models/src/sd-selection-data.model.d.ts +1 -1
  233. package/forms/models/src/sd-temporal-transform.d.ts +31 -0
  234. package/forms/models/src/sd-timer-scope.d.ts +29 -0
  235. package/forms/select/src/select.component.d.ts +27 -4
  236. package/forms/src/forms.module.d.ts +22 -13
  237. package/forms/switch/src/switch.component.d.ts +5 -0
  238. package/forms/textarea/src/textarea.component.d.ts +5 -3
  239. package/forms/time-range/src/time-range.component.d.ts +22 -1
  240. package/forms/tree-select/src/tree-select.component.d.ts +36 -5
  241. package/i18n/src/en.d.ts +90 -10
  242. package/i18n/src/i18n.messages.d.ts +1 -1
  243. package/i18n/src/i18n.pipe.d.ts +3 -3
  244. package/i18n/src/i18n.service.d.ts +2 -1
  245. package/i18n/src/i18n.types.d.ts +0 -3
  246. package/interceptors/no-internet/no-internet.interceptor.d.ts +11 -1
  247. package/modules/auth/services/auth.model.d.ts +1 -1
  248. package/modules/keycloak/keycloak.service.d.ts +1 -0
  249. package/modules/layout/components/shared/menu-tree/menu-tree.component.d.ts +2 -0
  250. package/modules/layout/components/sidebar-mobile-v1/components/sidebar/sidebar.component.d.ts +3 -3
  251. package/modules/layout/components/sidebar-mobile-v1/main.component.d.ts +3 -3
  252. package/modules/layout/components/sidebar-mobile-v2/main.component.d.ts +3 -3
  253. package/modules/layout/components/sidebar-mobile-v3/main.component.d.ts +3 -3
  254. package/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.d.ts +8 -3
  255. package/modules/layout/components/sidebar-v1/main.component.d.ts +3 -3
  256. package/modules/layout/components/sidebar-v2/main.component.d.ts +3 -3
  257. package/modules/layout/components/sidebar-v3/main.component.d.ts +3 -3
  258. package/modules/layout/modules/forbidden/pages/root/root.component.d.ts +5 -0
  259. package/modules/layout/modules/not-found/pages/root/root.component.d.ts +5 -0
  260. package/modules/layout/services/layout.service.d.ts +21 -0
  261. package/modules/layout/services/storage/storage.service.d.ts +52 -7
  262. package/modules/permission/src/configurations/permission.configuration.d.ts +11 -0
  263. package/modules/permission/src/directives/permission.directive.d.ts +2 -1
  264. package/modules/permission/src/services/permission.service.d.ts +52 -1
  265. package/package.json +40 -33
  266. package/pipes/src/safe-html.pipe.d.ts +26 -4
  267. package/pipes/src/time-different.pipe.d.ts +1 -0
  268. package/public-api.d.ts +11 -10
  269. package/services/api/src/api-host.d.ts +15 -0
  270. package/services/api/src/api.model.d.ts +14 -0
  271. package/services/api/src/api.module.d.ts +6 -0
  272. package/services/cache/src/cache.model.d.ts +10 -0
  273. package/services/index.d.ts +0 -1
  274. package/services/notify/index.d.ts +1 -1
  275. package/utilities/extensions/index.d.ts +1 -5
  276. package/utilities/extensions/src/url-safety.d.ts +72 -0
  277. package/utilities/extensions/src/utility.extension.d.ts +9 -5
  278. package/utilities/models/index.d.ts +0 -10
  279. package/components/base/index.d.ts +0 -1
  280. package/components/base/src/base-secure.component.d.ts +0 -8
  281. package/components/document-builder/index.d.ts +0 -4
  282. package/components/document-builder/src/components/header-footer-builder/header-footer-builder.component.d.ts +0 -15
  283. package/components/document-builder/src/components/header-footer-builder/plugins/page-number.plugin.d.ts +0 -4
  284. package/components/document-builder/src/components/index.d.ts +0 -1
  285. package/components/document-builder/src/document-builder.component.d.ts +0 -53
  286. package/components/document-builder/src/document-builder.config.d.ts +0 -21
  287. package/components/document-builder/src/document-builder.model.d.ts +0 -41
  288. package/components/document-builder/src/document-builder.utils.d.ts +0 -10
  289. package/components/document-builder/src/plugins/block-space/block-space.plugin.d.ts +0 -9
  290. package/components/document-builder/src/plugins/ck-comment/ck-comment.plugin.d.ts +0 -44
  291. package/components/document-builder/src/plugins/ck-comment/ck-comment.plugin.model.d.ts +0 -57
  292. package/components/document-builder/src/plugins/heading/heading.plugin.d.ts +0 -5
  293. package/components/document-builder/src/plugins/highlight-range/highlight-range.plugin.d.ts +0 -4
  294. package/components/document-builder/src/plugins/image-custom/image-custom.plugin.d.ts +0 -31
  295. package/components/document-builder/src/plugins/image-upload/image-upload.plugin.d.ts +0 -5
  296. package/components/document-builder/src/plugins/index.d.ts +0 -11
  297. package/components/document-builder/src/plugins/page-orientation/page-orientation.plugin.d.ts +0 -24
  298. package/components/document-builder/src/plugins/paste-handler/filters/bookmark.d.ts +0 -14
  299. package/components/document-builder/src/plugins/paste-handler/filters/br.d.ts +0 -15
  300. package/components/document-builder/src/plugins/paste-handler/filters/image.d.ts +0 -25
  301. package/components/document-builder/src/plugins/paste-handler/filters/list.d.ts +0 -29
  302. package/components/document-builder/src/plugins/paste-handler/filters/parse.d.ts +0 -35
  303. package/components/document-builder/src/plugins/paste-handler/filters/removeboldwrapper.d.ts +0 -15
  304. package/components/document-builder/src/plugins/paste-handler/filters/removegooglesheetstag.d.ts +0 -15
  305. package/components/document-builder/src/plugins/paste-handler/filters/removeinvalidtablewidth.d.ts +0 -15
  306. package/components/document-builder/src/plugins/paste-handler/filters/removemsattributes.d.ts +0 -15
  307. package/components/document-builder/src/plugins/paste-handler/filters/removestyleblock.d.ts +0 -15
  308. package/components/document-builder/src/plugins/paste-handler/filters/removexmlns.d.ts +0 -15
  309. package/components/document-builder/src/plugins/paste-handler/filters/replacemsfootnotes.d.ts +0 -54
  310. package/components/document-builder/src/plugins/paste-handler/filters/space.d.ts +0 -27
  311. package/components/document-builder/src/plugins/paste-handler/filters/table.d.ts +0 -16
  312. package/components/document-builder/src/plugins/paste-handler/filters/utils.d.ts +0 -25
  313. package/components/document-builder/src/plugins/paste-handler/index.d.ts +0 -35
  314. package/components/document-builder/src/plugins/paste-handler/normalizers/googledocsnormalizer.d.ts +0 -31
  315. package/components/document-builder/src/plugins/paste-handler/normalizers/googlesheetsnormalizer.d.ts +0 -31
  316. package/components/document-builder/src/plugins/paste-handler/normalizers/mswordnormalizer.d.ts +0 -29
  317. package/components/document-builder/src/plugins/paste-handler/types.d.ts +0 -30
  318. package/components/document-builder/src/plugins/table-custom/index.d.ts +0 -34
  319. package/components/document-builder/src/plugins/variable/variable.plugin.d.ts +0 -51
  320. package/components/table/src/pipes/selection-visible-select-all.pipe.d.ts +0 -9
  321. package/fesm2022/sdcorejs-angular-components-base.mjs +0 -23
  322. package/fesm2022/sdcorejs-angular-components-base.mjs.map +0 -1
  323. package/fesm2022/sdcorejs-angular-components-document-builder.mjs +0 -5038
  324. package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +0 -1
  325. package/fesm2022/sdcorejs-angular-models.mjs +0 -6
  326. package/fesm2022/sdcorejs-angular-models.mjs.map +0 -1
  327. package/fesm2022/sdcorejs-angular-services-docx.mjs +0 -291
  328. package/fesm2022/sdcorejs-angular-services-docx.mjs.map +0 -1
  329. package/fesm2022/sdcorejs-angular-services-license.mjs +0 -97
  330. package/fesm2022/sdcorejs-angular-services-license.mjs.map +0 -1
  331. package/models/index.d.ts +0 -1
  332. package/models/src/language.model.d.ts +0 -2
  333. package/services/docx/index.d.ts +0 -1
  334. package/services/docx/src/lib/docx.model.d.ts +0 -9
  335. package/services/docx/src/lib/docx.service.d.ts +0 -14
  336. package/services/docx/src/lib/pandoc-core.d.ts +0 -11
  337. package/services/docx/src/public-api.d.ts +0 -2
  338. package/services/license/index.d.ts +0 -1
  339. package/services/license/src/license.service.d.ts +0 -9
  340. package/utilities/extensions/src/array.extension.d.ts +0 -1
  341. package/utilities/extensions/src/color.extension.d.ts +0 -5
  342. package/utilities/extensions/src/date.extension.d.ts +0 -1
  343. package/utilities/extensions/src/number.extension.d.ts +0 -1
  344. package/utilities/extensions/src/string.extension.d.ts +0 -50
  345. package/utilities/models/src/color.model.d.ts +0 -4
  346. package/utilities/models/src/empty.model.d.ts +0 -4
  347. package/utilities/models/src/filter.model.d.ts +0 -12
  348. package/utilities/models/src/maybe-async.model.d.ts +0 -10
  349. package/utilities/models/src/nested-key-of.model.d.ts +0 -4
  350. package/utilities/models/src/operator.model.d.ts +0 -13
  351. package/utilities/models/src/order.model.d.ts +0 -4
  352. package/utilities/models/src/paging.model.d.ts +0 -8
  353. package/utilities/models/src/pattern.model.d.ts +0 -21
  354. package/utilities/models/src/size.model.d.ts +0 -4
@@ -1 +1 @@
1
- {"version":3,"file":"sdcorejs-angular-components-autoid-inspector.mjs","sources":["../../../projects/sdcorejs-angular/components/autoid-inspector/src/models/autoid-inspector-config.model.ts","../../../projects/sdcorejs-angular/components/autoid-inspector/src/services/autoid-scanner.service.ts","../../../projects/sdcorejs-angular/components/autoid-inspector/src/services/autoid-audit.service.ts","../../../projects/sdcorejs-angular/components/autoid-inspector/src/services/autoid-highlight.service.ts","../../../projects/sdcorejs-angular/components/autoid-inspector/src/services/autoid-export.service.ts","../../../projects/sdcorejs-angular/components/autoid-inspector/src/autoid-inspector.component.ts","../../../projects/sdcorejs-angular/components/autoid-inspector/src/autoid-inspector.component.html","../../../projects/sdcorejs-angular/components/autoid-inspector/sdcorejs-angular-components-autoid-inspector.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport interface SdAutoidInspectorConfiguration {\n /** Base URL cua backend sinh E2E test, vi du `http://localhost:3012`. */\n host?: string;\n /** Selector phu them can audit (mac dinh component da cover sd-* form + sd-button). */\n extraRequireSelectors?: string[];\n /** Root scan, mac dinh document.body. */\n root?: HTMLElement;\n}\n\n/** Cau hinh global cho AutoId Inspector. `[config]` tren component co the override theo instance. */\nexport const SD_AUTOID_INSPECTOR_CONFIGURATION = new InjectionToken<SdAutoidInspectorConfiguration>('sd.autoid-inspector.configuration');\n\n/** Selector mac dinh coi la phai co data-autoid. */\nexport const AUTOID_DEFAULT_REQUIRE_SELECTORS: readonly string[] = [\n 'sd-input',\n 'sd-input-number',\n 'sd-textarea',\n 'sd-select',\n 'sd-autocomplete',\n 'sd-checkbox',\n 'sd-radio',\n 'sd-switch',\n 'sd-date',\n 'sd-datetime',\n 'sd-date-range',\n 'sd-chip',\n 'sd-chip-calendar',\n 'sd-button',\n];\n","import { Injectable } from '@angular/core';\nimport { AutoidElement, AutoidElementState } from '../models/autoid-element.model';\n\n@Injectable({ providedIn: 'root' })\nexport class SdAutoidScannerService {\n /**\n * Quét element có [data-autoid] trong root, gắn name/tag/value/xpath.\n * Khi truyền `requireSelectors` (vd các sd-* form/button), những node khớp selector\n * mà KHÔNG có data-autoid (self lẫn con) sẽ được thêm vào dưới dạng phần tử fallback\n * (`autoid: ''`, xpath theo vị trí thẻ + cờ `missingAutoid` + warning) — để JSON xuất ra\n * vẫn dùng được và dev biết chỗ cần bổ sung autoid.\n */\n scan(root: HTMLElement = document.body, requireSelectors: readonly string[] = []): AutoidElement[] {\n const nodes = root.querySelectorAll<HTMLElement>('[data-autoid]');\n const dupCount: Record<string, number> = {};\n nodes.forEach(n => {\n const id = n.getAttribute('data-autoid');\n if (!id) return;\n dupCount[id] = (dupCount[id] ?? 0) + 1;\n });\n\n const result: AutoidElement[] = [];\n let stt = 1;\n nodes.forEach(node => {\n const autoid = node.getAttribute('data-autoid');\n if (!autoid) return;\n const state = this.readState(node);\n const tableScope = this.resolveTableScope(node);\n result.push({\n stt: stt++,\n name: this.resolveName(node),\n autoid,\n tag: this.resolveSdTag(node),\n text: this.resolveText(node),\n xpath: `//*[@data-autoid=\"${autoid}\"]`,\n duplicate: dupCount[autoid] > 1,\n state,\n tableScope,\n });\n });\n\n if (requireSelectors.length) {\n stt = this.appendMissing(root, requireSelectors, result, stt);\n }\n return result;\n }\n\n /**\n * Tìm các node khớp `requireSelectors` nhưng thiếu data-autoid (self + mọi descendant),\n * thêm vào `result` dưới dạng phần tử fallback. Trả về `stt` kế tiếp.\n */\n private appendMissing(root: HTMLElement, requireSelectors: readonly string[], result: AutoidElement[], startStt: number): number {\n let stt = startStt;\n const joined = requireSelectors.join(',');\n root.querySelectorAll<HTMLElement>(joined).forEach(node => {\n // Cùng quy ước với audit: bỏ qua khi self hoặc con đã có data-autoid.\n if (node.hasAttribute('data-autoid')) return;\n if (node.querySelector('[data-autoid]')) return;\n const tag = node.tagName.toLowerCase();\n result.push({\n stt: stt++,\n name: this.resolveName(node),\n autoid: '',\n tag,\n text: this.resolveText(node),\n xpath: this.fallbackXpath(node, tag),\n duplicate: false,\n state: this.readState(node),\n tableScope: this.resolveTableScope(node),\n missingAutoid: true,\n warning: 'Thiếu data-autoid — dùng xpath fallback theo tag (dev nên bổ sung autoid)',\n });\n });\n return stt;\n }\n\n /** XPath theo vị trí thẻ trong document, vd `(//sd-button)[2]`, khi không có autoid. */\n private fallbackXpath(node: HTMLElement, tag: string): string {\n const all = Array.from(document.querySelectorAll(tag));\n const idx = all.indexOf(node);\n return `(//${tag})[${idx >= 0 ? idx + 1 : 1}]`;\n }\n\n /** Group element theo autoid để consumer lấy duplicate map. */\n groupByAutoid(elements: AutoidElement[]): Record<string, AutoidElement[]> {\n const map: Record<string, AutoidElement[]> = {};\n for (const el of elements) {\n (map[el.autoid] ??= []).push(el);\n }\n return map;\n }\n\n /**\n * Read the optional `data-*` E2E state attributes off the same node.\n * Only includes fields actually present on the DOM (skipped fields stay undefined).\n */\n private readState(node: HTMLElement): AutoidElementState {\n const get = (n: string): string | undefined => {\n const v = node.getAttribute(n);\n return v === null ? undefined : v;\n };\n return {\n disabled: get('data-disabled'),\n loading: get('data-loading'),\n empty: get('data-empty'),\n invalid: get('data-invalid'),\n opened: get('data-opened'),\n count: get('data-count'),\n dataValue: get('data-value'),\n required: get('data-required'),\n maxlength: get('data-maxlength'),\n minlength: get('data-minlength'),\n pattern: get('data-pattern'),\n errorMessage: get('data-error-message'),\n type: get('data-type'),\n title: get('data-title'),\n message: get('data-message'),\n };\n }\n\n /**\n * If the node is inside an `<sd-table>` element, return that table's `data-autoid`.\n * Walks up via closest('sd-table') — skips the node itself if it IS the table.\n */\n private resolveTableScope(node: HTMLElement): string | undefined {\n // Skip self if the node itself is the sd-table host.\n const start = node.tagName.toLowerCase() === 'sd-table' ? node.parentElement : node;\n const table = start?.closest('sd-table') as HTMLElement | null;\n if (!table || table === node) return undefined;\n const id = table.getAttribute('data-autoid');\n return id ?? undefined;\n }\n\n private resolveName(node: HTMLElement): string {\n if (node.id) {\n // CSS.escape phòng id chứa ký tự đặc biệt làm vỡ selector.\n const sel = typeof CSS !== 'undefined' && CSS.escape ? CSS.escape(node.id) : node.id;\n const label = document.querySelector(`label[for=\"${sel}\"]`);\n const text = label?.textContent?.trim();\n if (text) return text;\n }\n return node.getAttribute('aria-label')?.trim() ?? node.getAttribute('placeholder')?.trim() ?? node.getAttribute('title')?.trim() ?? '';\n }\n\n private resolveSdTag(node: HTMLElement): string {\n let cur: HTMLElement | null = node;\n while (cur) {\n const tag = cur.tagName.toLowerCase();\n if (tag.startsWith('sd-')) return tag;\n cur = cur.parentElement;\n }\n return node.tagName.toLowerCase();\n }\n\n private resolveText(node: HTMLElement): string {\n const input = node as HTMLInputElement;\n if (typeof input.value === 'string' && input.value) return input.value;\n return (node.textContent ?? '').trim().slice(0, 80);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AutoidElement, AutoidAuditResult, AutoidMissing } from '../models/autoid-element.model';\nimport { AUTOID_DEFAULT_REQUIRE_SELECTORS } from '../models/autoid-inspector-config.model';\n\n@Injectable({ providedIn: 'root' })\nexport class SdAutoidAuditService {\n /**\n * Audit kết quả scan + DOM:\n * - duplicates: map autoid → count khi count > 1\n * - missing: element khớp selector yêu cầu nhưng KHÔNG có [data-autoid]\n */\n audit(elements: AutoidElement[], options: { requireSelectors?: readonly string[]; root?: HTMLElement } = {}): AutoidAuditResult {\n const requireSelectors = options.requireSelectors ?? AUTOID_DEFAULT_REQUIRE_SELECTORS;\n const root = options.root ?? document.body;\n\n const duplicates: Record<string, number> = {};\n for (const el of elements) {\n if (el.duplicate) {\n duplicates[el.autoid] = (duplicates[el.autoid] ?? 0) + 1;\n }\n }\n\n const missing = this.findMissing(root, requireSelectors);\n\n return {\n total: elements.length,\n duplicates,\n duplicateCount: Object.keys(duplicates).length,\n missing,\n missingCount: missing.length,\n };\n }\n\n private findMissing(root: HTMLElement, selectors: readonly string[]): AutoidMissing[] {\n if (!selectors.length) return [];\n const joined = selectors.join(',');\n const nodes = root.querySelectorAll<HTMLElement>(joined);\n const missing: AutoidMissing[] = [];\n\n nodes.forEach(node => {\n // Coi là missing khi element + mọi descendant đều không có data-autoid.\n // Lý do: sd-button render thành <button data-autoid=\"...\"> bên trong host\n // <sd-button>. Nếu chỉ check chính host sẽ false-positive cho mọi sd-button.\n if (node.hasAttribute('data-autoid')) return;\n if (node.querySelector('[data-autoid]')) return;\n\n missing.push({\n tag: node.tagName.toLowerCase(),\n selector: this.buildSelectorPath(node),\n outerHtmlPreview: this.shortHtml(node),\n nameHint: this.resolveNameHint(node),\n });\n });\n\n return missing;\n }\n\n private buildSelectorPath(node: HTMLElement): string {\n const parts: string[] = [];\n let cur: HTMLElement | null = node;\n let depth = 0;\n while (cur && depth < 4) {\n let part = cur.tagName.toLowerCase();\n if (cur.id) {\n part += `#${cur.id}`;\n parts.unshift(part);\n break;\n }\n const cls = (cur.getAttribute('class') ?? '').trim().split(/\\s+/).filter(Boolean).slice(0, 2);\n if (cls.length) part += `.${cls.join('.')}`;\n parts.unshift(part);\n cur = cur.parentElement;\n depth++;\n }\n return parts.join(' > ');\n }\n\n private shortHtml(node: HTMLElement): string {\n const html = node.outerHTML.replace(/\\s+/g, ' ');\n return html.length > 160 ? html.slice(0, 157) + '...' : html;\n }\n\n private resolveNameHint(node: HTMLElement): string {\n return (\n node.getAttribute('label') ?? node.getAttribute('placeholder') ?? node.getAttribute('aria-label') ?? node.getAttribute('title') ?? ''\n );\n }\n}\n","import { Injectable } from '@angular/core';\n\nconst ATTR = 'data-sd-autoid-highlight';\nconst SAVED_OUTLINE = 'data-sd-autoid-prev-outline';\nconst SAVED_OUTLINE_OFFSET = 'data-sd-autoid-prev-outline-offset';\nconst SAVED_BG = 'data-sd-autoid-prev-bg';\nconst SAVED_BORDER_RADIUS = 'data-sd-autoid-prev-radius';\n\n// Token màu lấy từ @sdcorejs/angular theme (--sd-*). Fallback hex áp dụng khi\n// consumer chưa import sd-core.scss. Dùng cùng bộ var với scss component để\n// nhất quán visual giữa highlight ok / duplicate / missing.\nconst COLOR_OK = 'var(--sd-success, #2e7d32)';\nconst COLOR_OK_BG = 'var(--sd-success-light, #d8f0d3)';\nconst COLOR_DUP = 'var(--sd-error, #ba1a1a)';\nconst COLOR_DUP_BG = 'var(--sd-error-light, #ffdad6)';\nconst COLOR_MISSING = 'var(--sd-warning, #a66300)';\nconst COLOR_MISSING_BG = 'var(--sd-warning-light, #ffddb0)';\n\n@Injectable({ providedIn: 'root' })\nexport class SdAutoidHighlightService {\n /** Apply outline cho mọi [data-autoid]: xanh nếu unique, đỏ nếu duplicate. Idempotent. */\n apply(root: HTMLElement = document.body): void {\n this.clear(root);\n const nodes = root.querySelectorAll<HTMLElement>('[data-autoid]');\n const count: Record<string, number> = {};\n nodes.forEach(n => {\n const id = n.getAttribute('data-autoid');\n if (!id) return;\n count[id] = (count[id] ?? 0) + 1;\n });\n\n // Để tránh apply 2 lần lên cùng 1 target khi nhiều [data-autoid] cùng\n // chia sẻ 1 sd-* host (vd 2 input lồng trong 1 sd-date-range).\n const visited = new Set<HTMLElement>();\n\n nodes.forEach(node => {\n const id = node.getAttribute('data-autoid');\n if (!id) return;\n\n // Highlight HOST sd-* (giống applyMissing) — outline ôm trọn card,\n // không hiển thị lệch trên input con / label fragment. Fallback về\n // chính node khi không tìm thấy sd-* ancestor (vd native button).\n const target = this.#resolveTarget(node);\n if (visited.has(target)) return;\n visited.add(target);\n\n const isDup = count[id] > 1;\n this.#paint(target, isDup ? COLOR_DUP : COLOR_OK, isDup ? COLOR_DUP_BG : COLOR_OK_BG, 'solid', isDup ? 'duplicate' : 'ok');\n });\n }\n\n /** Highlight tập element không có autoid (missing) bằng outline cam dashed. */\n applyMissing(nodes: HTMLElement[]): void {\n nodes.forEach(node => {\n if (node.hasAttribute(ATTR)) return;\n this.#paint(node, COLOR_MISSING, COLOR_MISSING_BG, 'dashed', 'missing');\n });\n }\n\n /** Restore inline style như trước khi apply. */\n clear(root: HTMLElement = document.body): void {\n const nodes = root.querySelectorAll<HTMLElement>(`[${ATTR}]`);\n nodes.forEach(node => {\n node.style.outline = node.getAttribute(SAVED_OUTLINE) ?? '';\n node.style.outlineOffset = node.getAttribute(SAVED_OUTLINE_OFFSET) ?? '';\n node.style.backgroundColor = node.getAttribute(SAVED_BG) ?? '';\n node.style.borderRadius = node.getAttribute(SAVED_BORDER_RADIUS) ?? '';\n node.removeAttribute(SAVED_OUTLINE);\n node.removeAttribute(SAVED_OUTLINE_OFFSET);\n node.removeAttribute(SAVED_BG);\n node.removeAttribute(SAVED_BORDER_RADIUS);\n node.removeAttribute(ATTR);\n });\n }\n\n // ==========================================\n // HELPERS\n // ==========================================\n #resolveTarget(node: HTMLElement): HTMLElement {\n let cur: HTMLElement | null = node;\n while (cur) {\n if (cur.tagName.toLowerCase().startsWith('sd-')) return cur;\n cur = cur.parentElement;\n }\n return node;\n }\n\n #paint(node: HTMLElement, color: string, bg: string, style: 'solid' | 'dashed', marker: 'ok' | 'duplicate' | 'missing'): void {\n // Backup full style cần restore để clear() đưa về nguyên trạng.\n node.setAttribute(SAVED_OUTLINE, node.style.outline ?? '');\n node.setAttribute(SAVED_OUTLINE_OFFSET, node.style.outlineOffset ?? '');\n node.setAttribute(SAVED_BG, node.style.backgroundColor ?? '');\n node.setAttribute(SAVED_BORDER_RADIUS, node.style.borderRadius ?? '');\n\n node.style.outline = `2px ${style} ${color}`;\n // outline-offset 2px tránh đè lên border của host (mat-form-field, button)\n // → highlight nằm gọn ngoài card thay vì cắt vào nội dung.\n node.style.outlineOffset = '2px';\n node.style.backgroundColor = bg;\n // Bo nhẹ để outline trông sạch trên host bo góc sẵn.\n if (!node.style.borderRadius) {\n node.style.borderRadius = '6px';\n }\n node.setAttribute(ATTR, marker);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AutoidElement, AutoidElementState } from '../models/autoid-element.model';\nimport { AutoidExportMeta } from '../models/autoid-export-format.model';\n\n@Injectable({ providedIn: 'root' })\nexport class SdAutoidExportService {\n /**\n * Có `meta` → bọc `{ meta, elements }` (kèm url/queryParams) để consumer biết trang/route.\n * Không `meta` → giữ mảng thuần (back-compat cho caller cũ chỉ cần elements).\n */\n toJson(elements: AutoidElement[], meta?: AutoidExportMeta): string {\n if (meta) return JSON.stringify({ meta, elements }, null, 2);\n return JSON.stringify(elements, null, 2);\n }\n\n /** Parse a `location.search` string into a flat key/value map (last value wins). */\n parseQueryParams(search: string): Record<string, string> {\n const out: Record<string, string> = {};\n new URLSearchParams(search || '').forEach((v, k) => {\n out[k] = v;\n });\n return out;\n }\n\n toCsv(elements: AutoidElement[]): string {\n const header = 'STT,name,autoid,tag,table-scope,disabled,loading,empty,invalid,opened,count,data-value,text,xpath';\n const rows = elements.map(el =>\n [\n el.stt,\n this.q(el.name),\n this.q(el.autoid),\n this.q(el.tag),\n this.q(el.tableScope ?? ''),\n this.q(el.state.disabled ?? ''),\n this.q(el.state.loading ?? ''),\n this.q(el.state.empty ?? ''),\n this.q(el.state.invalid ?? ''),\n this.q(el.state.opened ?? ''),\n this.q(el.state.count ?? ''),\n this.q(el.state.dataValue ?? ''),\n this.q(el.text),\n this.q(el.xpath),\n ].join(',')\n );\n return [header, ...rows].join('\\n') + '\\n';\n }\n\n /** POM TypeScript skeleton — copy ngay vào file Playwright/Cypress. */\n toMarkdownPom(elements: AutoidElement[], meta: AutoidExportMeta): string {\n const className = this.toPascal(meta.pageTitle || 'AutoGenerated') + 'Page';\n const lines: string[] = [];\n lines.push(`# ${className}`);\n lines.push('');\n lines.push(`- Page: \\`${meta.pageUrl}\\``);\n lines.push(`- Generated: \\`${meta.timestamp}\\``);\n lines.push('');\n lines.push('```ts');\n lines.push(`export class ${className} {`);\n for (const el of elements) {\n // autoid rỗng (phần tử fallback thiếu autoid) → đặt tên prop theo tag + stt.\n const propName = el.autoid ? this.toCamel(el.autoid) : this.toCamel(`${el.tag}-${el.stt}`);\n const nameHint = el.name ? ` ${el.name} —` : '';\n const stateSummary = this.buildStateSummary(el.state);\n const stateStr = stateSummary ? ` — ${stateSummary}` : '';\n lines.push(` /** ${el.tag}${nameHint}${stateStr} */`);\n lines.push(` readonly ${propName} = '${el.xpath}';`);\n }\n lines.push('}');\n lines.push('```');\n lines.push('');\n return lines.join('\\n');\n }\n\n /** Markdown reference table, group FIRST by tableScope (top-level first, then per table), then by tag. */\n toMarkdownTable(elements: AutoidElement[], meta: AutoidExportMeta): string {\n const lines: string[] = [];\n lines.push('# AutoId Reference');\n lines.push('');\n lines.push(`- Page: \\`${meta.pageUrl}\\``);\n lines.push(`- Generated: \\`${meta.timestamp}\\``);\n lines.push('');\n\n // Partition into top-level and per-table buckets.\n const topLevel = elements.filter(el => !el.tableScope);\n // Collect unique table scopes in insertion order (preserves DOM order).\n const tableScopes: string[] = [];\n for (const el of elements) {\n if (el.tableScope && !tableScopes.includes(el.tableScope)) {\n tableScopes.push(el.tableScope);\n }\n }\n tableScopes.sort();\n\n const renderTagGroup = (items: AutoidElement[]) => {\n const groups = new Map<string, AutoidElement[]>();\n for (const el of items) {\n const key = el.tag || '(no-tag)';\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(el);\n }\n const sortedTags = [...groups.keys()].sort();\n for (const tag of sortedTags) {\n lines.push(`### ${tag}`);\n lines.push('');\n lines.push('| name | autoid | xpath | state | duplicate |');\n lines.push('|------|--------|-------|-------|-----------|');\n for (const el of groups.get(tag)!) {\n const stateSummary = this.buildStateSummary(el.state);\n lines.push(\n `| ${this.mdCell(el.name)} | \\`${el.autoid}\\` | \\`${el.xpath}\\` | ${this.mdCell(stateSummary)} | ${el.duplicate ? '⚠️' : ''} |`\n );\n }\n lines.push('');\n }\n };\n\n // Top-level section.\n lines.push('## Top-level');\n lines.push('');\n if (topLevel.length > 0) {\n renderTagGroup(topLevel);\n } else {\n lines.push('_(no top-level elements)_');\n lines.push('');\n }\n\n // Per-table sections.\n for (const scope of tableScopes) {\n lines.push(`## Inside table \\`${scope}\\``);\n lines.push('');\n const scopeItems = elements.filter(el => el.tableScope === scope);\n renderTagGroup(scopeItems);\n }\n\n return lines.join('\\n');\n }\n\n download(content: string, filename: string, mime: string): void {\n const blob = new Blob([content], { type: mime });\n this.downloadBlob(blob, filename);\n }\n\n downloadBlob(blob: Blob, filename: string): void {\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n }\n\n async copyToClipboard(content: string): Promise<void> {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(content);\n return;\n }\n // Fallback cho browser cũ / context không có clipboard API.\n const ta = document.createElement('textarea');\n ta.value = content;\n ta.style.position = 'fixed';\n ta.style.opacity = '0';\n document.body.appendChild(ta);\n ta.select();\n document.execCommand('copy');\n document.body.removeChild(ta);\n }\n\n /** Build a compact state summary string from defined state keys, e.g. \"disabled=false; empty=true\". */\n private buildStateSummary(state: AutoidElementState): string {\n const parts: string[] = [];\n if (state.disabled !== undefined) parts.push(`disabled=${state.disabled}`);\n if (state.loading !== undefined) parts.push(`loading=${state.loading}`);\n if (state.empty !== undefined) parts.push(`empty=${state.empty}`);\n if (state.invalid !== undefined) parts.push(`invalid=${state.invalid}`);\n if (state.opened !== undefined) parts.push(`opened=${state.opened}`);\n if (state.count !== undefined) parts.push(`count=${state.count}`);\n if (state.dataValue !== undefined) parts.push(`data-value=${state.dataValue}`);\n return parts.join('; ');\n }\n\n private q(v: string | number): string {\n const s = String(v ?? '').replace(/\"/g, '\"\"');\n return `\"${s}\"`;\n }\n\n private mdCell(s: string): string {\n return (s || '').replace(/\\|/g, '\\\\|').replace(/\\n/g, ' ');\n }\n\n private toCamel(autoid: string): string {\n const parts = autoid.split(/[-_]/).filter(Boolean);\n return parts.map((p, i) => (i === 0 ? p : p[0].toUpperCase() + p.slice(1))).join('');\n }\n\n private toPascal(title: string): string {\n return title\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean)\n .map(p => p[0].toUpperCase() + p.slice(1))\n .join('');\n }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n HostListener,\n inject,\n input,\n OnDestroy,\n signal,\n} from '@angular/core';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { FormsModule } from '@angular/forms';\nimport { ActivatedRouteSnapshot, Router } from '@angular/router';\n\nimport { AutoidElement, AutoidAuditResult } from './models/autoid-element.model';\nimport {\n SdAutoidInspectorConfiguration,\n AUTOID_DEFAULT_REQUIRE_SELECTORS,\n SD_AUTOID_INSPECTOR_CONFIGURATION,\n} from './models/autoid-inspector-config.model';\nimport { AutoidE2eTarget, AutoidExportJson, AutoidExportMeta, AutoidRobotExportContext } from './models/autoid-export-format.model';\nimport { SdAutoidScannerService } from './services/autoid-scanner.service';\nimport { SdAutoidAuditService } from './services/autoid-audit.service';\nimport { SdAutoidHighlightService } from './services/autoid-highlight.service';\nimport { SdAutoidExportService } from './services/autoid-export.service';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\ntype Segment = 'audit' | 'elements' | 'export';\ntype RobotContextField = keyof AutoidRobotExportContext;\n\n@Component({\n selector: 'sd-autoid-inspector',\n templateUrl: './autoid-inspector.component.html',\n styleUrl: './autoid-inspector.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [SdIcon, CommonModule, FormsModule, MatTooltipModule],\n})\nexport class SdAutoidInspector implements OnDestroy {\n readonly #injectedConfig = inject<SdAutoidInspectorConfiguration | null>(SD_AUTOID_INSPECTOR_CONFIGURATION, { optional: true });\n\n // ==========================================\n // INPUTS\n // ==========================================\n enabled = input(true, { transform: booleanAttribute });\n config = input<SdAutoidInspectorConfiguration | undefined>(undefined);\n\n // ==========================================\n // STATE\n // ==========================================\n open = signal(false);\n segment = signal<Segment>('audit');\n filter = signal('');\n elements = signal<AutoidElement[]>([]);\n audit = signal<AutoidAuditResult | null>(null);\n copyOk = signal(false);\n e2eExporting = signal<AutoidE2eTarget | null>(null);\n e2eExportOk = signal<string | null>(null);\n e2eExportError = signal<string | null>(null);\n robotContextOpen = signal(false);\n robotExportContext = signal<AutoidRobotExportContext>({});\n // Default true để mở panel lần đầu là có highlight ngay. Đóng panel KHÔNG\n // tự tắt — user toggle qua nút trong tab Audit khi muốn nhìn DOM gốc.\n highlightOn = signal(true);\n // Ẩn tạm FAB — chỉ in-memory, reload trang sẽ hiện lại (theo thiết kế).\n dismissed = signal(false);\n\n readonly e2eGeneratorHost = computed(() => this.#normalizeHost(this.#effectiveConfig().host));\n readonly hasRobotExportContext = computed(() => Object.values(this.robotExportContext()).some(value => Boolean(value?.trim())));\n\n filteredElements = computed(() => {\n const q = this.filter().trim().toLowerCase();\n if (!q) return this.elements();\n return this.elements().filter(\n el => el.autoid.toLowerCase().includes(q) || el.name.toLowerCase().includes(q) || el.tag.toLowerCase().includes(q)\n );\n });\n\n /**\n * Elements not inside any sd-table — rendered in the main \"Top-level\" section.\n */\n readonly topLevelElements = computed(() => this.filteredElements().filter(el => !el.tableScope));\n\n /**\n * Map of `sd-table` autoid → its inner autoid elements. Tables themselves\n * stay in `topLevelElements` (the table's own autoid is top-level).\n */\n readonly tableGroups = computed(() => {\n const groups = new Map<string, AutoidElement[]>();\n for (const el of this.filteredElements()) {\n if (!el.tableScope) continue;\n if (!groups.has(el.tableScope)) groups.set(el.tableScope, []);\n groups.get(el.tableScope)!.push(el);\n }\n // Return a sorted array for stable rendering.\n return [...groups.entries()].sort(([a], [b]) => a.localeCompare(b)).map(([scope, items]) => ({ scope, items }));\n });\n\n // ==========================================\n // DATA-* ATTRIBUTE COMPUTEDS (for E2E selectors)\n // ==========================================\n readonly dataOpened = computed(() => (this.open() ? 'true' : 'false'));\n readonly dataHighlightOn = computed(() => (this.highlightOn() ? 'true' : 'false'));\n readonly dataSegment = computed(() => this.segment());\n readonly dataElementCount = computed(() => String(this.elements().length));\n readonly dataMissingCount = computed(() => String(this.audit()?.missingCount ?? 0));\n readonly dataDuplicateCount = computed(() => String(this.audit()?.duplicateCount ?? 0));\n\n // ==========================================\n // SERVICES\n // ==========================================\n #scanner = inject(SdAutoidScannerService);\n #auditSvc = inject(SdAutoidAuditService);\n #highlight = inject(SdAutoidHighlightService);\n #export = inject(SdAutoidExportService);\n // Optional — chỉ có khi app dùng RouterModule; dùng để lấy route params cho meta.\n #router = inject(Router, { optional: true });\n\n // ==========================================\n // LIFECYCLE\n // ==========================================\n ngOnDestroy(): void {\n this.#highlight.clear(this.#root());\n }\n\n // ==========================================\n // ACTIONS\n // ==========================================\n togglePanel = (): void => {\n if (this.open()) {\n this.closePanel();\n } else {\n this.openPanel();\n }\n };\n\n openPanel = (): void => {\n if (!this.enabled()) return;\n this.refresh();\n this.open.set(true);\n };\n\n closePanel = (): void => {\n this.open.set(false);\n // Highlight được giữ lại để user vẫn thấy outline khi panel ẩn —\n // toggleHighlight trong tab Audit là cách duy nhất để clear.\n };\n\n refresh = (): void => {\n const root = this.#root();\n const elements = this.#scanner.scan(root, this.#requireSelectors());\n const result = this.#auditSvc.audit(elements, {\n root,\n requireSelectors: this.#requireSelectors(),\n });\n this.elements.set(elements);\n this.audit.set(result);\n this.#applyHighlightIfOn(result);\n };\n\n dismissFab = (event: Event): void => {\n event.stopPropagation();\n this.dismissed.set(true);\n if (this.open()) this.closePanel();\n };\n\n toggleHighlight = (): void => {\n const next = !this.highlightOn();\n this.highlightOn.set(next);\n if (next) {\n this.#applyHighlightIfOn(this.audit());\n } else {\n this.#highlight.clear(this.#root());\n }\n };\n\n setSegment = (seg: Segment): void => this.segment.set(seg);\n\n copyJson = async (): Promise<void> => {\n await this.#export.copyToClipboard(this.#export.toJson(this.elements(), this.#meta()));\n this.#flashCopyOk();\n };\n\n copyXpath = async (autoid: string): Promise<void> => {\n await this.#export.copyToClipboard(`//*[@data-autoid=\"${autoid}\"]`);\n this.#flashCopyOk();\n };\n\n exportCsv = (): void => {\n this.#export.download(this.#export.toCsv(this.elements()), this.#filename('csv'), 'text/csv;charset=utf-8');\n };\n\n exportJson = (): void => {\n this.#export.download(this.#export.toJson(this.elements(), this.#meta()), this.#filename('json'), 'application/json');\n };\n\n exportMdPom = (): void => {\n this.#export.download(this.#export.toMarkdownPom(this.elements(), this.#meta()), this.#filename('pom.md'), 'text/markdown');\n };\n\n exportMdTable = (): void => {\n this.#export.download(this.#export.toMarkdownTable(this.elements(), this.#meta()), this.#filename('reference.md'), 'text/markdown');\n };\n\n openRobotExportContext = (): void => {\n if (this.e2eExporting()) return;\n this.e2eExportOk.set(null);\n this.e2eExportError.set(null);\n this.robotContextOpen.set(true);\n };\n\n closeRobotExportContext = (): void => {\n if (this.e2eExporting()) return;\n this.robotContextOpen.set(false);\n };\n\n updateRobotExportContext = (field: RobotContextField, value: string): void => {\n this.robotExportContext.update(context => ({\n ...context,\n [field]: value,\n }));\n };\n\n confirmRobotExport = async (): Promise<void> => {\n const context = this.#cleanRobotExportContext();\n if (!context) return;\n const exported = await this.exportE2eTest('robot', context);\n if (exported) this.robotContextOpen.set(false);\n };\n\n exportE2eTest = async (target: AutoidE2eTarget, context?: AutoidRobotExportContext): Promise<boolean> => {\n const host = this.e2eGeneratorHost();\n if (!host || this.e2eExporting()) return false;\n\n this.e2eExporting.set(target);\n this.e2eExportOk.set(null);\n this.e2eExportError.set(null);\n\n try {\n this.refresh();\n const response = await fetch(this.#e2eEndpoint(host, target), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(this.#testGenerationRequest(target, context)),\n });\n\n if (!response.ok) {\n throw new Error(await this.#responseErrorMessage(response));\n }\n\n const blob = await response.blob();\n this.#export.downloadBlob(blob, this.#zipFilename(response, target));\n this.#flashE2eExportOk(this.#targetLabel(target));\n return true;\n } catch (err) {\n this.e2eExportError.set(this.#toErrorMessage(err));\n return false;\n } finally {\n this.e2eExporting.set(null);\n }\n };\n\n // ==========================================\n // KEYBOARD: Esc đóng panel\n // ==========================================\n @HostListener('document:keydown.escape')\n onEscape(): void {\n if (this.open()) this.closePanel();\n }\n\n // ==========================================\n // HELPERS\n // ==========================================\n #root(): HTMLElement {\n return this.#effectiveConfig().root ?? document.body;\n }\n\n #requireSelectors(): readonly string[] {\n const extra = this.#effectiveConfig().extraRequireSelectors ?? [];\n return [...new Set([...AUTOID_DEFAULT_REQUIRE_SELECTORS, ...extra])];\n }\n\n #effectiveConfig(): SdAutoidInspectorConfiguration {\n const injected = this.#injectedConfig ?? {};\n const local = this.config() ?? {};\n return {\n ...injected,\n ...local,\n extraRequireSelectors: [...(injected.extraRequireSelectors ?? []), ...(local.extraRequireSelectors ?? [])],\n };\n }\n\n #highlightMissing(result: AutoidAuditResult): void {\n if (!result.missing.length) return;\n const root = this.#root();\n const selector = this.#requireSelectors().join(',');\n const all = Array.from(root.querySelectorAll<HTMLElement>(selector));\n const missingNodes = all.filter(n => !n.hasAttribute('data-autoid') && !n.querySelector('[data-autoid]'));\n this.#highlight.applyMissing(missingNodes);\n }\n\n #applyHighlightIfOn(result: AutoidAuditResult | null): void {\n if (!this.highlightOn()) return;\n const root = this.#root();\n this.#highlight.apply(root);\n if (result) this.#highlightMissing(result);\n }\n\n #meta(): AutoidExportMeta {\n const loc = window.location;\n return {\n pageUrl: loc.pathname + loc.search,\n pageTitle: document.title || 'Page',\n timestamp: new Date().toISOString(),\n url: loc.href,\n pathname: loc.pathname,\n search: loc.search,\n queryParams: this.#export.parseQueryParams(loc.search),\n params: this.#routeParams(),\n };\n }\n\n /**\n * Route path params gộp dọc cây ActivatedRoute (nếu có Router). Trả về undefined khi\n * không có Router hoặc không có param nào — để `meta.params` được bỏ qua khỏi JSON.\n */\n #routeParams(): Record<string, string> | undefined {\n if (!this.#router) return undefined;\n const params: Record<string, string> = {};\n let route: ActivatedRouteSnapshot | null = this.#router.routerState.snapshot.root;\n while (route) {\n Object.assign(params, route.params);\n route = route.firstChild;\n }\n return Object.keys(params).length ? params : undefined;\n }\n\n #filename(ext: string): string {\n const slug = (document.title || 'autoid')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n return `${slug || 'autoid'}-${Date.now()}.${ext}`;\n }\n\n #normalizeHost(host: string | undefined): string | undefined {\n const trimmed = host?.trim();\n if (!trimmed) return undefined;\n return trimmed.replace(/\\/+$/g, '');\n }\n\n #e2eEndpoint(host: string, target: AutoidE2eTarget): string {\n const endpoint = target === 'playwright' ? 'playwright' : 'robot';\n return `${host}/e2e/test-generator/${endpoint}`;\n }\n\n #testGenerationRequest(\n target: AutoidE2eTarget,\n context?: AutoidRobotExportContext\n ): {\n payload: AutoidExportJson;\n options: {\n language: 'vi';\n mode: 'happy-path';\n outputName: string;\n testName: string;\n baseUrl?: string;\n };\n prompt?: string;\n context?: AutoidRobotExportContext;\n } {\n const baseUrl = this.#baseUrl();\n const options = {\n language: 'vi' as const,\n mode: 'happy-path' as const,\n outputName: this.#outputBaseName(target),\n testName: `${document.title || 'AutoId'} ${this.#targetLabel(target)}`,\n ...(baseUrl ? { baseUrl } : {}),\n };\n\n return {\n payload: {\n meta: this.#meta(),\n elements: this.elements(),\n },\n options,\n ...(context\n ? {\n prompt: 'Sinh Robot Framework E2E test bám theo ngữ cảnh QC, testcase, test data và requirement được cung cấp.',\n context,\n }\n : {}),\n };\n }\n\n #cleanRobotExportContext(): AutoidRobotExportContext | undefined {\n const context = this.robotExportContext();\n const cleaned: AutoidRobotExportContext = {};\n\n for (const [key, value] of Object.entries(context) as [RobotContextField, string | undefined][]) {\n const trimmed = value?.trim();\n if (trimmed) cleaned[key] = trimmed;\n }\n\n return Object.keys(cleaned).length ? cleaned : undefined;\n }\n\n #baseUrl(): string | undefined {\n const origin = window.location.origin;\n return /^https?:\\/\\//.test(origin) ? origin : undefined;\n }\n\n #outputBaseName(target: AutoidE2eTarget): string {\n const slug = (document.title || 'autoid')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n return `${slug || 'autoid'}-${target === 'playwright' ? 'playwright' : 'robot-framework'}`;\n }\n\n #targetLabel(target: AutoidE2eTarget): string {\n return target === 'playwright' ? 'Playwright' : 'Robot Framework';\n }\n\n #zipFilename(response: Response, target: AutoidE2eTarget): string {\n const header = response.headers.get('Content-Disposition') ?? '';\n const filenameStar = /filename\\*=UTF-8''([^;]+)/i.exec(header)?.[1];\n if (filenameStar) return this.#decodeFilename(filenameStar.replace(/^\"|\"$/g, ''));\n\n const filename = /filename=\"?([^\";]+)\"?/i.exec(header)?.[1];\n return filename?.trim() || this.#filename(`e2e-${target}.zip`);\n }\n\n #decodeFilename(value: string): string {\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n }\n\n async #responseErrorMessage(response: Response): Promise<string> {\n const fallback = `Không sinh được E2E test (HTTP ${response.status}).`;\n const text = await response.text().catch(() => '');\n if (!text) return fallback;\n\n try {\n const parsed = JSON.parse(text) as { message?: unknown; error?: unknown };\n const message = Array.isArray(parsed.message) ? parsed.message.join(', ') : parsed.message;\n if (typeof message === 'string' && message.trim()) return message;\n if (typeof parsed.error === 'string' && parsed.error.trim()) return parsed.error;\n } catch {\n return text.slice(0, 180);\n }\n\n return fallback;\n }\n\n #toErrorMessage(err: unknown): string {\n if (err instanceof Error && err.message) return err.message;\n return 'Không sinh được E2E test.';\n }\n\n #flashCopyOk(): void {\n this.copyOk.set(true);\n setTimeout(() => this.copyOk.set(false), 1200);\n }\n\n #flashE2eExportOk(label: string): void {\n this.e2eExportOk.set(label);\n setTimeout(() => {\n if (this.e2eExportOk() === label) this.e2eExportOk.set(null);\n }, 1800);\n }\n}\n","@let _enabled = enabled();\n@let _open = open();\n@if (_enabled && !dismissed()) {\n <div class=\"sd-autoid-inspector__fab-wrap\">\n <button\n type=\"button\"\n class=\"sd-autoid-inspector__fab\"\n data-autoid=\"sd-autoid-inspector-fab\"\n [attr.data-opened]=\"dataOpened()\"\n [matTooltip]=\"_open ? 'Đóng AutoId Inspector' : 'Mở AutoId Inspector'\"\n matTooltipPosition=\"left\"\n (click)=\"togglePanel()\">\n <sd-icon [name]=\"_open ? 'close' : 'tag'\"></sd-icon>\n </button>\n <button\n type=\"button\"\n class=\"sd-autoid-inspector__fab-dismiss\"\n matTooltip=\"Ẩn tạm — reload trang để hiện lại\"\n matTooltipPosition=\"left\"\n aria-label=\"Ẩn tạm FAB\"\n (click)=\"dismissFab($event)\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n </div>\n}\n\n@if (_enabled && _open) {\n @let _segment = segment();\n <button type=\"button\" class=\"sd-autoid-inspector__backdrop\" aria-label=\"Đóng AutoId Inspector\" (click)=\"closePanel()\"></button>\n <section\n class=\"sd-autoid-inspector__panel\"\n role=\"dialog\"\n aria-label=\"AutoId Inspector\"\n data-autoid=\"sd-autoid-inspector-panel\"\n [attr.data-segment]=\"dataSegment()\"\n [attr.data-highlight-on]=\"dataHighlightOn()\"\n [attr.data-element-count]=\"dataElementCount()\"\n [attr.data-missing-count]=\"dataMissingCount()\"\n [attr.data-duplicate-count]=\"dataDuplicateCount()\">\n <header class=\"sd-autoid-inspector__header\">\n <div class=\"sd-autoid-inspector__segments\">\n <button type=\"button\" [class.is-active]=\"_segment === 'audit'\" (click)=\"setSegment('audit')\">\n Audit\n @if (audit(); as a) {\n <span class=\"sd-autoid-inspector__badge\" [class.is-warn]=\"a.missingCount + a.duplicateCount > 0\">\n {{ a.missingCount + a.duplicateCount }}\n </span>\n }\n </button>\n <button type=\"button\" [class.is-active]=\"_segment === 'elements'\" (click)=\"setSegment('elements')\">\n Elements\n <span class=\"sd-autoid-inspector__badge\">{{ elements().length }}</span>\n </button>\n <button type=\"button\" [class.is-active]=\"_segment === 'export'\" (click)=\"setSegment('export')\">Export</button>\n </div>\n <div class=\"sd-autoid-inspector__actions\">\n <button type=\"button\" class=\"sd-autoid-inspector__icon-btn\" matTooltip=\"Quét lại\" (click)=\"refresh()\">\n <sd-icon name=\"refresh\"></sd-icon>\n </button>\n <button type=\"button\" class=\"sd-autoid-inspector__close-btn\" matTooltip=\"Đóng\" aria-label=\"Đóng panel\" (click)=\"closePanel()\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n </div>\n </header>\n\n @if (copyOk()) {\n <div class=\"sd-autoid-inspector__toast\">Đã copy ✓</div>\n }\n\n <div class=\"sd-autoid-inspector__body\">\n @switch (_segment) {\n @case ('audit') {\n <ng-container *ngTemplateOutlet=\"auditTpl\"></ng-container>\n }\n @case ('elements') {\n <ng-container *ngTemplateOutlet=\"elementsTpl\"></ng-container>\n }\n @case ('export') {\n <ng-container *ngTemplateOutlet=\"exportTpl\"></ng-container>\n }\n }\n </div>\n </section>\n\n <ng-template #auditTpl>\n @if (audit(); as a) {\n @let _highlightOn = highlightOn();\n <div class=\"sd-autoid-inspector__audit-toolbar\">\n <button type=\"button\" class=\"sd-autoid-inspector__toggle\" [class.is-on]=\"_highlightOn\" (click)=\"toggleHighlight()\">\n <sd-icon [name]=\"_highlightOn ? 'visibility' : 'visibility_off'\"></sd-icon>\n <span>Highlight DOM</span>\n <span class=\"sd-autoid-inspector__toggle-state\">{{ _highlightOn ? 'ON' : 'OFF' }}</span>\n </button>\n </div>\n <div class=\"sd-autoid-inspector__summary\">\n <div class=\"sd-autoid-inspector__stat is-info\">\n <div class=\"sd-autoid-inspector__stat-value\">{{ a.total }}</div>\n <div class=\"sd-autoid-inspector__stat-label\">Tổng autoid</div>\n </div>\n <div class=\"sd-autoid-inspector__stat\" [class.is-error]=\"a.duplicateCount > 0\" [class.is-success]=\"a.duplicateCount === 0\">\n <div class=\"sd-autoid-inspector__stat-value\">{{ a.duplicateCount }}</div>\n <div class=\"sd-autoid-inspector__stat-label\">Trùng</div>\n </div>\n <div class=\"sd-autoid-inspector__stat\" [class.is-warning]=\"a.missingCount > 0\" [class.is-success]=\"a.missingCount === 0\">\n <div class=\"sd-autoid-inspector__stat-value\">{{ a.missingCount }}</div>\n <div class=\"sd-autoid-inspector__stat-label\">Thiếu</div>\n </div>\n </div>\n\n @if (a.duplicateCount > 0) {\n <h4 class=\"sd-autoid-inspector__section-title\">\n <sd-icon class=\"is-error\" name=\"error\"></sd-icon>\n Autoid bị trùng\n </h4>\n <div class=\"sd-autoid-inspector__table-wrap\">\n <table class=\"sd-autoid-inspector__table\">\n <thead>\n <tr>\n <th>Autoid</th>\n <th>Số lần</th>\n </tr>\n </thead>\n <tbody>\n @for (entry of a.duplicates | keyvalue; track entry.key) {\n <tr class=\"is-error\">\n <td>\n <code>{{ entry.key }}</code>\n </td>\n <td>{{ entry.value }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n\n @if (a.missingCount > 0) {\n <h4 class=\"sd-autoid-inspector__section-title\">\n <sd-icon class=\"is-warning\" name=\"warning_amber\"></sd-icon>\n Element thiếu autoid\n </h4>\n <div class=\"sd-autoid-inspector__table-wrap\">\n <table class=\"sd-autoid-inspector__table\">\n <thead>\n <tr>\n <th>Tag</th>\n <th>Name hint</th>\n <th>Selector</th>\n </tr>\n </thead>\n <tbody>\n @for (m of a.missing; track $index) {\n <tr class=\"is-warning\">\n <td>\n <code>{{ m.tag }}</code>\n </td>\n <td>{{ m.nameHint }}</td>\n <td>\n <code>{{ m.selector }}</code>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n\n @if (a.duplicateCount === 0 && a.missingCount === 0) {\n <div class=\"sd-autoid-inspector__success-card\">\n <sd-icon name=\"check_circle\"></sd-icon>\n <div>\n <strong>Không có element thiếu hoặc trùng autoid.</strong>\n <small>Trang đã đạt chuẩn convention autoid.</small>\n </div>\n </div>\n }\n }\n </ng-template>\n\n <ng-template #elementsTpl>\n @let _filter = filter();\n <div class=\"sd-autoid-inspector__filter\">\n <sd-icon name=\"search\"></sd-icon>\n <input type=\"text\" placeholder=\"Lọc theo autoid / name / tag\" [ngModel]=\"_filter\" (ngModelChange)=\"filter.set($event)\" />\n @if (_filter) {\n <button type=\"button\" class=\"sd-autoid-inspector__icon-btn\" matTooltip=\"Xoá filter\" (click)=\"filter.set('')\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n }\n </div>\n\n <!-- Top-level elements (not inside any sd-table) -->\n <h4 class=\"sd-autoid-inspector__section-title\">\n Top-level elements\n <span class=\"sd-autoid-inspector__badge\">{{ topLevelElements().length }}</span>\n </h4>\n <div class=\"sd-autoid-inspector__table-wrap\">\n <table class=\"sd-autoid-inspector__table\">\n <thead>\n <tr>\n <th class=\"is-num\">STT</th>\n <th>Name</th>\n <th>Autoid</th>\n <th>Tag</th>\n <th>State</th>\n <th>Value</th>\n </tr>\n </thead>\n <tbody>\n @for (el of topLevelElements(); track el.autoid + $index) {\n <tr [class.is-error]=\"el.duplicate\">\n <td class=\"is-num\">{{ el.stt }}</td>\n <td>{{ el.name || '—' }}</td>\n <td>\n <div class=\"sd-autoid-inspector__autoid-cell\">\n <code>{{ el.autoid }}</code>\n <button\n type=\"button\"\n class=\"sd-autoid-inspector__icon-btn is-primary\"\n matTooltip=\"Copy xpath\"\n (click)=\"copyXpath(el.autoid)\">\n <sd-icon name=\"content_copy\"></sd-icon>\n </button>\n </div>\n </td>\n <td>\n <span class=\"sd-autoid-inspector__tag-chip\">{{ el.tag }}</span>\n </td>\n <td class=\"sd-autoid-inspector__state-cell\">\n @if (el.state.disabled !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\" [class.is-error]=\"el.state.disabled === 'true'\">\n disabled={{ el.state.disabled }}\n </span>\n }\n @if (el.state.loading !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\" [class.is-warning]=\"el.state.loading === 'true'\">\n loading={{ el.state.loading }}\n </span>\n }\n @if (el.state.empty !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\" [class.is-info]=\"el.state.empty === 'true'\">\n empty={{ el.state.empty }}\n </span>\n }\n @if (el.state.invalid !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\" [class.is-error]=\"el.state.invalid === 'true'\">\n invalid={{ el.state.invalid }}\n </span>\n }\n @if (el.state.opened !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\" [class.is-info]=\"el.state.opened === 'true'\">\n opened={{ el.state.opened }}\n </span>\n }\n @if (el.state.count !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-info\"> count={{ el.state.count }} </span>\n }\n @if (el.state.required !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\" [class.is-warning]=\"el.state.required === 'true'\">\n required={{ el.state.required }}\n </span>\n }\n @if (el.state.maxlength !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-info\"> maxlength={{ el.state.maxlength }} </span>\n }\n @if (el.state.minlength !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-info\"> minlength={{ el.state.minlength }} </span>\n }\n @if (el.state.pattern !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-info\"> pattern={{ el.state.pattern }} </span>\n }\n @if (el.state.errorMessage !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-error\"> error: {{ el.state.errorMessage }} </span>\n }\n </td>\n <td class=\"sd-autoid-inspector__value\" [matTooltip]=\"el.state.dataValue || el.text || ''\">\n {{ el.state.dataValue || el.text || '—' }}\n </td>\n </tr>\n } @empty {\n <tr>\n <td colspan=\"6\" class=\"sd-autoid-inspector__empty\">Không có kết quả.</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <!-- One section per sd-table group -->\n @for (group of tableGroups(); track group.scope) {\n <h4 class=\"sd-autoid-inspector__section-title\">\n <sd-icon class=\"is-info\" name=\"table_chart\"></sd-icon>\n Inside <code>{{ group.scope }}</code>\n <span class=\"sd-autoid-inspector__badge\">{{ group.items.length }}</span>\n </h4>\n <div class=\"sd-autoid-inspector__table-wrap\">\n <table class=\"sd-autoid-inspector__table\">\n <thead>\n <tr>\n <th class=\"is-num\">STT</th>\n <th>Name</th>\n <th>Autoid</th>\n <th>Tag</th>\n <th>State</th>\n <th>Value</th>\n </tr>\n </thead>\n <tbody>\n @for (el of group.items; track el.autoid + $index) {\n <tr [class.is-error]=\"el.duplicate\">\n <td class=\"is-num\">{{ el.stt }}</td>\n <td>{{ el.name || '—' }}</td>\n <td>\n <div class=\"sd-autoid-inspector__autoid-cell\">\n <code>{{ el.autoid }}</code>\n <button\n type=\"button\"\n class=\"sd-autoid-inspector__icon-btn is-primary\"\n matTooltip=\"Copy xpath\"\n (click)=\"copyXpath(el.autoid)\">\n <sd-icon name=\"content_copy\"></sd-icon>\n </button>\n </div>\n </td>\n <td>\n <span class=\"sd-autoid-inspector__tag-chip\">{{ el.tag }}</span>\n </td>\n <td class=\"sd-autoid-inspector__state-cell\">\n @if (el.state.disabled !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\" [class.is-error]=\"el.state.disabled === 'true'\">\n disabled={{ el.state.disabled }}\n </span>\n }\n @if (el.state.loading !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\" [class.is-warning]=\"el.state.loading === 'true'\">\n loading={{ el.state.loading }}\n </span>\n }\n @if (el.state.empty !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\" [class.is-info]=\"el.state.empty === 'true'\">\n empty={{ el.state.empty }}\n </span>\n }\n @if (el.state.invalid !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\" [class.is-error]=\"el.state.invalid === 'true'\">\n invalid={{ el.state.invalid }}\n </span>\n }\n @if (el.state.opened !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\" [class.is-info]=\"el.state.opened === 'true'\">\n opened={{ el.state.opened }}\n </span>\n }\n @if (el.state.count !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-info\"> count={{ el.state.count }} </span>\n }\n @if (el.state.required !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\" [class.is-warning]=\"el.state.required === 'true'\">\n required={{ el.state.required }}\n </span>\n }\n @if (el.state.maxlength !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-info\"> maxlength={{ el.state.maxlength }} </span>\n }\n @if (el.state.minlength !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-info\"> minlength={{ el.state.minlength }} </span>\n }\n @if (el.state.pattern !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-info\"> pattern={{ el.state.pattern }} </span>\n }\n @if (el.state.errorMessage !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-error\"> error: {{ el.state.errorMessage }} </span>\n }\n </td>\n <td class=\"sd-autoid-inspector__value\" [matTooltip]=\"el.state.dataValue || el.text || ''\">\n {{ el.state.dataValue || el.text || '—' }}\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </ng-template>\n\n <ng-template #exportTpl>\n <div class=\"sd-autoid-inspector__export-grid\">\n <button type=\"button\" matTooltip=\"Copy JSON vào clipboard\" (click)=\"copyJson()\">\n <sd-icon name=\"content_copy\"></sd-icon>\n <span>Copy JSON</span>\n <small>clipboard</small>\n </button>\n <button type=\"button\" matTooltip=\"Tải file JSON\" (click)=\"exportJson()\">\n <sd-icon name=\"download\"></sd-icon>\n <span>JSON</span>\n <small>.json</small>\n </button>\n <button type=\"button\" matTooltip=\"Tải file CSV\" (click)=\"exportCsv()\">\n <sd-icon name=\"table_view\"></sd-icon>\n <span>CSV</span>\n <small>.csv</small>\n </button>\n <button type=\"button\" matTooltip=\"Tải MD POM skeleton — cho AI viết auto-test\" (click)=\"exportMdPom()\">\n <sd-icon name=\"code\"></sd-icon>\n <span>MD POM</span>\n <small>AI test</small>\n </button>\n <button type=\"button\" matTooltip=\"Tải MD reference table — group theo tag sd-*\" (click)=\"exportMdTable()\">\n <sd-icon name=\"view_list\"></sd-icon>\n <span>MD Table</span>\n <small>reference</small>\n </button>\n </div>\n\n @if (e2eGeneratorHost()) {\n @let _e2eExporting = e2eExporting();\n <div class=\"sd-autoid-inspector__export-section\">\n <h4 class=\"sd-autoid-inspector__section-title\">\n <sd-icon class=\"is-info\" name=\"auto_awesome\"></sd-icon>\n Tạo E2E test\n </h4>\n <div class=\"sd-autoid-inspector__export-grid is-e2e\">\n <button\n type=\"button\"\n matTooltip=\"Tạo bộ test Playwright (.zip)\"\n [disabled]=\"_e2eExporting !== null\"\n (click)=\"exportE2eTest('playwright')\">\n <sd-icon [name]=\"_e2eExporting === 'playwright' ? 'hourglass_empty' : 'play_arrow'\"></sd-icon>\n <span>Playwright</span>\n <small>.zip</small>\n </button>\n <button\n type=\"button\"\n matTooltip=\"Tạo bộ test Robot Framework (.zip)\"\n [disabled]=\"_e2eExporting !== null\"\n (click)=\"openRobotExportContext()\">\n <sd-icon [name]=\"_e2eExporting === 'robot' ? 'hourglass_empty' : 'smart_toy'\"></sd-icon>\n <span>Robot Framework</span>\n <small>.zip</small>\n </button>\n </div>\n\n @if (robotContextOpen()) {\n <div class=\"sd-autoid-inspector__context-backdrop\" role=\"presentation\" (click)=\"closeRobotExportContext()\"></div>\n <section\n class=\"sd-autoid-inspector__context-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"sd-autoid-robot-context-title\">\n <header class=\"sd-autoid-inspector__context-header\">\n <div>\n <h4 id=\"sd-autoid-robot-context-title\">Ngữ cảnh QC cho Robot Framework</h4>\n <small>Requirement, test case, test data</small>\n </div>\n <button type=\"button\" class=\"sd-autoid-inspector__icon-btn\" matTooltip=\"Đóng\" (click)=\"closeRobotExportContext()\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n </header>\n\n <div class=\"sd-autoid-inspector__context-form\">\n <label>\n <span>Component</span>\n <input\n type=\"text\"\n placeholder=\"SP-Wallet\"\n [ngModel]=\"robotExportContext().component || ''\"\n (ngModelChange)=\"updateRobotExportContext('component', $event)\" />\n </label>\n <label>\n <span>Story / Trace</span>\n <input\n type=\"text\"\n placeholder=\"US-001, AC-01\"\n [ngModel]=\"robotExportContext().storyLinkages || ''\"\n (ngModelChange)=\"updateRobotExportContext('storyLinkages', $event)\" />\n </label>\n <label class=\"is-full\">\n <span>Requirement / AC / BR</span>\n <textarea\n rows=\"4\"\n placeholder=\"Dán requirement hoặc acceptance criteria...\"\n [ngModel]=\"robotExportContext().requirement || ''\"\n (ngModelChange)=\"updateRobotExportContext('requirement', $event)\"></textarea>\n </label>\n <label class=\"is-full\">\n <span>Test case QC đã định nghĩa</span>\n <textarea\n rows=\"4\"\n placeholder=\"TC-001: ...\"\n [ngModel]=\"robotExportContext().testCases || ''\"\n (ngModelChange)=\"updateRobotExportContext('testCases', $event)\"></textarea>\n </label>\n <label class=\"is-full\">\n <span>Test data</span>\n <textarea\n rows=\"3\"\n placeholder=\"wallet=Ví A, amount=100000...\"\n [ngModel]=\"robotExportContext().testData || ''\"\n (ngModelChange)=\"updateRobotExportContext('testData', $event)\"></textarea>\n </label>\n <label class=\"is-full\">\n <span>Precondition</span>\n <textarea\n rows=\"2\"\n placeholder=\"User đã đăng nhập, dữ liệu ví đã tồn tại...\"\n [ngModel]=\"robotExportContext().precondition || ''\"\n (ngModelChange)=\"updateRobotExportContext('precondition', $event)\"></textarea>\n </label>\n <label class=\"is-full\">\n <span>Ghi chú format QC</span>\n <textarea\n rows=\"3\"\n placeholder=\"Smoke=Y, Auto=Y, ưu tiên happy path...\"\n [ngModel]=\"robotExportContext().qcNotes || ''\"\n (ngModelChange)=\"updateRobotExportContext('qcNotes', $event)\"></textarea>\n </label>\n </div>\n\n <footer class=\"sd-autoid-inspector__context-actions\">\n <button type=\"button\" class=\"is-secondary\" [disabled]=\"_e2eExporting !== null\" (click)=\"closeRobotExportContext()\">\n Huỷ\n </button>\n <button\n type=\"button\"\n class=\"is-primary\"\n [disabled]=\"_e2eExporting !== null || !hasRobotExportContext()\"\n (click)=\"confirmRobotExport()\">\n <sd-icon [name]=\"_e2eExporting === 'robot' ? 'hourglass_empty' : 'download'\"></sd-icon>\n <span>Đồng ý xuất</span>\n </button>\n </footer>\n </section>\n }\n\n @if (e2eExportOk(); as targetLabel) {\n <div class=\"sd-autoid-inspector__export-message is-success\">Đã tải bộ test {{ targetLabel }}.</div>\n }\n @if (e2eExportError(); as error) {\n <div class=\"sd-autoid-inspector__export-message is-error\">\n {{ error }}\n </div>\n }\n </div>\n }\n </ng-template>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sdcorejs-angular-components-autoid-inspector.mjs","sources":["../../../projects/sdcorejs-angular/components/autoid-inspector/src/models/autoid-inspector-config.model.ts","../../../projects/sdcorejs-angular/components/autoid-inspector/src/services/autoid-scanner.service.ts","../../../projects/sdcorejs-angular/components/autoid-inspector/src/services/autoid-audit.service.ts","../../../projects/sdcorejs-angular/components/autoid-inspector/src/services/autoid-highlight.service.ts","../../../projects/sdcorejs-angular/components/autoid-inspector/src/services/autoid-export.service.ts","../../../projects/sdcorejs-angular/components/autoid-inspector/src/autoid-inspector.component.ts","../../../projects/sdcorejs-angular/components/autoid-inspector/src/autoid-inspector.component.html","../../../projects/sdcorejs-angular/components/autoid-inspector/sdcorejs-angular-components-autoid-inspector.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport interface SdAutoidInspectorConfiguration {\n /** Base URL cua backend sinh E2E test, vi du `http://localhost:3012`. */\n host?: string;\n /** Selector phu them can audit (mac dinh component da cover sd-* form + sd-button). */\n extraRequireSelectors?: string[];\n /** Root scan, mac dinh document.body. */\n root?: HTMLElement;\n}\n\n/** Cau hinh global cho AutoId Inspector. `[config]` tren component co the override theo instance. */\nexport const SD_AUTOID_INSPECTOR_CONFIGURATION = new InjectionToken<SdAutoidInspectorConfiguration>('sd.autoid-inspector.configuration');\n\n/** Selector mac dinh coi la phai co data-autoid. */\nexport const AUTOID_DEFAULT_REQUIRE_SELECTORS: readonly string[] = [\n 'sd-input',\n 'sd-input-number',\n 'sd-textarea',\n 'sd-select',\n 'sd-autocomplete',\n 'sd-checkbox',\n 'sd-radio',\n 'sd-switch',\n 'sd-date',\n 'sd-datetime',\n 'sd-date-range',\n 'sd-chip',\n 'sd-chip-calendar',\n 'sd-button',\n];\n","import { Injectable } from '@angular/core';\nimport { AutoidElement, AutoidElementState } from '../models/autoid-element.model';\n\n@Injectable({ providedIn: 'root' })\nexport class SdAutoidScannerService {\n /**\n * Quét element có [data-autoid] trong root, gắn name/tag/value/xpath.\n * Khi truyền `requireSelectors` (vd các sd-* form/button), những node khớp selector\n * mà KHÔNG có data-autoid (self lẫn con) sẽ được thêm vào dưới dạng phần tử fallback\n * (`autoid: ''`, xpath theo vị trí thẻ + cờ `missingAutoid` + warning) — để JSON xuất ra\n * vẫn dùng được và dev biết chỗ cần bổ sung autoid.\n */\n scan(root: HTMLElement = document.body, requireSelectors: readonly string[] = []): AutoidElement[] {\n const nodes = root.querySelectorAll<HTMLElement>('[data-autoid]');\n const dupCount: Record<string, number> = {};\n nodes.forEach(n => {\n const id = n.getAttribute('data-autoid');\n if (!id) return;\n dupCount[id] = (dupCount[id] ?? 0) + 1;\n });\n\n const result: AutoidElement[] = [];\n let stt = 1;\n nodes.forEach(node => {\n const autoid = node.getAttribute('data-autoid');\n if (!autoid) return;\n const state = this.readState(node);\n const tableScope = this.resolveTableScope(node);\n result.push({\n stt: stt++,\n name: this.resolveName(node),\n autoid,\n tag: this.resolveSdTag(node),\n text: this.resolveText(node),\n xpath: `//*[@data-autoid=\"${autoid}\"]`,\n duplicate: dupCount[autoid] > 1,\n state,\n tableScope,\n });\n });\n\n if (requireSelectors.length) {\n stt = this.appendMissing(root, requireSelectors, result, stt);\n }\n return result;\n }\n\n /**\n * Tìm các node khớp `requireSelectors` nhưng thiếu data-autoid (self + mọi descendant),\n * thêm vào `result` dưới dạng phần tử fallback. Trả về `stt` kế tiếp.\n */\n private appendMissing(root: HTMLElement, requireSelectors: readonly string[], result: AutoidElement[], startStt: number): number {\n let stt = startStt;\n const joined = requireSelectors.join(',');\n root.querySelectorAll<HTMLElement>(joined).forEach(node => {\n // Cùng quy ước với audit: bỏ qua khi self hoặc con đã có data-autoid.\n if (node.hasAttribute('data-autoid')) return;\n if (node.querySelector('[data-autoid]')) return;\n const tag = node.tagName.toLowerCase();\n result.push({\n stt: stt++,\n name: this.resolveName(node),\n autoid: '',\n tag,\n text: this.resolveText(node),\n xpath: this.fallbackXpath(node, tag),\n duplicate: false,\n state: this.readState(node),\n tableScope: this.resolveTableScope(node),\n missingAutoid: true,\n warning: 'Thiếu data-autoid — dùng xpath fallback theo tag (dev nên bổ sung autoid)',\n });\n });\n return stt;\n }\n\n /** XPath theo vị trí thẻ trong document, vd `(//sd-button)[2]`, khi không có autoid. */\n private fallbackXpath(node: HTMLElement, tag: string): string {\n const all = Array.from(document.querySelectorAll(tag));\n const idx = all.indexOf(node);\n return `(//${tag})[${idx >= 0 ? idx + 1 : 1}]`;\n }\n\n /** Group element theo autoid để consumer lấy duplicate map. */\n groupByAutoid(elements: AutoidElement[]): Record<string, AutoidElement[]> {\n const map: Record<string, AutoidElement[]> = {};\n for (const el of elements) {\n (map[el.autoid] ??= []).push(el);\n }\n return map;\n }\n\n /**\n * Read the optional `data-*` E2E state attributes off the same node.\n * Only includes fields actually present on the DOM (skipped fields stay undefined).\n */\n private readState(node: HTMLElement): AutoidElementState {\n const get = (n: string): string | undefined => {\n const v = node.getAttribute(n);\n return v === null ? undefined : v;\n };\n return {\n disabled: get('data-disabled'),\n loading: get('data-loading'),\n empty: get('data-empty'),\n invalid: get('data-invalid'),\n opened: get('data-opened'),\n count: get('data-count'),\n dataValue: get('data-value'),\n required: get('data-required'),\n maxlength: get('data-maxlength'),\n minlength: get('data-minlength'),\n pattern: get('data-pattern'),\n errorMessage: get('data-error-message'),\n type: get('data-type'),\n title: get('data-title'),\n message: get('data-message'),\n };\n }\n\n /**\n * If the node is inside an `<sd-table>` element, return that table's `data-autoid`.\n * Walks up via closest('sd-table') — skips the node itself if it IS the table.\n */\n private resolveTableScope(node: HTMLElement): string | undefined {\n // Skip self if the node itself is the sd-table host.\n const start = node.tagName.toLowerCase() === 'sd-table' ? node.parentElement : node;\n const table = start?.closest('sd-table') as HTMLElement | null;\n if (!table || table === node) return undefined;\n const id = table.getAttribute('data-autoid');\n return id ?? undefined;\n }\n\n private resolveName(node: HTMLElement): string {\n if (node.id) {\n // CSS.escape phòng id chứa ký tự đặc biệt làm vỡ selector.\n const sel = typeof CSS !== 'undefined' && CSS.escape ? CSS.escape(node.id) : node.id;\n const label = document.querySelector(`label[for=\"${sel}\"]`);\n const text = label?.textContent?.trim();\n if (text) return text;\n }\n return node.getAttribute('aria-label')?.trim() ?? node.getAttribute('placeholder')?.trim() ?? node.getAttribute('title')?.trim() ?? '';\n }\n\n private resolveSdTag(node: HTMLElement): string {\n let cur: HTMLElement | null = node;\n while (cur) {\n const tag = cur.tagName.toLowerCase();\n if (tag.startsWith('sd-')) return tag;\n cur = cur.parentElement;\n }\n return node.tagName.toLowerCase();\n }\n\n private resolveText(node: HTMLElement): string {\n const input = node as HTMLInputElement;\n if (typeof input.value === 'string' && input.value) return input.value;\n return (node.textContent ?? '').trim().slice(0, 80);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AutoidElement, AutoidAuditResult, AutoidMissing } from '../models/autoid-element.model';\nimport { AUTOID_DEFAULT_REQUIRE_SELECTORS } from '../models/autoid-inspector-config.model';\n\n@Injectable({ providedIn: 'root' })\nexport class SdAutoidAuditService {\n /**\n * Audit kết quả scan + DOM:\n * - duplicates: map autoid → count khi count > 1\n * - missing: element khớp selector yêu cầu nhưng KHÔNG có [data-autoid]\n */\n audit(elements: AutoidElement[], options: { requireSelectors?: readonly string[]; root?: HTMLElement } = {}): AutoidAuditResult {\n const requireSelectors = options.requireSelectors ?? AUTOID_DEFAULT_REQUIRE_SELECTORS;\n const root = options.root ?? document.body;\n\n const duplicates: Record<string, number> = {};\n for (const el of elements) {\n if (el.duplicate) {\n duplicates[el.autoid] = (duplicates[el.autoid] ?? 0) + 1;\n }\n }\n\n const missing = this.findMissing(root, requireSelectors);\n\n return {\n total: elements.length,\n duplicates,\n duplicateCount: Object.keys(duplicates).length,\n missing,\n missingCount: missing.length,\n };\n }\n\n private findMissing(root: HTMLElement, selectors: readonly string[]): AutoidMissing[] {\n if (!selectors.length) return [];\n const joined = selectors.join(',');\n const nodes = root.querySelectorAll<HTMLElement>(joined);\n const missing: AutoidMissing[] = [];\n\n nodes.forEach(node => {\n // Coi là missing khi element + mọi descendant đều không có data-autoid.\n // Lý do: sd-button render thành <button data-autoid=\"...\"> bên trong host\n // <sd-button>. Nếu chỉ check chính host sẽ false-positive cho mọi sd-button.\n if (node.hasAttribute('data-autoid')) return;\n if (node.querySelector('[data-autoid]')) return;\n\n missing.push({\n tag: node.tagName.toLowerCase(),\n selector: this.buildSelectorPath(node),\n outerHtmlPreview: this.shortHtml(node),\n nameHint: this.resolveNameHint(node),\n });\n });\n\n return missing;\n }\n\n private buildSelectorPath(node: HTMLElement): string {\n const parts: string[] = [];\n let cur: HTMLElement | null = node;\n let depth = 0;\n while (cur && depth < 4) {\n let part = cur.tagName.toLowerCase();\n if (cur.id) {\n part += `#${cur.id}`;\n parts.unshift(part);\n break;\n }\n const cls = (cur.getAttribute('class') ?? '').trim().split(/\\s+/).filter(Boolean).slice(0, 2);\n if (cls.length) part += `.${cls.join('.')}`;\n parts.unshift(part);\n cur = cur.parentElement;\n depth++;\n }\n return parts.join(' > ');\n }\n\n private shortHtml(node: HTMLElement): string {\n const html = node.outerHTML.replace(/\\s+/g, ' ');\n return html.length > 160 ? html.slice(0, 157) + '...' : html;\n }\n\n private resolveNameHint(node: HTMLElement): string {\n return (\n node.getAttribute('label') ?? node.getAttribute('placeholder') ?? node.getAttribute('aria-label') ?? node.getAttribute('title') ?? ''\n );\n }\n}\n","import { Injectable } from '@angular/core';\n\nconst ATTR = 'data-sd-autoid-highlight';\nconst SAVED_OUTLINE = 'data-sd-autoid-prev-outline';\nconst SAVED_OUTLINE_OFFSET = 'data-sd-autoid-prev-outline-offset';\nconst SAVED_BG = 'data-sd-autoid-prev-bg';\nconst SAVED_BORDER_RADIUS = 'data-sd-autoid-prev-radius';\n\n// Token màu lấy từ @sdcorejs/angular theme (--sd-*). Fallback hex áp dụng khi\n// consumer chưa import sd-core.scss. Dùng cùng bộ var với scss component để\n// nhất quán visual giữa highlight ok / duplicate / missing.\nconst COLOR_OK = 'var(--sd-success, #2e7d32)';\nconst COLOR_OK_BG = 'var(--sd-success-light, #d8f0d3)';\nconst COLOR_DUP = 'var(--sd-error, #ba1a1a)';\nconst COLOR_DUP_BG = 'var(--sd-error-light, #ffdad6)';\nconst COLOR_MISSING = 'var(--sd-warning, #a66300)';\nconst COLOR_MISSING_BG = 'var(--sd-warning-light, #ffddb0)';\n\n@Injectable({ providedIn: 'root' })\nexport class SdAutoidHighlightService {\n /** Apply outline cho mọi [data-autoid]: xanh nếu unique, đỏ nếu duplicate. Idempotent. */\n apply(root: HTMLElement = document.body): void {\n this.clear(root);\n const nodes = root.querySelectorAll<HTMLElement>('[data-autoid]');\n const count: Record<string, number> = {};\n nodes.forEach(n => {\n const id = n.getAttribute('data-autoid');\n if (!id) return;\n count[id] = (count[id] ?? 0) + 1;\n });\n\n // Để tránh apply 2 lần lên cùng 1 target khi nhiều [data-autoid] cùng\n // chia sẻ 1 sd-* host (vd 2 input lồng trong 1 sd-date-range).\n const visited = new Set<HTMLElement>();\n\n nodes.forEach(node => {\n const id = node.getAttribute('data-autoid');\n if (!id) return;\n\n // Highlight HOST sd-* (giống applyMissing) — outline ôm trọn card,\n // không hiển thị lệch trên input con / label fragment. Fallback về\n // chính node khi không tìm thấy sd-* ancestor (vd native button).\n const target = this.#resolveTarget(node);\n if (visited.has(target)) return;\n visited.add(target);\n\n const isDup = count[id] > 1;\n this.#paint(target, isDup ? COLOR_DUP : COLOR_OK, isDup ? COLOR_DUP_BG : COLOR_OK_BG, 'solid', isDup ? 'duplicate' : 'ok');\n });\n }\n\n /** Highlight tập element không có autoid (missing) bằng outline cam dashed. */\n applyMissing(nodes: HTMLElement[]): void {\n nodes.forEach(node => {\n if (node.hasAttribute(ATTR)) return;\n this.#paint(node, COLOR_MISSING, COLOR_MISSING_BG, 'dashed', 'missing');\n });\n }\n\n /** Restore inline style như trước khi apply. */\n clear(root: HTMLElement = document.body): void {\n const nodes = root.querySelectorAll<HTMLElement>(`[${ATTR}]`);\n nodes.forEach(node => {\n node.style.outline = node.getAttribute(SAVED_OUTLINE) ?? '';\n node.style.outlineOffset = node.getAttribute(SAVED_OUTLINE_OFFSET) ?? '';\n node.style.backgroundColor = node.getAttribute(SAVED_BG) ?? '';\n node.style.borderRadius = node.getAttribute(SAVED_BORDER_RADIUS) ?? '';\n node.removeAttribute(SAVED_OUTLINE);\n node.removeAttribute(SAVED_OUTLINE_OFFSET);\n node.removeAttribute(SAVED_BG);\n node.removeAttribute(SAVED_BORDER_RADIUS);\n node.removeAttribute(ATTR);\n });\n }\n\n // ==========================================\n // HELPERS\n // ==========================================\n #resolveTarget(node: HTMLElement): HTMLElement {\n let cur: HTMLElement | null = node;\n while (cur) {\n if (cur.tagName.toLowerCase().startsWith('sd-')) return cur;\n cur = cur.parentElement;\n }\n return node;\n }\n\n #paint(node: HTMLElement, color: string, bg: string, style: 'solid' | 'dashed', marker: 'ok' | 'duplicate' | 'missing'): void {\n // Backup full style cần restore để clear() đưa về nguyên trạng.\n node.setAttribute(SAVED_OUTLINE, node.style.outline ?? '');\n node.setAttribute(SAVED_OUTLINE_OFFSET, node.style.outlineOffset ?? '');\n node.setAttribute(SAVED_BG, node.style.backgroundColor ?? '');\n node.setAttribute(SAVED_BORDER_RADIUS, node.style.borderRadius ?? '');\n\n node.style.outline = `2px ${style} ${color}`;\n // outline-offset 2px tránh đè lên border của host (mat-form-field, button)\n // → highlight nằm gọn ngoài card thay vì cắt vào nội dung.\n node.style.outlineOffset = '2px';\n node.style.backgroundColor = bg;\n // Bo nhẹ để outline trông sạch trên host bo góc sẵn.\n if (!node.style.borderRadius) {\n node.style.borderRadius = '6px';\n }\n node.setAttribute(ATTR, marker);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AutoidElement, AutoidElementState } from '../models/autoid-element.model';\nimport { AutoidExportMeta } from '../models/autoid-export-format.model';\n\n@Injectable({ providedIn: 'root' })\nexport class SdAutoidExportService {\n /**\n * Có `meta` → bọc `{ meta, elements }` (kèm url/queryParams) để consumer biết trang/route.\n * Không `meta` → giữ mảng thuần (back-compat cho caller cũ chỉ cần elements).\n */\n toJson(elements: AutoidElement[], meta?: AutoidExportMeta): string {\n if (meta) return JSON.stringify({ meta, elements }, null, 2);\n return JSON.stringify(elements, null, 2);\n }\n\n /** Parse a `location.search` string into a flat key/value map (last value wins). */\n parseQueryParams(search: string): Record<string, string> {\n const out: Record<string, string> = {};\n new URLSearchParams(search || '').forEach((v, k) => {\n out[k] = v;\n });\n return out;\n }\n\n toCsv(elements: AutoidElement[]): string {\n const header = 'STT,name,autoid,tag,table-scope,disabled,loading,empty,invalid,opened,count,data-value,text,xpath';\n const rows = elements.map(el =>\n [\n el.stt,\n this.q(el.name),\n this.q(el.autoid),\n this.q(el.tag),\n this.q(el.tableScope ?? ''),\n this.q(el.state.disabled ?? ''),\n this.q(el.state.loading ?? ''),\n this.q(el.state.empty ?? ''),\n this.q(el.state.invalid ?? ''),\n this.q(el.state.opened ?? ''),\n this.q(el.state.count ?? ''),\n this.q(el.state.dataValue ?? ''),\n this.q(el.text),\n this.q(el.xpath),\n ].join(',')\n );\n return [header, ...rows].join('\\n') + '\\n';\n }\n\n /** POM TypeScript skeleton — copy ngay vào file Playwright/Cypress. */\n toMarkdownPom(elements: AutoidElement[], meta: AutoidExportMeta): string {\n const className = this.toPascal(meta.pageTitle || 'AutoGenerated') + 'Page';\n const lines: string[] = [];\n lines.push(`# ${className}`);\n lines.push('');\n lines.push(`- Page: \\`${meta.pageUrl}\\``);\n lines.push(`- Generated: \\`${meta.timestamp}\\``);\n lines.push('');\n lines.push('```ts');\n lines.push(`export class ${className} {`);\n for (const el of elements) {\n // autoid rỗng (phần tử fallback thiếu autoid) → đặt tên prop theo tag + stt.\n const propName = el.autoid ? this.toCamel(el.autoid) : this.toCamel(`${el.tag}-${el.stt}`);\n const nameHint = el.name ? ` ${el.name} —` : '';\n const stateSummary = this.buildStateSummary(el.state);\n const stateStr = stateSummary ? ` — ${stateSummary}` : '';\n lines.push(` /** ${el.tag}${nameHint}${stateStr} */`);\n lines.push(` readonly ${propName} = '${el.xpath}';`);\n }\n lines.push('}');\n lines.push('```');\n lines.push('');\n return lines.join('\\n');\n }\n\n /** Markdown reference table, group FIRST by tableScope (top-level first, then per table), then by tag. */\n toMarkdownTable(elements: AutoidElement[], meta: AutoidExportMeta): string {\n const lines: string[] = [];\n lines.push('# AutoId Reference');\n lines.push('');\n lines.push(`- Page: \\`${meta.pageUrl}\\``);\n lines.push(`- Generated: \\`${meta.timestamp}\\``);\n lines.push('');\n\n // Partition into top-level and per-table buckets.\n const topLevel = elements.filter(el => !el.tableScope);\n // Collect unique table scopes in insertion order (preserves DOM order).\n const tableScopes: string[] = [];\n for (const el of elements) {\n if (el.tableScope && !tableScopes.includes(el.tableScope)) {\n tableScopes.push(el.tableScope);\n }\n }\n tableScopes.sort();\n\n const renderTagGroup = (items: AutoidElement[]) => {\n const groups = new Map<string, AutoidElement[]>();\n for (const el of items) {\n const key = el.tag || '(no-tag)';\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(el);\n }\n const sortedTags = [...groups.keys()].sort();\n for (const tag of sortedTags) {\n lines.push(`### ${tag}`);\n lines.push('');\n lines.push('| name | autoid | xpath | state | duplicate |');\n lines.push('|------|--------|-------|-------|-----------|');\n for (const el of groups.get(tag)!) {\n const stateSummary = this.buildStateSummary(el.state);\n lines.push(\n `| ${this.mdCell(el.name)} | \\`${el.autoid}\\` | \\`${el.xpath}\\` | ${this.mdCell(stateSummary)} | ${el.duplicate ? '⚠️' : ''} |`\n );\n }\n lines.push('');\n }\n };\n\n // Top-level section.\n lines.push('## Top-level');\n lines.push('');\n if (topLevel.length > 0) {\n renderTagGroup(topLevel);\n } else {\n lines.push('_(no top-level elements)_');\n lines.push('');\n }\n\n // Per-table sections.\n for (const scope of tableScopes) {\n lines.push(`## Inside table \\`${scope}\\``);\n lines.push('');\n const scopeItems = elements.filter(el => el.tableScope === scope);\n renderTagGroup(scopeItems);\n }\n\n return lines.join('\\n');\n }\n\n download(content: string, filename: string, mime: string): void {\n const blob = new Blob([content], { type: mime });\n this.downloadBlob(blob, filename);\n }\n\n downloadBlob(blob: Blob, filename: string): void {\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n }\n\n async copyToClipboard(content: string): Promise<void> {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(content);\n return;\n }\n // Fallback cho browser cũ / context không có clipboard API.\n const ta = document.createElement('textarea');\n ta.value = content;\n ta.style.position = 'fixed';\n ta.style.opacity = '0';\n document.body.appendChild(ta);\n ta.select();\n document.execCommand('copy');\n document.body.removeChild(ta);\n }\n\n /** Build a compact state summary string from defined state keys, e.g. \"disabled=false; empty=true\". */\n private buildStateSummary(state: AutoidElementState): string {\n const parts: string[] = [];\n if (state.disabled !== undefined) parts.push(`disabled=${state.disabled}`);\n if (state.loading !== undefined) parts.push(`loading=${state.loading}`);\n if (state.empty !== undefined) parts.push(`empty=${state.empty}`);\n if (state.invalid !== undefined) parts.push(`invalid=${state.invalid}`);\n if (state.opened !== undefined) parts.push(`opened=${state.opened}`);\n if (state.count !== undefined) parts.push(`count=${state.count}`);\n if (state.dataValue !== undefined) parts.push(`data-value=${state.dataValue}`);\n return parts.join('; ');\n }\n\n private q(v: string | number): string {\n const s = String(v ?? '').replace(/\"/g, '\"\"');\n return `\"${s}\"`;\n }\n\n private mdCell(s: string): string {\n return (s || '').replace(/\\|/g, '\\\\|').replace(/\\n/g, ' ');\n }\n\n private toCamel(autoid: string): string {\n const parts = autoid.split(/[-_]/).filter(Boolean);\n return parts.map((p, i) => (i === 0 ? p : p[0].toUpperCase() + p.slice(1))).join('');\n }\n\n private toPascal(title: string): string {\n return title\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean)\n .map(p => p[0].toUpperCase() + p.slice(1))\n .join('');\n }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n HostListener,\n inject,\n input,\n OnDestroy,\n signal,\n} from '@angular/core';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { FormsModule } from '@angular/forms';\nimport { ActivatedRouteSnapshot, Router } from '@angular/router';\n\nimport { AutoidElement, AutoidAuditResult } from './models/autoid-element.model';\nimport {\n SdAutoidInspectorConfiguration,\n AUTOID_DEFAULT_REQUIRE_SELECTORS,\n SD_AUTOID_INSPECTOR_CONFIGURATION,\n} from './models/autoid-inspector-config.model';\nimport { AutoidE2eTarget, AutoidExportJson, AutoidExportMeta, AutoidRobotExportContext } from './models/autoid-export-format.model';\nimport { SdAutoidScannerService } from './services/autoid-scanner.service';\nimport { SdAutoidAuditService } from './services/autoid-audit.service';\nimport { SdAutoidHighlightService } from './services/autoid-highlight.service';\nimport { SdAutoidExportService } from './services/autoid-export.service';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\ntype Segment = 'audit' | 'elements' | 'export';\ntype RobotContextField = keyof AutoidRobotExportContext;\n\n@Component({\n selector: 'sd-autoid-inspector',\n templateUrl: './autoid-inspector.component.html',\n styleUrl: './autoid-inspector.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [SdIcon, CommonModule, FormsModule, MatTooltipModule],\n})\nexport class SdAutoidInspector implements OnDestroy {\n readonly #injectedConfig = inject<SdAutoidInspectorConfiguration | null>(SD_AUTOID_INSPECTOR_CONFIGURATION, { optional: true });\n\n // ==========================================\n // INPUTS\n // ==========================================\n enabled = input(true, { transform: booleanAttribute });\n config = input<SdAutoidInspectorConfiguration | undefined>(undefined);\n\n // ==========================================\n // STATE\n // ==========================================\n open = signal(false);\n segment = signal<Segment>('audit');\n filter = signal('');\n elements = signal<AutoidElement[]>([]);\n audit = signal<AutoidAuditResult | null>(null);\n copyOk = signal(false);\n e2eExporting = signal<AutoidE2eTarget | null>(null);\n e2eExportOk = signal<string | null>(null);\n e2eExportError = signal<string | null>(null);\n robotContextOpen = signal(false);\n robotExportContext = signal<AutoidRobotExportContext>({});\n // Default true để mở panel lần đầu là có highlight ngay. Đóng panel KHÔNG\n // tự tắt — user toggle qua nút trong tab Audit khi muốn nhìn DOM gốc.\n highlightOn = signal(true);\n // Ẩn tạm FAB — chỉ in-memory, reload trang sẽ hiện lại (theo thiết kế).\n dismissed = signal(false);\n\n readonly e2eGeneratorHost = computed(() => this.#normalizeHost(this.#effectiveConfig().host));\n readonly hasRobotExportContext = computed(() => Object.values(this.robotExportContext()).some(value => Boolean(value?.trim())));\n\n filteredElements = computed(() => {\n const q = this.filter().trim().toLowerCase();\n if (!q) return this.elements();\n return this.elements().filter(\n el => el.autoid.toLowerCase().includes(q) || el.name.toLowerCase().includes(q) || el.tag.toLowerCase().includes(q)\n );\n });\n\n /**\n * Elements not inside any sd-table — rendered in the main \"Top-level\" section.\n */\n readonly topLevelElements = computed(() => this.filteredElements().filter(el => !el.tableScope));\n\n /**\n * Map of `sd-table` autoid → its inner autoid elements. Tables themselves\n * stay in `topLevelElements` (the table's own autoid is top-level).\n */\n readonly tableGroups = computed(() => {\n const groups = new Map<string, AutoidElement[]>();\n for (const el of this.filteredElements()) {\n if (!el.tableScope) continue;\n if (!groups.has(el.tableScope)) groups.set(el.tableScope, []);\n groups.get(el.tableScope)!.push(el);\n }\n // Return a sorted array for stable rendering.\n return [...groups.entries()].sort(([a], [b]) => a.localeCompare(b)).map(([scope, items]) => ({ scope, items }));\n });\n\n // ==========================================\n // DATA-* ATTRIBUTE COMPUTEDS (for E2E selectors)\n // ==========================================\n readonly dataOpened = computed(() => (this.open() ? 'true' : 'false'));\n readonly dataHighlightOn = computed(() => (this.highlightOn() ? 'true' : 'false'));\n readonly dataSegment = computed(() => this.segment());\n readonly dataElementCount = computed(() => String(this.elements().length));\n readonly dataMissingCount = computed(() => String(this.audit()?.missingCount ?? 0));\n readonly dataDuplicateCount = computed(() => String(this.audit()?.duplicateCount ?? 0));\n\n // ==========================================\n // SERVICES\n // ==========================================\n #scanner = inject(SdAutoidScannerService);\n #auditSvc = inject(SdAutoidAuditService);\n #highlight = inject(SdAutoidHighlightService);\n #export = inject(SdAutoidExportService);\n // Optional — chỉ có khi app dùng RouterModule; dùng để lấy route params cho meta.\n #router = inject(Router, { optional: true });\n\n // ==========================================\n // LIFECYCLE\n // ==========================================\n ngOnDestroy(): void {\n this.#highlight.clear(this.#root());\n }\n\n // ==========================================\n // ACTIONS\n // ==========================================\n togglePanel = (): void => {\n if (this.open()) {\n this.closePanel();\n } else {\n this.openPanel();\n }\n };\n\n openPanel = (): void => {\n if (!this.enabled()) return;\n this.refresh();\n this.open.set(true);\n };\n\n closePanel = (): void => {\n this.open.set(false);\n // Highlight được giữ lại để user vẫn thấy outline khi panel ẩn —\n // toggleHighlight trong tab Audit là cách duy nhất để clear.\n };\n\n refresh = (): void => {\n const root = this.#root();\n const elements = this.#scanner.scan(root, this.#requireSelectors());\n const result = this.#auditSvc.audit(elements, {\n root,\n requireSelectors: this.#requireSelectors(),\n });\n this.elements.set(elements);\n this.audit.set(result);\n this.#applyHighlightIfOn(result);\n };\n\n dismissFab = (event: Event): void => {\n event.stopPropagation();\n this.dismissed.set(true);\n if (this.open()) this.closePanel();\n };\n\n toggleHighlight = (): void => {\n const next = !this.highlightOn();\n this.highlightOn.set(next);\n if (next) {\n this.#applyHighlightIfOn(this.audit());\n } else {\n this.#highlight.clear(this.#root());\n }\n };\n\n setSegment = (seg: Segment): void => this.segment.set(seg);\n\n copyJson = async (): Promise<void> => {\n await this.#export.copyToClipboard(this.#export.toJson(this.elements(), this.#meta()));\n this.#flashCopyOk();\n };\n\n copyXpath = async (autoid: string): Promise<void> => {\n await this.#export.copyToClipboard(`//*[@data-autoid=\"${autoid}\"]`);\n this.#flashCopyOk();\n };\n\n exportCsv = (): void => {\n this.#export.download(this.#export.toCsv(this.elements()), this.#filename('csv'), 'text/csv;charset=utf-8');\n };\n\n exportJson = (): void => {\n this.#export.download(this.#export.toJson(this.elements(), this.#meta()), this.#filename('json'), 'application/json');\n };\n\n exportMdPom = (): void => {\n this.#export.download(this.#export.toMarkdownPom(this.elements(), this.#meta()), this.#filename('pom.md'), 'text/markdown');\n };\n\n exportMdTable = (): void => {\n this.#export.download(this.#export.toMarkdownTable(this.elements(), this.#meta()), this.#filename('reference.md'), 'text/markdown');\n };\n\n openRobotExportContext = (): void => {\n if (this.e2eExporting()) return;\n this.e2eExportOk.set(null);\n this.e2eExportError.set(null);\n this.robotContextOpen.set(true);\n };\n\n closeRobotExportContext = (): void => {\n if (this.e2eExporting()) return;\n this.robotContextOpen.set(false);\n };\n\n updateRobotExportContext = (field: RobotContextField, value: string): void => {\n this.robotExportContext.update(context => ({\n ...context,\n [field]: value,\n }));\n };\n\n confirmRobotExport = async (): Promise<void> => {\n const context = this.#cleanRobotExportContext();\n if (!context) return;\n const exported = await this.exportE2eTest('robot', context);\n if (exported) this.robotContextOpen.set(false);\n };\n\n exportE2eTest = async (target: AutoidE2eTarget, context?: AutoidRobotExportContext): Promise<boolean> => {\n const host = this.e2eGeneratorHost();\n if (!host || this.e2eExporting()) return false;\n\n this.e2eExporting.set(target);\n this.e2eExportOk.set(null);\n this.e2eExportError.set(null);\n\n try {\n this.refresh();\n const response = await fetch(this.#e2eEndpoint(host, target), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(this.#testGenerationRequest(target, context)),\n });\n\n if (!response.ok) {\n throw new Error(await this.#responseErrorMessage(response));\n }\n\n const blob = await response.blob();\n this.#export.downloadBlob(blob, this.#zipFilename(response, target));\n this.#flashE2eExportOk(this.#targetLabel(target));\n return true;\n } catch (err) {\n this.e2eExportError.set(this.#toErrorMessage(err));\n return false;\n } finally {\n this.e2eExporting.set(null);\n }\n };\n\n // ==========================================\n // KEYBOARD: Esc đóng panel\n // ==========================================\n @HostListener('document:keydown.escape')\n onEscape(): void {\n if (this.open()) this.closePanel();\n }\n\n // ==========================================\n // HELPERS\n // ==========================================\n #root(): HTMLElement {\n return this.#effectiveConfig().root ?? document.body;\n }\n\n #requireSelectors(): readonly string[] {\n const extra = this.#effectiveConfig().extraRequireSelectors ?? [];\n return [...new Set([...AUTOID_DEFAULT_REQUIRE_SELECTORS, ...extra])];\n }\n\n #effectiveConfig(): SdAutoidInspectorConfiguration {\n const injected = this.#injectedConfig ?? {};\n const local = this.config() ?? {};\n return {\n ...injected,\n ...local,\n extraRequireSelectors: [...(injected.extraRequireSelectors ?? []), ...(local.extraRequireSelectors ?? [])],\n };\n }\n\n #highlightMissing(result: AutoidAuditResult): void {\n if (!result.missing.length) return;\n const root = this.#root();\n const selector = this.#requireSelectors().join(',');\n const all = Array.from(root.querySelectorAll<HTMLElement>(selector));\n const missingNodes = all.filter(n => !n.hasAttribute('data-autoid') && !n.querySelector('[data-autoid]'));\n this.#highlight.applyMissing(missingNodes);\n }\n\n #applyHighlightIfOn(result: AutoidAuditResult | null): void {\n if (!this.highlightOn()) return;\n const root = this.#root();\n this.#highlight.apply(root);\n if (result) this.#highlightMissing(result);\n }\n\n #meta(): AutoidExportMeta {\n const loc = window.location;\n return {\n pageUrl: loc.pathname + loc.search,\n pageTitle: document.title || 'Page',\n timestamp: new Date().toISOString(),\n url: loc.href,\n pathname: loc.pathname,\n search: loc.search,\n queryParams: this.#export.parseQueryParams(loc.search),\n params: this.#routeParams(),\n };\n }\n\n /**\n * Route path params gộp dọc cây ActivatedRoute (nếu có Router). Trả về undefined khi\n * không có Router hoặc không có param nào — để `meta.params` được bỏ qua khỏi JSON.\n */\n #routeParams(): Record<string, string> | undefined {\n if (!this.#router) return undefined;\n const params: Record<string, string> = {};\n let route: ActivatedRouteSnapshot | null = this.#router.routerState.snapshot.root;\n while (route) {\n Object.assign(params, route.params);\n route = route.firstChild;\n }\n return Object.keys(params).length ? params : undefined;\n }\n\n #filename(ext: string): string {\n const slug = (document.title || 'autoid')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n return `${slug || 'autoid'}-${Date.now()}.${ext}`;\n }\n\n #normalizeHost(host: string | undefined): string | undefined {\n const trimmed = host?.trim();\n if (!trimmed) return undefined;\n return trimmed.replace(/\\/+$/g, '');\n }\n\n #e2eEndpoint(host: string, target: AutoidE2eTarget): string {\n const endpoint = target === 'playwright' ? 'playwright' : 'robot';\n return `${host}/e2e/test-generator/${endpoint}`;\n }\n\n #testGenerationRequest(\n target: AutoidE2eTarget,\n context?: AutoidRobotExportContext\n ): {\n payload: AutoidExportJson;\n options: {\n language: 'vi';\n mode: 'happy-path';\n outputName: string;\n testName: string;\n baseUrl?: string;\n };\n prompt?: string;\n context?: AutoidRobotExportContext;\n } {\n const baseUrl = this.#baseUrl();\n const options = {\n language: 'vi' as const,\n mode: 'happy-path' as const,\n outputName: this.#outputBaseName(target),\n testName: `${document.title || 'AutoId'} ${this.#targetLabel(target)}`,\n ...(baseUrl ? { baseUrl } : {}),\n };\n\n return {\n payload: {\n meta: this.#meta(),\n elements: this.elements(),\n },\n options,\n ...(context\n ? {\n prompt: 'Sinh Robot Framework E2E test bám theo ngữ cảnh QC, testcase, test data và requirement được cung cấp.',\n context,\n }\n : {}),\n };\n }\n\n #cleanRobotExportContext(): AutoidRobotExportContext | undefined {\n const context = this.robotExportContext();\n const cleaned: AutoidRobotExportContext = {};\n\n for (const [key, value] of Object.entries(context) as [RobotContextField, string | undefined][]) {\n const trimmed = value?.trim();\n if (trimmed) cleaned[key] = trimmed;\n }\n\n return Object.keys(cleaned).length ? cleaned : undefined;\n }\n\n #baseUrl(): string | undefined {\n const origin = window.location.origin;\n return /^https?:\\/\\//.test(origin) ? origin : undefined;\n }\n\n #outputBaseName(target: AutoidE2eTarget): string {\n const slug = (document.title || 'autoid')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n return `${slug || 'autoid'}-${target === 'playwright' ? 'playwright' : 'robot-framework'}`;\n }\n\n #targetLabel(target: AutoidE2eTarget): string {\n return target === 'playwright' ? 'Playwright' : 'Robot Framework';\n }\n\n #zipFilename(response: Response, target: AutoidE2eTarget): string {\n const header = response.headers.get('Content-Disposition') ?? '';\n const filenameStar = /filename\\*=UTF-8''([^;]+)/i.exec(header)?.[1];\n if (filenameStar) return this.#decodeFilename(filenameStar.replace(/^\"|\"$/g, ''));\n\n const filename = /filename=\"?([^\";]+)\"?/i.exec(header)?.[1];\n return filename?.trim() || this.#filename(`e2e-${target}.zip`);\n }\n\n #decodeFilename(value: string): string {\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n }\n\n async #responseErrorMessage(response: Response): Promise<string> {\n const fallback = `Không sinh được E2E test (HTTP ${response.status}).`;\n const text = await response.text().catch(() => '');\n if (!text) return fallback;\n\n try {\n const parsed = JSON.parse(text) as { message?: unknown; error?: unknown };\n const message = Array.isArray(parsed.message) ? parsed.message.join(', ') : parsed.message;\n if (typeof message === 'string' && message.trim()) return message;\n if (typeof parsed.error === 'string' && parsed.error.trim()) return parsed.error;\n } catch {\n return text.slice(0, 180);\n }\n\n return fallback;\n }\n\n #toErrorMessage(err: unknown): string {\n if (err instanceof Error && err.message) return err.message;\n return 'Không sinh được E2E test.';\n }\n\n #flashCopyOk(): void {\n this.copyOk.set(true);\n setTimeout(() => this.copyOk.set(false), 1200);\n }\n\n #flashE2eExportOk(label: string): void {\n this.e2eExportOk.set(label);\n setTimeout(() => {\n if (this.e2eExportOk() === label) this.e2eExportOk.set(null);\n }, 1800);\n }\n}\n","@let _enabled = enabled();\n@let _open = open();\n@if (_enabled && !dismissed()) {\n <div class=\"sd-autoid-inspector__fab-wrap\">\n <button\n type=\"button\"\n class=\"sd-autoid-inspector__fab\"\n data-autoid=\"sd-autoid-inspector-fab\"\n [attr.data-opened]=\"dataOpened()\"\n [matTooltip]=\"_open ? 'Đóng AutoId Inspector' : 'Mở AutoId Inspector'\"\n matTooltipPosition=\"left\"\n (click)=\"togglePanel()\">\n <sd-icon [name]=\"_open ? 'close' : 'tag'\"></sd-icon>\n </button>\n <button\n type=\"button\"\n class=\"sd-autoid-inspector__fab-dismiss\"\n matTooltip=\"Ẩn tạm — reload trang để hiện lại\"\n matTooltipPosition=\"left\"\n aria-label=\"Ẩn tạm FAB\"\n (click)=\"dismissFab($event)\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n </div>\n}\n\n@if (_enabled && _open) {\n @let _segment = segment();\n <button type=\"button\" class=\"sd-autoid-inspector__backdrop\" aria-label=\"Đóng AutoId Inspector\" (click)=\"closePanel()\"></button>\n <section\n class=\"sd-autoid-inspector__panel\"\n role=\"dialog\"\n aria-label=\"AutoId Inspector\"\n data-autoid=\"sd-autoid-inspector-panel\"\n [attr.data-segment]=\"dataSegment()\"\n [attr.data-highlight-on]=\"dataHighlightOn()\"\n [attr.data-element-count]=\"dataElementCount()\"\n [attr.data-missing-count]=\"dataMissingCount()\"\n [attr.data-duplicate-count]=\"dataDuplicateCount()\">\n <header class=\"sd-autoid-inspector__header\">\n <div class=\"sd-autoid-inspector__segments\">\n <button type=\"button\" [class.is-active]=\"_segment === 'audit'\" (click)=\"setSegment('audit')\">\n Audit\n @if (audit(); as a) {\n <span class=\"sd-autoid-inspector__badge\" [class.is-warn]=\"a.missingCount + a.duplicateCount > 0\">\n {{ a.missingCount + a.duplicateCount }}\n </span>\n }\n </button>\n <button type=\"button\" [class.is-active]=\"_segment === 'elements'\" (click)=\"setSegment('elements')\">\n Elements\n <span class=\"sd-autoid-inspector__badge\">{{ elements().length }}</span>\n </button>\n <button type=\"button\" [class.is-active]=\"_segment === 'export'\" (click)=\"setSegment('export')\">Export</button>\n </div>\n <div class=\"sd-autoid-inspector__actions\">\n <button type=\"button\" class=\"sd-autoid-inspector__icon-btn\" matTooltip=\"Quét lại\" (click)=\"refresh()\">\n <sd-icon name=\"refresh\"></sd-icon>\n </button>\n <button type=\"button\" class=\"sd-autoid-inspector__close-btn\" matTooltip=\"Đóng\" aria-label=\"Đóng panel\" (click)=\"closePanel()\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n </div>\n </header>\n\n @if (copyOk()) {\n <div class=\"sd-autoid-inspector__toast\">Đã copy ✓</div>\n }\n\n <div class=\"sd-autoid-inspector__body\">\n @switch (_segment) {\n @case ('audit') {\n <ng-container *ngTemplateOutlet=\"auditTpl\"></ng-container>\n }\n @case ('elements') {\n <ng-container *ngTemplateOutlet=\"elementsTpl\"></ng-container>\n }\n @case ('export') {\n <ng-container *ngTemplateOutlet=\"exportTpl\"></ng-container>\n }\n }\n </div>\n </section>\n\n <ng-template #auditTpl>\n @if (audit(); as a) {\n @let _highlightOn = highlightOn();\n <div class=\"sd-autoid-inspector__audit-toolbar\">\n <button type=\"button\" class=\"sd-autoid-inspector__toggle\" [class.is-on]=\"_highlightOn\" (click)=\"toggleHighlight()\">\n <sd-icon [name]=\"_highlightOn ? 'visibility' : 'visibility_off'\"></sd-icon>\n <span>Highlight DOM</span>\n <span class=\"sd-autoid-inspector__toggle-state\">{{ _highlightOn ? 'ON' : 'OFF' }}</span>\n </button>\n </div>\n <div class=\"sd-autoid-inspector__summary\">\n <div class=\"sd-autoid-inspector__stat is-info\">\n <div class=\"sd-autoid-inspector__stat-value\">{{ a.total }}</div>\n <div class=\"sd-autoid-inspector__stat-label\">Tổng autoid</div>\n </div>\n <div class=\"sd-autoid-inspector__stat\" [class.is-error]=\"a.duplicateCount > 0\" [class.is-success]=\"a.duplicateCount === 0\">\n <div class=\"sd-autoid-inspector__stat-value\">{{ a.duplicateCount }}</div>\n <div class=\"sd-autoid-inspector__stat-label\">Trùng</div>\n </div>\n <div class=\"sd-autoid-inspector__stat\" [class.is-warning]=\"a.missingCount > 0\" [class.is-success]=\"a.missingCount === 0\">\n <div class=\"sd-autoid-inspector__stat-value\">{{ a.missingCount }}</div>\n <div class=\"sd-autoid-inspector__stat-label\">Thiếu</div>\n </div>\n </div>\n\n @if (a.duplicateCount > 0) {\n <h4 class=\"sd-autoid-inspector__section-title\">\n <sd-icon class=\"is-error\" name=\"error\"></sd-icon>\n Autoid bị trùng\n </h4>\n <div class=\"sd-autoid-inspector__table-wrap\">\n <table class=\"sd-autoid-inspector__table\">\n <thead>\n <tr>\n <th>Autoid</th>\n <th>Số lần</th>\n </tr>\n </thead>\n <tbody>\n @for (entry of a.duplicates | keyvalue; track entry.key) {\n <tr class=\"is-error\">\n <td>\n <code>{{ entry.key }}</code>\n </td>\n <td>{{ entry.value }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n\n @if (a.missingCount > 0) {\n <h4 class=\"sd-autoid-inspector__section-title\">\n <sd-icon class=\"is-warning\" name=\"warning_amber\"></sd-icon>\n Element thiếu autoid\n </h4>\n <div class=\"sd-autoid-inspector__table-wrap\">\n <table class=\"sd-autoid-inspector__table\">\n <thead>\n <tr>\n <th>Tag</th>\n <th>Name hint</th>\n <th>Selector</th>\n </tr>\n </thead>\n <tbody>\n @for (m of a.missing; track $index) {\n <tr class=\"is-warning\">\n <td>\n <code>{{ m.tag }}</code>\n </td>\n <td>{{ m.nameHint }}</td>\n <td>\n <code>{{ m.selector }}</code>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n\n @if (a.duplicateCount === 0 && a.missingCount === 0) {\n <div class=\"sd-autoid-inspector__success-card\">\n <sd-icon name=\"check_circle\"></sd-icon>\n <div>\n <strong>Không có element thiếu hoặc trùng autoid.</strong>\n <small>Trang đã đạt chuẩn convention autoid.</small>\n </div>\n </div>\n }\n }\n </ng-template>\n\n <ng-template #elementsTpl>\n @let _filter = filter();\n <div class=\"sd-autoid-inspector__filter\">\n <sd-icon name=\"search\"></sd-icon>\n <input type=\"text\" placeholder=\"Lọc theo autoid / name / tag\" [ngModel]=\"_filter\" (ngModelChange)=\"filter.set($event)\" />\n @if (_filter) {\n <button type=\"button\" class=\"sd-autoid-inspector__icon-btn\" matTooltip=\"Xoá filter\" (click)=\"filter.set('')\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n }\n </div>\n\n <!-- Top-level elements (not inside any sd-table) -->\n <h4 class=\"sd-autoid-inspector__section-title\">\n Top-level elements\n <span class=\"sd-autoid-inspector__badge\">{{ topLevelElements().length }}</span>\n </h4>\n <div class=\"sd-autoid-inspector__table-wrap\">\n <table class=\"sd-autoid-inspector__table\">\n <thead>\n <tr>\n <th class=\"is-num\">STT</th>\n <th>Name</th>\n <th>Autoid</th>\n <th>Tag</th>\n <th>State</th>\n <th>Value</th>\n </tr>\n </thead>\n <tbody>\n @for (el of topLevelElements(); track el.autoid + $index) {\n <tr [class.is-error]=\"el.duplicate\">\n <td class=\"is-num\">{{ el.stt }}</td>\n <td>{{ el.name || '—' }}</td>\n <td>\n <div class=\"sd-autoid-inspector__autoid-cell\">\n <code>{{ el.autoid }}</code>\n <button\n type=\"button\"\n class=\"sd-autoid-inspector__icon-btn is-primary\"\n matTooltip=\"Copy xpath\"\n (click)=\"copyXpath(el.autoid)\">\n <sd-icon name=\"content_copy\"></sd-icon>\n </button>\n </div>\n </td>\n <td>\n <span class=\"sd-autoid-inspector__tag-chip\">{{ el.tag }}</span>\n </td>\n <td class=\"sd-autoid-inspector__state-cell\">\n @if (el.state.disabled !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\" [class.is-error]=\"el.state.disabled === 'true'\">\n disabled={{ el.state.disabled }}\n </span>\n }\n @if (el.state.loading !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\" [class.is-warning]=\"el.state.loading === 'true'\">\n loading={{ el.state.loading }}\n </span>\n }\n @if (el.state.empty !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\" [class.is-info]=\"el.state.empty === 'true'\">\n empty={{ el.state.empty }}\n </span>\n }\n @if (el.state.invalid !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\" [class.is-error]=\"el.state.invalid === 'true'\">\n invalid={{ el.state.invalid }}\n </span>\n }\n @if (el.state.opened !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\" [class.is-info]=\"el.state.opened === 'true'\">\n opened={{ el.state.opened }}\n </span>\n }\n @if (el.state.count !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-info\"> count={{ el.state.count }} </span>\n }\n @if (el.state.required !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\" [class.is-warning]=\"el.state.required === 'true'\">\n required={{ el.state.required }}\n </span>\n }\n @if (el.state.maxlength !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-info\"> maxlength={{ el.state.maxlength }} </span>\n }\n @if (el.state.minlength !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-info\"> minlength={{ el.state.minlength }} </span>\n }\n @if (el.state.pattern !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-info\"> pattern={{ el.state.pattern }} </span>\n }\n @if (el.state.errorMessage !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-error\"> error: {{ el.state.errorMessage }} </span>\n }\n </td>\n <td class=\"sd-autoid-inspector__value\" [matTooltip]=\"el.state.dataValue || el.text || ''\">\n {{ el.state.dataValue || el.text || '—' }}\n </td>\n </tr>\n } @empty {\n <tr>\n <td colspan=\"6\" class=\"sd-autoid-inspector__empty\">Không có kết quả.</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <!-- One section per sd-table group -->\n @for (group of tableGroups(); track group.scope) {\n <h4 class=\"sd-autoid-inspector__section-title\">\n <sd-icon class=\"is-info\" name=\"table_chart\"></sd-icon>\n Inside <code>{{ group.scope }}</code>\n <span class=\"sd-autoid-inspector__badge\">{{ group.items.length }}</span>\n </h4>\n <div class=\"sd-autoid-inspector__table-wrap\">\n <table class=\"sd-autoid-inspector__table\">\n <thead>\n <tr>\n <th class=\"is-num\">STT</th>\n <th>Name</th>\n <th>Autoid</th>\n <th>Tag</th>\n <th>State</th>\n <th>Value</th>\n </tr>\n </thead>\n <tbody>\n @for (el of group.items; track el.autoid + $index) {\n <tr [class.is-error]=\"el.duplicate\">\n <td class=\"is-num\">{{ el.stt }}</td>\n <td>{{ el.name || '—' }}</td>\n <td>\n <div class=\"sd-autoid-inspector__autoid-cell\">\n <code>{{ el.autoid }}</code>\n <button\n type=\"button\"\n class=\"sd-autoid-inspector__icon-btn is-primary\"\n matTooltip=\"Copy xpath\"\n (click)=\"copyXpath(el.autoid)\">\n <sd-icon name=\"content_copy\"></sd-icon>\n </button>\n </div>\n </td>\n <td>\n <span class=\"sd-autoid-inspector__tag-chip\">{{ el.tag }}</span>\n </td>\n <td class=\"sd-autoid-inspector__state-cell\">\n @if (el.state.disabled !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\" [class.is-error]=\"el.state.disabled === 'true'\">\n disabled={{ el.state.disabled }}\n </span>\n }\n @if (el.state.loading !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\" [class.is-warning]=\"el.state.loading === 'true'\">\n loading={{ el.state.loading }}\n </span>\n }\n @if (el.state.empty !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\" [class.is-info]=\"el.state.empty === 'true'\">\n empty={{ el.state.empty }}\n </span>\n }\n @if (el.state.invalid !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\" [class.is-error]=\"el.state.invalid === 'true'\">\n invalid={{ el.state.invalid }}\n </span>\n }\n @if (el.state.opened !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\" [class.is-info]=\"el.state.opened === 'true'\">\n opened={{ el.state.opened }}\n </span>\n }\n @if (el.state.count !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-info\"> count={{ el.state.count }} </span>\n }\n @if (el.state.required !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip\" [class.is-warning]=\"el.state.required === 'true'\">\n required={{ el.state.required }}\n </span>\n }\n @if (el.state.maxlength !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-info\"> maxlength={{ el.state.maxlength }} </span>\n }\n @if (el.state.minlength !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-info\"> minlength={{ el.state.minlength }} </span>\n }\n @if (el.state.pattern !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-info\"> pattern={{ el.state.pattern }} </span>\n }\n @if (el.state.errorMessage !== undefined) {\n <span class=\"sd-autoid-inspector__state-chip is-error\"> error: {{ el.state.errorMessage }} </span>\n }\n </td>\n <td class=\"sd-autoid-inspector__value\" [matTooltip]=\"el.state.dataValue || el.text || ''\">\n {{ el.state.dataValue || el.text || '—' }}\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </ng-template>\n\n <ng-template #exportTpl>\n <div class=\"sd-autoid-inspector__export-grid\">\n <button type=\"button\" matTooltip=\"Copy JSON vào clipboard\" (click)=\"copyJson()\">\n <sd-icon name=\"content_copy\"></sd-icon>\n <span>Copy JSON</span>\n <small>clipboard</small>\n </button>\n <button type=\"button\" matTooltip=\"Tải file JSON\" (click)=\"exportJson()\">\n <sd-icon name=\"download\"></sd-icon>\n <span>JSON</span>\n <small>.json</small>\n </button>\n <button type=\"button\" matTooltip=\"Tải file CSV\" (click)=\"exportCsv()\">\n <sd-icon name=\"table_view\"></sd-icon>\n <span>CSV</span>\n <small>.csv</small>\n </button>\n <button type=\"button\" matTooltip=\"Tải MD POM skeleton — cho AI viết auto-test\" (click)=\"exportMdPom()\">\n <sd-icon name=\"code\"></sd-icon>\n <span>MD POM</span>\n <small>AI test</small>\n </button>\n <button type=\"button\" matTooltip=\"Tải MD reference table — group theo tag sd-*\" (click)=\"exportMdTable()\">\n <sd-icon name=\"view_list\"></sd-icon>\n <span>MD Table</span>\n <small>reference</small>\n </button>\n </div>\n\n @if (e2eGeneratorHost()) {\n @let _e2eExporting = e2eExporting();\n <div class=\"sd-autoid-inspector__export-section\">\n <h4 class=\"sd-autoid-inspector__section-title\">\n <sd-icon class=\"is-info\" name=\"auto_awesome\"></sd-icon>\n Tạo E2E test\n </h4>\n <div class=\"sd-autoid-inspector__export-grid is-e2e\">\n <button\n type=\"button\"\n matTooltip=\"Tạo bộ test Playwright (.zip)\"\n [disabled]=\"_e2eExporting !== null\"\n (click)=\"exportE2eTest('playwright')\">\n <sd-icon [name]=\"_e2eExporting === 'playwright' ? 'hourglass_empty' : 'play_arrow'\"></sd-icon>\n <span>Playwright</span>\n <small>.zip</small>\n </button>\n <button\n type=\"button\"\n matTooltip=\"Tạo bộ test Robot Framework (.zip)\"\n [disabled]=\"_e2eExporting !== null\"\n (click)=\"openRobotExportContext()\">\n <sd-icon [name]=\"_e2eExporting === 'robot' ? 'hourglass_empty' : 'smart_toy'\"></sd-icon>\n <span>Robot Framework</span>\n <small>.zip</small>\n </button>\n </div>\n\n @if (robotContextOpen()) {\n <div class=\"sd-autoid-inspector__context-backdrop\" role=\"presentation\" (click)=\"closeRobotExportContext()\"></div>\n <section\n class=\"sd-autoid-inspector__context-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"sd-autoid-robot-context-title\">\n <header class=\"sd-autoid-inspector__context-header\">\n <div>\n <h4 id=\"sd-autoid-robot-context-title\">Ngữ cảnh QC cho Robot Framework</h4>\n <small>Requirement, test case, test data</small>\n </div>\n <button type=\"button\" class=\"sd-autoid-inspector__icon-btn\" matTooltip=\"Đóng\" (click)=\"closeRobotExportContext()\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n </header>\n\n <div class=\"sd-autoid-inspector__context-form\">\n <label>\n <span>Component</span>\n <input\n type=\"text\"\n placeholder=\"SP-Wallet\"\n [ngModel]=\"robotExportContext().component || ''\"\n (ngModelChange)=\"updateRobotExportContext('component', $event)\" />\n </label>\n <label>\n <span>Story / Trace</span>\n <input\n type=\"text\"\n placeholder=\"US-001, AC-01\"\n [ngModel]=\"robotExportContext().storyLinkages || ''\"\n (ngModelChange)=\"updateRobotExportContext('storyLinkages', $event)\" />\n </label>\n <label class=\"is-full\">\n <span>Requirement / AC / BR</span>\n <textarea\n rows=\"4\"\n placeholder=\"Dán requirement hoặc acceptance criteria...\"\n [ngModel]=\"robotExportContext().requirement || ''\"\n (ngModelChange)=\"updateRobotExportContext('requirement', $event)\"></textarea>\n </label>\n <label class=\"is-full\">\n <span>Test case QC đã định nghĩa</span>\n <textarea\n rows=\"4\"\n placeholder=\"TC-001: ...\"\n [ngModel]=\"robotExportContext().testCases || ''\"\n (ngModelChange)=\"updateRobotExportContext('testCases', $event)\"></textarea>\n </label>\n <label class=\"is-full\">\n <span>Test data</span>\n <textarea\n rows=\"3\"\n placeholder=\"wallet=Ví A, amount=100000...\"\n [ngModel]=\"robotExportContext().testData || ''\"\n (ngModelChange)=\"updateRobotExportContext('testData', $event)\"></textarea>\n </label>\n <label class=\"is-full\">\n <span>Precondition</span>\n <textarea\n rows=\"2\"\n placeholder=\"User đã đăng nhập, dữ liệu ví đã tồn tại...\"\n [ngModel]=\"robotExportContext().precondition || ''\"\n (ngModelChange)=\"updateRobotExportContext('precondition', $event)\"></textarea>\n </label>\n <label class=\"is-full\">\n <span>Ghi chú format QC</span>\n <textarea\n rows=\"3\"\n placeholder=\"Smoke=Y, Auto=Y, ưu tiên happy path...\"\n [ngModel]=\"robotExportContext().qcNotes || ''\"\n (ngModelChange)=\"updateRobotExportContext('qcNotes', $event)\"></textarea>\n </label>\n </div>\n\n <footer class=\"sd-autoid-inspector__context-actions\">\n <button type=\"button\" class=\"is-secondary\" [disabled]=\"_e2eExporting !== null\" (click)=\"closeRobotExportContext()\">\n Huỷ\n </button>\n <button\n type=\"button\"\n class=\"is-primary\"\n [disabled]=\"_e2eExporting !== null || !hasRobotExportContext()\"\n (click)=\"confirmRobotExport()\">\n <sd-icon [name]=\"_e2eExporting === 'robot' ? 'hourglass_empty' : 'download'\"></sd-icon>\n <span>Đồng ý xuất</span>\n </button>\n </footer>\n </section>\n }\n\n @if (e2eExportOk(); as targetLabel) {\n <div class=\"sd-autoid-inspector__export-message is-success\">Đã tải bộ test {{ targetLabel }}.</div>\n }\n @if (e2eExportError(); as error) {\n <div class=\"sd-autoid-inspector__export-message is-error\">\n {{ error }}\n </div>\n }\n </div>\n }\n </ng-template>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}