@memberjunction/ng-conversations 5.43.0 → 5.44.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 (351) hide show
  1. package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts +0 -1
  2. package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts.map +1 -1
  3. package/dist/lib/components/active-tasks/active-tasks-panel.component.js +56 -52
  4. package/dist/lib/components/active-tasks/active-tasks-panel.component.js.map +1 -1
  5. package/dist/lib/components/artifact/artifact-share-modal.component.js +37 -41
  6. package/dist/lib/components/artifact/artifact-share-modal.component.js.map +1 -1
  7. package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -1
  8. package/dist/lib/components/collection/collection-form-modal.component.js +10 -14
  9. package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -1
  10. package/dist/lib/components/collection/collection-share-modal.component.js +41 -45
  11. package/dist/lib/components/collection/collection-share-modal.component.js.map +1 -1
  12. package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
  13. package/dist/lib/components/collection/collection-view.component.js +22 -36
  14. package/dist/lib/components/collection/collection-view.component.js.map +1 -1
  15. package/dist/lib/components/collection/collections-full-view.component.d.ts +4 -0
  16. package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
  17. package/dist/lib/components/collection/collections-full-view.component.js +134 -166
  18. package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
  19. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +73 -8
  20. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  21. package/dist/lib/components/conversation/conversation-chat-area.component.js +487 -123
  22. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  23. package/dist/lib/components/conversation/pinned-messages-panel.component.js +6 -9
  24. package/dist/lib/components/conversation/pinned-messages-panel.component.js.map +1 -1
  25. package/dist/lib/components/library/library-full-view.component.d.ts.map +1 -1
  26. package/dist/lib/components/library/library-full-view.component.js +20 -24
  27. package/dist/lib/components/library/library-full-view.component.js.map +1 -1
  28. package/dist/lib/components/members/members-modal.component.d.ts.map +1 -1
  29. package/dist/lib/components/members/members-modal.component.js +10 -11
  30. package/dist/lib/components/members/members-modal.component.js.map +1 -1
  31. package/dist/lib/components/mention/mention-dropdown.component.js +49 -28
  32. package/dist/lib/components/mention/mention-dropdown.component.js.map +1 -1
  33. package/dist/lib/components/mention/mention-editor.component.d.ts.map +1 -1
  34. package/dist/lib/components/mention/mention-editor.component.js +24 -10
  35. package/dist/lib/components/mention/mention-editor.component.js.map +1 -1
  36. package/dist/lib/components/message/message-input-box.component.d.ts +11 -16
  37. package/dist/lib/components/message/message-input-box.component.d.ts.map +1 -1
  38. package/dist/lib/components/message/message-input-box.component.js +52 -46
  39. package/dist/lib/components/message/message-input-box.component.js.map +1 -1
  40. package/dist/lib/components/message/message-input.component.d.ts +83 -18
  41. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  42. package/dist/lib/components/message/message-input.component.js +238 -151
  43. package/dist/lib/components/message/message-input.component.js.map +1 -1
  44. package/dist/lib/components/message/message-item.component.d.ts +10 -1
  45. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  46. package/dist/lib/components/message/message-item.component.js +67 -15
  47. package/dist/lib/components/message/message-item.component.js.map +1 -1
  48. package/dist/lib/components/message/message-list.component.js +6 -9
  49. package/dist/lib/components/message/message-list.component.js.map +1 -1
  50. package/dist/lib/components/overlay/chat-overlay.component.d.ts +3 -0
  51. package/dist/lib/components/overlay/chat-overlay.component.d.ts.map +1 -1
  52. package/dist/lib/components/overlay/chat-overlay.component.js +9 -4
  53. package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
  54. package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts +45 -0
  55. package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts.map +1 -1
  56. package/dist/lib/components/realtime/channels/base-realtime-channel-client.js +10 -0
  57. package/dist/lib/components/realtime/channels/base-realtime-channel-client.js.map +1 -1
  58. package/dist/lib/components/realtime/channels/client-context-channel.d.ts +46 -0
  59. package/dist/lib/components/realtime/channels/client-context-channel.d.ts.map +1 -0
  60. package/dist/lib/components/realtime/channels/client-context-channel.js +174 -0
  61. package/dist/lib/components/realtime/channels/client-context-channel.js.map +1 -0
  62. package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.d.ts +123 -0
  63. package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.d.ts.map +1 -0
  64. package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.js +397 -0
  65. package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.js.map +1 -0
  66. package/dist/lib/components/realtime/media/media-channel-state.d.ts +103 -0
  67. package/dist/lib/components/realtime/media/media-channel-state.d.ts.map +1 -0
  68. package/dist/lib/components/realtime/media/media-channel-state.js +143 -0
  69. package/dist/lib/components/realtime/media/media-channel-state.js.map +1 -0
  70. package/dist/lib/components/realtime/media/media-channel-tools.d.ts +24 -0
  71. package/dist/lib/components/realtime/media/media-channel-tools.d.ts.map +1 -0
  72. package/dist/lib/components/realtime/media/media-channel-tools.js +107 -0
  73. package/dist/lib/components/realtime/media/media-channel-tools.js.map +1 -0
  74. package/dist/lib/components/realtime/media/media-channel.d.ts +89 -0
  75. package/dist/lib/components/realtime/media/media-channel.d.ts.map +1 -0
  76. package/dist/lib/components/realtime/media/media-channel.js +253 -0
  77. package/dist/lib/components/realtime/media/media-channel.js.map +1 -0
  78. package/dist/lib/components/realtime/media/realtime-media-surface.component.d.ts +141 -0
  79. package/dist/lib/components/realtime/media/realtime-media-surface.component.d.ts.map +1 -0
  80. package/dist/lib/components/realtime/media/realtime-media-surface.component.js +574 -0
  81. package/dist/lib/components/realtime/media/realtime-media-surface.component.js.map +1 -0
  82. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts +59 -14
  83. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts.map +1 -1
  84. package/dist/lib/components/realtime/realtime-activity-rail.component.js +277 -74
  85. package/dist/lib/components/realtime/realtime-activity-rail.component.js.map +1 -1
  86. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts +28 -27
  87. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts.map +1 -1
  88. package/dist/lib/components/realtime/realtime-agent-banner.component.js +144 -143
  89. package/dist/lib/components/realtime/realtime-agent-banner.component.js.map +1 -1
  90. package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts +12 -0
  91. package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts.map +1 -1
  92. package/dist/lib/components/realtime/realtime-agent-picker.component.js +105 -43
  93. package/dist/lib/components/realtime/realtime-agent-picker.component.js.map +1 -1
  94. package/dist/lib/components/realtime/realtime-audio-visuals.d.ts +2 -2
  95. package/dist/lib/components/realtime/realtime-audio-visuals.d.ts.map +1 -1
  96. package/dist/lib/components/realtime/realtime-audio-visuals.js.map +1 -1
  97. package/dist/lib/components/realtime/realtime-composer.component.d.ts +41 -7
  98. package/dist/lib/components/realtime/realtime-composer.component.d.ts.map +1 -1
  99. package/dist/lib/components/realtime/realtime-composer.component.js +216 -102
  100. package/dist/lib/components/realtime/realtime-composer.component.js.map +1 -1
  101. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts +0 -2
  102. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts.map +1 -1
  103. package/dist/lib/components/realtime/realtime-delegation-card.component.js +67 -71
  104. package/dist/lib/components/realtime/realtime-delegation-card.component.js.map +1 -1
  105. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +364 -44
  106. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts.map +1 -1
  107. package/dist/lib/components/realtime/realtime-session-overlay.component.js +839 -153
  108. package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
  109. package/dist/lib/components/realtime/realtime-session-state.d.ts +5 -5
  110. package/dist/lib/components/realtime/realtime-session-state.d.ts.map +1 -1
  111. package/dist/lib/components/realtime/realtime-session-state.js.map +1 -1
  112. package/dist/lib/components/realtime/realtime-surface-tab-style.d.ts +70 -0
  113. package/dist/lib/components/realtime/realtime-surface-tab-style.d.ts.map +1 -0
  114. package/dist/lib/components/realtime/realtime-surface-tab-style.js +115 -0
  115. package/dist/lib/components/realtime/realtime-surface-tab-style.js.map +1 -0
  116. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +55 -57
  117. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts.map +1 -1
  118. package/dist/lib/components/realtime/realtime-surface-tabs.component.js +165 -143
  119. package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -1
  120. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +80 -71
  121. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts.map +1 -1
  122. package/dist/lib/components/realtime/realtime-surface-tabs.model.js +83 -113
  123. package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -1
  124. package/dist/lib/components/realtime/realtime-ui-config.d.ts +270 -0
  125. package/dist/lib/components/realtime/realtime-ui-config.d.ts.map +1 -0
  126. package/dist/lib/components/realtime/realtime-ui-config.js +212 -0
  127. package/dist/lib/components/realtime/realtime-ui-config.js.map +1 -0
  128. package/dist/lib/components/search/search-panel.component.d.ts +2 -0
  129. package/dist/lib/components/search/search-panel.component.d.ts.map +1 -1
  130. package/dist/lib/components/search/search-panel.component.js +92 -101
  131. package/dist/lib/components/search/search-panel.component.js.map +1 -1
  132. package/dist/lib/components/share/share-modal.component.d.ts.map +1 -1
  133. package/dist/lib/components/share/share-modal.component.js +10 -11
  134. package/dist/lib/components/share/share-modal.component.js.map +1 -1
  135. package/dist/lib/components/shared/user-picker.component.d.ts.map +1 -1
  136. package/dist/lib/components/shared/user-picker.component.js +12 -15
  137. package/dist/lib/components/shared/user-picker.component.js.map +1 -1
  138. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +5 -0
  139. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  140. package/dist/lib/components/workspace/conversation-workspace.component.js +18 -7
  141. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  142. package/dist/lib/conversations.module.d.ts +29 -26
  143. package/dist/lib/conversations.module.d.ts.map +1 -1
  144. package/dist/lib/conversations.module.js +37 -6
  145. package/dist/lib/conversations.module.js.map +1 -1
  146. package/dist/lib/models/conversation-state.model.d.ts +6 -3
  147. package/dist/lib/models/conversation-state.model.d.ts.map +1 -1
  148. package/dist/lib/models/conversation-state.model.js.map +1 -1
  149. package/dist/lib/services/conversation-agent.service.d.ts +2 -2
  150. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  151. package/dist/lib/services/conversation-agent.service.js +6 -2
  152. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  153. package/dist/lib/services/mention-autocomplete.service.d.ts +17 -1
  154. package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -1
  155. package/dist/lib/services/mention-autocomplete.service.js +58 -2
  156. package/dist/lib/services/mention-autocomplete.service.js.map +1 -1
  157. package/dist/lib/services/realtime-audio-recorder.d.ts +143 -0
  158. package/dist/lib/services/realtime-audio-recorder.d.ts.map +1 -0
  159. package/dist/lib/services/realtime-audio-recorder.js +379 -0
  160. package/dist/lib/services/realtime-audio-recorder.js.map +1 -0
  161. package/dist/lib/services/realtime-pcm-wav.d.ts +75 -0
  162. package/dist/lib/services/realtime-pcm-wav.d.ts.map +1 -0
  163. package/dist/lib/services/realtime-pcm-wav.js +205 -0
  164. package/dist/lib/services/realtime-pcm-wav.js.map +1 -0
  165. package/dist/lib/services/realtime-session-review.service.d.ts +28 -1
  166. package/dist/lib/services/realtime-session-review.service.d.ts.map +1 -1
  167. package/dist/lib/services/realtime-session-review.service.js +12 -3
  168. package/dist/lib/services/realtime-session-review.service.js.map +1 -1
  169. package/dist/lib/services/realtime-session.service.d.ts +210 -20
  170. package/dist/lib/services/realtime-session.service.d.ts.map +1 -1
  171. package/dist/lib/services/realtime-session.service.js +452 -21
  172. package/dist/lib/services/realtime-session.service.js.map +1 -1
  173. package/dist/lib/services/realtime-sessions-adapter.js +1 -1
  174. package/dist/lib/services/realtime-sessions-adapter.js.map +1 -1
  175. package/dist/lib/services/ui-command-handler.service.d.ts +7 -2
  176. package/dist/lib/services/ui-command-handler.service.d.ts.map +1 -1
  177. package/dist/lib/services/ui-command-handler.service.js +6 -2
  178. package/dist/lib/services/ui-command-handler.service.js.map +1 -1
  179. package/dist/lib/utils/plan-mode-preference.d.ts +62 -0
  180. package/dist/lib/utils/plan-mode-preference.d.ts.map +1 -0
  181. package/dist/lib/utils/plan-mode-preference.js +130 -0
  182. package/dist/lib/utils/plan-mode-preference.js.map +1 -0
  183. package/dist/public-api.d.ts +6 -0
  184. package/dist/public-api.d.ts.map +1 -1
  185. package/dist/public-api.js +8 -0
  186. package/dist/public-api.js.map +1 -1
  187. package/package.json +28 -26
  188. package/dist/__tests__/attachment-badge.test.d.ts +0 -2
  189. package/dist/__tests__/attachment-badge.test.d.ts.map +0 -1
  190. package/dist/__tests__/attachment-badge.test.js +0 -66
  191. package/dist/__tests__/attachment-badge.test.js.map +0 -1
  192. package/dist/__tests__/channel-optional-surface.test.d.ts +0 -2
  193. package/dist/__tests__/channel-optional-surface.test.d.ts.map +0 -1
  194. package/dist/__tests__/channel-optional-surface.test.js +0 -53
  195. package/dist/__tests__/channel-optional-surface.test.js.map +0 -1
  196. package/dist/__tests__/chat-events.test.d.ts +0 -14
  197. package/dist/__tests__/chat-events.test.d.ts.map +0 -1
  198. package/dist/__tests__/chat-events.test.js +0 -109
  199. package/dist/__tests__/chat-events.test.js.map +0 -1
  200. package/dist/__tests__/collections-full-view.test.d.ts +0 -2
  201. package/dist/__tests__/collections-full-view.test.d.ts.map +0 -1
  202. package/dist/__tests__/collections-full-view.test.js +0 -225
  203. package/dist/__tests__/collections-full-view.test.js.map +0 -1
  204. package/dist/__tests__/conversation-cache.test.d.ts +0 -2
  205. package/dist/__tests__/conversation-cache.test.d.ts.map +0 -1
  206. package/dist/__tests__/conversation-cache.test.js +0 -233
  207. package/dist/__tests__/conversation-cache.test.js.map +0 -1
  208. package/dist/__tests__/conversation-naming.test.d.ts +0 -2
  209. package/dist/__tests__/conversation-naming.test.d.ts.map +0 -1
  210. package/dist/__tests__/conversation-naming.test.js +0 -110
  211. package/dist/__tests__/conversation-naming.test.js.map +0 -1
  212. package/dist/__tests__/delegation-result-parser.test.d.ts +0 -2
  213. package/dist/__tests__/delegation-result-parser.test.d.ts.map +0 -1
  214. package/dist/__tests__/delegation-result-parser.test.js +0 -107
  215. package/dist/__tests__/delegation-result-parser.test.js.map +0 -1
  216. package/dist/__tests__/distinct-artifacts.test.d.ts +0 -2
  217. package/dist/__tests__/distinct-artifacts.test.d.ts.map +0 -1
  218. package/dist/__tests__/distinct-artifacts.test.js +0 -56
  219. package/dist/__tests__/distinct-artifacts.test.js.map +0 -1
  220. package/dist/__tests__/event-wiring.test.d.ts +0 -15
  221. package/dist/__tests__/event-wiring.test.d.ts.map +0 -1
  222. package/dist/__tests__/event-wiring.test.js +0 -100
  223. package/dist/__tests__/event-wiring.test.js.map +0 -1
  224. package/dist/__tests__/index.test.d.ts +0 -2
  225. package/dist/__tests__/index.test.d.ts.map +0 -1
  226. package/dist/__tests__/index.test.js +0 -7
  227. package/dist/__tests__/index.test.js.map +0 -1
  228. package/dist/__tests__/narration-template.test.d.ts +0 -2
  229. package/dist/__tests__/narration-template.test.d.ts.map +0 -1
  230. package/dist/__tests__/narration-template.test.js +0 -76
  231. package/dist/__tests__/narration-template.test.js.map +0 -1
  232. package/dist/__tests__/notification-model.test.d.ts +0 -2
  233. package/dist/__tests__/notification-model.test.d.ts.map +0 -1
  234. package/dist/__tests__/notification-model.test.js +0 -68
  235. package/dist/__tests__/notification-model.test.js.map +0 -1
  236. package/dist/__tests__/realtime-agent-picker-models.test.d.ts +0 -2
  237. package/dist/__tests__/realtime-agent-picker-models.test.d.ts.map +0 -1
  238. package/dist/__tests__/realtime-agent-picker-models.test.js +0 -49
  239. package/dist/__tests__/realtime-agent-picker-models.test.js.map +0 -1
  240. package/dist/__tests__/realtime-audio-visuals.test.d.ts +0 -2
  241. package/dist/__tests__/realtime-audio-visuals.test.d.ts.map +0 -1
  242. package/dist/__tests__/realtime-audio-visuals.test.js +0 -123
  243. package/dist/__tests__/realtime-audio-visuals.test.js.map +0 -1
  244. package/dist/__tests__/realtime-delegation-card-cancel.test.d.ts +0 -2
  245. package/dist/__tests__/realtime-delegation-card-cancel.test.d.ts.map +0 -1
  246. package/dist/__tests__/realtime-delegation-card-cancel.test.js +0 -48
  247. package/dist/__tests__/realtime-delegation-card-cancel.test.js.map +0 -1
  248. package/dist/__tests__/realtime-disclosure.test.d.ts +0 -2
  249. package/dist/__tests__/realtime-disclosure.test.d.ts.map +0 -1
  250. package/dist/__tests__/realtime-disclosure.test.js +0 -164
  251. package/dist/__tests__/realtime-disclosure.test.js.map +0 -1
  252. package/dist/__tests__/realtime-pairing.test.d.ts +0 -2
  253. package/dist/__tests__/realtime-pairing.test.d.ts.map +0 -1
  254. package/dist/__tests__/realtime-pairing.test.js +0 -207
  255. package/dist/__tests__/realtime-pairing.test.js.map +0 -1
  256. package/dist/__tests__/realtime-review-lifecycle.test.d.ts +0 -2
  257. package/dist/__tests__/realtime-review-lifecycle.test.d.ts.map +0 -1
  258. package/dist/__tests__/realtime-review-lifecycle.test.js +0 -154
  259. package/dist/__tests__/realtime-review-lifecycle.test.js.map +0 -1
  260. package/dist/__tests__/realtime-session-cancel-usage.test.d.ts +0 -2
  261. package/dist/__tests__/realtime-session-cancel-usage.test.d.ts.map +0 -1
  262. package/dist/__tests__/realtime-session-cancel-usage.test.js +0 -230
  263. package/dist/__tests__/realtime-session-cancel-usage.test.js.map +0 -1
  264. package/dist/__tests__/realtime-session-channels.test.d.ts +0 -2
  265. package/dist/__tests__/realtime-session-channels.test.d.ts.map +0 -1
  266. package/dist/__tests__/realtime-session-channels.test.js +0 -252
  267. package/dist/__tests__/realtime-session-channels.test.js.map +0 -1
  268. package/dist/__tests__/realtime-session-client-tools.test.d.ts +0 -2
  269. package/dist/__tests__/realtime-session-client-tools.test.d.ts.map +0 -1
  270. package/dist/__tests__/realtime-session-client-tools.test.js +0 -103
  271. package/dist/__tests__/realtime-session-client-tools.test.js.map +0 -1
  272. package/dist/__tests__/realtime-session-minimized.test.d.ts +0 -2
  273. package/dist/__tests__/realtime-session-minimized.test.d.ts.map +0 -1
  274. package/dist/__tests__/realtime-session-minimized.test.js +0 -32
  275. package/dist/__tests__/realtime-session-minimized.test.js.map +0 -1
  276. package/dist/__tests__/realtime-session-mint.test.d.ts +0 -2
  277. package/dist/__tests__/realtime-session-mint.test.d.ts.map +0 -1
  278. package/dist/__tests__/realtime-session-mint.test.js +0 -69
  279. package/dist/__tests__/realtime-session-mint.test.js.map +0 -1
  280. package/dist/__tests__/realtime-session-policy.test.d.ts +0 -2
  281. package/dist/__tests__/realtime-session-policy.test.d.ts.map +0 -1
  282. package/dist/__tests__/realtime-session-policy.test.js +0 -303
  283. package/dist/__tests__/realtime-session-policy.test.js.map +0 -1
  284. package/dist/__tests__/realtime-session-review.service.test.d.ts +0 -2
  285. package/dist/__tests__/realtime-session-review.service.test.d.ts.map +0 -1
  286. package/dist/__tests__/realtime-session-review.service.test.js +0 -743
  287. package/dist/__tests__/realtime-session-review.service.test.js.map +0 -1
  288. package/dist/__tests__/realtime-session-state.test.d.ts +0 -2
  289. package/dist/__tests__/realtime-session-state.test.d.ts.map +0 -1
  290. package/dist/__tests__/realtime-session-state.test.js +0 -83
  291. package/dist/__tests__/realtime-session-state.test.js.map +0 -1
  292. package/dist/__tests__/realtime-session-timeline-card.test.d.ts +0 -2
  293. package/dist/__tests__/realtime-session-timeline-card.test.d.ts.map +0 -1
  294. package/dist/__tests__/realtime-session-timeline-card.test.js +0 -106
  295. package/dist/__tests__/realtime-session-timeline-card.test.js.map +0 -1
  296. package/dist/__tests__/realtime-session-timeline.test.d.ts +0 -2
  297. package/dist/__tests__/realtime-session-timeline.test.d.ts.map +0 -1
  298. package/dist/__tests__/realtime-session-timeline.test.js +0 -142
  299. package/dist/__tests__/realtime-session-timeline.test.js.map +0 -1
  300. package/dist/__tests__/realtime-sessions-adapter.test.d.ts +0 -19
  301. package/dist/__tests__/realtime-sessions-adapter.test.d.ts.map +0 -1
  302. package/dist/__tests__/realtime-sessions-adapter.test.js +0 -188
  303. package/dist/__tests__/realtime-sessions-adapter.test.js.map +0 -1
  304. package/dist/__tests__/realtime-surface-panel-prefs.test.d.ts +0 -2
  305. package/dist/__tests__/realtime-surface-panel-prefs.test.d.ts.map +0 -1
  306. package/dist/__tests__/realtime-surface-panel-prefs.test.js +0 -100
  307. package/dist/__tests__/realtime-surface-panel-prefs.test.js.map +0 -1
  308. package/dist/__tests__/realtime-surface-tabs-model.test.d.ts +0 -2
  309. package/dist/__tests__/realtime-surface-tabs-model.test.d.ts.map +0 -1
  310. package/dist/__tests__/realtime-surface-tabs-model.test.js +0 -193
  311. package/dist/__tests__/realtime-surface-tabs-model.test.js.map +0 -1
  312. package/dist/__tests__/remote-browser-audio-player.test.d.ts +0 -2
  313. package/dist/__tests__/remote-browser-audio-player.test.d.ts.map +0 -1
  314. package/dist/__tests__/remote-browser-audio-player.test.js +0 -137
  315. package/dist/__tests__/remote-browser-audio-player.test.js.map +0 -1
  316. package/dist/__tests__/remote-browser-channel.test.d.ts +0 -2
  317. package/dist/__tests__/remote-browser-channel.test.d.ts.map +0 -1
  318. package/dist/__tests__/remote-browser-channel.test.js +0 -585
  319. package/dist/__tests__/remote-browser-channel.test.js.map +0 -1
  320. package/dist/__tests__/search-service.test.d.ts +0 -2
  321. package/dist/__tests__/search-service.test.d.ts.map +0 -1
  322. package/dist/__tests__/search-service.test.js +0 -114
  323. package/dist/__tests__/search-service.test.js.map +0 -1
  324. package/dist/__tests__/slot-defaults.test.d.ts +0 -24
  325. package/dist/__tests__/slot-defaults.test.d.ts.map +0 -1
  326. package/dist/__tests__/slot-defaults.test.js +0 -63
  327. package/dist/__tests__/slot-defaults.test.js.map +0 -1
  328. package/dist/__tests__/toast-service.test.d.ts +0 -2
  329. package/dist/__tests__/toast-service.test.d.ts.map +0 -1
  330. package/dist/__tests__/toast-service.test.js +0 -143
  331. package/dist/__tests__/toast-service.test.js.map +0 -1
  332. package/dist/__tests__/user-authorization.test.d.ts +0 -2
  333. package/dist/__tests__/user-authorization.test.d.ts.map +0 -1
  334. package/dist/__tests__/user-authorization.test.js +0 -97
  335. package/dist/__tests__/user-authorization.test.js.map +0 -1
  336. package/dist/__tests__/voice-session-narration.test.d.ts +0 -2
  337. package/dist/__tests__/voice-session-narration.test.d.ts.map +0 -1
  338. package/dist/__tests__/voice-session-narration.test.js +0 -609
  339. package/dist/__tests__/voice-session-narration.test.js.map +0 -1
  340. package/dist/__tests__/whiteboard-artifact-viewer.test.d.ts +0 -2
  341. package/dist/__tests__/whiteboard-artifact-viewer.test.d.ts.map +0 -1
  342. package/dist/__tests__/whiteboard-artifact-viewer.test.js +0 -101
  343. package/dist/__tests__/whiteboard-artifact-viewer.test.js.map +0 -1
  344. package/dist/__tests__/whiteboard-channel.test.d.ts +0 -2
  345. package/dist/__tests__/whiteboard-channel.test.d.ts.map +0 -1
  346. package/dist/__tests__/whiteboard-channel.test.js +0 -260
  347. package/dist/__tests__/whiteboard-channel.test.js.map +0 -1
  348. package/dist/__tests__/whiteboard-restore-state.test.d.ts +0 -2
  349. package/dist/__tests__/whiteboard-restore-state.test.d.ts.map +0 -1
  350. package/dist/__tests__/whiteboard-restore-state.test.js +0 -108
  351. package/dist/__tests__/whiteboard-restore-state.test.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"search-panel.component.js","sourceRoot":"","sources":["../../../../src/lib/components/search/search-panel.component.ts","../../../../src/lib/components/search/search-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n OnInit,\n OnDestroy,\n Output,\n EventEmitter,\n Input,\n HostListener,\n ViewChild,\n ElementRef\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { UserInfo } from '@memberjunction/core';\nimport { HighlightSearchMatches } from '@memberjunction/global';\nimport {\n SearchService,\n SearchResult,\n SearchFilter,\n GroupedSearchResults,\n DateRange\n} from '../../services/search.service';\n\n/**\n * Search panel component providing global search UI\n * Can be displayed as a modal or slide-out panel\n * Supports filtering, date ranges, and result navigation\n */\n@Component({\n standalone: false,\n selector: 'mj-search-panel',\n templateUrl: './search-panel.component.html',\n styleUrls: ['./search-panel.component.css']\n})\nexport class SearchPanelComponent implements OnInit, OnDestroy {\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n @Input() isOpen: boolean = false;\n\n @Output() close = new EventEmitter<void>();\n @Output() resultSelected = new EventEmitter<SearchResult>();\n\n @ViewChild('searchInput') searchInput?: ElementRef<HTMLInputElement>;\n\n public searchQuery: string = '';\n public activeFilter: SearchFilter = 'all';\n public dateRange: DateRange = { start: null, end: null };\n public isSearching: boolean = false;\n public results: GroupedSearchResults = {\n conversations: [],\n messages: [],\n artifacts: [],\n collections: [],\n tasks: [],\n total: 0\n };\n public recentSearches: string[] = [];\n public selectedIndex: number = -1;\n\n private destroy$ = new Subject<void>();\n\n constructor(private searchService: SearchService) {}\n\n ngOnInit(): void {\n this.subscribeToSearchState();\n this.loadRecentSearches();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Subscribe to search service state\n */\n private subscribeToSearchState(): void {\n this.searchService.isSearching$\n .pipe(takeUntil(this.destroy$))\n .subscribe(isSearching => {\n this.isSearching = isSearching;\n });\n\n this.searchService.searchResults$\n .pipe(takeUntil(this.destroy$))\n .subscribe(results => {\n this.results = results;\n this.selectedIndex = -1;\n });\n\n this.searchService.searchFilter$\n .pipe(takeUntil(this.destroy$))\n .subscribe(filter => {\n this.activeFilter = filter;\n });\n\n this.searchService.dateRange$\n .pipe(takeUntil(this.destroy$))\n .subscribe(range => {\n this.dateRange = range;\n });\n }\n\n /**\n * Load recent searches\n */\n private loadRecentSearches(): void {\n this.recentSearches = this.searchService.getRecentSearches();\n }\n\n /**\n * Handle search input\n */\n public onSearchInput(): void {\n if (this.searchQuery.trim()) {\n this.performSearch();\n } else {\n this.searchService.clearResults();\n }\n }\n\n /**\n * Perform search\n */\n private async performSearch(): Promise<void> {\n await this.searchService.search(\n this.searchQuery,\n this.environmentId,\n this.currentUser\n );\n }\n\n /**\n * Set search filter\n */\n public setFilter(filter: SearchFilter): void {\n this.searchService.setSearchFilter(filter);\n if (this.searchQuery.trim()) {\n this.performSearch();\n }\n }\n\n /**\n * Clear search\n */\n public clearSearch(): void {\n this.searchQuery = '';\n this.searchService.clearResults();\n this.focusSearchInput();\n }\n\n /**\n * Select a result\n */\n public selectResult(result: SearchResult): void {\n this.resultSelected.emit(result);\n this.closePanel();\n }\n\n /**\n * Use recent search\n */\n public useRecentSearch(query: string): void {\n this.searchQuery = query;\n this.performSearch();\n }\n\n /**\n * Clear recent searches\n */\n public clearRecentSearches(): void {\n this.searchService.clearRecentSearches();\n this.recentSearches = [];\n }\n\n /**\n * Close panel\n */\n public closePanel(): void {\n this.close.emit();\n }\n\n /**\n * Focus search input\n */\n private focusSearchInput(): void {\n setTimeout(() => {\n this.searchInput?.nativeElement.focus();\n }, 0);\n }\n\n /**\n * Handle keyboard navigation\n */\n @HostListener('keydown', ['$event'])\n public handleKeyboard(event: KeyboardEvent): void {\n if (!this.isOpen) return;\n\n const allResults = this.getAllResultsFlat();\n\n switch (event.key) {\n case 'Escape':\n event.preventDefault();\n this.closePanel();\n break;\n\n case 'ArrowDown':\n event.preventDefault();\n if (allResults.length > 0) {\n this.selectedIndex = Math.min(this.selectedIndex + 1, allResults.length - 1);\n }\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n if (this.selectedIndex > 0) {\n this.selectedIndex--;\n } else {\n this.selectedIndex = -1;\n }\n break;\n\n case 'Enter':\n event.preventDefault();\n if (this.selectedIndex >= 0 && allResults[this.selectedIndex]) {\n this.selectResult(allResults[this.selectedIndex]);\n }\n break;\n }\n }\n\n /**\n * Get all results as flat array\n */\n private getAllResultsFlat(): SearchResult[] {\n return [\n ...this.results.conversations,\n ...this.results.messages,\n ...this.results.artifacts,\n ...this.results.collections,\n ...this.results.tasks\n ];\n }\n\n /**\n * Check if result is selected\n */\n public isResultSelected(result: SearchResult): boolean {\n const allResults = this.getAllResultsFlat();\n const index = allResults.findIndex(r => r.id === result.id && r.type === result.type);\n return index === this.selectedIndex;\n }\n\n /**\n * Get icon for result type\n */\n public getResultIcon(type: string): string {\n switch (type) {\n case 'conversation':\n return 'fa-comments';\n case 'message':\n return 'fa-comment';\n case 'artifact':\n return 'fa-file-alt';\n case 'collection':\n return 'fa-folder';\n case 'task':\n return 'fa-tasks';\n default:\n return 'fa-circle';\n }\n }\n\n /**\n * Get filter display text\n */\n public getFilterText(filter: SearchFilter): string {\n switch (filter) {\n case 'all':\n return 'All';\n case 'conversations':\n return 'Conversations';\n case 'messages':\n return 'Messages';\n case 'artifacts':\n return 'Artifacts';\n case 'collections':\n return 'Collections';\n case 'tasks':\n return 'Tasks';\n default:\n return 'All';\n }\n }\n\n /**\n * Format date for display\n */\n public formatDate(date: Date): string {\n const now = new Date();\n const diff = now.getTime() - new Date(date).getTime();\n const days = Math.floor(diff / (1000 * 60 * 60 * 24));\n\n if (days === 0) return 'Today';\n if (days === 1) return 'Yesterday';\n if (days < 7) return `${days} days ago`;\n if (days < 30) return `${Math.floor(days / 7)} weeks ago`;\n if (days < 365) return `${Math.floor(days / 30)} months ago`;\n return `${Math.floor(days / 365)} years ago`;\n }\n\n /** Highlight matched text in result. Output is bound to `[innerHTML]` in the template. */\n public highlightMatch(text: string, query: string): string {\n return HighlightSearchMatches(text, query);\n }\n\n /**\n * Handle date range change\n */\n public onDateRangeChange(): void {\n this.searchService.setDateRange(this.dateRange);\n if (this.searchQuery.trim()) {\n this.performSearch();\n }\n }\n\n /**\n * Clear date range\n */\n public clearDateRange(): void {\n this.dateRange = { start: null, end: null };\n this.searchService.setDateRange({ start: null, end: null });\n if (this.searchQuery.trim()) {\n this.performSearch();\n }\n }\n\n /**\n * Watch for panel open state changes\n */\n ngOnChanges(): void {\n if (this.isOpen) {\n this.focusSearchInput();\n }\n }\n}\n","@if (isOpen) {\n<div class=\"search-panel-overlay\" (click)=\"closePanel()\">\n <div class=\"search-panel\" (click)=\"$event.stopPropagation()\">\n <!-- Search Header -->\n <div class=\"search-header\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input\n #searchInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"Search conversations, messages, artifacts, collections, and tasks...\"\n [(ngModel)]=\"searchQuery\"\n (input)=\"onSearchInput()\"\n autocomplete=\"off\"\n />\n @if (searchQuery) {\n <button\n type=\"button\"\n class=\"clear-button\"\n (click)=\"clearSearch()\"\n title=\"Clear search\"\n >\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"close-button\"\n (click)=\"closePanel()\"\n title=\"Close (Esc)\"\n >\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Filters -->\n <div class=\"search-filters\">\n <div class=\"filter-buttons\">\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'all'\"\n (click)=\"setFilter('all')\"\n >\n All\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'conversations'\"\n (click)=\"setFilter('conversations')\"\n >\n <i class=\"fa-solid fa-comments\"></i>\n Conversations\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'messages'\"\n (click)=\"setFilter('messages')\"\n >\n <i class=\"fa-solid fa-comment\"></i>\n Messages\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'artifacts'\"\n (click)=\"setFilter('artifacts')\"\n >\n <i class=\"fa-solid fa-file-alt\"></i>\n Artifacts\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'collections'\"\n (click)=\"setFilter('collections')\"\n >\n <i class=\"fa-solid fa-folder\"></i>\n Collections\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'tasks'\"\n (click)=\"setFilter('tasks')\"\n >\n <i class=\"fa-solid fa-tasks\"></i>\n Tasks\n </button>\n </div>\n\n <!-- Date Range Filter -->\n <div class=\"date-filter\">\n <mj-datepicker\n [(ngModel)]=\"dateRange.start\"\n (ngModelChange)=\"onDateRangeChange()\"\n Placeholder=\"From\"\n ></mj-datepicker>\n <mj-datepicker\n [(ngModel)]=\"dateRange.end\"\n (ngModelChange)=\"onDateRangeChange()\"\n Placeholder=\"To\"\n ></mj-datepicker>\n @if (dateRange.start || dateRange.end) {\n <button\n type=\"button\"\n class=\"clear-date-button\"\n (click)=\"clearDateRange()\"\n title=\"Clear date range\"\n >\n <i class=\"fa-solid fa-times-circle\"></i>\n </button>\n }\n </div>\n </div>\n\n <!-- Search Results -->\n <div class=\"search-results\">\n @if (isSearching) {\n <div class=\"search-loading\">\n <mj-loading text=\"Searching...\" size=\"medium\"></mj-loading>\n </div>\n } @else if (!searchQuery) {\n <!-- Recent Searches -->\n @if (recentSearches.length > 0) {\n <div class=\"recent-searches\">\n <div class=\"recent-searches-header\">\n <h3>Recent Searches</h3>\n <button\n type=\"button\"\n class=\"clear-recent-button\"\n (click)=\"clearRecentSearches()\"\n title=\"Clear recent searches\"\n >\n Clear\n </button>\n </div>\n <div class=\"recent-searches-list\">\n @for (search of recentSearches; track search) {\n <button\n type=\"button\"\n class=\"recent-search-item\"\n (click)=\"useRecentSearch(search)\"\n >\n <i class=\"fa-solid fa-history\"></i>\n <span>{{ search }}</span>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Empty State -->\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-search empty-icon\"></i>\n <p>Search across all your conversations, messages, artifacts, collections, and tasks</p>\n <div class=\"search-tips\">\n <h4>Tips:</h4>\n <ul>\n <li>Use filters to narrow results</li>\n <li>Set date range to find recent content</li>\n <li>Use keyboard shortcuts to navigate</li>\n </ul>\n </div>\n </div>\n } @else if (results.total === 0) {\n <!-- No Results -->\n <div class=\"no-results\">\n <i class=\"fa-solid fa-search-minus empty-icon\"></i>\n <p>No results found for \"{{ searchQuery }}\"</p>\n <p class=\"no-results-hint\">Try adjusting your filters or search terms</p>\n </div>\n } @else {\n <!-- Results Summary -->\n <div class=\"results-summary\">\n Found {{ results.total }} result{{ results.total === 1 ? '' : 's' }}\n </div>\n\n <!-- Conversations Results -->\n @if (results.conversations.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-comments\"></i>\n Conversations ({{ results.conversations.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.conversations; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Messages Results -->\n @if (results.messages.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-comment\"></i>\n Messages ({{ results.messages.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.messages; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n @if (result.conversationName) {\n <div class=\"result-conversation\">\n <i class=\"fa-solid fa-comments\"></i>\n {{ result.conversationName }}\n </div>\n }\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Artifacts Results -->\n @if (results.artifacts.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-file-alt\"></i>\n Artifacts ({{ results.artifacts.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.artifacts; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n @if (result.artifactType) {\n <div class=\"result-type\">\n <span class=\"type-badge\">{{ result.artifactType }}</span>\n </div>\n }\n @if (result.conversationName) {\n <div class=\"result-conversation\">\n <i class=\"fa-solid fa-comments\"></i>\n {{ result.conversationName }}\n </div>\n }\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Collections Results -->\n @if (results.collections.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-folder\"></i>\n Collections ({{ results.collections.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.collections; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Tasks Results -->\n @if (results.tasks.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-tasks\"></i>\n Tasks ({{ results.tasks.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.tasks; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n }\n </div>\n\n <!-- Footer with keyboard hints -->\n <div class=\"search-footer\">\n <div class=\"keyboard-hints\">\n <span class=\"hint\"><kbd>↑</kbd><kbd>↓</kbd> Navigate</span>\n <span class=\"hint\"><kbd>↵</kbd> Select</span>\n <span class=\"hint\"><kbd>Esc</kbd> Close</span>\n </div>\n </div>\n </div>\n</div>\n}\n"]}
