@memberjunction/ng-dashboards 5.24.0 → 5.26.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 (284) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts +15 -33
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +233 -493
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/agents/agent-editor.component.d.ts +2 -2
  6. package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
  7. package/dist/AI/components/agents/agent-editor.component.js +7 -7
  8. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  9. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +43 -6
  10. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  11. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +1135 -864
  12. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  13. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +4 -3
  14. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  15. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +1 -0
  16. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  17. package/dist/AI/components/execution-monitoring.component.d.ts +4 -5
  18. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
  19. package/dist/AI/components/execution-monitoring.component.js +14 -15
  20. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  21. package/dist/AI/components/models/model-management.component.d.ts +4 -4
  22. package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
  23. package/dist/AI/components/models/model-management.component.js +5 -5
  24. package/dist/AI/components/models/model-management.component.js.map +1 -1
  25. package/dist/AI/components/prompts/prompt-management.component.d.ts +4 -4
  26. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
  27. package/dist/AI/components/prompts/prompt-management.component.js +5 -5
  28. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  29. package/dist/AI/components/requests/agent-requests-resource.component.d.ts +2 -1
  30. package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -1
  31. package/dist/AI/components/requests/agent-requests-resource.component.js +1 -0
  32. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
  33. package/dist/AI/components/system/system-configuration.component.d.ts +2 -3
  34. package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
  35. package/dist/AI/components/system/system-configuration.component.js +9 -11
  36. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  37. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +44 -8
  38. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  39. package/dist/AI/components/vectors/vector-management-resource.component.js +648 -384
  40. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  41. package/dist/APIKeys/api-keys-resource.component.d.ts +2 -1
  42. package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
  43. package/dist/APIKeys/api-keys-resource.component.js +2 -0
  44. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  45. package/dist/Actions/components/actions-overview.component.d.ts +4 -5
  46. package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
  47. package/dist/Actions/components/actions-overview.component.js +11 -12
  48. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  49. package/dist/Actions/components/code-management.component.d.ts +2 -3
  50. package/dist/Actions/components/code-management.component.d.ts.map +1 -1
  51. package/dist/Actions/components/code-management.component.js +4 -6
  52. package/dist/Actions/components/code-management.component.js.map +1 -1
  53. package/dist/Actions/components/entity-integration.component.d.ts +2 -3
  54. package/dist/Actions/components/entity-integration.component.d.ts.map +1 -1
  55. package/dist/Actions/components/entity-integration.component.js +4 -6
  56. package/dist/Actions/components/entity-integration.component.js.map +1 -1
  57. package/dist/Actions/components/execution-monitoring.component.d.ts +4 -5
  58. package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
  59. package/dist/Actions/components/execution-monitoring.component.js +10 -11
  60. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  61. package/dist/Actions/components/explorer/action-explorer.component.d.ts +13 -12
  62. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
  63. package/dist/Actions/components/explorer/action-explorer.component.js +39 -66
  64. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  65. package/dist/Actions/components/scheduled-actions.component.d.ts +2 -3
  66. package/dist/Actions/components/scheduled-actions.component.d.ts.map +1 -1
  67. package/dist/Actions/components/scheduled-actions.component.js +4 -6
  68. package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
  69. package/dist/Actions/components/security-permissions.component.d.ts +2 -3
  70. package/dist/Actions/components/security-permissions.component.d.ts.map +1 -1
  71. package/dist/Actions/components/security-permissions.component.js +4 -6
  72. package/dist/Actions/components/security-permissions.component.js.map +1 -1
  73. package/dist/ApplicationRoles/application-roles-resource.component.d.ts +112 -0
  74. package/dist/ApplicationRoles/application-roles-resource.component.d.ts.map +1 -0
  75. package/dist/ApplicationRoles/application-roles-resource.component.js +532 -0
  76. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -0
  77. package/dist/Communication/communication-dashboard.component.d.ts.map +1 -1
  78. package/dist/Communication/communication-dashboard.component.js +1 -0
  79. package/dist/Communication/communication-dashboard.component.js.map +1 -1
  80. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  81. package/dist/Communication/communication-logs-resource.component.js +4 -1
  82. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  83. package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
  84. package/dist/Communication/communication-monitor-resource.component.js +4 -1
  85. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  86. package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
  87. package/dist/Communication/communication-providers-resource.component.js +4 -1
  88. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  89. package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
  90. package/dist/Communication/communication-runs-resource.component.js +4 -1
  91. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  92. package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
  93. package/dist/Communication/communication-templates-resource.component.js +4 -1
  94. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  95. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +2 -1
  96. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  97. package/dist/ComponentStudio/component-studio-dashboard.component.js +1 -0
  98. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  99. package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
  100. package/dist/Credentials/components/credentials-audit-resource.component.js +2 -0
  101. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  102. package/dist/Credentials/components/credentials-categories-resource.component.d.ts +2 -3
  103. package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
  104. package/dist/Credentials/components/credentials-categories-resource.component.js +10 -11
  105. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  106. package/dist/Credentials/components/credentials-list-resource.component.d.ts +2 -1
  107. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  108. package/dist/Credentials/components/credentials-list-resource.component.js +2 -0
  109. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  110. package/dist/Credentials/components/credentials-overview-resource.component.d.ts +4 -4
  111. package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
  112. package/dist/Credentials/components/credentials-overview-resource.component.js +8 -9
  113. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  114. package/dist/Credentials/components/credentials-types-resource.component.d.ts +2 -3
  115. package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
  116. package/dist/Credentials/components/credentials-types-resource.component.js +11 -12
  117. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  118. package/dist/Credentials/credentials-dashboard.component.d.ts.map +1 -1
  119. package/dist/Credentials/credentials-dashboard.component.js +1 -0
  120. package/dist/Credentials/credentials-dashboard.component.js.map +1 -1
  121. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +2 -3
  122. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
  123. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +9 -10
  124. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  125. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +2 -2
  126. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +23 -15
  127. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -1
  128. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +167 -213
  129. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
  130. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +68 -32
  131. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  132. package/dist/DataExplorer/data-explorer-dashboard.component.js +453 -420
  133. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  134. package/dist/DataExplorer/data-explorer-resource.component.d.ts +10 -3
  135. package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
  136. package/dist/DataExplorer/data-explorer-resource.component.js +35 -11
  137. package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
  138. package/dist/DataExplorer/models/explorer-state.interface.d.ts +12 -3
  139. package/dist/DataExplorer/models/explorer-state.interface.d.ts.map +1 -1
  140. package/dist/DataExplorer/models/explorer-state.interface.js +5 -1
  141. package/dist/DataExplorer/models/explorer-state.interface.js.map +1 -1
  142. package/dist/Home/home-dashboard.component.d.ts +4 -4
  143. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  144. package/dist/Home/home-dashboard.component.js +4 -5
  145. package/dist/Home/home-dashboard.component.js.map +1 -1
  146. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  147. package/dist/Integration/components/activity/activity.component.js +1 -0
  148. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  149. package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
  150. package/dist/Integration/components/connections/connections.component.js +2 -0
  151. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  152. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
  153. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +1 -0
  154. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  155. package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
  156. package/dist/Integration/components/overview/overview.component.js +2 -0
  157. package/dist/Integration/components/overview/overview.component.js.map +1 -1
  158. package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
  159. package/dist/Integration/components/pipelines/pipelines.component.js +2 -0
  160. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  161. package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
  162. package/dist/Integration/components/schedules/schedules.component.js +2 -0
  163. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  164. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +4 -3
  165. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
  166. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +1 -0
  167. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  168. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +4 -3
  169. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
  170. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +1 -0
  171. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  172. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +13 -3
  173. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
  174. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +220 -138
  175. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  176. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +4 -3
  177. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -1
  178. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +1 -0
  179. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
  180. package/dist/KnowledgeHub/index.d.ts +0 -1
  181. package/dist/KnowledgeHub/index.d.ts.map +1 -1
  182. package/dist/KnowledgeHub/index.js +0 -1
  183. package/dist/KnowledgeHub/index.js.map +1 -1
  184. package/dist/Lists/components/lists-browse-resource.component.d.ts +2 -1
  185. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  186. package/dist/Lists/components/lists-browse-resource.component.js +2 -0
  187. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  188. package/dist/Lists/components/lists-categories-resource.component.d.ts +2 -1
  189. package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
  190. package/dist/Lists/components/lists-categories-resource.component.js +2 -0
  191. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  192. package/dist/Lists/components/lists-my-lists-resource.component.d.ts +2 -1
  193. package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
  194. package/dist/Lists/components/lists-my-lists-resource.component.js +2 -0
  195. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  196. package/dist/Lists/components/lists-operations-resource.component.d.ts +2 -1
  197. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  198. package/dist/Lists/components/lists-operations-resource.component.js +2 -0
  199. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  200. package/dist/MCP/mcp-dashboard.component.d.ts +7 -28
  201. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
  202. package/dist/MCP/mcp-dashboard.component.js +25 -107
  203. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  204. package/dist/MCP/mcp-resource.component.d.ts.map +1 -1
  205. package/dist/MCP/mcp-resource.component.js +1 -0
  206. package/dist/MCP/mcp-resource.component.js.map +1 -1
  207. package/dist/QueryBrowser/query-browser-resource.component.d.ts +10 -23
  208. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  209. package/dist/QueryBrowser/query-browser-resource.component.js +41 -103
  210. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  211. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
  212. package/dist/Scheduling/components/scheduling-activity-resource.component.js +1 -0
  213. package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
  214. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
  215. package/dist/Scheduling/components/scheduling-jobs-resource.component.js +1 -0
  216. package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
  217. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
  218. package/dist/Scheduling/components/scheduling-overview-resource.component.js +1 -0
  219. package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
  220. package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
  221. package/dist/Scheduling/scheduling-dashboard.component.js +1 -0
  222. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  223. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +4 -4
  224. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  225. package/dist/SystemDiagnostics/system-diagnostics.component.js +9 -10
  226. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  227. package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
  228. package/dist/Testing/components/testing-analytics-resource.component.js +2 -0
  229. package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
  230. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +2 -1
  231. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
  232. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +2 -0
  233. package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
  234. package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
  235. package/dist/Testing/components/testing-explorer-resource.component.js +2 -0
  236. package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
  237. package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
  238. package/dist/Testing/components/testing-review-resource.component.js +2 -0
  239. package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
  240. package/dist/Testing/components/testing-runs-resource.component.d.ts +2 -1
  241. package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
  242. package/dist/Testing/components/testing-runs-resource.component.js +2 -0
  243. package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
  244. package/dist/Testing/testing-dashboard.component.d.ts +2 -1
  245. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  246. package/dist/Testing/testing-dashboard.component.js +1 -0
  247. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  248. package/dist/VersionHistory/components/diff-resource.component.d.ts +4 -4
  249. package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -1
  250. package/dist/VersionHistory/components/diff-resource.component.js +9 -10
  251. package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
  252. package/dist/VersionHistory/components/graph-resource.component.d.ts +2 -1
  253. package/dist/VersionHistory/components/graph-resource.component.d.ts.map +1 -1
  254. package/dist/VersionHistory/components/graph-resource.component.js +2 -0
  255. package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
  256. package/dist/VersionHistory/components/labels-resource.component.d.ts +4 -4
  257. package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
  258. package/dist/VersionHistory/components/labels-resource.component.js +10 -11
  259. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  260. package/dist/VersionHistory/components/restore-resource.component.d.ts +2 -1
  261. package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
  262. package/dist/VersionHistory/components/restore-resource.component.js +2 -0
  263. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  264. package/dist/ai-dashboards.module.d.ts +19 -19
  265. package/dist/ai-dashboards.module.d.ts.map +1 -1
  266. package/dist/ai-dashboards.module.js +4 -5
  267. package/dist/ai-dashboards.module.js.map +1 -1
  268. package/dist/core-dashboards.module.d.ts +19 -18
  269. package/dist/core-dashboards.module.d.ts.map +1 -1
  270. package/dist/core-dashboards.module.js +8 -0
  271. package/dist/core-dashboards.module.js.map +1 -1
  272. package/dist/data-explorer-dashboards.module.d.ts +2 -1
  273. package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
  274. package/dist/data-explorer-dashboards.module.js +7 -3
  275. package/dist/data-explorer-dashboards.module.js.map +1 -1
  276. package/dist/public-api.d.ts +1 -1
  277. package/dist/public-api.d.ts.map +1 -1
  278. package/dist/public-api.js +2 -1
  279. package/dist/public-api.js.map +1 -1
  280. package/package.json +49 -48
  281. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts +0 -166
  282. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts.map +0 -1
  283. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js +0 -991
  284. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-browser-resource.component.d.ts","sourceRoot":"","sources":["../../src/DashboardBrowser/dashboard-browser-resource.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dashboard-browser-resource.component.d.ts","sourceRoot":"","sources":["../../src/DashboardBrowser/dashboard-browser-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAsC,MAAM,eAAe,CAAC;AACpH,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAKjD,OAAO,EAAE,qBAAqB,EAAqB,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,yBAAyB,EAAmB,wBAAwB,EAAiC,MAAM,+BAA+B,CAAC;AAChN,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EACH,wBAAwB,EACxB,wBAAwB,EACxB,qBAAqB,EACrB,cAAc,EAEd,cAAc,EACd,oBAAoB,EAEpB,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EACzB,wBAAwB,EACxB,uBAAuB,EAC1B,MAAM,qCAAqC,CAAC;;AAC7C;;GAEG;AACH,KAAK,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAE5C;;;;GAIG;AACH,qBAQa,iCAAkC,SAAQ,qBAAsB,YAAW,MAAM,EAAE,SAAS;IA6DjG,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,KAAK;IAzDV,IAAI,EAAE,WAAW,CAAU;IAC3B,SAAS,UAAS;IAClB,UAAU,EAAE,iBAAiB,EAAE,CAAM;IACrC,UAAU,EAAE,yBAAyB,EAAE,CAAM;IAC7C,iBAAiB,EAAE,iBAAiB,GAAG,IAAI,CAAQ;IACnD,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACzC,QAAQ,EAAE,wBAAwB,CAAW;IAC7C,kBAAkB,UAAS;IAG3B,gBAAgB,UAAS;IACzB,iBAAiB,EAAE,cAAc,GAAG,IAAI,CAAQ;IAChD,oBAAoB,EAAE,yBAAyB,GAAG,IAAI,CAAQ;IAC9D,iBAAiB,EAAE,MAAM,CAAM;IAG/B,iBAAiB,UAAS;IAC1B,cAAc,EAAE,MAAM,CAAM;IAC5B,iBAAiB,EAAE,MAAM,CAAM;IAG/B,eAAe,UAAS;IAGxB,WAAW,SAAM;IACjB,kBAAkB,SAAM;IAC/B,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,mBAAmB,CAAM;IACjC,OAAO,CAAC,cAAc,CAAM;IAGrB,4BAA4B,EAAE,wBAAwB,CAQ3D;IAGK,uBAAuB,EAAE,GAAG,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAa;IAG3E,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAa;IAEpE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;IAEnB,eAAe,EAAG,wBAAwB,CAAC;gBAO7D,GAAG,EAAE,iBAAiB,EACtB,KAAK,EAAE,cAAc;IAQjC,QAAQ,IAAI,IAAI;IAOhB,WAAW,IAAI,IAAI;IAUb,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAI3D,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ/D;;OAEG;IACI,eAAe,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAcvD;;OAEG;IACI,YAAY,IAAI,IAAI;IAU3B;;OAEG;IACI,eAAe,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAIvD;;OAEG;IACU,iBAAiB,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B1E;;;;OAIG;IACU,eAAe,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAyCtE;;;;;;OAMG;YACW,0BAA0B;IAgCxC;;OAEG;IACU,iBAAiB,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1E;;OAEG;IACI,gBAAgB,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;IAKzD;;OAEG;IACI,sBAAsB,CAAC,KAAK,EAAE,yBAAyB,GAAG,IAAI;IAKrE;;;OAGG;IACU,gBAAgB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAmExE;;;OAGG;IACU,gBAAgB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IA6CxE;;;OAGG;IACI,oBAAoB,CAAC,KAAK,EAAE,uBAAuB,GAAG,IAAI;IAajE;;OAEG;IACI,aAAa,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI;IAgBxD;;OAEG;IACI,aAAa,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI;IA6BxD;;OAEG;IACI,UAAU,IAAI,IAAI;IAQzB;;OAEG;IACI,cAAc,IAAI,IAAI;IAS7B;;OAEG;IACI,eAAe,IAAI,IAAI;IAa9B;;OAEG;IACI,gBAAgB,IAAI,IAAI;IAK/B;;OAEG;IACI,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAmB3D;;OAEG;IACU,eAAe,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAoCvE;;OAEG;IACU,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B3C;;OAEG;IACI,UAAU,IAAI,IAAI;IAiBzB;;OAEG;IACI,UAAU,IAAI,IAAI;IAUzB;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAKhC;;OAEG;IACI,kBAAkB,CAAC,KAAK,EAAE,qBAAqB,GAAG,IAAI;IAuB7D;;OAEG;IACI,qBAAqB,CAAC,KAAK,EAAE,wBAAwB,GAAG,IAAI;IA+DnE;;OAEG;IACH,OAAO,CAAC,YAAY;IAMpB;;OAEG;IACI,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAajD;;OAEG;IACI,mBAAmB,IAAI,IAAI;IASlC;;OAEG;IACI,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAkB9C;;OAEG;IACI,mBAAmB,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI;IAY9D;;OAEG;IACI,uBAAuB,IAAI,IAAI;IAItC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAYzB;;OAEG;IACI,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAOzE;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAOhC;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAIhC;;OAEG;IACH,OAAO,CAAC,wBAAwB;YAWlB,cAAc;IA6E5B;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAoB/B;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IA6B/B,OAAO,CAAC,sBAAsB;IAiC9B;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IA0B5B;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAgBnC,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,kBAAkB;yCA3kCjB,iCAAiC;2CAAjC,iCAAiC;CA+kC7C"}
