@memberjunction/ng-conversations 2.104.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 (226) hide show
  1. package/README.md +197 -0
  2. package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts +20 -0
  3. package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts.map +1 -0
  4. package/dist/lib/components/active-tasks/active-tasks-panel.component.js +125 -0
  5. package/dist/lib/components/active-tasks/active-tasks-panel.component.js.map +1 -0
  6. package/dist/lib/components/agent/active-agent-indicator.component.d.ts +48 -0
  7. package/dist/lib/components/agent/active-agent-indicator.component.d.ts.map +1 -0
  8. package/dist/lib/components/agent/active-agent-indicator.component.js +199 -0
  9. package/dist/lib/components/agent/active-agent-indicator.component.js.map +1 -0
  10. package/dist/lib/components/agent/agent-process-panel.component.d.ts +30 -0
  11. package/dist/lib/components/agent/agent-process-panel.component.d.ts.map +1 -0
  12. package/dist/lib/components/agent/agent-process-panel.component.js +333 -0
  13. package/dist/lib/components/agent/agent-process-panel.component.js.map +1 -0
  14. package/dist/lib/components/artifact/artifact-panel.component.d.ts +22 -0
  15. package/dist/lib/components/artifact/artifact-panel.component.d.ts.map +1 -0
  16. package/dist/lib/components/artifact/artifact-panel.component.js +237 -0
  17. package/dist/lib/components/artifact/artifact-panel.component.js.map +1 -0
  18. package/dist/lib/components/artifact/artifact-upload-modal.component.d.ts +39 -0
  19. package/dist/lib/components/artifact/artifact-upload-modal.component.d.ts.map +1 -0
  20. package/dist/lib/components/artifact/artifact-upload-modal.component.js +384 -0
  21. package/dist/lib/components/artifact/artifact-upload-modal.component.js.map +1 -0
  22. package/dist/lib/components/artifact/artifact-version-history.component.d.ts +28 -0
  23. package/dist/lib/components/artifact/artifact-version-history.component.d.ts.map +1 -0
  24. package/dist/lib/components/artifact/artifact-version-history.component.js +280 -0
  25. package/dist/lib/components/artifact/artifact-version-history.component.js.map +1 -0
  26. package/dist/lib/components/artifact/artifact-viewer-panel.component.d.ts +22 -0
  27. package/dist/lib/components/artifact/artifact-viewer-panel.component.d.ts.map +1 -0
  28. package/dist/lib/components/artifact/artifact-viewer-panel.component.js +182 -0
  29. package/dist/lib/components/artifact/artifact-viewer-panel.component.js.map +1 -0
  30. package/dist/lib/components/artifact/artifact-viewer.component.d.ts +27 -0
  31. package/dist/lib/components/artifact/artifact-viewer.component.d.ts.map +1 -0
  32. package/dist/lib/components/artifact/artifact-viewer.component.js +266 -0
  33. package/dist/lib/components/artifact/artifact-viewer.component.js.map +1 -0
  34. package/dist/lib/components/artifact/inline-artifact.component.d.ts +46 -0
  35. package/dist/lib/components/artifact/inline-artifact.component.d.ts.map +1 -0
  36. package/dist/lib/components/artifact/inline-artifact.component.js +447 -0
  37. package/dist/lib/components/artifact/inline-artifact.component.js.map +1 -0
  38. package/dist/lib/components/collection/collection-artifact-card.component.d.ts +18 -0
  39. package/dist/lib/components/collection/collection-artifact-card.component.d.ts.map +1 -0
  40. package/dist/lib/components/collection/collection-artifact-card.component.js +147 -0
  41. package/dist/lib/components/collection/collection-artifact-card.component.js.map +1 -0
  42. package/dist/lib/components/collection/collection-form-modal.component.d.ts +33 -0
  43. package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -0
  44. package/dist/lib/components/collection/collection-form-modal.component.js +245 -0
  45. package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -0
  46. package/dist/lib/components/collection/collection-tree.component.d.ts +42 -0
  47. package/dist/lib/components/collection/collection-tree.component.d.ts.map +1 -0
  48. package/dist/lib/components/collection/collection-tree.component.js +482 -0
  49. package/dist/lib/components/collection/collection-tree.component.js.map +1 -0
  50. package/dist/lib/components/collection/collection-view.component.d.ts +31 -0
  51. package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -0
  52. package/dist/lib/components/collection/collection-view.component.js +254 -0
  53. package/dist/lib/components/collection/collection-view.component.js.map +1 -0
  54. package/dist/lib/components/collection/collections-full-view.component.d.ts +55 -0
  55. package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -0
  56. package/dist/lib/components/collection/collections-full-view.component.js +578 -0
  57. package/dist/lib/components/collection/collections-full-view.component.js.map +1 -0
  58. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +160 -0
  59. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -0
  60. package/dist/lib/components/conversation/conversation-chat-area.component.js +891 -0
  61. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -0
  62. package/dist/lib/components/conversation/conversation-list.component.d.ts +29 -0
  63. package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -0
  64. package/dist/lib/components/conversation/conversation-list.component.js +255 -0
  65. package/dist/lib/components/conversation/conversation-list.component.js.map +1 -0
  66. package/dist/lib/components/dialogs/input-dialog.component.d.ts +17 -0
  67. package/dist/lib/components/dialogs/input-dialog.component.d.ts.map +1 -0
  68. package/dist/lib/components/dialogs/input-dialog.component.js +122 -0
  69. package/dist/lib/components/dialogs/input-dialog.component.js.map +1 -0
  70. package/dist/lib/components/export/export-modal.component.d.ts +37 -0
  71. package/dist/lib/components/export/export-modal.component.d.ts.map +1 -0
  72. package/dist/lib/components/export/export-modal.component.js +414 -0
  73. package/dist/lib/components/export/export-modal.component.js.map +1 -0
  74. package/dist/lib/components/library/library-full-view.component.d.ts +36 -0
  75. package/dist/lib/components/library/library-full-view.component.d.ts.map +1 -0
  76. package/dist/lib/components/library/library-full-view.component.js +270 -0
  77. package/dist/lib/components/library/library-full-view.component.js.map +1 -0
  78. package/dist/lib/components/members/members-modal.component.d.ts +42 -0
  79. package/dist/lib/components/members/members-modal.component.d.ts.map +1 -0
  80. package/dist/lib/components/members/members-modal.component.js +352 -0
  81. package/dist/lib/components/members/members-modal.component.js.map +1 -0
  82. package/dist/lib/components/mention/mention-dropdown.component.d.ts +44 -0
  83. package/dist/lib/components/mention/mention-dropdown.component.d.ts.map +1 -0
  84. package/dist/lib/components/mention/mention-dropdown.component.js +194 -0
  85. package/dist/lib/components/mention/mention-dropdown.component.js.map +1 -0
  86. package/dist/lib/components/message/message-input.component.d.ts +137 -0
  87. package/dist/lib/components/message/message-input.component.d.ts.map +1 -0
  88. package/dist/lib/components/message/message-input.component.js +1159 -0
  89. package/dist/lib/components/message/message-input.component.js.map +1 -0
  90. package/dist/lib/components/message/message-item.component.d.ts +140 -0
  91. package/dist/lib/components/message/message-item.component.d.ts.map +1 -0
  92. package/dist/lib/components/message/message-item.component.js +817 -0
  93. package/dist/lib/components/message/message-item.component.js.map +1 -0
  94. package/dist/lib/components/message/message-list.component.d.ts +77 -0
  95. package/dist/lib/components/message/message-list.component.d.ts.map +1 -0
  96. package/dist/lib/components/message/message-list.component.js +316 -0
  97. package/dist/lib/components/message/message-list.component.js.map +1 -0
  98. package/dist/lib/components/navigation/conversation-navigation.component.d.ts +13 -0
  99. package/dist/lib/components/navigation/conversation-navigation.component.d.ts.map +1 -0
  100. package/dist/lib/components/navigation/conversation-navigation.component.js +88 -0
  101. package/dist/lib/components/navigation/conversation-navigation.component.js.map +1 -0
  102. package/dist/lib/components/notification/activity-indicator.component.d.ts +11 -0
  103. package/dist/lib/components/notification/activity-indicator.component.d.ts.map +1 -0
  104. package/dist/lib/components/notification/activity-indicator.component.js +56 -0
  105. package/dist/lib/components/notification/activity-indicator.component.js.map +1 -0
  106. package/dist/lib/components/notification/notification-badge.component.d.ts +27 -0
  107. package/dist/lib/components/notification/notification-badge.component.d.ts.map +1 -0
  108. package/dist/lib/components/notification/notification-badge.component.js +160 -0
  109. package/dist/lib/components/notification/notification-badge.component.js.map +1 -0
  110. package/dist/lib/components/project/project-form-modal.component.d.ts +34 -0
  111. package/dist/lib/components/project/project-form-modal.component.d.ts.map +1 -0
  112. package/dist/lib/components/project/project-form-modal.component.js +357 -0
  113. package/dist/lib/components/project/project-form-modal.component.js.map +1 -0
  114. package/dist/lib/components/project/project-selector.component.d.ts +36 -0
  115. package/dist/lib/components/project/project-selector.component.d.ts.map +1 -0
  116. package/dist/lib/components/project/project-selector.component.js +317 -0
  117. package/dist/lib/components/project/project-selector.component.js.map +1 -0
  118. package/dist/lib/components/search/search-panel.component.d.ts +120 -0
  119. package/dist/lib/components/search/search-panel.component.d.ts.map +1 -0
  120. package/dist/lib/components/search/search-panel.component.js +714 -0
  121. package/dist/lib/components/search/search-panel.component.js.map +1 -0
  122. package/dist/lib/components/share/share-modal.component.d.ts +46 -0
  123. package/dist/lib/components/share/share-modal.component.d.ts.map +1 -0
  124. package/dist/lib/components/share/share-modal.component.js +431 -0
  125. package/dist/lib/components/share/share-modal.component.js.map +1 -0
  126. package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts +18 -0
  127. package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts.map +1 -0
  128. package/dist/lib/components/sidebar/conversation-sidebar.component.js +81 -0
  129. package/dist/lib/components/sidebar/conversation-sidebar.component.js.map +1 -0
  130. package/dist/lib/components/task/task-form-modal.component.d.ts +42 -0
  131. package/dist/lib/components/task/task-form-modal.component.d.ts.map +1 -0
  132. package/dist/lib/components/task/task-form-modal.component.js +329 -0
  133. package/dist/lib/components/task/task-form-modal.component.js.map +1 -0
  134. package/dist/lib/components/task/task-item.component.d.ts +22 -0
  135. package/dist/lib/components/task/task-item.component.d.ts.map +1 -0
  136. package/dist/lib/components/task/task-item.component.js +234 -0
  137. package/dist/lib/components/task/task-item.component.js.map +1 -0
  138. package/dist/lib/components/task/task-list.component.d.ts +32 -0
  139. package/dist/lib/components/task/task-list.component.d.ts.map +1 -0
  140. package/dist/lib/components/task/task-list.component.js +290 -0
  141. package/dist/lib/components/task/task-list.component.js.map +1 -0
  142. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts +27 -0
  143. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -0
  144. package/dist/lib/components/tasks/tasks-dropdown.component.js +254 -0
  145. package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -0
  146. package/dist/lib/components/thread/thread-panel.component.d.ts +65 -0
  147. package/dist/lib/components/thread/thread-panel.component.d.ts.map +1 -0
  148. package/dist/lib/components/thread/thread-panel.component.js +325 -0
  149. package/dist/lib/components/thread/thread-panel.component.js.map +1 -0
  150. package/dist/lib/components/toast/toast.component.d.ts +26 -0
  151. package/dist/lib/components/toast/toast.component.d.ts.map +1 -0
  152. package/dist/lib/components/toast/toast.component.js +108 -0
  153. package/dist/lib/components/toast/toast.component.js.map +1 -0
  154. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +75 -0
  155. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -0
  156. package/dist/lib/components/workspace/conversation-workspace.component.js +299 -0
  157. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -0
  158. package/dist/lib/conversations.module.d.ts +62 -0
  159. package/dist/lib/conversations.module.d.ts.map +1 -0
  160. package/dist/lib/conversations.module.js +248 -0
  161. package/dist/lib/conversations.module.js.map +1 -0
  162. package/dist/lib/directives/search-shortcut.directive.d.ts +17 -0
  163. package/dist/lib/directives/search-shortcut.directive.d.ts.map +1 -0
  164. package/dist/lib/directives/search-shortcut.directive.js +39 -0
  165. package/dist/lib/directives/search-shortcut.directive.js.map +1 -0
  166. package/dist/lib/models/conversation-state.model.d.ts +72 -0
  167. package/dist/lib/models/conversation-state.model.d.ts.map +1 -0
  168. package/dist/lib/models/conversation-state.model.js +2 -0
  169. package/dist/lib/models/conversation-state.model.js.map +1 -0
  170. package/dist/lib/models/notification.model.d.ts +89 -0
  171. package/dist/lib/models/notification.model.d.ts.map +1 -0
  172. package/dist/lib/models/notification.model.js +11 -0
  173. package/dist/lib/models/notification.model.js.map +1 -0
  174. package/dist/lib/services/active-tasks.service.d.ts +65 -0
  175. package/dist/lib/services/active-tasks.service.d.ts.map +1 -0
  176. package/dist/lib/services/active-tasks.service.js +95 -0
  177. package/dist/lib/services/active-tasks.service.js.map +1 -0
  178. package/dist/lib/services/agent-state.service.d.ts +78 -0
  179. package/dist/lib/services/agent-state.service.d.ts.map +1 -0
  180. package/dist/lib/services/agent-state.service.js +213 -0
  181. package/dist/lib/services/agent-state.service.js.map +1 -0
  182. package/dist/lib/services/artifact-state.service.d.ts +114 -0
  183. package/dist/lib/services/artifact-state.service.d.ts.map +1 -0
  184. package/dist/lib/services/artifact-state.service.js +288 -0
  185. package/dist/lib/services/artifact-state.service.js.map +1 -0
  186. package/dist/lib/services/conversation-agent.service.d.ts +79 -0
  187. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -0
  188. package/dist/lib/services/conversation-agent.service.js +259 -0
  189. package/dist/lib/services/conversation-agent.service.js.map +1 -0
  190. package/dist/lib/services/conversation-state.service.d.ts +122 -0
  191. package/dist/lib/services/conversation-state.service.d.ts.map +1 -0
  192. package/dist/lib/services/conversation-state.service.js +255 -0
  193. package/dist/lib/services/conversation-state.service.js.map +1 -0
  194. package/dist/lib/services/dialog.service.d.ts +54 -0
  195. package/dist/lib/services/dialog.service.d.ts.map +1 -0
  196. package/dist/lib/services/dialog.service.js +157 -0
  197. package/dist/lib/services/dialog.service.js.map +1 -0
  198. package/dist/lib/services/export.service.d.ts +25 -0
  199. package/dist/lib/services/export.service.d.ts.map +1 -0
  200. package/dist/lib/services/export.service.js +237 -0
  201. package/dist/lib/services/export.service.js.map +1 -0
  202. package/dist/lib/services/mention-autocomplete.service.d.ts +59 -0
  203. package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -0
  204. package/dist/lib/services/mention-autocomplete.service.js +160 -0
  205. package/dist/lib/services/mention-autocomplete.service.js.map +1 -0
  206. package/dist/lib/services/mention-parser.service.d.ts +46 -0
  207. package/dist/lib/services/mention-parser.service.d.ts.map +1 -0
  208. package/dist/lib/services/mention-parser.service.js +156 -0
  209. package/dist/lib/services/mention-parser.service.js.map +1 -0
  210. package/dist/lib/services/notification.service.d.ts +108 -0
  211. package/dist/lib/services/notification.service.d.ts.map +1 -0
  212. package/dist/lib/services/notification.service.js +431 -0
  213. package/dist/lib/services/notification.service.js.map +1 -0
  214. package/dist/lib/services/search.service.d.ts +144 -0
  215. package/dist/lib/services/search.service.d.ts.map +1 -0
  216. package/dist/lib/services/search.service.js +370 -0
  217. package/dist/lib/services/search.service.js.map +1 -0
  218. package/dist/lib/services/toast.service.d.ts +46 -0
  219. package/dist/lib/services/toast.service.d.ts.map +1 -0
  220. package/dist/lib/services/toast.service.js +76 -0
  221. package/dist/lib/services/toast.service.js.map +1 -0
  222. package/dist/public-api.d.ts +42 -0
  223. package/dist/public-api.d.ts.map +1 -0
  224. package/dist/public-api.js +49 -0
  225. package/dist/public-api.js.map +1 -0
  226. package/package.json +54 -0