1
+ {"version":3,"file":"search-panel.component.js","sourceRoot":"","sources":["../../../../src/lib/components/search/search-panel.component.ts","../../../../src/lib/components/search/search-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n OnInit,\n OnDestroy,\n Output,\n EventEmitter,\n Input,\n HostListener,\n ViewChild,\n ElementRef\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { UserInfo } from '@memberjunction/core';\nimport { HighlightSearchMatches } from '@memberjunction/global';\nimport {\n SearchService,\n SearchResult,\n SearchFilter,\n GroupedSearchResults,\n DateRange\n} from '../../services/search.service';\n\n/**\n * Search panel component providing global search UI\n * Can be displayed as a modal or slide-out panel\n * Supports filtering, date ranges, and result navigation\n */\n@Component({\n standalone: false,\n selector: 'mj-search-panel',\n templateUrl: './search-panel.component.html',\n styleUrls: ['./search-panel.component.css']\n})\nexport class SearchPanelComponent implements OnInit, OnDestroy {\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n @Input() isOpen: boolean = false;\n\n @Output() close = new EventEmitter<void>();\n @Output() resultSelected = new EventEmitter<SearchResult>();\n\n @ViewChild('searchInput') searchInput?: ElementRef<HTMLInputElement>;\n\n public searchQuery: string = '';\n public activeFilter: SearchFilter = 'all';\n public dateRange: DateRange = { start: null, end: null };\n public isSearching: boolean = false;\n public results: GroupedSearchResults = {\n conversations: [],\n messages: [],\n artifacts: [],\n collections: [],\n tasks: [],\n total: 0\n };\n public recentSearches: string[] = [];\n public selectedIndex: number = -1;\n\n /** Message for the \"no results\" empty state, echoing the search term. */\n public get NoResultsMessage(): string {\n return `No results found for \"${this.searchQuery}\"`;\n }\n\n private destroy$ = new Subject<void>();\n\n constructor(private searchService: SearchService) {}\n\n ngOnInit(): void {\n this.subscribeToSearchState();\n this.loadRecentSearches();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Subscribe to search service state\n */\n private subscribeToSearchState(): void {\n this.searchService.isSearching$\n .pipe(takeUntil(this.destroy$))\n .subscribe(isSearching => {\n this.isSearching = isSearching;\n });\n\n this.searchService.searchResults$\n .pipe(takeUntil(this.destroy$))\n .subscribe(results => {\n this.results = results;\n this.selectedIndex = -1;\n });\n\n this.searchService.searchFilter$\n .pipe(takeUntil(this.destroy$))\n .subscribe(filter => {\n this.activeFilter = filter;\n });\n\n this.searchService.dateRange$\n .pipe(takeUntil(this.destroy$))\n .subscribe(range => {\n this.dateRange = range;\n });\n }\n\n /**\n * Load recent searches\n */\n private loadRecentSearches(): void {\n this.recentSearches = this.searchService.getRecentSearches();\n }\n\n /**\n * Handle search input\n */\n public onSearchInput(): void {\n if (this.searchQuery.trim()) {\n this.performSearch();\n } else {\n this.searchService.clearResults();\n }\n }\n\n /**\n * Perform search\n */\n private async performSearch(): Promise<void> {\n await this.searchService.search(\n this.searchQuery,\n this.environmentId,\n this.currentUser\n );\n }\n\n /**\n * Set search filter\n */\n public setFilter(filter: SearchFilter): void {\n this.searchService.setSearchFilter(filter);\n if (this.searchQuery.trim()) {\n this.performSearch();\n }\n }\n\n /**\n * Clear search\n */\n public clearSearch(): void {\n this.searchQuery = '';\n this.searchService.clearResults();\n this.focusSearchInput();\n }\n\n /**\n * Select a result\n */\n public selectResult(result: SearchResult): void {\n this.resultSelected.emit(result);\n this.closePanel();\n }\n\n /**\n * Use recent search\n */\n public useRecentSearch(query: string): void {\n this.searchQuery = query;\n this.performSearch();\n }\n\n /**\n * Clear recent searches\n */\n public clearRecentSearches(): void {\n this.searchService.clearRecentSearches();\n this.recentSearches = [];\n }\n\n /**\n * Close panel\n */\n public closePanel(): void {\n this.close.emit();\n }\n\n /**\n * Focus search input\n */\n private focusSearchInput(): void {\n setTimeout(() => {\n this.searchInput?.nativeElement.focus();\n }, 0);\n }\n\n /**\n * Handle keyboard navigation\n */\n @HostListener('keydown', ['$event'])\n public handleKeyboard(event: KeyboardEvent): void {\n if (!this.isOpen) return;\n\n const allResults = this.getAllResultsFlat();\n\n switch (event.key) {\n case 'Escape':\n event.preventDefault();\n this.closePanel();\n break;\n\n case 'ArrowDown':\n event.preventDefault();\n if (allResults.length > 0) {\n this.selectedIndex = Math.min(this.selectedIndex + 1, allResults.length - 1);\n }\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n if (this.selectedIndex > 0) {\n this.selectedIndex--;\n } else {\n this.selectedIndex = -1;\n }\n break;\n\n case 'Enter':\n event.preventDefault();\n if (this.selectedIndex >= 0 && allResults[this.selectedIndex]) {\n this.selectResult(allResults[this.selectedIndex]);\n }\n break;\n }\n }\n\n /**\n * Get all results as flat array\n */\n private getAllResultsFlat(): SearchResult[] {\n return [\n ...this.results.conversations,\n ...this.results.messages,\n ...this.results.artifacts,\n ...this.results.collections,\n ...this.results.tasks\n ];\n }\n\n /**\n * Check if result is selected\n */\n public isResultSelected(result: SearchResult): boolean {\n const allResults = this.getAllResultsFlat();\n const index = allResults.findIndex(r => r.id === result.id && r.type === result.type);\n return index === this.selectedIndex;\n }\n\n /**\n * Get icon for result type\n */\n public getResultIcon(type: string): string {\n switch (type) {\n case 'conversation':\n return 'fa-comments';\n case 'message':\n return 'fa-comment';\n case 'artifact':\n return 'fa-file-alt';\n case 'collection':\n return 'fa-folder';\n case 'task':\n return 'fa-tasks';\n default:\n return 'fa-circle';\n }\n }\n\n /**\n * Get filter display text\n */\n public getFilterText(filter: SearchFilter): string {\n switch (filter) {\n case 'all':\n return 'All';\n case 'conversations':\n return 'Conversations';\n case 'messages':\n return 'Messages';\n case 'artifacts':\n return 'Artifacts';\n case 'collections':\n return 'Collections';\n case 'tasks':\n return 'Tasks';\n default:\n return 'All';\n }\n }\n\n /**\n * Format date for display\n */\n public formatDate(date: Date): string {\n const now = new Date();\n const diff = now.getTime() - new Date(date).getTime();\n const days = Math.floor(diff / (1000 * 60 * 60 * 24));\n\n if (days === 0) return 'Today';\n if (days === 1) return 'Yesterday';\n if (days < 7) return `${days} days ago`;\n if (days < 30) return `${Math.floor(days / 7)} weeks ago`;\n if (days < 365) return `${Math.floor(days / 30)} months ago`;\n return `${Math.floor(days / 365)} years ago`;\n }\n\n /** Highlight matched text in result. Output is bound to `[innerHTML]` in the template. */\n public highlightMatch(text: string, query: string): string {\n return HighlightSearchMatches(text, query);\n }\n\n /**\n * Handle date range change\n */\n public onDateRangeChange(): void {\n this.searchService.setDateRange(this.dateRange);\n if (this.searchQuery.trim()) {\n this.performSearch();\n }\n }\n\n /**\n * Clear date range\n */\n public clearDateRange(): void {\n this.dateRange = { start: null, end: null };\n this.searchService.setDateRange({ start: null, end: null });\n if (this.searchQuery.trim()) {\n this.performSearch();\n }\n }\n\n /**\n * Watch for panel open state changes\n */\n ngOnChanges(): void {\n if (this.isOpen) {\n this.focusSearchInput();\n }\n }\n}\n","@if (isOpen) {\n<div class=\"search-panel-overlay\" (click)=\"closePanel()\">\n <div class=\"search-panel\" (click)=\"$event.stopPropagation()\">\n <!-- Search Header -->\n <div class=\"search-header\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input\n #searchInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"Search conversations, messages, artifacts, collections, and tasks...\"\n [(ngModel)]=\"searchQuery\"\n (input)=\"onSearchInput()\"\n autocomplete=\"off\"\n />\n @if (searchQuery) {\n <button\n type=\"button\"\n class=\"clear-button\"\n (click)=\"clearSearch()\"\n title=\"Clear search\"\n >\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"close-button\"\n (click)=\"closePanel()\"\n title=\"Close (Esc)\"\n >\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Filters -->\n <div class=\"search-filters\">\n <div class=\"filter-buttons\">\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'all'\"\n (click)=\"setFilter('all')\"\n >\n All\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'conversations'\"\n (click)=\"setFilter('conversations')\"\n >\n <i class=\"fa-solid fa-comments\"></i>\n Conversations\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'messages'\"\n (click)=\"setFilter('messages')\"\n >\n <i class=\"fa-solid fa-comment\"></i>\n Messages\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'artifacts'\"\n (click)=\"setFilter('artifacts')\"\n >\n <i class=\"fa-solid fa-file-alt\"></i>\n Artifacts\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'collections'\"\n (click)=\"setFilter('collections')\"\n >\n <i class=\"fa-solid fa-folder\"></i>\n Collections\n </button>\n <button\n type=\"button\"\n class=\"filter-button\"\n [class.active]=\"activeFilter === 'tasks'\"\n (click)=\"setFilter('tasks')\"\n >\n <i class=\"fa-solid fa-tasks\"></i>\n Tasks\n </button>\n </div>\n\n <!-- Date Range Filter -->\n <div class=\"date-filter\">\n <mj-datepicker\n [(ngModel)]=\"dateRange.start\"\n (ngModelChange)=\"onDateRangeChange()\"\n Placeholder=\"From\"\n ></mj-datepicker>\n <mj-datepicker\n [(ngModel)]=\"dateRange.end\"\n (ngModelChange)=\"onDateRangeChange()\"\n Placeholder=\"To\"\n ></mj-datepicker>\n @if (dateRange.start || dateRange.end) {\n <button\n type=\"button\"\n class=\"clear-date-button\"\n (click)=\"clearDateRange()\"\n title=\"Clear date range\"\n >\n <i class=\"fa-solid fa-times-circle\"></i>\n </button>\n }\n </div>\n </div>\n\n <!-- Search Results -->\n <div class=\"search-results\">\n @if (isSearching) {\n <div class=\"search-loading\">\n <mj-loading text=\"Searching...\" size=\"medium\"></mj-loading>\n </div>\n } @else if (!searchQuery) {\n <!-- Recent Searches -->\n @if (recentSearches.length > 0) {\n <div class=\"recent-searches\">\n <div class=\"recent-searches-header\">\n <h3>Recent Searches</h3>\n <button\n type=\"button\"\n class=\"clear-recent-button\"\n (click)=\"clearRecentSearches()\"\n title=\"Clear recent searches\"\n >\n Clear\n </button>\n </div>\n <div class=\"recent-searches-list\">\n @for (search of recentSearches; track search) {\n <button\n type=\"button\"\n class=\"recent-search-item\"\n (click)=\"useRecentSearch(search)\"\n >\n <i class=\"fa-solid fa-history\"></i>\n <span>{{ search }}</span>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Empty State -->\n <mj-empty-state\n Icon=\"fa-solid fa-magnifying-glass\"\n Message=\"Search across all your conversations, messages, artifacts, collections, and tasks\">\n <div class=\"search-tips\">\n <h4>Tips:</h4>\n <ul>\n <li>Use filters to narrow results</li>\n <li>Set date range to find recent content</li>\n <li>Use keyboard shortcuts to navigate</li>\n </ul>\n </div>\n </mj-empty-state>\n } @else if (results.total === 0) {\n <!-- No Results -->\n <mj-empty-state\n Variant=\"no-results\"\n [Title]=\"NoResultsMessage\"\n Message=\"Try adjusting your filters or search terms\" />\n } @else {\n <!-- Results Summary -->\n <div class=\"results-summary\">\n Found {{ results.total }} result{{ results.total === 1 ? '' : 's' }}\n </div>\n\n <!-- Conversations Results -->\n @if (results.conversations.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-comments\"></i>\n Conversations ({{ results.conversations.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.conversations; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Messages Results -->\n @if (results.messages.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-comment\"></i>\n Messages ({{ results.messages.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.messages; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n @if (result.conversationName) {\n <div class=\"result-conversation\">\n <i class=\"fa-solid fa-comments\"></i>\n {{ result.conversationName }}\n </div>\n }\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Artifacts Results -->\n @if (results.artifacts.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-file-alt\"></i>\n Artifacts ({{ results.artifacts.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.artifacts; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n @if (result.artifactType) {\n <div class=\"result-type\">\n <span class=\"type-badge\">{{ result.artifactType }}</span>\n </div>\n }\n @if (result.conversationName) {\n <div class=\"result-conversation\">\n <i class=\"fa-solid fa-comments\"></i>\n {{ result.conversationName }}\n </div>\n }\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Collections Results -->\n @if (results.collections.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-folder\"></i>\n Collections ({{ results.collections.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.collections; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Tasks Results -->\n @if (results.tasks.length > 0) {\n <div class=\"results-group\">\n <h3 class=\"results-group-title\">\n <i class=\"fa-solid fa-tasks\"></i>\n Tasks ({{ results.tasks.length }})\n </h3>\n <div class=\"results-list\">\n @for (result of results.tasks; track result.id) {\n <button\n type=\"button\"\n class=\"result-item\"\n [class.selected]=\"isResultSelected(result)\"\n (click)=\"selectResult(result)\"\n >\n <div class=\"result-icon\">\n <i class=\"fa-solid\" [class]=\"getResultIcon(result.type)\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-title\" [innerHTML]=\"highlightMatch(result.title, searchQuery)\"></div>\n <div class=\"result-preview\" [innerHTML]=\"highlightMatch(result.preview, searchQuery)\"></div>\n @if (result.matchedText) {\n <div class=\"result-match\" [innerHTML]=\"highlightMatch(result.matchedText, searchQuery)\"></div>\n }\n </div>\n <div class=\"result-meta\">\n <span class=\"result-date\">{{ formatDate(result.createdAt) }}</span>\n </div>\n </button>\n }\n </div>\n </div>\n }\n }\n </div>\n\n <!-- Footer with keyboard hints -->\n <div class=\"search-footer\">\n <div class=\"keyboard-hints\">\n <span class=\"hint\"><kbd>↑</kbd><kbd>↓</kbd> Navigate</span>\n <span class=\"hint\"><kbd>↵</kbd> Select</span>\n <span class=\"hint\"><kbd>Esc</kbd> Close</span>\n </div>\n </div>\n </div>\n</div>\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"share-modal.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/share/share-modal.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClG,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAA4C,MAAM,+BAA+B,CAAC;AAC/G,OAAO,EAAE,QAAQ,EAAqB,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;;AAE5D,UAAU,eAAe;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;CAC5C;AAED,qBA6Ha,mBAAoB,SAAQ,oBAAqB,YAAW,MAAM;IAqB3E,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,GAAG;IAtBJ,YAAY,EAAG,oBAAoB,CAAC;IACpC,WAAW,EAAG,QAAQ,CAAC;IACvB,MAAM,EAAE,OAAO,CAAS;IAEvB,MAAM,qBAA4B;IAErC,WAAW,EAAE,eAAe,EAAE,CAAM;IACpC,YAAY,EAAE,MAAM,CAAM;IAC1B,YAAY,EAAE,OAAO,CAAS;IAC9B,SAAS,EAAE,MAAM,CAAM;IAEvB,YAAY;;;QAIjB;IAEF,OAAO,CAAC,QAAQ,CAAC,8BAA8B,CAA0C;gBAG/E,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,EAC1B,GAAG,EAAE,iBAAiB;IAIhC,QAAQ;YAOM,eAAe;IA2C7B,cAAc,CAAC,UAAU,EAAE,eAAe,GAAG,MAAM;IAI7C,mBAAmB,CAAC,UAAU,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAkD1B,YAAY,CAAC,UAAU,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;YA8BhD,cAAc;IAkCtB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAYzC,OAAO,CAAC,eAAe;IAUjB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAUjC,OAAO,IAAI,IAAI;yCAxOJ,mBAAmB;2CAAnB,mBAAmB;CA2O/B"}
1
+ {"version":3,"file":"share-modal.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/share/share-modal.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClG,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAA4C,MAAM,+BAA+B,CAAC;AAC/G,OAAO,EAAE,QAAQ,EAAqB,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;;AAE5D,UAAU,eAAe;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;CAC5C;AAED,qBA2Ha,mBAAoB,SAAQ,oBAAqB,YAAW,MAAM;IAqB3E,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,GAAG;IAtBJ,YAAY,EAAG,oBAAoB,CAAC;IACpC,WAAW,EAAG,QAAQ,CAAC;IACvB,MAAM,EAAE,OAAO,CAAS;IAEvB,MAAM,qBAA4B;IAErC,WAAW,EAAE,eAAe,EAAE,CAAM;IACpC,YAAY,EAAE,MAAM,CAAM;IAC1B,YAAY,EAAE,OAAO,CAAS;IAC9B,SAAS,EAAE,MAAM,CAAM;IAEvB,YAAY;;;QAIjB;IAEF,OAAO,CAAC,QAAQ,CAAC,8BAA8B,CAA0C;gBAG/E,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,EAC1B,GAAG,EAAE,iBAAiB;IAIhC,QAAQ;YAOM,eAAe;IA2C7B,cAAc,CAAC,UAAU,EAAE,eAAe,GAAG,MAAM;IAI7C,mBAAmB,CAAC,UAAU,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAkD1B,YAAY,CAAC,UAAU,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;YA8BhD,cAAc;IAkCtB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAYzC,OAAO,CAAC,eAAe;IAUjB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAUjC,OAAO,IAAI,IAAI;yCAxOJ,mBAAmB;2CAAnB,mBAAmB;CA2O/B"}
@@ -8,9 +8,7 @@ import * as i3 from "@angular/forms";
8
8
  import * as i4 from "@memberjunction/ng-ui-components";
9
9
  const _forTrack0 = ($index, $item) => $item.value;
10
10
  function ShareModalComponent_Conditional_0_Conditional_13_Template(rf, ctx) { if (rf & 1) {
11
- i0.ɵɵelementStart(0, "div", 9)(1, "p");
12
- i0.ɵɵtext(2, "No one has been given access yet");
13
- i0.ɵɵelementEnd()();
11
+ i0.ɵɵelement(0, "mj-empty-state", 9);
14
12
  } }
15
13
  function ShareModalComponent_Conditional_0_For_15_For_11_Template(rf, ctx) { if (rf & 1) {
16
14
  i0.ɵɵelementStart(0, "option", 23);
@@ -84,7 +82,7 @@ function ShareModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
84
82
  i0.ɵɵtext(11, "People with Access");
85
83
  i0.ɵɵelementEnd();
86
84
  i0.ɵɵelementStart(12, "div", 8);
87
- i0.ɵɵconditionalCreate(13, ShareModalComponent_Conditional_0_Conditional_13_Template, 3, 0, "div", 9);
85
+ i0.ɵɵconditionalCreate(13, ShareModalComponent_Conditional_0_Conditional_13_Template, 1, 0, "mj-empty-state", 9);
88
86
  i0.ɵɵrepeaterCreate(14, ShareModalComponent_Conditional_0_For_15_Template, 14, 3, "div", 10, i0.ɵɵrepeaterTrackByIdentity);
89
87
  i0.ɵɵelementEnd()();
90
88
  i0.ɵɵelementStart(16, "div", 11)(17, "h4");
@@ -335,11 +333,11 @@ export class ShareModalComponent extends BaseAngularComponent {
335
333
  this.closed.emit();
336
334
  }
337
335
  static ɵfac = function ShareModalComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ShareModalComponent)(i0.ɵɵdirectiveInject(i1.DialogService), i0.ɵɵdirectiveInject(i2.ToastService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
338
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ShareModalComponent, selectors: [["mj-share-modal"]], inputs: { conversation: "conversation", currentUser: "currentUser", isOpen: "isOpen" }, outputs: { closed: "closed" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [[3, "Title", "Width", "Height", "Visible"], [3, "Close", "Title", "Width", "Height", "Visible"], [1, "share-content"], [1, "add-user-section"], [1, "add-user-form"], ["type", "text", "placeholder", "Enter email address", 1, "mj-textbox", 2, "flex", "1", 3, "ngModelChange", "ngModel"], ["mjButton", "", "variant", "primary", 3, "click"], [1, "permissions-section"], [1, "permission-list"], [1, "empty-state"], [1, "permission-item"], [1, "link-section"], [1, "link-controls"], ["type", "checkbox", 3, "ngModelChange", "ngModel"], [1, "link-display"], ["mjButton", "", 3, "click"], [1, "user-info"], [1, "fas", "fa-user-circle"], [1, "user-details"], [1, "user-name"], [1, "user-email"], [1, "permission-controls"], [1, "mj-select", 2, "width", "120px", 3, "ngModelChange", "ngModel"], [3, "value"], ["title", "Remove access", 1, "btn-remove", 3, "click"], [1, "fas", "fa-times"], ["type", "text", "readonly", "", 1, "mj-textbox", 2, "flex", "1", 3, "value"], ["mjButton", "", "variant", "flat", 3, "click"], [1, "fas", "fa-copy"]], template: function ShareModalComponent_Template(rf, ctx) { if (rf & 1) {
336
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ShareModalComponent, selectors: [["mj-share-modal"]], inputs: { conversation: "conversation", currentUser: "currentUser", isOpen: "isOpen" }, outputs: { closed: "closed" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [[3, "Title", "Width", "Height", "Visible"], [3, "Close", "Title", "Width", "Height", "Visible"], [1, "share-content"], [1, "add-user-section"], [1, "add-user-form"], ["type", "text", "placeholder", "Enter email address", 1, "mj-textbox", 2, "flex", "1", 3, "ngModelChange", "ngModel"], ["mjButton", "", "variant", "primary", 3, "click"], [1, "permissions-section"], [1, "permission-list"], ["Icon", "fa-solid fa-user-group", "Title", "No one has been given access yet", "Size", "compact"], [1, "permission-item"], [1, "link-section"], [1, "link-controls"], ["type", "checkbox", 3, "ngModelChange", "ngModel"], [1, "link-display"], ["mjButton", "", 3, "click"], [1, "user-info"], [1, "fas", "fa-user-circle"], [1, "user-details"], [1, "user-name"], [1, "user-email"], [1, "permission-controls"], [1, "mj-select", 2, "width", "120px", 3, "ngModelChange", "ngModel"], [3, "value"], ["title", "Remove access", 1, "btn-remove", 3, "click"], [1, "fas", "fa-times"], ["type", "text", "readonly", "", 1, "mj-textbox", 2, "flex", "1", 3, "value"], ["mjButton", "", "variant", "flat", 3, "click"], [1, "fas", "fa-copy"]], template: function ShareModalComponent_Template(rf, ctx) { if (rf & 1) {
339
337
  i0.ɵɵconditionalCreate(0, ShareModalComponent_Conditional_0_Template, 27, 8, "mj-dialog", 0);
340
338
  } if (rf & 2) {
341
339
  i0.ɵɵconditional(ctx.isOpen ? 0 : -1);
342
- } }, dependencies: [i3.NgSelectOption, i3.ɵNgSelectMultipleOption, i3.DefaultValueAccessor, i3.CheckboxControlValueAccessor, i3.SelectControlValueAccessor, i3.NgControlStatus, i3.NgModel, i4.MJButtonDirective, i4.MJDialogComponent, i4.MJDialogActionsComponent], styles: [".share-content[_ngcontent-%COMP%] { display: flex; flex-direction: column; gap: 24px; }\n\n .add-user-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%], \n .permissions-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%], \n .link-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] { margin: 0 0 12px 0; font-size: 14px; font-weight: 600; }\n\n .add-user-form[_ngcontent-%COMP%] { display: flex; gap: 8px; }\n\n .permission-list[_ngcontent-%COMP%] { border: 1px solid #D9D9D9; border-radius: 4px; max-height: 300px; overflow-y: auto; }\n .permission-item[_ngcontent-%COMP%] { padding: 12px; border-bottom: 1px solid #E8E8E8; display: flex; justify-content: space-between; align-items: center; }\n .permission-item[_ngcontent-%COMP%]:last-child { border-bottom: none; }\n\n .user-info[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 12px; flex: 1; }\n .user-info[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 32px; color: #999; }\n .user-details[_ngcontent-%COMP%] { display: flex; flex-direction: column; }\n .user-name[_ngcontent-%COMP%] { font-size: 14px; font-weight: 500; }\n .user-email[_ngcontent-%COMP%] { font-size: 12px; color: #666; }\n\n .permission-controls[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 8px; }\n .btn-remove[_ngcontent-%COMP%] { padding: 6px 8px; background: transparent; border: none; cursor: pointer; border-radius: 3px; color: #999; }\n .btn-remove[_ngcontent-%COMP%]:hover { background: #FFEBEE; color: #D32F2F; }\n\n .empty-state[_ngcontent-%COMP%] { padding: 24px; text-align: center; color: #999; }\n .empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] { margin: 0; font-size: 13px; }\n\n .link-controls[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }\n .link-controls[_ngcontent-%COMP%] label[_ngcontent-%COMP%] { font-size: 13px; }\n\n .link-display[_ngcontent-%COMP%] { display: flex; gap: 8px; }"] });
340
+ } }, dependencies: [i3.NgSelectOption, i3.ɵNgSelectMultipleOption, i3.DefaultValueAccessor, i3.CheckboxControlValueAccessor, i3.SelectControlValueAccessor, i3.NgControlStatus, i3.NgModel, i4.MJButtonDirective, i4.MJDialogComponent, i4.MJDialogActionsComponent, i4.MJEmptyStateComponent], styles: [".share-content[_ngcontent-%COMP%] { display: flex; flex-direction: column; gap: 24px; }\n\n .add-user-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%], \n .permissions-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%], \n .link-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] { margin: 0 0 12px 0; font-size: 14px; font-weight: 600; }\n\n .add-user-form[_ngcontent-%COMP%] { display: flex; gap: 8px; }\n\n .permission-list[_ngcontent-%COMP%] { border: 1px solid #D9D9D9; border-radius: 4px; max-height: 300px; overflow-y: auto; }\n .permission-item[_ngcontent-%COMP%] { padding: 12px; border-bottom: 1px solid #E8E8E8; display: flex; justify-content: space-between; align-items: center; }\n .permission-item[_ngcontent-%COMP%]:last-child { border-bottom: none; }\n\n .user-info[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 12px; flex: 1; }\n .user-info[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 32px; color: #999; }\n .user-details[_ngcontent-%COMP%] { display: flex; flex-direction: column; }\n .user-name[_ngcontent-%COMP%] { font-size: 14px; font-weight: 500; }\n .user-email[_ngcontent-%COMP%] { font-size: 12px; color: #666; }\n\n .permission-controls[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 8px; }\n .btn-remove[_ngcontent-%COMP%] { padding: 6px 8px; background: transparent; border: none; cursor: pointer; border-radius: 3px; color: #999; }\n .btn-remove[_ngcontent-%COMP%]:hover { background: #FFEBEE; color: #D32F2F; }\n\n .link-controls[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }\n .link-controls[_ngcontent-%COMP%] label[_ngcontent-%COMP%] { font-size: 13px; }\n\n .link-display[_ngcontent-%COMP%] { display: flex; gap: 8px; }"] });
343
341
  }
344
342
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ShareModalComponent, [{
345
343
  type: Component,
@@ -370,9 +368,10 @@ export class ShareModalComponent extends BaseAngularComponent {
370
368
  <h4>People with Access</h4>
371
369
  <div class="permission-list">
372
370
  @if (permissions.length === 0) {
373
- <div class="empty-state">
374
- <p>No one has been given access yet</p>
375
- </div>
371
+ <mj-empty-state
372
+ Icon="fa-solid fa-user-group"
373
+ Title="No one has been given access yet"
374
+ Size="compact" />
376
375
  }
377
376
  @for (permission of permissions; track permission) {
378
377
  <div class="permission-item">
@@ -432,7 +431,7 @@ export class ShareModalComponent extends BaseAngularComponent {
432
431
  </mj-dialog-actions>
433
432
  </mj-dialog>
434
433
  }
435
- `, styles: ["\n .share-content { display: flex; flex-direction: column; gap: 24px; }\n\n .add-user-section h4,\n .permissions-section h4,\n .link-section h4 { margin: 0 0 12px 0; font-size: 14px; font-weight: 600; }\n\n .add-user-form { display: flex; gap: 8px; }\n\n .permission-list { border: 1px solid #D9D9D9; border-radius: 4px; max-height: 300px; overflow-y: auto; }\n .permission-item { padding: 12px; border-bottom: 1px solid #E8E8E8; display: flex; justify-content: space-between; align-items: center; }\n .permission-item:last-child { border-bottom: none; }\n\n .user-info { display: flex; align-items: center; gap: 12px; flex: 1; }\n .user-info i { font-size: 32px; color: #999; }\n .user-details { display: flex; flex-direction: column; }\n .user-name { font-size: 14px; font-weight: 500; }\n .user-email { font-size: 12px; color: #666; }\n\n .permission-controls { display: flex; align-items: center; gap: 8px; }\n .btn-remove { padding: 6px 8px; background: transparent; border: none; cursor: pointer; border-radius: 3px; color: #999; }\n .btn-remove:hover { background: #FFEBEE; color: #D32F2F; }\n\n .empty-state { padding: 24px; text-align: center; color: #999; }\n .empty-state p { margin: 0; font-size: 13px; }\n\n .link-controls { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }\n .link-controls label { font-size: 13px; }\n\n .link-display { display: flex; gap: 8px; }\n "] }]
434
+ `, styles: ["\n .share-content { display: flex; flex-direction: column; gap: 24px; }\n\n .add-user-section h4,\n .permissions-section h4,\n .link-section h4 { margin: 0 0 12px 0; font-size: 14px; font-weight: 600; }\n\n .add-user-form { display: flex; gap: 8px; }\n\n .permission-list { border: 1px solid #D9D9D9; border-radius: 4px; max-height: 300px; overflow-y: auto; }\n .permission-item { padding: 12px; border-bottom: 1px solid #E8E8E8; display: flex; justify-content: space-between; align-items: center; }\n .permission-item:last-child { border-bottom: none; }\n\n .user-info { display: flex; align-items: center; gap: 12px; flex: 1; }\n .user-info i { font-size: 32px; color: #999; }\n .user-details { display: flex; flex-direction: column; }\n .user-name { font-size: 14px; font-weight: 500; }\n .user-email { font-size: 12px; color: #666; }\n\n .permission-controls { display: flex; align-items: center; gap: 8px; }\n .btn-remove { padding: 6px 8px; background: transparent; border: none; cursor: pointer; border-radius: 3px; color: #999; }\n .btn-remove:hover { background: #FFEBEE; color: #D32F2F; }\n\n .link-controls { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }\n .link-controls label { font-size: 13px; }\n\n .link-display { display: flex; gap: 8px; }\n "] }]
436
435
  }], () => [{ type: i1.DialogService }, { type: i2.ToastService }, { type: i0.ChangeDetectorRef }], { conversation: [{
437
436
  type: Input
438
437
  }], currentUser: [{
@@ -442,5 +441,5 @@ export class ShareModalComponent extends BaseAngularComponent {
442
441
  }], closed: [{
443
442
  type: Output
444
443
  }] }); })();
