@memberjunction/ng-dashboards 5.31.0 → 5.33.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/Admin/admin-data-schema.component.d.ts +16 -0
- package/dist/Admin/admin-data-schema.component.d.ts.map +1 -0
- package/dist/Admin/admin-data-schema.component.js +136 -0
- package/dist/Admin/admin-data-schema.component.js.map +1 -0
- package/dist/Admin/admin-dev-tools-resource.component.d.ts +14 -0
- package/dist/Admin/admin-dev-tools-resource.component.d.ts.map +1 -0
- package/dist/Admin/admin-dev-tools-resource.component.js +162 -0
- package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -0
- package/dist/Admin/admin-identity-access.component.d.ts +15 -0
- package/dist/Admin/admin-identity-access.component.d.ts.map +1 -0
- package/dist/Admin/admin-identity-access.component.js +156 -0
- package/dist/Admin/admin-identity-access.component.js.map +1 -0
- package/dist/Admin/admin-monitoring.component.d.ts +15 -0
- package/dist/Admin/admin-monitoring.component.d.ts.map +1 -0
- package/dist/Admin/admin-monitoring.component.js +130 -0
- package/dist/Admin/admin-monitoring.component.js.map +1 -0
- package/dist/Admin/base-admin-container.component.d.ts +80 -0
- package/dist/Admin/base-admin-container.component.d.ts.map +1 -0
- package/dist/Admin/base-admin-container.component.js +198 -0
- package/dist/Admin/base-admin-container.component.js.map +1 -0
- package/dist/Admin/index.d.ts +6 -0
- package/dist/Admin/index.d.ts.map +1 -0
- package/dist/Admin/index.js +6 -0
- package/dist/Admin/index.js.map +1 -0
- package/dist/DevTools/app-state-inspector.component.d.ts +53 -0
- package/dist/DevTools/app-state-inspector.component.d.ts.map +1 -0
- package/dist/DevTools/app-state-inspector.component.js +301 -0
- package/dist/DevTools/app-state-inspector.component.js.map +1 -0
- package/dist/DevTools/class-registry.component.d.ts +64 -0
- package/dist/DevTools/class-registry.component.d.ts.map +1 -0
- package/dist/DevTools/class-registry.component.js +423 -0
- package/dist/DevTools/class-registry.component.js.map +1 -0
- package/dist/DevTools/dev-tools-prefs.d.ts +21 -0
- package/dist/DevTools/dev-tools-prefs.d.ts.map +1 -0
- package/dist/DevTools/dev-tools-prefs.js +48 -0
- package/dist/DevTools/dev-tools-prefs.js.map +1 -0
- package/dist/DevTools/event-monitor.component.d.ts +78 -0
- package/dist/DevTools/event-monitor.component.d.ts.map +1 -0
- package/dist/DevTools/event-monitor.component.js +659 -0
- package/dist/DevTools/event-monitor.component.js.map +1 -0
- package/dist/DevTools/graphql-console.component.d.ts +153 -0
- package/dist/DevTools/graphql-console.component.d.ts.map +1 -0
- package/dist/DevTools/graphql-console.component.js +1463 -0
- package/dist/DevTools/graphql-console.component.js.map +1 -0
- package/dist/DevTools/index.d.ts +8 -0
- package/dist/DevTools/index.d.ts.map +1 -0
- package/dist/DevTools/index.js +8 -0
- package/dist/DevTools/index.js.map +1 -0
- package/dist/DevTools/layout-inspector.component.d.ts +42 -0
- package/dist/DevTools/layout-inspector.component.d.ts.map +1 -0
- package/dist/DevTools/layout-inspector.component.js +208 -0
- package/dist/DevTools/layout-inspector.component.js.map +1 -0
- package/dist/DevTools/lazy-module-status.component.d.ts +65 -0
- package/dist/DevTools/lazy-module-status.component.d.ts.map +1 -0
- package/dist/DevTools/lazy-module-status.component.js +388 -0
- package/dist/DevTools/lazy-module-status.component.js.map +1 -0
- package/dist/DevTools/settings-explorer.component.d.ts +55 -0
- package/dist/DevTools/settings-explorer.component.d.ts.map +1 -0
- package/dist/DevTools/settings-explorer.component.js +394 -0
- package/dist/DevTools/settings-explorer.component.js.map +1 -0
- package/dist/core-dashboards.module.d.ts +45 -34
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +57 -0
- package/dist/core-dashboards.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 +52 -52
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';
|
|
2
|
+
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
interface LazyChunk {
|
|
5
|
+
/** A friendly label inferred from the underlying loader source. */
|
|
6
|
+
label: string;
|
|
7
|
+
/** The loader function's source-string (used as the unique chunk id internally). */
|
|
8
|
+
chunkId: string;
|
|
9
|
+
loaded: boolean;
|
|
10
|
+
keys: string[];
|
|
11
|
+
/** True when the user clicks "Force Load" — used to disable the button + show spinner. */
|
|
12
|
+
loading?: boolean;
|
|
13
|
+
/** UI state — false initially, user can expand to see all keys. */
|
|
14
|
+
expanded: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Lazy Module Status — visualizes the Explorer's lazy-loading registry.
|
|
18
|
+
* Shows each chunk, its status (loaded vs not), the registrations it
|
|
19
|
+
* brings in, and offers a "Force Load" button to preload on demand.
|
|
20
|
+
*
|
|
21
|
+
* Reads from the global `__mj_lazy_registry__` published by `LazyModuleRegistry`
|
|
22
|
+
* — no hard package dep on explorer-core.
|
|
23
|
+
*/
|
|
24
|
+
export declare class LazyModuleStatusComponent extends BaseResourceComponent implements OnInit, OnDestroy {
|
|
25
|
+
private cdr;
|
|
26
|
+
Stats: {
|
|
27
|
+
totalKeys: number;
|
|
28
|
+
loadedKeys: number;
|
|
29
|
+
chunkCount: number;
|
|
30
|
+
loadedChunks: number;
|
|
31
|
+
percent: number;
|
|
32
|
+
};
|
|
33
|
+
Chunks: LazyChunk[];
|
|
34
|
+
Available: boolean;
|
|
35
|
+
Filter: 'all' | 'loaded' | 'not-loaded';
|
|
36
|
+
LastRefreshed: Date;
|
|
37
|
+
constructor(cdr: ChangeDetectorRef);
|
|
38
|
+
ngOnInit(): void;
|
|
39
|
+
ngOnDestroy(): void;
|
|
40
|
+
private savePrefs;
|
|
41
|
+
GetResourceDisplayName(): Promise<string>;
|
|
42
|
+
GetResourceIconClass(): Promise<string>;
|
|
43
|
+
refresh(): void;
|
|
44
|
+
OnFilterClick(filter: 'all' | 'loaded' | 'not-loaded'): void;
|
|
45
|
+
get FilteredChunks(): LazyChunk[];
|
|
46
|
+
OnForceLoad(chunk: LazyChunk): Promise<void>;
|
|
47
|
+
get LastRefreshedLabel(): string;
|
|
48
|
+
TrackByChunk: (_i: number, c: LazyChunk) => string;
|
|
49
|
+
readonly CollapsedKeyLimit = 8;
|
|
50
|
+
ToggleChunkExpand(chunk: LazyChunk): void;
|
|
51
|
+
VisibleKeys(chunk: LazyChunk): string[];
|
|
52
|
+
HiddenCount(chunk: LazyChunk): number;
|
|
53
|
+
/**
|
|
54
|
+
* Derive a friendly chunk label from the loader function's source. The
|
|
55
|
+
* generated `LAZY_FEATURE_CONFIG` builds loaders that look like:
|
|
56
|
+
* () => importFn().then(() => {})
|
|
57
|
+
* where importFn is `() => import('@memberjunction/ng-dashboards/foo.module')`
|
|
58
|
+
* So the chunk id (loader.toString()) usually contains the dynamic import path.
|
|
59
|
+
*/
|
|
60
|
+
private deriveChunkLabel;
|
|
61
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<LazyModuleStatusComponent, never>;
|
|
62
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<LazyModuleStatusComponent, "mj-lazy-module-status", never, {}, {}, never, never, false, never>;
|
|
63
|
+
}
|
|
64
|
+
export {};
|
|
65
|
+
//# sourceMappingURL=lazy-module-status.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy-module-status.component.d.ts","sourceRoot":"","sources":["../../src/DevTools/lazy-module-status.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;;AAIlE,UAAU,SAAS;IACf,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC;IACd,oFAAoF;IACpF,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,0FAA0F;IAC1F,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mEAAmE;IACnE,QAAQ,EAAE,OAAO,CAAC;CACrB;AAeD;;;;;;;GAOG;AACH,qBAOa,yBAA0B,SAAQ,qBAAsB,YAAW,MAAM,EAAE,SAAS;IAQjF,OAAO,CAAC,GAAG;IANhB,KAAK;;;;;;MAA+E;IACpF,MAAM,EAAE,SAAS,EAAE,CAAM;IACzB,SAAS,UAAS;IAClB,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,YAAY,CAAS;IAChD,aAAa,OAAc;gBAEd,GAAG,EAAE,iBAAiB;IAInC,QAAQ,IAAI,IAAI;IAUP,WAAW,IAAI,IAAI;IAKnC,OAAO,CAAC,SAAS;IAOK,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IACzC,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAEtD,OAAO,IAAI,IAAI;IAkCf,aAAa,CAAC,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,YAAY,GAAG,IAAI;IAKnE,IAAW,cAAc,IAAI,SAAS,EAAE,CAMvC;IAEY,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBzD,IAAW,kBAAkB,IAAI,MAAM,CAEtC;IAEM,YAAY,GAAI,IAAI,MAAM,EAAE,GAAG,SAAS,YAAe;IAC9D,SAAgB,iBAAiB,KAAuB;IAEjD,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAKzC,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,EAAE;IAIvC,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM;IAI5C;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;yCAhIf,yBAAyB;2CAAzB,yBAAyB;CA8IrC"}
|
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { Component } from '@angular/core';
|
|
8
|
+
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
9
|
+
import { RegisterClass } from '@memberjunction/global';
|
|
10
|
+
import { DevToolsPrefs } from './dev-tools-prefs';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
function LazyModuleStatusComponent_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
13
|
+
i0.ɵɵelementStart(0, "div", 10);
|
|
14
|
+
i0.ɵɵelement(1, "i", 11);
|
|
15
|
+
i0.ɵɵelementStart(2, "div")(3, "strong");
|
|
16
|
+
i0.ɵɵtext(4, "Lazy registry not available.");
|
|
17
|
+
i0.ɵɵelementEnd();
|
|
18
|
+
i0.ɵɵtext(5, " The shell hasn't published the LazyModuleRegistry to globalThis yet, or you're viewing this in an environment that doesn't use it. ");
|
|
19
|
+
i0.ɵɵelementEnd()();
|
|
20
|
+
} }
|
|
21
|
+
function LazyModuleStatusComponent_Conditional_15_For_45_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
22
|
+
i0.ɵɵelement(0, "i", 36);
|
|
23
|
+
} }
|
|
24
|
+
function LazyModuleStatusComponent_Conditional_15_For_45_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
25
|
+
i0.ɵɵelement(0, "i", 27);
|
|
26
|
+
} }
|
|
27
|
+
function LazyModuleStatusComponent_Conditional_15_For_45_Conditional_10_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
28
|
+
i0.ɵɵelement(0, "i", 44);
|
|
29
|
+
i0.ɵɵtext(1, " Loading ");
|
|
30
|
+
} }
|
|
31
|
+
function LazyModuleStatusComponent_Conditional_15_For_45_Conditional_10_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
32
|
+
i0.ɵɵelement(0, "i", 45);
|
|
33
|
+
i0.ɵɵtext(1, " Load ");
|
|
34
|
+
} }
|
|
35
|
+
function LazyModuleStatusComponent_Conditional_15_For_45_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
36
|
+
const _r3 = i0.ɵɵgetCurrentView();
|
|
37
|
+
i0.ɵɵelementStart(0, "button", 43);
|
|
38
|
+
i0.ɵɵlistener("click", function LazyModuleStatusComponent_Conditional_15_For_45_Conditional_10_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const chunk_r4 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnForceLoad(chunk_r4)); });
|
|
39
|
+
i0.ɵɵconditionalCreate(1, LazyModuleStatusComponent_Conditional_15_For_45_Conditional_10_Conditional_1_Template, 2, 0)(2, LazyModuleStatusComponent_Conditional_15_For_45_Conditional_10_Conditional_2_Template, 2, 0);
|
|
40
|
+
i0.ɵɵelementEnd();
|
|
41
|
+
} if (rf & 2) {
|
|
42
|
+
const chunk_r4 = i0.ɵɵnextContext().$implicit;
|
|
43
|
+
i0.ɵɵproperty("disabled", chunk_r4.loading);
|
|
44
|
+
i0.ɵɵadvance();
|
|
45
|
+
i0.ɵɵconditional(chunk_r4.loading ? 1 : 2);
|
|
46
|
+
} }
|
|
47
|
+
function LazyModuleStatusComponent_Conditional_15_For_45_For_13_Template(rf, ctx) { if (rf & 1) {
|
|
48
|
+
i0.ɵɵelementStart(0, "span", 41);
|
|
49
|
+
i0.ɵɵtext(1);
|
|
50
|
+
i0.ɵɵelementEnd();
|
|
51
|
+
} if (rf & 2) {
|
|
52
|
+
const k_r5 = ctx.$implicit;
|
|
53
|
+
i0.ɵɵadvance();
|
|
54
|
+
i0.ɵɵtextInterpolate(k_r5);
|
|
55
|
+
} }
|
|
56
|
+
function LazyModuleStatusComponent_Conditional_15_For_45_Conditional_14_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
57
|
+
i0.ɵɵelement(0, "i", 47);
|
|
58
|
+
i0.ɵɵtext(1, " Show less ");
|
|
59
|
+
} }
|
|
60
|
+
function LazyModuleStatusComponent_Conditional_15_For_45_Conditional_14_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
61
|
+
i0.ɵɵelement(0, "i", 48);
|
|
62
|
+
i0.ɵɵtext(1);
|
|
63
|
+
} if (rf & 2) {
|
|
64
|
+
const chunk_r4 = i0.ɵɵnextContext(2).$implicit;
|
|
65
|
+
i0.ɵɵadvance();
|
|
66
|
+
i0.ɵɵtextInterpolate1(" Show all ", chunk_r4.keys.length, " entries ");
|
|
67
|
+
} }
|
|
68
|
+
function LazyModuleStatusComponent_Conditional_15_For_45_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
69
|
+
const _r6 = i0.ɵɵgetCurrentView();
|
|
70
|
+
i0.ɵɵelementStart(0, "button", 46);
|
|
71
|
+
i0.ɵɵlistener("click", function LazyModuleStatusComponent_Conditional_15_For_45_Conditional_14_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const chunk_r4 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ToggleChunkExpand(chunk_r4)); });
|
|
72
|
+
i0.ɵɵconditionalCreate(1, LazyModuleStatusComponent_Conditional_15_For_45_Conditional_14_Conditional_1_Template, 2, 0)(2, LazyModuleStatusComponent_Conditional_15_For_45_Conditional_14_Conditional_2_Template, 2, 1);
|
|
73
|
+
i0.ɵɵelementEnd();
|
|
74
|
+
} if (rf & 2) {
|
|
75
|
+
const chunk_r4 = i0.ɵɵnextContext().$implicit;
|
|
76
|
+
i0.ɵɵadvance();
|
|
77
|
+
i0.ɵɵconditional(chunk_r4.expanded ? 1 : 2);
|
|
78
|
+
} }
|
|
79
|
+
function LazyModuleStatusComponent_Conditional_15_For_45_Template(rf, ctx) { if (rf & 1) {
|
|
80
|
+
i0.ɵɵelementStart(0, "div", 33)(1, "div", 34)(2, "div", 35);
|
|
81
|
+
i0.ɵɵconditionalCreate(3, LazyModuleStatusComponent_Conditional_15_For_45_Conditional_3_Template, 1, 0, "i", 36)(4, LazyModuleStatusComponent_Conditional_15_For_45_Conditional_4_Template, 1, 0, "i", 27);
|
|
82
|
+
i0.ɵɵelementEnd();
|
|
83
|
+
i0.ɵɵelementStart(5, "div", 37)(6, "code");
|
|
84
|
+
i0.ɵɵtext(7);
|
|
85
|
+
i0.ɵɵelementEnd();
|
|
86
|
+
i0.ɵɵelementStart(8, "span", 38);
|
|
87
|
+
i0.ɵɵtext(9);
|
|
88
|
+
i0.ɵɵelementEnd()();
|
|
89
|
+
i0.ɵɵconditionalCreate(10, LazyModuleStatusComponent_Conditional_15_For_45_Conditional_10_Template, 3, 2, "button", 39);
|
|
90
|
+
i0.ɵɵelementEnd();
|
|
91
|
+
i0.ɵɵelementStart(11, "div", 40);
|
|
92
|
+
i0.ɵɵrepeaterCreate(12, LazyModuleStatusComponent_Conditional_15_For_45_For_13_Template, 2, 1, "span", 41, i0.ɵɵrepeaterTrackByIdentity);
|
|
93
|
+
i0.ɵɵelementEnd();
|
|
94
|
+
i0.ɵɵconditionalCreate(14, LazyModuleStatusComponent_Conditional_15_For_45_Conditional_14_Template, 3, 1, "button", 42);
|
|
95
|
+
i0.ɵɵelementEnd();
|
|
96
|
+
} if (rf & 2) {
|
|
97
|
+
const chunk_r4 = ctx.$implicit;
|
|
98
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
99
|
+
i0.ɵɵclassProp("lz-card--loaded", chunk_r4.loaded);
|
|
100
|
+
i0.ɵɵadvance(2);
|
|
101
|
+
i0.ɵɵclassProp("lz-card-status--loaded", chunk_r4.loaded);
|
|
102
|
+
i0.ɵɵadvance();
|
|
103
|
+
i0.ɵɵconditional(chunk_r4.loaded ? 3 : 4);
|
|
104
|
+
i0.ɵɵadvance(4);
|
|
105
|
+
i0.ɵɵtextInterpolate(chunk_r4.label);
|
|
106
|
+
i0.ɵɵadvance(2);
|
|
107
|
+
i0.ɵɵtextInterpolate1("", chunk_r4.keys.length, " entries");
|
|
108
|
+
i0.ɵɵadvance();
|
|
109
|
+
i0.ɵɵconditional(!chunk_r4.loaded ? 10 : -1);
|
|
110
|
+
i0.ɵɵadvance();
|
|
111
|
+
i0.ɵɵclassProp("lz-card-keys--expanded", chunk_r4.expanded);
|
|
112
|
+
i0.ɵɵadvance();
|
|
113
|
+
i0.ɵɵrepeater(ctx_r1.VisibleKeys(chunk_r4));
|
|
114
|
+
i0.ɵɵadvance(2);
|
|
115
|
+
i0.ɵɵconditional(ctx_r1.HiddenCount(chunk_r4) > 0 || chunk_r4.expanded ? 14 : -1);
|
|
116
|
+
} }
|
|
117
|
+
function LazyModuleStatusComponent_Conditional_15_Conditional_46_Template(rf, ctx) { if (rf & 1) {
|
|
118
|
+
i0.ɵɵelementStart(0, "div", 32);
|
|
119
|
+
i0.ɵɵelement(1, "i", 11);
|
|
120
|
+
i0.ɵɵtext(2, " No chunks match the current filter. ");
|
|
121
|
+
i0.ɵɵelementEnd();
|
|
122
|
+
} }
|
|
123
|
+
function LazyModuleStatusComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
124
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
125
|
+
i0.ɵɵelementStart(0, "div", 12)(1, "div", 13)(2, "div", 14);
|
|
126
|
+
i0.ɵɵelement(3, "div", 15);
|
|
127
|
+
i0.ɵɵelementEnd();
|
|
128
|
+
i0.ɵɵelementStart(4, "div", 16)(5, "span", 17);
|
|
129
|
+
i0.ɵɵtext(6);
|
|
130
|
+
i0.ɵɵelementEnd();
|
|
131
|
+
i0.ɵɵelementStart(7, "span", 18);
|
|
132
|
+
i0.ɵɵtext(8);
|
|
133
|
+
i0.ɵɵelementEnd()()();
|
|
134
|
+
i0.ɵɵelementStart(9, "div", 19)(10, "div", 20)(11, "div", 21);
|
|
135
|
+
i0.ɵɵtext(12);
|
|
136
|
+
i0.ɵɵelementEnd();
|
|
137
|
+
i0.ɵɵelementStart(13, "div", 22);
|
|
138
|
+
i0.ɵɵtext(14, "Registered keys");
|
|
139
|
+
i0.ɵɵelementEnd()();
|
|
140
|
+
i0.ɵɵelementStart(15, "div", 20)(16, "div", 21);
|
|
141
|
+
i0.ɵɵtext(17);
|
|
142
|
+
i0.ɵɵelementEnd();
|
|
143
|
+
i0.ɵɵelementStart(18, "div", 22);
|
|
144
|
+
i0.ɵɵtext(19, "Loaded keys");
|
|
145
|
+
i0.ɵɵelementEnd()();
|
|
146
|
+
i0.ɵɵelementStart(20, "div", 20)(21, "div", 21);
|
|
147
|
+
i0.ɵɵtext(22);
|
|
148
|
+
i0.ɵɵelementEnd();
|
|
149
|
+
i0.ɵɵelementStart(23, "div", 22);
|
|
150
|
+
i0.ɵɵtext(24, "Total chunks");
|
|
151
|
+
i0.ɵɵelementEnd()()()();
|
|
152
|
+
i0.ɵɵelementStart(25, "div", 23)(26, "button", 24);
|
|
153
|
+
i0.ɵɵlistener("click", function LazyModuleStatusComponent_Conditional_15_Template_button_click_26_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnFilterClick("all")); });
|
|
154
|
+
i0.ɵɵtext(27, " All ");
|
|
155
|
+
i0.ɵɵelementStart(28, "span", 25);
|
|
156
|
+
i0.ɵɵtext(29);
|
|
157
|
+
i0.ɵɵelementEnd()();
|
|
158
|
+
i0.ɵɵelementStart(30, "button", 24);
|
|
159
|
+
i0.ɵɵlistener("click", function LazyModuleStatusComponent_Conditional_15_Template_button_click_30_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnFilterClick("loaded")); });
|
|
160
|
+
i0.ɵɵelement(31, "i", 26);
|
|
161
|
+
i0.ɵɵtext(32, " Loaded ");
|
|
162
|
+
i0.ɵɵelementStart(33, "span", 25);
|
|
163
|
+
i0.ɵɵtext(34);
|
|
164
|
+
i0.ɵɵelementEnd()();
|
|
165
|
+
i0.ɵɵelementStart(35, "button", 24);
|
|
166
|
+
i0.ɵɵlistener("click", function LazyModuleStatusComponent_Conditional_15_Template_button_click_35_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnFilterClick("not-loaded")); });
|
|
167
|
+
i0.ɵɵelement(36, "i", 27);
|
|
168
|
+
i0.ɵɵtext(37, " Not loaded ");
|
|
169
|
+
i0.ɵɵelementStart(38, "span", 25);
|
|
170
|
+
i0.ɵɵtext(39);
|
|
171
|
+
i0.ɵɵelementEnd()();
|
|
172
|
+
i0.ɵɵelement(40, "span", 28);
|
|
173
|
+
i0.ɵɵelementStart(41, "span", 29);
|
|
174
|
+
i0.ɵɵtext(42);
|
|
175
|
+
i0.ɵɵelementEnd()();
|
|
176
|
+
i0.ɵɵelementStart(43, "div", 30);
|
|
177
|
+
i0.ɵɵrepeaterCreate(44, LazyModuleStatusComponent_Conditional_15_For_45_Template, 15, 11, "div", 31, i0.ɵɵcomponentInstance().TrackByChunk, true);
|
|
178
|
+
i0.ɵɵconditionalCreate(46, LazyModuleStatusComponent_Conditional_15_Conditional_46_Template, 3, 0, "div", 32);
|
|
179
|
+
i0.ɵɵelementEnd();
|
|
180
|
+
} if (rf & 2) {
|
|
181
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
182
|
+
i0.ɵɵadvance(3);
|
|
183
|
+
i0.ɵɵstyleProp("width", ctx_r1.Stats.percent, "%");
|
|
184
|
+
i0.ɵɵadvance(3);
|
|
185
|
+
i0.ɵɵtextInterpolate1("", ctx_r1.Stats.percent, "%");
|
|
186
|
+
i0.ɵɵadvance(2);
|
|
187
|
+
i0.ɵɵtextInterpolate2("", ctx_r1.Stats.loadedChunks, " of ", ctx_r1.Stats.chunkCount, " chunks loaded");
|
|
188
|
+
i0.ɵɵadvance(4);
|
|
189
|
+
i0.ɵɵtextInterpolate(ctx_r1.Stats.totalKeys);
|
|
190
|
+
i0.ɵɵadvance(5);
|
|
191
|
+
i0.ɵɵtextInterpolate(ctx_r1.Stats.loadedKeys);
|
|
192
|
+
i0.ɵɵadvance(5);
|
|
193
|
+
i0.ɵɵtextInterpolate(ctx_r1.Stats.chunkCount);
|
|
194
|
+
i0.ɵɵadvance(4);
|
|
195
|
+
i0.ɵɵclassProp("lz-filter--active", ctx_r1.Filter === "all");
|
|
196
|
+
i0.ɵɵadvance(3);
|
|
197
|
+
i0.ɵɵtextInterpolate(ctx_r1.Stats.chunkCount);
|
|
198
|
+
i0.ɵɵadvance();
|
|
199
|
+
i0.ɵɵclassProp("lz-filter--active", ctx_r1.Filter === "loaded");
|
|
200
|
+
i0.ɵɵadvance(4);
|
|
201
|
+
i0.ɵɵtextInterpolate(ctx_r1.Stats.loadedChunks);
|
|
202
|
+
i0.ɵɵadvance();
|
|
203
|
+
i0.ɵɵclassProp("lz-filter--active", ctx_r1.Filter === "not-loaded");
|
|
204
|
+
i0.ɵɵadvance(4);
|
|
205
|
+
i0.ɵɵtextInterpolate(ctx_r1.Stats.chunkCount - ctx_r1.Stats.loadedChunks);
|
|
206
|
+
i0.ɵɵadvance(3);
|
|
207
|
+
i0.ɵɵtextInterpolate1("Refreshed ", ctx_r1.LastRefreshedLabel);
|
|
208
|
+
i0.ɵɵadvance(2);
|
|
209
|
+
i0.ɵɵrepeater(ctx_r1.FilteredChunks);
|
|
210
|
+
i0.ɵɵadvance(2);
|
|
211
|
+
i0.ɵɵconditional(ctx_r1.FilteredChunks.length === 0 ? 46 : -1);
|
|
212
|
+
} }
|
|
213
|
+
/** How many entry pills to show in the collapsed card before "Show all". */
|
|
214
|
+
const COLLAPSED_KEY_LIMIT = 8;
|
|
215
|
+
/**
|
|
216
|
+
* Lazy Module Status — visualizes the Explorer's lazy-loading registry.
|
|
217
|
+
* Shows each chunk, its status (loaded vs not), the registrations it
|
|
218
|
+
* brings in, and offers a "Force Load" button to preload on demand.
|
|
219
|
+
*
|
|
220
|
+
* Reads from the global `__mj_lazy_registry__` published by `LazyModuleRegistry`
|
|
221
|
+
* — no hard package dep on explorer-core.
|
|
222
|
+
*/
|
|
223
|
+
let LazyModuleStatusComponent = class LazyModuleStatusComponent extends BaseResourceComponent {
|
|
224
|
+
cdr;
|
|
225
|
+
Stats = { totalKeys: 0, loadedKeys: 0, chunkCount: 0, loadedChunks: 0, percent: 0 };
|
|
226
|
+
Chunks = [];
|
|
227
|
+
Available = false;
|
|
228
|
+
Filter = 'all';
|
|
229
|
+
LastRefreshed = new Date();
|
|
230
|
+
constructor(cdr) {
|
|
231
|
+
super();
|
|
232
|
+
this.cdr = cdr;
|
|
233
|
+
}
|
|
234
|
+
ngOnInit() {
|
|
235
|
+
const prefs = DevToolsPrefs.Get('lazyModule');
|
|
236
|
+
if (prefs?.filter)
|
|
237
|
+
this.Filter = prefs.filter;
|
|
238
|
+
this.refresh();
|
|
239
|
+
if (prefs?.expanded) {
|
|
240
|
+
for (const c of this.Chunks)
|
|
241
|
+
c.expanded = prefs.expanded.includes(c.chunkId);
|
|
242
|
+
}
|
|
243
|
+
this.NotifyLoadComplete();
|
|
244
|
+
}
|
|
245
|
+
ngOnDestroy() {
|
|
246
|
+
this.savePrefs();
|
|
247
|
+
super.ngOnDestroy();
|
|
248
|
+
}
|
|
249
|
+
savePrefs() {
|
|
250
|
+
DevToolsPrefs.Save('lazyModule', {
|
|
251
|
+
filter: this.Filter,
|
|
252
|
+
expanded: this.Chunks.filter(c => c.expanded).map(c => c.chunkId)
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
async GetResourceDisplayName() { return 'Lazy Loading'; }
|
|
256
|
+
async GetResourceIconClass() { return 'fa-solid fa-puzzle-piece'; }
|
|
257
|
+
refresh() {
|
|
258
|
+
const reg = globalThis.__mj_lazy_registry__;
|
|
259
|
+
if (!reg || typeof reg.GetSnapshot !== 'function') {
|
|
260
|
+
this.Available = false;
|
|
261
|
+
this.cdr.markForCheck();
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
this.Available = true;
|
|
265
|
+
const snap = reg.GetSnapshot();
|
|
266
|
+
// Preserve expansion state across refreshes
|
|
267
|
+
const prevExpansion = new Map(this.Chunks.map(c => [c.chunkId, c.expanded]));
|
|
268
|
+
this.Chunks = snap.chunks.map(c => ({
|
|
269
|
+
label: this.deriveChunkLabel(c.chunkId, c.keys),
|
|
270
|
+
chunkId: c.chunkId,
|
|
271
|
+
loaded: c.loaded,
|
|
272
|
+
keys: c.keys,
|
|
273
|
+
expanded: prevExpansion.get(c.chunkId) ?? false
|
|
274
|
+
})).sort((a, b) => {
|
|
275
|
+
if (a.loaded !== b.loaded)
|
|
276
|
+
return a.loaded ? -1 : 1; // loaded first
|
|
277
|
+
return a.label.localeCompare(b.label);
|
|
278
|
+
});
|
|
279
|
+
const loadedChunks = this.Chunks.filter(c => c.loaded).length;
|
|
280
|
+
this.Stats = {
|
|
281
|
+
totalKeys: snap.registered.length,
|
|
282
|
+
loadedKeys: snap.loaded.length,
|
|
283
|
+
chunkCount: snap.chunks.length,
|
|
284
|
+
loadedChunks,
|
|
285
|
+
percent: snap.chunks.length === 0 ? 0 : Math.round((loadedChunks / snap.chunks.length) * 100)
|
|
286
|
+
};
|
|
287
|
+
this.LastRefreshed = new Date();
|
|
288
|
+
this.cdr.markForCheck();
|
|
289
|
+
}
|
|
290
|
+
OnFilterClick(filter) {
|
|
291
|
+
this.Filter = filter;
|
|
292
|
+
this.savePrefs();
|
|
293
|
+
}
|
|
294
|
+
get FilteredChunks() {
|
|
295
|
+
switch (this.Filter) {
|
|
296
|
+
case 'loaded': return this.Chunks.filter(c => c.loaded);
|
|
297
|
+
case 'not-loaded': return this.Chunks.filter(c => !c.loaded);
|
|
298
|
+
default: return this.Chunks;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
async OnForceLoad(chunk) {
|
|
302
|
+
if (chunk.loaded || chunk.loading)
|
|
303
|
+
return;
|
|
304
|
+
const reg = globalThis.__mj_lazy_registry__;
|
|
305
|
+
if (!reg || chunk.keys.length === 0)
|
|
306
|
+
return;
|
|
307
|
+
chunk.loading = true;
|
|
308
|
+
this.cdr.markForCheck();
|
|
309
|
+
try {
|
|
310
|
+
await reg.ForceLoad(chunk.keys[0]); // any key in the chunk loads the same chunk
|
|
311
|
+
// Re-read snapshot to get authoritative state
|
|
312
|
+
this.refresh();
|
|
313
|
+
}
|
|
314
|
+
catch {
|
|
315
|
+
chunk.loading = false;
|
|
316
|
+
this.cdr.markForCheck();
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
get LastRefreshedLabel() {
|
|
320
|
+
return this.LastRefreshed.toLocaleTimeString();
|
|
321
|
+
}
|
|
322
|
+
TrackByChunk = (_i, c) => c.chunkId;
|
|
323
|
+
CollapsedKeyLimit = COLLAPSED_KEY_LIMIT;
|
|
324
|
+
ToggleChunkExpand(chunk) {
|
|
325
|
+
chunk.expanded = !chunk.expanded;
|
|
326
|
+
this.savePrefs();
|
|
327
|
+
}
|
|
328
|
+
VisibleKeys(chunk) {
|
|
329
|
+
return chunk.expanded ? chunk.keys : chunk.keys.slice(0, COLLAPSED_KEY_LIMIT);
|
|
330
|
+
}
|
|
331
|
+
HiddenCount(chunk) {
|
|
332
|
+
return Math.max(0, chunk.keys.length - COLLAPSED_KEY_LIMIT);
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Derive a friendly chunk label from the loader function's source. The
|
|
336
|
+
* generated `LAZY_FEATURE_CONFIG` builds loaders that look like:
|
|
337
|
+
* () => importFn().then(() => {})
|
|
338
|
+
* where importFn is `() => import('@memberjunction/ng-dashboards/foo.module')`
|
|
339
|
+
* So the chunk id (loader.toString()) usually contains the dynamic import path.
|
|
340
|
+
*/
|
|
341
|
+
deriveChunkLabel(chunkId, keys) {
|
|
342
|
+
const m = chunkId.match(/import\(["']([^"']+)["']\)/);
|
|
343
|
+
if (m && m[1]) {
|
|
344
|
+
// Strip the @memberjunction/ prefix for brevity
|
|
345
|
+
return m[1].replace(/^@memberjunction\//, '');
|
|
346
|
+
}
|
|
347
|
+
// Fallback: derive from a representative key
|
|
348
|
+
if (keys.length > 0) {
|
|
349
|
+
const first = keys[0];
|
|
350
|
+
const parts = first.split('::');
|
|
351
|
+
return parts.length === 2 ? parts[1] : first;
|
|
352
|
+
}
|
|
353
|
+
return '(unknown chunk)';
|
|
354
|
+
}
|
|
355
|
+
static ɵfac = function LazyModuleStatusComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || LazyModuleStatusComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
356
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: LazyModuleStatusComponent, selectors: [["mj-lazy-module-status"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 16, vars: 1, consts: [[1, "mj-inspector", "mj-inspector--solo"], [1, "mj-inspector__header"], [1, "mj-inspector__header-icon"], [1, "fa-solid", "fa-puzzle-piece"], [1, "mj-inspector__header-title"], [1, "mj-inspector__header-sub"], [1, "mj-inspector__header-spacer"], [1, "mj-inspector__header-actions"], ["type", "button", "title", "Refresh", 1, "mj-inspector__btn", 3, "click"], [1, "fa-solid", "fa-rotate"], [1, "lz-unavailable"], [1, "fa-solid", "fa-circle-info"], [1, "lz-summary"], [1, "lz-progress"], [1, "lz-progress-bar"], [1, "lz-progress-fill"], [1, "lz-progress-meta"], [1, "lz-progress-pct"], [1, "lz-progress-label"], [1, "lz-summary-stats"], [1, "lz-summary-stat"], [1, "lz-summary-value"], [1, "lz-summary-label"], [1, "lz-filter-bar"], ["type", "button", 1, "lz-filter", 3, "click"], [1, "lz-filter-count"], [1, "fa-solid", "fa-check-circle"], [1, "fa-regular", "fa-circle"], [1, "lz-spacer"], [1, "lz-refreshed"], [1, "lz-grid"], [1, "lz-card", 3, "lz-card--loaded"], [1, "lz-empty"], [1, "lz-card"], [1, "lz-card-head"], [1, "lz-card-status"], [1, "fa-solid", "fa-circle-check"], [1, "lz-card-title"], [1, "lz-card-kcount"], ["type", "button", "title", "Force-load this chunk now", 1, "lz-load-btn", 3, "disabled"], [1, "lz-card-keys"], [1, "lz-key"], ["type", "button", 1, "lz-card-expand"], ["type", "button", "title", "Force-load this chunk now", 1, "lz-load-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-bolt"], ["type", "button", 1, "lz-card-expand", 3, "click"], [1, "fa-solid", "fa-chevron-up"], [1, "fa-solid", "fa-chevron-down"]], template: function LazyModuleStatusComponent_Template(rf, ctx) { if (rf & 1) {
|
|
357
|
+
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2);
|
|
358
|
+
i0.ɵɵelement(3, "i", 3);
|
|
359
|
+
i0.ɵɵelementEnd();
|
|
360
|
+
i0.ɵɵelementStart(4, "div")(5, "h3", 4);
|
|
361
|
+
i0.ɵɵtext(6, "Lazy Loading");
|
|
362
|
+
i0.ɵɵelementEnd();
|
|
363
|
+
i0.ɵɵelementStart(7, "div", 5);
|
|
364
|
+
i0.ɵɵtext(8, "Code-split chunks: registered, loaded, and on-demand");
|
|
365
|
+
i0.ɵɵelementEnd()();
|
|
366
|
+
i0.ɵɵelement(9, "span", 6);
|
|
367
|
+
i0.ɵɵelementStart(10, "div", 7)(11, "button", 8);
|
|
368
|
+
i0.ɵɵlistener("click", function LazyModuleStatusComponent_Template_button_click_11_listener() { return ctx.refresh(); });
|
|
369
|
+
i0.ɵɵelement(12, "i", 9);
|
|
370
|
+
i0.ɵɵtext(13, " Refresh ");
|
|
371
|
+
i0.ɵɵelementEnd()()();
|
|
372
|
+
i0.ɵɵconditionalCreate(14, LazyModuleStatusComponent_Conditional_14_Template, 6, 0, "div", 10)(15, LazyModuleStatusComponent_Conditional_15_Template, 47, 19);
|
|
373
|
+
i0.ɵɵelementEnd();
|
|
374
|
+
} if (rf & 2) {
|
|
375
|
+
i0.ɵɵadvance(14);
|
|
376
|
+
i0.ɵɵconditional(!ctx.Available ? 14 : 15);
|
|
377
|
+
} }, styles: ["[_nghost-%COMP%] { display: block; height: 100%; }\n\n.mj-inspector[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n background: var(--mj-bg-page);\n color: var(--mj-text-primary);\n font-family: inherit;\n}\n\n\n\n.mj-inspector__header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n}\n.mj-inspector__header-icon[_ngcontent-%COMP%] {\n width: 36px; height: 36px;\n border-radius: 9px;\n background: linear-gradient(135deg, #264FAF 0%, #0076b6 100%);\n color: white;\n display: flex; align-items: center; justify-content: center;\n font-size: 15px;\n flex-shrink: 0;\n}\n.mj-inspector__header-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n letter-spacing: -0.2px;\n}\n.mj-inspector__header-sub[_ngcontent-%COMP%] {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n.mj-inspector__header-spacer[_ngcontent-%COMP%] { flex: 1; }\n.mj-inspector__header-actions[_ngcontent-%COMP%] {\n display: flex; gap: 6px;\n}\n.mj-inspector__btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 7px 12px;\n border-radius: 7px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n font-family: inherit;\n transition: all 0.15s;\n}\n.mj-inspector__btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n.mj-inspector__btn--success[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n border-color: color-mix(in srgb, var(--mj-status-success) 30%, var(--mj-border-default));\n}\n\n\n\n.mj-inspector__body[_ngcontent-%COMP%] {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n.mj-inspector__sidebar[_ngcontent-%COMP%] {\n width: 220px;\n border-right: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n overflow-y: auto;\n flex-shrink: 0;\n padding: 8px;\n}\n.mj-inspector__nav-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 10px 12px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.12s;\n margin-bottom: 2px;\n font-family: inherit;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n text-align: left;\n width: 100%;\n}\n.mj-inspector__nav-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n.mj-inspector__nav-item--active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n.mj-inspector__nav-item--active[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n}\n.mj-inspector__nav-icon[_ngcontent-%COMP%] {\n width: 18px;\n text-align: center;\n font-size: 13px;\n margin-top: 1px;\n flex-shrink: 0;\n color: inherit;\n}\n.mj-inspector__nav-text[_ngcontent-%COMP%] { flex: 1; min-width: 0; }\n.mj-inspector__nav-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n line-height: 1.2;\n}\n.mj-inspector__nav-desc[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 3px;\n line-height: 1.3;\n}\n.mj-inspector__nav-item--active[_ngcontent-%COMP%] .mj-inspector__nav-desc[_ngcontent-%COMP%] {\n color: color-mix(in srgb, var(--mj-brand-primary) 70%, var(--mj-text-muted));\n}\n\n\n\n.mj-inspector__content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-page);\n}\n.mj-inspector__content-head[_ngcontent-%COMP%] {\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: var(--mj-bg-surface-card);\n}\n.mj-inspector__content-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.mj-inspector__content-meta[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.mj-inspector__editor[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.mj-inspector__editor[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n display: block;\n}\n\n\n\n.mj-inspector__empty[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n@media (max-width: 700px) {\n .mj-inspector__body[_ngcontent-%COMP%] { flex-direction: column; }\n .mj-inspector__sidebar[_ngcontent-%COMP%] {\n width: 100%;\n height: auto;\n max-height: 200px;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n }\n .mj-inspector__nav-item[_ngcontent-%COMP%] { flex: 1 1 calc(50% - 8px); margin-bottom: 0; }\n .mj-inspector__nav-desc[_ngcontent-%COMP%] { display: none; }\n .mj-inspector__header[_ngcontent-%COMP%] { padding: 12px 14px; gap: 10px; }\n}", ".mj-inspector--solo[_ngcontent-%COMP%] { background: var(--mj-bg-page); }\n\n\n\n.lz-unavailable[_ngcontent-%COMP%] {\n margin: 16px 20px;\n padding: 14px 18px;\n background: color-mix(in srgb, var(--mj-status-warning) 8%, var(--mj-bg-surface-card));\n border: 1px solid color-mix(in srgb, var(--mj-status-warning) 30%, var(--mj-border-subtle));\n border-radius: 10px;\n display: flex;\n align-items: flex-start;\n gap: 14px;\n color: var(--mj-text-secondary);\n font-size: 13px;\n line-height: 1.5;\n}\n.lz-unavailable[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n font-size: 18px;\n margin-top: 2px;\n}\n\n\n\n.lz-summary[_ngcontent-%COMP%] {\n padding: 18px 20px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-subtle);\n display: grid;\n grid-template-columns: 1fr auto;\n gap: 24px;\n align-items: center;\n}\n.lz-progress[_ngcontent-%COMP%] { min-width: 0; }\n.lz-progress-bar[_ngcontent-%COMP%] {\n height: 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 100px;\n overflow: hidden;\n margin-bottom: 8px;\n}\n.lz-progress-fill[_ngcontent-%COMP%] {\n height: 100%;\n background: linear-gradient(90deg, #264FAF 0%, #0076b6 100%);\n border-radius: 100px;\n transition: width 0.5s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.lz-progress-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: baseline;\n gap: 10px;\n}\n.lz-progress-pct[_ngcontent-%COMP%] {\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-brand-primary);\n letter-spacing: -0.5px;\n line-height: 1;\n}\n.lz-progress-label[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 12.5px;\n}\n\n.lz-summary-stats[_ngcontent-%COMP%] {\n display: flex;\n gap: 14px;\n}\n.lz-summary-stat[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 10px 14px;\n text-align: center;\n min-width: 88px;\n}\n.lz-summary-value[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 700;\n color: var(--mj-text-primary);\n letter-spacing: -0.4px;\n line-height: 1;\n}\n.lz-summary-label[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n font-weight: 600;\n letter-spacing: 0.5px;\n margin-top: 4px;\n}\n\n\n\n.lz-filter-bar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 10px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface);\n}\n.lz-filter[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border-radius: 100px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n transition: all 0.12s;\n}\n.lz-filter[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n.lz-filter--active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n.lz-filter-count[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 10.5px;\n padding: 1px 7px;\n border-radius: 100px;\n font-weight: 600;\n}\n.lz-filter--active[_ngcontent-%COMP%] .lz-filter-count[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 18%, transparent);\n color: var(--mj-brand-primary);\n}\n.lz-spacer[_ngcontent-%COMP%] { flex: 1; }\n.lz-refreshed[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n\n\n.lz-grid[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 16px 20px;\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(380px, 1fr));\n gap: 12px;\n align-content: start;\n}\n.lz-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 12px 14px;\n transition: border-color 0.15s, transform 0.15s, box-shadow 0.15s;\n}\n.lz-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-default);\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.04);\n}\n.lz-card--loaded[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 4%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-success) 25%, var(--mj-border-subtle));\n}\n\n.lz-card-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 10px;\n}\n.lz-card-status[_ngcontent-%COMP%] {\n width: 22px;\n height: 22px;\n color: var(--mj-text-muted);\n font-size: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n.lz-card-status--loaded[_ngcontent-%COMP%] { color: var(--mj-status-success); }\n\n.lz-card-title[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n.lz-card-title[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n display: block;\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 12.5px;\n font-weight: 600;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.lz-card-kcount[_ngcontent-%COMP%] {\n font-size: 10.5px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n font-weight: 600;\n}\n\n.lz-load-btn[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: white;\n border: 1px solid var(--mj-brand-primary);\n padding: 6px 12px;\n border-radius: 7px;\n font-size: 11.5px;\n font-weight: 600;\n cursor: pointer;\n font-family: inherit;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n transition: background 0.15s, transform 0.1s;\n flex-shrink: 0;\n}\n.lz-load-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 88%, black);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 88%, black);\n}\n.lz-load-btn[_ngcontent-%COMP%]:active:not(:disabled) { transform: scale(0.97); }\n.lz-load-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.7;\n cursor: wait;\n}\n\n.lz-card-keys[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n transition: max-height 0.3s ease-out;\n}\n.lz-card-keys--expanded[_ngcontent-%COMP%] {\n max-height: none;\n}\n.lz-key[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-secondary);\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 10.5px;\n padding: 2px 7px;\n border-radius: 5px;\n line-height: 1.5;\n}\n.lz-card--loaded[_ngcontent-%COMP%] .lz-key[_ngcontent-%COMP%] {\n border-color: color-mix(in srgb, var(--mj-status-success) 20%, var(--mj-border-subtle));\n}\n.lz-card-expand[_ngcontent-%COMP%] {\n margin-top: 8px;\n background: transparent;\n border: 1px dashed var(--mj-border-default);\n color: var(--mj-text-secondary);\n padding: 6px 10px;\n border-radius: 7px;\n font-size: 11.5px;\n font-weight: 500;\n cursor: pointer;\n font-family: inherit;\n width: 100%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n transition: all 0.15s;\n}\n.lz-card-expand[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, transparent);\n}\n.lz-card-expand[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 10px; }\n\n.lz-empty[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n text-align: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n padding: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n}\n\n@media (max-width: 700px) {\n .lz-summary[_ngcontent-%COMP%] { grid-template-columns: 1fr; }\n .lz-summary-stats[_ngcontent-%COMP%] { display: grid; grid-template-columns: repeat(3, 1fr); }\n .lz-grid[_ngcontent-%COMP%] { grid-template-columns: 1fr; padding: 12px 14px; }\n}"] });
|
|
378
|
+
};
|
|
379
|
+
LazyModuleStatusComponent = __decorate([
|
|
380
|
+
RegisterClass(BaseResourceComponent, 'LazyModuleStatusInspector')
|
|
381
|
+
], LazyModuleStatusComponent);
|
|
382
|
+
export { LazyModuleStatusComponent };
|
|
383
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LazyModuleStatusComponent, [{
|
|
384
|
+
type: Component,
|
|
385
|
+
args: [{ standalone: false, selector: 'mj-lazy-module-status', template: "<div class=\"mj-inspector mj-inspector--solo\">\n <div class=\"mj-inspector__header\">\n <div class=\"mj-inspector__header-icon\"><i class=\"fa-solid fa-puzzle-piece\"></i></div>\n <div>\n <h3 class=\"mj-inspector__header-title\">Lazy Loading</h3>\n <div class=\"mj-inspector__header-sub\">Code-split chunks: registered, loaded, and on-demand</div>\n </div>\n <span class=\"mj-inspector__header-spacer\"></span>\n <div class=\"mj-inspector__header-actions\">\n <button class=\"mj-inspector__btn\" type=\"button\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-rotate\"></i> Refresh\n </button>\n </div>\n </div>\n\n @if (!Available) {\n <div class=\"lz-unavailable\">\n <i class=\"fa-solid fa-circle-info\"></i>\n <div>\n <strong>Lazy registry not available.</strong>\n The shell hasn't published the LazyModuleRegistry to globalThis yet, or you're viewing this in an environment that doesn't use it.\n </div>\n </div>\n } @else {\n <div class=\"lz-summary\">\n <div class=\"lz-progress\">\n <div class=\"lz-progress-bar\">\n <div class=\"lz-progress-fill\" [style.width.%]=\"Stats.percent\"></div>\n </div>\n <div class=\"lz-progress-meta\">\n <span class=\"lz-progress-pct\">{{ Stats.percent }}%</span>\n <span class=\"lz-progress-label\">{{ Stats.loadedChunks }} of {{ Stats.chunkCount }} chunks loaded</span>\n </div>\n </div>\n <div class=\"lz-summary-stats\">\n <div class=\"lz-summary-stat\">\n <div class=\"lz-summary-value\">{{ Stats.totalKeys }}</div>\n <div class=\"lz-summary-label\">Registered keys</div>\n </div>\n <div class=\"lz-summary-stat\">\n <div class=\"lz-summary-value\">{{ Stats.loadedKeys }}</div>\n <div class=\"lz-summary-label\">Loaded keys</div>\n </div>\n <div class=\"lz-summary-stat\">\n <div class=\"lz-summary-value\">{{ Stats.chunkCount }}</div>\n <div class=\"lz-summary-label\">Total chunks</div>\n </div>\n </div>\n </div>\n\n <div class=\"lz-filter-bar\">\n <button type=\"button\"\n class=\"lz-filter\"\n [class.lz-filter--active]=\"Filter === 'all'\"\n (click)=\"OnFilterClick('all')\">\n All <span class=\"lz-filter-count\">{{ Stats.chunkCount }}</span>\n </button>\n <button type=\"button\"\n class=\"lz-filter\"\n [class.lz-filter--active]=\"Filter === 'loaded'\"\n (click)=\"OnFilterClick('loaded')\">\n <i class=\"fa-solid fa-check-circle\"></i> Loaded <span class=\"lz-filter-count\">{{ Stats.loadedChunks }}</span>\n </button>\n <button type=\"button\"\n class=\"lz-filter\"\n [class.lz-filter--active]=\"Filter === 'not-loaded'\"\n (click)=\"OnFilterClick('not-loaded')\">\n <i class=\"fa-regular fa-circle\"></i> Not loaded <span class=\"lz-filter-count\">{{ Stats.chunkCount - Stats.loadedChunks }}</span>\n </button>\n <span class=\"lz-spacer\"></span>\n <span class=\"lz-refreshed\">Refreshed {{ LastRefreshedLabel }}</span>\n </div>\n\n <div class=\"lz-grid\">\n @for (chunk of FilteredChunks; track TrackByChunk($index, chunk)) {\n <div class=\"lz-card\" [class.lz-card--loaded]=\"chunk.loaded\">\n <div class=\"lz-card-head\">\n <div class=\"lz-card-status\" [class.lz-card-status--loaded]=\"chunk.loaded\">\n @if (chunk.loaded) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <i class=\"fa-regular fa-circle\"></i>\n }\n </div>\n <div class=\"lz-card-title\">\n <code>{{ chunk.label }}</code>\n <span class=\"lz-card-kcount\">{{ chunk.keys.length }} entries</span>\n </div>\n @if (!chunk.loaded) {\n <button type=\"button\"\n class=\"lz-load-btn\"\n [disabled]=\"chunk.loading\"\n (click)=\"OnForceLoad(chunk)\"\n title=\"Force-load this chunk now\">\n @if (chunk.loading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading\n } @else {\n <i class=\"fa-solid fa-bolt\"></i> Load\n }\n </button>\n }\n </div>\n <div class=\"lz-card-keys\" [class.lz-card-keys--expanded]=\"chunk.expanded\">\n @for (k of VisibleKeys(chunk); track k) {\n <span class=\"lz-key\">{{ k }}</span>\n }\n </div>\n @if (HiddenCount(chunk) > 0 || chunk.expanded) {\n <button class=\"lz-card-expand\"\n type=\"button\"\n (click)=\"ToggleChunkExpand(chunk)\">\n @if (chunk.expanded) {\n <i class=\"fa-solid fa-chevron-up\"></i> Show less\n } @else {\n <i class=\"fa-solid fa-chevron-down\"></i> Show all {{ chunk.keys.length }} entries\n }\n </button>\n }\n </div>\n }\n @if (FilteredChunks.length === 0) {\n <div class=\"lz-empty\">\n <i class=\"fa-solid fa-circle-info\"></i>\n No chunks match the current filter.\n </div>\n }\n </div>\n }\n</div>\n", styles: [":host { display: block; height: 100%; }\n\n.mj-inspector {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n background: var(--mj-bg-page);\n color: var(--mj-text-primary);\n font-family: inherit;\n}\n\n/* Header */\n.mj-inspector__header {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n}\n.mj-inspector__header-icon {\n width: 36px; height: 36px;\n border-radius: 9px;\n background: linear-gradient(135deg, #264FAF 0%, #0076b6 100%);\n color: white;\n display: flex; align-items: center; justify-content: center;\n font-size: 15px;\n flex-shrink: 0;\n}\n.mj-inspector__header-title {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n letter-spacing: -0.2px;\n}\n.mj-inspector__header-sub {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n.mj-inspector__header-spacer { flex: 1; }\n.mj-inspector__header-actions {\n display: flex; gap: 6px;\n}\n.mj-inspector__btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 7px 12px;\n border-radius: 7px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n font-family: inherit;\n transition: all 0.15s;\n}\n.mj-inspector__btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n.mj-inspector__btn--success {\n color: var(--mj-status-success);\n border-color: color-mix(in srgb, var(--mj-status-success) 30%, var(--mj-border-default));\n}\n\n/* Layout: sidebar + content */\n.mj-inspector__body {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n.mj-inspector__sidebar {\n width: 220px;\n border-right: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n overflow-y: auto;\n flex-shrink: 0;\n padding: 8px;\n}\n.mj-inspector__nav-item {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 10px 12px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.12s;\n margin-bottom: 2px;\n font-family: inherit;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n text-align: left;\n width: 100%;\n}\n.mj-inspector__nav-item:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n.mj-inspector__nav-item--active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n.mj-inspector__nav-item--active:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n}\n.mj-inspector__nav-icon {\n width: 18px;\n text-align: center;\n font-size: 13px;\n margin-top: 1px;\n flex-shrink: 0;\n color: inherit;\n}\n.mj-inspector__nav-text { flex: 1; min-width: 0; }\n.mj-inspector__nav-label {\n font-size: 13px;\n font-weight: 500;\n line-height: 1.2;\n}\n.mj-inspector__nav-desc {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 3px;\n line-height: 1.3;\n}\n.mj-inspector__nav-item--active .mj-inspector__nav-desc {\n color: color-mix(in srgb, var(--mj-brand-primary) 70%, var(--mj-text-muted));\n}\n\n/* Content area */\n.mj-inspector__content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-page);\n}\n.mj-inspector__content-head {\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: var(--mj-bg-surface-card);\n}\n.mj-inspector__content-title {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.mj-inspector__content-meta {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.mj-inspector__editor {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.mj-inspector__editor mj-code-editor {\n flex: 1;\n min-height: 0;\n display: block;\n}\n\n/* Empty state */\n.mj-inspector__empty {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n@media (max-width: 700px) {\n .mj-inspector__body { flex-direction: column; }\n .mj-inspector__sidebar {\n width: 100%;\n height: auto;\n max-height: 200px;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n }\n .mj-inspector__nav-item { flex: 1 1 calc(50% - 8px); margin-bottom: 0; }\n .mj-inspector__nav-desc { display: none; }\n .mj-inspector__header { padding: 12px 14px; gap: 10px; }\n}\n", ".mj-inspector--solo { background: var(--mj-bg-page); }\n\n/* Unavailable */\n.lz-unavailable {\n margin: 16px 20px;\n padding: 14px 18px;\n background: color-mix(in srgb, var(--mj-status-warning) 8%, var(--mj-bg-surface-card));\n border: 1px solid color-mix(in srgb, var(--mj-status-warning) 30%, var(--mj-border-subtle));\n border-radius: 10px;\n display: flex;\n align-items: flex-start;\n gap: 14px;\n color: var(--mj-text-secondary);\n font-size: 13px;\n line-height: 1.5;\n}\n.lz-unavailable i {\n color: var(--mj-status-warning);\n font-size: 18px;\n margin-top: 2px;\n}\n\n/* Summary */\n.lz-summary {\n padding: 18px 20px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-subtle);\n display: grid;\n grid-template-columns: 1fr auto;\n gap: 24px;\n align-items: center;\n}\n.lz-progress { min-width: 0; }\n.lz-progress-bar {\n height: 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 100px;\n overflow: hidden;\n margin-bottom: 8px;\n}\n.lz-progress-fill {\n height: 100%;\n background: linear-gradient(90deg, #264FAF 0%, #0076b6 100%);\n border-radius: 100px;\n transition: width 0.5s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.lz-progress-meta {\n display: flex;\n align-items: baseline;\n gap: 10px;\n}\n.lz-progress-pct {\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-brand-primary);\n letter-spacing: -0.5px;\n line-height: 1;\n}\n.lz-progress-label {\n color: var(--mj-text-muted);\n font-size: 12.5px;\n}\n\n.lz-summary-stats {\n display: flex;\n gap: 14px;\n}\n.lz-summary-stat {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 10px 14px;\n text-align: center;\n min-width: 88px;\n}\n.lz-summary-value {\n font-size: 18px;\n font-weight: 700;\n color: var(--mj-text-primary);\n letter-spacing: -0.4px;\n line-height: 1;\n}\n.lz-summary-label {\n font-size: 10px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n font-weight: 600;\n letter-spacing: 0.5px;\n margin-top: 4px;\n}\n\n/* Filter bar */\n.lz-filter-bar {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 10px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface);\n}\n.lz-filter {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border-radius: 100px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n transition: all 0.12s;\n}\n.lz-filter:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n.lz-filter--active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n.lz-filter-count {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 10.5px;\n padding: 1px 7px;\n border-radius: 100px;\n font-weight: 600;\n}\n.lz-filter--active .lz-filter-count {\n background: color-mix(in srgb, var(--mj-brand-primary) 18%, transparent);\n color: var(--mj-brand-primary);\n}\n.lz-spacer { flex: 1; }\n.lz-refreshed {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n/* Grid */\n.lz-grid {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 16px 20px;\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(380px, 1fr));\n gap: 12px;\n align-content: start;\n}\n.lz-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 12px 14px;\n transition: border-color 0.15s, transform 0.15s, box-shadow 0.15s;\n}\n.lz-card:hover {\n border-color: var(--mj-border-default);\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.04);\n}\n.lz-card--loaded {\n background: color-mix(in srgb, var(--mj-status-success) 4%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-success) 25%, var(--mj-border-subtle));\n}\n\n.lz-card-head {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 10px;\n}\n.lz-card-status {\n width: 22px;\n height: 22px;\n color: var(--mj-text-muted);\n font-size: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n.lz-card-status--loaded { color: var(--mj-status-success); }\n\n.lz-card-title {\n flex: 1;\n min-width: 0;\n}\n.lz-card-title code {\n display: block;\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 12.5px;\n font-weight: 600;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.lz-card-kcount {\n font-size: 10.5px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n font-weight: 600;\n}\n\n.lz-load-btn {\n background: var(--mj-brand-primary);\n color: white;\n border: 1px solid var(--mj-brand-primary);\n padding: 6px 12px;\n border-radius: 7px;\n font-size: 11.5px;\n font-weight: 600;\n cursor: pointer;\n font-family: inherit;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n transition: background 0.15s, transform 0.1s;\n flex-shrink: 0;\n}\n.lz-load-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 88%, black);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 88%, black);\n}\n.lz-load-btn:active:not(:disabled) { transform: scale(0.97); }\n.lz-load-btn:disabled {\n opacity: 0.7;\n cursor: wait;\n}\n\n.lz-card-keys {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n transition: max-height 0.3s ease-out;\n}\n.lz-card-keys--expanded {\n max-height: none;\n}\n.lz-key {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-secondary);\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 10.5px;\n padding: 2px 7px;\n border-radius: 5px;\n line-height: 1.5;\n}\n.lz-card--loaded .lz-key {\n border-color: color-mix(in srgb, var(--mj-status-success) 20%, var(--mj-border-subtle));\n}\n.lz-card-expand {\n margin-top: 8px;\n background: transparent;\n border: 1px dashed var(--mj-border-default);\n color: var(--mj-text-secondary);\n padding: 6px 10px;\n border-radius: 7px;\n font-size: 11.5px;\n font-weight: 500;\n cursor: pointer;\n font-family: inherit;\n width: 100%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n transition: all 0.15s;\n}\n.lz-card-expand:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, transparent);\n}\n.lz-card-expand i { font-size: 10px; }\n\n.lz-empty {\n grid-column: 1 / -1;\n text-align: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n padding: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n}\n\n@media (max-width: 700px) {\n .lz-summary { grid-template-columns: 1fr; }\n .lz-summary-stats { display: grid; grid-template-columns: repeat(3, 1fr); }\n .lz-grid { grid-template-columns: 1fr; padding: 12px 14px; }\n}\n"] }]
|
|
386
|
+
}], () => [{ type: i0.ChangeDetectorRef }], null); })();
|
|
387
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(LazyModuleStatusComponent, { className: "LazyModuleStatusComponent", filePath: "src/DevTools/lazy-module-status.component.ts", lineNumber: 47 }); })();
|
|
388
|
+
//# sourceMappingURL=lazy-module-status.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy-module-status.component.js","sourceRoot":"","sources":["../../src/DevTools/lazy-module-status.component.ts","../../src/DevTools/lazy-module-status.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { DevToolsPrefs } from './dev-tools-prefs';\n\ninterface LazyChunk {\n /** A friendly label inferred from the underlying loader source. */\n label: string;\n /** The loader function's source-string (used as the unique chunk id internally). */\n chunkId: string;\n loaded: boolean;\n keys: string[];\n /** True when the user clicks \"Force Load\" — used to disable the button + show spinner. */\n loading?: boolean;\n /** UI state — false initially, user can expand to see all keys. */\n expanded: boolean;\n}\n\n/** How many entry pills to show in the collapsed card before \"Show all\". */\nconst COLLAPSED_KEY_LIMIT = 8;\n\ninterface LazyRegistryShape {\n GetSnapshot(): {\n registered: string[];\n loaded: string[];\n chunks: Array<{ chunkId: string; loaded: boolean; keys: string[] }>;\n chunkCount: number;\n };\n ForceLoad(compoundKey: string): Promise<boolean>;\n}\n\n/**\n * Lazy Module Status — visualizes the Explorer's lazy-loading registry.\n * Shows each chunk, its status (loaded vs not), the registrations it\n * brings in, and offers a \"Force Load\" button to preload on demand.\n *\n * Reads from the global `__mj_lazy_registry__` published by `LazyModuleRegistry`\n * — no hard package dep on explorer-core.\n */\n@RegisterClass(BaseResourceComponent, 'LazyModuleStatusInspector')\n@Component({\n standalone: false,\n selector: 'mj-lazy-module-status',\n templateUrl: './lazy-module-status.component.html',\n styleUrls: ['./inspector-shared.css', './lazy-module-status.component.css']\n})\nexport class LazyModuleStatusComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n\n public Stats = { totalKeys: 0, loadedKeys: 0, chunkCount: 0, loadedChunks: 0, percent: 0 };\n public Chunks: LazyChunk[] = [];\n public Available = false;\n public Filter: 'all' | 'loaded' | 'not-loaded' = 'all';\n public LastRefreshed = new Date();\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n public ngOnInit(): void {\n const prefs = DevToolsPrefs.Get<{ filter?: 'all' | 'loaded' | 'not-loaded'; expanded?: string[] }>('lazyModule');\n if (prefs?.filter) this.Filter = prefs.filter;\n this.refresh();\n if (prefs?.expanded) {\n for (const c of this.Chunks) c.expanded = prefs.expanded.includes(c.chunkId);\n }\n this.NotifyLoadComplete();\n }\n\n public override ngOnDestroy(): void {\n this.savePrefs();\n super.ngOnDestroy();\n }\n\n private savePrefs(): void {\n DevToolsPrefs.Save('lazyModule', {\n filter: this.Filter,\n expanded: this.Chunks.filter(c => c.expanded).map(c => c.chunkId)\n });\n }\n\n public override async GetResourceDisplayName(): Promise<string> { return 'Lazy Loading'; }\n public override async GetResourceIconClass(): Promise<string> { return 'fa-solid fa-puzzle-piece'; }\n\n public refresh(): void {\n const reg = (globalThis as { __mj_lazy_registry__?: LazyRegistryShape }).__mj_lazy_registry__;\n if (!reg || typeof reg.GetSnapshot !== 'function') {\n this.Available = false;\n this.cdr.markForCheck();\n return;\n }\n this.Available = true;\n const snap = reg.GetSnapshot();\n // Preserve expansion state across refreshes\n const prevExpansion = new Map(this.Chunks.map(c => [c.chunkId, c.expanded] as const));\n this.Chunks = snap.chunks.map(c => ({\n label: this.deriveChunkLabel(c.chunkId, c.keys),\n chunkId: c.chunkId,\n loaded: c.loaded,\n keys: c.keys,\n expanded: prevExpansion.get(c.chunkId) ?? false\n })).sort((a, b) => {\n if (a.loaded !== b.loaded) return a.loaded ? -1 : 1; // loaded first\n return a.label.localeCompare(b.label);\n });\n\n const loadedChunks = this.Chunks.filter(c => c.loaded).length;\n this.Stats = {\n totalKeys: snap.registered.length,\n loadedKeys: snap.loaded.length,\n chunkCount: snap.chunks.length,\n loadedChunks,\n percent: snap.chunks.length === 0 ? 0 : Math.round((loadedChunks / snap.chunks.length) * 100)\n };\n this.LastRefreshed = new Date();\n this.cdr.markForCheck();\n }\n\n public OnFilterClick(filter: 'all' | 'loaded' | 'not-loaded'): void {\n this.Filter = filter;\n this.savePrefs();\n }\n\n public get FilteredChunks(): LazyChunk[] {\n switch (this.Filter) {\n case 'loaded': return this.Chunks.filter(c => c.loaded);\n case 'not-loaded': return this.Chunks.filter(c => !c.loaded);\n default: return this.Chunks;\n }\n }\n\n public async OnForceLoad(chunk: LazyChunk): Promise<void> {\n if (chunk.loaded || chunk.loading) return;\n const reg = (globalThis as { __mj_lazy_registry__?: LazyRegistryShape }).__mj_lazy_registry__;\n if (!reg || chunk.keys.length === 0) return;\n\n chunk.loading = true;\n this.cdr.markForCheck();\n try {\n await reg.ForceLoad(chunk.keys[0]); // any key in the chunk loads the same chunk\n // Re-read snapshot to get authoritative state\n this.refresh();\n } catch {\n chunk.loading = false;\n this.cdr.markForCheck();\n }\n }\n\n public get LastRefreshedLabel(): string {\n return this.LastRefreshed.toLocaleTimeString();\n }\n\n public TrackByChunk = (_i: number, c: LazyChunk) => c.chunkId;\n public readonly CollapsedKeyLimit = COLLAPSED_KEY_LIMIT;\n\n public ToggleChunkExpand(chunk: LazyChunk): void {\n chunk.expanded = !chunk.expanded;\n this.savePrefs();\n }\n\n public VisibleKeys(chunk: LazyChunk): string[] {\n return chunk.expanded ? chunk.keys : chunk.keys.slice(0, COLLAPSED_KEY_LIMIT);\n }\n\n public HiddenCount(chunk: LazyChunk): number {\n return Math.max(0, chunk.keys.length - COLLAPSED_KEY_LIMIT);\n }\n\n /**\n * Derive a friendly chunk label from the loader function's source. The\n * generated `LAZY_FEATURE_CONFIG` builds loaders that look like:\n * () => importFn().then(() => {})\n * where importFn is `() => import('@memberjunction/ng-dashboards/foo.module')`\n * So the chunk id (loader.toString()) usually contains the dynamic import path.\n */\n private deriveChunkLabel(chunkId: string, keys: string[]): string {\n const m = chunkId.match(/import\\([\"']([^\"']+)[\"']\\)/);\n if (m && m[1]) {\n // Strip the @memberjunction/ prefix for brevity\n return m[1].replace(/^@memberjunction\\//, '');\n }\n // Fallback: derive from a representative key\n if (keys.length > 0) {\n const first = keys[0];\n const parts = first.split('::');\n return parts.length === 2 ? parts[1] : first;\n }\n return '(unknown chunk)';\n }\n}\n","<div class=\"mj-inspector mj-inspector--solo\">\n <div class=\"mj-inspector__header\">\n <div class=\"mj-inspector__header-icon\"><i class=\"fa-solid fa-puzzle-piece\"></i></div>\n <div>\n <h3 class=\"mj-inspector__header-title\">Lazy Loading</h3>\n <div class=\"mj-inspector__header-sub\">Code-split chunks: registered, loaded, and on-demand</div>\n </div>\n <span class=\"mj-inspector__header-spacer\"></span>\n <div class=\"mj-inspector__header-actions\">\n <button class=\"mj-inspector__btn\" type=\"button\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-rotate\"></i> Refresh\n </button>\n </div>\n </div>\n\n @if (!Available) {\n <div class=\"lz-unavailable\">\n <i class=\"fa-solid fa-circle-info\"></i>\n <div>\n <strong>Lazy registry not available.</strong>\n The shell hasn't published the LazyModuleRegistry to globalThis yet, or you're viewing this in an environment that doesn't use it.\n </div>\n </div>\n } @else {\n <div class=\"lz-summary\">\n <div class=\"lz-progress\">\n <div class=\"lz-progress-bar\">\n <div class=\"lz-progress-fill\" [style.width.%]=\"Stats.percent\"></div>\n </div>\n <div class=\"lz-progress-meta\">\n <span class=\"lz-progress-pct\">{{ Stats.percent }}%</span>\n <span class=\"lz-progress-label\">{{ Stats.loadedChunks }} of {{ Stats.chunkCount }} chunks loaded</span>\n </div>\n </div>\n <div class=\"lz-summary-stats\">\n <div class=\"lz-summary-stat\">\n <div class=\"lz-summary-value\">{{ Stats.totalKeys }}</div>\n <div class=\"lz-summary-label\">Registered keys</div>\n </div>\n <div class=\"lz-summary-stat\">\n <div class=\"lz-summary-value\">{{ Stats.loadedKeys }}</div>\n <div class=\"lz-summary-label\">Loaded keys</div>\n </div>\n <div class=\"lz-summary-stat\">\n <div class=\"lz-summary-value\">{{ Stats.chunkCount }}</div>\n <div class=\"lz-summary-label\">Total chunks</div>\n </div>\n </div>\n </div>\n\n <div class=\"lz-filter-bar\">\n <button type=\"button\"\n class=\"lz-filter\"\n [class.lz-filter--active]=\"Filter === 'all'\"\n (click)=\"OnFilterClick('all')\">\n All <span class=\"lz-filter-count\">{{ Stats.chunkCount }}</span>\n </button>\n <button type=\"button\"\n class=\"lz-filter\"\n [class.lz-filter--active]=\"Filter === 'loaded'\"\n (click)=\"OnFilterClick('loaded')\">\n <i class=\"fa-solid fa-check-circle\"></i> Loaded <span class=\"lz-filter-count\">{{ Stats.loadedChunks }}</span>\n </button>\n <button type=\"button\"\n class=\"lz-filter\"\n [class.lz-filter--active]=\"Filter === 'not-loaded'\"\n (click)=\"OnFilterClick('not-loaded')\">\n <i class=\"fa-regular fa-circle\"></i> Not loaded <span class=\"lz-filter-count\">{{ Stats.chunkCount - Stats.loadedChunks }}</span>\n </button>\n <span class=\"lz-spacer\"></span>\n <span class=\"lz-refreshed\">Refreshed {{ LastRefreshedLabel }}</span>\n </div>\n\n <div class=\"lz-grid\">\n @for (chunk of FilteredChunks; track TrackByChunk($index, chunk)) {\n <div class=\"lz-card\" [class.lz-card--loaded]=\"chunk.loaded\">\n <div class=\"lz-card-head\">\n <div class=\"lz-card-status\" [class.lz-card-status--loaded]=\"chunk.loaded\">\n @if (chunk.loaded) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <i class=\"fa-regular fa-circle\"></i>\n }\n </div>\n <div class=\"lz-card-title\">\n <code>{{ chunk.label }}</code>\n <span class=\"lz-card-kcount\">{{ chunk.keys.length }} entries</span>\n </div>\n @if (!chunk.loaded) {\n <button type=\"button\"\n class=\"lz-load-btn\"\n [disabled]=\"chunk.loading\"\n (click)=\"OnForceLoad(chunk)\"\n title=\"Force-load this chunk now\">\n @if (chunk.loading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading\n } @else {\n <i class=\"fa-solid fa-bolt\"></i> Load\n }\n </button>\n }\n </div>\n <div class=\"lz-card-keys\" [class.lz-card-keys--expanded]=\"chunk.expanded\">\n @for (k of VisibleKeys(chunk); track k) {\n <span class=\"lz-key\">{{ k }}</span>\n }\n </div>\n @if (HiddenCount(chunk) > 0 || chunk.expanded) {\n <button class=\"lz-card-expand\"\n type=\"button\"\n (click)=\"ToggleChunkExpand(chunk)\">\n @if (chunk.expanded) {\n <i class=\"fa-solid fa-chevron-up\"></i> Show less\n } @else {\n <i class=\"fa-solid fa-chevron-down\"></i> Show all {{ chunk.keys.length }} entries\n }\n </button>\n }\n </div>\n }\n @if (FilteredChunks.length === 0) {\n <div class=\"lz-empty\">\n <i class=\"fa-solid fa-circle-info\"></i>\n No chunks match the current filter.\n </div>\n }\n </div>\n }\n</div>\n"]}
|