@memberjunction/ng-dashboards 5.34.1 → 5.36.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 (407) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts +51 -0
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +399 -292
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +8 -2
  6. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -1
  7. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +87 -85
  8. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
  9. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +96 -0
  10. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
  11. package/dist/AI/components/analytics/ai-analytics-resource.component.js +453 -122
  12. package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
  13. package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts +5 -0
  14. package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts.map +1 -1
  15. package/dist/AI/components/analytics/analytics-filter-bar.component.js +184 -135
  16. package/dist/AI/components/analytics/analytics-filter-bar.component.js.map +1 -1
  17. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +8 -2
  18. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
  19. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +104 -103
  20. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
  21. package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +8 -2
  22. package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -1
  23. package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +76 -74
  24. package/dist/AI/components/analytics/error-analysis/error-analysis.component.js.map +1 -1
  25. package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
  26. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +67 -87
  27. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
  28. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +12 -19
  29. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
  30. package/dist/AI/components/analytics/model-performance/model-performance.component.js +96 -203
  31. package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
  32. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
  33. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +110 -126
  34. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
  35. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
  36. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +61 -77
  37. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
  38. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +28 -0
  39. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  40. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +2084 -2079
  41. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  42. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +6 -3
  43. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  44. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +493 -490
  45. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  46. package/dist/AI/components/models/model-management.component.d.ts +17 -0
  47. package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
  48. package/dist/AI/components/models/model-management.component.js +370 -425
  49. package/dist/AI/components/models/model-management.component.js.map +1 -1
  50. package/dist/AI/components/prompts/prompt-management.component.d.ts +17 -0
  51. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
  52. package/dist/AI/components/prompts/prompt-management.component.js +317 -357
  53. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  54. package/dist/AI/components/requests/agent-requests-resource.component.d.ts +11 -0
  55. package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -1
  56. package/dist/AI/components/requests/agent-requests-resource.component.js +170 -175
  57. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
  58. package/dist/AI/components/system/system-configuration.component.d.ts +19 -0
  59. package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
  60. package/dist/AI/components/system/system-configuration.component.js +403 -362
  61. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  62. package/dist/AI/components/tags/tags-resource.component.d.ts +15 -0
  63. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  64. package/dist/AI/components/tags/tags-resource.component.js +1423 -1438
  65. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  66. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +8 -3
  67. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  68. package/dist/AI/components/vectors/vector-management-resource.component.js +547 -521
  69. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  70. package/dist/APIKeys/api-keys-resource.component.d.ts +12 -8
  71. package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
  72. package/dist/APIKeys/api-keys-resource.component.js +329 -371
  73. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  74. package/dist/Actions/components/actions-overview.component.d.ts +6 -0
  75. package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
  76. package/dist/Actions/components/actions-overview.component.js +202 -158
  77. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  78. package/dist/Actions/components/execution-monitoring.component.d.ts +9 -3
  79. package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
  80. package/dist/Actions/components/execution-monitoring.component.js +191 -142
  81. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  82. package/dist/Actions/components/explorer/action-explorer.component.d.ts +41 -1
  83. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
  84. package/dist/Actions/components/explorer/action-explorer.component.js +388 -94
  85. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  86. package/dist/Actions/components/explorer/index.d.ts +0 -1
  87. package/dist/Actions/components/explorer/index.d.ts.map +1 -1
  88. package/dist/Actions/components/explorer/index.js +0 -1
  89. package/dist/Actions/components/explorer/index.js.map +1 -1
  90. package/dist/Admin/admin-data-schema.component.js +19 -79
  91. package/dist/Admin/admin-data-schema.component.js.map +1 -1
  92. package/dist/Admin/admin-dev-tools-resource.component.js +19 -79
  93. package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
  94. package/dist/Admin/admin-identity-access.component.js +19 -79
  95. package/dist/Admin/admin-identity-access.component.js.map +1 -1
  96. package/dist/Admin/admin-monitoring.component.js +19 -79
  97. package/dist/Admin/admin-monitoring.component.js.map +1 -1
  98. package/dist/Admin/base-admin-container.component.d.ts +9 -7
  99. package/dist/Admin/base-admin-container.component.d.ts.map +1 -1
  100. package/dist/Admin/base-admin-container.component.js +26 -17
  101. package/dist/Admin/base-admin-container.component.js.map +1 -1
  102. package/dist/ApplicationRoles/application-roles-resource.component.js +92 -91
  103. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
  104. package/dist/Archiving/components/archive-config-resource.component.d.ts.map +1 -1
  105. package/dist/Archiving/components/archive-config-resource.component.js +24 -5
  106. package/dist/Archiving/components/archive-config-resource.component.js.map +1 -1
  107. package/dist/Archiving/components/archive-runs-resource.component.d.ts.map +1 -1
  108. package/dist/Archiving/components/archive-runs-resource.component.js +24 -5
  109. package/dist/Archiving/components/archive-runs-resource.component.js.map +1 -1
  110. package/dist/Communication/communication-logs-resource.component.d.ts +1 -1
  111. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  112. package/dist/Communication/communication-logs-resource.component.js +80 -99
  113. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  114. package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
  115. package/dist/Communication/communication-monitor-resource.component.js +127 -106
  116. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  117. package/dist/Communication/communication-new-message-resource.component.d.ts +93 -0
  118. package/dist/Communication/communication-new-message-resource.component.d.ts.map +1 -0
  119. package/dist/Communication/communication-new-message-resource.component.js +661 -0
  120. package/dist/Communication/communication-new-message-resource.component.js.map +1 -0
  121. package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
  122. package/dist/Communication/communication-providers-resource.component.js +44 -45
  123. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  124. package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
  125. package/dist/Communication/communication-runs-resource.component.js +60 -58
  126. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  127. package/dist/Communication/communication-templates-resource.component.d.ts +1 -1
  128. package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
  129. package/dist/Communication/communication-templates-resource.component.js +139 -162
  130. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  131. package/dist/Credentials/components/credentials-audit-resource.component.d.ts +7 -0
  132. package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
  133. package/dist/Credentials/components/credentials-audit-resource.component.js +310 -297
  134. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  135. package/dist/Credentials/components/credentials-categories-resource.component.js +238 -266
  136. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  137. package/dist/Credentials/components/credentials-list-resource.component.d.ts +7 -0
  138. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  139. package/dist/Credentials/components/credentials-list-resource.component.js +381 -399
  140. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  141. package/dist/Credentials/components/credentials-overview-resource.component.js +222 -228
  142. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  143. package/dist/Credentials/components/credentials-types-resource.component.d.ts +6 -0
  144. package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
  145. package/dist/Credentials/components/credentials-types-resource.component.js +290 -305
  146. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  147. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts +8 -0
  148. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts.map +1 -1
  149. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +41 -21
  150. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
  151. package/dist/DatabaseDesigner/components/entity-list.component.d.ts +2 -0
  152. package/dist/DatabaseDesigner/components/entity-list.component.d.ts.map +1 -1
  153. package/dist/DatabaseDesigner/components/entity-list.component.js +148 -155
  154. package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
  155. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
  156. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
  157. package/dist/DatabaseDesigner/database-designer-dashboards.module.js +25 -1
  158. package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
  159. package/dist/DevTools/app-state-inspector.component.d.ts +5 -0
  160. package/dist/DevTools/app-state-inspector.component.d.ts.map +1 -1
  161. package/dist/DevTools/app-state-inspector.component.js +46 -72
  162. package/dist/DevTools/app-state-inspector.component.js.map +1 -1
  163. package/dist/DevTools/class-registry.component.js +88 -100
  164. package/dist/DevTools/class-registry.component.js.map +1 -1
  165. package/dist/DevTools/event-monitor.component.js +158 -168
  166. package/dist/DevTools/event-monitor.component.js.map +1 -1
  167. package/dist/DevTools/graphql-console.component.js +257 -264
  168. package/dist/DevTools/graphql-console.component.js.map +1 -1
  169. package/dist/DevTools/layout-inspector.component.d.ts +5 -0
  170. package/dist/DevTools/layout-inspector.component.d.ts.map +1 -1
  171. package/dist/DevTools/layout-inspector.component.js +46 -64
  172. package/dist/DevTools/layout-inspector.component.js.map +1 -1
  173. package/dist/DevTools/lazy-module-status.component.js +75 -84
  174. package/dist/DevTools/lazy-module-status.component.js.map +1 -1
  175. package/dist/DevTools/settings-explorer.component.js +76 -85
  176. package/dist/DevTools/settings-explorer.component.js.map +1 -1
  177. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +2 -0
  178. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
  179. package/dist/EntityAdmin/entity-admin-dashboard.component.js +24 -16
  180. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  181. package/dist/Home/home-dashboard.component.d.ts +6 -0
  182. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  183. package/dist/Home/home-dashboard.component.js +521 -485
  184. package/dist/Home/home-dashboard.component.js.map +1 -1
  185. package/dist/Integration/components/activity/activity.component.d.ts +8 -0
  186. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  187. package/dist/Integration/components/activity/activity.component.js +307 -318
  188. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  189. package/dist/Integration/components/connections/connections.component.js +654 -648
  190. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  191. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +234 -233
  192. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  193. package/dist/Integration/components/overview/overview.component.js +182 -163
  194. package/dist/Integration/components/overview/overview.component.js.map +1 -1
  195. package/dist/Integration/components/pipelines/pipelines.component.d.ts +2 -0
  196. package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
  197. package/dist/Integration/components/pipelines/pipelines.component.js +595 -606
  198. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  199. package/dist/Integration/components/schedules/schedules.component.js +230 -241
  200. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  201. package/dist/Integration/integration.module.d.ts +1 -1
  202. package/dist/Integration/integration.module.d.ts.map +1 -1
  203. package/dist/Integration/integration.module.js +28 -1
  204. package/dist/Integration/integration.module.js.map +1 -1
  205. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +5 -0
  206. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
  207. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +1138 -1147
  208. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  209. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +54 -51
  210. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  211. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +11 -0
  212. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
  213. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +684 -697
  214. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  215. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +12 -1
  216. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -1
  217. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +191 -120
  218. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
  219. package/dist/Lists/components/lists-browse-resource.component.d.ts +120 -1
  220. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  221. package/dist/Lists/components/lists-browse-resource.component.js +1239 -610
  222. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  223. package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
  224. package/dist/Lists/components/lists-categories-resource.component.js +152 -160
  225. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  226. package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
  227. package/dist/Lists/components/lists-my-lists-resource.component.js +302 -319
  228. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  229. package/dist/Lists/components/lists-operations-resource.component.d.ts +133 -3
  230. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  231. package/dist/Lists/components/lists-operations-resource.component.js +1460 -272
  232. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  233. package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts +29 -0
  234. package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts.map +1 -0
  235. package/dist/Lists/components/lists-shared-with-me-resource.component.js +77 -0
  236. package/dist/Lists/components/lists-shared-with-me-resource.component.js.map +1 -0
  237. package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts +6 -0
  238. package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts.map +1 -1
  239. package/dist/Lists/components/venn-diagram/venn-diagram.component.js +35 -7
  240. package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
  241. package/dist/Lists/index.d.ts +1 -0
  242. package/dist/Lists/index.d.ts.map +1 -1
  243. package/dist/Lists/index.js +1 -0
  244. package/dist/Lists/index.js.map +1 -1
  245. package/dist/Lists/services/list-set-operations.service.d.ts +93 -2
  246. package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
  247. package/dist/Lists/services/list-set-operations.service.js +236 -10
  248. package/dist/Lists/services/list-set-operations.service.js.map +1 -1
  249. package/dist/MCP/mcp-dashboard.component.d.ts +20 -0
  250. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
  251. package/dist/MCP/mcp-dashboard.component.js +1248 -1338
  252. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  253. package/dist/MCP/mcp.module.d.ts +1 -1
  254. package/dist/MCP/mcp.module.d.ts.map +1 -1
  255. package/dist/MCP/mcp.module.js +34 -1
  256. package/dist/MCP/mcp.module.js.map +1 -1
  257. package/dist/Permissions/audit-log-resource.component.js +76 -85
  258. package/dist/Permissions/audit-log-resource.component.js.map +1 -1
  259. package/dist/Permissions/resource-access-resource.component.js +64 -69
  260. package/dist/Permissions/resource-access-resource.component.js.map +1 -1
  261. package/dist/Permissions/user-access-resource.component.js +63 -74
  262. package/dist/Permissions/user-access-resource.component.js.map +1 -1
  263. package/dist/QueryBrowser/query-browser-resource.component.js +2 -2
  264. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  265. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts +2 -1
  266. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
  267. package/dist/Scheduling/components/scheduling-activity-resource.component.js +11 -12
  268. package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
  269. package/dist/Scheduling/components/scheduling-activity.component.d.ts +9 -1
  270. package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
  271. package/dist/Scheduling/components/scheduling-activity.component.js +250 -197
  272. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  273. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts +2 -1
  274. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
  275. package/dist/Scheduling/components/scheduling-jobs-resource.component.js +11 -12
  276. package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
  277. package/dist/Scheduling/components/scheduling-jobs.component.d.ts +9 -1
  278. package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
  279. package/dist/Scheduling/components/scheduling-jobs.component.js +203 -147
  280. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  281. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts +2 -1
  282. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
  283. package/dist/Scheduling/components/scheduling-overview-resource.component.js +11 -12
  284. package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
  285. package/dist/Scheduling/components/scheduling-overview.component.d.ts +3 -1
  286. package/dist/Scheduling/components/scheduling-overview.component.d.ts.map +1 -1
  287. package/dist/Scheduling/components/scheduling-overview.component.js +224 -190
  288. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  289. package/dist/Scheduling/scheduling-dashboard.component.d.ts +19 -6
  290. package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
  291. package/dist/Scheduling/scheduling-dashboard.component.js +259 -103
  292. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  293. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +13 -3
  294. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  295. package/dist/SystemDiagnostics/system-diagnostics.component.js +1009 -1264
  296. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  297. package/dist/Testing/components/testing-analytics-resource.component.d.ts +2 -1
  298. package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
  299. package/dist/Testing/components/testing-analytics-resource.component.js +7 -14
  300. package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
  301. package/dist/Testing/components/testing-analytics.component.d.ts +3 -1
  302. package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -1
  303. package/dist/Testing/components/testing-analytics.component.js +420 -393
  304. package/dist/Testing/components/testing-analytics.component.js.map +1 -1
  305. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +2 -1
  306. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
  307. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +16 -19
  308. package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
  309. package/dist/Testing/components/testing-dashboard-tab.component.d.ts +3 -1
  310. package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
  311. package/dist/Testing/components/testing-dashboard-tab.component.js +157 -122
  312. package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
  313. package/dist/Testing/components/testing-explorer-resource.component.d.ts +2 -1
  314. package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
  315. package/dist/Testing/components/testing-explorer-resource.component.js +7 -12
  316. package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
  317. package/dist/Testing/components/testing-explorer.component.d.ts +38 -6
  318. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  319. package/dist/Testing/components/testing-explorer.component.js +679 -786
  320. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  321. package/dist/Testing/components/testing-review-resource.component.d.ts +4 -1
  322. package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
  323. package/dist/Testing/components/testing-review-resource.component.js +9 -12
  324. package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
  325. package/dist/Testing/components/testing-review.component.d.ts +3 -1
  326. package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
  327. package/dist/Testing/components/testing-review.component.js +310 -274
  328. package/dist/Testing/components/testing-review.component.js.map +1 -1
  329. package/dist/Testing/components/testing-runs-resource.component.d.ts +2 -1
  330. package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
  331. package/dist/Testing/components/testing-runs-resource.component.js +16 -19
  332. package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
  333. package/dist/Testing/components/testing-runs.component.d.ts +3 -1
  334. package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
  335. package/dist/Testing/components/testing-runs.component.js +307 -273
  336. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  337. package/dist/Testing/testing-dashboard.component.d.ts +2 -0
  338. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  339. package/dist/Testing/testing-dashboard.component.js +114 -99
  340. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  341. package/dist/VersionHistory/components/diff-resource.component.js +185 -188
  342. package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
  343. package/dist/VersionHistory/components/graph-resource.component.js +154 -184
  344. package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
  345. package/dist/VersionHistory/components/labels-resource.component.d.ts +7 -0
  346. package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
  347. package/dist/VersionHistory/components/labels-resource.component.js +350 -354
  348. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  349. package/dist/VersionHistory/components/restore-resource.component.js +163 -169
  350. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  351. package/dist/actions-dashboards.module.d.ts +15 -16
  352. package/dist/actions-dashboards.module.d.ts.map +1 -1
  353. package/dist/actions-dashboards.module.js +34 -11
  354. package/dist/actions-dashboards.module.js.map +1 -1
  355. package/dist/ai-dashboards.module.d.ts +45 -48
  356. package/dist/ai-dashboards.module.d.ts.map +1 -1
  357. package/dist/ai-dashboards.module.js +51 -10
  358. package/dist/ai-dashboards.module.js.map +1 -1
  359. package/dist/archiving-dashboards.module.d.ts +2 -1
  360. package/dist/archiving-dashboards.module.d.ts.map +1 -1
  361. package/dist/archiving-dashboards.module.js +12 -2
  362. package/dist/archiving-dashboards.module.js.map +1 -1
  363. package/dist/communication-dashboards.module.d.ts +9 -6
  364. package/dist/communication-dashboards.module.d.ts.map +1 -1
  365. package/dist/communication-dashboards.module.js +37 -7
  366. package/dist/communication-dashboards.module.js.map +1 -1
  367. package/dist/core-dashboards.module.d.ts +1 -1
  368. package/dist/core-dashboards.module.d.ts.map +1 -1
  369. package/dist/core-dashboards.module.js +46 -1
  370. package/dist/core-dashboards.module.js.map +1 -1
  371. package/dist/credentials-dashboards.module.d.ts +1 -1
  372. package/dist/credentials-dashboards.module.d.ts.map +1 -1
  373. package/dist/credentials-dashboards.module.js +28 -1
  374. package/dist/credentials-dashboards.module.js.map +1 -1
  375. package/dist/lists-dashboards.module.d.ts +10 -9
  376. package/dist/lists-dashboards.module.d.ts.map +1 -1
  377. package/dist/lists-dashboards.module.js +40 -2
  378. package/dist/lists-dashboards.module.js.map +1 -1
  379. package/dist/public-api.d.ts +3 -2
  380. package/dist/public-api.d.ts.map +1 -1
  381. package/dist/public-api.js +4 -3
  382. package/dist/public-api.js.map +1 -1
  383. package/dist/scheduling-dashboards.module.d.ts +1 -1
  384. package/dist/scheduling-dashboards.module.d.ts.map +1 -1
  385. package/dist/scheduling-dashboards.module.js +31 -1
  386. package/dist/scheduling-dashboards.module.js.map +1 -1
  387. package/dist/testing-dashboards.module.d.ts +8 -7
  388. package/dist/testing-dashboards.module.d.ts.map +1 -1
  389. package/dist/testing-dashboards.module.js +42 -0
  390. package/dist/testing-dashboards.module.js.map +1 -1
  391. package/package.json +53 -52
  392. package/dist/AI/components/agents/agent-filter-panel.component.d.ts +0 -56
  393. package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +0 -1
  394. package/dist/AI/components/agents/agent-filter-panel.component.js +0 -285
  395. package/dist/AI/components/agents/agent-filter-panel.component.js.map +0 -1
  396. package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts +0 -49
  397. package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts.map +0 -1
  398. package/dist/AI/components/prompts/prompt-filter-panel.component.js +0 -184
  399. package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +0 -1
  400. package/dist/AI/components/system/system-config-filter-panel.component.d.ts +0 -33
  401. package/dist/AI/components/system/system-config-filter-panel.component.d.ts.map +0 -1
  402. package/dist/AI/components/system/system-config-filter-panel.component.js +0 -144
  403. package/dist/AI/components/system/system-config-filter-panel.component.js.map +0 -1
  404. package/dist/Actions/components/explorer/action-toolbar.component.d.ts +0 -63
  405. package/dist/Actions/components/explorer/action-toolbar.component.d.ts.map +0 -1
  406. package/dist/Actions/components/explorer/action-toolbar.component.js +0 -463
  407. package/dist/Actions/components/explorer/action-toolbar.component.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"lists-browse-resource.component.js","sourceRoot":"","sources":["../../../src/Lists/components/lists-browse-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewEncapsulation, ChangeDetectorRef, OnDestroy, ElementRef, HostListener } from '@angular/core';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData, MJListCategoryEntity } from '@memberjunction/core-entities';\nimport { MJListEntity, MJListDetailEntity } from '@memberjunction/core-entities';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { Subject } from 'rxjs';\nimport { TabService } from '@memberjunction/ng-base-application';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { ListSharingService, ListSharingSummary, ListShareDialogConfig, ListShareDialogResult } from '@memberjunction/ng-list-management';\ninterface BrowseListItem {\n list: MJListEntity;\n itemCount: number;\n entityName: string;\n ownerName: string;\n isOwner: boolean;\n sharingInfo?: ListSharingSummary;\n}\n\ninterface CategoryNode {\n category: MJListCategoryEntity | null;\n lists: BrowseListItem[];\n children: CategoryNode[];\n isExpanded: boolean;\n}\n\ntype ViewMode = 'table' | 'card' | 'hierarchy';\n\n@RegisterClass(BaseResourceComponent, 'ListsBrowseResource')\n@Component({\n standalone: false,\n selector: 'mj-lists-browse-resource',\n template: `\n <div class=\"lists-browse-container\">\n <!-- Header -->\n <div class=\"browse-header\">\n <div class=\"header-row\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-list-check\"></i>\n <h2>Lists</h2>\n </div>\n <button class=\"btn-create\" (click)=\"createNewList()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>New List</span>\n </button>\n </div>\n \n <div class=\"header-actions\">\n <div class=\"search-box\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n type=\"text\"\n placeholder=\"Search lists...\"\n [(ngModel)]=\"searchTerm\"\n (ngModelChange)=\"onSearchChange($event)\" />\n @if (searchTerm) {\n <button class=\"clear-search\" (click)=\"clearSearch()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n \n <div class=\"filter-group\">\n <select\n [(ngModel)]=\"selectedOwner\"\n (ngModelChange)=\"onOwnerFilterChange($event)\"\n class=\"filter-select\"\n title=\"Filter by owner\">\n @for (opt of ownerOptions; track opt) {\n <option [value]=\"opt.value\">{{opt.name}}</option>\n }\n </select>\n </div>\n \n <div class=\"filter-group\">\n <select\n [(ngModel)]=\"selectedEntity\"\n (ngModelChange)=\"onEntityFilterChange($event)\"\n class=\"filter-select\"\n title=\"Filter by entity\">\n @for (opt of entityOptions; track opt) {\n <option [value]=\"opt.value\">{{opt.name}}</option>\n }\n </select>\n </div>\n \n <div class=\"view-toggle-group\">\n <button\n class=\"view-toggle\"\n [class.active]=\"viewMode === 'table'\"\n (click)=\"setViewMode('table')\"\n title=\"Table view\">\n <i class=\"fa-solid fa-table-list\"></i>\n </button>\n <button\n class=\"view-toggle\"\n [class.active]=\"viewMode === 'card'\"\n (click)=\"setViewMode('card')\"\n title=\"Card view\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n <button\n class=\"view-toggle\"\n [class.active]=\"viewMode === 'hierarchy'\"\n (click)=\"setViewMode('hierarchy')\"\n title=\"Category view\">\n <i class=\"fa-solid fa-folder-tree\"></i>\n </button>\n </div>\n </div>\n </div>\n \n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading lists...\" size=\"medium\"></mj-loading>\n </div>\n }\n \n <!-- Empty State - No Lists -->\n @if (!isLoading && allLists.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-state-icon-wrapper\">\n <div class=\"icon-bg\"></div>\n <i class=\"fa-solid fa-list-check\"></i>\n </div>\n <h3>No Lists Yet</h3>\n <p>Lists help you organize and track groups of records across your data.</p>\n <div class=\"empty-state-features\">\n <div class=\"feature-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Group records from any entity</span>\n </div>\n <div class=\"feature-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Organize with categories</span>\n </div>\n <div class=\"feature-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Quick access from any view</span>\n </div>\n </div>\n <button class=\"btn-create-large\" (click)=\"createNewList()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Your First List\n </button>\n </div>\n }\n \n <!-- Empty State - No Results -->\n @if (!isLoading && allLists.length > 0 && filteredLists.length === 0) {\n <div class=\"empty-state search-empty\">\n <div class=\"empty-state-icon-wrapper search\">\n <i class=\"fa-solid fa-filter-circle-xmark\"></i>\n </div>\n <h3>No Results Found</h3>\n <p>No lists match your current filters.</p>\n <p class=\"empty-hint\">Try adjusting your search or filters.</p>\n <button class=\"btn-clear\" (click)=\"clearFilters()\">Clear All Filters</button>\n </div>\n }\n \n <!-- Results Content -->\n @if (!isLoading && filteredLists.length > 0) {\n <div class=\"browse-content\">\n <div class=\"results-header\">\n <span class=\"result-count\">{{filteredLists.length}} list{{filteredLists.length !== 1 ? 's' : ''}}</span>\n <div class=\"sort-options\">\n <label>Sort:</label>\n <select\n [(ngModel)]=\"selectedSort\"\n (ngModelChange)=\"onSortChange($event)\"\n class=\"filter-select sort-select\">\n @for (opt of sortOptions; track opt) {\n <option [value]=\"opt.value\">{{opt.name}}</option>\n }\n </select>\n </div>\n </div>\n <!-- Table View -->\n @if (viewMode === 'table') {\n <div class=\"lists-table\">\n <table role=\"grid\" aria-label=\"Lists table\">\n <thead>\n <tr>\n <th class=\"col-name\" scope=\"col\">Name</th>\n <th class=\"col-entity\" scope=\"col\">Entity</th>\n <th class=\"col-items\" scope=\"col\">Items</th>\n <th class=\"col-sharing\" scope=\"col\">Shared</th>\n <th class=\"col-owner\" scope=\"col\">Owner</th>\n <th class=\"col-updated\" scope=\"col\">Updated</th>\n <th class=\"col-actions\" scope=\"col\"><span class=\"sr-only\">Actions</span></th>\n </tr>\n </thead>\n <tbody>\n @for (item of filteredLists; track item) {\n <tr\n (click)=\"openList(item)\"\n (keydown.enter)=\"openList(item)\"\n class=\"list-row\"\n tabindex=\"0\"\n role=\"row\">\n <td class=\"col-name\" role=\"gridcell\">\n <div class=\"name-cell\">\n <div class=\"list-icon\" [style.background-color]=\"getEntityColor(item.entityName)\" aria-hidden=\"true\">\n <i [class]=\"getEntityIcon(item.entityName)\"></i>\n </div>\n <div class=\"name-content\">\n <span class=\"list-name\">{{item.list.Name}}</span>\n @if (item.list.Description) {\n <span class=\"list-desc\">{{item.list.Description}}</span>\n }\n </div>\n </div>\n </td>\n <td class=\"col-entity\" role=\"gridcell\">\n <span class=\"entity-badge\">{{item.entityName}}</span>\n </td>\n <td class=\"col-items\" role=\"gridcell\">{{item.itemCount}}</td>\n <td class=\"col-sharing\" role=\"gridcell\">\n @if (item.sharingInfo; as sharing) {\n @if (sharing.totalShares > 0) {\n <span class=\"sharing-indicator\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n <span class=\"share-count\">{{sharing.totalShares}}</span>\n </span>\n }\n @if (sharing.totalShares === 0) {\n <span class=\"sharing-private\">\n <i class=\"fa-solid fa-lock\"></i>\n </span>\n }\n }\n @if (!item.sharingInfo) {\n <span class=\"sharing-private\">\n <i class=\"fa-solid fa-lock\"></i>\n </span>\n }\n </td>\n <td class=\"col-owner\" role=\"gridcell\">\n <span class=\"owner-name\" [class.is-me]=\"item.isOwner\">\n {{item.isOwner ? 'You' : item.ownerName}}\n </span>\n </td>\n <td class=\"col-updated\" role=\"gridcell\">{{formatDate(item.list.__mj_UpdatedAt)}}</td>\n <td class=\"col-actions\" role=\"gridcell\">\n @if (item.isOwner) {\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"openListMenu($event, item)\"\n title=\"More options\">\n <i class=\"fa-solid fa-ellipsis-v\" aria-hidden=\"true\"></i>\n </button>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n <!-- Card View -->\n @if (viewMode === 'card') {\n <div class=\"lists-grid\" role=\"list\" aria-label=\"Lists\">\n @for (item of filteredLists; track item) {\n <div\n class=\"list-card\"\n (click)=\"openList(item)\"\n (keydown.enter)=\"openList(item)\"\n tabindex=\"0\"\n role=\"listitem\">\n <div class=\"card-header\">\n <div class=\"card-icon\" [style.background-color]=\"getEntityColor(item.entityName)\" aria-hidden=\"true\">\n <i [class]=\"getEntityIcon(item.entityName)\"></i>\n </div>\n @if (item.isOwner) {\n <div class=\"card-menu\">\n <button class=\"menu-btn\" (click)=\"openListMenu($event, item)\">\n <i class=\"fa-solid fa-ellipsis-v\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n </div>\n <div class=\"card-body\">\n <h3 class=\"card-title\">{{item.list.Name}}</h3>\n @if (item.list.Description) {\n <p class=\"card-description\">{{item.list.Description}}</p>\n }\n <div class=\"card-meta\">\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-database\"></i>\n {{item.entityName}}\n </span>\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-hashtag\"></i>\n {{item.itemCount}} item{{item.itemCount !== 1 ? 's' : ''}}\n </span>\n </div>\n </div>\n <div class=\"card-footer\">\n <span class=\"owner-tag\" [class.is-me]=\"item.isOwner\">\n <i class=\"fa-solid fa-user\"></i>\n {{item.isOwner ? 'You' : item.ownerName}}\n </span>\n <div class=\"card-footer-right\">\n @if (item.sharingInfo; as sharing) {\n @if (sharing.totalShares > 0) {\n <span class=\"sharing-badge\" [title]=\"'Shared with ' + sharing.totalShares + ' user(s)/role(s)'\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n </span>\n }\n }\n <span class=\"date-info\">{{formatDate(item.list.__mj_UpdatedAt)}}</span>\n </div>\n </div>\n </div>\n }\n </div>\n }\n <!-- Hierarchy View -->\n @if (viewMode === 'hierarchy') {\n <div class=\"category-tree\">\n @for (node of categoryTree; track node) {\n <ng-container *ngTemplateOutlet=\"categoryNodeTemplate; context: { node: node, depth: 0 }\"></ng-container>\n }\n </div>\n }\n </div>\n }\n \n <!-- Category Node Template -->\n <ng-template #categoryNodeTemplate let-node=\"node\" let-depth=\"depth\">\n <div class=\"category-section\" [style.margin-left.px]=\"depth * 20\">\n <!-- Category Header -->\n @if (node.category) {\n <div\n class=\"category-header\"\n (click)=\"toggleCategory(node)\">\n <i [class]=\"node.isExpanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"></i>\n <i class=\"fa-solid fa-folder\" [class.fa-folder-open]=\"node.isExpanded\"></i>\n <span class=\"category-name\">{{node.category.Name}}</span>\n <span class=\"category-count\">{{getListCountInCategory(node)}}</span>\n </div>\n }\n \n <!-- Uncategorized Header -->\n @if (!node.category && node.lists.length > 0) {\n <div\n class=\"category-header uncategorized\"\n (click)=\"toggleCategory(node)\">\n <i [class]=\"node.isExpanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"></i>\n <i class=\"fa-solid fa-inbox\"></i>\n <span class=\"category-name\">Uncategorized</span>\n <span class=\"category-count\">{{node.lists.length}}</span>\n </div>\n }\n \n <!-- Lists in this category -->\n @if (node.isExpanded) {\n <div class=\"category-lists\" role=\"list\">\n @for (item of node.lists; track item) {\n <div\n class=\"list-row hierarchy-row\"\n (click)=\"openList(item)\"\n (keydown.enter)=\"openList(item)\"\n tabindex=\"0\"\n role=\"listitem\">\n <div class=\"list-icon\" [style.background-color]=\"getEntityColor(item.entityName)\" aria-hidden=\"true\">\n <i [class]=\"getEntityIcon(item.entityName)\"></i>\n </div>\n <div class=\"list-info\">\n <span class=\"list-name\">{{item.list.Name}}</span>\n <span class=\"list-meta\">\n {{item.entityName}} &middot; {{item.itemCount}} items\n @if (!item.isOwner) {\n <span> &middot; {{item.ownerName}}</span>\n }\n </span>\n </div>\n @if (item.isOwner) {\n <div class=\"list-actions\">\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"openListMenu($event, item)\">\n <i class=\"fa-solid fa-ellipsis-v\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n \n <!-- Child categories -->\n @if (node.isExpanded) {\n @for (child of node.children; track child) {\n <ng-container *ngTemplateOutlet=\"categoryNodeTemplate; context: { node: child, depth: depth + 1 }\"></ng-container>\n }\n }\n </div>\n </ng-template>\n \n <!-- Context Menu -->\n @if (showContextMenu) {\n <div class=\"context-menu-overlay\" (click)=\"closeContextMenu()\"></div>\n }\n @if (showContextMenu) {\n <div class=\"context-menu\" [style.top.px]=\"contextMenuY\" [style.left.px]=\"contextMenuX\">\n <button class=\"menu-item\" (click)=\"editList()\">\n <i class=\"fa-solid fa-pen\"></i>\n Edit\n </button>\n <button class=\"menu-item\" (click)=\"openShareDialog()\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n Share\n </button>\n <button class=\"menu-item\" (click)=\"duplicateList()\">\n <i class=\"fa-solid fa-copy\"></i>\n Duplicate\n </button>\n <div class=\"menu-divider\"></div>\n <button class=\"menu-item danger\" (click)=\"confirmDeleteList()\">\n <i class=\"fa-solid fa-trash\"></i>\n Delete\n </button>\n </div>\n }\n \n <!-- Create/Edit Dialog -->\n @if (showCreateDialog) {\n <div class=\"modal-overlay\" (click)=\"closeCreateDialog()\"></div>\n }\n @if (showCreateDialog) {\n <div class=\"modal-dialog\">\n <div class=\"modal-header\">\n <h3>{{editingList ? 'Edit List' : 'Create New List'}}</h3>\n <button class=\"modal-close\" (click)=\"closeCreateDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"form-group\">\n <label>Name *</label>\n <input\n type=\"text\"\n [(ngModel)]=\"newListName\"\n placeholder=\"Enter list name\"\n class=\"form-input\" />\n </div>\n <div class=\"form-group\">\n <label>Description</label>\n <textarea\n [(ngModel)]=\"newListDescription\"\n placeholder=\"Optional description\"\n class=\"form-input\"\n rows=\"3\"></textarea>\n </div>\n @if (!editingList) {\n <div class=\"form-group\">\n <label>Entity *</label>\n <div class=\"custom-select-wrapper\">\n <input\n #entityInput\n type=\"text\"\n [(ngModel)]=\"entitySearchTerm\"\n (ngModelChange)=\"filterEntities($event)\"\n (focus)=\"openEntityDropdown(entityInput)\"\n placeholder=\"Search and select an entity\"\n class=\"form-input\" />\n </div>\n </div>\n }\n @if (editingList) {\n <div class=\"form-group\">\n <label>Entity</label>\n <input type=\"text\" [value]=\"entitySearchTerm\" class=\"form-input\" disabled />\n </div>\n }\n <div class=\"form-group\">\n <label>Category</label>\n <select [(ngModel)]=\"selectedCategoryId\" class=\"form-input\">\n <option [ngValue]=\"null\">No category</option>\n @for (cat of flatCategories; track cat) {\n <option [ngValue]=\"cat.ID\">{{cat.displayName}}</option>\n }\n </select>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn-primary\"\n (click)=\"saveList()\"\n [disabled]=\"!newListName || (!editingList && !selectedEntityId) || isSaving\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{isSaving ? 'Saving...' : (editingList ? 'Save' : 'Create')}}\n </button>\n <button class=\"btn-secondary\" (click)=\"closeCreateDialog()\" [disabled]=\"isSaving\">Cancel</button>\n </div>\n </div>\n }\n \n <!-- Delete Confirmation Dialog -->\n @if (showDeleteConfirm) {\n <div class=\"modal-overlay\" (click)=\"cancelDelete()\"></div>\n }\n @if (showDeleteConfirm) {\n <div class=\"modal-dialog confirm-dialog\">\n <div class=\"modal-header\">\n <h3>Delete List</h3>\n <button class=\"modal-close\" (click)=\"cancelDelete()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <p>Are you sure you want to delete \"<strong>{{deleteListName}}</strong>\"?</p>\n <p class=\"warning-text\">This will also remove all items in the list.</p>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn-danger\" (click)=\"deleteList()\" [disabled]=\"isDeleting\">\n @if (isDeleting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{isDeleting ? 'Deleting...' : 'Delete'}}\n </button>\n <button class=\"btn-secondary\" (click)=\"cancelDelete()\" [disabled]=\"isDeleting\">Cancel</button>\n </div>\n </div>\n }\n \n <!-- Share Dialog -->\n @if (shareDialogConfig) {\n <mj-list-share-dialog\n [config]=\"shareDialogConfig\"\n [visible]=\"showShareDialog\"\n (complete)=\"onShareComplete($event)\"\n (cancel)=\"onShareCancel()\">\n </mj-list-share-dialog>\n }\n \n <!-- Entity Dropdown Portal -->\n @if (showEntityDropdown && !editingList) {\n <div\n class=\"entity-dropdown-portal\"\n [style.top.px]=\"entityDropdownPosition.top\"\n [style.left.px]=\"entityDropdownPosition.left\"\n [style.width.px]=\"entityDropdownPosition.width\"\n [class.dropdown-above]=\"entityDropdownPosition.openAbove\">\n <div class=\"entity-dropdown-content\" [class.open-above]=\"entityDropdownPosition.openAbove\">\n @for (entity of filteredEntitiesList; track entity) {\n <div\n class=\"dropdown-item\"\n (mousedown)=\"selectEntity(entity); $event.preventDefault()\">\n {{entity.Name}}\n </div>\n }\n @if (filteredEntitiesList.length === 0) {\n <div class=\"dropdown-empty\">\n No entities found\n </div>\n }\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .lists-browse-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface);\n overflow: hidden;\n }\n\n /* Header */\n .browse-header {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n }\n\n .header-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .header-title {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .header-title i {\n font-size: 24px;\n color: var(--mj-brand-primary);\n }\n\n .header-title h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .header-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n }\n\n .search-box {\n position: relative;\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 200px;\n max-width: 300px;\n }\n\n .search-box i.fa-search {\n position: absolute;\n left: 12px;\n color: var(--mj-text-muted);\n }\n\n .search-box input {\n padding: 8px 36px;\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n font-size: 14px;\n width: 100%;\n transition: border-color 0.2s, box-shadow 0.2s;\n }\n\n .search-box input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .clear-search {\n position: absolute;\n right: 8px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n }\n\n .filter-group {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .filter-group label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .filter-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n min-width: 120px;\n }\n\n .filter-select:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .sort-select {\n min-width: 140px;\n }\n\n .view-toggle-group {\n display: flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n }\n\n .view-toggle {\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border: none;\n border-right: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .view-toggle:last-child {\n border-right: none;\n }\n\n .view-toggle:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .view-toggle.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .btn-create {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-create:hover {\n background: var(--mj-brand-primary-hover);\n }\n\n /* Loading */\n .loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n }\n\n /* Empty State */\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n padding: 48px 40px;\n text-align: center;\n max-width: 480px;\n margin: 0 auto;\n }\n\n .empty-state-icon-wrapper {\n position: relative;\n margin-bottom: 24px;\n }\n\n .empty-state-icon-wrapper .icon-bg {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 120px;\n height: 120px;\n border-radius: 50%;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n .empty-state-icon-wrapper > i {\n position: relative;\n font-size: 56px;\n color: var(--mj-brand-primary);\n z-index: 1;\n }\n\n .empty-state-icon-wrapper.search > i {\n font-size: 48px;\n color: var(--mj-text-disabled);\n }\n\n .empty-state h3 {\n margin: 0 0 12px;\n font-size: 22px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .empty-state p {\n margin: 0 0 8px;\n color: var(--mj-text-secondary);\n font-size: 15px;\n line-height: 1.5;\n }\n\n .empty-state p:last-of-type {\n margin-bottom: 24px;\n }\n\n .empty-hint {\n color: var(--mj-text-muted) !important;\n font-size: 13px !important;\n }\n\n .empty-state-features {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 28px;\n text-align: left;\n }\n\n .feature-item {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 14px;\n color: var(--mj-text-secondary);\n }\n\n .feature-item i {\n font-size: 14px !important;\n color: var(--mj-status-success) !important;\n }\n\n .btn-create-large {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 28px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 8px;\n font-size: 15px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n }\n\n .btn-create-large:hover {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-1px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n }\n\n .btn-clear {\n padding: 10px 20px;\n background: var(--mj-bg-surface-sunken);\n border: none;\n border-radius: 6px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-clear:hover {\n background: var(--mj-border-default);\n }\n\n /* Content */\n .browse-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px 24px;\n }\n\n .results-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n }\n\n .result-count {\n font-size: 14px;\n color: var(--mj-text-secondary);\n }\n\n .sort-options {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .sort-options label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n /* Table View */\n .lists-table {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n overflow: hidden;\n box-shadow: var(--mj-shadow-sm);\n }\n\n .lists-table table {\n width: 100%;\n border-collapse: collapse;\n }\n\n .lists-table th {\n text-align: left;\n padding: 12px 16px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .lists-table td {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .list-row {\n cursor: pointer;\n transition: background 0.15s;\n outline: none;\n }\n\n .list-row:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .list-row:focus {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .list-row:focus-visible {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n box-shadow: inset 3px 0 0 var(--mj-brand-primary);\n }\n\n .list-row:last-child td {\n border-bottom: none;\n }\n\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n\n .col-name { width: 30%; }\n .col-entity { width: 15%; }\n .col-items { width: 8%; text-align: center; }\n .col-sharing { width: 8%; text-align: center; }\n .col-owner { width: 14%; }\n .col-updated { width: 15%; }\n .col-actions { width: 10%; text-align: right; }\n\n /* Sharing indicators */\n .sharing-indicator {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n color: var(--mj-brand-primary);\n font-size: 13px;\n }\n\n .sharing-indicator i {\n font-size: 14px;\n }\n\n .share-count {\n font-weight: 500;\n }\n\n .sharing-private {\n color: var(--mj-text-muted);\n font-size: 13px;\n }\n\n .sharing-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 50%;\n color: var(--mj-brand-primary);\n font-size: 11px;\n }\n\n .card-footer-right {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .name-cell {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .list-icon {\n width: 36px;\n height: 36px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 14px;\n flex-shrink: 0;\n }\n\n .name-content {\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n\n .list-name {\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .list-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .entity-badge {\n display: inline-block;\n padding: 2px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 4px;\n font-size: 12px;\n color: var(--mj-brand-primary-hover);\n }\n\n .owner-name {\n color: var(--mj-text-secondary);\n }\n\n .owner-name.is-me {\n color: var(--mj-brand-primary);\n font-weight: 500;\n }\n\n .action-btn {\n background: none;\n border: none;\n padding: 6px 10px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s;\n }\n\n .action-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n }\n\n /* Card View */\n .lists-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n }\n\n .list-card {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n cursor: pointer;\n transition: transform 0.2s, box-shadow 0.2s, outline 0.1s;\n outline: 2px solid transparent;\n }\n\n .list-card:hover {\n transform: translateY(-2px);\n box-shadow: var(--mj-shadow-md);\n }\n\n .list-card:focus {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n }\n\n .list-card:focus:not(:focus-visible) {\n outline: none;\n }\n\n .list-card:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n }\n\n .card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 16px 16px 0;\n }\n\n .card-icon {\n width: 40px;\n height: 40px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 18px;\n }\n\n .menu-btn {\n background: none;\n border: none;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n }\n\n .menu-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n }\n\n .card-body {\n padding: 12px 16px;\n }\n\n .card-title {\n margin: 0 0 4px;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .card-description {\n margin: 0 0 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .card-meta {\n display: flex;\n gap: 16px;\n }\n\n .meta-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .card-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .owner-tag {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n }\n\n .owner-tag.is-me {\n color: var(--mj-brand-primary);\n }\n\n .date-info {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n /* Hierarchy View */\n .category-tree {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .category-section {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n overflow: hidden;\n }\n\n .category-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .category-header:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .category-header i:first-child {\n width: 16px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .category-header .fa-folder,\n .category-header .fa-folder-open {\n color: var(--mj-status-warning);\n }\n\n .category-header.uncategorized .fa-inbox {\n color: var(--mj-text-muted);\n }\n\n .category-name {\n flex: 1;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .category-count {\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 8px;\n border-radius: 10px;\n }\n\n .category-lists {\n border-top: 1px solid var(--mj-border-default);\n }\n\n .hierarchy-row {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px 12px 40px;\n cursor: pointer;\n transition: background 0.2s;\n outline: none;\n }\n\n .hierarchy-row:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .hierarchy-row:focus {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .hierarchy-row:focus-visible {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n box-shadow: inset 3px 0 0 var(--mj-brand-primary);\n }\n\n .list-info {\n flex: 1;\n min-width: 0;\n }\n\n .list-meta {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .list-actions {\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.2s;\n }\n\n .hierarchy-row:hover .list-actions {\n opacity: 1;\n }\n\n /* Context Menu */\n .context-menu-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999;\n }\n\n .context-menu {\n position: fixed;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-md);\n min-width: 160px;\n padding: 4px 0;\n z-index: 1000;\n }\n\n .menu-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 10px 16px;\n background: none;\n border: none;\n text-align: left;\n font-size: 14px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .menu-item:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .menu-item.danger {\n color: var(--mj-status-error);\n }\n\n .menu-item.danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n }\n\n .menu-divider {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\n }\n\n /* Modal Styles */\n .modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n }\n\n .modal-dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-lg);\n width: 500px;\n max-width: 90vw;\n max-height: 90vh;\n overflow: hidden;\n z-index: 1001;\n }\n\n .confirm-dialog {\n width: 400px;\n }\n\n .modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .modal-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .modal-close {\n background: none;\n border: none;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n }\n\n .modal-close:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n }\n\n .modal-body {\n padding: 20px;\n max-height: 60vh;\n overflow-y: auto;\n }\n\n .modal-body p {\n margin: 0 0 8px;\n color: var(--mj-text-primary);\n }\n\n .warning-text {\n color: var(--mj-status-error) !important;\n font-size: 13px;\n }\n\n .modal-footer {\n display: flex;\n gap: 12px;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n\n .btn-primary:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-secondary {\n padding: 10px 20px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-secondary:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-danger {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-danger:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-status-error) 85%, black);\n }\n\n /* Form Styles */\n .form-group {\n margin-bottom: 16px;\n }\n\n .form-group:last-child {\n margin-bottom: 0;\n }\n\n .form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .form-input {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n transition: border-color 0.2s, box-shadow 0.2s;\n box-sizing: border-box;\n }\n\n .form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .form-input:disabled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n textarea.form-input {\n resize: vertical;\n min-height: 80px;\n }\n\n select.form-input {\n cursor: pointer;\n }\n\n .custom-select-wrapper {\n position: relative;\n }\n\n /* Portal Dropdown */\n .entity-dropdown-portal {\n position: fixed;\n z-index: 10002;\n }\n\n .entity-dropdown-content {\n max-height: 200px;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n box-shadow: var(--mj-shadow-md);\n }\n\n .entity-dropdown-content.open-above {\n position: absolute;\n bottom: 0;\n }\n\n .dropdown-item {\n padding: 10px 12px;\n cursor: pointer;\n transition: background 0.15s;\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .dropdown-item:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .dropdown-item:first-child {\n border-radius: 6px 6px 0 0;\n }\n\n .dropdown-item:last-child {\n border-radius: 0 0 6px 6px;\n }\n\n .dropdown-empty {\n padding: 10px 12px;\n color: var(--mj-text-muted);\n font-style: italic;\n }\n\n /* Responsive */\n @media (max-width: 768px) {\n .header-row {\n flex-direction: column;\n gap: 12px;\n align-items: stretch;\n }\n\n .btn-create {\n width: 100%;\n justify-content: center;\n }\n\n .header-actions {\n flex-direction: column;\n align-items: stretch;\n }\n\n .search-box {\n max-width: none;\n }\n\n .filter-group {\n width: 100%;\n }\n\n .filter-select {\n flex: 1;\n width: 100%;\n }\n\n .view-toggle-group {\n justify-content: center;\n }\n\n .lists-table {\n overflow-x: auto;\n }\n\n .col-entity, .col-items, .col-updated {\n display: none;\n }\n\n .lists-grid {\n grid-template-columns: 1fr;\n }\n\n .modal-dialog {\n width: 95vw;\n }\n }\n `],\n encapsulation: ViewEncapsulation.None\n})\nexport class ListsBrowseResource extends BaseResourceComponent implements OnDestroy {\n protected override destroy$ = new Subject<void>();\n\n isLoading = true;\n searchTerm = '';\n viewMode: ViewMode = 'card';\n selectedEntity = 'all';\n selectedOwner = 'mine';\n selectedSort = 'name';\n\n allLists: BrowseListItem[] = [];\n filteredLists: BrowseListItem[] = [];\n categories: MJListCategoryEntity[] = [];\n categoryTree: CategoryNode[] = [];\n flatCategories: Array<{ ID: string; displayName: string }> = [];\n availableEntities: Array<{ ID: string; Name: string }> = [];\n filteredEntitiesList: Array<{ ID: string; Name: string }> = [];\n\n entityOptions: Array<{ name: string; value: string }> = [{ name: 'All Entities', value: 'all' }];\n ownerOptions: Array<{ name: string; value: string }> = [\n { name: 'My Lists', value: 'mine' },\n { name: 'All Lists', value: 'all' },\n { name: 'Others', value: 'others' }\n ];\n sortOptions: Array<{ name: string; value: string }> = [\n { name: 'Name', value: 'name' },\n { name: 'Recently Updated', value: 'updated' },\n { name: 'Most Items', value: 'items' },\n { name: 'Entity', value: 'entity' }\n ];\n\n // Context menu state\n showContextMenu = false;\n contextMenuX = 0;\n contextMenuY = 0;\n selectedContextItem: BrowseListItem | null = null;\n\n // Create/Edit dialog state\n showCreateDialog = false;\n editingList: MJListEntity | null = null;\n newListName = '';\n newListDescription = '';\n selectedEntityId = '';\n selectedCategoryId: string | null = null;\n entitySearchTerm = '';\n showEntityDropdown = false;\n entityDropdownPosition = { top: 0, left: 0, width: 0, openAbove: false };\n\n // Delete confirmation state\n showDeleteConfirm = false;\n deleteListName = '';\n listToDelete: MJListEntity | null = null;\n\n // Operation states\n isSaving = false;\n isDeleting = false;\n\n // Sharing dialog state\n showShareDialog = false;\n shareDialogConfig: ListShareDialogConfig | null = null;\n\n private entityColorMap: Map<string, string> = new Map();\n private entityIconMap: Map<string, string> = new Map();\n private categoryMap: Map<string, MJListCategoryEntity> = new Map();\n private currentUserId = '';\n\n constructor(\n private cdr: ChangeDetectorRef,\n private tabService: TabService,\n private notificationService: MJNotificationService,\n private elementRef: ElementRef,\n private listSharingService: ListSharingService\n ) {\n super();\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent) {\n if (this.showEntityDropdown) {\n const target = event.target as HTMLElement;\n if (!target.closest('.custom-select-wrapper') && !target.closest('.entity-dropdown-portal')) {\n this.showEntityDropdown = false;\n }\n }\n }\n\n @HostListener('document:keydown.escape')\n onEscapeKey() {\n if (this.showContextMenu) {\n this.closeContextMenu();\n }\n if (this.showCreateDialog) {\n this.closeCreateDialog();\n }\n if (this.showDeleteConfirm) {\n this.cancelDelete();\n }\n if (this.showEntityDropdown) {\n this.closeEntityDropdown();\n }\n }\n\n async ngOnInit() {\n super.ngOnInit();\n await this.loadData();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy() {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async loadData() {\n this.isLoading = true;\n\n try {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n this.currentUserId = md.CurrentUser?.ID || '';\n\n // Load all lists, categories, details, and users in parallel\n const [listsResult, categoriesResult, detailsResult, usersResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Lists',\n OrderBy: 'Name',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: List Categories',\n OrderBy: 'Name',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: List Details',\n Fields: ['ListID'],\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: Users',\n Fields: ['ID', 'Name'],\n ResultType: 'simple'\n }\n ]);\n\n if (!listsResult.Success) {\n console.error('Failed to load lists');\n return;\n }\n\n const lists = listsResult.Results as MJListEntity[];\n this.categories = (categoriesResult.Results || []) as MJListCategoryEntity[];\n const details = (detailsResult.Results || []) as Array<{ ListID: string }>;\n const users = (usersResult.Results || []) as Array<{ ID: string; Name: string }>;\n\n // Build category map\n this.categoryMap.clear();\n for (const cat of this.categories) {\n this.categoryMap.set(cat.ID, cat);\n }\n\n // Build flat categories for dropdown\n this.flatCategories = this.buildFlatCategories(this.categories);\n\n // Build user map\n const userMap = new Map<string, string>();\n for (const user of users) {\n userMap.set(user.ID, user.Name);\n }\n\n // Count items per list\n const itemCounts = new Map<string, number>();\n for (const detail of details) {\n const count = itemCounts.get(detail.ListID) || 0;\n itemCounts.set(detail.ListID, count + 1);\n }\n\n // Build entity info\n const entities = md.Entities;\n const entitySet = new Set<string>();\n\n for (const entity of entities) {\n this.entityColorMap.set(entity.Name, this.generateEntityColor(entity.Name));\n this.entityIconMap.set(entity.Name, entity.Icon || 'fa-solid fa-table');\n }\n\n // Build available entities for dropdown\n this.availableEntities = entities\n .filter(e => e.IncludeInAPI)\n .map(e => ({ ID: e.ID, Name: e.Name }))\n .sort((a, b) => a.Name.localeCompare(b.Name));\n this.filteredEntitiesList = [...this.availableEntities];\n\n // Build list items\n this.allLists = lists.map(list => {\n const entityName = list.Entity || 'Unknown';\n entitySet.add(entityName);\n return {\n list,\n itemCount: itemCounts.get(list.ID) || 0,\n entityName,\n ownerName: userMap.get(list.UserID) || 'Unknown',\n isOwner: UUIDsEqual(list.UserID, this.currentUserId)\n };\n });\n\n // Build entity filter options\n this.entityOptions = [\n { name: 'All Entities', value: 'all' },\n ...Array.from(entitySet).sort().map(e => ({ name: e, value: e }))\n ];\n\n this.applyFilters();\n this.buildCategoryTree();\n\n // Load sharing info in the background\n this.loadSharingInfo();\n } catch (error) {\n console.error('Error loading lists:', error);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n private buildFlatCategories(categories: MJListCategoryEntity[]): Array<{ ID: string; displayName: string }> {\n const result: Array<{ ID: string; displayName: string }> = [];\n const topLevel = categories.filter(c => !c.ParentID);\n\n const processCategory = (cat: MJListCategoryEntity, level: number) => {\n const indent = '\\u00A0\\u00A0'.repeat(level);\n result.push({ ID: cat.ID, displayName: `${indent}${cat.Name}` });\n\n const children = categories.filter(c => UUIDsEqual(c.ParentID, cat.ID));\n for (const child of children) {\n processCategory(child, level + 1);\n }\n };\n\n for (const cat of topLevel) {\n processCategory(cat, 0);\n }\n\n return result;\n }\n\n private buildCategoryTree() {\n const rootNodes: CategoryNode[] = [];\n const categoryNodes = new Map<string, CategoryNode>();\n\n // Create nodes for all categories\n for (const cat of this.categories) {\n categoryNodes.set(cat.ID, {\n category: cat,\n lists: [],\n children: [],\n isExpanded: true\n });\n }\n\n // Build tree structure\n for (const cat of this.categories) {\n const node = categoryNodes.get(cat.ID)!;\n if (cat.ParentID && categoryNodes.has(cat.ParentID)) {\n categoryNodes.get(cat.ParentID)!.children.push(node);\n } else {\n rootNodes.push(node);\n }\n }\n\n // Assign lists to categories\n const uncategorizedLists: BrowseListItem[] = [];\n for (const item of this.filteredLists) {\n if (item.list.CategoryID && categoryNodes.has(item.list.CategoryID)) {\n categoryNodes.get(item.list.CategoryID)!.lists.push(item);\n } else {\n uncategorizedLists.push(item);\n }\n }\n\n // Add uncategorized node if there are uncategorized lists\n if (uncategorizedLists.length > 0) {\n rootNodes.unshift({\n category: null,\n lists: uncategorizedLists,\n children: [],\n isExpanded: true\n });\n }\n\n this.categoryTree = rootNodes;\n }\n\n setViewMode(mode: ViewMode) {\n this.viewMode = mode;\n }\n\n onSearchChange(_term: string) {\n this.applyFilters();\n this.buildCategoryTree();\n }\n\n onEntityFilterChange(_value: string) {\n this.applyFilters();\n this.buildCategoryTree();\n }\n\n onOwnerFilterChange(_value: string) {\n this.applyFilters();\n this.buildCategoryTree();\n }\n\n onSortChange(_value: string) {\n this.applyFilters();\n this.buildCategoryTree();\n }\n\n clearSearch() {\n this.searchTerm = '';\n this.applyFilters();\n this.buildCategoryTree();\n }\n\n clearFilters() {\n this.searchTerm = '';\n this.selectedEntity = 'all';\n this.selectedOwner = 'mine';\n this.applyFilters();\n this.buildCategoryTree();\n }\n\n private applyFilters() {\n let result = [...this.allLists];\n\n // Owner filter\n if (this.selectedOwner === 'mine') {\n result = result.filter(item => item.isOwner);\n } else if (this.selectedOwner === 'others') {\n result = result.filter(item => !item.isOwner);\n }\n\n // Search filter\n if (this.searchTerm) {\n const term = this.searchTerm.toLowerCase();\n result = result.filter(item =>\n item.list.Name.toLowerCase().includes(term) ||\n (item.list.Description && item.list.Description.toLowerCase().includes(term)) ||\n item.entityName.toLowerCase().includes(term) ||\n item.ownerName.toLowerCase().includes(term)\n );\n }\n\n // Entity filter\n if (this.selectedEntity !== 'all') {\n result = result.filter(item => item.entityName === this.selectedEntity);\n }\n\n // Sort\n switch (this.selectedSort) {\n case 'name':\n result.sort((a, b) => a.list.Name.localeCompare(b.list.Name));\n break;\n case 'updated':\n result.sort((a, b) => {\n const dateA = new Date(a.list.__mj_UpdatedAt).getTime();\n const dateB = new Date(b.list.__mj_UpdatedAt).getTime();\n return dateB - dateA;\n });\n break;\n case 'items':\n result.sort((a, b) => b.itemCount - a.itemCount);\n break;\n case 'entity':\n result.sort((a, b) => a.entityName.localeCompare(b.entityName));\n break;\n }\n\n this.filteredLists = result;\n }\n\n toggleCategory(node: CategoryNode) {\n node.isExpanded = !node.isExpanded;\n }\n\n getListCountInCategory(node: CategoryNode): number {\n let count = node.lists.length;\n for (const child of node.children) {\n count += this.getListCountInCategory(child);\n }\n return count;\n }\n\n getEntityColor(entityName: string): string {\n return this.entityColorMap.get(entityName) || '#607D8B';\n }\n\n getEntityIcon(entityName: string): string {\n return this.entityIconMap.get(entityName) || 'fa-solid fa-table';\n }\n\n private generateEntityColor(entityName: string): string {\n let hash = 0;\n for (let i = 0; i < entityName.length; i++) {\n hash = entityName.charCodeAt(i) + ((hash << 5) - hash);\n }\n const colors = [\n '#2196F3', '#4CAF50', '#FF9800', '#9C27B0', '#F44336',\n '#00BCD4', '#795548', '#607D8B', '#E91E63', '#3F51B5'\n ];\n return colors[Math.abs(hash) % colors.length];\n }\n\n formatDate(date: Date): string {\n if (!date) return '';\n const now = new Date();\n const d = new Date(date);\n const diffMs = now.getTime() - d.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) return 'Today';\n if (diffDays === 1) return 'Yesterday';\n if (diffDays < 7) return `${diffDays} days ago`;\n return d.toLocaleDateString();\n }\n\n openList(item: BrowseListItem) {\n const appId = this.Data?.Configuration?.applicationId || '';\n this.tabService.OpenList(item.list.ID, item.list.Name, appId);\n }\n\n openListMenu(event: Event, item: BrowseListItem) {\n event.stopPropagation();\n const mouseEvent = event as MouseEvent;\n this.selectedContextItem = item;\n this.contextMenuX = mouseEvent.clientX;\n this.contextMenuY = mouseEvent.clientY;\n this.showContextMenu = true;\n }\n\n closeContextMenu() {\n this.showContextMenu = false;\n this.selectedContextItem = null;\n }\n\n createNewList() {\n this.editingList = null;\n this.newListName = '';\n this.newListDescription = '';\n this.selectedEntityId = '';\n this.entitySearchTerm = '';\n this.selectedCategoryId = null;\n this.showEntityDropdown = false;\n this.showCreateDialog = true;\n }\n\n editList() {\n if (!this.selectedContextItem) return;\n\n const list = this.selectedContextItem.list;\n this.editingList = list;\n this.newListName = list.Name;\n this.newListDescription = list.Description || '';\n this.selectedEntityId = list.EntityID;\n this.entitySearchTerm = list.Entity || '';\n this.selectedCategoryId = list.CategoryID || null;\n this.showCreateDialog = true;\n this.closeContextMenu();\n }\n\n selectEntity(entity: { ID: string; Name: string }) {\n this.selectedEntityId = entity.ID;\n this.entitySearchTerm = entity.Name;\n this.showEntityDropdown = false;\n }\n\n filterEntities(term: string) {\n const lowerTerm = term.toLowerCase();\n this.filteredEntitiesList = this.availableEntities.filter(e =>\n e.Name.toLowerCase().includes(lowerTerm)\n );\n // Ensure dropdown is visible while typing\n if (!this.showEntityDropdown && term) {\n this.showEntityDropdown = true;\n }\n // Clear selection when user modifies the search text\n this.selectedEntityId = '';\n }\n\n openEntityDropdown(inputElement: HTMLInputElement) {\n const rect = inputElement.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const dropdownHeight = 200;\n const spaceBelow = viewportHeight - rect.bottom;\n const openAbove = spaceBelow < dropdownHeight && rect.top > dropdownHeight;\n\n this.entityDropdownPosition = {\n top: openAbove ? rect.top - dropdownHeight : rect.bottom,\n left: rect.left,\n width: rect.width,\n openAbove\n };\n this.showEntityDropdown = true;\n this.filteredEntitiesList = [...this.availableEntities];\n }\n\n closeEntityDropdown() {\n this.showEntityDropdown = false;\n }\n\n async duplicateList() {\n if (!this.selectedContextItem) return;\n\n const listToDuplicate = this.selectedContextItem.list;\n this.closeContextMenu();\n\n this.isLoading = true;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n const newList = await md.GetEntityObject<MJListEntity>('MJ: Lists');\n newList.Name = `${listToDuplicate.Name} (Copy)`;\n newList.Description = listToDuplicate.Description;\n newList.EntityID = listToDuplicate.EntityID;\n newList.CategoryID = listToDuplicate.CategoryID;\n newList.UserID = md.CurrentUser!.ID;\n\n const listSaved = await newList.Save();\n if (!listSaved) {\n this.notificationService.CreateSimpleNotification('Failed to duplicate list', 'error', 4000);\n return;\n }\n\n const itemsResult = await rv.RunView<MJListDetailEntity>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID = '${listToDuplicate.ID}'`,\n ResultType: 'entity_object'\n });\n\n if (itemsResult.Success && itemsResult.Results.length > 0) {\n let copiedCount = 0;\n for (const item of itemsResult.Results) {\n const newItem = await md.GetEntityObject<MJListDetailEntity>('MJ: List Details');\n newItem.ListID = newList.ID;\n newItem.RecordID = item.RecordID;\n newItem.Sequence = item.Sequence;\n const itemSaved = await newItem.Save();\n if (itemSaved) copiedCount++;\n }\n this.notificationService.CreateSimpleNotification(\n `List duplicated with ${copiedCount} item${copiedCount !== 1 ? 's' : ''}`,\n 'success',\n 3000\n );\n } else {\n this.notificationService.CreateSimpleNotification('List duplicated successfully', 'success', 3000);\n }\n\n await this.loadData();\n } catch (error) {\n console.error('Error duplicating list:', error);\n this.notificationService.CreateSimpleNotification('Error duplicating list. Please try again.', 'error', 4000);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n confirmDeleteList() {\n if (!this.selectedContextItem) return;\n this.listToDelete = this.selectedContextItem.list;\n this.deleteListName = this.selectedContextItem.list.Name;\n this.showDeleteConfirm = true;\n this.closeContextMenu();\n }\n\n cancelDelete() {\n this.showDeleteConfirm = false;\n this.listToDelete = null;\n this.deleteListName = '';\n }\n\n async deleteList() {\n if (!this.listToDelete) return;\n\n const listToDelete = this.listToDelete;\n const listName = listToDelete.Name;\n\n this.isDeleting = true;\n this.cdr.detectChanges();\n\n try {\n const deleted = await listToDelete.Delete();\n if (deleted) {\n this.notificationService.CreateSimpleNotification(`\"${listName}\" deleted`, 'success', 3000);\n } else {\n const errorMessage = listToDelete.LatestResult?.Message || 'Unknown error occurred';\n console.error('Failed to delete list:', listToDelete.LatestResult);\n this.notificationService.CreateSimpleNotification(`Failed to delete list: ${errorMessage}`, 'error', 6000);\n }\n this.cancelDelete();\n await this.loadData();\n } catch (error) {\n console.error('Error deleting list:', error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.notificationService.CreateSimpleNotification(`Error deleting list: ${errorMessage}`, 'error', 6000);\n } finally {\n this.isDeleting = false;\n this.cdr.detectChanges();\n }\n }\n\n closeCreateDialog() {\n this.showCreateDialog = false;\n this.editingList = null;\n this.showEntityDropdown = false;\n }\n\n async saveList() {\n this.isSaving = true;\n this.cdr.detectChanges();\n\n const isEditing = !!this.editingList;\n const listName = this.newListName;\n\n try {\n const md = this.ProviderToUse;\n let list: MJListEntity;\n\n if (this.editingList) {\n list = this.editingList;\n } else {\n list = await md.GetEntityObject<MJListEntity>('MJ: Lists');\n list.UserID = md.CurrentUser!.ID;\n list.EntityID = this.selectedEntityId;\n }\n\n list.Name = this.newListName;\n list.Description = this.newListDescription || null;\n list.CategoryID = this.selectedCategoryId || null;\n\n const saved = await list.Save();\n if (saved) {\n this.notificationService.CreateSimpleNotification(\n isEditing ? `\"${listName}\" updated` : `\"${listName}\" created`,\n 'success',\n 3000\n );\n this.closeCreateDialog();\n await this.loadData();\n } else {\n const errorMessage = list.LatestResult?.Message || 'Unknown error occurred';\n const action = isEditing ? 'update' : 'create';\n console.error(`Failed to ${action} list:`, list.LatestResult);\n this.notificationService.CreateSimpleNotification(\n `Failed to ${action} list: ${errorMessage}`,\n 'error',\n 6000\n );\n }\n } catch (error) {\n console.error('Error saving list:', error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.notificationService.CreateSimpleNotification(`Error saving list: ${errorMessage}`, 'error', 6000);\n } finally {\n this.isSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n // Sharing methods\n openShareDialog() {\n if (!this.selectedContextItem) return;\n\n const item = this.selectedContextItem;\n this.shareDialogConfig = {\n listId: item.list.ID,\n listName: item.list.Name,\n currentUserId: this.currentUserId,\n isOwner: item.isOwner\n };\n this.showShareDialog = true;\n this.closeContextMenu();\n }\n\n onShareComplete(_result: ListShareDialogResult) {\n this.showShareDialog = false;\n this.shareDialogConfig = null;\n // Reload sharing info for all lists\n this.loadSharingInfo();\n this.cdr.detectChanges();\n }\n\n onShareCancel() {\n this.showShareDialog = false;\n this.shareDialogConfig = null;\n }\n\n private async loadSharingInfo() {\n // Load sharing summaries for all lists that the user owns\n const ownedLists = this.allLists.filter(item => item.isOwner);\n\n for (const item of ownedLists) {\n try {\n const summary = await this.listSharingService.getListSharingSummary(item.list.ID);\n item.sharingInfo = summary;\n } catch (error) {\n console.error(`Error loading sharing info for list ${item.list.ID}:`, error);\n }\n }\n\n this.cdr.detectChanges();\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Lists';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-list-check';\n }\n}\n"]}
