@memberjunction/ng-conversations 2.127.0 → 2.129.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.
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +2 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +166 -138
- package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-list.component.d.ts +11 -1
- package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-list.component.js +225 -119
- package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
- package/dist/lib/components/message/agent-response-form.component.d.ts +18 -0
- package/dist/lib/components/message/agent-response-form.component.d.ts.map +1 -1
- package/dist/lib/components/message/agent-response-form.component.js +149 -26
- package/dist/lib/components/message/agent-response-form.component.js.map +1 -1
- package/dist/lib/components/message/form-question.component.js +3 -3
- package/dist/lib/components/message/message-input.component.d.ts +4 -1
- package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input.component.js +78 -61
- package/dist/lib/components/message/message-input.component.js.map +1 -1
- package/dist/lib/components/message/message-item.component.d.ts +7 -2
- package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-item.component.js +56 -13
- package/dist/lib/components/message/message-item.component.js.map +1 -1
- package/dist/lib/components/message/message-list.component.d.ts +3 -1
- package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-list.component.js +7 -3
- package/dist/lib/components/message/message-list.component.js.map +1 -1
- package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts +7 -1
- package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts.map +1 -1
- package/dist/lib/components/sidebar/conversation-sidebar.component.js +28 -6
- package/dist/lib/components/sidebar/conversation-sidebar.component.js.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts +42 -0
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.js +253 -40
- package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
- package/dist/lib/models/conversation-state.model.d.ts +2 -1
- package/dist/lib/models/conversation-state.model.d.ts.map +1 -1
- package/dist/lib/services/conversation-agent.service.d.ts +2 -1
- package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-agent.service.js.map +1 -1
- package/dist/lib/services/mention-autocomplete.service.d.ts +1 -1
- package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -1
- package/dist/lib/services/mention-parser.service.d.ts +1 -1
- package/dist/lib/services/mention-parser.service.d.ts.map +1 -1
- package/package.json +17 -17
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Component, Input, Output, EventEmitter, HostListener } from '@angular/core';
|
|
2
|
-
import { ArtifactMetadataEngine } from '@memberjunction/core-entities';
|
|
2
|
+
import { ArtifactMetadataEngine, UserInfoEngine } from '@memberjunction/core-entities';
|
|
3
3
|
import { Metadata } from '@memberjunction/core';
|
|
4
4
|
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
5
5
|
import { Subject, takeUntil } from 'rxjs';
|
|
@@ -33,69 +33,76 @@ function ConversationWorkspaceComponent_Conditional_3_Template(rf, ctx) { if (rf
|
|
|
33
33
|
} }
|
|
34
34
|
function ConversationWorkspaceComponent_Conditional_4_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
35
35
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
36
|
-
i0.ɵɵelementStart(0, "div",
|
|
36
|
+
i0.ɵɵelementStart(0, "div", 14);
|
|
37
37
|
i0.ɵɵlistener("click", function ConversationWorkspaceComponent_Conditional_4_Conditional_1_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.closeSidebar()); });
|
|
38
38
|
i0.ɵɵelementEnd();
|
|
39
39
|
} }
|
|
40
40
|
function ConversationWorkspaceComponent_Conditional_4_div_2_Template(rf, ctx) { if (rf & 1) {
|
|
41
41
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
42
|
-
i0.ɵɵelementStart(0, "div",
|
|
43
|
-
i0.ɵɵlistener("conversationSelected", function ConversationWorkspaceComponent_Conditional_4_div_2_Template_mj_conversation_sidebar_conversationSelected_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onConversationSelected($event)); })("newConversationRequested", function ConversationWorkspaceComponent_Conditional_4_div_2_Template_mj_conversation_sidebar_newConversationRequested_1_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.startNewConversation()); });
|
|
42
|
+
i0.ɵɵelementStart(0, "div", 15)(1, "mj-conversation-sidebar", 16);
|
|
43
|
+
i0.ɵɵlistener("conversationSelected", function ConversationWorkspaceComponent_Conditional_4_div_2_Template_mj_conversation_sidebar_conversationSelected_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onConversationSelected($event)); })("newConversationRequested", function ConversationWorkspaceComponent_Conditional_4_div_2_Template_mj_conversation_sidebar_newConversationRequested_1_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.startNewConversation()); })("pinSidebarRequested", function ConversationWorkspaceComponent_Conditional_4_div_2_Template_mj_conversation_sidebar_pinSidebarRequested_1_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.pinSidebar()); })("unpinSidebarRequested", function ConversationWorkspaceComponent_Conditional_4_div_2_Template_mj_conversation_sidebar_unpinSidebarRequested_1_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.unpinSidebar()); });
|
|
44
44
|
i0.ɵɵelementEnd()();
|
|
45
45
|
} if (rf & 2) {
|
|
46
46
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
47
|
-
i0.ɵɵstyleProp("width", ctx_r1.sidebarWidth, "px");
|
|
48
|
-
i0.ɵɵclassProp("open", ctx_r1.isSidebarVisible);
|
|
47
|
+
i0.ɵɵstyleProp("width", ctx_r1.isSidebarCollapsed ? 0 : ctx_r1.sidebarWidth, "px");
|
|
48
|
+
i0.ɵɵclassProp("open", ctx_r1.isSidebarVisible)("collapsed", ctx_r1.isSidebarCollapsed)("no-transition", !ctx_r1.sidebarTransitionsEnabled);
|
|
49
49
|
i0.ɵɵadvance();
|
|
50
|
-
i0.ɵɵproperty("activeTab", ctx_r1.activeTab)("environmentId", ctx_r1.environmentId)("currentUser", ctx_r1.currentUser)("selectedConversationId", ctx_r1.selectedConversationId)("renamedConversationId", ctx_r1.renamedConversationId);
|
|
50
|
+
i0.ɵɵproperty("activeTab", ctx_r1.activeTab)("environmentId", ctx_r1.environmentId)("currentUser", ctx_r1.currentUser)("selectedConversationId", ctx_r1.selectedConversationId)("renamedConversationId", ctx_r1.renamedConversationId)("isSidebarPinned", ctx_r1.isSidebarPinned)("isMobileView", ctx_r1.isMobileView);
|
|
51
51
|
} }
|
|
52
|
-
function
|
|
52
|
+
function ConversationWorkspaceComponent_Conditional_4_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
53
53
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
54
|
-
i0.ɵɵelementStart(0, "div",
|
|
55
|
-
i0.ɵɵlistener("
|
|
54
|
+
i0.ɵɵelementStart(0, "div", 17);
|
|
55
|
+
i0.ɵɵlistener("click", function ConversationWorkspaceComponent_Conditional_4_Conditional_3_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.expandSidebar()); });
|
|
56
|
+
i0.ɵɵelement(1, "i", 18);
|
|
56
57
|
i0.ɵɵelementEnd();
|
|
57
58
|
} }
|
|
58
59
|
function ConversationWorkspaceComponent_Conditional_4_div_4_Template(rf, ctx) { if (rf & 1) {
|
|
59
60
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
60
|
-
i0.ɵɵelementStart(0, "div",
|
|
61
|
-
i0.ɵɵlistener("
|
|
61
|
+
i0.ɵɵelementStart(0, "div", 19);
|
|
62
|
+
i0.ɵɵlistener("mousedown", function ConversationWorkspaceComponent_Conditional_4_div_4_Template_div_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onSidebarResizeStart($event)); });
|
|
63
|
+
i0.ɵɵelementEnd();
|
|
64
|
+
} }
|
|
65
|
+
function ConversationWorkspaceComponent_Conditional_4_div_5_Template(rf, ctx) { if (rf & 1) {
|
|
66
|
+
const _r6 = i0.ɵɵgetCurrentView();
|
|
67
|
+
i0.ɵɵelementStart(0, "div", 20)(1, "mj-collections-full-view", 21);
|
|
68
|
+
i0.ɵɵlistener("collectionNavigated", function ConversationWorkspaceComponent_Conditional_4_div_5_Template_mj_collections_full_view_collectionNavigated_1_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onCollectionNavigated($event)); });
|
|
62
69
|
i0.ɵɵelementEnd()();
|
|
63
70
|
} if (rf & 2) {
|
|
64
71
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
65
72
|
i0.ɵɵadvance();
|
|
66
73
|
i0.ɵɵproperty("environmentId", ctx_r1.environmentId)("currentUser", ctx_r1.currentUser);
|
|
67
74
|
} }
|
|
68
|
-
function
|
|
69
|
-
const
|
|
70
|
-
i0.ɵɵelementStart(0, "div",
|
|
71
|
-
i0.ɵɵlistener("openEntityRecord", function
|
|
75
|
+
function ConversationWorkspaceComponent_Conditional_4_div_6_Template(rf, ctx) { if (rf & 1) {
|
|
76
|
+
const _r7 = i0.ɵɵgetCurrentView();
|
|
77
|
+
i0.ɵɵelementStart(0, "div", 20)(1, "mj-tasks-full-view", 22);
|
|
78
|
+
i0.ɵɵlistener("openEntityRecord", function ConversationWorkspaceComponent_Conditional_4_div_6_Template_mj_tasks_full_view_openEntityRecord_1_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onOpenEntityRecordFromTasks($event)); });
|
|
72
79
|
i0.ɵɵelementEnd()();
|
|
73
80
|
} if (rf & 2) {
|
|
74
81
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
75
82
|
i0.ɵɵadvance();
|
|
76
83
|
i0.ɵɵproperty("environmentId", ctx_r1.environmentId)("currentUser", ctx_r1.currentUser)("baseFilter", ctx_r1.tasksFilter)("activeTaskId", ctx_r1.activeTaskId);
|
|
77
84
|
} }
|
|
78
|
-
function
|
|
79
|
-
const
|
|
80
|
-
i0.ɵɵelementStart(0, "div",
|
|
81
|
-
i0.ɵɵlistener("conversationRenamed", function
|
|
85
|
+
function ConversationWorkspaceComponent_Conditional_4_div_7_Template(rf, ctx) { if (rf & 1) {
|
|
86
|
+
const _r8 = i0.ɵɵgetCurrentView();
|
|
87
|
+
i0.ɵɵelementStart(0, "div", 20)(1, "mj-conversation-chat-area", 23);
|
|
88
|
+
i0.ɵɵlistener("conversationRenamed", function ConversationWorkspaceComponent_Conditional_4_div_7_Template_mj_conversation_chat_area_conversationRenamed_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onConversationRenamed($event)); })("openEntityRecord", function ConversationWorkspaceComponent_Conditional_4_div_7_Template_mj_conversation_chat_area_openEntityRecord_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onOpenEntityRecord($event)); })("taskClicked", function ConversationWorkspaceComponent_Conditional_4_div_7_Template_mj_conversation_chat_area_taskClicked_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onTaskClicked($event)); })("artifactLinkClicked", function ConversationWorkspaceComponent_Conditional_4_div_7_Template_mj_conversation_chat_area_artifactLinkClicked_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onArtifactLinkNavigation($event)); })("conversationCreated", function ConversationWorkspaceComponent_Conditional_4_div_7_Template_mj_conversation_chat_area_conversationCreated_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onConversationCreated($event)); })("threadOpened", function ConversationWorkspaceComponent_Conditional_4_div_7_Template_mj_conversation_chat_area_threadOpened_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onThreadOpened($event)); })("threadClosed", function ConversationWorkspaceComponent_Conditional_4_div_7_Template_mj_conversation_chat_area_threadClosed_1_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onThreadClosed()); })("pendingArtifactConsumed", function ConversationWorkspaceComponent_Conditional_4_div_7_Template_mj_conversation_chat_area_pendingArtifactConsumed_1_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); ctx_r1.pendingArtifactId = null; return i0.ɵɵresetView(ctx_r1.pendingArtifactVersionNumber = null); })("pendingMessageConsumed", function ConversationWorkspaceComponent_Conditional_4_div_7_Template_mj_conversation_chat_area_pendingMessageConsumed_1_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.pendingMessageToSend = null); })("pendingMessageRequested", function ConversationWorkspaceComponent_Conditional_4_div_7_Template_mj_conversation_chat_area_pendingMessageRequested_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.pendingMessageToSend = $event); });
|
|
82
89
|
i0.ɵɵelementEnd()();
|
|
83
90
|
} if (rf & 2) {
|
|
84
91
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
85
92
|
i0.ɵɵadvance();
|
|
86
93
|
i0.ɵɵproperty("environmentId", ctx_r1.environmentId)("currentUser", ctx_r1.currentUser)("conversationId", ctx_r1.selectedConversationId)("conversation", ctx_r1.selectedConversation)("threadId", ctx_r1.selectedThreadId)("isNewConversation", ctx_r1.isNewUnsavedConversation)("pendingMessage", ctx_r1.pendingMessageToSend)("pendingArtifactId", ctx_r1.pendingArtifactId)("pendingArtifactVersionNumber", ctx_r1.pendingArtifactVersionNumber);
|
|
87
94
|
} }
|
|
88
|
-
function
|
|
89
|
-
const
|
|
90
|
-
i0.ɵɵelementStart(0, "div",
|
|
91
|
-
i0.ɵɵlistener("mousedown", function
|
|
95
|
+
function ConversationWorkspaceComponent_Conditional_4_Conditional_8_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
96
|
+
const _r10 = i0.ɵɵgetCurrentView();
|
|
97
|
+
i0.ɵɵelementStart(0, "div", 27);
|
|
98
|
+
i0.ɵɵlistener("mousedown", function ConversationWorkspaceComponent_Conditional_4_Conditional_8_Conditional_0_Template_div_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onArtifactPanelResizeStart($event)); });
|
|
92
99
|
i0.ɵɵelementEnd();
|
|
93
100
|
} }
|
|
94
|
-
function
|
|
95
|
-
const
|
|
96
|
-
i0.ɵɵtemplate(0,
|
|
97
|
-
i0.ɵɵelementStart(1, "div",
|
|
98
|
-
i0.ɵɵlistener("closed", function
|
|
101
|
+
function ConversationWorkspaceComponent_Conditional_4_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
102
|
+
const _r9 = i0.ɵɵgetCurrentView();
|
|
103
|
+
i0.ɵɵtemplate(0, ConversationWorkspaceComponent_Conditional_4_Conditional_8_Conditional_0_Template, 1, 0, "div", 24);
|
|
104
|
+
i0.ɵɵelementStart(1, "div", 25)(2, "mj-artifact-viewer-panel", 26);
|
|
105
|
+
i0.ɵɵlistener("closed", function ConversationWorkspaceComponent_Conditional_4_Conditional_8_Template_mj_artifact_viewer_panel_closed_2_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.closeArtifactPanel()); })("navigateToLink", function ConversationWorkspaceComponent_Conditional_4_Conditional_8_Template_mj_artifact_viewer_panel_navigateToLink_2_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onArtifactLinkNavigation($event)); })("shareRequested", function ConversationWorkspaceComponent_Conditional_4_Conditional_8_Template_mj_artifact_viewer_panel_shareRequested_2_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onArtifactShareRequested($event)); })("maximizeToggled", function ConversationWorkspaceComponent_Conditional_4_Conditional_8_Template_mj_artifact_viewer_panel_maximizeToggled_2_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleMaximizeArtifactPanel()); });
|
|
99
106
|
i0.ɵɵelementEnd()();
|
|
100
107
|
} if (rf & 2) {
|
|
101
108
|
let tmp_8_0;
|
|
@@ -110,16 +117,18 @@ function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template(rf,
|
|
|
110
117
|
} }
|
|
111
118
|
function ConversationWorkspaceComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
112
119
|
i0.ɵɵelementStart(0, "div", 4);
|
|
113
|
-
i0.ɵɵtemplate(1, ConversationWorkspaceComponent_Conditional_4_Conditional_1_Template, 1, 0, "div", 8)(2, ConversationWorkspaceComponent_Conditional_4_div_2_Template, 2,
|
|
120
|
+
i0.ɵɵtemplate(1, ConversationWorkspaceComponent_Conditional_4_Conditional_1_Template, 1, 0, "div", 8)(2, ConversationWorkspaceComponent_Conditional_4_div_2_Template, 2, 15, "div", 9)(3, ConversationWorkspaceComponent_Conditional_4_Conditional_3_Template, 2, 0, "div", 10)(4, ConversationWorkspaceComponent_Conditional_4_div_4_Template, 1, 0, "div", 11)(5, ConversationWorkspaceComponent_Conditional_4_div_5_Template, 2, 2, "div", 12)(6, ConversationWorkspaceComponent_Conditional_4_div_6_Template, 2, 4, "div", 12)(7, ConversationWorkspaceComponent_Conditional_4_div_7_Template, 2, 9, "div", 12)(8, ConversationWorkspaceComponent_Conditional_4_Conditional_8_Template, 3, 15, "div", 13);
|
|
114
121
|
i0.ɵɵelementEnd();
|
|
115
122
|
} if (rf & 2) {
|
|
116
123
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
117
124
|
i0.ɵɵadvance();
|
|
118
125
|
i0.ɵɵconditional(ctx_r1.isMobileView && ctx_r1.isSidebarVisible && ctx_r1.activeTab !== "collections" && ctx_r1.activeTab !== "tasks" ? 1 : -1);
|
|
119
126
|
i0.ɵɵadvance();
|
|
120
|
-
i0.ɵɵproperty("ngIf", ctx_r1.activeTab !== "collections" && ctx_r1.activeTab !== "tasks");
|
|
127
|
+
i0.ɵɵproperty("ngIf", ctx_r1.activeTab !== "collections" && ctx_r1.activeTab !== "tasks" && ctx_r1.isSidebarSettingsLoaded);
|
|
121
128
|
i0.ɵɵadvance();
|
|
122
|
-
i0.ɵɵ
|
|
129
|
+
i0.ɵɵconditional(ctx_r1.activeTab !== "collections" && ctx_r1.activeTab !== "tasks" && ctx_r1.isSidebarCollapsed && ctx_r1.isSidebarSettingsLoaded ? 3 : -1);
|
|
130
|
+
i0.ɵɵadvance();
|
|
131
|
+
i0.ɵɵproperty("ngIf", ctx_r1.isSidebarVisible && !ctx_r1.isSidebarCollapsed && ctx_r1.activeTab !== "collections" && ctx_r1.activeTab !== "tasks" && ctx_r1.isSidebarSettingsLoaded);
|
|
123
132
|
i0.ɵɵadvance();
|
|
124
133
|
i0.ɵɵproperty("ngIf", ctx_r1.activeTab === "collections");
|
|
125
134
|
i0.ɵɵadvance();
|
|
@@ -127,7 +136,7 @@ function ConversationWorkspaceComponent_Conditional_4_Template(rf, ctx) { if (rf
|
|
|
127
136
|
i0.ɵɵadvance();
|
|
128
137
|
i0.ɵɵproperty("ngIf", ctx_r1.activeTab !== "collections" && ctx_r1.activeTab !== "tasks");
|
|
129
138
|
i0.ɵɵadvance();
|
|
130
|
-
i0.ɵɵconditional(ctx_r1.isArtifactPanelOpen && ctx_r1.activeArtifactId ?
|
|
139
|
+
i0.ɵɵconditional(ctx_r1.isArtifactPanelOpen && ctx_r1.activeArtifactId ? 8 : -1);
|
|
131
140
|
} }
|
|
132
141
|
/**
|
|
133
142
|
* Top-level workspace component for conversations
|
|
@@ -205,6 +214,7 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
205
214
|
activeVersionNumber = null;
|
|
206
215
|
activeVersionId = null;
|
|
207
216
|
isMobileView = false;
|
|
217
|
+
isSidebarPinned = false; // Default unpinned until settings load (prevents flicker)
|
|
208
218
|
// Artifact permissions
|
|
209
219
|
canShareActiveArtifact = false;
|
|
210
220
|
canEditActiveArtifact = false;
|
|
@@ -213,6 +223,9 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
213
223
|
artifactToShare = null;
|
|
214
224
|
// Resize state - Sidebar
|
|
215
225
|
sidebarWidth = 260; // Default width
|
|
226
|
+
isSidebarCollapsed = true; // Default collapsed until settings load (prevents flicker)
|
|
227
|
+
sidebarTransitionsEnabled = false; // Disabled during initial load to prevent jarring animation
|
|
228
|
+
isSidebarSettingsLoaded = false; // Tracks whether settings have been loaded (prevents render before state is known)
|
|
216
229
|
isSidebarResizing = false;
|
|
217
230
|
sidebarResizeStartX = 0;
|
|
218
231
|
sidebarResizeStartWidth = 0;
|
|
@@ -228,9 +241,14 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
228
241
|
previousVersionId = null; // Used to track version changes in ngDoCheck
|
|
229
242
|
previousIsNewConversation = false; // Track new conversation state changes
|
|
230
243
|
destroy$ = new Subject();
|
|
231
|
-
// LocalStorage keys
|
|
244
|
+
// LocalStorage keys (fallback for User Settings)
|
|
232
245
|
SIDEBAR_WIDTH_KEY = 'mj-conversations-sidebar-width';
|
|
246
|
+
SIDEBAR_COLLAPSED_KEY = 'mj-conversations-sidebar-collapsed';
|
|
233
247
|
ARTIFACT_PANEL_WIDTH_KEY = 'mj-artifact-panel-width';
|
|
248
|
+
// User Settings key for server-side persistence
|
|
249
|
+
USER_SETTING_SIDEBAR_KEY = 'Conversations.SidebarState';
|
|
250
|
+
saveSettingsTimeout = null;
|
|
251
|
+
isLoadingSettings = false;
|
|
234
252
|
// Task filter for conversation-specific filtering
|
|
235
253
|
tasksFilter = '1=1';
|
|
236
254
|
// LOCAL CONVERSATION STATE - enables multiple workspace instances
|
|
@@ -281,6 +299,10 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
281
299
|
this.selectedConversation = null;
|
|
282
300
|
this.isNewUnsavedConversation = true;
|
|
283
301
|
this.pendingMessageToSend = null;
|
|
302
|
+
// Auto-collapse if mobile OR if sidebar is not pinned
|
|
303
|
+
if (this.isMobileView || !this.isSidebarPinned) {
|
|
304
|
+
this.collapseSidebar();
|
|
305
|
+
}
|
|
284
306
|
}
|
|
285
307
|
/**
|
|
286
308
|
* Clears the new unsaved conversation state
|
|
@@ -307,6 +329,10 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
307
329
|
*/
|
|
308
330
|
onConversationSelected(conversationId) {
|
|
309
331
|
this.setActiveConversation(conversationId);
|
|
332
|
+
// Auto-collapse if mobile OR if sidebar is not pinned
|
|
333
|
+
if (this.isMobileView || !this.isSidebarPinned) {
|
|
334
|
+
this.collapseSidebar();
|
|
335
|
+
}
|
|
310
336
|
}
|
|
311
337
|
/**
|
|
312
338
|
* Handler for new conversation creation from chat area
|
|
@@ -346,11 +372,30 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
346
372
|
.subscribe(command => {
|
|
347
373
|
this.onAutomaticCommand(command);
|
|
348
374
|
});
|
|
349
|
-
// Check initial mobile state
|
|
375
|
+
// Check initial mobile state FIRST
|
|
350
376
|
this.checkMobileView();
|
|
351
377
|
// Load saved widths from localStorage
|
|
352
378
|
this.loadSidebarWidth();
|
|
353
379
|
this.loadArtifactPanelWidth();
|
|
380
|
+
// Load sidebar state - but on mobile, always default to collapsed
|
|
381
|
+
if (this.isMobileView) {
|
|
382
|
+
this.isSidebarCollapsed = true;
|
|
383
|
+
this.isSidebarVisible = false;
|
|
384
|
+
this.isSidebarSettingsLoaded = true; // Mobile doesn't need to load settings
|
|
385
|
+
// Enable transitions after a brief delay to ensure initial state is applied
|
|
386
|
+
setTimeout(() => {
|
|
387
|
+
this.sidebarTransitionsEnabled = true;
|
|
388
|
+
}, 50);
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
// Load from User Settings (async) - await before continuing to prevent flicker
|
|
392
|
+
await this.loadSidebarState();
|
|
393
|
+
this.cdr.detectChanges();
|
|
394
|
+
// Enable transitions after state is loaded and applied
|
|
395
|
+
setTimeout(() => {
|
|
396
|
+
this.sidebarTransitionsEnabled = true;
|
|
397
|
+
}, 50);
|
|
398
|
+
}
|
|
354
399
|
// Setup resize listeners
|
|
355
400
|
window.addEventListener('mousemove', this.onResizeMove.bind(this));
|
|
356
401
|
window.addEventListener('mouseup', this.onResizeEnd.bind(this));
|
|
@@ -498,6 +543,10 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
498
543
|
ngOnDestroy() {
|
|
499
544
|
this.destroy$.next();
|
|
500
545
|
this.destroy$.complete();
|
|
546
|
+
// Clear any pending save timeout
|
|
547
|
+
if (this.saveSettingsTimeout) {
|
|
548
|
+
clearTimeout(this.saveSettingsTimeout);
|
|
549
|
+
}
|
|
501
550
|
// Remove resize listeners
|
|
502
551
|
window.removeEventListener('mousemove', this.onResizeMove.bind(this));
|
|
503
552
|
window.removeEventListener('mouseup', this.onResizeEnd.bind(this));
|
|
@@ -507,14 +556,175 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
507
556
|
onWindowResize() {
|
|
508
557
|
this.checkMobileView();
|
|
509
558
|
}
|
|
559
|
+
/**
|
|
560
|
+
* Handle clicks outside the sidebar to auto-collapse when unpinned
|
|
561
|
+
*/
|
|
562
|
+
onDocumentClick(event) {
|
|
563
|
+
// Only handle when sidebar is expanded but unpinned
|
|
564
|
+
if (this.isSidebarCollapsed || this.isSidebarPinned) {
|
|
565
|
+
return;
|
|
566
|
+
}
|
|
567
|
+
// Check if click is outside the sidebar
|
|
568
|
+
const target = event.target;
|
|
569
|
+
const sidebarElement = target.closest('.workspace-sidebar');
|
|
570
|
+
const expandHandle = target.closest('.sidebar-expand-handle');
|
|
571
|
+
// If click is outside sidebar and expand handle, collapse it
|
|
572
|
+
if (!sidebarElement && !expandHandle) {
|
|
573
|
+
this.collapseSidebar();
|
|
574
|
+
}
|
|
575
|
+
}
|
|
510
576
|
checkMobileView() {
|
|
511
577
|
const wasMobile = this.isMobileView;
|
|
512
578
|
this.isMobileView = window.innerWidth < 768;
|
|
513
579
|
if (this.isMobileView && !wasMobile) {
|
|
580
|
+
// Switched to mobile - hide sidebar and default to collapsed
|
|
514
581
|
this.isSidebarVisible = false;
|
|
582
|
+
this.isSidebarCollapsed = true;
|
|
515
583
|
}
|
|
516
584
|
else if (!this.isMobileView && wasMobile) {
|
|
585
|
+
// Switched to desktop - show sidebar, restore state from User Settings
|
|
517
586
|
this.isSidebarVisible = true;
|
|
587
|
+
this.loadSidebarState().then(() => {
|
|
588
|
+
this.cdr.detectChanges();
|
|
589
|
+
});
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
/**
|
|
593
|
+
* Collapse sidebar
|
|
594
|
+
*/
|
|
595
|
+
collapseSidebar() {
|
|
596
|
+
this.isSidebarCollapsed = true;
|
|
597
|
+
if (this.isMobileView) {
|
|
598
|
+
this.isSidebarVisible = false;
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
/**
|
|
602
|
+
* Expand sidebar (unpinned - will auto-collapse on selection)
|
|
603
|
+
*/
|
|
604
|
+
expandSidebar() {
|
|
605
|
+
this.isSidebarCollapsed = false;
|
|
606
|
+
this.isSidebarPinned = false;
|
|
607
|
+
}
|
|
608
|
+
/**
|
|
609
|
+
* Pin sidebar - keep it open after selection
|
|
610
|
+
*/
|
|
611
|
+
pinSidebar() {
|
|
612
|
+
this.isSidebarPinned = true;
|
|
613
|
+
this.saveSidebarState();
|
|
614
|
+
}
|
|
615
|
+
/**
|
|
616
|
+
* Unpin sidebar - will auto-collapse on next selection
|
|
617
|
+
*/
|
|
618
|
+
unpinSidebar() {
|
|
619
|
+
this.isSidebarPinned = false;
|
|
620
|
+
this.collapseSidebar();
|
|
621
|
+
this.saveSidebarState();
|
|
622
|
+
}
|
|
623
|
+
/**
|
|
624
|
+
* Save sidebar state to User Settings (server) and localStorage (fallback)
|
|
625
|
+
* Uses debouncing to avoid excessive database writes
|
|
626
|
+
*/
|
|
627
|
+
saveSidebarState() {
|
|
628
|
+
const stateToSave = {
|
|
629
|
+
collapsed: this.isSidebarCollapsed,
|
|
630
|
+
pinned: this.isSidebarPinned
|
|
631
|
+
};
|
|
632
|
+
// Save to localStorage immediately as backup
|
|
633
|
+
try {
|
|
634
|
+
localStorage.setItem(this.SIDEBAR_COLLAPSED_KEY, JSON.stringify(stateToSave));
|
|
635
|
+
}
|
|
636
|
+
catch (error) {
|
|
637
|
+
console.warn('Failed to save sidebar state to localStorage:', error);
|
|
638
|
+
}
|
|
639
|
+
// Debounce the server save to avoid excessive writes
|
|
640
|
+
if (this.saveSettingsTimeout) {
|
|
641
|
+
clearTimeout(this.saveSettingsTimeout);
|
|
642
|
+
}
|
|
643
|
+
this.saveSettingsTimeout = setTimeout(() => {
|
|
644
|
+
this.saveSidebarStateToServer(stateToSave);
|
|
645
|
+
}, 1000); // 1 second debounce
|
|
646
|
+
}
|
|
647
|
+
/**
|
|
648
|
+
* Save sidebar state to User Settings entity on server using UserInfoEngine for cached lookup
|
|
649
|
+
*/
|
|
650
|
+
async saveSidebarStateToServer(state) {
|
|
651
|
+
try {
|
|
652
|
+
const userId = this.currentUser?.ID;
|
|
653
|
+
if (!userId) {
|
|
654
|
+
return;
|
|
655
|
+
}
|
|
656
|
+
const engine = UserInfoEngine.Instance;
|
|
657
|
+
const md = new Metadata();
|
|
658
|
+
// Find existing setting from cached user settings
|
|
659
|
+
let setting = engine.UserSettings.find(s => s.Setting === this.USER_SETTING_SIDEBAR_KEY);
|
|
660
|
+
if (!setting) {
|
|
661
|
+
// Create new setting
|
|
662
|
+
setting = await md.GetEntityObject('MJ: User Settings');
|
|
663
|
+
setting.UserID = userId;
|
|
664
|
+
setting.Setting = this.USER_SETTING_SIDEBAR_KEY;
|
|
665
|
+
}
|
|
666
|
+
setting.Value = JSON.stringify(state);
|
|
667
|
+
await setting.Save();
|
|
668
|
+
}
|
|
669
|
+
catch (error) {
|
|
670
|
+
console.warn('Failed to save sidebar state to User Settings:', error);
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
/**
|
|
674
|
+
* Load sidebar state from User Settings (server) using UserInfoEngine, falling back to localStorage
|
|
675
|
+
* For new users with no saved state, defaults to collapsed with new conversation
|
|
676
|
+
*/
|
|
677
|
+
async loadSidebarState() {
|
|
678
|
+
this.isLoadingSettings = true;
|
|
679
|
+
try {
|
|
680
|
+
const userId = this.currentUser?.ID;
|
|
681
|
+
if (userId) {
|
|
682
|
+
// Try loading from cached User Settings first
|
|
683
|
+
const engine = UserInfoEngine.Instance;
|
|
684
|
+
const setting = engine.UserSettings.find(s => s.Setting === this.USER_SETTING_SIDEBAR_KEY);
|
|
685
|
+
if (setting?.Value) {
|
|
686
|
+
const state = JSON.parse(setting.Value);
|
|
687
|
+
this.isSidebarCollapsed = state.collapsed ?? true;
|
|
688
|
+
this.isSidebarPinned = state.pinned ?? false;
|
|
689
|
+
this.isLoadingSettings = false;
|
|
690
|
+
return;
|
|
691
|
+
}
|
|
692
|
+
}
|
|
693
|
+
// Fall back to localStorage
|
|
694
|
+
const saved = localStorage.getItem(this.SIDEBAR_COLLAPSED_KEY);
|
|
695
|
+
if (saved) {
|
|
696
|
+
try {
|
|
697
|
+
const state = JSON.parse(saved);
|
|
698
|
+
if (typeof state === 'object' && state !== null) {
|
|
699
|
+
this.isSidebarCollapsed = state.collapsed ?? true;
|
|
700
|
+
this.isSidebarPinned = state.pinned ?? false;
|
|
701
|
+
this.isLoadingSettings = false;
|
|
702
|
+
return;
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
catch {
|
|
706
|
+
// Fall back to old boolean format
|
|
707
|
+
this.isSidebarCollapsed = saved === 'true';
|
|
708
|
+
this.isSidebarPinned = !this.isSidebarCollapsed;
|
|
709
|
+
this.isLoadingSettings = false;
|
|
710
|
+
return;
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
// No saved state found - NEW USER DEFAULT:
|
|
714
|
+
// Start with sidebar collapsed and show new conversation screen
|
|
715
|
+
this.isSidebarCollapsed = true;
|
|
716
|
+
this.isSidebarPinned = false;
|
|
717
|
+
this.isNewUnsavedConversation = true;
|
|
718
|
+
}
|
|
719
|
+
catch (error) {
|
|
720
|
+
console.warn('Failed to load sidebar state:', error);
|
|
721
|
+
// Default to collapsed for new users on error
|
|
722
|
+
this.isSidebarCollapsed = true;
|
|
723
|
+
this.isSidebarPinned = false;
|
|
724
|
+
}
|
|
725
|
+
finally {
|
|
726
|
+
this.isLoadingSettings = false;
|
|
727
|
+
this.isSidebarSettingsLoaded = true;
|
|
518
728
|
}
|
|
519
729
|
}
|
|
520
730
|
onTabChanged(tab) {
|
|
@@ -998,14 +1208,14 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
998
1208
|
}
|
|
999
1209
|
static ɵfac = function ConversationWorkspaceComponent_Factory(t) { return new (t || ConversationWorkspaceComponent)(i0.ɵɵdirectiveInject(i1.ConversationDataService), i0.ɵɵdirectiveInject(i2.ArtifactStateService), i0.ɵɵdirectiveInject(i3.CollectionStateService), i0.ɵɵdirectiveInject(i4.ArtifactPermissionService), i0.ɵɵdirectiveInject(i5.MentionAutocompleteService), i0.ɵɵdirectiveInject(i6.MJNotificationService), i0.ɵɵdirectiveInject(i7.ConversationStreamingService), i0.ɵɵdirectiveInject(i8.UICommandHandlerService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
1000
1210
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ConversationWorkspaceComponent, selectors: [["mj-conversation-workspace"]], hostBindings: function ConversationWorkspaceComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
1001
|
-
i0.ɵɵlistener("resize", function ConversationWorkspaceComponent_resize_HostBindingHandler() { return ctx.onWindowResize(); }, false, i0.ɵɵresolveWindow);
|
|
1002
|
-
} }, inputs: { environmentId: "environmentId", initialConversationId: "initialConversationId", layout: "layout", currentUser: "currentUser", activeContext: "activeContext", contextItemId: "contextItemId", activeTabInput: "activeTabInput", activeConversationInput: "activeConversationInput", activeCollectionInput: "activeCollectionInput", activeVersionIdInput: "activeVersionIdInput", activeTaskInput: "activeTaskInput" }, outputs: { conversationChanged: "conversationChanged", artifactOpened: "artifactOpened", navigationChanged: "navigationChanged", newConversationStarted: "newConversationStarted", actionableCommandExecuted: "actionableCommandExecuted", automaticCommandExecuted: "automaticCommandExecuted" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 8, vars: 13, consts: [["mjSearchShortcut", "", "kendoDialogContainer", "", 1, "conversation-workspace", 3, "searchTriggered"], [1, "workspace-navigation"], [3, "tabChanged", "sidebarToggled", "searchTriggered", "refreshTriggered", "activeTab", "environmentId", "currentUser", "conversationId"], [1, "workspace-loading"], [1, "workspace-content"], [3, "close", "resultSelected", "isOpen", "environmentId", "currentUser"], [3, "saved", "cancelled", "isOpen", "artifact", "currentUser"], ["text", "Loading agents...", "size", "large"], [1, "mobile-sidebar-backdrop", "visible"], ["class", "workspace-sidebar", 3, "open", "width", 4, "ngIf"], ["class", "sidebar-resize-handle", 3, "mousedown", 4, "ngIf"], ["class", "workspace-main", 4, "ngIf"], [1, "workspace-artifact-panel", 3, "width", "maximized"], [1, "mobile-sidebar-backdrop", "visible", 3, "click"], [1, "workspace-sidebar"], [3, "conversationSelected", "newConversationRequested", "activeTab", "environmentId", "currentUser", "selectedConversationId", "renamedConversationId"], [1, "sidebar-resize-handle", 3, "mousedown"], [1, "workspace-main"], [3, "collectionNavigated", "environmentId", "currentUser"], [3, "openEntityRecord", "environmentId", "currentUser", "baseFilter", "activeTaskId"], [3, "conversationRenamed", "openEntityRecord", "taskClicked", "artifactLinkClicked", "conversationCreated", "threadOpened", "threadClosed", "pendingArtifactConsumed", "pendingMessageConsumed", "pendingMessageRequested", "environmentId", "currentUser", "conversationId", "conversation", "threadId", "isNewConversation", "pendingMessage", "pendingArtifactId", "pendingArtifactVersionNumber"], [1, "artifact-panel-resize-handle"], [1, "workspace-artifact-panel"], [3, "closed", "navigateToLink", "shareRequested", "maximizeToggled", "artifactId", "currentUser", "environmentId", "versionNumber", "showSaveToCollection", "viewContext", "contextCollectionId", "canShare", "canEdit", "isMaximized"], [1, "artifact-panel-resize-handle", 3, "mousedown"]], template: function ConversationWorkspaceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1211
|
+
i0.ɵɵlistener("resize", function ConversationWorkspaceComponent_resize_HostBindingHandler() { return ctx.onWindowResize(); }, false, i0.ɵɵresolveWindow)("click", function ConversationWorkspaceComponent_click_HostBindingHandler($event) { return ctx.onDocumentClick($event); }, false, i0.ɵɵresolveDocument);
|
|
1212
|
+
} }, inputs: { environmentId: "environmentId", initialConversationId: "initialConversationId", layout: "layout", currentUser: "currentUser", activeContext: "activeContext", contextItemId: "contextItemId", activeTabInput: "activeTabInput", activeConversationInput: "activeConversationInput", activeCollectionInput: "activeCollectionInput", activeVersionIdInput: "activeVersionIdInput", activeTaskInput: "activeTaskInput" }, outputs: { conversationChanged: "conversationChanged", artifactOpened: "artifactOpened", navigationChanged: "navigationChanged", newConversationStarted: "newConversationStarted", actionableCommandExecuted: "actionableCommandExecuted", automaticCommandExecuted: "automaticCommandExecuted" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 8, vars: 13, consts: [["mjSearchShortcut", "", "kendoDialogContainer", "", 1, "conversation-workspace", 3, "searchTriggered"], [1, "workspace-navigation"], [3, "tabChanged", "sidebarToggled", "searchTriggered", "refreshTriggered", "activeTab", "environmentId", "currentUser", "conversationId"], [1, "workspace-loading"], [1, "workspace-content"], [3, "close", "resultSelected", "isOpen", "environmentId", "currentUser"], [3, "saved", "cancelled", "isOpen", "artifact", "currentUser"], ["text", "Loading agents...", "size", "large"], [1, "mobile-sidebar-backdrop", "visible"], ["class", "workspace-sidebar", 3, "open", "collapsed", "no-transition", "width", 4, "ngIf"], ["title", "Expand sidebar", 1, "sidebar-expand-handle"], ["class", "sidebar-resize-handle", 3, "mousedown", 4, "ngIf"], ["class", "workspace-main", 4, "ngIf"], [1, "workspace-artifact-panel", 3, "width", "maximized"], [1, "mobile-sidebar-backdrop", "visible", 3, "click"], [1, "workspace-sidebar"], [3, "conversationSelected", "newConversationRequested", "pinSidebarRequested", "unpinSidebarRequested", "activeTab", "environmentId", "currentUser", "selectedConversationId", "renamedConversationId", "isSidebarPinned", "isMobileView"], ["title", "Expand sidebar", 1, "sidebar-expand-handle", 3, "click"], [1, "fas", "fa-chevron-right"], [1, "sidebar-resize-handle", 3, "mousedown"], [1, "workspace-main"], [3, "collectionNavigated", "environmentId", "currentUser"], [3, "openEntityRecord", "environmentId", "currentUser", "baseFilter", "activeTaskId"], [3, "conversationRenamed", "openEntityRecord", "taskClicked", "artifactLinkClicked", "conversationCreated", "threadOpened", "threadClosed", "pendingArtifactConsumed", "pendingMessageConsumed", "pendingMessageRequested", "environmentId", "currentUser", "conversationId", "conversation", "threadId", "isNewConversation", "pendingMessage", "pendingArtifactId", "pendingArtifactVersionNumber"], [1, "artifact-panel-resize-handle"], [1, "workspace-artifact-panel"], [3, "closed", "navigateToLink", "shareRequested", "maximizeToggled", "artifactId", "currentUser", "environmentId", "versionNumber", "showSaveToCollection", "viewContext", "contextCollectionId", "canShare", "canEdit", "isMaximized"], [1, "artifact-panel-resize-handle", 3, "mousedown"]], template: function ConversationWorkspaceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1003
1213
|
i0.ɵɵelementStart(0, "div", 0);
|
|
1004
1214
|
i0.ɵɵlistener("searchTriggered", function ConversationWorkspaceComponent_Template_div_searchTriggered_0_listener() { return ctx.openSearch(); });
|
|
1005
1215
|
i0.ɵɵelementStart(1, "div", 1)(2, "mj-conversation-navigation", 2);
|
|
1006
1216
|
i0.ɵɵlistener("tabChanged", function ConversationWorkspaceComponent_Template_mj_conversation_navigation_tabChanged_2_listener($event) { return ctx.onTabChanged($event); })("sidebarToggled", function ConversationWorkspaceComponent_Template_mj_conversation_navigation_sidebarToggled_2_listener() { return ctx.toggleSidebar(); })("searchTriggered", function ConversationWorkspaceComponent_Template_mj_conversation_navigation_searchTriggered_2_listener() { return ctx.openSearch(); })("refreshTriggered", function ConversationWorkspaceComponent_Template_mj_conversation_navigation_refreshTriggered_2_listener() { return ctx.onRefreshAgentCache(); });
|
|
1007
1217
|
i0.ɵɵelementEnd()();
|
|
1008
|
-
i0.ɵɵtemplate(3, ConversationWorkspaceComponent_Conditional_3_Template, 2, 0, "div", 3)(4, ConversationWorkspaceComponent_Conditional_4_Template,
|
|
1218
|
+
i0.ɵɵtemplate(3, ConversationWorkspaceComponent_Conditional_3_Template, 2, 0, "div", 3)(4, ConversationWorkspaceComponent_Conditional_4_Template, 9, 8, "div", 4);
|
|
1009
1219
|
i0.ɵɵelementStart(5, "mj-search-panel", 5);
|
|
1010
1220
|
i0.ɵɵlistener("close", function ConversationWorkspaceComponent_Template_mj_search_panel_close_5_listener() { return ctx.closeSearch(); })("resultSelected", function ConversationWorkspaceComponent_Template_mj_search_panel_resultSelected_5_listener($event) { return ctx.handleSearchResult($event); });
|
|
1011
1221
|
i0.ɵɵelementEnd();
|
|
@@ -1025,11 +1235,11 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
1025
1235
|
i0.ɵɵproperty("isOpen", ctx.isSearchPanelOpen)("environmentId", ctx.environmentId)("currentUser", ctx.currentUser);
|
|
1026
1236
|
i0.ɵɵadvance(2);
|
|
1027
1237
|
i0.ɵɵproperty("isOpen", ctx.isArtifactShareModalOpen)("artifact", ctx.artifactToShare)("currentUser", ctx.currentUser);
|
|
1028
|
-
} }, dependencies: [i9.NgIf, i10.DialogContainerDirective, i11.ArtifactViewerPanelComponent, i12.LoadingComponent, i13.TasksFullViewComponent, i14.ArtifactShareModalComponent, i15.ConversationNavigationComponent, i16.ConversationSidebarComponent, i17.ConversationChatAreaComponent, i18.CollectionsFullViewComponent, i19.SearchPanelComponent, i20.ToastComponent, i21.SearchShortcutDirective], styles: [".conversation-workspace[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%; \n\n min-height: 0; \n\n background-color: #F4F4F4;\n position: relative;\n}\n\n.workspace-navigation[_ngcontent-%COMP%] {\n flex-shrink: 0;\n height: 48px;\n background-color: #092340;\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n}\n\n.workspace-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n overflow: hidden;\n min-height: 0;\n}\n\n.workspace-sidebar[_ngcontent-%COMP%] {\n flex-shrink: 0;\n background-color: #092340;\n border-right: 1px solid #D9D9D9;\n overflow-y: auto;\n}\n\n.sidebar-resize-handle[_ngcontent-%COMP%] {\n width: 4px;\n background: transparent;\n cursor: ew-resize;\n flex-shrink: 0;\n position: relative;\n transition: background-color 0.2s;\n}\n\n.sidebar-resize-handle[_ngcontent-%COMP%]:hover {\n background: #1e40af;\n}\n\n.sidebar-resize-handle[_ngcontent-%COMP%]:active {\n background: #1e3a8a;\n}\n\n.sidebar-resize-handle[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: -4px;\n right: -4px;\n top: 0;\n bottom: 0;\n cursor: ew-resize;\n}\n\n.workspace-main[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n background-color: #FFF;\n overflow: hidden;\n min-height: 0;\n}\n\n.workspace-main[_ngcontent-%COMP%] > mj-conversation-chat-area[_ngcontent-%COMP%] {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n\n.workspace-artifact-panel[_ngcontent-%COMP%] {\n flex-shrink: 0;\n background-color: #FFF;\n overflow: hidden;\n min-width: 300px;\n max-width: 70%;\n}\n\n.artifact-panel-resize-handle[_ngcontent-%COMP%] {\n width: 4px;\n background-color: transparent;\n cursor: ew-resize;\n flex-shrink: 0;\n transition: background-color 0.2s;\n position: relative;\n z-index: 10;\n}\n\n\n\n.artifact-panel-resize-handle[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n left: -4px;\n right: -4px;\n cursor: ew-resize;\n}\n\n.artifact-panel-resize-handle[_ngcontent-%COMP%]:hover {\n background-color: #1e40af;\n}\n\n.artifact-panel-resize-handle[_ngcontent-%COMP%]:active {\n background-color: #1e3a8a;\n}\n\n\n\n.workspace-artifact-panel.maximized[_ngcontent-%COMP%] {\n width: 100% !important;\n max-width: 100%;\n}\n\n\n\n.conversation-workspace[data-layout=\"compact\"][_ngcontent-%COMP%] .workspace-sidebar[_ngcontent-%COMP%] {\n width: 240px;\n}\n\n.conversation-workspace[data-layout=\"compact\"][_ngcontent-%COMP%] .workspace-artifact-panel[_ngcontent-%COMP%] {\n width: 400px;\n}\n\n\n\n.conversation-workspace[data-layout=\"embedded\"][_ngcontent-%COMP%] {\n height: 100%;\n}\n\n.conversation-workspace[data-layout=\"embedded\"][_ngcontent-%COMP%] .workspace-navigation[_ngcontent-%COMP%] {\n height: 48px;\n}\n\n\n\n@media (max-width: 1024px) {\n .workspace-sidebar[_ngcontent-%COMP%] {\n position: absolute;\n left: 0;\n top: 60px;\n bottom: 0;\n z-index: 100;\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1);\n }\n\n .workspace-artifact-panel[_ngcontent-%COMP%] {\n position: fixed;\n right: 0;\n top: 60px;\n bottom: 0;\n z-index: 100;\n box-shadow: -2px 0 8px rgba(0, 0, 0, 0.1);\n }\n}\n\n\n\n@media (min-width: 769px) {\n .workspace-sidebar[_ngcontent-%COMP%] {\n transition: width 0.3s ease, min-width 0.3s ease;\n overflow: hidden;\n }\n\n .workspace-sidebar[_ngcontent-%COMP%]:not(.open) {\n width: 0 !important;\n min-width: 0;\n border-right: none;\n }\n\n .sidebar-resize-handle[_ngcontent-%COMP%] {\n transition: opacity 0.3s ease, width 0.3s ease;\n }\n\n .workspace-sidebar[_ngcontent-%COMP%]:not(.open) ~ .sidebar-resize-handle[_ngcontent-%COMP%] {\n opacity: 0;\n width: 0;\n pointer-events: none;\n }\n}\n\n\n\n@media (max-width: 768px) {\n .workspace-sidebar[_ngcontent-%COMP%] {\n position: fixed;\n left: 0;\n top: 80px;\n z-index: 1000;\n width: 260px !important;\n height: calc(100vh - 80px);\n transform: translateX(-100%);\n transition: transform 0.3s ease;\n }\n\n .workspace-sidebar.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n }\n\n .workspace-artifact-panel[_ngcontent-%COMP%] {\n position: fixed;\n width: 100%;\n left: 0;\n right: 0;\n top:
|
|
1238
|
+
} }, dependencies: [i9.NgIf, i10.DialogContainerDirective, i11.ArtifactViewerPanelComponent, i12.LoadingComponent, i13.TasksFullViewComponent, i14.ArtifactShareModalComponent, i15.ConversationNavigationComponent, i16.ConversationSidebarComponent, i17.ConversationChatAreaComponent, i18.CollectionsFullViewComponent, i19.SearchPanelComponent, i20.ToastComponent, i21.SearchShortcutDirective], styles: [".conversation-workspace[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%; \n\n min-height: 0; \n\n background-color: #F4F4F4;\n position: relative;\n}\n\n.workspace-navigation[_ngcontent-%COMP%] {\n flex-shrink: 0;\n height: 48px;\n background-color: #092340;\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n}\n\n.workspace-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n overflow: hidden;\n min-height: 0;\n position: relative;\n}\n\n.workspace-sidebar[_ngcontent-%COMP%] {\n flex-shrink: 0;\n background-color: #092340;\n border-right: 1px solid #D9D9D9;\n overflow-y: auto;\n transition: width 0.3s ease;\n}\n\n\n\n.workspace-sidebar.no-transition[_ngcontent-%COMP%] {\n transition: none !important;\n}\n\n.workspace-sidebar.collapsed[_ngcontent-%COMP%] {\n width: 0 !important;\n min-width: 0;\n border-right: none;\n overflow: hidden;\n}\n\n\n\n.sidebar-expand-handle[_ngcontent-%COMP%] {\n flex-shrink: 0;\n width: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n background: #092340;\n border-right: 1px solid rgba(255, 255, 255, 0.15);\n transition: background 0.15s ease;\n z-index: 10;\n}\n\n.sidebar-expand-handle[_ngcontent-%COMP%]:hover {\n background: #1a3a5c;\n}\n\n.sidebar-expand-handle[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: rgba(255, 255, 255, 0.7);\n font-size: 11px;\n transition: color 0.15s ease;\n}\n\n.sidebar-expand-handle[_ngcontent-%COMP%]:hover i[_ngcontent-%COMP%] {\n color: white;\n}\n\n.sidebar-resize-handle[_ngcontent-%COMP%] {\n width: 4px;\n background: transparent;\n cursor: ew-resize;\n flex-shrink: 0;\n position: relative;\n transition: background-color 0.2s;\n}\n\n.sidebar-resize-handle[_ngcontent-%COMP%]:hover {\n background: #1e40af;\n}\n\n.sidebar-resize-handle[_ngcontent-%COMP%]:active {\n background: #1e3a8a;\n}\n\n.sidebar-resize-handle[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: -4px;\n right: -4px;\n top: 0;\n bottom: 0;\n cursor: ew-resize;\n}\n\n.workspace-main[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n background-color: #FFF;\n overflow: hidden;\n min-height: 0;\n}\n\n.workspace-main[_ngcontent-%COMP%] > mj-conversation-chat-area[_ngcontent-%COMP%] {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n\n.workspace-artifact-panel[_ngcontent-%COMP%] {\n flex-shrink: 0;\n background-color: #FFF;\n overflow: hidden;\n min-width: 300px;\n max-width: 70%;\n}\n\n.artifact-panel-resize-handle[_ngcontent-%COMP%] {\n width: 4px;\n background-color: transparent;\n cursor: ew-resize;\n flex-shrink: 0;\n transition: background-color 0.2s;\n position: relative;\n z-index: 10;\n}\n\n\n\n.artifact-panel-resize-handle[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n left: -4px;\n right: -4px;\n cursor: ew-resize;\n}\n\n.artifact-panel-resize-handle[_ngcontent-%COMP%]:hover {\n background-color: #1e40af;\n}\n\n.artifact-panel-resize-handle[_ngcontent-%COMP%]:active {\n background-color: #1e3a8a;\n}\n\n\n\n.workspace-artifact-panel.maximized[_ngcontent-%COMP%] {\n width: 100% !important;\n max-width: 100%;\n}\n\n\n\n.conversation-workspace[data-layout=\"compact\"][_ngcontent-%COMP%] .workspace-sidebar[_ngcontent-%COMP%] {\n width: 240px;\n}\n\n.conversation-workspace[data-layout=\"compact\"][_ngcontent-%COMP%] .workspace-artifact-panel[_ngcontent-%COMP%] {\n width: 400px;\n}\n\n\n\n.conversation-workspace[data-layout=\"embedded\"][_ngcontent-%COMP%] {\n height: 100%;\n}\n\n.conversation-workspace[data-layout=\"embedded\"][_ngcontent-%COMP%] .workspace-navigation[_ngcontent-%COMP%] {\n height: 48px;\n}\n\n\n\n@media (max-width: 1024px) {\n .workspace-sidebar[_ngcontent-%COMP%] {\n position: absolute;\n left: 0;\n top: 60px;\n bottom: 0;\n z-index: 100;\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1);\n }\n\n .workspace-artifact-panel[_ngcontent-%COMP%] {\n position: fixed;\n right: 0;\n top: 60px;\n bottom: 0;\n z-index: 100;\n box-shadow: -2px 0 8px rgba(0, 0, 0, 0.1);\n }\n}\n\n\n\n@media (min-width: 769px) {\n .workspace-sidebar[_ngcontent-%COMP%] {\n transition: width 0.3s ease, min-width 0.3s ease;\n overflow: hidden;\n }\n\n .workspace-sidebar[_ngcontent-%COMP%]:not(.open) {\n width: 0 !important;\n min-width: 0;\n border-right: none;\n }\n\n .sidebar-resize-handle[_ngcontent-%COMP%] {\n transition: opacity 0.3s ease, width 0.3s ease;\n }\n\n .workspace-sidebar[_ngcontent-%COMP%]:not(.open) ~ .sidebar-resize-handle[_ngcontent-%COMP%] {\n opacity: 0;\n width: 0;\n pointer-events: none;\n }\n}\n\n\n\n@media (max-width: 768px) {\n .workspace-sidebar[_ngcontent-%COMP%] {\n position: fixed;\n left: 0;\n top: 80px;\n z-index: 1000;\n width: 260px !important;\n height: calc(100vh - 80px);\n transform: translateX(-100%);\n transition: transform 0.3s ease;\n }\n\n .workspace-sidebar.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n }\n\n .workspace-artifact-panel[_ngcontent-%COMP%] {\n position: fixed;\n width: 100%;\n left: 0;\n right: 0;\n top: 56px; \n\n bottom: 0;\n z-index: 1000;\n max-width: 100%;\n height: auto;\n }\n\n .sidebar-resize-handle[_ngcontent-%COMP%], \n .artifact-panel-resize-handle[_ngcontent-%COMP%], \n .sidebar-expand-handle[_ngcontent-%COMP%] {\n display: none;\n }\n\n \n\n .mobile-sidebar-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.3s ease;\n z-index: 999;\n }\n\n .mobile-sidebar-backdrop.visible[_ngcontent-%COMP%] {\n opacity: 1;\n pointer-events: auto;\n }\n}\n\n\n\n@media (max-width: 480px) {\n .workspace-navigation[_ngcontent-%COMP%] {\n height: 48px;\n }\n\n .workspace-sidebar[_ngcontent-%COMP%] {\n width: 100%;\n }\n}\n\n\n\n.workspace-loading[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n width: 100%;\n background: #FFF;\n gap: 1rem;\n}\n\n.loading-spinner[_ngcontent-%COMP%] {\n font-size: 3rem;\n color: #0078d4;\n}\n\n.workspace-loading[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 1rem;\n color: #666;\n margin: 0;\n}"] });
|
|
1029
1239
|
}
|
|
1030
1240
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ConversationWorkspaceComponent, [{
|
|
1031
1241
|
type: Component,
|
|
1032
|
-
args: [{ selector: 'mj-conversation-workspace', template: "<div class=\"conversation-workspace\" [attr.data-layout]=\"layout\" mjSearchShortcut (searchTriggered)=\"openSearch()\" kendoDialogContainer>\n <!-- Top Navigation Bar -->\n <div class=\"workspace-navigation\">\n <mj-conversation-navigation\n [activeTab]=\"activeTab\"\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [conversationId]=\"selectedConversationId\"\n (tabChanged)=\"onTabChanged($event)\"\n (sidebarToggled)=\"toggleSidebar()\"\n (searchTriggered)=\"openSearch()\"\n (refreshTriggered)=\"onRefreshAgentCache()\">\n </mj-conversation-navigation>\n </div>\n\n <!-- Loading spinner while initializing agents -->\n @if (!isWorkspaceReady) {\n <div class=\"workspace-loading\">\n <mj-loading text=\"Loading agents...\" size=\"large\"></mj-loading>\n </div>\n }\n\n <!-- Main workspace content - only renders when agents are ready -->\n @if (isWorkspaceReady) {\n <div class=\"workspace-content\">\n <!-- Mobile sidebar backdrop -->\n @if (isMobileView && isSidebarVisible && activeTab !== 'collections' && activeTab !== 'tasks') {\n <div class=\"mobile-sidebar-backdrop visible\" (click)=\"closeSidebar()\"></div>\n }\n\n <!-- Left Sidebar (hidden when Collections or Tasks view is active) -->\n <div class=\"workspace-sidebar\"\n *ngIf=\"activeTab !== 'collections' && activeTab !== 'tasks'\"\n [class.open]=\"isSidebarVisible\"\n [style.width.px]=\"sidebarWidth\">\n <mj-conversation-sidebar\n [activeTab]=\"activeTab\"\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [selectedConversationId]=\"selectedConversationId\"\n [renamedConversationId]=\"renamedConversationId\"\n (conversationSelected)=\"onConversationSelected($event)\"\n (newConversationRequested)=\"startNewConversation()\">\n </mj-conversation-sidebar>\n </div>\n\n <!-- Resize handle for sidebar -->\n <div class=\"sidebar-resize-handle\" *ngIf=\"isSidebarVisible && activeTab !== 'collections' && activeTab !== 'tasks'\" (mousedown)=\"onSidebarResizeStart($event)\"></div>\n\n <!-- Collections Full-Panel View -->\n <div class=\"workspace-main\" *ngIf=\"activeTab === 'collections'\">\n <mj-collections-full-view\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n (collectionNavigated)=\"onCollectionNavigated($event)\">\n </mj-collections-full-view>\n </div>\n\n <!-- Tasks Full-Panel View -->\n <div class=\"workspace-main\" *ngIf=\"activeTab === 'tasks'\">\n <mj-tasks-full-view\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [baseFilter]=\"tasksFilter\"\n [activeTaskId]=\"activeTaskId\"\n (openEntityRecord)=\"onOpenEntityRecordFromTasks($event)\">\n </mj-tasks-full-view>\n </div>\n\n <!-- Main Chat Area (only shown when not in Collections or Tasks view) -->\n <div class=\"workspace-main\" *ngIf=\"activeTab !== 'collections' && activeTab !== 'tasks'\">\n <mj-conversation-chat-area\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [conversationId]=\"selectedConversationId\"\n [conversation]=\"selectedConversation\"\n [threadId]=\"selectedThreadId\"\n [isNewConversation]=\"isNewUnsavedConversation\"\n [pendingMessage]=\"pendingMessageToSend\"\n [pendingArtifactId]=\"pendingArtifactId\"\n [pendingArtifactVersionNumber]=\"pendingArtifactVersionNumber\"\n (conversationRenamed)=\"onConversationRenamed($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (taskClicked)=\"onTaskClicked($event)\"\n (artifactLinkClicked)=\"onArtifactLinkNavigation($event)\"\n (conversationCreated)=\"onConversationCreated($event)\"\n (threadOpened)=\"onThreadOpened($event)\"\n (threadClosed)=\"onThreadClosed()\"\n (pendingArtifactConsumed)=\"pendingArtifactId = null; pendingArtifactVersionNumber = null\"\n (pendingMessageConsumed)=\"pendingMessageToSend = null\"\n (pendingMessageRequested)=\"pendingMessageToSend = $event\">\n </mj-conversation-chat-area>\n </div>\n\n <!-- Right Artifact Panel -->\n @if (isArtifactPanelOpen && activeArtifactId) {\n @if (!isArtifactPanelMaximized) {\n <div class=\"artifact-panel-resize-handle\" (mousedown)=\"onArtifactPanelResizeStart($event)\"></div>\n }\n <div class=\"workspace-artifact-panel\"\n [style.width.%]=\"artifactPanelWidth\"\n [class.maximized]=\"isArtifactPanelMaximized\">\n <mj-artifact-viewer-panel\n [artifactId]=\"activeArtifactId\"\n [currentUser]=\"currentUser\"\n [environmentId]=\"environmentId\"\n [versionNumber]=\"activeVersionNumber ?? undefined\"\n [showSaveToCollection]=\"activeTab !== 'collections'\"\n [viewContext]=\"activeTab === 'collections' ? 'collection' : 'conversation'\"\n [contextCollectionId]=\"collectionState.activeCollectionId ?? undefined\"\n [canShare]=\"canShareActiveArtifact\"\n [canEdit]=\"canEditActiveArtifact\"\n [isMaximized]=\"isArtifactPanelMaximized\"\n (closed)=\"closeArtifactPanel()\"\n (navigateToLink)=\"onArtifactLinkNavigation($event)\"\n (shareRequested)=\"onArtifactShareRequested($event)\"\n (maximizeToggled)=\"toggleMaximizeArtifactPanel()\">\n </mj-artifact-viewer-panel>\n </div>\n }\n </div>\n }\n\n <!-- Global Search Panel -->\n <mj-search-panel\n [isOpen]=\"isSearchPanelOpen\"\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n (close)=\"closeSearch()\"\n (resultSelected)=\"handleSearchResult($event)\">\n </mj-search-panel>\n\n <!-- Toast Notifications -->\n <mj-toast></mj-toast>\n\n <!-- Artifact Share Modal -->\n <mj-artifact-share-modal\n [isOpen]=\"isArtifactShareModalOpen\"\n [artifact]=\"artifactToShare\"\n [currentUser]=\"currentUser\"\n (saved)=\"onArtifactShared()\"\n (cancelled)=\"onArtifactShareModalClose()\">\n </mj-artifact-share-modal>\n</div>", styles: [".conversation-workspace {\n display: flex;\n flex-direction: column;\n height: 100%; /* Fill parent container - works in any context (tabs, embedded, etc.) */\n min-height: 0; /* Allow flex shrinking in nested flex containers */\n background-color: #F4F4F4;\n position: relative;\n}\n\n.workspace-navigation {\n flex-shrink: 0;\n height: 48px;\n background-color: #092340;\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n}\n\n.workspace-content {\n flex: 1;\n display: flex;\n overflow: hidden;\n min-height: 0;\n}\n\n.workspace-sidebar {\n flex-shrink: 0;\n background-color: #092340;\n border-right: 1px solid #D9D9D9;\n overflow-y: auto;\n}\n\n.sidebar-resize-handle {\n width: 4px;\n background: transparent;\n cursor: ew-resize;\n flex-shrink: 0;\n position: relative;\n transition: background-color 0.2s;\n}\n\n.sidebar-resize-handle:hover {\n background: #1e40af;\n}\n\n.sidebar-resize-handle:active {\n background: #1e3a8a;\n}\n\n.sidebar-resize-handle::before {\n content: '';\n position: absolute;\n left: -4px;\n right: -4px;\n top: 0;\n bottom: 0;\n cursor: ew-resize;\n}\n\n.workspace-main {\n flex: 1;\n display: flex;\n flex-direction: column;\n background-color: #FFF;\n overflow: hidden;\n min-height: 0;\n}\n\n.workspace-main > mj-conversation-chat-area {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n\n.workspace-artifact-panel {\n flex-shrink: 0;\n background-color: #FFF;\n overflow: hidden;\n min-width: 300px;\n max-width: 70%;\n}\n\n.artifact-panel-resize-handle {\n width: 4px;\n background-color: transparent;\n cursor: ew-resize;\n flex-shrink: 0;\n transition: background-color 0.2s;\n position: relative;\n z-index: 10;\n}\n\n/* Wider hit area for easier grabbing */\n.artifact-panel-resize-handle::before {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n left: -4px;\n right: -4px;\n cursor: ew-resize;\n}\n\n.artifact-panel-resize-handle:hover {\n background-color: #1e40af;\n}\n\n.artifact-panel-resize-handle:active {\n background-color: #1e3a8a;\n}\n\n/* Maximized artifact panel */\n.workspace-artifact-panel.maximized {\n width: 100% !important;\n max-width: 100%;\n}\n\n/* Compact layout */\n.conversation-workspace[data-layout=\"compact\"] .workspace-sidebar {\n width: 240px;\n}\n\n.conversation-workspace[data-layout=\"compact\"] .workspace-artifact-panel {\n width: 400px;\n}\n\n/* Embedded layout */\n.conversation-workspace[data-layout=\"embedded\"] {\n height: 100%;\n}\n\n.conversation-workspace[data-layout=\"embedded\"] .workspace-navigation {\n height: 48px;\n}\n\n/* Responsive */\n@media (max-width: 1024px) {\n .workspace-sidebar {\n position: absolute;\n left: 0;\n top: 60px;\n bottom: 0;\n z-index: 100;\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1);\n }\n\n .workspace-artifact-panel {\n position: fixed;\n right: 0;\n top: 60px;\n bottom: 0;\n z-index: 100;\n box-shadow: -2px 0 8px rgba(0, 0, 0, 0.1);\n }\n}\n\n/* Desktop sidebar toggle animation */\n@media (min-width: 769px) {\n .workspace-sidebar {\n transition: width 0.3s ease, min-width 0.3s ease;\n overflow: hidden;\n }\n\n .workspace-sidebar:not(.open) {\n width: 0 !important;\n min-width: 0;\n border-right: none;\n }\n\n .sidebar-resize-handle {\n transition: opacity 0.3s ease, width 0.3s ease;\n }\n\n .workspace-sidebar:not(.open) ~ .sidebar-resize-handle {\n opacity: 0;\n width: 0;\n pointer-events: none;\n }\n}\n\n/* Mobile adjustments: 481px - 768px */\n@media (max-width: 768px) {\n .workspace-sidebar {\n position: fixed;\n left: 0;\n top: 80px;\n z-index: 1000;\n width: 260px !important;\n height: calc(100vh - 80px);\n transform: translateX(-100%);\n transition: transform 0.3s ease;\n }\n\n .workspace-sidebar.open {\n transform: translateX(0);\n }\n\n .workspace-artifact-panel {\n position: fixed;\n width: 100%;\n left: 0;\n right: 0;\n top: 48px;\n z-index: 1000;\n max-width: 100%;\n }\n\n .sidebar-resize-handle,\n .artifact-panel-resize-handle {\n display: none;\n }\n\n /* Mobile sidebar backdrop */\n .mobile-sidebar-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.3s ease;\n z-index: 999;\n }\n\n .mobile-sidebar-backdrop.visible {\n opacity: 1;\n pointer-events: auto;\n }\n}\n\n/* Small Phone adjustments: <= 480px */\n@media (max-width: 480px) {\n .workspace-navigation {\n height: 48px;\n }\n\n .workspace-sidebar {\n width: 100%;\n }\n}\n\n/* Loading spinner (shown while initializing agents) */\n.workspace-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n width: 100%;\n background: #FFF;\n gap: 1rem;\n}\n\n.loading-spinner {\n font-size: 3rem;\n color: #0078d4;\n}\n\n.workspace-loading p {\n font-size: 1rem;\n color: #666;\n margin: 0;\n}"] }]
|
|
1242
|
+
args: [{ selector: 'mj-conversation-workspace', template: "<div class=\"conversation-workspace\" [attr.data-layout]=\"layout\" mjSearchShortcut (searchTriggered)=\"openSearch()\" kendoDialogContainer>\n <!-- Top Navigation Bar -->\n <div class=\"workspace-navigation\">\n <mj-conversation-navigation\n [activeTab]=\"activeTab\"\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [conversationId]=\"selectedConversationId\"\n (tabChanged)=\"onTabChanged($event)\"\n (sidebarToggled)=\"toggleSidebar()\"\n (searchTriggered)=\"openSearch()\"\n (refreshTriggered)=\"onRefreshAgentCache()\">\n </mj-conversation-navigation>\n </div>\n\n <!-- Loading spinner while initializing agents -->\n @if (!isWorkspaceReady) {\n <div class=\"workspace-loading\">\n <mj-loading text=\"Loading agents...\" size=\"large\"></mj-loading>\n </div>\n }\n\n <!-- Main workspace content - only renders when agents are ready -->\n @if (isWorkspaceReady) {\n <div class=\"workspace-content\">\n <!-- Mobile sidebar backdrop -->\n @if (isMobileView && isSidebarVisible && activeTab !== 'collections' && activeTab !== 'tasks') {\n <div class=\"mobile-sidebar-backdrop visible\" (click)=\"closeSidebar()\"></div>\n }\n\n <!-- Left Sidebar (hidden when Collections or Tasks view is active) -->\n <div class=\"workspace-sidebar\"\n *ngIf=\"activeTab !== 'collections' && activeTab !== 'tasks' && isSidebarSettingsLoaded\"\n [class.open]=\"isSidebarVisible\"\n [class.collapsed]=\"isSidebarCollapsed\"\n [class.no-transition]=\"!sidebarTransitionsEnabled\"\n [style.width.px]=\"isSidebarCollapsed ? 0 : sidebarWidth\">\n <mj-conversation-sidebar\n [activeTab]=\"activeTab\"\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [selectedConversationId]=\"selectedConversationId\"\n [renamedConversationId]=\"renamedConversationId\"\n [isSidebarPinned]=\"isSidebarPinned\"\n [isMobileView]=\"isMobileView\"\n (conversationSelected)=\"onConversationSelected($event)\"\n (newConversationRequested)=\"startNewConversation()\"\n (pinSidebarRequested)=\"pinSidebar()\"\n (unpinSidebarRequested)=\"unpinSidebar()\">\n </mj-conversation-sidebar>\n </div>\n\n <!-- Sidebar expand handle (only visible when collapsed and settings loaded) -->\n @if (activeTab !== 'collections' && activeTab !== 'tasks' && isSidebarCollapsed && isSidebarSettingsLoaded) {\n <div class=\"sidebar-expand-handle\"\n (click)=\"expandSidebar()\"\n title=\"Expand sidebar\">\n <i class=\"fas fa-chevron-right\"></i>\n </div>\n }\n\n <!-- Resize handle for sidebar (only when expanded and settings loaded) -->\n <div class=\"sidebar-resize-handle\"\n *ngIf=\"isSidebarVisible && !isSidebarCollapsed && activeTab !== 'collections' && activeTab !== 'tasks' && isSidebarSettingsLoaded\"\n (mousedown)=\"onSidebarResizeStart($event)\"></div>\n\n <!-- Collections Full-Panel View -->\n <div class=\"workspace-main\" *ngIf=\"activeTab === 'collections'\">\n <mj-collections-full-view\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n (collectionNavigated)=\"onCollectionNavigated($event)\">\n </mj-collections-full-view>\n </div>\n\n <!-- Tasks Full-Panel View -->\n <div class=\"workspace-main\" *ngIf=\"activeTab === 'tasks'\">\n <mj-tasks-full-view\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [baseFilter]=\"tasksFilter\"\n [activeTaskId]=\"activeTaskId\"\n (openEntityRecord)=\"onOpenEntityRecordFromTasks($event)\">\n </mj-tasks-full-view>\n </div>\n\n <!-- Main Chat Area (only shown when not in Collections or Tasks view) -->\n <div class=\"workspace-main\" *ngIf=\"activeTab !== 'collections' && activeTab !== 'tasks'\">\n <mj-conversation-chat-area\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [conversationId]=\"selectedConversationId\"\n [conversation]=\"selectedConversation\"\n [threadId]=\"selectedThreadId\"\n [isNewConversation]=\"isNewUnsavedConversation\"\n [pendingMessage]=\"pendingMessageToSend\"\n [pendingArtifactId]=\"pendingArtifactId\"\n [pendingArtifactVersionNumber]=\"pendingArtifactVersionNumber\"\n (conversationRenamed)=\"onConversationRenamed($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (taskClicked)=\"onTaskClicked($event)\"\n (artifactLinkClicked)=\"onArtifactLinkNavigation($event)\"\n (conversationCreated)=\"onConversationCreated($event)\"\n (threadOpened)=\"onThreadOpened($event)\"\n (threadClosed)=\"onThreadClosed()\"\n (pendingArtifactConsumed)=\"pendingArtifactId = null; pendingArtifactVersionNumber = null\"\n (pendingMessageConsumed)=\"pendingMessageToSend = null\"\n (pendingMessageRequested)=\"pendingMessageToSend = $event\">\n </mj-conversation-chat-area>\n </div>\n\n <!-- Right Artifact Panel -->\n @if (isArtifactPanelOpen && activeArtifactId) {\n @if (!isArtifactPanelMaximized) {\n <div class=\"artifact-panel-resize-handle\" (mousedown)=\"onArtifactPanelResizeStart($event)\"></div>\n }\n <div class=\"workspace-artifact-panel\"\n [style.width.%]=\"artifactPanelWidth\"\n [class.maximized]=\"isArtifactPanelMaximized\">\n <mj-artifact-viewer-panel\n [artifactId]=\"activeArtifactId\"\n [currentUser]=\"currentUser\"\n [environmentId]=\"environmentId\"\n [versionNumber]=\"activeVersionNumber ?? undefined\"\n [showSaveToCollection]=\"activeTab !== 'collections'\"\n [viewContext]=\"activeTab === 'collections' ? 'collection' : 'conversation'\"\n [contextCollectionId]=\"collectionState.activeCollectionId ?? undefined\"\n [canShare]=\"canShareActiveArtifact\"\n [canEdit]=\"canEditActiveArtifact\"\n [isMaximized]=\"isArtifactPanelMaximized\"\n (closed)=\"closeArtifactPanel()\"\n (navigateToLink)=\"onArtifactLinkNavigation($event)\"\n (shareRequested)=\"onArtifactShareRequested($event)\"\n (maximizeToggled)=\"toggleMaximizeArtifactPanel()\">\n </mj-artifact-viewer-panel>\n </div>\n }\n </div>\n }\n\n <!-- Global Search Panel -->\n <mj-search-panel\n [isOpen]=\"isSearchPanelOpen\"\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n (close)=\"closeSearch()\"\n (resultSelected)=\"handleSearchResult($event)\">\n </mj-search-panel>\n\n <!-- Toast Notifications -->\n <mj-toast></mj-toast>\n\n <!-- Artifact Share Modal -->\n <mj-artifact-share-modal\n [isOpen]=\"isArtifactShareModalOpen\"\n [artifact]=\"artifactToShare\"\n [currentUser]=\"currentUser\"\n (saved)=\"onArtifactShared()\"\n (cancelled)=\"onArtifactShareModalClose()\">\n </mj-artifact-share-modal>\n</div>", styles: [".conversation-workspace {\n display: flex;\n flex-direction: column;\n height: 100%; /* Fill parent container - works in any context (tabs, embedded, etc.) */\n min-height: 0; /* Allow flex shrinking in nested flex containers */\n background-color: #F4F4F4;\n position: relative;\n}\n\n.workspace-navigation {\n flex-shrink: 0;\n height: 48px;\n background-color: #092340;\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n}\n\n.workspace-content {\n flex: 1;\n display: flex;\n overflow: hidden;\n min-height: 0;\n position: relative;\n}\n\n.workspace-sidebar {\n flex-shrink: 0;\n background-color: #092340;\n border-right: 1px solid #D9D9D9;\n overflow-y: auto;\n transition: width 0.3s ease;\n}\n\n/* Disable transitions during initial load to prevent jarring animation */\n.workspace-sidebar.no-transition {\n transition: none !important;\n}\n\n.workspace-sidebar.collapsed {\n width: 0 !important;\n min-width: 0;\n border-right: none;\n overflow: hidden;\n}\n\n/* Sidebar expand handle (only visible when sidebar is collapsed) */\n.sidebar-expand-handle {\n flex-shrink: 0;\n width: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n background: #092340;\n border-right: 1px solid rgba(255, 255, 255, 0.15);\n transition: background 0.15s ease;\n z-index: 10;\n}\n\n.sidebar-expand-handle:hover {\n background: #1a3a5c;\n}\n\n.sidebar-expand-handle i {\n color: rgba(255, 255, 255, 0.7);\n font-size: 11px;\n transition: color 0.15s ease;\n}\n\n.sidebar-expand-handle:hover i {\n color: white;\n}\n\n.sidebar-resize-handle {\n width: 4px;\n background: transparent;\n cursor: ew-resize;\n flex-shrink: 0;\n position: relative;\n transition: background-color 0.2s;\n}\n\n.sidebar-resize-handle:hover {\n background: #1e40af;\n}\n\n.sidebar-resize-handle:active {\n background: #1e3a8a;\n}\n\n.sidebar-resize-handle::before {\n content: '';\n position: absolute;\n left: -4px;\n right: -4px;\n top: 0;\n bottom: 0;\n cursor: ew-resize;\n}\n\n.workspace-main {\n flex: 1;\n display: flex;\n flex-direction: column;\n background-color: #FFF;\n overflow: hidden;\n min-height: 0;\n}\n\n.workspace-main > mj-conversation-chat-area {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n\n.workspace-artifact-panel {\n flex-shrink: 0;\n background-color: #FFF;\n overflow: hidden;\n min-width: 300px;\n max-width: 70%;\n}\n\n.artifact-panel-resize-handle {\n width: 4px;\n background-color: transparent;\n cursor: ew-resize;\n flex-shrink: 0;\n transition: background-color 0.2s;\n position: relative;\n z-index: 10;\n}\n\n/* Wider hit area for easier grabbing */\n.artifact-panel-resize-handle::before {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n left: -4px;\n right: -4px;\n cursor: ew-resize;\n}\n\n.artifact-panel-resize-handle:hover {\n background-color: #1e40af;\n}\n\n.artifact-panel-resize-handle:active {\n background-color: #1e3a8a;\n}\n\n/* Maximized artifact panel */\n.workspace-artifact-panel.maximized {\n width: 100% !important;\n max-width: 100%;\n}\n\n/* Compact layout */\n.conversation-workspace[data-layout=\"compact\"] .workspace-sidebar {\n width: 240px;\n}\n\n.conversation-workspace[data-layout=\"compact\"] .workspace-artifact-panel {\n width: 400px;\n}\n\n/* Embedded layout */\n.conversation-workspace[data-layout=\"embedded\"] {\n height: 100%;\n}\n\n.conversation-workspace[data-layout=\"embedded\"] .workspace-navigation {\n height: 48px;\n}\n\n/* Responsive */\n@media (max-width: 1024px) {\n .workspace-sidebar {\n position: absolute;\n left: 0;\n top: 60px;\n bottom: 0;\n z-index: 100;\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1);\n }\n\n .workspace-artifact-panel {\n position: fixed;\n right: 0;\n top: 60px;\n bottom: 0;\n z-index: 100;\n box-shadow: -2px 0 8px rgba(0, 0, 0, 0.1);\n }\n}\n\n/* Desktop sidebar toggle animation */\n@media (min-width: 769px) {\n .workspace-sidebar {\n transition: width 0.3s ease, min-width 0.3s ease;\n overflow: hidden;\n }\n\n .workspace-sidebar:not(.open) {\n width: 0 !important;\n min-width: 0;\n border-right: none;\n }\n\n .sidebar-resize-handle {\n transition: opacity 0.3s ease, width 0.3s ease;\n }\n\n .workspace-sidebar:not(.open) ~ .sidebar-resize-handle {\n opacity: 0;\n width: 0;\n pointer-events: none;\n }\n}\n\n/* Mobile adjustments: 481px - 768px */\n@media (max-width: 768px) {\n .workspace-sidebar {\n position: fixed;\n left: 0;\n top: 80px;\n z-index: 1000;\n width: 260px !important;\n height: calc(100vh - 80px);\n transform: translateX(-100%);\n transition: transform 0.3s ease;\n }\n\n .workspace-sidebar.open {\n transform: translateX(0);\n }\n\n .workspace-artifact-panel {\n position: fixed;\n width: 100%;\n left: 0;\n right: 0;\n top: 56px; /* 48px nav + 8px dark strip above blue border */\n bottom: 0;\n z-index: 1000;\n max-width: 100%;\n height: auto;\n }\n\n .sidebar-resize-handle,\n .artifact-panel-resize-handle,\n .sidebar-expand-handle {\n display: none;\n }\n\n /* Mobile sidebar backdrop */\n .mobile-sidebar-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.3s ease;\n z-index: 999;\n }\n\n .mobile-sidebar-backdrop.visible {\n opacity: 1;\n pointer-events: auto;\n }\n}\n\n/* Small Phone adjustments: <= 480px */\n@media (max-width: 480px) {\n .workspace-navigation {\n height: 48px;\n }\n\n .workspace-sidebar {\n width: 100%;\n }\n}\n\n/* Loading spinner (shown while initializing agents) */\n.workspace-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n width: 100%;\n background: #FFF;\n gap: 1rem;\n}\n\n.loading-spinner {\n font-size: 3rem;\n color: #0078d4;\n}\n\n.workspace-loading p {\n font-size: 1rem;\n color: #666;\n margin: 0;\n}"] }]
|
|
1033
1243
|
}], () => [{ type: i1.ConversationDataService }, { type: i2.ArtifactStateService }, { type: i3.CollectionStateService }, { type: i4.ArtifactPermissionService }, { type: i5.MentionAutocompleteService }, { type: i6.MJNotificationService }, { type: i7.ConversationStreamingService }, { type: i8.UICommandHandlerService }, { type: i0.ChangeDetectorRef }], { environmentId: [{
|
|
1034
1244
|
type: Input
|
|
1035
1245
|
}], initialConversationId: [{
|
|
@@ -1067,6 +1277,9 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
1067
1277
|
}], onWindowResize: [{
|
|
1068
1278
|
type: HostListener,
|
|
1069
1279
|
args: ['window:resize']
|
|
1280
|
+
}], onDocumentClick: [{
|
|
1281
|
+
type: HostListener,
|
|
1282
|
+
args: ['document:click', ['$event']]
|
|
1070
1283
|
}] }); })();
|
|
1071
1284
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ConversationWorkspaceComponent, { className: "ConversationWorkspaceComponent", filePath: "src/lib/components/workspace/conversation-workspace.component.ts", lineNumber: 39 }); })();
|
|
1072
1285
|
//# sourceMappingURL=conversation-workspace.component.js.map
|