@memberjunction/ng-conversations 5.40.2 → 5.42.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 (391) hide show
  1. package/README.md +57 -0
  2. package/dist/__tests__/channel-optional-surface.test.d.ts +2 -0
  3. package/dist/__tests__/channel-optional-surface.test.d.ts.map +1 -0
  4. package/dist/__tests__/channel-optional-surface.test.js +53 -0
  5. package/dist/__tests__/channel-optional-surface.test.js.map +1 -0
  6. package/dist/__tests__/chat-events.test.d.ts +14 -0
  7. package/dist/__tests__/chat-events.test.d.ts.map +1 -0
  8. package/dist/__tests__/chat-events.test.js +109 -0
  9. package/dist/__tests__/chat-events.test.js.map +1 -0
  10. package/dist/__tests__/conversation-naming.test.d.ts +2 -0
  11. package/dist/__tests__/conversation-naming.test.d.ts.map +1 -0
  12. package/dist/__tests__/conversation-naming.test.js +110 -0
  13. package/dist/__tests__/conversation-naming.test.js.map +1 -0
  14. package/dist/__tests__/delegation-result-parser.test.d.ts +2 -0
  15. package/dist/__tests__/delegation-result-parser.test.d.ts.map +1 -0
  16. package/dist/__tests__/delegation-result-parser.test.js +107 -0
  17. package/dist/__tests__/delegation-result-parser.test.js.map +1 -0
  18. package/dist/__tests__/event-wiring.test.d.ts +15 -0
  19. package/dist/__tests__/event-wiring.test.d.ts.map +1 -0
  20. package/dist/__tests__/event-wiring.test.js +100 -0
  21. package/dist/__tests__/event-wiring.test.js.map +1 -0
  22. package/dist/__tests__/narration-template.test.d.ts +2 -0
  23. package/dist/__tests__/narration-template.test.d.ts.map +1 -0
  24. package/dist/__tests__/narration-template.test.js +76 -0
  25. package/dist/__tests__/narration-template.test.js.map +1 -0
  26. package/dist/__tests__/realtime-agent-picker-models.test.d.ts +2 -0
  27. package/dist/__tests__/realtime-agent-picker-models.test.d.ts.map +1 -0
  28. package/dist/__tests__/realtime-agent-picker-models.test.js +49 -0
  29. package/dist/__tests__/realtime-agent-picker-models.test.js.map +1 -0
  30. package/dist/__tests__/realtime-audio-visuals.test.d.ts +2 -0
  31. package/dist/__tests__/realtime-audio-visuals.test.d.ts.map +1 -0
  32. package/dist/__tests__/realtime-audio-visuals.test.js +123 -0
  33. package/dist/__tests__/realtime-audio-visuals.test.js.map +1 -0
  34. package/dist/__tests__/realtime-delegation-card-cancel.test.d.ts +2 -0
  35. package/dist/__tests__/realtime-delegation-card-cancel.test.d.ts.map +1 -0
  36. package/dist/__tests__/realtime-delegation-card-cancel.test.js +48 -0
  37. package/dist/__tests__/realtime-delegation-card-cancel.test.js.map +1 -0
  38. package/dist/__tests__/realtime-disclosure.test.d.ts +2 -0
  39. package/dist/__tests__/realtime-disclosure.test.d.ts.map +1 -0
  40. package/dist/__tests__/realtime-disclosure.test.js +164 -0
  41. package/dist/__tests__/realtime-disclosure.test.js.map +1 -0
  42. package/dist/__tests__/realtime-pairing.test.d.ts +2 -0
  43. package/dist/__tests__/realtime-pairing.test.d.ts.map +1 -0
  44. package/dist/__tests__/realtime-pairing.test.js +207 -0
  45. package/dist/__tests__/realtime-pairing.test.js.map +1 -0
  46. package/dist/__tests__/realtime-review-lifecycle.test.d.ts +2 -0
  47. package/dist/__tests__/realtime-review-lifecycle.test.d.ts.map +1 -0
  48. package/dist/__tests__/realtime-review-lifecycle.test.js +154 -0
  49. package/dist/__tests__/realtime-review-lifecycle.test.js.map +1 -0
  50. package/dist/__tests__/realtime-session-cancel-usage.test.d.ts +2 -0
  51. package/dist/__tests__/realtime-session-cancel-usage.test.d.ts.map +1 -0
  52. package/dist/__tests__/realtime-session-cancel-usage.test.js +230 -0
  53. package/dist/__tests__/realtime-session-cancel-usage.test.js.map +1 -0
  54. package/dist/__tests__/realtime-session-channels.test.d.ts +2 -0
  55. package/dist/__tests__/realtime-session-channels.test.d.ts.map +1 -0
  56. package/dist/__tests__/realtime-session-channels.test.js +252 -0
  57. package/dist/__tests__/realtime-session-channels.test.js.map +1 -0
  58. package/dist/__tests__/realtime-session-client-tools.test.d.ts +2 -0
  59. package/dist/__tests__/realtime-session-client-tools.test.d.ts.map +1 -0
  60. package/dist/__tests__/realtime-session-client-tools.test.js +103 -0
  61. package/dist/__tests__/realtime-session-client-tools.test.js.map +1 -0
  62. package/dist/__tests__/realtime-session-minimized.test.d.ts +2 -0
  63. package/dist/__tests__/realtime-session-minimized.test.d.ts.map +1 -0
  64. package/dist/__tests__/realtime-session-minimized.test.js +32 -0
  65. package/dist/__tests__/realtime-session-minimized.test.js.map +1 -0
  66. package/dist/__tests__/realtime-session-mint.test.d.ts +2 -0
  67. package/dist/__tests__/realtime-session-mint.test.d.ts.map +1 -0
  68. package/dist/__tests__/realtime-session-mint.test.js +69 -0
  69. package/dist/__tests__/realtime-session-mint.test.js.map +1 -0
  70. package/dist/__tests__/realtime-session-policy.test.d.ts +2 -0
  71. package/dist/__tests__/realtime-session-policy.test.d.ts.map +1 -0
  72. package/dist/__tests__/realtime-session-policy.test.js +303 -0
  73. package/dist/__tests__/realtime-session-policy.test.js.map +1 -0
  74. package/dist/__tests__/realtime-session-review.service.test.d.ts +2 -0
  75. package/dist/__tests__/realtime-session-review.service.test.d.ts.map +1 -0
  76. package/dist/__tests__/realtime-session-review.service.test.js +743 -0
  77. package/dist/__tests__/realtime-session-review.service.test.js.map +1 -0
  78. package/dist/__tests__/realtime-session-state.test.d.ts +2 -0
  79. package/dist/__tests__/realtime-session-state.test.d.ts.map +1 -0
  80. package/dist/__tests__/realtime-session-state.test.js +83 -0
  81. package/dist/__tests__/realtime-session-state.test.js.map +1 -0
  82. package/dist/__tests__/realtime-session-timeline-card.test.d.ts +2 -0
  83. package/dist/__tests__/realtime-session-timeline-card.test.d.ts.map +1 -0
  84. package/dist/__tests__/realtime-session-timeline-card.test.js +106 -0
  85. package/dist/__tests__/realtime-session-timeline-card.test.js.map +1 -0
  86. package/dist/__tests__/realtime-session-timeline.test.d.ts +2 -0
  87. package/dist/__tests__/realtime-session-timeline.test.d.ts.map +1 -0
  88. package/dist/__tests__/realtime-session-timeline.test.js +142 -0
  89. package/dist/__tests__/realtime-session-timeline.test.js.map +1 -0
  90. package/dist/__tests__/realtime-sessions-adapter.test.d.ts +19 -0
  91. package/dist/__tests__/realtime-sessions-adapter.test.d.ts.map +1 -0
  92. package/dist/__tests__/realtime-sessions-adapter.test.js +188 -0
  93. package/dist/__tests__/realtime-sessions-adapter.test.js.map +1 -0
  94. package/dist/__tests__/realtime-surface-panel-prefs.test.d.ts +2 -0
  95. package/dist/__tests__/realtime-surface-panel-prefs.test.d.ts.map +1 -0
  96. package/dist/__tests__/realtime-surface-panel-prefs.test.js +100 -0
  97. package/dist/__tests__/realtime-surface-panel-prefs.test.js.map +1 -0
  98. package/dist/__tests__/realtime-surface-tabs-model.test.d.ts +2 -0
  99. package/dist/__tests__/realtime-surface-tabs-model.test.d.ts.map +1 -0
  100. package/dist/__tests__/realtime-surface-tabs-model.test.js +193 -0
  101. package/dist/__tests__/realtime-surface-tabs-model.test.js.map +1 -0
  102. package/dist/__tests__/remote-browser-audio-player.test.d.ts +2 -0
  103. package/dist/__tests__/remote-browser-audio-player.test.d.ts.map +1 -0
  104. package/dist/__tests__/remote-browser-audio-player.test.js +137 -0
  105. package/dist/__tests__/remote-browser-audio-player.test.js.map +1 -0
  106. package/dist/__tests__/remote-browser-channel.test.d.ts +2 -0
  107. package/dist/__tests__/remote-browser-channel.test.d.ts.map +1 -0
  108. package/dist/__tests__/remote-browser-channel.test.js +585 -0
  109. package/dist/__tests__/remote-browser-channel.test.js.map +1 -0
  110. package/dist/__tests__/slot-defaults.test.d.ts +24 -0
  111. package/dist/__tests__/slot-defaults.test.d.ts.map +1 -0
  112. package/dist/__tests__/slot-defaults.test.js +63 -0
  113. package/dist/__tests__/slot-defaults.test.js.map +1 -0
  114. package/dist/__tests__/user-authorization.test.d.ts +2 -0
  115. package/dist/__tests__/user-authorization.test.d.ts.map +1 -0
  116. package/dist/__tests__/user-authorization.test.js +97 -0
  117. package/dist/__tests__/user-authorization.test.js.map +1 -0
  118. package/dist/__tests__/voice-session-narration.test.d.ts +2 -0
  119. package/dist/__tests__/voice-session-narration.test.d.ts.map +1 -0
  120. package/dist/__tests__/voice-session-narration.test.js +609 -0
  121. package/dist/__tests__/voice-session-narration.test.js.map +1 -0
  122. package/dist/__tests__/whiteboard-artifact-viewer.test.d.ts +2 -0
  123. package/dist/__tests__/whiteboard-artifact-viewer.test.d.ts.map +1 -0
  124. package/dist/__tests__/whiteboard-artifact-viewer.test.js +101 -0
  125. package/dist/__tests__/whiteboard-artifact-viewer.test.js.map +1 -0
  126. package/dist/__tests__/whiteboard-channel.test.d.ts +2 -0
  127. package/dist/__tests__/whiteboard-channel.test.d.ts.map +1 -0
  128. package/dist/__tests__/whiteboard-channel.test.js +260 -0
  129. package/dist/__tests__/whiteboard-channel.test.js.map +1 -0
  130. package/dist/__tests__/whiteboard-restore-state.test.d.ts +2 -0
  131. package/dist/__tests__/whiteboard-restore-state.test.d.ts.map +1 -0
  132. package/dist/__tests__/whiteboard-restore-state.test.js +108 -0
  133. package/dist/__tests__/whiteboard-restore-state.test.js.map +1 -0
  134. package/dist/lib/components/collection/collections-full-view.component.d.ts +105 -2
  135. package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
  136. package/dist/lib/components/collection/collections-full-view.component.js +1378 -489
  137. package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
  138. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +209 -3
  139. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  140. package/dist/lib/components/conversation/conversation-chat-area.component.js +924 -350
  141. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  142. package/dist/lib/components/conversation/conversation-list.component.d.ts +98 -5
  143. package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
  144. package/dist/lib/components/conversation/conversation-list.component.js +1102 -401
  145. package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
  146. package/dist/lib/components/mention/mention-dropdown.component.js +35 -17
  147. package/dist/lib/components/mention/mention-dropdown.component.js.map +1 -1
  148. package/dist/lib/components/mention/mention-editor.component.d.ts +4 -0
  149. package/dist/lib/components/mention/mention-editor.component.d.ts.map +1 -1
  150. package/dist/lib/components/mention/mention-editor.component.js +43 -19
  151. package/dist/lib/components/mention/mention-editor.component.js.map +1 -1
  152. package/dist/lib/components/message/message-input-box.component.d.ts +17 -1
  153. package/dist/lib/components/message/message-input-box.component.d.ts.map +1 -1
  154. package/dist/lib/components/message/message-input-box.component.js +73 -15
  155. package/dist/lib/components/message/message-input-box.component.js.map +1 -1
  156. package/dist/lib/components/message/message-input.component.d.ts +142 -6
  157. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  158. package/dist/lib/components/message/message-input.component.js +328 -82
  159. package/dist/lib/components/message/message-input.component.js.map +1 -1
  160. package/dist/lib/components/message/message-item.component.d.ts +28 -3
  161. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  162. package/dist/lib/components/message/message-item.component.js +180 -108
  163. package/dist/lib/components/message/message-item.component.js.map +1 -1
  164. package/dist/lib/components/message/message-list.component.d.ts +81 -2
  165. package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
  166. package/dist/lib/components/message/message-list.component.js +252 -87
  167. package/dist/lib/components/message/message-list.component.js.map +1 -1
  168. package/dist/lib/components/project/project-form-modal.component.d.ts +5 -1
  169. package/dist/lib/components/project/project-form-modal.component.d.ts.map +1 -1
  170. package/dist/lib/components/project/project-form-modal.component.js +104 -85
  171. package/dist/lib/components/project/project-form-modal.component.js.map +1 -1
  172. package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts +304 -0
  173. package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts.map +1 -0
  174. package/dist/lib/components/realtime/channels/base-realtime-channel-client.js +198 -0
  175. package/dist/lib/components/realtime/channels/base-realtime-channel-client.js.map +1 -0
  176. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.d.ts +25 -0
  177. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.d.ts.map +1 -0
  178. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.js +140 -0
  179. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.js.map +1 -0
  180. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts +35 -0
  181. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts.map +1 -0
  182. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js +58 -0
  183. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js.map +1 -0
  184. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts +63 -0
  185. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts.map +1 -0
  186. package/dist/lib/components/realtime/realtime-activity-rail.component.js +260 -0
  187. package/dist/lib/components/realtime/realtime-activity-rail.component.js.map +1 -0
  188. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts +117 -0
  189. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts.map +1 -0
  190. package/dist/lib/components/realtime/realtime-agent-banner.component.js +504 -0
  191. package/dist/lib/components/realtime/realtime-agent-banner.component.js.map +1 -0
  192. package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts +179 -0
  193. package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts.map +1 -0
  194. package/dist/lib/components/realtime/realtime-agent-picker.component.js +634 -0
  195. package/dist/lib/components/realtime/realtime-agent-picker.component.js.map +1 -0
  196. package/dist/lib/components/realtime/realtime-audio-visuals.d.ts +97 -0
  197. package/dist/lib/components/realtime/realtime-audio-visuals.d.ts.map +1 -0
  198. package/dist/lib/components/realtime/realtime-audio-visuals.js +139 -0
  199. package/dist/lib/components/realtime/realtime-audio-visuals.js.map +1 -0
  200. package/dist/lib/components/realtime/realtime-channel-strip.component.d.ts +29 -0
  201. package/dist/lib/components/realtime/realtime-channel-strip.component.d.ts.map +1 -0
  202. package/dist/lib/components/realtime/realtime-channel-strip.component.js +69 -0
  203. package/dist/lib/components/realtime/realtime-channel-strip.component.js.map +1 -0
  204. package/dist/lib/components/realtime/realtime-composer.component.d.ts +65 -0
  205. package/dist/lib/components/realtime/realtime-composer.component.d.ts.map +1 -0
  206. package/dist/lib/components/realtime/realtime-composer.component.js +256 -0
  207. package/dist/lib/components/realtime/realtime-composer.component.js.map +1 -0
  208. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts +71 -0
  209. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts.map +1 -0
  210. package/dist/lib/components/realtime/realtime-delegation-card.component.js +324 -0
  211. package/dist/lib/components/realtime/realtime-delegation-card.component.js.map +1 -0
  212. package/dist/lib/components/realtime/realtime-disclosure.d.ts +135 -0
  213. package/dist/lib/components/realtime/realtime-disclosure.d.ts.map +1 -0
  214. package/dist/lib/components/realtime/realtime-disclosure.js +188 -0
  215. package/dist/lib/components/realtime/realtime-disclosure.js.map +1 -0
  216. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +491 -0
  217. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts.map +1 -0
  218. package/dist/lib/components/realtime/realtime-session-overlay.component.js +1274 -0
  219. package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -0
  220. package/dist/lib/components/realtime/realtime-session-state.d.ts +191 -0
  221. package/dist/lib/components/realtime/realtime-session-state.d.ts.map +1 -0
  222. package/dist/lib/components/realtime/realtime-session-state.js +244 -0
  223. package/dist/lib/components/realtime/realtime-session-state.js.map +1 -0
  224. package/dist/lib/components/realtime/realtime-session-thread.component.d.ts +56 -0
  225. package/dist/lib/components/realtime/realtime-session-thread.component.d.ts.map +1 -0
  226. package/dist/lib/components/realtime/realtime-session-thread.component.js +246 -0
  227. package/dist/lib/components/realtime/realtime-session-thread.component.js.map +1 -0
  228. package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts +51 -0
  229. package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts.map +1 -0
  230. package/dist/lib/components/realtime/realtime-session-timeline-card.component.js +193 -0
  231. package/dist/lib/components/realtime/realtime-session-timeline-card.component.js.map +1 -0
  232. package/dist/lib/components/realtime/realtime-surface-panel-prefs.d.ts +77 -0
  233. package/dist/lib/components/realtime/realtime-surface-panel-prefs.d.ts.map +1 -0
  234. package/dist/lib/components/realtime/realtime-surface-panel-prefs.js +114 -0
  235. package/dist/lib/components/realtime/realtime-surface-panel-prefs.js.map +1 -0
  236. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +173 -0
  237. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts.map +1 -0
  238. package/dist/lib/components/realtime/realtime-surface-tabs.component.js +496 -0
  239. package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -0
  240. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +181 -0
  241. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts.map +1 -0
  242. package/dist/lib/components/realtime/realtime-surface-tabs.model.js +223 -0
  243. package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -0
  244. package/dist/lib/components/realtime/remote-browser/remote-browser-audio-player.d.ts +163 -0
  245. package/dist/lib/components/realtime/remote-browser/remote-browser-audio-player.d.ts.map +1 -0
  246. package/dist/lib/components/realtime/remote-browser/remote-browser-audio-player.js +309 -0
  247. package/dist/lib/components/realtime/remote-browser/remote-browser-audio-player.js.map +1 -0
  248. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts +201 -0
  249. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts.map +1 -0
  250. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js +681 -0
  251. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js.map +1 -0
  252. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.d.ts +379 -0
  253. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.d.ts.map +1 -0
  254. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.js +914 -0
  255. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.js.map +1 -0
  256. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.d.ts +87 -0
  257. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.d.ts.map +1 -0
  258. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.js +223 -0
  259. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.js.map +1 -0
  260. package/dist/lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component.d.ts +48 -0
  261. package/dist/lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component.d.ts.map +1 -0
  262. package/dist/lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component.js +180 -0
  263. package/dist/lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component.js.map +1 -0
  264. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts +119 -0
  265. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts.map +1 -0
  266. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js +274 -0
  267. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js.map +1 -0
  268. package/dist/lib/components/slots/mj-chat-agent-presence-default.component.d.ts +11 -0
  269. package/dist/lib/components/slots/mj-chat-agent-presence-default.component.d.ts.map +1 -0
  270. package/dist/lib/components/slots/mj-chat-agent-presence-default.component.js +98 -0
  271. package/dist/lib/components/slots/mj-chat-agent-presence-default.component.js.map +1 -0
  272. package/dist/lib/components/slots/mj-chat-demonstration-surface-default.component.d.ts +9 -0
  273. package/dist/lib/components/slots/mj-chat-demonstration-surface-default.component.d.ts.map +1 -0
  274. package/dist/lib/components/slots/mj-chat-demonstration-surface-default.component.js +35 -0
  275. package/dist/lib/components/slots/mj-chat-demonstration-surface-default.component.js.map +1 -0
  276. package/dist/lib/components/slots/mj-chat-empty-state-default.component.d.ts +28 -0
  277. package/dist/lib/components/slots/mj-chat-empty-state-default.component.d.ts.map +1 -0
  278. package/dist/lib/components/slots/mj-chat-empty-state-default.component.js +104 -0
  279. package/dist/lib/components/slots/mj-chat-empty-state-default.component.js.map +1 -0
  280. package/dist/lib/components/slots/mj-chat-header-default.component.d.ts +11 -0
  281. package/dist/lib/components/slots/mj-chat-header-default.component.d.ts.map +1 -0
  282. package/dist/lib/components/slots/mj-chat-header-default.component.js +103 -0
  283. package/dist/lib/components/slots/mj-chat-header-default.component.js.map +1 -0
  284. package/dist/lib/components/slots/mj-chat-message-bubble-default.component.d.ts +15 -0
  285. package/dist/lib/components/slots/mj-chat-message-bubble-default.component.d.ts.map +1 -0
  286. package/dist/lib/components/slots/mj-chat-message-bubble-default.component.js +73 -0
  287. package/dist/lib/components/slots/mj-chat-message-bubble-default.component.js.map +1 -0
  288. package/dist/lib/components/slots/mj-chat-message-extra-default.component.d.ts +9 -0
  289. package/dist/lib/components/slots/mj-chat-message-extra-default.component.d.ts.map +1 -0
  290. package/dist/lib/components/slots/mj-chat-message-extra-default.component.js +34 -0
  291. package/dist/lib/components/slots/mj-chat-message-extra-default.component.js.map +1 -0
  292. package/dist/lib/components/slots/slot-interfaces.d.ts +95 -0
  293. package/dist/lib/components/slots/slot-interfaces.d.ts.map +1 -0
  294. package/dist/lib/components/slots/slot-interfaces.js +18 -0
  295. package/dist/lib/components/slots/slot-interfaces.js.map +1 -0
  296. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +15 -0
  297. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  298. package/dist/lib/components/workspace/conversation-workspace.component.js +41 -12
  299. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  300. package/dist/lib/conversations.module.d.ts +12 -1
  301. package/dist/lib/conversations.module.d.ts.map +1 -1
  302. package/dist/lib/conversations.module.js +93 -5
  303. package/dist/lib/conversations.module.js.map +1 -1
  304. package/dist/lib/directives/chat-slot.directive.d.ts +44 -0
  305. package/dist/lib/directives/chat-slot.directive.d.ts.map +1 -0
  306. package/dist/lib/directives/chat-slot.directive.js +54 -0
  307. package/dist/lib/directives/chat-slot.directive.js.map +1 -0
  308. package/dist/lib/events/chat-events.d.ts +137 -0
  309. package/dist/lib/events/chat-events.d.ts.map +1 -0
  310. package/dist/lib/events/chat-events.js +189 -0
  311. package/dist/lib/events/chat-events.js.map +1 -0
  312. package/dist/lib/models/conversation-state.model.d.ts +2 -1
  313. package/dist/lib/models/conversation-state.model.d.ts.map +1 -1
  314. package/dist/lib/models/conversation-state.model.js.map +1 -1
  315. package/dist/lib/services/artifact-state.service.d.ts +1 -1
  316. package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
  317. package/dist/lib/services/artifact-state.service.js +29 -7
  318. package/dist/lib/services/artifact-state.service.js.map +1 -1
  319. package/dist/lib/services/conversation-agent.service.d.ts +60 -74
  320. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  321. package/dist/lib/services/conversation-agent.service.js +100 -313
  322. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  323. package/dist/lib/services/conversation-bridge.service.d.ts +11 -70
  324. package/dist/lib/services/conversation-bridge.service.d.ts.map +1 -1
  325. package/dist/lib/services/conversation-bridge.service.js +51 -85
  326. package/dist/lib/services/conversation-bridge.service.js.map +1 -1
  327. package/dist/lib/services/conversation-naming.d.ts +63 -0
  328. package/dist/lib/services/conversation-naming.d.ts.map +1 -0
  329. package/dist/lib/services/conversation-naming.js +58 -0
  330. package/dist/lib/services/conversation-naming.js.map +1 -0
  331. package/dist/lib/services/conversation-streaming.service.d.ts +24 -154
  332. package/dist/lib/services/conversation-streaming.service.d.ts.map +1 -1
  333. package/dist/lib/services/conversation-streaming.service.js +39 -361
  334. package/dist/lib/services/conversation-streaming.service.js.map +1 -1
  335. package/dist/lib/services/conversations-runtime-bootstrap.service.d.ts +10 -0
  336. package/dist/lib/services/conversations-runtime-bootstrap.service.d.ts.map +1 -0
  337. package/dist/lib/services/conversations-runtime-bootstrap.service.js +104 -0
  338. package/dist/lib/services/conversations-runtime-bootstrap.service.js.map +1 -0
  339. package/dist/lib/services/delegation-result-parser.d.ts +45 -0
  340. package/dist/lib/services/delegation-result-parser.d.ts.map +1 -0
  341. package/dist/lib/services/delegation-result-parser.js +48 -0
  342. package/dist/lib/services/delegation-result-parser.js.map +1 -0
  343. package/dist/lib/services/mention-autocomplete.service.d.ts +19 -4
  344. package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -1
  345. package/dist/lib/services/mention-autocomplete.service.js +65 -4
  346. package/dist/lib/services/mention-autocomplete.service.js.map +1 -1
  347. package/dist/lib/services/mention-parser.service.d.ts +8 -53
  348. package/dist/lib/services/mention-parser.service.d.ts.map +1 -1
  349. package/dist/lib/services/mention-parser.service.js +32 -243
  350. package/dist/lib/services/mention-parser.service.js.map +1 -1
  351. package/dist/lib/services/narration-template.d.ts +42 -0
  352. package/dist/lib/services/narration-template.d.ts.map +1 -0
  353. package/dist/lib/services/narration-template.js +73 -0
  354. package/dist/lib/services/narration-template.js.map +1 -0
  355. package/dist/lib/services/realtime-pairing.d.ts +121 -0
  356. package/dist/lib/services/realtime-pairing.d.ts.map +1 -0
  357. package/dist/lib/services/realtime-pairing.js +160 -0
  358. package/dist/lib/services/realtime-pairing.js.map +1 -0
  359. package/dist/lib/services/realtime-session-review.service.d.ts +233 -0
  360. package/dist/lib/services/realtime-session-review.service.d.ts.map +1 -0
  361. package/dist/lib/services/realtime-session-review.service.js +417 -0
  362. package/dist/lib/services/realtime-session-review.service.js.map +1 -0
  363. package/dist/lib/services/realtime-session.service.d.ts +739 -0
  364. package/dist/lib/services/realtime-session.service.d.ts.map +1 -0
  365. package/dist/lib/services/realtime-session.service.js +1647 -0
  366. package/dist/lib/services/realtime-session.service.js.map +1 -0
  367. package/dist/lib/services/realtime-sessions-adapter.d.ts +54 -0
  368. package/dist/lib/services/realtime-sessions-adapter.d.ts.map +1 -0
  369. package/dist/lib/services/realtime-sessions-adapter.js +154 -0
  370. package/dist/lib/services/realtime-sessions-adapter.js.map +1 -0
  371. package/dist/lib/services/user-authorization.d.ts +67 -0
  372. package/dist/lib/services/user-authorization.d.ts.map +1 -0
  373. package/dist/lib/services/user-authorization.js +66 -0
  374. package/dist/lib/services/user-authorization.js.map +1 -0
  375. package/dist/lib/utils/realtime-session-timeline.d.ts +84 -0
  376. package/dist/lib/utils/realtime-session-timeline.d.ts.map +1 -0
  377. package/dist/lib/utils/realtime-session-timeline.js +94 -0
  378. package/dist/lib/utils/realtime-session-timeline.js.map +1 -0
  379. package/dist/public-api.d.ts +41 -0
  380. package/dist/public-api.d.ts.map +1 -1
  381. package/dist/public-api.js +50 -0
  382. package/dist/public-api.js.map +1 -1
  383. package/package.json +27 -24
  384. package/dist/__tests__/conversation-bridge.service.test.d.ts +0 -2
  385. package/dist/__tests__/conversation-bridge.service.test.d.ts.map +0 -1
  386. package/dist/__tests__/conversation-bridge.service.test.js +0 -98
  387. package/dist/__tests__/conversation-bridge.service.test.js.map +0 -1
  388. package/dist/__tests__/mention-parser.test.d.ts +0 -2
  389. package/dist/__tests__/mention-parser.test.d.ts.map +0 -1
  390. package/dist/__tests__/mention-parser.test.js +0 -154
  391. package/dist/__tests__/mention-parser.test.js.map +0 -1
@@ -2,7 +2,7 @@ import { Component, Input, Output, EventEmitter, HostListener } from '@angular/c
2
2
  import { BaseAngularComponent } from '@memberjunction/ng-base-types';
3
3
  import { RunView } from '@memberjunction/core';
4
4
  import { Subject, takeUntil } from 'rxjs';
5
- import { UUIDsEqual } from '@memberjunction/global';
5
+ import { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';
6
6
  import * as i0 from "@angular/core";
7
7
  import * as i1 from "../../services/dialog.service";
8
8
  import * as i2 from "../../services/artifact-state.service";
@@ -15,48 +15,51 @@ import * as i8 from "@memberjunction/ng-shared-generic";
15
15
  import * as i9 from "./collection-share-modal.component";
16
16
  import * as i10 from "./collection-form-modal.component";
17
17
  import * as i11 from "./artifact-create-modal.component";
18
- function CollectionsFullViewComponent_Conditional_7_For_2_Template(rf, ctx) { if (rf & 1) {
18
+ const _forTrack0 = ($index, $item) => $item.collection.ID;
19
+ const _forTrack1 = ($index, $item) => $item.item.id;
20
+ function CollectionsFullViewComponent_Conditional_9_For_2_Template(rf, ctx) { if (rf & 1) {
19
21
  const _r1 = i0.ɵɵgetCurrentView();
20
- i0.ɵɵelement(0, "i", 25);
21
- i0.ɵɵelementStart(1, "a", 5);
22
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_7_For_2_Template_a_click_1_listener() { const crumb_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.navigateTo(crumb_r2)); });
22
+ i0.ɵɵelement(0, "i", 30);
23
+ i0.ɵɵelementStart(1, "a", 31);
24
+ i0.ɵɵlistener("dragover", function CollectionsFullViewComponent_Conditional_9_For_2_Template_a_dragover_1_listener($event) { const crumb_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onCrumbDragOver(crumb_r2.id, $event)); })("dragleave", function CollectionsFullViewComponent_Conditional_9_For_2_Template_a_dragleave_1_listener() { const crumb_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onDragLeave("crumb:" + crumb_r2.id)); })("drop", function CollectionsFullViewComponent_Conditional_9_For_2_Template_a_drop_1_listener($event) { const crumb_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onCrumbDrop(crumb_r2.id, $event)); })("click", function CollectionsFullViewComponent_Conditional_9_For_2_Template_a_click_1_listener() { const crumb_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.navigateTo(crumb_r2)); });
23
25
  i0.ɵɵtext(2);
24
26
  i0.ɵɵelementEnd();
25
27
  } if (rf & 2) {
26
28
  const crumb_r2 = ctx.$implicit;
27
- const ɵ$index_17_r4 = ctx.$index;
28
- const ɵ$count_17_r5 = ctx.$count;
29
+ const ɵ$index_21_r4 = ctx.$index;
30
+ const ɵ$count_21_r5 = ctx.$count;
31
+ const ctx_r2 = i0.ɵɵnextContext(2);
29
32
  i0.ɵɵadvance();
30
- i0.ɵɵclassProp("active", ɵ$index_17_r4 === ɵ$count_17_r5 - 1);
33
+ i0.ɵɵclassProp("active", ɵ$index_21_r4 === ɵ$count_21_r5 - 1)("drag-over", ctx_r2.dragOverTargetId === "crumb:" + crumb_r2.id);
31
34
  i0.ɵɵadvance();
32
35
  i0.ɵɵtextInterpolate1(" ", crumb_r2.name, " ");
33
36
  } }
34
- function CollectionsFullViewComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
35
- i0.ɵɵelementStart(0, "span", 6);
36
- i0.ɵɵrepeaterCreate(1, CollectionsFullViewComponent_Conditional_7_For_2_Template, 3, 3, null, null, i0.ɵɵrepeaterTrackByIdentity);
37
+ function CollectionsFullViewComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
38
+ i0.ɵɵelementStart(0, "span", 8);
39
+ i0.ɵɵrepeaterCreate(1, CollectionsFullViewComponent_Conditional_9_For_2_Template, 3, 5, null, null, i0.ɵɵrepeaterTrackByIdentity);
37
40
  i0.ɵɵelementEnd();
38
41
  } if (rf & 2) {
39
42
  const ctx_r2 = i0.ɵɵnextContext();
40
43
  i0.ɵɵadvance();
41
44
  i0.ɵɵrepeater(ctx_r2.breadcrumbs);
42
45
  } }
43
- function CollectionsFullViewComponent_Conditional_13_Conditional_3_Template(rf, ctx) { if (rf & 1) {
46
+ function CollectionsFullViewComponent_Conditional_15_Conditional_3_Template(rf, ctx) { if (rf & 1) {
44
47
  const _r7 = i0.ɵɵgetCurrentView();
45
- i0.ɵɵelementStart(0, "div", 28)(1, "button", 29);
46
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_13_Conditional_3_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.setSortBy("name")); });
47
- i0.ɵɵelement(2, "i", 30);
48
+ i0.ɵɵelementStart(0, "div", 34)(1, "button", 35);
49
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_15_Conditional_3_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.setSortBy("name")); });
50
+ i0.ɵɵelement(2, "i", 36);
48
51
  i0.ɵɵelementStart(3, "span");
