@memberjunction/ng-conversations 6.1.4 → 6.2.0-edge.1

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 (424) hide show
  1. package/README.md +36 -3
  2. package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts +19 -3
  3. package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts.map +1 -1
  4. package/dist/lib/components/active-tasks/active-tasks-panel.component.js +39 -7
  5. package/dist/lib/components/active-tasks/active-tasks-panel.component.js.map +1 -1
  6. package/dist/lib/components/agent/active-agent-indicator.component.d.ts +74 -6
  7. package/dist/lib/components/agent/active-agent-indicator.component.d.ts.map +1 -1
  8. package/dist/lib/components/agent/active-agent-indicator.component.js +111 -21
  9. package/dist/lib/components/agent/active-agent-indicator.component.js.map +1 -1
  10. package/dist/lib/components/agent/agent-process-panel.component.d.ts +31 -5
  11. package/dist/lib/components/agent/agent-process-panel.component.d.ts.map +1 -1
  12. package/dist/lib/components/agent/agent-process-panel.component.js +71 -15
  13. package/dist/lib/components/agent/agent-process-panel.component.js.map +1 -1
  14. package/dist/lib/components/artifact/artifact-share-modal.component.d.ts +65 -9
  15. package/dist/lib/components/artifact/artifact-share-modal.component.d.ts.map +1 -1
  16. package/dist/lib/components/artifact/artifact-share-modal.component.js +169 -57
  17. package/dist/lib/components/artifact/artifact-share-modal.component.js.map +1 -1
  18. package/dist/lib/components/attachment/image-viewer.component.d.ts +77 -11
  19. package/dist/lib/components/attachment/image-viewer.component.d.ts.map +1 -1
  20. package/dist/lib/components/attachment/image-viewer.component.js +181 -47
  21. package/dist/lib/components/attachment/image-viewer.component.js.map +1 -1
  22. package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts +129 -19
  23. package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts.map +1 -1
  24. package/dist/lib/components/collection/artifact-collection-picker-modal.component.js +350 -116
  25. package/dist/lib/components/collection/artifact-collection-picker-modal.component.js.map +1 -1
  26. package/dist/lib/components/collection/artifact-create-modal.component.d.ts +60 -8
  27. package/dist/lib/components/collection/artifact-create-modal.component.d.ts.map +1 -1
  28. package/dist/lib/components/collection/artifact-create-modal.component.js +130 -46
  29. package/dist/lib/components/collection/artifact-create-modal.component.js.map +1 -1
  30. package/dist/lib/components/collection/collection-artifact-card.component.d.ts +63 -3
  31. package/dist/lib/components/collection/collection-artifact-card.component.d.ts.map +1 -1
  32. package/dist/lib/components/collection/collection-artifact-card.component.js +113 -19
  33. package/dist/lib/components/collection/collection-artifact-card.component.js.map +1 -1
  34. package/dist/lib/components/collection/collection-form-modal.component.d.ts +54 -8
  35. package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -1
  36. package/dist/lib/components/collection/collection-form-modal.component.js +130 -46
  37. package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -1
  38. package/dist/lib/components/collection/collection-share-modal.component.d.ts +70 -10
  39. package/dist/lib/components/collection/collection-share-modal.component.d.ts.map +1 -1
  40. package/dist/lib/components/collection/collection-share-modal.component.js +175 -53
  41. package/dist/lib/components/collection/collection-share-modal.component.js.map +1 -1
  42. package/dist/lib/components/collection/collection-tree.component.d.ts +89 -9
  43. package/dist/lib/components/collection/collection-tree.component.d.ts.map +1 -1
  44. package/dist/lib/components/collection/collection-tree.component.js +220 -70
  45. package/dist/lib/components/collection/collection-tree.component.js.map +1 -1
  46. package/dist/lib/components/collection/collection-view.component.d.ts +89 -11
  47. package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
  48. package/dist/lib/components/collection/collection-view.component.js +154 -40
  49. package/dist/lib/components/collection/collection-view.component.js.map +1 -1
  50. package/dist/lib/components/collection/collections-full-view.component.d.ts +390 -38
  51. package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
  52. package/dist/lib/components/collection/collections-full-view.component.js +951 -367
  53. package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
  54. package/dist/lib/components/composer/ai-composer.component.d.ts +213 -18
  55. package/dist/lib/components/composer/ai-composer.component.d.ts.map +1 -1
  56. package/dist/lib/components/composer/ai-composer.component.js +388 -44
  57. package/dist/lib/components/composer/ai-composer.component.js.map +1 -1
  58. package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts +12 -1
  59. package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts.map +1 -1
  60. package/dist/lib/components/conversation/conversation-agent-picker.component.js +26 -4
  61. package/dist/lib/components/conversation/conversation-agent-picker.component.js.map +1 -1
  62. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +1090 -123
  63. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  64. package/dist/lib/components/conversation/conversation-chat-area.component.js +2407 -731
  65. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  66. package/dist/lib/components/conversation/conversation-empty-state.component.d.ts +139 -19
  67. package/dist/lib/components/conversation/conversation-empty-state.component.d.ts.map +1 -1
  68. package/dist/lib/components/conversation/conversation-empty-state.component.js +296 -59
  69. package/dist/lib/components/conversation/conversation-empty-state.component.js.map +1 -1
  70. package/dist/lib/components/conversation/conversation-list.component.d.ts +579 -78
  71. package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
  72. package/dist/lib/components/conversation/conversation-list.component.js +2322 -823
  73. package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
  74. package/dist/lib/components/conversation/pinned-messages-panel.component.d.ts +40 -4
  75. package/dist/lib/components/conversation/pinned-messages-panel.component.d.ts.map +1 -1
  76. package/dist/lib/components/conversation/pinned-messages-panel.component.js +72 -14
  77. package/dist/lib/components/conversation/pinned-messages-panel.component.js.map +1 -1
  78. package/dist/lib/components/dialogs/input-dialog.component.d.ts +57 -11
  79. package/dist/lib/components/dialogs/input-dialog.component.d.ts.map +1 -1
  80. package/dist/lib/components/dialogs/input-dialog.component.js +128 -16
  81. package/dist/lib/components/dialogs/input-dialog.component.js.map +1 -1
  82. package/dist/lib/components/dialogs/rating-dialog.component.d.ts +68 -10
  83. package/dist/lib/components/dialogs/rating-dialog.component.d.ts.map +1 -1
  84. package/dist/lib/components/dialogs/rating-dialog.component.js +151 -27
  85. package/dist/lib/components/dialogs/rating-dialog.component.js.map +1 -1
  86. package/dist/lib/components/export/export-modal.component.d.ts +84 -10
  87. package/dist/lib/components/export/export-modal.component.d.ts.map +1 -1
  88. package/dist/lib/components/export/export-modal.component.js +173 -49
  89. package/dist/lib/components/export/export-modal.component.js.map +1 -1
  90. package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts +29 -3
  91. package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts.map +1 -1
  92. package/dist/lib/components/global-tasks/global-tasks-panel.component.js +58 -12
  93. package/dist/lib/components/global-tasks/global-tasks-panel.component.js.map +1 -1
  94. package/dist/lib/components/library/library-full-view.component.d.ts +57 -8
  95. package/dist/lib/components/library/library-full-view.component.d.ts.map +1 -1
  96. package/dist/lib/components/library/library-full-view.component.js +119 -35
  97. package/dist/lib/components/library/library-full-view.component.js.map +1 -1
  98. package/dist/lib/components/members/members-modal.component.d.ts +76 -10
  99. package/dist/lib/components/members/members-modal.component.d.ts.map +1 -1
  100. package/dist/lib/components/members/members-modal.component.js +164 -50
  101. package/dist/lib/components/members/members-modal.component.js.map +1 -1
  102. package/dist/lib/components/message/actionable-commands.component.d.ts +37 -5
  103. package/dist/lib/components/message/actionable-commands.component.d.ts.map +1 -1
  104. package/dist/lib/components/message/actionable-commands.component.js +82 -16
  105. package/dist/lib/components/message/actionable-commands.component.js.map +1 -1
  106. package/dist/lib/components/message/conversation-message-rating.component.d.ts +46 -10
  107. package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -1
  108. package/dist/lib/components/message/conversation-message-rating.component.js +120 -36
  109. package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -1
  110. package/dist/lib/components/message/message-input.component.d.ts +549 -74
  111. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  112. package/dist/lib/components/message/message-input.component.js +1250 -421
  113. package/dist/lib/components/message/message-input.component.js.map +1 -1
  114. package/dist/lib/components/message/message-item.component.d.ts +411 -29
  115. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  116. package/dist/lib/components/message/message-item.component.js +896 -222
  117. package/dist/lib/components/message/message-item.component.js.map +1 -1
  118. package/dist/lib/components/message/message-list.component.d.ts +288 -29
  119. package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
  120. package/dist/lib/components/message/message-list.component.js +561 -123
  121. package/dist/lib/components/message/message-list.component.js.map +1 -1
  122. package/dist/lib/components/navigation/conversation-navigation.component.d.ts +64 -5
  123. package/dist/lib/components/navigation/conversation-navigation.component.d.ts.map +1 -1
  124. package/dist/lib/components/navigation/conversation-navigation.component.js +101 -11
  125. package/dist/lib/components/navigation/conversation-navigation.component.js.map +1 -1
  126. package/dist/lib/components/notification/activity-indicator.component.d.ts +6 -2
  127. package/dist/lib/components/notification/activity-indicator.component.d.ts.map +1 -1
  128. package/dist/lib/components/notification/activity-indicator.component.js +13 -3
  129. package/dist/lib/components/notification/activity-indicator.component.js.map +1 -1
  130. package/dist/lib/components/notification/notification-badge.component.d.ts +15 -3
  131. package/dist/lib/components/notification/notification-badge.component.d.ts.map +1 -1
  132. package/dist/lib/components/notification/notification-badge.component.js +36 -8
  133. package/dist/lib/components/notification/notification-badge.component.js.map +1 -1
  134. package/dist/lib/components/overlay/chat-overlay.component.d.ts +1 -1
  135. package/dist/lib/components/overlay/chat-overlay.component.js +4 -4
  136. package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
  137. package/dist/lib/components/project/project-form-modal.component.d.ts +93 -11
  138. package/dist/lib/components/project/project-form-modal.component.d.ts.map +1 -1
  139. package/dist/lib/components/project/project-form-modal.component.js +348 -87
  140. package/dist/lib/components/project/project-form-modal.component.js.map +1 -1
  141. package/dist/lib/components/project/project-selector.component.d.ts +78 -8
  142. package/dist/lib/components/project/project-selector.component.d.ts.map +1 -1
  143. package/dist/lib/components/project/project-selector.component.js +177 -46
  144. package/dist/lib/components/project/project-selector.component.js.map +1 -1
  145. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.d.ts +1 -1
  146. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.d.ts.map +1 -1
  147. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.js.map +1 -1
  148. package/dist/lib/components/realtime/channels/client-context-channel.d.ts +1 -1
  149. package/dist/lib/components/realtime/channels/client-context-channel.d.ts.map +1 -1
  150. package/dist/lib/components/realtime/channels/client-context-channel.js +1 -1
  151. package/dist/lib/components/realtime/channels/client-context-channel.js.map +1 -1
  152. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts +1 -1
  153. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts.map +1 -1
  154. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js +3 -0
  155. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js.map +1 -1
  156. package/dist/lib/components/realtime/media/media-channel.d.ts +2 -1
  157. package/dist/lib/components/realtime/media/media-channel.d.ts.map +1 -1
  158. package/dist/lib/components/realtime/media/media-channel.js +1 -1
  159. package/dist/lib/components/realtime/media/media-channel.js.map +1 -1
  160. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts +2 -2
  161. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts.map +1 -1
  162. package/dist/lib/components/realtime/realtime-activity-rail.component.js +2 -2
  163. package/dist/lib/components/realtime/realtime-activity-rail.component.js.map +1 -1
  164. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts +1 -1
  165. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts.map +1 -1
  166. package/dist/lib/components/realtime/realtime-agent-banner.component.js.map +1 -1
  167. package/dist/lib/components/realtime/realtime-composer.component.d.ts +3 -1
  168. package/dist/lib/components/realtime/realtime-composer.component.d.ts.map +1 -1
  169. package/dist/lib/components/realtime/realtime-composer.component.js +26 -8
  170. package/dist/lib/components/realtime/realtime-composer.component.js.map +1 -1
  171. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts +2 -2
  172. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts.map +1 -1
  173. package/dist/lib/components/realtime/realtime-delegation-card.component.js +2 -2
  174. package/dist/lib/components/realtime/realtime-delegation-card.component.js.map +1 -1
  175. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +4 -4
  176. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts.map +1 -1
  177. package/dist/lib/components/realtime/realtime-session-overlay.component.js +19 -19
  178. package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
  179. package/dist/lib/components/realtime/realtime-session-state.d.ts +2 -3
  180. package/dist/lib/components/realtime/realtime-session-state.d.ts.map +1 -1
  181. package/dist/lib/components/realtime/realtime-session-state.js +3 -2
  182. package/dist/lib/components/realtime/realtime-session-state.js.map +1 -1
  183. package/dist/lib/components/realtime/realtime-session-thread.component.d.ts +17 -1
  184. package/dist/lib/components/realtime/realtime-session-thread.component.d.ts.map +1 -1
  185. package/dist/lib/components/realtime/realtime-session-thread.component.js +122 -45
  186. package/dist/lib/components/realtime/realtime-session-thread.component.js.map +1 -1
  187. package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts +47 -31
  188. package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts.map +1 -1
  189. package/dist/lib/components/realtime/realtime-session-timeline-card.component.js +138 -124
  190. package/dist/lib/components/realtime/realtime-session-timeline-card.component.js.map +1 -1
  191. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +4 -4
  192. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts.map +1 -1
  193. package/dist/lib/components/realtime/realtime-surface-tabs.component.js +4 -4
  194. package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -1
  195. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +2 -2
  196. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts.map +1 -1
  197. package/dist/lib/components/realtime/realtime-surface-tabs.model.js +3 -3
  198. package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -1
  199. package/dist/lib/components/realtime/realtime-ui-config.d.ts +13 -11
  200. package/dist/lib/components/realtime/realtime-ui-config.d.ts.map +1 -1
  201. package/dist/lib/components/realtime/realtime-ui-config.js +29 -25
  202. package/dist/lib/components/realtime/realtime-ui-config.js.map +1 -1
  203. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts +1 -1
  204. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts.map +1 -1
  205. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js +1 -1
  206. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js.map +1 -1
  207. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts +4 -2
  208. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts.map +1 -1
  209. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js +7 -3
  210. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js.map +1 -1
  211. package/dist/lib/components/search/search-panel.component.d.ts +133 -22
  212. package/dist/lib/components/search/search-panel.component.d.ts.map +1 -1
  213. package/dist/lib/components/search/search-panel.component.js +312 -83
  214. package/dist/lib/components/search/search-panel.component.js.map +1 -1
  215. package/dist/lib/components/share/share-modal.component.d.ts +69 -9
  216. package/dist/lib/components/share/share-modal.component.d.ts.map +1 -1
  217. package/dist/lib/components/share/share-modal.component.js +139 -31
  218. package/dist/lib/components/share/share-modal.component.js.map +1 -1
  219. package/dist/lib/components/shared/user-picker.component.d.ts +48 -8
  220. package/dist/lib/components/shared/user-picker.component.d.ts.map +1 -1
  221. package/dist/lib/components/shared/user-picker.component.js +110 -30
  222. package/dist/lib/components/shared/user-picker.component.js.map +1 -1
  223. package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts +114 -11
  224. package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts.map +1 -1
  225. package/dist/lib/components/sidebar/conversation-sidebar.component.js +199 -21
  226. package/dist/lib/components/sidebar/conversation-sidebar.component.js.map +1 -1
  227. package/dist/lib/components/sidebar/routines-section.component.d.ts +20 -1
  228. package/dist/lib/components/sidebar/routines-section.component.d.ts.map +1 -1
  229. package/dist/lib/components/sidebar/routines-section.component.js +25 -5
  230. package/dist/lib/components/sidebar/routines-section.component.js.map +1 -1
  231. package/dist/lib/components/slots/slot-interfaces.d.ts +19 -0
  232. package/dist/lib/components/slots/slot-interfaces.d.ts.map +1 -1
  233. package/dist/lib/components/slots/slot-interfaces.js.map +1 -1
  234. package/dist/lib/components/task/tasks-full-view.component.d.ts +95 -13
  235. package/dist/lib/components/task/tasks-full-view.component.d.ts.map +1 -1
  236. package/dist/lib/components/task/tasks-full-view.component.js +223 -75
  237. package/dist/lib/components/task/tasks-full-view.component.js.map +1 -1
  238. package/dist/lib/components/tasks/task-widget.component.d.ts +46 -6
  239. package/dist/lib/components/tasks/task-widget.component.d.ts.map +1 -1
  240. package/dist/lib/components/tasks/task-widget.component.js +100 -16
  241. package/dist/lib/components/tasks/task-widget.component.js.map +1 -1
  242. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts +64 -7
  243. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -1
  244. package/dist/lib/components/tasks/tasks-dropdown.component.js +127 -27
  245. package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
  246. package/dist/lib/components/thread/thread-panel.component.d.ts +66 -8
  247. package/dist/lib/components/thread/thread-panel.component.d.ts.map +1 -1
  248. package/dist/lib/components/thread/thread-panel.component.js +146 -36
  249. package/dist/lib/components/thread/thread-panel.component.js.map +1 -1
  250. package/dist/lib/components/toast/toast.component.d.ts +11 -1
  251. package/dist/lib/components/toast/toast.component.d.ts.map +1 -1
  252. package/dist/lib/components/toast/toast.component.js +25 -5
  253. package/dist/lib/components/toast/toast.component.js.map +1 -1
  254. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +385 -42
  255. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  256. package/dist/lib/components/workspace/conversation-workspace.component.js +887 -291
  257. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  258. package/dist/lib/composer-plugins/base-conversation-mention.provider.d.ts +8 -0
  259. package/dist/lib/composer-plugins/base-conversation-mention.provider.d.ts.map +1 -1
  260. package/dist/lib/composer-plugins/base-conversation-mention.provider.js +8 -1
  261. package/dist/lib/composer-plugins/base-conversation-mention.provider.js.map +1 -1
  262. package/dist/lib/conversations.module.d.ts.map +1 -1
  263. package/dist/lib/conversations.module.js.map +1 -1
  264. package/dist/lib/directives/chat-slot.directive.d.ts +5 -1
  265. package/dist/lib/directives/chat-slot.directive.d.ts.map +1 -1
  266. package/dist/lib/directives/chat-slot.directive.js.map +1 -1
  267. package/dist/lib/directives/search-shortcut.directive.d.ts +9 -1
  268. package/dist/lib/directives/search-shortcut.directive.d.ts.map +1 -1
  269. package/dist/lib/directives/search-shortcut.directive.js +14 -4
  270. package/dist/lib/directives/search-shortcut.directive.js.map +1 -1
  271. package/dist/lib/events/chat-events.d.ts +34 -7
  272. package/dist/lib/events/chat-events.d.ts.map +1 -1
  273. package/dist/lib/events/chat-events.js +37 -7
  274. package/dist/lib/events/chat-events.js.map +1 -1
  275. package/dist/lib/models/agent-turn.model.d.ts +103 -0
  276. package/dist/lib/models/agent-turn.model.d.ts.map +1 -0
  277. package/dist/lib/models/agent-turn.model.js +12 -0
  278. package/dist/lib/models/agent-turn.model.js.map +1 -0
  279. package/dist/lib/models/collection-view.model.js.map +1 -1
  280. package/dist/lib/models/conversation-state.model.d.ts +8 -0
  281. package/dist/lib/models/conversation-state.model.d.ts.map +1 -1
  282. package/dist/lib/models/conversation-state.model.js.map +1 -1
  283. package/dist/lib/models/lazy-artifact-info.d.ts +44 -12
  284. package/dist/lib/models/lazy-artifact-info.d.ts.map +1 -1
  285. package/dist/lib/models/lazy-artifact-info.js +98 -34
  286. package/dist/lib/models/lazy-artifact-info.js.map +1 -1
  287. package/dist/lib/services/active-tasks.service.d.ts +30 -4
  288. package/dist/lib/services/active-tasks.service.d.ts.map +1 -1
  289. package/dist/lib/services/active-tasks.service.js +71 -19
  290. package/dist/lib/services/active-tasks.service.js.map +1 -1
  291. package/dist/lib/services/agent-state.service.d.ts +17 -1
  292. package/dist/lib/services/agent-state.service.d.ts.map +1 -1
  293. package/dist/lib/services/agent-state.service.js +48 -16
  294. package/dist/lib/services/agent-state.service.js.map +1 -1
  295. package/dist/lib/services/artifact-permission.service.d.ts +39 -0
  296. package/dist/lib/services/artifact-permission.service.d.ts.map +1 -1
  297. package/dist/lib/services/artifact-permission.service.js +152 -17
  298. package/dist/lib/services/artifact-permission.service.js.map +1 -1
  299. package/dist/lib/services/artifact-state.service.d.ts +58 -5
  300. package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
  301. package/dist/lib/services/artifact-state.service.js +135 -35
  302. package/dist/lib/services/artifact-state.service.js.map +1 -1
  303. package/dist/lib/services/browser-realtime-media-host.d.ts +24 -0
  304. package/dist/lib/services/browser-realtime-media-host.d.ts.map +1 -0
  305. package/dist/lib/services/browser-realtime-media-host.js +95 -0
  306. package/dist/lib/services/browser-realtime-media-host.js.map +1 -0
  307. package/dist/lib/services/collection-permission.service.d.ts +28 -0
  308. package/dist/lib/services/collection-permission.service.d.ts.map +1 -1
  309. package/dist/lib/services/collection-permission.service.js +88 -32
  310. package/dist/lib/services/collection-permission.service.js.map +1 -1
  311. package/dist/lib/services/collection-state.service.d.ts +11 -1
  312. package/dist/lib/services/collection-state.service.d.ts.map +1 -1
  313. package/dist/lib/services/collection-state.service.js +25 -5
  314. package/dist/lib/services/collection-state.service.js.map +1 -1
  315. package/dist/lib/services/conversation-agent.service.d.ts +26 -4
  316. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  317. package/dist/lib/services/conversation-agent.service.js +57 -18
  318. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  319. package/dist/lib/services/conversation-attachment.service.d.ts +41 -2
  320. package/dist/lib/services/conversation-attachment.service.d.ts.map +1 -1
  321. package/dist/lib/services/conversation-attachment.service.js +80 -13
  322. package/dist/lib/services/conversation-attachment.service.js.map +1 -1
  323. package/dist/lib/services/conversation-streaming.service.d.ts +22 -0
  324. package/dist/lib/services/conversation-streaming.service.d.ts.map +1 -1
  325. package/dist/lib/services/conversation-streaming.service.js +50 -10
  326. package/dist/lib/services/conversation-streaming.service.js.map +1 -1
  327. package/dist/lib/services/data-cache.service.d.ts +31 -0
  328. package/dist/lib/services/data-cache.service.d.ts.map +1 -1
  329. package/dist/lib/services/data-cache.service.js +71 -15
  330. package/dist/lib/services/data-cache.service.js.map +1 -1
  331. package/dist/lib/services/dialog.service.d.ts +13 -0
  332. package/dist/lib/services/dialog.service.d.ts.map +1 -1
  333. package/dist/lib/services/dialog.service.js +25 -5
  334. package/dist/lib/services/dialog.service.js.map +1 -1
  335. package/dist/lib/services/export.service.d.ts +2 -0
  336. package/dist/lib/services/export.service.d.ts.map +1 -1
  337. package/dist/lib/services/export.service.js +5 -1
  338. package/dist/lib/services/export.service.js.map +1 -1
  339. package/dist/lib/services/graphql-attachment-blob-store.d.ts +44 -0
  340. package/dist/lib/services/graphql-attachment-blob-store.d.ts.map +1 -0
  341. package/dist/lib/services/graphql-attachment-blob-store.js +113 -0
  342. package/dist/lib/services/graphql-attachment-blob-store.js.map +1 -0
  343. package/dist/lib/services/mention-autocomplete.service.d.ts +17 -141
  344. package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -1
  345. package/dist/lib/services/mention-autocomplete.service.js +15 -460
  346. package/dist/lib/services/mention-autocomplete.service.js.map +1 -1
  347. package/dist/lib/services/mention-parser.service.d.ts +10 -0
  348. package/dist/lib/services/mention-parser.service.d.ts.map +1 -1
  349. package/dist/lib/services/mention-parser.service.js +25 -5
  350. package/dist/lib/services/mention-parser.service.js.map +1 -1
  351. package/dist/lib/services/notification.service.d.ts +54 -6
  352. package/dist/lib/services/notification.service.d.ts.map +1 -1
  353. package/dist/lib/services/notification.service.js +123 -27
  354. package/dist/lib/services/notification.service.js.map +1 -1
  355. package/dist/lib/services/realtime-audio-recorder.d.ts +4 -4
  356. package/dist/lib/services/realtime-audio-recorder.js +12 -12
  357. package/dist/lib/services/realtime-audio-recorder.js.map +1 -1
  358. package/dist/lib/services/realtime-pcm-wav.d.ts +4 -0
  359. package/dist/lib/services/realtime-pcm-wav.d.ts.map +1 -1
  360. package/dist/lib/services/realtime-pcm-wav.js +10 -2
  361. package/dist/lib/services/realtime-pcm-wav.js.map +1 -1
  362. package/dist/lib/services/realtime-session-review.service.d.ts +1 -1
  363. package/dist/lib/services/realtime-session-review.service.d.ts.map +1 -1
  364. package/dist/lib/services/realtime-session-review.service.js +1 -1
  365. package/dist/lib/services/realtime-session-review.service.js.map +1 -1
  366. package/dist/lib/services/realtime-session.service.d.ts +16 -1150
  367. package/dist/lib/services/realtime-session.service.d.ts.map +1 -1
  368. package/dist/lib/services/realtime-session.service.js +28 -2430
  369. package/dist/lib/services/realtime-session.service.js.map +1 -1
  370. package/dist/lib/services/search.service.d.ts +42 -9
  371. package/dist/lib/services/search.service.d.ts.map +1 -1
  372. package/dist/lib/services/search.service.js +103 -23
  373. package/dist/lib/services/search.service.js.map +1 -1
  374. package/dist/lib/services/toast.service.d.ts +19 -1
  375. package/dist/lib/services/toast.service.d.ts.map +1 -1
  376. package/dist/lib/services/toast.service.js +45 -9
  377. package/dist/lib/services/toast.service.js.map +1 -1
  378. package/dist/lib/services/ui-command-handler.service.d.ts +16 -2
  379. package/dist/lib/services/ui-command-handler.service.d.ts.map +1 -1
  380. package/dist/lib/services/ui-command-handler.service.js +36 -8
  381. package/dist/lib/services/ui-command-handler.service.js.map +1 -1
  382. package/dist/lib/utils/agent-artifact-summary.d.ts +2 -2
  383. package/dist/lib/utils/agent-artifact-summary.js +3 -3
  384. package/dist/lib/utils/agent-artifact-summary.js.map +1 -1
  385. package/dist/lib/utils/agent-turn-routing.d.ts +69 -0
  386. package/dist/lib/utils/agent-turn-routing.d.ts.map +1 -0
  387. package/dist/lib/utils/agent-turn-routing.js +96 -0
  388. package/dist/lib/utils/agent-turn-routing.js.map +1 -0
  389. package/dist/lib/utils/artifact-panel-action.d.ts +15 -4
  390. package/dist/lib/utils/artifact-panel-action.d.ts.map +1 -1
  391. package/dist/lib/utils/artifact-panel-action.js +10 -2
  392. package/dist/lib/utils/artifact-panel-action.js.map +1 -1
  393. package/dist/lib/utils/distinct-artifacts.d.ts +2 -0
  394. package/dist/lib/utils/distinct-artifacts.d.ts.map +1 -1
  395. package/dist/lib/utils/distinct-artifacts.js +5 -1
  396. package/dist/lib/utils/distinct-artifacts.js.map +1 -1
  397. package/dist/lib/utils/plan-mode-preference.d.ts +2 -2
  398. package/dist/lib/utils/plan-mode-preference.js +6 -6
  399. package/dist/lib/utils/plan-mode-preference.js.map +1 -1
  400. package/dist/lib/utils/realtime-session-timeline.d.ts +8 -79
  401. package/dist/lib/utils/realtime-session-timeline.d.ts.map +1 -1
  402. package/dist/lib/utils/realtime-session-timeline.js +8 -89
  403. package/dist/lib/utils/realtime-session-timeline.js.map +1 -1
  404. package/dist/public-api.d.ts +5 -2
  405. package/dist/public-api.d.ts.map +1 -1
  406. package/dist/public-api.js +9 -2
  407. package/dist/public-api.js.map +1 -1
  408. package/package.json +33 -32
  409. package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts +0 -384
  410. package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts.map +0 -1
  411. package/dist/lib/components/realtime/channels/base-realtime-channel-client.js +0 -231
  412. package/dist/lib/components/realtime/channels/base-realtime-channel-client.js.map +0 -1
  413. package/dist/lib/services/delegation-result-parser.d.ts +0 -50
  414. package/dist/lib/services/delegation-result-parser.d.ts.map +0 -1
  415. package/dist/lib/services/delegation-result-parser.js +0 -60
  416. package/dist/lib/services/delegation-result-parser.js.map +0 -1
  417. package/dist/lib/services/narration-template.d.ts +0 -42
  418. package/dist/lib/services/narration-template.d.ts.map +0 -1
  419. package/dist/lib/services/narration-template.js +0 -73
  420. package/dist/lib/services/narration-template.js.map +0 -1
  421. package/dist/lib/services/skill-picker-narrowing.d.ts +0 -13
  422. package/dist/lib/services/skill-picker-narrowing.d.ts.map +0 -1
  423. package/dist/lib/services/skill-picker-narrowing.js +0 -13
  424. package/dist/lib/services/skill-picker-narrowing.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"project-form-modal.component.js","sourceRoot":"","sources":["../../../../src/lib/components/project/project-form-modal.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, ViewChild, ChangeDetectorRef } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { MJDialogRef } from '@memberjunction/ng-ui-components';\nimport { MJProjectEntity } from '@memberjunction/core-entities';\nimport { UserInfo, Metadata } from '@memberjunction/core';\n\nexport interface ProjectFormData {\n name: string;\n description: string;\n color: string;\n icon: string;\n}\n\nconst DEFAULT_PROJECT_COLORS = [\n '#0076B6', // MJ Blue\n '#F44336', // Red\n '#E91E63', // Pink\n '#9C27B0', // Purple\n '#673AB7', // Deep Purple\n '#3F51B5', // Indigo\n '#2196F3', // Blue\n '#03A9F4', // Light Blue\n '#00BCD4', // Cyan\n '#009688', // Teal\n '#4CAF50', // Green\n '#8BC34A', // Light Green\n '#CDDC39', // Lime\n '#FFEB3B', // Yellow\n '#FFC107', // Amber\n '#FF9800', // Orange\n '#FF5722', // Deep Orange\n '#795548', // Brown\n '#607D8B', // Blue Grey\n '#9E9E9E' // Grey\n];\n\nconst DEFAULT_PROJECT_ICONS = [\n 'fa-folder',\n 'fa-folder-open',\n 'fa-briefcase',\n 'fa-project-diagram',\n 'fa-chart-line',\n 'fa-tasks',\n 'fa-clipboard-list',\n 'fa-bullseye',\n 'fa-rocket',\n 'fa-lightbulb',\n 'fa-brain',\n 'fa-cogs',\n 'fa-code',\n 'fa-database',\n 'fa-server',\n 'fa-cloud',\n 'fa-mobile-alt',\n 'fa-desktop',\n 'fa-globe',\n 'fa-users'\n];\n\n@Component({\n standalone: false,\n selector: 'mj-project-form-modal',\n template: `\n <mj-dialog\n [Title]=\"isEditMode ? 'Edit Folder' : 'New Folder'\"\n [Width]=\"560\"\n [MinWidth]=\"400\"\n [Visible]=\"true\"\n (Close)=\"onCancel()\">\n\n <div class=\"project-form\">\n <!-- Live preview chip -->\n <div class=\"folder-preview\">\n <span class=\"folder-preview-chip\" [style.backgroundColor]=\"chipBackground\" [style.color]=\"formData.color\">\n <i class=\"fa-solid {{ formData.icon }}\"></i>\n </span>\n <span class=\"folder-preview-name\">{{ formData.name.trim() || 'Untitled folder' }}</span>\n </div>\n\n <!-- Name Input -->\n <div class=\"form-field\">\n <label for=\"projectName\" class=\"required\">\n Folder Name\n </label>\n <input\n id=\"projectName\"\n type=\"text\"\n [(ngModel)]=\"formData.name\"\n placeholder=\"e.g. Client work, Research, Ideas\"\n class=\"mj-input full-width\"\n (keydown.enter)=\"onSave()\"\n autofocus />\n @if (showNameError) {\n <div class=\"error-message\">Folder name is required</div>\n }\n </div>\n\n <!-- Description Textarea -->\n <div class=\"form-field\">\n <label for=\"projectDescription\">\n Description\n </label>\n <textarea\n id=\"projectDescription\"\n [(ngModel)]=\"formData.description\"\n placeholder=\"What goes in this folder? (optional)\"\n class=\"mj-textarea full-width\"\n rows=\"2\"></textarea>\n </div>\n\n <!-- Color Picker -->\n <div class=\"form-field\">\n <label>Color</label>\n <div class=\"color-picker-section\">\n <div class=\"color-palette\">\n @for (color of availableColors; track color) {\n <button\n type=\"button\"\n class=\"color-swatch\"\n [class.selected]=\"formData.color === color\"\n [style.backgroundColor]=\"color\"\n (click)=\"selectColor(color)\"\n [title]=\"color\">\n </button>\n }\n </div>\n <div class=\"custom-color-input\">\n <label for=\"customColor\">Custom:</label>\n <input\n id=\"customColor\"\n type=\"color\"\n [(ngModel)]=\"formData.color\"\n class=\"custom-color-picker\" />\n <span class=\"color-value\">{{ formData.color }}</span>\n </div>\n </div>\n </div>\n\n <!-- Icon Selector -->\n <div class=\"form-field\">\n <label>Icon</label>\n <div class=\"icon-grid\">\n @for (icon of availableIcons; track icon) {\n <button\n type=\"button\"\n class=\"icon-option\"\n [class.selected]=\"formData.icon === icon\"\n [style.color]=\"formData.icon === icon ? formData.color : null\"\n (click)=\"selectIcon(icon)\"\n [title]=\"icon\">\n <i class=\"fa-solid {{ icon }}\"></i>\n </button>\n }\n </div>\n </div>\n </div>\n\n <mj-dialog-actions>\n <button mjButton variant=\"primary\" (click)=\"onSave()\">\n {{ isEditMode ? 'Save Changes' : 'Create Folder' }}\n </button>\n <button mjButton (click)=\"onCancel()\">Cancel</button>\n </mj-dialog-actions>\n </mj-dialog>\n `,\n styles: [`\n .project-form {\n padding: 20px 24px 8px;\n display: flex;\n flex-direction: column;\n gap: 22px;\n }\n\n /* Live preview chip */\n .folder-preview {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n border-radius: 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n }\n .folder-preview-chip {\n width: 40px;\n height: 40px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n flex-shrink: 0;\n transition: background-color 150ms ease, color 150ms ease;\n }\n .folder-preview-name {\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .form-field label {\n font-weight: 600;\n font-size: 13px;\n letter-spacing: 0.01em;\n color: var(--mj-text-secondary);\n }\n\n .form-field label.required::after {\n content: '*';\n color: var(--mj-status-error);\n margin-left: 4px;\n }\n\n .full-width { width: 100%; }\n\n .error-message {\n color: var(--mj-status-error);\n font-size: 12px;\n }\n\n /* Color Picker */\n .color-picker-section {\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 14px;\n background: var(--mj-bg-surface);\n }\n\n .color-palette {\n display: grid;\n grid-template-columns: repeat(10, 1fr);\n gap: 8px;\n margin-bottom: 12px;\n }\n\n .color-swatch {\n width: 100%;\n aspect-ratio: 1;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n padding: 0;\n transition: transform 120ms ease, box-shadow 120ms ease;\n box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n }\n\n .color-swatch:hover {\n transform: scale(1.12);\n }\n\n .color-swatch.selected {\n box-shadow: 0 0 0 2px var(--mj-bg-surface), 0 0 0 4px var(--mj-brand-primary);\n }\n\n .custom-color-input {\n display: flex;\n align-items: center;\n gap: 10px;\n padding-top: 14px;\n border-top: 1px solid var(--mj-border-subtle);\n }\n\n .custom-color-input label {\n margin: 0;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .custom-color-picker {\n width: 44px;\n height: 30px;\n padding: 2px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n cursor: pointer;\n background: var(--mj-bg-surface);\n }\n\n .color-value {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 13px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n }\n\n /* Icon Selector */\n .icon-grid {\n display: grid;\n grid-template-columns: repeat(10, 1fr);\n gap: 8px;\n max-height: 184px;\n overflow-y: auto;\n padding: 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n background: var(--mj-bg-surface);\n }\n\n .icon-option {\n aspect-ratio: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n cursor: pointer;\n color: var(--mj-text-secondary);\n transition: transform 120ms ease, border-color 120ms ease, background 120ms ease;\n }\n\n .icon-option:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n transform: translateY(-1px);\n }\n\n .icon-option.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 1px var(--mj-brand-primary);\n }\n\n .icon-option i { font-size: 17px; }\n\n /* Scrollbar */\n .icon-grid::-webkit-scrollbar { width: 8px; }\n .icon-grid::-webkit-scrollbar-track {\n background: transparent;\n }\n .icon-grid::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 4px;\n }\n .icon-grid::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n }\n `]\n})\nexport class ProjectFormModalComponent extends BaseAngularComponent implements OnInit {\n @Input() dialogRef!: MJDialogRef;\n @Input() project: MJProjectEntity | null = null;\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n /** When creating a new folder, the parent folder ID for nesting (null = top level). */\n @Input() parentId: string | null = null;\n\n @Output() projectSaved = new EventEmitter<MJProjectEntity>();\n\n public formData: ProjectFormData = {\n name: '',\n description: '',\n color: '#0076B6',\n icon: 'fa-folder'\n };\n\n public showNameError = false;\n public isEditMode = false;\n public availableColors = DEFAULT_PROJECT_COLORS;\n public availableIcons = DEFAULT_PROJECT_ICONS;\n\n /** Translucent tint of the selected color, used behind the preview/icon glyph. */\n public get chipBackground(): string {\n const hex = this.formData.color || '#0076B6';\n // 8-digit hex (#RRGGBBAA) — ~14% alpha tint of the chosen color\n return /^#[0-9a-fA-F]{6}$/.test(hex) ? `${hex}24` : hex;\n }\n\n constructor(private cdr: ChangeDetectorRef) {\n super();}\n\n ngOnInit(): void {\n this.isEditMode = this.project != null;\n\n if (this.project) {\n this.loadProjectData();\n }\n }\n\n private loadProjectData(): void {\n if (!this.project) return;\n\n this.formData = {\n name: this.project.Name || '',\n description: this.project.Description || '',\n color: this.project.Color || '#0076B6',\n icon: this.project.Icon || 'fa-folder'\n };\n }\n\n selectColor(color: string): void {\n this.formData.color = color;\n this.cdr.detectChanges();\n }\n\n selectIcon(icon: string): void {\n this.formData.icon = icon;\n this.cdr.detectChanges();\n }\n\n async onSave(): Promise<void> {\n // Validate\n if (!this.formData.name.trim()) {\n this.showNameError = true;\n this.cdr.detectChanges();\n return;\n }\n\n this.showNameError = false;\n\n try {\n const md = this.ProviderToUse;\n const project = this.project || await md.GetEntityObject<MJProjectEntity>('MJ: Projects', this.currentUser);\n\n project.Name = this.formData.name.trim();\n project.Description = this.formData.description.trim() || null;\n project.Color = this.formData.color;\n project.Icon = this.formData.icon;\n\n if (!this.isEditMode) {\n project.EnvironmentID = this.environmentId;\n project.IsArchived = false;\n if (this.parentId) {\n project.ParentID = this.parentId;\n }\n }\n\n const saved = await project.Save();\n if (saved) {\n this.projectSaved.emit(project);\n this.dialogRef.Close();\n } else {\n throw new Error('Failed to save project');\n }\n } catch (error) {\n console.error('Error saving project:', error);\n alert('Failed to save project. Please try again.');\n }\n }\n\n onCancel(): void {\n this.dialogRef.Close();\n }\n}\n"]}