445
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ShareModalComponent, { className: "ShareModalComponent", filePath: "src/lib/components/share/share-modal.component.ts", lineNumber: 141 }); })();
444
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ShareModalComponent, { className: "ShareModalComponent", filePath: "src/lib/components/share/share-modal.component.ts", lineNumber: 139 }); })();
446
445
  //# sourceMappingURL=share-modal.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"share-modal.component.js","sourceRoot":"","sources":["../../../../src/lib/components/share/share-modal.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, ChangeDetectorRef } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { MJConversationEntity, MJResourcePermissionEntity, MJUserEntity } from '@memberjunction/core-entities';\nimport { UserInfo, RunView, Metadata } from '@memberjunction/core';\nimport { DialogService } from '../../services/dialog.service';\nimport { ToastService } from '../../services/toast.service';\n\ninterface SharePermission {\n permissionId: string | null;\n userId: string;\n userEmail: string;\n userName: string;\n permissionLevel: 'View' | 'Edit' | 'Owner';\n}\n\n@Component({\n standalone: false,\n selector: 'mj-share-modal',\n template: `\n @if (isOpen) {\n <mj-dialog\n [Title]=\"'Share: ' + (conversation.Name || '')\"\n [Width]=\"500\"\n [Height]=\"600\"\n [Visible]=\"true\"\n (Close)=\"onClose()\">\n <div class=\"share-content\">\n <div class=\"add-user-section\">\n <h4>Add People</h4>\n <div class=\"add-user-form\">\n <input\n type=\"text\"\n [(ngModel)]=\"newUserEmail\"\n placeholder=\"Enter email address\"\n class=\"mj-textbox\"\n style=\"flex: 1;\">\n <button mjButton variant=\"primary\" (click)=\"onAddUser()\">\n Add\n </button>\n </div>\n </div>\n <div class=\"permissions-section\">\n <h4>People with Access</h4>\n <div class=\"permission-list\">\n @if (permissions.length === 0) {\n <div class=\"empty-state\">\n <p>No one has been given access yet</p>\n </div>\n }\n @for (permission of permissions; track permission) {\n <div class=\"permission-item\">\n <div class=\"user-info\">\n <i class=\"fas fa-user-circle\"></i>\n <div class=\"user-details\">\n <div class=\"user-name\">{{ permission.userName }}</div>\n <div class=\"user-email\">{{ permission.userEmail }}</div>\n </div>\n </div>\n <div class=\"permission-controls\">\n <select\n [ngModel]=\"permission.permissionLevel\"\n (ngModelChange)=\"onAccessLevelChange(permission, $event)\"\n style=\"width: 120px;\" class=\"mj-select\">\n @for (level of accessLevels; track level.value) {\n <option [value]=\"level.value\">{{ level.label }}</option>\n }\n </select>\n <button\n class=\"btn-remove\"\n (click)=\"onRemoveUser(permission)\"\n title=\"Remove access\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"link-section\">\n <h4>Share Link</h4>\n <div class=\"link-controls\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"isPublicLink\"\n (ngModelChange)=\"onTogglePublicLink()\">\n <label>Anyone with the link can view</label>\n </div>\n @if (isPublicLink) {\n <div class=\"link-display\">\n <input\n type=\"text\"\n [value]=\"shareLink\"\n readonly\n class=\"mj-textbox\"\n style=\"flex: 1;\">\n <button mjButton variant=\"flat\" (click)=\"onCopyLink()\">\n <i class=\"fas fa-copy\"></i> Copy\n </button>\n </div>\n }\n </div>\n </div>\n <mj-dialog-actions>\n <button mjButton (click)=\"onClose()\">Close</button>\n </mj-dialog-actions>\n </mj-dialog>\n }\n `,\n styles: [`\n .share-content { display: flex; flex-direction: column; gap: 24px; }\n\n .add-user-section h4,\n .permissions-section h4,\n .link-section h4 { margin: 0 0 12px 0; font-size: 14px; font-weight: 600; }\n\n .add-user-form { display: flex; gap: 8px; }\n\n .permission-list { border: 1px solid #D9D9D9; border-radius: 4px; max-height: 300px; overflow-y: auto; }\n .permission-item { padding: 12px; border-bottom: 1px solid #E8E8E8; display: flex; justify-content: space-between; align-items: center; }\n .permission-item:last-child { border-bottom: none; }\n\n .user-info { display: flex; align-items: center; gap: 12px; flex: 1; }\n .user-info i { font-size: 32px; color: #999; }\n .user-details { display: flex; flex-direction: column; }\n .user-name { font-size: 14px; font-weight: 500; }\n .user-email { font-size: 12px; color: #666; }\n\n .permission-controls { display: flex; align-items: center; gap: 8px; }\n .btn-remove { padding: 6px 8px; background: transparent; border: none; cursor: pointer; border-radius: 3px; color: #999; }\n .btn-remove:hover { background: #FFEBEE; color: #D32F2F; }\n\n .empty-state { padding: 24px; text-align: center; color: #999; }\n .empty-state p { margin: 0; font-size: 13px; }\n\n .link-controls { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }\n .link-controls label { font-size: 13px; }\n\n .link-display { display: flex; gap: 8px; }\n `]\n})\nexport class ShareModalComponent extends BaseAngularComponent implements OnInit {\n @Input() conversation!: MJConversationEntity;\n @Input() currentUser!: UserInfo;\n @Input() isOpen: boolean = false;\n\n @Output() closed = new EventEmitter<void>();\n\n public permissions: SharePermission[] = [];\n public newUserEmail: string = '';\n public isPublicLink: boolean = false;\n public shareLink: string = '';\n\n public accessLevels = [\n { label: 'Can View', value: 'View' },\n { label: 'Can Edit', value: 'Edit' },\n { label: 'Owner', value: 'Owner' }\n ];\n\n private readonly CONVERSATIONS_RESOURCE_TYPE_ID = '81D4BC3D-9FEB-EF11-B01A-286B35C04427';\n\n constructor(\n private dialogService: DialogService,\n private toastService: ToastService,\n private cdr: ChangeDetectorRef\n ) {\n super();}\n\n ngOnInit() {\n if (this.conversation) {\n this.loadPermissions();\n this.updateShareLink();\n }\n }\n\n private async loadPermissions(): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJResourcePermissionEntity>({\n EntityName: 'MJ: Resource Permissions',\n ExtraFilter: `ResourceTypeID='${this.CONVERSATIONS_RESOURCE_TYPE_ID}' AND ResourceRecordID='${this.conversation.ID}' AND Status='Approved'`,\n ResultType: 'entity_object'\n });\n\n if (result.Success && result.Results) {\n const permissionPromises = result.Results.map(async (perm) => {\n if (perm.UserID) {\n const userRv = RunView.FromMetadataProvider(this.ProviderToUse);\n const userResult = await userRv.RunView<MJUserEntity>({\n EntityName: 'MJ: Users',\n ExtraFilter: `ID='${perm.UserID}'`,\n ResultType: 'entity_object'\n });\n\n if (userResult.Success && userResult.Results && userResult.Results.length > 0) {\n const user = userResult.Results[0];\n return {\n permissionId: perm.ID,\n userId: perm.UserID,\n userEmail: user.Email,\n userName: user.Name,\n permissionLevel: perm.PermissionLevel || 'View'\n } as SharePermission;\n }\n }\n return null;\n });\n\n const resolvedPermissions = await Promise.all(permissionPromises);\n this.permissions = resolvedPermissions.filter(p => p !== null) as SharePermission[];\n }\n } catch (error) {\n console.error('Failed to load permissions:', error);\n } finally {\n this.cdr.detectChanges();\n }\n }\n\n getAccessLevel(permission: SharePermission): string {\n return permission.permissionLevel;\n }\n\n async onAccessLevelChange(permission: SharePermission, level: 'View' | 'Edit' | 'Owner'): Promise<void> {\n permission.permissionLevel = level;\n await this.savePermission(permission);\n }\n\n async onAddUser(): Promise<void> {\n const email = this.newUserEmail.trim();\n if (!email) return;\n\n // Simple email validation\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) {\n await this.dialogService.alert('Invalid Email', 'Please enter a valid email address');\n return;\n }\n\n // Check if user already has access\n if (this.permissions.some(p => p.userEmail === email)) {\n await this.dialogService.alert('User Already Has Access', 'This user already has access');\n return;\n }\n\n try {\n // Look up user by email\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const userResult = await rv.RunView<MJUserEntity>({\n EntityName: 'MJ: Users',\n ExtraFilter: `Email='${email}'`,\n ResultType: 'entity_object'\n });\n\n if (!userResult.Success || !userResult.Results || userResult.Results.length === 0) {\n await this.dialogService.alert('User Not Found', 'No user found with that email address');\n return;\n }\n\n const user = userResult.Results[0];\n const newPermission: SharePermission = {\n permissionId: null,\n userId: user.ID,\n userEmail: user.Email,\n userName: user.Name,\n permissionLevel: 'View'\n };\n\n await this.savePermission(newPermission);\n this.permissions.push(newPermission);\n this.newUserEmail = '';\n this.toastService.success(`Access granted to ${user.Email}`);\n this.cdr.detectChanges();\n } catch (error) {\n console.error('Failed to add user:', error);\n this.toastService.error('Failed to add user');\n }\n }\n\n async onRemoveUser(permission: SharePermission): Promise<void> {\n const confirmed = await this.dialogService.confirm({\n title: 'Remove Access',\n message: `Remove access for ${permission.userEmail}?`,\n okText: 'Remove',\n cancelText: 'Cancel'\n });\n\n if (!confirmed) return;\n\n try {\n if (permission.permissionId) {\n const md = this.ProviderToUse;\n const permEntity = await md.GetEntityObject<MJResourcePermissionEntity>('MJ: Resource Permissions');\n await permEntity.Load(permission.permissionId);\n\n const deleteResult = await permEntity.Delete();\n if (!deleteResult) {\n throw new Error('Failed to delete permission');\n }\n }\n\n this.permissions = this.permissions.filter(p => p.userId !== permission.userId);\n this.toastService.success(`Access removed for ${permission.userEmail}`);\n } catch (error) {\n console.error('Failed to remove user:', error);\n this.toastService.error('Failed to remove user');\n }\n }\n\n private async savePermission(permission: SharePermission): Promise<void> {\n try {\n const md = this.ProviderToUse;\n const permEntity = await md.GetEntityObject<MJResourcePermissionEntity>('MJ: Resource Permissions');\n\n if (permission.permissionId) {\n // Update existing permission\n await permEntity.Load(permission.permissionId);\n permEntity.PermissionLevel = permission.permissionLevel;\n } else {\n // Create new permission\n permEntity.ResourceTypeID = this.CONVERSATIONS_RESOURCE_TYPE_ID;\n permEntity.ResourceRecordID = this.conversation.ID;\n permEntity.Type = 'User';\n permEntity.UserID = permission.userId;\n permEntity.PermissionLevel = permission.permissionLevel;\n permEntity.Status = 'Approved';\n }\n\n const saveResult = await permEntity.Save();\n if (!saveResult) {\n throw new Error('Failed to save permission');\n }\n\n // Update the permission ID if it was a new permission\n if (!permission.permissionId) {\n permission.permissionId = permEntity.ID;\n }\n } catch (error) {\n console.error('Failed to save permission:', error);\n throw error;\n }\n }\n\n async onTogglePublicLink(): Promise<void> {\n try {\n // Note: Public link functionality uses the conversation ID directly.\n // For enhanced security with unique tokens, password protection, and expiration,\n // future migration should add: PublicAccessToken, PublicAccessPassword, PublicAccessExpiresAt fields\n this.updateShareLink();\n } catch (error) {\n console.error('Failed to toggle public link:', error);\n await this.dialogService.alert('Error', 'Failed to update sharing settings');\n }\n }\n\n private updateShareLink(): void {\n if (this.isPublicLink && this.conversation) {\n // Generate shareable link\n const baseUrl = window.location.origin;\n this.shareLink = `${baseUrl}/chat/${this.conversation.ID}`;\n } else {\n this.shareLink = '';\n }\n }\n\n async onCopyLink(): Promise<void> {\n try {\n await navigator.clipboard.writeText(this.shareLink);\n this.toastService.success('Link copied to clipboard');\n } catch (err) {\n console.error('Failed to copy link:', err);\n this.toastService.error('Failed to copy link');\n }\n }\n\n onClose(): void {\n this.closed.emit();\n }\n}"]}
