@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
@@ -5,10 +5,12 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
7
  import { Component, ViewEncapsulation, HostListener } from '@angular/core';
8
- import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
8
+ import { RegisterClass, UUIDsEqual, MJGlobal } from '@memberjunction/global';
9
9
  import { BaseResourceComponent } from '@memberjunction/ng-shared';
10
- import { RunView } from '@memberjunction/core';
10
+ import { BaseEntity, RunView } from '@memberjunction/core';
11
11
  import { Subject } from 'rxjs';
12
+ import { takeUntil } from 'rxjs/operators';
13
+ import { CapabilitiesForLevel } from '@memberjunction/lists-base';
12
14
  import * as i0 from "@angular/core";
13
15
  import * as i1 from "@memberjunction/ng-base-application";
14
16
  import * as i2 from "@memberjunction/ng-notifications";
@@ -19,42 +21,44 @@ import * as i6 from "@memberjunction/ng-ui-components";
19
21
  import * as i7 from "@memberjunction/ng-shared-generic";
20
22
  const _c0 = a0 => ({ node: a0, depth: 0 });
21
23
  const _c1 = (a0, a1) => ({ node: a0, depth: a1 });
22
- function ListsBrowseResource_Conditional_15_Template(rf, ctx) { if (rf & 1) {
23
- const _r2 = i0.ɵɵgetCurrentView();
24
- i0.ɵɵelementStart(0, "button", 36);
25
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_15_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.clearSearch()); });
26
- i0.ɵɵelement(1, "i", 37);
27
- i0.ɵɵelementEnd();
28
- } }
29
- function ListsBrowseResource_For_19_Template(rf, ctx) { if (rf & 1) {
30
- i0.ɵɵelementStart(0, "option", 16);
24
+ const _forTrack0 = ($index, $item) => $item.TagID;
25
+ function ListsBrowseResource_Conditional_17_For_5_Template(rf, ctx) { if (rf & 1) {
26
+ const _r3 = i0.ɵɵgetCurrentView();
27
+ i0.ɵɵelementStart(0, "button", 31);
28
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_17_For_5_Template_button_click_0_listener() { const f_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r4 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r4.removeTagFilter(f_r4.TagID)); });
31
29
  i0.ɵɵtext(1);
30
+ i0.ɵɵelement(2, "i", 32);
32
31
  i0.ɵɵelementEnd();
33
32
  } if (rf & 2) {
34
- const opt_r4 = ctx.$implicit;
35
- i0.ɵɵproperty("value", opt_r4.value);
33
+ const f_r4 = ctx.$implicit;
36
34
  i0.ɵɵadvance();
37
- i0.ɵɵtextInterpolate(opt_r4.name);
35
+ i0.ɵɵtextInterpolate1(" ", f_r4.Name, " ");
38
36
  } }
39
- function ListsBrowseResource_For_23_Template(rf, ctx) { if (rf & 1) {
40
- i0.ɵɵelementStart(0, "option", 16);
41
- i0.ɵɵtext(1);
42
- i0.ɵɵelementEnd();
37
+ function ListsBrowseResource_Conditional_17_Template(rf, ctx) { if (rf & 1) {
38
+ const _r2 = i0.ɵɵgetCurrentView();
39
+ i0.ɵɵelementStart(0, "div", 14)(1, "span", 27);
40
+ i0.ɵɵelement(2, "i", 28);
41
+ i0.ɵɵtext(3, " Filtering by tag: ");
42
+ i0.ɵɵelementEnd();
43
+ i0.ɵɵrepeaterCreate(4, ListsBrowseResource_Conditional_17_For_5_Template, 3, 1, "button", 29, _forTrack0);
44
+ i0.ɵɵelementStart(6, "button", 30);
45
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_17_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r2); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.clearTagFilters()); });
46
+ i0.ɵɵtext(7, " Clear all ");
47
+ i0.ɵɵelementEnd()();
43
48
  } if (rf & 2) {
44
- const opt_r5 = ctx.$implicit;
45
- i0.ɵɵproperty("value", opt_r5.value);
46
- i0.ɵɵadvance();
47
- i0.ɵɵtextInterpolate(opt_r5.name);
49
+ const ctx_r4 = i0.ɵɵnextContext();
50
+ i0.ɵɵadvance(4);
51
+ i0.ɵɵrepeater(ctx_r4.tagFilters);
48
52
  } }
49
- function ListsBrowseResource_Conditional_31_Template(rf, ctx) { if (rf & 1) {
50
- i0.ɵɵelementStart(0, "div", 25);
51
- i0.ɵɵelement(1, "mj-loading", 38);
53
+ function ListsBrowseResource_Conditional_18_Template(rf, ctx) { if (rf & 1) {
54
+ i0.ɵɵelementStart(0, "div", 15);
55
+ i0.ɵɵelement(1, "mj-loading", 33);
52
56
  i0.ɵɵelementEnd();
53
57
  } }
54
- function ListsBrowseResource_Conditional_32_Template(rf, ctx) { if (rf & 1) {
58
+ function ListsBrowseResource_Conditional_19_Template(rf, ctx) { if (rf & 1) {
55
59
  const _r6 = i0.ɵɵgetCurrentView();
56
- i0.ɵɵelementStart(0, "div", 26)(1, "div", 39);
57
- i0.ɵɵelement(2, "div", 40)(3, "i", 6);
60
+ i0.ɵɵelementStart(0, "div", 16)(1, "div", 34);
61
+ i0.ɵɵelement(2, "div", 35)(3, "i", 36);
58
62
  i0.ɵɵelementEnd();
59
63
  i0.ɵɵelementStart(4, "h3");
60
64
  i0.ɵɵtext(5, "No Lists Yet");
@@ -62,31 +66,31 @@ function ListsBrowseResource_Conditional_32_Template(rf, ctx) { if (rf & 1) {
62
66
  i0.ɵɵelementStart(6, "p");
63
67
  i0.ɵɵtext(7, "Lists help you organize and track groups of records across your data.");
64
68
  i0.ɵɵelementEnd();
65
- i0.ɵɵelementStart(8, "div", 41)(9, "div", 42);
66
- i0.ɵɵelement(10, "i", 43);
69
+ i0.ɵɵelementStart(8, "div", 37)(9, "div", 38);
70
+ i0.ɵɵelement(10, "i", 39);
67
71
  i0.ɵɵelementStart(11, "span");
68
72
  i0.ɵɵtext(12, "Group records from any entity");
69
73
  i0.ɵɵelementEnd()();
70
- i0.ɵɵelementStart(13, "div", 42);
71
- i0.ɵɵelement(14, "i", 43);
74
+ i0.ɵɵelementStart(13, "div", 38);
75
+ i0.ɵɵelement(14, "i", 39);
72
76
  i0.ɵɵelementStart(15, "span");
73
77
  i0.ɵɵtext(16, "Organize with categories");
74
78
  i0.ɵɵelementEnd()();
75
- i0.ɵɵelementStart(17, "div", 42);
76
- i0.ɵɵelement(18, "i", 43);
79
+ i0.ɵɵelementStart(17, "div", 38);
80
+ i0.ɵɵelement(18, "i", 39);
77
81
  i0.ɵɵelementStart(19, "span");
78
82
  i0.ɵɵtext(20, "Quick access from any view");
79
83
  i0.ɵɵelementEnd()()();
80
- i0.ɵɵelementStart(21, "button", 44);
81
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_32_Template_button_click_21_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.createNewList()); });
82
- i0.ɵɵelement(22, "i", 8);
84
+ i0.ɵɵelementStart(21, "button", 40);
85
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_19_Template_button_click_21_listener() { i0.ɵɵrestoreView(_r6); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.createNewList()); });
86
+ i0.ɵɵelement(22, "i", 11);
83
87
  i0.ɵɵtext(23, " Create Your First List ");
84
88
  i0.ɵɵelementEnd()();
85
89
  } }
86
- function ListsBrowseResource_Conditional_33_Template(rf, ctx) { if (rf & 1) {
90
+ function ListsBrowseResource_Conditional_20_Template(rf, ctx) { if (rf & 1) {
87
91
  const _r7 = i0.ɵɵgetCurrentView();
88
- i0.ɵɵelementStart(0, "div", 27)(1, "div", 45);
89
- i0.ɵɵelement(2, "i", 46);
92
+ i0.ɵɵelementStart(0, "div", 17)(1, "div", 41);
93
+ i0.ɵɵelement(2, "i", 42);
90
94
  i0.ɵɵelementEnd();
91
95
  i0.ɵɵelementStart(3, "h3");
92
96
  i0.ɵɵtext(4, "No Results Found");
@@ -94,16 +98,16 @@ function ListsBrowseResource_Conditional_33_Template(rf, ctx) { if (rf & 1) {
94
98
  i0.ɵɵelementStart(5, "p");
95
99
  i0.ɵɵtext(6, "No lists match your current filters.");
96
100
  i0.ɵɵelementEnd();
97
- i0.ɵɵelementStart(7, "p", 47);
101
+ i0.ɵɵelementStart(7, "p", 43);
98
102
  i0.ɵɵtext(8, "Try adjusting your search or filters.");
99
103
  i0.ɵɵelementEnd();
100
- i0.ɵɵelementStart(9, "button", 48);
101
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_33_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.clearFilters()); });
104
+ i0.ɵɵelementStart(9, "button", 44);
105
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_20_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r7); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.clearFilters()); });
102
106
  i0.ɵɵtext(10, "Clear All Filters");
103
107
  i0.ɵɵelementEnd()();
104
108
  } }
105
- function ListsBrowseResource_Conditional_34_For_9_Template(rf, ctx) { if (rf & 1) {
106
- i0.ɵɵelementStart(0, "option", 16);
109
+ function ListsBrowseResource_Conditional_21_For_9_Template(rf, ctx) { if (rf & 1) {
110
+ i0.ɵɵelementStart(0, "option", 49);
107
111
  i0.ɵɵtext(1);
108
112
  i0.ɵɵelementEnd();
109
113
  } if (rf & 2) {
@@ -112,8 +116,8 @@ function ListsBrowseResource_Conditional_34_For_9_Template(rf, ctx) { if (rf & 1
112
116
  i0.ɵɵadvance();
113
117
  i0.ɵɵtextInterpolate(opt_r9.name);
114
118
  } }
115
- function ListsBrowseResource_Conditional_34_Conditional_10_For_21_Conditional_8_Template(rf, ctx) { if (rf & 1) {
116
- i0.ɵɵelementStart(0, "span", 72);
119
+ function ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_8_Template(rf, ctx) { if (rf & 1) {
120
+ i0.ɵɵelementStart(0, "span", 69);
117
121
  i0.ɵɵtext(1);
118
122
  i0.ɵɵelementEnd();
119
123
  } if (rf & 2) {
@@ -121,10 +125,10 @@ function ListsBrowseResource_Conditional_34_Conditional_10_For_21_Conditional_8_
121
125
  i0.ɵɵadvance();
122
126
  i0.ɵɵtextInterpolate(item_r11.list.Description);
123
127
  } }
124
- function ListsBrowseResource_Conditional_34_Conditional_10_For_21_Conditional_15_Conditional_0_Template(rf, ctx) { if (rf & 1) {
125
- i0.ɵɵelementStart(0, "span", 83);
126
- i0.ɵɵelement(1, "i", 84);
127
- i0.ɵɵelementStart(2, "span", 85);
128
+ function ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_15_Conditional_0_Template(rf, ctx) { if (rf & 1) {
129
+ i0.ɵɵelementStart(0, "span", 81);
130
+ i0.ɵɵelement(1, "i", 82);
131
+ i0.ɵɵelementStart(2, "span", 83);
128
132
  i0.ɵɵtext(3);
129
133
  i0.ɵɵelementEnd()();
130
134
  } if (rf & 2) {
@@ -132,71 +136,65 @@ function ListsBrowseResource_Conditional_34_Conditional_10_For_21_Conditional_15
132
136
  i0.ɵɵadvance(3);
133
137
  i0.ɵɵtextInterpolate(sharing_r12.totalShares);
134
138
  } }
135
- function ListsBrowseResource_Conditional_34_Conditional_10_For_21_Conditional_15_Conditional_1_Template(rf, ctx) { if (rf & 1) {
136
- i0.ɵɵelementStart(0, "span", 77);
137
- i0.ɵɵelement(1, "i", 86);
139
+ function ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_15_Conditional_1_Template(rf, ctx) { if (rf & 1) {
140
+ i0.ɵɵelementStart(0, "span", 74);
141
+ i0.ɵɵelement(1, "i", 84);
138
142
  i0.ɵɵelementEnd();
139
143
  } }
140
- function ListsBrowseResource_Conditional_34_Conditional_10_For_21_Conditional_15_Template(rf, ctx) { if (rf & 1) {
141
- i0.ɵɵconditionalCreate(0, ListsBrowseResource_Conditional_34_Conditional_10_For_21_Conditional_15_Conditional_0_Template, 4, 1, "span", 83);
142
- i0.ɵɵconditionalCreate(1, ListsBrowseResource_Conditional_34_Conditional_10_For_21_Conditional_15_Conditional_1_Template, 2, 0, "span", 77);
144
+ function ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_15_Template(rf, ctx) { if (rf & 1) {
145
+ i0.ɵɵconditionalCreate(0, ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_15_Conditional_0_Template, 4, 1, "span", 81);
146
+ i0.ɵɵconditionalCreate(1, ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_15_Conditional_1_Template, 2, 0, "span", 74);
143
147
  } if (rf & 2) {
144
148
  const sharing_r12 = ctx;
145
149
  i0.ɵɵconditional(sharing_r12.totalShares > 0 ? 0 : -1);
146
150
  i0.ɵɵadvance();
147
151
  i0.ɵɵconditional(sharing_r12.totalShares === 0 ? 1 : -1);
148
152
  } }
149
- function ListsBrowseResource_Conditional_34_Conditional_10_For_21_Conditional_16_Template(rf, ctx) { if (rf & 1) {
150
- i0.ɵɵelementStart(0, "span", 77);
151
- i0.ɵɵelement(1, "i", 86);
152
- i0.ɵɵelementEnd();
153
- } }
154
- function ListsBrowseResource_Conditional_34_Conditional_10_For_21_Conditional_23_Template(rf, ctx) { if (rf & 1) {
155
- const _r13 = i0.ɵɵgetCurrentView();
156
- i0.ɵɵelementStart(0, "button", 87);
157
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_34_Conditional_10_For_21_Conditional_23_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r13); const item_r11 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.openListMenu($event, item_r11)); });
158
- i0.ɵɵelement(1, "i", 88);
153
+ function ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_16_Template(rf, ctx) { if (rf & 1) {
154
+ i0.ɵɵelementStart(0, "span", 74);
155
+ i0.ɵɵelement(1, "i", 84);
159
156
  i0.ɵɵelementEnd();
160
157
  } }
161
- function ListsBrowseResource_Conditional_34_Conditional_10_For_21_Template(rf, ctx) { if (rf & 1) {
158
+ function ListsBrowseResource_Conditional_21_Conditional_10_For_21_Template(rf, ctx) { if (rf & 1) {
162
159
  const _r10 = i0.ɵɵgetCurrentView();
163
- i0.ɵɵelementStart(0, "tr", 66);
164
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_34_Conditional_10_For_21_Template_tr_click_0_listener() { const item_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.openList(item_r11)); })("keydown.enter", function ListsBrowseResource_Conditional_34_Conditional_10_For_21_Template_tr_keydown_enter_0_listener() { const item_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.openList(item_r11)); });
165
- i0.ɵɵelementStart(1, "td", 67)(2, "div", 68)(3, "div", 69);
160
+ i0.ɵɵelementStart(0, "tr", 63);
161
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_21_Conditional_10_For_21_Template_tr_click_0_listener() { const item_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.openList(item_r11)); })("keydown.enter", function ListsBrowseResource_Conditional_21_Conditional_10_For_21_Template_tr_keydown_enter_0_listener() { const item_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.openList(item_r11)); });
162
+ i0.ɵɵelementStart(1, "td", 64)(2, "div", 65)(3, "div", 66);
166
163
  i0.ɵɵelement(4, "i");
167
164
  i0.ɵɵelementEnd();
168
- i0.ɵɵelementStart(5, "div", 70)(6, "span", 71);
165
+ i0.ɵɵelementStart(5, "div", 67)(6, "span", 68);
169
166
  i0.ɵɵtext(7);
170
167
  i0.ɵɵelementEnd();
171
- i0.ɵɵconditionalCreate(8, ListsBrowseResource_Conditional_34_Conditional_10_For_21_Conditional_8_Template, 2, 1, "span", 72);
168
+ i0.ɵɵconditionalCreate(8, ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_8_Template, 2, 1, "span", 69);
172
169
  i0.ɵɵelementEnd()()();
173
- i0.ɵɵelementStart(9, "td", 73)(10, "span", 74);
170
+ i0.ɵɵelementStart(9, "td", 70)(10, "span", 71);
174
171
  i0.ɵɵtext(11);
175
172
  i0.ɵɵelementEnd()();
176
- i0.ɵɵelementStart(12, "td", 75);
173
+ i0.ɵɵelementStart(12, "td", 72);
177
174
  i0.ɵɵtext(13);
178
175
  i0.ɵɵelementEnd();
179
- i0.ɵɵelementStart(14, "td", 76);
180
- i0.ɵɵconditionalCreate(15, ListsBrowseResource_Conditional_34_Conditional_10_For_21_Conditional_15_Template, 2, 2);
181
- i0.ɵɵconditionalCreate(16, ListsBrowseResource_Conditional_34_Conditional_10_For_21_Conditional_16_Template, 2, 0, "span", 77);
176
+ i0.ɵɵelementStart(14, "td", 73);
177
+ i0.ɵɵconditionalCreate(15, ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_15_Template, 2, 2);
178
+ i0.ɵɵconditionalCreate(16, ListsBrowseResource_Conditional_21_Conditional_10_For_21_Conditional_16_Template, 2, 0, "span", 74);
182
179
  i0.ɵɵelementEnd();
183
- i0.ɵɵelementStart(17, "td", 78)(18, "span", 79);
180
+ i0.ɵɵelementStart(17, "td", 75)(18, "span", 76);
184
181
  i0.ɵɵtext(19);
185
182
  i0.ɵɵelementEnd()();
186
- i0.ɵɵelementStart(20, "td", 80);
183
+ i0.ɵɵelementStart(20, "td", 77);
187
184
  i0.ɵɵtext(21);
188
185
  i0.ɵɵelementEnd();
189
- i0.ɵɵelementStart(22, "td", 81);
190
- i0.ɵɵconditionalCreate(23, ListsBrowseResource_Conditional_34_Conditional_10_For_21_Conditional_23_Template, 2, 0, "button", 82);
191
- i0.ɵɵelementEnd()();
186
+ i0.ɵɵelementStart(22, "td", 78)(23, "button", 79);
187
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_21_Conditional_10_For_21_Template_button_click_23_listener($event) { const item_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.openListMenu($event, item_r11)); });
188
+ i0.ɵɵelement(24, "i", 80);
189
+ i0.ɵɵelementEnd()()();
192
190
  } if (rf & 2) {
193
191
  let tmp_19_0;
194
192
  const item_r11 = ctx.$implicit;
195
- const ctx_r2 = i0.ɵɵnextContext(3);
193
+ const ctx_r4 = i0.ɵɵnextContext(3);
196
194
  i0.ɵɵadvance(3);
197
- i0.ɵɵstyleProp("background-color", ctx_r2.getEntityColor(item_r11.entityName));
195
+ i0.ɵɵstyleProp("background-color", ctx_r4.getEntityColor(item_r11.entityName));
198
196
  i0.ɵɵadvance();
199
- i0.ɵɵclassMap(ctx_r2.getEntityIcon(item_r11.entityName));
197
+ i0.ɵɵclassMap(ctx_r4.getEntityIcon(item_r11.entityName));
200
198
  i0.ɵɵadvance(3);
201
199
  i0.ɵɵtextInterpolate(item_r11.list.Name);
202
200
  i0.ɵɵadvance();
@@ -214,389 +212,418 @@ function ListsBrowseResource_Conditional_34_Conditional_10_For_21_Template(rf, c
214
212
  i0.ɵɵadvance();
215
213
  i0.ɵɵtextInterpolate1(" ", item_r11.isOwner ? "You" : item_r11.ownerName, " ");
216
214
  i0.ɵɵadvance(2);
217
- i0.ɵɵtextInterpolate(ctx_r2.formatDate(item_r11.list.__mj_UpdatedAt));
218
- i0.ɵɵadvance(2);
219
- i0.ɵɵconditional(item_r11.isOwner ? 23 : -1);
215
+ i0.ɵɵtextInterpolate(ctx_r4.formatDate(item_r11.list.__mj_UpdatedAt));
220
216
  } }
221
- function ListsBrowseResource_Conditional_34_Conditional_10_Template(rf, ctx) { if (rf & 1) {
222
- i0.ɵɵelementStart(0, "div", 53)(1, "table", 56)(2, "thead")(3, "tr")(4, "th", 57);
217
+ function ListsBrowseResource_Conditional_21_Conditional_10_Template(rf, ctx) { if (rf & 1) {
218
+ i0.ɵɵelementStart(0, "div", 50)(1, "table", 53)(2, "thead")(3, "tr")(4, "th", 54);
223
219
  i0.ɵɵtext(5, "Name");
224
220
  i0.ɵɵelementEnd();
225
- i0.ɵɵelementStart(6, "th", 58);
221
+ i0.ɵɵelementStart(6, "th", 55);
226
222
  i0.ɵɵtext(7, "Entity");
227
223
  i0.ɵɵelementEnd();
228
- i0.ɵɵelementStart(8, "th", 59);
224
+ i0.ɵɵelementStart(8, "th", 56);
229
225
  i0.ɵɵtext(9, "Items");
230
226
  i0.ɵɵelementEnd();
231
- i0.ɵɵelementStart(10, "th", 60);
227
+ i0.ɵɵelementStart(10, "th", 57);
232
228
  i0.ɵɵtext(11, "Shared");
233
229
  i0.ɵɵelementEnd();
234
- i0.ɵɵelementStart(12, "th", 61);
230
+ i0.ɵɵelementStart(12, "th", 58);
235
231
  i0.ɵɵtext(13, "Owner");
236
232
  i0.ɵɵelementEnd();
237
- i0.ɵɵelementStart(14, "th", 62);
233
+ i0.ɵɵelementStart(14, "th", 59);
238
234
  i0.ɵɵtext(15, "Updated");
239
235
  i0.ɵɵelementEnd();
240
- i0.ɵɵelementStart(16, "th", 63)(17, "span", 64);
236
+ i0.ɵɵelementStart(16, "th", 60)(17, "span", 61);
241
237
  i0.ɵɵtext(18, "Actions");
242
238
  i0.ɵɵelementEnd()()()();
243
239
  i0.ɵɵelementStart(19, "tbody");
244
- i0.ɵɵrepeaterCreate(20, ListsBrowseResource_Conditional_34_Conditional_10_For_21_Template, 24, 15, "tr", 65, i0.ɵɵrepeaterTrackByIdentity);
240
+ i0.ɵɵrepeaterCreate(20, ListsBrowseResource_Conditional_21_Conditional_10_For_21_Template, 25, 14, "tr", 62, i0.ɵɵrepeaterTrackByIdentity);
245
241
  i0.ɵɵelementEnd()()();
246
242
  } if (rf & 2) {
247
- const ctx_r2 = i0.ɵɵnextContext(2);
243
+ const ctx_r4 = i0.ɵɵnextContext(2);
248
244
  i0.ɵɵadvance(20);
249
- i0.ɵɵrepeater(ctx_r2.filteredLists);
245
+ i0.ɵɵrepeater(ctx_r4.filteredLists);
250
246
  } }
251
- function ListsBrowseResource_Conditional_34_Conditional_11_For_2_Conditional_4_Template(rf, ctx) { if (rf & 1) {
252
- const _r16 = i0.ɵɵgetCurrentView();
253
- i0.ɵɵelementStart(0, "div", 93)(1, "button", 106);
254
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_34_Conditional_11_For_2_Conditional_4_Template_button_click_1_listener($event) { i0.ɵɵrestoreView(_r16); const item_r15 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.openListMenu($event, item_r15)); });
255
- i0.ɵɵelement(2, "i", 88);
256
- i0.ɵɵelementEnd()();
257
- } }
258
- function ListsBrowseResource_Conditional_34_Conditional_11_For_2_Conditional_8_Template(rf, ctx) { if (rf & 1) {
259
- i0.ɵɵelementStart(0, "p", 96);
247
+ function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Conditional_12_Template(rf, ctx) { if (rf & 1) {
248
+ i0.ɵɵelementStart(0, "p", 94);
260
249
  i0.ɵɵtext(1);
261
250
  i0.ɵɵelementEnd();
262
251
  } if (rf & 2) {
263
- const item_r15 = i0.ɵɵnextContext().$implicit;
252
+ const item_r14 = i0.ɵɵnextContext().$implicit;
264
253
  i0.ɵɵadvance();
265
- i0.ɵɵtextInterpolate(item_r15.list.Description);
254
+ i0.ɵɵtextInterpolate(item_r14.list.Description);
266
255
  } }
267
- function ListsBrowseResource_Conditional_34_Conditional_11_For_2_Conditional_21_Conditional_0_Template(rf, ctx) { if (rf & 1) {
268
- i0.ɵɵelementStart(0, "span", 107);
269
- i0.ɵɵelement(1, "i", 84);
256
+ function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Conditional_27_Conditional_0_Template(rf, ctx) { if (rf & 1) {
257
+ i0.ɵɵelementStart(0, "span", 106);
258
+ i0.ɵɵelement(1, "i", 82);
270
259
  i0.ɵɵelementEnd();
271
260
  } if (rf & 2) {
272
- const sharing_r17 = i0.ɵɵnextContext();
273
- i0.ɵɵproperty("title", "Shared with " + sharing_r17.totalShares + " user(s)/role(s)");
261
+ const sharing_r15 = i0.ɵɵnextContext();
262
+ i0.ɵɵproperty("title", "Shared with " + sharing_r15.totalShares + " user(s)/role(s)");
274
263
  } }
275
- function ListsBrowseResource_Conditional_34_Conditional_11_For_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
276
- i0.ɵɵconditionalCreate(0, ListsBrowseResource_Conditional_34_Conditional_11_For_2_Conditional_21_Conditional_0_Template, 2, 1, "span", 107);
264
+ function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Conditional_27_Template(rf, ctx) { if (rf & 1) {
265
+ i0.ɵɵconditionalCreate(0, ListsBrowseResource_Conditional_21_Conditional_11_For_2_Conditional_27_Conditional_0_Template, 2, 1, "span", 106);
277
266
  } if (rf & 2) {
278
267
  i0.ɵɵconditional(ctx.totalShares > 0 ? 0 : -1);
279
268
  } }
280
- function ListsBrowseResource_Conditional_34_Conditional_11_For_2_Template(rf, ctx) { if (rf & 1) {
281
- const _r14 = i0.ɵɵgetCurrentView();
282
- i0.ɵɵelementStart(0, "div", 90);
283
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_34_Conditional_11_For_2_Template_div_click_0_listener() { const item_r15 = i0.ɵɵrestoreView(_r14).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.openList(item_r15)); })("keydown.enter", function ListsBrowseResource_Conditional_34_Conditional_11_For_2_Template_div_keydown_enter_0_listener() { const item_r15 = i0.ɵɵrestoreView(_r14).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.openList(item_r15)); });
284
- i0.ɵɵelementStart(1, "div", 91)(2, "div", 92);
269
+ function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Template(rf, ctx) { if (rf & 1) {
270
+ const _r13 = i0.ɵɵgetCurrentView();
271
+ i0.ɵɵelementStart(0, "div", 86);
272
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Template_div_click_0_listener() { const item_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.openList(item_r14)); })("keydown.enter", function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Template_div_keydown_enter_0_listener() { const item_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.openList(item_r14)); });
273
+ i0.ɵɵelementStart(1, "div", 87)(2, "div", 88);
285
274
  i0.ɵɵelement(3, "i");
286
275
  i0.ɵɵelementEnd();
287
- i0.ɵɵconditionalCreate(4, ListsBrowseResource_Conditional_34_Conditional_11_For_2_Conditional_4_Template, 3, 0, "div", 93);
276
+ i0.ɵɵelementStart(4, "button", 89);
277
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Template_button_click_4_listener($event) { const item_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.toggleFavorite($event, item_r14)); });
278
+ i0.ɵɵelement(5, "i");
288
279
  i0.ɵɵelementEnd();
289
- i0.ɵɵelementStart(5, "div", 94)(6, "h3", 95);
290
- i0.ɵɵtext(7);
280
+ i0.ɵɵelementStart(6, "div", 90)(7, "button", 91);
281
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Template_button_click_7_listener($event) { const item_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.openListMenu($event, item_r14)); });
282
+ i0.ɵɵelement(8, "i", 80);
283
+ i0.ɵɵelementEnd()()();
284
+ i0.ɵɵelementStart(9, "div", 92)(10, "h3", 93);
285
+ i0.ɵɵtext(11);
291
286
  i0.ɵɵelementEnd();
292
- i0.ɵɵconditionalCreate(8, ListsBrowseResource_Conditional_34_Conditional_11_For_2_Conditional_8_Template, 2, 1, "p", 96);
293
- i0.ɵɵelementStart(9, "div", 97)(10, "span", 98);
294
- i0.ɵɵelement(11, "i", 99);
295
- i0.ɵɵtext(12);
287
+ i0.ɵɵconditionalCreate(12, ListsBrowseResource_Conditional_21_Conditional_11_For_2_Conditional_12_Template, 2, 1, "p", 94);
288
+ i0.ɵɵelementStart(13, "div", 95)(14, "span", 96);
289
+ i0.ɵɵelement(15, "i", 97);
290
+ i0.ɵɵtext(16);
296
291
  i0.ɵɵelementEnd();
297
- i0.ɵɵelementStart(13, "span", 98);
298
- i0.ɵɵelement(14, "i", 100);
299
- i0.ɵɵtext(15);
300
- i0.ɵɵelementEnd()()();
301
- i0.ɵɵelementStart(16, "div", 101)(17, "span", 102);
302
- i0.ɵɵelement(18, "i", 103);
292
+ i0.ɵɵelementStart(17, "span", 96);
293
+ i0.ɵɵelement(18, "i", 98);
303
294
  i0.ɵɵtext(19);
304
- i0.ɵɵelementEnd();
305
- i0.ɵɵelementStart(20, "div", 104);
306
- i0.ɵɵconditionalCreate(21, ListsBrowseResource_Conditional_34_Conditional_11_For_2_Conditional_21_Template, 1, 1);
307
- i0.ɵɵelementStart(22, "span", 105);
308
- i0.ɵɵtext(23);
295
+ i0.ɵɵelementEnd()();
296
+ i0.ɵɵelementStart(20, "div", 99);
297
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Template_div_click_20_listener($event) { i0.ɵɵrestoreView(_r13); return i0.ɵɵresetView($event.stopPropagation()); });
298
+ i0.ɵɵelementStart(21, "mj-tag-chips", 100);
299
+ i0.ɵɵlistener("TagClicked", function ListsBrowseResource_Conditional_21_Conditional_11_For_2_Template_mj_tag_chips_TagClicked_21_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.onCardTagClicked($event)); });
300
+ i0.ɵɵelementEnd()()();
301
+ i0.ɵɵelementStart(22, "div", 101)(23, "span", 102);
302
+ i0.ɵɵelement(24, "i", 103);
303
+ i0.ɵɵtext(25);
304
+ i0.ɵɵelementEnd();
305
+ i0.ɵɵelementStart(26, "div", 104);
306
+ i0.ɵɵconditionalCreate(27, ListsBrowseResource_Conditional_21_Conditional_11_For_2_Conditional_27_Template, 1, 1);
307
+ i0.ɵɵelementStart(28, "span", 105);
308
+ i0.ɵɵtext(29);
309
309
  i0.ɵɵelementEnd()()()();