49
52
  i0.ɵɵtext(4, "Sort by Name");
50
53
  i0.ɵɵelementEnd()();
51
- i0.ɵɵelementStart(5, "button", 29);
52
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_13_Conditional_3_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.setSortBy("date")); });
53
- i0.ɵɵelement(6, "i", 31);
54
+ i0.ɵɵelementStart(5, "button", 35);
55
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_15_Conditional_3_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.setSortBy("date")); });
56
+ i0.ɵɵelement(6, "i", 37);
54
57
  i0.ɵɵelementStart(7, "span");
55
58
  i0.ɵɵtext(8, "Sort by Date");
56
59
  i0.ɵɵelementEnd()();
57
- i0.ɵɵelementStart(9, "button", 29);
58
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_13_Conditional_3_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.setSortBy("type")); });
59
- i0.ɵɵelement(10, "i", 32);
60
+ i0.ɵɵelementStart(9, "button", 35);
61
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_15_Conditional_3_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.setSortBy("type")); });
62
+ i0.ɵɵelement(10, "i", 38);
60
63
  i0.ɵɵelementStart(11, "span");
61
64
  i0.ɵɵtext(12, "Sort by Type");
62
65
  i0.ɵɵelementEnd()()();
@@ -69,62 +72,62 @@ function CollectionsFullViewComponent_Conditional_13_Conditional_3_Template(rf,
69
72
  i0.ɵɵadvance(4);
70
73
  i0.ɵɵclassProp("active", ctx_r2.sortBy === "type");
71
74
  } }
72
- function CollectionsFullViewComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
75
+ function CollectionsFullViewComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
73
76
  const _r6 = i0.ɵɵgetCurrentView();
74
- i0.ɵɵelementStart(0, "div", 11)(1, "button", 26);
75
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_13_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.showSortDropdown = !ctx_r2.showSortDropdown); });
76
- i0.ɵɵelement(2, "i", 27);
77
+ i0.ɵɵelementStart(0, "div", 13)(1, "button", 32);
78
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_15_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.showSortDropdown = !ctx_r2.showSortDropdown); });
79
+ i0.ɵɵelement(2, "i", 33);
77
80
  i0.ɵɵelementEnd();
78
- i0.ɵɵconditionalCreate(3, CollectionsFullViewComponent_Conditional_13_Conditional_3_Template, 13, 6, "div", 28);
81
+ i0.ɵɵconditionalCreate(3, CollectionsFullViewComponent_Conditional_15_Conditional_3_Template, 13, 6, "div", 34);
79
82
  i0.ɵɵelementEnd();
80
83
  } if (rf & 2) {
81
84
  const ctx_r2 = i0.ɵɵnextContext();
82
85
  i0.ɵɵadvance(3);
83
86
  i0.ɵɵconditional(ctx_r2.showSortDropdown ? 3 : -1);
84
87
  } }
85
- function CollectionsFullViewComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
88
+ function CollectionsFullViewComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
86
89
  const _r8 = i0.ɵɵgetCurrentView();
87
- i0.ɵɵelementStart(0, "button", 33);
88
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_17_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r2 = i0.ɵɵnextContext(); ctx_r2.searchQuery = ""; return i0.ɵɵresetView(ctx_r2.onSearchChange("")); });
89
- i0.ɵɵelement(1, "i", 34);
90
+ i0.ɵɵelementStart(0, "button", 39);
91
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_19_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r2 = i0.ɵɵnextContext(); ctx_r2.searchQuery = ""; return i0.ɵɵresetView(ctx_r2.onSearchChange("")); });
92
+ i0.ɵɵelement(1, "i", 40);
90
93
  i0.ɵɵelementEnd();
91
94
  } }
92
- function CollectionsFullViewComponent_Conditional_18_Conditional_2_Template(rf, ctx) { if (rf & 1) {
95
+ function CollectionsFullViewComponent_Conditional_20_Conditional_2_Template(rf, ctx) { if (rf & 1) {
93
96
  const _r9 = i0.ɵɵgetCurrentView();
94
- i0.ɵɵelementStart(0, "button", 8);
95
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_18_Conditional_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.shareCurrentCollection()); });
96
- i0.ɵɵelement(1, "i", 39);
97
+ i0.ɵɵelementStart(0, "button", 10);
98
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_20_Conditional_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.shareCurrentCollection()); });
99
+ i0.ɵɵelement(1, "i", 45);
97
100
  i0.ɵɵelementEnd();
98
101
  } if (rf & 2) {
99
102
  const ctx_r2 = i0.ɵɵnextContext(2);
100
103
  i0.ɵɵproperty("title", "Share: " + ctx_r2.currentCollection.Name);
101
104
  } }
102
- function CollectionsFullViewComponent_Conditional_18_Conditional_3_Template(rf, ctx) { if (rf & 1) {
105
+ function CollectionsFullViewComponent_Conditional_20_Conditional_3_Template(rf, ctx) { if (rf & 1) {
103
106
  const _r10 = i0.ɵɵgetCurrentView();
104
- i0.ɵɵelementStart(0, "button", 8);
105
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_18_Conditional_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.editCurrentCollection()); });
106
- i0.ɵɵelement(1, "i", 40);
107
+ i0.ɵɵelementStart(0, "button", 10);
108
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_20_Conditional_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.editCurrentCollection()); });
109
+ i0.ɵɵelement(1, "i", 46);
107
110
  i0.ɵɵelementEnd();
108
111
  } if (rf & 2) {
109
112
  const ctx_r2 = i0.ɵɵnextContext(2);
110
113
  i0.ɵɵproperty("title", "Edit: " + ctx_r2.currentCollection.Name);
111
114
  } }
112
- function CollectionsFullViewComponent_Conditional_18_Conditional_4_Template(rf, ctx) { if (rf & 1) {
115
+ function CollectionsFullViewComponent_Conditional_20_Conditional_4_Template(rf, ctx) { if (rf & 1) {
113
116
  const _r11 = i0.ɵɵgetCurrentView();
114
- i0.ɵɵelementStart(0, "button", 41);
115
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_18_Conditional_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r11); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.deleteCurrentCollection()); });
116
- i0.ɵɵelement(1, "i", 42);
117
+ i0.ɵɵelementStart(0, "button", 47);
118
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_20_Conditional_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r11); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.deleteCurrentCollection()); });
119
+ i0.ɵɵelement(1, "i", 48);
117
120
  i0.ɵɵelementEnd();
118
121
  } if (rf & 2) {
119
122
  const ctx_r2 = i0.ɵɵnextContext(2);
120
123
  i0.ɵɵproperty("title", "Delete: " + ctx_r2.currentCollection.Name);
121
124
  } }
122
- function CollectionsFullViewComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
123
- i0.ɵɵelement(0, "div", 35);
124
- i0.ɵɵelementStart(1, "div", 36);
125
- i0.ɵɵconditionalCreate(2, CollectionsFullViewComponent_Conditional_18_Conditional_2_Template, 2, 1, "button", 37);
126
- i0.ɵɵconditionalCreate(3, CollectionsFullViewComponent_Conditional_18_Conditional_3_Template, 2, 1, "button", 37);
127
- i0.ɵɵconditionalCreate(4, CollectionsFullViewComponent_Conditional_18_Conditional_4_Template, 2, 1, "button", 38);
125
+ function CollectionsFullViewComponent_Conditional_20_Template(rf, ctx) { if (rf & 1) {
126
+ i0.ɵɵelement(0, "div", 41);
127
+ i0.ɵɵelementStart(1, "div", 42);
128
+ i0.ɵɵconditionalCreate(2, CollectionsFullViewComponent_Conditional_20_Conditional_2_Template, 2, 1, "button", 43);
129
+ i0.ɵɵconditionalCreate(3, CollectionsFullViewComponent_Conditional_20_Conditional_3_Template, 2, 1, "button", 43);
130
+ i0.ɵɵconditionalCreate(4, CollectionsFullViewComponent_Conditional_20_Conditional_4_Template, 2, 1, "button", 44);
128
131
  i0.ɵɵelementEnd();
129
132
  } if (rf & 2) {
130
133
  const ctx_r2 = i0.ɵɵnextContext();
@@ -135,17 +138,17 @@ function CollectionsFullViewComponent_Conditional_18_Template(rf, ctx) { if (rf
135
138
  i0.ɵɵadvance();
136
139
  i0.ɵɵconditional(ctx_r2.canDeleteCurrent() ? 4 : -1);
137
140
  } }
138
- function CollectionsFullViewComponent_Conditional_19_Conditional_6_Template(rf, ctx) { if (rf & 1) {
141
+ function CollectionsFullViewComponent_Conditional_21_Conditional_6_Template(rf, ctx) { if (rf & 1) {
139
142
  const _r13 = i0.ɵɵgetCurrentView();
140
- i0.ɵɵelementStart(0, "div", 46)(1, "button", 29);
141
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_19_Conditional_6_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.createCollection()); });
142
- i0.ɵɵelement(2, "i", 47);
143
+ i0.ɵɵelementStart(0, "div", 52)(1, "button", 35);
144
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_21_Conditional_6_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.createCollection()); });
145
+ i0.ɵɵelement(2, "i", 53);
143
146
  i0.ɵɵelementStart(3, "span");
144
147
  i0.ɵɵtext(4, "New Collection");
145
148
  i0.ɵɵelementEnd()();
146
- i0.ɵɵelementStart(5, "button", 48);
147
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_19_Conditional_6_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.addArtifact()); });
148
- i0.ɵɵelement(6, "i", 49);
149
+ i0.ɵɵelementStart(5, "button", 54);
150
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_21_Conditional_6_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.addArtifact()); });
151
+ i0.ɵɵelement(6, "i", 55);
149
152
  i0.ɵɵelementStart(7, "span");
150
153
  i0.ɵɵtext(8, "New Artifact");
151
154
  i0.ɵɵelementEnd()()();
@@ -154,49 +157,142 @@ function CollectionsFullViewComponent_Conditional_19_Conditional_6_Template(rf,
154
157
  i0.ɵɵadvance(5);
155
158
  i0.ɵɵproperty("disabled", !ctx_r2.currentCollectionId);
156
159
  } }
157
- function CollectionsFullViewComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
160
+ function CollectionsFullViewComponent_Conditional_21_Template(rf, ctx) { if (rf & 1) {
158
161
  const _r12 = i0.ɵɵgetCurrentView();
159
- i0.ɵɵelementStart(0, "div", 11)(1, "button", 43);
160
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_19_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r12); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.showNewDropdown = !ctx_r2.showNewDropdown); });
161
- i0.ɵɵelement(2, "i", 44);
162
+ i0.ɵɵelementStart(0, "div", 13)(1, "button", 49);
163
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_21_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r12); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.showNewDropdown = !ctx_r2.showNewDropdown); });
164
+ i0.ɵɵelement(2, "i", 50);
162
165
  i0.ɵɵelementStart(3, "span");
163
166
  i0.ɵɵtext(4, "New");
164
167
  i0.ɵɵelementEnd();
165
- i0.ɵɵelement(5, "i", 45);
168
+ i0.ɵɵelement(5, "i", 51);
166
169
  i0.ɵɵelementEnd();
167
- i0.ɵɵconditionalCreate(6, CollectionsFullViewComponent_Conditional_19_Conditional_6_Template, 9, 1, "div", 46);
170
+ i0.ɵɵconditionalCreate(6, CollectionsFullViewComponent_Conditional_21_Conditional_6_Template, 9, 1, "div", 52);
168
171
  i0.ɵɵelementEnd();
169
172
  } if (rf & 2) {
170
173
  const ctx_r2 = i0.ɵɵnextContext();
171
174
  i0.ɵɵadvance(6);
172
175
  i0.ɵɵconditional(ctx_r2.showNewDropdown ? 6 : -1);
173
176
  } }
174
- function CollectionsFullViewComponent_Conditional_22_Template(rf, ctx) { if (rf & 1) {
177
+ function CollectionsFullViewComponent_Conditional_24_Conditional_9_Conditional_2_Template(rf, ctx) { if (rf & 1) {
178
+ i0.ɵɵelementStart(0, "div", 66);
179
+ i0.ɵɵtext(1, "No collections available");
180
+ i0.ɵɵelementEnd();
181
+ } }
182
+ function CollectionsFullViewComponent_Conditional_24_Conditional_9_Conditional_3_For_1_Template(rf, ctx) { if (rf & 1) {
183
+ const _r16 = i0.ɵɵgetCurrentView();
184
+ i0.ɵɵelementStart(0, "button", 35);
185
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_24_Conditional_9_Conditional_3_For_1_Template_button_click_0_listener() { const node_r17 = i0.ɵɵrestoreView(_r16).$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.bulkMoveTo(node_r17.collection)); });
186
+ i0.ɵɵelement(1, "i", 68);
187
+ i0.ɵɵelementStart(2, "span");
188
+ i0.ɵɵtext(3);
189
+ i0.ɵɵelementEnd()();
190
+ } if (rf & 2) {
191
+ const node_r17 = ctx.$implicit;
192
+ i0.ɵɵstyleProp("padding-left", 12 + node_r17.depth * 12, "px");
193
+ i0.ɵɵadvance();
194
+ i0.ɵɵstyleProp("color", node_r17.collection.Color || null);
195
+ i0.ɵɵadvance(2);
196
+ i0.ɵɵtextInterpolate(node_r17.collection.Name);
197
+ } }
198
+ function CollectionsFullViewComponent_Conditional_24_Conditional_9_Conditional_3_Template(rf, ctx) { if (rf & 1) {
199
+ i0.ɵɵrepeaterCreate(0, CollectionsFullViewComponent_Conditional_24_Conditional_9_Conditional_3_For_1_Template, 4, 5, "button", 67, _forTrack0);
200
+ } if (rf & 2) {
201
+ const ctx_r2 = i0.ɵɵnextContext(3);
202
+ i0.ɵɵrepeater(ctx_r2.navigatorNodes);
203
+ } }
204
+ function CollectionsFullViewComponent_Conditional_24_Conditional_9_Template(rf, ctx) { if (rf & 1) {
205
+ const _r15 = i0.ɵɵgetCurrentView();
206
+ i0.ɵɵelementStart(0, "div", 64);
207
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_24_Conditional_9_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r15); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.closeBulkMove()); });
208
+ i0.ɵɵelementEnd();
209
+ i0.ɵɵelementStart(1, "div", 65);
210
+ i0.ɵɵconditionalCreate(2, CollectionsFullViewComponent_Conditional_24_Conditional_9_Conditional_2_Template, 2, 0, "div", 66)(3, CollectionsFullViewComponent_Conditional_24_Conditional_9_Conditional_3_Template, 2, 0);
211
+ i0.ɵɵelementEnd();
212
+ } if (rf & 2) {
213
+ const ctx_r2 = i0.ɵɵnextContext(2);
214
+ i0.ɵɵadvance(2);
215
+ i0.ɵɵconditional(ctx_r2.navigatorNodes.length === 0 ? 2 : 3);
216
+ } }
217
+ function CollectionsFullViewComponent_Conditional_24_Template(rf, ctx) { if (rf & 1) {
175
218
  const _r14 = i0.ɵɵgetCurrentView();
176
- i0.ɵɵelementStart(0, "div", 18)(1, "div", 50)(2, "span", 51);
219
+ i0.ɵɵelementStart(0, "div", 20)(1, "div", 56)(2, "span", 57);
177
220
  i0.ɵɵtext(3);
178
221
  i0.ɵɵelementEnd()();
179
- i0.ɵɵelementStart(4, "div", 52)(5, "button", 53);
180
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_22_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.clearSelection()); });
181
- i0.ɵɵelement(6, "i", 34);
182
- i0.ɵɵtext(7, " Clear Selection ");
183
- i0.ɵɵelementEnd();
184
- i0.ɵɵelementStart(8, "button", 54);
185
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_22_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.deleteSelected()); });
186
- i0.ɵɵelement(9, "i", 42);
187
- i0.ɵɵtext(10, " Delete Selected ");
222
+ i0.ɵɵelementStart(4, "div", 58)(5, "div", 13)(6, "button", 59);
223
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_24_Template_button_click_6_listener($event) { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.openBulkMove($event)); });
224
+ i0.ɵɵelement(7, "i", 60);
225
+ i0.ɵɵtext(8, " Move to\u2026 ");
226
+ i0.ɵɵelementEnd();
227
+ i0.ɵɵconditionalCreate(9, CollectionsFullViewComponent_Conditional_24_Conditional_9_Template, 4, 1);
228
+ i0.ɵɵelementEnd();
229
+ i0.ɵɵelementStart(10, "button", 61);
230
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_24_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.stageSelected()); });
231
+ i0.ɵɵelement(11, "i", 62);
232
+ i0.ɵɵtext(12, " Stage ");
233
+ i0.ɵɵelementEnd();
234
+ i0.ɵɵelementStart(13, "button", 59);
235
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_24_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.clearSelection()); });
236
+ i0.ɵɵelement(14, "i", 40);
237
+ i0.ɵɵtext(15, " Clear ");
238
+ i0.ɵɵelementEnd();
239
+ i0.ɵɵelementStart(16, "button", 63);
240
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_24_Template_button_click_16_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.deleteSelected()); });
241
+ i0.ɵɵelement(17, "i", 48);
242
+ i0.ɵɵtext(18, " Delete ");
188
243
  i0.ɵɵelementEnd()()();
189
244
  } if (rf & 2) {
190
245
  const ctx_r2 = i0.ɵɵnextContext();
191
246
  i0.ɵɵadvance(3);
192
247
  i0.ɵɵtextInterpolate1("", ctx_r2.selectedItems.size, " selected");
248
+ i0.ɵɵadvance(6);
249
+ i0.ɵɵconditional(ctx_r2.showBulkMovePopover ? 9 : -1);
193
250
  } }
194
- function CollectionsFullViewComponent_Conditional_24_Template(rf, ctx) { if (rf & 1) {
195
- i0.ɵɵelementStart(0, "div", 20);
196
- i0.ɵɵelement(1, "mj-loading", 55);
251
+ function CollectionsFullViewComponent_Conditional_26_For_9_Template(rf, ctx) { if (rf & 1) {
252
+ const _r19 = i0.ɵɵgetCurrentView();
253
+ i0.ɵɵelementStart(0, "button", 73);
254
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_26_For_9_Template_button_click_0_listener() { const node_r20 = i0.ɵɵrestoreView(_r19).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.navigatorClick(node_r20.collection)); })("dragover", function CollectionsFullViewComponent_Conditional_26_For_9_Template_button_dragover_0_listener($event) { const node_r20 = i0.ɵɵrestoreView(_r19).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onNavigatorDragOver(node_r20.collection, $event)); })("dragleave", function CollectionsFullViewComponent_Conditional_26_For_9_Template_button_dragleave_0_listener() { const node_r20 = i0.ɵɵrestoreView(_r19).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onDragLeave("nav:" + node_r20.collection.ID)); })("drop", function CollectionsFullViewComponent_Conditional_26_For_9_Template_button_drop_0_listener($event) { const node_r20 = i0.ɵɵrestoreView(_r19).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onNavigatorDrop(node_r20.collection, $event)); });
255
+ i0.ɵɵelement(1, "i", 68);
256
+ i0.ɵɵelementStart(2, "span", 74);
257
+ i0.ɵɵtext(3);
258
+ i0.ɵɵelementEnd()();
259
+ } if (rf & 2) {
260
+ const node_r20 = ctx.$implicit;
261
+ const ctx_r2 = i0.ɵɵnextContext(2);
262
+ i0.ɵɵstyleProp("padding-left", 10 + node_r20.depth * 14, "px");
263
+ i0.ɵɵclassProp("active", ctx_r2.isCurrentNavigator(node_r20.collection))("drag-over", ctx_r2.dragOverTargetId === "nav:" + node_r20.collection.ID);
264
+ i0.ɵɵproperty("title", node_r20.collection.Name);
265
+ i0.ɵɵadvance();
266
+ i0.ɵɵstyleProp("color", node_r20.collection.Color || null);
267
+ i0.ɵɵadvance(2);
268
+ i0.ɵɵtextInterpolate(node_r20.collection.Name);
269
+ } }
270
+ function CollectionsFullViewComponent_Conditional_26_Template(rf, ctx) { if (rf & 1) {
271
+ const _r18 = i0.ɵɵgetCurrentView();
272
+ i0.ɵɵelementStart(0, "div", 22)(1, "div", 69);
273
+ i0.ɵɵtext(2, "Collections");
274
+ i0.ɵɵelementEnd();
275
+ i0.ɵɵelementStart(3, "div", 70)(4, "button", 71);
276
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_26_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.navigateToRoot()); })("dragover", function CollectionsFullViewComponent_Conditional_26_Template_button_dragover_4_listener($event) { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onCrumbDragOver(null, $event)); })("dragleave", function CollectionsFullViewComponent_Conditional_26_Template_button_dragleave_4_listener() { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onDragLeave("root")); })("drop", function CollectionsFullViewComponent_Conditional_26_Template_button_drop_4_listener($event) { i0.ɵɵrestoreView(_r18); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onCrumbDrop(null, $event)); });
277
+ i0.ɵɵelement(5, "i", 6);
278
+ i0.ɵɵelementStart(6, "span");
279
+ i0.ɵɵtext(7, "All Collections");
280
+ i0.ɵɵelementEnd()();
281
+ i0.ɵɵrepeaterCreate(8, CollectionsFullViewComponent_Conditional_26_For_9_Template, 4, 10, "button", 72, _forTrack0);
282
+ i0.ɵɵelementEnd()();
283
+ } if (rf & 2) {
284
+ const ctx_r2 = i0.ɵɵnextContext();
285
+ i0.ɵɵadvance(4);
286
+ i0.ɵɵclassProp("active", !ctx_r2.currentCollectionId)("drag-over", ctx_r2.dragOverTargetId === "root");
287
+ i0.ɵɵadvance(4);
288
+ i0.ɵɵrepeater(ctx_r2.navigatorNodes);
289
+ } }
290
+ function CollectionsFullViewComponent_Conditional_28_Template(rf, ctx) { if (rf & 1) {
291
+ i0.ɵɵelementStart(0, "div", 24);
292
+ i0.ɵɵelement(1, "mj-loading", 75);
197
293
  i0.ɵɵelementEnd();
198
294
  } }
199
- function CollectionsFullViewComponent_Conditional_25_Conditional_2_Template(rf, ctx) { if (rf & 1) {
295
+ function CollectionsFullViewComponent_Conditional_29_Conditional_2_Template(rf, ctx) { if (rf & 1) {
200
296
  i0.ɵɵelementStart(0, "h3");
201
297
  i0.ɵɵtext(1, "No items found");
202
298
  i0.ɵɵelementEnd();
@@ -204,28 +300,28 @@ function CollectionsFullViewComponent_Conditional_25_Conditional_2_Template(rf,
204
300
  i0.ɵɵtext(3, "Try adjusting your search");
205
301
  i0.ɵɵelementEnd();
206
302
  } }
207
- function CollectionsFullViewComponent_Conditional_25_Conditional_3_Conditional_4_Template(rf, ctx) { if (rf & 1) {
208
- const _r15 = i0.ɵɵgetCurrentView();
209
- i0.ɵɵelementStart(0, "button", 58);
210
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_25_Conditional_3_Conditional_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r15); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.createCollection()); });
211
- i0.ɵɵelement(1, "i", 44);
303
+ function CollectionsFullViewComponent_Conditional_29_Conditional_3_Conditional_4_Template(rf, ctx) { if (rf & 1) {
304
+ const _r21 = i0.ɵɵgetCurrentView();
305
+ i0.ɵɵelementStart(0, "button", 78);
306
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_29_Conditional_3_Conditional_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r21); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.createCollection()); });
307
+ i0.ɵɵelement(1, "i", 50);
212
308
  i0.ɵɵtext(2, " Create Collection ");
213
309
  i0.ɵɵelementEnd();
214
310
  } }