@@ -14,10 +14,9 @@ import { DashboardEngine } from '@memberjunction/core-entities';
14
14
  import { createDefaultDashboardConfig } from '@memberjunction/ng-dashboard-viewer';
15
15
  import * as i0 from "@angular/core";
16
16
  import * as i1 from "@angular/router";
17
- import * as i2 from "@memberjunction/ng-shared";
18
- import * as i3 from "@angular/forms";
19
- import * as i4 from "@memberjunction/ng-dashboard-viewer";
20
- import * as i5 from "./dashboard-share-dialog.component";
17
+ import * as i2 from "@angular/forms";
18
+ import * as i3 from "@memberjunction/ng-dashboard-viewer";
19
+ import * as i4 from "./dashboard-share-dialog.component";
21
20
  const _c0 = ["dashboardViewer"];
22
21
  function DashboardBrowserResourceComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
23
22
  const _r1 = i0.ɵɵgetCurrentView();
@@ -157,7 +156,6 @@ function DashboardBrowserResourceComponent_Conditional_2_Template(rf, ctx) { if
157
156
  let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent extends BaseResourceComponent {
158
157
  cdr;
159
158
  route;
160
- navigationService;
161
159
  // ========================================
162
160
  // State
163
161
  // ========================================
@@ -205,21 +203,22 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
205
203
  // ========================================
206
204
  // Constructor
207
205
  // ========================================
208
- constructor(cdr, route, navigationService) {
206
+ constructor(cdr, route) {
209
207
  super();
210
208
  this.cdr = cdr;
211
209
  this.route = route;
212
- this.navigationService = navigationService;
213
210
  }
214
211
  // ========================================
215
212
  // Lifecycle
216
213
  // ========================================
217
214
  ngOnInit() {
215
+ super.ngOnInit();
218
216
  this.loadDashboards();
219
217
  this.subscribeToQueryParams();
220
218
  this.loadViewPreference();
221
219
  }
222
220
  ngOnDestroy() {
221
+ super.ngOnDestroy();
223
222
  this._destroy$.next();
224
223
  this._destroy$.complete();
225
224
  }
@@ -1076,7 +1075,7 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
1076
1075
  // TODO: Save to User Settings entity
1077
1076
  localStorage.setItem('dashboard-browser-view-mode', mode);
1078
1077
  }
1079
- static ɵfac = function DashboardBrowserResourceComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || DashboardBrowserResourceComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.ActivatedRoute), i0.ɵɵdirectiveInject(i2.NavigationService)); };
1078
+ static ɵfac = function DashboardBrowserResourceComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || DashboardBrowserResourceComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.ActivatedRoute)); };
1080
1079
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DashboardBrowserResourceComponent, selectors: [["mj-dashboard-browser-resource"]], viewQuery: function DashboardBrowserResourceComponent_Query(rf, ctx) { if (rf & 1) {
1081
1080
  i0.ɵɵviewQuery(_c0, 5);
1082
1081
  } if (rf & 2) {
@@ -1092,7 +1091,7 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
1092
1091
  i0.ɵɵconditional(ctx.mode === "list" ? 1 : -1);
1093
1092
  i0.ɵɵadvance();
1094
1093
  i0.ɵɵconditional(ctx.mode === "view" || ctx.mode === "edit" ? 2 : -1);
1095
- } }, dependencies: [i3.DefaultValueAccessor, i3.NgControlStatus, i3.NgModel, i4.DashboardViewerComponent, i4.DashboardBrowserComponent, i4.DashboardBreadcrumbComponent, i4.AddPanelDialogComponent, i4.EditPartDialogComponent, i4.ConfirmDialogComponent, i5.DashboardShareDialogComponent], styles: ["\n\n\n\n\n[_nghost-%COMP%] {\n display: block;\n height: 100%;\n width: 100%;\n}\n\n.dashboard-browser-resource[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n background: var(--mj-bg-surface-card);\n position: relative;\n}\n\n\n\n.dashboard-browser-resource[_ngcontent-%COMP%] mj-dashboard-browser[_ngcontent-%COMP%] {\n display: block;\n height: 100%;\n width: 100%;\n}\n\n\n\n\n\n\n.viewer-toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 24px 0 0;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n gap: 16px;\n}\n\n.viewer-toolbar[_ngcontent-%COMP%] .toolbar-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n\n\n.shared-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-bg-info);\n border-radius: 16px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-brand-primary);\n white-space: nowrap;\n}\n\n.shared-indicator[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n\n\n\n\n\n.viewer-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 24px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n transition: background 0.2s, border-color 0.2s;\n}\n\n\n\n.viewer-header.editing[_ngcontent-%COMP%] {\n background: var(--mj-bg-brand);\n border-bottom: 2px solid var(--mj-brand-primary);\n}\n\n.viewer-header[_ngcontent-%COMP%] .header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n}\n\n.viewer-header[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 18px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.viewer-header[_ngcontent-%COMP%] .header-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.back-btn[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.back-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n\n\n.btn-add-part[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s, transform 0.1s;\n box-shadow: 0 2px 4px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.btn-add-part[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-1px);\n box-shadow: 0 3px 6px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n.btn-add-part[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n.header-separator[_ngcontent-%COMP%] {\n width: 1px;\n height: 28px;\n background: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n margin: 0 4px;\n}\n\n\n\n\n\n\n.btn-primary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n}\n\n.btn-primary[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.btn-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.btn-icon[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.btn-icon.active[_ngcontent-%COMP%] {\n background: var(--mj-bg-info);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n\n\n.btn-cancel[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 14px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.btn-cancel[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n\n\n\n\n\n.dashboard-info-edit[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n flex: 1;\n}\n\n.dashboard-name-input[_ngcontent-%COMP%] {\n border: 1px solid transparent;\n border-radius: 4px;\n padding: 6px 12px;\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-primary);\n background: color-mix(in srgb, var(--mj-bg-surface) 70%, transparent);\n outline: none;\n min-width: 200px;\n max-width: 300px;\n transition: border-color 0.2s, background 0.2s, box-shadow 0.2s;\n}\n\n.dashboard-name-input[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-bg-surface) 90%, transparent);\n}\n\n.dashboard-name-input[_ngcontent-%COMP%]:focus {\n background: var(--mj-bg-surface);\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n}\n\n.dashboard-description-input[_ngcontent-%COMP%] {\n border: 1px solid transparent;\n border-radius: 4px;\n padding: 6px 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n background: color-mix(in srgb, var(--mj-bg-surface) 50%, transparent);\n outline: none;\n flex: 1;\n min-width: 150px;\n max-width: 400px;\n transition: border-color 0.2s, background 0.2s, box-shadow 0.2s;\n}\n\n.dashboard-description-input[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-bg-surface) 80%, transparent);\n}\n\n.dashboard-description-input[_ngcontent-%COMP%]:focus {\n background: var(--mj-bg-surface);\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n}\n\n.dashboard-description-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n font-style: normal;\n}\n\n\n\n\n\n\n.viewer-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n min-height: 0;\n}\n\n.viewer-content[_ngcontent-%COMP%] mj-dashboard-viewer[_ngcontent-%COMP%] {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n\n\n\n\n\n@media (max-width: 768px) {\n .viewer-header[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 12px;\n align-items: stretch;\n }\n\n .viewer-header[_ngcontent-%COMP%] .header-left[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n\n .dashboard-info-edit[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: stretch;\n }\n\n .dashboard-name-input[_ngcontent-%COMP%], \n .dashboard-description-input[_ngcontent-%COMP%] {\n max-width: none;\n }\n}"], changeDetection: 0 });
1094
+ } }, dependencies: [i2.DefaultValueAccessor, i2.NgControlStatus, i2.NgModel, i3.DashboardViewerComponent, i3.DashboardBrowserComponent, i3.DashboardBreadcrumbComponent, i3.AddPanelDialogComponent, i3.EditPartDialogComponent, i3.ConfirmDialogComponent, i4.DashboardShareDialogComponent], styles: ["\n\n\n\n\n[_nghost-%COMP%] {\n display: block;\n height: 100%;\n width: 100%;\n}\n\n.dashboard-browser-resource[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n background: var(--mj-bg-surface-card);\n position: relative;\n}\n\n\n\n.dashboard-browser-resource[_ngcontent-%COMP%] mj-dashboard-browser[_ngcontent-%COMP%] {\n display: block;\n height: 100%;\n width: 100%;\n}\n\n\n\n\n\n\n.viewer-toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 24px 0 0;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n gap: 16px;\n}\n\n.viewer-toolbar[_ngcontent-%COMP%] .toolbar-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n\n\n.shared-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-bg-info);\n border-radius: 16px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-brand-primary);\n white-space: nowrap;\n}\n\n.shared-indicator[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n\n\n\n\n\n.viewer-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 24px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n transition: background 0.2s, border-color 0.2s;\n}\n\n\n\n.viewer-header.editing[_ngcontent-%COMP%] {\n background: var(--mj-bg-brand);\n border-bottom: 2px solid var(--mj-brand-primary);\n}\n\n.viewer-header[_ngcontent-%COMP%] .header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n}\n\n.viewer-header[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 18px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.viewer-header[_ngcontent-%COMP%] .header-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.back-btn[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.back-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n\n\n.btn-add-part[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s, transform 0.1s;\n box-shadow: 0 2px 4px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.btn-add-part[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-1px);\n box-shadow: 0 3px 6px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n.btn-add-part[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n.header-separator[_ngcontent-%COMP%] {\n width: 1px;\n height: 28px;\n background: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n margin: 0 4px;\n}\n\n\n\n\n\n\n.btn-primary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n}\n\n.btn-primary[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.btn-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.btn-icon[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.btn-icon.active[_ngcontent-%COMP%] {\n background: var(--mj-bg-info);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n\n\n.btn-cancel[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 14px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.btn-cancel[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n\n\n\n\n\n.dashboard-info-edit[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n flex: 1;\n}\n\n.dashboard-name-input[_ngcontent-%COMP%] {\n border: 1px solid transparent;\n border-radius: 4px;\n padding: 6px 12px;\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-primary);\n background: color-mix(in srgb, var(--mj-bg-surface) 70%, transparent);\n outline: none;\n min-width: 200px;\n max-width: 300px;\n transition: border-color 0.2s, background 0.2s, box-shadow 0.2s;\n}\n\n.dashboard-name-input[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-bg-surface) 90%, transparent);\n}\n\n.dashboard-name-input[_ngcontent-%COMP%]:focus {\n background: var(--mj-bg-surface);\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n}\n\n.dashboard-description-input[_ngcontent-%COMP%] {\n border: 1px solid transparent;\n border-radius: 4px;\n padding: 6px 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n background: color-mix(in srgb, var(--mj-bg-surface) 50%, transparent);\n outline: none;\n flex: 1;\n min-width: 150px;\n max-width: 400px;\n transition: border-color 0.2s, background 0.2s, box-shadow 0.2s;\n}\n\n.dashboard-description-input[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-bg-surface) 80%, transparent);\n}\n\n.dashboard-description-input[_ngcontent-%COMP%]:focus {\n background: var(--mj-bg-surface);\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n}\n\n.dashboard-description-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n font-style: normal;\n}\n\n\n\n\n\n\n.viewer-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n min-height: 0;\n}\n\n.viewer-content[_ngcontent-%COMP%] mj-dashboard-viewer[_ngcontent-%COMP%] {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n\n\n\n\n\n@media (max-width: 768px) {\n .viewer-header[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 12px;\n align-items: stretch;\n }\n\n .viewer-header[_ngcontent-%COMP%] .header-left[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n\n .dashboard-info-edit[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: stretch;\n }\n\n .dashboard-name-input[_ngcontent-%COMP%], \n .dashboard-description-input[_ngcontent-%COMP%] {\n max-width: none;\n }\n}"], changeDetection: 0 });
1096
1095
  };