310
310
  } if (rf & 2) {
311
- let tmp_22_0;
312
- const item_r15 = ctx.$implicit;
313
- const ctx_r2 = i0.ɵɵnextContext(3);
311
+ let tmp_28_0;
312
+ const item_r14 = ctx.$implicit;
313
+ const ctx_r4 = i0.ɵɵnextContext(3);
314
314
  i0.ɵɵadvance(2);
315
- i0.ɵɵstyleProp("background-color", ctx_r2.getEntityColor(item_r15.entityName));
315
+ i0.ɵɵstyleProp("background-color", ctx_r4.getEntityColor(item_r14.entityName));
316
316
  i0.ɵɵadvance();
317
- i0.ɵɵclassMap(ctx_r2.getEntityIcon(item_r15.entityName));
317
+ i0.ɵɵclassMap(ctx_r4.getEntityIcon(item_r14.entityName));
318
318
  i0.ɵɵadvance();
319
- i0.ɵɵconditional(item_r15.isOwner ? 4 : -1);
320
- i0.ɵɵadvance(3);
321
- i0.ɵɵtextInterpolate(item_r15.list.Name);
319
+ i0.ɵɵclassProp("favorite-btn--active", ctx_r4.isFavorite(item_r14.list.ID));
320
+ i0.ɵɵproperty("title", ctx_r4.isFavorite(item_r14.list.ID) ? "Remove from favorites" : "Add to favorites");
322
321
  i0.ɵɵadvance();
323
- i0.ɵɵconditional(item_r15.list.Description ? 8 : -1);
322
+ i0.ɵɵclassMap(ctx_r4.isFavorite(item_r14.list.ID) ? "fa-solid fa-star" : "fa-regular fa-star");
323
+ i0.ɵɵadvance(6);
324
+ i0.ɵɵtextInterpolate(item_r14.list.Name);
325
+ i0.ɵɵadvance();
326
+ i0.ɵɵconditional(item_r14.list.Description ? 12 : -1);
324
327
  i0.ɵɵadvance(4);
325
- i0.ɵɵtextInterpolate1(" ", item_r15.entityName, " ");
328
+ i0.ɵɵtextInterpolate1(" ", item_r14.entityName, " ");
326
329
  i0.ɵɵadvance(3);
327
- i0.ɵɵtextInterpolate2(" ", item_r15.itemCount, " item", item_r15.itemCount !== 1 ? "s" : "", " ");
330
+ i0.ɵɵtextInterpolate2(" ", item_r14.itemCount, " item", item_r14.itemCount !== 1 ? "s" : "", " ");
331
+ i0.ɵɵadvance(2);
332
+ i0.ɵɵproperty("Provider", ctx_r4.Provider)("RecordID", item_r14.list.ID)("Editable", false)("MaxDisplay", 3);
328
333
  i0.ɵɵadvance(2);
329
- i0.ɵɵclassProp("is-me", item_r15.isOwner);
334
+ i0.ɵɵclassProp("is-me", item_r14.isOwner);
330
335
  i0.ɵɵadvance(2);
331
- i0.ɵɵtextInterpolate1(" ", item_r15.isOwner ? "You" : item_r15.ownerName, " ");
336
+ i0.ɵɵtextInterpolate1(" ", item_r14.isOwner ? "You" : item_r14.ownerName, " ");
332
337
  i0.ɵɵadvance(2);
333
- i0.ɵɵconditional((tmp_22_0 = item_r15.sharingInfo) ? 21 : -1, tmp_22_0);
338
+ i0.ɵɵconditional((tmp_28_0 = item_r14.sharingInfo) ? 27 : -1, tmp_28_0);
334
339
  i0.ɵɵadvance(2);
335
- i0.ɵɵtextInterpolate(ctx_r2.formatDate(item_r15.list.__mj_UpdatedAt));
340
+ i0.ɵɵtextInterpolate(ctx_r4.formatDate(item_r14.list.__mj_UpdatedAt));
336
341
  } }
337
- function ListsBrowseResource_Conditional_34_Conditional_11_Template(rf, ctx) { if (rf & 1) {
338
- i0.ɵɵelementStart(0, "div", 54);
339
- i0.ɵɵrepeaterCreate(1, ListsBrowseResource_Conditional_34_Conditional_11_For_2_Template, 24, 15, "div", 89, i0.ɵɵrepeaterTrackByIdentity);
342
+ function ListsBrowseResource_Conditional_21_Conditional_11_Template(rf, ctx) { if (rf & 1) {
343
+ i0.ɵɵelementStart(0, "div", 51);
344
+ i0.ɵɵrepeaterCreate(1, ListsBrowseResource_Conditional_21_Conditional_11_For_2_Template, 30, 23, "div", 85, i0.ɵɵrepeaterTrackByIdentity);
340
345
  i0.ɵɵelementEnd();
341
346
  } if (rf & 2) {
342
- const ctx_r2 = i0.ɵɵnextContext(2);
347
+ const ctx_r4 = i0.ɵɵnextContext(2);
343
348
  i0.ɵɵadvance();
344
- i0.ɵɵrepeater(ctx_r2.filteredLists);
349
+ i0.ɵɵrepeater(ctx_r4.filteredLists);
345
350
  } }
346
- function ListsBrowseResource_Conditional_34_Conditional_12_For_2_ng_container_0_Template(rf, ctx) { if (rf & 1) {
351
+ function ListsBrowseResource_Conditional_21_Conditional_12_For_2_ng_container_0_Template(rf, ctx) { if (rf & 1) {
347
352
  i0.ɵɵelementContainer(0);
348
353
  } }
349
- function ListsBrowseResource_Conditional_34_Conditional_12_For_2_Template(rf, ctx) { if (rf & 1) {
350
- i0.ɵɵtemplate(0, ListsBrowseResource_Conditional_34_Conditional_12_For_2_ng_container_0_Template, 1, 0, "ng-container", 108);
354
+ function ListsBrowseResource_Conditional_21_Conditional_12_For_2_Template(rf, ctx) { if (rf & 1) {
355
+ i0.ɵɵtemplate(0, ListsBrowseResource_Conditional_21_Conditional_12_For_2_ng_container_0_Template, 1, 0, "ng-container", 107);
351
356
  } if (rf & 2) {
352
- const node_r18 = ctx.$implicit;
357
+ const node_r16 = ctx.$implicit;
353
358
  i0.ɵɵnextContext(3);
354
- const categoryNodeTemplate_r19 = i0.ɵɵreference(36);
355
- i0.ɵɵproperty("ngTemplateOutlet", categoryNodeTemplate_r19)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, node_r18));
359
+ const categoryNodeTemplate_r17 = i0.ɵɵreference(23);
360
+ i0.ɵɵproperty("ngTemplateOutlet", categoryNodeTemplate_r17)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, node_r16));
356
361
  } }
357
- function ListsBrowseResource_Conditional_34_Conditional_12_Template(rf, ctx) { if (rf & 1) {
358
- i0.ɵɵelementStart(0, "div", 55);
359
- i0.ɵɵrepeaterCreate(1, ListsBrowseResource_Conditional_34_Conditional_12_For_2_Template, 1, 4, "ng-container", null, i0.ɵɵrepeaterTrackByIdentity);
362
+ function ListsBrowseResource_Conditional_21_Conditional_12_Template(rf, ctx) { if (rf & 1) {
363
+ i0.ɵɵelementStart(0, "div", 52);
364
+ i0.ɵɵrepeaterCreate(1, ListsBrowseResource_Conditional_21_Conditional_12_For_2_Template, 1, 4, "ng-container", null, i0.ɵɵrepeaterTrackByIdentity);
360
365
  i0.ɵɵelementEnd();
361
366
  } if (rf & 2) {
362
- const ctx_r2 = i0.ɵɵnextContext(2);
367
+ const ctx_r4 = i0.ɵɵnextContext(2);
363
368
  i0.ɵɵadvance();
364
- i0.ɵɵrepeater(ctx_r2.categoryTree);
369
+ i0.ɵɵrepeater(ctx_r4.categoryTree);
365
370
  } }
366
- function ListsBrowseResource_Conditional_34_Template(rf, ctx) { if (rf & 1) {
371
+ function ListsBrowseResource_Conditional_21_Template(rf, ctx) { if (rf & 1) {
367
372
  const _r8 = i0.ɵɵgetCurrentView();
368
- i0.ɵɵelementStart(0, "div", 28)(1, "div", 49)(2, "span", 50);
373
+ i0.ɵɵelementStart(0, "div", 18)(1, "div", 45)(2, "span", 46);
369
374
  i0.ɵɵtext(3);
370
375
  i0.ɵɵelementEnd();
371
- i0.ɵɵelementStart(4, "div", 51)(5, "label");
376
+ i0.ɵɵelementStart(4, "div", 47)(5, "label");
372
377
  i0.ɵɵtext(6, "Sort:");
373
378
  i0.ɵɵelementEnd();
374
- i0.ɵɵelementStart(7, "select", 52);
375
- i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Conditional_34_Template_select_ngModelChange_7_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.selectedSort, $event) || (ctx_r2.selectedSort = $event); return i0.ɵɵresetView($event); });
376
- i0.ɵɵlistener("ngModelChange", function ListsBrowseResource_Conditional_34_Template_select_ngModelChange_7_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onSortChange($event)); });
377
- i0.ɵɵrepeaterCreate(8, ListsBrowseResource_Conditional_34_For_9_Template, 2, 2, "option", 16, i0.ɵɵrepeaterTrackByIdentity);
379
+ i0.ɵɵelementStart(7, "select", 48);
380
+ i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Conditional_21_Template_select_ngModelChange_7_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r4 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r4.selectedSort, $event) || (ctx_r4.selectedSort = $event); return i0.ɵɵresetView($event); });
381
+ i0.ɵɵlistener("ngModelChange", function ListsBrowseResource_Conditional_21_Template_select_ngModelChange_7_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.onSortChange($event)); });
382
+ i0.ɵɵrepeaterCreate(8, ListsBrowseResource_Conditional_21_For_9_Template, 2, 2, "option", 49, i0.ɵɵrepeaterTrackByIdentity);
378
383
  i0.ɵɵelementEnd()()();
379
- i0.ɵɵconditionalCreate(10, ListsBrowseResource_Conditional_34_Conditional_10_Template, 22, 0, "div", 53);
380
- i0.ɵɵconditionalCreate(11, ListsBrowseResource_Conditional_34_Conditional_11_Template, 3, 0, "div", 54);
381
- i0.ɵɵconditionalCreate(12, ListsBrowseResource_Conditional_34_Conditional_12_Template, 3, 0, "div", 55);
384
+ i0.ɵɵconditionalCreate(10, ListsBrowseResource_Conditional_21_Conditional_10_Template, 22, 0, "div", 50);
385
+ i0.ɵɵconditionalCreate(11, ListsBrowseResource_Conditional_21_Conditional_11_Template, 3, 0, "div", 51);
386
+ i0.ɵɵconditionalCreate(12, ListsBrowseResource_Conditional_21_Conditional_12_Template, 3, 0, "div", 52);
382
387
  i0.ɵɵelementEnd();
383
388
  } if (rf & 2) {
384
- const ctx_r2 = i0.ɵɵnextContext();
389
+ const ctx_r4 = i0.ɵɵnextContext();
385
390
  i0.ɵɵadvance(3);
386
- i0.ɵɵtextInterpolate2("", ctx_r2.filteredLists.length, " list", ctx_r2.filteredLists.length !== 1 ? "s" : "");
391
+ i0.ɵɵtextInterpolate2("", ctx_r4.filteredLists.length, " list", ctx_r4.filteredLists.length !== 1 ? "s" : "");
387
392
  i0.ɵɵadvance(4);
388
- i0.ɵɵtwoWayProperty("ngModel", ctx_r2.selectedSort);
393
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r4.selectedSort);
389
394
  i0.ɵɵadvance();
390
- i0.ɵɵrepeater(ctx_r2.sortOptions);
395
+ i0.ɵɵrepeater(ctx_r4.sortOptions);
391
396
  i0.ɵɵadvance(2);
392
- i0.ɵɵconditional(ctx_r2.viewMode === "table" ? 10 : -1);
397
+ i0.ɵɵconditional(ctx_r4.viewMode === "table" ? 10 : -1);
393
398
  i0.ɵɵadvance();
394
- i0.ɵɵconditional(ctx_r2.viewMode === "card" ? 11 : -1);
399
+ i0.ɵɵconditional(ctx_r4.viewMode === "card" ? 11 : -1);
395
400
  i0.ɵɵadvance();
396
- i0.ɵɵconditional(ctx_r2.viewMode === "hierarchy" ? 12 : -1);
401
+ i0.ɵɵconditional(ctx_r4.viewMode === "hierarchy" ? 12 : -1);
397
402
  } }
398
- function ListsBrowseResource_ng_template_35_Conditional_1_Template(rf, ctx) { if (rf & 1) {
399
- const _r20 = i0.ɵɵgetCurrentView();
400
- i0.ɵɵelementStart(0, "div", 113);
401
- i0.ɵɵlistener("click", function ListsBrowseResource_ng_template_35_Conditional_1_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r20); const node_r21 = i0.ɵɵnextContext().node; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.toggleCategory(node_r21)); });
402
- i0.ɵɵelement(1, "i")(2, "i", 114);
403
- i0.ɵɵelementStart(3, "span", 115);
403
+ function ListsBrowseResource_ng_template_22_Conditional_1_Template(rf, ctx) { if (rf & 1) {
404
+ const _r18 = i0.ɵɵgetCurrentView();
405
+ i0.ɵɵelementStart(0, "div", 112);
406
+ i0.ɵɵlistener("click", function ListsBrowseResource_ng_template_22_Conditional_1_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r18); const node_r19 = i0.ɵɵnextContext().node; const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.toggleCategory(node_r19)); });
407
+ i0.ɵɵelement(1, "i")(2, "i", 113);
408
+ i0.ɵɵelementStart(3, "span", 114);
404
409
  i0.ɵɵtext(4);
