@memberjunction/ng-conversations 2.113.2 → 2.115.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 +7 -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 +90 -33
- package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-empty-state.component.js +2 -2
- package/dist/lib/components/conversation/conversation-list.component.js +1 -1
- package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
- package/dist/lib/components/mention/mention-dropdown.component.js +31 -23
- package/dist/lib/components/mention/mention-dropdown.component.js.map +1 -1
- package/dist/lib/components/mention/mention-editor.component.d.ts +117 -0
- package/dist/lib/components/mention/mention-editor.component.d.ts.map +1 -0
- package/dist/lib/components/mention/mention-editor.component.js +550 -0
- package/dist/lib/components/mention/mention-editor.component.js.map +1 -0
- package/dist/lib/components/message/message-input-box.component.d.ts +19 -34
- package/dist/lib/components/message/message-input-box.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input-box.component.js +66 -176
- package/dist/lib/components/message/message-input-box.component.js.map +1 -1
- package/dist/lib/components/message/message-input.component.d.ts +7 -1
- package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input.component.js +124 -36
- package/dist/lib/components/message/message-input.component.js.map +1 -1
- package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-item.component.js +41 -3
- package/dist/lib/components/message/message-item.component.js.map +1 -1
- package/dist/lib/components/navigation/conversation-navigation.component.d.ts.map +1 -1
- package/dist/lib/components/navigation/conversation-navigation.component.js +3 -3
- package/dist/lib/components/navigation/conversation-navigation.component.js.map +1 -1
- package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -1
- package/dist/lib/components/tasks/tasks-dropdown.component.js +3 -3
- package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts +15 -1
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.js +203 -80
- package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
- package/dist/lib/conversations.module.d.ts +55 -54
- package/dist/lib/conversations.module.d.ts.map +1 -1
- package/dist/lib/conversations.module.js +4 -0
- package/dist/lib/conversations.module.js.map +1 -1
- package/dist/lib/services/mention-autocomplete.service.d.ts +8 -0
- package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -1
- package/dist/lib/services/mention-autocomplete.service.js +34 -3
- package/dist/lib/services/mention-autocomplete.service.js.map +1 -1
- package/dist/public-api.d.ts +1 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +14 -14
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
1
|
+
import { Component, Input, Output, EventEmitter, HostListener } from '@angular/core';
|
|
2
2
|
import { CompositeKey, KeyValuePair, Metadata } from '@memberjunction/core';
|
|
3
3
|
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
4
4
|
import { Subject, takeUntil } from 'rxjs';
|
|
@@ -8,81 +8,118 @@ import * as i1 from "../../services/conversation-state.service";
|
|
|
8
8
|
import * as i2 from "../../services/artifact-state.service";
|
|
9
9
|
import * as i3 from "../../services/collection-state.service";
|
|
10
10
|
import * as i4 from "../../services/artifact-permission.service";
|
|
11
|
-
import * as i5 from "
|
|
12
|
-
import * as i6 from "@
|
|
13
|
-
import * as i7 from "@
|
|
14
|
-
import * as i8 from "@
|
|
15
|
-
import * as i9 from "
|
|
16
|
-
import * as i10 from "../
|
|
17
|
-
import * as i11 from "../
|
|
18
|
-
import * as i12 from "../
|
|
19
|
-
import * as i13 from "../
|
|
20
|
-
import * as i14 from "../
|
|
21
|
-
import * as i15 from "../
|
|
22
|
-
import * as i16 from "../
|
|
23
|
-
import * as i17 from "
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
i0.ɵɵ
|
|
11
|
+
import * as i5 from "../../services/mention-autocomplete.service";
|
|
12
|
+
import * as i6 from "@memberjunction/ng-notifications";
|
|
13
|
+
import * as i7 from "@angular/common";
|
|
14
|
+
import * as i8 from "@progress/kendo-angular-dialog";
|
|
15
|
+
import * as i9 from "@memberjunction/ng-artifacts";
|
|
16
|
+
import * as i10 from "../task/tasks-full-view.component";
|
|
17
|
+
import * as i11 from "../artifact/artifact-share-modal.component";
|
|
18
|
+
import * as i12 from "../navigation/conversation-navigation.component";
|
|
19
|
+
import * as i13 from "../sidebar/conversation-sidebar.component";
|
|
20
|
+
import * as i14 from "../conversation/conversation-chat-area.component";
|
|
21
|
+
import * as i15 from "../collection/collections-full-view.component";
|
|
22
|
+
import * as i16 from "../search/search-panel.component";
|
|
23
|
+
import * as i17 from "../toast/toast.component";
|
|
24
|
+
import * as i18 from "../../directives/search-shortcut.directive";
|
|
25
|
+
function ConversationWorkspaceComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
26
|
+
i0.ɵɵelementStart(0, "div", 3)(1, "div", 7);
|
|
27
|
+
i0.ɵɵelement(2, "i", 8);
|
|
27
28
|
i0.ɵɵelementEnd();
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
i0.ɵɵ
|
|
31
|
-
i0.ɵɵadvance();
|
|
32
|
-
i0.ɵɵproperty("activeTab", ctx_r0.activeTab)("environmentId", ctx_r0.environmentId)("currentUser", ctx_r0.currentUser)("renamedConversationId", ctx_r0.renamedConversationId);
|
|
29
|
+
i0.ɵɵelementStart(3, "p");
|
|
30
|
+
i0.ɵɵtext(4, "Loading agents...");
|
|
31
|
+
i0.ɵɵelementEnd()();
|
|
33
32
|
} }
|
|
34
|
-
function
|
|
35
|
-
const
|
|
36
|
-
i0.ɵɵelementStart(0, "div",
|
|
37
|
-
i0.ɵɵlistener("
|
|
33
|
+
function ConversationWorkspaceComponent_Conditional_4_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
34
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
35
|
+
i0.ɵɵelementStart(0, "div", 13);
|
|
36
|
+
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
37
|
i0.ɵɵelementEnd();
|
|
39
38
|
} }
|
|
40
|
-
function
|
|
41
|
-
|
|
42
|
-
i0.ɵɵ
|
|
43
|
-
i0.ɵɵ
|
|
44
|
-
i0.ɵɵelementEnd()();
|
|
39
|
+
function ConversationWorkspaceComponent_Conditional_4_div_2_Template(rf, ctx) { if (rf & 1) {
|
|
40
|
+
i0.ɵɵelementStart(0, "div", 14);
|
|
41
|
+
i0.ɵɵelement(1, "mj-conversation-sidebar", 15);
|
|
42
|
+
i0.ɵɵelementEnd();
|
|
45
43
|
} if (rf & 2) {
|
|
46
|
-
const
|
|
44
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
45
|
+
i0.ɵɵstyleProp("width", ctx_r1.sidebarWidth, "px");
|
|
46
|
+
i0.ɵɵclassProp("open", ctx_r1.isSidebarVisible);
|
|
47
47
|
i0.ɵɵadvance();
|
|
48
|
-
i0.ɵɵproperty("environmentId",
|
|
48
|
+
i0.ɵɵproperty("activeTab", ctx_r1.activeTab)("environmentId", ctx_r1.environmentId)("currentUser", ctx_r1.currentUser)("renamedConversationId", ctx_r1.renamedConversationId);
|
|
49
|
+
} }
|
|
50
|
+
function ConversationWorkspaceComponent_Conditional_4_div_3_Template(rf, ctx) { if (rf & 1) {
|
|
51
|
+
const _r3 = i0.ɵɵgetCurrentView();
|
|
52
|
+
i0.ɵɵelementStart(0, "div", 16);
|
|
53
|
+
i0.ɵɵlistener("mousedown", function ConversationWorkspaceComponent_Conditional_4_div_3_Template_div_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onSidebarResizeStart($event)); });
|
|
54
|
+
i0.ɵɵelementEnd();
|
|
49
55
|
} }
|
|
50
|
-
function
|
|
56
|
+
function ConversationWorkspaceComponent_Conditional_4_div_4_Template(rf, ctx) { if (rf & 1) {
|
|
51
57
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
52
|
-
i0.ɵɵelementStart(0, "div",
|
|
53
|
-
i0.ɵɵlistener("
|
|
58
|
+
i0.ɵɵelementStart(0, "div", 17)(1, "mj-collections-full-view", 18);
|
|
59
|
+
i0.ɵɵlistener("collectionNavigated", function ConversationWorkspaceComponent_Conditional_4_div_4_Template_mj_collections_full_view_collectionNavigated_1_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onCollectionNavigated($event)); });
|
|
54
60
|
i0.ɵɵelementEnd()();
|
|
55
61
|
} if (rf & 2) {
|
|
56
|
-
const
|
|
62
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
57
63
|
i0.ɵɵadvance();
|
|
58
|
-
i0.ɵɵproperty("environmentId",
|
|
64
|
+
i0.ɵɵproperty("environmentId", ctx_r1.environmentId)("currentUser", ctx_r1.currentUser);
|
|
59
65
|
} }
|
|
60
|
-
function
|
|
66
|
+
function ConversationWorkspaceComponent_Conditional_4_div_5_Template(rf, ctx) { if (rf & 1) {
|
|
61
67
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
62
|
-
i0.ɵɵelementStart(0, "div",
|
|
63
|
-
i0.ɵɵlistener("
|
|
68
|
+
i0.ɵɵelementStart(0, "div", 17)(1, "mj-tasks-full-view", 19);
|
|
69
|
+
i0.ɵɵlistener("openEntityRecord", function ConversationWorkspaceComponent_Conditional_4_div_5_Template_mj_tasks_full_view_openEntityRecord_1_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onOpenEntityRecordFromTasks($event)); });
|
|
64
70
|
i0.ɵɵelementEnd()();
|
|
65
71
|
} if (rf & 2) {
|
|
66
|
-
const
|
|
72
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
67
73
|
i0.ɵɵadvance();
|
|
68
|
-
i0.ɵɵproperty("environmentId",
|
|
74
|
+
i0.ɵɵproperty("environmentId", ctx_r1.environmentId)("currentUser", ctx_r1.currentUser)("baseFilter", ctx_r1.tasksFilter)("activeTaskId", ctx_r1.activeTaskId);
|
|
69
75
|
} }
|
|
70
|
-
function
|
|
76
|
+
function ConversationWorkspaceComponent_Conditional_4_div_6_Template(rf, ctx) { if (rf & 1) {
|
|
71
77
|
const _r6 = i0.ɵɵgetCurrentView();
|
|
72
|
-
i0.ɵɵelementStart(0, "div",
|
|
73
|
-
i0.ɵɵlistener("
|
|
78
|
+
i0.ɵɵelementStart(0, "div", 17)(1, "mj-conversation-chat-area", 20);
|
|
79
|
+
i0.ɵɵlistener("conversationRenamed", function ConversationWorkspaceComponent_Conditional_4_div_6_Template_mj_conversation_chat_area_conversationRenamed_1_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onConversationRenamed($event)); })("openEntityRecord", function ConversationWorkspaceComponent_Conditional_4_div_6_Template_mj_conversation_chat_area_openEntityRecord_1_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onOpenEntityRecord($event)); })("taskClicked", function ConversationWorkspaceComponent_Conditional_4_div_6_Template_mj_conversation_chat_area_taskClicked_1_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onTaskClicked($event)); })("artifactLinkClicked", function ConversationWorkspaceComponent_Conditional_4_div_6_Template_mj_conversation_chat_area_artifactLinkClicked_1_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onArtifactLinkNavigation($event)); });
|
|
80
|
+
i0.ɵɵelementEnd()();
|
|
81
|
+
} if (rf & 2) {
|
|
82
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
83
|
+
i0.ɵɵadvance();
|
|
84
|
+
i0.ɵɵproperty("environmentId", ctx_r1.environmentId)("currentUser", ctx_r1.currentUser);
|
|
85
|
+
} }
|
|
86
|
+
function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
87
|
+
const _r7 = i0.ɵɵgetCurrentView();
|
|
88
|
+
i0.ɵɵelementStart(0, "div", 21);
|
|
89
|
+
i0.ɵɵlistener("mousedown", function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template_div_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onArtifactPanelResizeStart($event)); });
|
|
74
90
|
i0.ɵɵelementEnd();
|
|
75
|
-
i0.ɵɵelementStart(1, "div",
|
|
76
|
-
i0.ɵɵlistener("closed", function
|
|
91
|
+
i0.ɵɵelementStart(1, "div", 22)(2, "mj-artifact-viewer-panel", 23);
|
|
92
|
+
i0.ɵɵlistener("closed", function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template_mj_artifact_viewer_panel_closed_2_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.closeArtifactPanel()); })("navigateToLink", function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template_mj_artifact_viewer_panel_navigateToLink_2_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onArtifactLinkNavigation($event)); })("shareRequested", function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template_mj_artifact_viewer_panel_shareRequested_2_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onArtifactShareRequested($event)); });
|
|
77
93
|
i0.ɵɵelementEnd()();
|
|
78
94
|
} if (rf & 2) {
|
|
79
|
-
let
|
|
80
|
-
let
|
|
81
|
-
const
|
|
95
|
+
let tmp_6_0;
|
|
96
|
+
let tmp_9_0;
|
|
97
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
98
|
+
i0.ɵɵadvance();
|
|
99
|
+
i0.ɵɵstyleProp("width", ctx_r1.artifactPanelWidth, "%");
|
|
100
|
+
i0.ɵɵadvance();
|
|
101
|
+
i0.ɵɵproperty("artifactId", ctx_r1.activeArtifactId)("currentUser", ctx_r1.currentUser)("environmentId", ctx_r1.environmentId)("versionNumber", (tmp_6_0 = ctx_r1.activeVersionNumber) !== null && tmp_6_0 !== undefined ? tmp_6_0 : undefined)("showSaveToCollection", ctx_r1.activeTab !== "collections")("viewContext", ctx_r1.activeTab === "collections" ? "collection" : "conversation")("contextCollectionId", (tmp_9_0 = ctx_r1.collectionState.activeCollectionId) !== null && tmp_9_0 !== undefined ? tmp_9_0 : undefined)("canShare", ctx_r1.canShareActiveArtifact)("canEdit", ctx_r1.canEditActiveArtifact);
|
|
102
|
+
} }
|
|
103
|
+
function ConversationWorkspaceComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
104
|
+
i0.ɵɵelementStart(0, "div", 4);
|
|
105
|
+
i0.ɵɵtemplate(1, ConversationWorkspaceComponent_Conditional_4_Conditional_1_Template, 1, 0, "div", 9)(2, ConversationWorkspaceComponent_Conditional_4_div_2_Template, 2, 8, "div", 10)(3, ConversationWorkspaceComponent_Conditional_4_div_3_Template, 1, 0, "div", 11)(4, ConversationWorkspaceComponent_Conditional_4_div_4_Template, 2, 2, "div", 12)(5, ConversationWorkspaceComponent_Conditional_4_div_5_Template, 2, 4, "div", 12)(6, ConversationWorkspaceComponent_Conditional_4_div_6_Template, 2, 2, "div", 12)(7, ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template, 3, 11);
|
|
106
|
+
i0.ɵɵelementEnd();
|
|
107
|
+
} if (rf & 2) {
|
|
108
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
109
|
+
i0.ɵɵadvance();
|
|
110
|
+
i0.ɵɵconditional(ctx_r1.isMobileView && ctx_r1.isSidebarVisible && ctx_r1.activeTab !== "collections" && ctx_r1.activeTab !== "tasks" ? 1 : -1);
|
|
111
|
+
i0.ɵɵadvance();
|
|
112
|
+
i0.ɵɵproperty("ngIf", ctx_r1.activeTab !== "collections" && ctx_r1.activeTab !== "tasks");
|
|
113
|
+
i0.ɵɵadvance();
|
|
114
|
+
i0.ɵɵproperty("ngIf", ctx_r1.isSidebarVisible && ctx_r1.activeTab !== "collections" && ctx_r1.activeTab !== "tasks");
|
|
82
115
|
i0.ɵɵadvance();
|
|
83
|
-
i0.ɵɵ
|
|
116
|
+
i0.ɵɵproperty("ngIf", ctx_r1.activeTab === "collections");
|
|
84
117
|
i0.ɵɵadvance();
|
|
85
|
-
i0.ɵɵproperty("
|
|
118
|
+
i0.ɵɵproperty("ngIf", ctx_r1.activeTab === "tasks");
|
|
119
|
+
i0.ɵɵadvance();
|
|
120
|
+
i0.ɵɵproperty("ngIf", ctx_r1.activeTab !== "collections" && ctx_r1.activeTab !== "tasks");
|
|
121
|
+
i0.ɵɵadvance();
|
|
122
|
+
i0.ɵɵconditional(ctx_r1.isArtifactPanelOpen && ctx_r1.activeArtifactId ? 7 : -1);
|
|
86
123
|
} }
|
|
87
124
|
/**
|
|
88
125
|
* Top-level workspace component for conversations
|
|
@@ -94,6 +131,7 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
94
131
|
artifactState;
|
|
95
132
|
collectionState;
|
|
96
133
|
artifactPermissionService;
|
|
134
|
+
mentionAutocompleteService;
|
|
97
135
|
notificationService;
|
|
98
136
|
cdr;
|
|
99
137
|
environmentId;
|
|
@@ -150,10 +188,12 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
150
188
|
isSidebarVisible = true;
|
|
151
189
|
isArtifactPanelOpen = false;
|
|
152
190
|
isSearchPanelOpen = false;
|
|
191
|
+
isWorkspaceReady = false;
|
|
153
192
|
renamedConversationId = null;
|
|
154
193
|
activeArtifactId = null;
|
|
155
194
|
activeVersionNumber = null;
|
|
156
195
|
activeVersionId = null;
|
|
196
|
+
isMobileView = false;
|
|
157
197
|
// Artifact permissions
|
|
158
198
|
canShareActiveArtifact = false;
|
|
159
199
|
canEditActiveArtifact = false;
|
|
@@ -180,30 +220,48 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
180
220
|
ARTIFACT_PANEL_WIDTH_KEY = 'mj-artifact-panel-width';
|
|
181
221
|
// Task filter for conversation-specific filtering
|
|
182
222
|
tasksFilter = '1=1';
|
|
183
|
-
constructor(conversationState, artifactState, collectionState, artifactPermissionService, notificationService, cdr) {
|
|
223
|
+
constructor(conversationState, artifactState, collectionState, artifactPermissionService, mentionAutocompleteService, notificationService, cdr) {
|
|
184
224
|
super();
|
|
185
225
|
this.conversationState = conversationState;
|
|
186
226
|
this.artifactState = artifactState;
|
|
187
227
|
this.collectionState = collectionState;
|
|
188
228
|
this.artifactPermissionService = artifactPermissionService;
|
|
229
|
+
this.mentionAutocompleteService = mentionAutocompleteService;
|
|
189
230
|
this.notificationService = notificationService;
|
|
190
231
|
this.cdr = cdr;
|
|
191
232
|
}
|
|
192
233
|
async ngOnInit() {
|
|
234
|
+
// Check initial mobile state
|
|
235
|
+
this.checkMobileView();
|
|
193
236
|
// Load saved widths from localStorage
|
|
194
237
|
this.loadSidebarWidth();
|
|
195
238
|
this.loadArtifactPanelWidth();
|
|
196
239
|
// Setup resize listeners
|
|
197
240
|
window.addEventListener('mousemove', this.onResizeMove.bind(this));
|
|
198
241
|
window.addEventListener('mouseup', this.onResizeEnd.bind(this));
|
|
199
|
-
//
|
|
200
|
-
|
|
242
|
+
// Setup touch listeners for mobile
|
|
243
|
+
window.addEventListener('touchmove', this.onResizeTouchMove.bind(this));
|
|
244
|
+
window.addEventListener('touchend', this.onResizeTouchEnd.bind(this));
|
|
245
|
+
// CRITICAL: Initialize AI Engine FIRST before rendering any UI
|
|
246
|
+
// The isWorkspaceReady flag blocks all child components from rendering
|
|
247
|
+
// until agents are fully loaded and ready
|
|
201
248
|
try {
|
|
202
249
|
await AIEngineBase.Instance.Config(false);
|
|
203
250
|
console.log('✅ AI Engine initialized with', AIEngineBase.Instance.Agents?.length || 0, 'agents');
|
|
251
|
+
// Initialize mention autocomplete service immediately after AI engine
|
|
252
|
+
// This ensures the cache is built from the fully-loaded agent list
|
|
253
|
+
await this.mentionAutocompleteService.initialize(this.currentUser);
|
|
254
|
+
console.log('✅ Mention autocomplete initialized');
|
|
255
|
+
// Mark workspace as ready - this allows UI to render
|
|
256
|
+
this.isWorkspaceReady = true;
|
|
257
|
+
this.cdr.detectChanges();
|
|
258
|
+
console.log('✅ Workspace ready - UI can now render');
|
|
204
259
|
}
|
|
205
260
|
catch (error) {
|
|
206
261
|
console.error('❌ Failed to initialize AI Engine:', error);
|
|
262
|
+
// Still mark as ready so UI isn't blocked forever
|
|
263
|
+
this.isWorkspaceReady = true;
|
|
264
|
+
this.cdr.detectChanges();
|
|
207
265
|
}
|
|
208
266
|
// Subscribe to artifact panel state
|
|
209
267
|
this.artifactState.isPanelOpen$
|
|
@@ -323,6 +381,21 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
323
381
|
// Remove resize listeners
|
|
324
382
|
window.removeEventListener('mousemove', this.onResizeMove.bind(this));
|
|
325
383
|
window.removeEventListener('mouseup', this.onResizeEnd.bind(this));
|
|
384
|
+
window.removeEventListener('touchmove', this.onResizeTouchMove.bind(this));
|
|
385
|
+
window.removeEventListener('touchend', this.onResizeTouchEnd.bind(this));
|
|
386
|
+
}
|
|
387
|
+
onWindowResize() {
|
|
388
|
+
this.checkMobileView();
|
|
389
|
+
}
|
|
390
|
+
checkMobileView() {
|
|
391
|
+
const wasMobile = this.isMobileView;
|
|
392
|
+
this.isMobileView = window.innerWidth < 768;
|
|
393
|
+
if (this.isMobileView && !wasMobile) {
|
|
394
|
+
this.isSidebarVisible = false;
|
|
395
|
+
}
|
|
396
|
+
else if (!this.isMobileView && wasMobile) {
|
|
397
|
+
this.isSidebarVisible = true;
|
|
398
|
+
}
|
|
326
399
|
}
|
|
327
400
|
onTabChanged(tab) {
|
|
328
401
|
const wasOnDifferentTab = this.activeTab !== tab;
|
|
@@ -363,6 +436,11 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
363
436
|
toggleSidebar() {
|
|
364
437
|
this.isSidebarVisible = !this.isSidebarVisible;
|
|
365
438
|
}
|
|
439
|
+
closeSidebar() {
|
|
440
|
+
if (this.isMobileView && this.isSidebarVisible) {
|
|
441
|
+
this.isSidebarVisible = false;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
366
444
|
closeArtifactPanel() {
|
|
367
445
|
this.artifactState.closeArtifact();
|
|
368
446
|
}
|
|
@@ -375,6 +453,8 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
375
453
|
async onRefreshAgentCache() {
|
|
376
454
|
try {
|
|
377
455
|
await AIEngineBase.Instance.Config(true);
|
|
456
|
+
// Refresh the mention autocomplete service to pick up new agents
|
|
457
|
+
await this.mentionAutocompleteService.refresh(this.currentUser);
|
|
378
458
|
const agentCount = AIEngineBase.Instance.Agents?.length || 0;
|
|
379
459
|
this.notificationService.CreateSimpleNotification(`Agent cache refreshed (${agentCount} agents)`, 'success', 3000);
|
|
380
460
|
this.cdr.detectChanges();
|
|
@@ -500,6 +580,54 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
500
580
|
this.saveArtifactPanelWidth();
|
|
501
581
|
}
|
|
502
582
|
}
|
|
583
|
+
/**
|
|
584
|
+
* Touch event handlers for mobile resize support
|
|
585
|
+
*/
|
|
586
|
+
onSidebarResizeTouchStart(event) {
|
|
587
|
+
this.isSidebarResizing = true;
|
|
588
|
+
const touch = event.touches[0];
|
|
589
|
+
this.sidebarResizeStartX = touch.clientX;
|
|
590
|
+
this.sidebarResizeStartWidth = this.sidebarWidth;
|
|
591
|
+
event.preventDefault();
|
|
592
|
+
}
|
|
593
|
+
onArtifactPanelResizeTouchStart(event) {
|
|
594
|
+
this.isArtifactPanelResizing = true;
|
|
595
|
+
const touch = event.touches[0];
|
|
596
|
+
this.artifactPanelResizeStartX = touch.clientX;
|
|
597
|
+
this.artifactPanelResizeStartWidth = this.artifactPanelWidth;
|
|
598
|
+
event.preventDefault();
|
|
599
|
+
}
|
|
600
|
+
onResizeTouchMove(event) {
|
|
601
|
+
if (this.isSidebarResizing) {
|
|
602
|
+
const touch = event.touches[0];
|
|
603
|
+
const deltaX = touch.clientX - this.sidebarResizeStartX;
|
|
604
|
+
let newWidth = this.sidebarResizeStartWidth + deltaX;
|
|
605
|
+
newWidth = Math.max(200, Math.min(500, newWidth));
|
|
606
|
+
this.sidebarWidth = newWidth;
|
|
607
|
+
}
|
|
608
|
+
else if (this.isArtifactPanelResizing) {
|
|
609
|
+
const container = document.querySelector('.workspace-content');
|
|
610
|
+
if (!container)
|
|
611
|
+
return;
|
|
612
|
+
const touch = event.touches[0];
|
|
613
|
+
const containerWidth = container.offsetWidth;
|
|
614
|
+
const deltaX = touch.clientX - this.artifactPanelResizeStartX;
|
|
615
|
+
const deltaPercent = (deltaX / containerWidth) * -100;
|
|
616
|
+
let newWidth = this.artifactPanelResizeStartWidth + deltaPercent;
|
|
617
|
+
newWidth = Math.max(20, Math.min(70, newWidth));
|
|
618
|
+
this.artifactPanelWidth = newWidth;
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
onResizeTouchEnd(event) {
|
|
622
|
+
if (this.isSidebarResizing) {
|
|
623
|
+
this.isSidebarResizing = false;
|
|
624
|
+
this.saveSidebarWidth();
|
|
625
|
+
}
|
|
626
|
+
else if (this.isArtifactPanelResizing) {
|
|
627
|
+
this.isArtifactPanelResizing = false;
|
|
628
|
+
this.saveArtifactPanelWidth();
|
|
629
|
+
}
|
|
630
|
+
}
|
|
503
631
|
/**
|
|
504
632
|
* LocalStorage persistence methods
|
|
505
633
|
*/
|
|
@@ -705,49 +833,41 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
705
833
|
await this.loadArtifactPermissions(this.activeArtifactId);
|
|
706
834
|
}
|
|
707
835
|
}
|
|
708
|
-
static ɵfac = function ConversationWorkspaceComponent_Factory(t) { return new (t || ConversationWorkspaceComponent)(i0.ɵɵdirectiveInject(i1.ConversationStateService), i0.ɵɵdirectiveInject(i2.ArtifactStateService), i0.ɵɵdirectiveInject(i3.CollectionStateService), i0.ɵɵdirectiveInject(i4.ArtifactPermissionService), i0.ɵɵdirectiveInject(i5.MJNotificationService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
709
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ConversationWorkspaceComponent, selectors: [["mj-conversation-workspace"]],
|
|
836
|
+
static ɵfac = function ConversationWorkspaceComponent_Factory(t) { return new (t || ConversationWorkspaceComponent)(i0.ɵɵdirectiveInject(i1.ConversationStateService), i0.ɵɵdirectiveInject(i2.ArtifactStateService), i0.ɵɵdirectiveInject(i3.CollectionStateService), i0.ɵɵdirectiveInject(i4.ArtifactPermissionService), i0.ɵɵdirectiveInject(i5.MentionAutocompleteService), i0.ɵɵdirectiveInject(i6.MJNotificationService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
837
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ConversationWorkspaceComponent, selectors: [["mj-conversation-workspace"]], hostBindings: function ConversationWorkspaceComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
838
|
+
i0.ɵɵlistener("resize", function ConversationWorkspaceComponent_resize_HostBindingHandler() { return ctx.onWindowResize(); }, false, i0.ɵɵresolveWindow);
|
|
839
|
+
} }, 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", openEntityRecord: "openEntityRecord", navigationChanged: "navigationChanged", newConversationStarted: "newConversationStarted" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 8, vars: 11, consts: [["mjSearchShortcut", "", "kendoDialogContainer", "", 1, "conversation-workspace", 3, "searchTriggered"], [1, "workspace-navigation"], [3, "tabChanged", "sidebarToggled", "searchTriggered", "refreshTriggered", "activeTab", "environmentId"], [1, "workspace-loading"], [1, "workspace-content"], [3, "close", "resultSelected", "isOpen", "environmentId", "currentUser"], [3, "saved", "cancelled", "isOpen", "artifact", "currentUser"], [1, "loading-spinner"], [1, "fa-solid", "fa-spinner", "fa-spin"], [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, "mobile-sidebar-backdrop", "visible", 3, "click"], [1, "workspace-sidebar"], [3, "activeTab", "environmentId", "currentUser", "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", "environmentId", "currentUser"], [1, "artifact-panel-resize-handle", 3, "mousedown"], [1, "workspace-artifact-panel"], [3, "closed", "navigateToLink", "shareRequested", "artifactId", "currentUser", "environmentId", "versionNumber", "showSaveToCollection", "viewContext", "contextCollectionId", "canShare", "canEdit"]], template: function ConversationWorkspaceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
710
840
|
i0.ɵɵelementStart(0, "div", 0);
|
|
711
841
|
i0.ɵɵlistener("searchTriggered", function ConversationWorkspaceComponent_Template_div_searchTriggered_0_listener() { return ctx.openSearch(); });
|
|
712
842
|
i0.ɵɵelementStart(1, "div", 1)(2, "mj-conversation-navigation", 2);
|
|
713
843
|
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(); });
|
|
714
844
|
i0.ɵɵelementEnd()();
|
|
715
|
-
i0.ɵɵ
|
|
716
|
-
i0.ɵɵ
|
|
717
|
-
i0.ɵɵ
|
|
718
|
-
i0.ɵɵelementStart(10, "mj-search-panel", 7);
|
|
719
|
-
i0.ɵɵlistener("close", function ConversationWorkspaceComponent_Template_mj_search_panel_close_10_listener() { return ctx.closeSearch(); })("resultSelected", function ConversationWorkspaceComponent_Template_mj_search_panel_resultSelected_10_listener($event) { return ctx.handleSearchResult($event); });
|
|
845
|
+
i0.ɵɵtemplate(3, ConversationWorkspaceComponent_Conditional_3_Template, 5, 0, "div", 3)(4, ConversationWorkspaceComponent_Conditional_4_Template, 8, 7, "div", 4);
|
|
846
|
+
i0.ɵɵelementStart(5, "mj-search-panel", 5);
|
|
847
|
+
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); });
|
|
720
848
|
i0.ɵɵelementEnd();
|
|
721
|
-
i0.ɵɵelement(
|
|
722
|
-
i0.ɵɵelementStart(
|
|
723
|
-
i0.ɵɵlistener("saved", function
|
|
849
|
+
i0.ɵɵelement(6, "mj-toast");
|
|
850
|
+
i0.ɵɵelementStart(7, "mj-artifact-share-modal", 6);
|
|
851
|
+
i0.ɵɵlistener("saved", function ConversationWorkspaceComponent_Template_mj_artifact_share_modal_saved_7_listener() { return ctx.onArtifactShared(); })("cancelled", function ConversationWorkspaceComponent_Template_mj_artifact_share_modal_cancelled_7_listener() { return ctx.onArtifactShareModalClose(); });
|
|
724
852
|
i0.ɵɵelementEnd()();
|
|
725
853
|
} if (rf & 2) {
|
|
726
854
|
i0.ɵɵattribute("data-layout", ctx.layout);
|
|
727
855
|
i0.ɵɵadvance(2);
|
|
728
856
|
i0.ɵɵproperty("activeTab", ctx.activeTab)("environmentId", ctx.environmentId);
|
|
729
|
-
i0.ɵɵadvance(2);
|
|
730
|
-
i0.ɵɵproperty("ngIf", ctx.isSidebarVisible && ctx.activeTab !== "collections" && ctx.activeTab !== "tasks");
|
|
731
|
-
i0.ɵɵadvance();
|
|
732
|
-
i0.ɵɵproperty("ngIf", ctx.isSidebarVisible && ctx.activeTab !== "collections" && ctx.activeTab !== "tasks");
|
|
733
|
-
i0.ɵɵadvance();
|
|
734
|
-
i0.ɵɵproperty("ngIf", ctx.activeTab === "collections");
|
|
735
|
-
i0.ɵɵadvance();
|
|
736
|
-
i0.ɵɵproperty("ngIf", ctx.activeTab === "tasks");
|
|
737
857
|
i0.ɵɵadvance();
|
|
738
|
-
i0.ɵɵ
|
|
858
|
+
i0.ɵɵconditional(!ctx.isWorkspaceReady ? 3 : -1);
|
|
739
859
|
i0.ɵɵadvance();
|
|
740
|
-
i0.ɵɵconditional(ctx.
|
|
860
|
+
i0.ɵɵconditional(ctx.isWorkspaceReady ? 4 : -1);
|
|
741
861
|
i0.ɵɵadvance();
|
|
742
862
|
i0.ɵɵproperty("isOpen", ctx.isSearchPanelOpen)("environmentId", ctx.environmentId)("currentUser", ctx.currentUser);
|
|
743
863
|
i0.ɵɵadvance(2);
|
|
744
864
|
i0.ɵɵproperty("isOpen", ctx.isArtifactShareModalOpen)("artifact", ctx.artifactToShare)("currentUser", ctx.currentUser);
|
|
745
|
-
} }, dependencies: [
|
|
865
|
+
} }, dependencies: [i7.NgIf, i8.DialogContainerDirective, i9.ArtifactViewerPanelComponent, i10.TasksFullViewComponent, i11.ArtifactShareModalComponent, i12.ConversationNavigationComponent, i13.ConversationSidebarComponent, i14.ConversationChatAreaComponent, i15.CollectionsFullViewComponent, i16.SearchPanelComponent, i17.ToastComponent, i18.SearchShortcutDirective], styles: [".conversation-workspace[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: calc(100vh - 123px); \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.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: 48px;\n z-index: 1000;\n max-width: 100%;\n }\n\n .sidebar-resize-handle[_ngcontent-%COMP%], \n .artifact-panel-resize-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}"] });
|
|
746
866
|
}
|
|
747
867
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ConversationWorkspaceComponent, [{
|
|
748
868
|
type: Component,
|
|
749
|
-
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 (tabChanged)=\"onTabChanged($event)\"\n (sidebarToggled)=\"toggleSidebar()\"\n (searchTriggered)=\"openSearch()\"\n (refreshTriggered)=\"onRefreshAgentCache()\">\n </mj-conversation-navigation>\n </div>\n\n <div class=\"workspace-content\">\n <!-- Left Sidebar (hidden when Collections or Tasks view is active) -->\n <div class=\"workspace-sidebar\"
|
|
750
|
-
}], () => [{ type: i1.ConversationStateService }, { type: i2.ArtifactStateService }, { type: i3.CollectionStateService }, { type: i4.ArtifactPermissionService }, { type: i5.MJNotificationService }, { type: i0.ChangeDetectorRef }], { environmentId: [{
|
|
869
|
+
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 (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 <div class=\"loading-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </div>\n <p>Loading agents...</p>\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 [renamedConversationId]=\"renamedConversationId\">\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 (conversationRenamed)=\"onConversationRenamed($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (taskClicked)=\"onTaskClicked($event)\"\n (artifactLinkClicked)=\"onArtifactLinkNavigation($event)\">\n </mj-conversation-chat-area>\n </div>\n\n <!-- Right Artifact Panel -->\n @if (isArtifactPanelOpen && activeArtifactId) {\n <div class=\"artifact-panel-resize-handle\" (mousedown)=\"onArtifactPanelResizeStart($event)\"></div>\n <div class=\"workspace-artifact-panel\" [style.width.%]=\"artifactPanelWidth\">\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 (closed)=\"closeArtifactPanel()\"\n (navigateToLink)=\"onArtifactLinkNavigation($event)\"\n (shareRequested)=\"onArtifactShareRequested($event)\">\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: calc(100vh - 123px); /* Account for parent app header (~60px) */\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/* 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}"] }]
|
|
870
|
+
}], () => [{ type: i1.ConversationStateService }, { type: i2.ArtifactStateService }, { type: i3.CollectionStateService }, { type: i4.ArtifactPermissionService }, { type: i5.MentionAutocompleteService }, { type: i6.MJNotificationService }, { type: i0.ChangeDetectorRef }], { environmentId: [{
|
|
751
871
|
type: Input
|
|
752
872
|
}], initialConversationId: [{
|
|
753
873
|
type: Input
|
|
@@ -779,6 +899,9 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
779
899
|
type: Output
|
|
780
900
|
}], newConversationStarted: [{
|
|
781
901
|
type: Output
|
|
902
|
+
}], onWindowResize: [{
|
|
903
|
+
type: HostListener,
|
|
904
|
+
args: ['window:resize']
|
|
782
905
|
}] }); })();
|
|
783
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ConversationWorkspaceComponent, { className: "ConversationWorkspaceComponent", filePath: "src/lib/components/workspace/conversation-workspace.component.ts", lineNumber:
|
|
906
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ConversationWorkspaceComponent, { className: "ConversationWorkspaceComponent", filePath: "src/lib/components/workspace/conversation-workspace.component.ts", lineNumber: 36 }); })();
|
|
784
907
|
//# sourceMappingURL=conversation-workspace.component.js.map
|