215
- function CollectionsFullViewComponent_Conditional_25_Conditional_3_Template(rf, ctx) { if (rf & 1) {
311
+ function CollectionsFullViewComponent_Conditional_29_Conditional_3_Template(rf, ctx) { if (rf & 1) {
216
312
  i0.ɵɵelementStart(0, "h3");
217
313
  i0.ɵɵtext(1, "No collections yet");
218
314
  i0.ɵɵelementEnd();
219
315
  i0.ɵɵelementStart(2, "p");
220
316
  i0.ɵɵtext(3, "Create your first collection to get started");
221
317
  i0.ɵɵelementEnd();
222
- i0.ɵɵconditionalCreate(4, CollectionsFullViewComponent_Conditional_25_Conditional_3_Conditional_4_Template, 3, 0, "button", 57);
318
+ i0.ɵɵconditionalCreate(4, CollectionsFullViewComponent_Conditional_29_Conditional_3_Conditional_4_Template, 3, 0, "button", 77);
223
319
  } if (rf & 2) {
224
320
  const ctx_r2 = i0.ɵɵnextContext(2);
225
321
  i0.ɵɵadvance(4);
226
322
  i0.ɵɵconditional(ctx_r2.canEditCurrent() ? 4 : -1);
227
323
  } }
228
- function CollectionsFullViewComponent_Conditional_25_Conditional_4_Template(rf, ctx) { if (rf & 1) {
324
+ function CollectionsFullViewComponent_Conditional_29_Conditional_4_Template(rf, ctx) { if (rf & 1) {
229
325
  i0.ɵɵelementStart(0, "h3");
230
326
  i0.ɵɵtext(1, "This collection is empty");
231
327
  i0.ɵɵelementEnd();
@@ -237,12 +333,12 @@ function CollectionsFullViewComponent_Conditional_25_Conditional_4_Template(rf,
237
333
  i0.ɵɵtext(6, " button above to add collections or artifacts");
238
334
  i0.ɵɵelementEnd();
239
335
  } }
240
- function CollectionsFullViewComponent_Conditional_25_Template(rf, ctx) { if (rf & 1) {
241
- i0.ɵɵelementStart(0, "div", 21);
242
- i0.ɵɵelement(1, "i", 56);
243
- i0.ɵɵconditionalCreate(2, CollectionsFullViewComponent_Conditional_25_Conditional_2_Template, 4, 0);
244
- i0.ɵɵconditionalCreate(3, CollectionsFullViewComponent_Conditional_25_Conditional_3_Template, 5, 1);
245
- i0.ɵɵconditionalCreate(4, CollectionsFullViewComponent_Conditional_25_Conditional_4_Template, 7, 0);
336
+ function CollectionsFullViewComponent_Conditional_29_Template(rf, ctx) { if (rf & 1) {
337
+ i0.ɵɵelementStart(0, "div", 25);
338
+ i0.ɵɵelement(1, "i", 76);
339
+ i0.ɵɵconditionalCreate(2, CollectionsFullViewComponent_Conditional_29_Conditional_2_Template, 4, 0);
340
+ i0.ɵɵconditionalCreate(3, CollectionsFullViewComponent_Conditional_29_Conditional_3_Template, 5, 1);
341
+ i0.ɵɵconditionalCreate(4, CollectionsFullViewComponent_Conditional_29_Conditional_4_Template, 7, 0);
246
342
  i0.ɵɵelementEnd();
247
343
  } if (rf & 2) {
248
344
  const ctx_r2 = i0.ɵɵnextContext();
@@ -253,172 +349,165 @@ function CollectionsFullViewComponent_Conditional_25_Template(rf, ctx) { if (rf
253
349
  i0.ɵɵadvance();
254
350
  i0.ɵɵconditional(!ctx_r2.searchQuery && ctx_r2.currentCollectionId ? 4 : -1);
255
351
  } }
256
- function CollectionsFullViewComponent_Conditional_26_For_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
257
- const _r18 = i0.ɵɵgetCurrentView();
258
- i0.ɵɵelementStart(0, "div", 65);
259
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_26_For_2_Conditional_1_Template_div_click_0_listener($event) { i0.ɵɵrestoreView(_r18); const item_r17 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleItemSelection(item_r17, $event)); });
260
- i0.ɵɵelement(1, "i", 9);
261
- i0.ɵɵelementEnd();
262
- } if (rf & 2) {
263
- const item_r17 = i0.ɵɵnextContext().$implicit;
264
- i0.ɵɵadvance();
265
- i0.ɵɵproperty("ngClass", item_r17.selected ? "fa-check-circle" : "fa-circle");
266
- } }
267
- function CollectionsFullViewComponent_Conditional_26_For_2_Conditional_2_Conditional_3_Template(rf, ctx) { if (rf & 1) {
268
- i0.ɵɵelementStart(0, "div", 68);
269
- i0.ɵɵelement(1, "i", 74);
352
+ function CollectionsFullViewComponent_Conditional_30_For_2_Conditional_3_Conditional_3_Template(rf, ctx) { if (rf & 1) {
353
+ i0.ɵɵelementStart(0, "div", 86);
354
+ i0.ɵɵelement(1, "i", 92);
270
355
  i0.ɵɵelementEnd();
271
356
  } }
272
- function CollectionsFullViewComponent_Conditional_26_For_2_Conditional_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
273
- i0.ɵɵelementStart(0, "div", 71);
357
+ function CollectionsFullViewComponent_Conditional_30_For_2_Conditional_3_Conditional_7_Template(rf, ctx) { if (rf & 1) {
358
+ i0.ɵɵelementStart(0, "div", 89);
274
359
  i0.ɵɵtext(1);
275
360
  i0.ɵɵelementEnd();
276
361
  } if (rf & 2) {
277
- const item_r17 = i0.ɵɵnextContext(2).$implicit;
362
+ const item_r23 = i0.ɵɵnextContext(2).$implicit;
278
363
  i0.ɵɵadvance();
279
- i0.ɵɵtextInterpolate1(" ", item_r17.description, " ");
364
+ i0.ɵɵtextInterpolate1(" ", item_r23.description, " ");
280
365
  } }
281
- function CollectionsFullViewComponent_Conditional_26_For_2_Conditional_2_Conditional_8_Template(rf, ctx) { if (rf & 1) {
282
- i0.ɵɵelementStart(0, "div", 72);
366
+ function CollectionsFullViewComponent_Conditional_30_For_2_Conditional_3_Conditional_8_Template(rf, ctx) { if (rf & 1) {
367
+ i0.ɵɵelementStart(0, "div", 90);
283
368
  i0.ɵɵtext(1);
284
369
  i0.ɵɵelementEnd();
285
370
  } if (rf & 2) {
286
- const item_r17 = i0.ɵɵnextContext(2).$implicit;
371
+ const item_r23 = i0.ɵɵnextContext(2).$implicit;
287
372
  const ctx_r2 = i0.ɵɵnextContext(2);
288
373
  i0.ɵɵadvance();
289
- i0.ɵɵtextInterpolate1(" ", ctx_r2.getItemCountText(item_r17.itemCount), " ");
374
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.getItemCountText(item_r23.itemCount), " ");
290
375
  } }
291
- function CollectionsFullViewComponent_Conditional_26_For_2_Conditional_2_Conditional_9_Template(rf, ctx) { if (rf & 1) {
292
- i0.ɵɵelementStart(0, "div", 73);
293
- i0.ɵɵelement(1, "i", 75);
376
+ function CollectionsFullViewComponent_Conditional_30_For_2_Conditional_3_Conditional_9_Template(rf, ctx) { if (rf & 1) {
377
+ i0.ɵɵelementStart(0, "div", 91);
378
+ i0.ɵɵelement(1, "i", 93);
294
379
  i0.ɵɵtext(2);
295
380
  i0.ɵɵelementEnd();
296
381
  } if (rf & 2) {
297
- const item_r17 = i0.ɵɵnextContext(2).$implicit;
382
+ const item_r23 = i0.ɵɵnextContext(2).$implicit;
298
383
  i0.ɵɵadvance(2);
299
- i0.ɵɵtextInterpolate1(" ", item_r17.owner, " ");
384
+ i0.ɵɵtextInterpolate1(" ", item_r23.owner, " ");
300
385
  } }
301
- function CollectionsFullViewComponent_Conditional_26_For_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
302
- i0.ɵɵelementStart(0, "div", 64)(1, "div", 66);
303
- i0.ɵɵelement(2, "i", 67);
304
- i0.ɵɵconditionalCreate(3, CollectionsFullViewComponent_Conditional_26_For_2_Conditional_2_Conditional_3_Template, 2, 0, "div", 68);
386
+ function CollectionsFullViewComponent_Conditional_30_For_2_Conditional_3_Template(rf, ctx) { if (rf & 1) {
387
+ i0.ɵɵelementStart(0, "div", 84)(1, "div", 85);
388
+ i0.ɵɵelement(2, "i", 68);
389
+ i0.ɵɵconditionalCreate(3, CollectionsFullViewComponent_Conditional_30_For_2_Conditional_3_Conditional_3_Template, 2, 0, "div", 86);
305
390
  i0.ɵɵelementEnd();
306
- i0.ɵɵelementStart(4, "div", 69)(5, "div", 70);
391
+ i0.ɵɵelementStart(4, "div", 87)(5, "div", 88);
307
392
  i0.ɵɵtext(6);
308
393
  i0.ɵɵelementEnd();
309
- i0.ɵɵconditionalCreate(7, CollectionsFullViewComponent_Conditional_26_For_2_Conditional_2_Conditional_7_Template, 2, 1, "div", 71);
310
- i0.ɵɵconditionalCreate(8, CollectionsFullViewComponent_Conditional_26_For_2_Conditional_2_Conditional_8_Template, 2, 1, "div", 72);
311
- i0.ɵɵconditionalCreate(9, CollectionsFullViewComponent_Conditional_26_For_2_Conditional_2_Conditional_9_Template, 3, 1, "div", 73);
394
+ i0.ɵɵconditionalCreate(7, CollectionsFullViewComponent_Conditional_30_For_2_Conditional_3_Conditional_7_Template, 2, 1, "div", 89);
395
+ i0.ɵɵconditionalCreate(8, CollectionsFullViewComponent_Conditional_30_For_2_Conditional_3_Conditional_8_Template, 2, 1, "div", 90);
396
+ i0.ɵɵconditionalCreate(9, CollectionsFullViewComponent_Conditional_30_For_2_Conditional_3_Conditional_9_Template, 3, 1, "div", 91);
312
397
  i0.ɵɵelementEnd()();
313
398
  } if (rf & 2) {
314
- const item_r17 = i0.ɵɵnextContext().$implicit;
315
- i0.ɵɵproperty("title", item_r17.description || item_r17.name);
399
+ const item_r23 = i0.ɵɵnextContext().$implicit;
400
+ i0.ɵɵproperty("title", item_r23.description || item_r23.name);
316
401
  i0.ɵɵadvance(3);
317
- i0.ɵɵconditional(item_r17.isShared ? 3 : -1);
402
+ i0.ɵɵconditional(item_r23.isShared ? 3 : -1);
318
403
  i0.ɵɵadvance(3);
319
- i0.ɵɵtextInterpolate(item_r17.name);
404
+ i0.ɵɵtextInterpolate(item_r23.name);
320
405
  i0.ɵɵadvance();
321
- i0.ɵɵconditional(item_r17.description ? 7 : -1);
406
+ i0.ɵɵconditional(item_r23.description ? 7 : -1);
322
407
  i0.ɵɵadvance();
323
- i0.ɵɵconditional(item_r17.itemCount !== undefined ? 8 : -1);
408
+ i0.ɵɵconditional(item_r23.itemCount !== undefined ? 8 : -1);
324
409
  i0.ɵɵadvance();
325
- i0.ɵɵconditional(item_r17.isShared && item_r17.owner ? 9 : -1);
410
+ i0.ɵɵconditional(item_r23.isShared && item_r23.owner ? 9 : -1);
326
411
  } }
327
- function CollectionsFullViewComponent_Conditional_26_For_2_Conditional_3_Conditional_6_Template(rf, ctx) { if (rf & 1) {
328
- i0.ɵɵelementStart(0, "div", 71);
412
+ function CollectionsFullViewComponent_Conditional_30_For_2_Conditional_4_Conditional_6_Template(rf, ctx) { if (rf & 1) {
413
+ i0.ɵɵelementStart(0, "div", 89);
329
414
  i0.ɵɵtext(1);
330
415
  i0.ɵɵelementEnd();
331
416
  } if (rf & 2) {
332
- const item_r17 = i0.ɵɵnextContext(2).$implicit;
417
+ const item_r23 = i0.ɵɵnextContext(2).$implicit;
333
418
  i0.ɵɵadvance();
334
- i0.ɵɵtextInterpolate1(" ", item_r17.description, " ");
419
+ i0.ɵɵtextInterpolate1(" ", item_r23.description, " ");
335
420
  } }
336
- function CollectionsFullViewComponent_Conditional_26_For_2_Conditional_3_Conditional_8_Template(rf, ctx) { if (rf & 1) {
337
- i0.ɵɵelementStart(0, "span", 77);
421
+ function CollectionsFullViewComponent_Conditional_30_For_2_Conditional_4_Conditional_8_Template(rf, ctx) { if (rf & 1) {
422
+ i0.ɵɵelementStart(0, "span", 95);
338
423
  i0.ɵɵtext(1);
339
424
  i0.ɵɵelementEnd();
340
425
  } if (rf & 2) {
341
- const item_r17 = i0.ɵɵnextContext(2).$implicit;
426
+ const item_r23 = i0.ɵɵnextContext(2).$implicit;
342
427
  i0.ɵɵadvance();
343
- i0.ɵɵtextInterpolate1(" v", item_r17.versionNumber, " ");
428
+ i0.ɵɵtextInterpolate1(" v", item_r23.versionNumber, " ");
344
429
  } }
345
- function CollectionsFullViewComponent_Conditional_26_For_2_Conditional_3_Conditional_9_Template(rf, ctx) { if (rf & 1) {
346
- i0.ɵɵelementStart(0, "span", 78);
430
+ function CollectionsFullViewComponent_Conditional_30_For_2_Conditional_4_Conditional_9_Template(rf, ctx) { if (rf & 1) {
431
+ i0.ɵɵelementStart(0, "span", 96);
347
432
  i0.ɵɵtext(1);
348
433
  i0.ɵɵelementEnd();
349
434
  } if (rf & 2) {
350
- const item_r17 = i0.ɵɵnextContext(2).$implicit;
435
+ const item_r23 = i0.ɵɵnextContext(2).$implicit;
351
436
  i0.ɵɵadvance();
352
- i0.ɵɵtextInterpolate1(" ", item_r17.artifactType, " ");
437
+ i0.ɵɵtextInterpolate1(" ", item_r23.artifactType, " ");
353
438
  } }
354
- function CollectionsFullViewComponent_Conditional_26_For_2_Conditional_3_Template(rf, ctx) { if (rf & 1) {
355
- i0.ɵɵelementStart(0, "div", 64)(1, "div", 76);
356
- i0.ɵɵelement(2, "i", 9);
439
+ function CollectionsFullViewComponent_Conditional_30_For_2_Conditional_4_Template(rf, ctx) { if (rf & 1) {
440
+ i0.ɵɵelementStart(0, "div", 84)(1, "div", 94);
441
+ i0.ɵɵelement(2, "i", 11);
357
442
  i0.ɵɵelementEnd();
358
- i0.ɵɵelementStart(3, "div", 69)(4, "div", 70);
443
+ i0.ɵɵelementStart(3, "div", 87)(4, "div", 88);
359
444
  i0.ɵɵtext(5);
360
445
  i0.ɵɵelementEnd();
361
- i0.ɵɵconditionalCreate(6, CollectionsFullViewComponent_Conditional_26_For_2_Conditional_3_Conditional_6_Template, 2, 1, "div", 71);
362
- i0.ɵɵelementStart(7, "div", 72);
363
- i0.ɵɵconditionalCreate(8, CollectionsFullViewComponent_Conditional_26_For_2_Conditional_3_Conditional_8_Template, 2, 1, "span", 77);
364
- i0.ɵɵconditionalCreate(9, CollectionsFullViewComponent_Conditional_26_For_2_Conditional_3_Conditional_9_Template, 2, 1, "span", 78);
446
+ i0.ɵɵconditionalCreate(6, CollectionsFullViewComponent_Conditional_30_For_2_Conditional_4_Conditional_6_Template, 2, 1, "div", 89);
447
+ i0.ɵɵelementStart(7, "div", 90);
448
+ i0.ɵɵconditionalCreate(8, CollectionsFullViewComponent_Conditional_30_For_2_Conditional_4_Conditional_8_Template, 2, 1, "span", 95);
449
+ i0.ɵɵconditionalCreate(9, CollectionsFullViewComponent_Conditional_30_For_2_Conditional_4_Conditional_9_Template, 2, 1, "span", 96);
365
450
  i0.ɵɵelementEnd()()();
366
451
  } if (rf & 2) {
367
- const item_r17 = i0.ɵɵnextContext().$implicit;
368
- i0.ɵɵproperty("title", item_r17.description || item_r17.name);
452
+ const item_r23 = i0.ɵɵnextContext().$implicit;
453
+ i0.ɵɵproperty("title", item_r23.description || item_r23.name);
369
454
  i0.ɵɵadvance(2);
370
- i0.ɵɵproperty("ngClass", item_r17.icon);
455
+ i0.ɵɵproperty("ngClass", item_r23.icon);
371
456
  i0.ɵɵadvance(3);
372
- i0.ɵɵtextInterpolate(item_r17.name);
457
+ i0.ɵɵtextInterpolate(item_r23.name);
373
458
  i0.ɵɵadvance();
374
- i0.ɵɵconditional(item_r17.description ? 6 : -1);
459
+ i0.ɵɵconditional(item_r23.description ? 6 : -1);
375
460
  i0.ɵɵadvance(2);
376
- i0.ɵɵconditional(item_r17.versionNumber ? 8 : -1);
461
+ i0.ɵɵconditional(item_r23.versionNumber ? 8 : -1);
377
462
  i0.ɵɵadvance();
378
- i0.ɵɵconditional(item_r17.artifactType ? 9 : -1);
463
+ i0.ɵɵconditional(item_r23.artifactType ? 9 : -1);
379
464
  } }
380
- function CollectionsFullViewComponent_Conditional_26_For_2_Template(rf, ctx) { if (rf & 1) {
381
- const _r16 = i0.ɵɵgetCurrentView();
382
- i0.ɵɵelementStart(0, "div", 62);
383
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_26_For_2_Template_div_click_0_listener($event) { const item_r17 = i0.ɵɵrestoreView(_r16).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onItemClick(item_r17, $event)); })("dblclick", function CollectionsFullViewComponent_Conditional_26_For_2_Template_div_dblclick_0_listener($event) { const item_r17 = i0.ɵɵrestoreView(_r16).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onItemDoubleClick(item_r17, $event)); })("contextmenu", function CollectionsFullViewComponent_Conditional_26_For_2_Template_div_contextmenu_0_listener($event) { const item_r17 = i0.ɵɵrestoreView(_r16).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onItemContextMenu(item_r17, $event)); });
384
- i0.ɵɵconditionalCreate(1, CollectionsFullViewComponent_Conditional_26_For_2_Conditional_1_Template, 2, 1, "div", 63);
385
- i0.ɵɵconditionalCreate(2, CollectionsFullViewComponent_Conditional_26_For_2_Conditional_2_Template, 10, 6, "div", 64);
386
- i0.ɵɵconditionalCreate(3, CollectionsFullViewComponent_Conditional_26_For_2_Conditional_3_Template, 10, 6, "div", 64);
465
+ function CollectionsFullViewComponent_Conditional_30_For_2_Template(rf, ctx) { if (rf & 1) {
466
+ const _r22 = i0.ɵɵgetCurrentView();
467
+ i0.ɵɵelementStart(0, "div", 82);
468
+ i0.ɵɵlistener("dragstart", function CollectionsFullViewComponent_Conditional_30_For_2_Template_div_dragstart_0_listener($event) { const item_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onItemDragStart(item_r23, $event)); })("dragend", function CollectionsFullViewComponent_Conditional_30_For_2_Template_div_dragend_0_listener() { i0.ɵɵrestoreView(_r22); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onItemDragEnd()); })("dragover", function CollectionsFullViewComponent_Conditional_30_For_2_Template_div_dragover_0_listener($event) { const item_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(item_r23.type === "folder" ? ctx_r2.onFolderItemDragOver(item_r23, $event) : null); })("dragleave", function CollectionsFullViewComponent_Conditional_30_For_2_Template_div_dragleave_0_listener() { const item_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(item_r23.type === "folder" ? ctx_r2.onDragLeave(item_r23.id) : null); })("drop", function CollectionsFullViewComponent_Conditional_30_For_2_Template_div_drop_0_listener($event) { const item_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(item_r23.type === "folder" ? ctx_r2.onFolderItemDrop(item_r23, $event) : null); })("click", function CollectionsFullViewComponent_Conditional_30_For_2_Template_div_click_0_listener($event) { const item_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onItemClick(item_r23, $event)); })("dblclick", function CollectionsFullViewComponent_Conditional_30_For_2_Template_div_dblclick_0_listener($event) { const item_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onItemDoubleClick(item_r23, $event)); })("contextmenu", function CollectionsFullViewComponent_Conditional_30_For_2_Template_div_contextmenu_0_listener($event) { const item_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onItemContextMenu(item_r23, $event)); });
469
+ i0.ɵɵelementStart(1, "div", 83);
470
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_30_For_2_Template_div_click_1_listener($event) { const item_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onCheckboxClick(item_r23, $event)); });
471
+ i0.ɵɵelement(2, "i", 11);
472
+ i0.ɵɵelementEnd();
473
+ i0.ɵɵconditionalCreate(3, CollectionsFullViewComponent_Conditional_30_For_2_Conditional_3_Template, 10, 6, "div", 84);
474
+ i0.ɵɵconditionalCreate(4, CollectionsFullViewComponent_Conditional_30_For_2_Conditional_4_Template, 10, 6, "div", 84);
387
475
  i0.ɵɵelementEnd();
388
476
  } if (rf & 2) {
389
- const item_r17 = ctx.$implicit;
477
+ const item_r23 = ctx.$implicit;
390
478
  const ctx_r2 = i0.ɵɵnextContext(2);
391
- i0.ɵɵclassProp("selected", item_r17.selected)("active", item_r17.type === "artifact" && ctx_r2.IsArtifactActive(item_r17));
392
- i0.ɵɵadvance();
393
- i0.ɵɵconditional(ctx_r2.isSelectMode ? 1 : -1);
479
+ i0.ɵɵclassProp("selected", item_r23.selected)("active", item_r23.type === "artifact" && ctx_r2.IsArtifactActive(item_r23))("dragging", ctx_r2.draggedItemIds.includes(item_r23.id))("drag-over", ctx_r2.dragOverTargetId === item_r23.id);
480
+ i0.ɵɵproperty("draggable", true);
481
+ i0.ɵɵadvance(2);
482
+ i0.ɵɵproperty("ngClass", item_r23.selected ? "fa-check-circle" : "fa-circle");
394
483
  i0.ɵɵadvance();
395
- i0.ɵɵconditional(item_r17.type === "folder" ? 2 : -1);
484
+ i0.ɵɵconditional(item_r23.type === "folder" ? 3 : -1);
396
485
  i0.ɵɵadvance();
397
- i0.ɵɵconditional(item_r17.type === "artifact" ? 3 : -1);
486
+ i0.ɵɵconditional(item_r23.type === "artifact" ? 4 : -1);
398
487
  } }
399
- function CollectionsFullViewComponent_Conditional_26_Conditional_3_Template(rf, ctx) { if (rf & 1) {
400
- const _r19 = i0.ɵɵgetCurrentView();
401
- i0.ɵɵelementStart(0, "div", 61)(1, "span", 79);
488
+ function CollectionsFullViewComponent_Conditional_30_Conditional_3_Template(rf, ctx) { if (rf & 1) {
489
+ const _r24 = i0.ɵɵgetCurrentView();
490
+ i0.ɵɵelementStart(0, "div", 81)(1, "span", 97);
402
491
  i0.ɵɵtext(2);
403
492
  i0.ɵɵelementEnd();
404
- i0.ɵɵelementStart(3, "div", 80)(4, "button", 81);
405
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_26_Conditional_3_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.GoToPage(1)); });
406
- i0.ɵɵelement(5, "i", 82);
493
+ i0.ɵɵelementStart(3, "div", 98)(4, "button", 99);
494
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_30_Conditional_3_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r24); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.GoToPage(1)); });
495
+ i0.ɵɵelement(5, "i", 100);
407
496
  i0.ɵɵelementEnd();
408
- i0.ɵɵelementStart(6, "button", 83);
409
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_26_Conditional_3_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.GoToPage(ctx_r2.CurrentPage - 1)); });
410
- i0.ɵɵelement(7, "i", 84);
497
+ i0.ɵɵelementStart(6, "button", 101);
498
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_30_Conditional_3_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r24); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.GoToPage(ctx_r2.CurrentPage - 1)); });
499
+ i0.ɵɵelement(7, "i", 102);
411
500
  i0.ɵɵelementEnd();
412
- i0.ɵɵelementStart(8, "span", 85);
501
+ i0.ɵɵelementStart(8, "span", 103);
413
502
  i0.ɵɵtext(9);
414
503
  i0.ɵɵelementEnd();
415
- i0.ɵɵelementStart(10, "button", 86);
416
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_26_Conditional_3_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.GoToPage(ctx_r2.CurrentPage + 1)); });
417
- i0.ɵɵelement(11, "i", 87);
504
+ i0.ɵɵelementStart(10, "button", 104);
505
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_30_Conditional_3_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r24); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.GoToPage(ctx_r2.CurrentPage + 1)); });
506
+ i0.ɵɵelement(11, "i", 105);
418
507
  i0.ɵɵelementEnd();
419
- i0.ɵɵelementStart(12, "button", 88);
420
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_26_Conditional_3_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r19); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.GoToPage(ctx_r2.TotalPages)); });
421
- i0.ɵɵelement(13, "i", 89);
508
+ i0.ɵɵelementStart(12, "button", 106);
509
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_30_Conditional_3_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r24); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.GoToPage(ctx_r2.TotalPages)); });
510
+ i0.ɵɵelement(13, "i", 107);
422
511
  i0.ɵɵelementEnd()()();
423
512
  } if (rf & 2) {
424
513
  const ctx_r2 = i0.ɵɵnextContext(2);
@@ -435,11 +524,11 @@ function CollectionsFullViewComponent_Conditional_26_Conditional_3_Template(rf,
435
524
  i0.ɵɵadvance(2);
436
525
  i0.ɵɵproperty("disabled", ctx_r2.CurrentPage === ctx_r2.TotalPages);
437
526
  } }
438
- function CollectionsFullViewComponent_Conditional_26_Template(rf, ctx) { if (rf & 1) {
439
- i0.ɵɵelementStart(0, "div", 59);
440
- i0.ɵɵrepeaterCreate(1, CollectionsFullViewComponent_Conditional_26_For_2_Template, 4, 7, "div", 60, i0.ɵɵrepeaterTrackByIdentity);
527
+ function CollectionsFullViewComponent_Conditional_30_Template(rf, ctx) { if (rf & 1) {
528
+ i0.ɵɵelementStart(0, "div", 79);
529
+ i0.ɵɵrepeaterCreate(1, CollectionsFullViewComponent_Conditional_30_For_2_Template, 5, 12, "div", 80, i0.ɵɵrepeaterTrackByIdentity);
441
530
  i0.ɵɵelementEnd();
442
- i0.ɵɵconditionalCreate(3, CollectionsFullViewComponent_Conditional_26_Conditional_3_Template, 14, 9, "div", 61);
531
+ i0.ɵɵconditionalCreate(3, CollectionsFullViewComponent_Conditional_30_Conditional_3_Template, 14, 9, "div", 81);
443
532
  } if (rf & 2) {
444
533
  const ctx_r2 = i0.ɵɵnextContext();
445
534
  i0.ɵɵclassProp("select-mode", ctx_r2.isSelectMode);
@@ -448,155 +537,138 @@ function CollectionsFullViewComponent_Conditional_26_Template(rf, ctx) { if (rf
448
537
  i0.ɵɵadvance(2);
449
538
  i0.ɵɵconditional(ctx_r2.TotalPages > 1 ? 3 : -1);
450
539
  } }
451
- function CollectionsFullViewComponent_Conditional_27_Conditional_4_Template(rf, ctx) { if (rf & 1) {
452
- const _r21 = i0.ɵɵgetCurrentView();
453
- i0.ɵɵelementStart(0, "th", 92)(1, "i", 98);
454
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_27_Conditional_4_Template_i_click_1_listener() { i0.ɵɵrestoreView(_r21); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.selectedItems.size === ctx_r2.unifiedItems.length ? ctx_r2.clearSelection() : ctx_r2.selectAll()); });
455
- i0.ɵɵelementEnd()();
456
- } if (rf & 2) {
457
- const ctx_r2 = i0.ɵɵnextContext(2);
458
- i0.ɵɵadvance();
459
- i0.ɵɵproperty("ngClass", ctx_r2.selectedItems.size === ctx_r2.unifiedItems.length ? "fa-check-square" : "fa-square");
460
- } }
461
- function CollectionsFullViewComponent_Conditional_27_Conditional_8_Template(rf, ctx) { if (rf & 1) {
462
- i0.ɵɵelement(0, "i", 27);
540
+ function CollectionsFullViewComponent_Conditional_31_Conditional_9_Template(rf, ctx) { if (rf & 1) {
541
+ i0.ɵɵelement(0, "i", 33);
463
542
  } }
464
- function CollectionsFullViewComponent_Conditional_27_Conditional_9_Template(rf, ctx) { if (rf & 1) {
465
- i0.ɵɵelement(0, "i", 9);
543
+ function CollectionsFullViewComponent_Conditional_31_Conditional_10_Template(rf, ctx) { if (rf & 1) {
544
+ i0.ɵɵelement(0, "i", 11);
466
545
  } if (rf & 2) {
467
546
  const ctx_r2 = i0.ɵɵnextContext(2);
468
547
  i0.ɵɵproperty("ngClass", ctx_r2.sortOrder === "asc" ? "fa-sort-up" : "fa-sort-down");
469
548
  } }
470
- function CollectionsFullViewComponent_Conditional_27_Conditional_13_Template(rf, ctx) { if (rf & 1) {
471
- i0.ɵɵelement(0, "i", 27);
549
+ function CollectionsFullViewComponent_Conditional_31_Conditional_14_Template(rf, ctx) { if (rf & 1) {
550
+ i0.ɵɵelement(0, "i", 33);
472
551
  } }
473
- function CollectionsFullViewComponent_Conditional_27_Conditional_14_Template(rf, ctx) { if (rf & 1) {
474
- i0.ɵɵelement(0, "i", 9);
552
+ function CollectionsFullViewComponent_Conditional_31_Conditional_15_Template(rf, ctx) { if (rf & 1) {
553
+ i0.ɵɵelement(0, "i", 11);
475
554
  } if (rf & 2) {
476
555
  const ctx_r2 = i0.ɵɵnextContext(2);
477
556
  i0.ɵɵproperty("ngClass", ctx_r2.sortOrder === "asc" ? "fa-sort-up" : "fa-sort-down");
478
557
  } }
479
- function CollectionsFullViewComponent_Conditional_27_Conditional_18_Template(rf, ctx) { if (rf & 1) {
480
- i0.ɵɵelement(0, "i", 27);
558
+ function CollectionsFullViewComponent_Conditional_31_Conditional_19_Template(rf, ctx) { if (rf & 1) {
559
+ i0.ɵɵelement(0, "i", 33);
481
560
  } }
482
- function CollectionsFullViewComponent_Conditional_27_Conditional_19_Template(rf, ctx) { if (rf & 1) {
483
- i0.ɵɵelement(0, "i", 9);
561
+ function CollectionsFullViewComponent_Conditional_31_Conditional_20_Template(rf, ctx) { if (rf & 1) {
562
+ i0.ɵɵelement(0, "i", 11);
484
563
  } if (rf & 2) {
485
564
  const ctx_r2 = i0.ɵɵnextContext(2);
486
565
  i0.ɵɵproperty("ngClass", ctx_r2.sortOrder === "asc" ? "fa-sort-up" : "fa-sort-down");
487
566
  } }
488
- function CollectionsFullViewComponent_Conditional_27_For_24_Conditional_1_Template(rf, ctx) { if (rf & 1) {
489
- const _r24 = i0.ɵɵgetCurrentView();
490
- i0.ɵɵelementStart(0, "td", 92)(1, "i", 98);
491
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_27_For_24_Conditional_1_Template_i_click_1_listener($event) { i0.ɵɵrestoreView(_r24); const item_r23 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleItemSelection(item_r23, $event)); });
492
- i0.ɵɵelementEnd()();
493
- } if (rf & 2) {
494
- const item_r23 = i0.ɵɵnextContext().$implicit;
495
- i0.ɵɵadvance();
496
- i0.ɵɵproperty("ngClass", item_r23.selected ? "fa-check-circle" : "fa-circle");
497
- } }
498
- function CollectionsFullViewComponent_Conditional_27_For_24_Conditional_7_Template(rf, ctx) { if (rf & 1) {
499
- i0.ɵɵelement(0, "i", 102);
567
+ function CollectionsFullViewComponent_Conditional_31_For_25_Conditional_8_Template(rf, ctx) { if (rf & 1) {
568
+ i0.ɵɵelement(0, "i", 120);
500
569
  } }
501
- function CollectionsFullViewComponent_Conditional_27_For_24_Conditional_9_Template(rf, ctx) { if (rf & 1) {
570
+ function CollectionsFullViewComponent_Conditional_31_For_25_Conditional_10_Template(rf, ctx) { if (rf & 1) {
502
571
  i0.ɵɵelementStart(0, "span");
503
572
  i0.ɵɵtext(1, "Folder");
504
573
  i0.ɵɵelementEnd();
505
574
  } }
506
- function CollectionsFullViewComponent_Conditional_27_For_24_Conditional_10_Template(rf, ctx) { if (rf & 1) {
507
- i0.ɵɵelementStart(0, "span", 78);
575
+ function CollectionsFullViewComponent_Conditional_31_For_25_Conditional_11_Template(rf, ctx) { if (rf & 1) {
576
+ i0.ɵɵelementStart(0, "span", 96);
508
577
  i0.ɵɵtext(1);
509
578
  i0.ɵɵelementEnd();
510
579
  } if (rf & 2) {
511
- const item_r23 = i0.ɵɵnextContext().$implicit;
580
+ const item_r27 = i0.ɵɵnextContext().$implicit;
512
581
  i0.ɵɵadvance();
513
- i0.ɵɵtextInterpolate1(" ", item_r23.artifactType, " ");
582
+ i0.ɵɵtextInterpolate1(" ", item_r27.artifactType, " ");
514
583
  } }
515
- function CollectionsFullViewComponent_Conditional_27_For_24_Conditional_12_Template(rf, ctx) { if (rf & 1) {
584
+ function CollectionsFullViewComponent_Conditional_31_For_25_Conditional_13_Template(rf, ctx) { if (rf & 1) {
516
585
  i0.ɵɵelementStart(0, "span");
517
586
  i0.ɵɵtext(1);
518
587
  i0.ɵɵpipe(2, "date");
519
588
  i0.ɵɵelementEnd();
520
589
  } if (rf & 2) {
521
- const item_r23 = i0.ɵɵnextContext().$implicit;
590
+ const item_r27 = i0.ɵɵnextContext().$implicit;
522
591
  i0.ɵɵadvance();
523
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(2, 1, item_r23.lastModified, "short"), " ");
592
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(2, 1, item_r27.lastModified, "short"), " ");
524
593
  } }
525
- function CollectionsFullViewComponent_Conditional_27_For_24_Conditional_14_Template(rf, ctx) { if (rf & 1) {
594
+ function CollectionsFullViewComponent_Conditional_31_For_25_Conditional_15_Template(rf, ctx) { if (rf & 1) {
526
595
  i0.ɵɵelementStart(0, "span");
527
596
  i0.ɵɵtext(1);
528
597
  i0.ɵɵelementEnd();
529
598
  } if (rf & 2) {
530
- const item_r23 = i0.ɵɵnextContext().$implicit;
599
+ const item_r27 = i0.ɵɵnextContext().$implicit;
531
600
  i0.ɵɵadvance();
532
- i0.ɵɵtextInterpolate(item_r23.owner);
601
+ i0.ɵɵtextInterpolate(item_r27.owner);
533
602
  } }
534
- function CollectionsFullViewComponent_Conditional_27_For_24_Template(rf, ctx) { if (rf & 1) {
535
- const _r22 = i0.ɵɵgetCurrentView();
536
- i0.ɵɵelementStart(0, "tr", 99);
537
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_27_For_24_Template_tr_click_0_listener($event) { const item_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onItemClick(item_r23, $event)); })("dblclick", function CollectionsFullViewComponent_Conditional_27_For_24_Template_tr_dblclick_0_listener($event) { const item_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onItemDoubleClick(item_r23, $event)); })("contextmenu", function CollectionsFullViewComponent_Conditional_27_For_24_Template_tr_contextmenu_0_listener($event) { const item_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onItemContextMenu(item_r23, $event)); });
538
- i0.ɵɵconditionalCreate(1, CollectionsFullViewComponent_Conditional_27_For_24_Conditional_1_Template, 2, 1, "td", 92);
539
- i0.ɵɵelementStart(2, "td", 100)(3, "div", 101);
540
- i0.ɵɵelement(4, "i", 9);
541
- i0.ɵɵelementStart(5, "span");
542
- i0.ɵɵtext(6);
603
+ function CollectionsFullViewComponent_Conditional_31_For_25_Template(rf, ctx) { if (rf & 1) {
604
+ const _r26 = i0.ɵɵgetCurrentView();
605
+ i0.ɵɵelementStart(0, "tr", 117);
606
+ i0.ɵɵlistener("dragstart", function CollectionsFullViewComponent_Conditional_31_For_25_Template_tr_dragstart_0_listener($event) { const item_r27 = i0.ɵɵrestoreView(_r26).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onItemDragStart(item_r27, $event)); })("dragend", function CollectionsFullViewComponent_Conditional_31_For_25_Template_tr_dragend_0_listener() { i0.ɵɵrestoreView(_r26); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onItemDragEnd()); })("dragover", function CollectionsFullViewComponent_Conditional_31_For_25_Template_tr_dragover_0_listener($event) { const item_r27 = i0.ɵɵrestoreView(_r26).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(item_r27.type === "folder" ? ctx_r2.onFolderItemDragOver(item_r27, $event) : null); })("dragleave", function CollectionsFullViewComponent_Conditional_31_For_25_Template_tr_dragleave_0_listener() { const item_r27 = i0.ɵɵrestoreView(_r26).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(item_r27.type === "folder" ? ctx_r2.onDragLeave(item_r27.id) : null); })("drop", function CollectionsFullViewComponent_Conditional_31_For_25_Template_tr_drop_0_listener($event) { const item_r27 = i0.ɵɵrestoreView(_r26).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(item_r27.type === "folder" ? ctx_r2.onFolderItemDrop(item_r27, $event) : null); })("click", function CollectionsFullViewComponent_Conditional_31_For_25_Template_tr_click_0_listener($event) { const item_r27 = i0.ɵɵrestoreView(_r26).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onItemClick(item_r27, $event)); })("dblclick", function CollectionsFullViewComponent_Conditional_31_For_25_Template_tr_dblclick_0_listener($event) { const item_r27 = i0.ɵɵrestoreView(_r26).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onItemDoubleClick(item_r27, $event)); })("contextmenu", function CollectionsFullViewComponent_Conditional_31_For_25_Template_tr_contextmenu_0_listener($event) { const item_r27 = i0.ɵɵrestoreView(_r26).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onItemContextMenu(item_r27, $event)); });
607
+ i0.ɵɵelementStart(1, "td", 110)(2, "i", 111);
608
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_31_For_25_Template_i_click_2_listener($event) { const item_r27 = i0.ɵɵrestoreView(_r26).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onCheckboxClick(item_r27, $event)); });
609
+ i0.ɵɵelementEnd()();
610
+ i0.ɵɵelementStart(3, "td", 118)(4, "div", 119);
611
+ i0.ɵɵelement(5, "i", 11);
612
+ i0.ɵɵelementStart(6, "span");
613
+ i0.ɵɵtext(7);
543
614
  i0.ɵɵelementEnd();
544
- i0.ɵɵconditionalCreate(7, CollectionsFullViewComponent_Conditional_27_For_24_Conditional_7_Template, 1, 0, "i", 102);
615
+ i0.ɵɵconditionalCreate(8, CollectionsFullViewComponent_Conditional_31_For_25_Conditional_8_Template, 1, 0, "i", 120);
545
616
  i0.ɵɵelementEnd()();
546
- i0.ɵɵelementStart(8, "td", 103);
547
- i0.ɵɵconditionalCreate(9, CollectionsFullViewComponent_Conditional_27_For_24_Conditional_9_Template, 2, 0, "span");
548
- i0.ɵɵconditionalCreate(10, CollectionsFullViewComponent_Conditional_27_For_24_Conditional_10_Template, 2, 1, "span", 78);
617
+ i0.ɵɵelementStart(9, "td", 121);
618
+ i0.ɵɵconditionalCreate(10, CollectionsFullViewComponent_Conditional_31_For_25_Conditional_10_Template, 2, 0, "span");
619
+ i0.ɵɵconditionalCreate(11, CollectionsFullViewComponent_Conditional_31_For_25_Conditional_11_Template, 2, 1, "span", 96);
549
620
  i0.ɵɵelementEnd();
550
- i0.ɵɵelementStart(11, "td", 104);
551
- i0.ɵɵconditionalCreate(12, CollectionsFullViewComponent_Conditional_27_For_24_Conditional_12_Template, 3, 4, "span");
621
+ i0.ɵɵelementStart(12, "td", 122);
622
+ i0.ɵɵconditionalCreate(13, CollectionsFullViewComponent_Conditional_31_For_25_Conditional_13_Template, 3, 4, "span");
552
623
  i0.ɵɵelementEnd();
553
- i0.ɵɵelementStart(13, "td", 96);
554
- i0.ɵɵconditionalCreate(14, CollectionsFullViewComponent_Conditional_27_For_24_Conditional_14_Template, 2, 1, "span");
624
+ i0.ɵɵelementStart(14, "td", 115);
625
+ i0.ɵɵconditionalCreate(15, CollectionsFullViewComponent_Conditional_31_For_25_Conditional_15_Template, 2, 1, "span");
555
626
  i0.ɵɵelementEnd()();
556
627
  } if (rf & 2) {
557
- const item_r23 = ctx.$implicit;
628
+ const item_r27 = ctx.$implicit;
558
629
  const ctx_r2 = i0.ɵɵnextContext(2);
559
- i0.ɵɵclassProp("selected", item_r23.selected)("active", item_r23.type === "artifact" && ctx_r2.IsArtifactActive(item_r23));
560
- i0.ɵɵadvance();
561
- i0.ɵɵconditional(ctx_r2.isSelectMode ? 1 : -1);
630
+ i0.ɵɵclassProp("selected", item_r27.selected)("active", item_r27.type === "artifact" && ctx_r2.IsArtifactActive(item_r27))("dragging", ctx_r2.draggedItemIds.includes(item_r27.id))("drag-over", ctx_r2.dragOverTargetId === item_r27.id);
631
+ i0.ɵɵproperty("draggable", true);
632
+ i0.ɵɵadvance(2);
633
+ i0.ɵɵproperty("ngClass", item_r27.selected ? "fa-check-circle" : "fa-circle");
562
634
  i0.ɵɵadvance(3);
563
- i0.ɵɵproperty("ngClass", item_r23.type === "folder" ? "fa-folder" : item_r23.icon);
635
+ i0.ɵɵproperty("ngClass", item_r27.type === "folder" ? "fa-folder" : item_r27.icon);
564
636
  i0.ɵɵadvance(2);
565
- i0.ɵɵtextInterpolate(item_r23.name);
637
+ i0.ɵɵtextInterpolate(item_r27.name);
566
638
  i0.ɵɵadvance();
567
- i0.ɵɵconditional(item_r23.isShared ? 7 : -1);
639
+ i0.ɵɵconditional(item_r27.isShared ? 8 : -1);
568
640
  i0.ɵɵadvance(2);
569
- i0.ɵɵconditional(item_r23.type === "folder" ? 9 : -1);
641
+ i0.ɵɵconditional(item_r27.type === "folder" ? 10 : -1);
570
642
  i0.ɵɵadvance();
571
- i0.ɵɵconditional(item_r23.type === "artifact" ? 10 : -1);
643
+ i0.ɵɵconditional(item_r27.type === "artifact" ? 11 : -1);
572
644
  i0.ɵɵadvance(2);
573
- i0.ɵɵconditional(item_r23.lastModified ? 12 : -1);
645
+ i0.ɵɵconditional(item_r27.lastModified ? 13 : -1);
574
646
  i0.ɵɵadvance(2);
575
- i0.ɵɵconditional(item_r23.owner ? 14 : -1);
647
+ i0.ɵɵconditional(item_r27.owner ? 15 : -1);
576
648
  } }
577
- function CollectionsFullViewComponent_Conditional_27_Conditional_25_Template(rf, ctx) { if (rf & 1) {
578
- const _r25 = i0.ɵɵgetCurrentView();
579
- i0.ɵɵelementStart(0, "div", 61)(1, "span", 79);
649
+ function CollectionsFullViewComponent_Conditional_31_Conditional_26_Template(rf, ctx) { if (rf & 1) {
650
+ const _r28 = i0.ɵɵgetCurrentView();
651
+ i0.ɵɵelementStart(0, "div", 81)(1, "span", 97);
580
652
  i0.ɵɵtext(2);
581
653
  i0.ɵɵelementEnd();
582
- i0.ɵɵelementStart(3, "div", 80)(4, "button", 81);
583
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_27_Conditional_25_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r25); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.GoToPage(1)); });
584
- i0.ɵɵelement(5, "i", 82);
654
+ i0.ɵɵelementStart(3, "div", 98)(4, "button", 99);
655
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_31_Conditional_26_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r28); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.GoToPage(1)); });
656
+ i0.ɵɵelement(5, "i", 100);
585
657
  i0.ɵɵelementEnd();
586
- i0.ɵɵelementStart(6, "button", 83);
587
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_27_Conditional_25_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r25); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.GoToPage(ctx_r2.CurrentPage - 1)); });
588
- i0.ɵɵelement(7, "i", 84);
658
+ i0.ɵɵelementStart(6, "button", 101);
659
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_31_Conditional_26_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r28); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.GoToPage(ctx_r2.CurrentPage - 1)); });
660
+ i0.ɵɵelement(7, "i", 102);
589
661
  i0.ɵɵelementEnd();