405
410
  i0.ɵɵelementEnd();
406
- i0.ɵɵelementStart(5, "span", 116);
411
+ i0.ɵɵelementStart(5, "span", 115);
407
412
  i0.ɵɵtext(6);
408
413
  i0.ɵɵelementEnd()();
409
414
  } if (rf & 2) {
410
- const node_r21 = i0.ɵɵnextContext().node;
411
- const ctx_r2 = i0.ɵɵnextContext();
415
+ const node_r19 = i0.ɵɵnextContext().node;
416
+ const ctx_r4 = i0.ɵɵnextContext();
412
417
  i0.ɵɵadvance();
413
- i0.ɵɵclassMap(node_r21.isExpanded ? "fa-solid fa-chevron-down" : "fa-solid fa-chevron-right");
418
+ i0.ɵɵclassMap(node_r19.isExpanded ? "fa-solid fa-chevron-down" : "fa-solid fa-chevron-right");
414
419
  i0.ɵɵadvance();
415
- i0.ɵɵclassProp("fa-folder-open", node_r21.isExpanded);
420
+ i0.ɵɵclassProp("fa-folder-open", node_r19.isExpanded);
416
421
  i0.ɵɵadvance(2);
417
- i0.ɵɵtextInterpolate(node_r21.category.Name);
422
+ i0.ɵɵtextInterpolate(node_r19.category.Name);
418
423
  i0.ɵɵadvance(2);
419
- i0.ɵɵtextInterpolate(ctx_r2.getListCountInCategory(node_r21));
424
+ i0.ɵɵtextInterpolate(ctx_r4.getListCountInCategory(node_r19));
420
425
  } }
421
- function ListsBrowseResource_ng_template_35_Conditional_2_Template(rf, ctx) { if (rf & 1) {
422
- const _r22 = i0.ɵɵgetCurrentView();
423
- i0.ɵɵelementStart(0, "div", 117);
424
- i0.ɵɵlistener("click", function ListsBrowseResource_ng_template_35_Conditional_2_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r22); const node_r21 = i0.ɵɵnextContext().node; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.toggleCategory(node_r21)); });
425
- i0.ɵɵelement(1, "i")(2, "i", 118);
426
- i0.ɵɵelementStart(3, "span", 115);
426
+ function ListsBrowseResource_ng_template_22_Conditional_2_Template(rf, ctx) { if (rf & 1) {
427
+ const _r20 = i0.ɵɵgetCurrentView();
428
+ i0.ɵɵelementStart(0, "div", 116);
429
+ i0.ɵɵlistener("click", function ListsBrowseResource_ng_template_22_Conditional_2_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r20); const node_r19 = i0.ɵɵnextContext().node; const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.toggleCategory(node_r19)); });
430
+ i0.ɵɵelement(1, "i")(2, "i", 117);
431
+ i0.ɵɵelementStart(3, "span", 114);
427
432
  i0.ɵɵtext(4, "Uncategorized");
428
433
  i0.ɵɵelementEnd();
429
- i0.ɵɵelementStart(5, "span", 116);
434
+ i0.ɵɵelementStart(5, "span", 115);
430
435
  i0.ɵɵtext(6);
431
436
  i0.ɵɵelementEnd()();
432
437
  } if (rf & 2) {
433
- const node_r21 = i0.ɵɵnextContext().node;
438
+ const node_r19 = i0.ɵɵnextContext().node;
434
439
  i0.ɵɵadvance();
435
- i0.ɵɵclassMap(node_r21.isExpanded ? "fa-solid fa-chevron-down" : "fa-solid fa-chevron-right");
440
+ i0.ɵɵclassMap(node_r19.isExpanded ? "fa-solid fa-chevron-down" : "fa-solid fa-chevron-right");
436
441
  i0.ɵɵadvance(5);
437
- i0.ɵɵtextInterpolate(node_r21.lists.length);
442
+ i0.ɵɵtextInterpolate(node_r19.lists.length);
438
443
  } }
439
- function ListsBrowseResource_ng_template_35_Conditional_3_For_2_Conditional_8_Template(rf, ctx) { if (rf & 1) {
444
+ function ListsBrowseResource_ng_template_22_Conditional_3_For_2_Conditional_8_Template(rf, ctx) { if (rf & 1) {
440
445
  i0.ɵɵelementStart(0, "span");
441
446
  i0.ɵɵtext(1);
442
447
  i0.ɵɵelementEnd();
443
448
  } if (rf & 2) {
444
- const item_r24 = i0.ɵɵnextContext().$implicit;
449
+ const item_r22 = i0.ɵɵnextContext().$implicit;
445
450
  i0.ɵɵadvance();
446
- i0.ɵɵtextInterpolate1(" \u00B7 ", item_r24.ownerName);
451
+ i0.ɵɵtextInterpolate1(" \u00B7 ", item_r22.ownerName);
447
452
  } }
448
- function ListsBrowseResource_ng_template_35_Conditional_3_For_2_Conditional_9_Template(rf, ctx) { if (rf & 1) {
449
- const _r25 = i0.ɵɵgetCurrentView();
450
- i0.ɵɵelementStart(0, "div", 123)(1, "button", 124);
451
- i0.ɵɵlistener("click", function ListsBrowseResource_ng_template_35_Conditional_3_For_2_Conditional_9_Template_button_click_1_listener($event) { i0.ɵɵrestoreView(_r25); const item_r24 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.openListMenu($event, item_r24)); });
452
- i0.ɵɵelement(2, "i", 88);
453
- i0.ɵɵelementEnd()();
454
- } }
455
- function ListsBrowseResource_ng_template_35_Conditional_3_For_2_Template(rf, ctx) { if (rf & 1) {
456
- const _r23 = i0.ɵɵgetCurrentView();
457
- i0.ɵɵelementStart(0, "div", 120);
458
- i0.ɵɵlistener("click", function ListsBrowseResource_ng_template_35_Conditional_3_For_2_Template_div_click_0_listener() { const item_r24 = i0.ɵɵrestoreView(_r23).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.openList(item_r24)); })("keydown.enter", function ListsBrowseResource_ng_template_35_Conditional_3_For_2_Template_div_keydown_enter_0_listener() { const item_r24 = i0.ɵɵrestoreView(_r23).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.openList(item_r24)); });
459
- i0.ɵɵelementStart(1, "div", 69);
453
+ function ListsBrowseResource_ng_template_22_Conditional_3_For_2_Template(rf, ctx) { if (rf & 1) {
454
+ const _r21 = i0.ɵɵgetCurrentView();
455
+ i0.ɵɵelementStart(0, "div", 119);
456
+ i0.ɵɵlistener("click", function ListsBrowseResource_ng_template_22_Conditional_3_For_2_Template_div_click_0_listener() { const item_r22 = i0.ɵɵrestoreView(_r21).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.openList(item_r22)); })("keydown.enter", function ListsBrowseResource_ng_template_22_Conditional_3_For_2_Template_div_keydown_enter_0_listener() { const item_r22 = i0.ɵɵrestoreView(_r21).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.openList(item_r22)); });
457
+ i0.ɵɵelementStart(1, "div", 66);
460
458
  i0.ɵɵelement(2, "i");
461
459
  i0.ɵɵelementEnd();
462
- i0.ɵɵelementStart(3, "div", 121)(4, "span", 71);
460
+ i0.ɵɵelementStart(3, "div", 120)(4, "span", 68);
463
461
  i0.ɵɵtext(5);
464
462
  i0.ɵɵelementEnd();
465
- i0.ɵɵelementStart(6, "span", 122);
463
+ i0.ɵɵelementStart(6, "span", 121);
466
464
  i0.ɵɵtext(7);
467
- i0.ɵɵconditionalCreate(8, ListsBrowseResource_ng_template_35_Conditional_3_For_2_Conditional_8_Template, 2, 1, "span");
465
+ i0.ɵɵconditionalCreate(8, ListsBrowseResource_ng_template_22_Conditional_3_For_2_Conditional_8_Template, 2, 1, "span");
468
466
  i0.ɵɵelementEnd()();
469
- i0.ɵɵconditionalCreate(9, ListsBrowseResource_ng_template_35_Conditional_3_For_2_Conditional_9_Template, 3, 0, "div", 123);
470
- i0.ɵɵelementEnd();
467
+ i0.ɵɵelementStart(9, "div", 122)(10, "button", 123);
468
+ i0.ɵɵlistener("click", function ListsBrowseResource_ng_template_22_Conditional_3_For_2_Template_button_click_10_listener($event) { const item_r22 = i0.ɵɵrestoreView(_r21).$implicit; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.openListMenu($event, item_r22)); });
469
+ i0.ɵɵelement(11, "i", 80);
470
+ i0.ɵɵelementEnd()()();
471
471
  } if (rf & 2) {
472
- const item_r24 = ctx.$implicit;
473
- const ctx_r2 = i0.ɵɵnextContext(3);
472
+ const item_r22 = ctx.$implicit;
473
+ const ctx_r4 = i0.ɵɵnextContext(3);
474
474
  i0.ɵɵadvance();
475
- i0.ɵɵstyleProp("background-color", ctx_r2.getEntityColor(item_r24.entityName));
475
+ i0.ɵɵstyleProp("background-color", ctx_r4.getEntityColor(item_r22.entityName));
476
476
  i0.ɵɵadvance();
477
- i0.ɵɵclassMap(ctx_r2.getEntityIcon(item_r24.entityName));
477
+ i0.ɵɵclassMap(ctx_r4.getEntityIcon(item_r22.entityName));
478
478
  i0.ɵɵadvance(3);
479
- i0.ɵɵtextInterpolate(item_r24.list.Name);
479
+ i0.ɵɵtextInterpolate(item_r22.list.Name);
480
480
  i0.ɵɵadvance(2);
481
- i0.ɵɵtextInterpolate2(" ", item_r24.entityName, " \u00B7 ", item_r24.itemCount, " items ");
482
- i0.ɵɵadvance();
483
- i0.ɵɵconditional(!item_r24.isOwner ? 8 : -1);
481
+ i0.ɵɵtextInterpolate2(" ", item_r22.entityName, " \u00B7 ", item_r22.itemCount, " items ");
484
482
  i0.ɵɵadvance();
485
- i0.ɵɵconditional(item_r24.isOwner ? 9 : -1);
483
+ i0.ɵɵconditional(!item_r22.isOwner ? 8 : -1);
486
484
  } }
487
- function ListsBrowseResource_ng_template_35_Conditional_3_Template(rf, ctx) { if (rf & 1) {
488
- i0.ɵɵelementStart(0, "div", 112);
489
- i0.ɵɵrepeaterCreate(1, ListsBrowseResource_ng_template_35_Conditional_3_For_2_Template, 10, 9, "div", 119, i0.ɵɵrepeaterTrackByIdentity);
485
+ function ListsBrowseResource_ng_template_22_Conditional_3_Template(rf, ctx) { if (rf & 1) {
486
+ i0.ɵɵelementStart(0, "div", 111);
487
+ i0.ɵɵrepeaterCreate(1, ListsBrowseResource_ng_template_22_Conditional_3_For_2_Template, 12, 8, "div", 118, i0.ɵɵrepeaterTrackByIdentity);
490
488
  i0.ɵɵelementEnd();
491
489
  } if (rf & 2) {
492
- const node_r21 = i0.ɵɵnextContext().node;
490
+ const node_r19 = i0.ɵɵnextContext().node;
493
491
  i0.ɵɵadvance();
494
- i0.ɵɵrepeater(node_r21.lists);
492
+ i0.ɵɵrepeater(node_r19.lists);
495
493
  } }
496
- function ListsBrowseResource_ng_template_35_Conditional_4_For_1_ng_container_0_Template(rf, ctx) { if (rf & 1) {
494
+ function ListsBrowseResource_ng_template_22_Conditional_4_For_1_ng_container_0_Template(rf, ctx) { if (rf & 1) {
497
495
  i0.ɵɵelementContainer(0);
498
496
  } }
499
- function ListsBrowseResource_ng_template_35_Conditional_4_For_1_Template(rf, ctx) { if (rf & 1) {
500
- i0.ɵɵtemplate(0, ListsBrowseResource_ng_template_35_Conditional_4_For_1_ng_container_0_Template, 1, 0, "ng-container", 108);
497
+ function ListsBrowseResource_ng_template_22_Conditional_4_For_1_Template(rf, ctx) { if (rf & 1) {
498
+ i0.ɵɵtemplate(0, ListsBrowseResource_ng_template_22_Conditional_4_For_1_ng_container_0_Template, 1, 0, "ng-container", 107);
501
499
  } if (rf & 2) {
502
- const child_r26 = ctx.$implicit;
503
- const depth_r27 = i0.ɵɵnextContext(2).depth;
500
+ const child_r23 = ctx.$implicit;
501
+ const depth_r24 = i0.ɵɵnextContext(2).depth;
504
502
  i0.ɵɵnextContext();
505
- const categoryNodeTemplate_r19 = i0.ɵɵreference(36);
506
- i0.ɵɵproperty("ngTemplateOutlet", categoryNodeTemplate_r19)("ngTemplateOutletContext", i0.ɵɵpureFunction2(2, _c1, child_r26, depth_r27 + 1));
503
+ const categoryNodeTemplate_r17 = i0.ɵɵreference(23);
504
+ i0.ɵɵproperty("ngTemplateOutlet", categoryNodeTemplate_r17)("ngTemplateOutletContext", i0.ɵɵpureFunction2(2, _c1, child_r23, depth_r24 + 1));
507
505
  } }
508
- function ListsBrowseResource_ng_template_35_Conditional_4_Template(rf, ctx) { if (rf & 1) {
509
- i0.ɵɵrepeaterCreate(0, ListsBrowseResource_ng_template_35_Conditional_4_For_1_Template, 1, 5, "ng-container", null, i0.ɵɵrepeaterTrackByIdentity);
506
+ function ListsBrowseResource_ng_template_22_Conditional_4_Template(rf, ctx) { if (rf & 1) {
507
+ i0.ɵɵrepeaterCreate(0, ListsBrowseResource_ng_template_22_Conditional_4_For_1_Template, 1, 5, "ng-container", null, i0.ɵɵrepeaterTrackByIdentity);
510
508
  } if (rf & 2) {
511
- const node_r21 = i0.ɵɵnextContext().node;
512
- i0.ɵɵrepeater(node_r21.children);
509
+ const node_r19 = i0.ɵɵnextContext().node;
510
+ i0.ɵɵrepeater(node_r19.children);
513
511
  } }
514
- function ListsBrowseResource_ng_template_35_Template(rf, ctx) { if (rf & 1) {
515
- i0.ɵɵelementStart(0, "div", 109);
516
- i0.ɵɵconditionalCreate(1, ListsBrowseResource_ng_template_35_Conditional_1_Template, 7, 6, "div", 110);
517
- i0.ɵɵconditionalCreate(2, ListsBrowseResource_ng_template_35_Conditional_2_Template, 7, 3, "div", 111);
518
- i0.ɵɵconditionalCreate(3, ListsBrowseResource_ng_template_35_Conditional_3_Template, 3, 0, "div", 112);
519
- i0.ɵɵconditionalCreate(4, ListsBrowseResource_ng_template_35_Conditional_4_Template, 2, 0);
512
+ function ListsBrowseResource_ng_template_22_Template(rf, ctx) { if (rf & 1) {
513
+ i0.ɵɵelementStart(0, "div", 108);
514
+ i0.ɵɵconditionalCreate(1, ListsBrowseResource_ng_template_22_Conditional_1_Template, 7, 6, "div", 109);
515
+ i0.ɵɵconditionalCreate(2, ListsBrowseResource_ng_template_22_Conditional_2_Template, 7, 3, "div", 110);
516
+ i0.ɵɵconditionalCreate(3, ListsBrowseResource_ng_template_22_Conditional_3_Template, 3, 0, "div", 111);
517
+ i0.ɵɵconditionalCreate(4, ListsBrowseResource_ng_template_22_Conditional_4_Template, 2, 0);
520
518
  i0.ɵɵelementEnd();
521
519
  } if (rf & 2) {
522
- const node_r21 = ctx.node;
523
- const depth_r27 = ctx.depth;
524
- i0.ɵɵstyleProp("margin-left", depth_r27 * 20, "px");
520
+ const node_r19 = ctx.node;
521
+ const depth_r24 = ctx.depth;
522
+ i0.ɵɵstyleProp("margin-left", depth_r24 * 20, "px");
525
523
  i0.ɵɵadvance();
526
- i0.ɵɵconditional(node_r21.category ? 1 : -1);
524
+ i0.ɵɵconditional(node_r19.category ? 1 : -1);
527
525
  i0.ɵɵadvance();
528
- i0.ɵɵconditional(!node_r21.category && node_r21.lists.length > 0 ? 2 : -1);
526
+ i0.ɵɵconditional(!node_r19.category && node_r19.lists.length > 0 ? 2 : -1);
529
527
  i0.ɵɵadvance();
530
- i0.ɵɵconditional(node_r21.isExpanded ? 3 : -1);
528
+ i0.ɵɵconditional(node_r19.isExpanded ? 3 : -1);
531
529
  i0.ɵɵadvance();
532
- i0.ɵɵconditional(node_r21.isExpanded ? 4 : -1);
530
+ i0.ɵɵconditional(node_r19.isExpanded ? 4 : -1);
531
+ } }
532
+ function ListsBrowseResource_Conditional_24_Template(rf, ctx) { if (rf & 1) {
533
+ const _r25 = i0.ɵɵgetCurrentView();
534
+ i0.ɵɵelementStart(0, "div", 124);
535
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_24_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r25); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.closeContextMenu()); });
536
+ i0.ɵɵelementEnd();
537
+ } }
538
+ function ListsBrowseResource_Conditional_25_Conditional_1_Template(rf, ctx) { if (rf & 1) {
539
+ const _r27 = i0.ɵɵgetCurrentView();
540
+ i0.ɵɵelementStart(0, "button", 127);
541
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_25_Conditional_1_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r27); const ctx_r4 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r4.editList()); });
542
+ i0.ɵɵelement(1, "i", 130);
543
+ i0.ɵɵtext(2, " Edit ");
544
+ i0.ɵɵelementEnd();
533
545
  } }
534
- function ListsBrowseResource_Conditional_37_Template(rf, ctx) { if (rf & 1) {
546
+ function ListsBrowseResource_Conditional_25_Conditional_2_Template(rf, ctx) { if (rf & 1) {
535
547
  const _r28 = i0.ɵɵgetCurrentView();
536
- i0.ɵɵelementStart(0, "div", 125);
537
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_37_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r28); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.closeContextMenu()); });
548
+ i0.ɵɵelementStart(0, "button", 127);
549
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_25_Conditional_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r28); const ctx_r4 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r4.openShareDialog()); });
550
+ i0.ɵɵelement(1, "i", 82);
551
+ i0.ɵɵtext(2, " Share ");
538
552
  i0.ɵɵelementEnd();
539
553
  } }
540
- function ListsBrowseResource_Conditional_38_Template(rf, ctx) { if (rf & 1) {
554
+ function ListsBrowseResource_Conditional_25_Conditional_6_Template(rf, ctx) { if (rf & 1) {
541
555
  const _r29 = i0.ɵɵgetCurrentView();
542
- i0.ɵɵelementStart(0, "div", 126)(1, "button", 127);
543
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_38_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r29); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.editList()); });
544
- i0.ɵɵelement(2, "i", 128);
545
- i0.ɵɵtext(3, " Edit ");
546
- i0.ɵɵelementEnd();
547
- i0.ɵɵelementStart(4, "button", 127);
548
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_38_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r29); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.openShareDialog()); });
549
- i0.ɵɵelement(5, "i", 84);
550
- i0.ɵɵtext(6, " Share ");
551
- i0.ɵɵelementEnd();
552
- i0.ɵɵelementStart(7, "button", 127);
553
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_38_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r29); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.duplicateList()); });
554
- i0.ɵɵelement(8, "i", 129);
555
- i0.ɵɵtext(9, " Duplicate ");
556
- i0.ɵɵelementEnd();
557
- i0.ɵɵelement(10, "div", 130);
558
- i0.ɵɵelementStart(11, "button", 131);
559
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_38_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r29); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.confirmDeleteList()); });
560
- i0.ɵɵelement(12, "i", 132);
561
- i0.ɵɵtext(13, " Delete ");
562
- i0.ɵɵelementEnd()();
556
+ i0.ɵɵelement(0, "div", 131);
557
+ i0.ɵɵelementStart(1, "button", 132);
558
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_25_Conditional_6_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r29); const ctx_r4 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r4.confirmDeleteList()); });
559
+ i0.ɵɵelement(2, "i", 133);
560
+ i0.ɵɵtext(3, " Delete ");
561
+ i0.ɵɵelementEnd();
562
+ } }
563
+ function ListsBrowseResource_Conditional_25_Conditional_7_Template(rf, ctx) { if (rf & 1) {
564
+ i0.ɵɵelementStart(0, "div", 129);
565
+ i0.ɵɵelement(1, "i", 134);
566
+ i0.ɵɵtext(2, " Viewer access \u2014 read only ");
567
+ i0.ɵɵelementEnd();
568
+ } }
569
+ function ListsBrowseResource_Conditional_25_Template(rf, ctx) { if (rf & 1) {
570
+ const _r26 = i0.ɵɵgetCurrentView();
571
+ i0.ɵɵelementStart(0, "div", 125);
572
+ i0.ɵɵconditionalCreate(1, ListsBrowseResource_Conditional_25_Conditional_1_Template, 3, 0, "button", 126);
573
+ i0.ɵɵconditionalCreate(2, ListsBrowseResource_Conditional_25_Conditional_2_Template, 3, 0, "button", 126);
574
+ i0.ɵɵelementStart(3, "button", 127);
575
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_25_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r26); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.duplicateList()); });
576
+ i0.ɵɵelement(4, "i", 128);
577
+ i0.ɵɵtext(5, " Duplicate ");
578
+ i0.ɵɵelementEnd();
579
+ i0.ɵɵconditionalCreate(6, ListsBrowseResource_Conditional_25_Conditional_6_Template, 4, 0);
580
+ i0.ɵɵconditionalCreate(7, ListsBrowseResource_Conditional_25_Conditional_7_Template, 3, 0, "div", 129);
581
+ i0.ɵɵelementEnd();
563
582
  } if (rf & 2) {
564
- const ctx_r2 = i0.ɵɵnextContext();
565
- i0.ɵɵstyleProp("top", ctx_r2.contextMenuY, "px")("left", ctx_r2.contextMenuX, "px");
583
+ const ctx_r4 = i0.ɵɵnextContext();
584
+ i0.ɵɵstyleProp("top", ctx_r4.contextMenuY, "px")("left", ctx_r4.contextMenuX, "px");
585
+ i0.ɵɵadvance();
586
+ i0.ɵɵconditional(ctx_r4.contextItemCapabilities.CanEdit ? 1 : -1);
587
+ i0.ɵɵadvance();
588
+ i0.ɵɵconditional(ctx_r4.contextItemCapabilities.CanShare ? 2 : -1);
589
+ i0.ɵɵadvance(4);
590
+ i0.ɵɵconditional(ctx_r4.contextItemCapabilities.CanDelete ? 6 : -1);
591
+ i0.ɵɵadvance();
592
+ i0.ɵɵconditional(!ctx_r4.contextItemCapabilities.CanEdit && !ctx_r4.contextItemCapabilities.CanShare && !ctx_r4.contextItemCapabilities.CanDelete ? 7 : -1);
566
593
  } }