1
+ {"version":3,"file":"share-modal.component.js","sourceRoot":"","sources":["../../../../src/lib/components/share/share-modal.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, ChangeDetectorRef } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { MJConversationEntity, MJResourcePermissionEntity, MJUserEntity } from '@memberjunction/core-entities';\nimport { UserInfo, RunView, Metadata } from '@memberjunction/core';\nimport { DialogService } from '../../services/dialog.service';\nimport { ToastService } from '../../services/toast.service';\n\ninterface SharePermission {\n permissionId: string | null;\n userId: string;\n userEmail: string;\n userName: string;\n permissionLevel: 'View' | 'Edit' | 'Owner';\n}\n\n@Component({\n standalone: false,\n selector: 'mj-share-modal',\n template: `\n @if (isOpen) {\n <mj-dialog\n [Title]=\"'Share: ' + (conversation.Name || '')\"\n [Width]=\"500\"\n [Height]=\"600\"\n [Visible]=\"true\"\n (Close)=\"onClose()\">\n <div class=\"share-content\">\n <div class=\"add-user-section\">\n <h4>Add People</h4>\n <div class=\"add-user-form\">\n <input\n type=\"text\"\n [(ngModel)]=\"newUserEmail\"\n placeholder=\"Enter email address\"\n class=\"mj-textbox\"\n style=\"flex: 1;\">\n <button mjButton variant=\"primary\" (click)=\"onAddUser()\">\n Add\n </button>\n </div>\n </div>\n <div class=\"permissions-section\">\n <h4>People with Access</h4>\n <div class=\"permission-list\">\n @if (permissions.length === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-user-group\"\n Title=\"No one has been given access yet\"\n Size=\"compact\" />\n }\n @for (permission of permissions; track permission) {\n <div class=\"permission-item\">\n <div class=\"user-info\">\n <i class=\"fas fa-user-circle\"></i>\n <div class=\"user-details\">\n <div class=\"user-name\">{{ permission.userName }}</div>\n <div class=\"user-email\">{{ permission.userEmail }}</div>\n </div>\n </div>\n <div class=\"permission-controls\">\n <select\n [ngModel]=\"permission.permissionLevel\"\n (ngModelChange)=\"onAccessLevelChange(permission, $event)\"\n style=\"width: 120px;\" class=\"mj-select\">\n @for (level of accessLevels; track level.value) {\n <option [value]=\"level.value\">{{ level.label }}</option>\n }\n </select>\n <button\n class=\"btn-remove\"\n (click)=\"onRemoveUser(permission)\"\n title=\"Remove access\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"link-section\">\n <h4>Share Link</h4>\n <div class=\"link-controls\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"isPublicLink\"\n (ngModelChange)=\"onTogglePublicLink()\">\n <label>Anyone with the link can view</label>\n </div>\n @if (isPublicLink) {\n <div class=\"link-display\">\n <input\n type=\"text\"\n [value]=\"shareLink\"\n readonly\n class=\"mj-textbox\"\n style=\"flex: 1;\">\n <button mjButton variant=\"flat\" (click)=\"onCopyLink()\">\n <i class=\"fas fa-copy\"></i> Copy\n </button>\n </div>\n }\n </div>\n </div>\n <mj-dialog-actions>\n <button mjButton (click)=\"onClose()\">Close</button>\n </mj-dialog-actions>\n </mj-dialog>\n }\n `,\n styles: [`\n .share-content { display: flex; flex-direction: column; gap: 24px; }\n\n .add-user-section h4,\n .permissions-section h4,\n .link-section h4 { margin: 0 0 12px 0; font-size: 14px; font-weight: 600; }\n\n .add-user-form { display: flex; gap: 8px; }\n\n .permission-list { border: 1px solid #D9D9D9; border-radius: 4px; max-height: 300px; overflow-y: auto; }\n .permission-item { padding: 12px; border-bottom: 1px solid #E8E8E8; display: flex; justify-content: space-between; align-items: center; }\n .permission-item:last-child { border-bottom: none; }\n\n .user-info { display: flex; align-items: center; gap: 12px; flex: 1; }\n .user-info i { font-size: 32px; color: #999; }\n .user-details { display: flex; flex-direction: column; }\n .user-name { font-size: 14px; font-weight: 500; }\n .user-email { font-size: 12px; color: #666; }\n\n .permission-controls { display: flex; align-items: center; gap: 8px; }\n .btn-remove { padding: 6px 8px; background: transparent; border: none; cursor: pointer; border-radius: 3px; color: #999; }\n .btn-remove:hover { background: #FFEBEE; color: #D32F2F; }\n\n .link-controls { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }\n .link-controls label { font-size: 13px; }\n\n .link-display { display: flex; gap: 8px; }\n `]\n})\nexport class ShareModalComponent extends BaseAngularComponent implements OnInit {\n @Input() conversation!: MJConversationEntity;\n @Input() currentUser!: UserInfo;\n @Input() isOpen: boolean = false;\n\n @Output() closed = new EventEmitter<void>();\n\n public permissions: SharePermission[] = [];\n public newUserEmail: string = '';\n public isPublicLink: boolean = false;\n public shareLink: string = '';\n\n public accessLevels = [\n { label: 'Can View', value: 'View' },\n { label: 'Can Edit', value: 'Edit' },\n { label: 'Owner', value: 'Owner' }\n ];\n\n private readonly CONVERSATIONS_RESOURCE_TYPE_ID = '81D4BC3D-9FEB-EF11-B01A-286B35C04427';\n\n constructor(\n private dialogService: DialogService,\n private toastService: ToastService,\n private cdr: ChangeDetectorRef\n ) {\n super();}\n\n ngOnInit() {\n if (this.conversation) {\n this.loadPermissions();\n this.updateShareLink();\n }\n }\n\n private async loadPermissions(): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJResourcePermissionEntity>({\n EntityName: 'MJ: Resource Permissions',\n ExtraFilter: `ResourceTypeID='${this.CONVERSATIONS_RESOURCE_TYPE_ID}' AND ResourceRecordID='${this.conversation.ID}' AND Status='Approved'`,\n ResultType: 'entity_object'\n });\n\n if (result.Success && result.Results) {\n const permissionPromises = result.Results.map(async (perm) => {\n if (perm.UserID) {\n const userRv = RunView.FromMetadataProvider(this.ProviderToUse);\n const userResult = await userRv.RunView<MJUserEntity>({\n EntityName: 'MJ: Users',\n ExtraFilter: `ID='${perm.UserID}'`,\n ResultType: 'entity_object'\n });\n\n if (userResult.Success && userResult.Results && userResult.Results.length > 0) {\n const user = userResult.Results[0];\n return {\n permissionId: perm.ID,\n userId: perm.UserID,\n userEmail: user.Email,\n userName: user.Name,\n permissionLevel: perm.PermissionLevel || 'View'\n } as SharePermission;\n }\n }\n return null;\n });\n\n const resolvedPermissions = await Promise.all(permissionPromises);\n this.permissions = resolvedPermissions.filter(p => p !== null) as SharePermission[];\n }\n } catch (error) {\n console.error('Failed to load permissions:', error);\n } finally {\n this.cdr.detectChanges();\n }\n }\n\n getAccessLevel(permission: SharePermission): string {\n return permission.permissionLevel;\n }\n\n async onAccessLevelChange(permission: SharePermission, level: 'View' | 'Edit' | 'Owner'): Promise<void> {\n permission.permissionLevel = level;\n await this.savePermission(permission);\n }\n\n async onAddUser(): Promise<void> {\n const email = this.newUserEmail.trim();\n if (!email) return;\n\n // Simple email validation\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) {\n await this.dialogService.alert('Invalid Email', 'Please enter a valid email address');\n return;\n }\n\n // Check if user already has access\n if (this.permissions.some(p => p.userEmail === email)) {\n await this.dialogService.alert('User Already Has Access', 'This user already has access');\n return;\n }\n\n try {\n // Look up user by email\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const userResult = await rv.RunView<MJUserEntity>({\n EntityName: 'MJ: Users',\n ExtraFilter: `Email='${email}'`,\n ResultType: 'entity_object'\n });\n\n if (!userResult.Success || !userResult.Results || userResult.Results.length === 0) {\n await this.dialogService.alert('User Not Found', 'No user found with that email address');\n return;\n }\n\n const user = userResult.Results[0];\n const newPermission: SharePermission = {\n permissionId: null,\n userId: user.ID,\n userEmail: user.Email,\n userName: user.Name,\n permissionLevel: 'View'\n };\n\n await this.savePermission(newPermission);\n this.permissions.push(newPermission);\n this.newUserEmail = '';\n this.toastService.success(`Access granted to ${user.Email}`);\n this.cdr.detectChanges();\n } catch (error) {\n console.error('Failed to add user:', error);\n this.toastService.error('Failed to add user');\n }\n }\n\n async onRemoveUser(permission: SharePermission): Promise<void> {\n const confirmed = await this.dialogService.confirm({\n title: 'Remove Access',\n message: `Remove access for ${permission.userEmail}?`,\n okText: 'Remove',\n cancelText: 'Cancel'\n });\n\n if (!confirmed) return;\n\n try {\n if (permission.permissionId) {\n const md = this.ProviderToUse;\n const permEntity = await md.GetEntityObject<MJResourcePermissionEntity>('MJ: Resource Permissions');\n await permEntity.Load(permission.permissionId);\n\n const deleteResult = await permEntity.Delete();\n if (!deleteResult) {\n throw new Error('Failed to delete permission');\n }\n }\n\n this.permissions = this.permissions.filter(p => p.userId !== permission.userId);\n this.toastService.success(`Access removed for ${permission.userEmail}`);\n } catch (error) {\n console.error('Failed to remove user:', error);\n this.toastService.error('Failed to remove user');\n }\n }\n\n private async savePermission(permission: SharePermission): Promise<void> {\n try {\n const md = this.ProviderToUse;\n const permEntity = await md.GetEntityObject<MJResourcePermissionEntity>('MJ: Resource Permissions');\n\n if (permission.permissionId) {\n // Update existing permission\n await permEntity.Load(permission.permissionId);\n permEntity.PermissionLevel = permission.permissionLevel;\n } else {\n // Create new permission\n permEntity.ResourceTypeID = this.CONVERSATIONS_RESOURCE_TYPE_ID;\n permEntity.ResourceRecordID = this.conversation.ID;\n permEntity.Type = 'User';\n permEntity.UserID = permission.userId;\n permEntity.PermissionLevel = permission.permissionLevel;\n permEntity.Status = 'Approved';\n }\n\n const saveResult = await permEntity.Save();\n if (!saveResult) {\n throw new Error('Failed to save permission');\n }\n\n // Update the permission ID if it was a new permission\n if (!permission.permissionId) {\n permission.permissionId = permEntity.ID;\n }\n } catch (error) {\n console.error('Failed to save permission:', error);\n throw error;\n }\n }\n\n async onTogglePublicLink(): Promise<void> {\n try {\n // Note: Public link functionality uses the conversation ID directly.\n // For enhanced security with unique tokens, password protection, and expiration,\n // future migration should add: PublicAccessToken, PublicAccessPassword, PublicAccessExpiresAt fields\n this.updateShareLink();\n } catch (error) {\n console.error('Failed to toggle public link:', error);\n await this.dialogService.alert('Error', 'Failed to update sharing settings');\n }\n }\n\n private updateShareLink(): void {\n if (this.isPublicLink && this.conversation) {\n // Generate shareable link\n const baseUrl = window.location.origin;\n this.shareLink = `${baseUrl}/chat/${this.conversation.ID}`;\n } else {\n this.shareLink = '';\n }\n }\n\n async onCopyLink(): Promise<void> {\n try {\n await navigator.clipboard.writeText(this.shareLink);\n this.toastService.success('Link copied to clipboard');\n } catch (err) {\n console.error('Failed to copy link:', err);\n this.toastService.error('Failed to copy link');\n }\n }\n\n onClose(): void {\n this.closed.emit();\n }\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"user-picker.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/shared/user-picker.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC7G,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAGrE,OAAO,EAAE,QAAQ,EAAW,MAAM,sBAAsB,CAAC;;AAGzD,MAAM,WAAW,gBAAgB;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,qBA4La,mBAAoB,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IAK1E,OAAO,CAAC,GAAG;IAJd,WAAW,EAAG,QAAQ,CAAC;IACvB,cAAc,EAAE,MAAM,EAAE,CAAM;IAC9B,WAAW,EAAE,MAAM,CAAwC;gBAEhD,GAAG,EAAE,iBAAiB;IAGhC,YAAY,iCAAwC;IAE9D,WAAW,EAAE,MAAM,CAAM;IACzB,aAAa,EAAE,gBAAgB,EAAE,CAAM;IACvC,WAAW,EAAE,OAAO,CAAS;IAC7B,WAAW,EAAE,OAAO,CAAS;IAE7B,QAAQ,IAAI,IAAI;IAKhB,WAAW,IAAI,IAAI;IAInB,OAAO,CAAC,kBAAkB;IAO1B,QAAQ,IAAI,IAAI;IAShB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;YAO5B,aAAa;yCA/ClB,mBAAmB;2CAAnB,mBAAmB;CAiH/B"}
1
+ {"version":3,"file":"user-picker.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/shared/user-picker.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC7G,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAIrE,OAAO,EAAE,QAAQ,EAAW,MAAM,sBAAsB,CAAC;;AAGzD,MAAM,WAAW,gBAAgB;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,qBAyKa,mBAAoB,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IAK1E,OAAO,CAAC,GAAG;IAJd,WAAW,EAAG,QAAQ,CAAC;IACvB,cAAc,EAAE,MAAM,EAAE,CAAM;IAC9B,WAAW,EAAE,MAAM,CAAwC;gBAEhD,GAAG,EAAE,iBAAiB;IAGhC,YAAY,iCAAwC;IAE9D,WAAW,EAAE,MAAM,CAAM;IACzB,aAAa,EAAE,gBAAgB,EAAE,CAAM;IACvC,WAAW,EAAE,OAAO,CAAS;IAC7B,WAAW,EAAE,OAAO,CAAS;IAE7B,QAAQ,IAAI,IAAI;IAKhB,WAAW,IAAI,IAAI;IAInB,OAAO,CAAC,kBAAkB;IAO1B,QAAQ,IAAI,IAAI;IAShB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;YAO5B,aAAa;yCA/ClB,mBAAmB;2CAAnB,mBAAmB;CAiH/B"}
@@ -1,6 +1,7 @@
1
1
  import { Component, Input, Output, EventEmitter } from '@angular/core';
2
2
  import { BaseAngularComponent } from '@memberjunction/ng-base-types';
3
3
  import { FormsModule } from '@angular/forms';
4
+ import { MJEmptyStateComponent } from '@memberjunction/ng-ui-components';
4
5
  import { RunView } from '@memberjunction/core';
5
6
  import * as i0 from "@angular/core";
6
7
  import * as i1 from "@angular/forms";
@@ -41,11 +42,9 @@ function UserPickerComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
41
42
  i0.ɵɵrepeater(ctx_r2.searchResults);
42
43
  } }