590
- i0.ɵɵelementStart(8, "span", 85);
662
+ i0.ɵɵelementStart(8, "span", 103);
591
663
  i0.ɵɵtext(9);
592
664
  i0.ɵɵelementEnd();
593
- i0.ɵɵelementStart(10, "button", 86);
594
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_27_Conditional_25_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r25); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.GoToPage(ctx_r2.CurrentPage + 1)); });
595
- i0.ɵɵelement(11, "i", 87);
665
+ i0.ɵɵelementStart(10, "button", 104);
666
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_31_Conditional_26_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r28); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.GoToPage(ctx_r2.CurrentPage + 1)); });
667
+ i0.ɵɵelement(11, "i", 105);
596
668
  i0.ɵɵelementEnd();
597
- i0.ɵɵelementStart(12, "button", 88);
598
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_27_Conditional_25_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r25); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.GoToPage(ctx_r2.TotalPages)); });
599
- i0.ɵɵelement(13, "i", 89);
669
+ i0.ɵɵelementStart(12, "button", 106);
670
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_31_Conditional_26_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r28); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.GoToPage(ctx_r2.TotalPages)); });
671
+ i0.ɵɵelement(13, "i", 107);
600
672
  i0.ɵɵelementEnd()()();
601
673
  } if (rf & 2) {
602
674
  const ctx_r2 = i0.ɵɵnextContext(2);
@@ -613,103 +685,151 @@ function CollectionsFullViewComponent_Conditional_27_Conditional_25_Template(rf,
613
685
  i0.ɵɵadvance(2);
614
686
  i0.ɵɵproperty("disabled", ctx_r2.CurrentPage === ctx_r2.TotalPages);
615
687
  } }
616
- function CollectionsFullViewComponent_Conditional_27_Template(rf, ctx) { if (rf & 1) {
617
- const _r20 = i0.ɵɵgetCurrentView();
618
- i0.ɵɵelementStart(0, "div", 90)(1, "table", 91)(2, "thead")(3, "tr");
619
- i0.ɵɵconditionalCreate(4, CollectionsFullViewComponent_Conditional_27_Conditional_4_Template, 2, 1, "th", 92);
620
- i0.ɵɵelementStart(5, "th", 93);
621
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_27_Template_th_click_5_listener() { i0.ɵɵrestoreView(_r20); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.setSortBy("name")); });
622
- i0.ɵɵelementStart(6, "span");
623
- i0.ɵɵtext(7, "Name");
688
+ function CollectionsFullViewComponent_Conditional_31_Template(rf, ctx) { if (rf & 1) {
689
+ const _r25 = i0.ɵɵgetCurrentView();
690
+ i0.ɵɵelementStart(0, "div", 108)(1, "table", 109)(2, "thead")(3, "tr")(4, "th", 110)(5, "i", 111);
691
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_31_Template_i_click_5_listener() { i0.ɵɵrestoreView(_r25); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.selectedItems.size === ctx_r2.unifiedItems.length ? ctx_r2.clearSelection() : ctx_r2.selectAll()); });
692
+ i0.ɵɵelementEnd()();
693
+ i0.ɵɵelementStart(6, "th", 112);
694
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_31_Template_th_click_6_listener() { i0.ɵɵrestoreView(_r25); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.setSortBy("name")); });
695
+ i0.ɵɵelementStart(7, "span");
696
+ i0.ɵɵtext(8, "Name");
624
697
  i0.ɵɵelementEnd();
625
- i0.ɵɵconditionalCreate(8, CollectionsFullViewComponent_Conditional_27_Conditional_8_Template, 1, 0, "i", 27);
626
- i0.ɵɵconditionalCreate(9, CollectionsFullViewComponent_Conditional_27_Conditional_9_Template, 1, 1, "i", 9);
698
+ i0.ɵɵconditionalCreate(9, CollectionsFullViewComponent_Conditional_31_Conditional_9_Template, 1, 0, "i", 33);
699
+ i0.ɵɵconditionalCreate(10, CollectionsFullViewComponent_Conditional_31_Conditional_10_Template, 1, 1, "i", 11);
627
700
  i0.ɵɵelementEnd();
628
- i0.ɵɵelementStart(10, "th", 94);
629
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_27_Template_th_click_10_listener() { i0.ɵɵrestoreView(_r20); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.setSortBy("type")); });
630
- i0.ɵɵelementStart(11, "span");
631
- i0.ɵɵtext(12, "Type");
701
+ i0.ɵɵelementStart(11, "th", 113);
702
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_31_Template_th_click_11_listener() { i0.ɵɵrestoreView(_r25); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.setSortBy("type")); });
703
+ i0.ɵɵelementStart(12, "span");
704
+ i0.ɵɵtext(13, "Type");
632
705
  i0.ɵɵelementEnd();
633
- i0.ɵɵconditionalCreate(13, CollectionsFullViewComponent_Conditional_27_Conditional_13_Template, 1, 0, "i", 27);
634
- i0.ɵɵconditionalCreate(14, CollectionsFullViewComponent_Conditional_27_Conditional_14_Template, 1, 1, "i", 9);
706
+ i0.ɵɵconditionalCreate(14, CollectionsFullViewComponent_Conditional_31_Conditional_14_Template, 1, 0, "i", 33);
707
+ i0.ɵɵconditionalCreate(15, CollectionsFullViewComponent_Conditional_31_Conditional_15_Template, 1, 1, "i", 11);
635
708
  i0.ɵɵelementEnd();
636
- i0.ɵɵelementStart(15, "th", 95);
637
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_27_Template_th_click_15_listener() { i0.ɵɵrestoreView(_r20); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.setSortBy("date")); });
638
- i0.ɵɵelementStart(16, "span");
639
- i0.ɵɵtext(17, "Modified");
709
+ i0.ɵɵelementStart(16, "th", 114);
710
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_31_Template_th_click_16_listener() { i0.ɵɵrestoreView(_r25); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.setSortBy("date")); });
711
+ i0.ɵɵelementStart(17, "span");
712
+ i0.ɵɵtext(18, "Modified");
640
713
  i0.ɵɵelementEnd();
641
- i0.ɵɵconditionalCreate(18, CollectionsFullViewComponent_Conditional_27_Conditional_18_Template, 1, 0, "i", 27);
642
- i0.ɵɵconditionalCreate(19, CollectionsFullViewComponent_Conditional_27_Conditional_19_Template, 1, 1, "i", 9);
714
+ i0.ɵɵconditionalCreate(19, CollectionsFullViewComponent_Conditional_31_Conditional_19_Template, 1, 0, "i", 33);
715
+ i0.ɵɵconditionalCreate(20, CollectionsFullViewComponent_Conditional_31_Conditional_20_Template, 1, 1, "i", 11);
643
716
  i0.ɵɵelementEnd();
644
- i0.ɵɵelementStart(20, "th", 96);
645
- i0.ɵɵtext(21, "Owner");
717
+ i0.ɵɵelementStart(21, "th", 115);
718
+ i0.ɵɵtext(22, "Owner");
646
719
  i0.ɵɵelementEnd()()();
647
- i0.ɵɵelementStart(22, "tbody");
648
- i0.ɵɵrepeaterCreate(23, CollectionsFullViewComponent_Conditional_27_For_24_Template, 15, 12, "tr", 97, i0.ɵɵrepeaterTrackByIdentity);
720
+ i0.ɵɵelementStart(23, "tbody");
721
+ i0.ɵɵrepeaterCreate(24, CollectionsFullViewComponent_Conditional_31_For_25_Template, 16, 17, "tr", 116, i0.ɵɵrepeaterTrackByIdentity);
649
722
  i0.ɵɵelementEnd()()();
650
- i0.ɵɵconditionalCreate(25, CollectionsFullViewComponent_Conditional_27_Conditional_25_Template, 14, 9, "div", 61);
723
+ i0.ɵɵconditionalCreate(26, CollectionsFullViewComponent_Conditional_31_Conditional_26_Template, 14, 9, "div", 81);
651
724
  } if (rf & 2) {
652
725
  const ctx_r2 = i0.ɵɵnextContext();
653
726
  i0.ɵɵclassProp("select-mode", ctx_r2.isSelectMode);
727
+ i0.ɵɵadvance(5);
728
+ i0.ɵɵproperty("ngClass", ctx_r2.selectedItems.size === ctx_r2.unifiedItems.length && ctx_r2.unifiedItems.length > 0 ? "fa-check-square" : "fa-square");
654
729
  i0.ɵɵadvance(4);
655
- i0.ɵɵconditional(ctx_r2.isSelectMode ? 4 : -1);
656
- i0.ɵɵadvance(4);
657
- i0.ɵɵconditional(ctx_r2.sortBy !== "name" ? 8 : -1);
730
+ i0.ɵɵconditional(ctx_r2.sortBy !== "name" ? 9 : -1);
658
731
  i0.ɵɵadvance();
659
- i0.ɵɵconditional(ctx_r2.sortBy === "name" ? 9 : -1);
732
+ i0.ɵɵconditional(ctx_r2.sortBy === "name" ? 10 : -1);
660
733
  i0.ɵɵadvance(4);
661
- i0.ɵɵconditional(ctx_r2.sortBy !== "type" ? 13 : -1);
734
+ i0.ɵɵconditional(ctx_r2.sortBy !== "type" ? 14 : -1);
662
735
  i0.ɵɵadvance();
663
- i0.ɵɵconditional(ctx_r2.sortBy === "type" ? 14 : -1);
736
+ i0.ɵɵconditional(ctx_r2.sortBy === "type" ? 15 : -1);
664
737
  i0.ɵɵadvance(4);
665
- i0.ɵɵconditional(ctx_r2.sortBy !== "date" ? 18 : -1);
738
+ i0.ɵɵconditional(ctx_r2.sortBy !== "date" ? 19 : -1);
666
739
  i0.ɵɵadvance();
667
- i0.ɵɵconditional(ctx_r2.sortBy === "date" ? 19 : -1);
740
+ i0.ɵɵconditional(ctx_r2.sortBy === "date" ? 20 : -1);
668
741
  i0.ɵɵadvance(4);
669
742
  i0.ɵɵrepeater(ctx_r2.PagedItems);
670
743
  i0.ɵɵadvance(2);
671
- i0.ɵɵconditional(ctx_r2.TotalPages > 1 ? 25 : -1);
744
+ i0.ɵɵconditional(ctx_r2.TotalPages > 1 ? 26 : -1);
672
745
  } }
673
- function CollectionsFullViewComponent_Conditional_28_Conditional_2_Conditional_5_Template(rf, ctx) { if (rf & 1) {
674
- const _r28 = i0.ɵɵgetCurrentView();
675
- i0.ɵɵelementStart(0, "button", 107);
676
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_28_Conditional_2_Conditional_5_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r28); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onContextMenuAction("share")); });
677
- i0.ɵɵelement(1, "i", 39);
746
+ function CollectionsFullViewComponent_Conditional_32_For_7_Template(rf, ctx) { if (rf & 1) {
747
+ const _r30 = i0.ɵɵgetCurrentView();
748
+ i0.ɵɵelementStart(0, "span", 125);
749
+ i0.ɵɵelement(1, "i", 11);
750
+ i0.ɵɵelementStart(2, "span", 129);
751
+ i0.ɵɵtext(3);
752
+ i0.ɵɵelementEnd();
753
+ i0.ɵɵelementStart(4, "button", 130);
754
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_32_For_7_Template_button_click_4_listener() { const entry_r31 = i0.ɵɵrestoreView(_r30).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.removeFromShelf(entry_r31.item.id)); });
755
+ i0.ɵɵelement(5, "i", 40);
756
+ i0.ɵɵelementEnd()();
757
+ } if (rf & 2) {
758
+ const entry_r31 = ctx.$implicit;
759
+ i0.ɵɵproperty("title", entry_r31.item.name);
760
+ i0.ɵɵadvance();
761
+ i0.ɵɵproperty("ngClass", entry_r31.item.type === "folder" ? "fa-folder" : entry_r31.item.icon);
762
+ i0.ɵɵadvance(2);
763
+ i0.ɵɵtextInterpolate(entry_r31.item.name);
764
+ } }
765
+ function CollectionsFullViewComponent_Conditional_32_Template(rf, ctx) { if (rf & 1) {
766
+ const _r29 = i0.ɵɵgetCurrentView();
767
+ i0.ɵɵelementStart(0, "div", 26)(1, "div", 123);
768
+ i0.ɵɵelement(2, "i", 62);
769
+ i0.ɵɵelementStart(3, "span");
770
+ i0.ɵɵtext(4);
771
+ i0.ɵɵelementEnd()();
772
+ i0.ɵɵelementStart(5, "div", 124);
773
+ i0.ɵɵrepeaterCreate(6, CollectionsFullViewComponent_Conditional_32_For_7_Template, 6, 3, "span", 125, _forTrack1);
774
+ i0.ɵɵelementEnd();
775
+ i0.ɵɵelementStart(8, "div", 126)(9, "button", 127);
776
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_32_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r29); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.dropShelfHere()); });
777
+ i0.ɵɵelement(10, "i", 128);
778
+ i0.ɵɵtext(11, " Move here ");
779
+ i0.ɵɵelementEnd();
780
+ i0.ɵɵelementStart(12, "button", 59);
781
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_32_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r29); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.clearShelf()); });
782
+ i0.ɵɵtext(13, "Clear");
783
+ i0.ɵɵelementEnd()()();
784
+ } if (rf & 2) {
785
+ const ctx_r2 = i0.ɵɵnextContext();
786
+ i0.ɵɵadvance(4);
787
+ i0.ɵɵtextInterpolate1("", ctx_r2.shelf.length, " staged");
788
+ i0.ɵɵadvance(2);
789
+ i0.ɵɵrepeater(ctx_r2.shelf);
790
+ i0.ɵɵadvance(3);
791
+ i0.ɵɵproperty("disabled", !ctx_r2.currentCollectionId)("title", ctx_r2.currentCollectionId ? "Move staged items into this collection" : "Open a collection to move items here");
792
+ } }
793
+ function CollectionsFullViewComponent_Conditional_33_Conditional_2_Conditional_5_Template(rf, ctx) { if (rf & 1) {
794
+ const _r34 = i0.ɵɵgetCurrentView();
795
+ i0.ɵɵelementStart(0, "button", 133);
796
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_33_Conditional_2_Conditional_5_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r34); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onContextMenuAction("share")); });
797
+ i0.ɵɵelement(1, "i", 45);
678
798
  i0.ɵɵelementStart(2, "span");
679
799
  i0.ɵɵtext(3, "Share");
680
800
  i0.ɵɵelementEnd()();
681
801
  } }
682
- function CollectionsFullViewComponent_Conditional_28_Conditional_2_Conditional_6_Template(rf, ctx) { if (rf & 1) {
683
- const _r29 = i0.ɵɵgetCurrentView();
684
- i0.ɵɵelementStart(0, "button", 107);
685
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_28_Conditional_2_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r29); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onContextMenuAction("edit")); });
686
- i0.ɵɵelement(1, "i", 40);
802
+ function CollectionsFullViewComponent_Conditional_33_Conditional_2_Conditional_6_Template(rf, ctx) { if (rf & 1) {
803
+ const _r35 = i0.ɵɵgetCurrentView();
804
+ i0.ɵɵelementStart(0, "button", 133);
805
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_33_Conditional_2_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r35); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onContextMenuAction("edit")); });
806
+ i0.ɵɵelement(1, "i", 46);
687
807
  i0.ɵɵelementStart(2, "span");
688
808
  i0.ɵɵtext(3, "Edit");
689
809
  i0.ɵɵelementEnd()();
690
810
  } }
691
- function CollectionsFullViewComponent_Conditional_28_Conditional_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
692
- const _r30 = i0.ɵɵgetCurrentView();
693
- i0.ɵɵelement(0, "div", 108);
694
- i0.ɵɵelementStart(1, "button", 110);
695
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_28_Conditional_2_Conditional_7_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r30); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onContextMenuAction("delete")); });
696
- i0.ɵɵelement(2, "i", 42);
811
+ function CollectionsFullViewComponent_Conditional_33_Conditional_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
812
+ const _r36 = i0.ɵɵgetCurrentView();
813
+ i0.ɵɵelement(0, "div", 134);
814
+ i0.ɵɵelementStart(1, "button", 136);
815
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_33_Conditional_2_Conditional_7_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r36); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onContextMenuAction("delete")); });
816
+ i0.ɵɵelement(2, "i", 48);
697
817
  i0.ɵɵelementStart(3, "span");
698
818
  i0.ɵɵtext(4, "Delete");
699
819
  i0.ɵɵelementEnd()();
700
820
  } }
701
- function CollectionsFullViewComponent_Conditional_28_Conditional_2_Template(rf, ctx) { if (rf & 1) {
702
- const _r27 = i0.ɵɵgetCurrentView();
703
- i0.ɵɵelementStart(0, "button", 107);
704
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_28_Conditional_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r27); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onContextMenuAction("open")); });
705
- i0.ɵɵelement(1, "i", 56);
821
+ function CollectionsFullViewComponent_Conditional_33_Conditional_2_Template(rf, ctx) { if (rf & 1) {
822
+ const _r33 = i0.ɵɵgetCurrentView();
823
+ i0.ɵɵelementStart(0, "button", 133);
824
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_33_Conditional_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r33); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onContextMenuAction("open")); });
825
+ i0.ɵɵelement(1, "i", 76);
706
826
  i0.ɵɵelementStart(2, "span");
707
827
  i0.ɵɵtext(3, "Open");
708
828
  i0.ɵɵelementEnd()();
709
- i0.ɵɵelement(4, "div", 108);
710
- i0.ɵɵconditionalCreate(5, CollectionsFullViewComponent_Conditional_28_Conditional_2_Conditional_5_Template, 4, 0, "button", 109);
711
- i0.ɵɵconditionalCreate(6, CollectionsFullViewComponent_Conditional_28_Conditional_2_Conditional_6_Template, 4, 0, "button", 109);
712
- i0.ɵɵconditionalCreate(7, CollectionsFullViewComponent_Conditional_28_Conditional_2_Conditional_7_Template, 5, 0);
829
+ i0.ɵɵelement(4, "div", 134);
830
+ i0.ɵɵconditionalCreate(5, CollectionsFullViewComponent_Conditional_33_Conditional_2_Conditional_5_Template, 4, 0, "button", 135);
831
+ i0.ɵɵconditionalCreate(6, CollectionsFullViewComponent_Conditional_33_Conditional_2_Conditional_6_Template, 4, 0, "button", 135);
832
+ i0.ɵɵconditionalCreate(7, CollectionsFullViewComponent_Conditional_33_Conditional_2_Conditional_7_Template, 5, 0);
713
833
  } if (rf & 2) {
714
834
  const ctx_r2 = i0.ɵɵnextContext(2);
715
835
  i0.ɵɵadvance(5);
@@ -719,38 +839,109 @@ function CollectionsFullViewComponent_Conditional_28_Conditional_2_Template(rf,
719
839
  i0.ɵɵadvance();
720
840
  i0.ɵɵconditional(ctx_r2.canDelete(ctx_r2.contextMenuItem.collection) ? 7 : -1);
721
841
  } }
722
- function CollectionsFullViewComponent_Conditional_28_Conditional_3_Conditional_4_Template(rf, ctx) { if (rf & 1) {
723
- const _r32 = i0.ɵɵgetCurrentView();
724
- i0.ɵɵelement(0, "div", 108);
725
- i0.ɵɵelementStart(1, "button", 110);
726
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_28_Conditional_3_Conditional_4_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r32); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onContextMenuAction("remove")); });
727
- i0.ɵɵelement(2, "i", 112);
728
- i0.ɵɵelementStart(3, "span");
729
- i0.ɵɵtext(4, "Remove from Collection");
842
+ function CollectionsFullViewComponent_Conditional_33_Conditional_3_Conditional_0_Conditional_5_Template(rf, ctx) { if (rf & 1) {
843
+ i0.ɵɵelementStart(0, "div", 137);
844
+ i0.ɵɵelement(1, "i", 139);
845
+ i0.ɵɵtext(2, " Loading\u2026");
846
+ i0.ɵɵelementEnd();
847
+ } }
848
+ function CollectionsFullViewComponent_Conditional_33_Conditional_3_Conditional_0_Conditional_6_Template(rf, ctx) { if (rf & 1) {
849
+ i0.ɵɵelementStart(0, "div", 137);
850
+ i0.ɵɵtext(1, "No other collections");
851
+ i0.ɵɵelementEnd();
852
+ } }
853
+ function CollectionsFullViewComponent_Conditional_33_Conditional_3_Conditional_0_Conditional_7_For_2_Template(rf, ctx) { if (rf & 1) {
854
+ const _r38 = i0.ɵɵgetCurrentView();
855
+ i0.ɵɵelementStart(0, "button", 133);
856
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_33_Conditional_3_Conditional_0_Conditional_7_For_2_Template_button_click_0_listener() { const t_r39 = i0.ɵɵrestoreView(_r38).$implicit; const ctx_r2 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r2.moveArtifactToCollection(t_r39.collection)); });
857
+ i0.ɵɵelement(1, "i", 68);
858
+ i0.ɵɵelementStart(2, "span");
859
+ i0.ɵɵtext(3);
860
+ i0.ɵɵelementEnd()();
861
+ } if (rf & 2) {
862
+ const t_r39 = ctx.$implicit;
863
+ i0.ɵɵstyleProp("padding-left", 14 + t_r39.depth * 12, "px");
864
+ i0.ɵɵadvance();
865
+ i0.ɵɵstyleProp("color", t_r39.collection.Color || null);
866
+ i0.ɵɵadvance(2);
867
+ i0.ɵɵtextInterpolate(t_r39.collection.Name);
868
+ } }
869
+ function CollectionsFullViewComponent_Conditional_33_Conditional_3_Conditional_0_Conditional_7_Template(rf, ctx) { if (rf & 1) {
870
+ i0.ɵɵelementStart(0, "div", 138);
871
+ i0.ɵɵrepeaterCreate(1, CollectionsFullViewComponent_Conditional_33_Conditional_3_Conditional_0_Conditional_7_For_2_Template, 4, 5, "button", 140, _forTrack0);
872
+ i0.ɵɵelementEnd();
873
+ } if (rf & 2) {
874
+ const ctx_r2 = i0.ɵɵnextContext(4);
875
+ i0.ɵɵadvance();
876
+ i0.ɵɵrepeater(ctx_r2.moveTargets);
877
+ } }
878
+ function CollectionsFullViewComponent_Conditional_33_Conditional_3_Conditional_0_Template(rf, ctx) { if (rf & 1) {
879
+ const _r37 = i0.ɵɵgetCurrentView();
880
+ i0.ɵɵelementStart(0, "button", 133);
881
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_33_Conditional_3_Conditional_0_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r37); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.closeMoveSubmenu($event)); });
882
+ i0.ɵɵelement(1, "i", 102);
883
+ i0.ɵɵelementStart(2, "span");
884
+ i0.ɵɵtext(3, "Move to Collection");
885
+ i0.ɵɵelementEnd()();
886
+ i0.ɵɵelement(4, "div", 134);
887
+ i0.ɵɵconditionalCreate(5, CollectionsFullViewComponent_Conditional_33_Conditional_3_Conditional_0_Conditional_5_Template, 3, 0, "div", 137)(6, CollectionsFullViewComponent_Conditional_33_Conditional_3_Conditional_0_Conditional_6_Template, 2, 0, "div", 137)(7, CollectionsFullViewComponent_Conditional_33_Conditional_3_Conditional_0_Conditional_7_Template, 3, 0, "div", 138);
888
+ } if (rf & 2) {
889
+ const ctx_r2 = i0.ɵɵnextContext(3);
890
+ i0.ɵɵadvance(5);
891
+ i0.ɵɵconditional(ctx_r2.isLoadingMoveTargets ? 5 : ctx_r2.moveTargets.length === 0 ? 6 : 7);
892
+ } }
893
+ function CollectionsFullViewComponent_Conditional_33_Conditional_3_Conditional_1_Conditional_8_Template(rf, ctx) { if (rf & 1) {
894
+ const _r41 = i0.ɵɵgetCurrentView();
895
+ i0.ɵɵelementStart(0, "button", 133);
896
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_33_Conditional_3_Conditional_1_Conditional_8_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r41); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.openMoveSubmenu($event)); });
897
+ i0.ɵɵelement(1, "i", 60);
898
+ i0.ɵɵelementStart(2, "span");
899
+ i0.ɵɵtext(3, "Move to Collection");
900
+ i0.ɵɵelementEnd();
901
+ i0.ɵɵelement(4, "i", 143);
902
+ i0.ɵɵelementEnd();
903
+ i0.ɵɵelement(5, "div", 134);
904
+ i0.ɵɵelementStart(6, "button", 136);
905
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_33_Conditional_3_Conditional_1_Conditional_8_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r41); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.onContextMenuAction("remove")); });
906
+ i0.ɵɵelement(7, "i", 144);
907
+ i0.ɵɵelementStart(8, "span");
908
+ i0.ɵɵtext(9, "Remove from Collection");
730
909
  i0.ɵɵelementEnd()();
731
910
  } }
732
- function CollectionsFullViewComponent_Conditional_28_Conditional_3_Template(rf, ctx) { if (rf & 1) {
733
- const _r31 = i0.ɵɵgetCurrentView();
734
- i0.ɵɵelementStart(0, "button", 107);
735
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_28_Conditional_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r31); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onContextMenuAction("view")); });
736
- i0.ɵɵelement(1, "i", 111);
911
+ function CollectionsFullViewComponent_Conditional_33_Conditional_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
912
+ const _r40 = i0.ɵɵgetCurrentView();
913
+ i0.ɵɵelementStart(0, "button", 133);
914
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_33_Conditional_3_Conditional_1_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r40); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onContextMenuAction("view")); });
915
+ i0.ɵɵelement(1, "i", 141);
737
916
  i0.ɵɵelementStart(2, "span");
738
917
  i0.ɵɵtext(3, "View");
739
918
  i0.ɵɵelementEnd()();
740
- i0.ɵɵconditionalCreate(4, CollectionsFullViewComponent_Conditional_28_Conditional_3_Conditional_4_Template, 5, 0);
919
+ i0.ɵɵelementStart(4, "button", 133);
920
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_33_Conditional_3_Conditional_1_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r40); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onContextMenuAction("openConversation")); });
921
+ i0.ɵɵelement(5, "i", 142);
922
+ i0.ɵɵelementStart(6, "span");
923
+ i0.ɵɵtext(7, "Open source conversation");
924
+ i0.ɵɵelementEnd()();
925
+ i0.ɵɵconditionalCreate(8, CollectionsFullViewComponent_Conditional_33_Conditional_3_Conditional_1_Conditional_8_Template, 10, 0);
926
+ } if (rf & 2) {
927
+ const ctx_r2 = i0.ɵɵnextContext(3);
928
+ i0.ɵɵadvance(8);
929
+ i0.ɵɵconditional(ctx_r2.canEditCurrent() ? 8 : -1);
930
+ } }
931
+ function CollectionsFullViewComponent_Conditional_33_Conditional_3_Template(rf, ctx) { if (rf & 1) {
932
+ i0.ɵɵconditionalCreate(0, CollectionsFullViewComponent_Conditional_33_Conditional_3_Conditional_0_Template, 8, 1)(1, CollectionsFullViewComponent_Conditional_33_Conditional_3_Conditional_1_Template, 9, 1);
741
933
  } if (rf & 2) {
742
934
  const ctx_r2 = i0.ɵɵnextContext(2);
743
- i0.ɵɵadvance(4);
744
- i0.ɵɵconditional(ctx_r2.canEditCurrent() ? 4 : -1);
935
+ i0.ɵɵconditional(ctx_r2.showMoveSubmenu ? 0 : 1);
745
936
  } }
746
- function CollectionsFullViewComponent_Conditional_28_Template(rf, ctx) { if (rf & 1) {
747
- const _r26 = i0.ɵɵgetCurrentView();
748
- i0.ɵɵelementStart(0, "div", 105);
749
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_28_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r26); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.closeContextMenu()); });
937
+ function CollectionsFullViewComponent_Conditional_33_Template(rf, ctx) { if (rf & 1) {
938
+ const _r32 = i0.ɵɵgetCurrentView();
939
+ i0.ɵɵelementStart(0, "div", 131);
940
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Conditional_33_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r32); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.closeContextMenu()); });
750
941
  i0.ɵɵelementEnd();
751
- i0.ɵɵelementStart(1, "div", 106);
752
- i0.ɵɵconditionalCreate(2, CollectionsFullViewComponent_Conditional_28_Conditional_2_Template, 8, 3);
753
- i0.ɵɵconditionalCreate(3, CollectionsFullViewComponent_Conditional_28_Conditional_3_Template, 5, 1);
942
+ i0.ɵɵelementStart(1, "div", 132);
943
+ i0.ɵɵconditionalCreate(2, CollectionsFullViewComponent_Conditional_33_Conditional_2_Template, 8, 3);
944
+ i0.ɵɵconditionalCreate(3, CollectionsFullViewComponent_Conditional_33_Conditional_3_Template, 2, 1);
754
945
  i0.ɵɵelementEnd();