567
- function ListsBrowseResource_Conditional_39_Template(rf, ctx) { if (rf & 1) {
594
+ function ListsBrowseResource_Conditional_26_Template(rf, ctx) { if (rf & 1) {
568
595
  const _r30 = i0.ɵɵgetCurrentView();
569
- i0.ɵɵelementStart(0, "div", 133);
570
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_39_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r30); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.closeCreateDialog()); });
596
+ i0.ɵɵelementStart(0, "div", 135);
597
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_26_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r30); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.closeCreateDialog()); });
571
598
  i0.ɵɵelementEnd();
572
599
  } }
573
- function ListsBrowseResource_Conditional_40_Conditional_15_Template(rf, ctx) { if (rf & 1) {
600
+ function ListsBrowseResource_Conditional_27_Conditional_15_Template(rf, ctx) { if (rf & 1) {
574
601
  const _r32 = i0.ɵɵgetCurrentView();
575
- i0.ɵɵelementStart(0, "div", 137)(1, "label");
602
+ i0.ɵɵelementStart(0, "div", 140)(1, "label");
576
603
  i0.ɵɵtext(2, "Entity *");
577
604
  i0.ɵɵelementEnd();
578
- i0.ɵɵelementStart(3, "div", 146)(4, "input", 147, 1);
579
- i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Conditional_40_Conditional_15_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r32); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.entitySearchTerm, $event) || (ctx_r2.entitySearchTerm = $event); return i0.ɵɵresetView($event); });
580
- i0.ɵɵlistener("ngModelChange", function ListsBrowseResource_Conditional_40_Conditional_15_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r32); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.filterEntities($event)); })("focus", function ListsBrowseResource_Conditional_40_Conditional_15_Template_input_focus_4_listener() { i0.ɵɵrestoreView(_r32); const entityInput_r33 = i0.ɵɵreference(5); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.openEntityDropdown(entityInput_r33)); });
605
+ i0.ɵɵelementStart(3, "div", 149)(4, "input", 150, 1);
606
+ i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Conditional_27_Conditional_15_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r32); const ctx_r4 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r4.entitySearchTerm, $event) || (ctx_r4.entitySearchTerm = $event); return i0.ɵɵresetView($event); });
607
+ i0.ɵɵlistener("ngModelChange", function ListsBrowseResource_Conditional_27_Conditional_15_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r32); const ctx_r4 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r4.filterEntities($event)); })("focus", function ListsBrowseResource_Conditional_27_Conditional_15_Template_input_focus_4_listener() { i0.ɵɵrestoreView(_r32); const entityInput_r33 = i0.ɵɵreference(5); const ctx_r4 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r4.openEntityDropdown(entityInput_r33)); });
581
608
  i0.ɵɵelementEnd()()();
582
609
  } if (rf & 2) {
583
- const ctx_r2 = i0.ɵɵnextContext(2);
610
+ const ctx_r4 = i0.ɵɵnextContext(2);
584
611
  i0.ɵɵadvance(4);
585
- i0.ɵɵtwoWayProperty("ngModel", ctx_r2.entitySearchTerm);
612
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r4.entitySearchTerm);
586
613
  } }
587
- function ListsBrowseResource_Conditional_40_Conditional_16_Template(rf, ctx) { if (rf & 1) {
588
- i0.ɵɵelementStart(0, "div", 137)(1, "label");
614
+ function ListsBrowseResource_Conditional_27_Conditional_16_Template(rf, ctx) { if (rf & 1) {
615
+ i0.ɵɵelementStart(0, "div", 140)(1, "label");
589
616
  i0.ɵɵtext(2, "Entity");
590
617
  i0.ɵɵelementEnd();
591
- i0.ɵɵelement(3, "input", 148);
618
+ i0.ɵɵelement(3, "input", 151);
592
619
  i0.ɵɵelementEnd();
593
620
  } if (rf & 2) {
594
- const ctx_r2 = i0.ɵɵnextContext(2);
621
+ const ctx_r4 = i0.ɵɵnextContext(2);
595
622
  i0.ɵɵadvance(3);
596
- i0.ɵɵproperty("value", ctx_r2.entitySearchTerm);
623
+ i0.ɵɵproperty("value", ctx_r4.entitySearchTerm);
597
624
  } }
598
- function ListsBrowseResource_Conditional_40_For_24_Template(rf, ctx) { if (rf & 1) {
599
- i0.ɵɵelementStart(0, "option", 141);
625
+ function ListsBrowseResource_Conditional_27_For_24_Template(rf, ctx) { if (rf & 1) {
626
+ i0.ɵɵelementStart(0, "option", 144);
600
627
  i0.ɵɵtext(1);
601
628
  i0.ɵɵelementEnd();
602
629
  } if (rf & 2) {
@@ -605,168 +632,202 @@ function ListsBrowseResource_Conditional_40_For_24_Template(rf, ctx) { if (rf &
605
632
  i0.ɵɵadvance();
606
633
  i0.ɵɵtextInterpolate(cat_r34.displayName);
607
634
  } }
608
- function ListsBrowseResource_Conditional_40_Conditional_27_Template(rf, ctx) { if (rf & 1) {
609
- i0.ɵɵelement(0, "i", 144);
635
+ function ListsBrowseResource_Conditional_27_Conditional_27_Template(rf, ctx) { if (rf & 1) {
636
+ i0.ɵɵelement(0, "i", 147);
610
637
  } }
611
- function ListsBrowseResource_Conditional_40_Template(rf, ctx) { if (rf & 1) {
638
+ function ListsBrowseResource_Conditional_27_Template(rf, ctx) { if (rf & 1) {
612
639
  const _r31 = i0.ɵɵgetCurrentView();
613
- i0.ɵɵelementStart(0, "div", 32)(1, "div", 134)(2, "h3");
640
+ i0.ɵɵelementStart(0, "div", 22)(1, "div", 136)(2, "h3");
614
641
  i0.ɵɵtext(3);
615
642
  i0.ɵɵelementEnd();
616
- i0.ɵɵelementStart(4, "button", 135);
617
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_40_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r31); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.closeCreateDialog()); });
618
- i0.ɵɵelement(5, "i", 37);
643
+ i0.ɵɵelementStart(4, "button", 137);
644
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_27_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r31); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.closeCreateDialog()); });
645
+ i0.ɵɵelement(5, "i", 138);
619
646
  i0.ɵɵelementEnd()();
620
- i0.ɵɵelementStart(6, "div", 136)(7, "div", 137)(8, "label");
647
+ i0.ɵɵelementStart(6, "div", 139)(7, "div", 140)(8, "label");
621
648
  i0.ɵɵtext(9, "Name *");
622
649
  i0.ɵɵelementEnd();
623
- i0.ɵɵelementStart(10, "input", 138);
624
- i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Conditional_40_Template_input_ngModelChange_10_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.newListName, $event) || (ctx_r2.newListName = $event); return i0.ɵɵresetView($event); });
650
+ i0.ɵɵelementStart(10, "input", 141);
651
+ i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Conditional_27_Template_input_ngModelChange_10_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r4 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r4.newListName, $event) || (ctx_r4.newListName = $event); return i0.ɵɵresetView($event); });
625
652
  i0.ɵɵelementEnd()();
626
- i0.ɵɵelementStart(11, "div", 137)(12, "label");
653
+ i0.ɵɵelementStart(11, "div", 140)(12, "label");
627
654
  i0.ɵɵtext(13, "Description");
628
655
  i0.ɵɵelementEnd();
629
- i0.ɵɵelementStart(14, "textarea", 139);
630
- i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Conditional_40_Template_textarea_ngModelChange_14_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.newListDescription, $event) || (ctx_r2.newListDescription = $event); return i0.ɵɵresetView($event); });
656
+ i0.ɵɵelementStart(14, "textarea", 142);
657
+ i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Conditional_27_Template_textarea_ngModelChange_14_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r4 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r4.newListDescription, $event) || (ctx_r4.newListDescription = $event); return i0.ɵɵresetView($event); });
631
658
  i0.ɵɵelementEnd()();
632
- i0.ɵɵconditionalCreate(15, ListsBrowseResource_Conditional_40_Conditional_15_Template, 6, 1, "div", 137);
633
- i0.ɵɵconditionalCreate(16, ListsBrowseResource_Conditional_40_Conditional_16_Template, 4, 1, "div", 137);
634
- i0.ɵɵelementStart(17, "div", 137)(18, "label");
659
+ i0.ɵɵconditionalCreate(15, ListsBrowseResource_Conditional_27_Conditional_15_Template, 6, 1, "div", 140);
660
+ i0.ɵɵconditionalCreate(16, ListsBrowseResource_Conditional_27_Conditional_16_Template, 4, 1, "div", 140);
661
+ i0.ɵɵelementStart(17, "div", 140)(18, "label");
635
662
  i0.ɵɵtext(19, "Category");
636
663
  i0.ɵɵelementEnd();
637
- i0.ɵɵelementStart(20, "select", 140);
638
- i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Conditional_40_Template_select_ngModelChange_20_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.selectedCategoryId, $event) || (ctx_r2.selectedCategoryId = $event); return i0.ɵɵresetView($event); });
639
- i0.ɵɵelementStart(21, "option", 141);
664
+ i0.ɵɵelementStart(20, "select", 143);
665
+ i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Conditional_27_Template_select_ngModelChange_20_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r4 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r4.selectedCategoryId, $event) || (ctx_r4.selectedCategoryId = $event); return i0.ɵɵresetView($event); });
666
+ i0.ɵɵelementStart(21, "option", 144);
640
667
  i0.ɵɵtext(22, "No category");
641
668
  i0.ɵɵelementEnd();
642
- i0.ɵɵrepeaterCreate(23, ListsBrowseResource_Conditional_40_For_24_Template, 2, 2, "option", 141, i0.ɵɵrepeaterTrackByIdentity);
669
+ i0.ɵɵrepeaterCreate(23, ListsBrowseResource_Conditional_27_For_24_Template, 2, 2, "option", 144, i0.ɵɵrepeaterTrackByIdentity);
643
670
  i0.ɵɵelementEnd()()();
644
- i0.ɵɵelementStart(25, "div", 142)(26, "button", 143);
645
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_40_Template_button_click_26_listener() { i0.ɵɵrestoreView(_r31); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.saveList()); });
646
- i0.ɵɵconditionalCreate(27, ListsBrowseResource_Conditional_40_Conditional_27_Template, 1, 0, "i", 144);
671
+ i0.ɵɵelementStart(25, "div", 145)(26, "button", 146);
672
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_27_Template_button_click_26_listener() { i0.ɵɵrestoreView(_r31); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.saveList()); });
673
+ i0.ɵɵconditionalCreate(27, ListsBrowseResource_Conditional_27_Conditional_27_Template, 1, 0, "i", 147);
647
674
  i0.ɵɵtext(28);
648
675
  i0.ɵɵelementEnd();
649
- i0.ɵɵelementStart(29, "button", 145);
650
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_40_Template_button_click_29_listener() { i0.ɵɵrestoreView(_r31); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.closeCreateDialog()); });
676
+ i0.ɵɵelementStart(29, "button", 148);
677
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_27_Template_button_click_29_listener() { i0.ɵɵrestoreView(_r31); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.closeCreateDialog()); });
651
678
  i0.ɵɵtext(30, "Cancel");
652
679
  i0.ɵɵelementEnd()()();
653
680
  } if (rf & 2) {
654
- const ctx_r2 = i0.ɵɵnextContext();
681
+ const ctx_r4 = i0.ɵɵnextContext();
655
682
  i0.ɵɵadvance(3);
656
- i0.ɵɵtextInterpolate(ctx_r2.editingList ? "Edit List" : "Create New List");
683
+ i0.ɵɵtextInterpolate(ctx_r4.editingList ? "Edit List" : "Create New List");
657
684
  i0.ɵɵadvance(7);
658
- i0.ɵɵtwoWayProperty("ngModel", ctx_r2.newListName);
685
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r4.newListName);
659
686
  i0.ɵɵadvance(4);
660
- i0.ɵɵtwoWayProperty("ngModel", ctx_r2.newListDescription);
687
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r4.newListDescription);
661
688
  i0.ɵɵadvance();
662
- i0.ɵɵconditional(!ctx_r2.editingList ? 15 : -1);
689
+ i0.ɵɵconditional(!ctx_r4.editingList ? 15 : -1);
663
690
  i0.ɵɵadvance();
664
- i0.ɵɵconditional(ctx_r2.editingList ? 16 : -1);
691
+ i0.ɵɵconditional(ctx_r4.editingList ? 16 : -1);
665
692
  i0.ɵɵadvance(4);
666
- i0.ɵɵtwoWayProperty("ngModel", ctx_r2.selectedCategoryId);
693
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r4.selectedCategoryId);
667
694
  i0.ɵɵadvance();
668
695
  i0.ɵɵproperty("ngValue", null);
669
696
  i0.ɵɵadvance(2);
670
- i0.ɵɵrepeater(ctx_r2.flatCategories);
697
+ i0.ɵɵrepeater(ctx_r4.flatCategories);
671
698
  i0.ɵɵadvance(3);
672
- i0.ɵɵproperty("disabled", !ctx_r2.newListName || !ctx_r2.editingList && !ctx_r2.selectedEntityId || ctx_r2.isSaving);
699
+ i0.ɵɵproperty("disabled", !ctx_r4.newListName || !ctx_r4.editingList && !ctx_r4.selectedEntityId || ctx_r4.isSaving);
673
700
  i0.ɵɵadvance();
674
- i0.ɵɵconditional(ctx_r2.isSaving ? 27 : -1);
701
+ i0.ɵɵconditional(ctx_r4.isSaving ? 27 : -1);
675
702
  i0.ɵɵadvance();
676
- i0.ɵɵtextInterpolate1(" ", ctx_r2.isSaving ? "Saving..." : ctx_r2.editingList ? "Save" : "Create", " ");
703
+ i0.ɵɵtextInterpolate1(" ", ctx_r4.isSaving ? "Saving..." : ctx_r4.editingList ? "Save" : "Create", " ");
677
704
  i0.ɵɵadvance();
678
- i0.ɵɵproperty("disabled", ctx_r2.isSaving);
705
+ i0.ɵɵproperty("disabled", ctx_r4.isSaving);
679
706
  } }
680
- function ListsBrowseResource_Conditional_41_Template(rf, ctx) { if (rf & 1) {
707
+ function ListsBrowseResource_Conditional_28_Template(rf, ctx) { if (rf & 1) {
681
708
  const _r35 = i0.ɵɵgetCurrentView();
682
- i0.ɵɵelementStart(0, "div", 133);
683
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_41_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r35); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.cancelDelete()); });
709
+ i0.ɵɵelementStart(0, "div", 135);
710
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_28_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r35); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.cancelDelete()); });
684
711
  i0.ɵɵelementEnd();
685
712
  } }
686
- function ListsBrowseResource_Conditional_42_Conditional_16_Template(rf, ctx) { if (rf & 1) {
687
- i0.ɵɵelement(0, "i", 144);
713
+ function ListsBrowseResource_Conditional_29_Conditional_16_Template(rf, ctx) { if (rf & 1) {
714
+ i0.ɵɵelement(0, "i", 147);
688
715
  } }
689
- function ListsBrowseResource_Conditional_42_Template(rf, ctx) { if (rf & 1) {
716
+ function ListsBrowseResource_Conditional_29_Template(rf, ctx) { if (rf & 1) {
690
717
  const _r36 = i0.ɵɵgetCurrentView();
691
- i0.ɵɵelementStart(0, "div", 33)(1, "div", 134)(2, "h3");
718
+ i0.ɵɵelementStart(0, "div", 23)(1, "div", 136)(2, "h3");
692
719
  i0.ɵɵtext(3, "Delete List");
693
720
  i0.ɵɵelementEnd();
694
- i0.ɵɵelementStart(4, "button", 135);
695
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_42_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r36); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.cancelDelete()); });
696
- i0.ɵɵelement(5, "i", 37);
721
+ i0.ɵɵelementStart(4, "button", 137);
722
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_29_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r36); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.cancelDelete()); });
723
+ i0.ɵɵelement(5, "i", 138);
697
724
  i0.ɵɵelementEnd()();
698
- i0.ɵɵelementStart(6, "div", 136)(7, "p");
725
+ i0.ɵɵelementStart(6, "div", 139)(7, "p");
699
726
  i0.ɵɵtext(8, "Are you sure you want to delete \"");
700
727
  i0.ɵɵelementStart(9, "strong");
701
728
  i0.ɵɵtext(10);
702
729
  i0.ɵɵelementEnd();
703
730
  i0.ɵɵtext(11, "\"?");
704
731
  i0.ɵɵelementEnd();
705
- i0.ɵɵelementStart(12, "p", 149);
732
+ i0.ɵɵelementStart(12, "p", 152);
706
733
  i0.ɵɵtext(13, "This will also remove all items in the list.");
707
734
  i0.ɵɵelementEnd()();
708
- i0.ɵɵelementStart(14, "div", 142)(15, "button", 150);
709
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_42_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r36); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.deleteList()); });
710
- i0.ɵɵconditionalCreate(16, ListsBrowseResource_Conditional_42_Conditional_16_Template, 1, 0, "i", 144);
735
+ i0.ɵɵelementStart(14, "div", 145)(15, "button", 153);
736
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_29_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r36); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.deleteList()); });
737
+ i0.ɵɵconditionalCreate(16, ListsBrowseResource_Conditional_29_Conditional_16_Template, 1, 0, "i", 147);
711
738
  i0.ɵɵtext(17);
712
739
  i0.ɵɵelementEnd();
713
- i0.ɵɵelementStart(18, "button", 145);
714
- i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_42_Template_button_click_18_listener() { i0.ɵɵrestoreView(_r36); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.cancelDelete()); });
740
+ i0.ɵɵelementStart(18, "button", 148);
741
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_29_Template_button_click_18_listener() { i0.ɵɵrestoreView(_r36); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.cancelDelete()); });
715
742
  i0.ɵɵtext(19, "Cancel");
716
743
  i0.ɵɵelementEnd()()();
717
744
  } if (rf & 2) {
718
- const ctx_r2 = i0.ɵɵnextContext();
745
+ const ctx_r4 = i0.ɵɵnextContext();
719
746
  i0.ɵɵadvance(10);
720
- i0.ɵɵtextInterpolate(ctx_r2.deleteListName);
747
+ i0.ɵɵtextInterpolate(ctx_r4.deleteListName);
721
748
  i0.ɵɵadvance(5);
722
- i0.ɵɵproperty("disabled", ctx_r2.isDeleting);
749
+ i0.ɵɵproperty("disabled", ctx_r4.isDeleting);
723
750
  i0.ɵɵadvance();
724
- i0.ɵɵconditional(ctx_r2.isDeleting ? 16 : -1);
751
+ i0.ɵɵconditional(ctx_r4.isDeleting ? 16 : -1);
725
752
  i0.ɵɵadvance();
726
- i0.ɵɵtextInterpolate1(" ", ctx_r2.isDeleting ? "Deleting..." : "Delete", " ");
753
+ i0.ɵɵtextInterpolate1(" ", ctx_r4.isDeleting ? "Deleting..." : "Delete", " ");
727
754
  i0.ɵɵadvance();
728
- i0.ɵɵproperty("disabled", ctx_r2.isDeleting);
755
+ i0.ɵɵproperty("disabled", ctx_r4.isDeleting);
729
756
  } }
730
- function ListsBrowseResource_Conditional_43_Template(rf, ctx) { if (rf & 1) {
757
+ function ListsBrowseResource_Conditional_30_Template(rf, ctx) { if (rf & 1) {
731
758
  const _r37 = i0.ɵɵgetCurrentView();
732
- i0.ɵɵelementStart(0, "mj-list-share-dialog", 151);
733
- i0.ɵɵlistener("complete", function ListsBrowseResource_Conditional_43_Template_mj_list_share_dialog_complete_0_listener($event) { i0.ɵɵrestoreView(_r37); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onShareComplete($event)); })("cancel", function ListsBrowseResource_Conditional_43_Template_mj_list_share_dialog_cancel_0_listener() { i0.ɵɵrestoreView(_r37); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onShareCancel()); });
759
+ i0.ɵɵelementStart(0, "mj-list-share-dialog", 154);
760
+ i0.ɵɵlistener("complete", function ListsBrowseResource_Conditional_30_Template_mj_list_share_dialog_complete_0_listener($event) { i0.ɵɵrestoreView(_r37); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.onShareComplete($event)); })("cancel", function ListsBrowseResource_Conditional_30_Template_mj_list_share_dialog_cancel_0_listener() { i0.ɵɵrestoreView(_r37); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.onShareCancel()); })("manageInvitations", function ListsBrowseResource_Conditional_30_Template_mj_list_share_dialog_manageInvitations_0_listener() { i0.ɵɵrestoreView(_r37); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.onManageInvitations()); })("viewAuditLog", function ListsBrowseResource_Conditional_30_Template_mj_list_share_dialog_viewAuditLog_0_listener() { i0.ɵɵrestoreView(_r37); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.onViewAuditLog()); });
734
761
  i0.ɵɵelementEnd();
735
762
  } if (rf & 2) {
736
- const ctx_r2 = i0.ɵɵnextContext();
737
- i0.ɵɵproperty("config", ctx_r2.shareDialogConfig)("visible", ctx_r2.showShareDialog);
763
+ const ctx_r4 = i0.ɵɵnextContext();
764
+ i0.ɵɵproperty("config", ctx_r4.shareDialogConfig)("visible", ctx_r4.showShareDialog);
738
765
  } }