1
+ {"version":3,"file":"project-form-modal.component.js","sourceRoot":"","sources":["../../../../src/lib/components/project/project-form-modal.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, ViewChild, ChangeDetectorRef } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { MJDialogRef } from '@memberjunction/ng-ui-components';\nimport { MJProjectEntity } from '@memberjunction/core-entities';\nimport { UserInfo, Metadata } from '@memberjunction/core';\n\nexport interface ProjectFormData {\n name: string;\n description: string;\n color: string;\n icon: string;\n /** true = only the owner sees it; false = everyone in the environment does. */\n isPersonal: boolean;\n}\n\nconst DEFAULT_PROJECT_COLORS = [\n '#0076B6', // MJ Blue\n '#F44336', // Red\n '#E91E63', // Pink\n '#9C27B0', // Purple\n '#673AB7', // Deep Purple\n '#3F51B5', // Indigo\n '#2196F3', // Blue\n '#03A9F4', // Light Blue\n '#00BCD4', // Cyan\n '#009688', // Teal\n '#4CAF50', // Green\n '#8BC34A', // Light Green\n '#CDDC39', // Lime\n '#FFEB3B', // Yellow\n '#FFC107', // Amber\n '#FF9800', // Orange\n '#FF5722', // Deep Orange\n '#795548', // Brown\n '#607D8B', // Blue Grey\n '#9E9E9E' // Grey\n];\n\nconst DEFAULT_PROJECT_ICONS = [\n 'fa-folder',\n 'fa-folder-open',\n 'fa-briefcase',\n 'fa-project-diagram',\n 'fa-chart-line',\n 'fa-tasks',\n 'fa-clipboard-list',\n 'fa-bullseye',\n 'fa-rocket',\n 'fa-lightbulb',\n 'fa-brain',\n 'fa-cogs',\n 'fa-code',\n 'fa-database',\n 'fa-server',\n 'fa-cloud',\n 'fa-mobile-alt',\n 'fa-desktop',\n 'fa-globe',\n 'fa-users'\n];\n\n@Component({\n standalone: false,\n selector: 'mj-project-form-modal',\n template: `\n <mj-dialog\n [Title]=\"isEditMode ? 'Edit Folder' : 'New Folder'\"\n [Width]=\"560\"\n [MinWidth]=\"400\"\n [Visible]=\"true\"\n (Close)=\"onCancel()\">\n\n <div class=\"project-form\">\n <!-- Live preview chip -->\n <div class=\"folder-preview\">\n <span class=\"folder-preview-chip\" [style.backgroundColor]=\"chipBackground\" [style.color]=\"formData.color\">\n <i class=\"fa-solid {{ formData.icon }}\"></i>\n </span>\n <span class=\"folder-preview-name\">{{ formData.name.trim() || 'Untitled folder' }}</span>\n </div>\n\n <!-- Name Input -->\n <div class=\"form-field\">\n <label for=\"projectName\" class=\"required\">\n Folder Name\n </label>\n <input\n id=\"projectName\"\n type=\"text\"\n [(ngModel)]=\"formData.name\"\n placeholder=\"e.g. Client work, Research, Ideas\"\n class=\"mj-input full-width\"\n (keydown.enter)=\"onSave()\"\n autofocus />\n @if (showNameError) {\n <div class=\"error-message\">Folder name is required</div>\n }\n </div>\n\n <!-- Description Textarea -->\n <div class=\"form-field\">\n <label for=\"projectDescription\">\n Description\n </label>\n <textarea\n id=\"projectDescription\"\n [(ngModel)]=\"formData.description\"\n placeholder=\"What goes in this folder? (optional)\"\n class=\"mj-textarea full-width\"\n rows=\"2\"></textarea>\n </div>\n\n <!-- Visibility. TWO NAMED OPTIONS, not a checkbox: with a checkbox the unchecked\n meaning lives only in the helper text, so the shared state is never actually\n named. A fieldset/legend also gives the group a real accessible name, which a\n bare <label>Visibility</label> did not, and the hint is a sibling of the\n options rather than inside one — inside, a screen reader read the whole hint\n as part of the option's name.\n\n A SHARED folder shows a statement instead of the control. Visibility is a\n create-time choice in one direction only: personal -> shared stays available,\n because it only ever adds. See VisibilityIsLocked for why the reverse is not\n offered. -->\n <div class=\"form-field\">\n @if (VisibilityIsLocked) {\n <fieldset class=\"visibility-set\" aria-describedby=\"projectVisibilityHint\">\n <legend>Visibility</legend>\n <p class=\"visibility-locked\">\n <i class=\"fa-solid fa-users\" aria-hidden=\"true\"></i>\n Shared with everyone\n </p>\n <p class=\"visibility-hint\" id=\"projectVisibilityHint\">\n A shared folder stays shared. To keep something to yourself, create a new\n private folder and move it there.\n </p>\n </fieldset>\n } @else {\n <fieldset class=\"visibility-set\" aria-describedby=\"projectVisibilityHint\">\n <legend>Visibility</legend>\n <label class=\"visibility-choice\">\n <input type=\"radio\" name=\"projectVisibility\" [value]=\"true\"\n [(ngModel)]=\"FormData.isPersonal\" />\n <span>Only me</span>\n </label>\n <label class=\"visibility-choice\">\n <input type=\"radio\" name=\"projectVisibility\" [value]=\"false\"\n [(ngModel)]=\"FormData.isPersonal\" />\n <span>Everyone</span>\n </label>\n <p class=\"visibility-hint\" id=\"projectVisibilityHint\">\n {{ FormData.isPersonal\n ? 'Only you can see this folder.'\n : 'Everyone can see this folder and its name. They will not see the conversations you keep in it.' }}\n </p>\n </fieldset>\n }\n </div>\n\n <!-- Color Picker -->\n <div class=\"form-field\">\n <label>Color</label>\n <div class=\"color-picker-section\">\n <div class=\"color-palette\">\n @for (color of availableColors; track color) {\n <button\n type=\"button\"\n class=\"color-swatch\"\n [class.selected]=\"formData.color === color\"\n [style.backgroundColor]=\"color\"\n (click)=\"selectColor(color)\"\n [title]=\"color\">\n </button>\n }\n </div>\n <div class=\"custom-color-input\">\n <label for=\"customColor\">Custom:</label>\n <input\n id=\"customColor\"\n type=\"color\"\n [(ngModel)]=\"formData.color\"\n class=\"custom-color-picker\" />\n <span class=\"color-value\">{{ formData.color }}</span>\n </div>\n </div>\n </div>\n\n <!-- Icon Selector -->\n <div class=\"form-field\">\n <label>Icon</label>\n <div class=\"icon-grid\">\n @for (icon of availableIcons; track icon) {\n <button\n type=\"button\"\n class=\"icon-option\"\n [class.selected]=\"formData.icon === icon\"\n [style.color]=\"formData.icon === icon ? formData.color : null\"\n (click)=\"selectIcon(icon)\"\n [title]=\"icon\">\n <i class=\"fa-solid {{ icon }}\"></i>\n </button>\n }\n </div>\n </div>\n </div>\n\n <mj-dialog-actions>\n <button mjButton variant=\"primary\" (click)=\"onSave()\">\n {{ isEditMode ? 'Save Changes' : 'Create Folder' }}\n </button>\n <button mjButton (click)=\"onCancel()\">Cancel</button>\n </mj-dialog-actions>\n </mj-dialog>\n `,\n styles: [`\n .project-form {\n padding: 20px 24px 8px;\n display: flex;\n flex-direction: column;\n gap: 22px;\n }\n\n /* Live preview chip */\n .folder-preview {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n border-radius: 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n }\n .folder-preview-chip {\n width: 40px;\n height: 40px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n flex-shrink: 0;\n transition: background-color 150ms ease, color 150ms ease;\n }\n .folder-preview-name {\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .form-field {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .form-field label {\n font-weight: 600;\n font-size: 13px;\n letter-spacing: 0.01em;\n color: var(--mj-text-secondary);\n }\n\n .form-field label.required::after {\n content: '*';\n color: var(--mj-status-error);\n margin-left: 4px;\n }\n\n .full-width { width: 100%; }\n\n .error-message {\n color: var(--mj-status-error);\n font-size: 12px;\n }\n\n /* Color Picker */\n .visibility-set {\n border: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n }\n\n /* A <legend> is not matched by the .form-field label rule, so it inherited 16px/400\n and read larger and lighter than every other field label. Restated here rather than\n widening that selector, which would also catch the option labels below.\n (No backticks in this block: it is a template literal.) */\n .visibility-set legend {\n padding: 0;\n margin-bottom: 0.15rem;\n font-weight: 600;\n font-size: 13px;\n letter-spacing: 0.01em;\n color: var(--mj-text-secondary);\n }\n\n /* Scoped as .form-field .visibility-choice (0,2,1) so it deliberately outranks the\n .form-field label rule (0,1,1) this sits inside — at equal specificity that rule\n won on source order and rendered the option text bold.\n (No backticks in here: this block is a template literal.) */\n .form-field .visibility-choice {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n cursor: pointer;\n font-weight: 400;\n font-size: 13px;\n margin: 0;\n /* The rows were the height of the radio alone (~16px). The checkbox this replaced\n sat in a 31px row, so the tap target got smaller when the control got clearer. */\n padding: 0.25rem 0;\n }\n\n .visibility-choice input {\n flex: 0 0 auto;\n margin: 0;\n }\n\n /* The shared-folder statement that stands in for the radios. Matches the option rows\n it replaces — same size, same weight, same 0.25rem row padding — so the dialog does\n not visibly reflow between a folder that offers the choice and one that does not.\n (No backticks in here: this block is a template literal.) */\n .form-field .visibility-locked {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin: 0;\n padding: 0.25rem 0;\n font-weight: 400;\n font-size: 13px;\n color: var(--mj-text-primary);\n }\n\n .visibility-locked i {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .visibility-hint {\n margin: 0.15rem 0 0;\n /* Unsized it inherited 16px and read LARGER than the options it describes. */\n font-size: 12px;\n line-height: 1.4;\n color: var(--mj-text-muted);\n }\n\n .color-picker-section {\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 14px;\n background: var(--mj-bg-surface);\n }\n\n .color-palette {\n display: grid;\n grid-template-columns: repeat(10, 1fr);\n gap: 8px;\n margin-bottom: 12px;\n }\n\n .color-swatch {\n width: 100%;\n aspect-ratio: 1;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n padding: 0;\n transition: transform 120ms ease, box-shadow 120ms ease;\n box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n }\n\n .color-swatch:hover {\n transform: scale(1.12);\n }\n\n .color-swatch.selected {\n box-shadow: 0 0 0 2px var(--mj-bg-surface), 0 0 0 4px var(--mj-brand-primary);\n }\n\n .custom-color-input {\n display: flex;\n align-items: center;\n gap: 10px;\n padding-top: 14px;\n border-top: 1px solid var(--mj-border-subtle);\n }\n\n .custom-color-input label {\n margin: 0;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n }\n\n .custom-color-picker {\n width: 44px;\n height: 30px;\n padding: 2px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n cursor: pointer;\n background: var(--mj-bg-surface);\n }\n\n .color-value {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 13px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n }\n\n /* Icon Selector */\n .icon-grid {\n display: grid;\n grid-template-columns: repeat(10, 1fr);\n gap: 8px;\n max-height: 184px;\n overflow-y: auto;\n padding: 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n background: var(--mj-bg-surface);\n }\n\n .icon-option {\n aspect-ratio: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n cursor: pointer;\n color: var(--mj-text-secondary);\n transition: transform 120ms ease, border-color 120ms ease, background 120ms ease;\n }\n\n .icon-option:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n transform: translateY(-1px);\n }\n\n .icon-option.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 1px var(--mj-brand-primary);\n }\n\n .icon-option i { font-size: 17px; }\n\n /* Scrollbar */\n .icon-grid::-webkit-scrollbar { width: 8px; }\n .icon-grid::-webkit-scrollbar-track {\n background: transparent;\n }\n .icon-grid::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 4px;\n }\n .icon-grid::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n }\n `]\n})\nexport class ProjectFormModalComponent extends BaseAngularComponent implements OnInit {\n @Input() DialogRef!: MJDialogRef;\n\n /** @deprecated Use {@link DialogRef}. */\n @Input() set dialogRef(value: MJDialogRef) {\n this.DialogRef = value;\n }\n /** @deprecated Use {@link DialogRef}. */\n get dialogRef(): MJDialogRef {\n return this.DialogRef;\n }\n @Input() Project: MJProjectEntity | null = null;\n\n /** @deprecated Use {@link Project}. */\n @Input() set project(value: MJProjectEntity | null) {\n this.Project = value;\n }\n /** @deprecated Use {@link Project}. */\n get project(): MJProjectEntity | null {\n return this.Project;\n }\n @Input() EnvironmentId!: string;\n\n /** @deprecated Use {@link EnvironmentId}. */\n @Input() set environmentId(value: string) {\n this.EnvironmentId = value;\n }\n /** @deprecated Use {@link EnvironmentId}. */\n get environmentId(): string {\n return this.EnvironmentId;\n }\n @Input() CurrentUser!: UserInfo;\n\n /** @deprecated Use {@link CurrentUser}. */\n @Input() set currentUser(value: UserInfo) {\n this.CurrentUser = value;\n }\n /** @deprecated Use {@link CurrentUser}. */\n get currentUser(): UserInfo {\n return this.CurrentUser;\n }\n /** When creating a new folder, the parent folder ID for nesting (null = top level). */\n @Input() ParentId: string | null = null;\n\n /** @deprecated Use {@link ParentId}. */\n @Input() set parentId(value: string | null) {\n this.ParentId = value;\n }\n /** @deprecated Use {@link ParentId}. */\n get parentId(): string | null {\n return this.ParentId;\n }\n\n @Output() ProjectSaved = new EventEmitter<MJProjectEntity>();\n\n /**\n * @deprecated Use {@link ProjectSaved}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (projectSaved) keeps working. Must stay AFTER ProjectSaved: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() projectSaved = this.ProjectSaved;\n\n public FormData: ProjectFormData = {\n name: '',\n description: '',\n color: '#0076B6',\n icon: 'fa-folder',\n // A NEW folder is personal by default. The conversation sidebar is a personal\n // surface — the conversations in it are already bound to their owner — so a\n // folder everyone can see is the surprising option, not the private one. Folder\n // NAMES are user-authored free text, and before OwnerUserID existed every one of\n // them was readable by every user of the environment, which is what prompted\n // this. Existing folders are untouched: they carry NULL, which still means shared.\n isPersonal: true\n };\n\n /** @deprecated Use {@link FormData}. */\n public get formData(): ProjectFormData {\n return this.FormData;\n }\n /** @deprecated Use {@link FormData}. */\n public set formData(value: ProjectFormData) {\n this.FormData = value;\n }\n\n public ShowNameError = false;\n\n /** @deprecated Use {@link ShowNameError}. */\n public get showNameError() {\n return this.ShowNameError;\n }\n /** @deprecated Use {@link ShowNameError}. */\n public set showNameError(value) {\n this.ShowNameError = value;\n }\n public IsEditMode = false;\n\n /** @deprecated Use {@link IsEditMode}. */\n public get isEditMode() {\n return this.IsEditMode;\n }\n /** @deprecated Use {@link IsEditMode}. */\n public set isEditMode(value) {\n this.IsEditMode = value;\n }\n public AvailableColors = DEFAULT_PROJECT_COLORS;\n\n /** @deprecated Use {@link AvailableColors}. */\n public get availableColors() {\n return this.AvailableColors;\n }\n /** @deprecated Use {@link AvailableColors}. */\n public set availableColors(value) {\n this.AvailableColors = value;\n }\n public AvailableIcons = DEFAULT_PROJECT_ICONS;\n\n /** @deprecated Use {@link AvailableIcons}. */\n public get availableIcons() {\n return this.AvailableIcons;\n }\n /** @deprecated Use {@link AvailableIcons}. */\n public set availableIcons(value) {\n this.AvailableIcons = value;\n }\n\n /**\n * True when this dialog is editing a folder that is currently SHARED — in which case\n * visibility is shown as a statement rather than a control.\n *\n * Sharing is one-way by design, and the reason is in the data model rather than the UI.\n * NULL-means-shared conflates \"shared\" with \"unowned\": the moment a folder is shared its\n * `OwnerUserID` goes to NULL and there is no column anywhere recording who created it\n * (`Project` has `__mj_CreatedAt`, but no created-by). So `OwnerUserID = currentUser.ID`\n * on a shared folder is indistinguishable from any other user claiming it — the system\n * cannot tell reclaiming from appropriating, which makes \"take it back\" an affordance\n * that was never really there.\n *\n * What that would cost on day one is the deciding argument. Every folder that exists\n * today carries NULL, so without this the whole team's folder structure — subfolders\n * included — is one radio button away from belonging to whichever person opens its\n * settings first. A confirm does not fix that; it only narrates it.\n *\n * Personal -> shared stays available, because it only ever adds. Someone who wants a\n * private copy makes a private folder. If personal folders later grow features that need\n * a stable creator (sharing with named users, transfer, recovering a departed employee's\n * folders), the fix is a separate IsShared flag so ownership stops being erased by\n * sharing — a bigger change, and deliberately not this one.\n */\n public get VisibilityIsLocked(): boolean {\n return this.IsEditMode && !this.Project?.OwnerUserID;\n }\n\n /** Translucent tint of the selected color, used behind the preview/icon glyph. */\n public get ChipBackground(): string {\n const hex = this.FormData.color || '#0076B6';\n // 8-digit hex (#RRGGBBAA) — ~14% alpha tint of the chosen color\n return /^#[0-9a-fA-F]{6}$/.test(hex) ? `${hex}24` : hex;\n }\n\n /** @deprecated Use {@link ChipBackground}. */\n public get chipBackground(): string {\n return this.ChipBackground;\n }\n\n constructor(private cdr: ChangeDetectorRef) {\n super();}\n\n ngOnInit(): void {\n this.IsEditMode = this.Project != null;\n\n if (this.Project) {\n this.loadProjectData();\n }\n }\n\n private loadProjectData(): void {\n if (!this.Project) return;\n\n this.FormData = {\n name: this.Project.Name || '',\n description: this.Project.Description || '',\n color: this.Project.Color || '#0076B6',\n icon: this.Project.Icon || 'fa-folder',\n // Reflect what the folder IS, not the create-time default — otherwise opening\n // a shared folder's settings and pressing Save would silently make it private.\n isPersonal: !!this.Project.OwnerUserID\n };\n }\n\n SelectColor(color: string): void {\n this.FormData.color = color;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link SelectColor}. */\n selectColor(color: string): void {\n return this.SelectColor(color);\n }\n\n SelectIcon(icon: string): void {\n this.FormData.icon = icon;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link SelectIcon}. */\n selectIcon(icon: string): void {\n return this.SelectIcon(icon);\n }\n\n async OnSave(): Promise<void> {\n // Validate\n if (!this.FormData.name.trim()) {\n this.ShowNameError = true;\n this.cdr.detectChanges();\n return;\n }\n\n this.ShowNameError = false;\n\n try {\n const md = this.ProviderToUse;\n\n // A shared folder cannot be taken private — the control is not rendered for one\n // (see VisibilityIsLocked). This is the same rule expressed where the write happens,\n // so a future template change, a stale `formData` from a reopened dialog, or anything\n // else that sets the flag cannot quietly appropriate a folder the whole team uses.\n // It resolves to the folder's CURRENT state, so it is a no-op in every other case.\n const isPersonal = this.VisibilityIsLocked ? false : this.FormData.isPersonal;\n\n const project = this.Project || await md.GetEntityObject<MJProjectEntity>('MJ: Projects', this.CurrentUser);\n\n project.Name = this.FormData.name.trim();\n project.Description = this.FormData.description.trim() || null;\n project.Color = this.FormData.color;\n project.Icon = this.FormData.icon;\n\n // Settable on edit, in one direction: a personal folder can be shared with the team.\n // Null means shared, which is what every folder created before this column existed\n // carries — and, because sharing erases the owner, is also why the reverse is not on\n // offer. See VisibilityIsLocked.\n project.OwnerUserID = isPersonal ? this.CurrentUser.ID : null;\n\n if (!this.IsEditMode) {\n project.EnvironmentID = this.EnvironmentId;\n project.IsArchived = false;\n if (this.ParentId) {\n project.ParentID = this.ParentId;\n }\n }\n\n const saved = await project.Save();\n if (saved) {\n this.ProjectSaved.emit(project);\n this.DialogRef.Close();\n } else {\n // Save() records WHY it refused on LatestResult and returns false — a\n // server refusal, a constraint violation, a failed validation. Reporting\n // a generic message here would throw the only copy of that reason away.\n throw new Error(project.LatestResult?.CompleteMessage || 'The save was refused with no reason given.');\n }\n } catch (error) {\n console.error('Error saving project:', error);\n const reason = error instanceof Error ? error.message : String(error);\n alert(`Failed to save folder.\\n\\n${reason}`);\n }\n }\n\n /** @deprecated Use {@link OnSave}. */\n async onSave(): Promise<void> {\n return this.OnSave();\n }\n\n onCancel(): void {\n this.DialogRef.Close();\n }\n}\n"]}
@@ -12,27 +12,97 @@ export declare class ProjectSelectorComponent extends BaseAngularComponent imple
12
12
  private dialogService;