755
946
  } if (rf & 2) {
756
947
  const ctx_r2 = i0.ɵɵnextContext();
@@ -775,6 +966,8 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
775
966
  environmentId;
776
967
  currentUser;
777
968
  collectionNavigated = new EventEmitter();
969
+ /** Emitted when the user asks to open the conversation an artifact was produced in. */
970
+ openConversationRequested = new EventEmitter();
778
971
  collections = [];
779
972
  artifactVersions = [];
780
973
  filteredCollections = [];
@@ -824,6 +1017,25 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
824
1017
  showContextMenu = false;
825
1018
  contextMenuPosition = { x: 0, y: 0 };
826
1019
  contextMenuItem = null;
1020
+ /** "Move to Collection" submenu state (within the artifact context menu). */
1021
+ showMoveSubmenu = false;
1022
+ isLoadingMoveTargets = false;
1023
+ moveTargets = [];
1024
+ /** Anchor index (into unifiedItems) for shift-click range selection. */
1025
+ lastSelectedIndex = null;
1026
+ /** Drag-and-drop state. draggedItemIds = the item ids being dragged (1 or the whole selection). */
1027
+ draggedItemIds = [];
1028
+ /** Tag of the current drop target for highlight: item id, 'root', 'crumb:<id>', or 'nav:<id>'. */
1029
+ dragOverTargetId = null;
1030
+ /** Bulk "Move to…" popover (selection toolbar). */
1031
+ showBulkMovePopover = false;
1032
+ /** All accessible collections (navigator pane + move targets + folder-cycle checks). */
1033
+ allCollections = [];
1034
+ allCollectionsById = new Map();
1035
+ navigatorNodes = [];
1036
+ showNavigator = true;
1037
+ /** Staging shelf: items held across navigation, then dropped into a destination collection. */
1038
+ shelf = [];
827
1039
  destroy$ = new Subject();
828
1040
  isNavigatingProgrammatically = false;
829
1041
  constructor(dialogService, artifactState, collectionState, permissionService, artifactIconService, cdr) {
@@ -845,6 +1057,8 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
845
1057
  this.subscribeToCollectionState();
846
1058
  // Subscribe to artifact state changes to track active artifact
847
1059
  this.subscribeToArtifactState();
1060
+ // Load the full collection set for the navigator pane + drag targets + cycle checks
1061
+ void this.loadAllCollections();
848
1062
  // Check if there's an active collection from URL params (set by parent component)
849
1063
  const activeCollectionId = this.collectionState.activeCollectionId;
850
1064
  if (activeCollectionId) {
@@ -932,7 +1146,7 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
932
1146
  this.cdr.detectChanges();
933
1147
  }
934
1148
  }
935
- async loadCollections() {
1149
+ async loadCollections(bypassCache = false) {
936
1150
  try {
937
1151
  const rv = RunView.FromMetadataProvider(this.ProviderToUse);
938
1152
  // Load collections where user is owner OR has permissions
@@ -950,13 +1164,14 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
950
1164
  ExtraFilter: filter,
951
1165
  OrderBy: 'Name ASC',
952
1166
  MaxRows: 1000,
953
- ResultType: 'entity_object'
1167
+ ResultType: 'entity_object',
1168
+ BypassCache: bypassCache
954
1169
  }, this.currentUser);
955
1170
  if (result.Success) {
956
1171
  this.collections = result.Results || [];
957
1172
  await Promise.all([
958
1173
  this.loadUserPermissions(),
959
- this.loadItemCounts()
1174
+ this.loadItemCounts(bypassCache)
960
1175
  ]);
961
1176
  this.filteredCollections = [...this.collections];
962
1177
  }
@@ -966,9 +1181,11 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
966
1181
  }
967
1182
  }
968
1183
  /**
969
- * Load item counts (child collections + artifacts) for all visible collections
1184
+ * Load item counts (child collections + artifacts) for all visible collections.
1185
+ * `bypassCache` is passed right after a mutation so the count badges reflect committed
1186
+ * DB state immediately (cache invalidation is async relative to Save/Delete resolving).
970
1187
  */
971
- async loadItemCounts() {
1188
+ async loadItemCounts(bypassCache = false) {
972
1189
  this.itemCountMap.clear();
973
1190
  if (this.collections.length === 0)
974
1191
  return;
@@ -980,13 +1197,15 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
980
1197
  EntityName: 'MJ: Collections',
981
1198
  ExtraFilter: `ParentID IN (${inClause})`,
982
1199
  Fields: ['ID', 'ParentID'],
983
- ResultType: 'simple'
1200
+ ResultType: 'simple',
1201
+ BypassCache: bypassCache
984
1202
  },
985
1203
  {
986
1204
  EntityName: 'MJ: Collection Artifacts',
987
1205
  ExtraFilter: `CollectionID IN (${inClause})`,
988
1206
  Fields: ['ID', 'CollectionID'],
989
- ResultType: 'simple'
1207
+ ResultType: 'simple',
1208
+ BypassCache: bypassCache
990
1209
  }
991
1210
  ], this.currentUser);
992
1211
  // Count children per parent
@@ -1022,14 +1241,14 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
1022
1241
  this.userPermissions.set(this.currentCollectionId, permission);
1023
1242
  }
1024
1243
  }
1025
- async loadArtifacts() {
1244
+ async loadArtifacts(bypassCache = false) {
1026
1245
  if (!this.currentCollectionId) {
1027
1246
  this.artifactVersions = [];
1028
1247
  this.filteredArtifactVersions = [];
1029
1248
  return;
1030
1249
  }
1031
1250
  try {
1032
- this.artifactVersions = await this.artifactState.loadArtifactVersionsForCollection(this.currentCollectionId, this.currentUser);
1251
+ this.artifactVersions = await this.artifactState.loadArtifactVersionsForCollection(this.currentCollectionId, this.currentUser, bypassCache);
1033
1252
  this.filteredArtifactVersions = [...this.artifactVersions];
1034
1253
  }
1035
1254
  catch (error) {
@@ -1211,7 +1430,8 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
1211
1430
  try {
1212
1431
  console.log('Attempting to delete collection and all children...');
1213
1432
  await this.deleteCollectionRecursive(collection.ID);
1214
- await this.loadCollections();
1433
+ await this.loadCollections(true);
1434
+ await this.loadAllCollections(true);
1215
1435
  }
1216
1436
  catch (error) {
1217
1437
  console.error('Error deleting collection:', error);
@@ -1259,7 +1479,8 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
1259
1479
  async onCollectionSaved(collection) {
1260
1480
  this.isFormModalOpen = false;
1261
1481
  this.editingCollection = undefined;
1262
- await this.loadCollections();
1482
+ await this.loadCollections(true);
1483
+ await this.loadAllCollections(true);
1263
1484
  // Reload current collection permission (it was cleared by loadUserPermissions)
1264
1485
  await this.loadCurrentCollectionPermission();
1265
1486
  // Update breadcrumb and currentCollection if the saved collection is in the trail
@@ -1287,7 +1508,7 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
1287
1508
  }
1288
1509
  async onArtifactSaved(artifact) {
1289
1510
  this.isArtifactModalOpen = false;
1290
- await this.loadArtifacts();
1511
+ await this.loadArtifacts(true);
1291
1512
  this.cdr.detectChanges();
1292
1513
  }
1293
1514
  onArtifactModalCancelled() {
@@ -1323,7 +1544,7 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
1323
1544
  for (const joinRecord of result.Results) {
1324
1545
  await joinRecord.Delete();
1325
1546
  }
1326
- await this.loadArtifacts();
1547
+ await this.loadArtifacts(true);
1327
1548
  this.buildUnifiedItemList();
1328
1549
  }
1329
1550
  else {
@@ -1421,7 +1642,8 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
1421
1642
  }
1422
1643
  async onPermissionsChanged() {
1423
1644
  // Reload collections and permissions after sharing changes
1424
- await this.loadCollections();
1645
+ await this.loadCollections(true);
1646
+ await this.loadAllCollections(true);
1425
1647
  this.cdr.detectChanges();
1426
1648
  }
1427
1649
  onShareModalCancelled() {
@@ -1599,25 +1821,8 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
1599
1821
  */
1600
1822
  toggleItemSelection(item, event) {
1601
1823
  event.stopPropagation();
1602
- if (event.metaKey || event.ctrlKey) {
1603
- // Cmd/Ctrl+Click: Toggle individual selection
1604
- if (this.selectedItems.has(item.id)) {
1605
- this.selectedItems.delete(item.id);
1606
- }
1607
- else {
1608
- this.selectedItems.add(item.id);
1609
- }
1610
- }
1611
- else if (event.shiftKey) {
1612
- // Shift+Click: Select range (TODO: implement range selection)
1613
- this.selectedItems.add(item.id);
1614
- }
1615
- else {
1616
- // Regular click: Select only this item
1617
- this.selectedItems.clear();
1618
- this.selectedItems.add(item.id);
1619
- }
1620
- this.buildUnifiedItemList(); // Refresh to update selected states
1824
+ // Checkbox click: additive toggle by default, shift = range, cmd/ctrl = toggle.
1825
+ this.applySelectionGesture(item, event);
1621
1826
  }
1622
1827
  /**
1623
1828
  * Multi-select: Select all items (Phase 3)
@@ -1627,14 +1832,15 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
1627
1832
  for (const item of this.unifiedItems) {
1628
1833
  this.selectedItems.add(item.id);
1629
1834
  }
1630
- this.buildUnifiedItemList();
1835
+ this.refreshSelectionFlags();
1631
1836
  }
1632
1837
  /**
1633
1838
  * Multi-select: Clear selection (Phase 3)
1634
1839
  */
1635
1840
  clearSelection() {
1636
1841
  this.selectedItems.clear();
1637
- this.buildUnifiedItemList();
1842
+ this.lastSelectedIndex = null;
1843
+ this.refreshSelectionFlags();
1638
1844
  }
1639
1845
  /**
1640
1846
  * Multi-select: Delete selected items
@@ -1672,9 +1878,10 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
1672
1878
  }
1673
1879
  }
1674
1880
  this.clearSelection();
1675
- await this.loadCollections();
1881
+ await this.loadCollections(true);
1882
+ await this.loadAllCollections(true);
1676
1883
  if (artifactItems.length > 0) {
1677
- await this.loadArtifacts();
1884
+ await this.loadArtifacts(true);
1678
1885
  }
1679
1886
  this.buildUnifiedItemList();
1680
1887
  }
@@ -1695,7 +1902,12 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
1695
1902
  * In normal mode: opens item (folder or artifact)
1696
1903
  */
1697
1904
  onItemClick(item, event) {
1698
- // In select mode, single click toggles selection
1905
+ // Modifier-click selects without needing select mode (shift = range, cmd/ctrl = toggle)
1906
+ if (event && (event.shiftKey || event.metaKey || event.ctrlKey)) {
1907
+ this.applySelectionGesture(item, event, true);
1908
+ return;
1909
+ }
1910
+ // In sticky select mode, a plain click toggles selection
1699
1911
  if (this.isSelectMode) {
1700
1912
  this.toggleItemSelectionSimple(item);
1701
1913
  return;
@@ -1738,7 +1950,8 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
1738
1950
  else {
1739
1951
  this.selectedItems.add(item.id);
1740
1952
  }
1741
- this.buildUnifiedItemList();
1953
+ this.lastSelectedIndex = this.indexOfItem(item.id);
1954
+ this.refreshSelectionFlags();
1742
1955
  }
1743
1956
  /**
1744
1957
  * Get item count text for display
@@ -1810,6 +2023,7 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
1810
2023
  this.contextMenuItem = item;
1811
2024
  this.contextMenuPosition = this.clampContextMenuPosition(event.clientX, event.clientY);
1812
2025
  this.showContextMenu = true;
2026
+ this.showMoveSubmenu = false;
1813
2027
  this.cdr.detectChanges();
1814
2028
  }
1815
2029
  /** Clamp menu position to keep it within the viewport */
@@ -1826,8 +2040,129 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
1826
2040
  closeContextMenu() {
1827
2041
  this.showContextMenu = false;
1828
2042
  this.contextMenuItem = null;
2043
+ this.showMoveSubmenu = false;
1829
2044
  this.cdr.detectChanges();
1830
2045
  }
2046
+ /** Opens the inline "Move to Collection" submenu and loads candidate target collections. */
2047
+ openMoveSubmenu(event) {
2048
+ event.stopPropagation();
2049
+ this.showMoveSubmenu = true;
2050
+ void this.loadMoveTargets();
2051
+ }
2052
+ closeMoveSubmenu(event) {
2053
+ event.stopPropagation();
2054
+ this.showMoveSubmenu = false;
2055
+ this.cdr.detectChanges();
2056
+ }
2057
+ /** Loads every collection the user can access in this environment (flattened, indented), minus the current one. */
2058
+ async loadMoveTargets() {
2059
+ this.isLoadingMoveTargets = true;
2060
+ this.moveTargets = [];
2061
+ this.cdr.detectChanges();
2062
+ try {
2063
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
2064
+ const ownerFilter = `OwnerID='${this.currentUser.ID}'`;
2065
+ const permissionSubquery = `ID IN (
2066
+ SELECT CollectionID FROM [__mj].[vwCollectionPermissions] WHERE UserID='${this.currentUser.ID}'
2067
+ )`;
2068
+ const filter = `EnvironmentID='${this.environmentId}' AND (OwnerID IS NULL OR ${ownerFilter} OR ${permissionSubquery})`;
2069
+ const result = await rv.RunView({
2070
+ EntityName: 'MJ: Collections',
2071
+ ExtraFilter: filter,
2072
+ OrderBy: 'Name ASC',
2073
+ MaxRows: 1000,
2074
+ ResultType: 'entity_object'
2075
+ }, this.currentUser);
2076
+ const all = result.Success ? (result.Results || []) : [];
2077
+ const flattened = this.flattenCollectionTree(all);
2078
+ this.moveTargets = this.currentCollectionId
2079
+ ? flattened.filter(t => !UUIDsEqual(t.collection.ID, this.currentCollectionId))
2080
+ : flattened;
2081
+ }
2082
+ catch (error) {
2083
+ console.error('Failed to load move targets:', error);
2084
+ this.moveTargets = [];
2085
+ }
2086
+ finally {
2087
+ this.isLoadingMoveTargets = false;
2088
+ this.cdr.detectChanges();
2089
+ }
2090
+ }
2091
+ /** Flattens collections into a depth-first, indented list (orphans treated as roots). */
2092
+ flattenCollectionTree(all) {
2093
+ const ids = new Set(all.map(c => NormalizeUUID(c.ID)));
2094
+ const byParent = new Map();
2095
+ for (const c of all) {
2096
+ const pid = c.ParentID ? NormalizeUUID(c.ParentID) : null;
2097
+ const key = pid && ids.has(pid) ? pid : null;
2098
+ const arr = byParent.get(key) || [];
2099
+ arr.push(c);
2100
+ byParent.set(key, arr);
2101
+ }
2102
+ const out = [];
2103
+ const walk = (parentKey, depth) => {
2104
+ for (const c of (byParent.get(parentKey) || [])) {
2105
+ out.push({ collection: c, depth });
2106
+ walk(NormalizeUUID(c.ID), depth + 1);
2107
+ }
2108
+ };
2109
+ walk(null, 0);
2110
+ return out;
2111
+ }
2112
+ /**
2113
+ * Moves the right-clicked artifact version from the current collection to the target.
2114
+ * Adds to the target first (so a failure never drops it from the source), then removes
2115
+ * the version's join row from the source collection.
2116
+ */
2117
+ async moveArtifactToCollection(target) {
2118
+ const item = this.contextMenuItem;
2119
+ const fromCollectionId = this.currentCollectionId;
2120
+ this.closeContextMenu();
2121
+ if (!item?.artifact || !item.version || !fromCollectionId)
2122
+ return;
2123
+ if (UUIDsEqual(target.ID, fromCollectionId))
2124
+ return;
2125
+ try {
2126
+ const p = this.ProviderToUse;
2127
+ const rv = RunView.FromMetadataProvider(p);
2128
+ // Add to target (skip if the version is already there to avoid a duplicate join row)
2129
+ const existing = await rv.RunView({
2130
+ EntityName: 'MJ: Collection Artifacts',
2131
+ ExtraFilter: `CollectionID='${target.ID}' AND ArtifactVersionID='${item.version.ID}'`,
2132
+ ResultType: 'simple',
2133
+ Fields: ['ID']
2134
+ }, this.currentUser);
2135
+ if (!(existing.Success && (existing.Results?.length ?? 0) > 0)) {
2136
+ const junction = await p.GetEntityObject('MJ: Collection Artifacts', this.currentUser);
2137
+ junction.CollectionID = target.ID;
2138
+ junction.ArtifactVersionID = item.version.ID;
2139
+ junction.Sequence = 0;
2140
+ const saved = await junction.Save();
2141
+ if (!saved) {
2142
+ throw new Error(junction.LatestResult?.CompleteMessage || 'Failed to add artifact to the target collection');
2143
+ }
2144
+ }
2145
+ // Remove this version's join row(s) from the source collection
2146
+ const sourceRows = await rv.RunView({
2147
+ EntityName: 'MJ: Collection Artifacts',
2148
+ ExtraFilter: `CollectionID='${fromCollectionId}' AND ArtifactVersionID='${item.version.ID}'`,
2149
+ ResultType: 'entity_object'
2150
+ }, this.currentUser);
2151
+ if (sourceRows.Success && sourceRows.Results) {
2152
+ for (const row of sourceRows.Results) {
2153
+ await row.Delete();
2154
+ }
2155
+ }
2156
+ await this.loadArtifacts(true);
2157
+ await this.loadCollections(true);
2158
+ await this.loadAllCollections(true);
2159
+ this.buildUnifiedItemList();
2160
+ }
2161
+ catch (error) {
2162
+ console.error('Error moving artifact:', error);
2163
+ await this.dialogService.alert('Error', 'Failed to move artifact. Please try again.');
2164
+ }
2165
+ }
1831
2166
  /** Handle context menu action dispatch */
1832
2167
  onContextMenuAction(action) {
1833
2168
  const item = this.contextMenuItem;
@@ -1861,71 +2196,474 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
1861
2196
  this.removeArtifact({ artifact: item.artifact, version: item.version });
1862
2197
  }
1863
2198
  break;
2199
+ case 'openConversation':
2200
+ if (item.artifact && item.version) {
2201
+ void this.openSourceConversation(item);
2202
+ }
2203
+ break;
1864
2204
  }
1865
2205
  }
2206
+ /**
2207
+ * Resolves the artifact version the user right-clicked to the conversation it was produced in,
2208
+ * then asks the host to open it. Chain: Artifact Version → Conversation Detail Artifacts
2209
+ * (prefer Direction='Output' = produced here) → Conversation Detail → ConversationID.
2210
+ */
2211
+ async openSourceConversation(item) {
2212
+ if (!item.version)
2213
+ return;
2214
+ const conversationId = await this.resolveArtifactToConversation(item.version.ID);
2215
+ if (conversationId) {
2216
+ this.openConversationRequested.emit({ conversationId });
2217
+ }
2218
+ else {
2219
+ await this.dialogService.alert('No Source Conversation', 'This artifact is not linked to a conversation.');
2220
+ }
2221
+ }
2222
+ async resolveArtifactToConversation(artifactVersionId) {
2223
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
2224
+ // Find the message(s) this version is attached to. Prefer the one that produced it
2225
+ // (Direction='Output'); fall back to any link if it only appears as an input.
2226
+ const linkResult = await rv.RunView({
2227
+ EntityName: 'MJ: Conversation Detail Artifacts',
2228
+ ExtraFilter: `ArtifactVersionID='${artifactVersionId}'`,
2229
+ Fields: ['ConversationDetailID', 'Direction'],
2230
+ ResultType: 'simple'
2231
+ }, this.currentUser);
2232
+ const links = linkResult.Success ? (linkResult.Results ?? []) : [];
2233
+ if (links.length === 0)
2234
+ return null;
2235
+ const link = links.find(l => l.Direction === 'Output') ?? links[0];
2236
+ const detailResult = await rv.RunView({
2237
+ EntityName: 'MJ: Conversation Details',
2238
+ ExtraFilter: `ID='${link.ConversationDetailID}'`,
2239
+ Fields: ['ConversationID'],
2240
+ ResultType: 'simple'
2241
+ }, this.currentUser);
2242
+ return detailResult.Success ? (detailResult.Results?.[0]?.ConversationID ?? null) : null;
2243
+ }
1866
2244
  /** Close context menu on Escape key */
1867
2245
  onEscapeKey() {
1868
2246
  if (this.showContextMenu) {
1869
2247
  this.closeContextMenu();
1870
2248
  }
1871
2249
  }
2250
+ // ============================================================
2251
+ // Selection gestures (#4 — frictionless multi-select)
2252
+ // ============================================================
2253
+ indexOfItem(id) {
2254
+ return this.unifiedItems.findIndex(i => i.id === id);
2255
+ }
2256
+ /** Re-sync each item's `selected` flag from the set without rebuilding (preserves page). */
2257
+ refreshSelectionFlags() {
2258
+ for (const it of this.unifiedItems) {
2259
+ it.selected = this.selectedItems.has(it.id);
2260
+ }
2261
+ this.cdr.detectChanges();
2262
+ }
2263
+ /**
2264
+ * Centralized selection gesture used by both the hover checkbox and modifier-clicks.
2265
+ * - shift → range select from the last anchor
2266
+ * - cmd/ctrl → additive toggle
2267
+ * - plain → additive toggle (checkbox) or replace (plainReplaces, used by body clicks)
2268
+ */
2269
+ applySelectionGesture(item, event, plainReplaces = false) {
2270
+ const idx = this.indexOfItem(item.id);
2271
+ if (event.shiftKey && this.lastSelectedIndex != null && this.lastSelectedIndex >= 0) {
2272
+ const lo = Math.min(this.lastSelectedIndex, idx);
2273
+ const hi = Math.max(this.lastSelectedIndex, idx);
2274
+ for (let i = lo; i <= hi; i++) {
2275
+ const it = this.unifiedItems[i];
2276
+ if (it)
2277
+ this.selectedItems.add(it.id);
2278
+ }
2279
+ }
2280
+ else if (event.metaKey || event.ctrlKey || !plainReplaces) {
2281
+ if (this.selectedItems.has(item.id)) {
2282
+ this.selectedItems.delete(item.id);
2283
+ }
2284
+ else {
2285
+ this.selectedItems.add(item.id);
2286
+ }
2287
+ this.lastSelectedIndex = idx;
2288
+ }
2289
+ else {
2290
+ this.selectedItems.clear();
2291
+ this.selectedItems.add(item.id);
2292
+ this.lastSelectedIndex = idx;
2293
+ }
2294
+ this.refreshSelectionFlags();
2295
+ }
2296
+ /** Hover-checkbox click — selects without requiring an explicit "select mode". */
2297
+ onCheckboxClick(item, event) {
2298
+ event.stopPropagation();
2299
+ this.applySelectionGesture(item, event);
2300
+ }
2301
+ // ============================================================
2302
+ // Drag-and-drop (#1, #2 — drag items onto folders / breadcrumbs / navigator)
2303
+ // ============================================================
2304
+ onItemDragStart(item, event) {
2305
+ // If the dragged item is part of the current selection, drag the whole selection;
2306
+ // otherwise drag just this item.
2307
+ this.draggedItemIds = (this.selectedItems.has(item.id) && this.selectedItems.size > 0)
2308
+ ? Array.from(this.selectedItems)
2309
+ : [item.id];
2310
+ if (event.dataTransfer) {
2311
+ event.dataTransfer.effectAllowed = 'move';
2312
+ event.dataTransfer.setData('text/plain', this.draggedItemIds.join(','));
2313
+ }
2314
+ }
2315
+ onItemDragEnd() {
2316
+ this.draggedItemIds = [];
2317
+ this.dragOverTargetId = null;
2318
+ }
2319
+ draggedItems() {
2320
+ return this.unifiedItems.filter(i => this.draggedItemIds.includes(i.id));
2321
+ }
2322
+ /** Folder grid card / list row as a drop target. */
2323
+ onFolderItemDragOver(folderItem, event) {
2324
+ const targetId = folderItem.collection?.ID;
2325
+ if (this.draggedItemIds.length === 0 || this.draggedItemIds.includes(folderItem.id))
2326
+ return;
2327
+ if (!this.canDropOnCollection(targetId))
2328
+ return;
2329
+ event.preventDefault();
2330
+ if (event.dataTransfer)
2331
+ event.dataTransfer.dropEffect = 'move';
2332
+ this.dragOverTargetId = folderItem.id;
2333
+ }
2334
+ onFolderItemDrop(folderItem, event) {
2335
+ event.preventDefault();
2336
+ const targetId = folderItem.collection?.ID ?? null;
2337
+ this.dragOverTargetId = null;
2338
+ void this.moveDraggedItemsTo(targetId);
2339
+ }
2340
+ /** Breadcrumb crumb / Home root as a drop target. crumbId null = top level. */
2341
+ onCrumbDragOver(crumbId, event) {
2342
+ if (this.draggedItemIds.length === 0)
2343
+ return;
2344
+ // Artifacts can't live at the top level (no collection)
2345
+ if (crumbId === null && this.draggedItems().some(i => i.type === 'artifact'))
2346
+ return;
2347
+ if (!this.canDropOnCollection(crumbId))
2348
+ return;
2349
+ event.preventDefault();
2350
+ if (event.dataTransfer)
2351
+ event.dataTransfer.dropEffect = 'move';
2352
+ this.dragOverTargetId = crumbId === null ? 'root' : 'crumb:' + crumbId;
2353
+ }
2354
+ onCrumbDrop(crumbId, event) {
2355
+ event.preventDefault();
2356
+ this.dragOverTargetId = null;
2357
+ void this.moveDraggedItemsTo(crumbId);
2358
+ }
2359
+ /** True when the dragged set may be dropped on the target collection (blocks folder cycles). */
2360
+ canDropOnCollection(targetCollectionId) {
2361
+ if (targetCollectionId === undefined)
2362
+ return false;
2363
+ for (const f of this.draggedItems()) {
2364
+ if (f.type !== 'folder' || !f.collection)
2365
+ continue;
2366
+ const fid = f.collection.ID;
2367
+ if (targetCollectionId && (UUIDsEqual(fid, targetCollectionId) || this.isCollectionDescendant(targetCollectionId, fid))) {
2368
+ return false;
2369
+ }
2370
+ }
2371
+ return true;
2372
+ }
2373
+ isCollectionDescendant(nodeId, ancestorId) {
2374
+ let cur = this.allCollectionsById.get(NormalizeUUID(nodeId));
2375
+ const seen = new Set();
2376
+ while (cur?.ParentID) {
2377
+ const pid = NormalizeUUID(cur.ParentID);
2378
+ if (seen.has(pid))
2379
+ break;
2380
+ seen.add(pid);
2381
+ if (UUIDsEqual(pid, ancestorId))
2382
+ return true;
2383
+ cur = this.allCollectionsById.get(pid);
2384
+ }
2385
+ return false;
2386
+ }
2387
+ async moveDraggedItemsTo(targetCollectionId) {
2388
+ const items = this.draggedItems();
2389
+ this.draggedItemIds = [];
2390
+ await this.moveItemsTo(items, targetCollectionId, this.currentCollectionId);
2391
+ }
2392
+ // ============================================================
2393
+ // Move primitives (shared by drag, bulk move, and shelf)
2394
+ // ============================================================
2395
+ /**
2396
+ * Moves items into the target collection. Artifacts: add the version to the target and remove
2397
+ * it from its source collection. Folders: reparent (target null = top level). Skips no-ops and
2398
+ * invalid folder moves (cycles). Reloads and rebuilds when done.
2399
+ */
2400
+ async moveItemsTo(items, targetCollectionId, artifactSourceCollectionId) {
2401
+ if (items.length === 0)
2402
+ return;
2403
+ try {
2404
+ const p = this.ProviderToUse;
2405
+ const rv = RunView.FromMetadataProvider(p);
2406
+ for (const item of items) {
2407
+ if (item.type === 'artifact' && item.version) {
2408
+ if (targetCollectionId == null)
2409
+ continue; // artifacts require a collection
2410
+ if (artifactSourceCollectionId && UUIDsEqual(artifactSourceCollectionId, targetCollectionId))
2411
+ continue;
2412
+ await this.addVersionToCollection(p, rv, item.version.ID, targetCollectionId);
2413
+ if (artifactSourceCollectionId) {
2414
+ await this.removeVersionFromCollection(rv, item.version.ID, artifactSourceCollectionId);
2415
+ }
2416
+ }
2417
+ else if (item.type === 'folder' && item.collection) {
2418
+ const fid = item.collection.ID;
2419
+ if (targetCollectionId && (UUIDsEqual(fid, targetCollectionId) || this.isCollectionDescendant(targetCollectionId, fid)))
2420
+ continue;
2421
+ await this.reparentCollection(fid, targetCollectionId);
2422
+ }
2423
+ }
2424
+ this.clearSelection();
2425
+ await this.loadCollections(true);
2426
+ await this.loadArtifacts(true);
2427
+ await this.loadAllCollections(true);
2428
+ this.buildUnifiedItemList();
2429
+ }
2430
+ catch (error) {
2431
+ console.error('Error moving items:', error);
2432
+ await this.dialogService.alert('Error', 'Failed to move item(s). Please try again.');
2433
+ }
2434
+ }
2435
+ async addVersionToCollection(p, rv, versionId, collectionId) {
2436
+ const existing = await rv.RunView({
2437
+ EntityName: 'MJ: Collection Artifacts',
2438
+ ExtraFilter: `CollectionID='${collectionId}' AND ArtifactVersionID='${versionId}'`,
2439
+ ResultType: 'simple',
2440
+ Fields: ['ID']
2441
+ }, this.currentUser);
2442
+ if (existing.Success && (existing.Results?.length ?? 0) > 0)
2443
+ return;
2444
+ const junction = await p.GetEntityObject('MJ: Collection Artifacts', this.currentUser);
2445
+ junction.CollectionID = collectionId;
2446
+ junction.ArtifactVersionID = versionId;
2447
+ junction.Sequence = 0;
2448
+ const ok = await junction.Save();
2449
+ if (!ok)
2450
+ throw new Error(junction.LatestResult?.CompleteMessage || 'Failed to add artifact to collection');
2451
+ }
2452
+ async removeVersionFromCollection(rv, versionId, collectionId) {
2453
+ const rows = await rv.RunView({
2454
+ EntityName: 'MJ: Collection Artifacts',
2455
+ ExtraFilter: `CollectionID='${collectionId}' AND ArtifactVersionID='${versionId}'`,
2456
+ ResultType: 'entity_object'
2457
+ }, this.currentUser);
2458
+ if (rows.Success && rows.Results) {
2459
+ for (const row of rows.Results)
2460
+ await row.Delete();
2461
+ }
2462
+ }
2463
+ async reparentCollection(collectionId, newParentId) {
2464
+ const p = this.ProviderToUse;
2465
+ const collection = await p.GetEntityObject('MJ: Collections', this.currentUser);
2466
+ await collection.Load(collectionId);
2467
+ collection.ParentID = newParentId;
2468
+ const ok = await collection.Save();
2469
+ if (!ok)
2470
+ throw new Error(collection.LatestResult?.CompleteMessage || 'Failed to move folder');
2471
+ }
2472
+ // ============================================================
2473
+ // All-collections cache (navigator + cycle checks + bulk move)
2474
+ // ============================================================
2475
+ async loadAllCollections(bypassCache = false) {
2476
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
2477
+ const ownerFilter = `OwnerID='${this.currentUser.ID}'`;
2478
+ const permissionSubquery = `ID IN (
2479
+ SELECT CollectionID FROM [__mj].[vwCollectionPermissions] WHERE UserID='${this.currentUser.ID}'
2480
+ )`;
2481
+ const filter = `EnvironmentID='${this.environmentId}' AND (OwnerID IS NULL OR ${ownerFilter} OR ${permissionSubquery})`;
2482
+ const result = await rv.RunView({
2483
+ EntityName: 'MJ: Collections',
2484
+ ExtraFilter: filter,
2485
+ OrderBy: 'Name ASC',
2486
+ MaxRows: 1000,
2487
+ ResultType: 'entity_object',
2488
+ BypassCache: bypassCache
2489
+ }, this.currentUser);
2490
+ this.allCollections = result.Success ? (result.Results || []) : [];
2491
+ this.allCollectionsById = new Map(this.allCollections.map(c => [NormalizeUUID(c.ID), c]));
2492
+ this.navigatorNodes = this.flattenCollectionTree(this.allCollections);
2493
+ this.cdr.detectChanges();
2494
+ }
2495
+ toggleNavigator() {
2496
+ this.showNavigator = !this.showNavigator;
2497
+ }
2498
+ navigatorClick(collection) {
2499
+ void this.navigateToCollectionById(collection.ID);
2500
+ }
2501
+ isCurrentNavigator(collection) {
2502
+ return !!this.currentCollectionId && UUIDsEqual(collection.ID, this.currentCollectionId);
2503
+ }
2504
+ onNavigatorDragOver(collection, event) {
2505
+ if (this.draggedItemIds.length === 0 || this.draggedItemIds.some(id => UUIDsEqual(id, collection.ID)))
2506
+ return;
2507
+ if (!this.canDropOnCollection(collection.ID))
2508
+ return;
2509
+ event.preventDefault();
2510
+ if (event.dataTransfer)
2511
+ event.dataTransfer.dropEffect = 'move';
2512
+ this.dragOverTargetId = 'nav:' + collection.ID;
2513
+ }
2514
+ onNavigatorDrop(collection, event) {
2515
+ event.preventDefault();
2516
+ this.dragOverTargetId = null;
2517
+ void this.moveDraggedItemsTo(collection.ID);
2518
+ }
2519
+ onDragLeave(tag) {
2520
+ if (this.dragOverTargetId === tag)
2521
+ this.dragOverTargetId = null;
2522
+ }
2523
+ // ============================================================
2524
+ // Bulk "Move to…" (#3)
2525
+ // ============================================================
2526
+ openBulkMove(event) {
2527
+ event.stopPropagation();
2528
+ if (this.navigatorNodes.length === 0)
2529
+ void this.loadAllCollections();
2530
+ this.showBulkMovePopover = true;
2531
+ }
2532
+ closeBulkMove() {
2533
+ this.showBulkMovePopover = false;
2534
+ }
2535
+ async bulkMoveTo(collection) {
2536
+ const items = this.unifiedItems.filter(i => this.selectedItems.has(i.id));
2537
+ this.showBulkMovePopover = false;
2538
+ await this.moveItemsTo(items, collection.ID, this.currentCollectionId);
2539
+ }
2540
+ // ============================================================
2541
+ // Staging shelf (#5)
2542
+ // ============================================================
2543
+ stageSelected() {
2544
+ const items = this.unifiedItems.filter(i => this.selectedItems.has(i.id));
2545
+ for (const it of items) {
2546
+ if (!this.shelf.some(s => s.item.id === it.id)) {
2547
+ this.shelf.push({ item: it, sourceCollectionId: this.currentCollectionId });
2548
+ }
2549
+ }
2550
+ this.clearSelection();
2551
+ this.cdr.detectChanges();
2552
+ }
2553
+ removeFromShelf(id) {
2554
+ this.shelf = this.shelf.filter(s => s.item.id !== id);
2555
+ this.cdr.detectChanges();
2556
+ }
2557
+ clearShelf() {
2558
+ this.shelf = [];
2559
+ this.cdr.detectChanges();
2560
+ }
2561
+ /** Moves all staged items into the currently-open collection. */
2562
+ async dropShelfHere() {
2563
+ if (this.shelf.length === 0 || !this.currentCollectionId)
2564
+ return;
2565
+ const target = this.currentCollectionId;
2566
+ try {
2567
+ const p = this.ProviderToUse;
2568
+ const rv = RunView.FromMetadataProvider(p);
2569
+ for (const entry of this.shelf) {
2570
+ const it = entry.item;
2571
+ if (it.type === 'artifact' && it.version) {
2572
+ if (entry.sourceCollectionId && UUIDsEqual(entry.sourceCollectionId, target))
2573
+ continue;
2574
+ await this.addVersionToCollection(p, rv, it.version.ID, target);
2575
+ if (entry.sourceCollectionId) {
2576
+ await this.removeVersionFromCollection(rv, it.version.ID, entry.sourceCollectionId);
2577
+ }
2578
+ }
2579
+ else if (it.type === 'folder' && it.collection) {
2580
+ const fid = it.collection.ID;
2581
+ if (UUIDsEqual(fid, target) || this.isCollectionDescendant(target, fid))
2582
+ continue;
2583
+ await this.reparentCollection(fid, target);
2584
+ }
2585
+ }
2586
+ this.shelf = [];
2587
+ await this.loadCollections(true);
2588
+ await this.loadArtifacts(true);
2589
+ await this.loadAllCollections(true);
2590
+ this.buildUnifiedItemList();
2591
+ }
2592
+ catch (error) {
2593
+ console.error('Error moving staged items:', error);
2594
+ await this.dialogService.alert('Error', 'Failed to move staged items. Please try again.');
2595
+ }
2596
+ }
1872
2597
  static ɵfac = function CollectionsFullViewComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CollectionsFullViewComponent)(i0.ɵɵdirectiveInject(i1.DialogService), i0.ɵɵdirectiveInject(i2.ArtifactStateService), i0.ɵɵdirectiveInject(i3.CollectionStateService), i0.ɵɵdirectiveInject(i4.CollectionPermissionService), i0.ɵɵdirectiveInject(i5.ArtifactIconService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
1873
2598
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CollectionsFullViewComponent, selectors: [["mj-collections-full-view"]], hostBindings: function CollectionsFullViewComponent_HostBindings(rf, ctx) { if (rf & 1) {
1874
2599
  i0.ɵɵlistener("keydown.escape", function CollectionsFullViewComponent_keydown_escape_HostBindingHandler() { return ctx.onEscapeKey(); }, i0.ɵɵresolveDocument);
1875
- } }, inputs: { environmentId: "environmentId", currentUser: "currentUser" }, outputs: { collectionNavigated: "collectionNavigated" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 32, vars: 30, consts: [[1, "collections-view", 3, "keydown"], [1, "collections-header"], [1, "collections-breadcrumb"], [1, "breadcrumb-item"], [1, "fas", "fa-home"], [1, "breadcrumb-link", 3, "click"], [1, "breadcrumb-path"], [1, "collections-actions"], [1, "btn-icon", 3, "click", "title"], [1, "fas", 3, "ngClass"], [1, "fas", "fa-check-square"], [1, "dropdown-container"], [1, "search-container"], [1, "fas", "fa-search"], ["type", "text", "placeholder", "Search...", 1, "search-input", 3, "ngModelChange", "ngModel"], ["title", "Clear search", 1, "search-clear"], ["title", "Refresh", 1, "btn-icon", 3, "click"], [1, "fas", "fa-sync"], [1, "selection-toolbar"], [1, "collections-content"], [1, "loading-state"], [1, "empty-state"], [3, "saved", "cancelled", "isOpen", "collection", "parentCollection", "environmentId", "currentUser"], [3, "saved", "cancelled", "isOpen", "collectionId", "environmentId", "currentUser"], [3, "saved", "cancelled", "isOpen", "collection", "currentUser", "currentUserPermissions"], [1, "fas", "fa-chevron-right", "breadcrumb-separator"], ["title", "Sort options", 1, "btn-icon", 3, "click"], [1, "fas", "fa-sort"], [1, "dropdown-menu"], [1, "dropdown-item", 3, "click"], [1, "fas", "fa-sort-alpha-down"], [1, "fas", "fa-calendar"], [1, "fas", "fa-tag"], ["title", "Clear search", 1, "search-clear", 3, "click"], [1, "fas", "fa-times"], [1, "toolbar-separator"], [1, "toolbar-actions-group"], [1, "btn-icon", 3, "title"], [1, "btn-icon", "btn-icon-danger", 3, "title"], [1, "fas", "fa-share-nodes"], [1, "fas", "fa-pen-to-square"], [1, "btn-icon", "btn-icon-danger", 3, "click", "title"], [1, "fas", "fa-trash"], [1, "btn-primary", 3, "click"], [1, "fas", "fa-plus"], [1, "fas", "fa-chevron-down"], [1, "dropdown-menu", "dropdown-menu-right"], [1, "fas", "fa-folder-plus"], [1, "dropdown-item", 3, "click", "disabled"], [1, "fas", "fa-file-plus"], [1, "selection-info"], [1, "selection-count"], [1, "selection-actions"], [1, "btn-toolbar", 3, "click"], [1, "btn-toolbar", "btn-danger", 3, "click"], ["text", "Loading collections...", "size", "large"], [1, "fas", "fa-folder-open"], [1, "btn-primary", "empty-state-cta"], [1, "btn-primary", "empty-state-cta", 3, "click"], [1, "unified-grid"], [1, "grid-item", 3, "selected", "active"], [1, "pagination-bar"], [1, "grid-item", 3, "click", "dblclick", "contextmenu"], [1, "item-checkbox"], [1, "grid-item-content", 3, "title"], [1, "item-checkbox", 3, "click"], [1, "grid-icon", "folder-icon"], [1, "fas", "fa-folder"], ["title", "Shared", 1, "shared-badge"], [1, "grid-info"], [1, "grid-name"], [1, "grid-description"], [1, "grid-meta"], [1, "grid-owner"], [1, "fas", "fa-users"], [1, "fas", "fa-user"], [1, "grid-icon", "artifact-icon"], [1, "version-badge"], [1, "artifact-type-badge"], [1, "pagination-info"], [1, "pagination-controls"], ["title", "First page", 1, "pagination-btn", 3, "click", "disabled"], [1, "fas", "fa-angles-left"], ["title", "Previous page", 1, "pagination-btn", 3, "click", "disabled"], [1, "fas", "fa-chevron-left"], [1, "pagination-page-info"], ["title", "Next page", 1, "pagination-btn", 3, "click", "disabled"], [1, "fas", "fa-chevron-right"], ["title", "Last page", 1, "pagination-btn", 3, "click", "disabled"], [1, "fas", "fa-angles-right"], [1, "unified-list"], [1, "list-table"], [1, "col-checkbox"], [1, "col-name", "sortable", 3, "click"], [1, "col-type", "sortable", 3, "click"], [1, "col-modified", "sortable", 3, "click"], [1, "col-owner"], [1, "list-item", 3, "selected", "active"], [1, "fas", 3, "click", "ngClass"], [1, "list-item", 3, "click", "dblclick", "contextmenu"], [1, "col-name"], [1, "list-name-cell"], ["title", "Shared", 1, "fas", "fa-users", "shared-indicator"], [1, "col-type"], [1, "col-modified"], [1, "context-menu-backdrop", 3, "click"], [1, "context-menu"], [1, "context-menu-item", 3, "click"], [1, "context-menu-divider"], [1, "context-menu-item"], [1, "context-menu-item", "context-menu-danger", 3, "click"], [1, "fas", "fa-eye"], [1, "fas", "fa-times-circle"]], template: function CollectionsFullViewComponent_Template(rf, ctx) { if (rf & 1) {
2600
+ } }, inputs: { environmentId: "environmentId", currentUser: "currentUser" }, outputs: { collectionNavigated: "collectionNavigated", openConversationRequested: "openConversationRequested" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 37, vars: 36, consts: [[1, "collections-view", 3, "keydown"], [1, "collections-header"], [1, "collections-breadcrumb"], ["title", "Toggle collections panel", 1, "btn-icon", "nav-toggle", 3, "click"], [1, "fas", "fa-bars"], [1, "breadcrumb-item", 3, "dragover", "dragleave", "drop"], [1, "fas", "fa-home"], [1, "breadcrumb-link", 3, "click"], [1, "breadcrumb-path"], [1, "collections-actions"], [1, "btn-icon", 3, "click", "title"], [1, "fas", 3, "ngClass"], [1, "fas", "fa-check-square"], [1, "dropdown-container"], [1, "search-container"], [1, "fas", "fa-search"], ["type", "text", "placeholder", "Search...", 1, "search-input", 3, "ngModelChange", "ngModel"], ["title", "Clear search", 1, "search-clear"], ["title", "Refresh", 1, "btn-icon", 3, "click"], [1, "fas", "fa-sync"], [1, "selection-toolbar"], [1, "collections-body"], [1, "collections-navigator"], [1, "collections-content"], [1, "loading-state"], [1, "empty-state"], [1, "staging-shelf"], [3, "saved", "cancelled", "isOpen", "collection", "parentCollection", "environmentId", "currentUser"], [3, "saved", "cancelled", "isOpen", "collectionId", "environmentId", "currentUser"], [3, "saved", "cancelled", "isOpen", "collection", "currentUser", "currentUserPermissions"], [1, "fas", "fa-chevron-right", "breadcrumb-separator"], [1, "breadcrumb-link", 3, "dragover", "dragleave", "drop", "click"], ["title", "Sort options", 1, "btn-icon", 3, "click"], [1, "fas", "fa-sort"], [1, "dropdown-menu"], [1, "dropdown-item", 3, "click"], [1, "fas", "fa-sort-alpha-down"], [1, "fas", "fa-calendar"], [1, "fas", "fa-tag"], ["title", "Clear search", 1, "search-clear", 3, "click"], [1, "fas", "fa-times"], [1, "toolbar-separator"], [1, "toolbar-actions-group"], [1, "btn-icon", 3, "title"], [1, "btn-icon", "btn-icon-danger", 3, "title"], [1, "fas", "fa-share-nodes"], [1, "fas", "fa-pen-to-square"], [1, "btn-icon", "btn-icon-danger", 3, "click", "title"], [1, "fas", "fa-trash"], [1, "btn-primary", 3, "click"], [1, "fas", "fa-plus"], [1, "fas", "fa-chevron-down"], [1, "dropdown-menu", "dropdown-menu-right"], [1, "fas", "fa-folder-plus"], [1, "dropdown-item", 3, "click", "disabled"], [1, "fas", "fa-file-plus"], [1, "selection-info"], [1, "selection-count"], [1, "selection-actions"], [1, "btn-toolbar", 3, "click"], [1, "fas", "fa-folder-tree"], ["title", "Add to the staging shelf to move later", 1, "btn-toolbar", 3, "click"], [1, "fas", "fa-layer-group"], [1, "btn-toolbar", "btn-danger", 3, "click"], [1, "bulk-move-backdrop", 3, "click"], [1, "dropdown-menu", "bulk-move-menu"], [1, "dropdown-note"], [1, "dropdown-item", 3, "paddingLeft"], [1, "fas", "fa-folder"], [1, "nav-header"], [1, "nav-list"], [1, "nav-row", 3, "click", "dragover", "dragleave", "drop"], [1, "nav-row", 3, "active", "drag-over", "paddingLeft", "title"], [1, "nav-row", 3, "click", "dragover", "dragleave", "drop", "title"], [1, "nav-row-name"], ["text", "Loading collections...", "size", "large"], [1, "fas", "fa-folder-open"], [1, "btn-primary", "empty-state-cta"], [1, "btn-primary", "empty-state-cta", 3, "click"], [1, "unified-grid"], [1, "grid-item", 3, "selected", "active", "dragging", "drag-over", "draggable"], [1, "pagination-bar"], [1, "grid-item", 3, "dragstart", "dragend", "dragover", "dragleave", "drop", "click", "dblclick", "contextmenu", "draggable"], [1, "item-checkbox", 3, "click"], [1, "grid-item-content", 3, "title"], [1, "grid-icon", "folder-icon"], ["title", "Shared", 1, "shared-badge"], [1, "grid-info"], [1, "grid-name"], [1, "grid-description"], [1, "grid-meta"], [1, "grid-owner"], [1, "fas", "fa-users"], [1, "fas", "fa-user"], [1, "grid-icon", "artifact-icon"], [1, "version-badge"], [1, "artifact-type-badge"], [1, "pagination-info"], [1, "pagination-controls"], ["title", "First page", 1, "pagination-btn", 3, "click", "disabled"], [1, "fas", "fa-angles-left"], ["title", "Previous page", 1, "pagination-btn", 3, "click", "disabled"], [1, "fas", "fa-chevron-left"], [1, "pagination-page-info"], ["title", "Next page", 1, "pagination-btn", 3, "click", "disabled"], [1, "fas", "fa-chevron-right"], ["title", "Last page", 1, "pagination-btn", 3, "click", "disabled"], [1, "fas", "fa-angles-right"], [1, "unified-list"], [1, "list-table"], [1, "col-checkbox"], [1, "fas", 3, "click", "ngClass"], [1, "col-name", "sortable", 3, "click"], [1, "col-type", "sortable", 3, "click"], [1, "col-modified", "sortable", 3, "click"], [1, "col-owner"], [1, "list-item", 3, "selected", "active", "dragging", "drag-over", "draggable"], [1, "list-item", 3, "dragstart", "dragend", "dragover", "dragleave", "drop", "click", "dblclick", "contextmenu", "draggable"], [1, "col-name"], [1, "list-name-cell"], ["title", "Shared", 1, "fas", "fa-users", "shared-indicator"], [1, "col-type"], [1, "col-modified"], [1, "shelf-info"], [1, "shelf-chips"], [1, "shelf-chip", 3, "title"], [1, "shelf-actions"], [1, "btn-toolbar", "btn-primary-toolbar", 3, "click", "disabled", "title"], [1, "fas", "fa-arrow-down"], [1, "shelf-chip-name"], ["title", "Remove", 1, "shelf-chip-x", 3, "click"], [1, "context-menu-backdrop", 3, "click"], [1, "context-menu"], [1, "context-menu-item", 3, "click"], [1, "context-menu-divider"], [1, "context-menu-item"], [1, "context-menu-item", "context-menu-danger", 3, "click"], [1, "context-menu-note"], [1, "move-target-list"], [1, "fas", "fa-spinner", "fa-spin"], [1, "context-menu-item", 3, "paddingLeft"], [1, "fas", "fa-eye"], [1, "fas", "fa-comments"], [1, "fas", "fa-chevron-right", "submenu-arrow"], [1, "fas", "fa-times-circle"]], template: function CollectionsFullViewComponent_Template(rf, ctx) { if (rf & 1) {
1876
2601
  i0.ɵɵelementStart(0, "div", 0);
1877
2602
  i0.ɵɵlistener("keydown", function CollectionsFullViewComponent_Template_div_keydown_0_listener($event) { return ctx.handleKeyboardShortcut($event); });
1878
- i0.ɵɵelementStart(1, "div", 1)(2, "div", 2)(3, "div", 3);
2603
+ i0.ɵɵelementStart(1, "div", 1)(2, "div", 2)(3, "button", 3);
2604
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Template_button_click_3_listener() { return ctx.toggleNavigator(); });
1879
2605
  i0.ɵɵelement(4, "i", 4);
1880
- i0.ɵɵelementStart(5, "a", 5);
1881
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Template_a_click_5_listener() { return ctx.navigateToRoot(); });
1882
- i0.ɵɵtext(6, "Collections");
2606
+ i0.ɵɵelementEnd();
2607
+ i0.ɵɵelementStart(5, "div", 5);
2608
+ i0.ɵɵlistener("dragover", function CollectionsFullViewComponent_Template_div_dragover_5_listener($event) { return ctx.onCrumbDragOver(null, $event); })("dragleave", function CollectionsFullViewComponent_Template_div_dragleave_5_listener() { return ctx.onDragLeave("root"); })("drop", function CollectionsFullViewComponent_Template_div_drop_5_listener($event) { return ctx.onCrumbDrop(null, $event); });
2609
+ i0.ɵɵelement(6, "i", 6);
2610
+ i0.ɵɵelementStart(7, "a", 7);
2611
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Template_a_click_7_listener() { return ctx.navigateToRoot(); });
2612
+ i0.ɵɵtext(8, "Collections");
1883
2613
  i0.ɵɵelementEnd()();
1884
- i0.ɵɵconditionalCreate(7, CollectionsFullViewComponent_Conditional_7_Template, 3, 0, "span", 6);
2614
+ i0.ɵɵconditionalCreate(9, CollectionsFullViewComponent_Conditional_9_Template, 3, 0, "span", 8);
1885
2615
  i0.ɵɵelementEnd();
1886
- i0.ɵɵelementStart(8, "div", 7)(9, "button", 8);
1887
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Template_button_click_9_listener() { return ctx.toggleViewMode(); });
1888
- i0.ɵɵelement(10, "i", 9);
2616
+ i0.ɵɵelementStart(10, "div", 9)(11, "button", 10);
2617
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Template_button_click_11_listener() { return ctx.toggleViewMode(); });
2618
+ i0.ɵɵelement(12, "i", 11);
1889
2619
  i0.ɵɵelementEnd();
1890
- i0.ɵɵelementStart(11, "button", 8);
1891
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Template_button_click_11_listener() { return ctx.toggleSelectMode(); });
1892
- i0.ɵɵelement(12, "i", 10);
2620
+ i0.ɵɵelementStart(13, "button", 10);
2621
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Template_button_click_13_listener() { return ctx.toggleSelectMode(); });
2622
+ i0.ɵɵelement(14, "i", 12);
1893
2623
  i0.ɵɵelementEnd();
1894
- i0.ɵɵconditionalCreate(13, CollectionsFullViewComponent_Conditional_13_Template, 4, 1, "div", 11);
1895
- i0.ɵɵelementStart(14, "div", 12);
1896
- i0.ɵɵelement(15, "i", 13);
1897
- i0.ɵɵelementStart(16, "input", 14);
1898
- i0.ɵɵtwoWayListener("ngModelChange", function CollectionsFullViewComponent_Template_input_ngModelChange_16_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.searchQuery, $event) || (ctx.searchQuery = $event); return $event; });
1899
- i0.ɵɵlistener("ngModelChange", function CollectionsFullViewComponent_Template_input_ngModelChange_16_listener($event) { return ctx.onSearchChange($event); });
2624
+ i0.ɵɵconditionalCreate(15, CollectionsFullViewComponent_Conditional_15_Template, 4, 1, "div", 13);
2625
+ i0.ɵɵelementStart(16, "div", 14);
2626
+ i0.ɵɵelement(17, "i", 15);
2627
+ i0.ɵɵelementStart(18, "input", 16);
2628
+ i0.ɵɵtwoWayListener("ngModelChange", function CollectionsFullViewComponent_Template_input_ngModelChange_18_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.searchQuery, $event) || (ctx.searchQuery = $event); return $event; });
2629
+ i0.ɵɵlistener("ngModelChange", function CollectionsFullViewComponent_Template_input_ngModelChange_18_listener($event) { return ctx.onSearchChange($event); });
1900
2630
  i0.ɵɵelementEnd();
