@memberjunction/ng-dashboards 5.9.0 → 5.10.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/DashboardBrowser/dashboard-browser-resource.component.js +10 -10
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.js +16 -22
- package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +31 -11
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts +7 -7
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +1 -1
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts +3 -3
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/services/integration-data.service.d.ts +12 -12
- package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
- package/dist/Integration/services/integration-data.service.js +55 -143
- package/dist/Integration/services/integration-data.service.js.map +1 -1
- package/dist/__tests__/integration-data-service.test.js.map +1 -1
- package/package.json +40 -40
|
@@ -386,7 +386,7 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
|
|
|
386
386
|
* Includes extensive logging for debugging category creation issues
|
|
387
387
|
*/
|
|
388
388
|
async onCategoryCreate(event) {
|
|
389
|
-
console.
|
|
389
|
+
console.debug('[DashboardBrowserResource] Category create requested:', {
|
|
390
390
|
name: event.Name,
|
|
391
391
|
parentCategoryId: event.ParentCategoryId
|
|
392
392
|
});
|
|
@@ -394,27 +394,27 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
|
|
|
394
394
|
this.isLoading = true;
|
|
395
395
|
this.cdr.detectChanges();
|
|
396
396
|
const md = new Metadata();
|
|
397
|
-
console.
|
|
397
|
+
console.debug('[DashboardBrowserResource] Current user:', {
|
|
398
398
|
userId: md.CurrentUser?.ID,
|
|
399
399
|
userName: md.CurrentUser?.Name,
|
|
400
400
|
email: md.CurrentUser?.Email
|
|
401
401
|
});
|
|
402
402
|
const category = await md.GetEntityObject('MJ: Dashboard Categories');
|
|
403
|
-
console.
|
|
403
|
+
console.debug('[DashboardBrowserResource] Created category entity object');
|
|
404
404
|
// Set required fields
|
|
405
405
|
category.Name = event.Name;
|
|
406
406
|
category.UserID = md.CurrentUser.ID;
|
|
407
407
|
if (event.ParentCategoryId) {
|
|
408
408
|
category.ParentID = event.ParentCategoryId;
|
|
409
409
|
}
|
|
410
|
-
console.
|
|
410
|
+
console.debug('[DashboardBrowserResource] Category fields before save:', {
|
|
411
411
|
name: category.Name,
|
|
412
412
|
userId: category.UserID,
|
|
413
413
|
parentId: category.ParentID,
|
|
414
414
|
allFields: category.Fields.map(f => ({ name: f.Name, value: f.Value, dirty: f.Dirty }))
|
|
415
415
|
});
|
|
416
416
|
const saved = await category.Save();
|
|
417
|
-
console.
|
|
417
|
+
console.debug('[DashboardBrowserResource] Save result:', {
|
|
418
418
|
success: saved,
|
|
419
419
|
latestResult: category.LatestResult,
|
|
420
420
|
message: category.LatestResult?.Message,
|
|
@@ -422,7 +422,7 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
|
|
|
422
422
|
id: category.ID
|
|
423
423
|
});
|
|
424
424
|
if (saved) {
|
|
425
|
-
console.
|
|
425
|
+
console.debug('[DashboardBrowserResource] Category saved successfully, ID:', category.ID);
|
|
426
426
|
// Add to local array - engine will self-update
|
|
427
427
|
this.categories.push(category);
|
|
428
428
|
this.categories = [...this.categories].sort((a, b) => a.Name.localeCompare(b.Name));
|
|
@@ -449,14 +449,14 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
|
|
|
449
449
|
* Performs recursive deletion of category and all children
|
|
450
450
|
*/
|
|
451
451
|
async onCategoryDelete(event) {
|
|
452
|
-
console.
|
|
452
|
+
console.debug('[DashboardBrowserResource] Category delete requested:', event.Category.Name);
|
|
453
453
|
try {
|
|
454
454
|
this.isLoading = true;
|
|
455
455
|
this.cdr.detectChanges();
|
|
456
456
|
// Get all child categories recursively
|
|
457
457
|
const categoriesToDelete = this.getChildCategoriesRecursive(event.Category.ID);
|
|
458
458
|
categoriesToDelete.push(event.Category);
|
|
459
|
-
console.
|
|
459
|
+
console.debug('[DashboardBrowserResource] Deleting categories:', categoriesToDelete.map(c => c.Name));
|
|
460
460
|
// Delete in reverse order (children first)
|
|
461
461
|
for (const cat of categoriesToDelete.reverse()) {
|
|
462
462
|
// First, move any dashboards in this category to uncategorized
|
|
@@ -494,7 +494,7 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
|
|
|
494
494
|
* Navigates back to list view with optional category selection
|
|
495
495
|
*/
|
|
496
496
|
onBreadcrumbNavigate(event) {
|
|
497
|
-
console.
|
|
497
|
+
console.debug('[DashboardBrowserResource] Breadcrumb navigate:', event);
|
|
498
498
|
// CategoryId is null for root, or a category ID string
|
|
499
499
|
this.selectedCategoryId = event.CategoryId;
|
|
500
500
|
this.backToList();
|
|
@@ -915,7 +915,7 @@ let DashboardBrowserResourceComponent = class DashboardBrowserResourceComponent
|
|
|
915
915
|
// For owned dashboards, we don't add to effectiveCategoryMap
|
|
916
916
|
// so the browser will use the dashboard's actual CategoryID
|
|
917
917
|
}
|
|
918
|
-
console.
|
|
918
|
+
console.debug('[DashboardBrowserResource] Loaded from DashboardEngine:', {
|
|
919
919
|
dashboardCount: this.dashboards.length,
|
|
920
920
|
categoryCount: this.categories.length,
|
|
921
921
|
sharedDashboardsInEffectiveMap: this.effectiveCategoryMap.size,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-browser-resource.component.js","sourceRoot":"","sources":["../../src/DashboardBrowser/dashboard-browser-resource.component.ts","../../src/DashboardBrowser/dashboard-browser-resource.component.html"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAwC,uBAAuB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAEpH,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAG,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAqB,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAyF,eAAe,EAA2D,MAAM,+BAA+B,CAAC;AAEhN,OAAO,EAKH,4BAA4B,EAe/B,MAAM,qCAAqC,CAAC;;;;;;;;;;ICzBzC,+CAmB0D;IAAxD,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,yOAAiB,8BAAuB,KAAC,4NACxB,8BAAuB,KAAC,gOACtB,gCAAyB,KAAC,4NAC5B,8BAAuB,KAAC,gOACtB,gCAAyB,KAAC,8NAC3B,+BAAwB,KAAC,8NACzB,+BAAwB,KAAC,8NACzB,+BAAwB,KAAC,0OACnB,qCAA8B,KAAC;IACzD,iBAAuB;;;IAVrB,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,8CAAyB,iCACA,iDACgB,6BACpB,+BACE,0BACE,0BACA,uBACH,wDAC0B,qDACH;;;IAkCvC,gCAA+B;IAC7B,wBAAuC;IACvC,iCACF;IAAA,iBAAO;;;;IAUP,kCAG8B;IAA5B,kOAAS,wBAAiB,KAAC;IAC3B,wBAAqC;IACvC,iBAAS;;;;IAIT,kCAG6B;IAA3B,kOAAS,uBAAgB,KAAC;IAC1B,wBAAgC;IAClC,iBAAS;;;;IA1Cb,AAFF,8BAA4B,kCAWkB;IAA1C,iPAAY,mCAA4B,KAAC;IAC3C,iBAA0B;IAE1B,+BAA6B;IAE3B,iIAAqF;IAMrF,kCAG2B;IAAzB,oNAAS,qBAAc,KAAC;IACxB,wBAAgD;IAClD,iBAAS;IAET,mIAA6C;IAS7C,mIAA4C;IAShD,AADE,iBAAM,EACF;;;IA5CF,cAAyB;IAIzB,AADA,AADA,AADA,AADA,8CAAyB,8GACkC,8CACrB,2BACZ,wBACH;IASvB,eAKC;IALD,sHAKC;IAQD,eAOC;IAPD,uEAOC;IAED,cAOC;IAPD,sEAOC;;;;IASD,AAFF,AADF,8BAAmC,cACR,iBAIS;IAA9B,oNAAS,0BAAmB,KAAC;IAC7B,wBAAgC;IAChC,0BACF;IAAA,iBAAS;IAET,0BAAoC;IAGlC,AADF,+BAAiC,gBAMP;IAFtB,8UAAyB;IAEzB,iNAAQ,mBAAY,KAAC;IALvB,iBAKwB;IACxB,iCAIqC;IADnC,4VAAgC;IAGtC,AADE,AALE,iBAIqC,EACjC,EACF;IAGJ,AAFF,+BAA0B,kBAII;IAA1B,qNAAS,sBAAe,KAAC;IACzB,yBAAgC;IAChC,uBACF;IAAA,iBAAS;IACT,mCAEyB;IAAvB,qNAAS,mBAAY,KAAC;IACtB,yBACF;IAEJ,AADE,AADE,iBAAS,EACL,EACF;;;IAxBE,eAAyB;IAAzB,kDAAyB;IAMzB,cAAgC;IAAhC,yDAAgC;;;;IAkCxC,+CAIsC;IAApC,AADA,iPAAc,2BAAoB,KAAC,4NACtB,4BAAqB,KAAC;IACrC,iBAAsB;;;;;IAHpB,AADA,mDAA8B,gDACc;;;;IA9GhD,iHAAuB;IAmDvB,kHAAuB;IA6CrB,AADF,8BAA4B,gCAQ8B;IAAtD,AADA,8OAAoB,iCAA0B,KAAC,uOACxB,oCAA6B,KAAC;IAEzD,AADE,iBAAsB,EAClB;IAEN,iIAAuB;IASvB,8CAM0C;IAAxC,AADA,wNAAS,kCAA2B,KAAC,6MACxB,gCAAyB,KAAC;IACzC,iBAAsB;IAEtB,6CAQoC;IAAlC,AADA,wNAAa,0BAAmB,KAAC,2MACpB,0BAAmB,KAAC;IACnC,iBAAoB;IAEpB,qDAGyC;IAAvC,gOAAU,kCAA2B,KAAC;IACxC,iBAA4B;;;;IA5I5B,iDAiDC;IAED,cA0CC;IA1CD,iDA0CC;IAKG,eAA+B;IAG/B,AADA,AADA,AADA,oDAA+B,qCACF,sBACR,yBACG;IAM5B,eAOC;IAPD,6CAOC;IAGC,cAA4B;IAG5B,AADA,AADA,AADA,iDAA4B,yCACK,mCACN,+FACiB;IAM5C,cAA6B;IAG7B,AAHA,kDAA6B,sGAGmE;IAQhG,cAA2B;IAC3B,AADA,gDAA2B,uCACI;;ADrIrC;;;;GAIG;AASI,IAAM,iCAAiC,GAAvC,MAAM,iCAAkC,SAAQ,qBAAqB;IA6D5D;IACA;IACA;IA9DZ,2CAA2C;IAC3C,QAAQ;IACR,2CAA2C;IAEpC,IAAI,GAAgB,MAAM,CAAC;IAC3B,SAAS,GAAG,KAAK,CAAC;IAClB,UAAU,GAAwB,EAAE,CAAC;IACrC,UAAU,GAAgC,EAAE,CAAC;IAC7C,iBAAiB,GAA6B,IAAI,CAAC;IACnD,kBAAkB,GAAkB,IAAI,CAAC;IACzC,QAAQ,GAA6B,OAAO,CAAC;IAC7C,kBAAkB,GAAG,KAAK,CAAC;IAElC,sBAAsB;IACf,gBAAgB,GAAG,KAAK,CAAC;IACzB,iBAAiB,GAA0B,IAAI,CAAC;IAChD,oBAAoB,GAAqC,IAAI,CAAC;IAC9D,iBAAiB,GAAW,EAAE,CAAC;IAEtC,uBAAuB;IAChB,iBAAiB,GAAG,KAAK,CAAC;IAC1B,cAAc,GAAW,EAAE,CAAC;IAC5B,iBAAiB,GAAW,EAAE,CAAC;IAEtC,qBAAqB;IACd,eAAe,GAAG,KAAK,CAAC;IAE/B,uCAAuC;IAChC,WAAW,GAAG,EAAE,CAAC;IACjB,kBAAkB,GAAG,EAAE,CAAC;IACvB,YAAY,GAAG,EAAE,CAAC;IAClB,mBAAmB,GAAG,EAAE,CAAC;IACzB,cAAc,GAAG,EAAE,CAAC;IAE5B,0CAA0C;IACnC,4BAA4B,GAA6B;QAC5D,WAAW,EAAE,EAAE;QACf,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,IAAI;QACf,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,IAAI;QACb,gBAAgB,EAAE,OAAO;KAC5B,CAAC;IAEF,gEAAgE;IACzD,uBAAuB,GAA0C,IAAI,GAAG,EAAE,CAAC;IAElF,qGAAqG;IAC9F,oBAAoB,GAA+B,IAAI,GAAG,EAAE,CAAC;IAEnD,SAAS,GAAG,IAAI,OAAO,EAAQ,CAAC;IAEnB,eAAe,CAA4B;IAEzE,2CAA2C;IAC3C,cAAc;IACd,2CAA2C;IAE3C,YACY,GAAsB,EACtB,KAAqB,EACrB,iBAAoC;QAE5C,KAAK,EAAE,CAAC;QAJA,QAAG,GAAH,GAAG,CAAmB;QACtB,UAAK,GAAL,KAAK,CAAgB;QACrB,sBAAiB,GAAjB,iBAAiB,CAAmB;IAGhD,CAAC;IAED,2CAA2C;IAC3C,YAAY;IACZ,2CAA2C;IAE3C,QAAQ;QACJ,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC9B,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAED,WAAW;QACP,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACtB,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAED,2CAA2C;IAC3C,uCAAuC;IACvC,2CAA2C;IAE3C,KAAK,CAAC,sBAAsB,CAAC,IAAkB;QAC3C,OAAO,YAAY,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,IAAkB;QACzC,OAAO,wBAAwB,CAAC;IACpC,CAAC;IAED,2CAA2C;IAC3C,sCAAsC;IACtC,2CAA2C;IAE3C;;OAEG;IACI,eAAe,CAAC,KAAyB;QAC5C,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YACrB,yDAAyD;YACzD,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAChC,KAAK,CAAC,SAAS,CAAC,EAAE,EAClB,KAAK,CAAC,SAAS,CAAC,IAAI,EACpB,EAAE,WAAW,EAAE,IAAI,EAAE,CACxB,CAAC;QACN,CAAC;aAAM,CAAC;YACJ,yCAAyC;YACzC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACxC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,YAAY;QACf,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAChC,IAAI,CAAC,iBAAiB,CAAC,EAAE,EACzB,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAC3B,EAAE,WAAW,EAAE,IAAI,EAAE,CACxB,CAAC;QACN,CAAC;IACL,CAAC;IAED;;OAEG;IACI,eAAe,CAAC,KAAyB;QAC5C,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,iBAAiB,CAAC,KAA2B;QACtD,sDAAsD;QACtD,8CAA8C;QAC9C,IAAI,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YAEzB,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBACvC,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC;gBACzC,IAAI,OAAO,EAAE,CAAC;oBACV,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;oBAC7E,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;wBACb,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;oBACrC,CAAC;gBACL,CAAC;YACL,CAAC;YAED,yDAAyD;YACzD,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;QACvD,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,eAAe,CAAC,KAAyB;QAClD,IAAI,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YAEzB,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,aAAa,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC;YAExC,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBACvC,MAAM,WAAW,GAAG,eAAe,CAAC,QAAQ,CAAC,uBAAuB,CAAC,SAAS,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;gBAElG,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;oBACtB,0CAA0C;oBAC1C,SAAS,CAAC,UAAU,GAAG,KAAK,CAAC,gBAAgB,CAAC;oBAC9C,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;gBAC3B,CAAC;qBAAM,CAAC;oBACJ,sDAAsD;oBACtD,MAAM,IAAI,CAAC,0BAA0B,CAAC,SAAS,CAAC,EAAE,EAAE,aAAa,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;oBAE3F,+DAA+D;oBAC/D,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;gBACxE,CAAC;YACL,CAAC;YAED,uDAAuD;YACvD,IAAI,CAAC,oBAAoB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAE/D,mBAAmB;YACnB,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;YAEvC,4DAA4D;YAC5D,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,gBAAgB,CAAC;YACjD,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAChC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;QACrD,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,0BAA0B,CACpC,WAAmB,EACnB,MAAc,EACd,UAAyB;QAEzB,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;QAE1B,yDAAyD;QACzD,MAAM,aAAa,GAAG,eAAe,CAAC,QAAQ,CAAC,sBAAsB,CAAC,MAAM,CACxE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CACvF,CAAC;QAEF,IAAI,IAAmC,CAAC;QAExC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,uBAAuB;YACvB,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC,mBAAmB,GAAG,UAAU,CAAC;QAC1C,CAAC;aAAM,CAAC;YACJ,kBAAkB;YAClB,IAAI,GAAG,MAAM,EAAE,CAAC,eAAe,CAAgC,8BAA8B,CAAC,CAAC;YAC/F,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;YAC/B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,IAAI,CAAC,mBAAmB,GAAG,UAAU,CAAC;QAC1C,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAChF,CAAC;IACL,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,iBAAiB,CAAC,KAA2B;QACtD,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACI,gBAAgB,CAAC,KAA0B;QAC9C,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,UAAU,CAAC;QAC3C,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAChC,CAAC;IAED;;OAEG;IACI,sBAAsB,CAAC,KAAgC;QAC1D,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,gBAAgB,CAAC,KAA0B;QACpD,OAAO,CAAC,GAAG,CAAC,uDAAuD,EAAE;YACjE,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;SAC3C,CAAC,CAAC;QAEH,IAAI,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YAEzB,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,0CAA0C,EAAE;gBACpD,MAAM,EAAE,EAAE,CAAC,WAAW,EAAE,EAAE;gBAC1B,QAAQ,EAAE,EAAE,CAAC,WAAW,EAAE,IAAI;gBAC9B,KAAK,EAAE,EAAE,CAAC,WAAW,EAAE,KAAK;aAC/B,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,eAAe,CAA4B,0BAA0B,CAAC,CAAC;YACjG,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;YAEzE,sBAAsB;YACtB,QAAQ,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;YAC3B,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC;YAEpC,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;gBACzB,QAAQ,CAAC,QAAQ,GAAG,KAAK,CAAC,gBAAgB,CAAC;YAC/C,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,yDAAyD,EAAE;gBACnE,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;aAC1F,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAEpC,OAAO,CAAC,GAAG,CAAC,yCAAyC,EAAE;gBACnD,OAAO,EAAE,KAAK;gBACd,YAAY,EAAE,QAAQ,CAAC,YAAY;gBACnC,OAAO,EAAE,QAAQ,CAAC,YAAY,EAAE,OAAO;gBACvC,QAAQ,EAAE,QAAQ,CAAC,YAAY,EAAE,OAAO;gBACxC,EAAE,EAAE,QAAQ,CAAC,EAAE;aAClB,CAAC,CAAC;YAEH,IAAI,KAAK,EAAE,CAAC;gBACR,OAAO,CAAC,GAAG,CAAC,6DAA6D,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACxF,+CAA+C;gBAC/C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC/B,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACxF,CAAC;iBAAM,CAAC;gBACJ,MAAM,YAAY,GAAG,QAAQ,CAAC,YAAY,EAAE,OAAO,IAAI,+BAA+B,CAAC;gBACvF,OAAO,CAAC,KAAK,CAAC,qDAAqD,EAAE,YAAY,CAAC,CAAC;gBACnF,OAAO,CAAC,KAAK,CAAC,+CAA+C,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAE/G,+BAA+B;gBAC/B,KAAK,CAAC,8BAA8B,YAAY,EAAE,CAAC,CAAC;YACxD,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,yDAAyD,EAAE,GAAG,CAAC,CAAC;YAC9E,KAAK,CAAC,4BAA4B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1F,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,gBAAgB,CAAC,KAA0B;QACpD,OAAO,CAAC,GAAG,CAAC,uDAAuD,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAE1F,IAAI,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YAEzB,uCAAuC;YACvC,MAAM,kBAAkB,GAAG,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC/E,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAExC,OAAO,CAAC,GAAG,CAAC,iDAAiD,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAEpG,2CAA2C;YAC3C,KAAK,MAAM,GAAG,IAAI,kBAAkB,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC7C,+DAA+D;gBAC/D,MAAM,oBAAoB,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC3F,KAAK,MAAM,SAAS,IAAI,oBAAoB,EAAE,CAAC;oBAC3C,SAAS,CAAC,UAAU,GAAG,IAAK,CAAC;oBAC7B,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;gBAC3B,CAAC;gBAED,2BAA2B;gBAC3B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;gBACnC,IAAI,OAAO,EAAE,CAAC;oBACV,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;oBACvE,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;wBACb,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;oBACrC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACJ,OAAO,CAAC,KAAK,CAAC,uDAAuD,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;gBACvG,CAAC;YACL,CAAC;YAED,iBAAiB;YACjB,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;YACvC,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,yDAAyD,EAAE,GAAG,CAAC,CAAC;QAClF,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;IAED;;;OAGG;IACI,oBAAoB,CAAC,KAA8B;QACtD,OAAO,CAAC,GAAG,CAAC,iDAAiD,EAAE,KAAK,CAAC,CAAC;QAEtE,uDAAuD;QACvD,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,UAAU,CAAC;QAC3C,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAChC,CAAC;IAED,2CAA2C;IAC3C,8BAA8B;IAC9B,2CAA2C;IAE3C;;OAEG;IACI,aAAa,CAAC,SAA4B;QAC7C,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;QAEnB,iDAAiD;QACjD,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,4BAA4B,GAAG,eAAe,CAAC,QAAQ,CAAC,uBAAuB,CAChF,SAAS,CAAC,EAAE,EACZ,EAAE,CAAC,WAAW,CAAC,EAAE,CACpB,CAAC;QAEF,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,aAAa,CAAC,SAA4B;QAC7C,oCAAoC;QACpC,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,WAAW,GAAG,eAAe,CAAC,QAAQ,CAAC,uBAAuB,CAChE,SAAS,CAAC,EAAE,EACZ,EAAE,CAAC,WAAW,CAAC,EAAE,CACpB,CAAC;QAEF,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;YACrE,OAAO;QACX,CAAC;QAED,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;QACnC,IAAI,CAAC,4BAA4B,GAAG,WAAW,CAAC;QAChD,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;QAEnB,4BAA4B;QAC5B,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC;QAClC,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC,WAAW,IAAI,EAAE,CAAC;QAEtD,6BAA6B;QAC7B,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC;QACnC,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC,WAAW,IAAI,EAAE,CAAC;QACvD,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC,eAAe,IAAI,EAAE,CAAC;QAEtD,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,UAAU;QACb,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;QACnB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,cAAc;QACjB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACjD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC/C,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;YACnB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;IAED;;OAEG;IACI,eAAe;QAClB,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE,OAAO;QAEpC,mCAAmC;QACnC,IAAI,CAAC,IAAI,CAAC,4BAA4B,CAAC,QAAQ,EAAE,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;YACtE,OAAO;QACX,CAAC;QAED,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,gBAAgB;QACnB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,mBAAmB,CAAC,MAAyB;QAChD,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAE7B,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACrD,8CAA8C;YAC9C,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC1B,IAAI,CAAC,4BAA4B,GAAG,eAAe,CAAC,QAAQ,CAAC,uBAAuB,CAChF,IAAI,CAAC,iBAAiB,CAAC,EAAE,EACzB,EAAE,CAAC,WAAW,CAAC,EAAE,CACpB,CAAC;QACN,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED,2CAA2C;IAC3C,kCAAkC;IAClC,2CAA2C;IAE3C;;OAEG;IACI,KAAK,CAAC,eAAe,CAAC,UAA0B;QACnD,IAAI,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YAEzB,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,eAAe,CAAoB,gBAAgB,CAAC,CAAC;YAEhF,SAAS,CAAC,IAAI,GAAG,eAAe,CAAC;YACjC,SAAS,CAAC,WAAW,GAAG,EAAE,CAAC;YAC3B,SAAS,CAAC,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC;YACrC,SAAS,CAAC,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,4BAA4B,EAAE,CAAC,CAAC;YAE3E,IAAI,UAAU,EAAE,CAAC;gBACb,SAAS,CAAC,UAAU,GAAG,UAAU,CAAC;YACtC,CAAC;iBAAM,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACjC,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC;YACnD,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;YAErC,IAAI,KAAK,EAAE,CAAC;gBACR,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACnC,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;gBACvC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACJ,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC;YACvE,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QACtD,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,aAAa;QACtB,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE,OAAO;QAEpC,IAAI,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YAEzB,IAAI,CAAC,iBAAiB,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;YAC/C,IAAI,CAAC,iBAAiB,CAAC,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC;YAE7D,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;YACtC,CAAC;YAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC;YACrC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,kBAAkB,CAAC;YACnD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,eAAe,IAAI,EAAE,CAAC;YAEnE,mCAAmC;YACnC,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;YAEvC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;QACpD,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;IAED;;OAEG;IACI,UAAU;QACb,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC1B,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,OAAO;QACX,CAAC;QAED,IAAI,CAAC,iBAAiB,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC;QAChD,IAAI,CAAC,iBAAiB,CAAC,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC;QAC9D,IAAI,CAAC,iBAAiB,CAAC,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC;QAE7D,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;QAE7B,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;QACnB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,UAAU;QACb,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,IAAI,oBAAoB,CAAC;QACjE,CAAC;IACL,CAAC;IAED,2CAA2C;IAC3C,mCAAmC;IACnC,2CAA2C;IAE3C;;OAEG;IACI,iBAAiB;QACpB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,kBAAkB,CAAC,KAA4B;QAClD,IAAI,KAAK,CAAC,eAAe,KAAK,QAAQ;YAAE,OAAO;QAE/C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;QAEzC,QAAQ,MAAM,EAAE,CAAC;YACb,KAAK,qBAAqB;gBACtB,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACzB,MAAM;YAEV,KAAK,0BAA0B;gBAC3B,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACrC,MAAM;YAEV,KAAK,uBAAuB;gBACxB,IAAI,CAAC,uBAAuB,CACxB,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,OAAO,EAAE,CAAC,YAAY,CAAW,IAAI,WAAW,CACzD,CAAC;gBACF,MAAM;QACd,CAAC;IACL,CAAC;IAED;;OAEG;IACI,qBAAqB,CAAC,KAA+B;QACxD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,KAAK,CAAC;QAEnD,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACtB,4BAA4B;gBAC5B,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;gBACxC,YAAY,CAAC,wBAAwB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACxD,qFAAqF;gBACrF,IAAI,YAAY,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC1C,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;oBAC1B,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;oBACpE,MAAM,WAAW,GAAG,MAAM,EAAE,eAAe,EAAE,IAAI,IAAI,IAAI,CAAC;oBAC1D,YAAY,CAAC,0BAA0B,CAAC,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAC3E,CAAC;gBACD,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CACnC,OAAO,CAAC,UAAU,EAClB,YAAY,EACZ,EAAE,WAAW,EAAE,YAAY,EAAE,CAChC,CAAC;gBACF,MAAM;YACV,CAAC;YACD,KAAK,eAAe,CAAC,CAAC,CAAC;gBACnB,gCAAgC;gBAChC,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;gBACzF,IAAI,eAAe,EAAE,CAAC;oBAClB,IAAI,YAAY,EAAE,CAAC;wBACf,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAChC,eAAe,CAAC,EAAE,EAClB,eAAe,CAAC,IAAI,EACpB,EAAE,WAAW,EAAE,IAAI,EAAE,CACxB,CAAC;oBACN,CAAC;yBAAM,CAAC;wBACJ,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;oBACxC,CAAC;gBACL,CAAC;gBACD,MAAM;YACV,CAAC;YACD,KAAK,WAAW,CAAC,CAAC,CAAC;gBACf,2BAA2B;gBAC3B,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC1B,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC1E,IAAI,SAAS,EAAE,CAAC;oBACZ,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAC5B,OAAO,CAAC,OAAO,EACf,SAAS,CAAC,IAAI,EACd,EAAE,WAAW,EAAE,YAAY,EAAE,CAChC,CAAC;gBACN,CAAC;gBACD,MAAM;YACV,CAAC;YACD,KAAK,aAAa,CAAC,CAAC,CAAC;gBACjB,wDAAwD;gBACxD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC/E,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE;oBAC5E,WAAW,EAAE,OAAO,CAAC,WAAW;iBACnC,CAAC,CAAC;gBACH,MAAM;YACV,CAAC;QACL,CAAC;IACL,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,OAAe;QAChC,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QACtF,OAAO,GAAG,EAAE,EAAE,CAAC;IACnB,CAAC;IAED;;OAEG;IACI,YAAY,CAAC,MAAsB;QACtC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,IAAI,CAAC,eAAe,CAAC,QAAQ,CACzB,MAAM,CAAC,QAAQ,CAAC,EAAE,EAClB,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,IAAI,CACd,CAAC;QACN,CAAC;QACD,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,mBAAmB;QACtB,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED,2CAA2C;IAC3C,iCAAiC;IACjC,2CAA2C;IAE3C;;OAEG;IACI,gBAAgB,CAAC,OAAe;QACnC,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,OAAO;QAElC,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAEnE,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;YACpE,OAAO;QACX,CAAC;QAED,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC;QACrC,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC,iBAAiB,IAAI,EAAE,CAAC;QAC1D,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,mBAAmB,CAAC,MAA4B;QACnD,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACjD,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAClC,IAAI,CAAC,iBAAiB,CAAC,EAAE,EACzB,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,IAAI,CACd,CAAC;QACN,CAAC;QACD,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,uBAAuB;QAC1B,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACK,iBAAiB;QACrB,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED,2CAA2C;IAC3C,yCAAyC;IACzC,2CAA2C;IAE3C;;OAEG;IACI,uBAAuB,CAAC,OAAe,EAAE,UAAkB;QAC9D,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;QAC9B,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAC;QACpC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,iBAAiB;QACpB,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC9C,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,CAAC,wBAAwB,EAAE,CAAC;IACpC,CAAC;IAED;;OAEG;IACI,iBAAiB;QACpB,IAAI,CAAC,wBAAwB,EAAE,CAAC;IACpC,CAAC;IAED;;OAEG;IACK,wBAAwB;QAC5B,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED,2CAA2C;IAC3C,iCAAiC;IACjC,2CAA2C;IAEnC,KAAK,CAAC,cAAc;QACxB,IAAI,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YAEzB,iDAAiD;YACjD,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC;YACxC,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,+BAA+B;YAE3D,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,aAAa,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC;YAExC,6EAA6E;YAC7E,iEAAiE;YACjE,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,MAAM,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC/E,IAAI,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,CAC9E,CAAC;YACF,2EAA2E;YAC3E,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,MAAM,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC/E,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAC/B,CAAC;YAEF,sEAAsE;YACtE,IAAI,CAAC,uBAAuB,GAAG,IAAI,GAAG,EAAE,CAAC;YACzC,IAAI,CAAC,oBAAoB,GAAG,IAAI,GAAG,EAAE,CAAC;YAEtC,kEAAkE;YAClE,MAAM,iBAAiB,GAAG,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAC1D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CACjD,CAAC;YAEF,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACtC,MAAM,KAAK,GAAG,MAAM,CAAC,uBAAuB,CAAC,SAAS,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;gBAC1E,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;gBAEtD,kEAAkE;gBAClE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;oBACjB,8CAA8C;oBAC9C,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,CACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,CAAC,CACrD,CAAC;oBAEF,IAAI,YAAY,EAAE,CAAC;wBACf,sDAAsD;wBACtD,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,YAAY,CAAC,mBAAmB,CAAC,CAAC;oBAClF,CAAC;yBAAM,CAAC;wBACJ,gDAAgD;wBAChD,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;oBACtD,CAAC;gBACL,CAAC;gBACD,6DAA6D;gBAC7D,4DAA4D;YAChE,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,yDAAyD,EAAE;gBACnE,cAAc,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM;gBACtC,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM;gBACrC,8BAA8B,EAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI;gBAC9D,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;aAC3F,CAAC,CAAC;YAEH,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;QACrD,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;IAED,2CAA2C;IAC3C,qCAAqC;IACrC,2CAA2C;IAEnC,sBAAsB;QAC1B,IAAI,CAAC,KAAK,CAAC,WAAW;aACjB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;aAC/B,SAAS,CAAC,MAAM,CAAC,EAAE;YAChB,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC;YAC9C,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;YAEhD,yBAAyB;YACzB,IAAI,UAAU,KAAK,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACzC,IAAI,CAAC,kBAAkB,GAAG,UAAU,CAAC;YACzC,CAAC;YAED,qDAAqD;YACrD,MAAM,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,EAAE,EAAE,IAAI,IAAI,CAAC;YAC9D,IAAI,WAAW,KAAK,kBAAkB,EAAE,CAAC;gBACrC,IAAI,WAAW,EAAE,CAAC;oBACd,8BAA8B;oBAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC;oBAC3E,IAAI,SAAS,EAAE,CAAC;wBACZ,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;wBACnC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;oBACvB,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACJ,kBAAkB;oBAClB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;oBAC9B,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;gBACvB,CAAC;YACL,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;IACX,CAAC;IAED;;;;;OAKG;IACK,oBAAoB;QACxB,MAAM,WAAW,GAAkC,EAAE,CAAC;QAEtD,iBAAiB;QACjB,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,WAAW,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC;QACtD,CAAC;aAAM,CAAC;YACJ,WAAW,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;QACnC,CAAC;QAED,qDAAqD;QACrD,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,WAAW,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACzD,CAAC;aAAM,CAAC;YACJ,WAAW,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;QACpC,CAAC;QAED,wDAAwD;QACxD,yDAAyD;QACzD,IAAI,CAAC,iBAAiB,CAAC,0BAA0B,CAAC,WAAW,CAAC,CAAC;IACnE,CAAC;IAED,2CAA2C;IAC3C,qCAAqC;IACrC,2CAA2C;IAE3C;;OAEG;IACK,2BAA2B,CAAC,QAAgB;QAChD,MAAM,QAAQ,GAAgC,EAAE,CAAC;QACjD,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;QAErF,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACjC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QACjE,CAAC;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,2CAA2C;IAC3C,oCAAoC;IACpC,2CAA2C;IAEnC,kBAAkB;QACtB,uCAAuC;QACvC,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;QACnE,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YAC1C,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC;QAC3B,CAAC;IACL,CAAC;IAEO,kBAAkB,CAAC,IAA8B;QACrD,qCAAqC;QACrC,YAAY,CAAC,OAAO,CAAC,6BAA6B,EAAE,IAAI,CAAC,CAAC;IAC9D,CAAC;2HA/gCQ,iCAAiC;6DAAjC,iCAAiC;;;;;;YC/C9C,8BAAwC;YAEtC,qHAAuB;YAyBvB,0FAA0C;YAgJ5C,iBAAM;;YAzKJ,cAsBC;YAtBD,8CAsBC;YAGD,cA+IC;YA/ID,qEA+IC;;;AD3HU,iCAAiC;IAR7C,aAAa,CAAC,qBAAqB,EAAE,0BAA0B,CAAC;GAQpD,iCAAiC,CAghC7C;;iFAhhCY,iCAAiC;cAP7C,SAAS;6BACI,KAAK,YACL,+BAA+B,mBAGxB,uBAAuB,CAAC,MAAM;;kBAwD9C,SAAS;mBAAC,iBAAiB;;kFAtDnB,iCAAiC","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, ViewChild } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { Metadata, CompositeKey } from '@memberjunction/core';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { ResourceData, MJDashboardEntity, MJDashboardCategoryEntity, MJDashboardPartTypeEntity, DashboardEngine, DashboardUserPermissions, MJDashboardCategoryLinkEntity } from '@memberjunction/core-entities';\nimport { ShareDialogResult } from './dashboard-share-dialog.component';\nimport {\n DashboardViewerComponent,\n DashboardNavRequestEvent,\n PanelInteractionEvent,\n AddPanelResult,\n createDefaultDashboardConfig,\n DashboardPanel,\n EditPartDialogResult,\n // Browser event types from generic component\n DashboardOpenEvent,\n DashboardEditEvent,\n DashboardDeleteEvent,\n DashboardMoveEvent,\n DashboardCreateEvent,\n CategoryCreateEvent,\n CategoryDeleteEvent,\n CategoryChangeEvent,\n ViewPreferenceChangeEvent,\n DashboardBrowserViewMode,\n BreadcrumbNavigateEvent\n} from '@memberjunction/ng-dashboard-viewer';\n/**\n * Mode for the dashboard browser\n */\ntype BrowserMode = 'list' | 'view' | 'edit';\n\n/**\n * Resource component for browsing, creating, and editing dashboards.\n * Uses the generic DashboardBrowserComponent for list mode and handles\n * view/edit mode internally with routing integration.\n */\n@RegisterClass(BaseResourceComponent, 'DashboardBrowserResource')\n@Component({\n standalone: false,\n selector: 'mj-dashboard-browser-resource',\n templateUrl: './dashboard-browser-resource.component.html',\n styleUrls: ['./dashboard-browser-resource.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DashboardBrowserResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n // ========================================\n // State\n // ========================================\n\n public mode: BrowserMode = 'list';\n public isLoading = false;\n public dashboards: MJDashboardEntity[] = [];\n public categories: MJDashboardCategoryEntity[] = [];\n public selectedDashboard: MJDashboardEntity | null = null;\n public selectedCategoryId: string | null = null;\n public viewMode: DashboardBrowserViewMode = 'cards';\n public showAddPanelDialog = false;\n\n // Config dialog state\n public showConfigDialog = false;\n public configDialogPanel: DashboardPanel | null = null;\n public configDialogPartType: MJDashboardPartTypeEntity | null = null;\n public configDialogClass: string = '';\n\n // Confirm dialog state\n public showConfirmDialog = false;\n public confirmPanelId: string = '';\n public confirmPanelTitle: string = '';\n\n // Share dialog state\n public showShareDialog = false;\n\n // Edit mode state for name/description\n public editingName = '';\n public editingDescription = '';\n private originalName = '';\n private originalDescription = '';\n private originalConfig = '';\n\n // Permission state for selected dashboard\n public selectedDashboardPermissions: DashboardUserPermissions = {\n DashboardID: '',\n CanRead: true,\n CanEdit: true,\n CanDelete: true,\n CanShare: true,\n IsOwner: true,\n PermissionSource: 'owner'\n };\n\n // Permission map for all dashboards (used by browser component)\n public dashboardPermissionsMap: Map<string, DashboardUserPermissions> = new Map();\n\n // Effective category map for shared dashboards (maps dashboard ID to effective category for display)\n public effectiveCategoryMap: Map<string, string | null> = new Map();\n\n private readonly _destroy$ = new Subject<void>();\n\n @ViewChild('dashboardViewer') dashboardViewer!: DashboardViewerComponent;\n\n // ========================================\n // Constructor\n // ========================================\n\n constructor(\n private cdr: ChangeDetectorRef,\n private route: ActivatedRoute,\n private navigationService: NavigationService\n ) {\n super();\n }\n\n // ========================================\n // Lifecycle\n // ========================================\n\n ngOnInit(): void {\n this.loadDashboards();\n this.subscribeToQueryParams();\n this.loadViewPreference();\n }\n\n ngOnDestroy(): void {\n this._destroy$.next();\n this._destroy$.complete();\n }\n\n // ========================================\n // BaseResourceComponent Implementation\n // ========================================\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Dashboards';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-gauge-high';\n }\n\n // ========================================\n // Event Handlers from Generic Browser\n // ========================================\n\n /**\n * Handle dashboard open request from generic browser\n */\n public onDashboardOpen(event: DashboardOpenEvent): void {\n if (event.OpenInNewTab) {\n // Open in a dedicated Explorer tab via NavigationService\n this.navigationService.OpenDashboard(\n event.Dashboard.ID,\n event.Dashboard.Name,\n { forceNewTab: true }\n );\n } else {\n // Open inline in the browser's view pane\n this.openDashboard(event.Dashboard);\n }\n }\n\n /**\n * Open the current dashboard in its own dedicated Explorer tab\n */\n public openInNewTab(): void {\n if (this.selectedDashboard) {\n this.navigationService.OpenDashboard(\n this.selectedDashboard.ID,\n this.selectedDashboard.Name,\n { forceNewTab: true }\n );\n }\n }\n\n /**\n * Handle dashboard edit request from generic browser\n */\n public onDashboardEdit(event: DashboardEditEvent): void {\n this.editDashboard(event.Dashboard);\n }\n\n /**\n * Handle dashboard delete request from generic browser\n */\n public async onDashboardDelete(event: DashboardDeleteEvent): Promise<void> {\n // The generic browser handles the confirmation dialog\n // We just need to perform the actual deletion\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n for (const dashboard of event.Dashboards) {\n const deleted = await dashboard.Delete();\n if (deleted) {\n const index = this.dashboards.findIndex(d => UUIDsEqual(d.ID, dashboard.ID));\n if (index >= 0) {\n this.dashboards.splice(index, 1);\n }\n }\n }\n\n // Create new array reference to trigger change detection\n this.dashboards = [...this.dashboards];\n } catch (err) {\n console.error('Failed to delete dashboards:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handle dashboard move request from generic browser.\n * For owned dashboards: updates the dashboard's CategoryID directly.\n * For shared dashboards: creates/updates a DashboardCategoryLink to organize without modifying the original.\n */\n public async onDashboardMove(event: DashboardMoveEvent): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const md = new Metadata();\n const currentUserId = md.CurrentUser.ID;\n\n for (const dashboard of event.Dashboards) {\n const permissions = DashboardEngine.Instance.GetDashboardPermissions(dashboard.ID, currentUserId);\n\n if (permissions.IsOwner) {\n // Owner can modify the dashboard directly\n dashboard.CategoryID = event.TargetCategoryId;\n await dashboard.Save();\n } else {\n // Non-owner: create or update a category link instead\n await this.createOrUpdateCategoryLink(dashboard.ID, currentUserId, event.TargetCategoryId);\n\n // Update the effective category map immediately for UI refresh\n this.effectiveCategoryMap.set(dashboard.ID, event.TargetCategoryId);\n }\n }\n\n // Create new map reference to trigger change detection\n this.effectiveCategoryMap = new Map(this.effectiveCategoryMap);\n\n // Refresh the list\n this.dashboards = [...this.dashboards];\n\n // Navigate to the target category to follow the moved items\n this.selectedCategoryId = event.TargetCategoryId;\n this.updateUrlQueryParams();\n } catch (err) {\n console.error('Failed to move dashboards:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Creates or updates a DashboardCategoryLink for organizing a shared dashboard.\n * Ensures only one link exists per user/dashboard combination.\n * @param dashboardId - The ID of the shared dashboard\n * @param userId - The current user's ID\n * @param categoryId - The target category ID (null for root/uncategorized)\n */\n private async createOrUpdateCategoryLink(\n dashboardId: string,\n userId: string,\n categoryId: string | null\n ): Promise<void> {\n const md = new Metadata();\n\n // Check if a link already exists for this user/dashboard\n const existingLinks = DashboardEngine.Instance.DashboardCategoryLinks.filter(\n link => UUIDsEqual(link.DashboardID, dashboardId) && UUIDsEqual(link.UserID, userId)\n );\n\n let link: MJDashboardCategoryLinkEntity;\n\n if (existingLinks.length > 0) {\n // Update existing link\n link = existingLinks[0];\n link.DashboardCategoryID = categoryId;\n } else {\n // Create new link\n link = await md.GetEntityObject<MJDashboardCategoryLinkEntity>('MJ: Dashboard Category Links');\n link.DashboardID = dashboardId;\n link.UserID = userId;\n link.DashboardCategoryID = categoryId;\n }\n\n const saved = await link.Save();\n if (!saved) {\n console.error('Failed to save dashboard category link:', link.LatestResult);\n }\n }\n\n /**\n * Handle create dashboard request from generic browser\n */\n public async onDashboardCreate(event: DashboardCreateEvent): Promise<void> {\n await this.createDashboard(event.CategoryId);\n }\n\n /**\n * Handle category change from generic browser - update URL\n */\n public onCategoryChange(event: CategoryChangeEvent): void {\n this.selectedCategoryId = event.CategoryId;\n this.updateUrlQueryParams();\n }\n\n /**\n * Handle view preference change from generic browser - persist\n */\n public onViewPreferenceChange(event: ViewPreferenceChangeEvent): void {\n this.viewMode = event.ViewMode;\n this.saveViewPreference(event.ViewMode);\n }\n\n /**\n * Handle category create request from generic browser\n * Includes extensive logging for debugging category creation issues\n */\n public async onCategoryCreate(event: CategoryCreateEvent): Promise<void> {\n console.log('[DashboardBrowserResource] Category create requested:', {\n name: event.Name,\n parentCategoryId: event.ParentCategoryId\n });\n\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const md = new Metadata();\n console.log('[DashboardBrowserResource] Current user:', {\n userId: md.CurrentUser?.ID,\n userName: md.CurrentUser?.Name,\n email: md.CurrentUser?.Email\n });\n\n const category = await md.GetEntityObject<MJDashboardCategoryEntity>('MJ: Dashboard Categories');\n console.log('[DashboardBrowserResource] Created category entity object');\n\n // Set required fields\n category.Name = event.Name;\n category.UserID = md.CurrentUser.ID;\n\n if (event.ParentCategoryId) {\n category.ParentID = event.ParentCategoryId;\n }\n\n console.log('[DashboardBrowserResource] Category fields before save:', {\n name: category.Name,\n userId: category.UserID,\n parentId: category.ParentID,\n allFields: category.Fields.map(f => ({ name: f.Name, value: f.Value, dirty: f.Dirty }))\n });\n\n const saved = await category.Save();\n\n console.log('[DashboardBrowserResource] Save result:', {\n success: saved,\n latestResult: category.LatestResult,\n message: category.LatestResult?.Message,\n success2: category.LatestResult?.Success,\n id: category.ID\n });\n\n if (saved) {\n console.log('[DashboardBrowserResource] Category saved successfully, ID:', category.ID);\n // Add to local array - engine will self-update\n this.categories.push(category);\n this.categories = [...this.categories].sort((a, b) => a.Name.localeCompare(b.Name));\n } else {\n const errorMessage = category.LatestResult?.Message || 'Unknown error saving category';\n console.error('[DashboardBrowserResource] Failed to save category:', errorMessage);\n console.error('[DashboardBrowserResource] Full LatestResult:', JSON.stringify(category.LatestResult, null, 2));\n\n // Show toast or alert for user\n alert(`Failed to create category: ${errorMessage}`);\n }\n } catch (err) {\n console.error('[DashboardBrowserResource] Exception creating category:', err);\n alert(`Error creating category: ${err instanceof Error ? err.message : String(err)}`);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handle category delete request from generic browser\n * Performs recursive deletion of category and all children\n */\n public async onCategoryDelete(event: CategoryDeleteEvent): Promise<void> {\n console.log('[DashboardBrowserResource] Category delete requested:', event.Category.Name);\n\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n // Get all child categories recursively\n const categoriesToDelete = this.getChildCategoriesRecursive(event.Category.ID);\n categoriesToDelete.push(event.Category);\n\n console.log('[DashboardBrowserResource] Deleting categories:', categoriesToDelete.map(c => c.Name));\n\n // Delete in reverse order (children first)\n for (const cat of categoriesToDelete.reverse()) {\n // First, move any dashboards in this category to uncategorized\n const dashboardsInCategory = this.dashboards.filter(d => UUIDsEqual(d.CategoryID, cat.ID));\n for (const dashboard of dashboardsInCategory) {\n dashboard.CategoryID = null!;\n await dashboard.Save();\n }\n\n // Then delete the category\n const deleted = await cat.Delete();\n if (deleted) {\n const index = this.categories.findIndex(c => UUIDsEqual(c.ID, cat.ID));\n if (index >= 0) {\n this.categories.splice(index, 1);\n }\n } else {\n console.error('[DashboardBrowserResource] Failed to delete category:', cat.Name, cat.LatestResult);\n }\n }\n\n // Refresh arrays\n this.categories = [...this.categories];\n this.dashboards = [...this.dashboards];\n } catch (err) {\n console.error('[DashboardBrowserResource] Exception deleting category:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handle breadcrumb navigation event\n * Navigates back to list view with optional category selection\n */\n public onBreadcrumbNavigate(event: BreadcrumbNavigateEvent): void {\n console.log('[DashboardBrowserResource] Breadcrumb navigate:', event);\n\n // CategoryId is null for root, or a category ID string\n this.selectedCategoryId = event.CategoryId;\n this.backToList();\n this.updateUrlQueryParams();\n }\n\n // ========================================\n // Public Methods - Navigation\n // ========================================\n\n /**\n * Open a dashboard for viewing\n */\n public openDashboard(dashboard: MJDashboardEntity): void {\n this.selectedDashboard = dashboard;\n this.mode = 'view';\n\n // Compute permissions for the selected dashboard\n const md = new Metadata();\n this.selectedDashboardPermissions = DashboardEngine.Instance.GetDashboardPermissions(\n dashboard.ID,\n md.CurrentUser.ID\n );\n\n this.updateUrlQueryParams();\n this.cdr.detectChanges();\n }\n\n /**\n * Open a dashboard for editing\n */\n public editDashboard(dashboard: MJDashboardEntity): void {\n // Check if user has edit permission\n const md = new Metadata();\n const permissions = DashboardEngine.Instance.GetDashboardPermissions(\n dashboard.ID,\n md.CurrentUser.ID\n );\n\n if (!permissions.CanEdit) {\n console.warn('User does not have permission to edit this dashboard');\n return;\n }\n\n this.selectedDashboard = dashboard;\n this.selectedDashboardPermissions = permissions;\n this.mode = 'edit';\n\n // Initialize editing fields\n this.editingName = dashboard.Name;\n this.editingDescription = dashboard.Description || '';\n\n // Store originals for cancel\n this.originalName = dashboard.Name;\n this.originalDescription = dashboard.Description || '';\n this.originalConfig = dashboard.UIConfigDetails || '';\n\n this.cdr.detectChanges();\n }\n\n /**\n * Go back to list view\n */\n public backToList(): void {\n this.selectedDashboard = null;\n this.mode = 'list';\n this.updateUrlQueryParams();\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle edit mode for current dashboard\n */\n public toggleEditMode(): void {\n if (this.mode === 'view' && this.selectedDashboard) {\n this.editDashboard(this.selectedDashboard);\n } else if (this.mode === 'edit') {\n this.mode = 'view';\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Open the share dialog for the current dashboard\n */\n public openShareDialog(): void {\n if (!this.selectedDashboard) return;\n\n // Verify user has share permission\n if (!this.selectedDashboardPermissions.CanShare) {\n console.warn('User does not have permission to share this dashboard');\n return;\n }\n\n this.showShareDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Close the share dialog\n */\n public closeShareDialog(): void {\n this.showShareDialog = false;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle share dialog result\n */\n public onShareDialogResult(result: ShareDialogResult): void {\n this.showShareDialog = false;\n\n if (result.Action === 'save' && this.selectedDashboard) {\n // Recompute permissions after sharing changes\n const md = new Metadata();\n this.selectedDashboardPermissions = DashboardEngine.Instance.GetDashboardPermissions(\n this.selectedDashboard.ID,\n md.CurrentUser.ID\n );\n }\n\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Public Methods - Dashboard CRUD\n // ========================================\n\n /**\n * Create a new dashboard\n */\n public async createDashboard(categoryId?: string | null): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const md = new Metadata();\n const dashboard = await md.GetEntityObject<MJDashboardEntity>('MJ: Dashboards');\n\n dashboard.Name = 'New Dashboard';\n dashboard.Description = '';\n dashboard.UserID = md.CurrentUser.ID;\n dashboard.UIConfigDetails = JSON.stringify(createDefaultDashboardConfig());\n\n if (categoryId) {\n dashboard.CategoryID = categoryId;\n } else if (this.selectedCategoryId) {\n dashboard.CategoryID = this.selectedCategoryId;\n }\n\n const saved = await dashboard.Save();\n\n if (saved) {\n this.dashboards.unshift(dashboard);\n this.dashboards = [...this.dashboards];\n this.editDashboard(dashboard);\n } else {\n console.error('Failed to save dashboard:', dashboard.LatestResult);\n }\n } catch (err) {\n console.error('Failed to create dashboard:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Save the current dashboard\n */\n public async saveDashboard(): Promise<void> {\n if (!this.selectedDashboard) return;\n\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n this.selectedDashboard.Name = this.editingName;\n this.selectedDashboard.Description = this.editingDescription;\n\n if (this.dashboardViewer) {\n await this.dashboardViewer.save();\n }\n\n this.originalName = this.editingName;\n this.originalDescription = this.editingDescription;\n this.originalConfig = this.selectedDashboard.UIConfigDetails || '';\n\n // Update the dashboard in the list\n this.dashboards = [...this.dashboards];\n\n this.mode = 'view';\n } catch (err) {\n console.error('Failed to save dashboard:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Cancel editing and revert changes\n */\n public cancelEdit(): void {\n if (!this.selectedDashboard) {\n this.backToList();\n return;\n }\n\n this.selectedDashboard.Name = this.originalName;\n this.selectedDashboard.Description = this.originalDescription;\n this.selectedDashboard.UIConfigDetails = this.originalConfig;\n\n this.editingName = '';\n this.editingDescription = '';\n\n this.mode = 'view';\n this.cdr.detectChanges();\n }\n\n /**\n * Handle name input blur - validate name is not empty\n */\n public onNameBlur(): void {\n if (!this.editingName.trim()) {\n this.editingName = this.originalName || 'Untitled Dashboard';\n }\n }\n\n // ========================================\n // Public Methods - Part Management\n // ========================================\n\n /**\n * Open the Add Part dialog\n */\n public openAddPartDialog(): void {\n this.showAddPanelDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle panel interaction events from the viewer\n */\n public onPanelInteraction(event: PanelInteractionEvent): void {\n if (event.interactionType !== 'custom') return;\n\n const action = event.payload?.['action'];\n\n switch (action) {\n case 'add-panel-requested':\n this.openAddPartDialog();\n break;\n\n case 'configure-part-requested':\n this.openConfigDialog(event.panelId);\n break;\n\n case 'remove-part-requested':\n this.openRemoveConfirmDialog(\n event.panelId,\n event.payload?.['panelTitle'] as string || 'this part'\n );\n break;\n }\n }\n\n /**\n * Handle navigation events from panels\n */\n public onNavigationRequested(event: DashboardNavRequestEvent): void {\n const request = event.request;\n const openInNewTab = request.openInNewTab || false;\n\n switch (request.type) {\n case 'OpenEntityRecord': {\n // Navigate to entity record\n const compositeKey = new CompositeKey();\n compositeKey.SimpleLoadFromURLSegment(request.recordId);\n // If simple load didn't work (single ID without field name), look up actual PK field\n if (compositeKey.KeyValuePairs.length === 0) {\n const md = new Metadata();\n const entity = md.Entities.find(e => e.Name === request.entityName);\n const pkFieldName = entity?.FirstPrimaryKey?.Name || 'ID';\n compositeKey.LoadFromSingleKeyValuePair(pkFieldName, request.recordId);\n }\n this.navigationService.OpenEntityRecord(\n request.entityName,\n compositeKey,\n { forceNewTab: openInNewTab }\n );\n break;\n }\n case 'OpenDashboard': {\n // Navigate to another dashboard\n const targetDashboard = this.dashboards.find(d => UUIDsEqual(d.ID, request.dashboardId));\n if (targetDashboard) {\n if (openInNewTab) {\n this.navigationService.OpenDashboard(\n targetDashboard.ID,\n targetDashboard.Name,\n { forceNewTab: true }\n );\n } else {\n this.openDashboard(targetDashboard);\n }\n }\n break;\n }\n case 'OpenQuery': {\n // Navigate to query viewer\n const md = new Metadata();\n const queryInfo = md.Queries.find(q => UUIDsEqual(q.ID, request.queryId));\n if (queryInfo) {\n this.navigationService.OpenQuery(\n request.queryId,\n queryInfo.Name,\n { forceNewTab: openInNewTab }\n );\n }\n break;\n }\n case 'OpenNavItem': {\n // Navigate to a specific nav item within an application\n const appId = request.appName ? this.resolveAppId(request.appName) : undefined;\n this.navigationService.OpenNavItemByName(request.navItemName, undefined, appId, {\n queryParams: request.queryParams\n });\n break;\n }\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 app = md.Applications.find(a => a.Name.toLowerCase() === appName.toLowerCase());\n return app?.ID;\n }\n\n /**\n * Handle add panel dialog result\n */\n public onPanelAdded(result: AddPanelResult): void {\n if (this.dashboardViewer) {\n this.dashboardViewer.addPanel(\n result.PartType.ID,\n result.Config,\n result.Title,\n result.Icon\n );\n }\n this.showAddPanelDialog = false;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle add panel dialog cancel\n */\n public onAddPanelCancelled(): void {\n this.showAddPanelDialog = false;\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Public Methods - Config Dialog\n // ========================================\n\n /**\n * Open the config dialog for a panel\n */\n public openConfigDialog(panelId: string): void {\n if (!this.dashboardViewer) return;\n\n const panel = this.dashboardViewer.getPanel(panelId);\n const partType = this.dashboardViewer.getPartTypeForPanel(panelId);\n\n if (!panel || !partType) {\n console.warn('Could not find panel or part type for config dialog');\n return;\n }\n\n this.configDialogPanel = panel;\n this.configDialogPartType = partType;\n this.configDialogClass = partType.ConfigDialogClass || '';\n this.showConfigDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle config dialog save\n */\n public onConfigDialogSaved(result: EditPartDialogResult): void {\n if (this.dashboardViewer && this.configDialogPanel) {\n this.dashboardViewer.updatePanelConfig(\n this.configDialogPanel.id,\n result.Config,\n result.Title,\n result.Icon\n );\n }\n this.closeConfigDialog();\n }\n\n /**\n * Handle config dialog cancel\n */\n public onConfigDialogCancelled(): void {\n this.closeConfigDialog();\n }\n\n /**\n * Close the config dialog\n */\n private closeConfigDialog(): void {\n this.showConfigDialog = false;\n this.configDialogPanel = null;\n this.configDialogPartType = null;\n this.configDialogClass = '';\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Public Methods - Remove Confirm Dialog\n // ========================================\n\n /**\n * Open the remove confirmation dialog\n */\n public openRemoveConfirmDialog(panelId: string, panelTitle: string): void {\n this.confirmPanelId = panelId;\n this.confirmPanelTitle = panelTitle;\n this.showConfirmDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle remove confirmation\n */\n public onRemoveConfirmed(): void {\n if (this.dashboardViewer && this.confirmPanelId) {\n this.dashboardViewer.confirmRemovePanel(this.confirmPanelId);\n }\n this.closeRemoveConfirmDialog();\n }\n\n /**\n * Handle remove cancel\n */\n public onRemoveCancelled(): void {\n this.closeRemoveConfirmDialog();\n }\n\n /**\n * Close the remove confirm dialog\n */\n private closeRemoveConfirmDialog(): void {\n this.showConfirmDialog = false;\n this.confirmPanelId = '';\n this.confirmPanelTitle = '';\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Private Methods - Data Loading\n // ========================================\n\n private async loadDashboards(): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n // Use DashboardEngine for consistent cached data\n const engine = DashboardEngine.Instance;\n await engine.Config(false); // Wait for engine to load data\n\n const md = new Metadata();\n const currentUserId = md.CurrentUser.ID;\n\n // Get data from engine - sort dashboards by updated date, categories by name\n // Filter dashboards to only those accessible to the current user\n this.dashboards = [...engine.GetAccessibleDashboards(currentUserId)].sort((a, b) =>\n new Date(b.__mj_UpdatedAt).getTime() - new Date(a.__mj_UpdatedAt).getTime()\n );\n // Filter categories to only those owned by or shared with the current user\n this.categories = [...engine.GetAccessibleCategories(currentUserId)].sort((a, b) =>\n a.Name.localeCompare(b.Name)\n );\n\n // Build permissions map and effective category map for all dashboards\n this.dashboardPermissionsMap = new Map();\n this.effectiveCategoryMap = new Map();\n\n // Get category links for current user (from engine's cached data)\n const userCategoryLinks = engine.DashboardCategoryLinks.filter(\n link => UUIDsEqual(link.UserID, currentUserId)\n );\n\n for (const dashboard of this.dashboards) {\n const perms = engine.GetDashboardPermissions(dashboard.ID, currentUserId);\n this.dashboardPermissionsMap.set(dashboard.ID, perms);\n\n // For shared dashboards (not owned), determine effective category\n if (!perms.IsOwner) {\n // Look for a category link for this dashboard\n const categoryLink = userCategoryLinks.find(\n link => UUIDsEqual(link.DashboardID, dashboard.ID)\n );\n\n if (categoryLink) {\n // User has explicitly organized this shared dashboard\n this.effectiveCategoryMap.set(dashboard.ID, categoryLink.DashboardCategoryID);\n } else {\n // No link exists - show in root (null category)\n this.effectiveCategoryMap.set(dashboard.ID, null);\n }\n }\n // For owned dashboards, we don't add to effectiveCategoryMap\n // so the browser will use the dashboard's actual CategoryID\n }\n\n console.log('[DashboardBrowserResource] Loaded from DashboardEngine:', {\n dashboardCount: this.dashboards.length,\n categoryCount: this.categories.length,\n sharedDashboardsInEffectiveMap: this.effectiveCategoryMap.size,\n categories: this.categories.map(c => ({ id: c.ID, name: c.Name, parentId: c.ParentID }))\n });\n\n this.NotifyLoadComplete();\n } catch (err) {\n console.error('Failed to load dashboards:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n // ========================================\n // Private Methods - URL Query Params\n // ========================================\n\n private subscribeToQueryParams(): void {\n this.route.queryParams\n .pipe(takeUntil(this._destroy$))\n .subscribe(params => {\n const categoryId = params['category'] || null;\n const dashboardId = params['dashboard'] || null;\n\n // Handle category change\n if (categoryId !== this.selectedCategoryId) {\n this.selectedCategoryId = categoryId;\n }\n\n // Handle dashboard change (for browser back/forward)\n const currentDashboardId = this.selectedDashboard?.ID || null;\n if (dashboardId !== currentDashboardId) {\n if (dashboardId) {\n // Find and open the dashboard\n const dashboard = this.dashboards.find(d => UUIDsEqual(d.ID, dashboardId));\n if (dashboard) {\n this.selectedDashboard = dashboard;\n this.mode = 'view';\n }\n } else {\n // Go back to list\n this.selectedDashboard = null;\n this.mode = 'list';\n }\n }\n\n this.cdr.detectChanges();\n });\n }\n\n /**\n * Update the URL query params for the current tab.\n * Uses NavigationService to update the tab configuration, which triggers\n * the shell's URL sync mechanism to update the browser URL properly\n * while respecting app-scoped routes.\n */\n private updateUrlQueryParams(): void {\n const queryParams: Record<string, string | null> = {};\n\n // Track category\n if (this.selectedCategoryId) {\n queryParams['category'] = this.selectedCategoryId;\n } else {\n queryParams['category'] = null;\n }\n\n // Track dashboard (for browser back/forward support)\n if (this.selectedDashboard) {\n queryParams['dashboard'] = this.selectedDashboard.ID;\n } else {\n queryParams['dashboard'] = null;\n }\n\n // Use NavigationService to update query params properly\n // This ensures the URL update respects app-scoped routes\n this.navigationService.UpdateActiveTabQueryParams(queryParams);\n }\n\n // ========================================\n // Private Methods - Category Helpers\n // ========================================\n\n /**\n * Get all child categories of a parent category recursively\n */\n private getChildCategoriesRecursive(parentId: string): MJDashboardCategoryEntity[] {\n const children: MJDashboardCategoryEntity[] = [];\n const directChildren = this.categories.filter(c => UUIDsEqual(c.ParentID, parentId));\n\n for (const child of directChildren) {\n children.push(child);\n children.push(...this.getChildCategoriesRecursive(child.ID));\n }\n\n return children;\n }\n\n // ========================================\n // Private Methods - View Preference\n // ========================================\n\n private loadViewPreference(): void {\n // TODO: Load from User Settings entity\n const stored = localStorage.getItem('dashboard-browser-view-mode');\n if (stored === 'cards' || stored === 'list') {\n this.viewMode = stored;\n }\n }\n\n private saveViewPreference(mode: DashboardBrowserViewMode): void {\n // TODO: Save to User Settings entity\n localStorage.setItem('dashboard-browser-view-mode', mode);\n }\n}\n","<!-- Dashboard Browser Resource -->\n<div class=\"dashboard-browser-resource\">\n <!-- List Mode - Uses Generic DashboardBrowserComponent -->\n @if (mode === 'list') {\n <mj-dashboard-browser\n [Dashboards]=\"dashboards\"\n [Categories]=\"categories\"\n [SelectedCategoryId]=\"selectedCategoryId\"\n [ViewMode]=\"viewMode\"\n [IsLoading]=\"isLoading\"\n [ShowCreateButton]=\"true\"\n [AllowMultiSelect]=\"true\"\n [AllowDragDrop]=\"true\"\n [DashboardPermissions]=\"dashboardPermissionsMap\"\n [EffectiveCategoryMap]=\"effectiveCategoryMap\"\n (DashboardOpen)=\"onDashboardOpen($event)\"\n (DashboardEdit)=\"onDashboardEdit($event)\"\n (DashboardDelete)=\"onDashboardDelete($event)\"\n (DashboardMove)=\"onDashboardMove($event)\"\n (DashboardCreate)=\"onDashboardCreate($event)\"\n (CategoryCreate)=\"onCategoryCreate($event)\"\n (CategoryDelete)=\"onCategoryDelete($event)\"\n (CategoryChange)=\"onCategoryChange($event)\"\n (ViewPreferenceChange)=\"onViewPreferenceChange($event)\">\n </mj-dashboard-browser>\n }\n\n <!-- View/Edit Mode -->\n @if (mode === 'view' || mode === 'edit') {\n <!-- View Mode Toolbar - matches browser toolbar structure -->\n @if (mode === 'view') {\n <div class=\"viewer-toolbar\">\n <!-- Breadcrumb navigation (includes its own padding/styling) -->\n <mj-dashboard-breadcrumb\n [Categories]=\"categories\"\n [CurrentCategoryId]=\"selectedDashboard?.CategoryID || null\"\n [CurrentDashboard]=\"selectedDashboard\"\n [ShowDashboardName]=\"true\"\n [AllowDragDrop]=\"false\"\n Size=\"large\"\n RootIcon=\"fa-solid fa-gauge-high\"\n RootLabel=\"Dashboards\"\n (Navigate)=\"onBreadcrumbNavigate($event)\">\n </mj-dashboard-breadcrumb>\n <!-- Right-side Actions -->\n <div class=\"toolbar-actions\">\n <!-- Shared indicator for non-owned dashboards -->\n @if (!selectedDashboardPermissions.IsOwner && selectedDashboardPermissions.CanRead) {\n <span class=\"shared-indicator\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n Shared with you\n </span>\n }\n <button\n class=\"btn-icon\"\n title=\"Open in its own tab\"\n (click)=\"openInNewTab()\">\n <i class=\"fa-solid fa-up-right-from-square\"></i>\n </button>\n <!-- Share button - only shown if user can share -->\n @if (selectedDashboardPermissions.CanShare) {\n <button\n class=\"btn-icon\"\n title=\"Share Dashboard\"\n (click)=\"openShareDialog()\">\n <i class=\"fa-solid fa-user-plus\"></i>\n </button>\n }\n <!-- Edit button - only shown if user can edit -->\n @if (selectedDashboardPermissions.CanEdit) {\n <button\n class=\"btn-icon\"\n title=\"Edit Dashboard\"\n (click)=\"toggleEditMode()\">\n <i class=\"fa-solid fa-edit\"></i>\n </button>\n }\n </div>\n </div>\n }\n <!-- Edit Mode Header - different layout -->\n @if (mode === 'edit') {\n <div class=\"viewer-header editing\">\n <div class=\"header-left\">\n <!-- Add Part button on the left -->\n <button\n class=\"btn-add-part\"\n (click)=\"openAddPartDialog()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Part\n </button>\n <!-- Separator -->\n <div class=\"header-separator\"></div>\n <!-- Editable name/description -->\n <div class=\"dashboard-info-edit\">\n <input\n type=\"text\"\n class=\"dashboard-name-input\"\n [(ngModel)]=\"editingName\"\n placeholder=\"Dashboard name\"\n (blur)=\"onNameBlur()\">\n <input\n type=\"text\"\n class=\"dashboard-description-input\"\n [(ngModel)]=\"editingDescription\"\n placeholder=\"Add a description...\">\n </div>\n </div>\n <div class=\"header-right\">\n <!-- Save, Cancel buttons -->\n <button\n class=\"btn-primary\"\n (click)=\"saveDashboard()\">\n <i class=\"fa-solid fa-save\"></i>\n Save\n </button>\n <button\n class=\"btn-cancel\"\n (click)=\"cancelEdit()\">\n Cancel\n </button>\n </div>\n </div>\n }\n <!-- Dashboard Viewer -->\n <div class=\"viewer-content\">\n <mj-dashboard-viewer\n #dashboardViewer\n [dashboard]=\"selectedDashboard\"\n [isEditing]=\"mode === 'edit'\"\n [showToolbar]=\"false\"\n [showBreadcrumb]=\"false\"\n (panelInteraction)=\"onPanelInteraction($event)\"\n (navigationRequested)=\"onNavigationRequested($event)\">\n </mj-dashboard-viewer>\n </div>\n <!-- Add Panel Dialog -->\n @if (dashboardViewer) {\n <mj-add-panel-dialog\n [visible]=\"showAddPanelDialog\"\n [partTypes]=\"dashboardViewer.getPartTypes()\"\n (panelAdded)=\"onPanelAdded($event)\"\n (cancelled)=\"onAddPanelCancelled()\">\n </mj-add-panel-dialog>\n }\n <!-- Generic Edit Part Dialog - dynamically loads config panels via ClassFactory -->\n <mj-edit-part-dialog\n [Visible]=\"showConfigDialog\"\n [PartType]=\"configDialogPartType\"\n [Panel]=\"configDialogPanel\"\n [Config]=\"configDialogPanel?.config || null\"\n (Saved)=\"onConfigDialogSaved($event)\"\n (Cancelled)=\"onConfigDialogCancelled()\">\n </mj-edit-part-dialog>\n <!-- Remove Part Confirmation Dialog -->\n <mj-confirm-dialog\n [visible]=\"showConfirmDialog\"\n type=\"danger\"\n title=\"Remove Part\"\n [message]=\"'Are you sure you want to remove \\'' + confirmPanelTitle + '\\' from this dashboard?'\"\n confirmText=\"Remove\"\n cancelText=\"Cancel\"\n (confirmed)=\"onRemoveConfirmed()\"\n (cancelled)=\"onRemoveCancelled()\">\n </mj-confirm-dialog>\n <!-- Share Dashboard Dialog -->\n <mj-dashboard-share-dialog\n [Visible]=\"showShareDialog\"\n [Dashboard]=\"selectedDashboard\"\n (Result)=\"onShareDialogResult($event)\">\n </mj-dashboard-share-dialog>\n }\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"dashboard-browser-resource.component.js","sourceRoot":"","sources":["../../src/DashboardBrowser/dashboard-browser-resource.component.ts","../../src/DashboardBrowser/dashboard-browser-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, ViewChild } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { Metadata, CompositeKey } from '@memberjunction/core';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { ResourceData, MJDashboardEntity, MJDashboardCategoryEntity, MJDashboardPartTypeEntity, DashboardEngine, DashboardUserPermissions, MJDashboardCategoryLinkEntity } from '@memberjunction/core-entities';\nimport { ShareDialogResult } from './dashboard-share-dialog.component';\nimport {\n DashboardViewerComponent,\n DashboardNavRequestEvent,\n PanelInteractionEvent,\n AddPanelResult,\n createDefaultDashboardConfig,\n DashboardPanel,\n EditPartDialogResult,\n // Browser event types from generic component\n DashboardOpenEvent,\n DashboardEditEvent,\n DashboardDeleteEvent,\n DashboardMoveEvent,\n DashboardCreateEvent,\n CategoryCreateEvent,\n CategoryDeleteEvent,\n CategoryChangeEvent,\n ViewPreferenceChangeEvent,\n DashboardBrowserViewMode,\n BreadcrumbNavigateEvent\n} from '@memberjunction/ng-dashboard-viewer';\n/**\n * Mode for the dashboard browser\n */\ntype BrowserMode = 'list' | 'view' | 'edit';\n\n/**\n * Resource component for browsing, creating, and editing dashboards.\n * Uses the generic DashboardBrowserComponent for list mode and handles\n * view/edit mode internally with routing integration.\n */\n@RegisterClass(BaseResourceComponent, 'DashboardBrowserResource')\n@Component({\n standalone: false,\n selector: 'mj-dashboard-browser-resource',\n templateUrl: './dashboard-browser-resource.component.html',\n styleUrls: ['./dashboard-browser-resource.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DashboardBrowserResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n // ========================================\n // State\n // ========================================\n\n public mode: BrowserMode = 'list';\n public isLoading = false;\n public dashboards: MJDashboardEntity[] = [];\n public categories: MJDashboardCategoryEntity[] = [];\n public selectedDashboard: MJDashboardEntity | null = null;\n public selectedCategoryId: string | null = null;\n public viewMode: DashboardBrowserViewMode = 'cards';\n public showAddPanelDialog = false;\n\n // Config dialog state\n public showConfigDialog = false;\n public configDialogPanel: DashboardPanel | null = null;\n public configDialogPartType: MJDashboardPartTypeEntity | null = null;\n public configDialogClass: string = '';\n\n // Confirm dialog state\n public showConfirmDialog = false;\n public confirmPanelId: string = '';\n public confirmPanelTitle: string = '';\n\n // Share dialog state\n public showShareDialog = false;\n\n // Edit mode state for name/description\n public editingName = '';\n public editingDescription = '';\n private originalName = '';\n private originalDescription = '';\n private originalConfig = '';\n\n // Permission state for selected dashboard\n public selectedDashboardPermissions: DashboardUserPermissions = {\n DashboardID: '',\n CanRead: true,\n CanEdit: true,\n CanDelete: true,\n CanShare: true,\n IsOwner: true,\n PermissionSource: 'owner'\n };\n\n // Permission map for all dashboards (used by browser component)\n public dashboardPermissionsMap: Map<string, DashboardUserPermissions> = new Map();\n\n // Effective category map for shared dashboards (maps dashboard ID to effective category for display)\n public effectiveCategoryMap: Map<string, string | null> = new Map();\n\n private readonly _destroy$ = new Subject<void>();\n\n @ViewChild('dashboardViewer') dashboardViewer!: DashboardViewerComponent;\n\n // ========================================\n // Constructor\n // ========================================\n\n constructor(\n private cdr: ChangeDetectorRef,\n private route: ActivatedRoute,\n private navigationService: NavigationService\n ) {\n super();\n }\n\n // ========================================\n // Lifecycle\n // ========================================\n\n ngOnInit(): void {\n this.loadDashboards();\n this.subscribeToQueryParams();\n this.loadViewPreference();\n }\n\n ngOnDestroy(): void {\n this._destroy$.next();\n this._destroy$.complete();\n }\n\n // ========================================\n // BaseResourceComponent Implementation\n // ========================================\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Dashboards';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-gauge-high';\n }\n\n // ========================================\n // Event Handlers from Generic Browser\n // ========================================\n\n /**\n * Handle dashboard open request from generic browser\n */\n public onDashboardOpen(event: DashboardOpenEvent): void {\n if (event.OpenInNewTab) {\n // Open in a dedicated Explorer tab via NavigationService\n this.navigationService.OpenDashboard(\n event.Dashboard.ID,\n event.Dashboard.Name,\n { forceNewTab: true }\n );\n } else {\n // Open inline in the browser's view pane\n this.openDashboard(event.Dashboard);\n }\n }\n\n /**\n * Open the current dashboard in its own dedicated Explorer tab\n */\n public openInNewTab(): void {\n if (this.selectedDashboard) {\n this.navigationService.OpenDashboard(\n this.selectedDashboard.ID,\n this.selectedDashboard.Name,\n { forceNewTab: true }\n );\n }\n }\n\n /**\n * Handle dashboard edit request from generic browser\n */\n public onDashboardEdit(event: DashboardEditEvent): void {\n this.editDashboard(event.Dashboard);\n }\n\n /**\n * Handle dashboard delete request from generic browser\n */\n public async onDashboardDelete(event: DashboardDeleteEvent): Promise<void> {\n // The generic browser handles the confirmation dialog\n // We just need to perform the actual deletion\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n for (const dashboard of event.Dashboards) {\n const deleted = await dashboard.Delete();\n if (deleted) {\n const index = this.dashboards.findIndex(d => UUIDsEqual(d.ID, dashboard.ID));\n if (index >= 0) {\n this.dashboards.splice(index, 1);\n }\n }\n }\n\n // Create new array reference to trigger change detection\n this.dashboards = [...this.dashboards];\n } catch (err) {\n console.error('Failed to delete dashboards:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handle dashboard move request from generic browser.\n * For owned dashboards: updates the dashboard's CategoryID directly.\n * For shared dashboards: creates/updates a DashboardCategoryLink to organize without modifying the original.\n */\n public async onDashboardMove(event: DashboardMoveEvent): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const md = new Metadata();\n const currentUserId = md.CurrentUser.ID;\n\n for (const dashboard of event.Dashboards) {\n const permissions = DashboardEngine.Instance.GetDashboardPermissions(dashboard.ID, currentUserId);\n\n if (permissions.IsOwner) {\n // Owner can modify the dashboard directly\n dashboard.CategoryID = event.TargetCategoryId;\n await dashboard.Save();\n } else {\n // Non-owner: create or update a category link instead\n await this.createOrUpdateCategoryLink(dashboard.ID, currentUserId, event.TargetCategoryId);\n\n // Update the effective category map immediately for UI refresh\n this.effectiveCategoryMap.set(dashboard.ID, event.TargetCategoryId);\n }\n }\n\n // Create new map reference to trigger change detection\n this.effectiveCategoryMap = new Map(this.effectiveCategoryMap);\n\n // Refresh the list\n this.dashboards = [...this.dashboards];\n\n // Navigate to the target category to follow the moved items\n this.selectedCategoryId = event.TargetCategoryId;\n this.updateUrlQueryParams();\n } catch (err) {\n console.error('Failed to move dashboards:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Creates or updates a DashboardCategoryLink for organizing a shared dashboard.\n * Ensures only one link exists per user/dashboard combination.\n * @param dashboardId - The ID of the shared dashboard\n * @param userId - The current user's ID\n * @param categoryId - The target category ID (null for root/uncategorized)\n */\n private async createOrUpdateCategoryLink(\n dashboardId: string,\n userId: string,\n categoryId: string | null\n ): Promise<void> {\n const md = new Metadata();\n\n // Check if a link already exists for this user/dashboard\n const existingLinks = DashboardEngine.Instance.DashboardCategoryLinks.filter(\n link => UUIDsEqual(link.DashboardID, dashboardId) && UUIDsEqual(link.UserID, userId)\n );\n\n let link: MJDashboardCategoryLinkEntity;\n\n if (existingLinks.length > 0) {\n // Update existing link\n link = existingLinks[0];\n link.DashboardCategoryID = categoryId;\n } else {\n // Create new link\n link = await md.GetEntityObject<MJDashboardCategoryLinkEntity>('MJ: Dashboard Category Links');\n link.DashboardID = dashboardId;\n link.UserID = userId;\n link.DashboardCategoryID = categoryId;\n }\n\n const saved = await link.Save();\n if (!saved) {\n console.error('Failed to save dashboard category link:', link.LatestResult);\n }\n }\n\n /**\n * Handle create dashboard request from generic browser\n */\n public async onDashboardCreate(event: DashboardCreateEvent): Promise<void> {\n await this.createDashboard(event.CategoryId);\n }\n\n /**\n * Handle category change from generic browser - update URL\n */\n public onCategoryChange(event: CategoryChangeEvent): void {\n this.selectedCategoryId = event.CategoryId;\n this.updateUrlQueryParams();\n }\n\n /**\n * Handle view preference change from generic browser - persist\n */\n public onViewPreferenceChange(event: ViewPreferenceChangeEvent): void {\n this.viewMode = event.ViewMode;\n this.saveViewPreference(event.ViewMode);\n }\n\n /**\n * Handle category create request from generic browser\n * Includes extensive logging for debugging category creation issues\n */\n public async onCategoryCreate(event: CategoryCreateEvent): Promise<void> {\n console.debug('[DashboardBrowserResource] Category create requested:', {\n name: event.Name,\n parentCategoryId: event.ParentCategoryId\n });\n\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const md = new Metadata();\n console.debug('[DashboardBrowserResource] Current user:', {\n userId: md.CurrentUser?.ID,\n userName: md.CurrentUser?.Name,\n email: md.CurrentUser?.Email\n });\n\n const category = await md.GetEntityObject<MJDashboardCategoryEntity>('MJ: Dashboard Categories');\n console.debug('[DashboardBrowserResource] Created category entity object');\n\n // Set required fields\n category.Name = event.Name;\n category.UserID = md.CurrentUser.ID;\n\n if (event.ParentCategoryId) {\n category.ParentID = event.ParentCategoryId;\n }\n\n console.debug('[DashboardBrowserResource] Category fields before save:', {\n name: category.Name,\n userId: category.UserID,\n parentId: category.ParentID,\n allFields: category.Fields.map(f => ({ name: f.Name, value: f.Value, dirty: f.Dirty }))\n });\n\n const saved = await category.Save();\n\n console.debug('[DashboardBrowserResource] Save result:', {\n success: saved,\n latestResult: category.LatestResult,\n message: category.LatestResult?.Message,\n success2: category.LatestResult?.Success,\n id: category.ID\n });\n\n if (saved) {\n console.debug('[DashboardBrowserResource] Category saved successfully, ID:', category.ID);\n // Add to local array - engine will self-update\n this.categories.push(category);\n this.categories = [...this.categories].sort((a, b) => a.Name.localeCompare(b.Name));\n } else {\n const errorMessage = category.LatestResult?.Message || 'Unknown error saving category';\n console.error('[DashboardBrowserResource] Failed to save category:', errorMessage);\n console.error('[DashboardBrowserResource] Full LatestResult:', JSON.stringify(category.LatestResult, null, 2));\n\n // Show toast or alert for user\n alert(`Failed to create category: ${errorMessage}`);\n }\n } catch (err) {\n console.error('[DashboardBrowserResource] Exception creating category:', err);\n alert(`Error creating category: ${err instanceof Error ? err.message : String(err)}`);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handle category delete request from generic browser\n * Performs recursive deletion of category and all children\n */\n public async onCategoryDelete(event: CategoryDeleteEvent): Promise<void> {\n console.debug('[DashboardBrowserResource] Category delete requested:', event.Category.Name);\n\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n // Get all child categories recursively\n const categoriesToDelete = this.getChildCategoriesRecursive(event.Category.ID);\n categoriesToDelete.push(event.Category);\n\n console.debug('[DashboardBrowserResource] Deleting categories:', categoriesToDelete.map(c => c.Name));\n\n // Delete in reverse order (children first)\n for (const cat of categoriesToDelete.reverse()) {\n // First, move any dashboards in this category to uncategorized\n const dashboardsInCategory = this.dashboards.filter(d => UUIDsEqual(d.CategoryID, cat.ID));\n for (const dashboard of dashboardsInCategory) {\n dashboard.CategoryID = null!;\n await dashboard.Save();\n }\n\n // Then delete the category\n const deleted = await cat.Delete();\n if (deleted) {\n const index = this.categories.findIndex(c => UUIDsEqual(c.ID, cat.ID));\n if (index >= 0) {\n this.categories.splice(index, 1);\n }\n } else {\n console.error('[DashboardBrowserResource] Failed to delete category:', cat.Name, cat.LatestResult);\n }\n }\n\n // Refresh arrays\n this.categories = [...this.categories];\n this.dashboards = [...this.dashboards];\n } catch (err) {\n console.error('[DashboardBrowserResource] Exception deleting category:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handle breadcrumb navigation event\n * Navigates back to list view with optional category selection\n */\n public onBreadcrumbNavigate(event: BreadcrumbNavigateEvent): void {\n console.debug('[DashboardBrowserResource] Breadcrumb navigate:', event);\n\n // CategoryId is null for root, or a category ID string\n this.selectedCategoryId = event.CategoryId;\n this.backToList();\n this.updateUrlQueryParams();\n }\n\n // ========================================\n // Public Methods - Navigation\n // ========================================\n\n /**\n * Open a dashboard for viewing\n */\n public openDashboard(dashboard: MJDashboardEntity): void {\n this.selectedDashboard = dashboard;\n this.mode = 'view';\n\n // Compute permissions for the selected dashboard\n const md = new Metadata();\n this.selectedDashboardPermissions = DashboardEngine.Instance.GetDashboardPermissions(\n dashboard.ID,\n md.CurrentUser.ID\n );\n\n this.updateUrlQueryParams();\n this.cdr.detectChanges();\n }\n\n /**\n * Open a dashboard for editing\n */\n public editDashboard(dashboard: MJDashboardEntity): void {\n // Check if user has edit permission\n const md = new Metadata();\n const permissions = DashboardEngine.Instance.GetDashboardPermissions(\n dashboard.ID,\n md.CurrentUser.ID\n );\n\n if (!permissions.CanEdit) {\n console.warn('User does not have permission to edit this dashboard');\n return;\n }\n\n this.selectedDashboard = dashboard;\n this.selectedDashboardPermissions = permissions;\n this.mode = 'edit';\n\n // Initialize editing fields\n this.editingName = dashboard.Name;\n this.editingDescription = dashboard.Description || '';\n\n // Store originals for cancel\n this.originalName = dashboard.Name;\n this.originalDescription = dashboard.Description || '';\n this.originalConfig = dashboard.UIConfigDetails || '';\n\n this.cdr.detectChanges();\n }\n\n /**\n * Go back to list view\n */\n public backToList(): void {\n this.selectedDashboard = null;\n this.mode = 'list';\n this.updateUrlQueryParams();\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle edit mode for current dashboard\n */\n public toggleEditMode(): void {\n if (this.mode === 'view' && this.selectedDashboard) {\n this.editDashboard(this.selectedDashboard);\n } else if (this.mode === 'edit') {\n this.mode = 'view';\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Open the share dialog for the current dashboard\n */\n public openShareDialog(): void {\n if (!this.selectedDashboard) return;\n\n // Verify user has share permission\n if (!this.selectedDashboardPermissions.CanShare) {\n console.warn('User does not have permission to share this dashboard');\n return;\n }\n\n this.showShareDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Close the share dialog\n */\n public closeShareDialog(): void {\n this.showShareDialog = false;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle share dialog result\n */\n public onShareDialogResult(result: ShareDialogResult): void {\n this.showShareDialog = false;\n\n if (result.Action === 'save' && this.selectedDashboard) {\n // Recompute permissions after sharing changes\n const md = new Metadata();\n this.selectedDashboardPermissions = DashboardEngine.Instance.GetDashboardPermissions(\n this.selectedDashboard.ID,\n md.CurrentUser.ID\n );\n }\n\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Public Methods - Dashboard CRUD\n // ========================================\n\n /**\n * Create a new dashboard\n */\n public async createDashboard(categoryId?: string | null): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const md = new Metadata();\n const dashboard = await md.GetEntityObject<MJDashboardEntity>('MJ: Dashboards');\n\n dashboard.Name = 'New Dashboard';\n dashboard.Description = '';\n dashboard.UserID = md.CurrentUser.ID;\n dashboard.UIConfigDetails = JSON.stringify(createDefaultDashboardConfig());\n\n if (categoryId) {\n dashboard.CategoryID = categoryId;\n } else if (this.selectedCategoryId) {\n dashboard.CategoryID = this.selectedCategoryId;\n }\n\n const saved = await dashboard.Save();\n\n if (saved) {\n this.dashboards.unshift(dashboard);\n this.dashboards = [...this.dashboards];\n this.editDashboard(dashboard);\n } else {\n console.error('Failed to save dashboard:', dashboard.LatestResult);\n }\n } catch (err) {\n console.error('Failed to create dashboard:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Save the current dashboard\n */\n public async saveDashboard(): Promise<void> {\n if (!this.selectedDashboard) return;\n\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n this.selectedDashboard.Name = this.editingName;\n this.selectedDashboard.Description = this.editingDescription;\n\n if (this.dashboardViewer) {\n await this.dashboardViewer.save();\n }\n\n this.originalName = this.editingName;\n this.originalDescription = this.editingDescription;\n this.originalConfig = this.selectedDashboard.UIConfigDetails || '';\n\n // Update the dashboard in the list\n this.dashboards = [...this.dashboards];\n\n this.mode = 'view';\n } catch (err) {\n console.error('Failed to save dashboard:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Cancel editing and revert changes\n */\n public cancelEdit(): void {\n if (!this.selectedDashboard) {\n this.backToList();\n return;\n }\n\n this.selectedDashboard.Name = this.originalName;\n this.selectedDashboard.Description = this.originalDescription;\n this.selectedDashboard.UIConfigDetails = this.originalConfig;\n\n this.editingName = '';\n this.editingDescription = '';\n\n this.mode = 'view';\n this.cdr.detectChanges();\n }\n\n /**\n * Handle name input blur - validate name is not empty\n */\n public onNameBlur(): void {\n if (!this.editingName.trim()) {\n this.editingName = this.originalName || 'Untitled Dashboard';\n }\n }\n\n // ========================================\n // Public Methods - Part Management\n // ========================================\n\n /**\n * Open the Add Part dialog\n */\n public openAddPartDialog(): void {\n this.showAddPanelDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle panel interaction events from the viewer\n */\n public onPanelInteraction(event: PanelInteractionEvent): void {\n if (event.interactionType !== 'custom') return;\n\n const action = event.payload?.['action'];\n\n switch (action) {\n case 'add-panel-requested':\n this.openAddPartDialog();\n break;\n\n case 'configure-part-requested':\n this.openConfigDialog(event.panelId);\n break;\n\n case 'remove-part-requested':\n this.openRemoveConfirmDialog(\n event.panelId,\n event.payload?.['panelTitle'] as string || 'this part'\n );\n break;\n }\n }\n\n /**\n * Handle navigation events from panels\n */\n public onNavigationRequested(event: DashboardNavRequestEvent): void {\n const request = event.request;\n const openInNewTab = request.openInNewTab || false;\n\n switch (request.type) {\n case 'OpenEntityRecord': {\n // Navigate to entity record\n const compositeKey = new CompositeKey();\n compositeKey.SimpleLoadFromURLSegment(request.recordId);\n // If simple load didn't work (single ID without field name), look up actual PK field\n if (compositeKey.KeyValuePairs.length === 0) {\n const md = new Metadata();\n const entity = md.Entities.find(e => e.Name === request.entityName);\n const pkFieldName = entity?.FirstPrimaryKey?.Name || 'ID';\n compositeKey.LoadFromSingleKeyValuePair(pkFieldName, request.recordId);\n }\n this.navigationService.OpenEntityRecord(\n request.entityName,\n compositeKey,\n { forceNewTab: openInNewTab }\n );\n break;\n }\n case 'OpenDashboard': {\n // Navigate to another dashboard\n const targetDashboard = this.dashboards.find(d => UUIDsEqual(d.ID, request.dashboardId));\n if (targetDashboard) {\n if (openInNewTab) {\n this.navigationService.OpenDashboard(\n targetDashboard.ID,\n targetDashboard.Name,\n { forceNewTab: true }\n );\n } else {\n this.openDashboard(targetDashboard);\n }\n }\n break;\n }\n case 'OpenQuery': {\n // Navigate to query viewer\n const md = new Metadata();\n const queryInfo = md.Queries.find(q => UUIDsEqual(q.ID, request.queryId));\n if (queryInfo) {\n this.navigationService.OpenQuery(\n request.queryId,\n queryInfo.Name,\n { forceNewTab: openInNewTab }\n );\n }\n break;\n }\n case 'OpenNavItem': {\n // Navigate to a specific nav item within an application\n const appId = request.appName ? this.resolveAppId(request.appName) : undefined;\n this.navigationService.OpenNavItemByName(request.navItemName, undefined, appId, {\n queryParams: request.queryParams\n });\n break;\n }\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 app = md.Applications.find(a => a.Name.toLowerCase() === appName.toLowerCase());\n return app?.ID;\n }\n\n /**\n * Handle add panel dialog result\n */\n public onPanelAdded(result: AddPanelResult): void {\n if (this.dashboardViewer) {\n this.dashboardViewer.addPanel(\n result.PartType.ID,\n result.Config,\n result.Title,\n result.Icon\n );\n }\n this.showAddPanelDialog = false;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle add panel dialog cancel\n */\n public onAddPanelCancelled(): void {\n this.showAddPanelDialog = false;\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Public Methods - Config Dialog\n // ========================================\n\n /**\n * Open the config dialog for a panel\n */\n public openConfigDialog(panelId: string): void {\n if (!this.dashboardViewer) return;\n\n const panel = this.dashboardViewer.getPanel(panelId);\n const partType = this.dashboardViewer.getPartTypeForPanel(panelId);\n\n if (!panel || !partType) {\n console.warn('Could not find panel or part type for config dialog');\n return;\n }\n\n this.configDialogPanel = panel;\n this.configDialogPartType = partType;\n this.configDialogClass = partType.ConfigDialogClass || '';\n this.showConfigDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle config dialog save\n */\n public onConfigDialogSaved(result: EditPartDialogResult): void {\n if (this.dashboardViewer && this.configDialogPanel) {\n this.dashboardViewer.updatePanelConfig(\n this.configDialogPanel.id,\n result.Config,\n result.Title,\n result.Icon\n );\n }\n this.closeConfigDialog();\n }\n\n /**\n * Handle config dialog cancel\n */\n public onConfigDialogCancelled(): void {\n this.closeConfigDialog();\n }\n\n /**\n * Close the config dialog\n */\n private closeConfigDialog(): void {\n this.showConfigDialog = false;\n this.configDialogPanel = null;\n this.configDialogPartType = null;\n this.configDialogClass = '';\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Public Methods - Remove Confirm Dialog\n // ========================================\n\n /**\n * Open the remove confirmation dialog\n */\n public openRemoveConfirmDialog(panelId: string, panelTitle: string): void {\n this.confirmPanelId = panelId;\n this.confirmPanelTitle = panelTitle;\n this.showConfirmDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle remove confirmation\n */\n public onRemoveConfirmed(): void {\n if (this.dashboardViewer && this.confirmPanelId) {\n this.dashboardViewer.confirmRemovePanel(this.confirmPanelId);\n }\n this.closeRemoveConfirmDialog();\n }\n\n /**\n * Handle remove cancel\n */\n public onRemoveCancelled(): void {\n this.closeRemoveConfirmDialog();\n }\n\n /**\n * Close the remove confirm dialog\n */\n private closeRemoveConfirmDialog(): void {\n this.showConfirmDialog = false;\n this.confirmPanelId = '';\n this.confirmPanelTitle = '';\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Private Methods - Data Loading\n // ========================================\n\n private async loadDashboards(): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n // Use DashboardEngine for consistent cached data\n const engine = DashboardEngine.Instance;\n await engine.Config(false); // Wait for engine to load data\n\n const md = new Metadata();\n const currentUserId = md.CurrentUser.ID;\n\n // Get data from engine - sort dashboards by updated date, categories by name\n // Filter dashboards to only those accessible to the current user\n this.dashboards = [...engine.GetAccessibleDashboards(currentUserId)].sort((a, b) =>\n new Date(b.__mj_UpdatedAt).getTime() - new Date(a.__mj_UpdatedAt).getTime()\n );\n // Filter categories to only those owned by or shared with the current user\n this.categories = [...engine.GetAccessibleCategories(currentUserId)].sort((a, b) =>\n a.Name.localeCompare(b.Name)\n );\n\n // Build permissions map and effective category map for all dashboards\n this.dashboardPermissionsMap = new Map();\n this.effectiveCategoryMap = new Map();\n\n // Get category links for current user (from engine's cached data)\n const userCategoryLinks = engine.DashboardCategoryLinks.filter(\n link => UUIDsEqual(link.UserID, currentUserId)\n );\n\n for (const dashboard of this.dashboards) {\n const perms = engine.GetDashboardPermissions(dashboard.ID, currentUserId);\n this.dashboardPermissionsMap.set(dashboard.ID, perms);\n\n // For shared dashboards (not owned), determine effective category\n if (!perms.IsOwner) {\n // Look for a category link for this dashboard\n const categoryLink = userCategoryLinks.find(\n link => UUIDsEqual(link.DashboardID, dashboard.ID)\n );\n\n if (categoryLink) {\n // User has explicitly organized this shared dashboard\n this.effectiveCategoryMap.set(dashboard.ID, categoryLink.DashboardCategoryID);\n } else {\n // No link exists - show in root (null category)\n this.effectiveCategoryMap.set(dashboard.ID, null);\n }\n }\n // For owned dashboards, we don't add to effectiveCategoryMap\n // so the browser will use the dashboard's actual CategoryID\n }\n\n console.debug('[DashboardBrowserResource] Loaded from DashboardEngine:', {\n dashboardCount: this.dashboards.length,\n categoryCount: this.categories.length,\n sharedDashboardsInEffectiveMap: this.effectiveCategoryMap.size,\n categories: this.categories.map(c => ({ id: c.ID, name: c.Name, parentId: c.ParentID }))\n });\n\n this.NotifyLoadComplete();\n } catch (err) {\n console.error('Failed to load dashboards:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n // ========================================\n // Private Methods - URL Query Params\n // ========================================\n\n private subscribeToQueryParams(): void {\n this.route.queryParams\n .pipe(takeUntil(this._destroy$))\n .subscribe(params => {\n const categoryId = params['category'] || null;\n const dashboardId = params['dashboard'] || null;\n\n // Handle category change\n if (categoryId !== this.selectedCategoryId) {\n this.selectedCategoryId = categoryId;\n }\n\n // Handle dashboard change (for browser back/forward)\n const currentDashboardId = this.selectedDashboard?.ID || null;\n if (dashboardId !== currentDashboardId) {\n if (dashboardId) {\n // Find and open the dashboard\n const dashboard = this.dashboards.find(d => UUIDsEqual(d.ID, dashboardId));\n if (dashboard) {\n this.selectedDashboard = dashboard;\n this.mode = 'view';\n }\n } else {\n // Go back to list\n this.selectedDashboard = null;\n this.mode = 'list';\n }\n }\n\n this.cdr.detectChanges();\n });\n }\n\n /**\n * Update the URL query params for the current tab.\n * Uses NavigationService to update the tab configuration, which triggers\n * the shell's URL sync mechanism to update the browser URL properly\n * while respecting app-scoped routes.\n */\n private updateUrlQueryParams(): void {\n const queryParams: Record<string, string | null> = {};\n\n // Track category\n if (this.selectedCategoryId) {\n queryParams['category'] = this.selectedCategoryId;\n } else {\n queryParams['category'] = null;\n }\n\n // Track dashboard (for browser back/forward support)\n if (this.selectedDashboard) {\n queryParams['dashboard'] = this.selectedDashboard.ID;\n } else {\n queryParams['dashboard'] = null;\n }\n\n // Use NavigationService to update query params properly\n // This ensures the URL update respects app-scoped routes\n this.navigationService.UpdateActiveTabQueryParams(queryParams);\n }\n\n // ========================================\n // Private Methods - Category Helpers\n // ========================================\n\n /**\n * Get all child categories of a parent category recursively\n */\n private getChildCategoriesRecursive(parentId: string): MJDashboardCategoryEntity[] {\n const children: MJDashboardCategoryEntity[] = [];\n const directChildren = this.categories.filter(c => UUIDsEqual(c.ParentID, parentId));\n\n for (const child of directChildren) {\n children.push(child);\n children.push(...this.getChildCategoriesRecursive(child.ID));\n }\n\n return children;\n }\n\n // ========================================\n // Private Methods - View Preference\n // ========================================\n\n private loadViewPreference(): void {\n // TODO: Load from User Settings entity\n const stored = localStorage.getItem('dashboard-browser-view-mode');\n if (stored === 'cards' || stored === 'list') {\n this.viewMode = stored;\n }\n }\n\n private saveViewPreference(mode: DashboardBrowserViewMode): void {\n // TODO: Save to User Settings entity\n localStorage.setItem('dashboard-browser-view-mode', mode);\n }\n}\n","<!-- Dashboard Browser Resource -->\n<div class=\"dashboard-browser-resource\">\n <!-- List Mode - Uses Generic DashboardBrowserComponent -->\n @if (mode === 'list') {\n <mj-dashboard-browser\n [Dashboards]=\"dashboards\"\n [Categories]=\"categories\"\n [SelectedCategoryId]=\"selectedCategoryId\"\n [ViewMode]=\"viewMode\"\n [IsLoading]=\"isLoading\"\n [ShowCreateButton]=\"true\"\n [AllowMultiSelect]=\"true\"\n [AllowDragDrop]=\"true\"\n [DashboardPermissions]=\"dashboardPermissionsMap\"\n [EffectiveCategoryMap]=\"effectiveCategoryMap\"\n (DashboardOpen)=\"onDashboardOpen($event)\"\n (DashboardEdit)=\"onDashboardEdit($event)\"\n (DashboardDelete)=\"onDashboardDelete($event)\"\n (DashboardMove)=\"onDashboardMove($event)\"\n (DashboardCreate)=\"onDashboardCreate($event)\"\n (CategoryCreate)=\"onCategoryCreate($event)\"\n (CategoryDelete)=\"onCategoryDelete($event)\"\n (CategoryChange)=\"onCategoryChange($event)\"\n (ViewPreferenceChange)=\"onViewPreferenceChange($event)\">\n </mj-dashboard-browser>\n }\n\n <!-- View/Edit Mode -->\n @if (mode === 'view' || mode === 'edit') {\n <!-- View Mode Toolbar - matches browser toolbar structure -->\n @if (mode === 'view') {\n <div class=\"viewer-toolbar\">\n <!-- Breadcrumb navigation (includes its own padding/styling) -->\n <mj-dashboard-breadcrumb\n [Categories]=\"categories\"\n [CurrentCategoryId]=\"selectedDashboard?.CategoryID || null\"\n [CurrentDashboard]=\"selectedDashboard\"\n [ShowDashboardName]=\"true\"\n [AllowDragDrop]=\"false\"\n Size=\"large\"\n RootIcon=\"fa-solid fa-gauge-high\"\n RootLabel=\"Dashboards\"\n (Navigate)=\"onBreadcrumbNavigate($event)\">\n </mj-dashboard-breadcrumb>\n <!-- Right-side Actions -->\n <div class=\"toolbar-actions\">\n <!-- Shared indicator for non-owned dashboards -->\n @if (!selectedDashboardPermissions.IsOwner && selectedDashboardPermissions.CanRead) {\n <span class=\"shared-indicator\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n Shared with you\n </span>\n }\n <button\n class=\"btn-icon\"\n title=\"Open in its own tab\"\n (click)=\"openInNewTab()\">\n <i class=\"fa-solid fa-up-right-from-square\"></i>\n </button>\n <!-- Share button - only shown if user can share -->\n @if (selectedDashboardPermissions.CanShare) {\n <button\n class=\"btn-icon\"\n title=\"Share Dashboard\"\n (click)=\"openShareDialog()\">\n <i class=\"fa-solid fa-user-plus\"></i>\n </button>\n }\n <!-- Edit button - only shown if user can edit -->\n @if (selectedDashboardPermissions.CanEdit) {\n <button\n class=\"btn-icon\"\n title=\"Edit Dashboard\"\n (click)=\"toggleEditMode()\">\n <i class=\"fa-solid fa-edit\"></i>\n </button>\n }\n </div>\n </div>\n }\n <!-- Edit Mode Header - different layout -->\n @if (mode === 'edit') {\n <div class=\"viewer-header editing\">\n <div class=\"header-left\">\n <!-- Add Part button on the left -->\n <button\n class=\"btn-add-part\"\n (click)=\"openAddPartDialog()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Part\n </button>\n <!-- Separator -->\n <div class=\"header-separator\"></div>\n <!-- Editable name/description -->\n <div class=\"dashboard-info-edit\">\n <input\n type=\"text\"\n class=\"dashboard-name-input\"\n [(ngModel)]=\"editingName\"\n placeholder=\"Dashboard name\"\n (blur)=\"onNameBlur()\">\n <input\n type=\"text\"\n class=\"dashboard-description-input\"\n [(ngModel)]=\"editingDescription\"\n placeholder=\"Add a description...\">\n </div>\n </div>\n <div class=\"header-right\">\n <!-- Save, Cancel buttons -->\n <button\n class=\"btn-primary\"\n (click)=\"saveDashboard()\">\n <i class=\"fa-solid fa-save\"></i>\n Save\n </button>\n <button\n class=\"btn-cancel\"\n (click)=\"cancelEdit()\">\n Cancel\n </button>\n </div>\n </div>\n }\n <!-- Dashboard Viewer -->\n <div class=\"viewer-content\">\n <mj-dashboard-viewer\n #dashboardViewer\n [dashboard]=\"selectedDashboard\"\n [isEditing]=\"mode === 'edit'\"\n [showToolbar]=\"false\"\n [showBreadcrumb]=\"false\"\n (panelInteraction)=\"onPanelInteraction($event)\"\n (navigationRequested)=\"onNavigationRequested($event)\">\n </mj-dashboard-viewer>\n </div>\n <!-- Add Panel Dialog -->\n @if (dashboardViewer) {\n <mj-add-panel-dialog\n [visible]=\"showAddPanelDialog\"\n [partTypes]=\"dashboardViewer.getPartTypes()\"\n (panelAdded)=\"onPanelAdded($event)\"\n (cancelled)=\"onAddPanelCancelled()\">\n </mj-add-panel-dialog>\n }\n <!-- Generic Edit Part Dialog - dynamically loads config panels via ClassFactory -->\n <mj-edit-part-dialog\n [Visible]=\"showConfigDialog\"\n [PartType]=\"configDialogPartType\"\n [Panel]=\"configDialogPanel\"\n [Config]=\"configDialogPanel?.config || null\"\n (Saved)=\"onConfigDialogSaved($event)\"\n (Cancelled)=\"onConfigDialogCancelled()\">\n </mj-edit-part-dialog>\n <!-- Remove Part Confirmation Dialog -->\n <mj-confirm-dialog\n [visible]=\"showConfirmDialog\"\n type=\"danger\"\n title=\"Remove Part\"\n [message]=\"'Are you sure you want to remove \\'' + confirmPanelTitle + '\\' from this dashboard?'\"\n confirmText=\"Remove\"\n cancelText=\"Cancel\"\n (confirmed)=\"onRemoveConfirmed()\"\n (cancelled)=\"onRemoveCancelled()\">\n </mj-confirm-dialog>\n <!-- Share Dashboard Dialog -->\n <mj-dashboard-share-dialog\n [Visible]=\"showShareDialog\"\n [Dashboard]=\"selectedDashboard\"\n (Result)=\"onShareDialogResult($event)\">\n </mj-dashboard-share-dialog>\n }\n</div>\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view-selector.component.d.ts","sourceRoot":"","sources":["../../../../src/DataExplorer/components/view-selector/view-selector.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,SAAS,EAAqB,MAAM,eAAe,CAAC;AAClJ,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"view-selector.component.d.ts","sourceRoot":"","sources":["../../../../src/DataExplorer/components/view-selector/view-selector.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Component, Input, Output, EventEmitter, ViewEncapsulation } from '@angular/core';
|
|
2
|
-
import { Metadata
|
|
2
|
+
import { Metadata } from '@memberjunction/core';
|
|
3
|
+
import { UserViewEngine } from '@memberjunction/core-entities';
|
|
3
4
|
import { Subject } from 'rxjs';
|
|
4
5
|
import { UUIDsEqual } from '@memberjunction/global';
|
|
5
6
|
import * as i0 from "@angular/core";
|
|
@@ -487,27 +488,20 @@ export class ViewSelectorComponent {
|
|
|
487
488
|
this.cdr.detectChanges();
|
|
488
489
|
try {
|
|
489
490
|
const userId = this.metadata.CurrentUser?.ID;
|
|
490
|
-
|
|
491
|
-
//
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
.map(v => this.mapViewToListItem(v, true));
|
|
505
|
-
this.sharedViews = accessibleViews
|
|
506
|
-
.filter(v => !UUIDsEqual(v.UserID, userId))
|
|
507
|
-
.map(v => this.mapViewToListItem(v, false));
|
|
508
|
-
// Update selected view reference
|
|
509
|
-
this.updateSelectedViewFromId();
|
|
510
|
-
}
|
|
491
|
+
// Use UserViewEngine cache instead of a direct RunView to avoid redundant DB calls.
|
|
492
|
+
// The engine is initialized once and caches all views; GetAccessibleViewsForEntity()
|
|
493
|
+
// already filters by owned + shared and checks UserCanView.
|
|
494
|
+
await UserViewEngine.Instance.Config(false);
|
|
495
|
+
const accessibleViews = UserViewEngine.Instance.GetAccessibleViewsForEntity(this.entity.ID);
|
|
496
|
+
// Separate into owned and shared
|
|
497
|
+
this.myViews = accessibleViews
|
|
498
|
+
.filter(v => UUIDsEqual(v.UserID, userId))
|
|
499
|
+
.map(v => this.mapViewToListItem(v, true));
|
|
500
|
+
this.sharedViews = accessibleViews
|
|
501
|
+
.filter(v => !UUIDsEqual(v.UserID, userId))
|
|
502
|
+
.map(v => this.mapViewToListItem(v, false));
|
|
503
|
+
// Update selected view reference
|
|
504
|
+
this.updateSelectedViewFromId();
|
|
511
505
|
}
|
|
512
506
|
catch (error) {
|
|
513
507
|
console.error('Failed to load views:', error);
|