@memberjunction/ng-explorer-core 5.4.1 → 5.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.d.ts.map +1 -1
- package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js +7 -6
- package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js.map +1 -1
- package/dist/lib/resource-wrappers/chat-conversations-resource.component.js +2 -2
- package/dist/lib/resource-wrappers/chat-conversations-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/dashboard-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/dashboard-resource.component.js +16 -5
- package/dist/lib/resource-wrappers/dashboard-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/view-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/view-resource.component.js +13 -3
- package/dist/lib/resource-wrappers/view-resource.component.js.map +1 -1
- package/dist/lib/shell/components/header/app-switcher.component.d.ts +4 -0
- package/dist/lib/shell/components/header/app-switcher.component.d.ts.map +1 -1
- package/dist/lib/shell/components/header/app-switcher.component.js +15 -6
- package/dist/lib/shell/components/header/app-switcher.component.js.map +1 -1
- package/dist/lib/shell/shell.component.d.ts +2 -0
- package/dist/lib/shell/shell.component.d.ts.map +1 -1
- package/dist/lib/shell/shell.component.js +28 -15
- package/dist/lib/shell/shell.component.js.map +1 -1
- 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 +4 -3
- package/dist/lib/single-list-detail/single-list-detail.component.js.map +1 -1
- package/dist/lib/single-record/single-record.component.d.ts +1 -0
- package/dist/lib/single-record/single-record.component.d.ts.map +1 -1
- package/dist/lib/single-record/single-record.component.js +3 -1
- package/dist/lib/single-record/single-record.component.js.map +1 -1
- package/dist/lib/single-search-result/single-search-result.component.d.ts +41 -6
- 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 +291 -13
- package/dist/lib/single-search-result/single-search-result.component.js.map +1 -1
- package/dist/lib/user-notifications/user-notifications.component.js +3 -3
- package/dist/lib/user-notifications/user-notifications.component.js.map +1 -1
- package/dist/lib/user-profile/user-profile.component.d.ts.map +1 -1
- package/dist/lib/user-profile/user-profile.component.js +3 -2
- package/dist/lib/user-profile/user-profile.component.js.map +1 -1
- package/package.json +34 -34
package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-preferences-dialog.component.d.ts","sourceRoot":"","sources":["../../../src/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAsC,MAAM,wBAAwB,CAAC;AAEzF,OAAO,EAAE,yBAAyB,EAAE,+BAA+B,EAAuB,MAAM,+BAA+B,CAAC;;
|
|
1
|
+
{"version":3,"file":"dashboard-preferences-dialog.component.d.ts","sourceRoot":"","sources":["../../../src/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAsC,MAAM,wBAAwB,CAAC;AAEzF,OAAO,EAAE,yBAAyB,EAAE,+BAA+B,EAAuB,MAAM,+BAA+B,CAAC;;AAGhI,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,+BAA+B,EAAE,CAAC;CACjD;AAED,qBAMa,mCAAoC,YAAW,MAAM;IAChD,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IACpC,KAAK,EAAE,QAAQ,GAAG,KAAK,CAAY;IAClC,MAAM,2CAAkD;IAElE,mBAAmB,EAAE,yBAAyB,EAAE,CAAM;IACtD,oBAAoB,EAAE,yBAAyB,EAAE,CAAM;IACvD,eAAe,EAAE,MAAM,CAAM;IAC7B,OAAO,EAAE,OAAO,CAAQ;IACxB,MAAM,EAAE,OAAO,CAAS;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC5B,UAAU,EAAE,OAAO,CAAS;IAC5B,UAAU,EAAE,OAAO,CAAS;IAC5B,cAAc,EAAE,UAAU,GAAG,QAAQ,CAAc;IAE1D,OAAO,CAAC,qBAAqB,CAAgB;IAC7C,OAAO,CAAC,sBAAsB,CAAyC;IACvE,OAAO,CAAC,sBAAsB,CAAmC;IAE3D,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAWjB,QAAQ;YA8CR,mBAAmB;YAiBnB,sBAAsB;IAgCpC,OAAO,CAAC,eAAe;IAchB,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,yBAAyB,EAAE,CAAC,GAAG,IAAI;IAgC7D,YAAY,CAAC,SAAS,EAAE,yBAAyB,GAAG,IAAI;IAmBxD,eAAe,CAAC,SAAS,EAAE,yBAAyB,GAAG,IAAI;IAoBrD,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBpD,OAAO,CAAC,eAAe;IAoBV,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAqI7B,QAAQ,IAAI,IAAI;yCA9XZ,mCAAmC;2CAAnC,mCAAmC;CAiY/C"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
2
|
import { moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop';
|
|
3
3
|
import { LogError, Metadata, RunView } from '@memberjunction/core';
|
|
4
|
+
import { UUIDsEqual } from '@memberjunction/global';
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
5
6
|
import * as i1 from "@angular/forms";
|
|
6
7
|
import * as i2 from "@progress/kendo-angular-dialog";
|
|
@@ -236,7 +237,7 @@ export class DashboardPreferencesDialogComponent {
|
|
|
236
237
|
return d.Scope === 'Global' && !d.ApplicationID;
|
|
237
238
|
}
|
|
238
239
|
else {
|
|
239
|
-
return d.ApplicationID
|
|
240
|
+
return UUIDsEqual(d.ApplicationID, this.applicationId); // ignore scope for dashboards that match app id, sometimes they have a global scope as they can be shown globally as well as app specific
|
|
240
241
|
}
|
|
241
242
|
});
|
|
242
243
|
// Load current user preferences
|
|
@@ -254,7 +255,7 @@ export class DashboardPreferencesDialogComponent {
|
|
|
254
255
|
const ds = await md.GetAndCacheDatasetByName("MJ_Metadata");
|
|
255
256
|
const appList = ds.Results.find(r => r.Code === 'Applications');
|
|
256
257
|
if (appList) {
|
|
257
|
-
const app = appList.Results.find((a) => a.ID
|
|
258
|
+
const app = appList.Results.find((a) => UUIDsEqual(a.ID, this.applicationId));
|
|
258
259
|
this.applicationName = app?.Name || 'Unknown Application';
|
|
259
260
|
}
|
|
260
261
|
}
|
|
@@ -293,7 +294,7 @@ export class DashboardPreferencesDialogComponent {
|
|
|
293
294
|
const configuredIds = new Set(this.currentUserPreferences.map(p => p.DashboardID));
|
|
294
295
|
// Get configured dashboards in the right order
|
|
295
296
|
this.configuredDashboards = this.currentUserPreferences
|
|
296
|
-
.map(pref => this.allAvailableDashboards.find(d => d.ID
|
|
297
|
+
.map(pref => this.allAvailableDashboards.find(d => UUIDsEqual(d.ID, pref.DashboardID)))
|
|
297
298
|
.filter((d) => d !== undefined);
|
|
298
299
|
// Get available dashboards (not configured)
|
|
299
300
|
this.availableDashboards = this.allAvailableDashboards
|
|
@@ -327,7 +328,7 @@ export class DashboardPreferencesDialogComponent {
|
|
|
327
328
|
}
|
|
328
329
|
addDashboard(dashboard) {
|
|
329
330
|
try {
|
|
330
|
-
const index = this.availableDashboards.findIndex(d => d.ID
|
|
331
|
+
const index = this.availableDashboards.findIndex(d => UUIDsEqual(d.ID, dashboard.ID));
|
|
331
332
|
if (index !== -1) {
|
|
332
333
|
this.availableDashboards.splice(index, 1);
|
|
333
334
|
this.configuredDashboards.push(dashboard);
|
|
@@ -345,7 +346,7 @@ export class DashboardPreferencesDialogComponent {
|
|
|
345
346
|
}
|
|
346
347
|
removeDashboard(dashboard) {
|
|
347
348
|
try {
|
|
348
|
-
const index = this.configuredDashboards.findIndex(d => d.ID
|
|
349
|
+
const index = this.configuredDashboards.findIndex(d => UUIDsEqual(d.ID, dashboard.ID));
|
|
349
350
|
if (index !== -1) {
|
|
350
351
|
this.configuredDashboards.splice(index, 1);
|
|
351
352
|
this.availableDashboards.push(dashboard);
|
|
@@ -567,5 +568,5 @@ export class DashboardPreferencesDialogComponent {
|
|
|
567
568
|
}], result: [{
|
|
568
569
|
type: Output
|
|
569
570
|
}] }); })();
|
|
570
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(DashboardPreferencesDialogComponent, { className: "DashboardPreferencesDialogComponent", filePath: "src/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.ts", lineNumber:
|
|
571
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(DashboardPreferencesDialogComponent, { className: "DashboardPreferencesDialogComponent", filePath: "src/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.ts", lineNumber: 18 }); })();
|
|
571
572
|
//# sourceMappingURL=dashboard-preferences-dialog.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-preferences-dialog.component.js","sourceRoot":"","sources":["../../../src/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.ts","../../../src/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAU,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAe,eAAe,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACzF,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;;;;;;;;;ICS3D,wBAAiC;IAAC,8BACpC;;;IACE,wBAAuC;IAAC,YAC1C;;;IAD0C,cAC1C;IAD0C,oEAC1C;;;;IAKI,AADF,AADF,8BAAsC,YAC7B,gBAKsC;IADpC,uUAA4B;IAC5B,wMAAU,+BAAwB,KAAC;IAJ1C,iBAI2C;IAC3C,sCACF;IAAA,iBAAQ;IAEN,AADF,6BAAO,gBAKsC;IADpC,uUAA4B;IAC5B,wMAAU,+BAAwB,KAAC;IAJ1C,iBAI2C;IAC3C,iCACF;IACF,AADE,iBAAQ,EACJ;;;IAZK,eAA4B;IAA5B,qDAA4B;IAQ5B,eAA4B;IAA5B,qDAA4B;;;IAUvC,8BAA6B;IAC3B,iCAAoE;IACtE,iBAAM;;;IAIN,+BAA6B;IAC3B,wBAAgD;IAChD,YACF;IAAA,iBAAM;;;IADJ,eACF;IADE,6CACF;;;IAgBQ,+BAAyB;IACvB,wBAAuC;IACvC,+CACF;IAAA,iBAAM;;;IAYE,gCAAoC;IAAA,YAA2B;IAAA,iBAAO;;;IAAlC,cAA2B;IAA3B,8CAA2B;;;;IALrE,AAHF,+BAE+B,cACO;IAClC,wBAAqD;IAEnD,AADF,+BAA4B,eACG;IAAA,YAAoB;IAAA,iBAAO;IACxD,4HAA6B;IAG/B,iBAAM;IACN,kCAG6C;IADrC,8OAAS,iCAAuB,KAAC;IAEvC,wBAAgC;IAGtC,AADE,AADE,iBAAS,EACL,EACF;;;IAhBD,0CAAyB;IAIK,eAAoB;IAApB,uCAAoB;IACjD,cAEC;IAFD,mDAEC;;;IAyBP,+BAAyB;IACvB,wBAAuC;IACvC,0CACF;IAAA,iBAAM;;;IAaE,gCAAoC;IAAA,YAA2B;IAAA,iBAAO;;;IAAlC,cAA2B;IAA3B,8CAA2B;;;;IANrE,AAHF,+BAE+B,cACO;IAClC,wBAAqD;IACrD,gCAA2B;IAAA,YAAW;IAAA,iBAAO;IAE3C,AADF,+BAA4B,eACG;IAAA,YAAoB;IAAA,iBAAO;IACxD,6HAA6B;IAG/B,iBAAM;IACN,kCAGkD;IAD1C,+OAAS,oCAA0B,KAAC;IAE1C,yBAAiC;IAGvC,AADE,AADE,iBAAS,EACL,EACF;;;;IAjBD,0CAAyB;IAGC,eAAW;IAAX,wCAAW;IAEP,eAAoB;IAApB,uCAAoB;IACjD,cAEC;IAFD,mDAEC;;;;IAnEX,AADF,AAFF,+BAAgC,cAEK,SAC7B;IAAA,wBAAgC;IAAC,qCAAoB;IAAA,iBAAK;IAC9D,kCAK2C;IAAtC,qOAAsB,qBAAc,KAAC;IAExC,qHAAwC;IAOxC,sHAoBC;IAEL,AADE,iBAAM,EACF;IAIJ,AADF,gCAAoC,UAC9B;IAAA,yBAAmC;IAAC,uCAAqB;IAAA,iBAAK;IAClE,mCAK2C;IAAtC,sOAAsB,qBAAc,KAAC;IAExC,uHAAyC;IAOzC,yHAqBC;IAGP,AADE,AADE,iBAAM,EACF,EACF;;;;;IA5EG,eAAuC;IACvC,AADA,4DAAuC,0EACI;IAG9C,eAKC;IALD,kEAKC;IAED,cAoBC;IApBD,yCAoBC;IAUE,eAAwC;IACxC,AADA,6DAAwC,wEACE;IAG7C,eAKC;IALD,oEAKC;IAED,cAqBC;IArBD,0CAqBC;;;IAkBL,iCAAyD;IACzD,2BACF;;IAFc,gCAAkB;;;IAG9B,wBAAiC;IAAC,8BACpC;;AD3IN,MAAM,OAAO,mCAAmC;IAC9B,aAAa,GAAkB,IAAI,CAAC;IACpC,KAAK,GAAqB,QAAQ,CAAC;IAClC,MAAM,GAAG,IAAI,YAAY,EAA8B,CAAC;IAElE,mBAAmB,GAAgC,EAAE,CAAC;IACtD,oBAAoB,GAAgC,EAAE,CAAC;IACvD,eAAe,GAAW,EAAE,CAAC;IAC7B,OAAO,GAAY,IAAI,CAAC;IACxB,MAAM,GAAY,KAAK,CAAC;IACxB,KAAK,GAAkB,IAAI,CAAC;IAC5B,UAAU,GAAY,KAAK,CAAC;IAC5B,UAAU,GAAY,KAAK,CAAC;IAC5B,cAAc,GAA0B,UAAU,CAAC;IAElD,qBAAqB,GAAa,EAAE,CAAC;IACrC,sBAAsB,GAAsC,EAAE,CAAC;IAC/D,sBAAsB,GAAgC,EAAE,CAAC;IAEjE,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,iDAAiD,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YACzE,IAAI,CAAC,KAAK,GAAG,sCAAsC,CAAC;QACtD,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,QAAQ;QACpB,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;QAE1B,oCAAoC;QACpC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAElD,qEAAqE;QACrE,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC;QAEjC,8CAA8C;QAC9C,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC/C,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACnC,CAAC;QAED,iDAAiD;QACjD,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,wBAAwB,CAAC,aAAa,CAAC,CAAC;QAC5D,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,EAAE,EAAE,MAAM,IAAI,iCAAiC,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;QAC/D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QAED,6BAA6B;QAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,uBAAuB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,4BAA4B,CAAC;QACnH,IAAI,CAAC,sBAAsB,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAA4B,EAAE,EAAE;YACrF,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC5B,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,CAAC,aAAa,KAAK,IAAI,CAAC,aAAa,CAAC,CAAC,0IAA0I;YAC3L,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,gCAAgC;QAChC,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAEpC,iDAAiD;QACjD,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,yCAAyC;QACzC,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;IAEO,KAAK,CAAC,mBAAmB;QAC/B,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,OAAO;QAEhC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,wBAAwB,CAAC,aAAa,CAAC,CAAC;YAC5D,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;YAChE,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAsB,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,aAAa,CAAC,CAAC;gBAC1F,IAAI,CAAC,eAAe,GAAG,GAAG,EAAE,IAAI,IAAI,qBAAqB,CAAC;YAC5D,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,gCAAgC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YACxD,IAAI,CAAC,eAAe,GAAG,qBAAqB,CAAC;QAC/C,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,sBAAsB;QAClC,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;QAE1B,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,uBAAuB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACzF,MAAM,aAAa,GAAG,UAAU,IAAI,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC;QAE1D,IAAI,MAAc,CAAC;QAEnB,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,cAAc,KAAK,QAAQ,EAAE,CAAC;YACnF,6CAA6C;YAC7C,MAAM,GAAG,sBAAsB,aAAa,EAAE,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,gFAAgF;YAChF,kGAAkG;YAClG,mFAAmF;YACnF,MAAM,GAAG,WAAW,EAAE,CAAC,WAAW,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;QAChE,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,MAAM,CAAC,CAAC;QAExD,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,OAAO,CAAkC;YACpE,UAAU,EAAE,gCAAgC;YAC5C,WAAW,EAAE,MAAM;YACnB,UAAU,EAAE,eAAe;YAC3B,OAAO,EAAE,cAAc;SACxB,CAAC,CAAC;QAEH,IAAI,CAAC,sBAAsB,GAAG,WAAW,EAAE,OAAO,IAAI,EAAE,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACzE,CAAC;IAEO,eAAe;QACrB,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QAEnF,+CAA+C;QAC/C,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,sBAAsB;aACpD,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,WAAW,CAAC,CAAC;aAC7E,MAAM,CAAC,CAAC,CAAC,EAAkC,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;QAElE,4CAA4C;QAC5C,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,sBAAsB;aACnD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aACrC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,CAAC;IAEM,MAAM,CAAC,KAA+C;QAC3D,IAAI,CAAC;YACH,IAAI,KAAK,CAAC,iBAAiB,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;gBAChD,kCAAkC;gBAClC,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;YACjF,CAAC;iBAAM,CAAC;gBACN,uBAAuB;gBACvB,iBAAiB,CACf,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAC5B,KAAK,CAAC,SAAS,CAAC,IAAI,EACpB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,YAAY,CACnB,CAAC;gBAEF,8DAA8D;gBAC9D,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBACvD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBACxE,CAAC;YACH,CAAC;YAED,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,8BAA8B,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YACtD,IAAI,CAAC,KAAK,GAAG,gDAAgD,CAAC;YAE9D,8BAA8B;YAC9B,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YACpB,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAEM,YAAY,CAAC,SAAoC;QACtD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,CAAC,CAAC;YAC7E,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBACjB,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC1C,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC1C,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,wBAAwB,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAChD,IAAI,CAAC,KAAK,GAAG,2CAA2C,CAAC;YAEzD,8BAA8B;YAC9B,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YACpB,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAEM,eAAe,CAAC,SAAoC;QACzD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,CAAC,CAAC;YAC9E,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBACjB,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC3C,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACzC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBACtE,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,0BAA0B,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAClD,IAAI,CAAC,KAAK,GAAG,6CAA6C,CAAC;YAE3D,8BAA8B;YAC9B,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YACpB,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,sBAAsB;QACjC,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAElB,mCAAmC;YACnC,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC;YACpC,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAE1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,gCAAgC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YACxD,IAAI,CAAC,KAAK,GAAG,8CAA8C,CAAC;QAC9D,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,CAAC;IACH,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC;YACH,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAEtE,8CAA8C;YAC9C,IAAI,CAAC,UAAU,GAAG,oBAAoB,CAAC,MAAM,KAAK,IAAI,CAAC,qBAAqB,CAAC,MAAM;gBAClE,oBAAoB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC;YAEpG,gBAAgB;YAChB,OAAO,CAAC,GAAG,CAAC,qCAAqC,EAAE;gBACjD,QAAQ,EAAE,IAAI,CAAC,qBAAqB;gBACpC,OAAO,EAAE,oBAAoB;gBAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;aAC5B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,4BAA4B,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YACpD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,MAAM;QACjB,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;YACrF,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,mDAAmD,EAAE,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAEnI,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;YAEzB,0CAA0C;YAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,KAAK,QAAQ;gBAC3C,CAAC,CAAC,0CAA0C;gBAC5C,CAAC,CAAC,kCAAkC,IAAI,CAAC,aAAa,GAAG,CAAC;YAE5D,IAAI,UAAkB,CAAC;YAEvB,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,cAAc,KAAK,QAAQ,EAAE,CAAC;gBACnF,2BAA2B;gBAC3B,UAAU,GAAG,sBAAsB,aAAa,EAAE,CAAC;YACrD,CAAC;iBAAM,CAAC;gBACN,gCAAgC;gBAChC,UAAU,GAAG,WAAW,EAAE,CAAC,WAAW,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;YACpE,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,2CAA2C,EAAE,UAAU,CAAC,CAAC;YAErE,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC,OAAO,CAAkC;gBACtE,UAAU,EAAE,gCAAgC;gBAC5C,WAAW,EAAE,UAAU;gBACvB,UAAU,EAAE,eAAe;aAC5B,CAAC,CAAC;YAEH,MAAM,mBAAmB,GAAG,aAAa,EAAE,OAAO,IAAI,EAAE,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;YAEvE,oCAAoC;YACpC,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAA2C,CAAC;YACjF,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBACjC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YACpD,CAAC,CAAC,CAAC;YAEH,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAEjF,2DAA2D;YAC3D,MAAM,aAAa,GAAG,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;YACxG,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;YAE5D,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;gBACpE,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;oBACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,IAAI,CAAC,YAAY,EAAE,OAAO,IAAI,eAAe,CAAC;oBAC3F,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,EAAE,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;YAED,yDAAyD;YACzD,MAAM,cAAc,GAAsC,EAAE,CAAC;YAE7D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;gBAC/C,MAAM,eAAe,GAAG,CAAC,GAAG,CAAC,CAAC;gBAE9B,IAAI,UAAU,GAAG,qBAAqB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBAEzD,IAAI,UAAU,EAAE,CAAC;oBACf,6BAA6B;oBAC7B,OAAO,CAAC,GAAG,CAAC,8CAA8C,SAAS,CAAC,IAAI,gBAAgB,eAAe,EAAE,CAAC,CAAC;oBAC3G,UAAU,CAAC,YAAY,GAAG,eAAe,CAAC;oBAE1C,IAAI,CAAC,MAAM,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;wBAC7B,MAAM,QAAQ,GAAG,UAAU,CAAC,YAAY,EAAE,KAAK,IAAI,UAAU,CAAC,YAAY,EAAE,OAAO,IAAI,eAAe,CAAC;wBACvG,MAAM,IAAI,KAAK,CAAC,6CAA6C,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC,CAAC;oBAC9F,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,wBAAwB;oBACxB,OAAO,CAAC,GAAG,CAAC,yCAAyC,SAAS,CAAC,IAAI,YAAY,eAAe,EAAE,CAAC,CAAC;oBAClG,UAAU,GAAG,MAAM,EAAE,CAAC,eAAe,CAAkC,gCAAgC,CAAC,CAAC;oBAEzG,sCAAsC;oBACtC,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,cAAc,KAAK,QAAQ,EAAE,CAAC;wBACnF,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,iBAAiB;oBAC7C,CAAC;yBAAM,CAAC;wBACN,UAAU,CAAC,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,sBAAsB;oBAC/D,CAAC;oBAED,UAAU,CAAC,WAAW,GAAG,SAAS,CAAC,EAAE,CAAC;oBACtC,UAAU,CAAC,YAAY,GAAG,eAAe,CAAC;oBAC1C,UAAU,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;oBAC9B,UAAU,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;oBAE9C,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE;wBACzC,MAAM,EAAE,UAAU,CAAC,MAAM;wBACzB,WAAW,EAAE,UAAU,CAAC,WAAW;wBACnC,YAAY,EAAE,UAAU,CAAC,YAAY;wBACrC,KAAK,EAAE,UAAU,CAAC,KAAK;wBACvB,aAAa,EAAE,UAAU,CAAC,aAAa;qBACxC,CAAC,CAAC;oBAEH,IAAI,CAAC,MAAM,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;wBAC7B,MAAM,QAAQ,GAAG,UAAU,CAAC,YAAY,EAAE,KAAK,IAAI,UAAU,CAAC,YAAY,EAAE,OAAO,IAAI,eAAe,CAAC;wBACvG,MAAM,IAAI,KAAK,CAAC,6CAA6C,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC,CAAC;oBAC9F,CAAC;gBACH,CAAC;gBAED,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAClC,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;YAE5E,sBAAsB;YACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,KAAK,EAAE,IAAI;gBACX,WAAW,EAAE,cAAc;aAC5B,CAAC,CAAC;QAEL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;YACpC,QAAQ,CAAC,oCAAoC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAC5D,IAAI,CAAC,KAAK,GAAG,+BAA+B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;YAEvG,8BAA8B;YAC9B,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YACpB,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IAEM,QAAQ;QACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACrC,CAAC;6HAhYU,mCAAmC;6DAAnC,mCAAmC;YChBhD,uCAKmC;YAArB,sHAAS,cAAU,IAAC;YAG9B,AADF,AADF,8BAA0C,aACb,SACrB;YAAA,uBAAmC;YAAC,sCAAqB;YAAA,iBAAK;YAClE,4BAA2B;YAGvB,AAFF,2FAA0B,qEAEjB;YAGX,iBAAI;YACJ,qGAAwC;YAoB1C,iBAAM;YAEN,+BAA4B;YAC1B,uGAAe;YAMf,wGAAa;YAOb,0GAA0B;YAsF5B,iBAAM;YAGJ,AADF,gCAA2B,kBAGI;YAArB,iHAAS,cAAU,IAAC;YAC1B,yBAAiC;YAAC,yBACpC;YAAA,iBAAS;YACT,mCAG2B;YAAnB,iHAAS,YAAQ,IAAC;YAItB,AAHF,6FAAc,uEAGL;YAMf,AADA,AADE,AADE,iBAAS,EACL,EACF,EACS;;YA3JD,AADA,AADA,AADA,2BAAa,eACC,iBACE,kBACC;YAMzB,eAIC;YAJD,gDAIC;YAEH,eAmBC;YAnBD,mEAmBC;YAID,eAIC;YAJD,uCAIC;YAED,cAKC;YALD,qCAKC;YAED,cAqFC;YArFD,sDAqFC;YAWO,eAAkC;YAAlC,wDAAkC;YAExC,cAKC;YALD,sCAKC;;;iFD3IM,mCAAmC;cAN/C,SAAS;6BACI,KAAK,YACP,iCAAiC;;kBAK1C,KAAK;;kBACL,KAAK;;kBACL,MAAM;;kFAHI,mCAAmC","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\nimport { CdkDragDrop, moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop';\nimport { LogError, Metadata, RunView } from '@memberjunction/core';\nimport { MJDashboardEntityExtended, MJDashboardUserPreferenceEntity, MJApplicationEntity } from '@memberjunction/core-entities';\n\nexport interface DashboardPreferencesResult {\n saved: boolean;\n preferences?: MJDashboardUserPreferenceEntity[];\n}\n\n@Component({\n standalone: false,\n selector: 'mj-dashboard-preferences-dialog',\n templateUrl: './dashboard-preferences-dialog.component.html',\n styleUrls: ['./dashboard-preferences-dialog.component.css']\n})\nexport class DashboardPreferencesDialogComponent implements OnInit {\n @Input() public applicationId: string | null = null;\n @Input() public scope: 'Global' | 'App' = 'Global';\n @Output() public result = new EventEmitter<DashboardPreferencesResult>();\n\n public availableDashboards: MJDashboardEntityExtended[] = [];\n public configuredDashboards: MJDashboardEntityExtended[] = [];\n public applicationName: string = '';\n public loading: boolean = true;\n public saving: boolean = false;\n public error: string | null = null;\n public hasChanges: boolean = false;\n public isSysAdmin: boolean = false;\n public preferenceMode: 'personal' | 'system' = 'personal';\n\n private originalConfiguredIds: string[] = [];\n private currentUserPreferences: MJDashboardUserPreferenceEntity[] = [];\n private allAvailableDashboards: MJDashboardEntityExtended[] = [];\n\n async ngOnInit(): Promise<void> {\n try {\n await this.loadData();\n } catch (error) {\n LogError('Error initializing dashboard preferences dialog', null, error);\n this.error = 'Failed to load dashboard preferences';\n } finally {\n this.loading = false;\n }\n }\n\n private async loadData(): Promise<void> {\n const md = new Metadata();\n \n // Check if current user is sysadmin\n this.isSysAdmin = md.CurrentUser.Type.trim().toLowerCase() === 'owner';\n console.log('User is sysadmin:', this.isSysAdmin);\n \n // Default to personal preferences for all users (including sysadmin)\n this.preferenceMode = 'personal';\n \n // Load application name if we're in app scope\n if (this.scope === 'App' && this.applicationId) {\n await this.loadApplicationName();\n }\n\n // Get cached dashboards from MJ_Metadata dataset\n const ds = await md.GetAndCacheDatasetByName(\"MJ_Metadata\");\n if (!ds || !ds.Success) {\n throw new Error(ds?.Status || 'Failed to load metadata dataset');\n }\n\n const dashList = ds.Results.find(r => r.Code === 'Dashboards');\n if (!dashList) {\n throw new Error('Dashboards dataset not found');\n }\n\n // Filter dashboards by scope\n const appFilter = this.applicationId ? ` AND ApplicationID='${this.applicationId}'` : ' AND ApplicationID IS NULL';\n this.allAvailableDashboards = dashList.Results.filter((d: MJDashboardEntityExtended) => {\n if (this.scope === 'Global') {\n return d.Scope === 'Global' && !d.ApplicationID;\n } else {\n return d.ApplicationID === this.applicationId; // ignore scope for dashboards that match app id, sometimes they have a global scope as they can be shown globally as well as app specific\n }\n });\n\n // Load current user preferences\n await this.loadCurrentPreferences();\n \n // Split dashboards into available and configured\n this.splitDashboards();\n \n // Store original state to detect changes\n this.originalConfiguredIds = this.configuredDashboards.map(d => d.ID);\n }\n\n private async loadApplicationName(): Promise<void> {\n if (!this.applicationId) return;\n \n try {\n const md = new Metadata();\n const ds = await md.GetAndCacheDatasetByName(\"MJ_Metadata\");\n const appList = ds.Results.find(r => r.Code === 'Applications');\n if (appList) {\n const app = appList.Results.find((a: MJApplicationEntity) => a.ID === this.applicationId);\n this.applicationName = app?.Name || 'Unknown Application';\n }\n } catch (error) {\n LogError('Error loading application name', null, error);\n this.applicationName = 'Unknown Application';\n }\n }\n\n private async loadCurrentPreferences(): Promise<void> {\n const rv = new RunView();\n const md = new Metadata();\n \n const appFilter = this.applicationId ? ` AND ApplicationID='${this.applicationId}'` : '';\n const baseCondition = `Scope='${this.scope}'${appFilter}`;\n \n let filter: string;\n \n if (this.isSysAdmin && this.scope === 'Global' && this.preferenceMode === 'system') {\n // Load system defaults only (UserID IS NULL)\n filter = `UserID IS NULL AND ${baseCondition}`;\n } else {\n // Load personal user preferences (including for sysadmin when in personal mode)\n // For personal mode, we ONLY load the user's specific preferences, no fallback to system defaults\n // This allows sysadmin to see their actual personal preferences vs system defaults\n filter = `UserID='${md.CurrentUser.ID}' AND ${baseCondition}`;\n }\n\n console.log('Loading preferences with filter:', filter);\n\n const prefsResult = await rv.RunView<MJDashboardUserPreferenceEntity>({\n EntityName: 'MJ: Dashboard User Preferences',\n ExtraFilter: filter,\n ResultType: 'entity_object',\n OrderBy: 'DisplayOrder',\n });\n\n this.currentUserPreferences = prefsResult?.Results || [];\n console.log('Loaded preferences:', this.currentUserPreferences.length);\n }\n\n private splitDashboards(): void {\n const configuredIds = new Set(this.currentUserPreferences.map(p => p.DashboardID));\n \n // Get configured dashboards in the right order\n this.configuredDashboards = this.currentUserPreferences\n .map(pref => this.allAvailableDashboards.find(d => d.ID === pref.DashboardID))\n .filter((d): d is MJDashboardEntityExtended => d !== undefined);\n \n // Get available dashboards (not configured)\n this.availableDashboards = this.allAvailableDashboards\n .filter(d => !configuredIds.has(d.ID))\n .sort((a, b) => a.Name.localeCompare(b.Name));\n }\n\n public onDrop(event: CdkDragDrop<MJDashboardEntityExtended[]>): void {\n try {\n if (event.previousContainer === event.container) {\n // Reordering within the same list\n moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);\n } else {\n // Moving between lists\n transferArrayItem(\n event.previousContainer.data,\n event.container.data,\n event.previousIndex,\n event.currentIndex\n );\n \n // If moving to configured dashboards, sort the available list\n if (event.container.data === this.configuredDashboards) {\n this.availableDashboards.sort((a, b) => a.Name.localeCompare(b.Name));\n }\n }\n \n this.checkForChanges();\n } catch (error) {\n LogError('Error in drag drop operation', null, error);\n this.error = 'Error reordering dashboards. Please try again.';\n \n // Clear error after 3 seconds\n setTimeout(() => {\n this.error = null;\n }, 3000);\n }\n }\n\n public addDashboard(dashboard: MJDashboardEntityExtended): void {\n try {\n const index = this.availableDashboards.findIndex(d => d.ID === dashboard.ID);\n if (index !== -1) {\n this.availableDashboards.splice(index, 1);\n this.configuredDashboards.push(dashboard);\n this.checkForChanges();\n }\n } catch (error) {\n LogError('Error adding dashboard', null, error);\n this.error = 'Error adding dashboard. Please try again.';\n \n // Clear error after 3 seconds\n setTimeout(() => {\n this.error = null;\n }, 3000);\n }\n }\n\n public removeDashboard(dashboard: MJDashboardEntityExtended): void {\n try {\n const index = this.configuredDashboards.findIndex(d => d.ID === dashboard.ID);\n if (index !== -1) {\n this.configuredDashboards.splice(index, 1);\n this.availableDashboards.push(dashboard);\n this.availableDashboards.sort((a, b) => a.Name.localeCompare(b.Name));\n this.checkForChanges();\n }\n } catch (error) {\n LogError('Error removing dashboard', null, error);\n this.error = 'Error removing dashboard. Please try again.';\n \n // Clear error after 3 seconds\n setTimeout(() => {\n this.error = null;\n }, 3000);\n }\n }\n\n public async onPreferenceModeChange(): Promise<void> {\n try {\n this.loading = true;\n this.error = null;\n \n // Reload preferences with new mode\n await this.loadCurrentPreferences();\n this.splitDashboards();\n this.originalConfiguredIds = this.configuredDashboards.map(d => d.ID);\n this.hasChanges = false;\n \n } catch (error) {\n LogError('Error changing preference mode', null, error);\n this.error = 'Error loading preferences. Please try again.';\n } finally {\n this.loading = false;\n }\n }\n\n private checkForChanges(): void {\n try {\n const currentConfiguredIds = this.configuredDashboards.map(d => d.ID);\n \n // Check if the order or selection has changed\n this.hasChanges = currentConfiguredIds.length !== this.originalConfiguredIds.length ||\n currentConfiguredIds.some((id, index) => id !== this.originalConfiguredIds[index]);\n \n // Debug logging\n console.log('Dashboard preferences change check:', {\n original: this.originalConfiguredIds,\n current: currentConfiguredIds,\n hasChanges: this.hasChanges\n });\n } catch (error) {\n LogError('Error checking for changes', null, error);\n this.hasChanges = false;\n }\n }\n\n public async onSave(): Promise<void> {\n if (this.saving || !this.hasChanges) {\n console.log('Save cancelled:', { saving: this.saving, hasChanges: this.hasChanges });\n return;\n }\n\n try {\n this.saving = true;\n console.log('Starting save process with configured dashboards:', this.configuredDashboards.map(d => ({ id: d.ID, name: d.Name })));\n \n const md = new Metadata();\n const rv = new RunView();\n\n // Get existing preferences for this scope\n const baseCondition = this.scope === 'Global' \n ? `Scope='Global' AND ApplicationID IS NULL`\n : `Scope='App' AND ApplicationID='${this.applicationId}'`;\n \n let userFilter: string;\n \n if (this.isSysAdmin && this.scope === 'Global' && this.preferenceMode === 'system') {\n // Managing system defaults\n userFilter = `UserID IS NULL AND ${baseCondition}`;\n } else {\n // Managing personal preferences\n userFilter = `UserID='${md.CurrentUser.ID}' AND ${baseCondition}`;\n }\n \n console.log('Loading existing preferences with filter:', userFilter);\n \n const existingPrefs = await rv.RunView<MJDashboardUserPreferenceEntity>({\n EntityName: 'MJ: Dashboard User Preferences',\n ExtraFilter: userFilter,\n ResultType: 'entity_object',\n });\n\n const existingPreferences = existingPrefs?.Results || [];\n console.log('Found existing preferences:', existingPreferences.length);\n\n // Create maps for efficient lookups\n const existingByDashboardId = new Map<string, MJDashboardUserPreferenceEntity>();\n existingPreferences.forEach(pref => {\n existingByDashboardId.set(pref.DashboardID, pref);\n });\n\n const configuredDashboardIds = new Set(this.configuredDashboards.map(d => d.ID));\n\n // Step 1: Delete preferences that are no longer configured\n const prefsToDelete = existingPreferences.filter(pref => !configuredDashboardIds.has(pref.DashboardID));\n console.log('Preferences to delete:', prefsToDelete.length);\n \n for (const pref of prefsToDelete) {\n console.log('Deleting preference for dashboard:', pref.DashboardID);\n if (!await pref.Delete()) {\n const errorMsg = pref.LatestResult?.Error || pref.LatestResult?.Message || 'Unknown error';\n throw new Error(`Failed to delete preference: ${errorMsg}`);\n }\n }\n\n // Step 2: Update existing preferences or create new ones\n const newPreferences: MJDashboardUserPreferenceEntity[] = [];\n \n for (let i = 0; i < this.configuredDashboards.length; i++) {\n const dashboard = this.configuredDashboards[i];\n const newDisplayOrder = i + 1;\n \n let prefEntity = existingByDashboardId.get(dashboard.ID);\n \n if (prefEntity) {\n // Update existing preference\n console.log(`Updating existing preference for dashboard ${dashboard.Name}, new order: ${newDisplayOrder}`);\n prefEntity.DisplayOrder = newDisplayOrder;\n \n if (!await prefEntity.Save()) {\n const errorMsg = prefEntity.LatestResult?.Error || prefEntity.LatestResult?.Message || 'Unknown error';\n throw new Error(`Failed to update preference for dashboard ${dashboard.Name}: ${errorMsg}`);\n }\n } else {\n // Create new preference\n console.log(`Creating new preference for dashboard ${dashboard.Name}, order: ${newDisplayOrder}`);\n prefEntity = await md.GetEntityObject<MJDashboardUserPreferenceEntity>('MJ: Dashboard User Preferences');\n \n // Set UserID based on preference mode\n if (this.isSysAdmin && this.scope === 'Global' && this.preferenceMode === 'system') {\n prefEntity.UserID = null; // System default\n } else {\n prefEntity.UserID = md.CurrentUser.ID; // Personal preference\n }\n \n prefEntity.DashboardID = dashboard.ID;\n prefEntity.DisplayOrder = newDisplayOrder;\n prefEntity.Scope = this.scope;\n prefEntity.ApplicationID = this.applicationId;\n\n console.log('Creating preference entity:', {\n UserID: prefEntity.UserID,\n DashboardID: prefEntity.DashboardID,\n DisplayOrder: prefEntity.DisplayOrder,\n Scope: prefEntity.Scope,\n ApplicationID: prefEntity.ApplicationID\n });\n\n if (!await prefEntity.Save()) {\n const errorMsg = prefEntity.LatestResult?.Error || prefEntity.LatestResult?.Message || 'Unknown error';\n throw new Error(`Failed to create preference for dashboard ${dashboard.Name}: ${errorMsg}`);\n }\n }\n \n newPreferences.push(prefEntity);\n }\n\n console.log('Successfully processed', newPreferences.length, 'preferences');\n\n // Emit success result\n this.result.emit({\n saved: true,\n preferences: newPreferences\n });\n\n } catch (error) {\n console.error('Save error:', error);\n LogError('Error saving dashboard preferences', null, error);\n this.error = `Failed to save preferences: ${error instanceof Error ? error.message : 'Unknown error'}`;\n \n // Clear error after 5 seconds\n setTimeout(() => {\n this.error = null;\n }, 5000);\n } finally {\n this.saving = false;\n }\n }\n\n public onCancel(): void {\n this.result.emit({ saved: false });\n }\n}","<kendo-dialog title=\"Dashboard Preferences\" \n [width]=\"800\" \n [height]=\"600\"\n [minWidth]=\"600\"\n [minHeight]=\"400\"\n (close)=\"onCancel()\">\n<div class=\"dashboard-preferences-dialog\">\n <div class=\"dialog-header\">\n <h3><i class=\"fa-solid fa-sliders\"></i> Dashboard Preferences</h3>\n <p class=\"scope-indicator\">\n @if (scope === 'Global') {\n <i class=\"fa-solid fa-globe\"></i> Global Scope\n } @else {\n <i class=\"fa-solid fa-layer-group\"></i> Application: {{ applicationName }}\n }\n </p>\n @if (isSysAdmin && scope === 'Global') {\n <div class=\"preference-mode-selector\">\n <label>\n <input type=\"radio\" \n name=\"preferenceMode\" \n value=\"personal\" \n [(ngModel)]=\"preferenceMode\"\n (change)=\"onPreferenceModeChange()\">\n Personal Preferences\n </label>\n <label>\n <input type=\"radio\" \n name=\"preferenceMode\" \n value=\"system\" \n [(ngModel)]=\"preferenceMode\"\n (change)=\"onPreferenceModeChange()\">\n System Defaults\n </label>\n </div>\n }\n </div>\n\n <div class=\"dialog-content\">\n @if (loading) {\n <div class=\"loading-overlay\">\n <mj-loading text=\"Loading preferences...\" size=\"large\"></mj-loading>\n </div>\n }\n\n @if (error) {\n <div class=\"error-container\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n {{ error }}\n </div>\n }\n\n @if (!loading && !error) {\n <div class=\"preferences-panels\">\n <!-- Available Dashboards Panel -->\n <div class=\"panel available-panel\">\n <h4><i class=\"fa-solid fa-list\"></i> Available Dashboards</h4>\n <div class=\"dashboard-list\" \n cdkDropList \n #availableList=\"cdkDropList\"\n [cdkDropListData]=\"availableDashboards\"\n [cdkDropListConnectedTo]=\"[configuredList]\"\n (cdkDropListDropped)=\"onDrop($event)\">\n \n @if (availableDashboards.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-info-circle\"></i>\n All dashboards are configured\n </div>\n }\n\n @for (dashboard of availableDashboards; track dashboard.ID) {\n <div class=\"dashboard-item available-item\" \n cdkDrag\n [cdkDragData]=\"dashboard\">\n <div class=\"dashboard-item-content\">\n <i class=\"fa-solid fa-grip-vertical drag-handle\"></i>\n <div class=\"dashboard-info\">\n <span class=\"dashboard-name\">{{ dashboard.Name }}</span>\n @if (dashboard.Description) {\n <span class=\"dashboard-description\">{{ dashboard.Description }}</span>\n }\n </div>\n <button type=\"button\" \n class=\"add-button\"\n (click)=\"addDashboard(dashboard)\"\n title=\"Add to configured dashboards\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Configured Dashboards Panel -->\n <div class=\"panel configured-panel\">\n <h4><i class=\"fa-solid fa-list-ol\"></i> Configured Dashboards</h4>\n <div class=\"dashboard-list\" \n cdkDropList \n #configuredList=\"cdkDropList\"\n [cdkDropListData]=\"configuredDashboards\"\n [cdkDropListConnectedTo]=\"[availableList]\"\n (cdkDropListDropped)=\"onDrop($event)\">\n \n @if (configuredDashboards.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-info-circle\"></i>\n No dashboards configured\n </div>\n }\n\n @for (dashboard of configuredDashboards; track dashboard.ID; let i = $index) {\n <div class=\"dashboard-item configured-item\" \n cdkDrag\n [cdkDragData]=\"dashboard\">\n <div class=\"dashboard-item-content\">\n <i class=\"fa-solid fa-grip-vertical drag-handle\"></i>\n <span class=\"order-number\">{{ i + 1 }}</span>\n <div class=\"dashboard-info\">\n <span class=\"dashboard-name\">{{ dashboard.Name }}</span>\n @if (dashboard.Description) {\n <span class=\"dashboard-description\">{{ dashboard.Description }}</span>\n }\n </div>\n <button type=\"button\" \n class=\"remove-button\"\n (click)=\"removeDashboard(dashboard)\"\n title=\"Remove from configured dashboards\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n\n <div class=\"dialog-footer\">\n <button type=\"button\" \n class=\"btn btn-secondary\" \n (click)=\"onCancel()\">\n <i class=\"fa-solid fa-times\"></i> Cancel\n </button>\n <button type=\"button\" \n class=\"btn btn-primary\" \n [disabled]=\"!hasChanges || saving\"\n (click)=\"onSave()\">\n @if (saving) {\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n Saving...\n } @else {\n <i class=\"fa-solid fa-check\"></i> Save Changes\n }\n </button>\n </div>\n</div>\n</kendo-dialog>"]}
|
|
1
|
+
{"version":3,"file":"dashboard-preferences-dialog.component.js","sourceRoot":"","sources":["../../../src/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.ts","../../../src/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\nimport { CdkDragDrop, moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop';\nimport { LogError, Metadata, RunView } from '@memberjunction/core';\nimport { MJDashboardEntityExtended, MJDashboardUserPreferenceEntity, MJApplicationEntity } from '@memberjunction/core-entities';\nimport { UUIDsEqual } from '@memberjunction/global';\n\nexport interface DashboardPreferencesResult {\n saved: boolean;\n preferences?: MJDashboardUserPreferenceEntity[];\n}\n\n@Component({\n standalone: false,\n selector: 'mj-dashboard-preferences-dialog',\n templateUrl: './dashboard-preferences-dialog.component.html',\n styleUrls: ['./dashboard-preferences-dialog.component.css']\n})\nexport class DashboardPreferencesDialogComponent implements OnInit {\n @Input() public applicationId: string | null = null;\n @Input() public scope: 'Global' | 'App' = 'Global';\n @Output() public result = new EventEmitter<DashboardPreferencesResult>();\n\n public availableDashboards: MJDashboardEntityExtended[] = [];\n public configuredDashboards: MJDashboardEntityExtended[] = [];\n public applicationName: string = '';\n public loading: boolean = true;\n public saving: boolean = false;\n public error: string | null = null;\n public hasChanges: boolean = false;\n public isSysAdmin: boolean = false;\n public preferenceMode: 'personal' | 'system' = 'personal';\n\n private originalConfiguredIds: string[] = [];\n private currentUserPreferences: MJDashboardUserPreferenceEntity[] = [];\n private allAvailableDashboards: MJDashboardEntityExtended[] = [];\n\n async ngOnInit(): Promise<void> {\n try {\n await this.loadData();\n } catch (error) {\n LogError('Error initializing dashboard preferences dialog', null, error);\n this.error = 'Failed to load dashboard preferences';\n } finally {\n this.loading = false;\n }\n }\n\n private async loadData(): Promise<void> {\n const md = new Metadata();\n \n // Check if current user is sysadmin\n this.isSysAdmin = md.CurrentUser.Type.trim().toLowerCase() === 'owner';\n console.log('User is sysadmin:', this.isSysAdmin);\n \n // Default to personal preferences for all users (including sysadmin)\n this.preferenceMode = 'personal';\n \n // Load application name if we're in app scope\n if (this.scope === 'App' && this.applicationId) {\n await this.loadApplicationName();\n }\n\n // Get cached dashboards from MJ_Metadata dataset\n const ds = await md.GetAndCacheDatasetByName(\"MJ_Metadata\");\n if (!ds || !ds.Success) {\n throw new Error(ds?.Status || 'Failed to load metadata dataset');\n }\n\n const dashList = ds.Results.find(r => r.Code === 'Dashboards');\n if (!dashList) {\n throw new Error('Dashboards dataset not found');\n }\n\n // Filter dashboards by scope\n const appFilter = this.applicationId ? ` AND ApplicationID='${this.applicationId}'` : ' AND ApplicationID IS NULL';\n this.allAvailableDashboards = dashList.Results.filter((d: MJDashboardEntityExtended) => {\n if (this.scope === 'Global') {\n return d.Scope === 'Global' && !d.ApplicationID;\n } else {\n return UUIDsEqual(d.ApplicationID, this.applicationId) // ignore scope for dashboards that match app id, sometimes they have a global scope as they can be shown globally as well as app specific\n }\n });\n\n // Load current user preferences\n await this.loadCurrentPreferences();\n \n // Split dashboards into available and configured\n this.splitDashboards();\n \n // Store original state to detect changes\n this.originalConfiguredIds = this.configuredDashboards.map(d => d.ID);\n }\n\n private async loadApplicationName(): Promise<void> {\n if (!this.applicationId) return;\n \n try {\n const md = new Metadata();\n const ds = await md.GetAndCacheDatasetByName(\"MJ_Metadata\");\n const appList = ds.Results.find(r => r.Code === 'Applications');\n if (appList) {\n const app = appList.Results.find((a: MJApplicationEntity) => UUIDsEqual(a.ID, this.applicationId));\n this.applicationName = app?.Name || 'Unknown Application';\n }\n } catch (error) {\n LogError('Error loading application name', null, error);\n this.applicationName = 'Unknown Application';\n }\n }\n\n private async loadCurrentPreferences(): Promise<void> {\n const rv = new RunView();\n const md = new Metadata();\n \n const appFilter = this.applicationId ? ` AND ApplicationID='${this.applicationId}'` : '';\n const baseCondition = `Scope='${this.scope}'${appFilter}`;\n \n let filter: string;\n \n if (this.isSysAdmin && this.scope === 'Global' && this.preferenceMode === 'system') {\n // Load system defaults only (UserID IS NULL)\n filter = `UserID IS NULL AND ${baseCondition}`;\n } else {\n // Load personal user preferences (including for sysadmin when in personal mode)\n // For personal mode, we ONLY load the user's specific preferences, no fallback to system defaults\n // This allows sysadmin to see their actual personal preferences vs system defaults\n filter = `UserID='${md.CurrentUser.ID}' AND ${baseCondition}`;\n }\n\n console.log('Loading preferences with filter:', filter);\n\n const prefsResult = await rv.RunView<MJDashboardUserPreferenceEntity>({\n EntityName: 'MJ: Dashboard User Preferences',\n ExtraFilter: filter,\n ResultType: 'entity_object',\n OrderBy: 'DisplayOrder',\n });\n\n this.currentUserPreferences = prefsResult?.Results || [];\n console.log('Loaded preferences:', this.currentUserPreferences.length);\n }\n\n private splitDashboards(): void {\n const configuredIds = new Set(this.currentUserPreferences.map(p => p.DashboardID));\n \n // Get configured dashboards in the right order\n this.configuredDashboards = this.currentUserPreferences\n .map(pref => this.allAvailableDashboards.find(d => UUIDsEqual(d.ID, pref.DashboardID)))\n .filter((d): d is MJDashboardEntityExtended => d !== undefined);\n \n // Get available dashboards (not configured)\n this.availableDashboards = this.allAvailableDashboards\n .filter(d => !configuredIds.has(d.ID))\n .sort((a, b) => a.Name.localeCompare(b.Name));\n }\n\n public onDrop(event: CdkDragDrop<MJDashboardEntityExtended[]>): void {\n try {\n if (event.previousContainer === event.container) {\n // Reordering within the same list\n moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);\n } else {\n // Moving between lists\n transferArrayItem(\n event.previousContainer.data,\n event.container.data,\n event.previousIndex,\n event.currentIndex\n );\n \n // If moving to configured dashboards, sort the available list\n if (event.container.data === this.configuredDashboards) {\n this.availableDashboards.sort((a, b) => a.Name.localeCompare(b.Name));\n }\n }\n \n this.checkForChanges();\n } catch (error) {\n LogError('Error in drag drop operation', null, error);\n this.error = 'Error reordering dashboards. Please try again.';\n \n // Clear error after 3 seconds\n setTimeout(() => {\n this.error = null;\n }, 3000);\n }\n }\n\n public addDashboard(dashboard: MJDashboardEntityExtended): void {\n try {\n const index = this.availableDashboards.findIndex(d => UUIDsEqual(d.ID, dashboard.ID));\n if (index !== -1) {\n this.availableDashboards.splice(index, 1);\n this.configuredDashboards.push(dashboard);\n this.checkForChanges();\n }\n } catch (error) {\n LogError('Error adding dashboard', null, error);\n this.error = 'Error adding dashboard. Please try again.';\n \n // Clear error after 3 seconds\n setTimeout(() => {\n this.error = null;\n }, 3000);\n }\n }\n\n public removeDashboard(dashboard: MJDashboardEntityExtended): void {\n try {\n const index = this.configuredDashboards.findIndex(d => UUIDsEqual(d.ID, dashboard.ID));\n if (index !== -1) {\n this.configuredDashboards.splice(index, 1);\n this.availableDashboards.push(dashboard);\n this.availableDashboards.sort((a, b) => a.Name.localeCompare(b.Name));\n this.checkForChanges();\n }\n } catch (error) {\n LogError('Error removing dashboard', null, error);\n this.error = 'Error removing dashboard. Please try again.';\n \n // Clear error after 3 seconds\n setTimeout(() => {\n this.error = null;\n }, 3000);\n }\n }\n\n public async onPreferenceModeChange(): Promise<void> {\n try {\n this.loading = true;\n this.error = null;\n \n // Reload preferences with new mode\n await this.loadCurrentPreferences();\n this.splitDashboards();\n this.originalConfiguredIds = this.configuredDashboards.map(d => d.ID);\n this.hasChanges = false;\n \n } catch (error) {\n LogError('Error changing preference mode', null, error);\n this.error = 'Error loading preferences. Please try again.';\n } finally {\n this.loading = false;\n }\n }\n\n private checkForChanges(): void {\n try {\n const currentConfiguredIds = this.configuredDashboards.map(d => d.ID);\n \n // Check if the order or selection has changed\n this.hasChanges = currentConfiguredIds.length !== this.originalConfiguredIds.length ||\n currentConfiguredIds.some((id, index) => id !== this.originalConfiguredIds[index]);\n \n // Debug logging\n console.log('Dashboard preferences change check:', {\n original: this.originalConfiguredIds,\n current: currentConfiguredIds,\n hasChanges: this.hasChanges\n });\n } catch (error) {\n LogError('Error checking for changes', null, error);\n this.hasChanges = false;\n }\n }\n\n public async onSave(): Promise<void> {\n if (this.saving || !this.hasChanges) {\n console.log('Save cancelled:', { saving: this.saving, hasChanges: this.hasChanges });\n return;\n }\n\n try {\n this.saving = true;\n console.log('Starting save process with configured dashboards:', this.configuredDashboards.map(d => ({ id: d.ID, name: d.Name })));\n \n const md = new Metadata();\n const rv = new RunView();\n\n // Get existing preferences for this scope\n const baseCondition = this.scope === 'Global' \n ? `Scope='Global' AND ApplicationID IS NULL`\n : `Scope='App' AND ApplicationID='${this.applicationId}'`;\n \n let userFilter: string;\n \n if (this.isSysAdmin && this.scope === 'Global' && this.preferenceMode === 'system') {\n // Managing system defaults\n userFilter = `UserID IS NULL AND ${baseCondition}`;\n } else {\n // Managing personal preferences\n userFilter = `UserID='${md.CurrentUser.ID}' AND ${baseCondition}`;\n }\n \n console.log('Loading existing preferences with filter:', userFilter);\n \n const existingPrefs = await rv.RunView<MJDashboardUserPreferenceEntity>({\n EntityName: 'MJ: Dashboard User Preferences',\n ExtraFilter: userFilter,\n ResultType: 'entity_object',\n });\n\n const existingPreferences = existingPrefs?.Results || [];\n console.log('Found existing preferences:', existingPreferences.length);\n\n // Create maps for efficient lookups\n const existingByDashboardId = new Map<string, MJDashboardUserPreferenceEntity>();\n existingPreferences.forEach(pref => {\n existingByDashboardId.set(pref.DashboardID, pref);\n });\n\n const configuredDashboardIds = new Set(this.configuredDashboards.map(d => d.ID));\n\n // Step 1: Delete preferences that are no longer configured\n const prefsToDelete = existingPreferences.filter(pref => !configuredDashboardIds.has(pref.DashboardID));\n console.log('Preferences to delete:', prefsToDelete.length);\n \n for (const pref of prefsToDelete) {\n console.log('Deleting preference for dashboard:', pref.DashboardID);\n if (!await pref.Delete()) {\n const errorMsg = pref.LatestResult?.Error || pref.LatestResult?.Message || 'Unknown error';\n throw new Error(`Failed to delete preference: ${errorMsg}`);\n }\n }\n\n // Step 2: Update existing preferences or create new ones\n const newPreferences: MJDashboardUserPreferenceEntity[] = [];\n \n for (let i = 0; i < this.configuredDashboards.length; i++) {\n const dashboard = this.configuredDashboards[i];\n const newDisplayOrder = i + 1;\n \n let prefEntity = existingByDashboardId.get(dashboard.ID);\n \n if (prefEntity) {\n // Update existing preference\n console.log(`Updating existing preference for dashboard ${dashboard.Name}, new order: ${newDisplayOrder}`);\n prefEntity.DisplayOrder = newDisplayOrder;\n \n if (!await prefEntity.Save()) {\n const errorMsg = prefEntity.LatestResult?.Error || prefEntity.LatestResult?.Message || 'Unknown error';\n throw new Error(`Failed to update preference for dashboard ${dashboard.Name}: ${errorMsg}`);\n }\n } else {\n // Create new preference\n console.log(`Creating new preference for dashboard ${dashboard.Name}, order: ${newDisplayOrder}`);\n prefEntity = await md.GetEntityObject<MJDashboardUserPreferenceEntity>('MJ: Dashboard User Preferences');\n \n // Set UserID based on preference mode\n if (this.isSysAdmin && this.scope === 'Global' && this.preferenceMode === 'system') {\n prefEntity.UserID = null; // System default\n } else {\n prefEntity.UserID = md.CurrentUser.ID; // Personal preference\n }\n \n prefEntity.DashboardID = dashboard.ID;\n prefEntity.DisplayOrder = newDisplayOrder;\n prefEntity.Scope = this.scope;\n prefEntity.ApplicationID = this.applicationId;\n\n console.log('Creating preference entity:', {\n UserID: prefEntity.UserID,\n DashboardID: prefEntity.DashboardID,\n DisplayOrder: prefEntity.DisplayOrder,\n Scope: prefEntity.Scope,\n ApplicationID: prefEntity.ApplicationID\n });\n\n if (!await prefEntity.Save()) {\n const errorMsg = prefEntity.LatestResult?.Error || prefEntity.LatestResult?.Message || 'Unknown error';\n throw new Error(`Failed to create preference for dashboard ${dashboard.Name}: ${errorMsg}`);\n }\n }\n \n newPreferences.push(prefEntity);\n }\n\n console.log('Successfully processed', newPreferences.length, 'preferences');\n\n // Emit success result\n this.result.emit({\n saved: true,\n preferences: newPreferences\n });\n\n } catch (error) {\n console.error('Save error:', error);\n LogError('Error saving dashboard preferences', null, error);\n this.error = `Failed to save preferences: ${error instanceof Error ? error.message : 'Unknown error'}`;\n \n // Clear error after 5 seconds\n setTimeout(() => {\n this.error = null;\n }, 5000);\n } finally {\n this.saving = false;\n }\n }\n\n public onCancel(): void {\n this.result.emit({ saved: false });\n }\n}","<kendo-dialog title=\"Dashboard Preferences\" \n [width]=\"800\" \n [height]=\"600\"\n [minWidth]=\"600\"\n [minHeight]=\"400\"\n (close)=\"onCancel()\">\n<div class=\"dashboard-preferences-dialog\">\n <div class=\"dialog-header\">\n <h3><i class=\"fa-solid fa-sliders\"></i> Dashboard Preferences</h3>\n <p class=\"scope-indicator\">\n @if (scope === 'Global') {\n <i class=\"fa-solid fa-globe\"></i> Global Scope\n } @else {\n <i class=\"fa-solid fa-layer-group\"></i> Application: {{ applicationName }}\n }\n </p>\n @if (isSysAdmin && scope === 'Global') {\n <div class=\"preference-mode-selector\">\n <label>\n <input type=\"radio\" \n name=\"preferenceMode\" \n value=\"personal\" \n [(ngModel)]=\"preferenceMode\"\n (change)=\"onPreferenceModeChange()\">\n Personal Preferences\n </label>\n <label>\n <input type=\"radio\" \n name=\"preferenceMode\" \n value=\"system\" \n [(ngModel)]=\"preferenceMode\"\n (change)=\"onPreferenceModeChange()\">\n System Defaults\n </label>\n </div>\n }\n </div>\n\n <div class=\"dialog-content\">\n @if (loading) {\n <div class=\"loading-overlay\">\n <mj-loading text=\"Loading preferences...\" size=\"large\"></mj-loading>\n </div>\n }\n\n @if (error) {\n <div class=\"error-container\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n {{ error }}\n </div>\n }\n\n @if (!loading && !error) {\n <div class=\"preferences-panels\">\n <!-- Available Dashboards Panel -->\n <div class=\"panel available-panel\">\n <h4><i class=\"fa-solid fa-list\"></i> Available Dashboards</h4>\n <div class=\"dashboard-list\" \n cdkDropList \n #availableList=\"cdkDropList\"\n [cdkDropListData]=\"availableDashboards\"\n [cdkDropListConnectedTo]=\"[configuredList]\"\n (cdkDropListDropped)=\"onDrop($event)\">\n \n @if (availableDashboards.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-info-circle\"></i>\n All dashboards are configured\n </div>\n }\n\n @for (dashboard of availableDashboards; track dashboard.ID) {\n <div class=\"dashboard-item available-item\" \n cdkDrag\n [cdkDragData]=\"dashboard\">\n <div class=\"dashboard-item-content\">\n <i class=\"fa-solid fa-grip-vertical drag-handle\"></i>\n <div class=\"dashboard-info\">\n <span class=\"dashboard-name\">{{ dashboard.Name }}</span>\n @if (dashboard.Description) {\n <span class=\"dashboard-description\">{{ dashboard.Description }}</span>\n }\n </div>\n <button type=\"button\" \n class=\"add-button\"\n (click)=\"addDashboard(dashboard)\"\n title=\"Add to configured dashboards\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Configured Dashboards Panel -->\n <div class=\"panel configured-panel\">\n <h4><i class=\"fa-solid fa-list-ol\"></i> Configured Dashboards</h4>\n <div class=\"dashboard-list\" \n cdkDropList \n #configuredList=\"cdkDropList\"\n [cdkDropListData]=\"configuredDashboards\"\n [cdkDropListConnectedTo]=\"[availableList]\"\n (cdkDropListDropped)=\"onDrop($event)\">\n \n @if (configuredDashboards.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-info-circle\"></i>\n No dashboards configured\n </div>\n }\n\n @for (dashboard of configuredDashboards; track dashboard.ID; let i = $index) {\n <div class=\"dashboard-item configured-item\" \n cdkDrag\n [cdkDragData]=\"dashboard\">\n <div class=\"dashboard-item-content\">\n <i class=\"fa-solid fa-grip-vertical drag-handle\"></i>\n <span class=\"order-number\">{{ i + 1 }}</span>\n <div class=\"dashboard-info\">\n <span class=\"dashboard-name\">{{ dashboard.Name }}</span>\n @if (dashboard.Description) {\n <span class=\"dashboard-description\">{{ dashboard.Description }}</span>\n }\n </div>\n <button type=\"button\" \n class=\"remove-button\"\n (click)=\"removeDashboard(dashboard)\"\n title=\"Remove from configured dashboards\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n\n <div class=\"dialog-footer\">\n <button type=\"button\" \n class=\"btn btn-secondary\" \n (click)=\"onCancel()\">\n <i class=\"fa-solid fa-times\"></i> Cancel\n </button>\n <button type=\"button\" \n class=\"btn btn-primary\" \n [disabled]=\"!hasChanges || saving\"\n (click)=\"onSave()\">\n @if (saving) {\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n Saving...\n } @else {\n <i class=\"fa-solid fa-check\"></i> Save Changes\n }\n </button>\n </div>\n</div>\n</kendo-dialog>"]}
|
|
@@ -7,7 +7,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
import { Component, ViewEncapsulation, ViewChild, HostListener } from '@angular/core';
|
|
8
8
|
import { NavigationEnd } from '@angular/router';
|
|
9
9
|
import { Metadata, CompositeKey } from '@memberjunction/core';
|
|
10
|
-
import { RegisterClass } from '@memberjunction/global';
|
|
10
|
+
import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
|
|
11
11
|
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
12
12
|
import { MJEnvironmentEntityExtended, UserInfoEngine } from '@memberjunction/core-entities';
|
|
13
13
|
import { AIEngineBase } from '@memberjunction/ai-engine-base';
|
|
@@ -461,7 +461,7 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
|
|
|
461
461
|
*/
|
|
462
462
|
onConversationDeleted(deletedId) {
|
|
463
463
|
if (this.selectedConversationId === deletedId) {
|
|
464
|
-
const remaining = this.conversationData.conversations.filter(c => c.ID
|
|
464
|
+
const remaining = this.conversationData.conversations.filter(c => !UUIDsEqual(c.ID, deletedId));
|
|
465
465
|
if (remaining.length > 0) {
|
|
466
466
|
void this.selectConversation(remaining[0].ID);
|
|
467
467
|
this.updateUrl();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-conversations-resource.component.js","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/chat-conversations-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewEncapsulation, OnDestroy, ViewChild, ChangeDetectorRef, HostListener } from '@angular/core';\nimport { Router, NavigationEnd } from '@angular/router';\nimport { Metadata, CompositeKey } from '@memberjunction/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { ResourceData, MJEnvironmentEntityExtended, MJConversationEntity, MJUserSettingEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { ConversationDataService, ConversationChatAreaComponent, ConversationListComponent, MentionAutocompleteService, ConversationStreamingService, ActiveTasksService, PendingAttachment, UICommandHandlerService } from '@memberjunction/ng-conversations';\nimport { ActionableCommand, OpenResourceCommand } from '@memberjunction/ai-core-plus';\nimport { NavigationRequest } from '@memberjunction/ng-artifacts';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { Subject, takeUntil, filter } from 'rxjs';\n/**\n * Chat Conversations Resource - wraps the conversation chat area for tab-based display\n * Extends BaseResourceComponent to work with the resource type system\n * Displays conversation list sidebar + active conversation chat interface\n * Designed to work with the tab system for multi-tab conversation management\n *\n * This component manages its own selection state locally, following the encapsulation pattern:\n * - Services (ConversationDataService) are used for shared DATA (caching, loading, saving)\n * - Local state variables manage SELECTION state (which conversation is active)\n * - State flows down to children via @Input, events flow up via @Output\n */\n@RegisterClass(BaseResourceComponent, 'ChatConversationsResource')\n@Component({\n standalone: false,\n selector: 'mj-chat-conversations-resource',\n template: `\n @if (isReady) {\n <div class=\"chat-conversations-container\">\n <!-- Left sidebar: Conversation list -->\n @if (isSidebarSettingsLoaded) {\n <div class=\"conversation-sidebar\"\n [class.collapsed]=\"isSidebarCollapsed\"\n [class.no-transition]=\"!sidebarTransitionsEnabled\"\n [style.width.px]=\"isSidebarCollapsed ? 0 : sidebarWidth\">\n @if (currentUser) {\n <mj-conversation-list\n #conversationList\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [selectedConversationId]=\"selectedConversationId\"\n [renamedConversationId]=\"renamedConversationId\"\n [isSidebarPinned]=\"isSidebarPinned\"\n [isMobileView]=\"isMobileView\"\n (conversationSelected)=\"onConversationSelected($event)\"\n (conversationDeleted)=\"onConversationDeleted($event)\"\n (newConversationRequested)=\"onNewConversationRequested()\"\n (pinSidebarRequested)=\"pinSidebar()\"\n (unpinSidebarRequested)=\"unpinSidebar()\"\n (refreshRequested)=\"onRefreshRequested()\">\n </mj-conversation-list>\n }\n </div>\n }\n <!-- Resize handle for sidebar (only when expanded and settings loaded) -->\n @if (!isSidebarCollapsed && isSidebarSettingsLoaded) {\n <div class=\"sidebar-resize-handle\"\n (mousedown)=\"onSidebarResizeStart($event)\"></div>\n }\n <!-- Main area: Chat interface -->\n <div class=\"conversation-main\">\n @if (currentUser) {\n <mj-conversation-chat-area\n #chatArea\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [conversationId]=\"selectedConversationId\"\n [conversation]=\"selectedConversation\"\n [threadId]=\"selectedThreadId\"\n [isNewConversation]=\"isNewUnsavedConversation\"\n [pendingMessage]=\"pendingMessageToSend\"\n [pendingAttachments]=\"pendingAttachmentsToSend\"\n [pendingArtifactId]=\"pendingArtifactId\"\n [pendingArtifactVersionNumber]=\"pendingArtifactVersionNumber\"\n [showSidebarToggle]=\"isSidebarCollapsed && isSidebarSettingsLoaded\"\n (sidebarToggleClicked)=\"expandSidebar()\"\n (conversationRenamed)=\"onConversationRenamed($event)\"\n (conversationCreated)=\"onConversationCreated($event)\"\n (threadOpened)=\"onThreadOpened($event)\"\n (threadClosed)=\"onThreadClosed()\"\n (pendingArtifactConsumed)=\"onPendingArtifactConsumed()\"\n (pendingMessageConsumed)=\"onPendingMessageConsumed()\"\n (pendingMessageRequested)=\"onPendingMessageRequested($event)\"\n (artifactLinkClicked)=\"onArtifactLinkClicked($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (navigationRequest)=\"onNavigationRequest($event)\">\n </mj-conversation-chat-area>\n }\n </div>\n </div>\n } @else {\n <div class=\"initializing-container\">\n <mj-loading text=\"Initializing...\" size=\"large\"></mj-loading>\n </div>\n }\n \n <!-- Toast notifications container -->\n <mj-toast></mj-toast>\n `,\n 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 #e0e0e0;\n overflow-y: auto;\n background: #f5f5f5;\n transition: width 0.3s ease;\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: #1e40af;\n }\n\n .sidebar-resize-handle:active {\n background: #1e3a8a;\n }\n\n .sidebar-resize-handle::before {\n content: '';\n position: absolute;\n left: -4px;\n right: -4px;\n top: 0;\n bottom: 0;\n cursor: ew-resize;\n }\n\n .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 encapsulation: ViewEncapsulation.None\n})\nexport class ChatConversationsResource extends BaseResourceComponent implements OnDestroy {\n @ViewChild('conversationList') conversationList?: ConversationListComponent;\n @ViewChild('chatArea') chatArea?: ConversationChatAreaComponent;\n\n public currentUser: any = null;\n private destroy$ = new Subject<void>();\n private skipUrlUpdate = true; // Skip URL updates during initialization\n private lastNavigatedUrl: string = ''; // Track URL to avoid reacting to our own navigation\n\n // Ready flag - blocks child rendering until AIEngine is initialized\n public isReady: boolean = false;\n\n // LOCAL SELECTION STATE - each wrapper instance manages its own selection\n public selectedConversationId: string | null = null;\n public selectedConversation: MJConversationEntity | null = null;\n public selectedThreadId: string | null = null;\n public isNewUnsavedConversation: boolean = false;\n public renamedConversationId: string | null = null;\n public isSidebarCollapsed: boolean = false;\n public isSidebarPinned: boolean = true; // Whether sidebar stays open after selection\n public isMobileView: boolean = false;\n public sidebarTransitionsEnabled: boolean = false; // Disabled during initial load to prevent jarring animation\n public isSidebarSettingsLoaded: boolean = false; // Prevents UI flash while loading settings\n\n // Sidebar resize state\n public sidebarWidth: number = 300; // Default width in pixels\n private isSidebarResizing: boolean = false;\n private sidebarResizeStartX: number = 0;\n private sidebarResizeStartWidth: number = 0;\n private readonly SIDEBAR_MIN_WIDTH = 200;\n private readonly SIDEBAR_MAX_WIDTH = 500;\n\n // Pending navigation state\n public pendingArtifactId: string | null = null;\n public pendingArtifactVersionNumber: number | null = null;\n public pendingMessageToSend: string | null = null;\n public pendingAttachmentsToSend: PendingAttachment[] | null = null;\n\n // User Settings persistence\n private readonly USER_SETTING_SIDEBAR_KEY = 'Conversations.SidebarState';\n private saveSettingsTimeout: ReturnType<typeof setTimeout> | null = null;\n\n constructor(\n private navigationService: NavigationService,\n private conversationData: ConversationDataService,\n private router: Router,\n private mentionAutocompleteService: MentionAutocompleteService,\n private cdr: ChangeDetectorRef,\n private streamingService: ConversationStreamingService,\n private activeTasksService: ActiveTasksService,\n private uiCommandHandler: UICommandHandlerService\n ) {\n super();\n }\n\n async ngOnInit() {\n const md = new Metadata();\n this.currentUser = md.CurrentUser;\n\n // Check initial mobile state and set default collapsed\n this.checkMobileView();\n if (this.isMobileView) {\n this.isSidebarCollapsed = true;\n this.isSidebarSettingsLoaded = true; // Mobile uses defaults, no need to load from server\n // Enable transitions after a brief delay to ensure initial state is applied\n setTimeout(() => {\n this.sidebarTransitionsEnabled = true;\n }, 50);\n } else {\n // Load sidebar state from User Settings (non-blocking)\n this.loadSidebarState().then(() => {\n this.cdr.detectChanges();\n // Enable transitions after state is loaded and applied\n setTimeout(() => {\n this.sidebarTransitionsEnabled = true;\n }, 50);\n });\n }\n\n // CRITICAL: Initialize AIEngine and mention service BEFORE children render\n // This prevents the slow first-load issue where each child would trigger initialization\n await this.initializeEngines();\n\n // Initialize global streaming service for PubSub updates\n // This enables reconnection to in-progress agents after browser refresh\n this.streamingService.initialize();\n\n // CRITICAL: Set selectedConversationId SYNCHRONOUSLY before child components initialize\n // Parse URL first and apply state synchronously for the ID\n const urlState = this.parseUrlState();\n\n if (urlState) {\n // Set conversationId synchronously so child components see it immediately\n if (urlState.conversationId) {\n this.selectedConversationId = urlState.conversationId;\n this.isNewUnsavedConversation = false;\n }\n if (urlState.artifactId) {\n this.pendingArtifactId = urlState.artifactId;\n this.pendingArtifactVersionNumber = urlState.versionNumber || null;\n }\n // Load the conversation entity asynchronously (non-blocking)\n this.loadConversationEntity(urlState.conversationId);\n } else {\n // Check if we have navigation params from config (e.g., from Collections linking here)\n this.applyConfigurationParams();\n }\n\n // Subscribe to router NavigationEnd events for back/forward button support\n this.router.events\n .pipe(\n filter((event): event is NavigationEnd => event instanceof NavigationEnd),\n takeUntil(this.destroy$)\n )\n .subscribe(event => {\n const currentUrl = event.urlAfterRedirects || event.url;\n if (currentUrl !== this.lastNavigatedUrl) {\n this.onExternalNavigation(currentUrl);\n }\n });\n\n // Subscribe to actionable commands (open:resource) from the UI command handler service.\n // open:url commands are handled directly by the service; open:resource needs NavigationService.\n this.uiCommandHandler.actionableCommandRequested\n .pipe(takeUntil(this.destroy$))\n .subscribe(command => this.handleActionableCommand(command));\n\n // Enable URL updates after initialization\n this.skipUrlUpdate = false;\n\n // Update URL to reflect current state\n this.updateUrl();\n\n // Notify load complete after user is set\n setTimeout(() => {\n this.NotifyLoadComplete();\n }, 100);\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n\n // Clear any pending save timeout\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n }\n\n // Clean up resize event listeners\n document.removeEventListener('mousemove', this.onSidebarResizeMove);\n document.removeEventListener('mouseup', this.onSidebarResizeEnd);\n }\n\n /**\n * Initialize AI Engine, conversations, and services BEFORE child components render.\n * This prevents the slow first-load issue where initialization would block conversation loading.\n * The `false` parameter means \"don't force refresh if already initialized\".\n */\n private async initializeEngines(): Promise<void> {\n try {\n // Initialize AIEngine, conversations, and mention service in parallel\n await Promise.all([\n AIEngineBase.Instance.Config(false),\n this.conversationData.loadConversations(this.environmentId, this.currentUser),\n this.mentionAutocompleteService.initialize(this.currentUser)\n ]);\n\n // Restore active tasks AFTER conversations are cached (uses in-memory lookup)\n await this.activeTasksService.restoreFromDatabase(this.currentUser);\n\n // Mark as ready - child components can now render\n this.isReady = true;\n this.cdr.detectChanges();\n } catch (error) {\n console.error('Failed to initialize AI engines:', error);\n // Still mark as ready so UI isn't blocked forever\n this.isReady = true;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Parse URL query string for conversation state.\n * Query params: conversationId, artifactId, versionNumber\n */\n private parseUrlState(): { conversationId?: string; artifactId?: string; versionNumber?: number } | null {\n const url = this.router.url;\n const queryIndex = url.indexOf('?');\n if (queryIndex === -1) return null;\n\n const queryString = url.substring(queryIndex + 1);\n const params = new URLSearchParams(queryString);\n const conversationId = params.get('conversationId');\n const artifactId = params.get('artifactId');\n const versionNumber = params.get('versionNumber');\n\n if (!conversationId && !artifactId) return null;\n\n return {\n conversationId: conversationId || undefined,\n artifactId: artifactId || undefined,\n versionNumber: versionNumber ? parseInt(versionNumber, 10) : undefined\n };\n }\n\n /**\n * Load the conversation entity asynchronously (non-blocking).\n * The conversationId is already set synchronously, this just loads the full entity.\n */\n private async loadConversationEntity(conversationId: string | undefined): Promise<void> {\n if (!conversationId) return;\n\n // Try to get from cache first\n const conversation = this.conversationData.getConversationById(conversationId);\n if (conversation) {\n this.selectedConversation = conversation;\n }\n // If not in cache, the chat area component will handle loading it\n }\n\n /**\n * Apply configuration params from resource data (e.g., from deep-linking via Collections).\n * Sets state synchronously so child components see values immediately.\n */\n private applyConfigurationParams(): void {\n const config = this.Data?.Configuration;\n if (!config) return;\n\n // Set pending artifact if provided\n if (config.artifactId) {\n this.pendingArtifactId = config.artifactId as string;\n this.pendingArtifactVersionNumber = (config.versionNumber as number) || null;\n }\n\n // Set conversationId synchronously so child components see it immediately\n if (config.conversationId) {\n this.selectedConversationId = config.conversationId as string;\n this.isNewUnsavedConversation = false;\n // Load entity asynchronously\n this.loadConversationEntity(config.conversationId as string);\n }\n }\n\n /**\n * Apply navigation state to local selection state.\n * Sets state synchronously so child components see values immediately.\n */\n private applyNavigationState(state: { conversationId?: string; artifactId?: string; versionNumber?: number }): void {\n // Set pending artifact if provided (will be consumed by chat area after loading)\n if (state.artifactId) {\n this.pendingArtifactId = state.artifactId;\n this.pendingArtifactVersionNumber = state.versionNumber || null;\n }\n\n // Set the conversation synchronously\n if (state.conversationId) {\n this.selectedConversationId = state.conversationId;\n this.isNewUnsavedConversation = false;\n this.loadConversationEntity(state.conversationId);\n }\n }\n\n /**\n * Select a conversation by ID - loads the entity and updates local state\n */\n private async selectConversation(conversationId: string): Promise<void> {\n this.selectedConversationId = conversationId;\n this.isNewUnsavedConversation = false;\n\n // Load the conversation entity from data service\n const conversation = this.conversationData.getConversationById(conversationId);\n if (conversation) {\n this.selectedConversation = conversation;\n } else {\n // Conversation might not be loaded yet - the chat area will handle loading\n this.selectedConversation = null;\n }\n\n // Update URL if not skipping\n if (!this.skipUrlUpdate) {\n this.updateUrl();\n }\n }\n\n /**\n * Update URL query string to reflect current state.\n * Uses NavigationService for proper URL management that respects app-scoped routes.\n */\n private updateUrl(): void {\n const queryParams: Record<string, string | null> = {};\n\n // Add conversation ID\n if (this.selectedConversationId) {\n queryParams['conversationId'] = this.selectedConversationId;\n } else {\n queryParams['conversationId'] = null;\n }\n\n // Add artifact ID if we have a pending artifact (will be cleared once opened)\n if (this.pendingArtifactId) {\n queryParams['artifactId'] = this.pendingArtifactId;\n if (this.pendingArtifactVersionNumber) {\n queryParams['versionNumber'] = this.pendingArtifactVersionNumber.toString();\n }\n } else {\n queryParams['artifactId'] = null;\n queryParams['versionNumber'] = null;\n }\n\n // Use NavigationService to update query params properly\n this.navigationService.UpdateActiveTabQueryParams(queryParams);\n }\n\n /**\n * Handle external navigation (back/forward buttons).\n * Parses the URL and applies the state without triggering a new navigation.\n */\n private onExternalNavigation(url: string): void {\n // Check if this URL is for our component (contains our base path)\n const currentPath = this.router.url.split('?')[0];\n const newPath = url.split('?')[0];\n\n // Only handle if we're still on the same base path (same component instance)\n if (currentPath !== newPath) {\n return; // Different route entirely, shell will handle it\n }\n\n // Parse the new URL state\n const urlState = this.parseUrlFromString(url);\n\n // Apply the state without triggering URL updates\n this.skipUrlUpdate = true;\n if (urlState) {\n this.applyNavigationState(urlState);\n } else {\n // No params means clear state\n this.selectedConversationId = null;\n this.selectedConversation = null;\n this.selectedThreadId = null;\n this.pendingArtifactId = null;\n this.pendingArtifactVersionNumber = null;\n }\n this.skipUrlUpdate = false;\n\n // Update the tracked URL\n this.lastNavigatedUrl = url;\n }\n\n /**\n * Parse URL state from a URL string (used for external navigation).\n */\n private parseUrlFromString(url: string): { conversationId?: string; artifactId?: string; versionNumber?: number } | null {\n const queryIndex = url.indexOf('?');\n if (queryIndex === -1) return null;\n\n const queryString = url.substring(queryIndex + 1);\n const params = new URLSearchParams(queryString);\n const conversationId = params.get('conversationId');\n const artifactId = params.get('artifactId');\n const versionNumber = params.get('versionNumber');\n\n if (!conversationId && !artifactId) return null;\n\n return {\n conversationId: conversationId || undefined,\n artifactId: artifactId || undefined,\n versionNumber: versionNumber ? parseInt(versionNumber, 10) : undefined\n };\n }\n\n /**\n * Get the environment ID from configuration or use default\n */\n get environmentId(): string {\n return this.Data?.Configuration?.environmentId || MJEnvironmentEntityExtended.DefaultEnvironmentID;\n }\n\n /**\n * Get the display name for chat conversations\n */\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n // If we have a specific conversation ID, we could load the conversation name\n // For now, just return a generic name\n if (data.Configuration?.conversationId) {\n return `Conversation: ${(data.Configuration.conversationId as string).substring(0, 8)}...`;\n }\n return 'Conversations';\n }\n\n /**\n * Get the icon class for chat conversations\n */\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-comments';\n }\n\n // ============================================\n // EVENT HANDLERS FROM CHILD COMPONENTS\n // ============================================\n\n /**\n * Handle refresh request from the conversation list.\n * After the list refreshes, also reload messages in the active chat area so any\n * new agent responses are visible without a full page reload.\n */\n onRefreshRequested(): void {\n void this.chatArea?.reloadMessages();\n }\n\n /**\n * Handle conversation deletion from the list.\n * If the deleted conversation was selected, navigate to the first remaining conversation.\n */\n onConversationDeleted(deletedId: string): void {\n if (this.selectedConversationId === deletedId) {\n const remaining = this.conversationData.conversations.filter(c => c.ID !== deletedId);\n if (remaining.length > 0) {\n void this.selectConversation(remaining[0].ID);\n this.updateUrl();\n } else {\n this.selectedConversationId = null;\n this.selectedConversation = null;\n this.selectedThreadId = null;\n this.isNewUnsavedConversation = true;\n this.updateUrl();\n }\n }\n }\n\n /**\n * Handle conversation selection from the list\n */\n async onConversationSelected(conversationId: string): Promise<void> {\n await this.selectConversation(conversationId);\n this.selectedThreadId = null; // Clear thread when switching conversations\n this.isNewUnsavedConversation = false;\n this.updateUrl();\n\n // Auto-collapse if mobile OR if sidebar is not pinned\n if (this.isMobileView || !this.isSidebarPinned) {\n this.collapseSidebar();\n }\n }\n\n @HostListener('window:resize')\n onWindowResize(): void {\n this.checkMobileView();\n }\n\n /**\n * Handle clicks outside the sidebar to auto-collapse when unpinned\n */\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n // Only handle when sidebar is expanded but unpinned\n if (this.isSidebarCollapsed || this.isSidebarPinned) {\n return;\n }\n\n // Check if click is outside the sidebar\n const target = event.target as HTMLElement;\n const sidebarElement = target.closest('.conversation-sidebar');\n const expandHandle = target.closest('.sidebar-expand-handle');\n\n // If click is outside sidebar and expand handle, collapse it\n if (!sidebarElement && !expandHandle) {\n this.collapseSidebar();\n }\n }\n\n /**\n * Check if we're in mobile view and handle state accordingly\n */\n private checkMobileView(): void {\n const wasMobile = this.isMobileView;\n this.isMobileView = window.innerWidth < 768;\n\n if (this.isMobileView && !wasMobile) {\n // Switched to mobile - default to collapsed\n this.isSidebarCollapsed = true;\n }\n }\n\n /**\n * Collapse sidebar\n */\n collapseSidebar(): void {\n this.isSidebarCollapsed = true;\n }\n\n /**\n * Expand sidebar (pinned - stays open until unpinned)\n */\n expandSidebar(): void {\n this.isSidebarCollapsed = false;\n this.isSidebarPinned = true; // Pin it so it stays open\n this.saveSidebarState();\n }\n\n /**\n * Handle sidebar resize start\n */\n onSidebarResizeStart(event: MouseEvent): void {\n event.preventDefault();\n this.isSidebarResizing = true;\n this.sidebarResizeStartX = event.clientX;\n this.sidebarResizeStartWidth = this.sidebarWidth;\n\n // Disable transitions during resize for immediate feedback\n this.sidebarTransitionsEnabled = false;\n\n // Add event listeners for mousemove and mouseup\n document.addEventListener('mousemove', this.onSidebarResizeMove);\n document.addEventListener('mouseup', this.onSidebarResizeEnd);\n }\n\n /**\n * Handle sidebar resize move (bound method for proper 'this' context)\n */\n private onSidebarResizeMove = (event: MouseEvent): void => {\n if (!this.isSidebarResizing) return;\n\n const delta = event.clientX - this.sidebarResizeStartX;\n const newWidth = this.sidebarResizeStartWidth + delta;\n\n // Clamp to min/max bounds\n this.sidebarWidth = Math.max(this.SIDEBAR_MIN_WIDTH, Math.min(this.SIDEBAR_MAX_WIDTH, newWidth));\n this.cdr.detectChanges();\n };\n\n /**\n * Handle sidebar resize end (bound method for proper 'this' context)\n */\n private onSidebarResizeEnd = (): void => {\n if (!this.isSidebarResizing) return;\n\n this.isSidebarResizing = false;\n\n // Re-enable transitions for collapse/expand animations\n this.sidebarTransitionsEnabled = true;\n\n // Remove event listeners\n document.removeEventListener('mousemove', this.onSidebarResizeMove);\n document.removeEventListener('mouseup', this.onSidebarResizeEnd);\n\n // Save the new width to User Settings\n this.saveSidebarState();\n };\n\n /**\n * Pin sidebar - keep it open after selection\n */\n pinSidebar(): void {\n this.isSidebarPinned = true;\n this.saveSidebarState();\n }\n\n /**\n * Unpin sidebar - will auto-collapse on next selection\n */\n unpinSidebar(): void {\n this.isSidebarPinned = false;\n this.collapseSidebar();\n this.saveSidebarState();\n }\n\n /**\n * Save sidebar state to User Settings (server only - no localStorage fallback)\n * Uses debouncing to avoid excessive database writes\n */\n private saveSidebarState(): void {\n // Debounce the server save to avoid excessive writes\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n }\n this.saveSettingsTimeout = setTimeout(() => {\n this.saveSidebarStateToServer();\n }, 1000); // 1 second debounce\n }\n\n /**\n * Save sidebar state to User Settings entity on server using UserInfoEngine for cached lookup\n */\n private async saveSidebarStateToServer(): Promise<void> {\n try {\n const userId = this.currentUser?.ID;\n if (!userId) {\n return;\n }\n\n const stateToSave = {\n collapsed: this.isSidebarCollapsed,\n pinned: this.isSidebarPinned,\n width: this.sidebarWidth\n };\n\n const engine = UserInfoEngine.Instance;\n const md = new Metadata();\n\n // Find existing setting from cached user settings\n let setting = engine.UserSettings.find(s => s.Setting === this.USER_SETTING_SIDEBAR_KEY);\n\n if (!setting) {\n // Create new setting\n setting = await md.GetEntityObject<MJUserSettingEntity>('MJ: User Settings');\n setting.UserID = userId;\n setting.Setting = this.USER_SETTING_SIDEBAR_KEY;\n }\n\n setting.Value = JSON.stringify(stateToSave);\n await setting.Save();\n } catch (error) {\n console.warn('Failed to save sidebar state to User Settings:', error);\n }\n }\n\n /**\n * Load sidebar state from User Settings (server) using UserInfoEngine\n * For new users with no saved state, defaults to collapsed with new conversation\n */\n private async loadSidebarState(): Promise<void> {\n try {\n const userId = this.currentUser?.ID;\n if (userId) {\n // Load from cached User Settings\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === this.USER_SETTING_SIDEBAR_KEY);\n\n if (setting?.Value) {\n const state = JSON.parse(setting.Value);\n this.isSidebarCollapsed = state.collapsed ?? true;\n this.isSidebarPinned = state.pinned ?? false;\n this.sidebarWidth = state.width ?? 300;\n // Clamp width to valid range\n this.sidebarWidth = Math.max(this.SIDEBAR_MIN_WIDTH, Math.min(this.SIDEBAR_MAX_WIDTH, this.sidebarWidth));\n this.isSidebarSettingsLoaded = true;\n return;\n }\n }\n\n // No saved state found - NEW USER DEFAULT:\n // Start with sidebar collapsed and show new conversation screen\n this.isSidebarCollapsed = true;\n this.isSidebarPinned = false;\n this.sidebarWidth = 300;\n this.isNewUnsavedConversation = true;\n this.isSidebarSettingsLoaded = true;\n } catch (error) {\n console.warn('Failed to load sidebar state:', error);\n // Default to collapsed for new users on error\n this.isSidebarCollapsed = true;\n this.isSidebarPinned = false;\n this.sidebarWidth = 300;\n this.isSidebarSettingsLoaded = true;\n }\n }\n\n /**\n * Handle new conversation request from the list\n */\n onNewConversationRequested(): void {\n this.selectedConversationId = null;\n this.selectedConversation = null;\n this.selectedThreadId = null;\n this.isNewUnsavedConversation = true;\n this.updateUrl();\n\n // Auto-collapse if mobile OR if sidebar is not pinned\n if (this.isMobileView || !this.isSidebarPinned) {\n this.collapseSidebar();\n }\n }\n\n /**\n * Handle conversation created from chat area (after first message in new conversation).\n * The event now includes pending message and attachments for atomic state update.\n */\n async onConversationCreated(event: {\n conversation: MJConversationEntity;\n pendingMessage?: string;\n pendingAttachments?: PendingAttachment[];\n }): Promise<void> {\n // Set ALL state atomically before Angular change detection runs\n this.pendingMessageToSend = event.pendingMessage || null;\n this.pendingAttachmentsToSend = event.pendingAttachments || null;\n this.selectedConversationId = event.conversation.ID;\n this.selectedConversation = event.conversation;\n this.isNewUnsavedConversation = false;\n this.updateUrl();\n }\n\n /**\n * Handle conversation rename event\n */\n onConversationRenamed(event: { conversationId: string; name: string; description: string }): void {\n // Trigger rename animation in the list\n this.renamedConversationId = event.conversationId;\n\n // Clear the animation trigger after it completes\n setTimeout(() => {\n this.renamedConversationId = null;\n }, 1500);\n }\n\n /**\n * Handle thread opened event\n */\n onThreadOpened(threadId: string): void {\n this.selectedThreadId = threadId;\n }\n\n /**\n * Handle thread closed event\n */\n onThreadClosed(): void {\n this.selectedThreadId = null;\n }\n\n /**\n * Handle pending artifact consumed event\n */\n onPendingArtifactConsumed(): void {\n this.pendingArtifactId = null;\n this.pendingArtifactVersionNumber = null;\n // Update URL to remove artifact params\n this.updateUrl();\n }\n\n /**\n * Handle pending message consumed event\n */\n onPendingMessageConsumed(): void {\n this.pendingMessageToSend = null;\n this.pendingAttachmentsToSend = null;\n }\n\n /**\n * Handle pending message requested event (from empty state creating conversation).\n * @deprecated Use onConversationCreated with pendingMessage instead - this is kept for backwards compatibility.\n */\n onPendingMessageRequested(event: {text: string; attachments: PendingAttachment[]}): void {\n this.pendingMessageToSend = event.text;\n this.pendingAttachmentsToSend = event.attachments || null;\n }\n\n /**\n * Handle navigation request from artifact viewer panel within the chat area.\n * Converts the link event to a generic navigation request and uses NavigationService.\n */\n onArtifactLinkClicked(event: {\n type: 'conversation' | 'collection';\n id: string;\n artifactId?: string;\n versionNumber?: number;\n }): void {\n // Map the link type to the nav item name\n const navItemName = event.type === 'conversation' ? 'Conversations' : 'Collections';\n\n // Build configuration params to pass to the target resource\n const params: Record<string, unknown> = {};\n if (event.type === 'conversation') {\n params['conversationId'] = event.id;\n } else {\n params['collectionId'] = event.id;\n }\n\n // Include artifact info so destination can open it\n if (event.artifactId) {\n params['artifactId'] = event.artifactId;\n if (event.versionNumber) {\n params['versionNumber'] = event.versionNumber;\n }\n }\n\n // Navigate using the generic nav item method\n this.navigationService.OpenNavItemByName(navItemName, params);\n }\n\n /**\n * Handle entity record open request from chat area (from React component grids).\n * Uses NavigationService to open the record in a new tab.\n */\n onOpenEntityRecord(event: {entityName: string; compositeKey: CompositeKey}): void {\n this.navigationService.OpenEntityRecord(event.entityName, event.compositeKey);\n }\n\n /**\n * Handle navigation request from artifact viewer plugins.\n * Opens the target nav item (switching apps if needed) then applies query params to the URL.\n */\n async onNavigationRequest(event: NavigationRequest): Promise<void> {\n const appId = event.appName ? this.resolveAppId(event.appName) : undefined;\n await this.navigationService.OpenNavItemByName(event.navItemName, undefined, appId, {\n queryParams: event.queryParams\n });\n }\n\n /**\n * Resolve an application name to its ID.\n */\n private resolveAppId(appName: string): string | undefined {\n const md = new Metadata();\n const apps = md.Applications;\n const app = apps.find(a => a.Name.toLowerCase() === appName.toLowerCase());\n return app?.ID;\n }\n\n /**\n * Handle actionable commands that require app-specific navigation (open:resource).\n * open:url commands are already handled directly by UICommandHandlerService.\n */\n private handleActionableCommand(command: ActionableCommand): void {\n if (command.type === 'open:resource') {\n const resourceCommand = command as OpenResourceCommand;\n if (resourceCommand.resourceType === 'Record' && resourceCommand.entityName) {\n const compositeKey = new CompositeKey([{\n FieldName: 'ID',\n Value: resourceCommand.resourceId\n }]);\n this.navigationService.OpenEntityRecord(resourceCommand.entityName, compositeKey);\n } else if (resourceCommand.resourceType === 'Report' || resourceCommand.resourceType === 'Dashboard') {\n // Reports and dashboards from agents are stored as conversation artifacts.\n // Find the most recent artifact in the active conversation and open it.\n this.openMostRecentArtifact();\n }\n }\n }\n\n /**\n * Open the most recent artifact in the active conversation's artifact viewer.\n * Used for open:resource commands with resourceType Report/Dashboard where\n * the resourceId is an agent-internal ID, not a database artifact ID.\n */\n private openMostRecentArtifact(): void {\n if (!this.chatArea) return;\n\n // Find the last artifact across all messages\n const artifactMap = this.chatArea.artifactsByDetailId;\n let latestArtifact: { artifactId: string; versionId?: string } | null = null;\n for (const artifacts of artifactMap.values()) {\n if (artifacts.length > 0) {\n const last = artifacts[artifacts.length - 1];\n latestArtifact = {\n artifactId: last.artifactId,\n versionId: last.artifactVersionId\n };\n }\n }\n\n if (latestArtifact) {\n this.chatArea.onArtifactClicked(latestArtifact);\n } else {\n console.warn('No artifacts found in conversation to open for Report/Dashboard command');\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"chat-conversations-resource.component.js","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/chat-conversations-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ViewEncapsulation, OnDestroy, ViewChild, ChangeDetectorRef, HostListener } from '@angular/core';\nimport { Router, NavigationEnd } from '@angular/router';\nimport { Metadata, CompositeKey } from '@memberjunction/core';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { ResourceData, MJEnvironmentEntityExtended, MJConversationEntity, MJUserSettingEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { ConversationDataService, ConversationChatAreaComponent, ConversationListComponent, MentionAutocompleteService, ConversationStreamingService, ActiveTasksService, PendingAttachment, UICommandHandlerService } from '@memberjunction/ng-conversations';\nimport { ActionableCommand, OpenResourceCommand } from '@memberjunction/ai-core-plus';\nimport { NavigationRequest } from '@memberjunction/ng-artifacts';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { Subject, takeUntil, filter } from 'rxjs';\n/**\n * Chat Conversations Resource - wraps the conversation chat area for tab-based display\n * Extends BaseResourceComponent to work with the resource type system\n * Displays conversation list sidebar + active conversation chat interface\n * Designed to work with the tab system for multi-tab conversation management\n *\n * This component manages its own selection state locally, following the encapsulation pattern:\n * - Services (ConversationDataService) are used for shared DATA (caching, loading, saving)\n * - Local state variables manage SELECTION state (which conversation is active)\n * - State flows down to children via @Input, events flow up via @Output\n */\n@RegisterClass(BaseResourceComponent, 'ChatConversationsResource')\n@Component({\n standalone: false,\n selector: 'mj-chat-conversations-resource',\n template: `\n @if (isReady) {\n <div class=\"chat-conversations-container\">\n <!-- Left sidebar: Conversation list -->\n @if (isSidebarSettingsLoaded) {\n <div class=\"conversation-sidebar\"\n [class.collapsed]=\"isSidebarCollapsed\"\n [class.no-transition]=\"!sidebarTransitionsEnabled\"\n [style.width.px]=\"isSidebarCollapsed ? 0 : sidebarWidth\">\n @if (currentUser) {\n <mj-conversation-list\n #conversationList\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [selectedConversationId]=\"selectedConversationId\"\n [renamedConversationId]=\"renamedConversationId\"\n [isSidebarPinned]=\"isSidebarPinned\"\n [isMobileView]=\"isMobileView\"\n (conversationSelected)=\"onConversationSelected($event)\"\n (conversationDeleted)=\"onConversationDeleted($event)\"\n (newConversationRequested)=\"onNewConversationRequested()\"\n (pinSidebarRequested)=\"pinSidebar()\"\n (unpinSidebarRequested)=\"unpinSidebar()\"\n (refreshRequested)=\"onRefreshRequested()\">\n </mj-conversation-list>\n }\n </div>\n }\n <!-- Resize handle for sidebar (only when expanded and settings loaded) -->\n @if (!isSidebarCollapsed && isSidebarSettingsLoaded) {\n <div class=\"sidebar-resize-handle\"\n (mousedown)=\"onSidebarResizeStart($event)\"></div>\n }\n <!-- Main area: Chat interface -->\n <div class=\"conversation-main\">\n @if (currentUser) {\n <mj-conversation-chat-area\n #chatArea\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [conversationId]=\"selectedConversationId\"\n [conversation]=\"selectedConversation\"\n [threadId]=\"selectedThreadId\"\n [isNewConversation]=\"isNewUnsavedConversation\"\n [pendingMessage]=\"pendingMessageToSend\"\n [pendingAttachments]=\"pendingAttachmentsToSend\"\n [pendingArtifactId]=\"pendingArtifactId\"\n [pendingArtifactVersionNumber]=\"pendingArtifactVersionNumber\"\n [showSidebarToggle]=\"isSidebarCollapsed && isSidebarSettingsLoaded\"\n (sidebarToggleClicked)=\"expandSidebar()\"\n (conversationRenamed)=\"onConversationRenamed($event)\"\n (conversationCreated)=\"onConversationCreated($event)\"\n (threadOpened)=\"onThreadOpened($event)\"\n (threadClosed)=\"onThreadClosed()\"\n (pendingArtifactConsumed)=\"onPendingArtifactConsumed()\"\n (pendingMessageConsumed)=\"onPendingMessageConsumed()\"\n (pendingMessageRequested)=\"onPendingMessageRequested($event)\"\n (artifactLinkClicked)=\"onArtifactLinkClicked($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (navigationRequest)=\"onNavigationRequest($event)\">\n </mj-conversation-chat-area>\n }\n </div>\n </div>\n } @else {\n <div class=\"initializing-container\">\n <mj-loading text=\"Initializing...\" size=\"large\"></mj-loading>\n </div>\n }\n \n <!-- Toast notifications container -->\n <mj-toast></mj-toast>\n `,\n 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 #e0e0e0;\n overflow-y: auto;\n background: #f5f5f5;\n transition: width 0.3s ease;\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: #1e40af;\n }\n\n .sidebar-resize-handle:active {\n background: #1e3a8a;\n }\n\n .sidebar-resize-handle::before {\n content: '';\n position: absolute;\n left: -4px;\n right: -4px;\n top: 0;\n bottom: 0;\n cursor: ew-resize;\n }\n\n .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 encapsulation: ViewEncapsulation.None\n})\nexport class ChatConversationsResource extends BaseResourceComponent implements OnDestroy {\n @ViewChild('conversationList') conversationList?: ConversationListComponent;\n @ViewChild('chatArea') chatArea?: ConversationChatAreaComponent;\n\n public currentUser: any = null;\n private destroy$ = new Subject<void>();\n private skipUrlUpdate = true; // Skip URL updates during initialization\n private lastNavigatedUrl: string = ''; // Track URL to avoid reacting to our own navigation\n\n // Ready flag - blocks child rendering until AIEngine is initialized\n public isReady: boolean = false;\n\n // LOCAL SELECTION STATE - each wrapper instance manages its own selection\n public selectedConversationId: string | null = null;\n public selectedConversation: MJConversationEntity | null = null;\n public selectedThreadId: string | null = null;\n public isNewUnsavedConversation: boolean = false;\n public renamedConversationId: string | null = null;\n public isSidebarCollapsed: boolean = false;\n public isSidebarPinned: boolean = true; // Whether sidebar stays open after selection\n public isMobileView: boolean = false;\n public sidebarTransitionsEnabled: boolean = false; // Disabled during initial load to prevent jarring animation\n public isSidebarSettingsLoaded: boolean = false; // Prevents UI flash while loading settings\n\n // Sidebar resize state\n public sidebarWidth: number = 300; // Default width in pixels\n private isSidebarResizing: boolean = false;\n private sidebarResizeStartX: number = 0;\n private sidebarResizeStartWidth: number = 0;\n private readonly SIDEBAR_MIN_WIDTH = 200;\n private readonly SIDEBAR_MAX_WIDTH = 500;\n\n // Pending navigation state\n public pendingArtifactId: string | null = null;\n public pendingArtifactVersionNumber: number | null = null;\n public pendingMessageToSend: string | null = null;\n public pendingAttachmentsToSend: PendingAttachment[] | null = null;\n\n // User Settings persistence\n private readonly USER_SETTING_SIDEBAR_KEY = 'Conversations.SidebarState';\n private saveSettingsTimeout: ReturnType<typeof setTimeout> | null = null;\n\n constructor(\n private navigationService: NavigationService,\n private conversationData: ConversationDataService,\n private router: Router,\n private mentionAutocompleteService: MentionAutocompleteService,\n private cdr: ChangeDetectorRef,\n private streamingService: ConversationStreamingService,\n private activeTasksService: ActiveTasksService,\n private uiCommandHandler: UICommandHandlerService\n ) {\n super();\n }\n\n async ngOnInit() {\n const md = new Metadata();\n this.currentUser = md.CurrentUser;\n\n // Check initial mobile state and set default collapsed\n this.checkMobileView();\n if (this.isMobileView) {\n this.isSidebarCollapsed = true;\n this.isSidebarSettingsLoaded = true; // Mobile uses defaults, no need to load from server\n // Enable transitions after a brief delay to ensure initial state is applied\n setTimeout(() => {\n this.sidebarTransitionsEnabled = true;\n }, 50);\n } else {\n // Load sidebar state from User Settings (non-blocking)\n this.loadSidebarState().then(() => {\n this.cdr.detectChanges();\n // Enable transitions after state is loaded and applied\n setTimeout(() => {\n this.sidebarTransitionsEnabled = true;\n }, 50);\n });\n }\n\n // CRITICAL: Initialize AIEngine and mention service BEFORE children render\n // This prevents the slow first-load issue where each child would trigger initialization\n await this.initializeEngines();\n\n // Initialize global streaming service for PubSub updates\n // This enables reconnection to in-progress agents after browser refresh\n this.streamingService.initialize();\n\n // CRITICAL: Set selectedConversationId SYNCHRONOUSLY before child components initialize\n // Parse URL first and apply state synchronously for the ID\n const urlState = this.parseUrlState();\n\n if (urlState) {\n // Set conversationId synchronously so child components see it immediately\n if (urlState.conversationId) {\n this.selectedConversationId = urlState.conversationId;\n this.isNewUnsavedConversation = false;\n }\n if (urlState.artifactId) {\n this.pendingArtifactId = urlState.artifactId;\n this.pendingArtifactVersionNumber = urlState.versionNumber || null;\n }\n // Load the conversation entity asynchronously (non-blocking)\n this.loadConversationEntity(urlState.conversationId);\n } else {\n // Check if we have navigation params from config (e.g., from Collections linking here)\n this.applyConfigurationParams();\n }\n\n // Subscribe to router NavigationEnd events for back/forward button support\n this.router.events\n .pipe(\n filter((event): event is NavigationEnd => event instanceof NavigationEnd),\n takeUntil(this.destroy$)\n )\n .subscribe(event => {\n const currentUrl = event.urlAfterRedirects || event.url;\n if (currentUrl !== this.lastNavigatedUrl) {\n this.onExternalNavigation(currentUrl);\n }\n });\n\n // Subscribe to actionable commands (open:resource) from the UI command handler service.\n // open:url commands are handled directly by the service; open:resource needs NavigationService.\n this.uiCommandHandler.actionableCommandRequested\n .pipe(takeUntil(this.destroy$))\n .subscribe(command => this.handleActionableCommand(command));\n\n // Enable URL updates after initialization\n this.skipUrlUpdate = false;\n\n // Update URL to reflect current state\n this.updateUrl();\n\n // Notify load complete after user is set\n setTimeout(() => {\n this.NotifyLoadComplete();\n }, 100);\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n\n // Clear any pending save timeout\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n }\n\n // Clean up resize event listeners\n document.removeEventListener('mousemove', this.onSidebarResizeMove);\n document.removeEventListener('mouseup', this.onSidebarResizeEnd);\n }\n\n /**\n * Initialize AI Engine, conversations, and services BEFORE child components render.\n * This prevents the slow first-load issue where initialization would block conversation loading.\n * The `false` parameter means \"don't force refresh if already initialized\".\n */\n private async initializeEngines(): Promise<void> {\n try {\n // Initialize AIEngine, conversations, and mention service in parallel\n await Promise.all([\n AIEngineBase.Instance.Config(false),\n this.conversationData.loadConversations(this.environmentId, this.currentUser),\n this.mentionAutocompleteService.initialize(this.currentUser)\n ]);\n\n // Restore active tasks AFTER conversations are cached (uses in-memory lookup)\n await this.activeTasksService.restoreFromDatabase(this.currentUser);\n\n // Mark as ready - child components can now render\n this.isReady = true;\n this.cdr.detectChanges();\n } catch (error) {\n console.error('Failed to initialize AI engines:', error);\n // Still mark as ready so UI isn't blocked forever\n this.isReady = true;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Parse URL query string for conversation state.\n * Query params: conversationId, artifactId, versionNumber\n */\n private parseUrlState(): { conversationId?: string; artifactId?: string; versionNumber?: number } | null {\n const url = this.router.url;\n const queryIndex = url.indexOf('?');\n if (queryIndex === -1) return null;\n\n const queryString = url.substring(queryIndex + 1);\n const params = new URLSearchParams(queryString);\n const conversationId = params.get('conversationId');\n const artifactId = params.get('artifactId');\n const versionNumber = params.get('versionNumber');\n\n if (!conversationId && !artifactId) return null;\n\n return {\n conversationId: conversationId || undefined,\n artifactId: artifactId || undefined,\n versionNumber: versionNumber ? parseInt(versionNumber, 10) : undefined\n };\n }\n\n /**\n * Load the conversation entity asynchronously (non-blocking).\n * The conversationId is already set synchronously, this just loads the full entity.\n */\n private async loadConversationEntity(conversationId: string | undefined): Promise<void> {\n if (!conversationId) return;\n\n // Try to get from cache first\n const conversation = this.conversationData.getConversationById(conversationId);\n if (conversation) {\n this.selectedConversation = conversation;\n }\n // If not in cache, the chat area component will handle loading it\n }\n\n /**\n * Apply configuration params from resource data (e.g., from deep-linking via Collections).\n * Sets state synchronously so child components see values immediately.\n */\n private applyConfigurationParams(): void {\n const config = this.Data?.Configuration;\n if (!config) return;\n\n // Set pending artifact if provided\n if (config.artifactId) {\n this.pendingArtifactId = config.artifactId as string;\n this.pendingArtifactVersionNumber = (config.versionNumber as number) || null;\n }\n\n // Set conversationId synchronously so child components see it immediately\n if (config.conversationId) {\n this.selectedConversationId = config.conversationId as string;\n this.isNewUnsavedConversation = false;\n // Load entity asynchronously\n this.loadConversationEntity(config.conversationId as string);\n }\n }\n\n /**\n * Apply navigation state to local selection state.\n * Sets state synchronously so child components see values immediately.\n */\n private applyNavigationState(state: { conversationId?: string; artifactId?: string; versionNumber?: number }): void {\n // Set pending artifact if provided (will be consumed by chat area after loading)\n if (state.artifactId) {\n this.pendingArtifactId = state.artifactId;\n this.pendingArtifactVersionNumber = state.versionNumber || null;\n }\n\n // Set the conversation synchronously\n if (state.conversationId) {\n this.selectedConversationId = state.conversationId;\n this.isNewUnsavedConversation = false;\n this.loadConversationEntity(state.conversationId);\n }\n }\n\n /**\n * Select a conversation by ID - loads the entity and updates local state\n */\n private async selectConversation(conversationId: string): Promise<void> {\n this.selectedConversationId = conversationId;\n this.isNewUnsavedConversation = false;\n\n // Load the conversation entity from data service\n const conversation = this.conversationData.getConversationById(conversationId);\n if (conversation) {\n this.selectedConversation = conversation;\n } else {\n // Conversation might not be loaded yet - the chat area will handle loading\n this.selectedConversation = null;\n }\n\n // Update URL if not skipping\n if (!this.skipUrlUpdate) {\n this.updateUrl();\n }\n }\n\n /**\n * Update URL query string to reflect current state.\n * Uses NavigationService for proper URL management that respects app-scoped routes.\n */\n private updateUrl(): void {\n const queryParams: Record<string, string | null> = {};\n\n // Add conversation ID\n if (this.selectedConversationId) {\n queryParams['conversationId'] = this.selectedConversationId;\n } else {\n queryParams['conversationId'] = null;\n }\n\n // Add artifact ID if we have a pending artifact (will be cleared once opened)\n if (this.pendingArtifactId) {\n queryParams['artifactId'] = this.pendingArtifactId;\n if (this.pendingArtifactVersionNumber) {\n queryParams['versionNumber'] = this.pendingArtifactVersionNumber.toString();\n }\n } else {\n queryParams['artifactId'] = null;\n queryParams['versionNumber'] = null;\n }\n\n // Use NavigationService to update query params properly\n this.navigationService.UpdateActiveTabQueryParams(queryParams);\n }\n\n /**\n * Handle external navigation (back/forward buttons).\n * Parses the URL and applies the state without triggering a new navigation.\n */\n private onExternalNavigation(url: string): void {\n // Check if this URL is for our component (contains our base path)\n const currentPath = this.router.url.split('?')[0];\n const newPath = url.split('?')[0];\n\n // Only handle if we're still on the same base path (same component instance)\n if (currentPath !== newPath) {\n return; // Different route entirely, shell will handle it\n }\n\n // Parse the new URL state\n const urlState = this.parseUrlFromString(url);\n\n // Apply the state without triggering URL updates\n this.skipUrlUpdate = true;\n if (urlState) {\n this.applyNavigationState(urlState);\n } else {\n // No params means clear state\n this.selectedConversationId = null;\n this.selectedConversation = null;\n this.selectedThreadId = null;\n this.pendingArtifactId = null;\n this.pendingArtifactVersionNumber = null;\n }\n this.skipUrlUpdate = false;\n\n // Update the tracked URL\n this.lastNavigatedUrl = url;\n }\n\n /**\n * Parse URL state from a URL string (used for external navigation).\n */\n private parseUrlFromString(url: string): { conversationId?: string; artifactId?: string; versionNumber?: number } | null {\n const queryIndex = url.indexOf('?');\n if (queryIndex === -1) return null;\n\n const queryString = url.substring(queryIndex + 1);\n const params = new URLSearchParams(queryString);\n const conversationId = params.get('conversationId');\n const artifactId = params.get('artifactId');\n const versionNumber = params.get('versionNumber');\n\n if (!conversationId && !artifactId) return null;\n\n return {\n conversationId: conversationId || undefined,\n artifactId: artifactId || undefined,\n versionNumber: versionNumber ? parseInt(versionNumber, 10) : undefined\n };\n }\n\n /**\n * Get the environment ID from configuration or use default\n */\n get environmentId(): string {\n return this.Data?.Configuration?.environmentId || MJEnvironmentEntityExtended.DefaultEnvironmentID;\n }\n\n /**\n * Get the display name for chat conversations\n */\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n // If we have a specific conversation ID, we could load the conversation name\n // For now, just return a generic name\n if (data.Configuration?.conversationId) {\n return `Conversation: ${(data.Configuration.conversationId as string).substring(0, 8)}...`;\n }\n return 'Conversations';\n }\n\n /**\n * Get the icon class for chat conversations\n */\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-comments';\n }\n\n // ============================================\n // EVENT HANDLERS FROM CHILD COMPONENTS\n // ============================================\n\n /**\n * Handle refresh request from the conversation list.\n * After the list refreshes, also reload messages in the active chat area so any\n * new agent responses are visible without a full page reload.\n */\n onRefreshRequested(): void {\n void this.chatArea?.reloadMessages();\n }\n\n /**\n * Handle conversation deletion from the list.\n * If the deleted conversation was selected, navigate to the first remaining conversation.\n */\n onConversationDeleted(deletedId: string): void {\n if (this.selectedConversationId === deletedId) {\n const remaining = this.conversationData.conversations.filter(c => !UUIDsEqual(c.ID, deletedId));\n if (remaining.length > 0) {\n void this.selectConversation(remaining[0].ID);\n this.updateUrl();\n } else {\n this.selectedConversationId = null;\n this.selectedConversation = null;\n this.selectedThreadId = null;\n this.isNewUnsavedConversation = true;\n this.updateUrl();\n }\n }\n }\n\n /**\n * Handle conversation selection from the list\n */\n async onConversationSelected(conversationId: string): Promise<void> {\n await this.selectConversation(conversationId);\n this.selectedThreadId = null; // Clear thread when switching conversations\n this.isNewUnsavedConversation = false;\n this.updateUrl();\n\n // Auto-collapse if mobile OR if sidebar is not pinned\n if (this.isMobileView || !this.isSidebarPinned) {\n this.collapseSidebar();\n }\n }\n\n @HostListener('window:resize')\n onWindowResize(): void {\n this.checkMobileView();\n }\n\n /**\n * Handle clicks outside the sidebar to auto-collapse when unpinned\n */\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n // Only handle when sidebar is expanded but unpinned\n if (this.isSidebarCollapsed || this.isSidebarPinned) {\n return;\n }\n\n // Check if click is outside the sidebar\n const target = event.target as HTMLElement;\n const sidebarElement = target.closest('.conversation-sidebar');\n const expandHandle = target.closest('.sidebar-expand-handle');\n\n // If click is outside sidebar and expand handle, collapse it\n if (!sidebarElement && !expandHandle) {\n this.collapseSidebar();\n }\n }\n\n /**\n * Check if we're in mobile view and handle state accordingly\n */\n private checkMobileView(): void {\n const wasMobile = this.isMobileView;\n this.isMobileView = window.innerWidth < 768;\n\n if (this.isMobileView && !wasMobile) {\n // Switched to mobile - default to collapsed\n this.isSidebarCollapsed = true;\n }\n }\n\n /**\n * Collapse sidebar\n */\n collapseSidebar(): void {\n this.isSidebarCollapsed = true;\n }\n\n /**\n * Expand sidebar (pinned - stays open until unpinned)\n */\n expandSidebar(): void {\n this.isSidebarCollapsed = false;\n this.isSidebarPinned = true; // Pin it so it stays open\n this.saveSidebarState();\n }\n\n /**\n * Handle sidebar resize start\n */\n onSidebarResizeStart(event: MouseEvent): void {\n event.preventDefault();\n this.isSidebarResizing = true;\n this.sidebarResizeStartX = event.clientX;\n this.sidebarResizeStartWidth = this.sidebarWidth;\n\n // Disable transitions during resize for immediate feedback\n this.sidebarTransitionsEnabled = false;\n\n // Add event listeners for mousemove and mouseup\n document.addEventListener('mousemove', this.onSidebarResizeMove);\n document.addEventListener('mouseup', this.onSidebarResizeEnd);\n }\n\n /**\n * Handle sidebar resize move (bound method for proper 'this' context)\n */\n private onSidebarResizeMove = (event: MouseEvent): void => {\n if (!this.isSidebarResizing) return;\n\n const delta = event.clientX - this.sidebarResizeStartX;\n const newWidth = this.sidebarResizeStartWidth + delta;\n\n // Clamp to min/max bounds\n this.sidebarWidth = Math.max(this.SIDEBAR_MIN_WIDTH, Math.min(this.SIDEBAR_MAX_WIDTH, newWidth));\n this.cdr.detectChanges();\n };\n\n /**\n * Handle sidebar resize end (bound method for proper 'this' context)\n */\n private onSidebarResizeEnd = (): void => {\n if (!this.isSidebarResizing) return;\n\n this.isSidebarResizing = false;\n\n // Re-enable transitions for collapse/expand animations\n this.sidebarTransitionsEnabled = true;\n\n // Remove event listeners\n document.removeEventListener('mousemove', this.onSidebarResizeMove);\n document.removeEventListener('mouseup', this.onSidebarResizeEnd);\n\n // Save the new width to User Settings\n this.saveSidebarState();\n };\n\n /**\n * Pin sidebar - keep it open after selection\n */\n pinSidebar(): void {\n this.isSidebarPinned = true;\n this.saveSidebarState();\n }\n\n /**\n * Unpin sidebar - will auto-collapse on next selection\n */\n unpinSidebar(): void {\n this.isSidebarPinned = false;\n this.collapseSidebar();\n this.saveSidebarState();\n }\n\n /**\n * Save sidebar state to User Settings (server only - no localStorage fallback)\n * Uses debouncing to avoid excessive database writes\n */\n private saveSidebarState(): void {\n // Debounce the server save to avoid excessive writes\n if (this.saveSettingsTimeout) {\n clearTimeout(this.saveSettingsTimeout);\n }\n this.saveSettingsTimeout = setTimeout(() => {\n this.saveSidebarStateToServer();\n }, 1000); // 1 second debounce\n }\n\n /**\n * Save sidebar state to User Settings entity on server using UserInfoEngine for cached lookup\n */\n private async saveSidebarStateToServer(): Promise<void> {\n try {\n const userId = this.currentUser?.ID;\n if (!userId) {\n return;\n }\n\n const stateToSave = {\n collapsed: this.isSidebarCollapsed,\n pinned: this.isSidebarPinned,\n width: this.sidebarWidth\n };\n\n const engine = UserInfoEngine.Instance;\n const md = new Metadata();\n\n // Find existing setting from cached user settings\n let setting = engine.UserSettings.find(s => s.Setting === this.USER_SETTING_SIDEBAR_KEY);\n\n if (!setting) {\n // Create new setting\n setting = await md.GetEntityObject<MJUserSettingEntity>('MJ: User Settings');\n setting.UserID = userId;\n setting.Setting = this.USER_SETTING_SIDEBAR_KEY;\n }\n\n setting.Value = JSON.stringify(stateToSave);\n await setting.Save();\n } catch (error) {\n console.warn('Failed to save sidebar state to User Settings:', error);\n }\n }\n\n /**\n * Load sidebar state from User Settings (server) using UserInfoEngine\n * For new users with no saved state, defaults to collapsed with new conversation\n */\n private async loadSidebarState(): Promise<void> {\n try {\n const userId = this.currentUser?.ID;\n if (userId) {\n // Load from cached User Settings\n const engine = UserInfoEngine.Instance;\n const setting = engine.UserSettings.find(s => s.Setting === this.USER_SETTING_SIDEBAR_KEY);\n\n if (setting?.Value) {\n const state = JSON.parse(setting.Value);\n this.isSidebarCollapsed = state.collapsed ?? true;\n this.isSidebarPinned = state.pinned ?? false;\n this.sidebarWidth = state.width ?? 300;\n // Clamp width to valid range\n this.sidebarWidth = Math.max(this.SIDEBAR_MIN_WIDTH, Math.min(this.SIDEBAR_MAX_WIDTH, this.sidebarWidth));\n this.isSidebarSettingsLoaded = true;\n return;\n }\n }\n\n // No saved state found - NEW USER DEFAULT:\n // Start with sidebar collapsed and show new conversation screen\n this.isSidebarCollapsed = true;\n this.isSidebarPinned = false;\n this.sidebarWidth = 300;\n this.isNewUnsavedConversation = true;\n this.isSidebarSettingsLoaded = true;\n } catch (error) {\n console.warn('Failed to load sidebar state:', error);\n // Default to collapsed for new users on error\n this.isSidebarCollapsed = true;\n this.isSidebarPinned = false;\n this.sidebarWidth = 300;\n this.isSidebarSettingsLoaded = true;\n }\n }\n\n /**\n * Handle new conversation request from the list\n */\n onNewConversationRequested(): void {\n this.selectedConversationId = null;\n this.selectedConversation = null;\n this.selectedThreadId = null;\n this.isNewUnsavedConversation = true;\n this.updateUrl();\n\n // Auto-collapse if mobile OR if sidebar is not pinned\n if (this.isMobileView || !this.isSidebarPinned) {\n this.collapseSidebar();\n }\n }\n\n /**\n * Handle conversation created from chat area (after first message in new conversation).\n * The event now includes pending message and attachments for atomic state update.\n */\n async onConversationCreated(event: {\n conversation: MJConversationEntity;\n pendingMessage?: string;\n pendingAttachments?: PendingAttachment[];\n }): Promise<void> {\n // Set ALL state atomically before Angular change detection runs\n this.pendingMessageToSend = event.pendingMessage || null;\n this.pendingAttachmentsToSend = event.pendingAttachments || null;\n this.selectedConversationId = event.conversation.ID;\n this.selectedConversation = event.conversation;\n this.isNewUnsavedConversation = false;\n this.updateUrl();\n }\n\n /**\n * Handle conversation rename event\n */\n onConversationRenamed(event: { conversationId: string; name: string; description: string }): void {\n // Trigger rename animation in the list\n this.renamedConversationId = event.conversationId;\n\n // Clear the animation trigger after it completes\n setTimeout(() => {\n this.renamedConversationId = null;\n }, 1500);\n }\n\n /**\n * Handle thread opened event\n */\n onThreadOpened(threadId: string): void {\n this.selectedThreadId = threadId;\n }\n\n /**\n * Handle thread closed event\n */\n onThreadClosed(): void {\n this.selectedThreadId = null;\n }\n\n /**\n * Handle pending artifact consumed event\n */\n onPendingArtifactConsumed(): void {\n this.pendingArtifactId = null;\n this.pendingArtifactVersionNumber = null;\n // Update URL to remove artifact params\n this.updateUrl();\n }\n\n /**\n * Handle pending message consumed event\n */\n onPendingMessageConsumed(): void {\n this.pendingMessageToSend = null;\n this.pendingAttachmentsToSend = null;\n }\n\n /**\n * Handle pending message requested event (from empty state creating conversation).\n * @deprecated Use onConversationCreated with pendingMessage instead - this is kept for backwards compatibility.\n */\n onPendingMessageRequested(event: {text: string; attachments: PendingAttachment[]}): void {\n this.pendingMessageToSend = event.text;\n this.pendingAttachmentsToSend = event.attachments || null;\n }\n\n /**\n * Handle navigation request from artifact viewer panel within the chat area.\n * Converts the link event to a generic navigation request and uses NavigationService.\n */\n onArtifactLinkClicked(event: {\n type: 'conversation' | 'collection';\n id: string;\n artifactId?: string;\n versionNumber?: number;\n }): void {\n // Map the link type to the nav item name\n const navItemName = event.type === 'conversation' ? 'Conversations' : 'Collections';\n\n // Build configuration params to pass to the target resource\n const params: Record<string, unknown> = {};\n if (event.type === 'conversation') {\n params['conversationId'] = event.id;\n } else {\n params['collectionId'] = event.id;\n }\n\n // Include artifact info so destination can open it\n if (event.artifactId) {\n params['artifactId'] = event.artifactId;\n if (event.versionNumber) {\n params['versionNumber'] = event.versionNumber;\n }\n }\n\n // Navigate using the generic nav item method\n this.navigationService.OpenNavItemByName(navItemName, params);\n }\n\n /**\n * Handle entity record open request from chat area (from React component grids).\n * Uses NavigationService to open the record in a new tab.\n */\n onOpenEntityRecord(event: {entityName: string; compositeKey: CompositeKey}): void {\n this.navigationService.OpenEntityRecord(event.entityName, event.compositeKey);\n }\n\n /**\n * Handle navigation request from artifact viewer plugins.\n * Opens the target nav item (switching apps if needed) then applies query params to the URL.\n */\n async onNavigationRequest(event: NavigationRequest): Promise<void> {\n const appId = event.appName ? this.resolveAppId(event.appName) : undefined;\n await this.navigationService.OpenNavItemByName(event.navItemName, undefined, appId, {\n queryParams: event.queryParams\n });\n }\n\n /**\n * Resolve an application name to its ID.\n */\n private resolveAppId(appName: string): string | undefined {\n const md = new Metadata();\n const apps = md.Applications;\n const app = apps.find(a => a.Name.toLowerCase() === appName.toLowerCase());\n return app?.ID;\n }\n\n /**\n * Handle actionable commands that require app-specific navigation (open:resource).\n * open:url commands are already handled directly by UICommandHandlerService.\n */\n private handleActionableCommand(command: ActionableCommand): void {\n if (command.type === 'open:resource') {\n const resourceCommand = command as OpenResourceCommand;\n if (resourceCommand.resourceType === 'Record' && resourceCommand.entityName) {\n const compositeKey = new CompositeKey([{\n FieldName: 'ID',\n Value: resourceCommand.resourceId\n }]);\n this.navigationService.OpenEntityRecord(resourceCommand.entityName, compositeKey);\n } else if (resourceCommand.resourceType === 'Report' || resourceCommand.resourceType === 'Dashboard') {\n // Reports and dashboards from agents are stored as conversation artifacts.\n // Find the most recent artifact in the active conversation and open it.\n this.openMostRecentArtifact();\n }\n }\n }\n\n /**\n * Open the most recent artifact in the active conversation's artifact viewer.\n * Used for open:resource commands with resourceType Report/Dashboard where\n * the resourceId is an agent-internal ID, not a database artifact ID.\n */\n private openMostRecentArtifact(): void {\n if (!this.chatArea) return;\n\n // Find the last artifact across all messages\n const artifactMap = this.chatArea.artifactsByDetailId;\n let latestArtifact: { artifactId: string; versionId?: string } | null = null;\n for (const artifacts of artifactMap.values()) {\n if (artifacts.length > 0) {\n const last = artifacts[artifacts.length - 1];\n latestArtifact = {\n artifactId: last.artifactId,\n versionId: last.artifactVersionId\n };\n }\n }\n\n if (latestArtifact) {\n this.chatArea.onArtifactClicked(latestArtifact);\n } else {\n console.warn('No artifacts found in conversation to open for Report/Dashboard command');\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/dashboard-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,gBAAgB,EAA2B,UAAU,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACpH,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAkC,MAAM,2BAA2B,CAAC;AACrH,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAmB,0BAA0B,EAAwD,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAG7M,OAAO,EAAsD,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;;AAEtH;;;;GAIG;AACH,qBA4Ya,iBAAkB,SAAQ,qBAAqB;IAgEpD,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,GAAG;IAjEf,OAAO,CAAC,YAAY,CAAsC;IAC1D,OAAO,CAAC,UAAU,CAAS;IACe,gBAAgB,EAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAExF,4DAA4D;IACrD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC1C,4DAA4D;IACrD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE1C,4DAA4D;IAC5D,OAAO,CAAC,UAAU,CAAmC;IAErD,gFAAgF;IAChF,OAAO,CAAC,cAAc,CAAyC;IAE/D,yEAAyE;IAClE,eAAe,EAAE,iBAAiB,GAAG,IAAI,CAAQ;IAExD,iCAAiC;IAC1B,UAAU,UAAS;IAE1B,qBAAqB;IACd,WAAW,SAAM;IACjB,kBAAkB,SAAM;IAE/B,oDAAoD;IAC7C,oBAAoB,EAAE,wBAAwB,CAQnD;IAEF,0CAA0C;IACnC,eAAe,UAAS;IAE/B;;OAEG;IACH,OAAO,CAAC,QAAQ;IAYhB;;OAEG;IACH,OAAO,CAAC,UAAU;gBAMN,aAAa,EAAE,gBAAgB,EAC/B,iBAAiB,EAAE,iBAAiB,EACpC,GAAG,EAAE,iBAAiB;IAKlC,IAAa,IAAI,CAAC,KAAK,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"dashboard-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/dashboard-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,gBAAgB,EAA2B,UAAU,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACpH,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAkC,MAAM,2BAA2B,CAAC;AACrH,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAmB,0BAA0B,EAAwD,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAG7M,OAAO,EAAsD,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;;AAEtH;;;;GAIG;AACH,qBA4Ya,iBAAkB,SAAQ,qBAAqB;IAgEpD,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,GAAG;IAjEf,OAAO,CAAC,YAAY,CAAsC;IAC1D,OAAO,CAAC,UAAU,CAAS;IACe,gBAAgB,EAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAExF,4DAA4D;IACrD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC1C,4DAA4D;IACrD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE1C,4DAA4D;IAC5D,OAAO,CAAC,UAAU,CAAmC;IAErD,gFAAgF;IAChF,OAAO,CAAC,cAAc,CAAyC;IAE/D,yEAAyE;IAClE,eAAe,EAAE,iBAAiB,GAAG,IAAI,CAAQ;IAExD,iCAAiC;IAC1B,UAAU,UAAS;IAE1B,qBAAqB;IACd,WAAW,SAAM;IACjB,kBAAkB,SAAM;IAE/B,oDAAoD;IAC7C,oBAAoB,EAAE,wBAAwB,CAQnD;IAEF,0CAA0C;IACnC,eAAe,UAAS;IAE/B;;OAEG;IACH,OAAO,CAAC,QAAQ;IAYhB;;OAEG;IACH,OAAO,CAAC,UAAU;gBAMN,aAAa,EAAE,gBAAgB,EAC/B,iBAAiB,EAAE,iBAAiB,EACpC,GAAG,EAAE,iBAAiB;IAKlC,IAAa,IAAI,CAAC,KAAK,EAAE,YAAY,EAmBpC;IAGD,IAAa,IAAI,IAAI,YAAY,CAEhC;IAED,WAAW,IAAI,IAAI;IAUnB;;OAEG;IACI,cAAc,IAAI,IAAI;IAQ7B;;OAEG;IACH,OAAO,CAAC,aAAa;IAerB;;OAEG;IACI,UAAU,IAAI,IAAI;IAWzB;;OAEG;IACU,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB3C;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAOhC;;OAEG;IACI,eAAe,IAAI,IAAI;IAK9B;;OAEG;IACI,gBAAgB,IAAI,IAAI;IAK/B;;OAEG;IACI,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAe3D;;;OAGG;YACW,aAAa;IAiD3B;;;;;OAKG;YACW,gBAAgB;IA4D9B;;OAEG;YACW,sBAAsB;cAwEpB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAiBhG;;OAEG;YACW,wBAAwB;IAuEtC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA4B/B;;;OAGG;IACY,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB1E;;OAEG;IACG,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCAhjBtD,iBAAiB;2CAAjB,iBAAiB;CAmjB7B"}
|