739
- function ListsBrowseResource_Conditional_44_For_3_Template(rf, ctx) { if (rf & 1) {
766
+ function ListsBrowseResource_Conditional_31_Template(rf, ctx) { if (rf & 1) {
740
767
  const _r38 = i0.ɵɵgetCurrentView();
741
- i0.ɵɵelementStart(0, "div", 156);
742
- i0.ɵɵlistener("mousedown", function ListsBrowseResource_Conditional_44_For_3_Template_div_mousedown_0_listener($event) { const entity_r39 = i0.ɵɵrestoreView(_r38).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); ctx_r2.selectEntity(entity_r39); return i0.ɵɵresetView($event.preventDefault()); });
768
+ i0.ɵɵelementStart(0, "mj-dialog", 155);
769
+ i0.ɵɵlistener("Close", function ListsBrowseResource_Conditional_31_Template_mj_dialog_Close_0_listener() { i0.ɵɵrestoreView(_r38); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.closeInvitationsDialog()); });
770
+ i0.ɵɵelementStart(1, "div", 156);
771
+ i0.ɵɵelement(2, "mj-list-invitations", 157);
772
+ i0.ɵɵelementEnd();
773
+ i0.ɵɵelementStart(3, "mj-dialog-actions")(4, "button", 158);
774
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_31_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r38); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.closeInvitationsDialog()); });
775
+ i0.ɵɵtext(5, "Close");
776
+ i0.ɵɵelementEnd()()();
777
+ } if (rf & 2) {
778
+ const ctx_r4 = i0.ɵɵnextContext();
779
+ i0.ɵɵproperty("Visible", true)("Title", "Invitations \u2014 " + (ctx_r4.activeShareListName ?? "List"))("MinWidth", 640)("Width", 900)("Height", 640);
780
+ i0.ɵɵadvance(2);
781
+ i0.ɵɵproperty("Provider", ctx_r4.ProviderToUse)("ListID", ctx_r4.activeShareListId)("ListName", ctx_r4.activeShareListName);
782
+ } }
783
+ function ListsBrowseResource_Conditional_32_Template(rf, ctx) { if (rf & 1) {
784
+ const _r39 = i0.ɵɵgetCurrentView();
785
+ i0.ɵɵelementStart(0, "mj-dialog", 155);
786
+ i0.ɵɵlistener("Close", function ListsBrowseResource_Conditional_32_Template_mj_dialog_Close_0_listener() { i0.ɵɵrestoreView(_r39); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.closeAuditLogDialog()); });
787
+ i0.ɵɵelementStart(1, "div", 156);
788
+ i0.ɵɵelement(2, "mj-list-audit-log", 159);
789
+ i0.ɵɵelementEnd();
790
+ i0.ɵɵelementStart(3, "mj-dialog-actions")(4, "button", 158);
791
+ i0.ɵɵlistener("click", function ListsBrowseResource_Conditional_32_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r39); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.closeAuditLogDialog()); });
792
+ i0.ɵɵtext(5, "Close");
793
+ i0.ɵɵelementEnd()()();
794
+ } if (rf & 2) {
795
+ const ctx_r4 = i0.ɵɵnextContext();
796
+ i0.ɵɵproperty("Visible", true)("Title", "Audit Log \u2014 " + (ctx_r4.activeShareListName ?? "List"))("MinWidth", 720)("Width", 980)("Height", 680);
797
+ i0.ɵɵadvance(2);
798
+ i0.ɵɵproperty("Provider", ctx_r4.ProviderToUse)("ListID", ctx_r4.activeShareListId);
799
+ } }
800
+ function ListsBrowseResource_Conditional_33_For_3_Template(rf, ctx) { if (rf & 1) {
801
+ const _r40 = i0.ɵɵgetCurrentView();
802
+ i0.ɵɵelementStart(0, "div", 164);
803
+ i0.ɵɵlistener("mousedown", function ListsBrowseResource_Conditional_33_For_3_Template_div_mousedown_0_listener($event) { const entity_r41 = i0.ɵɵrestoreView(_r40).$implicit; const ctx_r4 = i0.ɵɵnextContext(2); ctx_r4.selectEntity(entity_r41); return i0.ɵɵresetView($event.preventDefault()); });
743
804
  i0.ɵɵtext(1);
744
805
  i0.ɵɵelementEnd();
745
806
  } if (rf & 2) {
746
- const entity_r39 = ctx.$implicit;
807
+ const entity_r41 = ctx.$implicit;
747
808
  i0.ɵɵadvance();
748
- i0.ɵɵtextInterpolate1(" ", entity_r39.Name, " ");
809
+ i0.ɵɵtextInterpolate1(" ", entity_r41.Name, " ");
749
810
  } }
