@memberjunction/ng-dashboards 5.37.0 → 5.39.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/README.md +46 -7
  2. package/dist/AI/components/agents/agent-configuration.component.js +199 -198
  3. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  4. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
  5. package/dist/AI/components/analytics/ai-analytics-resource.component.js +20 -17
  6. package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
  7. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +15 -0
  8. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
  9. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +166 -58
  10. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
  11. package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
  12. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +2 -1
  13. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
  14. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +1 -0
  15. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
  16. package/dist/AI/components/analytics/model-performance/model-performance.component.js +55 -36
  17. package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
  18. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts +9 -1
  19. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
  20. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +158 -117
  21. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
  22. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts +1 -0
  23. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
  24. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +22 -8
  25. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
  26. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +89 -842
  27. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  28. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +1353 -7683
  29. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  30. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts +87 -0
  31. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts.map +1 -0
  32. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js +475 -0
  33. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js.map +1 -0
  34. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts +29 -0
  35. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts.map +1 -0
  36. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js +208 -0
  37. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js.map +1 -0
  38. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts +21 -0
  39. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts.map +1 -0
  40. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js +70 -0
  41. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js.map +1 -0
  42. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts +235 -0
  43. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -0
  44. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +1735 -0
  45. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -0
  46. package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts +61 -0
  47. package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts.map +1 -0
  48. package/dist/AI/components/autotagging/shared/classify.dryrun.js +78 -0
  49. package/dist/AI/components/autotagging/shared/classify.dryrun.js.map +1 -0
  50. package/dist/AI/components/autotagging/shared/classify.format.d.ts +43 -0
  51. package/dist/AI/components/autotagging/shared/classify.format.d.ts.map +1 -0
  52. package/dist/AI/components/autotagging/shared/classify.format.js +209 -0
  53. package/dist/AI/components/autotagging/shared/classify.format.js.map +1 -0
  54. package/dist/AI/components/autotagging/shared/classify.types.d.ts +276 -0
  55. package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -0
  56. package/dist/AI/components/autotagging/shared/classify.types.js +6 -0
  57. package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -0
  58. package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts +103 -0
  59. package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts.map +1 -0
  60. package/dist/AI/components/autotagging/tabs/health-tab.component.js +571 -0
  61. package/dist/AI/components/autotagging/tabs/health-tab.component.js.map +1 -0
  62. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts +40 -0
  63. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts.map +1 -0
  64. package/dist/AI/components/autotagging/tabs/history-tab.component.js +402 -0
  65. package/dist/AI/components/autotagging/tabs/history-tab.component.js.map +1 -0
  66. package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts +107 -0
  67. package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts.map +1 -0
  68. package/dist/AI/components/autotagging/tabs/inbox-tab.component.js +719 -0
  69. package/dist/AI/components/autotagging/tabs/inbox-tab.component.js.map +1 -0
  70. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts +122 -0
  71. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts.map +1 -0
  72. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js +752 -0
  73. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js.map +1 -0
  74. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +166 -0
  75. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -0
  76. package/dist/AI/components/autotagging/tabs/sources-tab.component.js +1384 -0
  77. package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -0
  78. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts +70 -0
  79. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts.map +1 -0
  80. package/dist/AI/components/autotagging/tabs/tags-tab.component.js +448 -0
  81. package/dist/AI/components/autotagging/tabs/tags-tab.component.js.map +1 -0
  82. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts +397 -0
  83. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts.map +1 -0
  84. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js +3490 -0
  85. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js.map +1 -0
  86. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts +47 -0
  87. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts.map +1 -0
  88. package/dist/AI/components/autotagging/tabs/types-tab.component.js +220 -0
  89. package/dist/AI/components/autotagging/tabs/types-tab.component.js.map +1 -0
  90. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +293 -289
  91. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  92. package/dist/AI/components/models/model-management.component.js +209 -208
  93. package/dist/AI/components/models/model-management.component.js.map +1 -1
  94. package/dist/AI/components/prompts/prompt-management.component.js +130 -128
  95. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  96. package/dist/AI/components/requests/agent-requests-resource.component.js +61 -61
  97. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
  98. package/dist/AI/components/system/system-configuration.component.js +17 -17
  99. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  100. package/dist/AI/components/tags/tags-resource.component.js +550 -532
  101. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  102. package/dist/AI/components/vectors/vector-management-resource.component.js +1 -1
  103. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  104. package/dist/AI/services/ai-instrumentation.service.d.ts +5 -0
  105. package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
  106. package/dist/AI/services/ai-instrumentation.service.js +14 -2
  107. package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
  108. package/dist/AI/services/cache-metrics.d.ts +50 -0
  109. package/dist/AI/services/cache-metrics.d.ts.map +1 -0
  110. package/dist/AI/services/cache-metrics.js +43 -0
  111. package/dist/AI/services/cache-metrics.js.map +1 -0
  112. package/dist/APIKeys/api-key-edit-panel.component.js +2 -2
  113. package/dist/APIKeys/api-keys-resource.component.js +132 -131
  114. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  115. package/dist/Actions/components/actions-overview.component.js +141 -141
  116. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  117. package/dist/Actions/components/execution-monitoring.component.js +15 -15
  118. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  119. package/dist/Actions/components/explorer/action-explorer.component.d.ts +0 -5
  120. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
  121. package/dist/Actions/components/explorer/action-explorer.component.js +139 -212
  122. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  123. package/dist/Admin/admin-data-schema.component.js +2 -2
  124. package/dist/Admin/admin-data-schema.component.js.map +1 -1
  125. package/dist/Admin/admin-dev-tools-resource.component.js +2 -2
  126. package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
  127. package/dist/Admin/admin-identity-access.component.js +2 -2
  128. package/dist/Admin/admin-identity-access.component.js.map +1 -1
  129. package/dist/Admin/admin-monitoring.component.js +2 -2
  130. package/dist/Admin/admin-monitoring.component.js.map +1 -1
  131. package/dist/ApplicationRoles/application-roles-resource.component.js +54 -49
  132. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
  133. package/dist/Communication/communication-logs-resource.component.d.ts +6 -0
  134. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  135. package/dist/Communication/communication-logs-resource.component.js +72 -50
  136. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  137. package/dist/Communication/communication-monitor-resource.component.js +103 -102
  138. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  139. package/dist/Communication/communication-providers-resource.component.js +52 -51
  140. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  141. package/dist/Communication/communication-runs-resource.component.js +39 -38
  142. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  143. package/dist/Communication/communication-templates-resource.component.d.ts +6 -0
  144. package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
  145. package/dist/Communication/communication-templates-resource.component.js +92 -89
  146. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  147. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +73 -1
  148. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  149. package/dist/ComponentStudio/component-studio-dashboard.component.js +512 -127
  150. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  151. package/dist/ComponentStudio/component-studio-resource.component.d.ts +22 -0
  152. package/dist/ComponentStudio/component-studio-resource.component.d.ts.map +1 -0
  153. package/dist/ComponentStudio/component-studio-resource.component.js +55 -0
  154. package/dist/ComponentStudio/component-studio-resource.component.js.map +1 -0
  155. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +104 -45
  156. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -1
  157. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +234 -331
  158. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
  159. package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.d.ts +54 -0
  160. package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.d.ts.map +1 -0
  161. package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.js +339 -0
  162. package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.js.map +1 -0
  163. package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.d.ts +65 -0
  164. package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.d.ts.map +1 -0
  165. package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.js +492 -0
  166. package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.js.map +1 -0
  167. package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.d.ts +88 -0
  168. package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.d.ts.map +1 -0
  169. package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.js +457 -0
  170. package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.js.map +1 -0
  171. package/dist/ComponentStudio/components/form-override-dialog.component.d.ts +106 -0
  172. package/dist/ComponentStudio/components/form-override-dialog.component.d.ts.map +1 -0
  173. package/dist/ComponentStudio/components/form-override-dialog.component.js +478 -0
  174. package/dist/ComponentStudio/components/form-override-dialog.component.js.map +1 -0
  175. package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts +54 -0
  176. package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts.map +1 -1
  177. package/dist/ComponentStudio/components/workspace/component-preview.component.js +361 -50
  178. package/dist/ComponentStudio/components/workspace/component-preview.component.js.map +1 -1
  179. package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts +10 -0
  180. package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts.map +1 -1
  181. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +114 -45
  182. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -1
  183. package/dist/ComponentStudio/services/canvas-to-code.d.ts +32 -0
  184. package/dist/ComponentStudio/services/canvas-to-code.d.ts.map +1 -0
  185. package/dist/ComponentStudio/services/canvas-to-code.js +347 -0
  186. package/dist/ComponentStudio/services/canvas-to-code.js.map +1 -0
  187. package/dist/ComponentStudio/services/code-to-canvas.d.ts +32 -0
  188. package/dist/ComponentStudio/services/code-to-canvas.d.ts.map +1 -0
  189. package/dist/ComponentStudio/services/code-to-canvas.js +92 -0
  190. package/dist/ComponentStudio/services/code-to-canvas.js.map +1 -0
  191. package/dist/ComponentStudio/services/component-studio-state.service.d.ts +29 -0
  192. package/dist/ComponentStudio/services/component-studio-state.service.d.ts.map +1 -1
  193. package/dist/ComponentStudio/services/component-studio-state.service.js +76 -0
  194. package/dist/ComponentStudio/services/component-studio-state.service.js.map +1 -1
  195. package/dist/ComponentStudio/services/entity-form-override.service.d.ts +86 -0
  196. package/dist/ComponentStudio/services/entity-form-override.service.d.ts.map +1 -0
  197. package/dist/ComponentStudio/services/entity-form-override.service.js +246 -0
  198. package/dist/ComponentStudio/services/entity-form-override.service.js.map +1 -0
  199. package/dist/ComponentStudio/services/field-binding-scanner.d.ts +29 -0
  200. package/dist/ComponentStudio/services/field-binding-scanner.d.ts.map +1 -0
  201. package/dist/ComponentStudio/services/field-binding-scanner.js +110 -0
  202. package/dist/ComponentStudio/services/field-binding-scanner.js.map +1 -0
  203. package/dist/ComponentStudio/services/form-canvas-model.d.ts +56 -0
  204. package/dist/ComponentStudio/services/form-canvas-model.d.ts.map +1 -0
  205. package/dist/ComponentStudio/services/form-canvas-model.js +35 -0
  206. package/dist/ComponentStudio/services/form-canvas-model.js.map +1 -0
  207. package/dist/ComponentStudio/services/form-host-props-fixture.d.ts +10 -0
  208. package/dist/ComponentStudio/services/form-host-props-fixture.d.ts.map +1 -0
  209. package/dist/ComponentStudio/services/form-host-props-fixture.js +10 -0
  210. package/dist/ComponentStudio/services/form-host-props-fixture.js.map +1 -0
  211. package/dist/Credentials/components/credentials-audit-resource.component.js +136 -135
  212. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  213. package/dist/Credentials/components/credentials-categories-resource.component.js +155 -152
  214. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  215. package/dist/Credentials/components/credentials-list-resource.component.js +119 -118
  216. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  217. package/dist/Credentials/components/credentials-overview-resource.component.js +129 -128
  218. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  219. package/dist/Credentials/components/credentials-types-resource.component.js +107 -106
  220. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  221. package/dist/DataExplorer/data-explorer-dashboard.component.js +2 -2
  222. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  223. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +1 -1
  224. package/dist/DatabaseDesigner/components/entity-list.component.js +115 -114
  225. package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
  226. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +5 -6
  227. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
  228. package/dist/DatabaseDesigner/database-designer-dashboards.module.js +4 -5
  229. package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
  230. package/dist/DevTools/app-state-inspector.component.js +18 -17
  231. package/dist/DevTools/app-state-inspector.component.js.map +1 -1
  232. package/dist/DevTools/class-registry.component.js +88 -85
  233. package/dist/DevTools/class-registry.component.js.map +1 -1
  234. package/dist/DevTools/event-monitor.component.js +155 -150
  235. package/dist/DevTools/event-monitor.component.js.map +1 -1
  236. package/dist/DevTools/graphql-console.component.js +245 -243
  237. package/dist/DevTools/graphql-console.component.js.map +1 -1
  238. package/dist/DevTools/layout-inspector.component.js +18 -17
  239. package/dist/DevTools/layout-inspector.component.js.map +1 -1
  240. package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -19
  241. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  242. package/dist/FormBuilder/form-builder-resource.component.d.ts +964 -0
  243. package/dist/FormBuilder/form-builder-resource.component.d.ts.map +1 -0
  244. package/dist/FormBuilder/form-builder-resource.component.js +4487 -0
  245. package/dist/FormBuilder/form-builder-resource.component.js.map +1 -0
  246. package/dist/FormBuilder/form-builder-version-rail.helpers.d.ts +55 -0
  247. package/dist/FormBuilder/form-builder-version-rail.helpers.d.ts.map +1 -0
  248. package/dist/FormBuilder/form-builder-version-rail.helpers.js +73 -0
  249. package/dist/FormBuilder/form-builder-version-rail.helpers.js.map +1 -0
  250. package/dist/Home/home-application.d.ts +21 -1
  251. package/dist/Home/home-application.d.ts.map +1 -1
  252. package/dist/Home/home-application.js +60 -8
  253. package/dist/Home/home-application.js.map +1 -1
  254. package/dist/Home/home-dashboard.component.js +2 -2
  255. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  256. package/dist/Integration/components/activity/activity.component.js +236 -229
  257. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  258. package/dist/Integration/components/connections/connections.component.js +390 -389
  259. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  260. package/dist/Integration/components/overview/overview.component.js +2 -2
  261. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +2 -2
  262. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  263. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +45 -44
  264. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  265. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +293 -291
  266. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  267. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +62 -61
  268. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
  269. package/dist/Lists/components/lists-browse-resource.component.d.ts +6 -2
  270. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  271. package/dist/Lists/components/lists-browse-resource.component.js +525 -566
  272. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  273. package/dist/Lists/components/lists-categories-resource.component.js +135 -134
  274. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  275. package/dist/Lists/components/lists-my-lists-resource.component.js +199 -198
  276. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  277. package/dist/MCP/mcp-dashboard.component.js +443 -438
  278. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  279. package/dist/QueryBrowser/query-browser-resource.component.d.ts +14 -14
  280. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  281. package/dist/QueryBrowser/query-browser-resource.component.js +11 -10
  282. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  283. package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
  284. package/dist/Scheduling/components/scheduling-activity.component.js +146 -147
  285. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  286. package/dist/Scheduling/components/scheduling-jobs.component.js +76 -75
  287. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  288. package/dist/Scheduling/components/scheduling-overview.component.js +97 -96
  289. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  290. package/dist/Scheduling/scheduling-dashboard.component.js +24 -22
  291. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  292. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +2 -0
  293. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
  294. package/dist/Scheduling/services/scheduling-instrumentation.service.js +1 -0
  295. package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
  296. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +1 -1
  297. package/dist/Testing/components/testing-explorer.component.d.ts +14 -4
  298. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  299. package/dist/Testing/components/testing-explorer.component.js +436 -427
  300. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  301. package/dist/Testing/components/testing-runs-resource.component.js +1 -1
  302. package/dist/Testing/components/testing-runs.component.js +116 -115
  303. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  304. package/dist/Testing/testing-dashboard.component.js +6 -7
  305. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  306. package/dist/VersionHistory/components/labels-resource.component.js +173 -172
  307. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  308. package/dist/VersionHistory/components/restore-resource.component.d.ts +6 -0
  309. package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
  310. package/dist/VersionHistory/components/restore-resource.component.js +116 -92
  311. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  312. package/dist/ai-dashboards.module.d.ts +47 -35
  313. package/dist/ai-dashboards.module.d.ts.map +1 -1
  314. package/dist/ai-dashboards.module.js +40 -1
  315. package/dist/ai-dashboards.module.js.map +1 -1
  316. package/dist/communication-dashboards.module.d.ts +1 -1
  317. package/dist/communication-dashboards.module.d.ts.map +1 -1
  318. package/dist/communication-dashboards.module.js +7 -1
  319. package/dist/communication-dashboards.module.js.map +1 -1
  320. package/dist/component-studio-dashboards.module.d.ts +34 -22
  321. package/dist/component-studio-dashboards.module.d.ts.map +1 -1
  322. package/dist/component-studio-dashboards.module.js +65 -9
  323. package/dist/component-studio-dashboards.module.js.map +1 -1
  324. package/dist/testing-dashboards.module.d.ts +4 -5
  325. package/dist/testing-dashboards.module.d.ts.map +1 -1
  326. package/dist/testing-dashboards.module.js +7 -5
  327. package/dist/testing-dashboards.module.js.map +1 -1
  328. package/package.json +55 -53
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taxonomy-tab.component.js","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/tabs/taxonomy-tab.component.ts","../../../../../src/AI/components/autotagging/tabs/taxonomy-tab.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Classify · Taxonomy Governance tab.\n *\n * Self-contained sub-page: owns its header-interior (sub-tab nav + Refresh),\n * the five governance sub-tabs (Tree, Duplicates, Orphans, Treemap, Audit), and\n * the five governance dialogs (Split, Move, Merge-Into, Create-Tag, Confirm).\n *\n * Loads its own taxonomy data (Tags, Tagged Items, Tag Audit Logs, and per-tag\n * SQL aggregates) via `RunView.FromMetadataProvider(this.ProviderToUse)` /\n * `RunQuery`, exactly as the host did. Receives the already-loaded shared\n * `MJ: Content Item Tags` rows from the host via `[ContentTags]` (used for\n * per-tag counts + recent-item previews). After a governance mutation it\n * reloads its own data and emits `(DataChanged)` so the host can react if needed.\n */\nimport { Component, ChangeDetectorRef, EventEmitter, Input, Output, OnInit, inject } from '@angular/core';\nimport { BaseEntity, CompositeKey, RunQuery, RunView } from '@memberjunction/core';\nimport { MJTagEntity, MJTaggedItemEntity, MJTagScopeEntity, MJTagSynonymEntity } from '@memberjunction/core-entities';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { TabConfig } from '@memberjunction/ng-ui-components';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport {\n TaxonomySubTab, TaxTreeNode, TaxDuplicatePair, TaxOrphanCard,\n TaxTreemapCell, TaxAuditAction, TaxAuditEvent, TaxHealthStat\n} from '../shared/classify.types';\nimport { formatShortDate, formatDate } from '../shared/classify.format';\n\n@Component({\n standalone: false,\n selector: 'classify-taxonomy-tab',\n templateUrl: './taxonomy-tab.component.html',\n styleUrls: ['./taxonomy-tab.component.css']\n})\nexport class ClassifyTaxonomyTabComponent extends BaseAngularComponent implements OnInit {\n private cdr = inject(ChangeDetectorRef);\n\n /** Shared raw `MJ: Content Item Tags` rows, supplied by the host orchestrator. */\n private _contentTags: Record<string, unknown>[] = [];\n @Input()\n set ContentTags(value: Record<string, unknown>[]) {\n this._contentTags = value ?? [];\n }\n get ContentTags(): Record<string, unknown>[] {\n return this._contentTags;\n }\n\n /** Fired after a governance mutation so the host can refresh its own surfaces if needed. */\n @Output() DataChanged = new EventEmitter<void>();\n\n // ── Taxonomy Governance state ──\n public TaxSubTab: TaxonomySubTab = 'tree';\n public TaxTreeNodes: TaxTreeNode[] = [];\n public TaxFlatNodes: TaxTreeNode[] = [];\n public TaxFilteredNodes: TaxTreeNode[] = [];\n public TaxSelectedNode: TaxTreeNode | null = null;\n public TaxTreeSearch = '';\n public TaxDuplicates: TaxDuplicatePair[] = [];\n public TaxOrphans: TaxOrphanCard[] = [];\n public TaxAllOrphansSelected = false;\n public TaxTreemapCells: TaxTreemapCell[] = [];\n public TaxAuditEvents: TaxAuditEvent[] = [];\n public TaxAuditFilterTypes = new Set<string>(['created', 'merged', 'moved', 'deleted', 'renamed', 'deprecated', 'descriptionchanged', 'reactivated', 'split']);\n public TaxHealth: TaxHealthStat = { Total: 0, Healthy: 0, NeedAttention: 0, Orphaned: 0, Duplicates: 0 };\n public TaxRecentItems: { Name: string; Weight: number; Date: string; Icon: string }[] = [];\n public TaxTreemapKPIs: { Label: string; Value: string }[] = [];\n public TaxIsEditing = false;\n\n // ── Create Tag Dialog ──\n public ShowCreateTagDialog = false;\n public CreateTagName = '';\n public CreateTagDescription = '';\n public CreateTagParentID: string | null = null;\n /** Label shown in the create dialog to indicate context (e.g., \"under AI Agent\") */\n public CreateTagParentLabel = '';\n\n // ── Multi-select for drag reparenting ──\n public TaxMultiSelectMode = false;\n public TaxSelectedIDs = new Set<string>();\n /** The node currently being dragged over (drop target highlight) */\n public TaxDragOverNodeID: string | null = null;\n /** True while a drag-reparent operation is saving */\n public TaxTreeSaving = false;\n\n /** Count of high-confidence duplicate pairs (>85% similarity) */\n public get TaxHighConfidenceDupeCount(): number {\n return this.TaxDuplicates.filter(d => d.SeverityClass === 'high').length;\n }\n\n /** Count of moderate-confidence duplicate pairs (70-85% similarity) */\n public get TaxModerateDupeCount(): number {\n return this.TaxDuplicates.filter(d => d.SeverityClass === 'moderate').length;\n }\n public TaxEditName = '';\n public TaxEditDescription = '';\n\n // ── Selected-node editor sub-tabs (Overview / Governance / Synonyms / Scope) ──\n /** Active sub-tab in the selected-node editor. Only visible when a node is selected. */\n public TagEditorSubTab: 'overview' | 'governance' | 'synonyms' | 'scope' = 'overview';\n\n // ── Governance panel state ──\n /** The strongly-typed MJ: Tags entity backing the governance editor for the selected node. */\n public GovernanceTag: MJTagEntity | null = null;\n /** True while the governance entity is loading. */\n public GovernanceLoading = false;\n /** True while a governance save is in flight. */\n public GovernanceSaving = false;\n /** Editable copies of the governance flags so we don't mutate the entity until Save(). */\n public GovIsFrozen = false;\n public GovAllowAutoGrow = false;\n public GovRequiresReview = false;\n public GovMaxChildren: number | null = null;\n public GovMaxDescendantDepth: number | null = null;\n public GovMinWeight: number | null = null;\n\n // ── Synonyms panel state ──\n /** Synonyms for the selected tag (typed entity objects, loaded lazily per-tag). */\n public Synonyms: MJTagSynonymEntity[] = [];\n /** True while synonyms are loading. */\n public SynonymsLoading = false;\n /** New synonym text to add. */\n public NewSynonymText = '';\n /** True while a synonym add/delete is in flight. */\n public SynonymSaving = false;\n\n // ── Scope panel state ──\n /** Scopes for the selected tag (typed entity objects, loaded lazily per-tag). */\n public Scopes: MJTagScopeEntity[] = [];\n /** True while scopes are loading. */\n public ScopesLoading = false;\n /** True while a scope/global mutation is in flight. */\n public ScopeSaving = false;\n /** Selected entity ID for the \"Add scope\" affordance. */\n public NewScopeEntityID: string | null = null;\n /** RecordID text for the \"Add scope\" affordance. */\n public NewScopeRecordID = '';\n\n // Raw taxonomy data cache\n private tagsRaw: Record<string, unknown>[] = [];\n private taggedItemsRaw: Record<string, unknown>[] = [];\n private tagAuditLogsRaw: Record<string, unknown>[] = [];\n /** Cached per-tag aggregates from server-side SQL (weights + counts) */\n private tagAggregateWeights = new Map<string, number>();\n private tagAggregateCounts = new Map<string, number>();\n\n // ── Confirmation dialog state ──\n /** Whether a generic confirmation overlay is visible */\n public ShowConfirmDialog = false;\n /** Title text for the confirmation dialog */\n public ConfirmDialogTitle = '';\n /** Body message for the confirmation dialog */\n public ConfirmDialogMessage = '';\n /** Callback invoked when user confirms */\n private confirmDialogAction: (() => Promise<void>) | null = null;\n\n // ── Split dialog state ──\n /** Whether the split-tag dialog is visible */\n public ShowSplitDialog = false;\n /** Comma-separated new child tag names for the split operation */\n public SplitChildNames = '';\n /** The node currently being split */\n private splitTargetNode: TaxTreeNode | null = null;\n\n // ── Move dialog state ──\n /** Whether the move-tag dialog is visible */\n public ShowMoveDialog = false;\n /** Selected new parent tag ID for the move operation */\n public MoveNewParentID: string | null = null;\n /** The node currently being moved */\n private moveTargetNode: TaxTreeNode | null = null;\n\n // ── Merge Into dialog state ──\n public ShowMergeIntoDialog = false;\n public MergeSourceTag: TaxTreeNode | null = null;\n public MergeTargetID: string | null = null;\n public MergeTargetData: { ID: string; Label: string }[] = [];\n\n // ── Treemap drill-in state ──\n /** Whether the treemap drill-in panel is visible */\n public ShowTreemapDrillIn = false;\n /** Tag node currently displayed in treemap drill-in */\n public TreemapDrillInNode: TaxTreeNode | null = null;\n\n public IsMerging = false;\n\n /** Subtitle rendered in the per-section `<mj-page-header-interior>`. */\n public get Subtitle(): string {\n return `Manage tag hierarchy, resolve duplicates, and monitor taxonomy health — ${this.TaxHealth.Total} total tags`;\n }\n\n public async ngOnInit(): Promise<void> {\n await this.loadTaxonomyData();\n }\n\n /** Taxonomy sub-tabs as `TabConfig[]` for `<mj-tab-nav>`. */\n public get taxSubTabsConfig(): TabConfig[] {\n return [\n { key: 'tree', label: 'Tree View', icon: 'fa-solid fa-sitemap' },\n { key: 'duplicates', label: 'Duplicates', icon: 'fa-solid fa-link',\n badge: this.TaxDuplicates.length > 0 ? this.TaxDuplicates.length : null,\n badgeVariant: 'warning' },\n { key: 'orphans', label: 'Orphans', icon: 'fa-solid fa-ban',\n badge: this.TaxOrphans.length > 0 ? this.TaxOrphans.length : null,\n badgeVariant: 'error' },\n { key: 'treemap', label: 'Treemap', icon: 'fa-solid fa-chart-tree-map' },\n { key: 'audit', label: 'Audit Log', icon: 'fa-solid fa-scroll' }\n ];\n }\n\n /** Adapter for `<mj-tab-nav>`'s string-typed `(TabChange)` output. */\n public onTaxSubTabChange(key: string): void {\n if (key === 'tree' || key === 'duplicates' || key === 'orphans' || key === 'treemap' || key === 'audit') {\n this.SwitchTaxSubTab(key);\n }\n }\n\n public SwitchTaxSubTab(sub: TaxonomySubTab): void {\n this.TaxSubTab = sub;\n this.cdr.detectChanges();\n }\n\n /**\n * Loads all data needed by the Taxonomy Governance sub-tabs:\n * Tags, Tagged Items, Tag Audit Logs, and cross-references content item tags.\n */\n private async loadTaxonomyData(): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const [tagsResult, taggedItemsResult, auditResult] = await rv.RunViews([\n { EntityName: 'MJ: Tags', OrderBy: 'Name', ResultType: 'simple' },\n { EntityName: 'MJ: Tagged Items', ResultType: 'simple' },\n { EntityName: 'MJ: Tag Audit Logs', OrderBy: '__mj_CreatedAt DESC', MaxRows: 200, ResultType: 'simple' }\n ]);\n\n this.tagsRaw = tagsResult.Success ? tagsResult.Results : [];\n this.taggedItemsRaw = taggedItemsResult.Success ? taggedItemsResult.Results : [];\n this.tagAuditLogsRaw = auditResult.Success ? auditResult.Results : [];\n\n // Load per-tag aggregates (weights + counts) via server-side SQL\n await this.loadTagAggregates();\n\n this.buildTaxTree();\n this.buildTaxDuplicates();\n this.buildTaxOrphans();\n this.buildTaxTreemap();\n this.buildTaxAuditLog();\n this.buildTaxHealth();\n this.cdr.detectChanges();\n } catch (error) {\n console.error('[Autotagging] Error loading taxonomy data:', error);\n }\n }\n\n // ── Tree View ──\n\n /**\n * Builds the taxonomy tree from raw tag data, wiring up parent-child\n * relationships and attaching item counts and average weights.\n */\n private buildTaxTree(): void {\n const tagMap = new Map<string, TaxTreeNode>();\n const tagItemCounts = this.tagAggregateCounts;\n const tagAvgWeights = this.tagAggregateWeights;\n\n // Create flat node list from raw tags (exclude merged/soft-deleted tags)\n const activeTags = this.tagsRaw.filter(t => (t['Status'] as string)?.toLowerCase() !== 'merged');\n for (const tag of activeTags) {\n const id = tag['ID'] as string;\n const normalizedId = NormalizeUUID(id);\n const name = (tag['Name'] as string) ?? 'Unnamed';\n const itemCount = tagItemCounts.get(normalizedId) ?? 0;\n const avgWeight = tagAvgWeights.get(normalizedId) ?? 0;\n\n tagMap.set(normalizedId, {\n ID: id,\n Name: name,\n DisplayName: (tag['DisplayName'] as string) ?? name,\n Description: (tag['Description'] as string) ?? '',\n ParentID: (tag['ParentID'] as string) ?? null,\n Depth: 0,\n Children: [],\n ItemCount: itemCount,\n AvgWeight: avgWeight,\n HealthColor: this.computeTagHealth(itemCount, avgWeight),\n IsExpanded: false,\n IsSelected: false,\n FirstSeen: formatShortDate((tag['__mj_CreatedAt'] as string) ?? '')\n });\n }\n\n // Build parent-child relationships\n const roots: TaxTreeNode[] = [];\n for (const node of tagMap.values()) {\n const normalizedParent = node.ParentID ? NormalizeUUID(node.ParentID) : null;\n if (normalizedParent && tagMap.has(normalizedParent)) {\n tagMap.get(normalizedParent)!.Children.push(node);\n } else {\n roots.push(node);\n }\n }\n\n // Compute depths and aggregate child counts\n this.computeTreeDepths(roots, 0);\n this.propagateItemCounts(roots);\n\n // Sort children alphabetically\n this.sortTreeNodes(roots);\n\n // Expand top two levels by default\n for (const root of roots) {\n root.IsExpanded = true;\n for (const child of root.Children) {\n child.IsExpanded = true;\n }\n }\n\n this.TaxTreeNodes = roots;\n this.TaxFlatNodes = this.flattenTree(roots);\n this.TaxFilteredNodes = this.TaxFlatNodes;\n\n // Select first node if available\n if (this.TaxFlatNodes.length > 0) {\n this.SelectTaxNode(this.TaxFlatNodes[0]);\n }\n }\n\n private computeTreeDepths(nodes: TaxTreeNode[], depth: number): void {\n for (const node of nodes) {\n node.Depth = depth;\n this.computeTreeDepths(node.Children, depth + 1);\n }\n }\n\n private propagateItemCounts(nodes: TaxTreeNode[]): number {\n let total = 0;\n for (const node of nodes) {\n const childCount = this.propagateItemCounts(node.Children);\n node.ItemCount = node.ItemCount + childCount;\n total += node.ItemCount;\n }\n return total;\n }\n\n private sortTreeNodes(nodes: TaxTreeNode[]): void {\n nodes.sort((a, b) => a.Name.localeCompare(b.Name));\n for (const node of nodes) {\n this.sortTreeNodes(node.Children);\n }\n }\n\n private flattenTree(nodes: TaxTreeNode[]): TaxTreeNode[] {\n const result: TaxTreeNode[] = [];\n for (const node of nodes) {\n result.push(node);\n if (node.IsExpanded && node.Children.length > 0) {\n result.push(...this.flattenTree(node.Children));\n }\n }\n return result;\n }\n\n private computeTagHealth(itemCount: number, avgWeight: number): 'green' | 'yellow' | 'red' {\n if (itemCount === 0) return 'red';\n if (itemCount <= 2 || avgWeight < 0.3) return 'yellow';\n return 'green';\n }\n\n /**\n * Counts the number of items referencing each tag, combining both\n * Tagged Items and Content Item Tags. Uses NormalizeUUID for\n * cross-platform UUID case consistency.\n */\n private countItemsByTag(): Map<string, number> {\n const counts = new Map<string, number>();\n for (const ti of this.taggedItemsRaw) {\n const tagId = ti['TagID'] as string;\n if (tagId) {\n const key = NormalizeUUID(tagId);\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n }\n // Also count from content item tags that reference TagID\n for (const cit of this._contentTags) {\n const tagId = cit['TagID'] as string;\n if (tagId) {\n const key = NormalizeUUID(tagId);\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n }\n return counts;\n }\n\n /**\n * Loads per-tag average weights and item counts via the \"Tag Aggregates\" saved query.\n * This runs a SQL GROUP BY on the server, avoiding loading 17K+ TaggedItem rows to the browser.\n */\n private async loadTagAggregates(): Promise<void> {\n this.tagAggregateWeights.clear();\n this.tagAggregateCounts.clear();\n try {\n const rq = new RunQuery();\n const result = await rq.RunQuery({\n QueryName: 'Tag Aggregates',\n CategoryPath: '/MJ/Tags'\n });\n if (result.Success) {\n for (const row of result.Results) {\n const tagId = row['TagID'] as string;\n if (tagId) {\n const key = NormalizeUUID(tagId);\n this.tagAggregateWeights.set(key, Number(row['AvgWeight'] ?? 0));\n this.tagAggregateCounts.set(key, Number(row['ItemCount'] ?? 0));\n }\n }\n }\n } catch (error) {\n console.error('[Autotagging] Error loading tag aggregates:', error);\n }\n }\n\n public ToggleTaxNode(node: TaxTreeNode): void {\n if (node.Children.length > 0) {\n node.IsExpanded = !node.IsExpanded;\n this.TaxFlatNodes = this.flattenTree(this.TaxTreeNodes);\n this.applyTaxTreeFilter();\n this.cdr.detectChanges();\n }\n }\n\n public SelectTaxNode(node: TaxTreeNode): void {\n // Deselect previous\n for (const n of this.TaxFlatNodes) {\n n.IsSelected = false;\n }\n node.IsSelected = true;\n this.TaxSelectedNode = node;\n this.TaxIsEditing = false;\n this.resetEditorPanels();\n this.loadRecentItemsForTag(node);\n // Lazy-load the data for whichever sub-tab is currently active.\n void this.ensureEditorSubTabLoaded();\n this.cdr.detectChanges();\n }\n\n /**\n * Clears the lazily-loaded governance/synonyms/scope panel state so a newly\n * selected node starts fresh. Data is re-fetched on demand when its sub-tab opens.\n */\n private resetEditorPanels(): void {\n this.GovernanceTag = null;\n this.Synonyms = [];\n this.Scopes = [];\n this.NewSynonymText = '';\n this.NewScopeEntityID = null;\n this.NewScopeRecordID = '';\n }\n\n public FilterTaxTree(): void {\n this.applyTaxTreeFilter();\n this.cdr.detectChanges();\n }\n\n private applyTaxTreeFilter(): void {\n const q = this.TaxTreeSearch.toLowerCase().trim();\n if (!q) {\n this.TaxFilteredNodes = this.TaxFlatNodes;\n } else {\n this.TaxFilteredNodes = this.TaxFlatNodes.filter(n =>\n n.Name.toLowerCase().includes(q) || n.DisplayName.toLowerCase().includes(q)\n );\n }\n }\n\n public GetTaxBreadcrumb(node: TaxTreeNode): { ID: string; Name: string }[] {\n const breadcrumb: { ID: string; Name: string }[] = [];\n const tagMap = new Map<string, Record<string, unknown>>();\n for (const t of this.tagsRaw) {\n tagMap.set(t['ID'] as string, t);\n }\n\n let currentID: string | null = node.ParentID;\n while (currentID) {\n const parent = tagMap.get(currentID);\n if (!parent) break;\n breadcrumb.unshift({ ID: currentID, Name: (parent['Name'] as string) ?? '' });\n currentID = (parent['ParentID'] as string) ?? null;\n }\n return breadcrumb;\n }\n\n public NavigateToBreadcrumb(tagId: string): void {\n const node = this.TaxFlatNodes.find(n => UUIDsEqual(n.ID, tagId));\n if (node) {\n this.SelectTaxNode(node);\n }\n }\n\n private loadRecentItemsForTag(node: TaxTreeNode): void {\n // Find content item tags that reference this tag's ID.\n // Use the 'Item' view field (ContentItem name) directly from the tag record\n // instead of looking up from the capped contentItemsRaw array.\n const matchingTags = this._contentTags.filter(cit =>\n UUIDsEqual(cit['TagID'] as string, node.ID)\n ).slice(0, 5);\n\n this.TaxRecentItems = matchingTags.map(cit => ({\n Name: (cit['Item'] as string) ?? 'Unnamed Item',\n Weight: Number(cit['Weight'] ?? 0.5),\n Date: formatShortDate((cit['__mj_CreatedAt'] as string) ?? ''),\n Icon: 'fa-solid fa-file-lines'\n }));\n }\n\n // ── Selected-Node Editor Sub-Tabs ──\n\n /**\n * Switches the selected-node editor sub-tab and lazy-loads the data for\n * the newly opened sub-tab if it hasn't been fetched yet for this node.\n */\n public SwitchTagEditorSubTab(sub: 'overview' | 'governance' | 'synonyms' | 'scope'): void {\n this.TagEditorSubTab = sub;\n void this.ensureEditorSubTabLoaded();\n this.cdr.detectChanges();\n }\n\n /** Loads the data backing the currently active editor sub-tab on demand. */\n private async ensureEditorSubTabLoaded(): Promise<void> {\n if (!this.TaxSelectedNode) return;\n switch (this.TagEditorSubTab) {\n case 'governance':\n if (!this.GovernanceTag) await this.loadGovernanceTag();\n break;\n case 'synonyms':\n await this.loadSynonyms();\n break;\n case 'scope':\n if (!this.GovernanceTag) await this.loadGovernanceTag();\n await this.loadScopes();\n break;\n default:\n break;\n }\n }\n\n // ── Governance Panel ──\n\n /** Lazy-loads the strongly-typed MJ: Tags entity for the selected node. */\n private async loadGovernanceTag(): Promise<void> {\n if (!this.TaxSelectedNode) return;\n this.GovernanceLoading = true;\n this.cdr.detectChanges();\n try {\n const p = this.ProviderToUse;\n const tag = await p.GetEntityObject<MJTagEntity>('MJ: Tags', p.CurrentUser);\n const loaded = await tag.Load(this.TaxSelectedNode.ID);\n if (loaded) {\n this.GovernanceTag = tag;\n this.syncGovernanceFromEntity(tag);\n } else {\n this.GovernanceTag = null;\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error loading governance: ${msg}`, 'error', 4000);\n }\n this.GovernanceLoading = false;\n this.cdr.detectChanges();\n }\n\n /** Copies governance flags from the entity into the editable view fields. */\n private syncGovernanceFromEntity(tag: MJTagEntity): void {\n this.GovIsFrozen = tag.IsFrozen;\n this.GovAllowAutoGrow = tag.AllowAutoGrow;\n this.GovRequiresReview = tag.RequiresReview;\n this.GovMaxChildren = tag.MaxChildren;\n this.GovMaxDescendantDepth = tag.MaxDescendantDepth;\n this.GovMinWeight = tag.MinWeight;\n }\n\n /** A one-line subtree-impact hint derived from the selected tree node. */\n public get GovernanceImpactHint(): string {\n const node = this.TaxSelectedNode;\n if (!node) return '';\n const children = node.Children.length;\n const items = node.ItemCount;\n return `Affects ${children} direct child${children === 1 ? '' : 'ren'} and ${items} tagged item${items === 1 ? '' : 's'} in this subtree.`;\n }\n\n /** Resets the governance editor fields back to the loaded entity values. */\n public ResetGovernance(): void {\n if (this.GovernanceTag) {\n this.syncGovernanceFromEntity(this.GovernanceTag);\n this.cdr.detectChanges();\n }\n }\n\n /** Persists the edited governance flags to the MJ: Tags entity. */\n public async SaveGovernance(): Promise<void> {\n const tag = this.GovernanceTag;\n if (!tag) return;\n this.GovernanceSaving = true;\n this.cdr.detectChanges();\n try {\n tag.IsFrozen = this.GovIsFrozen;\n tag.AllowAutoGrow = this.GovAllowAutoGrow;\n tag.RequiresReview = this.GovRequiresReview;\n tag.MaxChildren = this.GovMaxChildren;\n tag.MaxDescendantDepth = this.GovMaxDescendantDepth;\n tag.MinWeight = this.GovMinWeight;\n const saved = await tag.Save();\n if (saved) {\n this.syncGovernanceFromEntity(tag);\n MJNotificationService.Instance.CreateSimpleNotification('Governance saved', 'success', 2500);\n this.DataChanged.emit();\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to save governance: ${tag.LatestResult?.CompleteMessage ?? 'unknown error'}`, 'error', 4000\n );\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n this.GovernanceSaving = false;\n this.cdr.detectChanges();\n }\n\n // ── Synonyms Panel ──\n\n /** Lazy-loads MJ: Tag Synonyms rows for the selected tag. */\n private async loadSynonyms(): Promise<void> {\n if (!this.TaxSelectedNode) return;\n this.SynonymsLoading = true;\n this.cdr.detectChanges();\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJTagSynonymEntity>({\n EntityName: 'MJ: Tag Synonyms',\n ExtraFilter: `TagID='${this.TaxSelectedNode.ID}'`,\n OrderBy: 'Synonym',\n ResultType: 'entity_object'\n });\n this.Synonyms = result.Success ? result.Results : [];\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error loading synonyms: ${msg}`, 'error', 4000);\n this.Synonyms = [];\n }\n this.SynonymsLoading = false;\n this.cdr.detectChanges();\n }\n\n /** Returns a colored-pill CSS class for a synonym Source. */\n public GetSynonymSourceClass(source: string): string {\n switch (source) {\n case 'Manual': return 'at-syn-pill-manual';\n case 'LLM': return 'at-syn-pill-llm';\n case 'Imported': return 'at-syn-pill-imported';\n case 'Merged': return 'at-syn-pill-merged';\n default: return 'at-syn-pill-manual';\n }\n }\n\n /** Creates a new Manual synonym for the selected tag. */\n public async AddSynonym(): Promise<void> {\n const text = this.NewSynonymText.trim();\n if (!text || !this.TaxSelectedNode) return;\n this.SynonymSaving = true;\n this.cdr.detectChanges();\n try {\n const p = this.ProviderToUse;\n const syn = await p.GetEntityObject<MJTagSynonymEntity>('MJ: Tag Synonyms', p.CurrentUser);\n syn.NewRecord();\n syn.TagID = this.TaxSelectedNode.ID;\n syn.Synonym = text;\n syn.Source = 'Manual';\n // Manually-added synonyms are trusted and resolve immediately.\n // Machine-proposed synonyms (Source = LLM/Imported) arrive as 'Pending'\n // and only resolve once approved via ApproveSynonym() below.\n syn.Status = 'Active';\n const saved = await syn.Save();\n if (saved) {\n this.NewSynonymText = '';\n MJNotificationService.Instance.CreateSimpleNotification('Synonym added', 'success', 2500);\n await this.loadSynonyms();\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to add synonym: ${syn.LatestResult?.CompleteMessage ?? 'unknown error'}`, 'error', 4000\n );\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n this.SynonymSaving = false;\n this.cdr.detectChanges();\n }\n\n /** Deletes a synonym row. */\n public async DeleteSynonym(syn: MJTagSynonymEntity): Promise<void> {\n this.SynonymSaving = true;\n this.cdr.detectChanges();\n try {\n const deleted = await syn.Delete();\n if (deleted) {\n this.Synonyms = this.Synonyms.filter(s => !UUIDsEqual(s.ID, syn.ID));\n MJNotificationService.Instance.CreateSimpleNotification('Synonym removed', 'success', 2500);\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to remove synonym: ${syn.LatestResult?.CompleteMessage ?? 'unknown error'}`, 'error', 4000\n );\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n this.SynonymSaving = false;\n this.cdr.detectChanges();\n }\n\n /** Count of synonyms awaiting review (Source = LLM/Imported, Status = Pending). */\n public get PendingSynonymCount(): number {\n return this.Synonyms.filter(s => s.Status === 'Pending').length;\n }\n\n /** Approves a pending (machine-proposed) synonym so it begins resolving to its tag. */\n public async ApproveSynonym(syn: MJTagSynonymEntity): Promise<void> {\n await this.setSynonymStatus(syn, 'Active', 'Synonym approved');\n }\n\n /** Rejects a pending synonym; retained for audit and to suppress re-proposal. */\n public async RejectSynonym(syn: MJTagSynonymEntity): Promise<void> {\n await this.setSynonymStatus(syn, 'Rejected', 'Synonym rejected');\n }\n\n /** Shared transition for approve/reject of a synonym's Status. */\n private async setSynonymStatus(syn: MJTagSynonymEntity, status: 'Active' | 'Rejected', successMsg: string): Promise<void> {\n this.SynonymSaving = true;\n this.cdr.detectChanges();\n try {\n syn.Status = status;\n const saved = await syn.Save();\n if (saved) {\n MJNotificationService.Instance.CreateSimpleNotification(successMsg, 'success', 2500);\n await this.loadSynonyms();\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to update synonym: ${syn.LatestResult?.CompleteMessage ?? 'unknown error'}`, 'error', 4000\n );\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n this.SynonymSaving = false;\n this.cdr.detectChanges();\n }\n\n // ── Scope Panel ──\n\n /** Entity options for the \"Add scope\" combobox, sorted by name. */\n public get ScopeEntityOptions(): { ID: string; Name: string }[] {\n return this.ProviderToUse.Entities\n .map(e => ({ ID: e.ID, Name: e.Name }))\n .sort((a, b) => a.Name.localeCompare(b.Name));\n }\n\n /** Whether the selected tag is global (read from the governance entity). */\n public get IsTagGlobal(): boolean {\n return this.GovernanceTag?.IsGlobal ?? false;\n }\n\n /** Lazy-loads MJ: Tag Scopes rows for the selected tag. */\n private async loadScopes(): Promise<void> {\n if (!this.TaxSelectedNode) return;\n this.ScopesLoading = true;\n this.cdr.detectChanges();\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJTagScopeEntity>({\n EntityName: 'MJ: Tag Scopes',\n ExtraFilter: `TagID='${this.TaxSelectedNode.ID}'`,\n OrderBy: 'ScopeEntity',\n ResultType: 'entity_object'\n });\n this.Scopes = result.Success ? result.Results : [];\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error loading scopes: ${msg}`, 'error', 4000);\n this.Scopes = [];\n }\n this.ScopesLoading = false;\n this.cdr.detectChanges();\n }\n\n /** Adapter for the entity combobox's string-typed value output. */\n public OnScopeEntitySelected(value: unknown): void {\n this.NewScopeEntityID = value != null ? String(value) : null;\n }\n\n /** Toggles the tag's IsGlobal flag and persists it. */\n public async ToggleTagGlobal(value: boolean): Promise<void> {\n if (!this.GovernanceTag) return;\n this.ScopeSaving = true;\n this.cdr.detectChanges();\n try {\n this.GovernanceTag.IsGlobal = value;\n const saved = await this.GovernanceTag.Save();\n if (saved) {\n MJNotificationService.Instance.CreateSimpleNotification(\n value ? 'Tag is now global' : 'Tag is now scoped', 'success', 2500\n );\n this.DataChanged.emit();\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to update scope: ${this.GovernanceTag.LatestResult?.CompleteMessage ?? 'unknown error'}`, 'error', 4000\n );\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n this.ScopeSaving = false;\n this.cdr.detectChanges();\n }\n\n /** Creates a new MJ: Tag Scopes row for the selected tag. */\n public async AddScope(): Promise<void> {\n const entityId = this.NewScopeEntityID;\n const recordId = this.NewScopeRecordID.trim();\n if (!entityId || !recordId || !this.TaxSelectedNode) return;\n this.ScopeSaving = true;\n this.cdr.detectChanges();\n try {\n const p = this.ProviderToUse;\n const scope = await p.GetEntityObject<MJTagScopeEntity>('MJ: Tag Scopes', p.CurrentUser);\n scope.NewRecord();\n scope.TagID = this.TaxSelectedNode.ID;\n scope.ScopeEntityID = entityId;\n scope.ScopeRecordID = recordId;\n const saved = await scope.Save();\n if (saved) {\n this.NewScopeEntityID = null;\n this.NewScopeRecordID = '';\n MJNotificationService.Instance.CreateSimpleNotification('Scope added', 'success', 2500);\n await this.loadScopes();\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to add scope: ${scope.LatestResult?.CompleteMessage ?? 'unknown error'}`, 'error', 4000\n );\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n this.ScopeSaving = false;\n this.cdr.detectChanges();\n }\n\n /** Deletes a scope row. */\n public async DeleteScope(scope: MJTagScopeEntity): Promise<void> {\n this.ScopeSaving = true;\n this.cdr.detectChanges();\n try {\n const deleted = await scope.Delete();\n if (deleted) {\n this.Scopes = this.Scopes.filter(s => !UUIDsEqual(s.ID, scope.ID));\n MJNotificationService.Instance.CreateSimpleNotification('Scope removed', 'success', 2500);\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to remove scope: ${scope.LatestResult?.CompleteMessage ?? 'unknown error'}`, 'error', 4000\n );\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n this.ScopeSaving = false;\n this.cdr.detectChanges();\n }\n\n // ── Tag Operations ──\n\n public StartEditTag(): void {\n if (!this.TaxSelectedNode) return;\n this.TaxIsEditing = true;\n this.TaxEditName = this.TaxSelectedNode.Name;\n this.TaxEditDescription = this.TaxSelectedNode.Description;\n this.cdr.detectChanges();\n }\n\n public CancelEditTag(): void {\n this.TaxIsEditing = false;\n this.cdr.detectChanges();\n }\n\n public async SaveEditTag(): Promise<void> {\n if (!this.TaxSelectedNode) return;\n try {\n const md = this.ProviderToUse;\n const tag = await md.GetEntityObject<MJTagEntity>('MJ: Tags', md.CurrentUser);\n await tag.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: this.TaxSelectedNode.ID }]));\n tag.Name = this.TaxEditName;\n tag.Description = this.TaxEditDescription;\n const saved = await tag.Save();\n if (saved) {\n this.TaxSelectedNode.Name = this.TaxEditName;\n this.TaxSelectedNode.DisplayName = this.TaxEditName;\n this.TaxSelectedNode.Description = this.TaxEditDescription;\n this.TaxIsEditing = false;\n this.addTaxAuditEntry('renamed', this.TaxEditName);\n MJNotificationService.Instance.CreateSimpleNotification('Tag updated', 'success', 2500);\n } else {\n MJNotificationService.Instance.CreateSimpleNotification('Failed to update tag', 'error', 3000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n this.cdr.detectChanges();\n }\n\n public async MoveTag(node: TaxTreeNode, newParentId: string | null): Promise<void> {\n try {\n const md = this.ProviderToUse;\n const tag = await md.GetEntityObject<MJTagEntity>('MJ: Tags', md.CurrentUser);\n await tag.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: node.ID }]));\n tag.ParentID = newParentId;\n const saved = await tag.Save();\n if (saved) {\n this.addTaxAuditEntry('moved', node.Name);\n MJNotificationService.Instance.CreateSimpleNotification('Tag moved', 'success', 2500);\n await this.RefreshTaxonomyData();\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n }\n\n public DeleteTag(node: TaxTreeNode): void {\n this.OpenConfirmDialog(\n 'Delete Tag',\n `Delete tag \"${node.Name}\"? This will also remove all tagged item associations.`,\n async () => {\n try {\n const md = this.ProviderToUse;\n const tag = await md.GetEntityObject<MJTagEntity>('MJ: Tags', md.CurrentUser);\n await tag.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: node.ID }]));\n const deleted = await tag.Delete();\n if (deleted) {\n this.addTaxAuditEntry('deleted', node.Name);\n MJNotificationService.Instance.CreateSimpleNotification('Tag deleted', 'success', 2500);\n await this.RefreshTaxonomyData();\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n }\n );\n }\n\n // ── Create Tag ──\n\n /** Open create tag dialog for a root-level tag */\n public OpenCreateRootTag(): void {\n this.CreateTagParentID = null;\n this.CreateTagParentLabel = 'Root level';\n this.CreateTagName = '';\n this.CreateTagDescription = '';\n this.ShowCreateTagDialog = true;\n this.cdr.detectChanges();\n }\n\n /** Open create tag dialog as child of the selected node */\n public OpenCreateChildTag(): void {\n if (!this.TaxSelectedNode) return;\n this.OpenCreateChildTagFor(this.TaxSelectedNode);\n }\n\n /** Open create tag dialog as child of a specific node */\n public OpenCreateChildTagFor(node: TaxTreeNode): void {\n this.CreateTagParentID = node.ID;\n this.CreateTagParentLabel = `under \"${node.Name}\"`;\n this.CreateTagName = '';\n this.CreateTagDescription = '';\n this.ShowCreateTagDialog = true;\n this.cdr.detectChanges();\n }\n\n /** Close create tag dialog */\n public CloseCreateTagDialog(): void {\n this.ShowCreateTagDialog = false;\n this.cdr.detectChanges();\n }\n\n /** Save the new tag */\n public async SaveNewTag(): Promise<void> {\n const name = this.CreateTagName.trim();\n if (!name) return;\n\n try {\n const md = this.ProviderToUse;\n const tag = await md.GetEntityObject<MJTagEntity>('MJ: Tags', md.CurrentUser);\n tag.NewRecord();\n tag.Name = name;\n tag.DisplayName = name;\n tag.Description = this.CreateTagDescription.trim() || null;\n tag.ParentID = this.CreateTagParentID;\n const saved = await tag.Save();\n if (saved) {\n this.addTaxAuditEntry('created', name);\n MJNotificationService.Instance.CreateSimpleNotification(`Tag \"${name}\" created`, 'success', 2500);\n this.ShowCreateTagDialog = false;\n await this.RefreshTaxonomyData();\n } else {\n MJNotificationService.Instance.CreateSimpleNotification('Failed to save tag', 'error', 4000);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n }\n\n // ── Multi-Select & Drag Reparent ──\n\n /** Toggle multi-select mode on/off */\n public ToggleMultiSelectMode(): void {\n this.TaxMultiSelectMode = !this.TaxMultiSelectMode;\n if (!this.TaxMultiSelectMode) {\n this.TaxSelectedIDs.clear();\n }\n this.cdr.detectChanges();\n }\n\n /** Toggle a node's selection in multi-select mode */\n public ToggleNodeSelection(node: TaxTreeNode, event: Event): void {\n event.stopPropagation();\n if (this.TaxSelectedIDs.has(node.ID)) {\n this.TaxSelectedIDs.delete(node.ID);\n } else {\n this.TaxSelectedIDs.add(node.ID);\n }\n this.cdr.detectChanges();\n }\n\n /** Check if a node is selected in multi-select mode */\n public IsNodeMultiSelected(nodeID: string): boolean {\n return this.TaxSelectedIDs.has(nodeID);\n }\n\n /** Handle drag start on a tree node */\n public OnTreeNodeDragStart(event: DragEvent, node: TaxTreeNode): void {\n if (!event.dataTransfer) return;\n // If dragging a multi-selected node, drag all selected; otherwise just this one\n const dragIDs = this.TaxMultiSelectMode && this.TaxSelectedIDs.has(node.ID)\n ? [...this.TaxSelectedIDs]\n : [node.ID];\n event.dataTransfer.setData('text/plain', JSON.stringify(dragIDs));\n event.dataTransfer.effectAllowed = 'move';\n }\n\n /** Handle drag over a tree node (drop target) */\n public OnTreeNodeDragOver(event: DragEvent, node: TaxTreeNode): void {\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'move';\n this.TaxDragOverNodeID = node.ID;\n }\n\n /** Handle drag leave */\n public OnTreeNodeDragLeave(): void {\n this.TaxDragOverNodeID = null;\n }\n\n /** Handle drop — reparent dragged node(s) under the drop target */\n public async OnTreeNodeDrop(event: DragEvent, targetNode: TaxTreeNode): Promise<void> {\n event.preventDefault();\n this.TaxDragOverNodeID = null;\n\n const data = event.dataTransfer?.getData('text/plain');\n if (!data) return;\n\n let dragIDs: string[];\n try { dragIDs = JSON.parse(data); } catch { return; }\n\n // Prevent dropping onto itself or a descendant\n const targetDescendants = this.collectDescendantIds(targetNode);\n const validIDs = dragIDs.filter(id =>\n !UUIDsEqual(id, targetNode.ID) && !targetDescendants.has(NormalizeUUID(id))\n );\n\n if (validIDs.length === 0) return;\n\n this.TaxTreeSaving = true;\n this.cdr.detectChanges();\n\n const md = this.ProviderToUse;\n let movedCount = 0;\n for (const tagID of validIDs) {\n try {\n const tag = await md.GetEntityObject<MJTagEntity>('MJ: Tags', md.CurrentUser);\n await tag.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: tagID }]));\n tag.ParentID = targetNode.ID;\n const saved = await tag.Save();\n if (saved) movedCount++;\n } catch {\n // continue with remaining\n }\n }\n\n if (movedCount > 0) {\n const label = movedCount === 1 ? '1 tag' : `${movedCount} tags`;\n MJNotificationService.Instance.CreateSimpleNotification(`Moved ${label} under \"${targetNode.Name}\"`, 'success', 2500);\n this.addTaxAuditEntry('moved', `${movedCount} tag(s) → ${targetNode.Name}`);\n this.TaxSelectedIDs.clear();\n await this.RefreshTaxonomyData();\n }\n\n this.TaxTreeSaving = false;\n this.cdr.detectChanges();\n }\n\n /** Handle drop on the \"Root\" drop zone (make root-level) */\n public async OnDropToRoot(event: DragEvent): Promise<void> {\n event.preventDefault();\n this.TaxDragOverNodeID = null;\n\n const data = event.dataTransfer?.getData('text/plain');\n if (!data) return;\n\n let dragIDs: string[];\n try { dragIDs = JSON.parse(data); } catch { return; }\n\n this.TaxTreeSaving = true;\n this.cdr.detectChanges();\n\n const md = this.ProviderToUse;\n let movedCount = 0;\n for (const tagID of dragIDs) {\n try {\n const tag = await md.GetEntityObject<MJTagEntity>('MJ: Tags', md.CurrentUser);\n await tag.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: tagID }]));\n if (tag.ParentID != null) {\n tag.ParentID = null;\n const saved = await tag.Save();\n if (saved) movedCount++;\n }\n } catch {\n // continue\n }\n }\n\n if (movedCount > 0) {\n MJNotificationService.Instance.CreateSimpleNotification(`Moved ${movedCount} tag(s) to root`, 'success', 2500);\n this.addTaxAuditEntry('moved', `${movedCount} tag(s) → root`);\n this.TaxSelectedIDs.clear();\n await this.RefreshTaxonomyData();\n }\n\n this.TaxTreeSaving = false;\n this.cdr.detectChanges();\n }\n\n public async MergeTags(sourceTagId: string, targetTagId: string, sourceName: string, targetName: string): Promise<void> {\n if (this.IsMerging) return; // Prevent duplicate calls from button spam\n this.IsMerging = true;\n this.cdr.detectChanges();\n\n try {\n // Re-parent tagged items from source to target\n const itemsToMove = this.taggedItemsRaw.filter(ti => (ti['TagID'] as string) === sourceTagId);\n const md = this.ProviderToUse;\n for (const ti of itemsToMove) {\n const taggedItem = await md.GetEntityObject<MJTaggedItemEntity>('MJ: Tagged Items', md.CurrentUser);\n await taggedItem.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: ti['ID'] as string }]));\n taggedItem.TagID = targetTagId;\n if (!await taggedItem.Save()) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Merge failed: ${taggedItem.LatestResult?.CompleteMessage ?? 'unknown error'}`, 'error', 4000\n );\n return;\n }\n }\n\n // Re-parent children of source under target\n const childTags = this.tagsRaw.filter(t => (t['ParentID'] as string) === sourceTagId);\n for (const child of childTags) {\n const childTag = await md.GetEntityObject<MJTagEntity>('MJ: Tags', md.CurrentUser);\n await childTag.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: child['ID'] as string }]));\n childTag.ParentID = targetTagId;\n if (!await childTag.Save()) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Merge failed: ${childTag.LatestResult?.CompleteMessage ?? 'unknown error'}`, 'error', 4000\n );\n return;\n }\n }\n\n // Clean up co-occurrence records before delete (FK constraint)\n await this.cleanupTagReferences(sourceTagId);\n\n // Delete source tag (original behavior — hard delete)\n const sourceEntity = await md.GetEntityObject<MJTagEntity>('MJ: Tags', md.CurrentUser);\n await sourceEntity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: sourceTagId }]));\n if (!await sourceEntity.Delete()) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Merge failed: ${sourceEntity.LatestResult?.CompleteMessage ?? 'unknown error'}`, 'error', 4000\n );\n return;\n }\n\n this.addTaxAuditEntry('merged', `${sourceName} into ${targetName}`);\n MJNotificationService.Instance.CreateSimpleNotification(`Merged \"${sourceName}\" into \"${targetName}\"`, 'success', 3000);\n await this.RefreshTaxonomyData();\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Merge error: ${msg}`, 'error', 4000);\n } finally {\n this.IsMerging = false;\n this.cdr.detectChanges();\n }\n }\n\n public async MakeChildTag(childTagId: string, parentTagId: string): Promise<void> {\n try {\n const md = this.ProviderToUse;\n const tag = await md.GetEntityObject<MJTagEntity>('MJ: Tags', md.CurrentUser);\n await tag.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: childTagId }]));\n tag.ParentID = parentTagId;\n const saved = await tag.Save();\n if (saved) {\n this.addTaxAuditEntry('moved', tag.Name ?? 'tag');\n MJNotificationService.Instance.CreateSimpleNotification('Tag reparented', 'success', 2500);\n await this.RefreshTaxonomyData();\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n }\n\n public DismissDuplicate(pair: TaxDuplicatePair): void {\n this.TaxDuplicates = this.TaxDuplicates.filter(d => d !== pair);\n this.TaxHealth.Duplicates = this.TaxDuplicates.length;\n this.cdr.detectChanges();\n }\n\n // ── Duplicates ──\n\n private buildTaxDuplicates(): void {\n const tags = this.tagsRaw\n .filter(t => (t['Status'] as string)?.toLowerCase() !== 'merged')\n .map(t => ({\n ID: t['ID'] as string,\n Name: (t['Name'] as string) ?? ''\n }));\n\n const pairs: TaxDuplicatePair[] = [];\n\n // 1. Group exact-name duplicates (case-insensitive) into single entries\n const exactGroups = this.groupExactNameDuplicates(tags);\n const consumedIDs = new Set<string>();\n\n for (const [, group] of exactGroups) {\n if (group.length < 2) continue;\n // Emit one consolidated entry per group of exact-name duplicates\n pairs.push({\n TagA: group[0].Name,\n TagB: group[0].Name,\n TagAID: group[0].ID,\n TagBID: group[1].ID,\n Similarity: 100,\n SeverityClass: 'high',\n IsExactDuplicate: true,\n ExactDuplicateCount: group.length,\n AllIDs: group.map(t => t.ID)\n });\n for (const t of group) consumedIDs.add(t.ID);\n }\n\n // 2. Fuzzy/similar pairs — skip any tags already covered by exact-name groups\n for (let i = 0; i < tags.length; i++) {\n if (consumedIDs.has(tags[i].ID)) continue;\n for (let j = i + 1; j < tags.length; j++) {\n if (consumedIDs.has(tags[j].ID)) continue;\n const sim = this.computeStringSimilarity(tags[i].Name, tags[j].Name);\n if (sim >= 0.70) {\n pairs.push({\n TagA: tags[i].Name,\n TagB: tags[j].Name,\n TagAID: tags[i].ID,\n TagBID: tags[j].ID,\n Similarity: Math.round(sim * 100),\n SeverityClass: sim >= 0.85 ? 'high' : 'moderate',\n IsExactDuplicate: false,\n ExactDuplicateCount: 0,\n AllIDs: []\n });\n }\n }\n }\n\n pairs.sort((a, b) => b.Similarity - a.Similarity);\n this.TaxDuplicates = pairs;\n }\n\n /** Group tags by case-insensitive name, returning only groups with 2+ members */\n private groupExactNameDuplicates(tags: { ID: string; Name: string }[]): Map<string, { ID: string; Name: string }[]> {\n const groups = new Map<string, { ID: string; Name: string }[]>();\n for (const tag of tags) {\n const key = tag.Name.toLowerCase().trim();\n const group = groups.get(key);\n if (group) {\n group.push(tag);\n } else {\n groups.set(key, [tag]);\n }\n }\n return groups;\n }\n\n /**\n * Enhanced string similarity: separator normalization, abbreviation,\n * pluralization, token-overlap Jaccard, containment, and Levenshtein.\n * Returns the highest score among all heuristics.\n */\n private computeStringSimilarity(a: string, b: string): number {\n const la = a.toLowerCase().trim();\n const lb = b.toLowerCase().trim();\n if (la === lb) return 1.0;\n\n // Strip separators and compare\n const normA = la.replace(/[\\s\\-_&]+/g, '');\n const normB = lb.replace(/[\\s\\-_&]+/g, '');\n if (normA === normB) return 0.98;\n\n let best = 0;\n\n // Abbreviation\n if (this.isAbbreviationOf(la, lb) || this.isAbbreviationOf(lb, la)) {\n best = Math.max(best, 0.90);\n }\n\n // Pluralization\n best = Math.max(best, this.computePluralizationScore(la, lb));\n\n // Token Jaccard\n best = Math.max(best, this.computeTokenJaccardSimilarity(la, lb));\n\n // Containment\n if (lb.includes(la) || la.includes(lb)) {\n const shorter = la.length < lb.length ? la : lb;\n const longer = la.length < lb.length ? lb : la;\n best = Math.max(best, shorter.length / longer.length);\n }\n\n // Levenshtein\n const dist = this.levenshteinDistance(la, lb);\n const maxLen = Math.max(la.length, lb.length);\n if (maxLen > 0) {\n best = Math.max(best, 1 - dist / maxLen);\n }\n\n return best;\n }\n\n /** Scores simple English pluralization differences */\n private computePluralizationScore(a: string, b: string): number {\n const shorter = a.length <= b.length ? a : b;\n const longer = a.length <= b.length ? b : a;\n if (longer === shorter + 's') return 0.95;\n if (longer === shorter + 'es') return 0.95;\n if (shorter.endsWith('y') && longer === shorter.slice(0, -1) + 'ies') return 0.95;\n return 0;\n }\n\n /** Jaccard similarity on word tokens */\n private computeTokenJaccardSimilarity(a: string, b: string): number {\n const tokensA = new Set(a.split(/[\\s\\-_&]+/).filter(w => w.length > 0));\n const tokensB = new Set(b.split(/[\\s\\-_&]+/).filter(w => w.length > 0));\n if (tokensA.size === 0 || tokensB.size === 0) return 0;\n let intersection = 0;\n for (const token of tokensA) {\n if (tokensB.has(token)) intersection++;\n }\n const union = tokensA.size + tokensB.size - intersection;\n return union > 0 ? intersection / union : 0;\n }\n\n private isAbbreviationOf(short: string, long: string): boolean {\n if (short.length >= long.length) return false;\n if (short.length < 2) return false;\n\n // Check if short is initials of words in long\n const words = long.split(/[\\s\\-_&]+/).filter(w => w.length > 0);\n if (words.length < 2) return false;\n const initials = words.map(w => w[0]).join('');\n return initials === short;\n }\n\n private levenshteinDistance(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n const dp: number[][] = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0) as number[]);\n\n for (let i = 0; i <= m; i++) dp[i][0] = i;\n for (let j = 0; j <= n; j++) dp[0][j] = j;\n\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + cost);\n }\n }\n return dp[m][n];\n }\n\n // ── Orphans ──\n\n /**\n * Finds orphan tags: no parent, no children, and zero usage.\n * A tag with even 1 connection is not orphaned — it's just a leaf.\n * Uses NormalizeUUID for consistent cross-platform UUID comparisons.\n */\n private buildTaxOrphans(): void {\n const tagItemCounts = this.tagAggregateCounts;\n const tagAvgWeights = this.tagAggregateWeights;\n const hasChildren = new Set<string>();\n for (const t of this.tagsRaw) {\n const pid = t['ParentID'] as string;\n if (pid) hasChildren.add(NormalizeUUID(pid));\n }\n\n this.TaxOrphans = this.tagsRaw\n .filter(t => {\n const normalizedId = NormalizeUUID(t['ID'] as string);\n const parentId = t['ParentID'] as string | null;\n const status = (t['Status'] as string)?.toLowerCase();\n const itemCount = tagItemCounts.get(normalizedId) ?? 0;\n // Skip merged tags — they're soft-deleted\n if (status === 'merged') return false;\n // Orphan: no parent, no children, and zero connections\n return !parentId && !hasChildren.has(normalizedId) && itemCount === 0;\n })\n .map(t => {\n const id = t['ID'] as string;\n const normalizedId = NormalizeUUID(id);\n const itemCount = tagItemCounts.get(normalizedId) ?? 0;\n return {\n ID: id,\n Name: (t['Name'] as string) ?? 'Unnamed',\n UsageCount: itemCount,\n AvgWeight: tagAvgWeights.get(normalizedId) ?? 0,\n FirstSeen: formatShortDate((t['__mj_CreatedAt'] as string) ?? ''),\n LastSeen: formatShortDate((t['__mj_UpdatedAt'] as string) ?? ''),\n IsSelected: false\n };\n })\n .sort((a, b) => a.UsageCount - b.UsageCount);\n }\n\n public ToggleOrphanSelection(orphan: TaxOrphanCard): void {\n orphan.IsSelected = !orphan.IsSelected;\n this.TaxAllOrphansSelected = this.TaxOrphans.every(o => o.IsSelected);\n this.cdr.detectChanges();\n }\n\n public ToggleAllOrphans(): void {\n this.TaxAllOrphansSelected = !this.TaxAllOrphansSelected;\n for (const o of this.TaxOrphans) {\n o.IsSelected = this.TaxAllOrphansSelected;\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Clean up TagCoOccurrence records that reference a tag before deleting it.\n * Without this, the FK constraint on TagCoOccurrence blocks the delete.\n */\n private async cleanupTagReferences(tagId: string): Promise<void> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const coOccResult = await rv.RunView<BaseEntity>({\n EntityName: 'MJ: Tag Co Occurrences',\n ExtraFilter: `TagAID='${tagId}' OR TagBID='${tagId}'`,\n ResultType: 'entity_object'\n });\n if (coOccResult.Success) {\n for (const coOcc of coOccResult.Results) {\n await coOcc.Delete();\n }\n }\n }\n\n public DeleteOrphan(orphan: TaxOrphanCard): void {\n this.OpenConfirmDialog(\n 'Delete Orphan Tag',\n `Delete orphan tag \"${orphan.Name}\"?`,\n async () => {\n try {\n await this.cleanupTagReferences(orphan.ID);\n const md = this.ProviderToUse;\n const tag = await md.GetEntityObject<MJTagEntity>('MJ: Tags', md.CurrentUser);\n await tag.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: orphan.ID }]));\n const deleted = await tag.Delete();\n if (deleted) {\n this.addTaxAuditEntry('deleted', orphan.Name);\n MJNotificationService.Instance.CreateSimpleNotification('Orphan tag deleted', 'success', 2500);\n this.TaxOrphans = this.TaxOrphans.filter(o => !UUIDsEqual(o.ID, orphan.ID));\n this.TaxHealth.Orphaned = this.TaxOrphans.length;\n this.cdr.detectChanges();\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 4000);\n }\n }\n );\n }\n\n public BulkDeleteOrphans(): void {\n const selected = this.TaxOrphans.filter(o => o.IsSelected);\n if (selected.length === 0) return;\n\n this.OpenConfirmDialog(\n 'Bulk Delete Orphan Tags',\n `Delete ${selected.length} selected orphan tag${selected.length > 1 ? 's' : ''}? This cannot be undone.`,\n async () => {\n const md = this.ProviderToUse;\n let deletedCount = 0;\n for (const orphan of selected) {\n try {\n await this.cleanupTagReferences(orphan.ID);\n const tag = await md.GetEntityObject<MJTagEntity>('MJ: Tags', md.CurrentUser);\n await tag.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: orphan.ID }]));\n if (await tag.Delete()) {\n deletedCount++;\n this.addTaxAuditEntry('deleted', orphan.Name);\n }\n } catch {\n // continue with remaining\n }\n }\n\n MJNotificationService.Instance.CreateSimpleNotification(`Deleted ${deletedCount} tags`, 'success', 3000);\n this.TaxOrphans = this.TaxOrphans.filter(o => !o.IsSelected);\n this.TaxHealth.Orphaned = this.TaxOrphans.length;\n this.TaxAllOrphansSelected = false;\n this.cdr.detectChanges();\n }\n );\n }\n\n /** Delete all orphan tags at once with a styled confirmation dialog */\n public DeleteAllOrphans(): void {\n if (this.TaxOrphans.length === 0) return;\n this.OpenConfirmDialog(\n 'Delete All Orphaned Tags',\n `Delete all ${this.TaxOrphans.length} orphaned tag${this.TaxOrphans.length > 1 ? 's' : ''}? This cannot be undone.`,\n async () => {\n const md = this.ProviderToUse;\n let deletedCount = 0;\n for (const orphan of this.TaxOrphans) {\n try {\n const tag = await md.GetEntityObject<MJTagEntity>('MJ: Tags', md.CurrentUser);\n await tag.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: orphan.ID }]));\n if (await tag.Delete()) {\n deletedCount++;\n this.addTaxAuditEntry('deleted', orphan.Name);\n }\n } catch {\n // continue with remaining\n }\n }\n\n MJNotificationService.Instance.CreateSimpleNotification(`Deleted ${deletedCount} orphan tags`, 'success', 3000);\n this.TaxOrphans = [];\n this.TaxHealth.Orphaned = 0;\n this.TaxAllOrphansSelected = false;\n this.cdr.detectChanges();\n }\n );\n }\n\n // ── Treemap ──\n\n private buildTaxTreemap(): void {\n // Build treemap cells from root-level tags, sized by item count\n const tagItemCounts = this.countItemsByTag();\n\n // Group tags by root parent\n const rootGroups = new Map<string, { Name: string; TotalItems: number }>();\n for (const node of this.TaxTreeNodes) {\n rootGroups.set(node.ID, { Name: node.Name, TotalItems: node.ItemCount });\n }\n\n const colorFamilies = ['at-tm-blue', 'at-tm-green', 'at-tm-purple', 'at-tm-orange'];\n const cells: TaxTreemapCell[] = [];\n let colorIdx = 0;\n\n // For each root, add children as cells\n for (const root of this.TaxTreeNodes) {\n const family = colorFamilies[colorIdx % colorFamilies.length];\n let shadeIdx = 1;\n\n // Add root children (or the root itself if it has no children)\n const childNodes = root.Children.length > 0 ? root.Children : [root];\n const sortedChildren = [...childNodes].sort((a, b) => b.ItemCount - a.ItemCount);\n\n for (const child of sortedChildren.slice(0, 4)) {\n cells.push({\n ID: child.ID,\n Name: child.Name,\n ItemCount: child.ItemCount,\n ColorClass: `${family}-${shadeIdx}`,\n RowSpan: child.ItemCount > 10 ? 2 : 1\n });\n shadeIdx++;\n }\n colorIdx++;\n }\n\n this.TaxTreemapCells = cells;\n\n // KPIs\n const totalTags = this.tagsRaw.length;\n const maxDepth = this.TaxFlatNodes.length > 0\n ? Math.max(...this.TaxFlatNodes.map(n => n.Depth))\n : 0;\n const avgDepth = this.TaxFlatNodes.length > 0\n ? (this.TaxFlatNodes.reduce((sum, n) => sum + n.Depth, 0) / this.TaxFlatNodes.length).toFixed(1)\n : '0';\n const mostUsed = this.TaxFlatNodes.length > 0\n ? [...this.TaxFlatNodes].sort((a, b) => b.ItemCount - a.ItemCount)[0]?.Name ?? 'None'\n : 'None';\n\n this.TaxTreemapKPIs = [\n { Label: 'Total Tags', Value: String(totalTags) },\n { Label: 'Avg Depth', Value: avgDepth },\n { Label: 'Max Depth', Value: String(maxDepth) },\n { Label: 'Most Used Tag', Value: mostUsed }\n ];\n }\n\n // ── Audit Log ──\n\n /**\n * Builds the audit timeline from the MJ: Tag Audit Logs entity.\n * Falls back to synthesizing \"created\" events from tag creation dates\n * if no real audit log records exist yet.\n */\n private buildTaxAuditLog(): void {\n if (this.tagAuditLogsRaw.length > 0) {\n this.TaxAuditEvents = this.buildAuditEventsFromLogs();\n } else {\n this.TaxAuditEvents = this.synthesizeAuditEventsFromTags();\n }\n }\n\n /**\n * Maps real Tag Audit Log records into TaxAuditEvent objects.\n * Uses the view's denormalized Tag, PerformedByUser, and RelatedTag fields.\n */\n private buildAuditEventsFromLogs(): TaxAuditEvent[] {\n const events: TaxAuditEvent[] = [];\n\n for (const log of this.tagAuditLogsRaw) {\n const action = (log['Action'] as string) ?? '';\n const type = this.mapAuditActionToType(action);\n if (!type) continue;\n\n const tagName = (log['Tag'] as string) ?? 'Unknown';\n const relatedTag = (log['RelatedTag'] as string) ?? '';\n const user = (log['PerformedByUser'] as string) ?? 'System';\n const createdAt = (log['__mj_CreatedAt'] as string) ?? '';\n const details = this.parseAuditDetails(log['Details'] as string | null);\n\n events.push({\n Type: type,\n Description: this.buildAuditDescription(type, tagName, relatedTag, details),\n TagRef: tagName,\n User: user,\n Timestamp: formatDate(createdAt),\n DayHeader: this.formatDayHeader(createdAt)\n });\n }\n\n return events;\n }\n\n /**\n * Synthesizes audit events from tag __mj_CreatedAt dates when no\n * real audit log records exist. Used as a fallback only.\n */\n private synthesizeAuditEventsFromTags(): TaxAuditEvent[] {\n const events: TaxAuditEvent[] = [];\n for (const tag of this.tagsRaw) {\n const name = (tag['Name'] as string) ?? 'Unnamed';\n const createdAt = tag['__mj_CreatedAt'] as string;\n if (createdAt) {\n events.push({\n Type: 'created',\n Description: 'Tag created',\n TagRef: name,\n User: 'System',\n Timestamp: formatDate(createdAt),\n DayHeader: this.formatDayHeader(createdAt)\n });\n }\n }\n events.sort((a, b) => b.Timestamp.localeCompare(a.Timestamp));\n return events.slice(0, 50);\n }\n\n /**\n * Maps a PascalCase DB Action value (e.g. \"Renamed\") to the lowercase\n * TaxAuditAction type used in the UI. Returns null for unrecognized values.\n */\n private mapAuditActionToType(action: string): TaxAuditAction | null {\n const mapped = action.toLowerCase() as TaxAuditAction;\n const validTypes: Set<string> = new Set<string>([\n 'created', 'merged', 'moved', 'deleted', 'renamed',\n 'deprecated', 'descriptionchanged', 'reactivated', 'split'\n ]);\n return validTypes.has(mapped) ? mapped : null;\n }\n\n /**\n * Safely parses the JSON Details column from a Tag Audit Log record.\n * Returns an empty object on parse failure.\n */\n private parseAuditDetails(details: string | null): Record<string, string> {\n if (!details) return {};\n try {\n return JSON.parse(details) as Record<string, string>;\n } catch {\n return {};\n }\n }\n\n /**\n * Builds a human-readable description for an audit event based on the\n * action type and any additional context from the related tag or details JSON.\n */\n private buildAuditDescription(type: TaxAuditAction, tagName: string, relatedTag: string, details: Record<string, string>): string {\n switch (type) {\n case 'created':\n return 'Tag created';\n case 'renamed': {\n const oldName = details['OldName'];\n return oldName ? `Renamed from \"${oldName}\"` : 'Tag renamed';\n }\n case 'moved': {\n return 'Tag moved to new parent';\n }\n case 'merged':\n return relatedTag ? `Merged into \"${relatedTag}\"` : 'Tags merged';\n case 'split':\n return relatedTag ? `Split from \"${relatedTag}\"` : 'Tag split';\n case 'deleted':\n return 'Tag deleted';\n case 'deprecated':\n return 'Tag deprecated';\n case 'reactivated':\n return 'Tag reactivated';\n case 'descriptionchanged':\n return 'Description updated';\n default:\n return `Tag ${type}`;\n }\n }\n\n /**\n * Adds a local-only audit entry to the top of the timeline for\n * immediate UI feedback after a user action (merge, delete, etc.).\n */\n private addTaxAuditEntry(type: TaxAuditAction, tagRef: string): void {\n const now = new Date().toISOString();\n this.TaxAuditEvents.unshift({\n Type: type,\n Description: this.buildAuditDescription(type, tagRef, '', {}),\n TagRef: tagRef,\n User: 'You',\n Timestamp: formatDate(now),\n DayHeader: 'Today'\n });\n }\n\n public ToggleTaxAuditFilter(type: string): void {\n if (this.TaxAuditFilterTypes.has(type)) {\n this.TaxAuditFilterTypes.delete(type);\n } else {\n this.TaxAuditFilterTypes.add(type);\n }\n this.cdr.detectChanges();\n }\n\n public GetFilteredAuditEvents(): TaxAuditEvent[] {\n return this.TaxAuditEvents.filter(e => this.TaxAuditFilterTypes.has(e.Type));\n }\n\n private formatDayHeader(dateStr: string): string {\n try {\n const d = new Date(dateStr);\n const today = new Date();\n const yesterday = new Date(today);\n yesterday.setDate(yesterday.getDate() - 1);\n\n if (d.toDateString() === today.toDateString()) return 'Today';\n if (d.toDateString() === yesterday.toDateString()) return 'Yesterday';\n return d.toLocaleDateString('en-US', { weekday: 'long', month: 'long', day: 'numeric', year: 'numeric' });\n } catch {\n return '';\n }\n }\n\n // ── Health Stats ──\n\n private buildTaxHealth(): void {\n const total = this.tagsRaw.length;\n const orphaned = this.TaxOrphans.length;\n const duplicates = this.TaxDuplicates.length;\n const needAttention = this.TaxFlatNodes.filter(n => n.HealthColor === 'yellow').length;\n const healthy = total - orphaned - needAttention;\n\n this.TaxHealth = { Total: total, Healthy: Math.max(0, healthy), NeedAttention: needAttention, Orphaned: orphaned, Duplicates: duplicates };\n }\n\n /** Returns the Font Awesome icon class for an audit event action type. */\n public GetTaxAuditIcon(type: string): string {\n const map: Record<string, string> = {\n 'created': 'fa-solid fa-plus',\n 'merged': 'fa-solid fa-code-merge',\n 'moved': 'fa-solid fa-arrows-up-down',\n 'deleted': 'fa-solid fa-trash',\n 'renamed': 'fa-solid fa-pen',\n 'deprecated': 'fa-solid fa-ban',\n 'descriptionchanged': 'fa-solid fa-file-pen',\n 'reactivated': 'fa-solid fa-rotate-left',\n 'split': 'fa-solid fa-code-branch'\n };\n return map[type] ?? 'fa-solid fa-circle';\n }\n\n // ── Confirmation Dialog ──\n\n /** Opens a styled confirmation dialog, replacing browser `confirm()`. */\n public OpenConfirmDialog(title: string, message: string, action: () => Promise<void>): void {\n this.ConfirmDialogTitle = title;\n this.ConfirmDialogMessage = message;\n this.confirmDialogAction = action;\n this.ShowConfirmDialog = true;\n this.cdr.detectChanges();\n }\n\n /** User confirmed the dialog action */\n public async ConfirmDialogAccept(): Promise<void> {\n this.ShowConfirmDialog = false;\n if (this.confirmDialogAction) {\n await this.confirmDialogAction();\n }\n this.confirmDialogAction = null;\n this.cdr.detectChanges();\n }\n\n /** User cancelled the confirmation dialog */\n public ConfirmDialogCancel(): void {\n this.ShowConfirmDialog = false;\n this.confirmDialogAction = null;\n this.cdr.detectChanges();\n }\n\n // ── Split Dialog ──\n\n /** Opens the split-tag dialog for a given tree node */\n public OpenSplitDialog(node: TaxTreeNode): void {\n this.splitTargetNode = node;\n this.SplitChildNames = '';\n this.ShowSplitDialog = true;\n this.cdr.detectChanges();\n }\n\n /** Closes the split-tag dialog without action */\n public CloseSplitDialog(): void {\n this.ShowSplitDialog = false;\n this.splitTargetNode = null;\n this.SplitChildNames = '';\n this.cdr.detectChanges();\n }\n\n /** Executes the split operation, creating child tags from comma-separated names */\n public async ExecuteSplit(): Promise<void> {\n if (!this.splitTargetNode || !this.SplitChildNames.trim()) return;\n const names = this.SplitChildNames.split(',')\n .map(n => n.trim())\n .filter(n => n.length > 0);\n if (names.length === 0) return;\n\n this.ShowSplitDialog = false;\n const nodeName = this.splitTargetNode.Name;\n const parentId = this.splitTargetNode.ParentID;\n\n try {\n const md = this.ProviderToUse;\n for (const name of names) {\n const tag = await md.GetEntityObject<MJTagEntity>('MJ: Tags', md.CurrentUser);\n tag.NewRecord();\n tag.Name = name;\n tag.DisplayName = name;\n tag.ParentID = parentId;\n await tag.Save();\n }\n\n this.addTaxAuditEntry('split', `${nodeName} into ${names.join(', ')}`);\n MJNotificationService.Instance.CreateSimpleNotification(\n `Split \"${nodeName}\" into ${names.length} new tags`, 'success', 3000\n );\n await this.RefreshTaxonomyData();\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n MJNotificationService.Instance.CreateSimpleNotification(`Split error: ${msg}`, 'error', 4000);\n }\n this.splitTargetNode = null;\n this.SplitChildNames = '';\n this.cdr.detectChanges();\n }\n\n // ── Move Dialog ──\n\n /** Opens the move-tag dialog for a given tree node */\n public OpenMoveDialog(node: TaxTreeNode): void {\n this.moveTargetNode = node;\n this.MoveNewParentID = node.ParentID;\n this.ShowMoveDialog = true;\n this.cdr.detectChanges();\n }\n\n /** Closes the move-tag dialog without action */\n public CloseMoveDialog(): void {\n this.ShowMoveDialog = false;\n this.moveTargetNode = null;\n this.MoveNewParentID = null;\n this.cdr.detectChanges();\n }\n\n /** Returns flat list of tags eligible as move targets (excludes the node being moved and its descendants) */\n public GetMoveTargetOptions(): { ID: string; Name: string; Depth: number }[] {\n if (!this.moveTargetNode) return [];\n const excludeIds = this.collectDescendantIds(this.moveTargetNode);\n excludeIds.add(NormalizeUUID(this.moveTargetNode.ID));\n\n return this.TaxFlatNodes\n .filter(n => !excludeIds.has(NormalizeUUID(n.ID)))\n .map(n => ({ ID: n.ID, Name: n.Name, Depth: n.Depth }));\n }\n\n /** Collects IDs of all descendants of a node */\n private collectDescendantIds(node: TaxTreeNode): Set<string> {\n const ids = new Set<string>();\n for (const child of node.Children) {\n ids.add(NormalizeUUID(child.ID));\n for (const id of this.collectDescendantIds(child)) {\n ids.add(id);\n }\n }\n return ids;\n }\n\n /** Executes the move operation */\n public async ExecuteMove(): Promise<void> {\n if (!this.moveTargetNode) return;\n const newParent = this.MoveNewParentID;\n this.ShowMoveDialog = false;\n\n await this.MoveTag(this.moveTargetNode, newParent);\n this.moveTargetNode = null;\n this.MoveNewParentID = null;\n this.cdr.detectChanges();\n }\n\n // ── Merge Into Dialog ──\n\n public OpenMergeIntoDialog(node: TaxTreeNode): void {\n this.MergeSourceTag = node;\n this.MergeTargetID = null;\n this.MergeTargetData = this.GetMergeTargetOptions().map(o => ({\n ID: o.ID,\n Label: `${' '.repeat(o.Depth)}${o.Name} (${o.ItemCount})`\n }));\n this.ShowMergeIntoDialog = true;\n this.cdr.detectChanges();\n }\n\n public OnMergeTargetSelected(value: unknown): void {\n this.MergeTargetID = value != null ? String(value) : null;\n }\n\n public CloseMergeIntoDialog(): void {\n this.ShowMergeIntoDialog = false;\n this.MergeSourceTag = null;\n this.MergeTargetID = null;\n this.cdr.detectChanges();\n }\n\n /** Returns flat list of tags eligible as merge targets (excludes the source tag) */\n public GetMergeTargetOptions(): { ID: string; Name: string; Depth: number; ItemCount: number }[] {\n if (!this.MergeSourceTag) return [];\n const sourceNormalized = NormalizeUUID(this.MergeSourceTag.ID);\n\n return this.TaxFlatNodes\n .filter(n => NormalizeUUID(n.ID) !== sourceNormalized)\n .map(n => ({ ID: n.ID, Name: n.Name, Depth: n.Depth, ItemCount: n.ItemCount }));\n }\n\n public async ExecuteMergeInto(): Promise<void> {\n if (!this.MergeSourceTag || !this.MergeTargetID) return;\n const targetNode = this.TaxFlatNodes.find(n => UUIDsEqual(n.ID, this.MergeTargetID!));\n const targetName = targetNode?.Name ?? 'Unknown';\n const sourceName = this.MergeSourceTag.Name;\n const sourceId = this.MergeSourceTag.ID;\n const targetId = this.MergeTargetID;\n\n this.ShowMergeIntoDialog = false;\n await this.MergeTags(sourceId, targetId, sourceName, targetName);\n this.MergeSourceTag = null;\n this.MergeTargetID = null;\n }\n\n // ── Treemap Drill-In ──\n\n /** Opens treemap drill-in panel for the given cell */\n public OpenTreemapDrillIn(cell: TaxTreemapCell): void {\n const node = this.TaxFlatNodes.find(n => UUIDsEqual(n.ID, cell.ID));\n if (node) {\n this.TreemapDrillInNode = node;\n this.ShowTreemapDrillIn = true;\n this.loadRecentItemsForTag(node);\n this.cdr.detectChanges();\n }\n }\n\n /** Closes treemap drill-in panel */\n public CloseTreemapDrillIn(): void {\n this.ShowTreemapDrillIn = false;\n this.TreemapDrillInNode = null;\n this.cdr.detectChanges();\n }\n\n /** Navigate from treemap drill-in to the tag in the tree view */\n public DrillInToTreeView(node: TaxTreeNode): void {\n this.CloseTreemapDrillIn();\n this.SwitchTaxSubTab('tree');\n this.SelectTaxNode(node);\n }\n\n public async RefreshTaxonomyData(): Promise<void> {\n await this.loadTaxonomyData();\n this.DataChanged.emit();\n this.cdr.detectChanges();\n }\n}\n","<mj-page-header-interior\n Title=\"Taxonomy\"\n [Subtitle]=\"Subtitle\">\n <div toolbar>\n <mj-tab-nav\n [Tabs]=\"taxSubTabsConfig\"\n [ActiveKey]=\"TaxSubTab\"\n (TabChange)=\"onTaxSubTabChange($event)\">\n </mj-tab-nav>\n </div>\n <div actions>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"RefreshTaxonomyData()\">\n <i class=\"fa-solid fa-arrows-rotate\"></i> <span class=\"mj-action-label\">Refresh</span>\n </button>\n </div>\n</mj-page-header-interior>\n\n<mj-page-body-interior [Padding]=\"false\" [Flex]=\"true\">\n<div class=\"at-main-area\">\n\n <div class=\"at-page-body\">\n\n <!-- ══ SUB-TAB 1: TREE VIEW ══ -->\n @if (TaxSubTab === 'tree') {\n <div class=\"at-tax-split-view\">\n <!-- Tree panel -->\n <div class=\"at-tax-tree-panel\" style=\"position: relative;\">\n <div class=\"at-tax-tree-toolbar\">\n <input type=\"text\" class=\"at-search-input\" style=\"flex: 1;\" placeholder=\"Search tags...\"\n [(ngModel)]=\"TaxTreeSearch\" (input)=\"FilterTaxTree()\">\n <button class=\"at-tax-toolbar-btn\" title=\"Add root tag\" (click)=\"OpenCreateRootTag()\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n <button class=\"at-tax-toolbar-btn\" [class.active]=\"TaxMultiSelectMode\"\n title=\"Toggle multi-select for drag reparenting\" (click)=\"ToggleMultiSelectMode()\">\n <i class=\"fa-solid fa-check-double\"></i>\n </button>\n </div>\n <div class=\"at-tax-tree-body\"\n (dragover)=\"$event.preventDefault()\"\n (drop)=\"OnDropToRoot($event)\">\n @if (TaxFilteredNodes.length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-sitemap\"></i>\n <p>No tags found</p>\n </div>\n }\n @for (node of TaxFilteredNodes; track node.ID) {\n <div class=\"at-tax-tree-node\"\n [class.at-tax-node-selected]=\"node.IsSelected\"\n [class.at-tax-node-drag-over]=\"TaxDragOverNodeID === node.ID\"\n [class.at-tax-node-multi-selected]=\"IsNodeMultiSelected(node.ID)\"\n [style.padding-left.px]=\"16 + node.Depth * 20\"\n [attr.draggable]=\"true\"\n (dragstart)=\"OnTreeNodeDragStart($event, node)\"\n (dragover)=\"OnTreeNodeDragOver($event, node)\"\n (dragleave)=\"OnTreeNodeDragLeave()\"\n (drop)=\"OnTreeNodeDrop($event, node); $event.stopPropagation()\"\n (click)=\"SelectTaxNode(node)\">\n @if (TaxMultiSelectMode) {\n <input type=\"checkbox\" class=\"at-tax-tree-checkbox\"\n [checked]=\"IsNodeMultiSelected(node.ID)\"\n (click)=\"ToggleNodeSelection(node, $event)\">\n }\n <span class=\"at-tax-tree-arrow\"\n [class.at-tax-arrow-expanded]=\"node.IsExpanded && node.Children.length > 0\"\n [class.at-tax-arrow-collapsed]=\"!node.IsExpanded && node.Children.length > 0\"\n [class.at-tax-arrow-leaf]=\"node.Children.length === 0\"\n (click)=\"ToggleTaxNode(node); $event.stopPropagation()\"></span>\n <span class=\"at-tax-health-dot\" [class]=\"node.HealthColor\"></span>\n <span class=\"at-tax-tree-label\" [class.at-tax-tree-label-selected]=\"node.IsSelected\">{{ node.Name }}</span>\n <span class=\"at-tax-tree-count\">({{ node.ItemCount }})</span>\n <span class=\"at-tax-tree-add-child\" title=\"Add child tag\"\n (click)=\"OpenCreateChildTagFor(node); $event.stopPropagation()\">\n <i class=\"fa-solid fa-plus\"></i>\n </span>\n </div>\n }\n </div>\n @if (TaxTreeSaving) {\n <div class=\"at-tax-tree-saving-overlay\">\n <mj-loading text=\"Moving tags...\" size=\"small\"></mj-loading>\n </div>\n }\n </div>\n\n <!-- Details panel -->\n <div class=\"at-tax-details-panel\">\n @if (TaxSelectedNode) {\n <div class=\"at-tax-details-header\">\n <!-- Breadcrumb -->\n <div class=\"at-tax-breadcrumb\">\n @for (bc of GetTaxBreadcrumb(TaxSelectedNode); track bc.ID) {\n <span class=\"at-tax-bc-link\" (click)=\"NavigateToBreadcrumb(bc.ID)\">{{ bc.Name }}</span>\n <span class=\"at-tax-bc-sep\">&rsaquo;</span>\n }\n <span class=\"at-tax-bc-current\">{{ TaxSelectedNode.Name }}</span>\n </div>\n\n @if (!TaxIsEditing) {\n <div class=\"at-tax-details-title\">\n {{ TaxSelectedNode.DisplayName }}\n <span class=\"at-tax-edit-icon\" (click)=\"StartEditTag()\" title=\"Edit name\">\n <i class=\"fa-solid fa-pen\"></i>\n </span>\n </div>\n @if (TaxSelectedNode.Description) {\n <div class=\"at-tax-details-desc\">{{ TaxSelectedNode.Description }}</div>\n }\n } @else {\n <div class=\"at-tax-edit-form\">\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Name</label>\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"TaxEditName\">\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Description</label>\n <textarea class=\"at-form-textarea\" rows=\"3\" [(ngModel)]=\"TaxEditDescription\"></textarea>\n </div>\n <div class=\"at-form-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"SaveEditTag()\">Save</button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CancelEditTag()\">Cancel</button>\n </div>\n </div>\n }\n </div>\n\n <!-- Editor sub-tab nav: Overview / Governance / Synonyms / Scope -->\n <div class=\"at-tag-editor-subtabs\">\n <button type=\"button\" class=\"at-tag-editor-subtab\" [class.at-tag-editor-subtab-active]=\"TagEditorSubTab === 'overview'\"\n (click)=\"SwitchTagEditorSubTab('overview')\">\n <i class=\"fa-solid fa-circle-info\"></i> Overview\n </button>\n <button type=\"button\" class=\"at-tag-editor-subtab\" [class.at-tag-editor-subtab-active]=\"TagEditorSubTab === 'governance'\"\n (click)=\"SwitchTagEditorSubTab('governance')\">\n <i class=\"fa-solid fa-shield-halved\"></i> Governance\n </button>\n <button type=\"button\" class=\"at-tag-editor-subtab\" [class.at-tag-editor-subtab-active]=\"TagEditorSubTab === 'synonyms'\"\n (click)=\"SwitchTagEditorSubTab('synonyms')\">\n <i class=\"fa-solid fa-arrows-turn-right\"></i> Synonyms\n @if (Synonyms.length > 0) {\n <span class=\"at-tag-editor-subtab-badge\">{{ Synonyms.length }}</span>\n }\n </button>\n <button type=\"button\" class=\"at-tag-editor-subtab\" [class.at-tag-editor-subtab-active]=\"TagEditorSubTab === 'scope'\"\n (click)=\"SwitchTagEditorSubTab('scope')\">\n <i class=\"fa-solid fa-users-viewfinder\"></i> Scope\n </button>\n </div>\n\n @if (TagEditorSubTab === 'overview') {\n <!-- Stats row -->\n <div class=\"at-tax-stats-row\">\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TaxSelectedNode.ItemCount }}</div>\n <div class=\"at-tax-stat-label\">Items Tagged</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TaxSelectedNode.AvgWeight.toFixed(2) }}</div>\n <div class=\"at-tax-stat-label\">Avg Weight</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TaxSelectedNode.Children.length }}</div>\n <div class=\"at-tax-stat-label\">Children</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TaxSelectedNode.Depth }}</div>\n <div class=\"at-tax-stat-label\">Depth</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value at-tax-stat-date\">{{ TaxSelectedNode.FirstSeen }}</div>\n <div class=\"at-tax-stat-label\">First Seen</div>\n </div>\n </div>\n\n <!-- Action toolbar -->\n @if (!TaxIsEditing) {\n <div class=\"at-tax-action-toolbar\">\n <button class=\"at-tax-action-btn\" (click)=\"OpenCreateChildTag()\"><i class=\"fa-solid fa-plus\"></i> Add Child</button>\n <button class=\"at-tax-action-btn\" (click)=\"StartEditTag()\"><i class=\"fa-solid fa-pen\"></i> Rename</button>\n <button class=\"at-tax-action-btn\" (click)=\"OpenMoveDialog(TaxSelectedNode)\"><i class=\"fa-solid fa-arrows-up-down\"></i> Move</button>\n <button class=\"at-tax-action-btn\" (click)=\"OpenMergeIntoDialog(TaxSelectedNode)\"><i class=\"fa-solid fa-compress\"></i> Merge Into...</button>\n <button class=\"at-tax-action-btn\" (click)=\"OpenSplitDialog(TaxSelectedNode)\"><i class=\"fa-solid fa-code-branch\"></i> Split</button>\n <button class=\"at-tax-action-btn at-tax-action-danger\" (click)=\"DeleteTag(TaxSelectedNode)\"><i class=\"fa-solid fa-trash\"></i> Delete</button>\n </div>\n }\n\n <!-- Child tags -->\n @if (TaxSelectedNode.Children.length > 0) {\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Child Tags</div>\n <div class=\"at-tax-child-chips\">\n @for (child of TaxSelectedNode.Children; track child.ID) {\n <span class=\"at-tax-child-chip\" (click)=\"SelectTaxNode(child)\">\n {{ child.Name }}\n <span class=\"at-tax-chip-count\">{{ child.ItemCount }}</span>\n </span>\n }\n </div>\n </div>\n }\n\n <!-- Recently tagged items -->\n @if (TaxRecentItems.length > 0) {\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Recently Tagged Items</div>\n <div class=\"at-tax-recent-list\">\n @for (item of TaxRecentItems; track $index) {\n <div class=\"at-tax-recent-item\">\n <div class=\"at-tax-recent-icon\"><i [class]=\"item.Icon\"></i></div>\n <div class=\"at-tax-recent-name\">{{ item.Name }}</div>\n <div class=\"at-tax-recent-weight\">{{ item.Weight.toFixed(2) }}</div>\n <div class=\"at-tax-recent-date\">{{ item.Date }}</div>\n </div>\n }\n </div>\n </div>\n }\n }\n\n <!-- ── Governance panel ── -->\n @if (TagEditorSubTab === 'governance') {\n <div class=\"at-tag-editor-pane\">\n @if (GovernanceLoading) {\n <div class=\"at-tag-editor-loading\"><i class=\"fa-solid fa-spinner fa-spin\"></i> Loading governance…</div>\n } @else if (GovernanceTag) {\n <div class=\"at-gov-toggle-row\">\n <mj-switch [(ngModel)]=\"GovIsFrozen\"></mj-switch>\n <div class=\"at-gov-toggle-text\">\n <div class=\"at-gov-toggle-label\">Frozen subtree</div>\n <div class=\"at-gov-toggle-sub\">Blocks all auto-grow below this node</div>\n </div>\n </div>\n <div class=\"at-gov-toggle-row\">\n <mj-switch [(ngModel)]=\"GovAllowAutoGrow\"></mj-switch>\n <div class=\"at-gov-toggle-text\">\n <div class=\"at-gov-toggle-label\">Allow auto-grow</div>\n <div class=\"at-gov-toggle-sub\">Classifier may create children under this node</div>\n </div>\n </div>\n <div class=\"at-gov-toggle-row\">\n <mj-switch [(ngModel)]=\"GovRequiresReview\"></mj-switch>\n <div class=\"at-gov-toggle-text\">\n <div class=\"at-gov-toggle-label\">Requires review</div>\n <div class=\"at-gov-toggle-sub\">Every classifier hit on this tag routes to review instead of auto-applying</div>\n </div>\n </div>\n\n <div class=\"at-gov-field-row\">\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Max children</label>\n <input type=\"number\" min=\"0\" class=\"at-form-input\" [(ngModel)]=\"GovMaxChildren\" placeholder=\"Unlimited\">\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Max depth below</label>\n <input type=\"number\" min=\"0\" class=\"at-form-input\" [(ngModel)]=\"GovMaxDescendantDepth\" placeholder=\"Unlimited\">\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Min weight (0–1)</label>\n <input type=\"number\" min=\"0\" max=\"1\" step=\"0.01\" class=\"at-form-input\" [(ngModel)]=\"GovMinWeight\" placeholder=\"None\">\n </div>\n </div>\n\n <div class=\"at-gov-impact\">\n <i class=\"fa-solid fa-circle-info\"></i>\n <span><b>Subtree impact:</b> {{ GovernanceImpactHint }}</span>\n </div>\n\n <div class=\"at-form-actions\">\n <button mjButton variant=\"primary\" size=\"sm\" [disabled]=\"GovernanceSaving\" (click)=\"SaveGovernance()\">\n <i class=\"fa-solid fa-check\"></i> Save governance\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" [disabled]=\"GovernanceSaving\" (click)=\"ResetGovernance()\">Reset</button>\n </div>\n } @else {\n <div class=\"at-tag-editor-loading\">Unable to load governance for this tag.</div>\n }\n </div>\n }\n\n <!-- ── Synonyms panel ── -->\n @if (TagEditorSubTab === 'synonyms') {\n <div class=\"at-tag-editor-pane\">\n @if (SynonymsLoading) {\n <div class=\"at-tag-editor-loading\"><i class=\"fa-solid fa-spinner fa-spin\"></i> Loading synonyms…</div>\n } @else {\n @if (PendingSynonymCount > 0) {\n <div class=\"at-syn-pending-bar\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n {{ PendingSynonymCount }} proposed {{ PendingSynonymCount === 1 ? 'synonym' : 'synonyms' }} awaiting review — these don't resolve until approved.\n </div>\n }\n @if (Synonyms.length > 0) {\n <div class=\"at-syn-list\">\n @for (syn of Synonyms; track syn.ID) {\n <div class=\"at-syn-item\" [class.at-syn-item-pending]=\"syn.Status === 'Pending'\">\n <span class=\"at-syn-name\">{{ syn.Synonym }}</span>\n <span class=\"at-syn-pill\" [class]=\"GetSynonymSourceClass(syn.Source)\">{{ syn.Source }}</span>\n @if (syn.Status === 'Pending') {\n <span class=\"at-syn-pill at-syn-pill-pending\">Pending</span>\n <button mjButton variant=\"success\" size=\"sm\" title=\"Approve synonym\"\n [disabled]=\"SynonymSaving\" (click)=\"ApproveSynonym(syn)\">\n <i class=\"fa-solid fa-check\"></i> Approve\n </button>\n <button mjButton variant=\"outline\" size=\"sm\" title=\"Reject synonym\"\n [disabled]=\"SynonymSaving\" (click)=\"RejectSynonym(syn)\">\n <i class=\"fa-solid fa-xmark\"></i> Reject\n </button>\n } @else {\n @if (syn.Status === 'Rejected') {\n <span class=\"at-syn-pill at-syn-pill-rejected\">Rejected</span>\n }\n <button type=\"button\" class=\"at-syn-delete\" title=\"Remove synonym\"\n [disabled]=\"SynonymSaving\" (click)=\"DeleteSynonym(syn)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n }\n </div>\n } @else {\n <div class=\"at-tag-editor-empty\">No synonyms yet for this tag.</div>\n }\n\n <div class=\"at-syn-add\">\n <input type=\"text\" class=\"at-form-input\" placeholder=\"Add a synonym…\"\n [(ngModel)]=\"NewSynonymText\" (keyup.enter)=\"AddSynonym()\">\n <button mjButton variant=\"primary\" size=\"sm\" [disabled]=\"SynonymSaving || !NewSynonymText.trim()\" (click)=\"AddSynonym()\">\n <i class=\"fa-solid fa-plus\"></i> Add\n </button>\n </div>\n }\n </div>\n }\n\n <!-- ── Scope panel ── -->\n @if (TagEditorSubTab === 'scope') {\n <div class=\"at-tag-editor-pane\">\n @if (ScopesLoading || GovernanceLoading) {\n <div class=\"at-tag-editor-loading\"><i class=\"fa-solid fa-spinner fa-spin\"></i> Loading scope…</div>\n } @else if (GovernanceTag) {\n <div class=\"at-gov-toggle-row\">\n <mj-switch [ngModel]=\"IsTagGlobal\" (ngModelChange)=\"ToggleTagGlobal($event)\" [Disabled]=\"ScopeSaving\"></mj-switch>\n <div class=\"at-gov-toggle-text\">\n <div class=\"at-gov-toggle-label\">Global tag</div>\n <div class=\"at-gov-toggle-sub\">Visible to every tenant/scope when on</div>\n </div>\n </div>\n\n @if (!IsTagGlobal) {\n @if (Scopes.length > 0) {\n <div class=\"at-scope-list\">\n @for (scope of Scopes; track scope.ID) {\n <div class=\"at-scope-item\">\n <span class=\"at-scope-entity\">{{ scope.ScopeEntity }}</span>\n <span class=\"at-scope-record\">{{ scope.ScopeRecordID }}</span>\n <button type=\"button\" class=\"at-syn-delete\" title=\"Remove scope\"\n [disabled]=\"ScopeSaving\" (click)=\"DeleteScope(scope)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n </div>\n } @else {\n <div class=\"at-tag-editor-empty\">No scope restrictions — add one to limit visibility.</div>\n }\n\n <div class=\"at-scope-add\">\n <mj-combobox class=\"at-scope-entity-picker\"\n [Data]=\"ScopeEntityOptions\" TextField=\"Name\" ValueField=\"ID\"\n [ValuePrimitive]=\"true\" Placeholder=\"Pick an entity…\"\n [ngModel]=\"NewScopeEntityID\" (ValueChange)=\"OnScopeEntitySelected($event)\">\n </mj-combobox>\n <input type=\"text\" class=\"at-form-input\" placeholder=\"Record ID…\" [(ngModel)]=\"NewScopeRecordID\">\n <button mjButton variant=\"primary\" size=\"sm\"\n [disabled]=\"ScopeSaving || !NewScopeEntityID || !NewScopeRecordID.trim()\" (click)=\"AddScope()\">\n <i class=\"fa-solid fa-plus\"></i> Add\n </button>\n </div>\n\n <div class=\"at-scope-note\">\n <i class=\"fa-solid fa-circle-info\"></i> Children inherit their parent's scope.\n </div>\n }\n } @else {\n <div class=\"at-tag-editor-loading\">Unable to load scope for this tag.</div>\n }\n </div>\n }\n } @else {\n <div class=\"at-empty-state\" style=\"height: 100%;\">\n <i class=\"fa-solid fa-hand-pointer\"></i>\n <p>Select a tag from the tree to view details</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Health bar -->\n <div class=\"at-tax-health-bar\">\n <span class=\"at-tax-health-label\">Taxonomy Health</span>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-total\"></span>\n <span class=\"at-tax-health-value\">{{ TaxHealth.Total }}</span>\n <span class=\"at-tax-health-text\">Total</span>\n </div>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-healthy\"></span>\n <span class=\"at-tax-health-value at-tax-val-success\">{{ TaxHealth.Healthy }}</span>\n <span class=\"at-tax-health-text\">Healthy</span>\n </div>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-attention\"></span>\n <span class=\"at-tax-health-value at-tax-val-warning\">{{ TaxHealth.NeedAttention }}</span>\n <span class=\"at-tax-health-text\">Need Attention</span>\n </div>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-orphaned\"></span>\n <span class=\"at-tax-health-value at-tax-val-error\">{{ TaxHealth.Orphaned }}</span>\n <span class=\"at-tax-health-text\">Orphaned</span>\n </div>\n <div class=\"at-tax-health-stat\">\n <span class=\"at-tax-dot at-tax-dot-duplicates\"></span>\n <span class=\"at-tax-health-value at-tax-val-info\">{{ TaxHealth.Duplicates }}</span>\n <span class=\"at-tax-health-text\">Duplicate Candidates</span>\n </div>\n </div>\n }\n\n <!-- ══ SUB-TAB 2: DUPLICATES ══ -->\n @if (TaxSubTab === 'duplicates') {\n <div class=\"at-tax-dup-stats-bar\">\n <div class=\"at-tax-dup-stat\"><strong>{{ TaxDuplicates.length }}</strong> candidates found</div>\n <div class=\"at-tax-dup-stat at-tax-dup-high\"><strong>{{ TaxHighConfidenceDupeCount }}</strong> high confidence (&gt;85%)</div>\n <div class=\"at-tax-dup-stat at-tax-dup-moderate\"><strong>{{ TaxModerateDupeCount }}</strong> moderate (70-85%)</div>\n </div>\n\n @if (TaxDuplicates.length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <p>No duplicate tags detected</p>\n </div>\n }\n\n <div class=\"at-tax-dup-list\">\n @for (pair of TaxDuplicates; track $index) {\n <div class=\"at-tax-dup-card\" [class.at-tax-dup-high]=\"pair.SeverityClass === 'high'\" [class.at-tax-dup-moderate]=\"pair.SeverityClass === 'moderate'\">\n @if (pair.IsExactDuplicate) {\n <!-- Exact-name duplicates: show single tag name with count -->\n <div class=\"at-tax-dup-tag\">{{ pair.TagA }}</div>\n <div class=\"at-tax-dup-similarity\">\n <span class=\"at-tax-sim-percent high\">\n <i class=\"fa-solid fa-clone\"></i>&nbsp;{{ pair.ExactDuplicateCount }} identical records\n </span>\n </div>\n <div class=\"at-tax-dup-actions\">\n <button class=\"at-tax-dup-btn at-tax-dup-btn-primary\" (click)=\"MergeTags(pair.TagAID, pair.TagBID, pair.TagA, pair.TagB)\" [disabled]=\"IsMerging\">@if (IsMerging) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Merging... } @else { Merge }</button>\n <button class=\"at-tax-dup-btn\" (click)=\"DismissDuplicate(pair)\">Dismiss</button>\n </div>\n } @else {\n <!-- Similar (non-exact) pairs: show both tags with similarity -->\n <div class=\"at-tax-dup-tag\">{{ pair.TagA }}</div>\n <div class=\"at-tax-dup-arrow\"><i class=\"fa-solid fa-arrows-left-right\"></i></div>\n <div class=\"at-tax-dup-similarity\">\n <div class=\"at-tax-sim-bar-bg\">\n <div class=\"at-tax-sim-bar-fill\" [class]=\"pair.SeverityClass\" [style.width.%]=\"pair.Similarity\"></div>\n </div>\n <span class=\"at-tax-sim-percent\" [class]=\"pair.SeverityClass\">{{ pair.Similarity }}%</span>\n </div>\n <div class=\"at-tax-dup-arrow\"><i class=\"fa-solid fa-arrows-left-right\"></i></div>\n <div class=\"at-tax-dup-tag\">{{ pair.TagB }}</div>\n <div class=\"at-tax-dup-actions\">\n <button class=\"at-tax-dup-btn at-tax-dup-btn-primary\" (click)=\"MergeTags(pair.TagAID, pair.TagBID, pair.TagA, pair.TagB)\" [disabled]=\"IsMerging\">@if (IsMerging) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Merging... } @else { Merge }</button>\n <button class=\"at-tax-dup-btn\" (click)=\"MakeChildTag(pair.TagAID, pair.TagBID)\">Make Child</button>\n <button class=\"at-tax-dup-btn\" (click)=\"DismissDuplicate(pair)\">Dismiss</button>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- ══ SUB-TAB 3: ORPHANS ══ -->\n @if (TaxSubTab === 'orphans') {\n <div class=\"at-tax-orphan-toolbar\">\n <span class=\"at-tax-orphan-count\">{{ TaxOrphans.length }} orphaned tags</span>\n <span class=\"at-tax-orphan-desc\">&mdash; no parent, no children, low usage</span>\n <div class=\"at-tax-orphan-bulk\">\n <button class=\"at-tax-bulk-btn\" (click)=\"ToggleAllOrphans()\">\n @if (TaxAllOrphansSelected) { <i class=\"fa-solid fa-square-check\"></i> } @else { <i class=\"fa-regular fa-square\"></i> }\n Select All\n </button>\n <button class=\"at-tax-bulk-btn at-tax-bulk-danger\" (click)=\"BulkDeleteOrphans()\">\n <i class=\"fa-solid fa-trash\"></i> Bulk Delete\n </button>\n <button class=\"at-tax-bulk-btn at-tax-bulk-danger\" (click)=\"DeleteAllOrphans()\">\n <i class=\"fa-solid fa-trash-can\"></i> Delete All ({{ TaxOrphans.length }})\n </button>\n </div>\n </div>\n\n @if (TaxOrphans.length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <p>No orphaned tags</p>\n </div>\n }\n\n <div class=\"at-tax-orphan-grid\">\n @for (orphan of TaxOrphans; track orphan.ID) {\n <div class=\"at-tax-orphan-card\">\n <div class=\"at-tax-orphan-header\">\n <span class=\"at-tax-orphan-name\">{{ orphan.Name }}</span>\n <input type=\"checkbox\" class=\"at-tax-orphan-checkbox\" [checked]=\"orphan.IsSelected\"\n (change)=\"ToggleOrphanSelection(orphan)\" (click)=\"$event.stopPropagation()\">\n </div>\n <div class=\"at-tax-orphan-stats\">\n <span>Usage: <strong>{{ orphan.UsageCount }}</strong></span>\n <span>Avg Weight: <strong>{{ orphan.AvgWeight.toFixed(2) }}</strong></span>\n </div>\n <div class=\"at-tax-orphan-dates\">\n <span>First: {{ orphan.FirstSeen }}</span>\n <span>Last: {{ orphan.LastSeen }}</span>\n </div>\n <div class=\"at-tax-orphan-actions\">\n <button class=\"at-tax-orphan-btn at-tax-orphan-delete\" (click)=\"DeleteOrphan(orphan)\">Delete</button>\n <button class=\"at-tax-orphan-btn\">Ignore</button>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- ══ SUB-TAB 4: TREEMAP ══ -->\n @if (TaxSubTab === 'treemap') {\n <div class=\"at-tax-treemap-kpi-strip\">\n @for (kpi of TaxTreemapKPIs; track kpi.Label) {\n <div class=\"at-tax-treemap-kpi\">\n <div class=\"at-tax-treemap-kpi-value\">{{ kpi.Value }}</div>\n <div class=\"at-tax-treemap-kpi-label\">{{ kpi.Label }}</div>\n </div>\n }\n </div>\n\n @if (TaxTreemapCells.length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-chart-tree-map\"></i>\n <p>No taxonomy data to visualize</p>\n </div>\n } @else {\n <div class=\"at-tax-treemap-container\">\n @for (cell of TaxTreemapCells; track $index) {\n <div class=\"at-tax-treemap-cell at-tax-treemap-cell-clickable\" [class]=\"cell.ColorClass\"\n [style.grid-row]=\"cell.RowSpan > 1 ? 'span ' + cell.RowSpan : ''\"\n (click)=\"OpenTreemapDrillIn(cell)\">\n <span class=\"at-tax-cell-name\">{{ cell.Name }}</span>\n <span class=\"at-tax-cell-count\">{{ cell.ItemCount }} items</span>\n </div>\n }\n </div>\n }\n\n <!-- Treemap Drill-In Panel -->\n @if (ShowTreemapDrillIn && TreemapDrillInNode) {\n <div class=\"at-tax-drillin-overlay\" (click)=\"CloseTreemapDrillIn()\">\n <div class=\"at-tax-drillin-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-tax-drillin-header\">\n <h3><i class=\"fa-solid fa-tag\"></i> {{ TreemapDrillInNode.Name }}</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseTreemapDrillIn()\" aria-label=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-tax-drillin-body\">\n <div class=\"at-tax-stats-row\">\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TreemapDrillInNode.ItemCount }}</div>\n <div class=\"at-tax-stat-label\">Items Tagged</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TreemapDrillInNode.AvgWeight.toFixed(2) }}</div>\n <div class=\"at-tax-stat-label\">Avg Weight</div>\n </div>\n <div class=\"at-tax-stat-item\">\n <div class=\"at-tax-stat-value\">{{ TreemapDrillInNode.Children.length }}</div>\n <div class=\"at-tax-stat-label\">Children</div>\n </div>\n </div>\n\n @if (TreemapDrillInNode.Children.length > 0) {\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Child Tags</div>\n <div class=\"at-tax-child-chips\">\n @for (child of TreemapDrillInNode.Children; track child.ID) {\n <span class=\"at-tax-child-chip\">{{ child.Name }} <span class=\"at-tax-chip-count\">{{ child.ItemCount }}</span></span>\n }\n </div>\n </div>\n }\n\n @if (TaxRecentItems.length > 0) {\n <div class=\"at-tax-detail-section\">\n <div class=\"at-tax-section-title\">Recently Tagged Items</div>\n <div class=\"at-tax-recent-list\">\n @for (item of TaxRecentItems; track $index) {\n <div class=\"at-tax-recent-item\">\n <div class=\"at-tax-recent-icon\"><i [class]=\"item.Icon\"></i></div>\n <div class=\"at-tax-recent-name\">{{ item.Name }}</div>\n <div class=\"at-tax-recent-weight\">{{ item.Weight.toFixed(2) }}</div>\n <div class=\"at-tax-recent-date\">{{ item.Date }}</div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n <div class=\"at-tax-drillin-footer\">\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"DrillInToTreeView(TreemapDrillInNode)\">\n <i class=\"fa-solid fa-sitemap\"></i> View in Tree\n </button>\n </div>\n </div>\n </div>\n }\n }\n\n <!-- ══ SUB-TAB 5: AUDIT LOG ══ -->\n @if (TaxSubTab === 'audit') {\n <div class=\"at-tax-audit-filters\">\n <span class=\"at-tax-audit-filter-label\">Filter</span>\n <div class=\"at-tax-audit-checkbox-group\">\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('created')\" (change)=\"ToggleTaxAuditFilter('created')\"> Created\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('merged')\" (change)=\"ToggleTaxAuditFilter('merged')\"> Merged\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('moved')\" (change)=\"ToggleTaxAuditFilter('moved')\"> Moved\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('deleted')\" (change)=\"ToggleTaxAuditFilter('deleted')\"> Deleted\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('renamed')\" (change)=\"ToggleTaxAuditFilter('renamed')\"> Renamed\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('deprecated')\" (change)=\"ToggleTaxAuditFilter('deprecated')\"> Deprecated\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('split')\" (change)=\"ToggleTaxAuditFilter('split')\"> Split\n </label>\n <label class=\"at-tax-audit-checkbox\">\n <input type=\"checkbox\" [checked]=\"TaxAuditFilterTypes.has('reactivated')\" (change)=\"ToggleTaxAuditFilter('reactivated')\"> Reactivated\n </label>\n </div>\n </div>\n\n @if (GetFilteredAuditEvents().length === 0) {\n <div class=\"at-empty-state\">\n <i class=\"fa-solid fa-scroll\"></i>\n <p>No audit events match the current filters</p>\n </div>\n }\n\n <div class=\"at-tax-audit-timeline\">\n @for (event of GetFilteredAuditEvents(); track $index) {\n <div class=\"at-tax-audit-event\">\n <div class=\"at-tax-audit-event-icon\" [class]=\"event.Type\">\n <i [class]=\"GetTaxAuditIcon(event.Type)\"></i>\n </div>\n <div class=\"at-tax-audit-event-body\">\n <div class=\"at-tax-audit-event-desc\">\n {{ event.Description }} <span class=\"at-tax-tag-ref\">{{ event.TagRef }}</span>\n </div>\n <div class=\"at-tax-audit-event-meta\">\n <span>{{ event.User }}</span>\n <span>{{ event.Timestamp }}</span>\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n</div>\n</mj-page-body-interior>\n\n\n<!-- ══════ CONFIRMATION DIALOG ══════ -->\n@if (ShowConfirmDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"ConfirmDialogCancel()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-triangle-exclamation\"></i> {{ ConfirmDialogTitle }}</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"ConfirmDialogCancel()\" aria-label=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <p class=\"at-confirm-message\">{{ ConfirmDialogMessage }}</p>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-danger-btn\" (click)=\"ConfirmDialogAccept()\">\n <i class=\"fa-solid fa-check\"></i> Confirm\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"ConfirmDialogCancel()\">Cancel</button>\n </div>\n </div>\n </div>\n}\n\n<!-- ══════ SPLIT DIALOG ══════ -->\n@if (ShowSplitDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"CloseSplitDialog()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-code-branch\"></i> Split Tag</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseSplitDialog()\" aria-label=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <div class=\"at-schedule-field\">\n <label>New tag names (comma-separated)</label>\n <input type=\"text\" class=\"mj-input\" style=\"width: 100%;\"\n [(ngModel)]=\"SplitChildNames\"\n placeholder=\"Tag A, Tag B, Tag C\" />\n </div>\n <p class=\"at-confirm-message\">New tags will be created as siblings of the original tag under the same parent.</p>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"ExecuteSplit()\" [disabled]=\"!SplitChildNames.trim()\">\n <i class=\"fa-solid fa-code-branch\"></i> Create Tags\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseSplitDialog()\">Cancel</button>\n </div>\n </div>\n </div>\n}\n\n<!-- ══════ CREATE TAG DIALOG ══════ -->\n@if (ShowCreateTagDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"CloseCreateTagDialog()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-plus\"></i> Create Tag</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseCreateTagDialog()\" aria-label=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <div class=\"at-tax-create-context\">{{ CreateTagParentLabel }}</div>\n <div class=\"at-schedule-field\">\n <label>Name</label>\n <input type=\"text\" class=\"mj-input\" style=\"width: 100%;\" [(ngModel)]=\"CreateTagName\"\n placeholder=\"Tag name\" (keydown.enter)=\"SaveNewTag()\">\n </div>\n <div class=\"at-schedule-field\">\n <label>Description (optional)</label>\n <textarea class=\"mj-textarea\" rows=\"3\" style=\"width: 100%;\" [(ngModel)]=\"CreateTagDescription\"\n placeholder=\"Brief description of this tag\"></textarea>\n </div>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"SaveNewTag()\" [disabled]=\"!CreateTagName.trim()\">\n <i class=\"fa-solid fa-check\"></i> Create\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseCreateTagDialog()\">Cancel</button>\n </div>\n </div>\n </div>\n}\n\n<!-- ══════ MOVE DIALOG ══════ -->\n@if (ShowMoveDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"CloseMoveDialog()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-arrows-up-down\"></i> Move Tag</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseMoveDialog()\" aria-label=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <div class=\"at-schedule-field\">\n <label>New parent tag</label>\n <select class=\"mj-input\" style=\"width: 100%;\" [(ngModel)]=\"MoveNewParentID\">\n <option [ngValue]=\"null\">(Root level &mdash; no parent)</option>\n @for (opt of GetMoveTargetOptions(); track opt.ID) {\n <option [ngValue]=\"opt.ID\">{{ '  '.repeat(opt.Depth) }}{{ opt.Name }}</option>\n }\n </select>\n </div>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"ExecuteMove()\">\n <i class=\"fa-solid fa-check\"></i> Move\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseMoveDialog()\">Cancel</button>\n </div>\n </div>\n </div>\n}\n\n<!-- ══════ MERGE-INTO DIALOG ══════ -->\n@if (ShowMergeIntoDialog) {\n <div class=\"at-schedule-overlay\" (click)=\"CloseMergeIntoDialog()\">\n <div class=\"at-schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"at-schedule-dialog-header\">\n <h3><i class=\"fa-solid fa-compress\"></i> Merge \"{{ MergeSourceTag?.Name }}\" Into...</h3>\n <button class=\"at-schedule-dialog-close\" (click)=\"CloseMergeIntoDialog()\" aria-label=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"at-schedule-dialog-body\">\n <p style=\"font-size: 0.85rem; color: var(--mj-text-secondary); margin: 0 0 12px;\">\n All tagged items will be moved to the target tag, then \"{{ MergeSourceTag?.Name }}\" will be deleted.\n </p>\n <div class=\"at-schedule-field\">\n <label>Merge into</label>\n <mj-combobox\n [Data]=\"MergeTargetData\"\n TextField=\"Label\"\n ValueField=\"ID\"\n [Filterable]=\"true\"\n [ValuePrimitive]=\"true\"\n Placeholder=\"Search and select a tag...\"\n (ValueChange)=\"OnMergeTargetSelected($event)\">\n </mj-combobox>\n </div>\n </div>\n <div class=\"at-schedule-dialog-footer\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"ExecuteMergeInto()\" [disabled]=\"!MergeTargetID || IsMerging\">\n @if (IsMerging) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Merging... } @else { <i class=\"fa-solid fa-compress\"></i> Merge }\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseMergeIntoDialog()\">Cancel</button>\n </div>\n </div>\n </div>\n}\n"]}