43
44
  function UserPickerComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
44
- i0.ɵɵelementStart(0, "div", 6)(1, "div", 14);
45
- i0.ɵɵelement(2, "i", 15);
46
- i0.ɵɵelementStart(3, "span");
47
- i0.ɵɵtext(4, "No users found");
48
- i0.ɵɵelementEnd()()();
45
+ i0.ɵɵelementStart(0, "div", 6);
46
+ i0.ɵɵelement(1, "mj-empty-state", 14);
47
+ i0.ɵɵelementEnd();
49
48
  } }
50
49
  export class UserPickerComponent extends BaseAngularComponent {
51
50
  cdr;
@@ -149,7 +148,7 @@ export class UserPickerComponent extends BaseAngularComponent {
149
148
  }
150
149
  }
151
150
  static ɵfac = function UserPickerComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || UserPickerComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
152
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: UserPickerComponent, selectors: [["mj-user-picker"]], inputs: { currentUser: "currentUser", excludeUserIds: "excludeUserIds", placeholder: "placeholder" }, outputs: { userSelected: "userSelected" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 8, vars: 7, consts: [[1, "user-picker"], [1, "search-input-wrapper"], ["type", "text", 1, "user-search-input", 3, "ngModelChange", "keydown.enter", "ngModel", "placeholder", "disabled"], [1, "search-button", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-search"], [1, "search-results-dropdown"], [1, "user-search-item"], [1, "user-search-item", 3, "click"], [1, "user-avatar"], [1, "fa-solid", "fa-user"], [1, "user-info"], [1, "user-name"], [1, "user-email"], [1, "no-results"], [1, "fa-solid", "fa-user-slash"]], template: function UserPickerComponent_Template(rf, ctx) { if (rf & 1) {
151
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: UserPickerComponent, selectors: [["mj-user-picker"]], inputs: { currentUser: "currentUser", excludeUserIds: "excludeUserIds", placeholder: "placeholder" }, outputs: { userSelected: "userSelected" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 8, vars: 7, consts: [[1, "user-picker"], [1, "search-input-wrapper"], ["type", "text", 1, "user-search-input", 3, "ngModelChange", "keydown.enter", "ngModel", "placeholder", "disabled"], [1, "search-button", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-search"], [1, "search-results-dropdown"], [1, "user-search-item"], [1, "user-search-item", 3, "click"], [1, "user-avatar"], [1, "fa-solid", "fa-user"], [1, "user-info"], [1, "user-name"], [1, "user-email"], ["Variant", "no-results", "Size", "compact", "Icon", "fa-solid fa-user-slash", "Title", "No users found"]], template: function UserPickerComponent_Template(rf, ctx) { if (rf & 1) {
153
152
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "input", 2);
154
153
  i0.ɵɵtwoWayListener("ngModelChange", function UserPickerComponent_Template_input_ngModelChange_2_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.searchQuery, $event) || (ctx.searchQuery = $event); return $event; });
155
154
  i0.ɵɵlistener("keydown.enter", function UserPickerComponent_Template_input_keydown_enter_2_listener() { return ctx.onSearch(); });
@@ -159,7 +158,7 @@ export class UserPickerComponent extends BaseAngularComponent {
159
158
  i0.ɵɵconditionalCreate(4, UserPickerComponent_Conditional_4_Template, 1, 0, "i", 4)(5, UserPickerComponent_Conditional_5_Template, 1, 0, "i", 5);
160
159
  i0.ɵɵelementEnd()();
161
160
  i0.ɵɵconditionalCreate(6, UserPickerComponent_Conditional_6_Template, 3, 0, "div", 6);
162
- i0.ɵɵconditionalCreate(7, UserPickerComponent_Conditional_7_Template, 5, 0, "div", 6);
161
+ i0.ɵɵconditionalCreate(7, UserPickerComponent_Conditional_7_Template, 2, 0, "div", 6);
163
162
  i0.ɵɵelementEnd();
164
163
  } if (rf & 2) {
165
164
  i0.ɵɵadvance(2);
@@ -173,11 +172,11 @@ export class UserPickerComponent extends BaseAngularComponent {
173
172
  i0.ɵɵconditional(ctx.showResults && ctx.searchResults.length > 0 ? 6 : -1);
174
173
  i0.ɵɵadvance();
175
174
  i0.ɵɵconditional(ctx.showResults && ctx.searchResults.length === 0 && ctx.searchQuery.length >= 2 && !ctx.isSearching ? 7 : -1);
176
- } }, dependencies: [FormsModule, i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel], styles: [".user-picker[_ngcontent-%COMP%] {\n width: 100%;\n position: relative;\n }\n\n .search-input-wrapper[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n width: 100%;\n }\n\n .user-search-input[_ngcontent-%COMP%] {\n flex: 1;\n padding: 8px 12px;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n font-size: 14px;\n outline: none;\n transition: border-color 0.2s;\n }\n\n .user-search-input[_ngcontent-%COMP%]:focus {\n border-color: #6366F1;\n }\n\n .user-search-input[_ngcontent-%COMP%]:disabled {\n background: #F3F4F6;\n cursor: not-allowed;\n }\n\n .search-button[_ngcontent-%COMP%] {\n padding: 8px 16px;\n background: #6366F1;\n color: white;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.2s;\n }\n\n .search-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #5558E3;\n }\n\n .search-button[_ngcontent-%COMP%]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .search-button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n }\n\n .search-results-dropdown[_ngcontent-%COMP%] {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n max-height: 300px;\n overflow-y: auto;\n z-index: 1000;\n }\n\n .user-search-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .user-search-item[_ngcontent-%COMP%]:hover {\n background-color: #F3F4F6;\n }\n\n .user-avatar[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n background: linear-gradient(135deg, #667EEA 0%, #764BA2 100%);\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n font-size: 16px;\n flex-shrink: 0;\n }\n\n .user-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n }\n\n .user-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: #1F2937;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .user-email[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #6B7280;\n margin-top: 2px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .no-results[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 24px;\n color: #9CA3AF;\n }\n\n .no-results[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n }\n\n .no-results[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 14px;\n }"] });
175
+ } }, dependencies: [FormsModule, i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel, MJEmptyStateComponent], styles: [".user-picker[_ngcontent-%COMP%] {\n width: 100%;\n position: relative;\n }\n\n .search-input-wrapper[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n width: 100%;\n }\n\n .user-search-input[_ngcontent-%COMP%] {\n flex: 1;\n padding: 8px 12px;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n font-size: 14px;\n outline: none;\n transition: border-color 0.2s;\n }\n\n .user-search-input[_ngcontent-%COMP%]:focus {\n border-color: #6366F1;\n }\n\n .user-search-input[_ngcontent-%COMP%]:disabled {\n background: #F3F4F6;\n cursor: not-allowed;\n }\n\n .search-button[_ngcontent-%COMP%] {\n padding: 8px 16px;\n background: #6366F1;\n color: white;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.2s;\n }\n\n .search-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #5558E3;\n }\n\n .search-button[_ngcontent-%COMP%]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .search-button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n }\n\n .search-results-dropdown[_ngcontent-%COMP%] {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n max-height: 300px;\n overflow-y: auto;\n z-index: 1000;\n }\n\n .user-search-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .user-search-item[_ngcontent-%COMP%]:hover {\n background-color: #F3F4F6;\n }\n\n .user-avatar[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n background: linear-gradient(135deg, #667EEA 0%, #764BA2 100%);\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n font-size: 16px;\n flex-shrink: 0;\n }\n\n .user-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n }\n\n .user-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: #1F2937;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .user-email[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #6B7280;\n margin-top: 2px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }"] });
177
176
  }