750
- function ListsBrowseResource_Conditional_44_Conditional_4_Template(rf, ctx) { if (rf & 1) {
751
- i0.ɵɵelementStart(0, "div", 155);
811
+ function ListsBrowseResource_Conditional_33_Conditional_4_Template(rf, ctx) { if (rf & 1) {
812
+ i0.ɵɵelementStart(0, "div", 163);
752
813
  i0.ɵɵtext(1, " No entities found ");
753
814
  i0.ɵɵelementEnd();
754
815
  } }
755
- function ListsBrowseResource_Conditional_44_Template(rf, ctx) { if (rf & 1) {
756
- i0.ɵɵelementStart(0, "div", 152)(1, "div", 153);
757
- i0.ɵɵrepeaterCreate(2, ListsBrowseResource_Conditional_44_For_3_Template, 2, 1, "div", 154, i0.ɵɵrepeaterTrackByIdentity);
758
- i0.ɵɵconditionalCreate(4, ListsBrowseResource_Conditional_44_Conditional_4_Template, 2, 0, "div", 155);
816
+ function ListsBrowseResource_Conditional_33_Template(rf, ctx) { if (rf & 1) {
817
+ i0.ɵɵelementStart(0, "div", 160)(1, "div", 161);
818
+ i0.ɵɵrepeaterCreate(2, ListsBrowseResource_Conditional_33_For_3_Template, 2, 1, "div", 162, i0.ɵɵrepeaterTrackByIdentity);
819
+ i0.ɵɵconditionalCreate(4, ListsBrowseResource_Conditional_33_Conditional_4_Template, 2, 0, "div", 163);
759
820
  i0.ɵɵelementEnd()();
760
821
  } if (rf & 2) {
761
- const ctx_r2 = i0.ɵɵnextContext();
762
- i0.ɵɵstyleProp("top", ctx_r2.entityDropdownPosition.top, "px")("left", ctx_r2.entityDropdownPosition.left, "px")("width", ctx_r2.entityDropdownPosition.width, "px");
763
- i0.ɵɵclassProp("dropdown-above", ctx_r2.entityDropdownPosition.openAbove);
822
+ const ctx_r4 = i0.ɵɵnextContext();
823
+ i0.ɵɵstyleProp("top", ctx_r4.entityDropdownPosition.top, "px")("left", ctx_r4.entityDropdownPosition.left, "px")("width", ctx_r4.entityDropdownPosition.width, "px");
824
+ i0.ɵɵclassProp("dropdown-above", ctx_r4.entityDropdownPosition.openAbove);
764
825
  i0.ɵɵadvance();
765
- i0.ɵɵclassProp("open-above", ctx_r2.entityDropdownPosition.openAbove);
826
+ i0.ɵɵclassProp("open-above", ctx_r4.entityDropdownPosition.openAbove);
766
827
  i0.ɵɵadvance();
767
- i0.ɵɵrepeater(ctx_r2.filteredEntitiesList);
828
+ i0.ɵɵrepeater(ctx_r4.filteredEntitiesList);
768
829
  i0.ɵɵadvance(2);
769
- i0.ɵɵconditional(ctx_r2.filteredEntitiesList.length === 0 ? 4 : -1);
830
+ i0.ɵɵconditional(ctx_r4.filteredEntitiesList.length === 0 ? 4 : -1);
770
831
  } }
771
832
  let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponent {
772
833
  cdr;
@@ -781,6 +842,27 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
781
842
  selectedEntity = 'all';
782
843
  selectedOwner = 'mine';
783
844
  selectedSort = 'name';
845
+ /**
846
+ * Active tag filters (Phase 4.3). Multi-tag = AND — a list must have
847
+ * every active tag to appear. URL state mirrors this via the `tags`
848
+ * query param (comma-separated tag IDs).
849
+ */
850
+ tagFilters = [];
851
+ /**
852
+ * Set of List IDs that match the current `tagFilters` (intersection).
853
+ * `null` means "no tag filter active" — pass-through. Populated by
854
+ * `recomputeTagMembership` whenever `tagFilters` changes; consumed by
855
+ * `applyFilters` to narrow the visible list.
856
+ */
857
+ tagFilteredListIds = null;
858
+ /**
859
+ * Favorite-list IDs for the current user (Phase 5.3). Backed by the
860
+ * existing `MJ: User Favorites` entity. `null` while loading; a Set
861
+ * once populated so card-side toggling is O(1).
862
+ */
863
+ favoriteListIds = new Set();
864
+ /** When true, only favorited lists appear in the grid. */
865
+ showOnlyFavorites = false;
784
866
  allLists = [];
785
867
  filteredLists = [];
786
868
  categories = [];
@@ -825,6 +907,29 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
825
907
  // Sharing dialog state
826
908
  showShareDialog = false;
827
909
  shareDialogConfig = null;
910
+ // Viewer-perspective gating (Phase 2.8). Capabilities are computed
911
+ // lazily when the user opens the context menu — running per-card
912
+ // would mean N permission-resolve calls per browse render. The
913
+ // resolved level is cached on the item so re-opening the same menu
914
+ // doesn't refetch.
915
+ contextItemCapabilities = CapabilitiesForLevel('Owner');
916
+ capabilityCache = new Map();
917
+ // Tracks whether the in-memory categories list is known-stale
918
+ // relative to the DB. Flipped to true by the BaseEntity event
919
+ // subscription whenever any `MJ: List Categories` row is saved or
920
+ // deleted (most often from the Categories tab next door). Reset to
921
+ // false after `refreshCategoriesForDialog` reloads. Initial true so
922
+ // the first dialog open always populates from a fresh fetch.
923
+ categoriesDirty = true;
924
+ // Invitations / audit log dialogs (mockups 16, 18) — opened from
925
+ // the share dialog. Each dialog binds to a single list at a time,
926
+ // tracked by `activeShareListId`/`activeShareListName` lifted from
927
+ // shareDialogConfig at open time so we keep the context after the
928
+ // share dialog closes.
929
+ showInvitationsDialog = false;
930
+ showAuditLogDialog = false;
931
+ activeShareListId = null;
932
+ activeShareListName = null;
828
933
  entityColorMap = new Map();
829
934
  entityIconMap = new Map();
830
935
  categoryMap = new Map();
@@ -861,9 +966,38 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
861
966
  }
862
967
  async ngOnInit() {
863
968
  super.ngOnInit();
969
+ this.subscribeToCategoryChanges();
864
970
  await this.loadData();
865
971
  this.NotifyLoadComplete();
866
972
  }
973
+ /**
974
+ * Mark the in-memory categories list dirty whenever any BaseEntity
975
+ * raises a save / delete event for `MJ: List Categories`. The
976
+ * Create/Edit dialog uses this flag to skip the per-open RunView
977
+ * unless something has actually changed since last load — keeps the
978
+ * dialog snappy without showing stale categories.
979
+ *
980
+ * Subscribes to MJGlobal's event bus rather than wiring each
981
+ * category entity's per-instance listener, because the Categories
982
+ * tab creates fresh BaseEntity instances we can't see from here.
983
+ */
984
+ subscribeToCategoryChanges() {
985
+ MJGlobal.Instance.GetEventListener()
986
+ .pipe(takeUntil(this.destroy$))
987
+ .subscribe((mjEvt) => {
988
+ if (mjEvt.eventCode !== BaseEntity.BaseEventCode)
989
+ return;
990
+ const beEvt = mjEvt.args;
991
+ if (!beEvt)
992
+ return;
993
+ const entityName = beEvt.baseEntity?.EntityInfo.Name ?? beEvt.entityName;
994
+ if (entityName !== 'MJ: List Categories')
995
+ return;
996
+ if (beEvt.type === 'save' || beEvt.type === 'delete') {
997
+ this.categoriesDirty = true;
998
+ }
999
+ });
1000
+ }
867
1001
  ngOnDestroy() {
868
1002
  super.ngOnDestroy();
869
1003
  this.destroy$.next();
@@ -875,12 +1009,17 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
875
1009
  const md = this.ProviderToUse;
876
1010
  const rv = RunView.FromMetadataProvider(this.ProviderToUse);
877
1011
  this.currentUserId = md.CurrentUser?.ID || '';
878
- // Load all lists, categories, details, and users in parallel
1012
+ // BypassCache on Lists + List Details: after a delete/duplicate, the
1013
+ // RunView cache for these entities doesn't always reflect the latest
1014
+ // state in time (event-driven invalidation races the immediate
1015
+ // refresh). Trading a small perf hit for correctness here is worth
1016
+ // it — categories and users stay cache-warm.
879
1017
  const [listsResult, categoriesResult, detailsResult, usersResult] = await rv.RunViews([
880
1018
  {
881
1019
  EntityName: 'MJ: Lists',
882
1020
  OrderBy: 'Name',
883
- ResultType: 'entity_object'
1021
+ ResultType: 'entity_object',
1022
+ BypassCache: true
884
1023
  },
885
1024
  {
886
1025
  EntityName: 'MJ: List Categories',
@@ -890,7 +1029,8 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
890
1029
  {
891
1030
  EntityName: 'MJ: List Details',
892
1031
  Fields: ['ListID'],
893
- ResultType: 'simple'
1032
+ ResultType: 'simple',
1033
+ BypassCache: true
894
1034
  },
895
1035
  {
896
1036
  EntityName: 'MJ: Users',
@@ -913,6 +1053,9 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
913
1053
  }
914
1054
  // Build flat categories for dropdown
915
1055
  this.flatCategories = this.buildFlatCategories(this.categories);
1056
+ // loadData() already pulled fresh categories — clear the dirty
1057
+ // flag so the first dialog open doesn't redundantly refetch.
1058
+ this.categoriesDirty = false;
916
1059
  // Build user map
917
1060
  const userMap = new Map();
918
1061
  for (const user of users) {
@@ -956,6 +1099,8 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
956
1099
  ];
957
1100
  this.applyFilters();
958
1101
  this.buildCategoryTree();
1102
+ // Load favorites in parallel — not critical-path, but cheap.
1103
+ void this.loadFavorites();
959
1104
  // Load sharing info in the background
960
1105
  this.loadSharingInfo();
961
1106
  }
@@ -1029,7 +1174,61 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
1029
1174
  setViewMode(mode) {
1030
1175
  this.viewMode = mode;
1031
1176
  }
1032
- onSearchChange(_term) {
1177
+ /** View-mode options for the shared <mj-view-toggle>. */
1178
+ listViewOptions = [
1179
+ { key: 'table', icon: 'fa-solid fa-table-list', title: 'Table view' },
1180
+ { key: 'card', icon: 'fa-solid fa-grip', title: 'Card view' },
1181
+ { key: 'hierarchy', icon: 'fa-solid fa-folder-tree', title: 'Category view' },
1182
+ ];
1183
+ /** Values record consumed by the centralized <mj-filter-panel>. */
1184
+ get listFilterValues() {
1185
+ return { selectedOwner: this.selectedOwner, selectedEntity: this.selectedEntity };
1186
+ }
1187
+ /** Field config consumed by the centralized <mj-filter-panel>. */
1188
+ get listFilterFields() {
1189
+ return [
1190
+ {
1191
+ key: 'selectedOwner',
1192
+ type: 'dropdown',
1193
+ label: 'Owner',
1194
+ icon: 'fa-solid fa-user',
1195
+ options: this.ownerOptions.map(o => ({ text: o.name, value: o.value })),
1196
+ },
1197
+ {
1198
+ key: 'selectedEntity',
1199
+ type: 'dropdown',
1200
+ label: 'Entity',
1201
+ icon: 'fa-solid fa-table',
1202
+ filterable: this.entityOptions.length > 10,
1203
+ options: this.entityOptions.map(o => ({ text: o.name, value: o.value })),
1204
+ },
1205
+ ];
1206
+ }
1207
+ /** Receive popover updates and apply them. */
1208
+ onFilterValuesChange(values) {
1209
+ this.selectedOwner = values['selectedOwner'] ?? 'mine';
1210
+ this.selectedEntity = values['selectedEntity'] ?? 'all';
1211
+ this.applyFilters();
1212
+ this.buildCategoryTree();
1213
+ }
1214
+ /** Reset popover filters to defaults; leaves searchTerm alone. */
1215
+ resetPopoverFilters() {
1216
+ this.selectedOwner = 'mine';
1217
+ this.selectedEntity = 'all';
1218
+ this.applyFilters();
1219
+ this.buildCategoryTree();
1220
+ }
1221
+ /** Active filter count for the popover badge (excludes searchTerm). */
1222
+ get ActiveFilterCount() {
1223
+ let n = 0;
1224
+ if (this.selectedOwner && this.selectedOwner !== 'mine')
1225
+ n++;
1226
+ if (this.selectedEntity && this.selectedEntity !== 'all')
1227
+ n++;
1228
+ return n;
1229
+ }
1230
+ onSearchChange(term) {
1231
+ this.searchTerm = term;
1033
1232
  this.applyFilters();
1034
1233
  this.buildCategoryTree();
1035
1234
  }
@@ -1078,6 +1277,16 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
1078
1277
  if (this.selectedEntity !== 'all') {
1079
1278
  result = result.filter(item => item.entityName === this.selectedEntity);
1080
1279
  }
1280
+ // Tag filter (Phase 4.3 — intersection of all active tags).
1281
+ if (this.tagFilteredListIds !== null) {
1282
+ const matches = this.tagFilteredListIds;
1283
+ result = result.filter(item => matches.has(item.list.ID));
1284
+ }
1285
+ // Favorites-only toggle (Phase 5.3).
1286
+ if (this.showOnlyFavorites) {
1287
+ const favs = this.favoriteListIds;
1288
+ result = result.filter(item => favs.has(item.list.ID));
1289
+ }
1081
1290
  // Sort
1082
1291
  switch (this.selectedSort) {
1083
1292
  case 'name':
@@ -1145,14 +1354,215 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
1145
1354
  const appId = this.Data?.Configuration?.applicationId || '';
1146
1355
  this.tabService.OpenList(item.list.ID, item.list.Name, appId);
1147
1356
  }
1357
+ /**
1358
+ * Handle a tag chip click on a list card — adds the tag to the
1359
+ * filter row (multi-tag = AND). Wired by Phase 4.3; the chip
1360
+ * component emits the (TagID, Name) pair so we can both display
1361
+ * the chip name and filter by ID.
1362
+ */
1363
+ onCardTagClicked(payload) {
1364
+ if (this.tagFilters.some((f) => f.TagID === payload.TagID))
1365
+ return;
1366
+ this.tagFilters = [...this.tagFilters, payload];
1367
+ void this.recomputeTagMembership();
1368
+ }
1369
+ /** Remove a tag from the filter row. */
1370
+ removeTagFilter(tagId) {
1371
+ this.tagFilters = this.tagFilters.filter((f) => f.TagID !== tagId);
1372
+ void this.recomputeTagMembership();
1373
+ }
1374
+ /** Clear all active tag filters. */
1375
+ clearTagFilters() {
1376
+ this.tagFilters = [];
1377
+ this.tagFilteredListIds = null;
1378
+ this.applyFilters();
1379
+ }
1380
+ /**
1381
+ * Resolve which lists have ALL active tags. Done server-side so the
1382
+ * filter works regardless of which lists the user has scrolled past.
1383
+ * Result is cached on `tagFilteredListIds`; `applyFilters` consumes it.
1384
+ */
1385
+ async recomputeTagMembership() {
1386
+ if (this.tagFilters.length === 0) {
1387
+ this.tagFilteredListIds = null;
1388
+ this.applyFilters();
1389
+ return;
1390
+ }
1391
+ try {
1392
+ const md = this.ProviderToUse;
1393
+ const listsEntity = md.Entities.find((e) => e.Name === 'MJ: Lists');
1394
+ if (!listsEntity) {
1395
+ this.tagFilteredListIds = new Set();
1396
+ this.applyFilters();
1397
+ return;
1398
+ }
1399
+ const tagIds = this.tagFilters.map((f) => `'${f.TagID}'`).join(',');
1400
+ const rv = RunView.FromMetadataProvider(md);
1401
+ const result = await rv.RunView({
1402
+ EntityName: 'MJ: Tagged Items',
1403
+ ExtraFilter: `EntityID='${listsEntity.ID}' AND TagID IN (${tagIds})`,
1404
+ Fields: ['RecordID', 'TagID'],
1405
+ ResultType: 'simple',
1406
+ });
1407
+ // Intersection: count tag hits per list, keep only those with
1408
+ // exactly `tagFilters.length` matches (one per required tag).
1409
+ const counts = new Map();
1410
+ for (const row of result.Results ?? []) {
1411
+ const id = String(row.RecordID);
1412
+ counts.set(id, (counts.get(id) ?? 0) + 1);
1413
+ }
1414
+ const required = this.tagFilters.length;
1415
+ const matches = new Set();
1416
+ for (const [id, count] of counts) {
1417
+ if (count >= required)
1418
+ matches.add(id);
1419
+ }
1420
+ this.tagFilteredListIds = matches;
1421
+ }
1422
+ catch (e) {
1423
+ // On failure, fall back to "no match" so the user sees an empty
1424
+ // state rather than every list — avoids leaking unfiltered data
1425
+ // when the filter intent failed silently.
1426
+ this.tagFilteredListIds = new Set();
1427
+ }
1428
+ this.applyFilters();
1429
+ }
1430
+ /**
1431
+ * Load the current user's favorite lists into `favoriteListIds`.
1432
+ * Cheap — typically <100 rows per user. Driven by the `MJ: User
1433
+ * Favorites` entity scoped by the Lists EntityID. Best-effort: on
1434
+ * failure the star icons just stay dim.
1435
+ */
1436
+ async loadFavorites() {
1437
+ try {
1438
+ const md = this.ProviderToUse;
1439
+ const listsEntity = md.Entities.find((e) => e.Name === 'MJ: Lists');
1440
+ if (!listsEntity || !md.CurrentUser)
1441
+ return;
1442
+ const rv = RunView.FromMetadataProvider(md);
1443
+ const result = await rv.RunView({
1444
+ EntityName: 'MJ: User Favorites',
1445
+ ExtraFilter: `UserID='${md.CurrentUser.ID}' AND EntityID='${listsEntity.ID}'`,
1446
+ Fields: ['RecordID'],
1447
+ ResultType: 'simple',
1448
+ });
1449
+ this.favoriteListIds = new Set((result.Results ?? []).map((r) => String(r.RecordID)));
1450
+ }
1451
+ catch {
1452
+ // Silent — favorites are a polish feature, not load-bearing.
1453
+ this.favoriteListIds = new Set();
1454
+ }
1455
+ }
1456
+ /**
1457
+ * Toggle a list's favorite state. Optimistic: flips the local Set
1458
+ * first, then writes through. Reverts on failure.
1459
+ */
1460
+ async toggleFavorite(event, item) {
1461
+ event.stopPropagation();
1462
+ const wasFav = this.favoriteListIds.has(item.list.ID);
1463
+ // Optimistic update.
1464
+ if (wasFav)
1465
+ this.favoriteListIds.delete(item.list.ID);
1466
+ else
1467
+ this.favoriteListIds.add(item.list.ID);
1468
+ // Re-trigger filter recompute since the favorites-only toggle
1469
+ // may be on.
1470
+ this.applyFilters();
1471
+ try {
1472
+ const md = this.ProviderToUse;
1473
+ const listsEntity = md.Entities.find((e) => e.Name === 'MJ: Lists');
1474
+ if (!listsEntity || !md.CurrentUser)
1475
+ throw new Error('Cannot resolve user favorites entity');
1476
+ if (wasFav) {
1477
+ // Find + delete the existing favorite row.
1478
+ const rv = RunView.FromMetadataProvider(md);
1479
+ const result = await rv.RunView({
1480
+ EntityName: 'MJ: User Favorites',
1481
+ ExtraFilter: `UserID='${md.CurrentUser.ID}' AND EntityID='${listsEntity.ID}' AND RecordID='${item.list.ID}'`,
1482
+ ResultType: 'entity_object',
1483
+ });
1484
+ for (const row of result.Results ?? [])
1485
+ await row.Delete();
1486
+ }
1487
+ else {
1488
+ const fav = await md.GetEntityObject('MJ: User Favorites', md.CurrentUser);
1489
+ fav.NewRecord();
1490
+ fav.UserID = md.CurrentUser.ID;
1491
+ fav.EntityID = listsEntity.ID;
1492
+ fav.RecordID = item.list.ID;
1493
+ await fav.Save();
1494
+ }
1495
+ }
1496
+ catch {
1497
+ // Revert on failure.
1498
+ if (wasFav)
1499
+ this.favoriteListIds.add(item.list.ID);
1500
+ else
1501
+ this.favoriteListIds.delete(item.list.ID);
1502
+ this.applyFilters();
1503
+ }
1504
+ }
1505
+ isFavorite(listId) {
1506
+ return this.favoriteListIds.has(listId);
1507
+ }
1508
+ toggleShowOnlyFavorites() {
1509
+ this.showOnlyFavorites = !this.showOnlyFavorites;
1510
+ this.applyFilters();
1511
+ }
1148
1512
  openListMenu(event, item) {
1149
1513
  event.stopPropagation();
1150
1514
  const mouseEvent = event;
1151
1515
  this.selectedContextItem = item;
1152
1516
  this.contextMenuX = mouseEvent.clientX;
1153
1517
  this.contextMenuY = mouseEvent.clientY;
1518
+ // Fast path: owners always have full capabilities. Avoid an extra
1519
+ // permission-resolve round trip for the common case.
1520
+ if (item.isOwner) {
1521
+ this.contextItemCapabilities = CapabilitiesForLevel('Owner');
1522
+ this.showContextMenu = true;
1523
+ return;
1524
+ }
1525
+ // Render the menu immediately with a conservative viewer-level cap
1526
+ // set, then refine via async resolve. The flicker is a single tick
1527
+ // — and viewers/editors stay correctly gated even if resolve fails.
1528
+ const cached = this.capabilityCache.get(item.list.ID);
1529
+ if (cached !== undefined) {
1530
+ this.contextItemCapabilities = CapabilitiesForLevel(cached);
1531
+ }
1532
+ else {
1533
+ this.contextItemCapabilities = CapabilitiesForLevel('View');
1534
+ void this.refineContextCapabilities(item.list.ID);
1535
+ }
1154
1536
  this.showContextMenu = true;
1155
1537
  }
1538
+ /** Resolve the current user's permission level for a list and update
1539
+ * the open context menu in place. Cached so re-opening the same menu
1540
+ * doesn't re-hit the resolver. */
1541
+ async refineContextCapabilities(listId) {
1542
+ try {
1543
+ const currentUserId = this.ProviderToUse.CurrentUser?.ID;
1544
+ if (!currentUserId) {
1545
+ // No user context — leave the conservative fallback in place.
1546
+ return;
1547
+ }
1548
+ // Go through the Angular sharing service rather than instantiating the
1549
+ // server-side `ListSharing` class directly. The service hits the GraphQL
1550
+ // surface, which is the only sanctioned client→server path; the server
1551
+ // package writes audit logs + permission rows that have no business
1552
+ // running in a browser bundle.
1553
+ const level = (await this.listSharingService.getUserPermissionLevel(listId, currentUserId));
1554
+ this.capabilityCache.set(listId, level);
1555
+ // Only mutate state if the user is still on this same menu — they
1556
+ // may have closed it before resolve finished.
1557
+ if (this.showContextMenu && this.selectedContextItem && UUIDsEqual(this.selectedContextItem.list.ID, listId)) {
1558
+ this.contextItemCapabilities = CapabilitiesForLevel(level);
1559
+ this.cdr.detectChanges();
1560
+ }
1561
+ }
1562
+ catch {
1563
+ // Conservative fallback already applied at menu open time.
1564
+ }
1565
+ }
1156
1566
  closeContextMenu() {
1157
1567
  this.showContextMenu = false;
1158
1568
  this.selectedContextItem = null;
@@ -1166,6 +1576,10 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
1166
1576
  this.selectedCategoryId = null;
1167
1577
  this.showEntityDropdown = false;
1168
1578
  this.showCreateDialog = true;
1579
+ // Refresh categories so newly-created ones appear without a page
1580
+ // reload. Cheap RunView; runs in the background while the user is
1581
+ // typing the list name.
1582
+ void this.refreshCategoriesForDialog();
1169
1583
  }
1170
1584
  editList() {
1171
1585
  if (!this.selectedContextItem)
@@ -1177,8 +1591,49 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
1177
1591
  this.selectedEntityId = list.EntityID;
1178
1592
  this.entitySearchTerm = list.Entity || '';
1179
1593
  this.selectedCategoryId = list.CategoryID || null;
1180
- this.showCreateDialog = true;
1594
+ // Ensure no stale state from a previous Create attempt — the entity
1595
+ // dropdown portal renders at z-index 10002 and could otherwise sit on
1596
+ // top of the edit dialog and block interaction.
1597
+ this.showEntityDropdown = false;
1598
+ // Close the context menu BEFORE opening the dialog. Doing it after
1599
+ // leaves a one-tick window where both the menu and the modal-overlay
1600
+ // are stacked, and the menu's outer click-overlay can swallow the
1601
+ // first click into the form fields below it.
1181
1602
  this.closeContextMenu();
1603
+ this.showCreateDialog = true;
1604
+ this.cdr.detectChanges();
1605
+ void this.refreshCategoriesForDialog();
1606
+ }
1607
+ /** Re-pull MJ: List Categories so the dropdown reflects any
1608
+ * newly-created categories. Skips the round trip when nothing has
1609
+ * changed since the last load — `categoriesDirty` is flipped on
1610
+ * by the BaseEntity event subscription whenever a category row
1611
+ * is saved/deleted, so the only times this actually fetches are
1612
+ * (a) the first dialog open, and (b) after the user touched a
1613
+ * category somewhere else. */
1614
+ async refreshCategoriesForDialog() {
1615
+ if (!this.categoriesDirty)
1616
+ return;
1617
+ try {
1618
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
1619
+ const result = await rv.RunView({
1620
+ EntityName: 'MJ: List Categories',
1621
+ OrderBy: 'Name',
1622
+ ResultType: 'simple',
1623
+ });
1624
+ if (!result.Success)
1625
+ return;
1626
+ this.categories = (result.Results ?? []);
1627
+ this.categoryMap.clear();
1628
+ for (const cat of this.categories)
1629
+ this.categoryMap.set(cat.ID, cat);
1630
+ this.flatCategories = this.buildFlatCategories(this.categories);
1631
+ this.categoriesDirty = false;
1632
+ this.cdr.detectChanges();
1633
+ }
1634
+ catch {
1635
+ // Best-effort — the dialog still works with the previously-loaded list.
1636
+ }
1182
1637
  }
1183
1638
  selectEntity(entity) {
1184
1639
  this.selectedEntityId = entity.ID;
@@ -1223,7 +1678,7 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
1223
1678
  try {
1224
1679
  const md = this.ProviderToUse;
1225
1680
  const rv = RunView.FromMetadataProvider(this.ProviderToUse);
1226
- const newList = await md.GetEntityObject('MJ: Lists');
1681
+ const newList = await md.GetEntityObject('MJ: Lists', md.CurrentUser);
1227
1682
  newList.Name = `${listToDuplicate.Name} (Copy)`;
1228
1683
  newList.Description = listToDuplicate.Description;
1229
1684
  newList.EntityID = listToDuplicate.EntityID;
@@ -1234,26 +1689,45 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
1234
1689
  this.notificationService.CreateSimpleNotification('Failed to duplicate list', 'error', 4000);
1235
1690
  return;
1236
1691
  }
1692
+ // BypassCache to avoid any stale RunView cache that might mask members.
1693
+ // High MaxRows to cover large lists; entity_object so we have typed access.
1237
1694
  const itemsResult = await rv.RunView({
1238
1695
  EntityName: 'MJ: List Details',
1239
1696
  ExtraFilter: `ListID = '${listToDuplicate.ID}'`,
1240
- ResultType: 'entity_object'
1697
+ ResultType: 'entity_object',
1698
+ MaxRows: 100000,
1699
+ BypassCache: true
1241
1700
  });
1242
- if (itemsResult.Success && itemsResult.Results.length > 0) {
1243
- let copiedCount = 0;
1244
- for (const item of itemsResult.Results) {
1245
- const newItem = await md.GetEntityObject('MJ: List Details');
1701
+ if (!itemsResult.Success) {
1702
+ console.error('Duplicate: failed to load source list members', itemsResult.ErrorMessage);
1703
+ this.notificationService.CreateSimpleNotification(`Could not load source list members: ${itemsResult.ErrorMessage || 'unknown'}`, 'error', 6000);
1704
+ return;
1705
+ }
1706
+ const sourceItems = itemsResult.Results ?? [];
1707
+ if (sourceItems.length === 0) {
1708
+ this.notificationService.CreateSimpleNotification('List duplicated (source had no records)', 'success', 3000);
1709
+ }
1710
+ else {
1711
+ // Batch all detail inserts into one transaction group so this is
1712
+ // a single round-trip instead of 1-per-row. All-or-nothing: if any
1713
+ // row fails server-side validation the whole group rolls back.
1714
+ const tg = await md.CreateTransactionGroup();
1715
+ for (const item of sourceItems) {
1716
+ const newItem = await md.GetEntityObject('MJ: List Details', md.CurrentUser);
1246
1717
  newItem.ListID = newList.ID;
1247
1718
  newItem.RecordID = item.RecordID;
1248
1719
  newItem.Sequence = item.Sequence;
1249
- const itemSaved = await newItem.Save();
1250
- if (itemSaved)
1251
- copiedCount++;
1720
+ newItem.TransactionGroup = tg;
1721
+ await newItem.Save(); // queued into tg, not sent yet
1722
+ }
1723
+ const submitted = await tg.Submit();
1724
+ if (submitted) {
1725
+ this.notificationService.CreateSimpleNotification(`List duplicated with ${sourceItems.length} item${sourceItems.length !== 1 ? 's' : ''}`, 'success', 3000);
1726
+ }
1727
+ else {
1728
+ console.error('Duplicate: transaction group submit failed');
1729
+ this.notificationService.CreateSimpleNotification(`Duplicated list but failed to copy ${sourceItems.length} items — see console`, 'error', 6000);
1252
1730
  }
1253
- this.notificationService.CreateSimpleNotification(`List duplicated with ${copiedCount} item${copiedCount !== 1 ? 's' : ''}`, 'success', 3000);
1254
- }
1255
- else {
1256
- this.notificationService.CreateSimpleNotification('List duplicated successfully', 'success', 3000);
1257
1731
  }
1258
1732
  await this.loadData();
1259
1733
  }
@@ -1287,9 +1761,31 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
1287
1761
  this.isDeleting = true;
1288
1762
  this.cdr.detectChanges();
1289
1763
  try {
1764
+ // spDeleteList doesn't cascade to MJ: List Details, so the FK
1765
+ // constraint (FK_ListDetail_List) blocks the delete if the list
1766
+ // has any members. Cascade-delete the details first in a
1767
+ // transaction group so the whole thing rolls back if any single
1768
+ // delete fails. The proper long-term fix is a migration that
1769
+ // adds ON DELETE CASCADE (or extends the SP); this keeps the UI
1770
+ // unblocked in the meantime.
1771
+ const cascadeOk = await this.cascadeDeleteListMembers(listToDelete.ID);
1772
+ if (!cascadeOk) {
1773
+ this.notificationService.CreateSimpleNotification(`Failed to delete list members for "${listName}" — list not deleted`, 'error', 6000);
1774
+ return;
1775
+ }
1290
1776
  const deleted = await listToDelete.Delete();
1291
1777
  if (deleted) {
1292
1778
  this.notificationService.CreateSimpleNotification(`"${listName}" deleted`, 'success', 3000);
1779
+ // Optimistic removal from local state so the card disappears
1780
+ // immediately. Without this, the user sees the just-deleted list
1781
+ // until loadData() rebuilds — and worse, can click Delete on it
1782
+ // again (which hangs because the in-memory entity still has the
1783
+ // now-deleted record's ID).
1784
+ const deletedId = listToDelete.ID;
1785
+ this.allLists = this.allLists.filter(item => !UUIDsEqual(item.list.ID, deletedId));
1786
+ this.applyFilters();
1787
+ this.buildCategoryTree();
1788
+ this.cdr.detectChanges();
1293
1789
  }
1294
1790
  else {
1295
1791
  const errorMessage = listToDelete.LatestResult?.Message || 'Unknown error occurred';
@@ -1297,7 +1793,10 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
1297
1793
  this.notificationService.CreateSimpleNotification(`Failed to delete list: ${errorMessage}`, 'error', 6000);
1298
1794
  }
1299
1795
  this.cancelDelete();
1300
- await this.loadData();
1796
+ // Authoritative refresh — loadData() now sets BypassCache: true on
1797
+ // the 'MJ: Lists' RunView, so this no longer races the optimistic
1798
+ // local removal against a stale cache.
1799
+ void this.loadData();
1301
1800
  }
1302
1801
  catch (error) {
1303
1802
  console.error('Error deleting list:', error);
@@ -1309,6 +1808,35 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
1309
1808
  this.cdr.detectChanges();
1310
1809
  }
1311
1810
  }
1811
+ /** Delete every MJ: List Details row for a given list in a single
1812
+ * transaction group. Returns true if everything succeeded (including
1813
+ * the trivial "no members" case). */
1814
+ async cascadeDeleteListMembers(listId) {
1815
+ const md = this.ProviderToUse;
1816
+ const rv = RunView.FromMetadataProvider(md);
1817
+ const lookup = await rv.RunView({
1818
+ EntityName: 'MJ: List Details',
1819
+ ExtraFilter: `ListID='${listId}'`,
1820
+ ResultType: 'entity_object',
1821
+ });
1822
+ if (!lookup.Success) {
1823
+ console.error('Failed to load list details for cascade-delete:', lookup.ErrorMessage);
1824
+ return false;
1825
+ }
1826
+ const details = lookup.Results ?? [];
1827
+ if (details.length === 0)
1828
+ return true;
1829
+ const tg = await md.CreateTransactionGroup();
1830
+ for (const d of details) {
1831
+ d.TransactionGroup = tg;
1832
+ await d.Delete();
1833
+ }
1834
+ const ok = await tg.Submit();
1835
+ if (!ok) {
1836
+ console.error('Cascade-delete transaction failed for list', listId);
1837
+ }
1838
+ return ok;
1839
+ }
1312
1840
  closeCreateDialog() {
1313
1841
  this.showCreateDialog = false;
1314
1842
  this.editingList = null;
@@ -1326,7 +1854,7 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
1326
1854
  list = this.editingList;
1327
1855
  }
1328
1856
  else {
1329
- list = await md.GetEntityObject('MJ: Lists');
1857
+ list = await md.GetEntityObject('MJ: Lists', md.CurrentUser);
1330
1858
  list.UserID = md.CurrentUser.ID;
1331
1859
  list.EntityID = this.selectedEntityId;
1332
1860
  }
@@ -1381,6 +1909,36 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
1381
1909
  this.showShareDialog = false;
1382
1910
  this.shareDialogConfig = null;
1383
1911
  }
1912
+ /** "Manage Invitations" clicked inside the share dialog — opens a
1913
+ * modal hosting `<mj-list-invitations>` for the same list. The
1914
+ * share dialog is closed so dialogs don't visually stack. */
1915
+ onManageInvitations() {
1916
+ if (!this.shareDialogConfig)
1917
+ return;
1918
+ this.activeShareListId = this.shareDialogConfig.listId;
1919
+ this.activeShareListName = this.shareDialogConfig.listName;
1920
+ this.showShareDialog = false;
1921
+ this.showInvitationsDialog = true;
1922
+ this.cdr.detectChanges();
1923
+ }
1924
+ closeInvitationsDialog() {
1925
+ this.showInvitationsDialog = false;
1926
+ this.cdr.detectChanges();
1927
+ }
1928
+ /** "View audit log" link in share dialog. */
1929
+ onViewAuditLog() {
1930
+ if (!this.shareDialogConfig)
1931
+ return;
1932
+ this.activeShareListId = this.shareDialogConfig.listId;
1933
+ this.activeShareListName = this.shareDialogConfig.listName;
1934
+ this.showShareDialog = false;
1935
+ this.showAuditLogDialog = true;
1936
+ this.cdr.detectChanges();
1937
+ }
1938
+ closeAuditLogDialog() {
1939
+ this.showAuditLogDialog = false;
1940
+ this.cdr.detectChanges();
1941
+ }
1384
1942
  async loadSharingInfo() {
1385
1943
  // Load sharing summaries for all lists that the user owns
1386
1944
  const ownedLists = this.allLists.filter(item => item.isOwner);
@@ -1404,107 +1962,98 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
1404
1962
  static ɵfac = function ListsBrowseResource_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ListsBrowseResource)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.TabService), i0.ɵɵdirectiveInject(i2.MJNotificationService), i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i3.ListSharingService)); };
1405
1963
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ListsBrowseResource, selectors: [["mj-lists-browse-resource"]], hostBindings: function ListsBrowseResource_HostBindings(rf, ctx) { if (rf & 1) {
1406
1964
  i0.ɵɵlistener("click", function ListsBrowseResource_click_HostBindingHandler($event) { return ctx.onDocumentClick($event); }, i0.ɵɵresolveDocument)("keydown.escape", function ListsBrowseResource_keydown_escape_HostBindingHandler() { return ctx.onEscapeKey(); }, i0.ɵɵresolveDocument);
1407
- } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 45, vars: 22, consts: [["categoryNodeTemplate", ""], ["entityInput", ""], [1, "lists-browse-container"], [1, "browse-header"], [1, "header-row"], [1, "header-title"], [1, "fa-solid", "fa-list-check"], [1, "btn-create", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "header-actions"], [1, "search-box"], [1, "fa-solid", "fa-search"], ["type", "text", "placeholder", "Search lists...", 3, "ngModelChange", "ngModel"], [1, "clear-search"], [1, "filter-group"], ["title", "Filter by owner", 1, "filter-select", 3, "ngModelChange", "ngModel"], [3, "value"], ["title", "Filter by entity", 1, "filter-select", 3, "ngModelChange", "ngModel"], [1, "view-toggle-group"], ["title", "Table view", 1, "view-toggle", 3, "click"], [1, "fa-solid", "fa-table-list"], ["title", "Card view", 1, "view-toggle", 3, "click"], [1, "fa-solid", "fa-grip"], ["title", "Category view", 1, "view-toggle", 3, "click"], [1, "fa-solid", "fa-folder-tree"], [1, "loading-container"], [1, "empty-state"], [1, "empty-state", "search-empty"], [1, "browse-content"], [1, "context-menu-overlay"], [1, "context-menu", 3, "top", "left"], [1, "modal-overlay"], [1, "modal-dialog"], [1, "modal-dialog", "confirm-dialog"], [3, "config", "visible"], [1, "entity-dropdown-portal", 3, "top", "left", "width", "dropdown-above"], [1, "clear-search", 3, "click"], [1, "fa-solid", "fa-times"], ["text", "Loading lists...", "size", "medium"], [1, "empty-state-icon-wrapper"], [1, "icon-bg"], [1, "empty-state-features"], [1, "feature-item"], [1, "fa-solid", "fa-check-circle"], [1, "btn-create-large", 3, "click"], [1, "empty-state-icon-wrapper", "search"], [1, "fa-solid", "fa-filter-circle-xmark"], [1, "empty-hint"], [1, "btn-clear", 3, "click"], [1, "results-header"], [1, "result-count"], [1, "sort-options"], [1, "filter-select", "sort-select", 3, "ngModelChange", "ngModel"], [1, "lists-table"], ["role", "list", "aria-label", "Lists", 1, "lists-grid"], [1, "category-tree"], ["role", "grid", "aria-label", "Lists table"], ["scope", "col", 1, "col-name"], ["scope", "col", 1, "col-entity"], ["scope", "col", 1, "col-items"], ["scope", "col", 1, "col-sharing"], ["scope", "col", 1, "col-owner"], ["scope", "col", 1, "col-updated"], ["scope", "col", 1, "col-actions"], [1, "sr-only"], ["tabindex", "0", "role", "row", 1, "list-row"], ["tabindex", "0", "role", "row", 1, "list-row", 3, "click", "keydown.enter"], ["role", "gridcell", 1, "col-name"], [1, "name-cell"], ["aria-hidden", "true", 1, "list-icon"], [1, "name-content"], [1, "list-name"], [1, "list-desc"], ["role", "gridcell", 1, "col-entity"], [1, "entity-badge"], ["role", "gridcell", 1, "col-items"], ["role", "gridcell", 1, "col-sharing"], [1, "sharing-private"], ["role", "gridcell", 1, "col-owner"], [1, "owner-name"], ["role", "gridcell", 1, "col-updated"], ["role", "gridcell", 1, "col-actions"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "More options"], [1, "sharing-indicator"], [1, "fa-solid", "fa-share-nodes"], [1, "share-count"], [1, "fa-solid", "fa-lock"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "More options", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-ellipsis-v"], ["tabindex", "0", "role", "listitem", 1, "list-card"], ["tabindex", "0", "role", "listitem", 1, "list-card", 3, "click", "keydown.enter"], [1, "card-header"], ["aria-hidden", "true", 1, "card-icon"], [1, "card-menu"], [1, "card-body"], [1, "card-title"], [1, "card-description"], [1, "card-meta"], [1, "meta-item"], [1, "fa-solid", "fa-database"], [1, "fa-solid", "fa-hashtag"], [1, "card-footer"], [1, "owner-tag"], [1, "fa-solid", "fa-user"], [1, "card-footer-right"], [1, "date-info"], [1, "menu-btn", 3, "click"], [1, "sharing-badge", 3, "title"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "category-section"], [1, "category-header"], [1, "category-header", "uncategorized"], ["role", "list", 1, "category-lists"], [1, "category-header", 3, "click"], [1, "fa-solid", "fa-folder"], [1, "category-name"], [1, "category-count"], [1, "category-header", "uncategorized", 3, "click"], [1, "fa-solid", "fa-inbox"], ["tabindex", "0", "role", "listitem", 1, "list-row", "hierarchy-row"], ["tabindex", "0", "role", "listitem", 1, "list-row", "hierarchy-row", 3, "click", "keydown.enter"], [1, "list-info"], [1, "list-meta"], [1, "list-actions"], ["mjButton", "", "variant", "flat", "size", "sm", 3, "click"], [1, "context-menu-overlay", 3, "click"], [1, "context-menu"], [1, "menu-item", 3, "click"], [1, "fa-solid", "fa-pen"], [1, "fa-solid", "fa-copy"], [1, "menu-divider"], [1, "menu-item", "danger", 3, "click"], [1, "fa-solid", "fa-trash"], [1, "modal-overlay", 3, "click"], [1, "modal-header"], [1, "modal-close", 3, "click"], [1, "modal-body"], [1, "form-group"], ["type", "text", "placeholder", "Enter list name", 1, "form-input", 3, "ngModelChange", "ngModel"], ["placeholder", "Optional description", "rows", "3", 1, "form-input", 3, "ngModelChange", "ngModel"], [1, "form-input", 3, "ngModelChange", "ngModel"], [3, "ngValue"], [1, "modal-footer"], [1, "btn-primary", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "btn-secondary", 3, "click", "disabled"], [1, "custom-select-wrapper"], ["type", "text", "placeholder", "Search and select an entity", 1, "form-input", 3, "ngModelChange", "focus", "ngModel"], ["type", "text", "disabled", "", 1, "form-input", 3, "value"], [1, "warning-text"], [1, "btn-danger", 3, "click", "disabled"], [3, "complete", "cancel", "config", "visible"], [1, "entity-dropdown-portal"], [1, "entity-dropdown-content"], [1, "dropdown-item"], [1, "dropdown-empty"], [1, "dropdown-item", 3, "mousedown"]], template: function ListsBrowseResource_Template(rf, ctx) { if (rf & 1) {
1965
+ } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 34, vars: 29, consts: [["categoryNodeTemplate", ""], ["entityInput", ""], ["Title", "Lists", "Icon", "fa-solid fa-list-check"], ["meta", ""], ["Label", "lists", 3, "Count", "Total"], ["actions", ""], [3, "ClearAllRequested", "ActiveCount", "ShowClearAll"], [3, "ValuesChange", "Reset", "Fields", "Values"], [3, "KeyChange", "Options", "ActiveKey"], [1, "favorite-filter-toggle", 3, "click", "title"], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click"], [1, "fa-solid", "fa-plus"], ["toolbar", ""], ["Placeholder", "Search lists...", 3, "ValueChange", "Value"], [1, "tag-filter-row"], [1, "loading-container"], [1, "empty-state"], [1, "empty-state", "search-empty"], [1, "browse-content"], [1, "context-menu-overlay"], [1, "context-menu", 3, "top", "left"], [1, "modal-overlay"], [1, "modal-dialog"], [1, "modal-dialog", "confirm-dialog"], [3, "config", "visible"], [3, "Visible", "Title", "MinWidth", "Width", "Height"], [1, "entity-dropdown-portal", 3, "top", "left", "width", "dropdown-above"], [1, "tag-filter-row__label"], [1, "fa-solid", "fa-tag"], ["type", "button", 1, "tag-filter-chip"], ["type", "button", 1, "tag-filter-row__clear", 3, "click"], ["type", "button", 1, "tag-filter-chip", 3, "click"], [1, "fa-solid", "fa-xmark"], ["text", "Loading lists...", "size", "medium"], [1, "empty-state-icon-wrapper"], [1, "icon-bg"], [1, "fa-solid", "fa-list-check"], [1, "empty-state-features"], [1, "feature-item"], [1, "fa-solid", "fa-check-circle"], [1, "btn-create-large", 3, "click"], [1, "empty-state-icon-wrapper", "search"], [1, "fa-solid", "fa-filter-circle-xmark"], [1, "empty-hint"], [1, "btn-clear", 3, "click"], [1, "results-header"], [1, "result-count"], [1, "sort-options"], [1, "filter-select", "sort-select", 3, "ngModelChange", "ngModel"], [3, "value"], [1, "lists-table"], ["role", "list", "aria-label", "Lists", 1, "lists-grid"], [1, "category-tree"], ["role", "grid", "aria-label", "Lists table"], ["scope", "col", 1, "col-name"], ["scope", "col", 1, "col-entity"], ["scope", "col", 1, "col-items"], ["scope", "col", 1, "col-sharing"], ["scope", "col", 1, "col-owner"], ["scope", "col", 1, "col-updated"], ["scope", "col", 1, "col-actions"], [1, "sr-only"], ["tabindex", "0", "role", "row", 1, "list-row"], ["tabindex", "0", "role", "row", 1, "list-row", 3, "click", "keydown.enter"], ["role", "gridcell", 1, "col-name"], [1, "name-cell"], ["aria-hidden", "true", 1, "list-icon"], [1, "name-content"], [1, "list-name"], [1, "list-desc"], ["role", "gridcell", 1, "col-entity"], [1, "entity-badge"], ["role", "gridcell", 1, "col-items"], ["role", "gridcell", 1, "col-sharing"], [1, "sharing-private"], ["role", "gridcell", 1, "col-owner"], [1, "owner-name"], ["role", "gridcell", 1, "col-updated"], ["role", "gridcell", 1, "col-actions"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "More options", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-ellipsis-v"], [1, "sharing-indicator"], [1, "fa-solid", "fa-share-nodes"], [1, "share-count"], [1, "fa-solid", "fa-lock"], ["tabindex", "0", "role", "listitem", 1, "list-card"], ["tabindex", "0", "role", "listitem", 1, "list-card", 3, "click", "keydown.enter"], [1, "card-header"], ["aria-hidden", "true", 1, "card-icon"], [1, "favorite-btn", 3, "click", "title"], [1, "card-menu"], [1, "menu-btn", 3, "click"], [1, "card-body"], [1, "card-title"], [1, "card-description"], [1, "card-meta"], [1, "meta-item"], [1, "fa-solid", "fa-database"], [1, "fa-solid", "fa-hashtag"], [1, "card-tags", 3, "click"], ["EntityName", "MJ: Lists", 3, "TagClicked", "Provider", "RecordID", "Editable", "MaxDisplay"], [1, "card-footer"], [1, "owner-tag"], [1, "fa-solid", "fa-user"], [1, "card-footer-right"], [1, "date-info"], [1, "sharing-badge", 3, "title"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "category-section"], [1, "category-header"], [1, "category-header", "uncategorized"], ["role", "list", 1, "category-lists"], [1, "category-header", 3, "click"], [1, "fa-solid", "fa-folder"], [1, "category-name"], [1, "category-count"], [1, "category-header", "uncategorized", 3, "click"], [1, "fa-solid", "fa-inbox"], ["tabindex", "0", "role", "listitem", 1, "list-row", "hierarchy-row"], ["tabindex", "0", "role", "listitem", 1, "list-row", "hierarchy-row", 3, "click", "keydown.enter"], [1, "list-info"], [1, "list-meta"], [1, "list-actions"], ["mjButton", "", "variant", "flat", "size", "sm", 3, "click"], [1, "context-menu-overlay", 3, "click"], [1, "context-menu"], [1, "menu-item"], [1, "menu-item", 3, "click"], [1, "fa-solid", "fa-copy"], [1, "menu-viewer-hint"], [1, "fa-solid", "fa-pen"], [1, "menu-divider"], [1, "menu-item", "danger", 3, "click"], [1, "fa-solid", "fa-trash"], [1, "fa-solid", "fa-eye"], [1, "modal-overlay", 3, "click"], [1, "modal-header"], [1, "modal-close", 3, "click"], [1, "fa-solid", "fa-times"], [1, "modal-body"], [1, "form-group"], ["type", "text", "placeholder", "Enter list name", 1, "form-input", 3, "ngModelChange", "ngModel"], ["placeholder", "Optional description", "rows", "3", 1, "form-input", 3, "ngModelChange", "ngModel"], [1, "form-input", 3, "ngModelChange", "ngModel"], [3, "ngValue"], [1, "modal-footer"], [1, "btn-primary", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "btn-secondary", 3, "click", "disabled"], [1, "custom-select-wrapper"], ["type", "text", "placeholder", "Search and select an entity", 1, "form-input", 3, "ngModelChange", "focus", "ngModel"], ["type", "text", "disabled", "", 1, "form-input", 3, "value"], [1, "warning-text"], [1, "btn-danger", 3, "click", "disabled"], [3, "complete", "cancel", "manageInvitations", "viewAuditLog", "config", "visible"], [3, "Close", "Visible", "Title", "MinWidth", "Width", "Height"], [1, "dialog-content"], [3, "Provider", "ListID", "ListName"], ["mjButton", "", "variant", "outline", 3, "click"], [3, "Provider", "ListID"], [1, "entity-dropdown-portal"], [1, "entity-dropdown-content"], [1, "dropdown-item"], [1, "dropdown-empty"], [1, "dropdown-item", 3, "mousedown"]], template: function ListsBrowseResource_Template(rf, ctx) { if (rf & 1) {
1408
1966
  const _r1 = i0.ɵɵgetCurrentView();
1409
- i0.ɵɵelementStart(0, "div", 2)(1, "div", 3)(2, "div", 4)(3, "div", 5);
1410
- i0.ɵɵelement(4, "i", 6);
1411
- i0.ɵɵelementStart(5, "h2");
1412
- i0.ɵɵtext(6, "Lists");
1967
+ i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 2)(2, "div", 3);
1968
+ i0.ɵɵelement(3, "mj-stat-badge", 4);
1969
+ i0.ɵɵelementEnd();
1970
+ i0.ɵɵelementStart(4, "div", 5)(5, "mj-filter-popover", 6);
1971
+ i0.ɵɵlistener("ClearAllRequested", function ListsBrowseResource_Template_mj_filter_popover_ClearAllRequested_5_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.resetPopoverFilters()); });
1972
+ i0.ɵɵelementStart(6, "mj-filter-panel", 7);
1973
+ i0.ɵɵlistener("ValuesChange", function ListsBrowseResource_Template_mj_filter_panel_ValuesChange_6_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onFilterValuesChange($event)); })("Reset", function ListsBrowseResource_Template_mj_filter_panel_Reset_6_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.resetPopoverFilters()); });
1413
1974
  i0.ɵɵelementEnd()();
