@memberjunction/ng-explorer-core 2.40.0 → 2.42.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/app-routing.module.d.ts.map +1 -1
- package/dist/app-routing.module.js +3 -3
- package/dist/app-routing.module.js.map +1 -1
- package/dist/lib/home-component/home.component.d.ts +1 -1
- package/dist/lib/home-component/home.component.d.ts.map +1 -1
- package/dist/lib/home-component/home.component.js +5 -16
- package/dist/lib/home-component/home.component.js.map +1 -1
- package/dist/lib/home-wrapper/home-wrapper.component.d.ts +7 -0
- package/dist/lib/home-wrapper/home-wrapper.component.d.ts.map +1 -0
- package/dist/lib/home-wrapper/home-wrapper.component.js +30 -0
- package/dist/lib/home-wrapper/home-wrapper.component.js.map +1 -0
- package/dist/lib/navigation/navigation.component.d.ts.map +1 -1
- package/dist/lib/navigation/navigation.component.js +0 -28
- package/dist/lib/navigation/navigation.component.js.map +1 -1
- package/dist/lib/single-application/single-application.component.js +15 -4
- package/dist/lib/single-application/single-application.component.js.map +1 -1
- package/dist/lib/tabbed-dashboard/tabbed-dashboard.component.d.ts +44 -0
- package/dist/lib/tabbed-dashboard/tabbed-dashboard.component.d.ts.map +1 -0
- package/dist/lib/tabbed-dashboard/tabbed-dashboard.component.js +472 -0
- package/dist/lib/tabbed-dashboard/tabbed-dashboard.component.js.map +1 -0
- package/dist/module.d.ts +72 -69
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +18 -4
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +2 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +2 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +25 -24
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { OnInit, ElementRef, AfterViewInit, ViewContainerRef, OnDestroy } from '@angular/core';
|
|
2
|
+
import { DashboardEntity, DashboardUserStateEntity } from '@memberjunction/core-entities';
|
|
3
|
+
import { BaseDashboard } from '@memberjunction/ng-dashboards';
|
|
4
|
+
import { MJTabStripComponent } from '@memberjunction/ng-tabstrip';
|
|
5
|
+
import { Router } from '@angular/router';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export declare class TabbedDashboardComponent implements OnInit, AfterViewInit, OnDestroy {
|
|
8
|
+
private router;
|
|
9
|
+
tabstrip: MJTabStripComponent;
|
|
10
|
+
contentWrapper: ElementRef;
|
|
11
|
+
noTabsContainer: ElementRef;
|
|
12
|
+
tabContainer: ElementRef;
|
|
13
|
+
tabstripContainer: ViewContainerRef;
|
|
14
|
+
/**
|
|
15
|
+
* Specify the application to display dashboards for. If not specified, the scope is global.
|
|
16
|
+
*/
|
|
17
|
+
ApplicationID: string | null;
|
|
18
|
+
/**
|
|
19
|
+
* Name for the default tab when no dashboards are available.
|
|
20
|
+
*/
|
|
21
|
+
DefaultTabName: string;
|
|
22
|
+
/**
|
|
23
|
+
* Specify the position of the default dashboard, first, last or not shown at all.
|
|
24
|
+
*/
|
|
25
|
+
DefaultDashboardPosition: 'first' | 'last' | 'none';
|
|
26
|
+
dashboards: DashboardEntity[];
|
|
27
|
+
loading: boolean;
|
|
28
|
+
error: string | null;
|
|
29
|
+
private dashboardInstances;
|
|
30
|
+
private dashboardComponentRefs;
|
|
31
|
+
constructor(router: Router);
|
|
32
|
+
ngOnInit(): Promise<void>;
|
|
33
|
+
ngAfterViewInit(): Promise<void>;
|
|
34
|
+
private moveContentToCorrectContainer;
|
|
35
|
+
private loadDashboards;
|
|
36
|
+
getDashboardInstance(dashboardId: string): BaseDashboard | undefined;
|
|
37
|
+
private displayDashboardError;
|
|
38
|
+
protected loadDashboardUserState(dashboardId: string): Promise<DashboardUserStateEntity>;
|
|
39
|
+
onTabSelect(tabIndex: number): void;
|
|
40
|
+
ngOnDestroy(): void;
|
|
41
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TabbedDashboardComponent, never>;
|
|
42
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TabbedDashboardComponent, "mj-tabbed-dashboard", never, { "ApplicationID": { "alias": "ApplicationID"; "required": false; }; "DefaultTabName": { "alias": "DefaultTabName"; "required": false; }; "DefaultDashboardPosition": { "alias": "DefaultDashboardPosition"; "required": false; }; }, {}, never, ["*"], false, never>;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=tabbed-dashboard.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabbed-dashboard.component.d.ts","sourceRoot":"","sources":["../../../src/lib/tabbed-dashboard/tabbed-dashboard.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,MAAM,EAAa,UAAU,EAAE,aAAa,EAAE,gBAAgB,EAAgB,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1I,OAAO,EAAE,eAAe,EAAiC,wBAAwB,EAAgB,MAAM,+BAA+B,CAAC;AACvI,OAAO,EAAE,aAAa,EAAmB,MAAM,+BAA+B,CAAC;AAE/E,OAAO,EAAkB,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClF,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;;AAEzC,qBAKa,wBAAyB,YAAW,MAAM,EAAE,aAAa,EAAE,SAAS;IA6BnE,OAAO,CAAC,MAAM;IA5BH,QAAQ,EAAG,mBAAmB,CAAC;IACzB,cAAc,EAAG,UAAU,CAAC;IAC3B,eAAe,EAAG,UAAU,CAAC;IAChC,YAAY,EAAG,UAAU,CAAC;IACO,iBAAiB,EAAG,gBAAgB,CAAC;IAEjG;;OAEG;IACa,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEpD;;OAEG;IACa,cAAc,EAAE,MAAM,CAAa;IAEnD;;OAEG;IACa,wBAAwB,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAU;IAEtE,UAAU,EAAE,eAAe,EAAE,CAAM;IACnC,OAAO,EAAE,OAAO,CAAQ;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEnC,OAAO,CAAC,kBAAkB,CAAyC;IACnE,OAAO,CAAC,sBAAsB,CAAuD;gBAEjE,MAAM,EAAE,MAAM;IAE5B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzB,eAAe;IA6BrB,OAAO,CAAC,6BAA6B;YAavB,cAAc;IAuErB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAyF3E,OAAO,CAAC,qBAAqB;cAiBb,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAsBvF,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IA0B1C,WAAW,IAAI,IAAI;yCA9SR,wBAAwB;2CAAxB,wBAAwB;CAsTpC"}
|
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { Component, Input, ViewChild, ViewContainerRef } from '@angular/core';
|
|
11
|
+
import { LogError, Metadata, RunView } from '@memberjunction/core';
|
|
12
|
+
import { BaseDashboard } from '@memberjunction/ng-dashboards';
|
|
13
|
+
import { InvokeManualResize, MJGlobal, SafeJSONParse } from '@memberjunction/global';
|
|
14
|
+
import * as i0 from "@angular/core";
|
|
15
|
+
import * as i1 from "@angular/router";
|
|
16
|
+
import * as i2 from "@progress/kendo-angular-indicators";
|
|
17
|
+
import * as i3 from "@memberjunction/ng-container-directives";
|
|
18
|
+
import * as i4 from "@memberjunction/ng-tabstrip";
|
|
19
|
+
const _c0 = ["tabstrip"];
|
|
20
|
+
const _c1 = ["contentWrapper"];
|
|
21
|
+
const _c2 = ["noTabsContainer"];
|
|
22
|
+
const _c3 = ["tabContainer"];
|
|
23
|
+
const _c4 = ["tabstripContainer"];
|
|
24
|
+
const _c5 = ["*"];
|
|
25
|
+
const _forTrack0 = ($index, $item) => $item.ID;
|
|
26
|
+
function TabbedDashboardComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
27
|
+
i0.ɵɵelementStart(0, "div", 6);
|
|
28
|
+
i0.ɵɵtext(1, " Loading dashboards... ");
|
|
29
|
+
i0.ɵɵelement(2, "kendo-loader");
|
|
30
|
+
i0.ɵɵelementEnd();
|
|
31
|
+
} }
|
|
32
|
+
function TabbedDashboardComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
33
|
+
i0.ɵɵelementStart(0, "div", 7);
|
|
34
|
+
i0.ɵɵtext(1);
|
|
35
|
+
i0.ɵɵelementEnd();
|
|
36
|
+
} if (rf & 2) {
|
|
37
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
38
|
+
i0.ɵɵadvance();
|
|
39
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r0.error, " ");
|
|
40
|
+
} }
|
|
41
|
+
function TabbedDashboardComponent_Conditional_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
42
|
+
i0.ɵɵelement(0, "div", null, 2);
|
|
43
|
+
} }
|
|
44
|
+
function TabbedDashboardComponent_Conditional_3_Conditional_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
45
|
+
i0.ɵɵelementStart(0, "mj-tab", 11);
|
|
46
|
+
i0.ɵɵelement(1, "span", 12);
|
|
47
|
+
i0.ɵɵtext(2);
|
|
48
|
+
i0.ɵɵelementEnd();
|
|
49
|
+
} if (rf & 2) {
|
|
50
|
+
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
51
|
+
i0.ɵɵproperty("Name", ctx_r0.DefaultTabName);
|
|
52
|
+
i0.ɵɵadvance(2);
|
|
53
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r0.DefaultTabName, " ");
|
|
54
|
+
} }
|
|
55
|
+
function TabbedDashboardComponent_Conditional_3_Conditional_3_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
56
|
+
i0.ɵɵelementStart(0, "mj-tab", 11);
|
|
57
|
+
i0.ɵɵelement(1, "span", 13);
|
|
58
|
+
i0.ɵɵtext(2);
|
|
59
|
+
i0.ɵɵelementEnd();
|
|
60
|
+
} if (rf & 2) {
|
|
61
|
+
const dashboard_r3 = ctx.$implicit;
|
|
62
|
+
i0.ɵɵproperty("Name", dashboard_r3.Name);
|
|
63
|
+
i0.ɵɵadvance(2);
|
|
64
|
+
i0.ɵɵtextInterpolate1(" ", dashboard_r3.Name, " ");
|
|
65
|
+
} }
|
|
66
|
+
function TabbedDashboardComponent_Conditional_3_Conditional_3_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
67
|
+
i0.ɵɵelementStart(0, "mj-tab", 11);
|
|
68
|
+
i0.ɵɵelement(1, "span", 12);
|
|
69
|
+
i0.ɵɵtext(2);
|
|
70
|
+
i0.ɵɵelementEnd();
|
|
71
|
+
} if (rf & 2) {
|
|
72
|
+
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
73
|
+
i0.ɵɵproperty("Name", ctx_r0.DefaultTabName);
|
|
74
|
+
i0.ɵɵadvance(2);
|
|
75
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r0.DefaultTabName, " ");
|
|
76
|
+
} }
|
|
77
|
+
function TabbedDashboardComponent_Conditional_3_Conditional_3_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
78
|
+
i0.ɵɵelementStart(0, "mj-tab-body")(1, "div", 14);
|
|
79
|
+
i0.ɵɵelement(2, "div", 8, 4);
|
|
80
|
+
i0.ɵɵelementEnd()();
|
|
81
|
+
} }
|
|
82
|
+
function TabbedDashboardComponent_Conditional_3_Conditional_3_For_8_Template(rf, ctx) { if (rf & 1) {
|
|
83
|
+
i0.ɵɵelementStart(0, "mj-tab-body")(1, "div", 14);
|
|
84
|
+
i0.ɵɵelement(2, "div", 15);
|
|
85
|
+
i0.ɵɵelementEnd()();
|
|
86
|
+
} if (rf & 2) {
|
|
87
|
+
const dashboard_r4 = ctx.$implicit;
|
|
88
|
+
i0.ɵɵadvance(2);
|
|
89
|
+
i0.ɵɵpropertyInterpolate1("id", "dashboard-", dashboard_r4.ID, "");
|
|
90
|
+
} }
|
|
91
|
+
function TabbedDashboardComponent_Conditional_3_Conditional_3_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
92
|
+
i0.ɵɵelementStart(0, "mj-tab-body")(1, "div", 14);
|
|
93
|
+
i0.ɵɵelement(2, "div", 8, 4);
|
|
94
|
+
i0.ɵɵelementEnd()();
|
|
95
|
+
} }
|
|
96
|
+
function TabbedDashboardComponent_Conditional_3_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
97
|
+
const _r2 = i0.ɵɵgetCurrentView();
|
|
98
|
+
i0.ɵɵelementStart(0, "mj-tabstrip", 10, 3);
|
|
99
|
+
i0.ɵɵlistener("TabSelected", function TabbedDashboardComponent_Conditional_3_Conditional_3_Template_mj_tabstrip_TabSelected_0_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onTabSelect($event.index)); });
|
|
100
|
+
i0.ɵɵtemplate(2, TabbedDashboardComponent_Conditional_3_Conditional_3_Conditional_2_Template, 3, 2, "mj-tab", 11);
|
|
101
|
+
i0.ɵɵrepeaterCreate(3, TabbedDashboardComponent_Conditional_3_Conditional_3_For_4_Template, 3, 2, "mj-tab", 11, _forTrack0);
|
|
102
|
+
i0.ɵɵtemplate(5, TabbedDashboardComponent_Conditional_3_Conditional_3_Conditional_5_Template, 3, 2, "mj-tab", 11)(6, TabbedDashboardComponent_Conditional_3_Conditional_3_Conditional_6_Template, 4, 0, "mj-tab-body");
|
|
103
|
+
i0.ɵɵrepeaterCreate(7, TabbedDashboardComponent_Conditional_3_Conditional_3_For_8_Template, 3, 2, "mj-tab-body", null, _forTrack0);
|
|
104
|
+
i0.ɵɵtemplate(9, TabbedDashboardComponent_Conditional_3_Conditional_3_Conditional_9_Template, 4, 0, "mj-tab-body");
|
|
105
|
+
i0.ɵɵelementEnd();
|
|
106
|
+
} if (rf & 2) {
|
|
107
|
+
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
108
|
+
i0.ɵɵadvance(2);
|
|
109
|
+
i0.ɵɵconditional(ctx_r0.DefaultDashboardPosition === "first" ? 2 : -1);
|
|
110
|
+
i0.ɵɵadvance();
|
|
111
|
+
i0.ɵɵrepeater(ctx_r0.dashboards);
|
|
112
|
+
i0.ɵɵadvance(2);
|
|
113
|
+
i0.ɵɵconditional(ctx_r0.DefaultDashboardPosition === "last" ? 5 : -1);
|
|
114
|
+
i0.ɵɵadvance();
|
|
115
|
+
i0.ɵɵconditional(ctx_r0.DefaultDashboardPosition === "first" ? 6 : -1);
|
|
116
|
+
i0.ɵɵadvance();
|
|
117
|
+
i0.ɵɵrepeater(ctx_r0.dashboards);
|
|
118
|
+
i0.ɵɵadvance(2);
|
|
119
|
+
i0.ɵɵconditional(ctx_r0.DefaultDashboardPosition === "last" ? 9 : -1);
|
|
120
|
+
} }
|
|
121
|
+
function TabbedDashboardComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
122
|
+
i0.ɵɵelementStart(0, "div", 8, 1);
|
|
123
|
+
i0.ɵɵtemplate(2, TabbedDashboardComponent_Conditional_3_Conditional_2_Template, 2, 0, "div")(3, TabbedDashboardComponent_Conditional_3_Conditional_3_Template, 10, 4, "mj-tabstrip", 8);
|
|
124
|
+
i0.ɵɵelementEnd();
|
|
125
|
+
} if (rf & 2) {
|
|
126
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
127
|
+
i0.ɵɵadvance(2);
|
|
128
|
+
i0.ɵɵconditional(ctx_r0.dashboards.length === 0 ? 2 : 3);
|
|
129
|
+
} }
|
|
130
|
+
export class TabbedDashboardComponent {
|
|
131
|
+
constructor(router) {
|
|
132
|
+
this.router = router;
|
|
133
|
+
/**
|
|
134
|
+
* Specify the application to display dashboards for. If not specified, the scope is global.
|
|
135
|
+
*/
|
|
136
|
+
this.ApplicationID = null;
|
|
137
|
+
/**
|
|
138
|
+
* Name for the default tab when no dashboards are available.
|
|
139
|
+
*/
|
|
140
|
+
this.DefaultTabName = 'Default';
|
|
141
|
+
/**
|
|
142
|
+
* Specify the position of the default dashboard, first, last or not shown at all.
|
|
143
|
+
*/
|
|
144
|
+
this.DefaultDashboardPosition = 'last';
|
|
145
|
+
this.dashboards = [];
|
|
146
|
+
this.loading = true;
|
|
147
|
+
this.error = null;
|
|
148
|
+
this.dashboardInstances = new Map();
|
|
149
|
+
this.dashboardComponentRefs = new Map();
|
|
150
|
+
}
|
|
151
|
+
ngOnInit() {
|
|
152
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
ngAfterViewInit() {
|
|
156
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
157
|
+
try {
|
|
158
|
+
this.loading = true;
|
|
159
|
+
yield this.loadDashboards();
|
|
160
|
+
// Move content after loading is complete and view might have changed
|
|
161
|
+
setTimeout(() => {
|
|
162
|
+
// Move content to appropriate container after view is initialized
|
|
163
|
+
this.moveContentToCorrectContainer();
|
|
164
|
+
// if the first tab is the default tab, nothing to do, otherwise we need to do the loading of the first tab since it is dynamic content
|
|
165
|
+
if (this.DefaultDashboardPosition !== 'first' && this.dashboards.length > 0) {
|
|
166
|
+
const dashboardId = this.dashboards[0].ID;
|
|
167
|
+
const instance = this.getDashboardInstance(dashboardId);
|
|
168
|
+
if (instance) {
|
|
169
|
+
instance.SetVisible(true);
|
|
170
|
+
// now, we need to invoke a manual resize to ensure everything shows up right
|
|
171
|
+
InvokeManualResize(100);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}, 10);
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
LogError('Error in TabbedDashboardComponent.ngOnInit', null, error);
|
|
178
|
+
this.error = 'Failed to load dashboards';
|
|
179
|
+
}
|
|
180
|
+
finally {
|
|
181
|
+
this.loading = false;
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
moveContentToCorrectContainer() {
|
|
186
|
+
if (this.contentWrapper) {
|
|
187
|
+
const content = this.contentWrapper.nativeElement.children[0];
|
|
188
|
+
if (content) {
|
|
189
|
+
if (this.dashboards.length === 0 && this.noTabsContainer) {
|
|
190
|
+
this.noTabsContainer.nativeElement.appendChild(content);
|
|
191
|
+
}
|
|
192
|
+
else if (this.dashboards.length > 0 && this.tabContainer) {
|
|
193
|
+
this.tabContainer.nativeElement.appendChild(content);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
loadDashboards() {
|
|
199
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
200
|
+
try {
|
|
201
|
+
const md = new Metadata();
|
|
202
|
+
const rv = new RunView();
|
|
203
|
+
const appFilter = this.ApplicationID ? ` AND ApplicationID='${this.ApplicationID}'` : '';
|
|
204
|
+
const ds = yield md.GetAndCacheDatasetByName("MJ_Metadata"); // get the main MJ_Metadata dataset which is usually already cached
|
|
205
|
+
if (!ds || !ds.Success) {
|
|
206
|
+
this.error = ds.Status || 'Failed to load metadata dataset';
|
|
207
|
+
this.dashboards = [];
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
const dashList = ds.Results.find(r => r.Code === 'Dashboards');
|
|
211
|
+
if (!dashList) {
|
|
212
|
+
this.error = 'Dashboards dataset not found';
|
|
213
|
+
this.dashboards = [];
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
// now get the data from the dataset which is usually cached
|
|
217
|
+
const scope = this.ApplicationID ? 'App' : 'Global';
|
|
218
|
+
const baseCondition = `Scope='${scope}'${appFilter}`;
|
|
219
|
+
const userFilter = `UserID='${md.CurrentUser.ID}' AND ${baseCondition}`;
|
|
220
|
+
const upEntity = md.EntityByName('MJ: Dashboard User Preferences');
|
|
221
|
+
const filter = `(${userFilter})
|
|
222
|
+
OR
|
|
223
|
+
(UserID IS NULL AND ${baseCondition} AND
|
|
224
|
+
NOT EXISTS (SELECT 1 FROM [${upEntity.SchemaName}].[${upEntity.BaseView}]
|
|
225
|
+
WHERE ${userFilter}))`;
|
|
226
|
+
const params = {
|
|
227
|
+
EntityName: 'MJ: Dashboard User Preferences',
|
|
228
|
+
ExtraFilter: filter,
|
|
229
|
+
ResultType: 'entity_object',
|
|
230
|
+
OrderBy: 'DisplayOrder',
|
|
231
|
+
};
|
|
232
|
+
const prefsResult = yield rv.RunView(params); // Use RunView for user preferences because we don't want to cache this data as it would cause cache being refreshed all the time since
|
|
233
|
+
// user preferences can change frequently and we want to ensure we always have the latest preferences for the current user
|
|
234
|
+
if (prefsResult && prefsResult.Success && prefsResult.Results.length > 0) {
|
|
235
|
+
const dashResults = dashList.Results.filter((d) => {
|
|
236
|
+
return prefsResult.Results.some((p) => p.DashboardID === d.ID);
|
|
237
|
+
});
|
|
238
|
+
if (dashResults.length > 0) {
|
|
239
|
+
// now sort the dashboards based on the user preferences
|
|
240
|
+
this.dashboards = dashResults.sort((a, b) => {
|
|
241
|
+
const prefA = prefsResult.Results.find(p => p.DashboardID === a.ID);
|
|
242
|
+
const prefB = prefsResult.Results.find(p => p.DashboardID === b.ID);
|
|
243
|
+
if (prefA && prefB) {
|
|
244
|
+
// we want to sort by DisplayOrder where lower numbers come first
|
|
245
|
+
return (prefA.DisplayOrder || 0) - (prefB.DisplayOrder || 0);
|
|
246
|
+
}
|
|
247
|
+
return 0;
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
this.error = 'Failed to load dashboards';
|
|
252
|
+
this.dashboards = [];
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
// No dashboard preferences found - this is normal, show default content
|
|
257
|
+
this.dashboards = [];
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
LogError('Error loading dashboards', null, error);
|
|
262
|
+
this.error = 'Failed to load dashboards';
|
|
263
|
+
this.dashboards = [];
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
getDashboardInstance(dashboardId) {
|
|
268
|
+
if (!this.dashboardInstances.has(dashboardId)) {
|
|
269
|
+
try {
|
|
270
|
+
// Create instance of the appropriate dashboard class
|
|
271
|
+
const dashboardEntity = this.dashboards.find(d => d.ID === dashboardId);
|
|
272
|
+
if (dashboardEntity && this.tabstripContainer) {
|
|
273
|
+
// Use the type of the dashboard to determine which class to instantiate
|
|
274
|
+
const classInfo = MJGlobal.Instance.ClassFactory.GetRegistration(BaseDashboard, dashboardEntity.DriverClass);
|
|
275
|
+
if (!classInfo || !classInfo.SubClass) {
|
|
276
|
+
// Class not found error
|
|
277
|
+
const errorMsg = `Dashboard class '${dashboardEntity.DriverClass}' not found`;
|
|
278
|
+
console.error(`Error loading dashboard '${dashboardEntity.Name}': ${errorMsg}`);
|
|
279
|
+
this.displayDashboardError(dashboardId, `Dashboard component not available: ${dashboardEntity.DriverClass}`, 'The dashboard class is not registered. Please contact your system administrator.');
|
|
280
|
+
return undefined;
|
|
281
|
+
}
|
|
282
|
+
// Create the component dynamically
|
|
283
|
+
const componentRef = this.tabstripContainer.createComponent(classInfo.SubClass);
|
|
284
|
+
const instance = componentRef.instance;
|
|
285
|
+
if (!instance) {
|
|
286
|
+
// Instance creation failed error
|
|
287
|
+
const errorMsg = `Failed to create instance of dashboard class '${dashboardEntity.DriverClass}'`;
|
|
288
|
+
console.error(`Error loading dashboard '${dashboardEntity.Name}': ${errorMsg}`);
|
|
289
|
+
this.displayDashboardError(dashboardId, 'Dashboard failed to initialize', 'The dashboard could not be created. Please contact your system administrator.');
|
|
290
|
+
return undefined;
|
|
291
|
+
}
|
|
292
|
+
// Store both the instance and component reference
|
|
293
|
+
this.dashboardInstances.set(dashboardId, instance);
|
|
294
|
+
this.dashboardComponentRefs.set(dashboardId, componentRef);
|
|
295
|
+
// Find the target container element and append the component
|
|
296
|
+
setTimeout(() => __awaiter(this, void 0, void 0, function* () {
|
|
297
|
+
const targetElement = document.getElementById(`dashboard-${dashboardId}`);
|
|
298
|
+
if (targetElement && componentRef.location.nativeElement) {
|
|
299
|
+
targetElement.appendChild(componentRef.location.nativeElement);
|
|
300
|
+
const userStateEntity = yield this.loadDashboardUserState(dashboardId);
|
|
301
|
+
const config = {
|
|
302
|
+
dashboard: dashboardEntity,
|
|
303
|
+
userState: userStateEntity.UserState ? SafeJSONParse(userStateEntity.UserState) : {}
|
|
304
|
+
};
|
|
305
|
+
// handle open entity record events in MJ Explorer with routing
|
|
306
|
+
instance.OpenEntityRecord.subscribe((data) => {
|
|
307
|
+
// check to see if the data has entityname/pkey
|
|
308
|
+
if (data && data.EntityName && data.RecordPKey) {
|
|
309
|
+
// open the record in the explorer
|
|
310
|
+
this.router.navigate(['resource', 'record', data.RecordPKey.ToURLSegment()], { queryParams: { Entity: data.EntityName } });
|
|
311
|
+
}
|
|
312
|
+
});
|
|
313
|
+
instance.UserStateChanged.subscribe((userState) => __awaiter(this, void 0, void 0, function* () {
|
|
314
|
+
if (!userState) {
|
|
315
|
+
// if the user state is null, we need to remove it from the user state
|
|
316
|
+
userState = {};
|
|
317
|
+
}
|
|
318
|
+
// save the user state to the dashboard user state entity
|
|
319
|
+
userStateEntity.UserState = JSON.stringify(userState);
|
|
320
|
+
if (!(yield userStateEntity.Save())) {
|
|
321
|
+
LogError('Error saving user state', null, userStateEntity.LatestResult.Error);
|
|
322
|
+
}
|
|
323
|
+
}));
|
|
324
|
+
// now that we have state loaded and our events are wired up, we can set the config
|
|
325
|
+
instance.Config = config;
|
|
326
|
+
instance.Refresh();
|
|
327
|
+
// now invoke a manual resize
|
|
328
|
+
InvokeManualResize(100);
|
|
329
|
+
}
|
|
330
|
+
}), 0);
|
|
331
|
+
return instance;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
catch (error) {
|
|
335
|
+
const dashboardEntity = this.dashboards.find(d => d.ID === dashboardId);
|
|
336
|
+
const errorMsg = `Error creating dashboard instance for '${(dashboardEntity === null || dashboardEntity === void 0 ? void 0 : dashboardEntity.Name) || dashboardId}'`;
|
|
337
|
+
console.error(errorMsg, error);
|
|
338
|
+
LogError(errorMsg, null, error);
|
|
339
|
+
this.displayDashboardError(dashboardId, 'Dashboard loading error', 'An unexpected error occurred while loading the dashboard. Please contact your system administrator.');
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
return this.dashboardInstances.get(dashboardId);
|
|
343
|
+
}
|
|
344
|
+
displayDashboardError(dashboardId, title, message) {
|
|
345
|
+
// Display error message in the dashboard container
|
|
346
|
+
setTimeout(() => {
|
|
347
|
+
const targetElement = document.getElementById(`dashboard-${dashboardId}`);
|
|
348
|
+
if (targetElement) {
|
|
349
|
+
targetElement.innerHTML = `
|
|
350
|
+
<div style="display: flex; flex-direction: column; align-items: center; justify-content: center; height: 300px; text-align: center; padding: 20px; color: #666;">
|
|
351
|
+
<div style="font-size: 48px; color: #dc3545; margin-bottom: 20px;">⚠️</div>
|
|
352
|
+
<h3 style="color: #dc3545; margin: 0 0 10px 0;">${title}</h3>
|
|
353
|
+
<p style="margin: 0 0 20px 0; max-width: 400px; line-height: 1.5;">${message}</p>
|
|
354
|
+
<small style="color: #999;">Dashboard ID: ${dashboardId}</small>
|
|
355
|
+
</div>
|
|
356
|
+
`;
|
|
357
|
+
}
|
|
358
|
+
}, 0);
|
|
359
|
+
}
|
|
360
|
+
loadDashboardUserState(dashboardId) {
|
|
361
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
362
|
+
// handle user state changes for the dashboard
|
|
363
|
+
const rv = new RunView();
|
|
364
|
+
const md = new Metadata();
|
|
365
|
+
const stateResult = yield rv.RunView({
|
|
366
|
+
EntityName: 'MJ: Dashboard User States',
|
|
367
|
+
ExtraFilter: `DashboardID='${dashboardId}' AND UserID='${md.CurrentUser.ID}'`,
|
|
368
|
+
ResultType: 'entity_object',
|
|
369
|
+
});
|
|
370
|
+
let stateObject;
|
|
371
|
+
if (stateResult && stateResult.Success && stateResult.Results.length > 0) {
|
|
372
|
+
stateObject = stateResult.Results[0];
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
stateObject = yield md.GetEntityObject('MJ: Dashboard User States');
|
|
376
|
+
stateObject.DashboardID = dashboardId;
|
|
377
|
+
stateObject.UserID = md.CurrentUser.ID;
|
|
378
|
+
// don't save becuase we don't care about the state until something changes
|
|
379
|
+
}
|
|
380
|
+
return stateObject;
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
onTabSelect(tabIndex) {
|
|
384
|
+
// Initialize the dashboard if needed when its tab is selected
|
|
385
|
+
const dashboardIndex = tabIndex - 1; // Adjust for the default tab
|
|
386
|
+
if (dashboardIndex >= 0 && dashboardIndex < this.dashboards.length) {
|
|
387
|
+
const dashboard = this.dashboards[dashboardIndex];
|
|
388
|
+
const instance = this.getDashboardInstance(dashboard.ID);
|
|
389
|
+
if (instance) {
|
|
390
|
+
// You might want to trigger a refresh or other actions here when tab is selected
|
|
391
|
+
instance.SetVisible(true);
|
|
392
|
+
// now get all the other instances and let them know they're not visible
|
|
393
|
+
this.dashboards.forEach((d, index) => {
|
|
394
|
+
if (index !== dashboardIndex) {
|
|
395
|
+
const otherInstance = this.getDashboardInstance(d.ID);
|
|
396
|
+
if (otherInstance) {
|
|
397
|
+
otherInstance.SetVisible(false);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
});
|
|
401
|
+
// now invoke a manual resize
|
|
402
|
+
InvokeManualResize(100);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
ngOnDestroy() {
|
|
407
|
+
// Clean up component references
|
|
408
|
+
this.dashboardComponentRefs.forEach(componentRef => {
|
|
409
|
+
componentRef.destroy();
|
|
410
|
+
});
|
|
411
|
+
this.dashboardComponentRefs.clear();
|
|
412
|
+
this.dashboardInstances.clear();
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
TabbedDashboardComponent.ɵfac = function TabbedDashboardComponent_Factory(t) { return new (t || TabbedDashboardComponent)(i0.ɵɵdirectiveInject(i1.Router)); };
|
|
416
|
+
TabbedDashboardComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TabbedDashboardComponent, selectors: [["mj-tabbed-dashboard"]], viewQuery: function TabbedDashboardComponent_Query(rf, ctx) { if (rf & 1) {
|
|
417
|
+
i0.ɵɵviewQuery(_c0, 5);
|
|
418
|
+
i0.ɵɵviewQuery(_c1, 5);
|
|
419
|
+
i0.ɵɵviewQuery(_c2, 5);
|
|
420
|
+
i0.ɵɵviewQuery(_c3, 5);
|
|
421
|
+
i0.ɵɵviewQuery(_c4, 5, ViewContainerRef);
|
|
422
|
+
} if (rf & 2) {
|
|
423
|
+
let _t;
|
|
424
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.tabstrip = _t.first);
|
|
425
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.contentWrapper = _t.first);
|
|
426
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.noTabsContainer = _t.first);
|
|
427
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.tabContainer = _t.first);
|
|
428
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.tabstripContainer = _t.first);
|
|
429
|
+
} }, inputs: { ApplicationID: "ApplicationID", DefaultTabName: "DefaultTabName", DefaultDashboardPosition: "DefaultDashboardPosition" }, ngContentSelectors: _c5, decls: 7, vars: 5, consts: [["contentWrapper", ""], ["tabstripContainer", ""], ["noTabsContainer", ""], ["tabstrip", ""], ["tabContainer", ""], ["mjFillContainer", "", 1, "tabbed-dashboard-container", 3, "rightMargin", "bottomMargin"], [1, "loading-indicator"], [1, "error-message"], ["mjFillContainer", ""], [2, "display", "none"], ["mjFillContainer", "", 3, "TabSelected"], [3, "Name"], [1, "fa-solid", "tab-icon"], [1, "fa-solid", "fa-grip", "tab-icon"], ["mjFillContainer", "", 1, "dashboard-container"], ["mjFillContainer", "", 1, "dashboard-instance", 3, "id"]], template: function TabbedDashboardComponent_Template(rf, ctx) { if (rf & 1) {
|
|
430
|
+
i0.ɵɵprojectionDef();
|
|
431
|
+
i0.ɵɵelementStart(0, "div", 5);
|
|
432
|
+
i0.ɵɵtemplate(1, TabbedDashboardComponent_Conditional_1_Template, 3, 0, "div", 6)(2, TabbedDashboardComponent_Conditional_2_Template, 2, 1, "div", 7)(3, TabbedDashboardComponent_Conditional_3_Template, 4, 1, "div", 8);
|
|
433
|
+
i0.ɵɵelementEnd();
|
|
434
|
+
i0.ɵɵelementStart(4, "div", 9, 0);
|
|
435
|
+
i0.ɵɵprojection(6);
|
|
436
|
+
i0.ɵɵelementEnd();
|
|
437
|
+
} if (rf & 2) {
|
|
438
|
+
i0.ɵɵproperty("rightMargin", 10)("bottomMargin", 10);
|
|
439
|
+
i0.ɵɵadvance();
|
|
440
|
+
i0.ɵɵconditional(ctx.loading ? 1 : -1);
|
|
441
|
+
i0.ɵɵadvance();
|
|
442
|
+
i0.ɵɵconditional(ctx.error ? 2 : -1);
|
|
443
|
+
i0.ɵɵadvance();
|
|
444
|
+
i0.ɵɵconditional(!ctx.loading && !ctx.error ? 3 : -1);
|
|
445
|
+
} }, dependencies: [i2.LoaderComponent, i3.FillContainer, i4.MJTabStripComponent, i4.MJTabBodyComponent, i4.MJTabComponent], styles: [".tabbed-dashboard-container[_ngcontent-%COMP%] {\n border: solid 1px white;\n background-color: white;\n}\n\n.loading-indicator[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n font-size: 1.2rem;\n color: #666;\n}\n\n.error-message[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n font-size: 1.2rem;\n color: #d9534f;\n}\n\n.dashboard-container[_ngcontent-%COMP%] {\n height: 100%;\n width: 100%;\n overflow: auto;\n}\n\n.dashboard-instance-container[_ngcontent-%COMP%] {\n height: 100%;\n width: 100%;\n}\n\n.dashboard-placeholder[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n width: 100%;\n font-size: 1.2rem;\n color: #666;\n border: 1px dashed #ccc;\n padding: 20px;\n}\n\n.tab-icon[_ngcontent-%COMP%] {\n margin-right: 8px;\n}"] });
|
|
446
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TabbedDashboardComponent, [{
|
|
447
|
+
type: Component,
|
|
448
|
+
args: [{ selector: 'mj-tabbed-dashboard', template: "<div class=\"tabbed-dashboard-container\" mjFillContainer [rightMargin]=\"10\" [bottomMargin]=\"10\">\n @if (loading) {\n <div class=\"loading-indicator\">\n Loading dashboards...\n <kendo-loader></kendo-loader>\n </div>\n }\n \n @if (error) {\n <div class=\"error-message\">\n {{ error }}\n </div>\n }\n \n @if (!loading && !error) {\n <div #tabstripContainer mjFillContainer>\n @if (dashboards.length === 0) {\n <!-- Show default content without any tabs, if no dashboards are set for this user, cleaner this way -->\n <div #noTabsContainer></div>\n }\n @else {\n <!-- Show tab strip with dashboards -->\n <mj-tabstrip #tabstrip (TabSelected)=\"onTabSelect($event.index)\" mjFillContainer>\n <!-- Show default tab if no dashboards are available -->\n @if (DefaultDashboardPosition === 'first') {\n <mj-tab [Name]=\"DefaultTabName\">\n <span class=\"fa-solid tab-icon\"></span>\n {{ DefaultTabName }}\n </mj-tab>\n }\n \n <!-- Show dashboard tabs -->\n @for (dashboard of dashboards; track dashboard.ID; let i = $index) {\n <mj-tab [Name]=\"dashboard.Name\">\n <span class=\"fa-solid fa-grip tab-icon\"></span>\n {{ dashboard.Name }}\n </mj-tab>\n }\n\n @if (DefaultDashboardPosition === 'last') {\n <mj-tab [Name]=\"DefaultTabName\">\n <span class=\"fa-solid tab-icon\"></span>\n {{ DefaultTabName }}\n </mj-tab>\n }\n\n <!-- ****** -->\n <!-- TAB BODIES -->\n <!-- ****** -->\n \n <!-- Default tab body when it is shown first -->\n @if (DefaultDashboardPosition === 'first') {\n <mj-tab-body>\n <div class=\"dashboard-container\" mjFillContainer>\n <div #tabContainer mjFillContainer></div>\n </div>\n </mj-tab-body>\n }\n \n <!-- Dashboard tab bodies -->\n @for (dashboard of dashboards; track dashboard.ID; let i = $index) {\n <mj-tab-body>\n <div class=\"dashboard-container\" mjFillContainer>\n <div id=\"dashboard-{{ dashboard.ID }}\" class=\"dashboard-instance\" mjFillContainer>\n </div>\n </div>\n </mj-tab-body>\n }\n\n <!-- Default tab body, when it is shown last -->\n @if (DefaultDashboardPosition === 'last') {\n <mj-tab-body>\n <div class=\"dashboard-container\" mjFillContainer>\n <div #tabContainer mjFillContainer></div>\n </div>\n </mj-tab-body>\n }\n </mj-tabstrip>\n }\n </div>\n }\n</div>\n\n<!-- Single ng-content that will be moved programmatically -->\n<div #contentWrapper style=\"display: none;\">\n <ng-content></ng-content>\n</div>", styles: [".tabbed-dashboard-container {\n border: solid 1px white;\n background-color: white;\n}\n\n.loading-indicator {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n font-size: 1.2rem;\n color: #666;\n}\n\n.error-message {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n font-size: 1.2rem;\n color: #d9534f;\n}\n\n.dashboard-container {\n height: 100%;\n width: 100%;\n overflow: auto;\n}\n\n.dashboard-instance-container {\n height: 100%;\n width: 100%;\n}\n\n.dashboard-placeholder {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n width: 100%;\n font-size: 1.2rem;\n color: #666;\n border: 1px dashed #ccc;\n padding: 20px;\n}\n\n.tab-icon {\n margin-right: 8px;\n}"] }]
|
|
449
|
+
}], () => [{ type: i1.Router }], { tabstrip: [{
|
|
450
|
+
type: ViewChild,
|
|
451
|
+
args: ['tabstrip']
|
|
452
|
+
}], contentWrapper: [{
|
|
453
|
+
type: ViewChild,
|
|
454
|
+
args: ['contentWrapper']
|
|
455
|
+
}], noTabsContainer: [{
|
|
456
|
+
type: ViewChild,
|
|
457
|
+
args: ['noTabsContainer']
|
|
458
|
+
}], tabContainer: [{
|
|
459
|
+
type: ViewChild,
|
|
460
|
+
args: ['tabContainer']
|
|
461
|
+
}], tabstripContainer: [{
|
|
462
|
+
type: ViewChild,
|
|
463
|
+
args: ['tabstripContainer', { read: ViewContainerRef }]
|
|
464
|
+
}], ApplicationID: [{
|
|
465
|
+
type: Input
|
|
466
|
+
}], DefaultTabName: [{
|
|
467
|
+
type: Input
|
|
468
|
+
}], DefaultDashboardPosition: [{
|
|
469
|
+
type: Input
|
|
470
|
+
}] }); })();
|
|
471
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TabbedDashboardComponent, { className: "TabbedDashboardComponent", filePath: "src/lib/tabbed-dashboard/tabbed-dashboard.component.ts", lineNumber: 14 }); })();
|
|
472
|
+
//# sourceMappingURL=tabbed-dashboard.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabbed-dashboard.component.js","sourceRoot":"","sources":["../../../src/lib/tabbed-dashboard/tabbed-dashboard.component.ts","../../../src/lib/tabbed-dashboard/tabbed-dashboard.component.html"],"names":[],"mappings":"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"}
|