1097
1096
  DashboardBrowserResourceComponent = __decorate([
1098
1097
  RegisterClass(BaseResourceComponent, 'DashboardBrowserResource')
@@ -1101,7 +1100,7 @@ export { DashboardBrowserResourceComponent };
1101
1100
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DashboardBrowserResourceComponent, [{
1102
1101
  type: Component,
1103
1102
  args: [{ standalone: false, selector: 'mj-dashboard-browser-resource', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Dashboard Browser Resource -->\n<div class=\"dashboard-browser-resource\">\n <!-- List Mode - Uses Generic DashboardBrowserComponent -->\n @if (mode === 'list') {\n <mj-dashboard-browser\n [Dashboards]=\"dashboards\"\n [Categories]=\"categories\"\n [SelectedCategoryId]=\"selectedCategoryId\"\n [ViewMode]=\"viewMode\"\n [IsLoading]=\"isLoading\"\n [ShowCreateButton]=\"true\"\n [AllowMultiSelect]=\"true\"\n [AllowDragDrop]=\"true\"\n [DashboardPermissions]=\"dashboardPermissionsMap\"\n [EffectiveCategoryMap]=\"effectiveCategoryMap\"\n (DashboardOpen)=\"onDashboardOpen($event)\"\n (DashboardEdit)=\"onDashboardEdit($event)\"\n (DashboardDelete)=\"onDashboardDelete($event)\"\n (DashboardMove)=\"onDashboardMove($event)\"\n (DashboardCreate)=\"onDashboardCreate($event)\"\n (CategoryCreate)=\"onCategoryCreate($event)\"\n (CategoryDelete)=\"onCategoryDelete($event)\"\n (CategoryChange)=\"onCategoryChange($event)\"\n (ViewPreferenceChange)=\"onViewPreferenceChange($event)\">\n </mj-dashboard-browser>\n }\n\n <!-- View/Edit Mode -->\n @if (mode === 'view' || mode === 'edit') {\n <!-- View Mode Toolbar - matches browser toolbar structure -->\n @if (mode === 'view') {\n <div class=\"viewer-toolbar\">\n <!-- Breadcrumb navigation (includes its own padding/styling) -->\n <mj-dashboard-breadcrumb\n [Categories]=\"categories\"\n [CurrentCategoryId]=\"selectedDashboard?.CategoryID || null\"\n [CurrentDashboard]=\"selectedDashboard\"\n [ShowDashboardName]=\"true\"\n [AllowDragDrop]=\"false\"\n Size=\"large\"\n RootIcon=\"fa-solid fa-gauge-high\"\n RootLabel=\"Dashboards\"\n (Navigate)=\"onBreadcrumbNavigate($event)\">\n </mj-dashboard-breadcrumb>\n <!-- Right-side Actions -->\n <div class=\"toolbar-actions\">\n <!-- Shared indicator for non-owned dashboards -->\n @if (!selectedDashboardPermissions.IsOwner && selectedDashboardPermissions.CanRead) {\n <span class=\"shared-indicator\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n Shared with you\n </span>\n }\n <button\n class=\"btn-icon\"\n title=\"Open in its own tab\"\n (click)=\"openInNewTab()\">\n <i class=\"fa-solid fa-up-right-from-square\"></i>\n </button>\n <!-- Share button - only shown if user can share -->\n @if (selectedDashboardPermissions.CanShare) {\n <button\n class=\"btn-icon\"\n title=\"Share Dashboard\"\n (click)=\"openShareDialog()\">\n <i class=\"fa-solid fa-user-plus\"></i>\n </button>\n }\n <!-- Edit button - only shown if user can edit -->\n @if (selectedDashboardPermissions.CanEdit) {\n <button\n class=\"btn-icon\"\n title=\"Edit Dashboard\"\n (click)=\"toggleEditMode()\">\n <i class=\"fa-solid fa-edit\"></i>\n </button>\n }\n </div>\n </div>\n }\n <!-- Edit Mode Header - different layout -->\n @if (mode === 'edit') {\n <div class=\"viewer-header editing\">\n <div class=\"header-left\">\n <!-- Add Part button on the left -->\n <button\n class=\"btn-add-part\"\n (click)=\"openAddPartDialog()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Part\n </button>\n <!-- Separator -->\n <div class=\"header-separator\"></div>\n <!-- Editable name/description -->\n <div class=\"dashboard-info-edit\">\n <input\n type=\"text\"\n class=\"dashboard-name-input\"\n [(ngModel)]=\"editingName\"\n placeholder=\"Dashboard name\"\n (blur)=\"onNameBlur()\">\n <input\n type=\"text\"\n class=\"dashboard-description-input\"\n [(ngModel)]=\"editingDescription\"\n placeholder=\"Add a description...\">\n </div>\n </div>\n <div class=\"header-right\">\n <!-- Save, Cancel buttons -->\n <button\n class=\"btn-primary\"\n (click)=\"saveDashboard()\">\n <i class=\"fa-solid fa-save\"></i>\n Save\n </button>\n <button\n class=\"btn-cancel\"\n (click)=\"cancelEdit()\">\n Cancel\n </button>\n </div>\n </div>\n }\n <!-- Dashboard Viewer -->\n <div class=\"viewer-content\">\n <mj-dashboard-viewer\n #dashboardViewer\n [dashboard]=\"selectedDashboard\"\n [isEditing]=\"mode === 'edit'\"\n [showToolbar]=\"false\"\n [showBreadcrumb]=\"false\"\n (panelInteraction)=\"onPanelInteraction($event)\"\n (navigationRequested)=\"onNavigationRequested($event)\">\n </mj-dashboard-viewer>\n </div>\n <!-- Add Panel Dialog -->\n @if (dashboardViewer) {\n <mj-add-panel-dialog\n [visible]=\"showAddPanelDialog\"\n [partTypes]=\"dashboardViewer.getPartTypes()\"\n (panelAdded)=\"onPanelAdded($event)\"\n (cancelled)=\"onAddPanelCancelled()\">\n </mj-add-panel-dialog>\n }\n <!-- Generic Edit Part Dialog - dynamically loads config panels via ClassFactory -->\n <mj-edit-part-dialog\n [Visible]=\"showConfigDialog\"\n [PartType]=\"configDialogPartType\"\n [Panel]=\"configDialogPanel\"\n [Config]=\"configDialogPanel?.config || null\"\n (Saved)=\"onConfigDialogSaved($event)\"\n (Cancelled)=\"onConfigDialogCancelled()\">\n </mj-edit-part-dialog>\n <!-- Remove Part Confirmation Dialog -->\n <mj-confirm-dialog\n [visible]=\"showConfirmDialog\"\n type=\"danger\"\n title=\"Remove Part\"\n [message]=\"'Are you sure you want to remove \\'' + confirmPanelTitle + '\\' from this dashboard?'\"\n confirmText=\"Remove\"\n cancelText=\"Cancel\"\n (confirmed)=\"onRemoveConfirmed()\"\n (cancelled)=\"onRemoveCancelled()\">\n </mj-confirm-dialog>\n <!-- Share Dashboard Dialog -->\n <mj-dashboard-share-dialog\n [Visible]=\"showShareDialog\"\n [Dashboard]=\"selectedDashboard\"\n (Result)=\"onShareDialogResult($event)\">\n </mj-dashboard-share-dialog>\n }\n</div>\n", styles: ["/* Dashboard Browser Resource Styles */\n/* This is a thin wrapper - list mode styles are in the generic DashboardBrowserComponent */\n\n:host {\n display: block;\n height: 100%;\n width: 100%;\n}\n\n.dashboard-browser-resource {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n background: var(--mj-bg-surface-card);\n position: relative;\n}\n\n/* Generic browser fills the container in list mode */\n.dashboard-browser-resource mj-dashboard-browser {\n display: block;\n height: 100%;\n width: 100%;\n}\n\n/* ========================================\n Viewer Toolbar (View Mode) - Matches Browser Toolbar\n ======================================== */\n\n.viewer-toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 24px 0 0;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n gap: 16px;\n}\n\n.viewer-toolbar .toolbar-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n/* Shared with you indicator */\n.shared-indicator {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-bg-info);\n border-radius: 16px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-brand-primary);\n white-space: nowrap;\n}\n\n.shared-indicator i {\n font-size: 11px;\n}\n\n/* ========================================\n Viewer Header (Edit Mode)\n ======================================== */\n\n.viewer-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 24px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n transition: background 0.2s, border-color 0.2s;\n}\n\n/* Edit mode header styling */\n.viewer-header.editing {\n background: var(--mj-bg-brand);\n border-bottom: 2px solid var(--mj-brand-primary);\n}\n\n.viewer-header .header-left {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n}\n\n.viewer-header h2 {\n margin: 0;\n font-size: 18px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.viewer-header .header-right {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.back-btn {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.back-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n/* Add Part button (left side in edit mode) */\n.btn-add-part {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s, transform 0.1s;\n box-shadow: 0 2px 4px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.btn-add-part:hover {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-1px);\n box-shadow: 0 3px 6px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n.btn-add-part i {\n font-size: 12px;\n}\n\n/* Header separator */\n.header-separator {\n width: 1px;\n height: 28px;\n background: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n margin: 0 4px;\n}\n\n/* ========================================\n Buttons\n ======================================== */\n\n.btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n}\n\n.btn-primary:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.btn-icon {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.btn-icon:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.btn-icon.active {\n background: var(--mj-bg-info);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n/* Cancel button styling */\n.btn-cancel {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 14px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.btn-cancel:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n/* ========================================\n Dashboard Info Edit (Edit Mode)\n ======================================== */\n\n.dashboard-info-edit {\n display: flex;\n align-items: center;\n gap: 16px;\n flex: 1;\n}\n\n.dashboard-name-input {\n border: 1px solid transparent;\n border-radius: 4px;\n padding: 6px 12px;\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-primary);\n background: color-mix(in srgb, var(--mj-bg-surface) 70%, transparent);\n outline: none;\n min-width: 200px;\n max-width: 300px;\n transition: border-color 0.2s, background 0.2s, box-shadow 0.2s;\n}\n\n.dashboard-name-input:hover {\n background: color-mix(in srgb, var(--mj-bg-surface) 90%, transparent);\n}\n\n.dashboard-name-input:focus {\n background: var(--mj-bg-surface);\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n}\n\n.dashboard-description-input {\n border: 1px solid transparent;\n border-radius: 4px;\n padding: 6px 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n background: color-mix(in srgb, var(--mj-bg-surface) 50%, transparent);\n outline: none;\n flex: 1;\n min-width: 150px;\n max-width: 400px;\n transition: border-color 0.2s, background 0.2s, box-shadow 0.2s;\n}\n\n.dashboard-description-input:hover {\n background: color-mix(in srgb, var(--mj-bg-surface) 80%, transparent);\n}\n\n.dashboard-description-input:focus {\n background: var(--mj-bg-surface);\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n}\n\n.dashboard-description-input::placeholder {\n color: var(--mj-text-disabled);\n font-style: normal;\n}\n\n/* ========================================\n Viewer Content\n ======================================== */\n\n.viewer-content {\n flex: 1;\n overflow: hidden;\n min-height: 0;\n}\n\n.viewer-content mj-dashboard-viewer {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n/* ========================================\n Responsive\n ======================================== */\n\n@media (max-width: 768px) {\n .viewer-header {\n flex-direction: column;\n gap: 12px;\n align-items: stretch;\n }\n\n .viewer-header .header-left {\n flex-wrap: wrap;\n }\n\n .dashboard-info-edit {\n flex-direction: column;\n align-items: stretch;\n }\n\n .dashboard-name-input,\n .dashboard-description-input {\n max-width: none;\n }\n}\n"] }]
1104
- }], () => [{ type: i0.ChangeDetectorRef }, { type: i1.ActivatedRoute }, { type: i2.NavigationService }], { dashboardViewer: [{
1103
+ }], () => [{ type: i0.ChangeDetectorRef }, { type: i1.ActivatedRoute }], { dashboardViewer: [{
1105
1104
  type: ViewChild,
1106
1105
  args: ['dashboardViewer']
1107
1106
  }] }); })();
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-browser-resource.component.js","sourceRoot":"","sources":["../../src/DashboardBrowser/dashboard-browser-resource.component.ts","../../src/DashboardBrowser/dashboard-browser-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, ViewChild } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { Metadata, CompositeKey } from '@memberjunction/core';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { ResourceData, MJDashboardEntity, MJDashboardCategoryEntity, MJDashboardPartTypeEntity, DashboardEngine, DashboardUserPermissions, MJDashboardCategoryLinkEntity } from '@memberjunction/core-entities';\nimport { ShareDialogResult } from './dashboard-share-dialog.component';\nimport {\n DashboardViewerComponent,\n DashboardNavRequestEvent,\n PanelInteractionEvent,\n AddPanelResult,\n createDefaultDashboardConfig,\n DashboardPanel,\n EditPartDialogResult,\n // Browser event types from generic component\n DashboardOpenEvent,\n DashboardEditEvent,\n DashboardDeleteEvent,\n DashboardMoveEvent,\n DashboardCreateEvent,\n CategoryCreateEvent,\n CategoryDeleteEvent,\n CategoryChangeEvent,\n ViewPreferenceChangeEvent,\n DashboardBrowserViewMode,\n BreadcrumbNavigateEvent\n} from '@memberjunction/ng-dashboard-viewer';\n/**\n * Mode for the dashboard browser\n */\ntype BrowserMode = 'list' | 'view' | 'edit';\n\n/**\n * Resource component for browsing, creating, and editing dashboards.\n * Uses the generic DashboardBrowserComponent for list mode and handles\n * view/edit mode internally with routing integration.\n */\n@RegisterClass(BaseResourceComponent, 'DashboardBrowserResource')\n@Component({\n standalone: false,\n selector: 'mj-dashboard-browser-resource',\n templateUrl: './dashboard-browser-resource.component.html',\n styleUrls: ['./dashboard-browser-resource.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DashboardBrowserResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n // ========================================\n // State\n // ========================================\n\n public mode: BrowserMode = 'list';\n public isLoading = false;\n public dashboards: MJDashboardEntity[] = [];\n public categories: MJDashboardCategoryEntity[] = [];\n public selectedDashboard: MJDashboardEntity | null = null;\n public selectedCategoryId: string | null = null;\n public viewMode: DashboardBrowserViewMode = 'cards';\n public showAddPanelDialog = false;\n\n // Config dialog state\n public showConfigDialog = false;\n public configDialogPanel: DashboardPanel | null = null;\n public configDialogPartType: MJDashboardPartTypeEntity | null = null;\n public configDialogClass: string = '';\n\n // Confirm dialog state\n public showConfirmDialog = false;\n public confirmPanelId: string = '';\n public confirmPanelTitle: string = '';\n\n // Share dialog state\n public showShareDialog = false;\n\n // Edit mode state for name/description\n public editingName = '';\n public editingDescription = '';\n private originalName = '';\n private originalDescription = '';\n private originalConfig = '';\n\n // Permission state for selected dashboard\n public selectedDashboardPermissions: DashboardUserPermissions = {\n DashboardID: '',\n CanRead: true,\n CanEdit: true,\n CanDelete: true,\n CanShare: true,\n IsOwner: true,\n PermissionSource: 'owner'\n };\n\n // Permission map for all dashboards (used by browser component)\n public dashboardPermissionsMap: Map<string, DashboardUserPermissions> = new Map();\n\n // Effective category map for shared dashboards (maps dashboard ID to effective category for display)\n public effectiveCategoryMap: Map<string, string | null> = new Map();\n\n private readonly _destroy$ = new Subject<void>();\n\n @ViewChild('dashboardViewer') dashboardViewer!: DashboardViewerComponent;\n\n // ========================================\n // Constructor\n // ========================================\n\n constructor(\n private cdr: ChangeDetectorRef,\n private route: ActivatedRoute,\n private navigationService: NavigationService\n ) {\n super();\n }\n\n // ========================================\n // Lifecycle\n // ========================================\n\n ngOnInit(): void {\n this.loadDashboards();\n this.subscribeToQueryParams();\n this.loadViewPreference();\n }\n\n ngOnDestroy(): void {\n this._destroy$.next();\n this._destroy$.complete();\n }\n\n // ========================================\n // BaseResourceComponent Implementation\n // ========================================\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Dashboards';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-gauge-high';\n }\n\n // ========================================\n // Event Handlers from Generic Browser\n // ========================================\n\n /**\n * Handle dashboard open request from generic browser\n */\n public onDashboardOpen(event: DashboardOpenEvent): void {\n if (event.OpenInNewTab) {\n // Open in a dedicated Explorer tab via NavigationService\n this.navigationService.OpenDashboard(\n event.Dashboard.ID,\n event.Dashboard.Name,\n { forceNewTab: true }\n );\n } else {\n // Open inline in the browser's view pane\n this.openDashboard(event.Dashboard);\n }\n }\n\n /**\n * Open the current dashboard in its own dedicated Explorer tab\n */\n public openInNewTab(): void {\n if (this.selectedDashboard) {\n this.navigationService.OpenDashboard(\n this.selectedDashboard.ID,\n this.selectedDashboard.Name,\n { forceNewTab: true }\n );\n }\n }\n\n /**\n * Handle dashboard edit request from generic browser\n */\n public onDashboardEdit(event: DashboardEditEvent): void {\n this.editDashboard(event.Dashboard);\n }\n\n /**\n * Handle dashboard delete request from generic browser\n */\n public async onDashboardDelete(event: DashboardDeleteEvent): Promise<void> {\n // The generic browser handles the confirmation dialog\n // We just need to perform the actual deletion\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n for (const dashboard of event.Dashboards) {\n const deleted = await dashboard.Delete();\n if (deleted) {\n const index = this.dashboards.findIndex(d => UUIDsEqual(d.ID, dashboard.ID));\n if (index >= 0) {\n this.dashboards.splice(index, 1);\n }\n }\n }\n\n // Create new array reference to trigger change detection\n this.dashboards = [...this.dashboards];\n } catch (err) {\n console.error('Failed to delete dashboards:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handle dashboard move request from generic browser.\n * For owned dashboards: updates the dashboard's CategoryID directly.\n * For shared dashboards: creates/updates a DashboardCategoryLink to organize without modifying the original.\n */\n public async onDashboardMove(event: DashboardMoveEvent): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const md = new Metadata();\n const currentUserId = md.CurrentUser.ID;\n\n for (const dashboard of event.Dashboards) {\n const permissions = DashboardEngine.Instance.GetDashboardPermissions(dashboard.ID, currentUserId);\n\n if (permissions.IsOwner) {\n // Owner can modify the dashboard directly\n dashboard.CategoryID = event.TargetCategoryId;\n await dashboard.Save();\n } else {\n // Non-owner: create or update a category link instead\n await this.createOrUpdateCategoryLink(dashboard.ID, currentUserId, event.TargetCategoryId);\n\n // Update the effective category map immediately for UI refresh\n this.effectiveCategoryMap.set(dashboard.ID, event.TargetCategoryId);\n }\n }\n\n // Create new map reference to trigger change detection\n this.effectiveCategoryMap = new Map(this.effectiveCategoryMap);\n\n // Refresh the list\n this.dashboards = [...this.dashboards];\n\n // Navigate to the target category to follow the moved items\n this.selectedCategoryId = event.TargetCategoryId;\n this.updateUrlQueryParams();\n } catch (err) {\n console.error('Failed to move dashboards:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Creates or updates a DashboardCategoryLink for organizing a shared dashboard.\n * Ensures only one link exists per user/dashboard combination.\n * @param dashboardId - The ID of the shared dashboard\n * @param userId - The current user's ID\n * @param categoryId - The target category ID (null for root/uncategorized)\n */\n private async createOrUpdateCategoryLink(\n dashboardId: string,\n userId: string,\n categoryId: string | null\n ): Promise<void> {\n const md = new Metadata();\n\n // Check if a link already exists for this user/dashboard\n const existingLinks = DashboardEngine.Instance.DashboardCategoryLinks.filter(\n link => UUIDsEqual(link.DashboardID, dashboardId) && UUIDsEqual(link.UserID, userId)\n );\n\n let link: MJDashboardCategoryLinkEntity;\n\n if (existingLinks.length > 0) {\n // Update existing link\n link = existingLinks[0];\n link.DashboardCategoryID = categoryId;\n } else {\n // Create new link\n link = await md.GetEntityObject<MJDashboardCategoryLinkEntity>('MJ: Dashboard Category Links');\n link.DashboardID = dashboardId;\n link.UserID = userId;\n link.DashboardCategoryID = categoryId;\n }\n\n const saved = await link.Save();\n if (!saved) {\n console.error('Failed to save dashboard category link:', link.LatestResult);\n }\n }\n\n /**\n * Handle create dashboard request from generic browser\n */\n public async onDashboardCreate(event: DashboardCreateEvent): Promise<void> {\n await this.createDashboard(event.CategoryId);\n }\n\n /**\n * Handle category change from generic browser - update URL\n */\n public onCategoryChange(event: CategoryChangeEvent): void {\n this.selectedCategoryId = event.CategoryId;\n this.updateUrlQueryParams();\n }\n\n /**\n * Handle view preference change from generic browser - persist\n */\n public onViewPreferenceChange(event: ViewPreferenceChangeEvent): void {\n this.viewMode = event.ViewMode;\n this.saveViewPreference(event.ViewMode);\n }\n\n /**\n * Handle category create request from generic browser\n * Includes extensive logging for debugging category creation issues\n */\n public async onCategoryCreate(event: CategoryCreateEvent): Promise<void> {\n console.debug('[DashboardBrowserResource] Category create requested:', {\n name: event.Name,\n parentCategoryId: event.ParentCategoryId\n });\n\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const md = new Metadata();\n console.debug('[DashboardBrowserResource] Current user:', {\n userId: md.CurrentUser?.ID,\n userName: md.CurrentUser?.Name,\n email: md.CurrentUser?.Email\n });\n\n const category = await md.GetEntityObject<MJDashboardCategoryEntity>('MJ: Dashboard Categories');\n console.debug('[DashboardBrowserResource] Created category entity object');\n\n // Set required fields\n category.Name = event.Name;\n category.UserID = md.CurrentUser.ID;\n\n if (event.ParentCategoryId) {\n category.ParentID = event.ParentCategoryId;\n }\n\n console.debug('[DashboardBrowserResource] Category fields before save:', {\n name: category.Name,\n userId: category.UserID,\n parentId: category.ParentID,\n allFields: category.Fields.map(f => ({ name: f.Name, value: f.Value, dirty: f.Dirty }))\n });\n\n const saved = await category.Save();\n\n console.debug('[DashboardBrowserResource] Save result:', {\n success: saved,\n latestResult: category.LatestResult,\n message: category.LatestResult?.Message,\n success2: category.LatestResult?.Success,\n id: category.ID\n });\n\n if (saved) {\n console.debug('[DashboardBrowserResource] Category saved successfully, ID:', category.ID);\n // Add to local array - engine will self-update\n this.categories.push(category);\n this.categories = [...this.categories].sort((a, b) => a.Name.localeCompare(b.Name));\n } else {\n const errorMessage = category.LatestResult?.Message || 'Unknown error saving category';\n console.error('[DashboardBrowserResource] Failed to save category:', errorMessage);\n console.error('[DashboardBrowserResource] Full LatestResult:', JSON.stringify(category.LatestResult, null, 2));\n\n // Show toast or alert for user\n alert(`Failed to create category: ${errorMessage}`);\n }\n } catch (err) {\n console.error('[DashboardBrowserResource] Exception creating category:', err);\n alert(`Error creating category: ${err instanceof Error ? err.message : String(err)}`);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handle category delete request from generic browser\n * Performs recursive deletion of category and all children\n */\n public async onCategoryDelete(event: CategoryDeleteEvent): Promise<void> {\n console.debug('[DashboardBrowserResource] Category delete requested:', event.Category.Name);\n\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n // Get all child categories recursively\n const categoriesToDelete = this.getChildCategoriesRecursive(event.Category.ID);\n categoriesToDelete.push(event.Category);\n\n console.debug('[DashboardBrowserResource] Deleting categories:', categoriesToDelete.map(c => c.Name));\n\n // Delete in reverse order (children first)\n for (const cat of categoriesToDelete.reverse()) {\n // First, move any dashboards in this category to uncategorized\n const dashboardsInCategory = this.dashboards.filter(d => UUIDsEqual(d.CategoryID, cat.ID));\n for (const dashboard of dashboardsInCategory) {\n dashboard.CategoryID = null!;\n await dashboard.Save();\n }\n\n // Then delete the category\n const deleted = await cat.Delete();\n if (deleted) {\n const index = this.categories.findIndex(c => UUIDsEqual(c.ID, cat.ID));\n if (index >= 0) {\n this.categories.splice(index, 1);\n }\n } else {\n console.error('[DashboardBrowserResource] Failed to delete category:', cat.Name, cat.LatestResult);\n }\n }\n\n // Refresh arrays\n this.categories = [...this.categories];\n this.dashboards = [...this.dashboards];\n } catch (err) {\n console.error('[DashboardBrowserResource] Exception deleting category:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handle breadcrumb navigation event\n * Navigates back to list view with optional category selection\n */\n public onBreadcrumbNavigate(event: BreadcrumbNavigateEvent): void {\n console.debug('[DashboardBrowserResource] Breadcrumb navigate:', event);\n\n // CategoryId is null for root, or a category ID string\n this.selectedCategoryId = event.CategoryId;\n this.backToList();\n this.updateUrlQueryParams();\n }\n\n // ========================================\n // Public Methods - Navigation\n // ========================================\n\n /**\n * Open a dashboard for viewing\n */\n public openDashboard(dashboard: MJDashboardEntity): void {\n this.selectedDashboard = dashboard;\n this.mode = 'view';\n\n // Compute permissions for the selected dashboard\n const md = new Metadata();\n this.selectedDashboardPermissions = DashboardEngine.Instance.GetDashboardPermissions(\n dashboard.ID,\n md.CurrentUser.ID\n );\n\n this.updateUrlQueryParams();\n this.NotifyDisplayNameChanged(dashboard.Name || 'Dashboard');\n this.cdr.detectChanges();\n }\n\n /**\n * Open a dashboard for editing\n */\n public editDashboard(dashboard: MJDashboardEntity): void {\n // Check if user has edit permission\n const md = new Metadata();\n const permissions = DashboardEngine.Instance.GetDashboardPermissions(\n dashboard.ID,\n md.CurrentUser.ID\n );\n\n if (!permissions.CanEdit) {\n console.warn('User does not have permission to edit this dashboard');\n return;\n }\n\n this.selectedDashboard = dashboard;\n this.selectedDashboardPermissions = permissions;\n this.mode = 'edit';\n\n // Initialize editing fields\n this.editingName = dashboard.Name;\n this.editingDescription = dashboard.Description || '';\n\n // Store originals for cancel\n this.originalName = dashboard.Name;\n this.originalDescription = dashboard.Description || '';\n this.originalConfig = dashboard.UIConfigDetails || '';\n\n this.cdr.detectChanges();\n }\n\n /**\n * Go back to list view\n */\n public backToList(): void {\n this.selectedDashboard = null;\n this.mode = 'list';\n this.updateUrlQueryParams();\n this.NotifyDisplayNameChanged('Dashboards');\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle edit mode for current dashboard\n */\n public toggleEditMode(): void {\n if (this.mode === 'view' && this.selectedDashboard) {\n this.editDashboard(this.selectedDashboard);\n } else if (this.mode === 'edit') {\n this.mode = 'view';\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Open the share dialog for the current dashboard\n */\n public openShareDialog(): void {\n if (!this.selectedDashboard) return;\n\n // Verify user has share permission\n if (!this.selectedDashboardPermissions.CanShare) {\n console.warn('User does not have permission to share this dashboard');\n return;\n }\n\n this.showShareDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Close the share dialog\n */\n public closeShareDialog(): void {\n this.showShareDialog = false;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle share dialog result\n */\n public onShareDialogResult(result: ShareDialogResult): void {\n this.showShareDialog = false;\n\n if (result.Action === 'save' && this.selectedDashboard) {\n // Recompute permissions after sharing changes\n const md = new Metadata();\n this.selectedDashboardPermissions = DashboardEngine.Instance.GetDashboardPermissions(\n this.selectedDashboard.ID,\n md.CurrentUser.ID\n );\n }\n\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Public Methods - Dashboard CRUD\n // ========================================\n\n /**\n * Create a new dashboard\n */\n public async createDashboard(categoryId?: string | null): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const md = new Metadata();\n const dashboard = await md.GetEntityObject<MJDashboardEntity>('MJ: Dashboards');\n\n dashboard.Name = 'New Dashboard';\n dashboard.Description = '';\n dashboard.UserID = md.CurrentUser.ID;\n dashboard.UIConfigDetails = JSON.stringify(createDefaultDashboardConfig());\n\n if (categoryId) {\n dashboard.CategoryID = categoryId;\n } else if (this.selectedCategoryId) {\n dashboard.CategoryID = this.selectedCategoryId;\n }\n\n const saved = await dashboard.Save();\n\n if (saved) {\n this.dashboards.unshift(dashboard);\n this.dashboards = [...this.dashboards];\n this.editDashboard(dashboard);\n } else {\n console.error('Failed to save dashboard:', dashboard.LatestResult);\n }\n } catch (err) {\n console.error('Failed to create dashboard:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Save the current dashboard\n */\n public async saveDashboard(): Promise<void> {\n if (!this.selectedDashboard) return;\n\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n this.selectedDashboard.Name = this.editingName;\n this.selectedDashboard.Description = this.editingDescription;\n\n if (this.dashboardViewer) {\n await this.dashboardViewer.save();\n }\n\n this.originalName = this.editingName;\n this.originalDescription = this.editingDescription;\n this.originalConfig = this.selectedDashboard.UIConfigDetails || '';\n\n // Update the dashboard in the list\n this.dashboards = [...this.dashboards];\n\n this.mode = 'view';\n } catch (err) {\n console.error('Failed to save dashboard:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Cancel editing and revert changes\n */\n public cancelEdit(): void {\n if (!this.selectedDashboard) {\n this.backToList();\n return;\n }\n\n this.selectedDashboard.Name = this.originalName;\n this.selectedDashboard.Description = this.originalDescription;\n this.selectedDashboard.UIConfigDetails = this.originalConfig;\n\n this.editingName = '';\n this.editingDescription = '';\n\n this.mode = 'view';\n this.cdr.detectChanges();\n }\n\n /**\n * Handle name input blur - validate name is not empty\n */\n public onNameBlur(): void {\n if (!this.editingName.trim()) {\n this.editingName = this.originalName || 'Untitled Dashboard';\n }\n }\n\n // ========================================\n // Public Methods - Part Management\n // ========================================\n\n /**\n * Open the Add Part dialog\n */\n public openAddPartDialog(): void {\n this.showAddPanelDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle panel interaction events from the viewer\n */\n public onPanelInteraction(event: PanelInteractionEvent): void {\n if (event.interactionType !== 'custom') return;\n\n const action = event.payload?.['action'];\n\n switch (action) {\n case 'add-panel-requested':\n this.openAddPartDialog();\n break;\n\n case 'configure-part-requested':\n this.openConfigDialog(event.panelId);\n break;\n\n case 'remove-part-requested':\n this.openRemoveConfirmDialog(\n event.panelId,\n event.payload?.['panelTitle'] as string || 'this part'\n );\n break;\n }\n }\n\n /**\n * Handle navigation events from panels\n */\n public onNavigationRequested(event: DashboardNavRequestEvent): void {\n const request = event.request;\n const openInNewTab = request.openInNewTab || false;\n\n switch (request.type) {\n case 'OpenEntityRecord': {\n // Navigate to entity record\n const compositeKey = new CompositeKey();\n compositeKey.SimpleLoadFromURLSegment(request.recordId);\n // If simple load didn't work (single ID without field name), look up actual PK field\n if (compositeKey.KeyValuePairs.length === 0) {\n const md = new Metadata();\n const entity = md.Entities.find(e => e.Name === request.entityName);\n const pkFieldName = entity?.FirstPrimaryKey?.Name || 'ID';\n compositeKey.LoadFromSingleKeyValuePair(pkFieldName, request.recordId);\n }\n this.navigationService.OpenEntityRecord(\n request.entityName,\n compositeKey,\n { forceNewTab: openInNewTab }\n );\n break;\n }\n case 'OpenDashboard': {\n // Navigate to another dashboard\n const targetDashboard = this.dashboards.find(d => UUIDsEqual(d.ID, request.dashboardId));\n if (targetDashboard) {\n if (openInNewTab) {\n this.navigationService.OpenDashboard(\n targetDashboard.ID,\n targetDashboard.Name,\n { forceNewTab: true }\n );\n } else {\n this.openDashboard(targetDashboard);\n }\n }\n break;\n }\n case 'OpenQuery': {\n // Navigate to query viewer\n const md = new Metadata();\n const queryInfo = md.Queries.find(q => UUIDsEqual(q.ID, request.queryId));\n if (queryInfo) {\n this.navigationService.OpenQuery(\n request.queryId,\n queryInfo.Name,\n { forceNewTab: openInNewTab }\n );\n }\n break;\n }\n case 'OpenNavItem': {\n // Navigate to a specific nav item within an application\n const appId = request.appName ? this.resolveAppId(request.appName) : undefined;\n this.navigationService.OpenNavItemByName(request.navItemName, undefined, appId, {\n queryParams: request.queryParams\n });\n break;\n }\n }\n }\n\n /**\n * Resolve an application name to its ID\n */\n private resolveAppId(appName: string): string | undefined {\n const md = new Metadata();\n const app = md.Applications.find(a => a.Name.toLowerCase() === appName.toLowerCase());\n return app?.ID;\n }\n\n /**\n * Handle add panel dialog result\n */\n public onPanelAdded(result: AddPanelResult): void {\n if (this.dashboardViewer) {\n this.dashboardViewer.addPanel(\n result.PartType.ID,\n result.Config,\n result.Title,\n result.Icon\n );\n }\n this.showAddPanelDialog = false;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle add panel dialog cancel\n */\n public onAddPanelCancelled(): void {\n this.showAddPanelDialog = false;\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Public Methods - Config Dialog\n // ========================================\n\n /**\n * Open the config dialog for a panel\n */\n public openConfigDialog(panelId: string): void {\n if (!this.dashboardViewer) return;\n\n const panel = this.dashboardViewer.getPanel(panelId);\n const partType = this.dashboardViewer.getPartTypeForPanel(panelId);\n\n if (!panel || !partType) {\n console.warn('Could not find panel or part type for config dialog');\n return;\n }\n\n this.configDialogPanel = panel;\n this.configDialogPartType = partType;\n this.configDialogClass = partType.ConfigDialogClass || '';\n this.showConfigDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle config dialog save\n */\n public onConfigDialogSaved(result: EditPartDialogResult): void {\n if (this.dashboardViewer && this.configDialogPanel) {\n this.dashboardViewer.updatePanelConfig(\n this.configDialogPanel.id,\n result.Config,\n result.Title,\n result.Icon\n );\n }\n this.closeConfigDialog();\n }\n\n /**\n * Handle config dialog cancel\n */\n public onConfigDialogCancelled(): void {\n this.closeConfigDialog();\n }\n\n /**\n * Close the config dialog\n */\n private closeConfigDialog(): void {\n this.showConfigDialog = false;\n this.configDialogPanel = null;\n this.configDialogPartType = null;\n this.configDialogClass = '';\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Public Methods - Remove Confirm Dialog\n // ========================================\n\n /**\n * Open the remove confirmation dialog\n */\n public openRemoveConfirmDialog(panelId: string, panelTitle: string): void {\n this.confirmPanelId = panelId;\n this.confirmPanelTitle = panelTitle;\n this.showConfirmDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle remove confirmation\n */\n public onRemoveConfirmed(): void {\n if (this.dashboardViewer && this.confirmPanelId) {\n this.dashboardViewer.confirmRemovePanel(this.confirmPanelId);\n }\n this.closeRemoveConfirmDialog();\n }\n\n /**\n * Handle remove cancel\n */\n public onRemoveCancelled(): void {\n this.closeRemoveConfirmDialog();\n }\n\n /**\n * Close the remove confirm dialog\n */\n private closeRemoveConfirmDialog(): void {\n this.showConfirmDialog = false;\n this.confirmPanelId = '';\n this.confirmPanelTitle = '';\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Private Methods - Data Loading\n // ========================================\n\n private async loadDashboards(): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n // Use DashboardEngine for consistent cached data\n const engine = DashboardEngine.Instance;\n await engine.Config(false); // Wait for engine to load data\n\n const md = new Metadata();\n const currentUserId = md.CurrentUser.ID;\n\n // Get data from engine - sort dashboards by updated date, categories by name\n // Filter dashboards to only those accessible to the current user\n this.dashboards = [...engine.GetAccessibleDashboards(currentUserId)].sort((a, b) =>\n new Date(b.__mj_UpdatedAt).getTime() - new Date(a.__mj_UpdatedAt).getTime()\n );\n // Filter categories to only those owned by or shared with the current user\n this.categories = [...engine.GetAccessibleCategories(currentUserId)].sort((a, b) =>\n a.Name.localeCompare(b.Name)\n );\n\n // Build permissions map and effective category map for all dashboards\n this.dashboardPermissionsMap = new Map();\n this.effectiveCategoryMap = new Map();\n\n // Get category links for current user (from engine's cached data)\n const userCategoryLinks = engine.DashboardCategoryLinks.filter(\n link => UUIDsEqual(link.UserID, currentUserId)\n );\n\n for (const dashboard of this.dashboards) {\n const perms = engine.GetDashboardPermissions(dashboard.ID, currentUserId);\n this.dashboardPermissionsMap.set(dashboard.ID, perms);\n\n // For shared dashboards (not owned), determine effective category\n if (!perms.IsOwner) {\n // Look for a category link for this dashboard\n const categoryLink = userCategoryLinks.find(\n link => UUIDsEqual(link.DashboardID, dashboard.ID)\n );\n\n if (categoryLink) {\n // User has explicitly organized this shared dashboard\n this.effectiveCategoryMap.set(dashboard.ID, categoryLink.DashboardCategoryID);\n } else {\n // No link exists - show in root (null category)\n this.effectiveCategoryMap.set(dashboard.ID, null);\n }\n }\n // For owned dashboards, we don't add to effectiveCategoryMap\n // so the browser will use the dashboard's actual CategoryID\n }\n\n console.debug('[DashboardBrowserResource] Loaded from DashboardEngine:', {\n dashboardCount: this.dashboards.length,\n categoryCount: this.categories.length,\n sharedDashboardsInEffectiveMap: this.effectiveCategoryMap.size,\n categories: this.categories.map(c => ({ id: c.ID, name: c.Name, parentId: c.ParentID }))\n });\n\n // After dashboards are loaded, check for deep-link from configuration\n // (e.g., pin navigation passes dashboard ID via queryParams in config)\n this.applyConfigurationState();\n\n // Also watch for late-arriving query params from pin navigation\n this.watchForLateQueryParams();\n\n this.NotifyLoadComplete();\n } catch (err) {\n console.error('Failed to load dashboards:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Apply initial state from resource configuration (handles pin navigation\n * and other deep-link scenarios where ActivatedRoute may not fire).\n */\n private applyConfigurationState(): void {\n const config = this.Data?.Configuration;\n if (!config) return;\n\n const qp = config['queryParams'] as Record<string, string> | undefined;\n const dashboardId = qp?.['dashboard'] || config['dashboard'] as string;\n const categoryId = qp?.['category'] || config['category'] as string;\n\n if (categoryId && categoryId !== this.selectedCategoryId) {\n this.selectedCategoryId = categoryId;\n }\n\n if (dashboardId && !this.selectedDashboard) {\n const dashboard = this.dashboards.find(d => UUIDsEqual(d.ID, dashboardId));\n if (dashboard) {\n this.openDashboard(dashboard);\n }\n }\n }\n\n /**\n * Check for late-arriving query params (e.g., from pin navigation where\n * UpdateActiveTabQueryParams runs after the component has already loaded).\n * Polls briefly for queryParams to appear in the URL.\n */\n private watchForLateQueryParams(): void {\n // Check every 200ms for up to 3 seconds for queryParams to appear\n // AND for dashboards to be loaded (both conditions must be met)\n let attempts = 0;\n const interval = setInterval(() => {\n attempts++;\n if (attempts > 15 || this.selectedDashboard) {\n clearInterval(interval);\n return;\n }\n // Re-check the URL directly since ActivatedRoute may not fire\n const url = window.location.href;\n const dashboardMatch = url.match(/[?&]dashboard=([^&]+)/);\n if (dashboardMatch && !this.selectedDashboard && this.dashboards.length > 0) {\n const dashboardId = decodeURIComponent(dashboardMatch[1]);\n const dashboard = this.dashboards.find(d => UUIDsEqual(d.ID, dashboardId));\n if (dashboard) {\n this.openDashboard(dashboard);\n this.cdr.detectChanges();\n clearInterval(interval);\n }\n }\n }, 200);\n }\n\n // ========================================\n // Private Methods - URL Query Params\n // ========================================\n\n private subscribeToQueryParams(): void {\n this.route.queryParams\n .pipe(takeUntil(this._destroy$))\n .subscribe(params => {\n const categoryId = params['category'] || null;\n const dashboardId = params['dashboard'] || null;\n\n // Handle category change\n if (categoryId !== this.selectedCategoryId) {\n this.selectedCategoryId = categoryId;\n }\n\n // Handle dashboard change (for browser back/forward)\n const currentDashboardId = this.selectedDashboard?.ID || null;\n if (dashboardId !== currentDashboardId) {\n if (dashboardId) {\n // Find and open the dashboard\n const dashboard = this.dashboards.find(d => UUIDsEqual(d.ID, dashboardId));\n if (dashboard) {\n this.selectedDashboard = dashboard;\n this.mode = 'view';\n }\n } else {\n // Go back to list\n this.selectedDashboard = null;\n this.mode = 'list';\n }\n }\n\n this.cdr.detectChanges();\n });\n }\n\n /**\n * Update the URL query params for the current tab.\n * Uses NavigationService to update the tab configuration, which triggers\n * the shell's URL sync mechanism to update the browser URL properly\n * while respecting app-scoped routes.\n */\n private updateUrlQueryParams(): void {\n const queryParams: Record<string, string | null> = {};\n\n // Track category\n if (this.selectedCategoryId) {\n queryParams['category'] = this.selectedCategoryId;\n } else {\n queryParams['category'] = null;\n }\n\n // Track dashboard (for browser back/forward support)\n if (this.selectedDashboard) {\n queryParams['dashboard'] = this.selectedDashboard.ID;\n } else {\n queryParams['dashboard'] = null;\n }\n\n // Use NavigationService to update query params properly\n // This ensures the URL update respects app-scoped routes\n this.navigationService.UpdateActiveTabQueryParams(queryParams);\n }\n\n // ========================================\n // Private Methods - Category Helpers\n // ========================================\n\n /**\n * Get all child categories of a parent category recursively\n */\n private getChildCategoriesRecursive(parentId: string): MJDashboardCategoryEntity[] {\n const children: MJDashboardCategoryEntity[] = [];\n const directChildren = this.categories.filter(c => UUIDsEqual(c.ParentID, parentId));\n\n for (const child of directChildren) {\n children.push(child);\n children.push(...this.getChildCategoriesRecursive(child.ID));\n }\n\n return children;\n }\n\n // ========================================\n // Private Methods - View Preference\n // ========================================\n\n private loadViewPreference(): void {\n // TODO: Load from User Settings entity\n const stored = localStorage.getItem('dashboard-browser-view-mode');\n if (stored === 'cards' || stored === 'list') {\n this.viewMode = stored;\n }\n }\n\n private saveViewPreference(mode: DashboardBrowserViewMode): void {\n // TODO: Save to User Settings entity\n localStorage.setItem('dashboard-browser-view-mode', mode);\n }\n}\n","<!-- Dashboard Browser Resource -->\n<div class=\"dashboard-browser-resource\">\n <!-- List Mode - Uses Generic DashboardBrowserComponent -->\n @if (mode === 'list') {\n <mj-dashboard-browser\n [Dashboards]=\"dashboards\"\n [Categories]=\"categories\"\n [SelectedCategoryId]=\"selectedCategoryId\"\n [ViewMode]=\"viewMode\"\n [IsLoading]=\"isLoading\"\n [ShowCreateButton]=\"true\"\n [AllowMultiSelect]=\"true\"\n [AllowDragDrop]=\"true\"\n [DashboardPermissions]=\"dashboardPermissionsMap\"\n [EffectiveCategoryMap]=\"effectiveCategoryMap\"\n (DashboardOpen)=\"onDashboardOpen($event)\"\n (DashboardEdit)=\"onDashboardEdit($event)\"\n (DashboardDelete)=\"onDashboardDelete($event)\"\n (DashboardMove)=\"onDashboardMove($event)\"\n (DashboardCreate)=\"onDashboardCreate($event)\"\n (CategoryCreate)=\"onCategoryCreate($event)\"\n (CategoryDelete)=\"onCategoryDelete($event)\"\n (CategoryChange)=\"onCategoryChange($event)\"\n (ViewPreferenceChange)=\"onViewPreferenceChange($event)\">\n </mj-dashboard-browser>\n }\n\n <!-- View/Edit Mode -->\n @if (mode === 'view' || mode === 'edit') {\n <!-- View Mode Toolbar - matches browser toolbar structure -->\n @if (mode === 'view') {\n <div class=\"viewer-toolbar\">\n <!-- Breadcrumb navigation (includes its own padding/styling) -->\n <mj-dashboard-breadcrumb\n [Categories]=\"categories\"\n [CurrentCategoryId]=\"selectedDashboard?.CategoryID || null\"\n [CurrentDashboard]=\"selectedDashboard\"\n [ShowDashboardName]=\"true\"\n [AllowDragDrop]=\"false\"\n Size=\"large\"\n RootIcon=\"fa-solid fa-gauge-high\"\n RootLabel=\"Dashboards\"\n (Navigate)=\"onBreadcrumbNavigate($event)\">\n </mj-dashboard-breadcrumb>\n <!-- Right-side Actions -->\n <div class=\"toolbar-actions\">\n <!-- Shared indicator for non-owned dashboards -->\n @if (!selectedDashboardPermissions.IsOwner && selectedDashboardPermissions.CanRead) {\n <span class=\"shared-indicator\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n Shared with you\n </span>\n }\n <button\n class=\"btn-icon\"\n title=\"Open in its own tab\"\n (click)=\"openInNewTab()\">\n <i class=\"fa-solid fa-up-right-from-square\"></i>\n </button>\n <!-- Share button - only shown if user can share -->\n @if (selectedDashboardPermissions.CanShare) {\n <button\n class=\"btn-icon\"\n title=\"Share Dashboard\"\n (click)=\"openShareDialog()\">\n <i class=\"fa-solid fa-user-plus\"></i>\n </button>\n }\n <!-- Edit button - only shown if user can edit -->\n @if (selectedDashboardPermissions.CanEdit) {\n <button\n class=\"btn-icon\"\n title=\"Edit Dashboard\"\n (click)=\"toggleEditMode()\">\n <i class=\"fa-solid fa-edit\"></i>\n </button>\n }\n </div>\n </div>\n }\n <!-- Edit Mode Header - different layout -->\n @if (mode === 'edit') {\n <div class=\"viewer-header editing\">\n <div class=\"header-left\">\n <!-- Add Part button on the left -->\n <button\n class=\"btn-add-part\"\n (click)=\"openAddPartDialog()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Part\n </button>\n <!-- Separator -->\n <div class=\"header-separator\"></div>\n <!-- Editable name/description -->\n <div class=\"dashboard-info-edit\">\n <input\n type=\"text\"\n class=\"dashboard-name-input\"\n [(ngModel)]=\"editingName\"\n placeholder=\"Dashboard name\"\n (blur)=\"onNameBlur()\">\n <input\n type=\"text\"\n class=\"dashboard-description-input\"\n [(ngModel)]=\"editingDescription\"\n placeholder=\"Add a description...\">\n </div>\n </div>\n <div class=\"header-right\">\n <!-- Save, Cancel buttons -->\n <button\n class=\"btn-primary\"\n (click)=\"saveDashboard()\">\n <i class=\"fa-solid fa-save\"></i>\n Save\n </button>\n <button\n class=\"btn-cancel\"\n (click)=\"cancelEdit()\">\n Cancel\n </button>\n </div>\n </div>\n }\n <!-- Dashboard Viewer -->\n <div class=\"viewer-content\">\n <mj-dashboard-viewer\n #dashboardViewer\n [dashboard]=\"selectedDashboard\"\n [isEditing]=\"mode === 'edit'\"\n [showToolbar]=\"false\"\n [showBreadcrumb]=\"false\"\n (panelInteraction)=\"onPanelInteraction($event)\"\n (navigationRequested)=\"onNavigationRequested($event)\">\n </mj-dashboard-viewer>\n </div>\n <!-- Add Panel Dialog -->\n @if (dashboardViewer) {\n <mj-add-panel-dialog\n [visible]=\"showAddPanelDialog\"\n [partTypes]=\"dashboardViewer.getPartTypes()\"\n (panelAdded)=\"onPanelAdded($event)\"\n (cancelled)=\"onAddPanelCancelled()\">\n </mj-add-panel-dialog>\n }\n <!-- Generic Edit Part Dialog - dynamically loads config panels via ClassFactory -->\n <mj-edit-part-dialog\n [Visible]=\"showConfigDialog\"\n [PartType]=\"configDialogPartType\"\n [Panel]=\"configDialogPanel\"\n [Config]=\"configDialogPanel?.config || null\"\n (Saved)=\"onConfigDialogSaved($event)\"\n (Cancelled)=\"onConfigDialogCancelled()\">\n </mj-edit-part-dialog>\n <!-- Remove Part Confirmation Dialog -->\n <mj-confirm-dialog\n [visible]=\"showConfirmDialog\"\n type=\"danger\"\n title=\"Remove Part\"\n [message]=\"'Are you sure you want to remove \\'' + confirmPanelTitle + '\\' from this dashboard?'\"\n confirmText=\"Remove\"\n cancelText=\"Cancel\"\n (confirmed)=\"onRemoveConfirmed()\"\n (cancelled)=\"onRemoveCancelled()\">\n </mj-confirm-dialog>\n <!-- Share Dashboard Dialog -->\n <mj-dashboard-share-dialog\n [Visible]=\"showShareDialog\"\n [Dashboard]=\"selectedDashboard\"\n (Result)=\"onShareDialogResult($event)\">\n </mj-dashboard-share-dialog>\n }\n</div>\n"]}
1
+ {"version":3,"file":"dashboard-browser-resource.component.js","sourceRoot":"","sources":["../../src/DashboardBrowser/dashboard-browser-resource.component.ts","../../src/DashboardBrowser/dashboard-browser-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, ViewChild } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { Metadata, CompositeKey } from '@memberjunction/core';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { ResourceData, MJDashboardEntity, MJDashboardCategoryEntity, MJDashboardPartTypeEntity, DashboardEngine, DashboardUserPermissions, MJDashboardCategoryLinkEntity } from '@memberjunction/core-entities';\nimport { ShareDialogResult } from './dashboard-share-dialog.component';\nimport {\n DashboardViewerComponent,\n DashboardNavRequestEvent,\n PanelInteractionEvent,\n AddPanelResult,\n createDefaultDashboardConfig,\n DashboardPanel,\n EditPartDialogResult,\n // Browser event types from generic component\n DashboardOpenEvent,\n DashboardEditEvent,\n DashboardDeleteEvent,\n DashboardMoveEvent,\n DashboardCreateEvent,\n CategoryCreateEvent,\n CategoryDeleteEvent,\n CategoryChangeEvent,\n ViewPreferenceChangeEvent,\n DashboardBrowserViewMode,\n BreadcrumbNavigateEvent\n} from '@memberjunction/ng-dashboard-viewer';\n/**\n * Mode for the dashboard browser\n */\ntype BrowserMode = 'list' | 'view' | 'edit';\n\n/**\n * Resource component for browsing, creating, and editing dashboards.\n * Uses the generic DashboardBrowserComponent for list mode and handles\n * view/edit mode internally with routing integration.\n */\n@RegisterClass(BaseResourceComponent, 'DashboardBrowserResource')\n@Component({\n standalone: false,\n selector: 'mj-dashboard-browser-resource',\n templateUrl: './dashboard-browser-resource.component.html',\n styleUrls: ['./dashboard-browser-resource.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DashboardBrowserResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n // ========================================\n // State\n // ========================================\n\n public mode: BrowserMode = 'list';\n public isLoading = false;\n public dashboards: MJDashboardEntity[] = [];\n public categories: MJDashboardCategoryEntity[] = [];\n public selectedDashboard: MJDashboardEntity | null = null;\n public selectedCategoryId: string | null = null;\n public viewMode: DashboardBrowserViewMode = 'cards';\n public showAddPanelDialog = false;\n\n // Config dialog state\n public showConfigDialog = false;\n public configDialogPanel: DashboardPanel | null = null;\n public configDialogPartType: MJDashboardPartTypeEntity | null = null;\n public configDialogClass: string = '';\n\n // Confirm dialog state\n public showConfirmDialog = false;\n public confirmPanelId: string = '';\n public confirmPanelTitle: string = '';\n\n // Share dialog state\n public showShareDialog = false;\n\n // Edit mode state for name/description\n public editingName = '';\n public editingDescription = '';\n private originalName = '';\n private originalDescription = '';\n private originalConfig = '';\n\n // Permission state for selected dashboard\n public selectedDashboardPermissions: DashboardUserPermissions = {\n DashboardID: '',\n CanRead: true,\n CanEdit: true,\n CanDelete: true,\n CanShare: true,\n IsOwner: true,\n PermissionSource: 'owner'\n };\n\n // Permission map for all dashboards (used by browser component)\n public dashboardPermissionsMap: Map<string, DashboardUserPermissions> = new Map();\n\n // Effective category map for shared dashboards (maps dashboard ID to effective category for display)\n public effectiveCategoryMap: Map<string, string | null> = new Map();\n\n private readonly _destroy$ = new Subject<void>();\n\n @ViewChild('dashboardViewer') dashboardViewer!: DashboardViewerComponent;\n\n // ========================================\n // Constructor\n // ========================================\n\n constructor(\n private cdr: ChangeDetectorRef,\n private route: ActivatedRoute) {\n super();\n }\n\n // ========================================\n // Lifecycle\n // ========================================\n\n ngOnInit(): void {\n super.ngOnInit();\n this.loadDashboards();\n this.subscribeToQueryParams();\n this.loadViewPreference();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this._destroy$.next();\n this._destroy$.complete();\n }\n\n // ========================================\n // BaseResourceComponent Implementation\n // ========================================\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Dashboards';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-gauge-high';\n }\n\n // ========================================\n // Event Handlers from Generic Browser\n // ========================================\n\n /**\n * Handle dashboard open request from generic browser\n */\n public onDashboardOpen(event: DashboardOpenEvent): void {\n if (event.OpenInNewTab) {\n // Open in a dedicated Explorer tab via NavigationService\n this.navigationService.OpenDashboard(\n event.Dashboard.ID,\n event.Dashboard.Name,\n { forceNewTab: true }\n );\n } else {\n // Open inline in the browser's view pane\n this.openDashboard(event.Dashboard);\n }\n }\n\n /**\n * Open the current dashboard in its own dedicated Explorer tab\n */\n public openInNewTab(): void {\n if (this.selectedDashboard) {\n this.navigationService.OpenDashboard(\n this.selectedDashboard.ID,\n this.selectedDashboard.Name,\n { forceNewTab: true }\n );\n }\n }\n\n /**\n * Handle dashboard edit request from generic browser\n */\n public onDashboardEdit(event: DashboardEditEvent): void {\n this.editDashboard(event.Dashboard);\n }\n\n /**\n * Handle dashboard delete request from generic browser\n */\n public async onDashboardDelete(event: DashboardDeleteEvent): Promise<void> {\n // The generic browser handles the confirmation dialog\n // We just need to perform the actual deletion\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n for (const dashboard of event.Dashboards) {\n const deleted = await dashboard.Delete();\n if (deleted) {\n const index = this.dashboards.findIndex(d => UUIDsEqual(d.ID, dashboard.ID));\n if (index >= 0) {\n this.dashboards.splice(index, 1);\n }\n }\n }\n\n // Create new array reference to trigger change detection\n this.dashboards = [...this.dashboards];\n } catch (err) {\n console.error('Failed to delete dashboards:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handle dashboard move request from generic browser.\n * For owned dashboards: updates the dashboard's CategoryID directly.\n * For shared dashboards: creates/updates a DashboardCategoryLink to organize without modifying the original.\n */\n public async onDashboardMove(event: DashboardMoveEvent): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const md = new Metadata();\n const currentUserId = md.CurrentUser.ID;\n\n for (const dashboard of event.Dashboards) {\n const permissions = DashboardEngine.Instance.GetDashboardPermissions(dashboard.ID, currentUserId);\n\n if (permissions.IsOwner) {\n // Owner can modify the dashboard directly\n dashboard.CategoryID = event.TargetCategoryId;\n await dashboard.Save();\n } else {\n // Non-owner: create or update a category link instead\n await this.createOrUpdateCategoryLink(dashboard.ID, currentUserId, event.TargetCategoryId);\n\n // Update the effective category map immediately for UI refresh\n this.effectiveCategoryMap.set(dashboard.ID, event.TargetCategoryId);\n }\n }\n\n // Create new map reference to trigger change detection\n this.effectiveCategoryMap = new Map(this.effectiveCategoryMap);\n\n // Refresh the list\n this.dashboards = [...this.dashboards];\n\n // Navigate to the target category to follow the moved items\n this.selectedCategoryId = event.TargetCategoryId;\n this.updateUrlQueryParams();\n } catch (err) {\n console.error('Failed to move dashboards:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Creates or updates a DashboardCategoryLink for organizing a shared dashboard.\n * Ensures only one link exists per user/dashboard combination.\n * @param dashboardId - The ID of the shared dashboard\n * @param userId - The current user's ID\n * @param categoryId - The target category ID (null for root/uncategorized)\n */\n private async createOrUpdateCategoryLink(\n dashboardId: string,\n userId: string,\n categoryId: string | null\n ): Promise<void> {\n const md = new Metadata();\n\n // Check if a link already exists for this user/dashboard\n const existingLinks = DashboardEngine.Instance.DashboardCategoryLinks.filter(\n link => UUIDsEqual(link.DashboardID, dashboardId) && UUIDsEqual(link.UserID, userId)\n );\n\n let link: MJDashboardCategoryLinkEntity;\n\n if (existingLinks.length > 0) {\n // Update existing link\n link = existingLinks[0];\n link.DashboardCategoryID = categoryId;\n } else {\n // Create new link\n link = await md.GetEntityObject<MJDashboardCategoryLinkEntity>('MJ: Dashboard Category Links');\n link.DashboardID = dashboardId;\n link.UserID = userId;\n link.DashboardCategoryID = categoryId;\n }\n\n const saved = await link.Save();\n if (!saved) {\n console.error('Failed to save dashboard category link:', link.LatestResult);\n }\n }\n\n /**\n * Handle create dashboard request from generic browser\n */\n public async onDashboardCreate(event: DashboardCreateEvent): Promise<void> {\n await this.createDashboard(event.CategoryId);\n }\n\n /**\n * Handle category change from generic browser - update URL\n */\n public onCategoryChange(event: CategoryChangeEvent): void {\n this.selectedCategoryId = event.CategoryId;\n this.updateUrlQueryParams();\n }\n\n /**\n * Handle view preference change from generic browser - persist\n */\n public onViewPreferenceChange(event: ViewPreferenceChangeEvent): void {\n this.viewMode = event.ViewMode;\n this.saveViewPreference(event.ViewMode);\n }\n\n /**\n * Handle category create request from generic browser\n * Includes extensive logging for debugging category creation issues\n */\n public async onCategoryCreate(event: CategoryCreateEvent): Promise<void> {\n console.debug('[DashboardBrowserResource] Category create requested:', {\n name: event.Name,\n parentCategoryId: event.ParentCategoryId\n });\n\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const md = new Metadata();\n console.debug('[DashboardBrowserResource] Current user:', {\n userId: md.CurrentUser?.ID,\n userName: md.CurrentUser?.Name,\n email: md.CurrentUser?.Email\n });\n\n const category = await md.GetEntityObject<MJDashboardCategoryEntity>('MJ: Dashboard Categories');\n console.debug('[DashboardBrowserResource] Created category entity object');\n\n // Set required fields\n category.Name = event.Name;\n category.UserID = md.CurrentUser.ID;\n\n if (event.ParentCategoryId) {\n category.ParentID = event.ParentCategoryId;\n }\n\n console.debug('[DashboardBrowserResource] Category fields before save:', {\n name: category.Name,\n userId: category.UserID,\n parentId: category.ParentID,\n allFields: category.Fields.map(f => ({ name: f.Name, value: f.Value, dirty: f.Dirty }))\n });\n\n const saved = await category.Save();\n\n console.debug('[DashboardBrowserResource] Save result:', {\n success: saved,\n latestResult: category.LatestResult,\n message: category.LatestResult?.Message,\n success2: category.LatestResult?.Success,\n id: category.ID\n });\n\n if (saved) {\n console.debug('[DashboardBrowserResource] Category saved successfully, ID:', category.ID);\n // Add to local array - engine will self-update\n this.categories.push(category);\n this.categories = [...this.categories].sort((a, b) => a.Name.localeCompare(b.Name));\n } else {\n const errorMessage = category.LatestResult?.Message || 'Unknown error saving category';\n console.error('[DashboardBrowserResource] Failed to save category:', errorMessage);\n console.error('[DashboardBrowserResource] Full LatestResult:', JSON.stringify(category.LatestResult, null, 2));\n\n // Show toast or alert for user\n alert(`Failed to create category: ${errorMessage}`);\n }\n } catch (err) {\n console.error('[DashboardBrowserResource] Exception creating category:', err);\n alert(`Error creating category: ${err instanceof Error ? err.message : String(err)}`);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handle category delete request from generic browser\n * Performs recursive deletion of category and all children\n */\n public async onCategoryDelete(event: CategoryDeleteEvent): Promise<void> {\n console.debug('[DashboardBrowserResource] Category delete requested:', event.Category.Name);\n\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n // Get all child categories recursively\n const categoriesToDelete = this.getChildCategoriesRecursive(event.Category.ID);\n categoriesToDelete.push(event.Category);\n\n console.debug('[DashboardBrowserResource] Deleting categories:', categoriesToDelete.map(c => c.Name));\n\n // Delete in reverse order (children first)\n for (const cat of categoriesToDelete.reverse()) {\n // First, move any dashboards in this category to uncategorized\n const dashboardsInCategory = this.dashboards.filter(d => UUIDsEqual(d.CategoryID, cat.ID));\n for (const dashboard of dashboardsInCategory) {\n dashboard.CategoryID = null!;\n await dashboard.Save();\n }\n\n // Then delete the category\n const deleted = await cat.Delete();\n if (deleted) {\n const index = this.categories.findIndex(c => UUIDsEqual(c.ID, cat.ID));\n if (index >= 0) {\n this.categories.splice(index, 1);\n }\n } else {\n console.error('[DashboardBrowserResource] Failed to delete category:', cat.Name, cat.LatestResult);\n }\n }\n\n // Refresh arrays\n this.categories = [...this.categories];\n this.dashboards = [...this.dashboards];\n } catch (err) {\n console.error('[DashboardBrowserResource] Exception deleting category:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handle breadcrumb navigation event\n * Navigates back to list view with optional category selection\n */\n public onBreadcrumbNavigate(event: BreadcrumbNavigateEvent): void {\n console.debug('[DashboardBrowserResource] Breadcrumb navigate:', event);\n\n // CategoryId is null for root, or a category ID string\n this.selectedCategoryId = event.CategoryId;\n this.backToList();\n this.updateUrlQueryParams();\n }\n\n // ========================================\n // Public Methods - Navigation\n // ========================================\n\n /**\n * Open a dashboard for viewing\n */\n public openDashboard(dashboard: MJDashboardEntity): void {\n this.selectedDashboard = dashboard;\n this.mode = 'view';\n\n // Compute permissions for the selected dashboard\n const md = new Metadata();\n this.selectedDashboardPermissions = DashboardEngine.Instance.GetDashboardPermissions(\n dashboard.ID,\n md.CurrentUser.ID\n );\n\n this.updateUrlQueryParams();\n this.NotifyDisplayNameChanged(dashboard.Name || 'Dashboard');\n this.cdr.detectChanges();\n }\n\n /**\n * Open a dashboard for editing\n */\n public editDashboard(dashboard: MJDashboardEntity): void {\n // Check if user has edit permission\n const md = new Metadata();\n const permissions = DashboardEngine.Instance.GetDashboardPermissions(\n dashboard.ID,\n md.CurrentUser.ID\n );\n\n if (!permissions.CanEdit) {\n console.warn('User does not have permission to edit this dashboard');\n return;\n }\n\n this.selectedDashboard = dashboard;\n this.selectedDashboardPermissions = permissions;\n this.mode = 'edit';\n\n // Initialize editing fields\n this.editingName = dashboard.Name;\n this.editingDescription = dashboard.Description || '';\n\n // Store originals for cancel\n this.originalName = dashboard.Name;\n this.originalDescription = dashboard.Description || '';\n this.originalConfig = dashboard.UIConfigDetails || '';\n\n this.cdr.detectChanges();\n }\n\n /**\n * Go back to list view\n */\n public backToList(): void {\n this.selectedDashboard = null;\n this.mode = 'list';\n this.updateUrlQueryParams();\n this.NotifyDisplayNameChanged('Dashboards');\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle edit mode for current dashboard\n */\n public toggleEditMode(): void {\n if (this.mode === 'view' && this.selectedDashboard) {\n this.editDashboard(this.selectedDashboard);\n } else if (this.mode === 'edit') {\n this.mode = 'view';\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Open the share dialog for the current dashboard\n */\n public openShareDialog(): void {\n if (!this.selectedDashboard) return;\n\n // Verify user has share permission\n if (!this.selectedDashboardPermissions.CanShare) {\n console.warn('User does not have permission to share this dashboard');\n return;\n }\n\n this.showShareDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Close the share dialog\n */\n public closeShareDialog(): void {\n this.showShareDialog = false;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle share dialog result\n */\n public onShareDialogResult(result: ShareDialogResult): void {\n this.showShareDialog = false;\n\n if (result.Action === 'save' && this.selectedDashboard) {\n // Recompute permissions after sharing changes\n const md = new Metadata();\n this.selectedDashboardPermissions = DashboardEngine.Instance.GetDashboardPermissions(\n this.selectedDashboard.ID,\n md.CurrentUser.ID\n );\n }\n\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Public Methods - Dashboard CRUD\n // ========================================\n\n /**\n * Create a new dashboard\n */\n public async createDashboard(categoryId?: string | null): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const md = new Metadata();\n const dashboard = await md.GetEntityObject<MJDashboardEntity>('MJ: Dashboards');\n\n dashboard.Name = 'New Dashboard';\n dashboard.Description = '';\n dashboard.UserID = md.CurrentUser.ID;\n dashboard.UIConfigDetails = JSON.stringify(createDefaultDashboardConfig());\n\n if (categoryId) {\n dashboard.CategoryID = categoryId;\n } else if (this.selectedCategoryId) {\n dashboard.CategoryID = this.selectedCategoryId;\n }\n\n const saved = await dashboard.Save();\n\n if (saved) {\n this.dashboards.unshift(dashboard);\n this.dashboards = [...this.dashboards];\n this.editDashboard(dashboard);\n } else {\n console.error('Failed to save dashboard:', dashboard.LatestResult);\n }\n } catch (err) {\n console.error('Failed to create dashboard:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Save the current dashboard\n */\n public async saveDashboard(): Promise<void> {\n if (!this.selectedDashboard) return;\n\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n this.selectedDashboard.Name = this.editingName;\n this.selectedDashboard.Description = this.editingDescription;\n\n if (this.dashboardViewer) {\n await this.dashboardViewer.save();\n }\n\n this.originalName = this.editingName;\n this.originalDescription = this.editingDescription;\n this.originalConfig = this.selectedDashboard.UIConfigDetails || '';\n\n // Update the dashboard in the list\n this.dashboards = [...this.dashboards];\n\n this.mode = 'view';\n } catch (err) {\n console.error('Failed to save dashboard:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Cancel editing and revert changes\n */\n public cancelEdit(): void {\n if (!this.selectedDashboard) {\n this.backToList();\n return;\n }\n\n this.selectedDashboard.Name = this.originalName;\n this.selectedDashboard.Description = this.originalDescription;\n this.selectedDashboard.UIConfigDetails = this.originalConfig;\n\n this.editingName = '';\n this.editingDescription = '';\n\n this.mode = 'view';\n this.cdr.detectChanges();\n }\n\n /**\n * Handle name input blur - validate name is not empty\n */\n public onNameBlur(): void {\n if (!this.editingName.trim()) {\n this.editingName = this.originalName || 'Untitled Dashboard';\n }\n }\n\n // ========================================\n // Public Methods - Part Management\n // ========================================\n\n /**\n * Open the Add Part dialog\n */\n public openAddPartDialog(): void {\n this.showAddPanelDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle panel interaction events from the viewer\n */\n public onPanelInteraction(event: PanelInteractionEvent): void {\n if (event.interactionType !== 'custom') return;\n\n const action = event.payload?.['action'];\n\n switch (action) {\n case 'add-panel-requested':\n this.openAddPartDialog();\n break;\n\n case 'configure-part-requested':\n this.openConfigDialog(event.panelId);\n break;\n\n case 'remove-part-requested':\n this.openRemoveConfirmDialog(\n event.panelId,\n event.payload?.['panelTitle'] as string || 'this part'\n );\n break;\n }\n }\n\n /**\n * Handle navigation events from panels\n */\n public onNavigationRequested(event: DashboardNavRequestEvent): void {\n const request = event.request;\n const openInNewTab = request.openInNewTab || false;\n\n switch (request.type) {\n case 'OpenEntityRecord': {\n // Navigate to entity record\n const compositeKey = new CompositeKey();\n compositeKey.SimpleLoadFromURLSegment(request.recordId);\n // If simple load didn't work (single ID without field name), look up actual PK field\n if (compositeKey.KeyValuePairs.length === 0) {\n const md = new Metadata();\n const entity = md.Entities.find(e => e.Name === request.entityName);\n const pkFieldName = entity?.FirstPrimaryKey?.Name || 'ID';\n compositeKey.LoadFromSingleKeyValuePair(pkFieldName, request.recordId);\n }\n this.navigationService.OpenEntityRecord(\n request.entityName,\n compositeKey,\n { forceNewTab: openInNewTab }\n );\n break;\n }\n case 'OpenDashboard': {\n // Navigate to another dashboard\n const targetDashboard = this.dashboards.find(d => UUIDsEqual(d.ID, request.dashboardId));\n if (targetDashboard) {\n if (openInNewTab) {\n this.navigationService.OpenDashboard(\n targetDashboard.ID,\n targetDashboard.Name,\n { forceNewTab: true }\n );\n } else {\n this.openDashboard(targetDashboard);\n }\n }\n break;\n }\n case 'OpenQuery': {\n // Navigate to query viewer\n const md = new Metadata();\n const queryInfo = md.Queries.find(q => UUIDsEqual(q.ID, request.queryId));\n if (queryInfo) {\n this.navigationService.OpenQuery(\n request.queryId,\n queryInfo.Name,\n { forceNewTab: openInNewTab }\n );\n }\n break;\n }\n case 'OpenNavItem': {\n // Navigate to a specific nav item within an application\n const appId = request.appName ? this.resolveAppId(request.appName) : undefined;\n this.navigationService.OpenNavItemByName(request.navItemName, undefined, appId, {\n queryParams: request.queryParams\n });\n break;\n }\n }\n }\n\n /**\n * Resolve an application name to its ID\n */\n private resolveAppId(appName: string): string | undefined {\n const md = new Metadata();\n const app = md.Applications.find(a => a.Name.toLowerCase() === appName.toLowerCase());\n return app?.ID;\n }\n\n /**\n * Handle add panel dialog result\n */\n public onPanelAdded(result: AddPanelResult): void {\n if (this.dashboardViewer) {\n this.dashboardViewer.addPanel(\n result.PartType.ID,\n result.Config,\n result.Title,\n result.Icon\n );\n }\n this.showAddPanelDialog = false;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle add panel dialog cancel\n */\n public onAddPanelCancelled(): void {\n this.showAddPanelDialog = false;\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Public Methods - Config Dialog\n // ========================================\n\n /**\n * Open the config dialog for a panel\n */\n public openConfigDialog(panelId: string): void {\n if (!this.dashboardViewer) return;\n\n const panel = this.dashboardViewer.getPanel(panelId);\n const partType = this.dashboardViewer.getPartTypeForPanel(panelId);\n\n if (!panel || !partType) {\n console.warn('Could not find panel or part type for config dialog');\n return;\n }\n\n this.configDialogPanel = panel;\n this.configDialogPartType = partType;\n this.configDialogClass = partType.ConfigDialogClass || '';\n this.showConfigDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle config dialog save\n */\n public onConfigDialogSaved(result: EditPartDialogResult): void {\n if (this.dashboardViewer && this.configDialogPanel) {\n this.dashboardViewer.updatePanelConfig(\n this.configDialogPanel.id,\n result.Config,\n result.Title,\n result.Icon\n );\n }\n this.closeConfigDialog();\n }\n\n /**\n * Handle config dialog cancel\n */\n public onConfigDialogCancelled(): void {\n this.closeConfigDialog();\n }\n\n /**\n * Close the config dialog\n */\n private closeConfigDialog(): void {\n this.showConfigDialog = false;\n this.configDialogPanel = null;\n this.configDialogPartType = null;\n this.configDialogClass = '';\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Public Methods - Remove Confirm Dialog\n // ========================================\n\n /**\n * Open the remove confirmation dialog\n */\n public openRemoveConfirmDialog(panelId: string, panelTitle: string): void {\n this.confirmPanelId = panelId;\n this.confirmPanelTitle = panelTitle;\n this.showConfirmDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle remove confirmation\n */\n public onRemoveConfirmed(): void {\n if (this.dashboardViewer && this.confirmPanelId) {\n this.dashboardViewer.confirmRemovePanel(this.confirmPanelId);\n }\n this.closeRemoveConfirmDialog();\n }\n\n /**\n * Handle remove cancel\n */\n public onRemoveCancelled(): void {\n this.closeRemoveConfirmDialog();\n }\n\n /**\n * Close the remove confirm dialog\n */\n private closeRemoveConfirmDialog(): void {\n this.showConfirmDialog = false;\n this.confirmPanelId = '';\n this.confirmPanelTitle = '';\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Private Methods - Data Loading\n // ========================================\n\n private async loadDashboards(): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n // Use DashboardEngine for consistent cached data\n const engine = DashboardEngine.Instance;\n await engine.Config(false); // Wait for engine to load data\n\n const md = new Metadata();\n const currentUserId = md.CurrentUser.ID;\n\n // Get data from engine - sort dashboards by updated date, categories by name\n // Filter dashboards to only those accessible to the current user\n this.dashboards = [...engine.GetAccessibleDashboards(currentUserId)].sort((a, b) =>\n new Date(b.__mj_UpdatedAt).getTime() - new Date(a.__mj_UpdatedAt).getTime()\n );\n // Filter categories to only those owned by or shared with the current user\n this.categories = [...engine.GetAccessibleCategories(currentUserId)].sort((a, b) =>\n a.Name.localeCompare(b.Name)\n );\n\n // Build permissions map and effective category map for all dashboards\n this.dashboardPermissionsMap = new Map();\n this.effectiveCategoryMap = new Map();\n\n // Get category links for current user (from engine's cached data)\n const userCategoryLinks = engine.DashboardCategoryLinks.filter(\n link => UUIDsEqual(link.UserID, currentUserId)\n );\n\n for (const dashboard of this.dashboards) {\n const perms = engine.GetDashboardPermissions(dashboard.ID, currentUserId);\n this.dashboardPermissionsMap.set(dashboard.ID, perms);\n\n // For shared dashboards (not owned), determine effective category\n if (!perms.IsOwner) {\n // Look for a category link for this dashboard\n const categoryLink = userCategoryLinks.find(\n link => UUIDsEqual(link.DashboardID, dashboard.ID)\n );\n\n if (categoryLink) {\n // User has explicitly organized this shared dashboard\n this.effectiveCategoryMap.set(dashboard.ID, categoryLink.DashboardCategoryID);\n } else {\n // No link exists - show in root (null category)\n this.effectiveCategoryMap.set(dashboard.ID, null);\n }\n }\n // For owned dashboards, we don't add to effectiveCategoryMap\n // so the browser will use the dashboard's actual CategoryID\n }\n\n console.debug('[DashboardBrowserResource] Loaded from DashboardEngine:', {\n dashboardCount: this.dashboards.length,\n categoryCount: this.categories.length,\n sharedDashboardsInEffectiveMap: this.effectiveCategoryMap.size,\n categories: this.categories.map(c => ({ id: c.ID, name: c.Name, parentId: c.ParentID }))\n });\n\n // After dashboards are loaded, check for deep-link from configuration\n // (e.g., pin navigation passes dashboard ID via queryParams in config)\n this.applyConfigurationState();\n\n // Also watch for late-arriving query params from pin navigation\n this.watchForLateQueryParams();\n\n this.NotifyLoadComplete();\n } catch (err) {\n console.error('Failed to load dashboards:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Apply initial state from resource configuration (handles pin navigation\n * and other deep-link scenarios where ActivatedRoute may not fire).\n */\n private applyConfigurationState(): void {\n const config = this.Data?.Configuration;\n if (!config) return;\n\n const qp = config['queryParams'] as Record<string, string> | undefined;\n const dashboardId = qp?.['dashboard'] || config['dashboard'] as string;\n const categoryId = qp?.['category'] || config['category'] as string;\n\n if (categoryId && categoryId !== this.selectedCategoryId) {\n this.selectedCategoryId = categoryId;\n }\n\n if (dashboardId && !this.selectedDashboard) {\n const dashboard = this.dashboards.find(d => UUIDsEqual(d.ID, dashboardId));\n if (dashboard) {\n this.openDashboard(dashboard);\n }\n }\n }\n\n /**\n * Check for late-arriving query params (e.g., from pin navigation where\n * UpdateActiveTabQueryParams runs after the component has already loaded).\n * Polls briefly for queryParams to appear in the URL.\n */\n private watchForLateQueryParams(): void {\n // Check every 200ms for up to 3 seconds for queryParams to appear\n // AND for dashboards to be loaded (both conditions must be met)\n let attempts = 0;\n const interval = setInterval(() => {\n attempts++;\n if (attempts > 15 || this.selectedDashboard) {\n clearInterval(interval);\n return;\n }\n // Re-check the URL directly since ActivatedRoute may not fire\n const url = window.location.href;\n const dashboardMatch = url.match(/[?&]dashboard=([^&]+)/);\n if (dashboardMatch && !this.selectedDashboard && this.dashboards.length > 0) {\n const dashboardId = decodeURIComponent(dashboardMatch[1]);\n const dashboard = this.dashboards.find(d => UUIDsEqual(d.ID, dashboardId));\n if (dashboard) {\n this.openDashboard(dashboard);\n this.cdr.detectChanges();\n clearInterval(interval);\n }\n }\n }, 200);\n }\n\n // ========================================\n // Private Methods - URL Query Params\n // ========================================\n\n private subscribeToQueryParams(): void {\n this.route.queryParams\n .pipe(takeUntil(this._destroy$))\n .subscribe(params => {\n const categoryId = params['category'] || null;\n const dashboardId = params['dashboard'] || null;\n\n // Handle category change\n if (categoryId !== this.selectedCategoryId) {\n this.selectedCategoryId = categoryId;\n }\n\n // Handle dashboard change (for browser back/forward)\n const currentDashboardId = this.selectedDashboard?.ID || null;\n if (dashboardId !== currentDashboardId) {\n if (dashboardId) {\n // Find and open the dashboard\n const dashboard = this.dashboards.find(d => UUIDsEqual(d.ID, dashboardId));\n if (dashboard) {\n this.selectedDashboard = dashboard;\n this.mode = 'view';\n }\n } else {\n // Go back to list\n this.selectedDashboard = null;\n this.mode = 'list';\n }\n }\n\n this.cdr.detectChanges();\n });\n }\n\n /**\n * Update the URL query params for the current tab.\n * Uses NavigationService to update the tab configuration, which triggers\n * the shell's URL sync mechanism to update the browser URL properly\n * while respecting app-scoped routes.\n */\n private updateUrlQueryParams(): void {\n const queryParams: Record<string, string | null> = {};\n\n // Track category\n if (this.selectedCategoryId) {\n queryParams['category'] = this.selectedCategoryId;\n } else {\n queryParams['category'] = null;\n }\n\n // Track dashboard (for browser back/forward support)\n if (this.selectedDashboard) {\n queryParams['dashboard'] = this.selectedDashboard.ID;\n } else {\n queryParams['dashboard'] = null;\n }\n\n // Use NavigationService to update query params properly\n // This ensures the URL update respects app-scoped routes\n this.navigationService.UpdateActiveTabQueryParams(queryParams);\n }\n\n // ========================================\n // Private Methods - Category Helpers\n // ========================================\n\n /**\n * Get all child categories of a parent category recursively\n */\n private getChildCategoriesRecursive(parentId: string): MJDashboardCategoryEntity[] {\n const children: MJDashboardCategoryEntity[] = [];\n const directChildren = this.categories.filter(c => UUIDsEqual(c.ParentID, parentId));\n\n for (const child of directChildren) {\n children.push(child);\n children.push(...this.getChildCategoriesRecursive(child.ID));\n }\n\n return children;\n }\n\n // ========================================\n // Private Methods - View Preference\n // ========================================\n\n private loadViewPreference(): void {\n // TODO: Load from User Settings entity\n const stored = localStorage.getItem('dashboard-browser-view-mode');\n if (stored === 'cards' || stored === 'list') {\n this.viewMode = stored;\n }\n }\n\n private saveViewPreference(mode: DashboardBrowserViewMode): void {\n // TODO: Save to User Settings entity\n localStorage.setItem('dashboard-browser-view-mode', mode);\n }\n}\n","<!-- Dashboard Browser Resource -->\n<div class=\"dashboard-browser-resource\">\n <!-- List Mode - Uses Generic DashboardBrowserComponent -->\n @if (mode === 'list') {\n <mj-dashboard-browser\n [Dashboards]=\"dashboards\"\n [Categories]=\"categories\"\n [SelectedCategoryId]=\"selectedCategoryId\"\n [ViewMode]=\"viewMode\"\n [IsLoading]=\"isLoading\"\n [ShowCreateButton]=\"true\"\n [AllowMultiSelect]=\"true\"\n [AllowDragDrop]=\"true\"\n [DashboardPermissions]=\"dashboardPermissionsMap\"\n [EffectiveCategoryMap]=\"effectiveCategoryMap\"\n (DashboardOpen)=\"onDashboardOpen($event)\"\n (DashboardEdit)=\"onDashboardEdit($event)\"\n (DashboardDelete)=\"onDashboardDelete($event)\"\n (DashboardMove)=\"onDashboardMove($event)\"\n (DashboardCreate)=\"onDashboardCreate($event)\"\n (CategoryCreate)=\"onCategoryCreate($event)\"\n (CategoryDelete)=\"onCategoryDelete($event)\"\n (CategoryChange)=\"onCategoryChange($event)\"\n (ViewPreferenceChange)=\"onViewPreferenceChange($event)\">\n </mj-dashboard-browser>\n }\n\n <!-- View/Edit Mode -->\n @if (mode === 'view' || mode === 'edit') {\n <!-- View Mode Toolbar - matches browser toolbar structure -->\n @if (mode === 'view') {\n <div class=\"viewer-toolbar\">\n <!-- Breadcrumb navigation (includes its own padding/styling) -->\n <mj-dashboard-breadcrumb\n [Categories]=\"categories\"\n [CurrentCategoryId]=\"selectedDashboard?.CategoryID || null\"\n [CurrentDashboard]=\"selectedDashboard\"\n [ShowDashboardName]=\"true\"\n [AllowDragDrop]=\"false\"\n Size=\"large\"\n RootIcon=\"fa-solid fa-gauge-high\"\n RootLabel=\"Dashboards\"\n (Navigate)=\"onBreadcrumbNavigate($event)\">\n </mj-dashboard-breadcrumb>\n <!-- Right-side Actions -->\n <div class=\"toolbar-actions\">\n <!-- Shared indicator for non-owned dashboards -->\n @if (!selectedDashboardPermissions.IsOwner && selectedDashboardPermissions.CanRead) {\n <span class=\"shared-indicator\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n Shared with you\n </span>\n }\n <button\n class=\"btn-icon\"\n title=\"Open in its own tab\"\n (click)=\"openInNewTab()\">\n <i class=\"fa-solid fa-up-right-from-square\"></i>\n </button>\n <!-- Share button - only shown if user can share -->\n @if (selectedDashboardPermissions.CanShare) {\n <button\n class=\"btn-icon\"\n title=\"Share Dashboard\"\n (click)=\"openShareDialog()\">\n <i class=\"fa-solid fa-user-plus\"></i>\n </button>\n }\n <!-- Edit button - only shown if user can edit -->\n @if (selectedDashboardPermissions.CanEdit) {\n <button\n class=\"btn-icon\"\n title=\"Edit Dashboard\"\n (click)=\"toggleEditMode()\">\n <i class=\"fa-solid fa-edit\"></i>\n </button>\n }\n </div>\n </div>\n }\n <!-- Edit Mode Header - different layout -->\n @if (mode === 'edit') {\n <div class=\"viewer-header editing\">\n <div class=\"header-left\">\n <!-- Add Part button on the left -->\n <button\n class=\"btn-add-part\"\n (click)=\"openAddPartDialog()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Part\n </button>\n <!-- Separator -->\n <div class=\"header-separator\"></div>\n <!-- Editable name/description -->\n <div class=\"dashboard-info-edit\">\n <input\n type=\"text\"\n class=\"dashboard-name-input\"\n [(ngModel)]=\"editingName\"\n placeholder=\"Dashboard name\"\n (blur)=\"onNameBlur()\">\n <input\n type=\"text\"\n class=\"dashboard-description-input\"\n [(ngModel)]=\"editingDescription\"\n placeholder=\"Add a description...\">\n </div>\n </div>\n <div class=\"header-right\">\n <!-- Save, Cancel buttons -->\n <button\n class=\"btn-primary\"\n (click)=\"saveDashboard()\">\n <i class=\"fa-solid fa-save\"></i>\n Save\n </button>\n <button\n class=\"btn-cancel\"\n (click)=\"cancelEdit()\">\n Cancel\n </button>\n </div>\n </div>\n }\n <!-- Dashboard Viewer -->\n <div class=\"viewer-content\">\n <mj-dashboard-viewer\n #dashboardViewer\n [dashboard]=\"selectedDashboard\"\n [isEditing]=\"mode === 'edit'\"\n [showToolbar]=\"false\"\n [showBreadcrumb]=\"false\"\n (panelInteraction)=\"onPanelInteraction($event)\"\n (navigationRequested)=\"onNavigationRequested($event)\">\n </mj-dashboard-viewer>\n </div>\n <!-- Add Panel Dialog -->\n @if (dashboardViewer) {\n <mj-add-panel-dialog\n [visible]=\"showAddPanelDialog\"\n [partTypes]=\"dashboardViewer.getPartTypes()\"\n (panelAdded)=\"onPanelAdded($event)\"\n (cancelled)=\"onAddPanelCancelled()\">\n </mj-add-panel-dialog>\n }\n <!-- Generic Edit Part Dialog - dynamically loads config panels via ClassFactory -->\n <mj-edit-part-dialog\n [Visible]=\"showConfigDialog\"\n [PartType]=\"configDialogPartType\"\n [Panel]=\"configDialogPanel\"\n [Config]=\"configDialogPanel?.config || null\"\n (Saved)=\"onConfigDialogSaved($event)\"\n (Cancelled)=\"onConfigDialogCancelled()\">\n </mj-edit-part-dialog>\n <!-- Remove Part Confirmation Dialog -->\n <mj-confirm-dialog\n [visible]=\"showConfirmDialog\"\n type=\"danger\"\n title=\"Remove Part\"\n [message]=\"'Are you sure you want to remove \\'' + confirmPanelTitle + '\\' from this dashboard?'\"\n confirmText=\"Remove\"\n cancelText=\"Cancel\"\n (confirmed)=\"onRemoveConfirmed()\"\n (cancelled)=\"onRemoveCancelled()\">\n </mj-confirm-dialog>\n <!-- Share Dashboard Dialog -->\n <mj-dashboard-share-dialog\n [Visible]=\"showShareDialog\"\n [Dashboard]=\"selectedDashboard\"\n (Result)=\"onShareDialogResult($event)\">\n </mj-dashboard-share-dialog>\n }\n</div>\n"]}