13
13
  private mjDialogService;
14
14
  private viewContainerRef;
15
- environmentId: string;
16
- currentUser: UserInfo;
17
- selectedProjectId: string | null;
18
- disabled: boolean;
19
- showStats: boolean;
15
+ EnvironmentId: string;
16
+ /** @deprecated Use {@link EnvironmentId}. */
17
+ set environmentId(value: string);
18
+ /** @deprecated Use {@link EnvironmentId}. */
19
+ get environmentId(): string;
20
+ CurrentUser: UserInfo;
21
+ /** @deprecated Use {@link CurrentUser}. */
22
+ set currentUser(value: UserInfo);
23
+ /** @deprecated Use {@link CurrentUser}. */
24
+ get currentUser(): UserInfo;
25
+ SelectedProjectId: string | null;
26
+ /** @deprecated Use {@link SelectedProjectId}. */
27
+ set selectedProjectId(value: string | null);
28
+ /** @deprecated Use {@link SelectedProjectId}. */
29
+ get selectedProjectId(): string | null;
30
+ Disabled: boolean;
31
+ /** @deprecated Use {@link Disabled}. */
32
+ set disabled(value: boolean);
33
+ /** @deprecated Use {@link Disabled}. */
34
+ get disabled(): boolean;
35
+ ShowStats: boolean;
36
+ /** @deprecated Use {@link ShowStats}. */
37
+ set showStats(value: boolean);
38
+ /** @deprecated Use {@link ShowStats}. */
39
+ get showStats(): boolean;
40
+ ProjectSelected: EventEmitter<MJProjectEntity | null>;
41
+ /**
42
+ * @deprecated Use {@link ProjectSelected}.
43
+ *
44
+ * The same emitter under the old binding name, so a template still binding
45
+ * (projectSelected) keeps working. Must stay AFTER ProjectSelected: class fields
46
+ * initialise in order, and the other way round this captures undefined.
47
+ */
20
48
  projectSelected: EventEmitter<MJProjectEntity | null>;