1901
- i0.ɵɵconditionalCreate(17, CollectionsFullViewComponent_Conditional_17_Template, 2, 0, "button", 15);
2631
+ i0.ɵɵconditionalCreate(19, CollectionsFullViewComponent_Conditional_19_Template, 2, 0, "button", 17);
1902
2632
  i0.ɵɵelementEnd();
1903
- i0.ɵɵconditionalCreate(18, CollectionsFullViewComponent_Conditional_18_Template, 5, 3);
1904
- i0.ɵɵconditionalCreate(19, CollectionsFullViewComponent_Conditional_19_Template, 7, 1, "div", 11);
1905
- i0.ɵɵelementStart(20, "button", 16);
1906
- i0.ɵɵlistener("click", function CollectionsFullViewComponent_Template_button_click_20_listener() { return ctx.refresh(); });
1907
- i0.ɵɵelement(21, "i", 17);
2633
+ i0.ɵɵconditionalCreate(20, CollectionsFullViewComponent_Conditional_20_Template, 5, 3);
2634
+ i0.ɵɵconditionalCreate(21, CollectionsFullViewComponent_Conditional_21_Template, 7, 1, "div", 13);
2635
+ i0.ɵɵelementStart(22, "button", 18);
2636
+ i0.ɵɵlistener("click", function CollectionsFullViewComponent_Template_button_click_22_listener() { return ctx.refresh(); });
2637
+ i0.ɵɵelement(23, "i", 19);
1908
2638
  i0.ɵɵelementEnd()()();
1909
- i0.ɵɵconditionalCreate(22, CollectionsFullViewComponent_Conditional_22_Template, 11, 1, "div", 18);
1910
- i0.ɵɵelementStart(23, "div", 19);
1911
- i0.ɵɵconditionalCreate(24, CollectionsFullViewComponent_Conditional_24_Template, 2, 0, "div", 20);
1912
- i0.ɵɵconditionalCreate(25, CollectionsFullViewComponent_Conditional_25_Template, 5, 3, "div", 21);
1913
- i0.ɵɵconditionalCreate(26, CollectionsFullViewComponent_Conditional_26_Template, 4, 3);
1914
- i0.ɵɵconditionalCreate(27, CollectionsFullViewComponent_Conditional_27_Template, 26, 10);
2639
+ i0.ɵɵconditionalCreate(24, CollectionsFullViewComponent_Conditional_24_Template, 19, 2, "div", 20);
2640
+ i0.ɵɵelementStart(25, "div", 21);
2641
+ i0.ɵɵconditionalCreate(26, CollectionsFullViewComponent_Conditional_26_Template, 10, 4, "div", 22);
2642
+ i0.ɵɵelementStart(27, "div", 23);
2643
+ i0.ɵɵconditionalCreate(28, CollectionsFullViewComponent_Conditional_28_Template, 2, 0, "div", 24);
2644
+ i0.ɵɵconditionalCreate(29, CollectionsFullViewComponent_Conditional_29_Template, 5, 3, "div", 25);
2645
+ i0.ɵɵconditionalCreate(30, CollectionsFullViewComponent_Conditional_30_Template, 4, 3);
2646
+ i0.ɵɵconditionalCreate(31, CollectionsFullViewComponent_Conditional_31_Template, 27, 10);
1915
2647
  i0.ɵɵelementEnd()();
1916
- i0.ɵɵconditionalCreate(28, CollectionsFullViewComponent_Conditional_28_Template, 4, 6);
1917
- i0.ɵɵelementStart(29, "mj-collection-form-modal", 22);
1918
- i0.ɵɵlistener("saved", function CollectionsFullViewComponent_Template_mj_collection_form_modal_saved_29_listener($event) { return ctx.onCollectionSaved($event); })("cancelled", function CollectionsFullViewComponent_Template_mj_collection_form_modal_cancelled_29_listener() { return ctx.onFormCancelled(); });
2648
+ i0.ɵɵconditionalCreate(32, CollectionsFullViewComponent_Conditional_32_Template, 14, 3, "div", 26);
2649
+ i0.ɵɵelementEnd();
2650
+ i0.ɵɵconditionalCreate(33, CollectionsFullViewComponent_Conditional_33_Template, 4, 6);
2651
+ i0.ɵɵelementStart(34, "mj-collection-form-modal", 27);
2652
+ i0.ɵɵlistener("saved", function CollectionsFullViewComponent_Template_mj_collection_form_modal_saved_34_listener($event) { return ctx.onCollectionSaved($event); })("cancelled", function CollectionsFullViewComponent_Template_mj_collection_form_modal_cancelled_34_listener() { return ctx.onFormCancelled(); });
1919
2653
  i0.ɵɵelementEnd();
1920
- i0.ɵɵelementStart(30, "mj-artifact-create-modal", 23);
1921
- i0.ɵɵlistener("saved", function CollectionsFullViewComponent_Template_mj_artifact_create_modal_saved_30_listener($event) { return ctx.onArtifactSaved($event); })("cancelled", function CollectionsFullViewComponent_Template_mj_artifact_create_modal_cancelled_30_listener() { return ctx.onArtifactModalCancelled(); });
2654
+ i0.ɵɵelementStart(35, "mj-artifact-create-modal", 28);
2655
+ i0.ɵɵlistener("saved", function CollectionsFullViewComponent_Template_mj_artifact_create_modal_saved_35_listener($event) { return ctx.onArtifactSaved($event); })("cancelled", function CollectionsFullViewComponent_Template_mj_artifact_create_modal_cancelled_35_listener() { return ctx.onArtifactModalCancelled(); });
1922
2656
  i0.ɵɵelementEnd();
1923
- i0.ɵɵelementStart(31, "mj-collection-share-modal", 24);
1924
- i0.ɵɵlistener("saved", function CollectionsFullViewComponent_Template_mj_collection_share_modal_saved_31_listener() { return ctx.onPermissionsChanged(); })("cancelled", function CollectionsFullViewComponent_Template_mj_collection_share_modal_cancelled_31_listener() { return ctx.onShareModalCancelled(); });
2657
+ i0.ɵɵelementStart(36, "mj-collection-share-modal", 29);
2658
+ i0.ɵɵlistener("saved", function CollectionsFullViewComponent_Template_mj_collection_share_modal_saved_36_listener() { return ctx.onPermissionsChanged(); })("cancelled", function CollectionsFullViewComponent_Template_mj_collection_share_modal_cancelled_36_listener() { return ctx.onShareModalCancelled(); });
1925
2659
  i0.ɵɵelementEnd();