1
+ {"version":3,"file":"lists-browse-resource.component.js","sourceRoot":"","sources":["../../../src/Lists/components/lists-browse-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewEncapsulation, ChangeDetectorRef, OnDestroy, ElementRef, HostListener } from '@angular/core';\nimport { RegisterClass , UUIDsEqual, MJGlobal } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ResourceData, MJListCategoryEntity } from '@memberjunction/core-entities';\nimport { MJListEntity, MJListDetailEntity, MJUserFavoriteEntity } from '@memberjunction/core-entities';\nimport { BaseEntity, BaseEntityEvent, Metadata, RunView } from '@memberjunction/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { TabService } from '@memberjunction/ng-base-application';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { ListSharingService, ListSharingSummary, ListShareDialogConfig, ListShareDialogResult } from '@memberjunction/ng-list-management';\nimport { CapabilitiesForLevel, type ListCapabilities, type SharePermissionLevel } from '@memberjunction/lists-base';\nimport { FilterFieldConfig } from '@memberjunction/ng-ui-components';\ninterface BrowseListItem {\n list: MJListEntity;\n itemCount: number;\n entityName: string;\n ownerName: string;\n isOwner: boolean;\n sharingInfo?: ListSharingSummary;\n}\n\ninterface CategoryNode {\n category: MJListCategoryEntity | null;\n lists: BrowseListItem[];\n children: CategoryNode[];\n isExpanded: boolean;\n}\n\ntype ViewMode = 'table' | 'card' | 'hierarchy';\n\n@RegisterClass(BaseResourceComponent, 'ListsBrowseResource')\n@Component({\n standalone: false,\n selector: 'mj-lists-browse-resource',\n template: `\n <mj-page-layout>\n <mj-page-header Title=\"Lists\" Icon=\"fa-solid fa-list-check\">\n <!-- X-of-Y filtered count earns its meta spot per chrome conventions §2. -->\n <div meta>\n <mj-stat-badge\n [Count]=\"filteredLists.length\"\n [Total]=\"allLists.length\"\n Label=\"lists\">\n </mj-stat-badge>\n </div>\n <div actions>\n <mj-filter-popover\n [ActiveCount]=\"ActiveFilterCount\"\n [ShowClearAll]=\"ActiveFilterCount > 0\"\n (ClearAllRequested)=\"resetPopoverFilters()\">\n <mj-filter-panel\n [Fields]=\"listFilterFields\"\n [Values]=\"listFilterValues\"\n (ValuesChange)=\"onFilterValuesChange($event)\"\n (Reset)=\"resetPopoverFilters()\">\n </mj-filter-panel>\n </mj-filter-popover>\n\n <mj-view-toggle\n [Options]=\"listViewOptions\"\n [ActiveKey]=\"viewMode\"\n (KeyChange)=\"setViewMode($any($event))\">\n </mj-view-toggle>\n\n <!-- Favorites-only toggle (Phase 5.3). Sits next to the view toggle\n so it reads as \"filter scope\" alongside view mode. -->\n <button\n class=\"favorite-filter-toggle\"\n [class.favorite-filter-toggle--active]=\"showOnlyFavorites\"\n (click)=\"toggleShowOnlyFavorites()\"\n [title]=\"showOnlyFavorites ? 'Showing favorites only' : 'Show all lists'\">\n <i [class]=\"showOnlyFavorites ? 'fa-solid fa-star' : 'fa-regular fa-star'\"></i>\n Favorites\n </button>\n\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createNewList()\">\n <i class=\"fa-solid fa-plus\"></i> New List\n </button>\n </div>\n <div toolbar>\n <mj-page-search\n Placeholder=\"Search lists...\"\n [Value]=\"searchTerm\"\n (ValueChange)=\"onSearchChange($event)\">\n </mj-page-search>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n \n <!-- Active tag filters (Phase 4.3). Renders only when at least one\n tag is active — multi-tag = AND. Clicking a chip's × removes it. -->\n @if (tagFilters.length > 0) {\n <div class=\"tag-filter-row\">\n <span class=\"tag-filter-row__label\">\n <i class=\"fa-solid fa-tag\"></i>\n Filtering by tag:\n </span>\n @for (f of tagFilters; track f.TagID) {\n <button\n class=\"tag-filter-chip\"\n type=\"button\"\n (click)=\"removeTagFilter(f.TagID)\">\n {{ f.Name }}\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n <button class=\"tag-filter-row__clear\" type=\"button\" (click)=\"clearTagFilters()\">\n Clear all\n </button>\n </div>\n }\n\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading lists...\" size=\"medium\"></mj-loading>\n </div>\n }\n\n <!-- Empty State - No Lists -->\n @if (!isLoading && allLists.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-state-icon-wrapper\">\n <div class=\"icon-bg\"></div>\n <i class=\"fa-solid fa-list-check\"></i>\n </div>\n <h3>No Lists Yet</h3>\n <p>Lists help you organize and track groups of records across your data.</p>\n <div class=\"empty-state-features\">\n <div class=\"feature-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Group records from any entity</span>\n </div>\n <div class=\"feature-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Organize with categories</span>\n </div>\n <div class=\"feature-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Quick access from any view</span>\n </div>\n </div>\n <button class=\"btn-create-large\" (click)=\"createNewList()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create Your First List\n </button>\n </div>\n }\n \n <!-- Empty State - No Results -->\n @if (!isLoading && allLists.length > 0 && filteredLists.length === 0) {\n <div class=\"empty-state search-empty\">\n <div class=\"empty-state-icon-wrapper search\">\n <i class=\"fa-solid fa-filter-circle-xmark\"></i>\n </div>\n <h3>No Results Found</h3>\n <p>No lists match your current filters.</p>\n <p class=\"empty-hint\">Try adjusting your search or filters.</p>\n <button class=\"btn-clear\" (click)=\"clearFilters()\">Clear All Filters</button>\n </div>\n }\n \n <!-- Results Content -->\n @if (!isLoading && filteredLists.length > 0) {\n <div class=\"browse-content\">\n <div class=\"results-header\">\n <span class=\"result-count\">{{filteredLists.length}} list{{filteredLists.length !== 1 ? 's' : ''}}</span>\n <div class=\"sort-options\">\n <label>Sort:</label>\n <select\n [(ngModel)]=\"selectedSort\"\n (ngModelChange)=\"onSortChange($event)\"\n class=\"filter-select sort-select\">\n @for (opt of sortOptions; track opt) {\n <option [value]=\"opt.value\">{{opt.name}}</option>\n }\n </select>\n </div>\n </div>\n <!-- Table View -->\n @if (viewMode === 'table') {\n <div class=\"lists-table\">\n <table role=\"grid\" aria-label=\"Lists table\">\n <thead>\n <tr>\n <th class=\"col-name\" scope=\"col\">Name</th>\n <th class=\"col-entity\" scope=\"col\">Entity</th>\n <th class=\"col-items\" scope=\"col\">Items</th>\n <th class=\"col-sharing\" scope=\"col\">Shared</th>\n <th class=\"col-owner\" scope=\"col\">Owner</th>\n <th class=\"col-updated\" scope=\"col\">Updated</th>\n <th class=\"col-actions\" scope=\"col\"><span class=\"sr-only\">Actions</span></th>\n </tr>\n </thead>\n <tbody>\n @for (item of filteredLists; track item) {\n <tr\n (click)=\"openList(item)\"\n (keydown.enter)=\"openList(item)\"\n class=\"list-row\"\n tabindex=\"0\"\n role=\"row\">\n <td class=\"col-name\" role=\"gridcell\">\n <div class=\"name-cell\">\n <div class=\"list-icon\" [style.background-color]=\"getEntityColor(item.entityName)\" aria-hidden=\"true\">\n <i [class]=\"getEntityIcon(item.entityName)\"></i>\n </div>\n <div class=\"name-content\">\n <span class=\"list-name\">{{item.list.Name}}</span>\n @if (item.list.Description) {\n <span class=\"list-desc\">{{item.list.Description}}</span>\n }\n </div>\n </div>\n </td>\n <td class=\"col-entity\" role=\"gridcell\">\n <span class=\"entity-badge\">{{item.entityName}}</span>\n </td>\n <td class=\"col-items\" role=\"gridcell\">{{item.itemCount}}</td>\n <td class=\"col-sharing\" role=\"gridcell\">\n @if (item.sharingInfo; as sharing) {\n @if (sharing.totalShares > 0) {\n <span class=\"sharing-indicator\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n <span class=\"share-count\">{{sharing.totalShares}}</span>\n </span>\n }\n @if (sharing.totalShares === 0) {\n <span class=\"sharing-private\">\n <i class=\"fa-solid fa-lock\"></i>\n </span>\n }\n }\n @if (!item.sharingInfo) {\n <span class=\"sharing-private\">\n <i class=\"fa-solid fa-lock\"></i>\n </span>\n }\n </td>\n <td class=\"col-owner\" role=\"gridcell\">\n <span class=\"owner-name\" [class.is-me]=\"item.isOwner\">\n {{item.isOwner ? 'You' : item.ownerName}}\n </span>\n </td>\n <td class=\"col-updated\" role=\"gridcell\">{{formatDate(item.list.__mj_UpdatedAt)}}</td>\n <td class=\"col-actions\" role=\"gridcell\">\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"openListMenu($event, item)\"\n title=\"More options\">\n <i class=\"fa-solid fa-ellipsis-v\" aria-hidden=\"true\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n <!-- Card View -->\n @if (viewMode === 'card') {\n <div class=\"lists-grid\" role=\"list\" aria-label=\"Lists\">\n @for (item of filteredLists; track item) {\n <div\n class=\"list-card\"\n (click)=\"openList(item)\"\n (keydown.enter)=\"openList(item)\"\n tabindex=\"0\"\n role=\"listitem\">\n <div class=\"card-header\">\n <div class=\"card-icon\" [style.background-color]=\"getEntityColor(item.entityName)\" aria-hidden=\"true\">\n <i [class]=\"getEntityIcon(item.entityName)\"></i>\n </div>\n <button\n class=\"favorite-btn\"\n [class.favorite-btn--active]=\"isFavorite(item.list.ID)\"\n (click)=\"toggleFavorite($event, item)\"\n [title]=\"isFavorite(item.list.ID) ? 'Remove from favorites' : 'Add to favorites'\">\n <i [class]=\"isFavorite(item.list.ID) ? 'fa-solid fa-star' : 'fa-regular fa-star'\"></i>\n </button>\n <div class=\"card-menu\">\n <button class=\"menu-btn\" (click)=\"openListMenu($event, item)\">\n <i class=\"fa-solid fa-ellipsis-v\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n <div class=\"card-body\">\n <h3 class=\"card-title\">{{item.list.Name}}</h3>\n @if (item.list.Description) {\n <p class=\"card-description\">{{item.list.Description}}</p>\n }\n <div class=\"card-meta\">\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-database\"></i>\n {{item.entityName}}\n </span>\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-hashtag\"></i>\n {{item.itemCount}} item{{item.itemCount !== 1 ? 's' : ''}}\n </span>\n </div>\n <!-- Tag chips (Phase 4). Read-only on cards; click adds the\n tag to the filter row above. We stop propagation on\n the wrapper so clicks on chips don't also fire the\n card's openList handler. -->\n <div class=\"card-tags\" (click)=\"$event.stopPropagation()\">\n <mj-tag-chips\n [Provider]=\"Provider\"\n EntityName=\"MJ: Lists\"\n [RecordID]=\"item.list.ID\"\n [Editable]=\"false\"\n [MaxDisplay]=\"3\"\n (TagClicked)=\"onCardTagClicked($event)\">\n </mj-tag-chips>\n </div>\n </div>\n <div class=\"card-footer\">\n <span class=\"owner-tag\" [class.is-me]=\"item.isOwner\">\n <i class=\"fa-solid fa-user\"></i>\n {{item.isOwner ? 'You' : item.ownerName}}\n </span>\n <div class=\"card-footer-right\">\n @if (item.sharingInfo; as sharing) {\n @if (sharing.totalShares > 0) {\n <span class=\"sharing-badge\" [title]=\"'Shared with ' + sharing.totalShares + ' user(s)/role(s)'\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n </span>\n }\n }\n <span class=\"date-info\">{{formatDate(item.list.__mj_UpdatedAt)}}</span>\n </div>\n </div>\n </div>\n }\n </div>\n }\n <!-- Hierarchy View -->\n @if (viewMode === 'hierarchy') {\n <div class=\"category-tree\">\n @for (node of categoryTree; track node) {\n <ng-container *ngTemplateOutlet=\"categoryNodeTemplate; context: { node: node, depth: 0 }\"></ng-container>\n }\n </div>\n }\n </div>\n }\n \n <!-- Category Node Template -->\n <ng-template #categoryNodeTemplate let-node=\"node\" let-depth=\"depth\">\n <div class=\"category-section\" [style.margin-left.px]=\"depth * 20\">\n <!-- Category Header -->\n @if (node.category) {\n <div\n class=\"category-header\"\n (click)=\"toggleCategory(node)\">\n <i [class]=\"node.isExpanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"></i>\n <i class=\"fa-solid fa-folder\" [class.fa-folder-open]=\"node.isExpanded\"></i>\n <span class=\"category-name\">{{node.category.Name}}</span>\n <span class=\"category-count\">{{getListCountInCategory(node)}}</span>\n </div>\n }\n \n <!-- Uncategorized Header -->\n @if (!node.category && node.lists.length > 0) {\n <div\n class=\"category-header uncategorized\"\n (click)=\"toggleCategory(node)\">\n <i [class]=\"node.isExpanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"></i>\n <i class=\"fa-solid fa-inbox\"></i>\n <span class=\"category-name\">Uncategorized</span>\n <span class=\"category-count\">{{node.lists.length}}</span>\n </div>\n }\n \n <!-- Lists in this category -->\n @if (node.isExpanded) {\n <div class=\"category-lists\" role=\"list\">\n @for (item of node.lists; track item) {\n <div\n class=\"list-row hierarchy-row\"\n (click)=\"openList(item)\"\n (keydown.enter)=\"openList(item)\"\n tabindex=\"0\"\n role=\"listitem\">\n <div class=\"list-icon\" [style.background-color]=\"getEntityColor(item.entityName)\" aria-hidden=\"true\">\n <i [class]=\"getEntityIcon(item.entityName)\"></i>\n </div>\n <div class=\"list-info\">\n <span class=\"list-name\">{{item.list.Name}}</span>\n <span class=\"list-meta\">\n {{item.entityName}} &middot; {{item.itemCount}} items\n @if (!item.isOwner) {\n <span> &middot; {{item.ownerName}}</span>\n }\n </span>\n </div>\n <div class=\"list-actions\">\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"openListMenu($event, item)\">\n <i class=\"fa-solid fa-ellipsis-v\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n \n <!-- Child categories -->\n @if (node.isExpanded) {\n @for (child of node.children; track child) {\n <ng-container *ngTemplateOutlet=\"categoryNodeTemplate; context: { node: child, depth: depth + 1 }\"></ng-container>\n }\n }\n </div>\n </ng-template>\n \n <!-- Context Menu (Phase 2.8 viewer-perspective gating).\n Items shown depend on contextItemCapabilities, resolved lazily\n on menu open. Viewers (no Edit/Share/Delete) still see\n Duplicate. Server-side enforcement remains source of truth;\n hiding is just UX so users don't see buttons that would fail. -->\n @if (showContextMenu) {\n <div class=\"context-menu-overlay\" (click)=\"closeContextMenu()\"></div>\n }\n @if (showContextMenu) {\n <div class=\"context-menu\" [style.top.px]=\"contextMenuY\" [style.left.px]=\"contextMenuX\">\n @if (contextItemCapabilities.CanEdit) {\n <button class=\"menu-item\" (click)=\"editList()\">\n <i class=\"fa-solid fa-pen\"></i>\n Edit\n </button>\n }\n @if (contextItemCapabilities.CanShare) {\n <button class=\"menu-item\" (click)=\"openShareDialog()\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n Share\n </button>\n }\n <button class=\"menu-item\" (click)=\"duplicateList()\">\n <i class=\"fa-solid fa-copy\"></i>\n Duplicate\n </button>\n @if (contextItemCapabilities.CanDelete) {\n <div class=\"menu-divider\"></div>\n <button class=\"menu-item danger\" (click)=\"confirmDeleteList()\">\n <i class=\"fa-solid fa-trash\"></i>\n Delete\n </button>\n }\n @if (!contextItemCapabilities.CanEdit && !contextItemCapabilities.CanShare && !contextItemCapabilities.CanDelete) {\n <div class=\"menu-viewer-hint\">\n <i class=\"fa-solid fa-eye\"></i>\n Viewer access — read only\n </div>\n }\n </div>\n }\n </mj-page-body>\n\n <!-- Modals/overlays live outside mj-page-body so its stacking context\n doesn't trap them. Position:fixed overlays would otherwise render\n behind a sibling overlay div, which silently closes the dialog on\n any click. -->\n <!-- Create/Edit Dialog -->\n @if (showCreateDialog) {\n <div class=\"modal-overlay\" (click)=\"closeCreateDialog()\"></div>\n }\n @if (showCreateDialog) {\n <div class=\"modal-dialog\">\n <div class=\"modal-header\">\n <h3>{{editingList ? 'Edit List' : 'Create New List'}}</h3>\n <button class=\"modal-close\" (click)=\"closeCreateDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <div class=\"form-group\">\n <label>Name *</label>\n <input\n type=\"text\"\n [(ngModel)]=\"newListName\"\n placeholder=\"Enter list name\"\n class=\"form-input\" />\n </div>\n <div class=\"form-group\">\n <label>Description</label>\n <textarea\n [(ngModel)]=\"newListDescription\"\n placeholder=\"Optional description\"\n class=\"form-input\"\n rows=\"3\"></textarea>\n </div>\n @if (!editingList) {\n <div class=\"form-group\">\n <label>Entity *</label>\n <div class=\"custom-select-wrapper\">\n <input\n #entityInput\n type=\"text\"\n [(ngModel)]=\"entitySearchTerm\"\n (ngModelChange)=\"filterEntities($event)\"\n (focus)=\"openEntityDropdown(entityInput)\"\n placeholder=\"Search and select an entity\"\n class=\"form-input\" />\n </div>\n </div>\n }\n @if (editingList) {\n <div class=\"form-group\">\n <label>Entity</label>\n <input type=\"text\" [value]=\"entitySearchTerm\" class=\"form-input\" disabled />\n </div>\n }\n <div class=\"form-group\">\n <label>Category</label>\n <select [(ngModel)]=\"selectedCategoryId\" class=\"form-input\">\n <option [ngValue]=\"null\">No category</option>\n @for (cat of flatCategories; track cat) {\n <option [ngValue]=\"cat.ID\">{{cat.displayName}}</option>\n }\n </select>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn-primary\"\n (click)=\"saveList()\"\n [disabled]=\"!newListName || (!editingList && !selectedEntityId) || isSaving\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{isSaving ? 'Saving...' : (editingList ? 'Save' : 'Create')}}\n </button>\n <button class=\"btn-secondary\" (click)=\"closeCreateDialog()\" [disabled]=\"isSaving\">Cancel</button>\n </div>\n </div>\n }\n \n <!-- Delete Confirmation Dialog -->\n @if (showDeleteConfirm) {\n <div class=\"modal-overlay\" (click)=\"cancelDelete()\"></div>\n }\n @if (showDeleteConfirm) {\n <div class=\"modal-dialog confirm-dialog\">\n <div class=\"modal-header\">\n <h3>Delete List</h3>\n <button class=\"modal-close\" (click)=\"cancelDelete()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <p>Are you sure you want to delete \"<strong>{{deleteListName}}</strong>\"?</p>\n <p class=\"warning-text\">This will also remove all items in the list.</p>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn-danger\" (click)=\"deleteList()\" [disabled]=\"isDeleting\">\n @if (isDeleting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{isDeleting ? 'Deleting...' : 'Delete'}}\n </button>\n <button class=\"btn-secondary\" (click)=\"cancelDelete()\" [disabled]=\"isDeleting\">Cancel</button>\n </div>\n </div>\n }\n \n <!-- Share Dialog -->\n @if (shareDialogConfig) {\n <mj-list-share-dialog\n [config]=\"shareDialogConfig\"\n [visible]=\"showShareDialog\"\n (complete)=\"onShareComplete($event)\"\n (cancel)=\"onShareCancel()\"\n (manageInvitations)=\"onManageInvitations()\"\n (viewAuditLog)=\"onViewAuditLog()\">\n </mj-list-share-dialog>\n }\n\n <!-- Invitations Dialog (mockup 16) -->\n @if (showInvitationsDialog && activeShareListId) {\n <mj-dialog\n [Visible]=\"true\"\n [Title]=\"'Invitations — ' + (activeShareListName ?? 'List')\"\n (Close)=\"closeInvitationsDialog()\"\n [MinWidth]=\"640\"\n [Width]=\"900\"\n [Height]=\"640\">\n <div class=\"dialog-content\">\n <mj-list-invitations\n [Provider]=\"ProviderToUse\"\n [ListID]=\"activeShareListId\"\n [ListName]=\"activeShareListName\">\n </mj-list-invitations>\n </div>\n <mj-dialog-actions>\n <button mjButton (click)=\"closeInvitationsDialog()\" variant=\"outline\">Close</button>\n </mj-dialog-actions>\n </mj-dialog>\n }\n\n <!-- Audit Log Dialog (mockup 18) -->\n @if (showAuditLogDialog && activeShareListId) {\n <mj-dialog\n [Visible]=\"true\"\n [Title]=\"'Audit Log — ' + (activeShareListName ?? 'List')\"\n (Close)=\"closeAuditLogDialog()\"\n [MinWidth]=\"720\"\n [Width]=\"980\"\n [Height]=\"680\">\n <div class=\"dialog-content\">\n <mj-list-audit-log\n [Provider]=\"ProviderToUse\"\n [ListID]=\"activeShareListId\">\n </mj-list-audit-log>\n </div>\n <mj-dialog-actions>\n <button mjButton (click)=\"closeAuditLogDialog()\" variant=\"outline\">Close</button>\n </mj-dialog-actions>\n </mj-dialog>\n }\n \n <!-- Entity Dropdown Portal -->\n @if (showEntityDropdown && !editingList) {\n <div\n class=\"entity-dropdown-portal\"\n [style.top.px]=\"entityDropdownPosition.top\"\n [style.left.px]=\"entityDropdownPosition.left\"\n [style.width.px]=\"entityDropdownPosition.width\"\n [class.dropdown-above]=\"entityDropdownPosition.openAbove\">\n <div class=\"entity-dropdown-content\" [class.open-above]=\"entityDropdownPosition.openAbove\">\n @for (entity of filteredEntitiesList; track entity) {\n <div\n class=\"dropdown-item\"\n (mousedown)=\"selectEntity(entity); $event.preventDefault()\">\n {{entity.Name}}\n </div>\n }\n @if (filteredEntitiesList.length === 0) {\n <div class=\"dropdown-empty\">\n No entities found\n </div>\n }\n </div>\n </div>\n }\n </mj-page-layout>\n `,\n styles: [`\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .lists-browse-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface);\n overflow: hidden;\n }\n\n /* Header */\n .browse-header {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n }\n\n .header-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .header-title {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .header-title i {\n font-size: 24px;\n color: var(--mj-brand-primary);\n }\n\n .header-title h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .header-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n }\n\n .search-box {\n position: relative;\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 200px;\n max-width: 300px;\n }\n\n .search-box i.fa-search {\n position: absolute;\n left: 12px;\n color: var(--mj-text-muted);\n }\n\n .search-box input {\n padding: 8px 36px;\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n font-size: 14px;\n width: 100%;\n transition: border-color 0.2s, box-shadow 0.2s;\n }\n\n .search-box input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .clear-search {\n position: absolute;\n right: 8px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n }\n\n .filter-group {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .filter-group label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .filter-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n min-width: 120px;\n }\n\n .filter-select:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .sort-select {\n min-width: 140px;\n }\n\n .view-toggle-group {\n display: flex;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n }\n\n .view-toggle {\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border: none;\n border-right: 1px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .view-toggle:last-child {\n border-right: none;\n }\n\n .view-toggle:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .view-toggle.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n\n .btn-create {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-create:hover {\n background: var(--mj-brand-primary-hover);\n }\n\n /* Loading */\n .loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n }\n\n /* Empty State */\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n padding: 48px 40px;\n text-align: center;\n max-width: 480px;\n margin: 0 auto;\n }\n\n .empty-state-icon-wrapper {\n position: relative;\n margin-bottom: 24px;\n }\n\n .empty-state-icon-wrapper .icon-bg {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 120px;\n height: 120px;\n border-radius: 50%;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n .empty-state-icon-wrapper > i {\n position: relative;\n font-size: 56px;\n color: var(--mj-brand-primary);\n z-index: 1;\n }\n\n .empty-state-icon-wrapper.search > i {\n font-size: 48px;\n color: var(--mj-text-disabled);\n }\n\n .empty-state h3 {\n margin: 0 0 12px;\n font-size: 22px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .empty-state p {\n margin: 0 0 8px;\n color: var(--mj-text-secondary);\n font-size: 15px;\n line-height: 1.5;\n }\n\n .empty-state p:last-of-type {\n margin-bottom: 24px;\n }\n\n .empty-hint {\n color: var(--mj-text-muted) !important;\n font-size: 13px !important;\n }\n\n .empty-state-features {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 28px;\n text-align: left;\n }\n\n .feature-item {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 14px;\n color: var(--mj-text-secondary);\n }\n\n .feature-item i {\n font-size: 14px !important;\n color: var(--mj-status-success) !important;\n }\n\n .btn-create-large {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 28px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 8px;\n font-size: 15px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n }\n\n .btn-create-large:hover {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-1px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n }\n\n .btn-clear {\n padding: 10px 20px;\n background: var(--mj-bg-surface-sunken);\n border: none;\n border-radius: 6px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-clear:hover {\n background: var(--mj-border-default);\n }\n\n /* Content */\n .browse-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px 24px;\n }\n\n .results-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n }\n\n .result-count {\n font-size: 14px;\n color: var(--mj-text-secondary);\n }\n\n .sort-options {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .sort-options label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n /* Table View */\n .lists-table {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n overflow: hidden;\n box-shadow: var(--mj-shadow-sm);\n }\n\n .lists-table table {\n width: 100%;\n border-collapse: collapse;\n }\n\n .lists-table th {\n text-align: left;\n padding: 12px 16px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .lists-table td {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .list-row {\n cursor: pointer;\n transition: background 0.15s;\n outline: none;\n }\n\n .list-row:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .list-row:focus {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .list-row:focus-visible {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n box-shadow: inset 3px 0 0 var(--mj-brand-primary);\n }\n\n .list-row:last-child td {\n border-bottom: none;\n }\n\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n\n .col-name { width: 30%; }\n .col-entity { width: 15%; }\n .col-items { width: 8%; text-align: center; }\n .col-sharing { width: 8%; text-align: center; }\n .col-owner { width: 14%; }\n .col-updated { width: 15%; }\n .col-actions { width: 10%; text-align: right; }\n\n /* Sharing indicators */\n .sharing-indicator {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n color: var(--mj-brand-primary);\n font-size: 13px;\n }\n\n .sharing-indicator i {\n font-size: 14px;\n }\n\n .share-count {\n font-weight: 500;\n }\n\n .sharing-private {\n color: var(--mj-text-muted);\n font-size: 13px;\n }\n\n .sharing-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 50%;\n color: var(--mj-brand-primary);\n font-size: 11px;\n }\n\n .card-footer-right {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .name-cell {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .list-icon {\n width: 36px;\n height: 36px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 14px;\n flex-shrink: 0;\n }\n\n .name-content {\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n\n .list-name {\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .list-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .entity-badge {\n display: inline-block;\n padding: 2px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 4px;\n font-size: 12px;\n color: var(--mj-brand-primary-hover);\n }\n\n .owner-name {\n color: var(--mj-text-secondary);\n }\n\n .owner-name.is-me {\n color: var(--mj-brand-primary);\n font-weight: 500;\n }\n\n .action-btn {\n background: none;\n border: none;\n padding: 6px 10px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n transition: all 0.15s;\n }\n\n .action-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n }\n\n /* Card View */\n .lists-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n }\n\n .list-card {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-sm);\n overflow: hidden;\n cursor: pointer;\n transition: transform 0.2s, box-shadow 0.2s, outline 0.1s;\n outline: 2px solid transparent;\n }\n\n .list-card:hover {\n transform: translateY(-2px);\n box-shadow: var(--mj-shadow-md);\n }\n\n .list-card:focus {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n }\n\n .list-card:focus:not(:focus-visible) {\n outline: none;\n }\n\n .list-card:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n }\n\n .card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 16px 16px 0;\n }\n\n .card-icon {\n width: 40px;\n height: 40px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-inverse);\n font-size: 18px;\n }\n\n .menu-btn {\n background: none;\n border: none;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n }\n\n .menu-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n }\n\n .card-body {\n padding: 12px 16px;\n }\n\n .card-title {\n margin: 0 0 4px;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .card-description {\n margin: 0 0 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .card-meta {\n display: flex;\n gap: 16px;\n }\n\n .meta-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n /* Tag chips on a card. Stop-propagation is set on the wrapper so\n clicks on chips don't open the underlying list. */\n .card-tags {\n margin-top: 8px;\n }\n\n /* Favorite star on cards (Phase 5.3). */\n .favorite-btn {\n background: none;\n border: none;\n padding: 4px;\n margin: -4px;\n cursor: pointer;\n color: var(--mj-text-muted);\n font-size: 14px;\n border-radius: 4px;\n transition: color 0.12s ease, background 0.12s ease;\n }\n\n .favorite-btn:hover {\n background: var(--mj-bg-surface-card);\n color: var(--mj-status-warning);\n }\n\n .favorite-btn--active {\n color: var(--mj-status-warning);\n }\n\n /* Favorites-only toggle in the toolbar. */\n .favorite-filter-toggle {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: none;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 12.5px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n }\n\n .favorite-filter-toggle:hover {\n border-color: var(--mj-status-warning);\n color: var(--mj-status-warning);\n }\n\n .favorite-filter-toggle--active {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n border-color: var(--mj-status-warning);\n color: var(--mj-status-warning);\n font-weight: 600;\n }\n\n /* Active-tag filter row above the grid (Phase 4.3). */\n .tag-filter-row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n padding: 10px 12px;\n margin-bottom: 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px dashed var(--mj-border-default);\n border-radius: 8px;\n font-size: 12.5px;\n }\n\n .tag-filter-row__label {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-text-muted);\n font-weight: 500;\n }\n\n .tag-filter-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 2px 10px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border: 1px solid var(--mj-brand-primary);\n font-size: 11.5px;\n cursor: pointer;\n }\n\n .tag-filter-chip:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-bg-surface));\n }\n\n .tag-filter-row__clear {\n background: none;\n border: none;\n color: var(--mj-text-link);\n font-size: 11.5px;\n cursor: pointer;\n margin-left: auto;\n }\n\n .tag-filter-row__clear:hover {\n text-decoration: underline;\n }\n\n .card-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .owner-tag {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n }\n\n .owner-tag.is-me {\n color: var(--mj-brand-primary);\n }\n\n .date-info {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n /* Hierarchy View */\n .category-tree {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .category-section {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n overflow: hidden;\n }\n\n .category-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .category-header:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .category-header i:first-child {\n width: 16px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .category-header .fa-folder,\n .category-header .fa-folder-open {\n color: var(--mj-status-warning);\n }\n\n .category-header.uncategorized .fa-inbox {\n color: var(--mj-text-muted);\n }\n\n .category-name {\n flex: 1;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .category-count {\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 8px;\n border-radius: 10px;\n }\n\n .category-lists {\n border-top: 1px solid var(--mj-border-default);\n }\n\n .hierarchy-row {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px 12px 40px;\n cursor: pointer;\n transition: background 0.2s;\n outline: none;\n }\n\n .hierarchy-row:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .hierarchy-row:focus {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .hierarchy-row:focus-visible {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n box-shadow: inset 3px 0 0 var(--mj-brand-primary);\n }\n\n .list-info {\n flex: 1;\n min-width: 0;\n }\n\n .list-meta {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .list-actions {\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.2s;\n }\n\n .hierarchy-row:hover .list-actions {\n opacity: 1;\n }\n\n /* Context Menu */\n .context-menu-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999;\n }\n\n .context-menu {\n position: fixed;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-md);\n min-width: 160px;\n padding: 4px 0;\n z-index: 1000;\n }\n\n .menu-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 10px 16px;\n background: none;\n border: none;\n text-align: left;\n font-size: 14px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .menu-item:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .menu-item.danger {\n color: var(--mj-status-error);\n }\n\n .menu-item.danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n }\n\n .menu-divider {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\n }\n\n .menu-viewer-hint {\n padding: 10px 14px;\n font-size: 12px;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 8px;\n font-style: italic;\n }\n .menu-viewer-hint i { color: var(--mj-text-muted); }\n\n /* Modal Styles */\n .modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n }\n\n .modal-dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-lg);\n width: 500px;\n max-width: 90vw;\n max-height: 90vh;\n overflow: hidden;\n z-index: 1001;\n }\n\n .confirm-dialog {\n width: 400px;\n }\n\n .modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .modal-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .modal-close {\n background: none;\n border: none;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n border-radius: 4px;\n }\n\n .modal-close:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n }\n\n .modal-body {\n padding: 20px;\n max-height: 60vh;\n overflow-y: auto;\n }\n\n .modal-body p {\n margin: 0 0 8px;\n color: var(--mj-text-primary);\n }\n\n .warning-text {\n color: var(--mj-status-error) !important;\n font-size: 13px;\n }\n\n .modal-footer {\n display: flex;\n gap: 12px;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n\n .btn-primary:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .btn-secondary {\n padding: 10px 20px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-secondary:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n }\n\n .btn-danger {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .btn-danger:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-status-error) 85%, black);\n }\n\n /* Form Styles */\n .form-group {\n margin-bottom: 16px;\n }\n\n .form-group:last-child {\n margin-bottom: 0;\n }\n\n .form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .form-input {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n transition: border-color 0.2s, box-shadow 0.2s;\n box-sizing: border-box;\n }\n\n .form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n\n .form-input:disabled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n textarea.form-input {\n resize: vertical;\n min-height: 80px;\n }\n\n select.form-input {\n cursor: pointer;\n }\n\n .custom-select-wrapper {\n position: relative;\n }\n\n /* Portal Dropdown */\n .entity-dropdown-portal {\n position: fixed;\n z-index: 10002;\n }\n\n .entity-dropdown-content {\n max-height: 200px;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n box-shadow: var(--mj-shadow-md);\n }\n\n .entity-dropdown-content.open-above {\n position: absolute;\n bottom: 0;\n }\n\n .dropdown-item {\n padding: 10px 12px;\n cursor: pointer;\n transition: background 0.15s;\n font-size: 14px;\n color: var(--mj-text-primary);\n }\n\n .dropdown-item:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n }\n\n .dropdown-item:first-child {\n border-radius: 6px 6px 0 0;\n }\n\n .dropdown-item:last-child {\n border-radius: 0 0 6px 6px;\n }\n\n .dropdown-empty {\n padding: 10px 12px;\n color: var(--mj-text-muted);\n font-style: italic;\n }\n\n /* Responsive */\n @media (max-width: 768px) {\n .header-row {\n flex-direction: column;\n gap: 12px;\n align-items: stretch;\n }\n\n .btn-create {\n width: 100%;\n justify-content: center;\n }\n\n .header-actions {\n flex-direction: column;\n align-items: stretch;\n }\n\n .search-box {\n max-width: none;\n }\n\n .filter-group {\n width: 100%;\n }\n\n .filter-select {\n flex: 1;\n width: 100%;\n }\n\n .view-toggle-group {\n justify-content: center;\n }\n\n .lists-table {\n overflow-x: auto;\n }\n\n .col-entity, .col-items, .col-updated {\n display: none;\n }\n\n .lists-grid {\n grid-template-columns: 1fr;\n }\n\n .modal-dialog {\n width: 95vw;\n }\n }\n `],\n encapsulation: ViewEncapsulation.None\n})\nexport class ListsBrowseResource extends BaseResourceComponent implements OnDestroy {\n protected override destroy$ = new Subject<void>();\n\n isLoading = true;\n searchTerm = '';\n viewMode: ViewMode = 'card';\n selectedEntity = 'all';\n selectedOwner = 'mine';\n selectedSort = 'name';\n\n /**\n * Active tag filters (Phase 4.3). Multi-tag = AND — a list must have\n * every active tag to appear. URL state mirrors this via the `tags`\n * query param (comma-separated tag IDs).\n */\n tagFilters: Array<{ TagID: string; Name: string }> = [];\n\n /**\n * Set of List IDs that match the current `tagFilters` (intersection).\n * `null` means \"no tag filter active\" — pass-through. Populated by\n * `recomputeTagMembership` whenever `tagFilters` changes; consumed by\n * `applyFilters` to narrow the visible list.\n */\n private tagFilteredListIds: Set<string> | null = null;\n\n /**\n * Favorite-list IDs for the current user (Phase 5.3). Backed by the\n * existing `MJ: User Favorites` entity. `null` while loading; a Set\n * once populated so card-side toggling is O(1).\n */\n favoriteListIds: Set<string> = new Set();\n\n /** When true, only favorited lists appear in the grid. */\n showOnlyFavorites = false;\n\n allLists: BrowseListItem[] = [];\n filteredLists: BrowseListItem[] = [];\n categories: MJListCategoryEntity[] = [];\n categoryTree: CategoryNode[] = [];\n flatCategories: Array<{ ID: string; displayName: string }> = [];\n availableEntities: Array<{ ID: string; Name: string }> = [];\n filteredEntitiesList: Array<{ ID: string; Name: string }> = [];\n\n entityOptions: Array<{ name: string; value: string }> = [{ name: 'All Entities', value: 'all' }];\n ownerOptions: Array<{ name: string; value: string }> = [\n { name: 'My Lists', value: 'mine' },\n { name: 'All Lists', value: 'all' },\n { name: 'Others', value: 'others' }\n ];\n sortOptions: Array<{ name: string; value: string }> = [\n { name: 'Name', value: 'name' },\n { name: 'Recently Updated', value: 'updated' },\n { name: 'Most Items', value: 'items' },\n { name: 'Entity', value: 'entity' }\n ];\n\n // Context menu state\n showContextMenu = false;\n contextMenuX = 0;\n contextMenuY = 0;\n selectedContextItem: BrowseListItem | null = null;\n\n // Create/Edit dialog state\n showCreateDialog = false;\n editingList: MJListEntity | null = null;\n newListName = '';\n newListDescription = '';\n selectedEntityId = '';\n selectedCategoryId: string | null = null;\n entitySearchTerm = '';\n showEntityDropdown = false;\n entityDropdownPosition = { top: 0, left: 0, width: 0, openAbove: false };\n\n // Delete confirmation state\n showDeleteConfirm = false;\n deleteListName = '';\n listToDelete: MJListEntity | null = null;\n\n // Operation states\n isSaving = false;\n isDeleting = false;\n\n // Sharing dialog state\n showShareDialog = false;\n shareDialogConfig: ListShareDialogConfig | null = null;\n\n // Viewer-perspective gating (Phase 2.8). Capabilities are computed\n // lazily when the user opens the context menu — running per-card\n // would mean N permission-resolve calls per browse render. The\n // resolved level is cached on the item so re-opening the same menu\n // doesn't refetch.\n public contextItemCapabilities: ListCapabilities = CapabilitiesForLevel('Owner');\n private capabilityCache = new Map<string, SharePermissionLevel | null>();\n\n // Tracks whether the in-memory categories list is known-stale\n // relative to the DB. Flipped to true by the BaseEntity event\n // subscription whenever any `MJ: List Categories` row is saved or\n // deleted (most often from the Categories tab next door). Reset to\n // false after `refreshCategoriesForDialog` reloads. Initial true so\n // the first dialog open always populates from a fresh fetch.\n private categoriesDirty = true;\n\n // Invitations / audit log dialogs (mockups 16, 18) — opened from\n // the share dialog. Each dialog binds to a single list at a time,\n // tracked by `activeShareListId`/`activeShareListName` lifted from\n // shareDialogConfig at open time so we keep the context after the\n // share dialog closes.\n showInvitationsDialog = false;\n showAuditLogDialog = false;\n activeShareListId: string | null = null;\n activeShareListName: string | null = null;\n\n private entityColorMap: Map<string, string> = new Map();\n private entityIconMap: Map<string, string> = new Map();\n private categoryMap: Map<string, MJListCategoryEntity> = new Map();\n private currentUserId = '';\n\n constructor(\n private cdr: ChangeDetectorRef,\n private tabService: TabService,\n private notificationService: MJNotificationService,\n private elementRef: ElementRef,\n private listSharingService: ListSharingService\n ) {\n super();\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent) {\n if (this.showEntityDropdown) {\n const target = event.target as HTMLElement;\n if (!target.closest('.custom-select-wrapper') && !target.closest('.entity-dropdown-portal')) {\n this.showEntityDropdown = false;\n }\n }\n }\n\n @HostListener('document:keydown.escape')\n onEscapeKey() {\n if (this.showContextMenu) {\n this.closeContextMenu();\n }\n if (this.showCreateDialog) {\n this.closeCreateDialog();\n }\n if (this.showDeleteConfirm) {\n this.cancelDelete();\n }\n if (this.showEntityDropdown) {\n this.closeEntityDropdown();\n }\n }\n\n async ngOnInit() {\n super.ngOnInit();\n this.subscribeToCategoryChanges();\n await this.loadData();\n this.NotifyLoadComplete();\n }\n\n /**\n * Mark the in-memory categories list dirty whenever any BaseEntity\n * raises a save / delete event for `MJ: List Categories`. The\n * Create/Edit dialog uses this flag to skip the per-open RunView\n * unless something has actually changed since last load — keeps the\n * dialog snappy without showing stale categories.\n *\n * Subscribes to MJGlobal's event bus rather than wiring each\n * category entity's per-instance listener, because the Categories\n * tab creates fresh BaseEntity instances we can't see from here.\n */\n private subscribeToCategoryChanges(): void {\n MJGlobal.Instance.GetEventListener()\n .pipe(takeUntil(this.destroy$))\n .subscribe((mjEvt) => {\n if (mjEvt.eventCode !== BaseEntity.BaseEventCode) return;\n const beEvt = mjEvt.args as BaseEntityEvent | undefined;\n if (!beEvt) return;\n const entityName = beEvt.baseEntity?.EntityInfo.Name ?? beEvt.entityName;\n if (entityName !== 'MJ: List Categories') return;\n if (beEvt.type === 'save' || beEvt.type === 'delete') {\n this.categoriesDirty = true;\n }\n });\n }\n\n ngOnDestroy() {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async loadData() {\n this.isLoading = true;\n\n try {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n this.currentUserId = md.CurrentUser?.ID || '';\n\n // BypassCache on Lists + List Details: after a delete/duplicate, the\n // RunView cache for these entities doesn't always reflect the latest\n // state in time (event-driven invalidation races the immediate\n // refresh). Trading a small perf hit for correctness here is worth\n // it — categories and users stay cache-warm.\n const [listsResult, categoriesResult, detailsResult, usersResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Lists',\n OrderBy: 'Name',\n ResultType: 'entity_object',\n BypassCache: true\n },\n {\n EntityName: 'MJ: List Categories',\n OrderBy: 'Name',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: List Details',\n Fields: ['ListID'],\n ResultType: 'simple',\n BypassCache: true\n },\n {\n EntityName: 'MJ: Users',\n Fields: ['ID', 'Name'],\n ResultType: 'simple'\n }\n ]);\n\n if (!listsResult.Success) {\n console.error('Failed to load lists');\n return;\n }\n\n const lists = listsResult.Results as MJListEntity[];\n this.categories = (categoriesResult.Results || []) as MJListCategoryEntity[];\n const details = (detailsResult.Results || []) as Array<{ ListID: string }>;\n const users = (usersResult.Results || []) as Array<{ ID: string; Name: string }>;\n\n // Build category map\n this.categoryMap.clear();\n for (const cat of this.categories) {\n this.categoryMap.set(cat.ID, cat);\n }\n\n // Build flat categories for dropdown\n this.flatCategories = this.buildFlatCategories(this.categories);\n // loadData() already pulled fresh categories — clear the dirty\n // flag so the first dialog open doesn't redundantly refetch.\n this.categoriesDirty = false;\n\n // Build user map\n const userMap = new Map<string, string>();\n for (const user of users) {\n userMap.set(user.ID, user.Name);\n }\n\n // Count items per list\n const itemCounts = new Map<string, number>();\n for (const detail of details) {\n const count = itemCounts.get(detail.ListID) || 0;\n itemCounts.set(detail.ListID, count + 1);\n }\n\n // Build entity info\n const entities = md.Entities;\n const entitySet = new Set<string>();\n\n for (const entity of entities) {\n this.entityColorMap.set(entity.Name, this.generateEntityColor(entity.Name));\n this.entityIconMap.set(entity.Name, entity.Icon || 'fa-solid fa-table');\n }\n\n // Build available entities for dropdown\n this.availableEntities = entities\n .filter(e => e.IncludeInAPI)\n .map(e => ({ ID: e.ID, Name: e.Name }))\n .sort((a, b) => a.Name.localeCompare(b.Name));\n this.filteredEntitiesList = [...this.availableEntities];\n\n // Build list items\n this.allLists = lists.map(list => {\n const entityName = list.Entity || 'Unknown';\n entitySet.add(entityName);\n return {\n list,\n itemCount: itemCounts.get(list.ID) || 0,\n entityName,\n ownerName: userMap.get(list.UserID) || 'Unknown',\n isOwner: UUIDsEqual(list.UserID, this.currentUserId)\n };\n });\n\n // Build entity filter options\n this.entityOptions = [\n { name: 'All Entities', value: 'all' },\n ...Array.from(entitySet).sort().map(e => ({ name: e, value: e }))\n ];\n\n this.applyFilters();\n this.buildCategoryTree();\n\n // Load favorites in parallel — not critical-path, but cheap.\n void this.loadFavorites();\n\n // Load sharing info in the background\n this.loadSharingInfo();\n } catch (error) {\n console.error('Error loading lists:', error);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n private buildFlatCategories(categories: MJListCategoryEntity[]): Array<{ ID: string; displayName: string }> {\n const result: Array<{ ID: string; displayName: string }> = [];\n const topLevel = categories.filter(c => !c.ParentID);\n\n const processCategory = (cat: MJListCategoryEntity, level: number) => {\n const indent = '\\u00A0\\u00A0'.repeat(level);\n result.push({ ID: cat.ID, displayName: `${indent}${cat.Name}` });\n\n const children = categories.filter(c => UUIDsEqual(c.ParentID, cat.ID));\n for (const child of children) {\n processCategory(child, level + 1);\n }\n };\n\n for (const cat of topLevel) {\n processCategory(cat, 0);\n }\n\n return result;\n }\n\n private buildCategoryTree() {\n const rootNodes: CategoryNode[] = [];\n const categoryNodes = new Map<string, CategoryNode>();\n\n // Create nodes for all categories\n for (const cat of this.categories) {\n categoryNodes.set(cat.ID, {\n category: cat,\n lists: [],\n children: [],\n isExpanded: true\n });\n }\n\n // Build tree structure\n for (const cat of this.categories) {\n const node = categoryNodes.get(cat.ID)!;\n if (cat.ParentID && categoryNodes.has(cat.ParentID)) {\n categoryNodes.get(cat.ParentID)!.children.push(node);\n } else {\n rootNodes.push(node);\n }\n }\n\n // Assign lists to categories\n const uncategorizedLists: BrowseListItem[] = [];\n for (const item of this.filteredLists) {\n if (item.list.CategoryID && categoryNodes.has(item.list.CategoryID)) {\n categoryNodes.get(item.list.CategoryID)!.lists.push(item);\n } else {\n uncategorizedLists.push(item);\n }\n }\n\n // Add uncategorized node if there are uncategorized lists\n if (uncategorizedLists.length > 0) {\n rootNodes.unshift({\n category: null,\n lists: uncategorizedLists,\n children: [],\n isExpanded: true\n });\n }\n\n this.categoryTree = rootNodes;\n }\n\n setViewMode(mode: ViewMode) {\n this.viewMode = mode;\n }\n\n /** View-mode options for the shared <mj-view-toggle>. */\n public readonly listViewOptions = [\n { key: 'table', icon: 'fa-solid fa-table-list', title: 'Table view' },\n { key: 'card', icon: 'fa-solid fa-grip', title: 'Card view' },\n { key: 'hierarchy', icon: 'fa-solid fa-folder-tree', title: 'Category view' },\n ];\n\n /** Values record consumed by the centralized <mj-filter-panel>. */\n public get listFilterValues(): Record<string, unknown> {\n return { selectedOwner: this.selectedOwner, selectedEntity: this.selectedEntity };\n }\n\n /** Field config consumed by the centralized <mj-filter-panel>. */\n public get listFilterFields(): FilterFieldConfig[] {\n return [\n {\n key: 'selectedOwner',\n type: 'dropdown',\n label: 'Owner',\n icon: 'fa-solid fa-user',\n options: this.ownerOptions.map(o => ({ text: o.name, value: o.value })),\n },\n {\n key: 'selectedEntity',\n type: 'dropdown',\n label: 'Entity',\n icon: 'fa-solid fa-table',\n filterable: this.entityOptions.length > 10,\n options: this.entityOptions.map(o => ({ text: o.name, value: o.value })),\n },\n ];\n }\n\n /** Receive popover updates and apply them. */\n public onFilterValuesChange(values: Record<string, unknown>): void {\n this.selectedOwner = (values['selectedOwner'] as string) ?? 'mine';\n this.selectedEntity = (values['selectedEntity'] as string) ?? 'all';\n this.applyFilters();\n this.buildCategoryTree();\n }\n\n /** Reset popover filters to defaults; leaves searchTerm alone. */\n public resetPopoverFilters(): void {\n this.selectedOwner = 'mine';\n this.selectedEntity = 'all';\n this.applyFilters();\n this.buildCategoryTree();\n }\n\n /** Active filter count for the popover badge (excludes searchTerm). */\n public get ActiveFilterCount(): number {\n let n = 0;\n if (this.selectedOwner && this.selectedOwner !== 'mine') n++;\n if (this.selectedEntity && this.selectedEntity !== 'all') n++;\n return n;\n }\n\n onSearchChange(term: string) {\n this.searchTerm = term;\n this.applyFilters();\n this.buildCategoryTree();\n }\n\n onEntityFilterChange(_value: string) {\n this.applyFilters();\n this.buildCategoryTree();\n }\n\n onOwnerFilterChange(_value: string) {\n this.applyFilters();\n this.buildCategoryTree();\n }\n\n onSortChange(_value: string) {\n this.applyFilters();\n this.buildCategoryTree();\n }\n\n clearSearch() {\n this.searchTerm = '';\n this.applyFilters();\n this.buildCategoryTree();\n }\n\n clearFilters() {\n this.searchTerm = '';\n this.selectedEntity = 'all';\n this.selectedOwner = 'mine';\n this.applyFilters();\n this.buildCategoryTree();\n }\n\n private applyFilters() {\n let result = [...this.allLists];\n\n // Owner filter\n if (this.selectedOwner === 'mine') {\n result = result.filter(item => item.isOwner);\n } else if (this.selectedOwner === 'others') {\n result = result.filter(item => !item.isOwner);\n }\n\n // Search filter\n if (this.searchTerm) {\n const term = this.searchTerm.toLowerCase();\n result = result.filter(item =>\n item.list.Name.toLowerCase().includes(term) ||\n (item.list.Description && item.list.Description.toLowerCase().includes(term)) ||\n item.entityName.toLowerCase().includes(term) ||\n item.ownerName.toLowerCase().includes(term)\n );\n }\n\n // Entity filter\n if (this.selectedEntity !== 'all') {\n result = result.filter(item => item.entityName === this.selectedEntity);\n }\n\n // Tag filter (Phase 4.3 — intersection of all active tags).\n if (this.tagFilteredListIds !== null) {\n const matches = this.tagFilteredListIds;\n result = result.filter(item => matches.has(item.list.ID));\n }\n\n // Favorites-only toggle (Phase 5.3).\n if (this.showOnlyFavorites) {\n const favs = this.favoriteListIds;\n result = result.filter(item => favs.has(item.list.ID));\n }\n\n // Sort\n switch (this.selectedSort) {\n case 'name':\n result.sort((a, b) => a.list.Name.localeCompare(b.list.Name));\n break;\n case 'updated':\n result.sort((a, b) => {\n const dateA = new Date(a.list.__mj_UpdatedAt).getTime();\n const dateB = new Date(b.list.__mj_UpdatedAt).getTime();\n return dateB - dateA;\n });\n break;\n case 'items':\n result.sort((a, b) => b.itemCount - a.itemCount);\n break;\n case 'entity':\n result.sort((a, b) => a.entityName.localeCompare(b.entityName));\n break;\n }\n\n this.filteredLists = result;\n }\n\n toggleCategory(node: CategoryNode) {\n node.isExpanded = !node.isExpanded;\n }\n\n getListCountInCategory(node: CategoryNode): number {\n let count = node.lists.length;\n for (const child of node.children) {\n count += this.getListCountInCategory(child);\n }\n return count;\n }\n\n getEntityColor(entityName: string): string {\n return this.entityColorMap.get(entityName) || '#607D8B';\n }\n\n getEntityIcon(entityName: string): string {\n return this.entityIconMap.get(entityName) || 'fa-solid fa-table';\n }\n\n private generateEntityColor(entityName: string): string {\n let hash = 0;\n for (let i = 0; i < entityName.length; i++) {\n hash = entityName.charCodeAt(i) + ((hash << 5) - hash);\n }\n const colors = [\n '#2196F3', '#4CAF50', '#FF9800', '#9C27B0', '#F44336',\n '#00BCD4', '#795548', '#607D8B', '#E91E63', '#3F51B5'\n ];\n return colors[Math.abs(hash) % colors.length];\n }\n\n formatDate(date: Date): string {\n if (!date) return '';\n const now = new Date();\n const d = new Date(date);\n const diffMs = now.getTime() - d.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) return 'Today';\n if (diffDays === 1) return 'Yesterday';\n if (diffDays < 7) return `${diffDays} days ago`;\n return d.toLocaleDateString();\n }\n\n openList(item: BrowseListItem) {\n const appId = this.Data?.Configuration?.applicationId || '';\n this.tabService.OpenList(item.list.ID, item.list.Name, appId);\n }\n\n /**\n * Handle a tag chip click on a list card — adds the tag to the\n * filter row (multi-tag = AND). Wired by Phase 4.3; the chip\n * component emits the (TagID, Name) pair so we can both display\n * the chip name and filter by ID.\n */\n onCardTagClicked(payload: { TagID: string; Name: string }): void {\n if (this.tagFilters.some((f) => f.TagID === payload.TagID)) return;\n this.tagFilters = [...this.tagFilters, payload];\n void this.recomputeTagMembership();\n }\n\n /** Remove a tag from the filter row. */\n removeTagFilter(tagId: string): void {\n this.tagFilters = this.tagFilters.filter((f) => f.TagID !== tagId);\n void this.recomputeTagMembership();\n }\n\n /** Clear all active tag filters. */\n clearTagFilters(): void {\n this.tagFilters = [];\n this.tagFilteredListIds = null;\n this.applyFilters();\n }\n\n /**\n * Resolve which lists have ALL active tags. Done server-side so the\n * filter works regardless of which lists the user has scrolled past.\n * Result is cached on `tagFilteredListIds`; `applyFilters` consumes it.\n */\n private async recomputeTagMembership(): Promise<void> {\n if (this.tagFilters.length === 0) {\n this.tagFilteredListIds = null;\n this.applyFilters();\n return;\n }\n try {\n const md = this.ProviderToUse;\n const listsEntity = md.Entities.find((e) => e.Name === 'MJ: Lists');\n if (!listsEntity) {\n this.tagFilteredListIds = new Set();\n this.applyFilters();\n return;\n }\n const tagIds = this.tagFilters.map((f) => `'${f.TagID}'`).join(',');\n const rv = RunView.FromMetadataProvider(md);\n const result = await rv.RunView<{ RecordID: string; TagID: string }>({\n EntityName: 'MJ: Tagged Items',\n ExtraFilter: `EntityID='${listsEntity.ID}' AND TagID IN (${tagIds})`,\n Fields: ['RecordID', 'TagID'],\n ResultType: 'simple',\n });\n // Intersection: count tag hits per list, keep only those with\n // exactly `tagFilters.length` matches (one per required tag).\n const counts = new Map<string, number>();\n for (const row of result.Results ?? []) {\n const id = String(row.RecordID);\n counts.set(id, (counts.get(id) ?? 0) + 1);\n }\n const required = this.tagFilters.length;\n const matches = new Set<string>();\n for (const [id, count] of counts) {\n if (count >= required) matches.add(id);\n }\n this.tagFilteredListIds = matches;\n } catch (e) {\n // On failure, fall back to \"no match\" so the user sees an empty\n // state rather than every list — avoids leaking unfiltered data\n // when the filter intent failed silently.\n this.tagFilteredListIds = new Set();\n }\n this.applyFilters();\n }\n\n /**\n * Load the current user's favorite lists into `favoriteListIds`.\n * Cheap — typically <100 rows per user. Driven by the `MJ: User\n * Favorites` entity scoped by the Lists EntityID. Best-effort: on\n * failure the star icons just stay dim.\n */\n private async loadFavorites(): Promise<void> {\n try {\n const md = this.ProviderToUse;\n const listsEntity = md.Entities.find((e) => e.Name === 'MJ: Lists');\n if (!listsEntity || !md.CurrentUser) return;\n const rv = RunView.FromMetadataProvider(md);\n const result = await rv.RunView<{ RecordID: string }>({\n EntityName: 'MJ: User Favorites',\n ExtraFilter: `UserID='${md.CurrentUser.ID}' AND EntityID='${listsEntity.ID}'`,\n Fields: ['RecordID'],\n ResultType: 'simple',\n });\n this.favoriteListIds = new Set((result.Results ?? []).map((r) => String(r.RecordID)));\n } catch {\n // Silent — favorites are a polish feature, not load-bearing.\n this.favoriteListIds = new Set();\n }\n }\n\n /**\n * Toggle a list's favorite state. Optimistic: flips the local Set\n * first, then writes through. Reverts on failure.\n */\n async toggleFavorite(event: Event, item: BrowseListItem): Promise<void> {\n event.stopPropagation();\n const wasFav = this.favoriteListIds.has(item.list.ID);\n // Optimistic update.\n if (wasFav) this.favoriteListIds.delete(item.list.ID);\n else this.favoriteListIds.add(item.list.ID);\n // Re-trigger filter recompute since the favorites-only toggle\n // may be on.\n this.applyFilters();\n\n try {\n const md = this.ProviderToUse;\n const listsEntity = md.Entities.find((e) => e.Name === 'MJ: Lists');\n if (!listsEntity || !md.CurrentUser) throw new Error('Cannot resolve user favorites entity');\n\n if (wasFav) {\n // Find + delete the existing favorite row.\n const rv = RunView.FromMetadataProvider(md);\n const result = await rv.RunView<MJUserFavoriteEntity>({\n EntityName: 'MJ: User Favorites',\n ExtraFilter:\n `UserID='${md.CurrentUser.ID}' AND EntityID='${listsEntity.ID}' AND RecordID='${item.list.ID}'`,\n ResultType: 'entity_object',\n });\n for (const row of result.Results ?? []) await row.Delete();\n } else {\n const fav = await md.GetEntityObject<MJUserFavoriteEntity>('MJ: User Favorites', md.CurrentUser);\n fav.NewRecord();\n fav.UserID = md.CurrentUser.ID;\n fav.EntityID = listsEntity.ID;\n fav.RecordID = item.list.ID;\n await fav.Save();\n }\n } catch {\n // Revert on failure.\n if (wasFav) this.favoriteListIds.add(item.list.ID);\n else this.favoriteListIds.delete(item.list.ID);\n this.applyFilters();\n }\n }\n\n isFavorite(listId: string): boolean {\n return this.favoriteListIds.has(listId);\n }\n\n toggleShowOnlyFavorites(): void {\n this.showOnlyFavorites = !this.showOnlyFavorites;\n this.applyFilters();\n }\n\n openListMenu(event: Event, item: BrowseListItem) {\n event.stopPropagation();\n const mouseEvent = event as MouseEvent;\n this.selectedContextItem = item;\n this.contextMenuX = mouseEvent.clientX;\n this.contextMenuY = mouseEvent.clientY;\n // Fast path: owners always have full capabilities. Avoid an extra\n // permission-resolve round trip for the common case.\n if (item.isOwner) {\n this.contextItemCapabilities = CapabilitiesForLevel('Owner');\n this.showContextMenu = true;\n return;\n }\n // Render the menu immediately with a conservative viewer-level cap\n // set, then refine via async resolve. The flicker is a single tick\n // — and viewers/editors stay correctly gated even if resolve fails.\n const cached = this.capabilityCache.get(item.list.ID);\n if (cached !== undefined) {\n this.contextItemCapabilities = CapabilitiesForLevel(cached);\n } else {\n this.contextItemCapabilities = CapabilitiesForLevel('View');\n void this.refineContextCapabilities(item.list.ID);\n }\n this.showContextMenu = true;\n }\n\n /** Resolve the current user's permission level for a list and update\n * the open context menu in place. Cached so re-opening the same menu\n * doesn't re-hit the resolver. */\n private async refineContextCapabilities(listId: string): Promise<void> {\n try {\n const currentUserId = this.ProviderToUse.CurrentUser?.ID;\n if (!currentUserId) {\n // No user context — leave the conservative fallback in place.\n return;\n }\n // Go through the Angular sharing service rather than instantiating the\n // server-side `ListSharing` class directly. The service hits the GraphQL\n // surface, which is the only sanctioned client→server path; the server\n // package writes audit logs + permission rows that have no business\n // running in a browser bundle.\n const level = (await this.listSharingService.getUserPermissionLevel(listId, currentUserId)) as SharePermissionLevel | null;\n this.capabilityCache.set(listId, level);\n // Only mutate state if the user is still on this same menu — they\n // may have closed it before resolve finished.\n if (this.showContextMenu && this.selectedContextItem && UUIDsEqual(this.selectedContextItem.list.ID, listId)) {\n this.contextItemCapabilities = CapabilitiesForLevel(level);\n this.cdr.detectChanges();\n }\n } catch {\n // Conservative fallback already applied at menu open time.\n }\n }\n\n closeContextMenu() {\n this.showContextMenu = false;\n this.selectedContextItem = null;\n }\n\n createNewList() {\n this.editingList = null;\n this.newListName = '';\n this.newListDescription = '';\n this.selectedEntityId = '';\n this.entitySearchTerm = '';\n this.selectedCategoryId = null;\n this.showEntityDropdown = false;\n this.showCreateDialog = true;\n // Refresh categories so newly-created ones appear without a page\n // reload. Cheap RunView; runs in the background while the user is\n // typing the list name.\n void this.refreshCategoriesForDialog();\n }\n\n editList() {\n if (!this.selectedContextItem) return;\n\n const list = this.selectedContextItem.list;\n this.editingList = list;\n this.newListName = list.Name;\n this.newListDescription = list.Description || '';\n this.selectedEntityId = list.EntityID;\n this.entitySearchTerm = list.Entity || '';\n this.selectedCategoryId = list.CategoryID || null;\n // Ensure no stale state from a previous Create attempt — the entity\n // dropdown portal renders at z-index 10002 and could otherwise sit on\n // top of the edit dialog and block interaction.\n this.showEntityDropdown = false;\n // Close the context menu BEFORE opening the dialog. Doing it after\n // leaves a one-tick window where both the menu and the modal-overlay\n // are stacked, and the menu's outer click-overlay can swallow the\n // first click into the form fields below it.\n this.closeContextMenu();\n this.showCreateDialog = true;\n this.cdr.detectChanges();\n void this.refreshCategoriesForDialog();\n }\n\n /** Re-pull MJ: List Categories so the dropdown reflects any\n * newly-created categories. Skips the round trip when nothing has\n * changed since the last load — `categoriesDirty` is flipped on\n * by the BaseEntity event subscription whenever a category row\n * is saved/deleted, so the only times this actually fetches are\n * (a) the first dialog open, and (b) after the user touched a\n * category somewhere else. */\n private async refreshCategoriesForDialog(): Promise<void> {\n if (!this.categoriesDirty) return;\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJListCategoryEntity>({\n EntityName: 'MJ: List Categories',\n OrderBy: 'Name',\n ResultType: 'simple',\n });\n if (!result.Success) return;\n this.categories = (result.Results ?? []) as MJListCategoryEntity[];\n this.categoryMap.clear();\n for (const cat of this.categories) this.categoryMap.set(cat.ID, cat);\n this.flatCategories = this.buildFlatCategories(this.categories);\n this.categoriesDirty = false;\n this.cdr.detectChanges();\n } catch {\n // Best-effort — the dialog still works with the previously-loaded list.\n }\n }\n\n selectEntity(entity: { ID: string; Name: string }) {\n this.selectedEntityId = entity.ID;\n this.entitySearchTerm = entity.Name;\n this.showEntityDropdown = false;\n }\n\n filterEntities(term: string) {\n const lowerTerm = term.toLowerCase();\n this.filteredEntitiesList = this.availableEntities.filter(e =>\n e.Name.toLowerCase().includes(lowerTerm)\n );\n // Ensure dropdown is visible while typing\n if (!this.showEntityDropdown && term) {\n this.showEntityDropdown = true;\n }\n // Clear selection when user modifies the search text\n this.selectedEntityId = '';\n }\n\n openEntityDropdown(inputElement: HTMLInputElement) {\n const rect = inputElement.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const dropdownHeight = 200;\n const spaceBelow = viewportHeight - rect.bottom;\n const openAbove = spaceBelow < dropdownHeight && rect.top > dropdownHeight;\n\n this.entityDropdownPosition = {\n top: openAbove ? rect.top - dropdownHeight : rect.bottom,\n left: rect.left,\n width: rect.width,\n openAbove\n };\n this.showEntityDropdown = true;\n this.filteredEntitiesList = [...this.availableEntities];\n }\n\n closeEntityDropdown() {\n this.showEntityDropdown = false;\n }\n\n async duplicateList() {\n if (!this.selectedContextItem) return;\n\n const listToDuplicate = this.selectedContextItem.list;\n this.closeContextMenu();\n\n this.isLoading = true;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n const newList = await md.GetEntityObject<MJListEntity>('MJ: Lists', md.CurrentUser);\n newList.Name = `${listToDuplicate.Name} (Copy)`;\n newList.Description = listToDuplicate.Description;\n newList.EntityID = listToDuplicate.EntityID;\n newList.CategoryID = listToDuplicate.CategoryID;\n newList.UserID = md.CurrentUser!.ID;\n\n const listSaved = await newList.Save();\n if (!listSaved) {\n this.notificationService.CreateSimpleNotification('Failed to duplicate list', 'error', 4000);\n return;\n }\n\n // BypassCache to avoid any stale RunView cache that might mask members.\n // High MaxRows to cover large lists; entity_object so we have typed access.\n const itemsResult = await rv.RunView<MJListDetailEntity>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID = '${listToDuplicate.ID}'`,\n ResultType: 'entity_object',\n MaxRows: 100000,\n BypassCache: true\n });\n\n if (!itemsResult.Success) {\n console.error('Duplicate: failed to load source list members', itemsResult.ErrorMessage);\n this.notificationService.CreateSimpleNotification(\n `Could not load source list members: ${itemsResult.ErrorMessage || 'unknown'}`,\n 'error', 6000\n );\n return;\n }\n\n const sourceItems = itemsResult.Results ?? [];\n if (sourceItems.length === 0) {\n this.notificationService.CreateSimpleNotification('List duplicated (source had no records)', 'success', 3000);\n } else {\n // Batch all detail inserts into one transaction group so this is\n // a single round-trip instead of 1-per-row. All-or-nothing: if any\n // row fails server-side validation the whole group rolls back.\n const tg = await md.CreateTransactionGroup();\n for (const item of sourceItems) {\n const newItem = await md.GetEntityObject<MJListDetailEntity>('MJ: List Details', md.CurrentUser);\n newItem.ListID = newList.ID;\n newItem.RecordID = item.RecordID;\n newItem.Sequence = item.Sequence;\n newItem.TransactionGroup = tg;\n await newItem.Save(); // queued into tg, not sent yet\n }\n const submitted = await tg.Submit();\n if (submitted) {\n this.notificationService.CreateSimpleNotification(\n `List duplicated with ${sourceItems.length} item${sourceItems.length !== 1 ? 's' : ''}`,\n 'success', 3000\n );\n } else {\n console.error('Duplicate: transaction group submit failed');\n this.notificationService.CreateSimpleNotification(\n `Duplicated list but failed to copy ${sourceItems.length} items — see console`,\n 'error', 6000\n );\n }\n }\n\n await this.loadData();\n } catch (error) {\n console.error('Error duplicating list:', error);\n this.notificationService.CreateSimpleNotification('Error duplicating list. Please try again.', 'error', 4000);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n confirmDeleteList() {\n if (!this.selectedContextItem) return;\n this.listToDelete = this.selectedContextItem.list;\n this.deleteListName = this.selectedContextItem.list.Name;\n this.showDeleteConfirm = true;\n this.closeContextMenu();\n }\n\n cancelDelete() {\n this.showDeleteConfirm = false;\n this.listToDelete = null;\n this.deleteListName = '';\n }\n\n async deleteList() {\n if (!this.listToDelete) return;\n\n const listToDelete = this.listToDelete;\n const listName = listToDelete.Name;\n\n this.isDeleting = true;\n this.cdr.detectChanges();\n\n try {\n // spDeleteList doesn't cascade to MJ: List Details, so the FK\n // constraint (FK_ListDetail_List) blocks the delete if the list\n // has any members. Cascade-delete the details first in a\n // transaction group so the whole thing rolls back if any single\n // delete fails. The proper long-term fix is a migration that\n // adds ON DELETE CASCADE (or extends the SP); this keeps the UI\n // unblocked in the meantime.\n const cascadeOk = await this.cascadeDeleteListMembers(listToDelete.ID);\n if (!cascadeOk) {\n this.notificationService.CreateSimpleNotification(\n `Failed to delete list members for \"${listName}\" — list not deleted`,\n 'error', 6000,\n );\n return;\n }\n\n const deleted = await listToDelete.Delete();\n if (deleted) {\n this.notificationService.CreateSimpleNotification(`\"${listName}\" deleted`, 'success', 3000);\n // Optimistic removal from local state so the card disappears\n // immediately. Without this, the user sees the just-deleted list\n // until loadData() rebuilds — and worse, can click Delete on it\n // again (which hangs because the in-memory entity still has the\n // now-deleted record's ID).\n const deletedId = listToDelete.ID;\n this.allLists = this.allLists.filter(item => !UUIDsEqual(item.list.ID, deletedId));\n this.applyFilters();\n this.buildCategoryTree();\n this.cdr.detectChanges();\n } else {\n const errorMessage = listToDelete.LatestResult?.Message || 'Unknown error occurred';\n console.error('Failed to delete list:', listToDelete.LatestResult);\n this.notificationService.CreateSimpleNotification(`Failed to delete list: ${errorMessage}`, 'error', 6000);\n }\n this.cancelDelete();\n // Authoritative refresh — loadData() now sets BypassCache: true on\n // the 'MJ: Lists' RunView, so this no longer races the optimistic\n // local removal against a stale cache.\n void this.loadData();\n } catch (error) {\n console.error('Error deleting list:', error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.notificationService.CreateSimpleNotification(`Error deleting list: ${errorMessage}`, 'error', 6000);\n } finally {\n this.isDeleting = false;\n this.cdr.detectChanges();\n }\n }\n\n /** Delete every MJ: List Details row for a given list in a single\n * transaction group. Returns true if everything succeeded (including\n * the trivial \"no members\" case). */\n private async cascadeDeleteListMembers(listId: string): Promise<boolean> {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(md);\n const lookup = await rv.RunView<MJListDetailEntity>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID='${listId}'`,\n ResultType: 'entity_object',\n });\n if (!lookup.Success) {\n console.error('Failed to load list details for cascade-delete:', lookup.ErrorMessage);\n return false;\n }\n const details = lookup.Results ?? [];\n if (details.length === 0) return true;\n\n const tg = await md.CreateTransactionGroup();\n for (const d of details) {\n d.TransactionGroup = tg;\n await d.Delete();\n }\n const ok = await tg.Submit();\n if (!ok) {\n console.error('Cascade-delete transaction failed for list', listId);\n }\n return ok;\n }\n\n closeCreateDialog() {\n this.showCreateDialog = false;\n this.editingList = null;\n this.showEntityDropdown = false;\n }\n\n async saveList() {\n this.isSaving = true;\n this.cdr.detectChanges();\n\n const isEditing = !!this.editingList;\n const listName = this.newListName;\n\n try {\n const md = this.ProviderToUse;\n let list: MJListEntity;\n\n if (this.editingList) {\n list = this.editingList;\n } else {\n list = await md.GetEntityObject<MJListEntity>('MJ: Lists', md.CurrentUser);\n list.UserID = md.CurrentUser!.ID;\n list.EntityID = this.selectedEntityId;\n }\n\n list.Name = this.newListName;\n list.Description = this.newListDescription || null;\n list.CategoryID = this.selectedCategoryId || null;\n\n const saved = await list.Save();\n if (saved) {\n this.notificationService.CreateSimpleNotification(\n isEditing ? `\"${listName}\" updated` : `\"${listName}\" created`,\n 'success',\n 3000\n );\n this.closeCreateDialog();\n await this.loadData();\n } else {\n const errorMessage = list.LatestResult?.Message || 'Unknown error occurred';\n const action = isEditing ? 'update' : 'create';\n console.error(`Failed to ${action} list:`, list.LatestResult);\n this.notificationService.CreateSimpleNotification(\n `Failed to ${action} list: ${errorMessage}`,\n 'error',\n 6000\n );\n }\n } catch (error) {\n console.error('Error saving list:', error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.notificationService.CreateSimpleNotification(`Error saving list: ${errorMessage}`, 'error', 6000);\n } finally {\n this.isSaving = false;\n this.cdr.detectChanges();\n }\n }\n\n // Sharing methods\n openShareDialog() {\n if (!this.selectedContextItem) return;\n\n const item = this.selectedContextItem;\n this.shareDialogConfig = {\n listId: item.list.ID,\n listName: item.list.Name,\n currentUserId: this.currentUserId,\n isOwner: item.isOwner\n };\n this.showShareDialog = true;\n this.closeContextMenu();\n }\n\n onShareComplete(_result: ListShareDialogResult) {\n this.showShareDialog = false;\n this.shareDialogConfig = null;\n // Reload sharing info for all lists\n this.loadSharingInfo();\n this.cdr.detectChanges();\n }\n\n onShareCancel() {\n this.showShareDialog = false;\n this.shareDialogConfig = null;\n }\n\n /** \"Manage Invitations\" clicked inside the share dialog — opens a\n * modal hosting `<mj-list-invitations>` for the same list. The\n * share dialog is closed so dialogs don't visually stack. */\n onManageInvitations() {\n if (!this.shareDialogConfig) return;\n this.activeShareListId = this.shareDialogConfig.listId;\n this.activeShareListName = this.shareDialogConfig.listName;\n this.showShareDialog = false;\n this.showInvitationsDialog = true;\n this.cdr.detectChanges();\n }\n\n closeInvitationsDialog() {\n this.showInvitationsDialog = false;\n this.cdr.detectChanges();\n }\n\n /** \"View audit log\" link in share dialog. */\n onViewAuditLog() {\n if (!this.shareDialogConfig) return;\n this.activeShareListId = this.shareDialogConfig.listId;\n this.activeShareListName = this.shareDialogConfig.listName;\n this.showShareDialog = false;\n this.showAuditLogDialog = true;\n this.cdr.detectChanges();\n }\n\n closeAuditLogDialog() {\n this.showAuditLogDialog = false;\n this.cdr.detectChanges();\n }\n\n private async loadSharingInfo() {\n // Load sharing summaries for all lists that the user owns\n const ownedLists = this.allLists.filter(item => item.isOwner);\n\n for (const item of ownedLists) {\n try {\n const summary = await this.listSharingService.getListSharingSummary(item.list.ID);\n item.sharingInfo = summary;\n } catch (error) {\n console.error(`Error loading sharing info for list ${item.list.ID}:`, error);\n }\n }\n\n this.cdr.detectChanges();\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Lists';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-list-check';\n }\n}\n"]}