49
+ ProjectCreated: EventEmitter<MJProjectEntity>;
50
+ /**
51
+ * @deprecated Use {@link ProjectCreated}.
52
+ *
53
+ * The same emitter under the old binding name, so a template still binding
54
+ * (projectCreated) keeps working. Must stay AFTER ProjectCreated: class fields
55
+ * initialise in order, and the other way round this captures undefined.
56
+ */
21
57
  projectCreated: EventEmitter<MJProjectEntity>;
58
+ ProjectUpdated: EventEmitter<MJProjectEntity>;
59
+ /**
60
+ * @deprecated Use {@link ProjectUpdated}.
61
+ *
62
+ * The same emitter under the old binding name, so a template still binding
63
+ * (projectUpdated) keeps working. Must stay AFTER ProjectUpdated: class fields
64
+ * initialise in order, and the other way round this captures undefined.
65
+ */
22
66
  projectUpdated: EventEmitter<MJProjectEntity>;
67
+ ProjectDeleted: EventEmitter<string>;
68
+ /**
69
+ * @deprecated Use {@link ProjectDeleted}.
70
+ *
71
+ * The same emitter under the old binding name, so a template still binding
72
+ * (projectDeleted) keeps working. Must stay AFTER ProjectDeleted: class fields
73
+ * initialise in order, and the other way round this captures undefined.
74
+ */
23
75
  projectDeleted: EventEmitter<string>;