1926
2660
  } if (rf & 2) {
1927
- i0.ɵɵadvance(7);
1928
- i0.ɵɵconditional(ctx.breadcrumbs.length > 0 ? 7 : -1);
2661
+ i0.ɵɵadvance(3);
2662
+ i0.ɵɵclassProp("active", ctx.showNavigator);
2663
+ i0.ɵɵadvance(2);
2664
+ i0.ɵɵclassProp("drag-over", ctx.dragOverTargetId === "root");
2665
+ i0.ɵɵadvance(4);
2666
+ i0.ɵɵconditional(ctx.breadcrumbs.length > 0 ? 9 : -1);
1929
2667
  i0.ɵɵadvance(2);
1930
2668
  i0.ɵɵproperty("title", ctx.viewMode === "grid" ? "Switch to List View" : "Switch to Grid View");
1931
2669
  i0.ɵɵadvance();
@@ -1934,34 +2672,38 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
1934
2672
  i0.ɵɵclassProp("active", ctx.isSelectMode);
1935
2673
  i0.ɵɵproperty("title", ctx.isSelectMode ? "Exit Select Mode" : "Select Items");
1936
2674
  i0.ɵɵadvance(2);
1937
- i0.ɵɵconditional(ctx.viewMode === "grid" ? 13 : -1);
2675
+ i0.ɵɵconditional(ctx.viewMode === "grid" ? 15 : -1);
1938
2676
  i0.ɵɵadvance(3);
1939
2677
  i0.ɵɵtwoWayProperty("ngModel", ctx.searchQuery);
1940
2678
  i0.ɵɵadvance();
1941
- i0.ɵɵconditional(ctx.searchQuery ? 17 : -1);
2679
+ i0.ɵɵconditional(ctx.searchQuery ? 19 : -1);
1942
2680
  i0.ɵɵadvance();
1943
- i0.ɵɵconditional(ctx.currentCollectionId && ctx.currentCollection ? 18 : -1);
2681
+ i0.ɵɵconditional(ctx.currentCollectionId && ctx.currentCollection ? 20 : -1);
1944
2682
  i0.ɵɵadvance();
1945
- i0.ɵɵconditional(ctx.canEditCurrent() ? 19 : -1);
2683
+ i0.ɵɵconditional(ctx.canEditCurrent() ? 21 : -1);
1946
2684
  i0.ɵɵadvance(3);
1947
- i0.ɵɵconditional(ctx.selectedItems.size > 0 ? 22 : -1);
2685
+ i0.ɵɵconditional(ctx.selectedItems.size > 0 ? 24 : -1);
2686
+ i0.ɵɵadvance(2);
2687
+ i0.ɵɵconditional(ctx.showNavigator ? 26 : -1);
1948
2688
  i0.ɵɵadvance(2);
1949
- i0.ɵɵconditional(ctx.isLoading ? 24 : -1);
2689
+ i0.ɵɵconditional(ctx.isLoading ? 28 : -1);
2690
+ i0.ɵɵadvance();
2691
+ i0.ɵɵconditional(!ctx.isLoading && ctx.unifiedItems.length === 0 ? 29 : -1);
1950
2692
  i0.ɵɵadvance();
1951
- i0.ɵɵconditional(!ctx.isLoading && ctx.unifiedItems.length === 0 ? 25 : -1);
2693
+ i0.ɵɵconditional(!ctx.isLoading && ctx.unifiedItems.length > 0 && ctx.viewMode === "grid" ? 30 : -1);
1952
2694
  i0.ɵɵadvance();
1953
- i0.ɵɵconditional(!ctx.isLoading && ctx.unifiedItems.length > 0 && ctx.viewMode === "grid" ? 26 : -1);
2695
+ i0.ɵɵconditional(!ctx.isLoading && ctx.unifiedItems.length > 0 && ctx.viewMode === "list" ? 31 : -1);
1954
2696
  i0.ɵɵadvance();
1955
- i0.ɵɵconditional(!ctx.isLoading && ctx.unifiedItems.length > 0 && ctx.viewMode === "list" ? 27 : -1);
2697
+ i0.ɵɵconditional(ctx.shelf.length > 0 ? 32 : -1);
1956
2698
  i0.ɵɵadvance();
1957
- i0.ɵɵconditional(ctx.showContextMenu && ctx.contextMenuItem ? 28 : -1);
2699
+ i0.ɵɵconditional(ctx.showContextMenu && ctx.contextMenuItem ? 33 : -1);
1958
2700
  i0.ɵɵadvance();
1959
2701
  i0.ɵɵproperty("isOpen", ctx.isFormModalOpen)("collection", ctx.editingCollection)("parentCollection", ctx.editingCollection ? undefined : ctx.currentCollection || undefined)("environmentId", ctx.environmentId)("currentUser", ctx.currentUser);
1960
2702
  i0.ɵɵadvance();
1961
2703
  i0.ɵɵproperty("isOpen", ctx.isArtifactModalOpen)("collectionId", ctx.currentCollectionId || "")("environmentId", ctx.environmentId)("currentUser", ctx.currentUser);
1962
2704
  i0.ɵɵadvance();
1963
2705
  i0.ɵɵproperty("isOpen", ctx.isShareModalOpen)("collection", ctx.sharingCollection)("currentUser", ctx.currentUser)("currentUserPermissions", ctx.sharingCollection ? ctx.userPermissions.get(ctx.sharingCollection.ID) || null : null);
1964
- } }, dependencies: [i6.NgClass, i7.DefaultValueAccessor, i7.NgControlStatus, i7.NgModel, i8.LoadingComponent, i9.CollectionShareModalComponent, i10.CollectionFormModalComponent, i11.ArtifactCreateModalComponent, i6.DatePipe], styles: ["[_nghost-%COMP%] {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n }\n\n \n\n .collections-view[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface-sunken);\n position: relative;\n }\n\n \n\n .collections-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n gap: 16px;\n background: var(--mj-bg-surface);\n }\n\n .collections-breadcrumb[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: 1;\n min-width: 0;\n }\n\n .breadcrumb-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .breadcrumb-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 14px;\n }\n\n .breadcrumb-link[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n font-weight: 500;\n cursor: pointer;\n text-decoration: none;\n white-space: nowrap;\n transition: color 150ms ease;\n font-size: 14px;\n }\n\n .breadcrumb-link[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n }\n\n .breadcrumb-link.active[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n cursor: default;\n }\n\n .breadcrumb-path[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n overflow-x: auto;\n }\n\n .breadcrumb-separator[_ngcontent-%COMP%] {\n color: var(--mj-border-strong);\n font-size: 10px;\n }\n\n .collections-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n \n\n .btn-primary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-brand-primary);\n border: none;\n border-radius: 6px;\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 150ms ease;\n }\n\n .btn-primary[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n }\n\n .btn-primary[_ngcontent-%COMP%] i.fa-chevron-down[_ngcontent-%COMP%] {\n font-size: 10px;\n margin-left: 2px;\n }\n\n .btn-icon[_ngcontent-%COMP%] {\n padding: 6px 10px;\n background: transparent;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: all 150ms ease;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .btn-icon[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n border-color: var(--mj-text-disabled);\n }\n\n .btn-icon.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n }\n\n .btn-icon.active[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n \n\n .dropdown-container[_ngcontent-%COMP%] {\n position: relative;\n }\n\n .dropdown-menu[_ngcontent-%COMP%] {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n min-width: 200px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n padding: 4px;\n z-index: 1000;\n }\n\n .dropdown-menu-right[_ngcontent-%COMP%] {\n left: auto;\n right: 0;\n }\n\n .dropdown-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 8px 12px;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 100ms ease;\n }\n\n .dropdown-item[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n }\n\n .dropdown-item[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .dropdown-item.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .dropdown-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n width: 16px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .dropdown-item.active[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n }\n\n .dropdown-divider[_ngcontent-%COMP%] {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\n }\n\n \n\n .search-container[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n align-items: center;\n min-width: 200px;\n }\n\n .search-container[_ngcontent-%COMP%] i.fa-search[_ngcontent-%COMP%] {\n position: absolute;\n left: 10px;\n color: var(--mj-text-disabled);\n font-size: 13px;\n pointer-events: none;\n }\n\n .search-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 6px 32px 6px 32px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n font-size: 13px;\n outline: none;\n transition: all 150ms ease;\n }\n\n .search-input[_ngcontent-%COMP%]:focus {\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 .search-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 6px;\n padding: 4px;\n background: transparent;\n border: none;\n color: var(--mj-text-disabled);\n cursor: pointer;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .search-clear[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n \n\n .selection-toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 20px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n }\n\n .selection-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .selection-count[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n }\n\n .selection-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n }\n\n .btn-toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms ease;\n }\n\n .btn-toolbar[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-text-disabled);\n }\n\n .btn-toolbar.btn-danger[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n }\n\n .btn-toolbar.btn-danger[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-color: var(--mj-status-error);\n }\n\n \n\n .collections-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n }\n\n \n\n .loading-state[_ngcontent-%COMP%], .empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n min-height: 0;\n color: var(--mj-text-disabled);\n text-align: center;\n padding: 24px;\n }\n\n .empty-state[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n font-size: 64px;\n margin-bottom: 24px;\n opacity: 0.3;\n color: var(--mj-border-strong);\n }\n\n .empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n color: var(--mj-text-secondary);\n font-size: 18px;\n font-weight: 600;\n }\n\n .empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 24px 0;\n font-size: 14px;\n color: var(--mj-text-muted);\n }\n\n .empty-state[_ngcontent-%COMP%] .empty-state-cta[_ngcontent-%COMP%] {\n padding: 10px 20px;\n font-size: 14px;\n border-radius: 8px;\n }\n\n .empty-state-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n justify-content: center;\n }\n\n \n\n .unified-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));\n gap: 16px;\n padding: 4px;\n flex-shrink: 0;\n }\n\n .grid-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n padding: 12px;\n background: var(--mj-bg-surface);\n border: 2px solid transparent;\n border-radius: 8px;\n cursor: pointer;\n transition: all 150ms ease;\n position: relative;\n user-select: none;\n }\n\n .grid-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n }\n\n .grid-item.selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n }\n\n .grid-item.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border-color: var(--mj-status-warning);\n box-shadow: 0 0 0 1px var(--mj-status-warning);\n }\n\n .grid-item.active[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-warning) 25%, var(--mj-bg-surface));\n }\n\n \n\n .unified-grid.select-mode[_ngcontent-%COMP%] .grid-item[_ngcontent-%COMP%] {\n cursor: pointer;\n }\n\n .unified-grid.select-mode[_ngcontent-%COMP%] .grid-item[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n }\n\n .item-checkbox[_ngcontent-%COMP%] {\n position: absolute;\n top: 8px;\n right: 8px;\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n z-index: 10;\n }\n\n .item-checkbox[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n color: var(--mj-text-disabled);\n transition: color 150ms ease;\n }\n\n .grid-item.selected[_ngcontent-%COMP%] .item-checkbox[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n .item-checkbox[_ngcontent-%COMP%]:hover i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n }\n\n .grid-item-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n }\n\n .grid-icon[_ngcontent-%COMP%] {\n width: 64px;\n height: 64px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n position: relative;\n }\n\n .grid-icon.folder-icon[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n }\n\n .grid-icon.folder-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 36px;\n color: var(--mj-text-inverse);\n }\n\n .grid-icon.artifact-icon[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n }\n\n .grid-icon.artifact-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n color: var(--mj-text-muted);\n }\n\n .shared-badge[_ngcontent-%COMP%] {\n position: absolute;\n top: -4px;\n right: -4px;\n width: 20px;\n height: 20px;\n background: var(--mj-status-success);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--mj-bg-surface);\n }\n\n .shared-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-inverse);\n }\n\n .grid-info[_ngcontent-%COMP%] {\n width: 100%;\n text-align: center;\n }\n\n .grid-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n line-height: 1.3;\n margin-bottom: 4px;\n \n\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n word-break: break-word;\n }\n\n .grid-description[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n line-height: 1.3;\n margin-bottom: 4px;\n \n\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n word-break: break-word;\n }\n\n .grid-meta[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 4px;\n }\n\n .grid-owner[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n }\n\n .grid-owner[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n margin-right: 3px;\n }\n\n .version-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 2px 6px;\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n border-radius: 3px;\n font-size: 10px;\n font-weight: 600;\n font-family: monospace;\n margin-right: 4px;\n }\n\n .artifact-type-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 2px 6px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 3px;\n font-size: 10px;\n font-weight: 500;\n text-transform: uppercase;\n }\n\n \n\n .unified-list[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n flex-shrink: 0;\n }\n\n .list-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n }\n\n .list-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .list-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n padding: 10px 16px;\n text-align: left;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .list-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%] {\n cursor: pointer;\n user-select: none;\n transition: color 150ms ease;\n }\n\n .list-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n }\n\n .list-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n display: inline-block;\n margin-right: 6px;\n }\n\n .list-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n opacity: 0.5;\n }\n\n .list-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%]:hover i[_ngcontent-%COMP%] {\n opacity: 1;\n }\n\n .list-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] {\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n transition: background 150ms ease;\n cursor: pointer;\n user-select: none;\n }\n\n .list-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n }\n\n .list-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .list-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr.selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n .list-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border-left: 3px solid var(--mj-status-warning);\n }\n\n .list-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr.active[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-warning) 25%, var(--mj-bg-surface));\n }\n\n .list-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 12px 16px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .col-checkbox[_ngcontent-%COMP%] {\n width: 40px;\n text-align: center;\n }\n\n .col-checkbox[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n color: var(--mj-text-disabled);\n cursor: pointer;\n transition: color 150ms ease;\n }\n\n .col-checkbox[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:hover, \n .list-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr.selected[_ngcontent-%COMP%] .col-checkbox[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n }\n\n .col-name[_ngcontent-%COMP%] {\n min-width: 300px;\n }\n\n .list-name-cell[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .list-name-cell[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n color: var(--mj-text-muted);\n width: 20px;\n text-align: center;\n }\n\n .list-name-cell[_ngcontent-%COMP%] .fa-folder[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n }\n\n .shared-indicator[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-status-success);\n margin-left: auto;\n }\n\n .col-type[_ngcontent-%COMP%] {\n width: 150px;\n }\n\n .col-modified[_ngcontent-%COMP%] {\n width: 180px;\n }\n\n .col-owner[_ngcontent-%COMP%] {\n width: 150px;\n }\n\n \n\n .pagination-bar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 16px;\n margin-top: 8px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n flex-shrink: 0;\n }\n\n .pagination-info[_ngcontent-%COMP%] {\n white-space: nowrap;\n }\n\n .pagination-controls[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .pagination-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 150ms ease;\n font-size: 12px;\n }\n\n .pagination-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n }\n\n .pagination-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.35;\n cursor: default;\n }\n\n .pagination-page-info[_ngcontent-%COMP%] {\n padding: 0 8px;\n white-space: nowrap;\n font-weight: 500;\n }\n\n \n\n .toolbar-separator[_ngcontent-%COMP%] {\n width: 1px;\n height: 24px;\n background: var(--mj-border-strong);\n margin: 0 4px;\n }\n\n .toolbar-actions-group[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .btn-icon-danger[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n }\n\n .btn-icon-danger[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n border-color: var(--mj-status-error);\n }\n\n \n\n .context-menu-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 1999;\n }\n\n .context-menu[_ngcontent-%COMP%] {\n position: fixed;\n min-width: 180px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.18);\n padding: 4px;\n z-index: 2000;\n }\n\n .context-menu-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 8px 12px;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 100ms ease;\n }\n\n .context-menu-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .context-menu-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n width: 16px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .context-menu-danger[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n }\n\n .context-menu-danger[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n }\n\n .context-menu-danger[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n }\n\n .context-menu-divider[_ngcontent-%COMP%] {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\n }"] });
2706
+ } }, dependencies: [i6.NgClass, i7.DefaultValueAccessor, i7.NgControlStatus, i7.NgModel, i8.LoadingComponent, i9.CollectionShareModalComponent, i10.CollectionFormModalComponent, i11.ArtifactCreateModalComponent, i6.DatePipe], styles: ["[_nghost-%COMP%] {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n }\n\n \n\n .collections-view[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface-sunken);\n position: relative;\n }\n\n \n\n .collections-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n gap: 16px;\n background: var(--mj-bg-surface);\n }\n\n .collections-breadcrumb[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: 1;\n min-width: 0;\n }\n\n .breadcrumb-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .breadcrumb-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 14px;\n }\n\n .breadcrumb-link[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n font-weight: 500;\n cursor: pointer;\n text-decoration: none;\n white-space: nowrap;\n transition: color 150ms ease;\n font-size: 14px;\n }\n\n .breadcrumb-link[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n }\n\n .breadcrumb-link.active[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n cursor: default;\n }\n\n .breadcrumb-path[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n overflow-x: auto;\n }\n\n .breadcrumb-separator[_ngcontent-%COMP%] {\n color: var(--mj-border-strong);\n font-size: 10px;\n }\n\n .collections-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n \n\n .btn-primary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-brand-primary);\n border: none;\n border-radius: 6px;\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 150ms ease;\n }\n\n .btn-primary[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n }\n\n .btn-primary[_ngcontent-%COMP%] i.fa-chevron-down[_ngcontent-%COMP%] {\n font-size: 10px;\n margin-left: 2px;\n }\n\n .btn-icon[_ngcontent-%COMP%] {\n padding: 6px 10px;\n background: transparent;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: all 150ms ease;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .btn-icon[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n border-color: var(--mj-text-disabled);\n }\n\n .btn-icon.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n }\n\n .btn-icon.active[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n \n\n .dropdown-container[_ngcontent-%COMP%] {\n position: relative;\n }\n\n .dropdown-menu[_ngcontent-%COMP%] {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n min-width: 200px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n padding: 4px;\n z-index: 1000;\n }\n\n .dropdown-menu-right[_ngcontent-%COMP%] {\n left: auto;\n right: 0;\n }\n\n .dropdown-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 8px 12px;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 100ms ease;\n }\n\n .dropdown-item[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n }\n\n .dropdown-item[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .dropdown-item.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .dropdown-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n width: 16px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .dropdown-item.active[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n }\n\n .dropdown-divider[_ngcontent-%COMP%] {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\n }\n\n \n\n .search-container[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n align-items: center;\n min-width: 200px;\n }\n\n .search-container[_ngcontent-%COMP%] i.fa-search[_ngcontent-%COMP%] {\n position: absolute;\n left: 10px;\n color: var(--mj-text-disabled);\n font-size: 13px;\n pointer-events: none;\n }\n\n .search-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 6px 32px 6px 32px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n font-size: 13px;\n outline: none;\n transition: all 150ms ease;\n }\n\n .search-input[_ngcontent-%COMP%]:focus {\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 .search-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 6px;\n padding: 4px;\n background: transparent;\n border: none;\n color: var(--mj-text-disabled);\n cursor: pointer;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .search-clear[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n \n\n .selection-toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 20px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n }\n\n .selection-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .selection-count[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n }\n\n .selection-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n }\n\n .btn-toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms ease;\n }\n\n .btn-toolbar[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-text-disabled);\n }\n\n .btn-toolbar.btn-danger[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n }\n\n .btn-toolbar.btn-danger[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-color: var(--mj-status-error);\n }\n\n \n\n .collections-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n }\n\n \n\n .loading-state[_ngcontent-%COMP%], .empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n min-height: 0;\n color: var(--mj-text-disabled);\n text-align: center;\n padding: 24px;\n }\n\n .empty-state[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n font-size: 64px;\n margin-bottom: 24px;\n opacity: 0.3;\n color: var(--mj-border-strong);\n }\n\n .empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n color: var(--mj-text-secondary);\n font-size: 18px;\n font-weight: 600;\n }\n\n .empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 24px 0;\n font-size: 14px;\n color: var(--mj-text-muted);\n }\n\n .empty-state[_ngcontent-%COMP%] .empty-state-cta[_ngcontent-%COMP%] {\n padding: 10px 20px;\n font-size: 14px;\n border-radius: 8px;\n }\n\n .empty-state-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n justify-content: center;\n }\n\n \n\n .unified-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));\n gap: 16px;\n padding: 4px;\n flex-shrink: 0;\n }\n\n .grid-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n padding: 12px;\n background: var(--mj-bg-surface);\n border: 2px solid transparent;\n border-radius: 8px;\n cursor: pointer;\n transition: all 150ms ease;\n position: relative;\n user-select: none;\n }\n\n .grid-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n }\n\n .grid-item.selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n }\n\n .grid-item.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border-color: var(--mj-status-warning);\n box-shadow: 0 0 0 1px var(--mj-status-warning);\n }\n\n .grid-item.active[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-warning) 25%, var(--mj-bg-surface));\n }\n\n \n\n .unified-grid.select-mode[_ngcontent-%COMP%] .grid-item[_ngcontent-%COMP%] {\n cursor: pointer;\n }\n\n .unified-grid.select-mode[_ngcontent-%COMP%] .grid-item[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n }\n\n .item-checkbox[_ngcontent-%COMP%] {\n position: absolute;\n top: 8px;\n right: 8px;\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n z-index: 10;\n }\n\n .item-checkbox[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n color: var(--mj-text-disabled);\n transition: color 150ms ease;\n }\n\n .grid-item.selected[_ngcontent-%COMP%] .item-checkbox[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n .item-checkbox[_ngcontent-%COMP%]:hover i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n }\n\n .grid-item-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n }\n\n .grid-icon[_ngcontent-%COMP%] {\n width: 64px;\n height: 64px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n position: relative;\n }\n\n .grid-icon.folder-icon[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n }\n\n .grid-icon.folder-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 36px;\n color: var(--mj-text-inverse);\n }\n\n .grid-icon.artifact-icon[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n }\n\n .grid-icon.artifact-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n color: var(--mj-text-muted);\n }\n\n .shared-badge[_ngcontent-%COMP%] {\n position: absolute;\n top: -4px;\n right: -4px;\n width: 20px;\n height: 20px;\n background: var(--mj-status-success);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--mj-bg-surface);\n }\n\n .shared-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-inverse);\n }\n\n .grid-info[_ngcontent-%COMP%] {\n width: 100%;\n text-align: center;\n }\n\n .grid-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n line-height: 1.3;\n margin-bottom: 4px;\n \n\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n word-break: break-word;\n }\n\n .grid-description[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n line-height: 1.3;\n margin-bottom: 4px;\n \n\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n word-break: break-word;\n }\n\n .grid-meta[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 4px;\n }\n\n .grid-owner[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n }\n\n .grid-owner[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n margin-right: 3px;\n }\n\n .version-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 2px 6px;\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n border-radius: 3px;\n font-size: 10px;\n font-weight: 600;\n font-family: monospace;\n margin-right: 4px;\n }\n\n .artifact-type-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 2px 6px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 3px;\n font-size: 10px;\n font-weight: 500;\n text-transform: uppercase;\n }\n\n \n\n .unified-list[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n flex-shrink: 0;\n }\n\n .list-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n }\n\n .list-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .list-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n padding: 10px 16px;\n text-align: left;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .list-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%] {\n cursor: pointer;\n user-select: none;\n transition: color 150ms ease;\n }\n\n .list-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n }\n\n .list-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n display: inline-block;\n margin-right: 6px;\n }\n\n .list-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n opacity: 0.5;\n }\n\n .list-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%]:hover i[_ngcontent-%COMP%] {\n opacity: 1;\n }\n\n .list-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] {\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n transition: background 150ms ease;\n cursor: pointer;\n user-select: none;\n }\n\n .list-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n }\n\n .list-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .list-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr.selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n .list-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border-left: 3px solid var(--mj-status-warning);\n }\n\n .list-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr.active[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-warning) 25%, var(--mj-bg-surface));\n }\n\n .list-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 12px 16px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .col-checkbox[_ngcontent-%COMP%] {\n width: 40px;\n text-align: center;\n }\n\n .col-checkbox[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n color: var(--mj-text-disabled);\n cursor: pointer;\n transition: color 150ms ease;\n }\n\n .col-checkbox[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:hover, \n .list-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr.selected[_ngcontent-%COMP%] .col-checkbox[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n }\n\n .col-name[_ngcontent-%COMP%] {\n min-width: 300px;\n }\n\n .list-name-cell[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .list-name-cell[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n color: var(--mj-text-muted);\n width: 20px;\n text-align: center;\n }\n\n .list-name-cell[_ngcontent-%COMP%] .fa-folder[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n }\n\n .shared-indicator[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-status-success);\n margin-left: auto;\n }\n\n .col-type[_ngcontent-%COMP%] {\n width: 150px;\n }\n\n .col-modified[_ngcontent-%COMP%] {\n width: 180px;\n }\n\n .col-owner[_ngcontent-%COMP%] {\n width: 150px;\n }\n\n \n\n .pagination-bar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 16px;\n margin-top: 8px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n flex-shrink: 0;\n }\n\n .pagination-info[_ngcontent-%COMP%] {\n white-space: nowrap;\n }\n\n .pagination-controls[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .pagination-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 150ms ease;\n font-size: 12px;\n }\n\n .pagination-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n }\n\n .pagination-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.35;\n cursor: default;\n }\n\n .pagination-page-info[_ngcontent-%COMP%] {\n padding: 0 8px;\n white-space: nowrap;\n font-weight: 500;\n }\n\n \n\n .toolbar-separator[_ngcontent-%COMP%] {\n width: 1px;\n height: 24px;\n background: var(--mj-border-strong);\n margin: 0 4px;\n }\n\n .toolbar-actions-group[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .btn-icon-danger[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n }\n\n .btn-icon-danger[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n border-color: var(--mj-status-error);\n }\n\n \n\n .context-menu-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 1999;\n }\n\n .context-menu[_ngcontent-%COMP%] {\n position: fixed;\n min-width: 180px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.18);\n padding: 4px;\n z-index: 2000;\n }\n\n .context-menu-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 8px 12px;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 100ms ease;\n }\n\n .context-menu-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .context-menu-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n width: 16px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .context-menu-danger[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n }\n\n .context-menu-danger[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n }\n\n .context-menu-danger[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n }\n\n .context-menu-divider[_ngcontent-%COMP%] {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\n }\n .submenu-arrow[_ngcontent-%COMP%] {\n margin-left: auto;\n font-size: 10px;\n opacity: 0.6;\n }\n .move-target-list[_ngcontent-%COMP%] {\n max-height: 240px;\n overflow-y: auto;\n }\n .context-menu-note[_ngcontent-%COMP%] {\n padding: 8px 14px;\n font-size: 12px;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n \n\n .collections-body[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: row;\n min-height: 0;\n overflow: hidden;\n }\n .collections-navigator[_ngcontent-%COMP%] {\n width: 240px;\n flex-shrink: 0;\n border-right: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n }\n .nav-header[_ngcontent-%COMP%] {\n padding: 12px 14px 8px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n }\n .nav-list[_ngcontent-%COMP%] { display: flex; flex-direction: column; padding: 0 6px 12px; gap: 1px; }\n .nav-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 10px;\n border: 1px solid transparent;\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 13px;\n text-align: left;\n cursor: pointer;\n transition: background 0.12s ease;\n }\n .nav-row[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-hover); color: var(--mj-text-primary); }\n .nav-row.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 600;\n }\n .nav-row.drag-over[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 22%, transparent);\n border-color: var(--mj-brand-primary);\n }\n .nav-row[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 13px; width: 16px; flex-shrink: 0; }\n .nav-row-name[_ngcontent-%COMP%] { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n .nav-toggle.active[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n\n \n\n .grid-item.dragging[_ngcontent-%COMP%], .list-item.dragging[_ngcontent-%COMP%] { opacity: 0.4; }\n .grid-item.drag-over[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary) !important;\n background: color-mix(in srgb, var(--mj-brand-primary) 18%, var(--mj-bg-surface)) !important;\n }\n .list-item.drag-over[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, var(--mj-bg-surface));\n box-shadow: inset 0 0 0 1px var(--mj-brand-primary);\n }\n .breadcrumb-item.drag-over[_ngcontent-%COMP%], .breadcrumb-link.drag-over[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n border-radius: 6px;\n outline: 1px solid var(--mj-brand-primary);\n }\n\n \n\n .item-checkbox[_ngcontent-%COMP%] { opacity: 0; transition: opacity 150ms ease; }\n .grid-item[_ngcontent-%COMP%]:hover .item-checkbox[_ngcontent-%COMP%], \n .grid-item.selected[_ngcontent-%COMP%] .item-checkbox[_ngcontent-%COMP%], \n .unified-grid.select-mode[_ngcontent-%COMP%] .item-checkbox[_ngcontent-%COMP%] { opacity: 1; }\n .list-item[_ngcontent-%COMP%] .col-checkbox[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { opacity: 0; transition: opacity 150ms ease; }\n .list-item[_ngcontent-%COMP%]:hover .col-checkbox[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n .list-item.selected[_ngcontent-%COMP%] .col-checkbox[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n .unified-list.select-mode[_ngcontent-%COMP%] .col-checkbox[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { opacity: 1; }\n .list-item.selected[_ngcontent-%COMP%] .col-checkbox[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n\n \n\n .bulk-move-backdrop[_ngcontent-%COMP%] {\n position: fixed; inset: 0; z-index: 1000;\n }\n .bulk-move-menu[_ngcontent-%COMP%] {\n max-height: 320px;\n overflow-y: auto;\n z-index: 1001;\n }\n .dropdown-note[_ngcontent-%COMP%] { padding: 10px 14px; font-size: 12px; color: var(--mj-text-muted); }\n\n \n\n .staging-shelf[_ngcontent-%COMP%] {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 10px 16px;\n background: var(--mj-bg-surface);\n border-top: 1px solid var(--mj-border-default);\n box-shadow: 0 -2px 8px color-mix(in srgb, var(--mj-text-primary) 6%, transparent);\n }\n .shelf-info[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 8px;\n font-weight: 600; font-size: 13px; color: var(--mj-text-primary);\n flex-shrink: 0;\n }\n .shelf-info[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n .shelf-chips[_ngcontent-%COMP%] {\n flex: 1; min-width: 0;\n display: flex; gap: 6px; overflow-x: auto; padding: 2px 0;\n }\n .shelf-chip[_ngcontent-%COMP%] {\n display: inline-flex; align-items: center; gap: 6px;\n padding: 4px 6px 4px 10px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 999px;\n font-size: 12px; color: var(--mj-text-secondary);\n flex-shrink: 0;\n }\n .shelf-chip-name[_ngcontent-%COMP%] { max-width: 120px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n .shelf-chip-x[_ngcontent-%COMP%] {\n width: 18px; height: 18px; border: 0; background: transparent;\n color: var(--mj-text-muted); cursor: pointer; border-radius: 50%;\n display: flex; align-items: center; justify-content: center; font-size: 10px;\n }\n .shelf-chip-x[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-hover); color: var(--mj-text-primary); }\n .shelf-actions[_ngcontent-%COMP%] { display: flex; gap: 8px; flex-shrink: 0; }\n .btn-toolbar.btn-primary-toolbar[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n }\n .btn-toolbar.btn-primary-toolbar[_ngcontent-%COMP%]:hover:not(:disabled) { background: var(--mj-brand-primary-hover); }\n .btn-toolbar[_ngcontent-%COMP%]:disabled { opacity: 0.5; cursor: not-allowed; }"] });
1965
2707
  }
