@sdcorejs/angular 19.0.10 → 19.0.11
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.
- package/README.md +2 -2
- package/assets/STYLE-GUIDE.md +2 -2
- package/assets/scss/core/_inline-edit.scss +1 -1
- package/assets/scss/core/form.scss +1 -1
- package/assets/scss/themes/default.scss +2 -2
- package/components/badge/src/badge.component.d.ts +3 -14
- package/components/button/src/button.component.d.ts +5 -3
- package/components/inform/src/inform.component.d.ts +2 -8
- package/components/query-builder/src/query-builder.component.d.ts +3 -3
- package/components/query-builder/src/query-builder.model.d.ts +3 -3
- package/components/table/src/components/command/desktop-command.component.d.ts +0 -1
- package/components/table/src/models/table-command.model.d.ts +3 -3
- package/components/table/src/models/table-option-selector.model.d.ts +5 -5
- package/components/tree/src/tree.model.d.ts +3 -2
- package/fesm2022/sdcorejs-angular-components-anchor.mjs +5 -6
- package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs +4 -5
- package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-badge.mjs +14 -12
- package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-button.mjs +10 -11
- package/fesm2022/sdcorejs-angular-components-button.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-code-editor.mjs +4 -5
- package/fesm2022/sdcorejs-angular-components-code-editor.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-editor.mjs +4 -5
- package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-form-generic.mjs +7 -13
- package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-history.mjs +2 -2
- package/fesm2022/sdcorejs-angular-components-history.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-import-excel.mjs +5 -7
- package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-inform.mjs +5 -15
- package/fesm2022/sdcorejs-angular-components-inform.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs +5 -6
- package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-modal.mjs +3 -4
- package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-org-chart.mjs +4 -5
- package/fesm2022/sdcorejs-angular-components-org-chart.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-preview.mjs +7 -8
- package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-query-bar.mjs +24 -28
- package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-query-builder.mjs +3 -4
- package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-section.mjs +3 -4
- package/fesm2022/sdcorejs-angular-components-section.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +3 -4
- package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-stepper.mjs +3 -4
- package/fesm2022/sdcorejs-angular-components-stepper.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-tab-router.mjs +5 -6
- package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-tab.mjs +3 -4
- package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-table.mjs +23 -27
- package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-tree.mjs +6 -8
- package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-upload-file.mjs +8 -9
- package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +5 -7
- package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +7 -9
- package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-chip.mjs +5 -7
- package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-date-range.mjs +7 -9
- package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-date.mjs +6 -8
- package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-datetime.mjs +5 -7
- package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-inline-text.mjs +4 -5
- package/fesm2022/sdcorejs-angular-forms-inline-text.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-input-number.mjs +5 -7
- package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-input.mjs +5 -7
- package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-label.mjs +4 -5
- package/fesm2022/sdcorejs-angular-forms-label.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-radio.mjs +1 -3
- package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-select.mjs +6 -8
- package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-textarea.mjs +5 -7
- package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-modules-icon.mjs +523 -0
- package/fesm2022/sdcorejs-angular-modules-icon.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-modules-layout.mjs +24 -26
- package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-modules.mjs +1 -0
- package/fesm2022/sdcorejs-angular-modules.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-confirm.mjs +3 -4
- package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-services-excel.mjs +22 -14
- package/fesm2022/sdcorejs-angular-services-excel.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-utilities-models.mjs +3 -2
- package/fesm2022/sdcorejs-angular-utilities-models.mjs.map +1 -1
- package/modules/icon/index.d.ts +1 -0
- package/modules/icon/src/icon.component.d.ts +101 -0
- package/modules/icon/src/icon.model.d.ts +59 -0
- package/modules/icon/src/icon.provider.d.ts +33 -0
- package/modules/icon/src/index.d.ts +3 -0
- package/modules/index.d.ts +1 -0
- package/package.json +10 -5
- package/services/excel/src/lib/spreadsheet-formula-injection.util.d.ts +5 -0
- package/utilities/models/src/icon.model.d.ts +4 -2
|
@@ -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, #4CAF50)';\nconst COLOR_OK_BG = 'var(--sd-success-light, rgba(76, 175, 80, 0.12))';\nconst COLOR_DUP = 'var(--sd-error, #F82C13)';\nconst COLOR_DUP_BG = 'var(--sd-error-light, rgba(248, 44, 19, 0.12))';\nconst COLOR_MISSING = 'var(--sd-warning, #FF9600)';\nconst COLOR_MISSING_BG = 'var(--sd-warning-light, rgba(255, 150, 0, 0.12))';\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 { MatIconModule } from '@angular/material/icon';\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';\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: [CommonModule, FormsModule, MatIconModule, 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 <mat-icon>{{ _open ? 'close' : 'tag' }}</mat-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 <mat-icon>close</mat-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 <mat-icon>refresh</mat-icon>\n </button>\n <button type=\"button\" class=\"sd-autoid-inspector__close-btn\" matTooltip=\"Đóng\" aria-label=\"Đóng panel\" (click)=\"closePanel()\">\n <mat-icon>close</mat-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 <mat-icon>{{ _highlightOn ? 'visibility' : 'visibility_off' }}</mat-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 <mat-icon class=\"is-error\">error_outline</mat-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 <mat-icon class=\"is-warning\">warning_amber</mat-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 <mat-icon>check_circle</mat-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 <mat-icon>search</mat-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 <mat-icon>close</mat-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 <mat-icon>content_copy</mat-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 <mat-icon class=\"is-info\">table_chart</mat-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 <mat-icon>content_copy</mat-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 <mat-icon>content_copy</mat-icon>\n <span>Copy JSON</span>\n <small>clipboard</small>\n </button>\n <button type=\"button\" matTooltip=\"Tải file JSON\" (click)=\"exportJson()\">\n <mat-icon>download</mat-icon>\n <span>JSON</span>\n <small>.json</small>\n </button>\n <button type=\"button\" matTooltip=\"Tải file CSV\" (click)=\"exportCsv()\">\n <mat-icon>table_view</mat-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 <mat-icon>code</mat-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 <mat-icon>view_list</mat-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 <mat-icon class=\"is-info\">auto_awesome</mat-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 <mat-icon>{{ _e2eExporting === 'playwright' ? 'hourglass_empty' : 'play_arrow' }}</mat-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 <mat-icon>{{ _e2eExporting === 'robot' ? 'hourglass_empty' : 'smart_toy' }}</mat-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 <mat-icon>close</mat-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 <mat-icon>{{ _e2eExporting === 'robot' ? 'hourglass_empty' : 'download' }}</mat-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, #4CAF50)';\nconst COLOR_OK_BG = 'var(--sd-success-light, rgba(76, 175, 80, 0.12))';\nconst COLOR_DUP = 'var(--sd-error, #F82C13)';\nconst COLOR_DUP_BG = 'var(--sd-error-light, rgba(248, 44, 19, 0.12))';\nconst COLOR_MISSING = 'var(--sd-warning, #FF9600)';\nconst COLOR_MISSING_BG = 'var(--sd-warning-light, rgba(255, 150, 0, 0.12))';\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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"}
|