24
- projectsWithStats: ProjectWithStats[];
25
- selectedProject: MJProjectEntity | null;
76
+ ProjectsWithStats: ProjectWithStats[];
77
+ /** @deprecated Use {@link ProjectsWithStats}. */
78
+ get projectsWithStats(): ProjectWithStats[];
79
+ /** @deprecated Use {@link ProjectsWithStats}. */
80
+ set projectsWithStats(value: ProjectWithStats[]);
81
+ SelectedProject: MJProjectEntity | null;
82
+ /** @deprecated Use {@link SelectedProject}. */
83
+ get selectedProject(): MJProjectEntity | null;
84
+ /** @deprecated Use {@link SelectedProject}. */
85
+ set selectedProject(value: MJProjectEntity | null);
26
86
  constructor(dialogService: DialogService, mjDialogService: MJDialogService, viewContainerRef: ViewContainerRef);
27
87
  ngOnInit(): void;
28
88
  private loadProjects;
29
89
  private calculateConversationCounts;
90
+ OnProjectChange(project: MJProjectEntity | null): void;
91
+ /** @deprecated Use {@link OnProjectChange}. */
30
92
  onProjectChange(project: MJProjectEntity | null): void;
93
+ OnProjectSelectChange(projectId: string): void;
94
+ /** @deprecated Use {@link OnProjectSelectChange}. */
31
95
  onProjectSelectChange(projectId: string): void;