1414
- i0.ɵɵelementStart(7, "button", 7);
1415
- i0.ɵɵlistener("click", function ListsBrowseResource_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.createNewList()); });
1416
- i0.ɵɵelement(8, "i", 8);
1417
- i0.ɵɵelementStart(9, "span");
1418
- i0.ɵɵtext(10, "New List");
1419
- i0.ɵɵelementEnd()()();
1420
- i0.ɵɵelementStart(11, "div", 9)(12, "div", 10);
1421
- i0.ɵɵelement(13, "i", 11);
1422
- i0.ɵɵelementStart(14, "input", 12);
1423
- i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Template_input_ngModelChange_14_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.searchTerm, $event) || (ctx.searchTerm = $event); return i0.ɵɵresetView($event); });
1424
- i0.ɵɵlistener("ngModelChange", function ListsBrowseResource_Template_input_ngModelChange_14_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onSearchChange($event)); });
1975
+ i0.ɵɵelementStart(7, "mj-view-toggle", 8);
1976
+ i0.ɵɵlistener("KeyChange", function ListsBrowseResource_Template_mj_view_toggle_KeyChange_7_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.setViewMode($event)); });
1425
1977
  i0.ɵɵelementEnd();
1426
- i0.ɵɵconditionalCreate(15, ListsBrowseResource_Conditional_15_Template, 2, 0, "button", 13);
1978
+ i0.ɵɵelementStart(8, "button", 9);
1979
+ i0.ɵɵlistener("click", function ListsBrowseResource_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.toggleShowOnlyFavorites()); });
1980
+ i0.ɵɵelement(9, "i");
1981
+ i0.ɵɵtext(10, " Favorites ");
1427
1982
  i0.ɵɵelementEnd();
1428
- i0.ɵɵelementStart(16, "div", 14)(17, "select", 15);
1429
- i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Template_select_ngModelChange_17_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.selectedOwner, $event) || (ctx.selectedOwner = $event); return i0.ɵɵresetView($event); });
1430
- i0.ɵɵlistener("ngModelChange", function ListsBrowseResource_Template_select_ngModelChange_17_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onOwnerFilterChange($event)); });
1431
- i0.ɵɵrepeaterCreate(18, ListsBrowseResource_For_19_Template, 2, 2, "option", 16, i0.ɵɵrepeaterTrackByIdentity);
1432
- i0.ɵɵelementEnd()();
1433
- i0.ɵɵelementStart(20, "div", 14)(21, "select", 17);
1434
- i0.ɵɵtwoWayListener("ngModelChange", function ListsBrowseResource_Template_select_ngModelChange_21_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.selectedEntity, $event) || (ctx.selectedEntity = $event); return i0.ɵɵresetView($event); });
1435
- i0.ɵɵlistener("ngModelChange", function ListsBrowseResource_Template_select_ngModelChange_21_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onEntityFilterChange($event)); });
1436
- i0.ɵɵrepeaterCreate(22, ListsBrowseResource_For_23_Template, 2, 2, "option", 16, i0.ɵɵrepeaterTrackByIdentity);
1983
+ i0.ɵɵelementStart(11, "button", 10);
1984
+ i0.ɵɵlistener("click", function ListsBrowseResource_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.createNewList()); });
1985
+ i0.ɵɵelement(12, "i", 11);
1986
+ i0.ɵɵtext(13, " New List ");
1437
1987
  i0.ɵɵelementEnd()();
1438
- i0.ɵɵelementStart(24, "div", 18)(25, "button", 19);
1439
- i0.ɵɵlistener("click", function ListsBrowseResource_Template_button_click_25_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.setViewMode("table")); });
1440
- i0.ɵɵelement(26, "i", 20);
1441
- i0.ɵɵelementEnd();
1442
- i0.ɵɵelementStart(27, "button", 21);
1443
- i0.ɵɵlistener("click", function ListsBrowseResource_Template_button_click_27_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.setViewMode("card")); });
1444
- i0.ɵɵelement(28, "i", 22);
1988
+ i0.ɵɵelementStart(14, "div", 12)(15, "mj-page-search", 13);
1989
+ i0.ɵɵlistener("ValueChange", function ListsBrowseResource_Template_mj_page_search_ValueChange_15_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onSearchChange($event)); });
1990
+ i0.ɵɵelementEnd()()();
1991
+ i0.ɵɵelementStart(16, "mj-page-body");
1992
+ i0.ɵɵconditionalCreate(17, ListsBrowseResource_Conditional_17_Template, 8, 0, "div", 14);
1993
+ i0.ɵɵconditionalCreate(18, ListsBrowseResource_Conditional_18_Template, 2, 0, "div", 15);
1994
+ i0.ɵɵconditionalCreate(19, ListsBrowseResource_Conditional_19_Template, 24, 0, "div", 16);
1995
+ i0.ɵɵconditionalCreate(20, ListsBrowseResource_Conditional_20_Template, 11, 0, "div", 17);
1996
+ i0.ɵɵconditionalCreate(21, ListsBrowseResource_Conditional_21_Template, 13, 6, "div", 18);
1997
+ i0.ɵɵtemplate(22, ListsBrowseResource_ng_template_22_Template, 5, 6, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
1998
+ i0.ɵɵconditionalCreate(24, ListsBrowseResource_Conditional_24_Template, 1, 0, "div", 19);
1999
+ i0.ɵɵconditionalCreate(25, ListsBrowseResource_Conditional_25_Template, 8, 8, "div", 20);
1445
2000
  i0.ɵɵelementEnd();
1446
- i0.ɵɵelementStart(29, "button", 23);
1447
- i0.ɵɵlistener("click", function ListsBrowseResource_Template_button_click_29_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.setViewMode("hierarchy")); });
1448
- i0.ɵɵelement(30, "i", 24);
1449
- i0.ɵɵelementEnd()()()();
1450
- i0.ɵɵconditionalCreate(31, ListsBrowseResource_Conditional_31_Template, 2, 0, "div", 25);
1451
- i0.ɵɵconditionalCreate(32, ListsBrowseResource_Conditional_32_Template, 24, 0, "div", 26);
1452
- i0.ɵɵconditionalCreate(33, ListsBrowseResource_Conditional_33_Template, 11, 0, "div", 27);
1453
- i0.ɵɵconditionalCreate(34, ListsBrowseResource_Conditional_34_Template, 13, 6, "div", 28);
1454
- i0.ɵɵtemplate(35, ListsBrowseResource_ng_template_35_Template, 5, 6, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
1455
- i0.ɵɵconditionalCreate(37, ListsBrowseResource_Conditional_37_Template, 1, 0, "div", 29);
1456
- i0.ɵɵconditionalCreate(38, ListsBrowseResource_Conditional_38_Template, 14, 4, "div", 30);
1457
- i0.ɵɵconditionalCreate(39, ListsBrowseResource_Conditional_39_Template, 1, 0, "div", 31);
1458
- i0.ɵɵconditionalCreate(40, ListsBrowseResource_Conditional_40_Template, 31, 11, "div", 32);
1459
- i0.ɵɵconditionalCreate(41, ListsBrowseResource_Conditional_41_Template, 1, 0, "div", 31);
1460
- i0.ɵɵconditionalCreate(42, ListsBrowseResource_Conditional_42_Template, 20, 5, "div", 33);
1461
- i0.ɵɵconditionalCreate(43, ListsBrowseResource_Conditional_43_Template, 1, 2, "mj-list-share-dialog", 34);
1462
- i0.ɵɵconditionalCreate(44, ListsBrowseResource_Conditional_44_Template, 5, 11, "div", 35);
2001
+ i0.ɵɵconditionalCreate(26, ListsBrowseResource_Conditional_26_Template, 1, 0, "div", 21);
2002
+ i0.ɵɵconditionalCreate(27, ListsBrowseResource_Conditional_27_Template, 31, 11, "div", 22);
2003
+ i0.ɵɵconditionalCreate(28, ListsBrowseResource_Conditional_28_Template, 1, 0, "div", 21);
2004
+ i0.ɵɵconditionalCreate(29, ListsBrowseResource_Conditional_29_Template, 20, 5, "div", 23);
2005
+ i0.ɵɵconditionalCreate(30, ListsBrowseResource_Conditional_30_Template, 1, 2, "mj-list-share-dialog", 24);
2006
+ i0.ɵɵconditionalCreate(31, ListsBrowseResource_Conditional_31_Template, 6, 8, "mj-dialog", 25);
2007
+ i0.ɵɵconditionalCreate(32, ListsBrowseResource_Conditional_32_Template, 6, 7, "mj-dialog", 25);
2008
+ i0.ɵɵconditionalCreate(33, ListsBrowseResource_Conditional_33_Template, 5, 11, "div", 26);
1463
2009
  i0.ɵɵelementEnd();
1464
2010
  } if (rf & 2) {
1465
- i0.ɵɵadvance(14);
1466
- i0.ɵɵtwoWayProperty("ngModel", ctx.searchTerm);
1467
- i0.ɵɵadvance();
1468
- i0.ɵɵconditional(ctx.searchTerm ? 15 : -1);
2011
+ i0.ɵɵadvance(3);
2012
+ i0.ɵɵproperty("Count", ctx.filteredLists.length)("Total", ctx.allLists.length);
1469
2013
  i0.ɵɵadvance(2);
1470
- i0.ɵɵtwoWayProperty("ngModel", ctx.selectedOwner);
2014
+ i0.ɵɵproperty("ActiveCount", ctx.ActiveFilterCount)("ShowClearAll", ctx.ActiveFilterCount > 0);
1471
2015
  i0.ɵɵadvance();
1472
- i0.ɵɵrepeater(ctx.ownerOptions);
1473
- i0.ɵɵadvance(3);
1474
- i0.ɵɵtwoWayProperty("ngModel", ctx.selectedEntity);
2016
+ i0.ɵɵproperty("Fields", ctx.listFilterFields)("Values", ctx.listFilterValues);
1475
2017
  i0.ɵɵadvance();
1476
- i0.ɵɵrepeater(ctx.entityOptions);
1477
- i0.ɵɵadvance(3);
1478
- i0.ɵɵclassProp("active", ctx.viewMode === "table");
1479
- i0.ɵɵadvance(2);
1480
- i0.ɵɵclassProp("active", ctx.viewMode === "card");
1481
- i0.ɵɵadvance(2);
1482
- i0.ɵɵclassProp("active", ctx.viewMode === "hierarchy");
2018
+ i0.ɵɵproperty("Options", ctx.listViewOptions)("ActiveKey", ctx.viewMode);
2019
+ i0.ɵɵadvance();
2020
+ i0.ɵɵclassProp("favorite-filter-toggle--active", ctx.showOnlyFavorites);
2021
+ i0.ɵɵproperty("title", ctx.showOnlyFavorites ? "Showing favorites only" : "Show all lists");
2022
+ i0.ɵɵadvance();
2023
+ i0.ɵɵclassMap(ctx.showOnlyFavorites ? "fa-solid fa-star" : "fa-regular fa-star");
2024
+ i0.ɵɵadvance(6);
2025
+ i0.ɵɵproperty("Value", ctx.searchTerm);
1483
2026
  i0.ɵɵadvance(2);
1484
- i0.ɵɵconditional(ctx.isLoading ? 31 : -1);
2027
+ i0.ɵɵconditional(ctx.tagFilters.length > 0 ? 17 : -1);
2028
+ i0.ɵɵadvance();
2029
+ i0.ɵɵconditional(ctx.isLoading ? 18 : -1);
1485
2030
  i0.ɵɵadvance();
1486
- i0.ɵɵconditional(!ctx.isLoading && ctx.allLists.length === 0 ? 32 : -1);
2031
+ i0.ɵɵconditional(!ctx.isLoading && ctx.allLists.length === 0 ? 19 : -1);
1487
2032
  i0.ɵɵadvance();
1488
- i0.ɵɵconditional(!ctx.isLoading && ctx.allLists.length > 0 && ctx.filteredLists.length === 0 ? 33 : -1);
2033
+ i0.ɵɵconditional(!ctx.isLoading && ctx.allLists.length > 0 && ctx.filteredLists.length === 0 ? 20 : -1);
1489
2034
  i0.ɵɵadvance();
1490
- i0.ɵɵconditional(!ctx.isLoading && ctx.filteredLists.length > 0 ? 34 : -1);
2035
+ i0.ɵɵconditional(!ctx.isLoading && ctx.filteredLists.length > 0 ? 21 : -1);
1491
2036
  i0.ɵɵadvance(3);
1492
- i0.ɵɵconditional(ctx.showContextMenu ? 37 : -1);
2037
+ i0.ɵɵconditional(ctx.showContextMenu ? 24 : -1);
2038
+ i0.ɵɵadvance();
2039
+ i0.ɵɵconditional(ctx.showContextMenu ? 25 : -1);
2040
+ i0.ɵɵadvance();
2041
+ i0.ɵɵconditional(ctx.showCreateDialog ? 26 : -1);
1493
2042
  i0.ɵɵadvance();
1494
- i0.ɵɵconditional(ctx.showContextMenu ? 38 : -1);
2043
+ i0.ɵɵconditional(ctx.showCreateDialog ? 27 : -1);
1495
2044
  i0.ɵɵadvance();
1496
- i0.ɵɵconditional(ctx.showCreateDialog ? 39 : -1);
2045
+ i0.ɵɵconditional(ctx.showDeleteConfirm ? 28 : -1);
1497
2046
  i0.ɵɵadvance();
1498
- i0.ɵɵconditional(ctx.showCreateDialog ? 40 : -1);
2047
+ i0.ɵɵconditional(ctx.showDeleteConfirm ? 29 : -1);
1499
2048
  i0.ɵɵadvance();
1500
- i0.ɵɵconditional(ctx.showDeleteConfirm ? 41 : -1);
2049
+ i0.ɵɵconditional(ctx.shareDialogConfig ? 30 : -1);
1501
2050
  i0.ɵɵadvance();
1502
- i0.ɵɵconditional(ctx.showDeleteConfirm ? 42 : -1);
2051
+ i0.ɵɵconditional(ctx.showInvitationsDialog && ctx.activeShareListId ? 31 : -1);
1503
2052
  i0.ɵɵadvance();
1504
- i0.ɵɵconditional(ctx.shareDialogConfig ? 43 : -1);
2053
+ i0.ɵɵconditional(ctx.showAuditLogDialog && ctx.activeShareListId ? 32 : -1);
1505
2054
  i0.ɵɵadvance();
1506
- i0.ɵɵconditional(ctx.showEntityDropdown && !ctx.editingList ? 44 : -1);
1507
- } }, dependencies: [i4.NgTemplateOutlet, i5.NgSelectOption, i5.ɵNgSelectMultipleOption, i5.DefaultValueAccessor, i5.SelectControlValueAccessor, i5.NgControlStatus, i5.NgModel, i6.MJButtonDirective, i7.LoadingComponent, i3.ListShareDialogComponent], 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 "], encapsulation: 2 });
2055
+ i0.ɵɵconditional(ctx.showEntityDropdown && !ctx.editingList ? 33 : -1);
2056
+ } }, dependencies: [i4.NgTemplateOutlet, i5.NgSelectOption, i5.ɵNgSelectMultipleOption, i5.DefaultValueAccessor, i5.SelectControlValueAccessor, i5.NgControlStatus, i5.NgModel, i6.MJButtonDirective, i6.MJDialogComponent, i6.MJDialogActionsComponent, i6.MJPageLayoutComponent, i6.MJPageHeaderComponent, i6.MJPageBodyComponent, i6.MJPageSearchComponent, i6.MJFilterPopoverComponent, i6.MJFilterPanelComponent, i6.MJViewToggleComponent, i6.MJStatBadgeComponent, i7.LoadingComponent, i3.ListAuditLogComponent, i3.ListInvitationsComponent, i3.ListShareDialogComponent, i3.TagChipsComponent], 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 "], encapsulation: 2 });
1508
2057
  };