@@ -0,0 +1,325 @@
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import { RunView, Metadata } from '@memberjunction/core';
3
+ import { Subject } from 'rxjs';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/forms";
6
+ const _forTrack0 = ($index, $item) => $item.ID;
7
+ function ThreadPanelComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
8
+ i0.ɵɵelementStart(0, "div", 7);
9
+ i0.ɵɵelement(1, "i", 9);
10
+ i0.ɵɵelementStart(2, "span");
11
+ i0.ɵɵtext(3, "Loading thread...");
12
+ i0.ɵɵelementEnd()();
13
+ } }
14
+ function ThreadPanelComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
15
+ i0.ɵɵelementStart(0, "div", 8);
16
+ i0.ɵɵelement(1, "i", 10);
17
+ i0.ɵɵelementStart(2, "span");
18
+ i0.ɵɵtext(3);
19
+ i0.ɵɵelementEnd()();
20
+ } if (rf & 2) {
21
+ const ctx_r0 = i0.ɵɵnextContext();
22
+ i0.ɵɵadvance(3);
23
+ i0.ɵɵtextInterpolate(ctx_r0.errorMessage);
24
+ } }
25
+ function ThreadPanelComponent_Conditional_11_Conditional_14_Template(rf, ctx) { if (rf & 1) {
26
+ i0.ɵɵelementStart(0, "div", 20);
27
+ i0.ɵɵelement(1, "i", 27);
28
+ i0.ɵɵelementStart(2, "span");
29
+ i0.ɵɵtext(3, "No replies yet. Be the first to reply!");
30
+ i0.ɵɵelementEnd()();
31
+ } }
32
+ function ThreadPanelComponent_Conditional_11_For_16_Template(rf, ctx) { if (rf & 1) {
33
+ i0.ɵɵelementStart(0, "div", 28)(1, "div", 29)(2, "span", 30);
34
+ i0.ɵɵtext(3);
35
+ i0.ɵɵelementEnd();
36
+ i0.ɵɵelementStart(4, "span", 31);
37
+ i0.ɵɵtext(5);
38
+ i0.ɵɵelementEnd()();
39
+ i0.ɵɵelementStart(6, "div", 32);
40
+ i0.ɵɵtext(7);
41
+ i0.ɵɵelementEnd()();
42
+ } if (rf & 2) {
43
+ const reply_r3 = ctx.$implicit;
44
+ const ctx_r0 = i0.ɵɵnextContext(2);
45
+ i0.ɵɵclassProp("ai-reply", reply_r3.Role === "AI");
46
+ i0.ɵɵadvance(3);
47
+ i0.ɵɵtextInterpolate(ctx_r0.getSenderName(reply_r3));
48
+ i0.ɵɵadvance(2);
49
+ i0.ɵɵtextInterpolate(ctx_r0.getMessageTime(reply_r3));
50
+ i0.ɵɵadvance(2);
51
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.getMessageText(reply_r3), " ");
52
+ } }
53
+ function ThreadPanelComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
54
+ const _r2 = i0.ɵɵgetCurrentView();
55
+ i0.ɵɵelementStart(0, "div", 11)(1, "div", 12)(2, "div", 13)(3, "span", 14);
56
+ i0.ɵɵtext(4);
57
+ i0.ɵɵelementEnd();
58
+ i0.ɵɵelementStart(5, "span", 15);
59
+ i0.ɵɵtext(6);
60
+ i0.ɵɵelementEnd()();
61
+ i0.ɵɵelementStart(7, "div", 16);
62
+ i0.ɵɵtext(8);
63
+ i0.ɵɵelementEnd();
64
+ i0.ɵɵelementStart(9, "div", 17);
65
+ i0.ɵɵelement(10, "i", 18);
66
+ i0.ɵɵelementStart(11, "span");
67
+ i0.ɵɵtext(12);
68
+ i0.ɵɵelementEnd()()();
69
+ i0.ɵɵelementStart(13, "div", 19);
70
+ i0.ɵɵtemplate(14, ThreadPanelComponent_Conditional_11_Conditional_14_Template, 4, 0, "div", 20);
71
+ i0.ɵɵrepeaterCreate(15, ThreadPanelComponent_Conditional_11_For_16_Template, 8, 5, "div", 21, _forTrack0);
72
+ i0.ɵɵelementEnd()();
73
+ i0.ɵɵelementStart(17, "div", 22)(18, "textarea", 23);
74
+ i0.ɵɵtwoWayListener("ngModelChange", function ThreadPanelComponent_Conditional_11_Template_textarea_ngModelChange_18_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.replyText, $event) || (ctx_r0.replyText = $event); return i0.ɵɵresetView($event); });
75
+ i0.ɵɵlistener("keydown.control.enter", function ThreadPanelComponent_Conditional_11_Template_textarea_keydown_control_enter_18_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onSendReply()); })("keydown.meta.enter", function ThreadPanelComponent_Conditional_11_Template_textarea_keydown_meta_enter_18_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onSendReply()); });
76
+ i0.ɵɵtext(19, " ");
77
+ i0.ɵɵelementEnd();
78
+ i0.ɵɵelementStart(20, "div", 24)(21, "button", 25);
79
+ i0.ɵɵlistener("click", function ThreadPanelComponent_Conditional_11_Template_button_click_21_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onSendReply()); });
80
+ i0.ɵɵelement(22, "i", 26);
81
+ i0.ɵɵelementStart(23, "span");
82
+ i0.ɵɵtext(24);
83
+ i0.ɵɵelementEnd()()()();
84
+ } if (rf & 2) {
85
+ const ctx_r0 = i0.ɵɵnextContext();
86
+ i0.ɵɵadvance(4);
87
+ i0.ɵɵtextInterpolate(ctx_r0.getSenderName(ctx_r0.parentMessage));
88
+ i0.ɵɵadvance(2);
89
+ i0.ɵɵtextInterpolate(ctx_r0.getMessageTime(ctx_r0.parentMessage));
90
+ i0.ɵɵadvance(2);
91
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.getMessageText(ctx_r0.parentMessage), " ");
92
+ i0.ɵɵadvance(4);
93
+ i0.ɵɵtextInterpolate(ctx_r0.replyCountText);
94
+ i0.ɵɵadvance(2);
95
+ i0.ɵɵconditional(ctx_r0.replies.length === 0 ? 14 : -1);
96
+ i0.ɵɵadvance();
97
+ i0.ɵɵrepeater(ctx_r0.replies);
98
+ i0.ɵɵadvance(3);
99
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r0.replyText);
100
+ i0.ɵɵproperty("disabled", ctx_r0.isSending);
101
+ i0.ɵɵadvance(3);
102
+ i0.ɵɵproperty("disabled", !ctx_r0.canSendReply);
103
+ i0.ɵɵadvance(3);
104
+ i0.ɵɵtextInterpolate(ctx_r0.isSending ? "Sending..." : "Reply");
105
+ } }
106
+ /**
107
+ * Side panel component for displaying and managing threaded message replies
108
+ * Shows parent message at top with all replies in chronological order
109
+ */
110
+ export class ThreadPanelComponent {
111
+ cdRef;
112
+ parentMessageId;
113
+ conversationId;
114
+ currentUser;
115
+ closed = new EventEmitter();
116
+ replyAdded = new EventEmitter();
117
+ parentMessage = null;
118
+ replies = [];
119
+ replyText = '';
120
+ isLoading = false;
121
+ isSending = false;
122
+ errorMessage = '';
123
+ destroy$ = new Subject();
124
+ constructor(cdRef) {
125
+ this.cdRef = cdRef;
126
+ }
127
+ async ngOnInit() {
128
+ await this.loadThreadData();
129
+ }
130
+ ngOnDestroy() {
131
+ this.destroy$.next();
132
+ this.destroy$.complete();
133
+ }
134
+ /**
135
+ * Loads the parent message and all replies
136
+ */
137
+ async loadThreadData() {
138
+ this.isLoading = true;
139
+ this.errorMessage = '';
140
+ try {
141
+ // Load parent message
142
+ const md = new Metadata();
143
+ const parent = await md.GetEntityObject('Conversation Details', this.currentUser);
144
+ const parentLoaded = await parent.Load(this.parentMessageId);
145
+ if (!parentLoaded) {
146
+ this.errorMessage = 'Failed to load parent message';
147
+ this.isLoading = false;
148
+ return;
149
+ }
150
+ this.parentMessage = parent;
151
+ // Load all replies
152
+ await this.loadReplies();
153
+ }
154
+ catch (error) {
155
+ console.error('Error loading thread data:', error);
156
+ this.errorMessage = 'Error loading thread. Please try again.';
157
+ }
158
+ finally {
159
+ this.isLoading = false;
160
+ this.cdRef.detectChanges();
161
+ }
162
+ }
163
+ /**
164
+ * Loads all replies for the parent message
165
+ */
166
+ async loadReplies() {
167
+ try {
168
+ const rv = new RunView();
169
+ const result = await rv.RunView({
170
+ EntityName: 'Conversation Details',
171
+ ExtraFilter: `ParentID='${this.parentMessageId}'`,
172
+ OrderBy: '__mj_CreatedAt ASC',
173
+ ResultType: 'entity_object'
174
+ }, this.currentUser);
175
+ if (result.Success) {
176
+ this.replies = result.Results || [];
177
+ }
178
+ else {
179
+ console.error('Failed to load replies:', result.ErrorMessage);
180
+ this.errorMessage = 'Failed to load replies';
181
+ }
182
+ }
183
+ catch (error) {
184
+ console.error('Error loading replies:', error);
185
+ this.errorMessage = 'Error loading replies';
186
+ }
187
+ }
188
+ /**
189
+ * Handles sending a new reply
190
+ */
191
+ async onSendReply() {
192
+ if (!this.canSendReply)
193
+ return;
194
+ this.isSending = true;
195
+ this.errorMessage = '';
196
+ try {
197
+ const md = new Metadata();
198
+ const reply = await md.GetEntityObject('Conversation Details', this.currentUser);
199
+ reply.ConversationID = this.conversationId;
200
+ reply.ParentID = this.parentMessageId;
201
+ reply.Message = this.replyText.trim();
202
+ reply.Role = 'User';
203
+ const saved = await reply.Save();
204
+ if (saved) {
205
+ // Add to local list
206
+ this.replies = [...this.replies, reply];
207
+ this.replyText = '';
208
+ // Emit event to parent
209
+ this.replyAdded.emit(reply);
210
+ // Update parent message thread count
211
+ if (this.parentMessage) {
212
+ this.parentMessage.ThreadCount = (this.parentMessage.ThreadCount || 0) + 1; // TODO: ThreadCount field doesn't exist on ConversationDetailEntity yet
213
+ }
214
+ this.cdRef.detectChanges();
215
+ }
216
+ else {
217
+ console.error('Failed to save reply:', reply.LatestResult?.Message);
218
+ this.errorMessage = 'Failed to send reply. Please try again.';
219
+ }
220
+ }
221
+ catch (error) {
222
+ console.error('Error sending reply:', error);
223
+ this.errorMessage = 'Error sending reply. Please try again.';
224
+ }
225
+ finally {
226
+ this.isSending = false;
227
+ this.cdRef.detectChanges();
228
+ }
229
+ }
230
+ /**
231
+ * Handles closing the thread panel
232
+ */
233
+ onClose() {
234
+ this.closed.emit();
235
+ }
236
+ /**
237
+ * Gets the display text for a message
238
+ */
239
+ getMessageText(message) {
240
+ return message.Message || '';
241
+ }
242
+ /**
243
+ * Gets the timestamp display for a message
244
+ */
245
+ getMessageTime(message) {
246
+ if (!message.__mj_CreatedAt)
247
+ return '';
248
+ const date = new Date(message.__mj_CreatedAt);
249
+ const now = new Date();
250
+ const diffMs = now.getTime() - date.getTime();
251
+ const diffMins = Math.floor(diffMs / 60000);
252
+ const diffHours = Math.floor(diffMs / 3600000);
253
+ const diffDays = Math.floor(diffMs / 86400000);
254
+ if (diffMins < 1)
255
+ return 'Just now';
256
+ if (diffMins < 60)
257
+ return `${diffMins}m ago`;
258
+ if (diffHours < 24)
259
+ return `${diffHours}h ago`;
260
+ if (diffDays < 7)
261
+ return `${diffDays}d ago`;
262
+ return date.toLocaleDateString();
263
+ }
264
+ /**
265
+ * Gets the sender name for a message
266
+ */
267
+ getSenderName(message) {
268
+ if (message.Role === 'AI')
269
+ return 'AI Assistant';
270
+ return message.User || 'User';
271
+ }
272
+ /**
273
+ * Checks if current user can send reply
274
+ */
275
+ get canSendReply() {
276
+ return !this.isSending && !this.isLoading && this.replyText.trim().length > 0;
277
+ }
278
+ /**
279
+ * Gets the reply count text
280
+ */
281
+ get replyCountText() {
282
+ const count = this.replies.length;
283
+ return count === 1 ? '1 reply' : `${count} replies`;
284
+ }
285
+ static ɵfac = function ThreadPanelComponent_Factory(t) { return new (t || ThreadPanelComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
286
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ThreadPanelComponent, selectors: [["mj-thread-panel"]], inputs: { parentMessageId: "parentMessageId", conversationId: "conversationId", currentUser: "currentUser" }, outputs: { closed: "closed", replyAdded: "replyAdded" }, decls: 12, vars: 3, consts: [[1, "thread-panel-overlay", 3, "click"], [1, "thread-panel"], [1, "thread-header"], [1, "thread-title"], [1, "fa-solid", "fa-comments"], ["title", "Close thread", 1, "close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "thread-loading"], [1, "thread-error"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-exclamation-circle"], [1, "thread-content"], [1, "parent-message"], [1, "message-header"], [1, "message-sender"], [1, "message-time"], [1, "message-body"], [1, "reply-count"], [1, "fa-solid", "fa-reply"], [1, "replies-container"], [1, "no-replies"], [1, "reply-item", 3, "ai-reply"], [1, "reply-input-container"], ["placeholder", "Reply to thread...", "rows", "3", 1, "reply-input", 3, "ngModelChange", "keydown.control.enter", "keydown.meta.enter", "ngModel", "disabled"], [1, "reply-actions"], [1, "btn-send-reply", 3, "click", "disabled"], [1, "fa-solid", "fa-paper-plane"], [1, "fa-solid", "fa-message"], [1, "reply-item"], [1, "reply-header"], [1, "reply-sender"], [1, "reply-time"], [1, "reply-body"]], template: function ThreadPanelComponent_Template(rf, ctx) { if (rf & 1) {
287
+ i0.ɵɵelementStart(0, "div", 0);
288
+ i0.ɵɵlistener("click", function ThreadPanelComponent_Template_div_click_0_listener() { return ctx.onClose(); });
289
+ i0.ɵɵelementEnd();
290
+ i0.ɵɵelementStart(1, "div", 1)(2, "div", 2)(3, "div", 3);
291
+ i0.ɵɵelement(4, "i", 4);
292
+ i0.ɵɵelementStart(5, "span");
293
+ i0.ɵɵtext(6, "Thread");
294
+ i0.ɵɵelementEnd()();
295
+ i0.ɵɵelementStart(7, "button", 5);
296
+ i0.ɵɵlistener("click", function ThreadPanelComponent_Template_button_click_7_listener() { return ctx.onClose(); });
297
+ i0.ɵɵelement(8, "i", 6);
298
+ i0.ɵɵelementEnd()();
299
+ i0.ɵɵtemplate(9, ThreadPanelComponent_Conditional_9_Template, 4, 0, "div", 7)(10, ThreadPanelComponent_Conditional_10_Template, 4, 1, "div", 8)(11, ThreadPanelComponent_Conditional_11_Template, 25, 9);
300
+ i0.ɵɵelementEnd();
301
+ } if (rf & 2) {
302
+ i0.ɵɵadvance(9);
303
+ i0.ɵɵconditional(ctx.isLoading ? 9 : -1);
304
+ i0.ɵɵadvance();
305
+ i0.ɵɵconditional(ctx.errorMessage && !ctx.isLoading ? 10 : -1);
306
+ i0.ɵɵadvance();
307
+ i0.ɵɵconditional(!ctx.isLoading && !ctx.errorMessage && ctx.parentMessage ? 11 : -1);
308
+ } }, dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel], styles: ["\n\n.thread-panel-overlay[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.3);\n z-index: 999;\n animation: _ngcontent-%COMP%_fadeIn 200ms ease;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n\n\n.thread-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n width: 450px;\n max-width: 90vw;\n background: white;\n box-shadow: -2px 0 8px rgba(0, 0, 0, 0.15);\n z-index: 1000;\n display: flex;\n flex-direction: column;\n animation: _ngcontent-%COMP%_slideIn 250ms ease;\n}\n\n@keyframes _ngcontent-%COMP%_slideIn {\n from {\n transform: translateX(100%);\n }\n to {\n transform: translateX(0);\n }\n}\n\n\n\n.thread-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid #E5E7EB;\n background: #F9FAFB;\n}\n\n.thread-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 16px;\n font-weight: 600;\n color: #111827;\n}\n\n.thread-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #6B7280;\n}\n\n.close-btn[_ngcontent-%COMP%] {\n padding: 6px;\n background: transparent;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n color: #6B7280;\n font-size: 18px;\n transition: all 150ms ease;\n}\n\n.close-btn[_ngcontent-%COMP%]:hover {\n background: #E5E7EB;\n color: #111827;\n}\n\n\n\n.thread-loading[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 40px;\n color: #6B7280;\n}\n\n.thread-loading[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n}\n\n\n\n.thread-error[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 16px 20px;\n background: #FEF2F2;\n border-left: 3px solid #EF4444;\n color: #991B1B;\n margin: 16px 20px;\n border-radius: 4px;\n}\n\n\n\n.thread-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n}\n\n\n\n.parent-message[_ngcontent-%COMP%] {\n padding: 16px;\n background: #F9FAFB;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n margin-bottom: 20px;\n}\n\n.message-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n\n.message-sender[_ngcontent-%COMP%] {\n font-weight: 600;\n color: #111827;\n font-size: 14px;\n}\n\n.message-time[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #6B7280;\n}\n\n.message-body[_ngcontent-%COMP%] {\n color: #374151;\n line-height: 1.6;\n white-space: pre-wrap;\n word-break: break-word;\n font-size: 14px;\n margin-bottom: 12px;\n}\n\n.reply-count[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding-top: 12px;\n border-top: 1px solid #E5E7EB;\n font-size: 13px;\n color: #6B7280;\n font-weight: 500;\n}\n\n.reply-count[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n.replies-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.no-replies[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 40px 20px;\n color: #9CA3AF;\n text-align: center;\n}\n\n.no-replies[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n opacity: 0.5;\n}\n\n.no-replies[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n\n\n.reply-item[_ngcontent-%COMP%] {\n padding: 12px;\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n transition: all 150ms ease;\n}\n\n.reply-item[_ngcontent-%COMP%]:hover {\n border-color: #D1D5DB;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n}\n\n.reply-item.ai-reply[_ngcontent-%COMP%] {\n background: #EFF6FF;\n border-color: #DBEAFE;\n}\n\n.reply-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 6px;\n}\n\n.reply-sender[_ngcontent-%COMP%] {\n font-weight: 600;\n color: #111827;\n font-size: 13px;\n}\n\n.reply-time[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #9CA3AF;\n}\n\n.reply-body[_ngcontent-%COMP%] {\n color: #374151;\n line-height: 1.5;\n white-space: pre-wrap;\n word-break: break-word;\n font-size: 13px;\n}\n\n\n\n.reply-input-container[_ngcontent-%COMP%] {\n padding: 16px 20px;\n border-top: 1px solid #E5E7EB;\n background: white;\n}\n\n.reply-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid #D1D5DB;\n border-radius: 6px;\n resize: vertical;\n font-family: inherit;\n font-size: 14px;\n min-height: 60px;\n transition: all 150ms ease;\n}\n\n.reply-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #0076B6;\n box-shadow: 0 0 0 3px rgba(0, 118, 182, 0.1);\n}\n\n.reply-input[_ngcontent-%COMP%]:disabled {\n background: #F3F4F6;\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.reply-actions[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n margin-top: 10px;\n}\n\n.btn-send-reply[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n background: #0076B6;\n color: white;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n font-weight: 600;\n font-size: 13px;\n transition: all 150ms ease;\n}\n\n.btn-send-reply[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #005A8C;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 118, 182, 0.2);\n}\n\n.btn-send-reply[_ngcontent-%COMP%]:disabled {\n background: #D1D5DB;\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.btn-send-reply[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n.thread-content[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 6px;\n}\n\n.thread-content[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background: #F3F4F6;\n}\n\n.thread-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: #D1D5DB;\n border-radius: 3px;\n}\n\n.thread-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background: #9CA3AF;\n}"] });
309
+ }
310
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ThreadPanelComponent, [{
311
+ type: Component,
312
+ args: [{ selector: 'mj-thread-panel', template: "<div class=\"thread-panel-overlay\" (click)=\"onClose()\"></div>\n\n<div class=\"thread-panel\">\n <div class=\"thread-header\">\n <div class=\"thread-title\">\n <i class=\"fa-solid fa-comments\"></i>\n <span>Thread</span>\n </div>\n <button class=\"close-btn\" (click)=\"onClose()\" title=\"Close thread\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n @if (isLoading) {\n <div class=\"thread-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading thread...</span>\n </div>\n }\n\n @if (errorMessage && !isLoading) {\n <div class=\"thread-error\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n <span>{{ errorMessage }}</span>\n </div>\n }\n\n @if (!isLoading && !errorMessage && parentMessage) {\n <div class=\"thread-content\">\n <!-- Parent Message -->\n <div class=\"parent-message\">\n <div class=\"message-header\">\n <span class=\"message-sender\">{{ getSenderName(parentMessage) }}</span>\n <span class=\"message-time\">{{ getMessageTime(parentMessage) }}</span>\n </div>\n <div class=\"message-body\">\n {{ getMessageText(parentMessage) }}\n </div>\n <div class=\"reply-count\">\n <i class=\"fa-solid fa-reply\"></i>\n <span>{{ replyCountText }}</span>\n </div>\n </div>\n\n <!-- Replies List -->\n <div class=\"replies-container\">\n @if (replies.length === 0) {\n <div class=\"no-replies\">\n <i class=\"fa-solid fa-message\"></i>\n <span>No replies yet. Be the first to reply!</span>\n </div>\n }\n\n @for (reply of replies; track reply.ID) {\n <div class=\"reply-item\" [class.ai-reply]=\"reply.Role === 'AI'\">\n <div class=\"reply-header\">\n <span class=\"reply-sender\">{{ getSenderName(reply) }}</span>\n <span class=\"reply-time\">{{ getMessageTime(reply) }}</span>\n </div>\n <div class=\"reply-body\">\n {{ getMessageText(reply) }}\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Reply Input -->\n <div class=\"reply-input-container\">\n <textarea\n class=\"reply-input\"\n [(ngModel)]=\"replyText\"\n [disabled]=\"isSending\"\n placeholder=\"Reply to thread...\"\n rows=\"3\"\n (keydown.control.enter)=\"onSendReply()\"\n (keydown.meta.enter)=\"onSendReply()\">\n </textarea>\n <div class=\"reply-actions\">\n <button\n class=\"btn-send-reply\"\n [disabled]=\"!canSendReply\"\n (click)=\"onSendReply()\">\n <i class=\"fa-solid fa-paper-plane\"></i>\n <span>{{ isSending ? 'Sending...' : 'Reply' }}</span>\n </button>\n </div>\n </div>\n }\n</div>\n", styles: ["/* Thread Panel Overlay */\n.thread-panel-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.3);\n z-index: 999;\n animation: fadeIn 200ms ease;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* Thread Panel Container */\n.thread-panel {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n width: 450px;\n max-width: 90vw;\n background: white;\n box-shadow: -2px 0 8px rgba(0, 0, 0, 0.15);\n z-index: 1000;\n display: flex;\n flex-direction: column;\n animation: slideIn 250ms ease;\n}\n\n@keyframes slideIn {\n from {\n transform: translateX(100%);\n }\n to {\n transform: translateX(0);\n }\n}\n\n/* Header */\n.thread-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid #E5E7EB;\n background: #F9FAFB;\n}\n\n.thread-title {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 16px;\n font-weight: 600;\n color: #111827;\n}\n\n.thread-title i {\n color: #6B7280;\n}\n\n.close-btn {\n padding: 6px;\n background: transparent;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n color: #6B7280;\n font-size: 18px;\n transition: all 150ms ease;\n}\n\n.close-btn:hover {\n background: #E5E7EB;\n color: #111827;\n}\n\n/* Loading State */\n.thread-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 40px;\n color: #6B7280;\n}\n\n.thread-loading i {\n font-size: 24px;\n}\n\n/* Error State */\n.thread-error {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 16px 20px;\n background: #FEF2F2;\n border-left: 3px solid #EF4444;\n color: #991B1B;\n margin: 16px 20px;\n border-radius: 4px;\n}\n\n/* Content Container */\n.thread-content {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n}\n\n/* Parent Message */\n.parent-message {\n padding: 16px;\n background: #F9FAFB;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n margin-bottom: 20px;\n}\n\n.message-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n}\n\n.message-sender {\n font-weight: 600;\n color: #111827;\n font-size: 14px;\n}\n\n.message-time {\n font-size: 12px;\n color: #6B7280;\n}\n\n.message-body {\n color: #374151;\n line-height: 1.6;\n white-space: pre-wrap;\n word-break: break-word;\n font-size: 14px;\n margin-bottom: 12px;\n}\n\n.reply-count {\n display: flex;\n align-items: center;\n gap: 6px;\n padding-top: 12px;\n border-top: 1px solid #E5E7EB;\n font-size: 13px;\n color: #6B7280;\n font-weight: 500;\n}\n\n.reply-count i {\n font-size: 12px;\n}\n\n/* Replies Container */\n.replies-container {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.no-replies {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 40px 20px;\n color: #9CA3AF;\n text-align: center;\n}\n\n.no-replies i {\n font-size: 32px;\n opacity: 0.5;\n}\n\n.no-replies span {\n font-size: 14px;\n}\n\n/* Reply Item */\n.reply-item {\n padding: 12px;\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n transition: all 150ms ease;\n}\n\n.reply-item:hover {\n border-color: #D1D5DB;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n}\n\n.reply-item.ai-reply {\n background: #EFF6FF;\n border-color: #DBEAFE;\n}\n\n.reply-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 6px;\n}\n\n.reply-sender {\n font-weight: 600;\n color: #111827;\n font-size: 13px;\n}\n\n.reply-time {\n font-size: 11px;\n color: #9CA3AF;\n}\n\n.reply-body {\n color: #374151;\n line-height: 1.5;\n white-space: pre-wrap;\n word-break: break-word;\n font-size: 13px;\n}\n\n/* Reply Input */\n.reply-input-container {\n padding: 16px 20px;\n border-top: 1px solid #E5E7EB;\n background: white;\n}\n\n.reply-input {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid #D1D5DB;\n border-radius: 6px;\n resize: vertical;\n font-family: inherit;\n font-size: 14px;\n min-height: 60px;\n transition: all 150ms ease;\n}\n\n.reply-input:focus {\n outline: none;\n border-color: #0076B6;\n box-shadow: 0 0 0 3px rgba(0, 118, 182, 0.1);\n}\n\n.reply-input:disabled {\n background: #F3F4F6;\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.reply-actions {\n display: flex;\n justify-content: flex-end;\n margin-top: 10px;\n}\n\n.btn-send-reply {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n background: #0076B6;\n color: white;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n font-weight: 600;\n font-size: 13px;\n transition: all 150ms ease;\n}\n\n.btn-send-reply:hover:not(:disabled) {\n background: #005A8C;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 118, 182, 0.2);\n}\n\n.btn-send-reply:disabled {\n background: #D1D5DB;\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.btn-send-reply i {\n font-size: 12px;\n}\n\n/* Scrollbar Styling */\n.thread-content::-webkit-scrollbar {\n width: 6px;\n}\n\n.thread-content::-webkit-scrollbar-track {\n background: #F3F4F6;\n}\n\n.thread-content::-webkit-scrollbar-thumb {\n background: #D1D5DB;\n border-radius: 3px;\n}\n\n.thread-content::-webkit-scrollbar-thumb:hover {\n background: #9CA3AF;\n}\n"] }]
313
+ }], () => [{ type: i0.ChangeDetectorRef }], { parentMessageId: [{
314
+ type: Input
315
+ }], conversationId: [{
316
+ type: Input
317
+ }], currentUser: [{
318
+ type: Input
319
+ }], closed: [{
320
+ type: Output
321
+ }], replyAdded: [{
322
+ type: Output
323
+ }] }); })();
324
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ThreadPanelComponent, { className: "ThreadPanelComponent", filePath: "src/lib/components/thread/thread-panel.component.ts", lineNumber: 16 }); })();
325
+ //# sourceMappingURL=thread-panel.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-panel.component.js","sourceRoot":"","sources":["../../../../src/lib/components/thread/thread-panel.component.ts","../../../../src/lib/components/thread/thread-panel.component.html"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { OnInit, OnDestroy } from '@angular/core';
2
+ import { ToastService, Toast } from '../../services/toast.service';
3
+ import * as i0 from "@angular/core";
4
+ export declare class ToastComponent implements OnInit, OnDestroy {
5
+ private toastService;
6
+ toasts: Toast[];
7
+ private subscription;
8
+ constructor(toastService: ToastService);
9
+ ngOnInit(): void;
10
+ ngOnDestroy(): void;
11
+ /**
12
+ * Get the icon class for a toast type
13
+ */
14
+ getIconClass(type: string): string;
15
+ /**
16
+ * Dismiss a toast
17
+ */
18
+ dismiss(toastId: string): void;
19
+ /**
20
+ * Track toasts by ID for performance
21
+ */
22
+ trackByToastId(index: number, toast: Toast): string;
23
+ static ɵfac: i0.ɵɵFactoryDeclaration<ToastComponent, never>;
24
+ static ɵcmp: i0.ɵɵComponentDeclaration<ToastComponent, "mj-toast", never, {}, {}, never, never, false, never>;
25
+ }
26
+ //# sourceMappingURL=toast.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/toast/toast.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG7D,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;;AAEnE,qBAgBa,cAAe,YAAW,MAAM,EAAE,SAAS;IAI1C,OAAO,CAAC,YAAY;IAHzB,MAAM,EAAE,KAAK,EAAE,CAAM;IAC5B,OAAO,CAAC,YAAY,CAA6B;gBAE7B,YAAY,EAAE,YAAY;IAE9C,QAAQ,IAAI,IAAI;IAMhB,WAAW,IAAI,IAAI;IAMnB;;OAEG;IACI,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAezC;;OAEG;IACI,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIrC;;OAEG;IACI,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM;yCA9C/C,cAAc;2CAAd,cAAc;CAiD1B"}
@@ -0,0 +1,108 @@
1
+ import { Component } from '@angular/core';
2
+ import { trigger, transition, style, animate } from '@angular/animations';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../../services/toast.service";
5
+ import * as i2 from "@angular/common";
6
+ function ToastComponent_div_1_Template(rf, ctx) { if (rf & 1) {
7
+ const _r1 = i0.ɵɵgetCurrentView();
8
+ i0.ɵɵelementStart(0, "div")(1, "div", 2);
9
+ i0.ɵɵelement(2, "i", 3);
10
+ i0.ɵɵelementStart(3, "span", 4);
11
+ i0.ɵɵtext(4);
12
+ i0.ɵɵelementEnd();
13
+ i0.ɵɵelementStart(5, "button", 5);
14
+ i0.ɵɵlistener("click", function ToastComponent_div_1_Template_button_click_5_listener() { const toast_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.dismiss(toast_r2.id)); });
15
+ i0.ɵɵelement(6, "i", 6);
16
+ i0.ɵɵelementEnd()()();
17
+ } if (rf & 2) {
18
+ const toast_r2 = ctx.$implicit;
19
+ const ctx_r2 = i0.ɵɵnextContext();
20
+ i0.ɵɵclassMapInterpolate1("toast toast-", toast_r2.type, "");
21
+ i0.ɵɵproperty("@slideIn", undefined);
22
+ i0.ɵɵadvance(2);
23
+ i0.ɵɵclassMap(ctx_r2.getIconClass(toast_r2.type));
24
+ i0.ɵɵadvance(2);
25
+ i0.ɵɵtextInterpolate(toast_r2.message);
26
+ } }
27
+ export class ToastComponent {
28
+ toastService;
29
+ toasts = [];
30
+ subscription = null;
31
+ constructor(toastService) {
32
+ this.toastService = toastService;
33
+ }
34
+ ngOnInit() {
35
+ this.subscription = this.toastService.toasts$.subscribe(toasts => {
36
+ this.toasts = toasts;
37
+ });
38
+ }
39
+ ngOnDestroy() {
40
+ if (this.subscription) {
41
+ this.subscription.unsubscribe();
42
+ }
43
+ }
44
+ /**
45
+ * Get the icon class for a toast type
46
+ */
47
+ getIconClass(type) {
48
+ switch (type) {
49
+ case 'success':
50
+ return 'fa-solid fa-circle-check';
51
+ case 'error':
52
+ return 'fa-solid fa-circle-xmark';
53
+ case 'warning':
54
+ return 'fa-solid fa-triangle-exclamation';
55
+ case 'info':
56
+ return 'fa-solid fa-circle-info';
57
+ default:
58
+ return 'fa-solid fa-circle-info';
59
+ }
60
+ }
61
+ /**
62
+ * Dismiss a toast
63
+ */
64
+ dismiss(toastId) {
65
+ this.toastService.dismiss(toastId);
66
+ }
67
+ /**
68
+ * Track toasts by ID for performance
69
+ */
70
+ trackByToastId(index, toast) {
71
+ return toast.id;
72
+ }
73
+ static ɵfac = function ToastComponent_Factory(t) { return new (t || ToastComponent)(i0.ɵɵdirectiveInject(i1.ToastService)); };
74
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ToastComponent, selectors: [["mj-toast"]], decls: 2, vars: 2, consts: [[1, "toast-container"], [3, "class", 4, "ngFor", "ngForOf", "ngForTrackBy"], [1, "toast-content"], [1, "toast-icon"], [1, "toast-message"], ["aria-label", "Close notification", 1, "toast-close", 3, "click"], [1, "fa-solid", "fa-xmark"]], template: function ToastComponent_Template(rf, ctx) { if (rf & 1) {
75
+ i0.ɵɵelementStart(0, "div", 0);
76
+ i0.ɵɵtemplate(1, ToastComponent_div_1_Template, 7, 7, "div", 1);
77
+ i0.ɵɵelementEnd();
78
+ } if (rf & 2) {
79
+ i0.ɵɵadvance();
80
+ i0.ɵɵproperty("ngForOf", ctx.toasts)("ngForTrackBy", ctx.trackByToastId);
81
+ } }, dependencies: [i2.NgForOf], styles: [".toast-container[_ngcontent-%COMP%] {\n position: fixed;\n top: 20px;\n right: 20px;\n z-index: 10000;\n display: flex;\n flex-direction: column;\n gap: 12px;\n pointer-events: none;\n}\n\n.toast[_ngcontent-%COMP%] {\n min-width: 320px;\n max-width: 500px;\n padding: 16px;\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n background-color: rgba(255, 255, 255, 0.95);\n backdrop-filter: blur(10px);\n pointer-events: auto;\n border-left: 4px solid;\n transition: all 0.2s ease;\n\n &:hover {\n box-shadow: 0 6px 16px rgba(0, 0, 0, 0.2);\n }\n\n &.toast-success {\n border-left-color: #10b981;\n\n .toast-icon {\n color: #10b981;\n }\n }\n\n &.toast-error {\n border-left-color: #ef4444;\n\n .toast-icon {\n color: #ef4444;\n }\n }\n\n &.toast-warning {\n border-left-color: #f59e0b;\n\n .toast-icon {\n color: #f59e0b;\n }\n }\n\n &.toast-info {\n border-left-color: #3b82f6;\n\n .toast-icon {\n color: #3b82f6;\n }\n }\n}\n\n.toast-content[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.toast-icon[_ngcontent-%COMP%] {\n font-size: 20px;\n flex-shrink: 0;\n}\n\n.toast-message[_ngcontent-%COMP%] {\n flex: 1;\n color: #1f2937;\n font-size: 14px;\n line-height: 1.5;\n word-break: break-word;\n}\n\n.toast-close[_ngcontent-%COMP%] {\n flex-shrink: 0;\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #6b7280;\n border-radius: 4px;\n transition: all 0.2s ease;\n\n i {\n font-size: 16px;\n }\n\n &:hover {\n background-color: rgba(0, 0, 0, 0.05);\n color: #1f2937;\n }\n\n &:active {\n transform: scale(0.95);\n }\n}\n\n//[_ngcontent-%COMP%] Responsive[_ngcontent-%COMP%] adjustments\n@media[_ngcontent-%COMP%] (max-width[_ngcontent-%COMP%]: 640px)[_ngcontent-%COMP%] {\n .toast-container {\n left: 12px;\n right: 12px;\n top: 12px;\n }\n\n .toast {\n min-width: unset;\n max-width: unset;\n width: 100%;\n }\n}\n\n//[_ngcontent-%COMP%] Dark[_ngcontent-%COMP%] mode[_ngcontent-%COMP%] support[_ngcontent-%COMP%] (if[_ngcontent-%COMP%] needed[_ngcontent-%COMP%] in[_ngcontent-%COMP%] future)\n@media[_ngcontent-%COMP%] (prefers-color-scheme[_ngcontent-%COMP%]: dark)[_ngcontent-%COMP%] {\n .toast {\n background-color: rgba(31, 41, 55, 0.95);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);\n\n .toast-message {\n color: #f9fafb;\n }\n\n .toast-close {\n color: #9ca3af;\n\n &:hover {\n background-color: rgba(255, 255, 255, 0.1);\n color: #f9fafb;\n }\n }\n }\n}"], data: { animation: [
82
+ trigger('slideIn', [
83
+ transition(':enter', [
84
+ style({ transform: 'translateX(100%)', opacity: 0 }),
85
+ animate('300ms ease-out', style({ transform: 'translateX(0)', opacity: 1 }))
86
+ ]),
87
+ transition(':leave', [
88
+ animate('200ms ease-in', style({ transform: 'translateX(100%)', opacity: 0 }))
89
+ ])
90
+ ])
91
+ ] } });
92
+ }
93
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ToastComponent, [{
94
+ type: Component,
95
+ args: [{ selector: 'mj-toast', animations: [
96
+ trigger('slideIn', [
97
+ transition(':enter', [
98
+ style({ transform: 'translateX(100%)', opacity: 0 }),
99
+ animate('300ms ease-out', style({ transform: 'translateX(0)', opacity: 1 }))
100
+ ]),
101
+ transition(':leave', [
102
+ animate('200ms ease-in', style({ transform: 'translateX(100%)', opacity: 0 }))
103
+ ])
104
+ ])
105
+ ], template: "<div class=\"toast-container\">\n <div\n *ngFor=\"let toast of toasts; trackBy: trackByToastId\"\n class=\"toast toast-{{ toast.type }}\"\n [@slideIn]\n >\n <div class=\"toast-content\">\n <i [class]=\"getIconClass(toast.type)\" class=\"toast-icon\"></i>\n <span class=\"toast-message\">{{ toast.message }}</span>\n <button\n class=\"toast-close\"\n (click)=\"dismiss(toast.id)\"\n aria-label=\"Close notification\"\n >\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n</div>\n", styles: [".toast-container {\n position: fixed;\n top: 20px;\n right: 20px;\n z-index: 10000;\n display: flex;\n flex-direction: column;\n gap: 12px;\n pointer-events: none;\n}\n\n.toast {\n min-width: 320px;\n max-width: 500px;\n padding: 16px;\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n background-color: rgba(255, 255, 255, 0.95);\n backdrop-filter: blur(10px);\n pointer-events: auto;\n border-left: 4px solid;\n transition: all 0.2s ease;\n\n &:hover {\n box-shadow: 0 6px 16px rgba(0, 0, 0, 0.2);\n }\n\n &.toast-success {\n border-left-color: #10b981;\n\n .toast-icon {\n color: #10b981;\n }\n }\n\n &.toast-error {\n border-left-color: #ef4444;\n\n .toast-icon {\n color: #ef4444;\n }\n }\n\n &.toast-warning {\n border-left-color: #f59e0b;\n\n .toast-icon {\n color: #f59e0b;\n }\n }\n\n &.toast-info {\n border-left-color: #3b82f6;\n\n .toast-icon {\n color: #3b82f6;\n }\n }\n}\n\n.toast-content {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.toast-icon {\n font-size: 20px;\n flex-shrink: 0;\n}\n\n.toast-message {\n flex: 1;\n color: #1f2937;\n font-size: 14px;\n line-height: 1.5;\n word-break: break-word;\n}\n\n.toast-close {\n flex-shrink: 0;\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #6b7280;\n border-radius: 4px;\n transition: all 0.2s ease;\n\n i {\n font-size: 16px;\n }\n\n &:hover {\n background-color: rgba(0, 0, 0, 0.05);\n color: #1f2937;\n }\n\n &:active {\n transform: scale(0.95);\n }\n}\n\n// Responsive adjustments\n@media (max-width: 640px) {\n .toast-container {\n left: 12px;\n right: 12px;\n top: 12px;\n }\n\n .toast {\n min-width: unset;\n max-width: unset;\n width: 100%;\n }\n}\n\n// Dark mode support (if needed in future)\n@media (prefers-color-scheme: dark) {\n .toast {\n background-color: rgba(31, 41, 55, 0.95);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);\n\n .toast-message {\n color: #f9fafb;\n }\n\n .toast-close {\n color: #9ca3af;\n\n &:hover {\n background-color: rgba(255, 255, 255, 0.1);\n color: #f9fafb;\n }\n }\n }\n}\n"] }]
106
+ }], () => [{ type: i1.ToastService }], null); })();
107
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ToastComponent, { className: "ToastComponent", filePath: "src/lib/components/toast/toast.component.ts", lineNumber: 22 }); })();
108
+ //# sourceMappingURL=toast.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast.component.js","sourceRoot":"","sources":["../../../../src/lib/components/toast/toast.component.ts","../../../../src/lib/components/toast/toast.component.html"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import { EventEmitter, OnInit, OnDestroy, DoCheck } from '@angular/core';
2
+ import { ConversationEntity, ArtifactEntity } from '@memberjunction/core-entities';
3
+ import { UserInfo, CompositeKey } from '@memberjunction/core';
4
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
5
+ import { ConversationStateService } from '../../services/conversation-state.service';
6
+ import { ArtifactStateService } from '../../services/artifact-state.service';
7
+ import { NavigationTab, WorkspaceLayout } from '../../models/conversation-state.model';
8
+ import { SearchResult } from '../../services/search.service';
9
+ import * as i0 from "@angular/core";
10
+ /**
11
+ * Top-level workspace component for conversations
12
+ * Provides 3-column Slack-style layout: Navigation | Sidebar | Chat Area | Artifact Panel
13
+ * Supports context-based navigation (library or task views)
14
+ */
15
+ export declare class ConversationWorkspaceComponent extends BaseAngularComponent implements OnInit, OnDestroy, DoCheck {
16
+ conversationState: ConversationStateService;
17
+ artifactState: ArtifactStateService;
18
+ environmentId: string;
19
+ initialConversationId?: string;
20
+ layout: WorkspaceLayout;
21
+ currentUser: UserInfo;
22
+ activeContext?: 'library' | 'task';
23
+ contextItemId?: string;
24
+ conversationChanged: EventEmitter<ConversationEntity>;
25
+ artifactOpened: EventEmitter<ArtifactEntity>;
26
+ openEntityRecord: EventEmitter<{
27
+ entityName: string;
28
+ compositeKey: CompositeKey;
29
+ }>;
30
+ activeTab: NavigationTab;
31
+ isSidebarVisible: boolean;
32
+ isArtifactPanelOpen: boolean;
33
+ isSearchPanelOpen: boolean;
34
+ renamedConversationId: string | null;
35
+ sidebarWidth: number;
36
+ private isSidebarResizing;
37
+ private sidebarResizeStartX;
38
+ private sidebarResizeStartWidth;
39
+ private previousConversationId;
40
+ private destroy$;
41
+ private readonly SIDEBAR_WIDTH_KEY;
42
+ constructor(conversationState: ConversationStateService, artifactState: ArtifactStateService);
43
+ ngOnInit(): Promise<void>;
44
+ ngDoCheck(): void;
45
+ ngOnDestroy(): void;
46
+ onTabChanged(tab: NavigationTab): void;
47
+ toggleSidebar(): void;
48
+ closeArtifactPanel(): void;
49
+ openSearch(): void;
50
+ closeSearch(): void;
51
+ handleSearchResult(result: SearchResult): void;
52
+ /**
53
+ * Sidebar resize methods
54
+ */
55
+ onSidebarResizeStart(event: MouseEvent): void;
56
+ private onSidebarResizeMove;
57
+ private onSidebarResizeEnd;
58
+ /**
59
+ * LocalStorage persistence methods
60
+ */
61
+ private loadSidebarWidth;
62
+ private saveSidebarWidth;
63
+ onConversationRenamed(event: {
64
+ conversationId: string;
65
+ name: string;
66
+ description: string;
67
+ }): void;
68
+ onOpenEntityRecord(event: {
69
+ entityName: string;
70
+ compositeKey: CompositeKey;
71
+ }): void;
72
+ static ɵfac: i0.ɵɵFactoryDeclaration<ConversationWorkspaceComponent, never>;
73
+ static ɵcmp: i0.ɵɵComponentDeclaration<ConversationWorkspaceComponent, "mj-conversation-workspace", never, { "environmentId": { "alias": "environmentId"; "required": false; }; "initialConversationId": { "alias": "initialConversationId"; "required": false; }; "layout": { "alias": "layout"; "required": false; }; "currentUser": { "alias": "currentUser"; "required": false; }; "activeContext": { "alias": "activeContext"; "required": false; }; "contextItemId": { "alias": "contextItemId"; "required": false; }; }, { "conversationChanged": "conversationChanged"; "artifactOpened": "artifactOpened"; "openEntityRecord": "openEntityRecord"; }, never, never, false, never>;
74
+ }
75
+ //# sourceMappingURL=conversation-workspace.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-workspace.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/workspace/conversation-workspace.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,YAAY,EACZ,MAAM,EACN,SAAS,EACT,OAAO,EACR,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACnF,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AACrF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;;AAI7D;;;;GAIG;AACH,qBAKa,8BAA+B,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS,EAAE,OAAO;IA+BnG,iBAAiB,EAAE,wBAAwB;IAC3C,aAAa,EAAE,oBAAoB;IA/BnC,aAAa,EAAG,MAAM,CAAC;IACvB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,MAAM,EAAE,eAAe,CAAU;IACjC,WAAW,EAAG,QAAQ,CAAC;IACvB,aAAa,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IACnC,aAAa,CAAC,EAAE,MAAM,CAAC;IAEtB,mBAAmB,mCAA0C;IAC7D,cAAc,+BAAsC;IACpD,gBAAgB;oBAAiC,MAAM;sBAAgB,YAAY;OAAK;IAE3F,SAAS,EAAE,aAAa,CAAmB;IAC3C,gBAAgB,EAAE,OAAO,CAAQ;IACjC,mBAAmB,EAAE,OAAO,CAAS;IACrC,iBAAiB,EAAE,OAAO,CAAS;IACnC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAG5C,YAAY,EAAE,MAAM,CAAO;IAClC,OAAO,CAAC,iBAAiB,CAAkB;IAC3C,OAAO,CAAC,mBAAmB,CAAa;IACxC,OAAO,CAAC,uBAAuB,CAAa;IAE5C,OAAO,CAAC,sBAAsB,CAAuB;IACrD,OAAO,CAAC,QAAQ,CAAuB;IAGvC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoC;gBAG7D,iBAAiB,EAAE,wBAAwB,EAC3C,aAAa,EAAE,oBAAoB;IAKtC,QAAQ;IAoCd,SAAS;IAYT,WAAW;IASX,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI;IAItC,aAAa,IAAI,IAAI;IAIrB,kBAAkB,IAAI,IAAI;IAI1B,UAAU,IAAI,IAAI;IAIlB,WAAW,IAAI,IAAI;IAInB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAiB9C;;OAEG;IACH,oBAAoB,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAS7C,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,kBAAkB;IAW1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,gBAAgB;IAQxB,qBAAqB,CAAC,KAAK,EAAE;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAC,GAAG,IAAI;IAW/F,kBAAkB,CAAC,KAAK,EAAE;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,YAAY,CAAA;KAAC,GAAG,IAAI;yCAzMtE,8BAA8B;2CAA9B,8BAA8B;CA6M1C"}