96
+ OnCreateProject(): void;
97
+ /** @deprecated Use {@link OnCreateProject}. */
32
98
  onCreateProject(): void;
99
+ OnEditProject(): void;
100
+ /** @deprecated Use {@link OnEditProject}. */
33
101
  onEditProject(): void;
102
+ OnDeleteProject(): Promise<void>;
103
+ /** @deprecated Use {@link OnDeleteProject}. */
34
104
  onDeleteProject(): Promise<void>;
35
105
  static ɵfac: i0.ɵɵFactoryDeclaration<ProjectSelectorComponent, never>;
36
- static ɵcmp: i0.ɵɵComponentDeclaration<ProjectSelectorComponent, "mj-project-selector", never, { "environmentId": { "alias": "environmentId"; "required": false; }; "currentUser": { "alias": "currentUser"; "required": false; }; "selectedProjectId": { "alias": "selectedProjectId"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "showStats": { "alias": "showStats"; "required": false; }; }, { "projectSelected": "projectSelected"; "projectCreated": "projectCreated"; "projectUpdated": "projectUpdated"; "projectDeleted": "projectDeleted"; }, never, never, false, never>;
106
+ static ɵcmp: i0.ɵɵComponentDeclaration<ProjectSelectorComponent, "mj-project-selector", never, { "EnvironmentId": { "alias": "EnvironmentId"; "required": false; }; "environmentId": { "alias": "environmentId"; "required": false; }; "CurrentUser": { "alias": "CurrentUser"; "required": false; }; "currentUser": { "alias": "currentUser"; "required": false; }; "SelectedProjectId": { "alias": "SelectedProjectId"; "required": false; }; "selectedProjectId": { "alias": "selectedProjectId"; "required": false; }; "Disabled": { "alias": "Disabled"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "ShowStats": { "alias": "ShowStats"; "required": false; }; "showStats": { "alias": "showStats"; "required": false; }; }, { "ProjectSelected": "ProjectSelected"; "projectSelected": "projectSelected"; "ProjectCreated": "ProjectCreated"; "projectCreated": "projectCreated"; "ProjectUpdated": "ProjectUpdated"; "projectUpdated": "projectUpdated"; "ProjectDeleted": "ProjectDeleted"; "projectDeleted": "projectDeleted"; }, never, never, false, never>;
37
107
  }
38
108
  //# sourceMappingURL=project-selector.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"project-selector.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/project/project-selector.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjG,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAwB,MAAM,+BAA+B,CAAC;AACtF,OAAO,EAAE,QAAQ,EAAqB,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;;AAI9D,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qBA0Fa,wBAAyB,SAAQ,oBAAqB,YAAW,MAAM;IAgBhF,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,gBAAgB;IAjBjB,aAAa,EAAG,MAAM,CAAC;IACvB,WAAW,EAAG,QAAQ,CAAC;IACvB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACxC,QAAQ,EAAE,OAAO,CAAS;IAC1B,SAAS,EAAE,OAAO,CAAQ;IAEzB,eAAe,uCAA8C;IAC7D,cAAc,gCAAuC;IACrD,cAAc,gCAAuC;IACrD,cAAc,uBAA8B;IAE/C,iBAAiB,EAAE,gBAAgB,EAAE,CAAM;IAC3C,eAAe,EAAE,eAAe,GAAG,IAAI,CAAQ;gBAG5C,aAAa,EAAE,aAAa,EAC5B,eAAe,EAAE,eAAe,EAChC,gBAAgB,EAAE,gBAAgB;IAI5C,QAAQ;YAIM,YAAY;IA0C1B,OAAO,CAAC,2BAA2B;IAYnC,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI;IAKtD,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAK9C,eAAe,IAAI,IAAI;IAoBvB,aAAa,IAAI,IAAI;IAuBf,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;yCArI3B,wBAAwB;2CAAxB,wBAAwB;CA8KpC"}
1
+ {"version":3,"file":"project-selector.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/project/project-selector.component.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { Component, Input, Output, EventEmitter } from '@angular/core';
2
2
  import { BaseAngularComponent } from '@memberjunction/ng-base-types';
3
+ import { BuildProjectVisibilityFilter } from '@memberjunction/core-entities';
3
4
  import { RunView } from '@memberjunction/core';
4
5
  import { ProjectFormModalComponent } from './project-form-modal.component';
5
6
  import { UUIDsEqual } from '@memberjunction/global';
@@ -39,17 +40,105 @@ export class ProjectSelectorComponent extends BaseAngularComponent {
39
40
  dialogService;
40
41
  mjDialogService;
41
42
  viewContainerRef;
42
- environmentId;
43
- currentUser;
44
- selectedProjectId = null;
45
- disabled = false;
46
- showStats = true;
47
- projectSelected = new EventEmitter();
48
- projectCreated = new EventEmitter();
49
- projectUpdated = new EventEmitter();
50
- projectDeleted = new EventEmitter();
51
- projectsWithStats = [];
52
- selectedProject = null;
43
+ EnvironmentId;
44
+ /** @deprecated Use {@link EnvironmentId}. */
45
+ set environmentId(value) {
46
+ this.EnvironmentId = value;
47
+ }
48
+ /** @deprecated Use {@link EnvironmentId}. */
49
+ get environmentId() {
50
+ return this.EnvironmentId;
51
+ }
52
+ CurrentUser;
53
+ /** @deprecated Use {@link CurrentUser}. */
54
+ set currentUser(value) {
55
+ this.CurrentUser = value;
56
+ }
57
+ /** @deprecated Use {@link CurrentUser}. */
58
+ get currentUser() {
59
+ return this.CurrentUser;
60
+ }
61
+ SelectedProjectId = null;
62
+ /** @deprecated Use {@link SelectedProjectId}. */
63
+ set selectedProjectId(value) {
64
+ this.SelectedProjectId = value;
65
+ }
66
+ /** @deprecated Use {@link SelectedProjectId}. */
67
+ get selectedProjectId() {
68
+ return this.SelectedProjectId;
69
+ }
70
+ Disabled = false;
71
+ /** @deprecated Use {@link Disabled}. */
72
+ set disabled(value) {
73
+ this.Disabled = value;
74
+ }
75
+ /** @deprecated Use {@link Disabled}. */
76
+ get disabled() {
77
+ return this.Disabled;
78
+ }
79
+ ShowStats = true;
80
+ /** @deprecated Use {@link ShowStats}. */
81
+ set showStats(value) {
82
+ this.ShowStats = value;
83
+ }
84
+ /** @deprecated Use {@link ShowStats}. */
85
+ get showStats() {
86
+ return this.ShowStats;
87
+ }
88
+ ProjectSelected = new EventEmitter();
89
+ /**
90
+ * @deprecated Use {@link ProjectSelected}.
91
+ *
92
+ * The same emitter under the old binding name, so a template still binding
93
+ * (projectSelected) keeps working. Must stay AFTER ProjectSelected: class fields
94
+ * initialise in order, and the other way round this captures undefined.
95
+ */
96
+ projectSelected = this.ProjectSelected;
97
+ ProjectCreated = new EventEmitter();
98
+ /**
99
+ * @deprecated Use {@link ProjectCreated}.
100
+ *
101
+ * The same emitter under the old binding name, so a template still binding
102
+ * (projectCreated) keeps working. Must stay AFTER ProjectCreated: class fields
103
+ * initialise in order, and the other way round this captures undefined.
104
+ */
105
+ projectCreated = this.ProjectCreated;
106
+ ProjectUpdated = new EventEmitter();
107
+ /**
108
+ * @deprecated Use {@link ProjectUpdated}.
109
+ *
110
+ * The same emitter under the old binding name, so a template still binding
111
+ * (projectUpdated) keeps working. Must stay AFTER ProjectUpdated: class fields
112
+ * initialise in order, and the other way round this captures undefined.
113
+ */
114
+ projectUpdated = this.ProjectUpdated;
115
+ ProjectDeleted = new EventEmitter();
116
+ /**
117
+ * @deprecated Use {@link ProjectDeleted}.
118
+ *
119
+ * The same emitter under the old binding name, so a template still binding
120
+ * (projectDeleted) keeps working. Must stay AFTER ProjectDeleted: class fields
121
+ * initialise in order, and the other way round this captures undefined.
122
+ */
123
+ projectDeleted = this.ProjectDeleted;
124
+ ProjectsWithStats = [];
125
+ /** @deprecated Use {@link ProjectsWithStats}. */
126
+ get projectsWithStats() {
127
+ return this.ProjectsWithStats;
128
+ }
129
+ /** @deprecated Use {@link ProjectsWithStats}. */
130
+ set projectsWithStats(value) {
131
+ this.ProjectsWithStats = value;
132
+ }
133
+ SelectedProject = null;
134
+ /** @deprecated Use {@link SelectedProject}. */
135
+ get selectedProject() {
136
+ return this.SelectedProject;
137
+ }
138
+ /** @deprecated Use {@link SelectedProject}. */
139
+ set selectedProject(value) {
140
+ this.SelectedProject = value;
141
+ }
53
142
  constructor(dialogService, mjDialogService, viewContainerRef) {
54
143
  super();
55
144
  this.dialogService = dialogService;
@@ -66,29 +155,33 @@ export class ProjectSelectorComponent extends BaseAngularComponent {
66
155
  const [projectsResult, conversationsResult] = await rv.RunViews([
67
156
  {
68
157
  EntityName: 'MJ: Projects',
69
- ExtraFilter: `EnvironmentID='${this.environmentId}' AND IsArchived=0`,
158
+ // Shared folders plus this user's own — the SAME rule the sidebar uses. Without
159
+ // it this modal listed every personal folder in the environment by name, which
160
+ // is the exposure OwnerUserID exists to close.
161
+ ExtraFilter: `EnvironmentID='${this.EnvironmentId}' AND IsArchived=0`
162
+ + ` AND ${BuildProjectVisibilityFilter(this.CurrentUser?.ID)}`,
70
163
  OrderBy: 'Name ASC',
71
164
  ResultType: 'entity_object'
72
165
  },
73
166
  {
74
167
  EntityName: 'MJ: Conversations',
75
- ExtraFilter: `EnvironmentID='${this.environmentId}'`,
168
+ ExtraFilter: `EnvironmentID='${this.EnvironmentId}'`,
76
169
  ResultType: 'entity_object'
77
170
  }
78
- ], this.currentUser);
171
+ ], this.CurrentUser);
79
172
  if (projectsResult.Success && conversationsResult.Success) {
80
173
  const projects = projectsResult.Results || [];
81
174
  const conversations = conversationsResult.Results || [];
82
175
  // Calculate conversation counts per project
83
176
  const conversationCounts = this.calculateConversationCounts(conversations);
84
177
  // Merge projects with stats
85
- this.projectsWithStats = projects.map(p => {
178
+ this.ProjectsWithStats = projects.map(p => {
86
179
  const projectWithStats = p;
87
180
  projectWithStats.conversationCount = conversationCounts.get(p.ID) || 0;
88
181
  return projectWithStats;
89
182
  });
90
- if (this.selectedProjectId) {
91
- this.selectedProject = this.projectsWithStats.find(p => UUIDsEqual(p.ID, this.selectedProjectId)) || null;
183
+ if (this.SelectedProjectId) {
184
+ this.SelectedProject = this.ProjectsWithStats.find(p => UUIDsEqual(p.ID, this.SelectedProjectId)) || null;
92
185
  }
93
186
  }
94
187
  }
@@ -105,15 +198,23 @@ export class ProjectSelectorComponent extends BaseAngularComponent {
105
198
  }
106
199
  return counts;
107
200
  }
201
+ OnProjectChange(project) {
202
+ this.SelectedProject = project;
203
+ this.ProjectSelected.emit(project);
204
+ }
205
+ /** @deprecated Use {@link OnProjectChange}. */
108
206
  onProjectChange(project) {
109
- this.selectedProject = project;
110
- this.projectSelected.emit(project);
207
+ return this.OnProjectChange(project);
111
208
  }
209
+ OnProjectSelectChange(projectId) {
210
+ const project = this.ProjectsWithStats.find(p => UUIDsEqual(p.ID, projectId)) || null;
211
+ this.OnProjectChange(project);
212
+ }
213
+ /** @deprecated Use {@link OnProjectSelectChange}. */
112
214
  onProjectSelectChange(projectId) {
113
- const project = this.projectsWithStats.find(p => UUIDsEqual(p.ID, projectId)) || null;
114
- this.onProjectChange(project);
215
+ return this.OnProjectSelectChange(projectId);
115
216
  }
116
- onCreateProject() {
217
+ OnCreateProject() {
117
218
  const dialogRef = this.mjDialogService.open({
118
219
  content: ProjectFormModalComponent,
119
220
  width: 600,
@@ -121,17 +222,21 @@ export class ProjectSelectorComponent extends BaseAngularComponent {
121
222
  });
122
223
  const modalInstance = dialogRef.Content.instance;
123
224
  modalInstance.dialogRef = dialogRef;
124
- modalInstance.environmentId = this.environmentId;
125
- modalInstance.currentUser = this.currentUser;
225
+ modalInstance.environmentId = this.EnvironmentId;
226
+ modalInstance.currentUser = this.CurrentUser;
126
227
  modalInstance.projectSaved.subscribe(async (project) => {
127
- this.projectCreated.emit(project);
228
+ this.ProjectCreated.emit(project);
128
229
  await this.loadProjects();
129
- this.selectedProject = project;
130
- this.projectSelected.emit(project);
230
+ this.SelectedProject = project;
231
+ this.ProjectSelected.emit(project);
131
232
  });
132
233
  }
133
- onEditProject() {
134
- if (!this.selectedProject)
234
+ /** @deprecated Use {@link OnCreateProject}. */
235
+ onCreateProject() {
236
+ return this.OnCreateProject();
237
+ }
238
+ OnEditProject() {
239
+ if (!this.SelectedProject)
135
240
  return;
136
241
  const dialogRef = this.mjDialogService.open({
137
242
  content: ProjectFormModalComponent,
@@ -140,22 +245,26 @@ export class ProjectSelectorComponent extends BaseAngularComponent {
140
245
  });
141
246
  const modalInstance = dialogRef.Content.instance;
142
247
  modalInstance.dialogRef = dialogRef;
143
- modalInstance.project = this.selectedProject;
144
- modalInstance.environmentId = this.environmentId;
145
- modalInstance.currentUser = this.currentUser;
248
+ modalInstance.project = this.SelectedProject;
249
+ modalInstance.environmentId = this.EnvironmentId;
250
+ modalInstance.currentUser = this.CurrentUser;
146
251
  modalInstance.projectSaved.subscribe(async (project) => {
147
- this.projectUpdated.emit(project);
252
+ this.ProjectUpdated.emit(project);
148
253
  await this.loadProjects();
149
- this.selectedProject = project;
150
- this.projectSelected.emit(project);
254
+ this.SelectedProject = project;
255
+ this.ProjectSelected.emit(project);
151
256
  });
152
257
  }
153
- async onDeleteProject() {
154
- if (!this.selectedProject)
258
+ /** @deprecated Use {@link OnEditProject}. */
259
+ onEditProject() {
260
+ return this.OnEditProject();
261
+ }
262
+ async OnDeleteProject() {
263
+ if (!this.SelectedProject)
155
264
  return;
156
- const projectName = this.selectedProject.Name;
157
- const projectId = this.selectedProject.ID;
158
- const conversationCount = this.selectedProject.conversationCount || 0;
265
+ const projectName = this.SelectedProject.Name;
266
+ const projectId = this.SelectedProject.ID;
267
+ const conversationCount = this.SelectedProject.conversationCount || 0;
159
268
  let message = `Are you sure you want to delete the project "${projectName}"?`;
160
269
  if (conversationCount > 0) {
161
270
  message += `\n\nThis project has ${conversationCount} conversation(s). The conversations will not be deleted, but will be unassigned from this project.`;
@@ -171,14 +280,14 @@ export class ProjectSelectorComponent extends BaseAngularComponent {
171
280
  return;
172
281
  try {
173
282
  const md = this.ProviderToUse;
174
- const project = await md.GetEntityObject('MJ: Projects', this.currentUser);
283
+ const project = await md.GetEntityObject('MJ: Projects', this.CurrentUser);
175
284
  await project.Load(projectId);
176
285
  const deleted = await project.Delete();
177
286
  if (deleted) {
178
- this.projectDeleted.emit(projectId);
287
+ this.ProjectDeleted.emit(projectId);
179
288
  await this.loadProjects();
180
- this.selectedProject = null;
181
- this.projectSelected.emit(null);
289
+ this.SelectedProject = null;
290
+ this.ProjectSelected.emit(null);
182
291
  }
183
292
  else {
184
293
  throw new Error('Delete operation returned false');
@@ -189,8 +298,12 @@ export class ProjectSelectorComponent extends BaseAngularComponent {
189
298
  await this.dialogService.alert('Error', 'Failed to delete project. Please try again.');
190
299
  }
191
300
  }
301
+ /** @deprecated Use {@link OnDeleteProject}. */
302
+ async onDeleteProject() {
303
+ return this.OnDeleteProject();
304
+ }
192
305
  static ɵfac = function ProjectSelectorComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ProjectSelectorComponent)(i0.ɵɵdirectiveInject(i1.DialogService), i0.ɵɵdirectiveInject(i2.MJDialogService), i0.ɵɵdirectiveInject(i0.ViewContainerRef)); };
193
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ProjectSelectorComponent, selectors: [["mj-project-selector"]], inputs: { environmentId: "environmentId", currentUser: "currentUser", selectedProjectId: "selectedProjectId", disabled: "disabled", showStats: "showStats" }, outputs: { projectSelected: "projectSelected", projectCreated: "projectCreated", projectUpdated: "projectUpdated", projectDeleted: "projectDeleted" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 10, vars: 4, consts: [[1, "project-selector"], [1, "mj-select", "project-dropdown", 3, "ngModelChange", "ngModel", "disabled"], ["value", "", "disabled", ""], [3, "value"], [1, "project-actions"], ["mjButton", "", "variant", "primary", "size", "sm", "title", "Create New Project", 3, "click", "disabled"], [1, "fa-solid", "fa-plus"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Edit Project", 3, "click", "disabled"], [1, "fa-solid", "fa-pen"], ["mjButton", "", "variant", "danger", "size", "sm", "title", "Delete Project", 3, "click", "disabled"], [1, "fa-solid", "fa-trash"]], template: function ProjectSelectorComponent_Template(rf, ctx) { if (rf & 1) {
306
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ProjectSelectorComponent, selectors: [["mj-project-selector"]], inputs: { EnvironmentId: "EnvironmentId", environmentId: "environmentId", CurrentUser: "CurrentUser", currentUser: "currentUser", SelectedProjectId: "SelectedProjectId", selectedProjectId: "selectedProjectId", Disabled: "Disabled", disabled: "disabled", ShowStats: "ShowStats", showStats: "showStats" }, outputs: { ProjectSelected: "ProjectSelected", projectSelected: "projectSelected", ProjectCreated: "ProjectCreated", projectCreated: "projectCreated", ProjectUpdated: "ProjectUpdated", projectUpdated: "projectUpdated", ProjectDeleted: "ProjectDeleted", projectDeleted: "projectDeleted" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 10, vars: 4, consts: [[1, "project-selector"], [1, "mj-select", "project-dropdown", 3, "ngModelChange", "ngModel", "disabled"], ["value", "", "disabled", ""], [3, "value"], [1, "project-actions"], ["mjButton", "", "variant", "primary", "size", "sm", "title", "Create New Project", 3, "click", "disabled"], [1, "fa-solid", "fa-plus"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Edit Project", 3, "click", "disabled"], [1, "fa-solid", "fa-pen"], ["mjButton", "", "variant", "danger", "size", "sm", "title", "Delete Project", 3, "click", "disabled"], [1, "fa-solid", "fa-trash"]], template: function ProjectSelectorComponent_Template(rf, ctx) { if (rf & 1) {
194
307
  i0.ɵɵelementStart(0, "div", 0)(1, "select", 1);
195
308
  i0.ɵɵlistener("ngModelChange", function ProjectSelectorComponent_Template_select_ngModelChange_1_listener($event) { return ctx.onProjectSelectChange($event); });
196
309
  i0.ɵɵelementStart(2, "option", 2);
@@ -260,22 +373,40 @@ export class ProjectSelectorComponent extends BaseAngularComponent {
260
373
  </div>
261
374
  </div>
262
375
  `, styles: ["\n .project-selector {\n display: flex;\n gap: 8px;\n align-items: center;\n }\n .project-dropdown {\n flex: 1;\n min-width: 200px;\n }\n .project-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n }\n .project-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n .project-name {\n font-weight: 500;\n color: #333;\n }\n .project-stats {\n font-size: 12px;\n color: #666;\n }\n .project-actions {\n display: flex;\n gap: 4px;\n }\n .btn-icon {\n min-width: auto;\n padding: 6px 8px;\n }\n .btn-danger:hover:not(:disabled) {\n background-color: #F44336;\n border-color: #F44336;\n color: white;\n }\n "] }]
263
- }], () => [{ type: i1.DialogService }, { type: i2.MJDialogService }, { type: i0.ViewContainerRef }], { environmentId: [{
376
+ }], () => [{ type: i1.DialogService }, { type: i2.MJDialogService }, { type: i0.ViewContainerRef }], { EnvironmentId: [{
377
+ type: Input
378
+ }], environmentId: [{
379
+ type: Input
380
+ }], CurrentUser: [{
264
381
  type: Input
265
382
  }], currentUser: [{
266
383
  type: Input
384
+ }], SelectedProjectId: [{
385
+ type: Input
267
386
  }], selectedProjectId: [{
268
387
  type: Input
388
+ }], Disabled: [{
389
+ type: Input
269
390
  }], disabled: [{
270
391
  type: Input
392
+ }], ShowStats: [{
393
+ type: Input
271
394
  }], showStats: [{
272
395
  type: Input
396
+ }], ProjectSelected: [{
397
+ type: Output
273
398
  }], projectSelected: [{
274
399
  type: Output
400
+ }], ProjectCreated: [{
401
+ type: Output
275
402
  }], projectCreated: [{
276
403
  type: Output
404
+ }], ProjectUpdated: [{
405
+ type: Output
277
406
  }], projectUpdated: [{
278
407
  type: Output
408
+ }], ProjectDeleted: [{
409
+ type: Output
279
410
  }], projectDeleted: [{
280
411
  type: Output
281
412
  }] }); })();