@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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Component, ViewChild, HostListener, Output, EventEmitter } from '@angular/core';
|
|
1
|
+
import { Component, ViewChild, HostListener, Input, Output, EventEmitter } from '@angular/core';
|
|
2
2
|
import { Subject } from 'rxjs';
|
|
3
3
|
import { takeUntil } from 'rxjs/operators';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
@@ -51,13 +51,13 @@ function CommandPaletteComponent_Conditional_1_For_8_Template(rf, ctx) { if (rf
|
|
|
51
51
|
function CommandPaletteComponent_Conditional_1_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
52
52
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
53
53
|
i0.ɵɵelementStart(0, "div", 17)(1, "span", 18);
|
|
54
|
-
i0.ɵɵtext(2, "
|
|
54
|
+
i0.ɵɵtext(2, "Search");
|
|
55
55
|
i0.ɵɵelementEnd()();
|
|
56
56
|
i0.ɵɵelementStart(3, "div", 19);
|
|
57
57
|
i0.ɵɵlistener("click", function CommandPaletteComponent_Conditional_1_Conditional_9_Template_div_click_3_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SearchKnowledgeHub()); });
|
|
58
58
|
i0.ɵɵelement(4, "i", 20);
|
|
59
59
|
i0.ɵɵelementStart(5, "div", 14)(6, "div", 15);
|
|
60
|
-
i0.ɵɵtext(7, "Search
|
|
60
|
+
i0.ɵɵtext(7, "Search everything");
|
|
61
61
|
i0.ɵɵelementEnd();
|
|
62
62
|
i0.ɵɵelementStart(8, "div", 16);
|
|
63
63
|
i0.ɵɵtext(9);
|
|
@@ -74,6 +74,9 @@ function CommandPaletteComponent_Conditional_1_Conditional_9_Template(rf, ctx) {
|
|
|
74
74
|
} }
|
|
75
75
|
function CommandPaletteComponent_Conditional_1_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
76
76
|
i0.ɵɵelement(0, "mj-empty-state", 10);
|
|
77
|
+
} if (rf & 2) {
|
|
78
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
79
|
+
i0.ɵɵproperty("Message", ctx_r1.NoResultsMessage);
|
|
77
80
|
} }
|
|
78
81
|
function CommandPaletteComponent_Conditional_1_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
79
82
|
i0.ɵɵelementStart(0, "div", 11);
|
|
@@ -94,7 +97,7 @@ function CommandPaletteComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
|
94
97
|
i0.ɵɵelementStart(6, "div", 8);
|
|
95
98
|
i0.ɵɵrepeaterCreate(7, CommandPaletteComponent_Conditional_1_For_8_Template, 6, 9, "div", 9, i0.ɵɵrepeaterTrackByIdentity);
|
|
96
99
|
i0.ɵɵconditionalCreate(9, CommandPaletteComponent_Conditional_1_Conditional_9_Template, 12, 3);
|
|
97
|
-
i0.ɵɵconditionalCreate(10, CommandPaletteComponent_Conditional_1_Conditional_10_Template, 1,
|
|
100
|
+
i0.ɵɵconditionalCreate(10, CommandPaletteComponent_Conditional_1_Conditional_10_Template, 1, 1, "mj-empty-state", 10);
|
|
98
101
|
i0.ɵɵelementEnd();
|
|
99
102
|
i0.ɵɵconditionalCreate(11, CommandPaletteComponent_Conditional_1_Conditional_11_Template, 2, 1, "div", 11);
|
|
100
103
|
i0.ɵɵelementEnd();
|
|
@@ -105,7 +108,7 @@ function CommandPaletteComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
|
105
108
|
i0.ɵɵadvance(3);
|
|
106
109
|
i0.ɵɵrepeater(ctx_r1.FilteredApps);
|
|
107
110
|
i0.ɵɵadvance(2);
|
|
108
|
-
i0.ɵɵconditional(ctx_r1.
|
|
111
|
+
i0.ɵɵconditional(ctx_r1.HasSearchAction ? 9 : -1);
|
|
109
112
|
i0.ɵɵadvance();
|
|
110
113
|
i0.ɵɵconditional(ctx_r1.FilteredApps.length === 0 && ctx_r1.SearchQuery ? 10 : -1);
|
|
111
114
|
i0.ɵɵadvance();
|
|
@@ -130,6 +133,8 @@ export class CommandPaletteComponent {
|
|
|
130
133
|
destroy$ = new Subject();
|
|
131
134
|
SearchInput;
|
|
132
135
|
PaletteModal;
|
|
136
|
+
/** Offers a "Search everything" row for the typed text. The host turns it on only when search is available. */
|
|
137
|
+
ShowSearch = false;
|
|
133
138
|
AppSelected = new EventEmitter();
|
|
134
139
|
KnowledgeSearchRequested = new EventEmitter();
|
|
135
140
|
IsOpen = false;
|
|
@@ -157,8 +162,8 @@ export class CommandPaletteComponent {
|
|
|
157
162
|
}
|
|
158
163
|
this.cdr.detectChanges();
|
|
159
164
|
});
|
|
160
|
-
//
|
|
161
|
-
this.appManager.
|
|
165
|
+
// The user's own apps — the same list Home, the app switcher and the omnibar show
|
|
166
|
+
this.appManager.Applications.pipe(takeUntil(this.destroy$)).subscribe((apps) => {
|
|
162
167
|
this.AllApps = apps;
|
|
163
168
|
this.filterAndSortApps();
|
|
164
169
|
});
|
|
@@ -242,6 +247,14 @@ export class CommandPaletteComponent {
|
|
|
242
247
|
first.focus();
|
|
243
248
|
}
|
|
244
249
|
}
|
|
250
|
+
/** True when the "Search everything" row is shown, below the app results. */
|
|
251
|
+
get HasSearchAction() {
|
|
252
|
+
return this.ShowSearch && this.SearchQuery.trim().length > 0;
|
|
253
|
+
}
|
|
254
|
+
/** Empty-state hint; points at the search row only when that row is shown. */
|
|
255
|
+
get NoResultsMessage() {
|
|
256
|
+
return this.HasSearchAction ? 'Try a different search term, or search everything below' : 'Try a different search term';
|
|
257
|
+
}
|
|
245
258
|
/**
|
|
246
259
|
* Handle search query change
|
|
247
260
|
*/
|
|
@@ -354,7 +367,7 @@ export class CommandPaletteComponent {
|
|
|
354
367
|
switch (event.key) {
|
|
355
368
|
case 'ArrowDown':
|
|
356
369
|
event.preventDefault();
|
|
357
|
-
// Allow selecting up to FilteredApps.length (the
|
|
370
|
+
// Allow selecting up to FilteredApps.length (the search row is at that index)
|
|
358
371
|
this.SelectedIndex = Math.min(this.SelectedIndex + 1, this.maxSelectableIndex());
|
|
359
372
|
this.scrollToSelected();
|
|
360
373
|
break;
|
|
@@ -368,8 +381,8 @@ export class CommandPaletteComponent {
|
|
|
368
381
|
if (this.SelectedIndex < this.FilteredApps.length && this.FilteredApps[this.SelectedIndex]) {
|
|
369
382
|
this.SelectApp(this.FilteredApps[this.SelectedIndex]);
|
|
370
383
|
}
|
|
371
|
-
else if (this.
|
|
372
|
-
//
|
|
384
|
+
else if (this.HasSearchAction && this.SelectedIndex === this.FilteredApps.length) {
|
|
385
|
+
// The search row is selected
|
|
373
386
|
this.SearchKnowledgeHub();
|
|
374
387
|
}
|
|
375
388
|
break;
|
|
@@ -383,8 +396,7 @@ export class CommandPaletteComponent {
|
|
|
383
396
|
* Get the maximum selectable index (apps + knowledge search action if query present)
|
|
384
397
|
*/
|
|
385
398
|
maxSelectableIndex() {
|
|
386
|
-
|
|
387
|
-
return hasKnowledgeAction ? this.FilteredApps.length : this.FilteredApps.length - 1;
|
|
399
|
+
return this.HasSearchAction ? this.FilteredApps.length : this.FilteredApps.length - 1;
|
|
388
400
|
}
|
|
389
401
|
/**
|
|
390
402
|
* Ensure selected item is visible in results list
|
|
@@ -406,7 +418,7 @@ export class CommandPaletteComponent {
|
|
|
406
418
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.PaletteModal = _t.first);
|
|
407
419
|
} }, hostBindings: function CommandPaletteComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
408
420
|
i0.ɵɵlistener("keydown", function CommandPaletteComponent_keydown_HostBindingHandler($event) { return ctx.HandleKeyDown($event); }, i0.ɵɵresolveDocument);
|
|
409
|
-
} }, outputs: { AppSelected: "AppSelected", KnowledgeSearchRequested: "KnowledgeSearchRequested" }, standalone: false, decls: 2, vars: 2, consts: [["paletteModal", ""], ["searchInput", ""], ["role", "presentation", "aria-hidden", "true", 1, "command-palette-backdrop"], ["role", "dialog", "aria-label", "Search applications", "aria-modal", "true", 1, "command-palette-modal"], ["role", "presentation", "aria-hidden", "true", 1, "command-palette-backdrop", 3, "click"], [1, "search-container"], ["aria-hidden", "true", 1, "fa-solid", "fa-search", "search-icon"], ["type", "text", "placeholder", "Search applications...", "autocomplete", "off", "spellcheck", "false", "aria-label", "Search applications", 1, "search-input", 3, "ngModelChange", "input", "ngModel"], ["role", "listbox", "aria-label", "Application results", 1, "results-list"], ["role", "option", 1, "result-item", 3, "selected"], ["Variant", "no-results", "Size", "compact", "Icon", "fa-solid fa-magnifying-glass", "Title", "No applications found", "
|
|
421
|
+
} }, inputs: { ShowSearch: "ShowSearch" }, outputs: { AppSelected: "AppSelected", KnowledgeSearchRequested: "KnowledgeSearchRequested" }, standalone: false, decls: 2, vars: 2, consts: [["paletteModal", ""], ["searchInput", ""], ["role", "presentation", "aria-hidden", "true", 1, "command-palette-backdrop"], ["role", "dialog", "aria-label", "Search applications", "aria-modal", "true", 1, "command-palette-modal"], ["role", "presentation", "aria-hidden", "true", 1, "command-palette-backdrop", 3, "click"], [1, "search-container"], ["aria-hidden", "true", 1, "fa-solid", "fa-search", "search-icon"], ["type", "text", "placeholder", "Search applications...", "autocomplete", "off", "spellcheck", "false", "aria-label", "Search applications", 1, "search-input", 3, "ngModelChange", "input", "ngModel"], ["role", "listbox", "aria-label", "Application results", 1, "results-list"], ["role", "option", 1, "result-item", 3, "selected"], ["Variant", "no-results", "Size", "compact", "Icon", "fa-solid fa-magnifying-glass", "Title", "No applications found", "role", "status", "aria-live", "polite", 3, "Message"], ["role", "status", "aria-live", "assertive", "aria-label", "Navigating to application", 1, "loading-overlay"], ["role", "option", 1, "result-item", 3, "click"], ["aria-hidden", "true", 1, "result-icon"], [1, "result-info"], [1, "result-name"], [1, "result-description"], [1, "results-section-divider"], [1, "section-label"], ["role", "option", 1, "result-item", "result-item-action", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-magnifying-glass", "result-icon", "result-icon-knowledge"], [1, "result-kbd"], ["size", "small", 3, "showText"]], template: function CommandPaletteComponent_Template(rf, ctx) { if (rf & 1) {
|
|
410
422
|
i0.ɵɵconditionalCreate(0, CommandPaletteComponent_Conditional_0_Template, 1, 0, "div", 2);
|
|
411
423
|
i0.ɵɵconditionalCreate(1, CommandPaletteComponent_Conditional_1_Template, 12, 4, "div", 3);
|
|
412
424
|
} if (rf & 2) {
|
|
@@ -417,13 +429,15 @@ export class CommandPaletteComponent {
|
|
|
417
429
|
}
|
|
418
430
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CommandPaletteComponent, [{
|
|
419
431
|
type: Component,
|
|
420
|
-
args: [{ standalone: false, selector: 'mj-command-palette', template: "<!-- Backdrop -->\n@if (IsOpen) {\n <div class=\"command-palette-backdrop\"\n (click)=\"Close()\"\n role=\"presentation\"\n aria-hidden=\"true\">\n </div>\n}\n\n<!-- Modal -->\n@if (IsOpen) {\n <div class=\"command-palette-modal\"\n #paletteModal\n role=\"dialog\"\n aria-label=\"Search applications\"\n aria-modal=\"true\">\n <!-- Search Input -->\n <div class=\"search-container\">\n <i class=\"fa-solid fa-search search-icon\" aria-hidden=\"true\"></i>\n <input\n #searchInput\n type=\"text\"\n [(ngModel)]=\"SearchQuery\"\n (input)=\"OnSearchChange()\"\n placeholder=\"Search applications...\"\n class=\"search-input\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n aria-label=\"Search applications\">\n </div>\n <!-- Results List -->\n <div class=\"results-list\" role=\"listbox\" aria-label=\"Application results\">\n <!-- All Apps -->\n @for (app of FilteredApps; track app; let i = $index) {\n <div\n class=\"result-item\"\n [class.selected]=\"i === SelectedIndex\"\n (click)=\"SelectApp(app)\"\n role=\"option\"\n [attr.aria-selected]=\"i === SelectedIndex\">\n <i [class]=\"app.Icon\"\n [style.color]=\"app.GetColor()\"\n class=\"result-icon\"\n aria-hidden=\"true\"></i>\n <div class=\"result-info\">\n <div class=\"result-name\">{{ app.Name }}</div>\n @if (app.Description) {\n <div class=\"result-description\">{{ app.Description }}</div>\n }\n </div>\n </div>\n }\n <!-- Search
|
|
432
|
+
args: [{ standalone: false, selector: 'mj-command-palette', template: "<!-- Backdrop -->\n@if (IsOpen) {\n <div class=\"command-palette-backdrop\"\n (click)=\"Close()\"\n role=\"presentation\"\n aria-hidden=\"true\">\n </div>\n}\n\n<!-- Modal -->\n@if (IsOpen) {\n <div class=\"command-palette-modal\"\n #paletteModal\n role=\"dialog\"\n aria-label=\"Search applications\"\n aria-modal=\"true\">\n <!-- Search Input -->\n <div class=\"search-container\">\n <i class=\"fa-solid fa-search search-icon\" aria-hidden=\"true\"></i>\n <input\n #searchInput\n type=\"text\"\n [(ngModel)]=\"SearchQuery\"\n (input)=\"OnSearchChange()\"\n placeholder=\"Search applications...\"\n class=\"search-input\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n aria-label=\"Search applications\">\n </div>\n <!-- Results List -->\n <div class=\"results-list\" role=\"listbox\" aria-label=\"Application results\">\n <!-- All Apps -->\n @for (app of FilteredApps; track app; let i = $index) {\n <div\n class=\"result-item\"\n [class.selected]=\"i === SelectedIndex\"\n (click)=\"SelectApp(app)\"\n role=\"option\"\n [attr.aria-selected]=\"i === SelectedIndex\">\n <i [class]=\"app.Icon\"\n [style.color]=\"app.GetColor()\"\n class=\"result-icon\"\n aria-hidden=\"true\"></i>\n <div class=\"result-info\">\n <div class=\"result-name\">{{ app.Name }}</div>\n @if (app.Description) {\n <div class=\"result-description\">{{ app.Description }}</div>\n }\n </div>\n </div>\n }\n <!-- Search Everything Action (only when the host has search turned on) -->\n @if (HasSearchAction) {\n <div class=\"results-section-divider\">\n <span class=\"section-label\">Search</span>\n </div>\n <div\n class=\"result-item result-item-action\"\n [class.selected]=\"FilteredApps.length === SelectedIndex\"\n (click)=\"SearchKnowledgeHub()\"\n role=\"option\">\n <i class=\"fa-solid fa-magnifying-glass result-icon result-icon-knowledge\" aria-hidden=\"true\"></i>\n <div class=\"result-info\">\n <div class=\"result-name\">Search everything</div>\n <div class=\"result-description\">Search \"{{ SearchQuery }}\" across entities, documents, and content</div>\n </div>\n <kbd class=\"result-kbd\">Enter</kbd>\n </div>\n }\n <!-- Empty State -->\n @if (FilteredApps.length === 0 && SearchQuery) {\n <mj-empty-state\n Variant=\"no-results\"\n Size=\"compact\"\n Icon=\"fa-solid fa-magnifying-glass\"\n Title=\"No applications found\"\n [Message]=\"NoResultsMessage\"\n role=\"status\"\n aria-live=\"polite\" />\n }\n </div>\n <!-- Loading State Overlay -->\n @if (IsNavigating) {\n <div class=\"loading-overlay\" role=\"status\" aria-live=\"assertive\" aria-label=\"Navigating to application\">\n <mj-loading size=\"small\" [showText]=\"false\"></mj-loading>\n </div>\n }\n </div>\n}\n", styles: ["/* Backdrop with blur effect */\n.command-palette-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n backdrop-filter: blur(3px);\n z-index: 10000;\n animation: fadeIn 0.15s ease-out;\n}\n\n/* Modal - centered, Notion-style */\n.command-palette-modal {\n position: fixed;\n top: 20%;\n left: 50%;\n transform: translateX(-50%);\n width: 90%;\n max-width: 640px;\n max-height: 500px;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 16px 48px rgba(0, 0, 0, 0.2);\n overflow: hidden;\n z-index: 10001;\n animation: slideIn 0.2s ease-out;\n display: flex;\n flex-direction: column;\n}\n\n/* Search Container */\n.search-container {\n display: flex;\n align-items: center;\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.search-icon {\n font-size: 18px;\n color: var(--mj-text-disabled);\n margin-right: 12px;\n}\n\n.search-input {\n flex: 1;\n border: none;\n outline: none;\n font-size: 16px;\n padding: 8px 0;\n color: var(--mj-text-primary);\n background: transparent;\n}\n\n.search-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n/* Results List */\n.results-list {\n overflow-y: auto;\n max-height: 400px;\n flex: 1;\n}\n\n/* Section Header (for \"Recent\") */\n.section-header {\n padding: 12px 16px 8px 16px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n/* Result Item */\n.result-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n cursor: pointer;\n transition: background 0.1s ease-out;\n border-radius: 0;\n}\n\n.result-item:hover,\n.result-item.selected {\n background: var(--mj-bg-surface-card);\n}\n\n.result-item.selected {\n position: relative;\n}\n\n.result-item.selected::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 3px;\n background: var(--mj-brand-primary);\n}\n\n.result-icon {\n font-size: 20px;\n width: 24px;\n text-align: center;\n flex-shrink: 0;\n}\n\n.result-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.result-name {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.result-description {\n font-size: 12px;\n color: var(--mj-text-disabled);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* Knowledge Search Section */\n.results-section-divider {\n padding: 6px 16px;\n border-top: 1px solid var(--mj-border-subtle);\n margin-top: 4px;\n}\n\n.section-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n.result-item-action {\n border-top: none;\n}\n\n.result-icon-knowledge {\n color: var(--mj-brand-primary);\n}\n\n.result-kbd {\n display: inline-block;\n padding: 2px 6px;\n border-radius: 4px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 11px;\n font-family: inherit;\n flex-shrink: 0;\n}\n\n/* Loading Overlay */\n.loading-overlay {\n position: absolute;\n inset: 0;\n background: color-mix(in srgb, var(--mj-bg-surface) 95%, transparent);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1;\n animation: fadeIn 0.15s ease-out;\n}\n\n/* Animations */\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes slideIn {\n from {\n opacity: 0;\n transform: translateX(-50%) translateY(-20px);\n }\n to {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n}\n\n/* Scrollbar Styling (Webkit browsers) */\n.results-list::-webkit-scrollbar {\n width: 8px;\n}\n\n.results-list::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.results-list::-webkit-scrollbar-thumb {\n background: var(--mj-border-default);\n border-radius: 4px;\n}\n\n.results-list::-webkit-scrollbar-thumb:hover {\n background: var(--mj-border-strong);\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .command-palette-modal {\n width: 95%;\n max-width: none;\n top: 10%;\n }\n\n .search-input {\n font-size: 14px;\n }\n\n .result-name {\n font-size: 13px;\n }\n\n .result-description {\n font-size: 11px;\n }\n}\n"] }]
|
|
421
433
|
}], () => [{ type: i1.CommandPaletteService }, { type: i2.ApplicationManager }, { type: i0.ChangeDetectorRef }], { SearchInput: [{
|
|
422
434
|
type: ViewChild,
|
|
423
435
|
args: ['searchInput']
|
|
424
436
|
}], PaletteModal: [{
|
|
425
437
|
type: ViewChild,
|
|
426
438
|
args: ['paletteModal']
|
|
439
|
+
}], ShowSearch: [{
|
|
440
|
+
type: Input
|
|
427
441
|
}], AppSelected: [{
|
|
428
442
|
type: Output
|
|
429
443
|
}], KnowledgeSearchRequested: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-palette.component.js","sourceRoot":"","sources":["../../../src/lib/command-palette/command-palette.component.ts","../../../src/lib/command-palette/command-palette.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ViewChild, ElementRef, HostListener, ChangeDetectorRef, Output, EventEmitter } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { ApplicationManager, BaseApplication } from '@memberjunction/ng-base-application';\nimport { CommandPaletteService } from './command-palette.service';\n\n/**\n * Command Palette Component\n *\n * Provides a Notion-style command palette for quickly searching and navigating to applications.\n * Triggered by Cmd+K (Mac) or Ctrl+/ (Windows/Linux).\n *\n * Features:\n * - Fuzzy search with relevance scoring\n * - Keyboard navigation (arrow keys, enter, escape)\n * - Loading state during navigation\n * - Empty state with helpful message\n */\n@Component({\n standalone: false,\n selector: 'mj-command-palette',\n templateUrl: './command-palette.component.html',\n styleUrls: ['./command-palette.component.css']\n})\nexport class CommandPaletteComponent implements OnInit, OnDestroy {\n private destroy$ = new Subject<void>();\n\n @ViewChild('searchInput') SearchInput!: ElementRef<HTMLInputElement>;\n @ViewChild('paletteModal') PaletteModal?: ElementRef<HTMLElement>;\n @Output() AppSelected = new EventEmitter<string>();\n @Output() KnowledgeSearchRequested = new EventEmitter<string>();\n\n IsOpen = false;\n SearchQuery = '';\n /** The element focus came from, so closing can hand it back (WCAG 2.4.3). */\n private invoker: HTMLElement | null = null;\n AllApps: BaseApplication[] = [];\n FilteredApps: BaseApplication[] = [];\n SelectedIndex = 0;\n IsNavigating = false;\n\n constructor(\n private service: CommandPaletteService,\n private appManager: ApplicationManager,\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnInit(): void {\n // Subscribe to service's open/close state\n this.service.IsOpen.pipe(takeUntil(this.destroy$)).subscribe((isOpen) => {\n this.IsOpen = isOpen;\n\n if (isOpen) {\n this.onOpen();\n } else {\n this.onClose();\n }\n\n this.cdr.detectChanges();\n });\n\n // Subscribe to application changes\n this.appManager.AllApplications.pipe(takeUntil(this.destroy$)).subscribe((apps) => {\n this.AllApps = apps;\n this.filterAndSortApps();\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Called when command palette opens\n */\n private onOpen(): void {\n // Remember where focus came from BEFORE we take it, so Close() can hand it back.\n // The palette opens from a global Cmd+K, so the invoker is whatever had focus.\n const active = document.activeElement;\n this.invoker = active instanceof HTMLElement && active !== document.body ? active : null;\n\n // Reset state\n this.SearchQuery = '';\n this.SelectedIndex = 0;\n this.IsNavigating = false;\n\n // Filter apps (will show all initially)\n this.filterAndSortApps();\n\n // Focus search input after view updates\n setTimeout(() => {\n if (this.SearchInput) {\n this.SearchInput.nativeElement.focus();\n }\n }, 100);\n }\n\n /**\n * Called when command palette closes\n */\n private onClose(): void {\n this.SearchQuery = '';\n this.SelectedIndex = 0;\n this.IsNavigating = false;\n\n // Return focus to the invoker. Guarded on the invoker still being in the document —\n // selecting an app tears down the tab the invoker lived in, and focusing a detached\n // node silently drops focus to <body>, which is the very thing this prevents.\n const invoker = this.invoker;\n this.invoker = null;\n if (invoker && invoker.isConnected) {\n invoker.focus();\n }\n }\n\n /**\n * Focusable descendants of the modal, in DOM order — the trap's cycle.\n */\n private focusableInModal(): HTMLElement[] {\n const modal = this.PaletteModal?.nativeElement;\n if (!modal) {\n return [];\n }\n // No visibility filter is needed or wanted here: the entire modal lives inside an\n // `@if (IsOpen)`, so everything this matches is genuinely rendered. (An `offsetParent`\n // check would be actively wrong — the modal is positioned, and offsetParent is null for\n // fixed-position subtrees in some engines and for everything under jsdom.)\n const selector = 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n return Array.from(modal.querySelectorAll<HTMLElement>(selector));\n }\n\n /**\n * Keep Tab inside the dialog (WCAG 2.4.3 / 2.1.2). `aria-modal` tells a screen reader the\n * rest of the page is inert but does NOT stop Tab, so without this a keyboard user tabs\n * straight out of an open palette into the page behind it and cannot see where they are.\n */\n private trapTab(event: KeyboardEvent): void {\n const focusable = this.focusableInModal();\n if (focusable.length === 0) {\n event.preventDefault();\n return;\n }\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n const active = document.activeElement as HTMLElement | null;\n\n if (event.shiftKey && (active === first || !active || !this.PaletteModal?.nativeElement.contains(active))) {\n event.preventDefault();\n last.focus();\n }\n else if (!event.shiftKey && (active === last || !active || !this.PaletteModal?.nativeElement.contains(active))) {\n event.preventDefault();\n first.focus();\n }\n }\n\n /**\n * Handle search query change\n */\n OnSearchChange(): void {\n this.filterAndSortApps();\n this.SelectedIndex = 0; // Reset selection\n }\n\n /**\n * Filter and sort applications based on search query\n */\n private filterAndSortApps(): void {\n const query = this.SearchQuery.toLowerCase().trim();\n\n // If no query, show all apps\n if (!query) {\n this.FilteredApps = [...this.AllApps];\n return;\n }\n\n // Score all apps\n const scored = this.AllApps.map(app => ({\n app,\n score: this.calculateMatchScore(app, query)\n }));\n\n // Filter to only matches (score > 0)\n const matches = scored.filter(item => item.score > 0);\n\n // Sort by score (descending)\n matches.sort((a, b) => b.score - a.score);\n\n // Extract apps\n this.FilteredApps = matches.map(item => item.app);\n }\n\n /**\n * Calculate match score for fuzzy search\n *\n * Scoring:\n * - Exact match: 1000 points\n * - Starts with: 500 points\n * - Contains: 100 points\n * - Description match: 50 points\n * - Initials match: 25 points (e.g., \"de\" matches \"Data Explorer\")\n */\n private calculateMatchScore(app: BaseApplication, query: string): number {\n const name = app.Name.toLowerCase();\n const desc = (app.Description || '').toLowerCase();\n\n // Exact match (highest priority)\n if (name === query) return 1000;\n\n // Starts with query (very high priority)\n if (name.startsWith(query)) return 500;\n\n // Contains query in name (high priority)\n if (name.includes(query)) return 100;\n\n // Description match (medium priority)\n if (desc.includes(query)) return 50;\n\n // Fuzzy match - initials (e.g., \"de\" matches \"Data Explorer\")\n const initials = name\n .split(' ')\n .map(word => word[0] || '')\n .join('')\n .toLowerCase();\n if (initials.includes(query)) return 25;\n\n return 0; // No match\n }\n\n /**\n * Select an application and emit event for shell to handle navigation\n */\n SelectApp(app: BaseApplication): void {\n if (this.IsNavigating) return;\n // Close the palette first\n this.service.Close();\n // Emit event for shell to handle navigation (same pattern as app-switcher)\n this.AppSelected.emit(app.ID);\n }\n\n /**\n * Navigate to Knowledge Hub search with the current query.\n */\n SearchKnowledgeHub(): void {\n if (this.IsNavigating) return;\n const query = this.SearchQuery.trim();\n this.service.Close();\n this.KnowledgeSearchRequested.emit(query);\n }\n\n /**\n * Close the command palette\n */\n Close(): void {\n this.service.Close();\n }\n\n /**\n * Handle keyboard navigation\n */\n @HostListener('document:keydown', ['$event'])\n HandleKeyDown(event: KeyboardEvent): void {\n if (!this.IsOpen) return;\n\n // Tab is handled first: the INPUT guard below would otherwise let Tab fall through to\n // the browser and walk focus out of the dialog.\n if (event.key === 'Tab') {\n this.trapTab(event);\n return;\n }\n\n // Skip if user is typing in input (except for navigation keys)\n const target = event.target as HTMLElement;\n const navigationKeys = ['Escape', 'Enter', 'ArrowUp', 'ArrowDown'];\n if (target.tagName === 'INPUT' && !navigationKeys.includes(event.key)) {\n return;\n }\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n // Allow selecting up to FilteredApps.length (the Knowledge Hub action is at that index)\n this.SelectedIndex = Math.min(this.SelectedIndex + 1, this.maxSelectableIndex());\n this.scrollToSelected();\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n this.SelectedIndex = Math.max(this.SelectedIndex - 1, 0);\n this.scrollToSelected();\n break;\n\n case 'Enter':\n event.preventDefault();\n if (this.SelectedIndex < this.FilteredApps.length && this.FilteredApps[this.SelectedIndex]) {\n this.SelectApp(this.FilteredApps[this.SelectedIndex]);\n } else if (this.SearchQuery.trim().length > 0 && this.SelectedIndex === this.FilteredApps.length) {\n // Knowledge Hub search action is selected\n this.SearchKnowledgeHub();\n }\n break;\n\n case 'Escape':\n event.preventDefault();\n this.service.Close();\n break;\n }\n }\n\n /**\n * Get the maximum selectable index (apps + knowledge search action if query present)\n */\n private maxSelectableIndex(): number {\n const hasKnowledgeAction = this.SearchQuery.trim().length > 0;\n return hasKnowledgeAction ? this.FilteredApps.length : this.FilteredApps.length - 1;\n }\n\n /**\n * Ensure selected item is visible in results list\n */\n private scrollToSelected(): void {\n setTimeout(() => {\n const selected = document.querySelector('.result-item.selected');\n if (selected) {\n selected.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }, 0);\n }\n}\n","<!-- Backdrop -->\n@if (IsOpen) {\n <div class=\"command-palette-backdrop\"\n (click)=\"Close()\"\n role=\"presentation\"\n aria-hidden=\"true\">\n </div>\n}\n\n<!-- Modal -->\n@if (IsOpen) {\n <div class=\"command-palette-modal\"\n #paletteModal\n role=\"dialog\"\n aria-label=\"Search applications\"\n aria-modal=\"true\">\n <!-- Search Input -->\n <div class=\"search-container\">\n <i class=\"fa-solid fa-search search-icon\" aria-hidden=\"true\"></i>\n <input\n #searchInput\n type=\"text\"\n [(ngModel)]=\"SearchQuery\"\n (input)=\"OnSearchChange()\"\n placeholder=\"Search applications...\"\n class=\"search-input\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n aria-label=\"Search applications\">\n </div>\n <!-- Results List -->\n <div class=\"results-list\" role=\"listbox\" aria-label=\"Application results\">\n <!-- All Apps -->\n @for (app of FilteredApps; track app; let i = $index) {\n <div\n class=\"result-item\"\n [class.selected]=\"i === SelectedIndex\"\n (click)=\"SelectApp(app)\"\n role=\"option\"\n [attr.aria-selected]=\"i === SelectedIndex\">\n <i [class]=\"app.Icon\"\n [style.color]=\"app.GetColor()\"\n class=\"result-icon\"\n aria-hidden=\"true\"></i>\n <div class=\"result-info\">\n <div class=\"result-name\">{{ app.Name }}</div>\n @if (app.Description) {\n <div class=\"result-description\">{{ app.Description }}</div>\n }\n </div>\n </div>\n }\n <!-- Search Knowledge Hub Action -->\n @if (SearchQuery.trim().length > 0) {\n <div class=\"results-section-divider\">\n <span class=\"section-label\">Knowledge Search</span>\n </div>\n <div\n class=\"result-item result-item-action\"\n [class.selected]=\"FilteredApps.length === SelectedIndex\"\n (click)=\"SearchKnowledgeHub()\"\n role=\"option\">\n <i class=\"fa-solid fa-brain result-icon result-icon-knowledge\" aria-hidden=\"true\"></i>\n <div class=\"result-info\">\n <div class=\"result-name\">Search Knowledge Hub</div>\n <div class=\"result-description\">Search \"{{ SearchQuery }}\" across entities, documents, and content</div>\n </div>\n <kbd class=\"result-kbd\">Enter</kbd>\n </div>\n }\n <!-- Empty State -->\n @if (FilteredApps.length === 0 && SearchQuery) {\n <mj-empty-state\n Variant=\"no-results\"\n Size=\"compact\"\n Icon=\"fa-solid fa-magnifying-glass\"\n Title=\"No applications found\"\n Message=\"Try a different search term or search the Knowledge Hub\"\n role=\"status\"\n aria-live=\"polite\" />\n }\n </div>\n <!-- Loading State Overlay -->\n @if (IsNavigating) {\n <div class=\"loading-overlay\" role=\"status\" aria-live=\"assertive\" aria-label=\"Navigating to application\">\n <mj-loading size=\"small\" [showText]=\"false\"></mj-loading>\n </div>\n }\n </div>\n}\n"]}
|
|
1
|
+
{"version":3,"file":"command-palette.component.js","sourceRoot":"","sources":["../../../src/lib/command-palette/command-palette.component.ts","../../../src/lib/command-palette/command-palette.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqB,SAAS,EAAc,YAAY,EAAqB,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClJ,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;;;;;;;;;;;ICAzC,8BAGqB;IAFnB,wLAAS,cAAO,KAAC;IAGnB,iBAAM;;;IAyCM,+BAAgC;IAAA,YAAqB;IAAA,iBAAM;;;IAA3B,cAAqB;IAArB,wCAAqB;;;;IAb3D,+BAK6C;IAF3C,wNAAS,wBAAc,KAAC;IAGxB,wBAGuB;IAErB,AADF,+BAAyB,cACE;IAAA,YAAc;IAAA,iBAAM;IAC7C,8GAAuB;IAI3B,AADE,iBAAM,EACF;;;;;IAdJ,kEAAsC;;IAInC,cAAkB;IAAlB,0BAAkB;IACnB,0CAA8B;IAIL,eAAc;IAAd,iCAAc;IACvC,cAEC;IAFD,6CAEC;;;;IAOH,AADF,+BAAqC,eACP;IAAA,sBAAM;IACpC,AADoC,iBAAO,EACrC;IACN,+BAIgB;IADd,uMAAS,2BAAoB,KAAC;IAE9B,wBAAiG;IAE/F,AADF,+BAAyB,cACE;IAAA,iCAAiB;IAAA,iBAAM;IAChD,+BAAgC;IAAA,YAAkE;IACpG,AADoG,iBAAM,EACpG;IACN,gCAAwB;IAAA,sBAAK;IAC/B,AAD+B,iBAAM,EAC/B;;;IATJ,eAAwD;IAAxD,+EAAwD;IAMtB,eAAkE;IAAlE,oGAAkE;;;IAOtG,qCAOuB;;;IAFrB,iDAA4B;;;IAOhC,+BAAwG;IACtG,iCAAyD;IAC3D,iBAAM;;IADqB,cAAkB;IAAlB,gCAAkB;;;;IApE/C,AANF,iCAIoB,aAEY;IAC5B,uBAAiE;IACjE,mCASmC;IANjC,qTAAyB;IACzB,0LAAS,uBAAgB,KAAC;IAM9B,AAVE,iBASmC,EAC/B;IAEN,8BAA0E;IAExE,0HAkBC;IAED,8FAAuB;IAkBvB,qHAAgD;IAUlD,iBAAM;IAEN,0GAAoB;IAKtB,iBAAM;;;IAlEA,eAAyB;IAAzB,kDAAyB;IAW3B,eAkBC;IAlBD,kCAkBC;IAED,eAgBC;IAhBD,iDAgBC;IAED,cASC;IATD,kFASC;IAGH,cAIC;IAJD,+CAIC;;ADjFL;;;;;;;;;;;GAWG;AAOH,MAAM,OAAO,uBAAuB;IAoBxB;IACA;IACA;IArBF,QAAQ,GAAG,IAAI,OAAO,EAAQ,CAAC;IAEb,WAAW,CAAgC;IAC1C,YAAY,CAA2B;IAClE,+GAA+G;IACtG,UAAU,GAAG,KAAK,CAAC;IAClB,WAAW,GAAG,IAAI,YAAY,EAAU,CAAC;IACzC,wBAAwB,GAAG,IAAI,YAAY,EAAU,CAAC;IAEhE,MAAM,GAAG,KAAK,CAAC;IACf,WAAW,GAAG,EAAE,CAAC;IACjB,6EAA6E;IACrE,OAAO,GAAuB,IAAI,CAAC;IAC3C,OAAO,GAAsB,EAAE,CAAC;IAChC,YAAY,GAAsB,EAAE,CAAC;IACrC,aAAa,GAAG,CAAC,CAAC;IAClB,YAAY,GAAG,KAAK,CAAC;IAErB,YACU,OAA8B,EAC9B,UAA8B,EAC9B,GAAsB;QAFtB,YAAO,GAAP,OAAO,CAAuB;QAC9B,eAAU,GAAV,UAAU,CAAoB;QAC9B,QAAG,GAAH,GAAG,CAAmB;IAC7B,CAAC;IAEJ,QAAQ;QACN,0CAA0C;QAC1C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE;YACtE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YAErB,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,kFAAkF;QAClF,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;YAC7E,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,WAAW;QACT,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACK,MAAM;QACZ,iFAAiF;QACjF,+EAA+E;QAC/E,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC;QACtC,IAAI,CAAC,OAAO,GAAG,MAAM,YAAY,WAAW,IAAI,MAAM,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QAEzF,cAAc;QACd,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAE1B,wCAAwC;QACxC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,wCAAwC;QACxC,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;YACzC,CAAC;QACH,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC;IAED;;OAEG;IACK,OAAO;QACb,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAE1B,oFAAoF;QACpF,oFAAoF;QACpF,8EAA8E;QAC9E,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,OAAO,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,gBAAgB;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC;QAC/C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,kFAAkF;QAClF,uFAAuF;QACvF,wFAAwF;QACxF,2EAA2E;QAC3E,MAAM,QAAQ,GAAG,2IAA2I,CAAC;QAC7J,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAc,QAAQ,CAAC,CAAC,CAAC;IACnE,CAAC;IAED;;;;OAIG;IACK,OAAO,CAAC,KAAoB;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAmC,CAAC;QAE5D,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YAC1G,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;aACI,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YAC/G,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/D,CAAC;IAED,8EAA8E;IAC9E,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,yDAAyD,CAAC,CAAC,CAAC,6BAA6B,CAAC;IAC1H,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,kBAAkB;IAC5C,CAAC;IAED;;OAEG;IACK,iBAAiB;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QAEpD,6BAA6B;QAC7B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QAED,iBAAiB;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtC,GAAG;YACH,KAAK,EAAE,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,KAAK,CAAC;SAC5C,CAAC,CAAC,CAAC;QAEJ,qCAAqC;QACrC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAEtD,6BAA6B;QAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAE1C,eAAe;QACf,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;IAED;;;;;;;;;OASG;IACK,mBAAmB,CAAC,GAAoB,EAAE,KAAa;QAC7D,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAEnD,iCAAiC;QACjC,IAAI,IAAI,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC;QAEhC,yCAAyC;QACzC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,OAAO,GAAG,CAAC;QAEvC,yCAAyC;QACzC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,GAAG,CAAC;QAErC,sCAAsC;QACtC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAEpC,8DAA8D;QAC9D,MAAM,QAAQ,GAAG,IAAI;aAClB,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aAC1B,IAAI,CAAC,EAAE,CAAC;aACR,WAAW,EAAE,CAAC;QACjB,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAExC,OAAO,CAAC,CAAC,CAAC,WAAW;IACvB,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,GAAoB;QAC5B,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO;QAC9B,0BAA0B;QAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,2EAA2E;QAC3E,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED;;OAEG;IAEH,aAAa,CAAC,KAAoB;QAChC,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEzB,sFAAsF;QACtF,gDAAgD;QAChD,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC;YACxB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO;QACT,CAAC;QAED,+DAA+D;QAC/D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB,CAAC;QAC3C,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QACnE,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACtE,OAAO;QACT,CAAC;QAED,QAAQ,KAAK,CAAC,GAAG,EAAE,CAAC;YAClB,KAAK,WAAW;gBACd,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,8EAA8E;gBAC9E,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;gBACjF,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACxB,MAAM;YAER,KAAK,SAAS;gBACZ,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzD,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACxB,MAAM;YAER,KAAK,OAAO;gBACV,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,IAAI,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;oBAC3F,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;gBACxD,CAAC;qBAAM,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;oBACnF,6BAA6B;oBAC7B,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC5B,CAAC;gBACD,MAAM;YAER,KAAK,QAAQ;gBACX,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACrB,MAAM;QACV,CAAC;IACH,CAAC;IAED;;OAEG;IACK,kBAAkB;QACxB,OAAO,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IACxF,CAAC;IAED;;OAEG;IACK,gBAAgB;QACtB,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,uBAAuB,CAAC,CAAC;YACjE,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;YACpE,CAAC;QACH,CAAC,EAAE,CAAC,CAAC,CAAC;IACR,CAAC;iHA3TU,uBAAuB;6DAAvB,uBAAuB;;;;;;;YAAvB,sGAAA,yBAAqB,0BAAE;;YCvBpC,yFAAc;YASd,0FAAc;;YATd,qCAMC;YAGD,cA+EC;YA/ED,qCA+EC;;;iFDjEY,uBAAuB;cANnC,SAAS;6BACI,KAAK,YACP,oBAAoB;;kBAO7B,SAAS;mBAAC,aAAa;;kBACvB,SAAS;mBAAC,cAAc;;kBAExB,KAAK;;kBACL,MAAM;;kBACN,MAAM;;kBAiPN,YAAY;mBAAC,kBAAkB,EAAE,CAAC,QAAQ,CAAC;;kFAzPjC,uBAAuB","sourcesContent":["import { Component, OnInit, OnDestroy, ViewChild, ElementRef, HostListener, ChangeDetectorRef, Input, Output, EventEmitter } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { ApplicationManager, BaseApplication } from '@memberjunction/ng-base-application';\nimport { CommandPaletteService } from './command-palette.service';\n\n/**\n * Command Palette Component\n *\n * Provides a Notion-style command palette for quickly searching and navigating to applications.\n * Triggered by Cmd+K (Mac) or Ctrl+/ (Windows/Linux).\n *\n * Features:\n * - Fuzzy search with relevance scoring\n * - Keyboard navigation (arrow keys, enter, escape)\n * - Loading state during navigation\n * - Empty state with helpful message\n */\n@Component({\n standalone: false,\n selector: 'mj-command-palette',\n templateUrl: './command-palette.component.html',\n styleUrls: ['./command-palette.component.css']\n})\nexport class CommandPaletteComponent implements OnInit, OnDestroy {\n private destroy$ = new Subject<void>();\n\n @ViewChild('searchInput') SearchInput!: ElementRef<HTMLInputElement>;\n @ViewChild('paletteModal') PaletteModal?: ElementRef<HTMLElement>;\n /** Offers a \"Search everything\" row for the typed text. The host turns it on only when search is available. */\n @Input() ShowSearch = false;\n @Output() AppSelected = new EventEmitter<string>();\n @Output() KnowledgeSearchRequested = new EventEmitter<string>();\n\n IsOpen = false;\n SearchQuery = '';\n /** The element focus came from, so closing can hand it back (WCAG 2.4.3). */\n private invoker: HTMLElement | null = null;\n AllApps: BaseApplication[] = [];\n FilteredApps: BaseApplication[] = [];\n SelectedIndex = 0;\n IsNavigating = false;\n\n constructor(\n private service: CommandPaletteService,\n private appManager: ApplicationManager,\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnInit(): void {\n // Subscribe to service's open/close state\n this.service.IsOpen.pipe(takeUntil(this.destroy$)).subscribe((isOpen) => {\n this.IsOpen = isOpen;\n\n if (isOpen) {\n this.onOpen();\n } else {\n this.onClose();\n }\n\n this.cdr.detectChanges();\n });\n\n // The user's own apps — the same list Home, the app switcher and the omnibar show\n this.appManager.Applications.pipe(takeUntil(this.destroy$)).subscribe((apps) => {\n this.AllApps = apps;\n this.filterAndSortApps();\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Called when command palette opens\n */\n private onOpen(): void {\n // Remember where focus came from BEFORE we take it, so Close() can hand it back.\n // The palette opens from a global Cmd+K, so the invoker is whatever had focus.\n const active = document.activeElement;\n this.invoker = active instanceof HTMLElement && active !== document.body ? active : null;\n\n // Reset state\n this.SearchQuery = '';\n this.SelectedIndex = 0;\n this.IsNavigating = false;\n\n // Filter apps (will show all initially)\n this.filterAndSortApps();\n\n // Focus search input after view updates\n setTimeout(() => {\n if (this.SearchInput) {\n this.SearchInput.nativeElement.focus();\n }\n }, 100);\n }\n\n /**\n * Called when command palette closes\n */\n private onClose(): void {\n this.SearchQuery = '';\n this.SelectedIndex = 0;\n this.IsNavigating = false;\n\n // Return focus to the invoker. Guarded on the invoker still being in the document —\n // selecting an app tears down the tab the invoker lived in, and focusing a detached\n // node silently drops focus to <body>, which is the very thing this prevents.\n const invoker = this.invoker;\n this.invoker = null;\n if (invoker && invoker.isConnected) {\n invoker.focus();\n }\n }\n\n /**\n * Focusable descendants of the modal, in DOM order — the trap's cycle.\n */\n private focusableInModal(): HTMLElement[] {\n const modal = this.PaletteModal?.nativeElement;\n if (!modal) {\n return [];\n }\n // No visibility filter is needed or wanted here: the entire modal lives inside an\n // `@if (IsOpen)`, so everything this matches is genuinely rendered. (An `offsetParent`\n // check would be actively wrong — the modal is positioned, and offsetParent is null for\n // fixed-position subtrees in some engines and for everything under jsdom.)\n const selector = 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n return Array.from(modal.querySelectorAll<HTMLElement>(selector));\n }\n\n /**\n * Keep Tab inside the dialog (WCAG 2.4.3 / 2.1.2). `aria-modal` tells a screen reader the\n * rest of the page is inert but does NOT stop Tab, so without this a keyboard user tabs\n * straight out of an open palette into the page behind it and cannot see where they are.\n */\n private trapTab(event: KeyboardEvent): void {\n const focusable = this.focusableInModal();\n if (focusable.length === 0) {\n event.preventDefault();\n return;\n }\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n const active = document.activeElement as HTMLElement | null;\n\n if (event.shiftKey && (active === first || !active || !this.PaletteModal?.nativeElement.contains(active))) {\n event.preventDefault();\n last.focus();\n }\n else if (!event.shiftKey && (active === last || !active || !this.PaletteModal?.nativeElement.contains(active))) {\n event.preventDefault();\n first.focus();\n }\n }\n\n /** True when the \"Search everything\" row is shown, below the app results. */\n get HasSearchAction(): boolean {\n return this.ShowSearch && this.SearchQuery.trim().length > 0;\n }\n\n /** Empty-state hint; points at the search row only when that row is shown. */\n get NoResultsMessage(): string {\n return this.HasSearchAction ? 'Try a different search term, or search everything below' : 'Try a different search term';\n }\n\n /**\n * Handle search query change\n */\n OnSearchChange(): void {\n this.filterAndSortApps();\n this.SelectedIndex = 0; // Reset selection\n }\n\n /**\n * Filter and sort applications based on search query\n */\n private filterAndSortApps(): void {\n const query = this.SearchQuery.toLowerCase().trim();\n\n // If no query, show all apps\n if (!query) {\n this.FilteredApps = [...this.AllApps];\n return;\n }\n\n // Score all apps\n const scored = this.AllApps.map(app => ({\n app,\n score: this.calculateMatchScore(app, query)\n }));\n\n // Filter to only matches (score > 0)\n const matches = scored.filter(item => item.score > 0);\n\n // Sort by score (descending)\n matches.sort((a, b) => b.score - a.score);\n\n // Extract apps\n this.FilteredApps = matches.map(item => item.app);\n }\n\n /**\n * Calculate match score for fuzzy search\n *\n * Scoring:\n * - Exact match: 1000 points\n * - Starts with: 500 points\n * - Contains: 100 points\n * - Description match: 50 points\n * - Initials match: 25 points (e.g., \"de\" matches \"Data Explorer\")\n */\n private calculateMatchScore(app: BaseApplication, query: string): number {\n const name = app.Name.toLowerCase();\n const desc = (app.Description || '').toLowerCase();\n\n // Exact match (highest priority)\n if (name === query) return 1000;\n\n // Starts with query (very high priority)\n if (name.startsWith(query)) return 500;\n\n // Contains query in name (high priority)\n if (name.includes(query)) return 100;\n\n // Description match (medium priority)\n if (desc.includes(query)) return 50;\n\n // Fuzzy match - initials (e.g., \"de\" matches \"Data Explorer\")\n const initials = name\n .split(' ')\n .map(word => word[0] || '')\n .join('')\n .toLowerCase();\n if (initials.includes(query)) return 25;\n\n return 0; // No match\n }\n\n /**\n * Select an application and emit event for shell to handle navigation\n */\n SelectApp(app: BaseApplication): void {\n if (this.IsNavigating) return;\n // Close the palette first\n this.service.Close();\n // Emit event for shell to handle navigation (same pattern as app-switcher)\n this.AppSelected.emit(app.ID);\n }\n\n /**\n * Navigate to Knowledge Hub search with the current query.\n */\n SearchKnowledgeHub(): void {\n if (this.IsNavigating) return;\n const query = this.SearchQuery.trim();\n this.service.Close();\n this.KnowledgeSearchRequested.emit(query);\n }\n\n /**\n * Close the command palette\n */\n Close(): void {\n this.service.Close();\n }\n\n /**\n * Handle keyboard navigation\n */\n @HostListener('document:keydown', ['$event'])\n HandleKeyDown(event: KeyboardEvent): void {\n if (!this.IsOpen) return;\n\n // Tab is handled first: the INPUT guard below would otherwise let Tab fall through to\n // the browser and walk focus out of the dialog.\n if (event.key === 'Tab') {\n this.trapTab(event);\n return;\n }\n\n // Skip if user is typing in input (except for navigation keys)\n const target = event.target as HTMLElement;\n const navigationKeys = ['Escape', 'Enter', 'ArrowUp', 'ArrowDown'];\n if (target.tagName === 'INPUT' && !navigationKeys.includes(event.key)) {\n return;\n }\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n // Allow selecting up to FilteredApps.length (the search row is at that index)\n this.SelectedIndex = Math.min(this.SelectedIndex + 1, this.maxSelectableIndex());\n this.scrollToSelected();\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n this.SelectedIndex = Math.max(this.SelectedIndex - 1, 0);\n this.scrollToSelected();\n break;\n\n case 'Enter':\n event.preventDefault();\n if (this.SelectedIndex < this.FilteredApps.length && this.FilteredApps[this.SelectedIndex]) {\n this.SelectApp(this.FilteredApps[this.SelectedIndex]);\n } else if (this.HasSearchAction && this.SelectedIndex === this.FilteredApps.length) {\n // The search row is selected\n this.SearchKnowledgeHub();\n }\n break;\n\n case 'Escape':\n event.preventDefault();\n this.service.Close();\n break;\n }\n }\n\n /**\n * Get the maximum selectable index (apps + knowledge search action if query present)\n */\n private maxSelectableIndex(): number {\n return this.HasSearchAction ? this.FilteredApps.length : this.FilteredApps.length - 1;\n }\n\n /**\n * Ensure selected item is visible in results list\n */\n private scrollToSelected(): void {\n setTimeout(() => {\n const selected = document.querySelector('.result-item.selected');\n if (selected) {\n selected.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }, 0);\n }\n}\n","<!-- Backdrop -->\n@if (IsOpen) {\n <div class=\"command-palette-backdrop\"\n (click)=\"Close()\"\n role=\"presentation\"\n aria-hidden=\"true\">\n </div>\n}\n\n<!-- Modal -->\n@if (IsOpen) {\n <div class=\"command-palette-modal\"\n #paletteModal\n role=\"dialog\"\n aria-label=\"Search applications\"\n aria-modal=\"true\">\n <!-- Search Input -->\n <div class=\"search-container\">\n <i class=\"fa-solid fa-search search-icon\" aria-hidden=\"true\"></i>\n <input\n #searchInput\n type=\"text\"\n [(ngModel)]=\"SearchQuery\"\n (input)=\"OnSearchChange()\"\n placeholder=\"Search applications...\"\n class=\"search-input\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n aria-label=\"Search applications\">\n </div>\n <!-- Results List -->\n <div class=\"results-list\" role=\"listbox\" aria-label=\"Application results\">\n <!-- All Apps -->\n @for (app of FilteredApps; track app; let i = $index) {\n <div\n class=\"result-item\"\n [class.selected]=\"i === SelectedIndex\"\n (click)=\"SelectApp(app)\"\n role=\"option\"\n [attr.aria-selected]=\"i === SelectedIndex\">\n <i [class]=\"app.Icon\"\n [style.color]=\"app.GetColor()\"\n class=\"result-icon\"\n aria-hidden=\"true\"></i>\n <div class=\"result-info\">\n <div class=\"result-name\">{{ app.Name }}</div>\n @if (app.Description) {\n <div class=\"result-description\">{{ app.Description }}</div>\n }\n </div>\n </div>\n }\n <!-- Search Everything Action (only when the host has search turned on) -->\n @if (HasSearchAction) {\n <div class=\"results-section-divider\">\n <span class=\"section-label\">Search</span>\n </div>\n <div\n class=\"result-item result-item-action\"\n [class.selected]=\"FilteredApps.length === SelectedIndex\"\n (click)=\"SearchKnowledgeHub()\"\n role=\"option\">\n <i class=\"fa-solid fa-magnifying-glass result-icon result-icon-knowledge\" aria-hidden=\"true\"></i>\n <div class=\"result-info\">\n <div class=\"result-name\">Search everything</div>\n <div class=\"result-description\">Search \"{{ SearchQuery }}\" across entities, documents, and content</div>\n </div>\n <kbd class=\"result-kbd\">Enter</kbd>\n </div>\n }\n <!-- Empty State -->\n @if (FilteredApps.length === 0 && SearchQuery) {\n <mj-empty-state\n Variant=\"no-results\"\n Size=\"compact\"\n Icon=\"fa-solid fa-magnifying-glass\"\n Title=\"No applications found\"\n [Message]=\"NoResultsMessage\"\n role=\"status\"\n aria-live=\"polite\" />\n }\n </div>\n <!-- Loading State Overlay -->\n @if (IsNavigating) {\n <div class=\"loading-overlay\" role=\"status\" aria-live=\"assertive\" aria-label=\"Navigating to application\">\n <mj-loading size=\"small\" [showText]=\"false\"></mj-loading>\n </div>\n }\n </div>\n}\n"]}
|
|
@@ -20,25 +20,81 @@ export interface FeedbackRow {
|
|
|
20
20
|
export type RatingBand = 'all' | 'high' | 'mid' | 'low';
|
|
21
21
|
export type DateRange = 'all' | '1d' | '7d' | '30d' | '90d';
|
|
22
22
|
export declare class ConversationFeedbackResource extends BaseResourceComponent implements OnInit {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
IsInitializing: boolean;
|
|
24
|
+
/** @deprecated Use {@link IsInitializing}. */
|
|
25
|
+
get isInitializing(): boolean;
|
|
26
|
+
/** @deprecated Use {@link IsInitializing}. */
|
|
27
|
+
set isInitializing(value: boolean);
|
|
28
|
+
Loading: boolean;
|
|
29
|
+
/** @deprecated Use {@link Loading}. */
|
|
30
|
+
get loading(): boolean;
|
|
31
|
+
/** @deprecated Use {@link Loading}. */
|
|
32
|
+
set loading(value: boolean);
|
|
33
|
+
StatsLoading: boolean;
|
|
34
|
+
/** @deprecated Use {@link StatsLoading}. */
|
|
35
|
+
get statsLoading(): boolean;
|
|
36
|
+
/** @deprecated Use {@link StatsLoading}. */
|
|
37
|
+
set statsLoading(value: boolean);
|
|
26
38
|
error: string | null;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
39
|
+
RatingBand: RatingBand;
|
|
40
|
+
/** @deprecated Use {@link RatingBand}. */
|
|
41
|
+
get ratingBand(): RatingBand;
|
|
42
|
+
/** @deprecated Use {@link RatingBand}. */
|
|
43
|
+
set ratingBand(value: RatingBand);
|
|
44
|
+
DateRange: DateRange;
|
|
45
|
+
/** @deprecated Use {@link DateRange}. */
|
|
46
|
+
get dateRange(): DateRange;
|
|
47
|
+
/** @deprecated Use {@link DateRange}. */
|
|
48
|
+
set dateRange(value: DateRange);
|
|
49
|
+
SearchTerm: string;
|
|
50
|
+
/** @deprecated Use {@link SearchTerm}. */
|
|
51
|
+
get searchTerm(): string;
|
|
52
|
+
/** @deprecated Use {@link SearchTerm}. */
|
|
53
|
+
set searchTerm(value: string);
|
|
54
|
+
Rows: FeedbackRow[];
|
|
55
|
+
/** @deprecated Use {@link Rows}. */
|
|
56
|
+
get rows(): FeedbackRow[];
|
|
57
|
+
/** @deprecated Use {@link Rows}. */
|
|
58
|
+
set rows(value: FeedbackRow[]);
|
|
59
|
+
TotalRowCount: number;
|
|
60
|
+
/** @deprecated Use {@link TotalRowCount}. */
|
|
61
|
+
get totalRowCount(): number;
|
|
62
|
+
/** @deprecated Use {@link TotalRowCount}. */
|
|
63
|
+
set totalRowCount(value: number);
|
|
32
64
|
pageSize: number;
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
65
|
+
CurrentPage: number;
|
|
66
|
+
/** @deprecated Use {@link CurrentPage}. */
|
|
67
|
+
get currentPage(): number;
|
|
68
|
+
/** @deprecated Use {@link CurrentPage}. */
|
|
69
|
+
set currentPage(value: number);
|
|
70
|
+
readonly PageSizeOptions: number[];
|
|
71
|
+
/** @deprecated Use {@link PageSizeOptions}. */
|
|
72
|
+
get pageSizeOptions(): number[];
|
|
73
|
+
Stats: {
|
|
36
74
|
total: number;
|
|
37
75
|
avgRating: number;
|
|
38
76
|
percentPositive: number;
|
|
39
77
|
percentNegative: number;
|
|
40
78
|
};
|
|
41
|
-
|
|
79
|
+
/** @deprecated Use {@link Stats}. */
|
|
80
|
+
get stats(): {
|
|
81
|
+
total: number;
|
|
82
|
+
avgRating: number;
|
|
83
|
+
percentPositive: number;
|
|
84
|
+
percentNegative: number;
|
|
85
|
+
};
|
|
86
|
+
/** @deprecated Use {@link Stats}. */
|
|
87
|
+
set stats(value: {
|
|
88
|
+
total: number;
|
|
89
|
+
avgRating: number;
|
|
90
|
+
percentPositive: number;
|
|
91
|
+
percentNegative: number;
|
|
92
|
+
});
|
|
93
|
+
SelectedRow: FeedbackRow | null;
|
|
94
|
+
/** @deprecated Use {@link SelectedRow}. */
|
|
95
|
+
get selectedRow(): FeedbackRow | null;
|
|
96
|
+
/** @deprecated Use {@link SelectedRow}. */
|
|
97
|
+
set selectedRow(value: FeedbackRow | null);
|
|
42
98
|
private searchDebounceTimer;
|
|
43
99
|
private cdr;
|
|
44
100
|
private appManager;
|
|
@@ -46,30 +102,62 @@ export declare class ConversationFeedbackResource extends BaseResourceComponent
|
|
|
46
102
|
GetResourceIconClass(): Promise<string>;
|
|
47
103
|
ngOnInit(): Promise<void>;
|
|
48
104
|
/** Manual refresh from the page header — same path as a filter change. */
|
|
105
|
+
LoadFeedback(): Promise<void>;
|
|
106
|
+
/** @deprecated Use {@link LoadFeedback}. */
|
|
49
107
|
loadFeedback(): Promise<void>;
|
|
108
|
+
SetBand(band: RatingBand): void;
|
|
109
|
+
/** @deprecated Use {@link SetBand}. */
|
|
50
110
|
setBand(band: RatingBand): void;
|
|
111
|
+
SetDateRange(range: DateRange): void;
|
|
112
|
+
/** @deprecated Use {@link SetDateRange}. */
|
|
51
113
|
setDateRange(range: DateRange): void;
|
|
52
114
|
/**
|
|
53
115
|
* Search input fires on every keystroke; debounce so we don't slam the
|
|
54
116
|
* server while the user is typing. 250ms is enough to feel responsive
|
|
55
117
|
* without firing on intermediate states.
|
|
56
118
|
*/
|
|
119
|
+
OnSearchChange(): void;
|
|
120
|
+
/** @deprecated Use {@link OnSearchChange}. */
|
|
57
121
|
onSearchChange(): void;
|
|
122
|
+
OnPageChange(event: {
|
|
123
|
+
PageNumber: number;
|
|
124
|
+
PageSize: number;
|
|
125
|
+
StartRow: number;
|
|
126
|
+
}): void;
|
|
127
|
+
/** @deprecated Use {@link OnPageChange}. */
|
|
58
128
|
onPageChange(event: {
|
|
59
129
|
PageNumber: number;
|
|
60
130
|
PageSize: number;
|
|
61
131
|
StartRow: number;
|
|
62
132
|
}): void;
|
|
133
|
+
OnPageSizeChange(size: number): void;
|
|
134
|
+
/** @deprecated Use {@link OnPageSizeChange}. */
|
|
63
135
|
onPageSizeChange(size: number): void;
|
|
136
|
+
OpenDrawer(row: FeedbackRow): void;
|
|
137
|
+
/** @deprecated Use {@link OpenDrawer}. */
|
|
64
138
|
openDrawer(row: FeedbackRow): void;
|
|
139
|
+
CloseDrawer(): void;
|
|
140
|
+
/** @deprecated Use {@link CloseDrawer}. */
|
|
65
141
|
closeDrawer(): void;
|
|
142
|
+
OpenConversation(): Promise<void>;
|
|
143
|
+
/** @deprecated Use {@link OpenConversation}. */
|
|
66
144
|
openConversation(): Promise<void>;
|
|
67
145
|
onEscape(): void;
|
|
146
|
+
BandClassFor(rating: number): string;
|
|
147
|
+
/** @deprecated Use {@link BandClassFor}. */
|
|
68
148
|
bandClassFor(rating: number): string;
|
|
69
|
-
|
|
149
|
+
TrackByRatingID: (_: number, row: FeedbackRow) => string;
|
|
150
|
+
/** @deprecated Use {@link TrackByRatingID}. */
|
|
151
|
+
get trackByRatingID(): (_: number, row: FeedbackRow) => string;
|
|
152
|
+
/** @deprecated Use {@link TrackByRatingID}. */
|
|
153
|
+
set trackByRatingID(value: (_: number, row: FeedbackRow) => string);
|
|
70
154
|
/** 1-based index of the first row on the current page (0 when empty). */
|
|
155
|
+
get RangeStart(): number;
|
|
156
|
+
/** @deprecated Use {@link RangeStart}. */
|
|
71
157
|
get rangeStart(): number;
|
|
72
158
|
/** 1-based index of the last row on the current page (clamped to total). */
|
|
159
|
+
get RangeEnd(): number;
|
|
160
|
+
/** @deprecated Use {@link RangeEnd}. */
|
|
73
161
|
get rangeEnd(): number;
|
|
74
162
|
/**
|
|
75
163
|
* True when the filtered set fits on a single page — in this case
|
|
@@ -77,6 +165,8 @@ export declare class ConversationFeedbackResource extends BaseResourceComponent
|
|
|
77
165
|
* line. When false we let mj-pagination own the bar (it has its own
|
|
78
166
|
* `1-N of M` summary on the left + nav controls on the right).
|
|
79
167
|
*/
|
|
168
|
+
get IsSinglePage(): boolean;
|
|
169
|
+
/** @deprecated Use {@link IsSinglePage}. */
|
|
80
170
|
get isSinglePage(): boolean;
|
|
81
171
|
/**
|
|
82
172
|
* Run both the rows-query (paged) and the stats-query (aggregate) against
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-feedback.d.ts","sourceRoot":"","sources":["../../../src/lib/conversation-feedback/conversation-feedback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAA2C,MAAM,eAAe,CAAC;AAE3F,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;;AAIlE,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AACxD,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC;AAE5D,qBAOa,4BAA6B,SAAQ,qBAAsB,YAAW,MAAM;IACvF,cAAc,UAAQ;
|
|
1
|
+
{"version":3,"file":"conversation-feedback.d.ts","sourceRoot":"","sources":["../../../src/lib/conversation-feedback/conversation-feedback.ts"],"names":[],"mappings":"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"}
|