1966
2708
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CollectionsFullViewComponent, [{
1967
2709
  type: Component,
@@ -1971,7 +2713,15 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
1971
2713
  <div class="collections-header">
1972
2714
  <!-- Breadcrumb navigation -->
1973
2715
  <div class="collections-breadcrumb">
1974
- <div class="breadcrumb-item">
2716
+ <button class="btn-icon nav-toggle" (click)="toggleNavigator()"
2717
+ [class.active]="showNavigator" title="Toggle collections panel">
2718
+ <i class="fas fa-bars"></i>
2719
+ </button>
2720
+ <div class="breadcrumb-item"
2721
+ [class.drag-over]="dragOverTargetId === 'root'"
2722
+ (dragover)="onCrumbDragOver(null, $event)"
2723
+ (dragleave)="onDragLeave('root')"
2724
+ (drop)="onCrumbDrop(null, $event)">
1975
2725
  <i class="fas fa-home"></i>
1976
2726
  <a class="breadcrumb-link" (click)="navigateToRoot()">Collections</a>
1977
2727
  </div>
@@ -1981,6 +2731,10 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
1981
2731
  <i class="fas fa-chevron-right breadcrumb-separator"></i>
1982
2732
  <a class="breadcrumb-link"
1983
2733
  [class.active]="last"
2734
+ [class.drag-over]="dragOverTargetId === 'crumb:' + crumb.id"
2735
+ (dragover)="onCrumbDragOver(crumb.id, $event)"
2736
+ (dragleave)="onDragLeave('crumb:' + crumb.id)"
2737
+ (drop)="onCrumbDrop(crumb.id, $event)"
1984
2738
  (click)="navigateTo(crumb)">
1985
2739
  {{ crumb.name }}
1986
2740
  </a>
@@ -2124,18 +2878,77 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
2124
2878
  <span class="selection-count">{{ selectedItems.size }} selected</span>
2125
2879
  </div>
2126
2880
  <div class="selection-actions">
2881
+ <div class="dropdown-container">
2882
+ <button class="btn-toolbar" (click)="openBulkMove($event)">
2883
+ <i class="fas fa-folder-tree"></i>
2884
+ Move to…
2885
+ </button>
2886
+ @if (showBulkMovePopover) {
2887
+ <div class="bulk-move-backdrop" (click)="closeBulkMove()"></div>
2888
+ <div class="dropdown-menu bulk-move-menu">
2889
+ @if (navigatorNodes.length === 0) {
2890
+ <div class="dropdown-note">No collections available</div>
2891
+ } @else {
2892
+ @for (node of navigatorNodes; track node.collection.ID) {
2893
+ <button class="dropdown-item" [style.paddingLeft.px]="12 + node.depth * 12"
2894
+ (click)="bulkMoveTo(node.collection)">
2895
+ <i class="fas fa-folder" [style.color]="node.collection.Color || null"></i>
2896
+ <span>{{ node.collection.Name }}</span>
2897
+ </button>
2898
+ }
2899
+ }
2900
+ </div>
2901
+ }
2902
+ </div>
2903
+ <button class="btn-toolbar" (click)="stageSelected()" title="Add to the staging shelf to move later">
2904
+ <i class="fas fa-layer-group"></i>
2905
+ Stage
2906
+ </button>
2127
2907
  <button class="btn-toolbar" (click)="clearSelection()">
2128
2908
  <i class="fas fa-times"></i>
2129
- Clear Selection
2909
+ Clear
2130
2910
  </button>
2131
2911
  <button class="btn-toolbar btn-danger" (click)="deleteSelected()">
2132
2912
  <i class="fas fa-trash"></i>
2133
- Delete Selected
2913
+ Delete
2134
2914
  </button>
2135
2915
  </div>
2136
2916
  </div>
2137
2917
  }
2138
2918
 
2919
+ <!-- Body: navigator pane (#6) + content -->
2920
+ <div class="collections-body">
2921
+ @if (showNavigator) {
2922
+ <div class="collections-navigator">
2923
+ <div class="nav-header">Collections</div>
2924
+ <div class="nav-list">
2925
+ <button class="nav-row"
2926
+ [class.active]="!currentCollectionId"
2927
+ [class.drag-over]="dragOverTargetId === 'root'"
2928
+ (click)="navigateToRoot()"
2929
+ (dragover)="onCrumbDragOver(null, $event)"
2930
+ (dragleave)="onDragLeave('root')"
2931
+ (drop)="onCrumbDrop(null, $event)">
2932
+ <i class="fas fa-home"></i>
2933
+ <span>All Collections</span>
2934
+ </button>
2935
+ @for (node of navigatorNodes; track node.collection.ID) {
2936
+ <button class="nav-row"
2937
+ [class.active]="isCurrentNavigator(node.collection)"
2938
+ [class.drag-over]="dragOverTargetId === 'nav:' + node.collection.ID"
2939
+ [style.paddingLeft.px]="10 + node.depth * 14"
2940
+ (click)="navigatorClick(node.collection)"
2941
+ (dragover)="onNavigatorDragOver(node.collection, $event)"
2942
+ (dragleave)="onDragLeave('nav:' + node.collection.ID)"
2943
+ (drop)="onNavigatorDrop(node.collection, $event)"
2944
+ [title]="node.collection.Name">
2945
+ <i class="fas fa-folder" [style.color]="node.collection.Color || null"></i>
2946
+ <span class="nav-row-name">{{ node.collection.Name }}</span>
2947
+ </button>
2948
+ }
2949
+ </div>
2950
+ </div>
2951
+ }
2139
2952
  <!-- Content area -->
2140
2953
  <div class="collections-content">
2141
2954
  <!-- Loading state -->
@@ -2185,17 +2998,23 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
2185
2998
  class="grid-item"
2186
2999
  [class.selected]="item.selected"
2187
3000
  [class.active]="item.type === 'artifact' && IsArtifactActive(item)"
3001
+ [class.dragging]="draggedItemIds.includes(item.id)"
3002
+ [class.drag-over]="dragOverTargetId === item.id"
3003
+ [draggable]="true"
3004
+ (dragstart)="onItemDragStart(item, $event)"
3005
+ (dragend)="onItemDragEnd()"
3006
+ (dragover)="item.type === 'folder' ? onFolderItemDragOver(item, $event) : null"
3007
+ (dragleave)="item.type === 'folder' ? onDragLeave(item.id) : null"
3008
+ (drop)="item.type === 'folder' ? onFolderItemDrop(item, $event) : null"
2188
3009
  (click)="onItemClick(item, $event)"
2189
3010
  (dblclick)="onItemDoubleClick(item, $event)"
2190
3011
  (contextmenu)="onItemContextMenu(item, $event)">
2191
- <!-- Selection checkbox (only visible in select mode) -->
2192
- @if (isSelectMode) {
2193
- <div class="item-checkbox"
2194
- (click)="toggleItemSelection(item, $event)">
2195
- <i class="fas"
2196
- [ngClass]="item.selected ? 'fa-check-circle' : 'fa-circle'"></i>
2197
- </div>
2198
- }
3012
+ <!-- Selection checkbox (hover-reveal no explicit select mode needed) -->
3013
+ <div class="item-checkbox"
3014
+ (click)="onCheckboxClick(item, $event)">
3015
+ <i class="fas"
3016
+ [ngClass]="item.selected ? 'fa-check-circle' : 'fa-circle'"></i>
3017
+ </div>
2199
3018
  <!-- Folder item -->
2200
3019
  @if (item.type === 'folder') {
2201
3020
  <div
@@ -2312,13 +3131,11 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
2312
3131
  <table class="list-table">
2313
3132
  <thead>
2314
3133
  <tr>
2315
- @if (isSelectMode) {
2316
- <th class="col-checkbox">
2317
- <i class="fas"
2318
- [ngClass]="selectedItems.size === unifiedItems.length ? 'fa-check-square' : 'fa-square'"
2319
- (click)="selectedItems.size === unifiedItems.length ? clearSelection() : selectAll()"></i>
2320
- </th>
2321
- }
3134
+ <th class="col-checkbox">
3135
+ <i class="fas"
3136
+ [ngClass]="selectedItems.size === unifiedItems.length && unifiedItems.length > 0 ? 'fa-check-square' : 'fa-square'"
3137
+ (click)="selectedItems.size === unifiedItems.length ? clearSelection() : selectAll()"></i>
3138
+ </th>
2322
3139
  <th class="col-name sortable" (click)="setSortBy('name')">
2323
3140
  <span>Name</span>
2324
3141
  @if (sortBy !== 'name') {
@@ -2358,16 +3175,22 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
2358
3175
  class="list-item"
2359
3176
  [class.selected]="item.selected"
2360
3177
  [class.active]="item.type === 'artifact' && IsArtifactActive(item)"
3178
+ [class.dragging]="draggedItemIds.includes(item.id)"
3179
+ [class.drag-over]="dragOverTargetId === item.id"
3180
+ [draggable]="true"
3181
+ (dragstart)="onItemDragStart(item, $event)"
3182
+ (dragend)="onItemDragEnd()"
3183
+ (dragover)="item.type === 'folder' ? onFolderItemDragOver(item, $event) : null"
3184
+ (dragleave)="item.type === 'folder' ? onDragLeave(item.id) : null"
3185
+ (drop)="item.type === 'folder' ? onFolderItemDrop(item, $event) : null"
2361
3186
  (click)="onItemClick(item, $event)"
2362
3187
  (dblclick)="onItemDoubleClick(item, $event)"
2363
3188
  (contextmenu)="onItemContextMenu(item, $event)">
2364
- @if (isSelectMode) {
2365
- <td class="col-checkbox">
2366
- <i class="fas"
2367
- [ngClass]="item.selected ? 'fa-check-circle' : 'fa-circle'"
2368
- (click)="toggleItemSelection(item, $event)"></i>
2369
- </td>
2370
- }
3189
+ <td class="col-checkbox">
3190
+ <i class="fas"
3191
+ [ngClass]="item.selected ? 'fa-check-circle' : 'fa-circle'"
3192
+ (click)="onCheckboxClick(item, $event)"></i>
3193
+ </td>
2371
3194
  <td class="col-name">
2372
3195
  <div class="list-name-cell">
2373
3196
  <i class="fas"
@@ -2447,6 +3270,38 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
2447
3270
  }
2448
3271
  }
2449
3272
  </div>
3273
+ </div>
3274
+
3275
+ <!-- Staging shelf (#5) — survives navigation; drop staged items into the open collection -->
3276
+ @if (shelf.length > 0) {
3277
+ <div class="staging-shelf">
3278
+ <div class="shelf-info">
3279
+ <i class="fas fa-layer-group"></i>
3280
+ <span>{{ shelf.length }} staged</span>
3281
+ </div>
3282
+ <div class="shelf-chips">
3283
+ @for (entry of shelf; track entry.item.id) {
3284
+ <span class="shelf-chip" [title]="entry.item.name">
3285
+ <i class="fas" [ngClass]="entry.item.type === 'folder' ? 'fa-folder' : entry.item.icon"></i>
3286
+ <span class="shelf-chip-name">{{ entry.item.name }}</span>
3287
+ <button class="shelf-chip-x" (click)="removeFromShelf(entry.item.id)" title="Remove">
3288
+ <i class="fas fa-times"></i>
3289
+ </button>
3290
+ </span>
3291
+ }
3292
+ </div>
3293
+ <div class="shelf-actions">
3294
+ <button class="btn-toolbar btn-primary-toolbar"
3295
+ (click)="dropShelfHere()"
3296
+ [disabled]="!currentCollectionId"
3297
+ [title]="currentCollectionId ? 'Move staged items into this collection' : 'Open a collection to move items here'">
3298
+ <i class="fas fa-arrow-down"></i>
3299
+ Move here
3300
+ </button>
3301
+ <button class="btn-toolbar" (click)="clearShelf()">Clear</button>
3302
+ </div>
3303
+ </div>
3304
+ }
2450
3305
  </div>
2451
3306
 
2452
3307
  <!-- Context Menu -->
@@ -2482,16 +3337,48 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
2482
3337
  }
2483
3338
  }
2484
3339
  @if (contextMenuItem.type === 'artifact') {
2485
- <button class="context-menu-item" (click)="onContextMenuAction('view')">
2486
- <i class="fas fa-eye"></i>
2487
- <span>View</span>
2488
- </button>
2489
- @if (canEditCurrent()) {
3340
+ @if (showMoveSubmenu) {
3341
+ <button class="context-menu-item" (click)="closeMoveSubmenu($event)">
3342
+ <i class="fas fa-chevron-left"></i>
3343
+ <span>Move to Collection</span>
3344
+ </button>
2490
3345
  <div class="context-menu-divider"></div>
2491
- <button class="context-menu-item context-menu-danger" (click)="onContextMenuAction('remove')">
2492
- <i class="fas fa-times-circle"></i>
2493
- <span>Remove from Collection</span>
3346
+ @if (isLoadingMoveTargets) {
3347
+ <div class="context-menu-note"><i class="fas fa-spinner fa-spin"></i> Loading…</div>
3348
+ } @else if (moveTargets.length === 0) {
3349
+ <div class="context-menu-note">No other collections</div>
3350
+ } @else {
3351
+ <div class="move-target-list">
3352
+ @for (t of moveTargets; track t.collection.ID) {
3353
+ <button class="context-menu-item" [style.paddingLeft.px]="14 + t.depth * 12"
3354
+ (click)="moveArtifactToCollection(t.collection)">
3355
+ <i class="fas fa-folder" [style.color]="t.collection.Color || null"></i>
3356
+ <span>{{ t.collection.Name }}</span>
3357
+ </button>
3358
+ }
3359
+ </div>
3360
+ }
3361
+ } @else {
3362
+ <button class="context-menu-item" (click)="onContextMenuAction('view')">
3363
+ <i class="fas fa-eye"></i>
3364
+ <span>View</span>
3365
+ </button>
3366
+ <button class="context-menu-item" (click)="onContextMenuAction('openConversation')">
3367
+ <i class="fas fa-comments"></i>
3368
+ <span>Open source conversation</span>
2494
3369
  </button>
3370
+ @if (canEditCurrent()) {
3371
+ <button class="context-menu-item" (click)="openMoveSubmenu($event)">
3372
+ <i class="fas fa-folder-tree"></i>
3373
+ <span>Move to Collection</span>
3374
+ <i class="fas fa-chevron-right submenu-arrow"></i>
3375
+ </button>
3376
+ <div class="context-menu-divider"></div>
3377
+ <button class="context-menu-item context-menu-danger" (click)="onContextMenuAction('remove')">
3378
+ <i class="fas fa-times-circle"></i>
3379
+ <span>Remove from Collection</span>
3380
+ </button>
3381
+ }
2495
3382
  }
2496
3383
  }
2497
3384
  </div>
@@ -2525,16 +3412,18 @@ export class CollectionsFullViewComponent extends BaseAngularComponent {
2525
3412
  (saved)="onPermissionsChanged()"
2526
3413
  (cancelled)="onShareModalCancelled()">
2527
3414
  </mj-collection-share-modal>
2528
- `, styles: ["\n :host {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n }\n\n /* Main container */\n .collections-view {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface-sunken);\n position: relative;\n }\n\n /* Header */\n .collections-header {\n display: flex;\n align-items: center;\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n gap: 16px;\n background: var(--mj-bg-surface);\n }\n\n .collections-breadcrumb {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: 1;\n min-width: 0;\n }\n\n .breadcrumb-item {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .breadcrumb-item i {\n color: var(--mj-text-muted);\n font-size: 14px;\n }\n\n .breadcrumb-link {\n color: var(--mj-text-primary);\n font-weight: 500;\n cursor: pointer;\n text-decoration: none;\n white-space: nowrap;\n transition: color 150ms ease;\n font-size: 14px;\n }\n\n .breadcrumb-link:hover {\n color: var(--mj-brand-primary);\n }\n\n .breadcrumb-link.active {\n color: var(--mj-text-muted);\n cursor: default;\n }\n\n .breadcrumb-path {\n display: flex;\n align-items: center;\n gap: 6px;\n overflow-x: auto;\n }\n\n .breadcrumb-separator {\n color: var(--mj-border-strong);\n font-size: 10px;\n }\n\n .collections-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n /* Button styles */\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-brand-primary);\n border: none;\n border-radius: 6px;\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 150ms ease;\n }\n\n .btn-primary:hover {\n background: var(--mj-brand-primary-hover);\n }\n\n .btn-primary i.fa-chevron-down {\n font-size: 10px;\n margin-left: 2px;\n }\n\n .btn-icon {\n padding: 6px 10px;\n background: transparent;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: all 150ms ease;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .btn-icon:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n border-color: var(--mj-text-disabled);\n }\n\n .btn-icon.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n }\n\n .btn-icon.active:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n /* Dropdown menus */\n .dropdown-container {\n position: relative;\n }\n\n .dropdown-menu {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n min-width: 200px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n padding: 4px;\n z-index: 1000;\n }\n\n .dropdown-menu-right {\n left: auto;\n right: 0;\n }\n\n .dropdown-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 8px 12px;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 100ms ease;\n }\n\n .dropdown-item:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n }\n\n .dropdown-item:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .dropdown-item.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .dropdown-item i {\n font-size: 14px;\n width: 16px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .dropdown-item.active i {\n color: var(--mj-brand-primary);\n }\n\n .dropdown-divider {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\n }\n\n /* Search */\n .search-container {\n position: relative;\n display: flex;\n align-items: center;\n min-width: 200px;\n }\n\n .search-container i.fa-search {\n position: absolute;\n left: 10px;\n color: var(--mj-text-disabled);\n font-size: 13px;\n pointer-events: none;\n }\n\n .search-input {\n width: 100%;\n padding: 6px 32px 6px 32px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n font-size: 13px;\n outline: none;\n transition: all 150ms ease;\n }\n\n .search-input:focus {\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 .search-clear {\n position: absolute;\n right: 6px;\n padding: 4px;\n background: transparent;\n border: none;\n color: var(--mj-text-disabled);\n cursor: pointer;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .search-clear:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n /* Selection toolbar */\n .selection-toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 20px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n }\n\n .selection-info {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .selection-count {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n }\n\n .selection-actions {\n display: flex;\n gap: 8px;\n }\n\n .btn-toolbar {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms ease;\n }\n\n .btn-toolbar:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-text-disabled);\n }\n\n .btn-toolbar.btn-danger {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n }\n\n .btn-toolbar.btn-danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-color: var(--mj-status-error);\n }\n\n /* Content area */\n .collections-content {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n }\n\n /* Loading and empty states */\n .loading-state, .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n min-height: 0;\n color: var(--mj-text-disabled);\n text-align: center;\n padding: 24px;\n }\n\n .empty-state > i {\n font-size: 64px;\n margin-bottom: 24px;\n opacity: 0.3;\n color: var(--mj-border-strong);\n }\n\n .empty-state h3 {\n margin: 0 0 8px 0;\n color: var(--mj-text-secondary);\n font-size: 18px;\n font-weight: 600;\n }\n\n .empty-state p {\n margin: 0 0 24px 0;\n font-size: 14px;\n color: var(--mj-text-muted);\n }\n\n .empty-state .empty-state-cta {\n padding: 10px 20px;\n font-size: 14px;\n border-radius: 8px;\n }\n\n .empty-state-actions {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n justify-content: center;\n }\n\n /* Grid view */\n .unified-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));\n gap: 16px;\n padding: 4px;\n flex-shrink: 0;\n }\n\n .grid-item {\n display: flex;\n flex-direction: column;\n padding: 12px;\n background: var(--mj-bg-surface);\n border: 2px solid transparent;\n border-radius: 8px;\n cursor: pointer;\n transition: all 150ms ease;\n position: relative;\n user-select: none;\n }\n\n .grid-item:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n }\n\n .grid-item.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n }\n\n .grid-item.active {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border-color: var(--mj-status-warning);\n box-shadow: 0 0 0 1px var(--mj-status-warning);\n }\n\n .grid-item.active:hover {\n background: color-mix(in srgb, var(--mj-status-warning) 25%, var(--mj-bg-surface));\n }\n\n /* Select mode styling for grid */\n .unified-grid.select-mode .grid-item {\n cursor: pointer;\n }\n\n .unified-grid.select-mode .grid-item:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n }\n\n .item-checkbox {\n position: absolute;\n top: 8px;\n right: 8px;\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n z-index: 10;\n }\n\n .item-checkbox i {\n font-size: 16px;\n color: var(--mj-text-disabled);\n transition: color 150ms ease;\n }\n\n .grid-item.selected .item-checkbox i,\n .item-checkbox:hover i {\n color: var(--mj-brand-primary);\n }\n\n .grid-item-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n }\n\n .grid-icon {\n width: 64px;\n height: 64px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n position: relative;\n }\n\n .grid-icon.folder-icon {\n background: var(--mj-brand-primary);\n }\n\n .grid-icon.folder-icon i {\n font-size: 36px;\n color: var(--mj-text-inverse);\n }\n\n .grid-icon.artifact-icon {\n background: var(--mj-bg-surface-sunken);\n }\n\n .grid-icon.artifact-icon i {\n font-size: 32px;\n color: var(--mj-text-muted);\n }\n\n .shared-badge {\n position: absolute;\n top: -4px;\n right: -4px;\n width: 20px;\n height: 20px;\n background: var(--mj-status-success);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--mj-bg-surface);\n }\n\n .shared-badge i {\n font-size: 10px;\n color: var(--mj-text-inverse);\n }\n\n .grid-info {\n width: 100%;\n text-align: center;\n }\n\n .grid-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n line-height: 1.3;\n margin-bottom: 4px;\n /* Allow wrapping to 2 lines max */\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n word-break: break-word;\n }\n\n .grid-description {\n font-size: 11px;\n color: var(--mj-text-muted);\n line-height: 1.3;\n margin-bottom: 4px;\n /* Allow wrapping to 2 lines max */\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n word-break: break-word;\n }\n\n .grid-meta {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 4px;\n }\n\n .grid-owner {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n }\n\n .grid-owner i {\n font-size: 10px;\n margin-right: 3px;\n }\n\n .version-badge {\n display: inline-block;\n padding: 2px 6px;\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n border-radius: 3px;\n font-size: 10px;\n font-weight: 600;\n font-family: monospace;\n margin-right: 4px;\n }\n\n .artifact-type-badge {\n display: inline-block;\n padding: 2px 6px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 3px;\n font-size: 10px;\n font-weight: 500;\n text-transform: uppercase;\n }\n\n /* List view */\n .unified-list {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n flex-shrink: 0;\n }\n\n .list-table {\n width: 100%;\n border-collapse: collapse;\n }\n\n .list-table thead {\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .list-table th {\n padding: 10px 16px;\n text-align: left;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .list-table th.sortable {\n cursor: pointer;\n user-select: none;\n transition: color 150ms ease;\n }\n\n .list-table th.sortable:hover {\n color: var(--mj-brand-primary);\n }\n\n .list-table th.sortable span {\n display: inline-block;\n margin-right: 6px;\n }\n\n .list-table th.sortable i {\n font-size: 10px;\n opacity: 0.5;\n }\n\n .list-table th.sortable:hover i {\n opacity: 1;\n }\n\n .list-table tbody tr {\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n transition: background 150ms ease;\n cursor: pointer;\n user-select: none;\n }\n\n .list-table tbody tr:last-child {\n border-bottom: none;\n }\n\n .list-table tbody tr:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .list-table tbody tr.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n .list-table tbody tr.active {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border-left: 3px solid var(--mj-status-warning);\n }\n\n .list-table tbody tr.active:hover {\n background: color-mix(in srgb, var(--mj-status-warning) 25%, var(--mj-bg-surface));\n }\n\n .list-table td {\n padding: 12px 16px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .col-checkbox {\n width: 40px;\n text-align: center;\n }\n\n .col-checkbox i {\n font-size: 16px;\n color: var(--mj-text-disabled);\n cursor: pointer;\n transition: color 150ms ease;\n }\n\n .col-checkbox i:hover,\n .list-table tbody tr.selected .col-checkbox i {\n color: var(--mj-brand-primary);\n }\n\n .col-name {\n min-width: 300px;\n }\n\n .list-name-cell {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .list-name-cell i {\n font-size: 16px;\n color: var(--mj-text-muted);\n width: 20px;\n text-align: center;\n }\n\n .list-name-cell .fa-folder {\n color: var(--mj-brand-primary);\n }\n\n .shared-indicator {\n font-size: 12px;\n color: var(--mj-status-success);\n margin-left: auto;\n }\n\n .col-type {\n width: 150px;\n }\n\n .col-modified {\n width: 180px;\n }\n\n .col-owner {\n width: 150px;\n }\n\n /* Pagination */\n .pagination-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 16px;\n margin-top: 8px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n flex-shrink: 0;\n }\n\n .pagination-info {\n white-space: nowrap;\n }\n\n .pagination-controls {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .pagination-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 150ms ease;\n font-size: 12px;\n }\n\n .pagination-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n }\n\n .pagination-btn:disabled {\n opacity: 0.35;\n cursor: default;\n }\n\n .pagination-page-info {\n padding: 0 8px;\n white-space: nowrap;\n font-weight: 500;\n }\n\n /* Toolbar separator and action group */\n .toolbar-separator {\n width: 1px;\n height: 24px;\n background: var(--mj-border-strong);\n margin: 0 4px;\n }\n\n .toolbar-actions-group {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .btn-icon-danger {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n }\n\n .btn-icon-danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n border-color: var(--mj-status-error);\n }\n\n /* Context menu */\n .context-menu-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 1999;\n }\n\n .context-menu {\n position: fixed;\n min-width: 180px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.18);\n padding: 4px;\n z-index: 2000;\n }\n\n .context-menu-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 8px 12px;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 100ms ease;\n }\n\n .context-menu-item:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .context-menu-item i {\n font-size: 14px;\n width: 16px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .context-menu-danger {\n color: var(--mj-status-error);\n }\n\n .context-menu-danger i {\n color: var(--mj-status-error);\n }\n\n .context-menu-danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n }\n\n .context-menu-divider {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\n }\n "] }]
3415
+ `, styles: ["\n :host {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n }\n\n /* Main container */\n .collections-view {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface-sunken);\n position: relative;\n }\n\n /* Header */\n .collections-header {\n display: flex;\n align-items: center;\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n gap: 16px;\n background: var(--mj-bg-surface);\n }\n\n .collections-breadcrumb {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: 1;\n min-width: 0;\n }\n\n .breadcrumb-item {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .breadcrumb-item i {\n color: var(--mj-text-muted);\n font-size: 14px;\n }\n\n .breadcrumb-link {\n color: var(--mj-text-primary);\n font-weight: 500;\n cursor: pointer;\n text-decoration: none;\n white-space: nowrap;\n transition: color 150ms ease;\n font-size: 14px;\n }\n\n .breadcrumb-link:hover {\n color: var(--mj-brand-primary);\n }\n\n .breadcrumb-link.active {\n color: var(--mj-text-muted);\n cursor: default;\n }\n\n .breadcrumb-path {\n display: flex;\n align-items: center;\n gap: 6px;\n overflow-x: auto;\n }\n\n .breadcrumb-separator {\n color: var(--mj-border-strong);\n font-size: 10px;\n }\n\n .collections-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n /* Button styles */\n .btn-primary {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-brand-primary);\n border: none;\n border-radius: 6px;\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 150ms ease;\n }\n\n .btn-primary:hover {\n background: var(--mj-brand-primary-hover);\n }\n\n .btn-primary i.fa-chevron-down {\n font-size: 10px;\n margin-left: 2px;\n }\n\n .btn-icon {\n padding: 6px 10px;\n background: transparent;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: all 150ms ease;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .btn-icon:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n border-color: var(--mj-text-disabled);\n }\n\n .btn-icon.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n }\n\n .btn-icon.active:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n /* Dropdown menus */\n .dropdown-container {\n position: relative;\n }\n\n .dropdown-menu {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n min-width: 200px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n padding: 4px;\n z-index: 1000;\n }\n\n .dropdown-menu-right {\n left: auto;\n right: 0;\n }\n\n .dropdown-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 8px 12px;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 100ms ease;\n }\n\n .dropdown-item:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n }\n\n .dropdown-item:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .dropdown-item.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .dropdown-item i {\n font-size: 14px;\n width: 16px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .dropdown-item.active i {\n color: var(--mj-brand-primary);\n }\n\n .dropdown-divider {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\n }\n\n /* Search */\n .search-container {\n position: relative;\n display: flex;\n align-items: center;\n min-width: 200px;\n }\n\n .search-container i.fa-search {\n position: absolute;\n left: 10px;\n color: var(--mj-text-disabled);\n font-size: 13px;\n pointer-events: none;\n }\n\n .search-input {\n width: 100%;\n padding: 6px 32px 6px 32px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n font-size: 13px;\n outline: none;\n transition: all 150ms ease;\n }\n\n .search-input:focus {\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 .search-clear {\n position: absolute;\n right: 6px;\n padding: 4px;\n background: transparent;\n border: none;\n color: var(--mj-text-disabled);\n cursor: pointer;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .search-clear:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n /* Selection toolbar */\n .selection-toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 20px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n }\n\n .selection-info {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .selection-count {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n }\n\n .selection-actions {\n display: flex;\n gap: 8px;\n }\n\n .btn-toolbar {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms ease;\n }\n\n .btn-toolbar:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-text-disabled);\n }\n\n .btn-toolbar.btn-danger {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n }\n\n .btn-toolbar.btn-danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-color: var(--mj-status-error);\n }\n\n /* Content area */\n .collections-content {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n }\n\n /* Loading and empty states */\n .loading-state, .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n min-height: 0;\n color: var(--mj-text-disabled);\n text-align: center;\n padding: 24px;\n }\n\n .empty-state > i {\n font-size: 64px;\n margin-bottom: 24px;\n opacity: 0.3;\n color: var(--mj-border-strong);\n }\n\n .empty-state h3 {\n margin: 0 0 8px 0;\n color: var(--mj-text-secondary);\n font-size: 18px;\n font-weight: 600;\n }\n\n .empty-state p {\n margin: 0 0 24px 0;\n font-size: 14px;\n color: var(--mj-text-muted);\n }\n\n .empty-state .empty-state-cta {\n padding: 10px 20px;\n font-size: 14px;\n border-radius: 8px;\n }\n\n .empty-state-actions {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n justify-content: center;\n }\n\n /* Grid view */\n .unified-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));\n gap: 16px;\n padding: 4px;\n flex-shrink: 0;\n }\n\n .grid-item {\n display: flex;\n flex-direction: column;\n padding: 12px;\n background: var(--mj-bg-surface);\n border: 2px solid transparent;\n border-radius: 8px;\n cursor: pointer;\n transition: all 150ms ease;\n position: relative;\n user-select: none;\n }\n\n .grid-item:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n }\n\n .grid-item.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n }\n\n .grid-item.active {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border-color: var(--mj-status-warning);\n box-shadow: 0 0 0 1px var(--mj-status-warning);\n }\n\n .grid-item.active:hover {\n background: color-mix(in srgb, var(--mj-status-warning) 25%, var(--mj-bg-surface));\n }\n\n /* Select mode styling for grid */\n .unified-grid.select-mode .grid-item {\n cursor: pointer;\n }\n\n .unified-grid.select-mode .grid-item:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n }\n\n .item-checkbox {\n position: absolute;\n top: 8px;\n right: 8px;\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n z-index: 10;\n }\n\n .item-checkbox i {\n font-size: 16px;\n color: var(--mj-text-disabled);\n transition: color 150ms ease;\n }\n\n .grid-item.selected .item-checkbox i,\n .item-checkbox:hover i {\n color: var(--mj-brand-primary);\n }\n\n .grid-item-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n }\n\n .grid-icon {\n width: 64px;\n height: 64px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n position: relative;\n }\n\n .grid-icon.folder-icon {\n background: var(--mj-brand-primary);\n }\n\n .grid-icon.folder-icon i {\n font-size: 36px;\n color: var(--mj-text-inverse);\n }\n\n .grid-icon.artifact-icon {\n background: var(--mj-bg-surface-sunken);\n }\n\n .grid-icon.artifact-icon i {\n font-size: 32px;\n color: var(--mj-text-muted);\n }\n\n .shared-badge {\n position: absolute;\n top: -4px;\n right: -4px;\n width: 20px;\n height: 20px;\n background: var(--mj-status-success);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--mj-bg-surface);\n }\n\n .shared-badge i {\n font-size: 10px;\n color: var(--mj-text-inverse);\n }\n\n .grid-info {\n width: 100%;\n text-align: center;\n }\n\n .grid-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n line-height: 1.3;\n margin-bottom: 4px;\n /* Allow wrapping to 2 lines max */\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n word-break: break-word;\n }\n\n .grid-description {\n font-size: 11px;\n color: var(--mj-text-muted);\n line-height: 1.3;\n margin-bottom: 4px;\n /* Allow wrapping to 2 lines max */\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n word-break: break-word;\n }\n\n .grid-meta {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 4px;\n }\n\n .grid-owner {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n }\n\n .grid-owner i {\n font-size: 10px;\n margin-right: 3px;\n }\n\n .version-badge {\n display: inline-block;\n padding: 2px 6px;\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n border-radius: 3px;\n font-size: 10px;\n font-weight: 600;\n font-family: monospace;\n margin-right: 4px;\n }\n\n .artifact-type-badge {\n display: inline-block;\n padding: 2px 6px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 3px;\n font-size: 10px;\n font-weight: 500;\n text-transform: uppercase;\n }\n\n /* List view */\n .unified-list {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n flex-shrink: 0;\n }\n\n .list-table {\n width: 100%;\n border-collapse: collapse;\n }\n\n .list-table thead {\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .list-table th {\n padding: 10px 16px;\n text-align: left;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .list-table th.sortable {\n cursor: pointer;\n user-select: none;\n transition: color 150ms ease;\n }\n\n .list-table th.sortable:hover {\n color: var(--mj-brand-primary);\n }\n\n .list-table th.sortable span {\n display: inline-block;\n margin-right: 6px;\n }\n\n .list-table th.sortable i {\n font-size: 10px;\n opacity: 0.5;\n }\n\n .list-table th.sortable:hover i {\n opacity: 1;\n }\n\n .list-table tbody tr {\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n transition: background 150ms ease;\n cursor: pointer;\n user-select: none;\n }\n\n .list-table tbody tr:last-child {\n border-bottom: none;\n }\n\n .list-table tbody tr:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .list-table tbody tr.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n }\n\n .list-table tbody tr.active {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border-left: 3px solid var(--mj-status-warning);\n }\n\n .list-table tbody tr.active:hover {\n background: color-mix(in srgb, var(--mj-status-warning) 25%, var(--mj-bg-surface));\n }\n\n .list-table td {\n padding: 12px 16px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n }\n\n .col-checkbox {\n width: 40px;\n text-align: center;\n }\n\n .col-checkbox i {\n font-size: 16px;\n color: var(--mj-text-disabled);\n cursor: pointer;\n transition: color 150ms ease;\n }\n\n .col-checkbox i:hover,\n .list-table tbody tr.selected .col-checkbox i {\n color: var(--mj-brand-primary);\n }\n\n .col-name {\n min-width: 300px;\n }\n\n .list-name-cell {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .list-name-cell i {\n font-size: 16px;\n color: var(--mj-text-muted);\n width: 20px;\n text-align: center;\n }\n\n .list-name-cell .fa-folder {\n color: var(--mj-brand-primary);\n }\n\n .shared-indicator {\n font-size: 12px;\n color: var(--mj-status-success);\n margin-left: auto;\n }\n\n .col-type {\n width: 150px;\n }\n\n .col-modified {\n width: 180px;\n }\n\n .col-owner {\n width: 150px;\n }\n\n /* Pagination */\n .pagination-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 16px;\n margin-top: 8px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n flex-shrink: 0;\n }\n\n .pagination-info {\n white-space: nowrap;\n }\n\n .pagination-controls {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .pagination-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 150ms ease;\n font-size: 12px;\n }\n\n .pagination-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n }\n\n .pagination-btn:disabled {\n opacity: 0.35;\n cursor: default;\n }\n\n .pagination-page-info {\n padding: 0 8px;\n white-space: nowrap;\n font-weight: 500;\n }\n\n /* Toolbar separator and action group */\n .toolbar-separator {\n width: 1px;\n height: 24px;\n background: var(--mj-border-strong);\n margin: 0 4px;\n }\n\n .toolbar-actions-group {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .btn-icon-danger {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n }\n\n .btn-icon-danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n border-color: var(--mj-status-error);\n }\n\n /* Context menu */\n .context-menu-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 1999;\n }\n\n .context-menu {\n position: fixed;\n min-width: 180px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.18);\n padding: 4px;\n z-index: 2000;\n }\n\n .context-menu-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 8px 12px;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 100ms ease;\n }\n\n .context-menu-item:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n .context-menu-item i {\n font-size: 14px;\n width: 16px;\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .context-menu-danger {\n color: var(--mj-status-error);\n }\n\n .context-menu-danger i {\n color: var(--mj-status-error);\n }\n\n .context-menu-danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n }\n\n .context-menu-divider {\n height: 1px;\n background: var(--mj-border-default);\n margin: 4px 0;\n }\n .submenu-arrow {\n margin-left: auto;\n font-size: 10px;\n opacity: 0.6;\n }\n .move-target-list {\n max-height: 240px;\n overflow-y: auto;\n }\n .context-menu-note {\n padding: 8px 14px;\n font-size: 12px;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n /* ===== Body: navigator pane + content (#6) ===== */\n .collections-body {\n flex: 1;\n display: flex;\n flex-direction: row;\n min-height: 0;\n overflow: hidden;\n }\n .collections-navigator {\n width: 240px;\n flex-shrink: 0;\n border-right: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n }\n .nav-header {\n padding: 12px 14px 8px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n }\n .nav-list { display: flex; flex-direction: column; padding: 0 6px 12px; gap: 1px; }\n .nav-row {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 10px;\n border: 1px solid transparent;\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 13px;\n text-align: left;\n cursor: pointer;\n transition: background 0.12s ease;\n }\n .nav-row:hover { background: var(--mj-bg-surface-hover); color: var(--mj-text-primary); }\n .nav-row.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 600;\n }\n .nav-row.drag-over {\n background: color-mix(in srgb, var(--mj-brand-primary) 22%, transparent);\n border-color: var(--mj-brand-primary);\n }\n .nav-row i { font-size: 13px; width: 16px; flex-shrink: 0; }\n .nav-row-name { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n .nav-toggle.active { color: var(--mj-brand-primary); }\n\n /* ===== Drag-and-drop visuals (#1/#2) ===== */\n .grid-item.dragging, .list-item.dragging { opacity: 0.4; }\n .grid-item.drag-over {\n border-color: var(--mj-brand-primary) !important;\n background: color-mix(in srgb, var(--mj-brand-primary) 18%, var(--mj-bg-surface)) !important;\n }\n .list-item.drag-over td {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, var(--mj-bg-surface));\n box-shadow: inset 0 0 0 1px var(--mj-brand-primary);\n }\n .breadcrumb-item.drag-over, .breadcrumb-link.drag-over {\n background: color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n border-radius: 6px;\n outline: 1px solid var(--mj-brand-primary);\n }\n\n /* Hover-reveal checkboxes (frictionless selection #4) */\n .item-checkbox { opacity: 0; transition: opacity 150ms ease; }\n .grid-item:hover .item-checkbox,\n .grid-item.selected .item-checkbox,\n .unified-grid.select-mode .item-checkbox { opacity: 1; }\n .list-item .col-checkbox i { opacity: 0; transition: opacity 150ms ease; }\n .list-item:hover .col-checkbox i,\n .list-item.selected .col-checkbox i,\n .unified-list.select-mode .col-checkbox i { opacity: 1; }\n .list-item.selected .col-checkbox i { color: var(--mj-brand-primary); }\n\n /* ===== Bulk \"Move to\u2026\" popover (#3) ===== */\n .bulk-move-backdrop {\n position: fixed; inset: 0; z-index: 1000;\n }\n .bulk-move-menu {\n max-height: 320px;\n overflow-y: auto;\n z-index: 1001;\n }\n .dropdown-note { padding: 10px 14px; font-size: 12px; color: var(--mj-text-muted); }\n\n /* ===== Staging shelf (#5) ===== */\n .staging-shelf {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 10px 16px;\n background: var(--mj-bg-surface);\n border-top: 1px solid var(--mj-border-default);\n box-shadow: 0 -2px 8px color-mix(in srgb, var(--mj-text-primary) 6%, transparent);\n }\n .shelf-info {\n display: flex; align-items: center; gap: 8px;\n font-weight: 600; font-size: 13px; color: var(--mj-text-primary);\n flex-shrink: 0;\n }\n .shelf-info i { color: var(--mj-brand-primary); }\n .shelf-chips {\n flex: 1; min-width: 0;\n display: flex; gap: 6px; overflow-x: auto; padding: 2px 0;\n }\n .shelf-chip {\n display: inline-flex; align-items: center; gap: 6px;\n padding: 4px 6px 4px 10px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 999px;\n font-size: 12px; color: var(--mj-text-secondary);\n flex-shrink: 0;\n }\n .shelf-chip-name { max-width: 120px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n .shelf-chip-x {\n width: 18px; height: 18px; border: 0; background: transparent;\n color: var(--mj-text-muted); cursor: pointer; border-radius: 50%;\n display: flex; align-items: center; justify-content: center; font-size: 10px;\n }\n .shelf-chip-x:hover { background: var(--mj-bg-surface-hover); color: var(--mj-text-primary); }\n .shelf-actions { display: flex; gap: 8px; flex-shrink: 0; }\n .btn-toolbar.btn-primary-toolbar {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n }\n .btn-toolbar.btn-primary-toolbar:hover:not(:disabled) { background: var(--mj-brand-primary-hover); }\n .btn-toolbar:disabled { opacity: 0.5; cursor: not-allowed; }\n "] }]
2529
3416
  }], () => [{ type: i1.DialogService }, { type: i2.ArtifactStateService }, { type: i3.CollectionStateService }, { type: i4.CollectionPermissionService }, { type: i5.ArtifactIconService }, { type: i0.ChangeDetectorRef }], { environmentId: [{
2530
3417
  type: Input
2531
3418
  }], currentUser: [{
2532
3419
  type: Input
2533
3420
  }], collectionNavigated: [{
2534
3421
  type: Output
3422
+ }], openConversationRequested: [{
3423
+ type: Output
2535
3424
  }], onEscapeKey: [{
2536
3425
  type: HostListener,
2537
3426
  args: ['document:keydown.escape']
2538
3427
  }] }); })();
2539
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CollectionsFullViewComponent, { className: "CollectionsFullViewComponent", filePath: "src/lib/components/collection/collections-full-view.component.ts", lineNumber: 1445 }); })();
3428
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CollectionsFullViewComponent, { className: "CollectionsFullViewComponent", filePath: "src/lib/components/collection/collections-full-view.component.ts", lineNumber: 1746 }); })();
2540
3429
  //# sourceMappingURL=collections-full-view.component.js.map