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