178
177
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(UserPickerComponent, [{
179
178
  type: Component,
180
- args: [{ selector: 'mj-user-picker', standalone: true, imports: [FormsModule], template: `
179
+ args: [{ selector: 'mj-user-picker', standalone: true, imports: [FormsModule, MJEmptyStateComponent], template: `
181
180
  <div class="user-picker">
182
181
  <div class="search-input-wrapper">
183
182
  <input
@@ -215,14 +214,12 @@ export class UserPickerComponent extends BaseAngularComponent {
215
214
 
216
215
  @if (showResults && searchResults.length === 0 && searchQuery.length >= 2 && !isSearching) {
217
216
  <div class="search-results-dropdown">
218
- <div class="no-results">
219
- <i class="fa-solid fa-user-slash"></i>
220
- <span>No users found</span>
221
- </div>
217
+ <mj-empty-state Variant="no-results" Size="compact"
218
+ Icon="fa-solid fa-user-slash" Title="No users found" />
222
219
  </div>
223
220
  }
224
221
  </div>
225
- `, styles: ["\n .user-picker {\n width: 100%;\n position: relative;\n }\n\n .search-input-wrapper {\n display: flex;\n gap: 8px;\n width: 100%;\n }\n\n .user-search-input {\n flex: 1;\n padding: 8px 12px;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n font-size: 14px;\n outline: none;\n transition: border-color 0.2s;\n }\n\n .user-search-input:focus {\n border-color: #6366F1;\n }\n\n .user-search-input:disabled {\n background: #F3F4F6;\n cursor: not-allowed;\n }\n\n .search-button {\n padding: 8px 16px;\n background: #6366F1;\n color: white;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.2s;\n }\n\n .search-button:hover:not(:disabled) {\n background: #5558E3;\n }\n\n .search-button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .search-button i {\n font-size: 14px;\n }\n\n .search-results-dropdown {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n max-height: 300px;\n overflow-y: auto;\n z-index: 1000;\n }\n\n .user-search-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .user-search-item:hover {\n background-color: #F3F4F6;\n }\n\n .user-avatar {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n background: linear-gradient(135deg, #667EEA 0%, #764BA2 100%);\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n font-size: 16px;\n flex-shrink: 0;\n }\n\n .user-info {\n flex: 1;\n min-width: 0;\n }\n\n .user-name {\n font-size: 14px;\n font-weight: 500;\n color: #1F2937;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .user-email {\n font-size: 12px;\n color: #6B7280;\n margin-top: 2px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .no-results {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 24px;\n color: #9CA3AF;\n }\n\n .no-results i {\n font-size: 32px;\n }\n\n .no-results span {\n font-size: 14px;\n }\n "] }]
222
+ `, styles: ["\n .user-picker {\n width: 100%;\n position: relative;\n }\n\n .search-input-wrapper {\n display: flex;\n gap: 8px;\n width: 100%;\n }\n\n .user-search-input {\n flex: 1;\n padding: 8px 12px;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n font-size: 14px;\n outline: none;\n transition: border-color 0.2s;\n }\n\n .user-search-input:focus {\n border-color: #6366F1;\n }\n\n .user-search-input:disabled {\n background: #F3F4F6;\n cursor: not-allowed;\n }\n\n .search-button {\n padding: 8px 16px;\n background: #6366F1;\n color: white;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.2s;\n }\n\n .search-button:hover:not(:disabled) {\n background: #5558E3;\n }\n\n .search-button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .search-button i {\n font-size: 14px;\n }\n\n .search-results-dropdown {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n max-height: 300px;\n overflow-y: auto;\n z-index: 1000;\n }\n\n .user-search-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n cursor: pointer;\n transition: background 0.15s;\n }\n\n .user-search-item:hover {\n background-color: #F3F4F6;\n }\n\n .user-avatar {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n background: linear-gradient(135deg, #667EEA 0%, #764BA2 100%);\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n font-size: 16px;\n flex-shrink: 0;\n }\n\n .user-info {\n flex: 1;\n min-width: 0;\n }\n\n .user-name {\n font-size: 14px;\n font-weight: 500;\n color: #1F2937;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .user-email {\n font-size: 12px;\n color: #6B7280;\n margin-top: 2px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n "] }]
226
223
  }], () => [{ type: i0.ChangeDetectorRef }], { currentUser: [{
227
224
  type: Input
228
225
  }], excludeUserIds: [{
@@ -232,5 +229,5 @@ export class UserPickerComponent extends BaseAngularComponent {
232
229
  }], userSelected: [{
233
230
  type: Output
234
231
  }] }); })();
235
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(UserPickerComponent, { className: "UserPickerComponent", filePath: "src/lib/components/shared/user-picker.component.ts", lineNumber: 204 }); })();
232
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(UserPickerComponent, { className: "UserPickerComponent", filePath: "src/lib/components/shared/user-picker.component.ts", lineNumber: 186 }); })();
236
233
  //# sourceMappingURL=user-picker.component.js.map