@memberjunction/ng-explorer-core 6.2.0-edge.0 → 6.2.0-edge.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app-routing.module.d.ts +23 -1
- package/dist/app-routing.module.d.ts.map +1 -1
- package/dist/app-routing.module.js +50 -14
- package/dist/app-routing.module.js.map +1 -1
- package/dist/lib/command-palette/command-palette.component.d.ts +7 -1
- package/dist/lib/command-palette/command-palette.component.d.ts.map +1 -1
- package/dist/lib/command-palette/command-palette.component.js +28 -14
- package/dist/lib/command-palette/command-palette.component.js.map +1 -1
- package/dist/lib/conversation-feedback/conversation-feedback.d.ts +103 -13
- package/dist/lib/conversation-feedback/conversation-feedback.d.ts.map +1 -1
- package/dist/lib/conversation-feedback/conversation-feedback.js +219 -67
- package/dist/lib/conversation-feedback/conversation-feedback.js.map +1 -1
- package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.d.ts +64 -10
- package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.d.ts.map +1 -1
- package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js +172 -66
- package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js.map +1 -1
- package/dist/lib/generic/resource-container-component.d.ts +19 -5
- package/dist/lib/generic/resource-container-component.d.ts.map +1 -1
- package/dist/lib/generic/resource-container-component.js +43 -13
- package/dist/lib/generic/resource-container-component.js.map +1 -1
- package/dist/lib/guards/entities.guard.d.ts +4 -0
- package/dist/lib/guards/entities.guard.d.ts.map +1 -1
- package/dist/lib/guards/entities.guard.js +10 -2
- package/dist/lib/guards/entities.guard.js.map +1 -1
- package/dist/lib/identity-claims/claim-redeem.component.d.ts +4 -0
- package/dist/lib/identity-claims/claim-redeem.component.d.ts.map +1 -1
- package/dist/lib/identity-claims/claim-redeem.component.js +10 -2
- package/dist/lib/identity-claims/claim-redeem.component.js.map +1 -1
- package/dist/lib/oauth/oauth-callback.component.d.ts +4 -0
- package/dist/lib/oauth/oauth-callback.component.d.ts.map +1 -1
- package/dist/lib/oauth/oauth-callback.component.js +10 -2
- package/dist/lib/oauth/oauth-callback.component.js.map +1 -1
- package/dist/lib/profile/profile-dialog.component.d.ts.map +1 -1
- package/dist/lib/profile/profile-dialog.component.js +194 -191
- package/dist/lib/profile/profile-dialog.component.js.map +1 -1
- package/dist/lib/resource-wrappers/artifact-resource.component.d.ts +20 -2
- package/dist/lib/resource-wrappers/artifact-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/artifact-resource.component.js +33 -9
- package/dist/lib/resource-wrappers/artifact-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/chat-collections-resource.component.d.ts +80 -10
- package/dist/lib/resource-wrappers/chat-collections-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/chat-collections-resource.component.js +168 -56
- package/dist/lib/resource-wrappers/chat-collections-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts +186 -23
- package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/chat-conversations-resource.component.js +500 -177
- package/dist/lib/resource-wrappers/chat-conversations-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/chat-deeplink-params.d.ts +2 -0
- package/dist/lib/resource-wrappers/chat-deeplink-params.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/chat-deeplink-params.js +5 -1
- package/dist/lib/resource-wrappers/chat-deeplink-params.js.map +1 -1
- package/dist/lib/resource-wrappers/chat-search-routing.d.ts +25 -0
- package/dist/lib/resource-wrappers/chat-search-routing.d.ts.map +1 -0
- package/dist/lib/resource-wrappers/chat-search-routing.js +24 -0
- package/dist/lib/resource-wrappers/chat-search-routing.js.map +1 -0
- package/dist/lib/resource-wrappers/chat-tasks-resource.component.d.ts +14 -2
- package/dist/lib/resource-wrappers/chat-tasks-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/chat-tasks-resource.component.js +32 -8
- package/dist/lib/resource-wrappers/chat-tasks-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/dashboard-resource.component.d.ts +54 -8
- package/dist/lib/resource-wrappers/dashboard-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/dashboard-resource.component.js +138 -46
- package/dist/lib/resource-wrappers/dashboard-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/livekit-room-resource.component.d.ts +223 -30
- package/dist/lib/resource-wrappers/livekit-room-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/livekit-room-resource.component.js +438 -118
- package/dist/lib/resource-wrappers/livekit-room-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/search-results-resource.component.d.ts +7 -3
- package/dist/lib/resource-wrappers/search-results-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/search-results-resource.component.js +23 -15
- package/dist/lib/resource-wrappers/search-results-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/view-resource.component.d.ts +68 -10
- package/dist/lib/resource-wrappers/view-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/view-resource.component.js +178 -62
- package/dist/lib/resource-wrappers/view-resource.component.js.map +1 -1
- package/dist/lib/services/startup-validation.service.d.ts +4 -0
- package/dist/lib/services/startup-validation.service.d.ts.map +1 -1
- package/dist/lib/services/startup-validation.service.js +10 -2
- package/dist/lib/services/startup-validation.service.js.map +1 -1
- package/dist/lib/services/system-validation.service.d.ts +13 -1
- package/dist/lib/services/system-validation.service.d.ts.map +1 -1
- package/dist/lib/services/system-validation.service.js +29 -5
- package/dist/lib/services/system-validation.service.js.map +1 -1
- package/dist/lib/shell/components/dialogs/app-access-dialog.component.d.ts +54 -4
- package/dist/lib/shell/components/dialogs/app-access-dialog.component.d.ts.map +1 -1
- package/dist/lib/shell/components/dialogs/app-access-dialog.component.js +130 -40
- package/dist/lib/shell/components/dialogs/app-access-dialog.component.js.map +1 -1
- package/dist/lib/shell/components/header/app-nav.component.d.ts +29 -1
- package/dist/lib/shell/components/header/app-nav.component.d.ts.map +1 -1
- package/dist/lib/shell/components/header/app-nav.component.js +56 -12
- package/dist/lib/shell/components/header/app-nav.component.js.map +1 -1
- package/dist/lib/shell/components/header/app-switcher.component.d.ts +33 -5
- package/dist/lib/shell/components/header/app-switcher.component.d.ts.map +1 -1
- package/dist/lib/shell/components/header/app-switcher.component.js +85 -29
- package/dist/lib/shell/components/header/app-switcher.component.js.map +1 -1
- package/dist/lib/shell/components/record-open/record-origin-crumb.component.js +1 -1
- package/dist/lib/shell/components/record-open/record-origin-crumb.component.js.map +1 -1
- package/dist/lib/shell/components/tabs/component-cache-manager.d.ts +50 -6
- package/dist/lib/shell/components/tabs/component-cache-manager.d.ts.map +1 -1
- package/dist/lib/shell/components/tabs/component-cache-manager.js +95 -22
- package/dist/lib/shell/components/tabs/component-cache-manager.js.map +1 -1
- package/dist/lib/shell/components/tabs/tab-container.component.d.ts +91 -9
- package/dist/lib/shell/components/tabs/tab-container.component.d.ts.map +1 -1
- package/dist/lib/shell/components/tabs/tab-container.component.js +257 -101
- package/dist/lib/shell/components/tabs/tab-container.component.js.map +1 -1
- package/dist/lib/shell/loading-themes.d.ts +16 -12
- package/dist/lib/shell/loading-themes.d.ts.map +1 -1
- package/dist/lib/shell/loading-themes.js +145 -137
- package/dist/lib/shell/loading-themes.js.map +1 -1
- package/dist/lib/shell/readiness-beacon.d.ts +2 -0
- package/dist/lib/shell/readiness-beacon.d.ts.map +1 -1
- package/dist/lib/shell/readiness-beacon.js +5 -1
- package/dist/lib/shell/readiness-beacon.js.map +1 -1
- package/dist/lib/shell/services/about-dialog.service.d.ts +6 -0
- package/dist/lib/shell/services/about-dialog.service.d.ts.map +1 -1
- package/dist/lib/shell/services/about-dialog.service.js +16 -4
- package/dist/lib/shell/services/about-dialog.service.js.map +1 -1
- package/dist/lib/shell/services/profile-dialog.service.d.ts +6 -0
- package/dist/lib/shell/services/profile-dialog.service.d.ts.map +1 -1
- package/dist/lib/shell/services/profile-dialog.service.js +16 -4
- package/dist/lib/shell/services/profile-dialog.service.js.map +1 -1
- package/dist/lib/shell/services/user-sharing-center-dialog.service.d.ts +6 -0
- package/dist/lib/shell/services/user-sharing-center-dialog.service.d.ts.map +1 -1
- package/dist/lib/shell/services/user-sharing-center-dialog.service.js +15 -3
- package/dist/lib/shell/services/user-sharing-center-dialog.service.js.map +1 -1
- package/dist/lib/shell/shell.component.d.ts +262 -39
- package/dist/lib/shell/shell.component.d.ts.map +1 -1
- package/dist/lib/shell/shell.component.js +688 -292
- package/dist/lib/shell/shell.component.js.map +1 -1
- package/dist/lib/single-dashboard/Components/add-item/add-item.component.d.ts +64 -8
- package/dist/lib/single-dashboard/Components/add-item/add-item.component.d.ts.map +1 -1
- package/dist/lib/single-dashboard/Components/add-item/add-item.component.js +129 -37
- package/dist/lib/single-dashboard/Components/add-item/add-item.component.js.map +1 -1
- package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.d.ts +26 -2
- package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.d.ts.map +1 -1
- package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.js +48 -10
- package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.js.map +1 -1
- package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.d.ts +84 -6
- package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.d.ts.map +1 -1
- package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.js +133 -29
- package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.js.map +1 -1
- package/dist/lib/single-dashboard/single-dashboard.component.d.ts +173 -23
- package/dist/lib/single-dashboard/single-dashboard.component.d.ts.map +1 -1
- package/dist/lib/single-dashboard/single-dashboard.component.js +383 -109
- package/dist/lib/single-dashboard/single-dashboard.component.js.map +1 -1
- package/dist/lib/single-list-detail/single-list-detail.component.d.ts +383 -55
- package/dist/lib/single-list-detail/single-list-detail.component.d.ts.map +1 -1
- package/dist/lib/single-list-detail/single-list-detail.component.js +962 -326
- package/dist/lib/single-list-detail/single-list-detail.component.js.map +1 -1
- package/dist/lib/single-query/single-query.component.d.ts +22 -2
- package/dist/lib/single-query/single-query.component.d.ts.map +1 -1
- package/dist/lib/single-query/single-query.component.js +40 -10
- package/dist/lib/single-query/single-query.component.js.map +1 -1
- package/dist/lib/single-record/single-record.component.d.ts +41 -3
- package/dist/lib/single-record/single-record.component.d.ts.map +1 -1
- package/dist/lib/single-record/single-record.component.js +71 -11
- package/dist/lib/single-record/single-record.component.js.map +1 -1
- package/dist/lib/single-search-result/single-search-result.component.d.ts +23 -3
- package/dist/lib/single-search-result/single-search-result.component.d.ts.map +1 -1
- package/dist/lib/single-search-result/single-search-result.component.js +42 -12
- package/dist/lib/single-search-result/single-search-result.component.js.map +1 -1
- package/dist/lib/system-validation/system-validation-banner.component.d.ts +12 -2
- package/dist/lib/system-validation/system-validation-banner.component.d.ts.map +1 -1
- package/dist/lib/system-validation/system-validation-banner.component.js +25 -5
- package/dist/lib/system-validation/system-validation-banner.component.js.map +1 -1
- package/dist/lib/user-menu/user-menu.types.d.ts +4 -0
- package/dist/lib/user-menu/user-menu.types.d.ts.map +1 -1
- package/dist/lib/user-menu/user-menu.types.js +10 -2
- package/dist/lib/user-menu/user-menu.types.js.map +1 -1
- package/dist/lib/user-notifications/user-notifications.component.d.ts +59 -7
- package/dist/lib/user-notifications/user-notifications.component.d.ts.map +1 -1
- package/dist/lib/user-notifications/user-notifications.component.js +151 -47
- package/dist/lib/user-notifications/user-notifications.component.js.map +1 -1
- package/dist/lib/user-profile/user-profile.component.d.ts +3 -2
- package/dist/lib/user-profile/user-profile.component.d.ts.map +1 -1
- package/dist/lib/user-profile/user-profile.component.js +5 -4
- package/dist/lib/user-profile/user-profile.component.js.map +1 -1
- package/package.json +52 -52
|
@@ -8,7 +8,8 @@ import { Component, ViewEncapsulation, ViewChild, HostListener } from '@angular/
|
|
|
8
8
|
import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
|
|
9
9
|
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
10
10
|
import { MJEnvironmentEntityExtended, UserInfoEngine, ConversationEngine } from '@memberjunction/core-entities';
|
|
11
|
-
import {
|
|
11
|
+
import { ResolveDeepLinkParam } from './chat-deeplink-params.js';
|
|
12
|
+
import { ResolveChatSearchRoute } from './chat-search-routing.js';
|
|
12
13
|
import { MentionAutocompleteService } from '@memberjunction/ng-conversations';
|
|
13
14
|
import { AIEngineBase } from '@memberjunction/ai-engine-base';
|
|
14
15
|
import { takeUntil } from 'rxjs';
|
|
@@ -19,16 +20,16 @@ const _c0 = ["conversationList"];
|
|
|
19
20
|
const _c1 = ["chatArea"];
|
|
20
21
|
function ChatConversationsResource_Conditional_0_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
21
22
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
22
|
-
i0.ɵɵelementStart(0, "div",
|
|
23
|
+
i0.ɵɵelementStart(0, "div", 10);
|
|
23
24
|
i0.ɵɵlistener("click", function ChatConversationsResource_Conditional_0_Conditional_1_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.collapseSidebar()); });
|
|
24
25
|
i0.ɵɵelementEnd();
|
|
25
26
|
} }
|
|
26
27
|
function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
27
28
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
28
|
-
i0.ɵɵelementStart(0, "mj-conversation-list",
|
|
29
|
-
i0.ɵɵlistener("conversationSelected", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_conversationSelected_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onConversationSelected($event)); })("conversationDeleted", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_conversationDeleted_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onConversationDeleted($event)); })("newConversationRequested", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_newConversationRequested_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onNewConversationRequested()); })("pinSidebarRequested", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_pinSidebarRequested_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.pinSidebar()); })("unpinSidebarRequested", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_unpinSidebarRequested_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.unpinSidebar()); })("refreshRequested", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_refreshRequested_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onRefreshRequested()); });
|
|
29
|
+
i0.ɵɵelementStart(0, "mj-conversation-list", 12, 0);
|
|
30
|
+
i0.ɵɵlistener("conversationSelected", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_conversationSelected_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onConversationSelected($event)); })("conversationDeleted", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_conversationDeleted_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onConversationDeleted($event)); })("newConversationRequested", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_newConversationRequested_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onNewConversationRequested()); })("pinSidebarRequested", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_pinSidebarRequested_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.pinSidebar()); })("unpinSidebarRequested", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_unpinSidebarRequested_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.unpinSidebar()); })("refreshRequested", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_refreshRequested_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onRefreshRequested()); })("SearchEscalated", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_SearchEscalated_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OpenSearch($event)); });
|
|
30
31
|
i0.ɵɵelementEnd();
|
|
31
|
-
i0.ɵɵelementStart(2, "mj-conversation-routines-section",
|
|
32
|
+
i0.ɵɵelementStart(2, "mj-conversation-routines-section", 13);
|
|
32
33
|
i0.ɵɵlistener("openEntityRecord", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_routines_section_openEntityRecord_2_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onOpenEntityRecord($event)); })("openConversation", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_routines_section_openConversation_2_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onConversationSelected($event)); });
|
|
33
34
|
i0.ɵɵelementEnd();
|
|
34
35
|
} if (rf & 2) {
|
|
@@ -36,7 +37,7 @@ function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Tem
|
|
|
36
37
|
i0.ɵɵproperty("environmentId", ctx_r1.environmentId)("currentUser", ctx_r1.currentUser)("selectedConversationId", ctx_r1.selectedConversationId)("renamedConversationId", ctx_r1.renamedConversationId)("isSidebarPinned", ctx_r1.isSidebarPinned)("isMobileView", ctx_r1.isMobileView);
|
|
37
38
|
} }
|
|
38
39
|
function ChatConversationsResource_Conditional_0_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
39
|
-
i0.ɵɵelementStart(0, "div",
|
|
40
|
+
i0.ɵɵelementStart(0, "div", 11);
|
|
40
41
|
i0.ɵɵconditionalCreate(1, ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template, 3, 6);
|
|
41
42
|
i0.ɵɵelementEnd();
|
|
42
43
|
} if (rf & 2) {
|
|
@@ -48,13 +49,13 @@ function ChatConversationsResource_Conditional_0_Conditional_2_Template(rf, ctx)
|
|
|
48
49
|
} }
|
|
49
50
|
function ChatConversationsResource_Conditional_0_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
50
51
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
51
|
-
i0.ɵɵelementStart(0, "div",
|
|
52
|
+
i0.ɵɵelementStart(0, "div", 14);
|
|
52
53
|
i0.ɵɵlistener("mousedown", function ChatConversationsResource_Conditional_0_Conditional_3_Template_div_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onSidebarResizeStart($event)); });
|
|
53
54
|
i0.ɵɵelementEnd();
|
|
54
55
|
} }
|
|
55
56
|
function ChatConversationsResource_Conditional_0_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
56
57
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
57
|
-
i0.ɵɵelementStart(0, "mj-conversation-chat-area",
|
|
58
|
+
i0.ɵɵelementStart(0, "mj-conversation-chat-area", 15, 1);
|
|
58
59
|
i0.ɵɵlistener("sidebarToggleClicked", function ChatConversationsResource_Conditional_0_Conditional_5_Template_mj_conversation_chat_area_sidebarToggleClicked_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.expandSidebar()); })("conversationRenamed", function ChatConversationsResource_Conditional_0_Conditional_5_Template_mj_conversation_chat_area_conversationRenamed_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onConversationRenamed($event)); })("conversationCreated", function ChatConversationsResource_Conditional_0_Conditional_5_Template_mj_conversation_chat_area_conversationCreated_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onConversationCreated($event)); })("threadOpened", function ChatConversationsResource_Conditional_0_Conditional_5_Template_mj_conversation_chat_area_threadOpened_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onThreadOpened($event)); })("threadClosed", function ChatConversationsResource_Conditional_0_Conditional_5_Template_mj_conversation_chat_area_threadClosed_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onThreadClosed()); })("pendingArtifactConsumed", function ChatConversationsResource_Conditional_0_Conditional_5_Template_mj_conversation_chat_area_pendingArtifactConsumed_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onPendingArtifactConsumed()); })("pendingMessageConsumed", function ChatConversationsResource_Conditional_0_Conditional_5_Template_mj_conversation_chat_area_pendingMessageConsumed_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onPendingMessageConsumed()); })("pendingMessageRequested", function ChatConversationsResource_Conditional_0_Conditional_5_Template_mj_conversation_chat_area_pendingMessageRequested_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onPendingMessageRequested($event)); })("artifactLinkClicked", function ChatConversationsResource_Conditional_0_Conditional_5_Template_mj_conversation_chat_area_artifactLinkClicked_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onArtifactLinkClicked($event)); })("openEntityRecord", function ChatConversationsResource_Conditional_0_Conditional_5_Template_mj_conversation_chat_area_openEntityRecord_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onOpenEntityRecord($event)); })("navigationRequest", function ChatConversationsResource_Conditional_0_Conditional_5_Template_mj_conversation_chat_area_navigationRequest_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onNavigationRequest($event)); })("composerAgentMentionConsumed", function ChatConversationsResource_Conditional_0_Conditional_5_Template_mj_conversation_chat_area_composerAgentMentionConsumed_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onComposerAgentMentionConsumed()); });
|
|
59
60
|
i0.ɵɵelementEnd();
|
|
60
61
|
} if (rf & 2) {
|
|
@@ -63,11 +64,11 @@ function ChatConversationsResource_Conditional_0_Conditional_5_Template(rf, ctx)
|
|
|
63
64
|
} }
|
|
64
65
|
function ChatConversationsResource_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
65
66
|
i0.ɵɵelementStart(0, "div", 2);
|
|
66
|
-
i0.ɵɵconditionalCreate(1, ChatConversationsResource_Conditional_0_Conditional_1_Template, 1, 0, "div",
|
|
67
|
-
i0.ɵɵconditionalCreate(2, ChatConversationsResource_Conditional_0_Conditional_2_Template, 2, 7, "div",
|
|
68
|
-
i0.ɵɵconditionalCreate(3, ChatConversationsResource_Conditional_0_Conditional_3_Template, 1, 0, "div",
|
|
69
|
-
i0.ɵɵelementStart(4, "div",
|
|
70
|
-
i0.ɵɵconditionalCreate(5, ChatConversationsResource_Conditional_0_Conditional_5_Template, 2, 13, "mj-conversation-chat-area",
|
|
67
|
+
i0.ɵɵconditionalCreate(1, ChatConversationsResource_Conditional_0_Conditional_1_Template, 1, 0, "div", 5);
|
|
68
|
+
i0.ɵɵconditionalCreate(2, ChatConversationsResource_Conditional_0_Conditional_2_Template, 2, 7, "div", 6);
|
|
69
|
+
i0.ɵɵconditionalCreate(3, ChatConversationsResource_Conditional_0_Conditional_3_Template, 1, 0, "div", 7);
|
|
70
|
+
i0.ɵɵelementStart(4, "div", 8);
|
|
71
|
+
i0.ɵɵconditionalCreate(5, ChatConversationsResource_Conditional_0_Conditional_5_Template, 2, 13, "mj-conversation-chat-area", 9);
|
|
71
72
|
i0.ɵɵelementEnd()();
|
|
72
73
|
} if (rf & 2) {
|
|
73
74
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -82,9 +83,18 @@ function ChatConversationsResource_Conditional_0_Template(rf, ctx) { if (rf & 1)
|
|
|
82
83
|
} }
|
|
83
84
|
function ChatConversationsResource_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
84
85
|
i0.ɵɵelementStart(0, "div", 3);
|
|
85
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
86
|
+
i0.ɵɵelement(1, "mj-loading", 16);
|
|
86
87
|
i0.ɵɵelementEnd();
|
|
87
88
|
} }
|
|
89
|
+
function ChatConversationsResource_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
90
|
+
const _r6 = i0.ɵɵgetCurrentView();
|
|
91
|
+
i0.ɵɵelementStart(0, "mj-search-panel", 17);
|
|
92
|
+
i0.ɵɵlistener("close", function ChatConversationsResource_Conditional_2_Template_mj_search_panel_close_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseSearch()); })("ResultSelected", function ChatConversationsResource_Conditional_2_Template_mj_search_panel_ResultSelected_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnSearchResultSelected($event)); });
|
|
93
|
+
i0.ɵɵelementEnd();
|
|
94
|
+
} if (rf & 2) {
|
|
95
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
96
|
+
i0.ɵɵproperty("InitialQuery", ctx_r1.SearchSeedQuery)("IsOpen", ctx_r1.IsSearchPanelOpen)("EnvironmentId", ctx_r1.EnvironmentId)("CurrentUser", ctx_r1.CurrentUser);
|
|
97
|
+
} }
|
|
88
98
|
/**
|
|
89
99
|
* Chat Conversations Resource - wraps the conversation chat area for tab-based display
|
|
90
100
|
* Extends BaseResourceComponent to work with the resource type system
|
|
@@ -102,33 +112,169 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
|
|
|
102
112
|
activeTasksService;
|
|
103
113
|
uiCommandHandler;
|
|
104
114
|
bridge;
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
115
|
+
ConversationList;
|
|
116
|
+
/** @deprecated Use {@link ConversationList}. */
|
|
117
|
+
get conversationList() {
|
|
118
|
+
return this.ConversationList;
|
|
119
|
+
}
|
|
120
|
+
/** @deprecated Use {@link ConversationList}. */
|
|
121
|
+
set conversationList(value) {
|
|
122
|
+
this.ConversationList = value;
|
|
123
|
+
}
|
|
124
|
+
ChatArea;
|
|
125
|
+
/** @deprecated Use {@link ChatArea}. */
|
|
126
|
+
get chatArea() {
|
|
127
|
+
return this.ChatArea;
|
|
128
|
+
}
|
|
129
|
+
/** @deprecated Use {@link ChatArea}. */
|
|
130
|
+
set chatArea(value) {
|
|
131
|
+
this.ChatArea = value;
|
|
132
|
+
}
|
|
133
|
+
CurrentUser = null;
|
|
134
|
+
/** @deprecated Use {@link CurrentUser}. */
|
|
135
|
+
get currentUser() {
|
|
136
|
+
return this.CurrentUser;
|
|
137
|
+
}
|
|
138
|
+
/** @deprecated Use {@link CurrentUser}. */
|
|
139
|
+
set currentUser(value) {
|
|
140
|
+
this.CurrentUser = value;
|
|
141
|
+
}
|
|
108
142
|
skipUrlUpdate = true; // Skip URL updates during initialization
|
|
109
143
|
// Ready flag - blocks child rendering until AIEngine is initialized
|
|
110
|
-
|
|
144
|
+
IsReady = false;
|
|
145
|
+
/** @deprecated Use {@link IsReady}. */
|
|
146
|
+
get isReady() {
|
|
147
|
+
return this.IsReady;
|
|
148
|
+
}
|
|
149
|
+
/** @deprecated Use {@link IsReady}. */
|
|
150
|
+
set isReady(value) {
|
|
151
|
+
this.IsReady = value;
|
|
152
|
+
}
|
|
111
153
|
// LOCAL SELECTION STATE - each wrapper instance manages its own selection
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
154
|
+
SelectedConversationId = null;
|
|
155
|
+
/** @deprecated Use {@link SelectedConversationId}. */
|
|
156
|
+
get selectedConversationId() {
|
|
157
|
+
return this.SelectedConversationId;
|
|
158
|
+
}
|
|
159
|
+
/** @deprecated Use {@link SelectedConversationId}. */
|
|
160
|
+
set selectedConversationId(value) {
|
|
161
|
+
this.SelectedConversationId = value;
|
|
162
|
+
}
|
|
163
|
+
SelectedConversation = null;
|
|
164
|
+
/** @deprecated Use {@link SelectedConversation}. */
|
|
165
|
+
get selectedConversation() {
|
|
166
|
+
return this.SelectedConversation;
|
|
167
|
+
}
|
|
168
|
+
/** @deprecated Use {@link SelectedConversation}. */
|
|
169
|
+
set selectedConversation(value) {
|
|
170
|
+
this.SelectedConversation = value;
|
|
171
|
+
}
|
|
172
|
+
SelectedThreadId = null;
|
|
173
|
+
/** @deprecated Use {@link SelectedThreadId}. */
|
|
174
|
+
get selectedThreadId() {
|
|
175
|
+
return this.SelectedThreadId;
|
|
176
|
+
}
|
|
177
|
+
/** @deprecated Use {@link SelectedThreadId}. */
|
|
178
|
+
set selectedThreadId(value) {
|
|
179
|
+
this.SelectedThreadId = value;
|
|
180
|
+
}
|
|
181
|
+
IsNewUnsavedConversation = false;
|
|
182
|
+
/** @deprecated Use {@link IsNewUnsavedConversation}. */
|
|
183
|
+
get isNewUnsavedConversation() {
|
|
184
|
+
return this.IsNewUnsavedConversation;
|
|
185
|
+
}
|
|
186
|
+
/** @deprecated Use {@link IsNewUnsavedConversation}. */
|
|
187
|
+
set isNewUnsavedConversation(value) {
|
|
188
|
+
this.IsNewUnsavedConversation = value;
|
|
189
|
+
}
|
|
190
|
+
RenamedConversationId = null;
|
|
191
|
+
/** @deprecated Use {@link RenamedConversationId}. */
|
|
192
|
+
get renamedConversationId() {
|
|
193
|
+
return this.RenamedConversationId;
|
|
194
|
+
}
|
|
195
|
+
/** @deprecated Use {@link RenamedConversationId}. */
|
|
196
|
+
set renamedConversationId(value) {
|
|
197
|
+
this.RenamedConversationId = value;
|
|
198
|
+
}
|
|
199
|
+
IsSidebarCollapsed = false;
|
|
200
|
+
/** @deprecated Use {@link IsSidebarCollapsed}. */
|
|
201
|
+
get isSidebarCollapsed() {
|
|
202
|
+
return this.IsSidebarCollapsed;
|
|
203
|
+
}
|
|
204
|
+
/** @deprecated Use {@link IsSidebarCollapsed}. */
|
|
205
|
+
set isSidebarCollapsed(value) {
|
|
206
|
+
this.IsSidebarCollapsed = value;
|
|
207
|
+
}
|
|
208
|
+
IsSidebarPinned = true;
|
|
209
|
+
/** @deprecated Use {@link IsSidebarPinned}. */
|
|
210
|
+
get isSidebarPinned() {
|
|
211
|
+
return this.IsSidebarPinned;
|
|
212
|
+
}
|
|
213
|
+
/** @deprecated Use {@link IsSidebarPinned}. */
|
|
214
|
+
set isSidebarPinned(value) {
|
|
215
|
+
this.IsSidebarPinned = value;
|
|
216
|
+
} // Whether sidebar stays open after selection
|
|
217
|
+
IsMobileView = false;
|
|
218
|
+
/** @deprecated Use {@link IsMobileView}. */
|
|
219
|
+
get isMobileView() {
|
|
220
|
+
return this.IsMobileView;
|
|
221
|
+
}
|
|
222
|
+
/** @deprecated Use {@link IsMobileView}. */
|
|
223
|
+
set isMobileView(value) {
|
|
224
|
+
this.IsMobileView = value;
|
|
225
|
+
}
|
|
226
|
+
SidebarTransitionsEnabled = false;
|
|
227
|
+
/** @deprecated Use {@link SidebarTransitionsEnabled}. */
|
|
228
|
+
get sidebarTransitionsEnabled() {
|
|
229
|
+
return this.SidebarTransitionsEnabled;
|
|
230
|
+
}
|
|
231
|
+
/** @deprecated Use {@link SidebarTransitionsEnabled}. */
|
|
232
|
+
set sidebarTransitionsEnabled(value) {
|
|
233
|
+
this.SidebarTransitionsEnabled = value;
|
|
234
|
+
} // Disabled during initial load to prevent jarring animation
|
|
235
|
+
IsSidebarSettingsLoaded = false;
|
|
236
|
+
/** @deprecated Use {@link IsSidebarSettingsLoaded}. */
|
|
237
|
+
get isSidebarSettingsLoaded() {
|
|
238
|
+
return this.IsSidebarSettingsLoaded;
|
|
239
|
+
}
|
|
240
|
+
/** @deprecated Use {@link IsSidebarSettingsLoaded}. */
|
|
241
|
+
set isSidebarSettingsLoaded(value) {
|
|
242
|
+
this.IsSidebarSettingsLoaded = value;
|
|
243
|
+
} // Prevents UI flash while loading settings
|
|
122
244
|
// Sidebar resize state
|
|
123
|
-
|
|
245
|
+
SidebarWidth = 300;
|
|
246
|
+
/** @deprecated Use {@link SidebarWidth}. */
|
|
247
|
+
get sidebarWidth() {
|
|
248
|
+
return this.SidebarWidth;
|
|
249
|
+
}
|
|
250
|
+
/** @deprecated Use {@link SidebarWidth}. */
|
|
251
|
+
set sidebarWidth(value) {
|
|
252
|
+
this.SidebarWidth = value;
|
|
253
|
+
} // Default width in pixels
|
|
124
254
|
isSidebarResizing = false;
|
|
125
255
|
sidebarResizeStartX = 0;
|
|
126
256
|
sidebarResizeStartWidth = 0;
|
|
127
257
|
SIDEBAR_MIN_WIDTH = 200;
|
|
128
258
|
SIDEBAR_MAX_WIDTH = 500;
|
|
129
259
|
// Pending navigation state
|
|
130
|
-
|
|
131
|
-
|
|
260
|
+
PendingArtifactId = null;
|
|
261
|
+
/** @deprecated Use {@link PendingArtifactId}. */
|
|
262
|
+
get pendingArtifactId() {
|
|
263
|
+
return this.PendingArtifactId;
|
|
264
|
+
}
|
|
265
|
+
/** @deprecated Use {@link PendingArtifactId}. */
|
|
266
|
+
set pendingArtifactId(value) {
|
|
267
|
+
this.PendingArtifactId = value;
|
|
268
|
+
}
|
|
269
|
+
PendingArtifactConversationId = null;
|
|
270
|
+
/** @deprecated Use {@link PendingArtifactConversationId}. */
|
|
271
|
+
get pendingArtifactConversationId() {
|
|
272
|
+
return this.PendingArtifactConversationId;
|
|
273
|
+
}
|
|
274
|
+
/** @deprecated Use {@link PendingArtifactConversationId}. */
|
|
275
|
+
set pendingArtifactConversationId(value) {
|
|
276
|
+
this.PendingArtifactConversationId = value;
|
|
277
|
+
}
|
|
132
278
|
/**
|
|
133
279
|
* A pending request to open the REALTIME SESSION REVIEW overlay (deep link /
|
|
134
280
|
* cross-resource nav with `realtimeSessionId`, e.g. the AI Agent Session form's
|
|
@@ -137,10 +283,42 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
|
|
|
137
283
|
* `await chatArea.OpenRealtimeSessionReview(agentSessionId)` (a NEW session starts
|
|
138
284
|
* through the composer's phone button / `RealtimeSessionService.StartRealtimeSession`).
|
|
139
285
|
*/
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
286
|
+
PendingRealtimeSessionId = null;
|
|
287
|
+
/** @deprecated Use {@link PendingRealtimeSessionId}. */
|
|
288
|
+
get pendingRealtimeSessionId() {
|
|
289
|
+
return this.PendingRealtimeSessionId;
|
|
290
|
+
}
|
|
291
|
+
/** @deprecated Use {@link PendingRealtimeSessionId}. */
|
|
292
|
+
set pendingRealtimeSessionId(value) {
|
|
293
|
+
this.PendingRealtimeSessionId = value;
|
|
294
|
+
}
|
|
295
|
+
PendingArtifactVersionNumber = null;
|
|
296
|
+
/** @deprecated Use {@link PendingArtifactVersionNumber}. */
|
|
297
|
+
get pendingArtifactVersionNumber() {
|
|
298
|
+
return this.PendingArtifactVersionNumber;
|
|
299
|
+
}
|
|
300
|
+
/** @deprecated Use {@link PendingArtifactVersionNumber}. */
|
|
301
|
+
set pendingArtifactVersionNumber(value) {
|
|
302
|
+
this.PendingArtifactVersionNumber = value;
|
|
303
|
+
}
|
|
304
|
+
PendingMessageToSend = null;
|
|
305
|
+
/** @deprecated Use {@link PendingMessageToSend}. */
|
|
306
|
+
get pendingMessageToSend() {
|
|
307
|
+
return this.PendingMessageToSend;
|
|
308
|
+
}
|
|
309
|
+
/** @deprecated Use {@link PendingMessageToSend}. */
|
|
310
|
+
set pendingMessageToSend(value) {
|
|
311
|
+
this.PendingMessageToSend = value;
|
|
312
|
+
}
|
|
313
|
+
PendingAttachmentsToSend = null;
|
|
314
|
+
/** @deprecated Use {@link PendingAttachmentsToSend}. */
|
|
315
|
+
get pendingAttachmentsToSend() {
|
|
316
|
+
return this.PendingAttachmentsToSend;
|
|
317
|
+
}
|
|
318
|
+
/** @deprecated Use {@link PendingAttachmentsToSend}. */
|
|
319
|
+
set pendingAttachmentsToSend(value) {
|
|
320
|
+
this.PendingAttachmentsToSend = value;
|
|
321
|
+
}
|
|
144
322
|
// User Settings persistence
|
|
145
323
|
USER_SETTING_SIDEBAR_KEY = 'Conversations.SidebarState';
|
|
146
324
|
saveSettingsTimeout = null;
|
|
@@ -158,15 +336,15 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
|
|
|
158
336
|
async ngOnInit() {
|
|
159
337
|
super.ngOnInit();
|
|
160
338
|
const md = this.ProviderToUse;
|
|
161
|
-
this.
|
|
339
|
+
this.CurrentUser = md.CurrentUser;
|
|
162
340
|
// Check initial mobile state and set default collapsed
|
|
163
341
|
this.checkMobileView();
|
|
164
|
-
if (this.
|
|
165
|
-
this.
|
|
166
|
-
this.
|
|
342
|
+
if (this.IsMobileView) {
|
|
343
|
+
this.IsSidebarCollapsed = true;
|
|
344
|
+
this.IsSidebarSettingsLoaded = true; // Mobile uses defaults, no need to load from server
|
|
167
345
|
// Enable transitions after a brief delay to ensure initial state is applied
|
|
168
346
|
setTimeout(() => {
|
|
169
|
-
this.
|
|
347
|
+
this.SidebarTransitionsEnabled = true;
|
|
170
348
|
}, 50);
|
|
171
349
|
}
|
|
172
350
|
else {
|
|
@@ -175,7 +353,7 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
|
|
|
175
353
|
this.cdr.detectChanges();
|
|
176
354
|
// Enable transitions after state is loaded and applied
|
|
177
355
|
setTimeout(() => {
|
|
178
|
-
this.
|
|
356
|
+
this.SidebarTransitionsEnabled = true;
|
|
179
357
|
}, 50);
|
|
180
358
|
});
|
|
181
359
|
}
|
|
@@ -234,19 +412,19 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
|
|
|
234
412
|
// Initialize AIEngine, conversations, and mention service in parallel
|
|
235
413
|
await Promise.all([
|
|
236
414
|
AIEngineBase.Instance.Config(false),
|
|
237
|
-
this.engine.LoadConversations(this.
|
|
238
|
-
this.mentionAutocompleteService.initialize(this.
|
|
415
|
+
this.engine.LoadConversations(this.EnvironmentId, this.CurrentUser, false),
|
|
416
|
+
this.mentionAutocompleteService.initialize(this.CurrentUser)
|
|
239
417
|
]);
|
|
240
418
|
// Restore active tasks AFTER conversations are cached (uses in-memory lookup)
|
|
241
|
-
await this.activeTasksService.restoreFromDatabase(this.
|
|
419
|
+
await this.activeTasksService.restoreFromDatabase(this.CurrentUser);
|
|
242
420
|
// Mark as ready - child components can now render
|
|
243
|
-
this.
|
|
421
|
+
this.IsReady = true;
|
|
244
422
|
this.cdr.detectChanges();
|
|
245
423
|
}
|
|
246
424
|
catch (error) {
|
|
247
425
|
console.error('Failed to initialize AI engines:', error);
|
|
248
426
|
// Still mark as ready so UI isn't blocked forever
|
|
249
|
-
this.
|
|
427
|
+
this.IsReady = true;
|
|
250
428
|
this.cdr.detectChanges();
|
|
251
429
|
}
|
|
252
430
|
}
|
|
@@ -260,7 +438,7 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
|
|
|
260
438
|
// Try to get from cache first
|
|
261
439
|
const conversation = this.engine.GetConversation(conversationId);
|
|
262
440
|
if (conversation) {
|
|
263
|
-
this.
|
|
441
|
+
this.SelectedConversation = conversation;
|
|
264
442
|
this.updateTabTitle();
|
|
265
443
|
}
|
|
266
444
|
// If not in cache, the chat area component will handle loading it
|
|
@@ -298,18 +476,26 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
|
|
|
298
476
|
}
|
|
299
477
|
console.log(`[Omnibar→Chat] wrapper: agent param '${agentName}' (req=${requestNonce ?? 'none'}) received — staging composer pre-address`);
|
|
300
478
|
this.lastAppliedAgentParamKey = requestKey;
|
|
301
|
-
this.
|
|
302
|
-
this.
|
|
303
|
-
this.
|
|
479
|
+
this.IsNewUnsavedConversation = true;
|
|
480
|
+
this.SelectedConversationId = null;
|
|
481
|
+
this.SelectedConversation = null;
|
|
304
482
|
// Resolved mention PILL (composerAgentMention) — matching the UX of typing
|
|
305
483
|
// '@agent' and picking from the dropdown; pendingMessage would AUTO-SEND.
|
|
306
|
-
this.
|
|
484
|
+
this.PendingComposerAgentMention = agentName;
|
|
307
485
|
this.cdr.detectChanges();
|
|
308
486
|
}
|
|
309
|
-
|
|
487
|
+
PendingComposerAgentMention = null;
|
|
488
|
+
/** @deprecated Use {@link PendingComposerAgentMention}. */
|
|
489
|
+
get pendingComposerAgentMention() {
|
|
490
|
+
return this.PendingComposerAgentMention;
|
|
491
|
+
}
|
|
492
|
+
/** @deprecated Use {@link PendingComposerAgentMention}. */
|
|
493
|
+
set pendingComposerAgentMention(value) {
|
|
494
|
+
this.PendingComposerAgentMention = value;
|
|
495
|
+
}
|
|
310
496
|
lastAppliedAgentParamKey = null;
|
|
311
|
-
|
|
312
|
-
this.
|
|
497
|
+
OnComposerAgentMentionConsumed() {
|
|
498
|
+
this.PendingComposerAgentMention = null;
|
|
313
499
|
// Consume-and-clear: drop the agent params from the tab/URL so boots and
|
|
314
500
|
// back/forward can't re-stage the pill. lastAppliedAgentParamKey is
|
|
315
501
|
// intentionally NOT reset — a fresh omnibar re-tag (even of the same agent)
|
|
@@ -318,6 +504,10 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
|
|
|
318
504
|
console.log(`[Omnibar→Chat] wrapper: pill applied — clearing agent param from URL`);
|
|
319
505
|
this.clearAgentParamDeferred();
|
|
320
506
|
}
|
|
507
|
+
/** @deprecated Use {@link OnComposerAgentMentionConsumed}. */
|
|
508
|
+
onComposerAgentMentionConsumed() {
|
|
509
|
+
return this.OnComposerAgentMentionConsumed();
|
|
510
|
+
}
|
|
321
511
|
/**
|
|
322
512
|
* Clears the agent pre-address params OUTSIDE any OnQueryParamsChanged delivery:
|
|
323
513
|
* UpdateQueryParams is suppressed synchronously during delivery, so an inline
|
|
@@ -334,44 +524,44 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
|
|
|
334
524
|
const qp = config['queryParams'];
|
|
335
525
|
this.applyAgentParam(qp?.['agent'], qp?.['agentReq']);
|
|
336
526
|
const search = typeof window !== 'undefined' ? window.location.search : '';
|
|
337
|
-
const conversationId =
|
|
338
|
-
const artifactId =
|
|
527
|
+
const conversationId = ResolveDeepLinkParam('conversationId', search, qp, config.conversationId);
|
|
528
|
+
const artifactId = ResolveDeepLinkParam('artifactId', search, qp, config.artifactId);
|
|
339
529
|
// Resolved the same URL-first way as artifactId above: pairing a URL artifact with the
|
|
340
530
|
// previous visit's version number would open the wrong version of the right artifact.
|
|
341
|
-
const rawVersion =
|
|
531
|
+
const rawVersion = ResolveDeepLinkParam('versionNumber', search, qp, config.versionNumber != null ? String(config.versionNumber) : undefined);
|
|
342
532
|
const versionNumber = rawVersion ? parseInt(rawVersion, 10) : null;
|
|
343
533
|
// Set pending artifact if provided
|
|
344
534
|
if (artifactId) {
|
|
345
|
-
this.
|
|
346
|
-
this.
|
|
347
|
-
this.
|
|
535
|
+
this.PendingArtifactId = artifactId;
|
|
536
|
+
this.PendingArtifactConversationId = conversationId || null;
|
|
537
|
+
this.PendingArtifactVersionNumber = versionNumber;
|
|
348
538
|
}
|
|
349
539
|
// Set conversationId synchronously so child components see it immediately
|
|
350
540
|
if (conversationId) {
|
|
351
|
-
this.
|
|
541
|
+
this.SelectedConversationId = conversationId;
|
|
352
542
|
this.bridge.SetActiveFromWorkspace(conversationId);
|
|
353
|
-
this.
|
|
543
|
+
this.IsNewUnsavedConversation = false;
|
|
354
544
|
// Load entity asynchronously
|
|
355
545
|
this.loadConversationEntity(conversationId);
|
|
356
546
|
}
|
|
357
547
|
const realtimeSessionId = qp?.['realtimeSessionId'] || config['realtimeSessionId'];
|
|
358
548
|
if (realtimeSessionId) {
|
|
359
|
-
this.
|
|
549
|
+
this.PendingRealtimeSessionId = realtimeSessionId;
|
|
360
550
|
this.applyPendingRealtimeSessionReview();
|
|
361
551
|
}
|
|
362
552
|
}
|
|
363
553
|
/** Opens the pending realtime session review once the chat area exists (retries next tick while it renders). */
|
|
364
554
|
applyPendingRealtimeSessionReview() {
|
|
365
|
-
const sessionId = this.
|
|
555
|
+
const sessionId = this.PendingRealtimeSessionId;
|
|
366
556
|
if (!sessionId) {
|
|
367
557
|
return;
|
|
368
558
|
}
|
|
369
|
-
if (!this.
|
|
559
|
+
if (!this.ChatArea) {
|
|
370
560
|
setTimeout(() => this.applyPendingRealtimeSessionReview(), 50);
|
|
371
561
|
return;
|
|
372
562
|
}
|
|
373
|
-
this.
|
|
374
|
-
void this.
|
|
563
|
+
this.PendingRealtimeSessionId = null;
|
|
564
|
+
void this.ChatArea.OpenRealtimeSessionReview(sessionId).then((opened) => {
|
|
375
565
|
if (!opened) {
|
|
376
566
|
console.warn(`Chat: could not open realtime session review for '${sessionId}'`);
|
|
377
567
|
}
|
|
@@ -388,17 +578,17 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
|
|
|
388
578
|
this.applyAgentParam(params['agent'], params['agentReq']);
|
|
389
579
|
const realtimeSessionId = params['realtimeSessionId'] || null;
|
|
390
580
|
if (realtimeSessionId) {
|
|
391
|
-
this.
|
|
581
|
+
this.PendingRealtimeSessionId = realtimeSessionId;
|
|
392
582
|
this.applyPendingRealtimeSessionReview();
|
|
393
583
|
}
|
|
394
584
|
const conversationId = params['conversationId'] || null;
|
|
395
585
|
const artifactId = params['artifactId'] || null;
|
|
396
586
|
const versionNumber = params['versionNumber'] ? parseInt(params['versionNumber'], 10) : null;
|
|
397
587
|
// Reflect any artifact intent so the chat area can open it.
|
|
398
|
-
this.
|
|
399
|
-
this.
|
|
400
|
-
this.
|
|
401
|
-
if (conversationId && conversationId !== this.
|
|
588
|
+
this.PendingArtifactId = artifactId;
|
|
589
|
+
this.PendingArtifactConversationId = artifactId ? conversationId : null;
|
|
590
|
+
this.PendingArtifactVersionNumber = versionNumber;
|
|
591
|
+
if (conversationId && conversationId !== this.SelectedConversationId) {
|
|
402
592
|
// The URL is already the source of truth here — suppress the echo back to it.
|
|
403
593
|
// selectConversation()'s body is synchronous up to its URL-update check, so
|
|
404
594
|
// toggling the flag around the call reliably gates that check.
|
|
@@ -417,19 +607,19 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
|
|
|
417
607
|
* Select a conversation by ID - loads the entity and updates local state
|
|
418
608
|
*/
|
|
419
609
|
async selectConversation(conversationId) {
|
|
420
|
-
this.
|
|
421
|
-
this.
|
|
610
|
+
this.SelectedConversationId = conversationId;
|
|
611
|
+
this.IsNewUnsavedConversation = false;
|
|
422
612
|
// Keep bridge in sync so other consumers (toast suppression, overlay) know
|
|
423
613
|
// which conversation the workspace is viewing
|
|
424
614
|
this.bridge.SetActiveFromWorkspace(conversationId);
|
|
425
615
|
// Load the conversation entity from data service
|
|
426
616
|
const conversation = this.engine.GetConversation(conversationId);
|
|
427
617
|
if (conversation) {
|
|
428
|
-
this.
|
|
618
|
+
this.SelectedConversation = conversation;
|
|
429
619
|
}
|
|
430
620
|
else {
|
|
431
621
|
// Conversation might not be loaded yet - the chat area will handle loading
|
|
432
|
-
this.
|
|
622
|
+
this.SelectedConversation = null;
|
|
433
623
|
}
|
|
434
624
|
// Update URL if not skipping
|
|
435
625
|
if (!this.skipUrlUpdate) {
|
|
@@ -443,17 +633,17 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
|
|
|
443
633
|
updateUrl() {
|
|
444
634
|
const queryParams = {};
|
|
445
635
|
// Add conversation ID
|
|
446
|
-
if (this.
|
|
447
|
-
queryParams['conversationId'] = this.
|
|
636
|
+
if (this.SelectedConversationId) {
|
|
637
|
+
queryParams['conversationId'] = this.SelectedConversationId;
|
|
448
638
|
}
|
|
449
639
|
else {
|
|
450
640
|
queryParams['conversationId'] = null;
|
|
451
641
|
}
|
|
452
642
|
// Add artifact ID if we have a pending artifact (will be cleared once opened)
|
|
453
|
-
if (this.
|
|
454
|
-
queryParams['artifactId'] = this.
|
|
455
|
-
if (this.
|
|
456
|
-
queryParams['versionNumber'] = this.
|
|
643
|
+
if (this.PendingArtifactId) {
|
|
644
|
+
queryParams['artifactId'] = this.PendingArtifactId;
|
|
645
|
+
if (this.PendingArtifactVersionNumber) {
|
|
646
|
+
queryParams['versionNumber'] = this.PendingArtifactVersionNumber.toString();
|
|
457
647
|
}
|
|
458
648
|
}
|
|
459
649
|
else {
|
|
@@ -473,11 +663,11 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
|
|
|
473
663
|
* Update the tab/browser title based on the currently selected conversation.
|
|
474
664
|
*/
|
|
475
665
|
updateTabTitle() {
|
|
476
|
-
if (this.
|
|
666
|
+
if (this.IsNewUnsavedConversation || !this.SelectedConversation) {
|
|
477
667
|
this.NotifyDisplayNameChanged('Conversations');
|
|
478
668
|
return;
|
|
479
669
|
}
|
|
480
|
-
const name = this.
|
|
670
|
+
const name = this.SelectedConversation.Name;
|
|
481
671
|
if (name) {
|
|
482
672
|
this.NotifyDisplayNameChanged(name);
|
|
483
673
|
}
|
|
@@ -485,9 +675,13 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
|
|
|
485
675
|
/**
|
|
486
676
|
* Get the environment ID from configuration or use default
|
|
487
677
|
*/
|
|
488
|
-
get
|
|
678
|
+
get EnvironmentId() {
|
|
489
679
|
return this.Data?.Configuration?.environmentId || MJEnvironmentEntityExtended.DefaultEnvironmentID;
|
|
490
680
|
}
|
|
681
|
+
/** @deprecated Use {@link EnvironmentId}. */
|
|
682
|
+
get environmentId() {
|
|
683
|
+
return this.EnvironmentId;
|
|
684
|
+
}
|
|
491
685
|
/**
|
|
492
686
|
* Get the display name for chat conversations
|
|
493
687
|
*/
|
|
@@ -513,43 +707,55 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
|
|
|
513
707
|
* After the list refreshes, also reload messages in the active chat area so any
|
|
514
708
|
* new agent responses are visible without a full page reload.
|
|
515
709
|
*/
|
|
710
|
+
OnRefreshRequested() {
|
|
711
|
+
void this.ChatArea?.reloadMessages();
|
|
712
|
+
}
|
|
713
|
+
/** @deprecated Use {@link OnRefreshRequested}. */
|
|
516
714
|
onRefreshRequested() {
|
|
517
|
-
|
|
715
|
+
return this.OnRefreshRequested();
|
|
518
716
|
}
|
|
519
717
|
/**
|
|
520
718
|
* Handle conversation deletion from the list.
|
|
521
719
|
* If the deleted conversation was selected, navigate to the first remaining conversation.
|
|
522
720
|
*/
|
|
523
|
-
|
|
524
|
-
if (this.
|
|
721
|
+
OnConversationDeleted(deletedId) {
|
|
722
|
+
if (this.SelectedConversationId === deletedId) {
|
|
525
723
|
const remaining = this.engine.Conversations.filter(c => !UUIDsEqual(c.ID, deletedId));
|
|
526
724
|
if (remaining.length > 0) {
|
|
527
725
|
void this.selectConversation(remaining[0].ID);
|
|
528
726
|
this.updateUrl();
|
|
529
727
|
}
|
|
530
728
|
else {
|
|
531
|
-
this.
|
|
532
|
-
this.
|
|
533
|
-
this.
|
|
534
|
-
this.
|
|
729
|
+
this.SelectedConversationId = null;
|
|
730
|
+
this.SelectedConversation = null;
|
|
731
|
+
this.SelectedThreadId = null;
|
|
732
|
+
this.IsNewUnsavedConversation = true;
|
|
535
733
|
this.updateUrl();
|
|
536
734
|
}
|
|
537
735
|
}
|
|
538
736
|
}
|
|
737
|
+
/** @deprecated Use {@link OnConversationDeleted}. */
|
|
738
|
+
onConversationDeleted(deletedId) {
|
|
739
|
+
return this.OnConversationDeleted(deletedId);
|
|
740
|
+
}
|
|
539
741
|
/**
|
|
540
742
|
* Handle conversation selection from the list
|
|
541
743
|
*/
|
|
542
|
-
async
|
|
744
|
+
async OnConversationSelected(conversationId) {
|
|
543
745
|
await this.selectConversation(conversationId);
|
|
544
|
-
this.
|
|
545
|
-
this.
|
|
746
|
+
this.SelectedThreadId = null; // Clear thread when switching conversations
|
|
747
|
+
this.IsNewUnsavedConversation = false;
|
|
546
748
|
this.updateUrl();
|
|
547
749
|
this.updateTabTitle();
|
|
548
750
|
// Auto-collapse if mobile OR if sidebar is not pinned
|
|
549
|
-
if (this.
|
|
550
|
-
this.
|
|
751
|
+
if (this.IsMobileView || !this.IsSidebarPinned) {
|
|
752
|
+
this.CollapseSidebar();
|
|
551
753
|
}
|
|
552
754
|
}
|
|
755
|
+
/** @deprecated Use {@link OnConversationSelected}. */
|
|
756
|
+
async onConversationSelected(conversationId) {
|
|
757
|
+
return this.OnConversationSelected(conversationId);
|
|
758
|
+
}
|
|
553
759
|
onWindowResize() {
|
|
554
760
|
this.checkMobileView();
|
|
555
761
|
}
|
|
@@ -558,7 +764,7 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
|
|
|
558
764
|
*/
|
|
559
765
|
onDocumentClick(event) {
|
|
560
766
|
// Only handle when sidebar is expanded but unpinned
|
|
561
|
-
if (this.
|
|
767
|
+
if (this.IsSidebarCollapsed || this.IsSidebarPinned) {
|
|
562
768
|
return;
|
|
563
769
|
}
|
|
564
770
|
// Check if click is outside the sidebar
|
|
@@ -567,48 +773,60 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
|
|
|
567
773
|
const expandHandle = target.closest('.sidebar-expand-handle');
|
|
568
774
|
// If click is outside sidebar and expand handle, collapse it
|
|
569
775
|
if (!sidebarElement && !expandHandle) {
|
|
570
|
-
this.
|
|
776
|
+
this.CollapseSidebar();
|
|
571
777
|
}
|
|
572
778
|
}
|
|
573
779
|
/**
|
|
574
780
|
* Check if we're in mobile view and handle state accordingly
|
|
575
781
|
*/
|
|
576
782
|
checkMobileView() {
|
|
577
|
-
const wasMobile = this.
|
|
578
|
-
this.
|
|
579
|
-
if (this.
|
|
783
|
+
const wasMobile = this.IsMobileView;
|
|
784
|
+
this.IsMobileView = window.innerWidth < 768;
|
|
785
|
+
if (this.IsMobileView && !wasMobile) {
|
|
580
786
|
// Switched to mobile - default to collapsed
|
|
581
|
-
this.
|
|
787
|
+
this.IsSidebarCollapsed = true;
|
|
582
788
|
}
|
|
583
789
|
}
|
|
584
790
|
/**
|
|
585
791
|
* Collapse sidebar
|
|
586
792
|
*/
|
|
793
|
+
CollapseSidebar() {
|
|
794
|
+
this.IsSidebarCollapsed = true;
|
|
795
|
+
}
|
|
796
|
+
/** @deprecated Use {@link CollapseSidebar}. */
|
|
587
797
|
collapseSidebar() {
|
|
588
|
-
this.
|
|
798
|
+
return this.CollapseSidebar();
|
|
589
799
|
}
|
|
590
800
|
/**
|
|
591
801
|
* Expand sidebar (pinned - stays open until unpinned)
|
|
592
802
|
*/
|
|
593
|
-
|
|
594
|
-
this.
|
|
595
|
-
this.
|
|
803
|
+
ExpandSidebar() {
|
|
804
|
+
this.IsSidebarCollapsed = false;
|
|
805
|
+
this.IsSidebarPinned = true; // Pin it so it stays open
|
|
596
806
|
this.saveSidebarState();
|
|
597
807
|
}
|
|
808
|
+
/** @deprecated Use {@link ExpandSidebar}. */
|
|
809
|
+
expandSidebar() {
|
|
810
|
+
return this.ExpandSidebar();
|
|
811
|
+
}
|
|
598
812
|
/**
|
|
599
813
|
* Handle sidebar resize start
|
|
600
814
|
*/
|
|
601
|
-
|
|
815
|
+
OnSidebarResizeStart(event) {
|
|
602
816
|
event.preventDefault();
|
|
603
817
|
this.isSidebarResizing = true;
|
|
604
818
|
this.sidebarResizeStartX = event.clientX;
|
|
605
|
-
this.sidebarResizeStartWidth = this.
|
|
819
|
+
this.sidebarResizeStartWidth = this.SidebarWidth;
|
|
606
820
|
// Disable transitions during resize for immediate feedback
|
|
607
|
-
this.
|
|
821
|
+
this.SidebarTransitionsEnabled = false;
|
|
608
822
|
// Add event listeners for mousemove and mouseup
|
|
609
823
|
document.addEventListener('mousemove', this.onSidebarResizeMove);
|
|
610
824
|
document.addEventListener('mouseup', this.onSidebarResizeEnd);
|
|
611
825
|
}
|
|
826
|
+
/** @deprecated Use {@link OnSidebarResizeStart}. */
|
|
827
|
+
onSidebarResizeStart(event) {
|
|
828
|
+
return this.OnSidebarResizeStart(event);
|
|
829
|
+
}
|
|
612
830
|
/**
|
|
613
831
|
* Handle sidebar resize move (bound method for proper 'this' context)
|
|
614
832
|
*/
|
|
@@ -618,7 +836,7 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
|
|
|
618
836
|
const delta = event.clientX - this.sidebarResizeStartX;
|
|
619
837
|
const newWidth = this.sidebarResizeStartWidth + delta;
|
|
620
838
|
// Clamp to min/max bounds
|
|
621
|
-
this.
|
|
839
|
+
this.SidebarWidth = Math.max(this.SIDEBAR_MIN_WIDTH, Math.min(this.SIDEBAR_MAX_WIDTH, newWidth));
|
|
622
840
|
this.cdr.detectChanges();
|
|
623
841
|
};
|
|
624
842
|
/**
|
|
@@ -629,7 +847,7 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
|
|
|
629
847
|
return;
|
|
630
848
|
this.isSidebarResizing = false;
|
|
631
849
|
// Re-enable transitions for collapse/expand animations
|
|
632
|
-
this.
|
|
850
|
+
this.SidebarTransitionsEnabled = true;
|
|
633
851
|
// Remove event listeners
|
|
634
852
|
document.removeEventListener('mousemove', this.onSidebarResizeMove);
|
|
635
853
|
document.removeEventListener('mouseup', this.onSidebarResizeEnd);
|
|
@@ -639,18 +857,26 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
|
|
|
639
857
|
/**
|
|
640
858
|
* Pin sidebar - keep it open after selection
|
|
641
859
|
*/
|
|
642
|
-
|
|
643
|
-
this.
|
|
860
|
+
PinSidebar() {
|
|
861
|
+
this.IsSidebarPinned = true;
|
|
644
862
|
this.saveSidebarState();
|
|
645
863
|
}
|
|
864
|
+
/** @deprecated Use {@link PinSidebar}. */
|
|
865
|
+
pinSidebar() {
|
|
866
|
+
return this.PinSidebar();
|
|
867
|
+
}
|
|
646
868
|
/**
|
|
647
869
|
* Unpin sidebar - will auto-collapse on next selection
|
|
648
870
|
*/
|
|
649
|
-
|
|
650
|
-
this.
|
|
651
|
-
this.
|
|
871
|
+
UnpinSidebar() {
|
|
872
|
+
this.IsSidebarPinned = false;
|
|
873
|
+
this.CollapseSidebar();
|
|
652
874
|
this.saveSidebarState();
|
|
653
875
|
}
|
|
876
|
+
/** @deprecated Use {@link UnpinSidebar}. */
|
|
877
|
+
unpinSidebar() {
|
|
878
|
+
return this.UnpinSidebar();
|
|
879
|
+
}
|
|
654
880
|
/**
|
|
655
881
|
* Save sidebar state to User Settings (server only - no localStorage fallback)
|
|
656
882
|
* Uses debouncing to avoid excessive database writes
|
|
@@ -669,14 +895,14 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
|
|
|
669
895
|
*/
|
|
670
896
|
async saveSidebarStateToServer() {
|
|
671
897
|
try {
|
|
672
|
-
const userId = this.
|
|
898
|
+
const userId = this.CurrentUser?.ID;
|
|
673
899
|
if (!userId) {
|
|
674
900
|
return;
|
|
675
901
|
}
|
|
676
902
|
const stateToSave = {
|
|
677
|
-
collapsed: this.
|
|
678
|
-
pinned: this.
|
|
679
|
-
width: this.
|
|
903
|
+
collapsed: this.IsSidebarCollapsed,
|
|
904
|
+
pinned: this.IsSidebarPinned,
|
|
905
|
+
width: this.SidebarWidth
|
|
680
906
|
};
|
|
681
907
|
const engine = UserInfoEngine.Instance;
|
|
682
908
|
const md = this.ProviderToUse;
|
|
@@ -701,126 +927,154 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
|
|
|
701
927
|
*/
|
|
702
928
|
async loadSidebarState() {
|
|
703
929
|
try {
|
|
704
|
-
const userId = this.
|
|
930
|
+
const userId = this.CurrentUser?.ID;
|
|
705
931
|
if (userId) {
|
|
706
932
|
// Load from cached User Settings
|
|
707
933
|
const engine = UserInfoEngine.Instance;
|
|
708
934
|
const setting = engine.UserSettings.find(s => s.Setting === this.USER_SETTING_SIDEBAR_KEY);
|
|
709
935
|
if (setting?.Value) {
|
|
710
936
|
const state = JSON.parse(setting.Value);
|
|
711
|
-
this.
|
|
712
|
-
this.
|
|
713
|
-
this.
|
|
937
|
+
this.IsSidebarCollapsed = state.collapsed ?? true;
|
|
938
|
+
this.IsSidebarPinned = state.pinned ?? false;
|
|
939
|
+
this.SidebarWidth = state.width ?? 300;
|
|
714
940
|
// Clamp width to valid range
|
|
715
|
-
this.
|
|
716
|
-
this.
|
|
941
|
+
this.SidebarWidth = Math.max(this.SIDEBAR_MIN_WIDTH, Math.min(this.SIDEBAR_MAX_WIDTH, this.SidebarWidth));
|
|
942
|
+
this.IsSidebarSettingsLoaded = true;
|
|
717
943
|
return;
|
|
718
944
|
}
|
|
719
945
|
}
|
|
720
946
|
// No saved state found - NEW USER DEFAULT:
|
|
721
947
|
// Start with sidebar collapsed and show new conversation screen
|
|
722
|
-
this.
|
|
723
|
-
this.
|
|
724
|
-
this.
|
|
725
|
-
this.
|
|
726
|
-
this.
|
|
948
|
+
this.IsSidebarCollapsed = true;
|
|
949
|
+
this.IsSidebarPinned = false;
|
|
950
|
+
this.SidebarWidth = 300;
|
|
951
|
+
this.IsNewUnsavedConversation = true;
|
|
952
|
+
this.IsSidebarSettingsLoaded = true;
|
|
727
953
|
}
|
|
728
954
|
catch (error) {
|
|
729
955
|
console.warn('Failed to load sidebar state:', error);
|
|
730
956
|
// Default to collapsed for new users on error
|
|
731
|
-
this.
|
|
732
|
-
this.
|
|
733
|
-
this.
|
|
734
|
-
this.
|
|
957
|
+
this.IsSidebarCollapsed = true;
|
|
958
|
+
this.IsSidebarPinned = false;
|
|
959
|
+
this.SidebarWidth = 300;
|
|
960
|
+
this.IsSidebarSettingsLoaded = true;
|
|
735
961
|
}
|
|
736
962
|
}
|
|
737
963
|
/**
|
|
738
964
|
* Handle new conversation request from the list
|
|
739
965
|
*/
|
|
740
|
-
|
|
741
|
-
this.
|
|
742
|
-
this.
|
|
743
|
-
this.
|
|
744
|
-
this.
|
|
966
|
+
OnNewConversationRequested() {
|
|
967
|
+
this.SelectedConversationId = null;
|
|
968
|
+
this.SelectedConversation = null;
|
|
969
|
+
this.SelectedThreadId = null;
|
|
970
|
+
this.IsNewUnsavedConversation = true;
|
|
745
971
|
this.updateUrl();
|
|
746
972
|
this.NotifyDisplayNameChanged('New Conversation');
|
|
747
973
|
// Auto-collapse if mobile OR if sidebar is not pinned
|
|
748
|
-
if (this.
|
|
749
|
-
this.
|
|
974
|
+
if (this.IsMobileView || !this.IsSidebarPinned) {
|
|
975
|
+
this.CollapseSidebar();
|
|
750
976
|
}
|
|
751
977
|
}
|
|
978
|
+
/** @deprecated Use {@link OnNewConversationRequested}. */
|
|
979
|
+
onNewConversationRequested() {
|
|
980
|
+
return this.OnNewConversationRequested();
|
|
981
|
+
}
|
|
752
982
|
/**
|
|
753
983
|
* Handle conversation created from chat area (after first message in new conversation).
|
|
754
984
|
* The event now includes pending message and attachments for atomic state update.
|
|
755
985
|
*/
|
|
756
|
-
async
|
|
986
|
+
async OnConversationCreated(event) {
|
|
757
987
|
// Set ALL state atomically before Angular change detection runs
|
|
758
|
-
this.
|
|
759
|
-
this.
|
|
760
|
-
this.
|
|
761
|
-
this.
|
|
762
|
-
this.
|
|
988
|
+
this.PendingMessageToSend = event.pendingMessage || null;
|
|
989
|
+
this.PendingAttachmentsToSend = event.pendingAttachments || null;
|
|
990
|
+
this.SelectedConversationId = event.conversation.ID;
|
|
991
|
+
this.SelectedConversation = event.conversation;
|
|
992
|
+
this.IsNewUnsavedConversation = false;
|
|
763
993
|
this.bridge.SetActiveFromWorkspace(event.conversation.ID);
|
|
764
994
|
this.updateUrl();
|
|
765
995
|
this.updateTabTitle();
|
|
766
996
|
}
|
|
997
|
+
/** @deprecated Use {@link OnConversationCreated}. */
|
|
998
|
+
async onConversationCreated(event) {
|
|
999
|
+
return this.OnConversationCreated(event);
|
|
1000
|
+
}
|
|
767
1001
|
/**
|
|
768
1002
|
* Handle conversation rename event
|
|
769
1003
|
*/
|
|
770
|
-
|
|
1004
|
+
OnConversationRenamed(event) {
|
|
771
1005
|
// Trigger rename animation in the list
|
|
772
|
-
this.
|
|
1006
|
+
this.RenamedConversationId = event.conversationId;
|
|
773
1007
|
// Update tab title with the new name
|
|
774
1008
|
if (event.name) {
|
|
775
1009
|
this.NotifyDisplayNameChanged(event.name);
|
|
776
1010
|
}
|
|
777
1011
|
// Clear the animation trigger after it completes
|
|
778
1012
|
setTimeout(() => {
|
|
779
|
-
this.
|
|
1013
|
+
this.RenamedConversationId = null;
|
|
780
1014
|
}, 1500);
|
|
781
1015
|
}
|
|
1016
|
+
/** @deprecated Use {@link OnConversationRenamed}. */
|
|
1017
|
+
onConversationRenamed(event) {
|
|
1018
|
+
return this.OnConversationRenamed(event);
|
|
1019
|
+
}
|
|
782
1020
|
/**
|
|
783
1021
|
* Handle thread opened event
|
|
784
1022
|
*/
|
|
1023
|
+
OnThreadOpened(threadId) {
|
|
1024
|
+
this.SelectedThreadId = threadId;
|
|
1025
|
+
}
|
|
1026
|
+
/** @deprecated Use {@link OnThreadOpened}. */
|
|
785
1027
|
onThreadOpened(threadId) {
|
|
786
|
-
this.
|
|
1028
|
+
return this.OnThreadOpened(threadId);
|
|
787
1029
|
}
|
|
788
1030
|
/**
|
|
789
1031
|
* Handle thread closed event
|
|
790
1032
|
*/
|
|
1033
|
+
OnThreadClosed() {
|
|
1034
|
+
this.SelectedThreadId = null;
|
|
1035
|
+
}
|
|
1036
|
+
/** @deprecated Use {@link OnThreadClosed}. */
|
|
791
1037
|
onThreadClosed() {
|
|
792
|
-
this.
|
|
1038
|
+
return this.OnThreadClosed();
|
|
793
1039
|
}
|
|
794
1040
|
/**
|
|
795
1041
|
* Handle pending artifact consumed event
|
|
796
1042
|
*/
|
|
797
|
-
|
|
798
|
-
this.
|
|
799
|
-
this.
|
|
800
|
-
this.
|
|
1043
|
+
OnPendingArtifactConsumed() {
|
|
1044
|
+
this.PendingArtifactId = null;
|
|
1045
|
+
this.PendingArtifactConversationId = null;
|
|
1046
|
+
this.PendingArtifactVersionNumber = null;
|
|
801
1047
|
// Update URL to remove artifact params
|
|
802
1048
|
this.updateUrl();
|
|
803
1049
|
}
|
|
1050
|
+
/** @deprecated Use {@link OnPendingArtifactConsumed}. */
|
|
1051
|
+
onPendingArtifactConsumed() {
|
|
1052
|
+
return this.OnPendingArtifactConsumed();
|
|
1053
|
+
}
|
|
804
1054
|
/**
|
|
805
1055
|
* Handle pending message consumed event
|
|
806
1056
|
*/
|
|
1057
|
+
OnPendingMessageConsumed() {
|
|
1058
|
+
this.PendingMessageToSend = null;
|
|
1059
|
+
this.PendingAttachmentsToSend = null;
|
|
1060
|
+
}
|
|
1061
|
+
/** @deprecated Use {@link OnPendingMessageConsumed}. */
|
|
807
1062
|
onPendingMessageConsumed() {
|
|
808
|
-
this.
|
|
809
|
-
this.pendingAttachmentsToSend = null;
|
|
1063
|
+
return this.OnPendingMessageConsumed();
|
|
810
1064
|
}
|
|
811
1065
|
/**
|
|
812
1066
|
* Handle pending message requested event (from empty state creating conversation).
|
|
813
1067
|
* @deprecated Use onConversationCreated with pendingMessage instead - this is kept for backwards compatibility.
|
|
814
1068
|
*/
|
|
815
1069
|
onPendingMessageRequested(event) {
|
|
816
|
-
this.
|
|
817
|
-
this.
|
|
1070
|
+
this.PendingMessageToSend = event.text;
|
|
1071
|
+
this.PendingAttachmentsToSend = event.attachments || null;
|
|
818
1072
|
}
|
|
819
1073
|
/**
|
|
820
1074
|
* Handle navigation request from artifact viewer panel within the chat area.
|
|
821
1075
|
* Converts the link event to a generic navigation request and uses NavigationService.
|
|
822
1076
|
*/
|
|
823
|
-
|
|
1077
|
+
OnArtifactLinkClicked(event) {
|
|
824
1078
|
// Map the link type to the nav item name
|
|
825
1079
|
const navItemName = event.type === 'conversation' ? 'Conversations' : 'Collections';
|
|
826
1080
|
// Build configuration params to pass to the target resource
|
|
@@ -841,23 +1095,76 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
|
|
|
841
1095
|
// Navigate using the generic nav item method
|
|
842
1096
|
this.navigationService.OpenNavItemByName(navItemName, params);
|
|
843
1097
|
}
|
|
1098
|
+
/** @deprecated Use {@link OnArtifactLinkClicked}. */
|
|
1099
|
+
onArtifactLinkClicked(event) {
|
|
1100
|
+
return this.OnArtifactLinkClicked(event);
|
|
1101
|
+
}
|
|
844
1102
|
/**
|
|
845
1103
|
* Handle entity record open request from chat area (from React component grids).
|
|
846
1104
|
* Uses NavigationService to open the record in a new tab.
|
|
847
1105
|
*/
|
|
848
|
-
|
|
1106
|
+
OnOpenEntityRecord(event) {
|
|
849
1107
|
this.navigationService.OpenEntityRecord(event.entityName, event.compositeKey);
|
|
850
1108
|
}
|
|
1109
|
+
// ========================================
|
|
1110
|
+
// CROSS-ENTITY SEARCH PANEL
|
|
1111
|
+
// ========================================
|
|
1112
|
+
/** Whether the cross-entity search panel is open. */
|
|
1113
|
+
IsSearchPanelOpen = false;
|
|
1114
|
+
/** Term the panel opens with, handed over from the conversation list's own filter. */
|
|
1115
|
+
SearchSeedQuery = '';
|
|
1116
|
+
/**
|
|
1117
|
+
* Open the cross-entity search panel, carrying over the term the user had already typed
|
|
1118
|
+
* into the conversation list's filter so they do not retype it.
|
|
1119
|
+
*/
|
|
1120
|
+
OpenSearch(query = '') {
|
|
1121
|
+
this.SearchSeedQuery = query;
|
|
1122
|
+
this.IsSearchPanelOpen = true;
|
|
1123
|
+
}
|
|
1124
|
+
/** Close the cross-entity search panel. */
|
|
1125
|
+
CloseSearch() {
|
|
1126
|
+
this.IsSearchPanelOpen = false;
|
|
1127
|
+
}
|
|
1128
|
+
/**
|
|
1129
|
+
* Route a search result to the right Explorer surface.
|
|
1130
|
+
*
|
|
1131
|
+
* Explorer renders each chat surface as a separate resource, so results for another
|
|
1132
|
+
* surface go through NavigationService. Conversations and messages resolve to a
|
|
1133
|
+
* conversation, which this component owns, so they are selected in place.
|
|
1134
|
+
*/
|
|
1135
|
+
OnSearchResultSelected(result) {
|
|
1136
|
+
this.CloseSearch();
|
|
1137
|
+
const route = ResolveChatSearchRoute(result);
|
|
1138
|
+
switch (route?.Kind) {
|
|
1139
|
+
case 'conversation':
|
|
1140
|
+
void this.OnConversationSelected(route.ConversationId);
|
|
1141
|
+
break;
|
|
1142
|
+
case 'artifact':
|
|
1143
|
+
this.navigationService.OpenArtifact(route.ArtifactId, route.Title);
|
|
1144
|
+
break;
|
|
1145
|
+
case 'nav-item':
|
|
1146
|
+
void this.navigationService.OpenNavItemByName(route.NavItemName, route.Configuration);
|
|
1147
|
+
break;
|
|
1148
|
+
}
|
|
1149
|
+
}
|
|
1150
|
+
/** @deprecated Use {@link OnOpenEntityRecord}. */
|
|
1151
|
+
onOpenEntityRecord(event) {
|
|
1152
|
+
return this.OnOpenEntityRecord(event);
|
|
1153
|
+
}
|
|
851
1154
|
/**
|
|
852
1155
|
* Handle navigation request from artifact viewer plugins.
|
|
853
1156
|
* Opens the target nav item (switching apps if needed) then applies query params to the URL.
|
|
854
1157
|
*/
|
|
855
|
-
async
|
|
1158
|
+
async OnNavigationRequest(event) {
|
|
856
1159
|
const appId = event.appName ? this.resolveAppId(event.appName) : undefined;
|
|
857
1160
|
await this.navigationService.OpenNavItemByName(event.navItemName, undefined, appId, {
|
|
858
1161
|
queryParams: event.queryParams
|
|
859
1162
|
});
|
|
860
1163
|
}
|
|
1164
|
+
/** @deprecated Use {@link OnNavigationRequest}. */
|
|
1165
|
+
async onNavigationRequest(event) {
|
|
1166
|
+
return this.OnNavigationRequest(event);
|
|
1167
|
+
}
|
|
861
1168
|
/**
|
|
862
1169
|
* Resolve an application name to its ID.
|
|
863
1170
|
*/
|
|
@@ -892,10 +1199,10 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
|
|
|
892
1199
|
* the resourceId is an agent-internal ID, not a database artifact ID.
|
|
893
1200
|
*/
|
|
894
1201
|
openMostRecentArtifact() {
|
|
895
|
-
if (!this.
|
|
1202
|
+
if (!this.ChatArea)
|
|
896
1203
|
return;
|
|
897
1204
|
// Find the last artifact across all messages
|
|
898
|
-
const artifactMap = this.
|
|
1205
|
+
const artifactMap = this.ChatArea.artifactsByDetailId;
|
|
899
1206
|
let latestArtifact = null;
|
|
900
1207
|
for (const artifacts of artifactMap.values()) {
|
|
901
1208
|
if (artifacts.length > 0) {
|
|
@@ -907,7 +1214,7 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
|
|
|
907
1214
|
}
|
|
908
1215
|
}
|
|
909
1216
|
if (latestArtifact) {
|
|
910
|
-
this.
|
|
1217
|
+
this.ChatArea.onArtifactClicked(latestArtifact);
|
|
911
1218
|
}
|
|
912
1219
|
else {
|
|
913
1220
|
console.warn('No artifacts found in conversation to open for Report/Dashboard command');
|
|
@@ -918,16 +1225,19 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
|
|
|
918
1225
|
i0.ɵɵviewQuery(_c0, 5)(_c1, 5);
|
|
919
1226
|
} if (rf & 2) {
|
|
920
1227
|
let _t;
|
|
921
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.
|
|
922
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.
|
|
1228
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.ConversationList = _t.first);
|
|
1229
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.ChatArea = _t.first);
|
|
923
1230
|
} }, hostBindings: function ChatConversationsResource_HostBindings(rf, ctx) { if (rf & 1) {
|
|
924
1231
|
i0.ɵɵlistener("resize", function ChatConversationsResource_resize_HostBindingHandler() { return ctx.onWindowResize(); }, i0.ɵɵresolveWindow)("click", function ChatConversationsResource_click_HostBindingHandler($event) { return ctx.onDocumentClick($event); }, i0.ɵɵresolveDocument);
|
|
925
|
-
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls:
|
|
1232
|
+
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 2, consts: [["conversationList", ""], ["chatArea", ""], [1, "chat-conversations-container"], [1, "initializing-container"], [3, "InitialQuery", "IsOpen", "EnvironmentId", "CurrentUser"], [1, "mobile-sidebar-backdrop"], [1, "conversation-sidebar", 3, "collapsed", "no-transition", "width"], [1, "sidebar-resize-handle"], [1, "conversation-main"], [3, "environmentId", "currentUser", "conversationId", "conversation", "threadId", "isNewConversation", "pendingMessage", "pendingAttachments", "pendingArtifactId", "pendingArtifactConversationId", "pendingArtifactVersionNumber", "showSidebarToggle", "composerAgentMention"], [1, "mobile-sidebar-backdrop", 3, "click"], [1, "conversation-sidebar"], [3, "conversationSelected", "conversationDeleted", "newConversationRequested", "pinSidebarRequested", "unpinSidebarRequested", "refreshRequested", "SearchEscalated", "environmentId", "currentUser", "selectedConversationId", "renamedConversationId", "isSidebarPinned", "isMobileView"], [3, "openEntityRecord", "openConversation"], [1, "sidebar-resize-handle", 3, "mousedown"], [3, "sidebarToggleClicked", "conversationRenamed", "conversationCreated", "threadOpened", "threadClosed", "pendingArtifactConsumed", "pendingMessageConsumed", "pendingMessageRequested", "artifactLinkClicked", "openEntityRecord", "navigationRequest", "composerAgentMentionConsumed", "environmentId", "currentUser", "conversationId", "conversation", "threadId", "isNewConversation", "pendingMessage", "pendingAttachments", "pendingArtifactId", "pendingArtifactConversationId", "pendingArtifactVersionNumber", "showSidebarToggle", "composerAgentMention"], ["text", "Initializing...", "size", "large"], [3, "close", "ResultSelected", "InitialQuery", "IsOpen", "EnvironmentId", "CurrentUser"]], template: function ChatConversationsResource_Template(rf, ctx) { if (rf & 1) {
|
|
926
1233
|
i0.ɵɵconditionalCreate(0, ChatConversationsResource_Conditional_0_Template, 6, 4, "div", 2)(1, ChatConversationsResource_Conditional_1_Template, 2, 0, "div", 3);
|
|
927
|
-
i0.ɵɵ
|
|
1234
|
+
i0.ɵɵconditionalCreate(2, ChatConversationsResource_Conditional_2_Template, 1, 4, "mj-search-panel", 4);
|
|
1235
|
+
i0.ɵɵelement(3, "mj-toast");
|
|
928
1236
|
} if (rf & 2) {
|
|
929
1237
|
i0.ɵɵconditional(ctx.isReady ? 0 : 1);
|
|
930
|
-
|
|
1238
|
+
i0.ɵɵadvance(2);
|
|
1239
|
+
i0.ɵɵconditional(ctx.CurrentUser ? 2 : -1);
|
|
1240
|
+
} }, dependencies: [i1.RoutinesSectionComponent, i1.ConversationListComponent, i1.ConversationChatAreaComponent, i1.SearchPanelComponent, i1.ToastComponent, i2.LoadingComponent], styles: ["\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .chat-conversations-container {\n display: flex;\n width: 100%;\n height: 100%;\n flex: 1;\n overflow: hidden;\n position: relative;\n }\n\n .conversation-sidebar {\n flex-shrink: 0;\n border-right: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: var(--mj-bg-surface-sunken);\n transition: width 0.3s ease;\n }\n\n /* Conversation list scrolls; the routines section stays pinned at the bottom */\n .conversation-sidebar mj-conversation-list {\n flex: 1 1 auto;\n min-height: 0;\n overflow-y: auto;\n }\n\n .conversation-sidebar mj-conversation-routines-section {\n flex-shrink: 0;\n }\n\n /* Disable transitions during initial load to prevent jarring animation */\n .conversation-sidebar.no-transition {\n transition: none !important;\n }\n\n .conversation-sidebar.collapsed {\n width: 0 !important;\n min-width: 0;\n border-right: none;\n overflow: hidden;\n }\n\n /* Resize handle for sidebar */\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: var(--mj-brand-primary);\n }\n\n .sidebar-resize-handle:active {\n background: var(--mj-brand-primary-hover);\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 .conversation-main {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .initializing-container {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n flex: 1;\n }\n\n /* Mobile: sidebar slides over the chat instead of squishing it.\n The chat area always fills the full width; the sidebar overlays on\n top and is dismissed by tapping the backdrop. */\n @media (max-width: 767px) {\n .conversation-sidebar {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n height: 100%;\n width: min(85%, 320px) !important;\n z-index: 1000;\n transform: translateX(-100%);\n transition: transform 0.3s ease;\n box-shadow: 2px 0 12px color-mix(in srgb, var(--mj-text-primary) 25%, transparent);\n }\n\n /* Keep a fixed width in both states so only the transform animates\n (avoids text reflow during the slide). */\n .conversation-sidebar.collapsed {\n width: min(85%, 320px) !important;\n border-right: 1px solid var(--mj-border-default);\n overflow-y: auto;\n }\n\n .conversation-sidebar:not(.collapsed) {\n transform: translateX(0);\n }\n\n /* No drag-resize on mobile */\n .sidebar-resize-handle {\n display: none;\n }\n\n .mobile-sidebar-backdrop {\n position: absolute;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 999;\n border: none;\n padding: 0;\n cursor: pointer;\n animation: chatBackdropFade 0.2s ease;\n }\n\n @keyframes chatBackdropFade {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n }\n "], encapsulation: 2 });
|
|
931
1241
|
};
|
|
932
1242
|
ChatConversationsResource = __decorate([
|
|
933
1243
|
RegisterClass(BaseResourceComponent, 'ChatConversationsResource')
|
|
@@ -962,7 +1272,8 @@ export { ChatConversationsResource };
|
|
|
962
1272
|
(newConversationRequested)="onNewConversationRequested()"
|
|
963
1273
|
(pinSidebarRequested)="pinSidebar()"
|
|
964
1274
|
(unpinSidebarRequested)="unpinSidebar()"
|
|
965
|
-
(refreshRequested)="onRefreshRequested()"
|
|
1275
|
+
(refreshRequested)="onRefreshRequested()"
|
|
1276
|
+
(SearchEscalated)="OpenSearch($event)">
|
|
966
1277
|
</mj-conversation-list>
|
|
967
1278
|
<!-- Routines — pinned at the very bottom of the sidebar. Gated inside the
|
|
968
1279
|
section component by Read permission on 'MJ: User Routines'. -->
|
|
@@ -1018,13 +1329,25 @@ export { ChatConversationsResource };
|
|
|
1018
1329
|
</div>
|
|
1019
1330
|
}
|
|
1020
1331
|
|
|
1332
|
+
<!-- Cross-entity search panel (conversations / messages / artifacts / collections / tasks) -->
|
|
1333
|
+
@if (CurrentUser) {
|
|
1334
|
+
<mj-search-panel
|
|
1335
|
+
[InitialQuery]="SearchSeedQuery"
|
|
1336
|
+
[IsOpen]="IsSearchPanelOpen"
|
|
1337
|
+
[EnvironmentId]="EnvironmentId"
|
|
1338
|
+
[CurrentUser]="CurrentUser"
|
|
1339
|
+
(close)="CloseSearch()"
|
|
1340
|
+
(ResultSelected)="OnSearchResultSelected($event)">
|
|
1341
|
+
</mj-search-panel>
|
|
1342
|
+
}
|
|
1343
|
+
|
|
1021
1344
|
<!-- Toast notifications container -->
|
|
1022
1345
|
<mj-toast></mj-toast>
|
|
1023
1346
|
`, encapsulation: ViewEncapsulation.None, styles: ["\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .chat-conversations-container {\n display: flex;\n width: 100%;\n height: 100%;\n flex: 1;\n overflow: hidden;\n position: relative;\n }\n\n .conversation-sidebar {\n flex-shrink: 0;\n border-right: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: var(--mj-bg-surface-sunken);\n transition: width 0.3s ease;\n }\n\n /* Conversation list scrolls; the routines section stays pinned at the bottom */\n .conversation-sidebar mj-conversation-list {\n flex: 1 1 auto;\n min-height: 0;\n overflow-y: auto;\n }\n\n .conversation-sidebar mj-conversation-routines-section {\n flex-shrink: 0;\n }\n\n /* Disable transitions during initial load to prevent jarring animation */\n .conversation-sidebar.no-transition {\n transition: none !important;\n }\n\n .conversation-sidebar.collapsed {\n width: 0 !important;\n min-width: 0;\n border-right: none;\n overflow: hidden;\n }\n\n /* Resize handle for sidebar */\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: var(--mj-brand-primary);\n }\n\n .sidebar-resize-handle:active {\n background: var(--mj-brand-primary-hover);\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 .conversation-main {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .initializing-container {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n flex: 1;\n }\n\n /* Mobile: sidebar slides over the chat instead of squishing it.\n The chat area always fills the full width; the sidebar overlays on\n top and is dismissed by tapping the backdrop. */\n @media (max-width: 767px) {\n .conversation-sidebar {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n height: 100%;\n width: min(85%, 320px) !important;\n z-index: 1000;\n transform: translateX(-100%);\n transition: transform 0.3s ease;\n box-shadow: 2px 0 12px color-mix(in srgb, var(--mj-text-primary) 25%, transparent);\n }\n\n /* Keep a fixed width in both states so only the transform animates\n (avoids text reflow during the slide). */\n .conversation-sidebar.collapsed {\n width: min(85%, 320px) !important;\n border-right: 1px solid var(--mj-border-default);\n overflow-y: auto;\n }\n\n .conversation-sidebar:not(.collapsed) {\n transform: translateX(0);\n }\n\n /* No drag-resize on mobile */\n .sidebar-resize-handle {\n display: none;\n }\n\n .mobile-sidebar-backdrop {\n position: absolute;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 999;\n border: none;\n padding: 0;\n cursor: pointer;\n animation: chatBackdropFade 0.2s ease;\n }\n\n @keyframes chatBackdropFade {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n }\n "] }]
|
|
1024
|
-
}], () => [{ type: i0.ChangeDetectorRef }, { type: i1.ConversationStreamingService }, { type: i1.ActiveTasksService }, { type: i1.UICommandHandlerService }, { type: i1.ConversationBridgeService }], {
|
|
1347
|
+
}], () => [{ type: i0.ChangeDetectorRef }, { type: i1.ConversationStreamingService }, { type: i1.ActiveTasksService }, { type: i1.UICommandHandlerService }, { type: i1.ConversationBridgeService }], { ConversationList: [{
|
|
1025
1348
|
type: ViewChild,
|
|
1026
1349
|
args: ['conversationList']
|
|
1027
|
-
}],
|
|
1350
|
+
}], ChatArea: [{
|
|
1028
1351
|
type: ViewChild,
|
|
1029
1352
|
args: ['chatArea']
|
|
1030
1353
|
}], onWindowResize: [{
|
|
@@ -1034,5 +1357,5 @@ export { ChatConversationsResource };
|
|
|
1034
1357
|
type: HostListener,
|
|
1035
1358
|
args: ['document:click', ['$event']]
|
|
1036
1359
|
}] }); })();
|
|
1037
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ChatConversationsResource, { className: "ChatConversationsResource", filePath: "src/lib/resource-wrappers/chat-conversations-resource.component.ts", lineNumber:
|
|
1360
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ChatConversationsResource, { className: "ChatConversationsResource", filePath: "src/lib/resource-wrappers/chat-conversations-resource.component.ts", lineNumber: 276 }); })();
|
|
1038
1361
|
//# sourceMappingURL=chat-conversations-resource.component.js.map
|