1509
2058
  ListsBrowseResource = __decorate([
1510
2059
  RegisterClass(BaseResourceComponent, 'ListsBrowseResource')
@@ -1513,92 +2062,91 @@ export { ListsBrowseResource };
1513
2062
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ListsBrowseResource, [{
1514
2063
  type: Component,
1515
2064
  args: [{ standalone: false, selector: 'mj-lists-browse-resource', template: `
1516
- <div class="lists-browse-container">
1517
- <!-- Header -->
1518
- <div class="browse-header">
1519
- <div class="header-row">
1520
- <div class="header-title">
1521
- <i class="fa-solid fa-list-check"></i>
1522
- <h2>Lists</h2>
1523
- </div>
1524
- <button class="btn-create" (click)="createNewList()">
1525
- <i class="fa-solid fa-plus"></i>
1526
- <span>New List</span>
2065
+ <mj-page-layout>
2066
+ <mj-page-header Title="Lists" Icon="fa-solid fa-list-check">
2067
+ <!-- X-of-Y filtered count earns its meta spot per chrome conventions §2. -->
2068
+ <div meta>
2069
+ <mj-stat-badge
2070
+ [Count]="filteredLists.length"
2071
+ [Total]="allLists.length"
2072
+ Label="lists">
2073
+ </mj-stat-badge>
2074
+ </div>
2075
+ <div actions>
2076
+ <mj-filter-popover
2077
+ [ActiveCount]="ActiveFilterCount"
2078
+ [ShowClearAll]="ActiveFilterCount > 0"
2079
+ (ClearAllRequested)="resetPopoverFilters()">
2080
+ <mj-filter-panel
2081
+ [Fields]="listFilterFields"
2082
+ [Values]="listFilterValues"
2083
+ (ValuesChange)="onFilterValuesChange($event)"
2084
+ (Reset)="resetPopoverFilters()">
2085
+ </mj-filter-panel>
2086
+ </mj-filter-popover>
2087
+
2088
+ <mj-view-toggle
2089
+ [Options]="listViewOptions"
2090
+ [ActiveKey]="viewMode"
2091
+ (KeyChange)="setViewMode($any($event))">
2092
+ </mj-view-toggle>
2093
+
2094
+ <!-- Favorites-only toggle (Phase 5.3). Sits next to the view toggle
2095
+ so it reads as "filter scope" alongside view mode. -->
2096
+ <button
2097
+ class="favorite-filter-toggle"
2098
+ [class.favorite-filter-toggle--active]="showOnlyFavorites"
2099
+ (click)="toggleShowOnlyFavorites()"
2100
+ [title]="showOnlyFavorites ? 'Showing favorites only' : 'Show all lists'">
2101
+ <i [class]="showOnlyFavorites ? 'fa-solid fa-star' : 'fa-regular fa-star'"></i>
2102
+ Favorites
2103
+ </button>
2104
+
2105
+ <button mjButton variant="primary" size="sm" (click)="createNewList()">
2106
+ <i class="fa-solid fa-plus"></i> New List
1527
2107
  </button>
1528
2108
  </div>
2109
+ <div toolbar>
2110
+ <mj-page-search
2111
+ Placeholder="Search lists..."
2112
+ [Value]="searchTerm"
2113
+ (ValueChange)="onSearchChange($event)">
2114
+ </mj-page-search>
2115
+ </div>
2116
+ </mj-page-header>
2117
+
2118
+ <mj-page-body>
1529
2119
 
1530
- <div class="header-actions">
1531
- <div class="search-box">
1532
- <i class="fa-solid fa-search"></i>
1533
- <input
1534
- type="text"
1535
- placeholder="Search lists..."
1536
- [(ngModel)]="searchTerm"
1537
- (ngModelChange)="onSearchChange($event)" />
1538
- @if (searchTerm) {
1539
- <button class="clear-search" (click)="clearSearch()">
1540
- <i class="fa-solid fa-times"></i>
1541
- </button>
1542
- }
1543
- </div>
1544
-
1545
- <div class="filter-group">
1546
- <select
1547
- [(ngModel)]="selectedOwner"
1548
- (ngModelChange)="onOwnerFilterChange($event)"
1549
- class="filter-select"
1550
- title="Filter by owner">
1551
- @for (opt of ownerOptions; track opt) {
1552
- <option [value]="opt.value">{{opt.name}}</option>
1553
- }
1554
- </select>
1555
- </div>
1556
-
1557
- <div class="filter-group">
1558
- <select
1559
- [(ngModel)]="selectedEntity"
1560
- (ngModelChange)="onEntityFilterChange($event)"
1561
- class="filter-select"
1562
- title="Filter by entity">
1563
- @for (opt of entityOptions; track opt) {
1564
- <option [value]="opt.value">{{opt.name}}</option>
1565
- }
1566
- </select>
1567
- </div>
1568
-
1569
- <div class="view-toggle-group">
1570
- <button
1571
- class="view-toggle"
1572
- [class.active]="viewMode === 'table'"
1573
- (click)="setViewMode('table')"
1574
- title="Table view">
1575
- <i class="fa-solid fa-table-list"></i>
1576
- </button>
1577
- <button
1578
- class="view-toggle"
1579
- [class.active]="viewMode === 'card'"
1580
- (click)="setViewMode('card')"
1581
- title="Card view">
1582
- <i class="fa-solid fa-grip"></i>
1583
- </button>
2120
+ <!-- Active tag filters (Phase 4.3). Renders only when at least one
2121
+ tag is active — multi-tag = AND. Clicking a chip's × removes it. -->
2122
+ @if (tagFilters.length > 0) {
2123
+ <div class="tag-filter-row">
2124
+ <span class="tag-filter-row__label">
2125
+ <i class="fa-solid fa-tag"></i>
2126
+ Filtering by tag:
2127
+ </span>
2128
+ @for (f of tagFilters; track f.TagID) {
1584
2129
  <button
1585
- class="view-toggle"
1586
- [class.active]="viewMode === 'hierarchy'"
1587
- (click)="setViewMode('hierarchy')"
1588
- title="Category view">
1589
- <i class="fa-solid fa-folder-tree"></i>
2130
+ class="tag-filter-chip"
2131
+ type="button"
2132
+ (click)="removeTagFilter(f.TagID)">
2133
+ {{ f.Name }}
2134
+ <i class="fa-solid fa-xmark"></i>
1590
2135
  </button>
1591
- </div>
2136
+ }
2137
+ <button class="tag-filter-row__clear" type="button" (click)="clearTagFilters()">
2138
+ Clear all
2139
+ </button>
1592
2140
  </div>
1593
- </div>
1594
-
2141
+ }
2142
+
1595
2143
  <!-- Loading State -->
1596
2144
  @if (isLoading) {
1597
2145
  <div class="loading-container">
1598
2146
  <mj-loading text="Loading lists..." size="medium"></mj-loading>
1599
2147
  </div>
1600
2148
  }
1601
-
2149
+
1602
2150
  <!-- Empty State - No Lists -->
1603
2151
  @if (!isLoading && allLists.length === 0) {
1604
2152
  <div class="empty-state">
@@ -1726,15 +2274,13 @@ export { ListsBrowseResource };
1726
2274
  </td>
1727
2275
  <td class="col-updated" role="gridcell">{{formatDate(item.list.__mj_UpdatedAt)}}</td>
1728
2276
  <td class="col-actions" role="gridcell">
1729
- @if (item.isOwner) {
1730
- <button mjButton
1731
- variant="flat"
1732
- size="sm"
1733
- (click)="openListMenu($event, item)"
1734
- title="More options">
1735
- <i class="fa-solid fa-ellipsis-v" aria-hidden="true"></i>
1736
- </button>
1737
- }
2277
+ <button mjButton
2278
+ variant="flat"
2279
+ size="sm"
2280
+ (click)="openListMenu($event, item)"
2281
+ title="More options">
2282
+ <i class="fa-solid fa-ellipsis-v" aria-hidden="true"></i>
2283
+ </button>
1738
2284
  </td>
1739
2285
  </tr>
1740
2286
  }
@@ -1756,13 +2302,18 @@ export { ListsBrowseResource };
1756
2302
  <div class="card-icon" [style.background-color]="getEntityColor(item.entityName)" aria-hidden="true">
1757
2303
  <i [class]="getEntityIcon(item.entityName)"></i>
1758
2304
  </div>
1759
- @if (item.isOwner) {
1760
- <div class="card-menu">
1761
- <button class="menu-btn" (click)="openListMenu($event, item)">
1762
- <i class="fa-solid fa-ellipsis-v" aria-hidden="true"></i>
1763
- </button>
1764
- </div>
1765
- }
2305
+ <button
2306
+ class="favorite-btn"
2307
+ [class.favorite-btn--active]="isFavorite(item.list.ID)"
2308
+ (click)="toggleFavorite($event, item)"
2309
+ [title]="isFavorite(item.list.ID) ? 'Remove from favorites' : 'Add to favorites'">
2310
+ <i [class]="isFavorite(item.list.ID) ? 'fa-solid fa-star' : 'fa-regular fa-star'"></i>
2311
+ </button>
2312
+ <div class="card-menu">
2313
+ <button class="menu-btn" (click)="openListMenu($event, item)">
2314
+ <i class="fa-solid fa-ellipsis-v" aria-hidden="true"></i>
2315
+ </button>
2316
+ </div>
1766
2317
  </div>
1767
2318
  <div class="card-body">
1768
2319
  <h3 class="card-title">{{item.list.Name}}</h3>
@@ -1779,6 +2330,20 @@ export { ListsBrowseResource };
1779
2330
  {{item.itemCount}} item{{item.itemCount !== 1 ? 's' : ''}}
1780
2331
  </span>
1781
2332
  </div>
2333
+ <!-- Tag chips (Phase 4). Read-only on cards; click adds the
2334
+ tag to the filter row above. We stop propagation on
2335
+ the wrapper so clicks on chips don't also fire the
2336
+ card's openList handler. -->
2337
+ <div class="card-tags" (click)="$event.stopPropagation()">
2338
+ <mj-tag-chips
2339
+ [Provider]="Provider"
2340
+ EntityName="MJ: Lists"
2341
+ [RecordID]="item.list.ID"
2342
+ [Editable]="false"
2343
+ [MaxDisplay]="3"
2344
+ (TagClicked)="onCardTagClicked($event)">
2345
+ </mj-tag-chips>
2346
+ </div>
1782
2347
  </div>
1783
2348
  <div class="card-footer">
1784
2349
  <span class="owner-tag" [class.is-me]="item.isOwner">
@@ -1860,13 +2425,11 @@ export { ListsBrowseResource };
1860
2425
  }
1861
2426
  </span>
1862
2427
  </div>
1863
- @if (item.isOwner) {
1864
- <div class="list-actions">
1865
- <button mjButton variant="flat" size="sm" (click)="openListMenu($event, item)">
1866
- <i class="fa-solid fa-ellipsis-v" aria-hidden="true"></i>
1867
- </button>
1868
- </div>
1869
- }
2428
+ <div class="list-actions">
2429
+ <button mjButton variant="flat" size="sm" (click)="openListMenu($event, item)">
2430
+ <i class="fa-solid fa-ellipsis-v" aria-hidden="true"></i>
2431
+ </button>
2432
+ </div>
1870
2433
  </div>
1871
2434
  }
1872
2435
  </div>
@@ -1881,32 +2444,53 @@ export { ListsBrowseResource };
1881
2444
  </div>
1882
2445
  </ng-template>
1883
2446
 
1884
- <!-- Context Menu -->
2447
+ <!-- Context Menu (Phase 2.8 viewer-perspective gating).
2448
+ Items shown depend on contextItemCapabilities, resolved lazily
2449
+ on menu open. Viewers (no Edit/Share/Delete) still see
2450
+ Duplicate. Server-side enforcement remains source of truth;
2451
+ hiding is just UX so users don't see buttons that would fail. -->
1885
2452
  @if (showContextMenu) {
1886
2453
  <div class="context-menu-overlay" (click)="closeContextMenu()"></div>
1887
2454
  }
1888
2455
  @if (showContextMenu) {
1889
2456
  <div class="context-menu" [style.top.px]="contextMenuY" [style.left.px]="contextMenuX">
1890
- <button class="menu-item" (click)="editList()">
1891
- <i class="fa-solid fa-pen"></i>
1892
- Edit
1893
- </button>
1894
- <button class="menu-item" (click)="openShareDialog()">
1895
- <i class="fa-solid fa-share-nodes"></i>
1896
- Share
1897
- </button>
2457
+ @if (contextItemCapabilities.CanEdit) {
2458
+ <button class="menu-item" (click)="editList()">
2459
+ <i class="fa-solid fa-pen"></i>
2460
+ Edit
2461
+ </button>
2462
+ }
2463
+ @if (contextItemCapabilities.CanShare) {
2464
+ <button class="menu-item" (click)="openShareDialog()">
2465
+ <i class="fa-solid fa-share-nodes"></i>
2466
+ Share
2467
+ </button>
2468
+ }
1898
2469
  <button class="menu-item" (click)="duplicateList()">
1899
2470
  <i class="fa-solid fa-copy"></i>
1900
2471
  Duplicate
1901
2472
  </button>
1902
- <div class="menu-divider"></div>
1903
- <button class="menu-item danger" (click)="confirmDeleteList()">
1904
- <i class="fa-solid fa-trash"></i>
1905
- Delete
1906
- </button>
2473
+ @if (contextItemCapabilities.CanDelete) {
2474
+ <div class="menu-divider"></div>
2475
+ <button class="menu-item danger" (click)="confirmDeleteList()">
2476
+ <i class="fa-solid fa-trash"></i>
2477
+ Delete
2478
+ </button>
2479
+ }
2480
+ @if (!contextItemCapabilities.CanEdit && !contextItemCapabilities.CanShare && !contextItemCapabilities.CanDelete) {
2481
+ <div class="menu-viewer-hint">
2482
+ <i class="fa-solid fa-eye"></i>
2483
+ Viewer access — read only
2484
+ </div>
2485
+ }
1907
2486
  </div>
1908
2487
  }
1909
-
2488
+ </mj-page-body>
2489
+
2490
+ <!-- Modals/overlays live outside mj-page-body so its stacking context
2491
+ doesn't trap them. Position:fixed overlays would otherwise render
2492
+ behind a sibling overlay div, which silently closes the dialog on
2493
+ any click. -->
1910
2494
  <!-- Create/Edit Dialog -->
1911
2495
  @if (showCreateDialog) {
1912
2496
  <div class="modal-overlay" (click)="closeCreateDialog()"></div>
@@ -2016,9 +2600,54 @@ export { ListsBrowseResource };
2016
2600
  [config]="shareDialogConfig"
2017
2601
  [visible]="showShareDialog"
2018
2602
  (complete)="onShareComplete($event)"
2019
- (cancel)="onShareCancel()">
2603
+ (cancel)="onShareCancel()"
2604
+ (manageInvitations)="onManageInvitations()"
2605
+ (viewAuditLog)="onViewAuditLog()">
2020
2606
  </mj-list-share-dialog>
2021
2607
  }
2608
+
2609
+ <!-- Invitations Dialog (mockup 16) -->
2610
+ @if (showInvitationsDialog && activeShareListId) {
2611
+ <mj-dialog
2612
+ [Visible]="true"
2613
+ [Title]="'Invitations — ' + (activeShareListName ?? 'List')"
2614
+ (Close)="closeInvitationsDialog()"
2615
+ [MinWidth]="640"
2616
+ [Width]="900"
2617
+ [Height]="640">
2618
+ <div class="dialog-content">
2619
+ <mj-list-invitations
2620
+ [Provider]="ProviderToUse"
2621
+ [ListID]="activeShareListId"
2622
+ [ListName]="activeShareListName">
2623
+ </mj-list-invitations>
2624
+ </div>
2625
+ <mj-dialog-actions>
2626
+ <button mjButton (click)="closeInvitationsDialog()" variant="outline">Close</button>
2627
+ </mj-dialog-actions>
2628
+ </mj-dialog>
2629
+ }
2630
+
2631
+ <!-- Audit Log Dialog (mockup 18) -->
2632
+ @if (showAuditLogDialog && activeShareListId) {
2633
+ <mj-dialog
2634
+ [Visible]="true"
2635
+ [Title]="'Audit Log — ' + (activeShareListName ?? 'List')"
2636
+ (Close)="closeAuditLogDialog()"
2637
+ [MinWidth]="720"
2638
+ [Width]="980"
2639
+ [Height]="680">
2640
+ <div class="dialog-content">
2641
+ <mj-list-audit-log
2642
+ [Provider]="ProviderToUse"
2643
+ [ListID]="activeShareListId">
2644
+ </mj-list-audit-log>
2645
+ </div>
2646
+ <mj-dialog-actions>
2647
+ <button mjButton (click)="closeAuditLogDialog()" variant="outline">Close</button>
2648
+ </mj-dialog-actions>
2649
+ </mj-dialog>
2650
+ }
2022
2651
 
2023
2652
  <!-- Entity Dropdown Portal -->
2024
2653
  @if (showEntityDropdown && !editingList) {
@@ -2044,8 +2673,8 @@ export { ListsBrowseResource };
2044
2673
  </div>
2045
2674
  </div>
2046
2675
  }
2047
- </div>
2048
- `, encapsulation: ViewEncapsulation.None, 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 "] }]
2676
+ </mj-page-layout>
2677
+ `, encapsulation: ViewEncapsulation.None, 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 "] }]
2049
2678
  }], () => [{ type: i0.ChangeDetectorRef }, { type: i1.TabService }, { type: i2.MJNotificationService }, { type: i0.ElementRef }, { type: i3.ListSharingService }], { onDocumentClick: [{
2050
2679
  type: HostListener,
2051
2680
  args: ['document:click', ['$event']]
@@ -2053,5 +2682,5 @@ export { ListsBrowseResource };
2053
2682
  type: HostListener,
2054
2683
  args: ['document:keydown.escape']
2055
2684
  }] }); })();
2056
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ListsBrowseResource, { className: "ListsBrowseResource", filePath: "src/Lists/components/lists-browse-resource.component.ts", lineNumber: 1666 }); })();
2685
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ListsBrowseResource, { className: "ListsBrowseResource", filePath: "src/Lists/components/lists-browse-resource.component.ts", lineNumber: 1866 }); })();
2057
2686
  //# sourceMappingURL=lists-browse-resource.component.js.map