@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,156 @@
|
|
|
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 { BaseAdminContainerComponent } from './base-admin-container.component';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
const _forTrack0 = ($index, $item) => $item.id;
|
|
13
|
+
function AdminIdentityAccessComponent_For_12_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
14
|
+
i0.ɵɵelementStart(0, "div", 17);
|
|
15
|
+
i0.ɵɵtext(1);
|
|
16
|
+
i0.ɵɵelementEnd();
|
|
17
|
+
} if (rf & 2) {
|
|
18
|
+
const section_r2 = i0.ɵɵnextContext().$implicit;
|
|
19
|
+
i0.ɵɵadvance();
|
|
20
|
+
i0.ɵɵtextInterpolate(section_r2.description);
|
|
21
|
+
} }
|
|
22
|
+
function AdminIdentityAccessComponent_For_12_Template(rf, ctx) { if (rf & 1) {
|
|
23
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
24
|
+
i0.ɵɵelementStart(0, "button", 13);
|
|
25
|
+
i0.ɵɵlistener("click", function AdminIdentityAccessComponent_For_12_Template_button_click_0_listener() { const section_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.OnSectionClick(section_r2)); });
|
|
26
|
+
i0.ɵɵelement(1, "i", 14);
|
|
27
|
+
i0.ɵɵelementStart(2, "div", 15)(3, "div", 16);
|
|
28
|
+
i0.ɵɵtext(4);
|
|
29
|
+
i0.ɵɵelementEnd();
|
|
30
|
+
i0.ɵɵconditionalCreate(5, AdminIdentityAccessComponent_For_12_Conditional_5_Template, 2, 1, "div", 17);
|
|
31
|
+
i0.ɵɵelementEnd()();
|
|
32
|
+
} if (rf & 2) {
|
|
33
|
+
const section_r2 = ctx.$implicit;
|
|
34
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
35
|
+
i0.ɵɵclassProp("admin-container__nav-item--active", ctx_r2.ActiveSection === section_r2.id);
|
|
36
|
+
i0.ɵɵadvance();
|
|
37
|
+
i0.ɵɵclassMap(section_r2.icon);
|
|
38
|
+
i0.ɵɵadvance(3);
|
|
39
|
+
i0.ɵɵtextInterpolate(section_r2.label);
|
|
40
|
+
i0.ɵɵadvance();
|
|
41
|
+
i0.ɵɵconditional(section_r2.description ? 5 : -1);
|
|
42
|
+
} }
|
|
43
|
+
function AdminIdentityAccessComponent_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
44
|
+
i0.ɵɵelementStart(0, "div", 10);
|
|
45
|
+
i0.ɵɵelement(1, "i", 18);
|
|
46
|
+
i0.ɵɵelementStart(2, "span");
|
|
47
|
+
i0.ɵɵtext(3);
|
|
48
|
+
i0.ɵɵelementEnd()();
|
|
49
|
+
} if (rf & 2) {
|
|
50
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
51
|
+
i0.ɵɵadvance(3);
|
|
52
|
+
i0.ɵɵtextInterpolate(ctx_r2.LoadError);
|
|
53
|
+
} }
|
|
54
|
+
function AdminIdentityAccessComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
55
|
+
i0.ɵɵelementStart(0, "div", 11);
|
|
56
|
+
i0.ɵɵelement(1, "i", 19);
|
|
57
|
+
i0.ɵɵelementStart(2, "span");
|
|
58
|
+
i0.ɵɵtext(3, "Loading\u2026");
|
|
59
|
+
i0.ɵɵelementEnd()();
|
|
60
|
+
} }
|
|
61
|
+
/**
|
|
62
|
+
* Admin → Identity & Access. Users, roles, app-role assignments,
|
|
63
|
+
* entity permissions, and API keys.
|
|
64
|
+
*/
|
|
65
|
+
let AdminIdentityAccessComponent = class AdminIdentityAccessComponent extends BaseAdminContainerComponent {
|
|
66
|
+
ContainerTitle = 'Identity & Access';
|
|
67
|
+
ContainerIcon = 'fa-solid fa-shield-halved';
|
|
68
|
+
ContainerSubtitle = 'Users, roles, permissions, and API keys';
|
|
69
|
+
Sections = [
|
|
70
|
+
{
|
|
71
|
+
id: 'users',
|
|
72
|
+
label: 'Users',
|
|
73
|
+
icon: 'fa-solid fa-users',
|
|
74
|
+
description: 'Manage user accounts',
|
|
75
|
+
source: { kind: 'dashboard', dashboardName: 'User Management' }
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
id: 'roles',
|
|
79
|
+
label: 'Roles',
|
|
80
|
+
icon: 'fa-solid fa-user-shield',
|
|
81
|
+
description: 'Define roles and assignments',
|
|
82
|
+
source: { kind: 'dashboard', dashboardName: 'Role Management' }
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
id: 'apps',
|
|
86
|
+
label: 'Apps',
|
|
87
|
+
icon: 'fa-solid fa-th-large',
|
|
88
|
+
description: 'Application configuration',
|
|
89
|
+
source: { kind: 'dashboard', dashboardName: 'Application Management' }
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
id: 'app-roles',
|
|
93
|
+
label: 'App Roles',
|
|
94
|
+
icon: 'fa-solid fa-people-roof',
|
|
95
|
+
description: 'Role assignments per application',
|
|
96
|
+
source: { kind: 'resource', driverClass: 'ApplicationRolesResource' }
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
id: 'permissions',
|
|
100
|
+
label: 'Permissions',
|
|
101
|
+
icon: 'fa-solid fa-lock',
|
|
102
|
+
description: 'Entity-level access and audit',
|
|
103
|
+
source: { kind: 'dashboard', dashboardName: 'Entity Permissions' }
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
id: 'api-keys',
|
|
107
|
+
label: 'API Keys',
|
|
108
|
+
icon: 'fa-solid fa-key',
|
|
109
|
+
description: 'API authentication and scopes',
|
|
110
|
+
source: { kind: 'resource', driverClass: 'APIKeysResource' }
|
|
111
|
+
}
|
|
112
|
+
];
|
|
113
|
+
static ɵfac = /*@__PURE__*/ (() => { let ɵAdminIdentityAccessComponent_BaseFactory; return function AdminIdentityAccessComponent_Factory(__ngFactoryType__) { return (ɵAdminIdentityAccessComponent_BaseFactory || (ɵAdminIdentityAccessComponent_BaseFactory = i0.ɵɵgetInheritedFactory(AdminIdentityAccessComponent)))(__ngFactoryType__ || AdminIdentityAccessComponent); }; })();
|
|
114
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AdminIdentityAccessComponent, selectors: [["mj-admin-identity-access"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 19, vars: 7, consts: [["contentHost", ""], [1, "admin-container"], [1, "admin-container__header"], [1, "admin-container__header-icon"], [1, "admin-container__header-title"], [1, "admin-container__header-sub"], [1, "admin-container__body"], [1, "admin-container__nav"], ["type", "button", 1, "admin-container__nav-item", 3, "admin-container__nav-item--active"], [1, "admin-container__content"], [1, "admin-container__error"], [1, "admin-container__loading"], [1, "admin-container__host"], ["type", "button", 1, "admin-container__nav-item", 3, "click"], [1, "admin-container__nav-icon"], [1, "admin-container__nav-text"], [1, "admin-container__nav-label"], [1, "admin-container__nav-desc"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "fa-solid", "fa-spinner", "fa-spin"]], template: function AdminIdentityAccessComponent_Template(rf, ctx) { if (rf & 1) {
|
|
115
|
+
i0.ɵɵelementStart(0, "div", 1)(1, "header", 2)(2, "div", 3);
|
|
116
|
+
i0.ɵɵelement(3, "i");
|
|
117
|
+
i0.ɵɵelementEnd();
|
|
118
|
+
i0.ɵɵelementStart(4, "div")(5, "h3", 4);
|
|
119
|
+
i0.ɵɵtext(6);
|
|
120
|
+
i0.ɵɵelementEnd();
|
|
121
|
+
i0.ɵɵelementStart(7, "div", 5);
|
|
122
|
+
i0.ɵɵtext(8);
|
|
123
|
+
i0.ɵɵelementEnd()()();
|
|
124
|
+
i0.ɵɵelementStart(9, "div", 6)(10, "aside", 7);
|
|
125
|
+
i0.ɵɵrepeaterCreate(11, AdminIdentityAccessComponent_For_12_Template, 6, 6, "button", 8, _forTrack0);
|
|
126
|
+
i0.ɵɵelementEnd();
|
|
127
|
+
i0.ɵɵelementStart(13, "main", 9);
|
|
128
|
+
i0.ɵɵconditionalCreate(14, AdminIdentityAccessComponent_Conditional_14_Template, 4, 1, "div", 10)(15, AdminIdentityAccessComponent_Conditional_15_Template, 4, 0, "div", 11);
|
|
129
|
+
i0.ɵɵelementStart(16, "div", 12);
|
|
130
|
+
i0.ɵɵelementContainer(17, null, 0);
|
|
131
|
+
i0.ɵɵelementEnd()()()();
|
|
132
|
+
} if (rf & 2) {
|
|
133
|
+
i0.ɵɵadvance(3);
|
|
134
|
+
i0.ɵɵclassMap(ctx.ContainerIcon);
|
|
135
|
+
i0.ɵɵadvance(3);
|
|
136
|
+
i0.ɵɵtextInterpolate(ctx.ContainerTitle);
|
|
137
|
+
i0.ɵɵadvance(2);
|
|
138
|
+
i0.ɵɵtextInterpolate(ctx.ContainerSubtitle);
|
|
139
|
+
i0.ɵɵadvance(3);
|
|
140
|
+
i0.ɵɵrepeater(ctx.Sections);
|
|
141
|
+
i0.ɵɵadvance(3);
|
|
142
|
+
i0.ɵɵconditional(ctx.LoadError ? 14 : ctx.IsLoading ? 15 : -1);
|
|
143
|
+
i0.ɵɵadvance(2);
|
|
144
|
+
i0.ɵɵclassProp("admin-container__host--hidden", ctx.LoadError || ctx.IsLoading);
|
|
145
|
+
} }, styles: ["[_nghost-%COMP%] { display: block; height: 100%; }\n\n.admin-container[_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.admin-container__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.admin-container__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.admin-container__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.admin-container__header-sub[_ngcontent-%COMP%] {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n\n\n.admin-container__body[_ngcontent-%COMP%] {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n.admin-container__nav[_ngcontent-%COMP%] {\n width: 240px;\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.admin-container__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.admin-container__nav-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n.admin-container__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.admin-container__nav-item--active[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n}\n.admin-container__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.admin-container__nav-text[_ngcontent-%COMP%] { flex: 1; min-width: 0; }\n.admin-container__nav-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n line-height: 1.2;\n}\n.admin-container__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.admin-container__nav-item--active[_ngcontent-%COMP%] .admin-container__nav-desc[_ngcontent-%COMP%] {\n color: color-mix(in srgb, var(--mj-brand-primary) 70%, var(--mj-text-muted));\n}\n\n\n\n.admin-container__content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-page);\n overflow: hidden;\n}\n\n\n\n.admin-container__host[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.admin-container__host--hidden[_ngcontent-%COMP%] { display: none; }\n.admin-container__host[_ngcontent-%COMP%] > *[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n display: block;\n}\n\n\n\n.admin-container__empty[_ngcontent-%COMP%], \n.admin-container__error[_ngcontent-%COMP%], \n.admin-container__loading[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n color: var(--mj-text-muted);\n font-size: 13px;\n padding: 32px;\n text-align: center;\n}\n.admin-container__error[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n.admin-container__error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 20px; }\n.admin-container__loading[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 16px; color: var(--mj-brand-primary); }\n\n@media (max-width: 700px) {\n .admin-container__body[_ngcontent-%COMP%] { flex-direction: column; }\n .admin-container__nav[_ngcontent-%COMP%] {\n width: 100%;\n height: auto;\n max-height: 220px;\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 .admin-container__nav-item[_ngcontent-%COMP%] { flex: 1 1 calc(50% - 8px); margin-bottom: 0; }\n .admin-container__nav-desc[_ngcontent-%COMP%] { display: none; }\n .admin-container__header[_ngcontent-%COMP%] { padding: 12px 14px; gap: 10px; }\n}"] });
|
|
146
|
+
};
|
|
147
|
+
AdminIdentityAccessComponent = __decorate([
|
|
148
|
+
RegisterClass(BaseResourceComponent, 'AdminIdentityAccess')
|
|
149
|
+
], AdminIdentityAccessComponent);
|
|
150
|
+
export { AdminIdentityAccessComponent };
|
|
151
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AdminIdentityAccessComponent, [{
|
|
152
|
+
type: Component,
|
|
153
|
+
args: [{ standalone: false, selector: 'mj-admin-identity-access', template: "<div class=\"admin-container\">\n <header class=\"admin-container__header\">\n <div class=\"admin-container__header-icon\"><i [class]=\"ContainerIcon\"></i></div>\n <div>\n <h3 class=\"admin-container__header-title\">{{ ContainerTitle }}</h3>\n <div class=\"admin-container__header-sub\">{{ ContainerSubtitle }}</div>\n </div>\n </header>\n\n <div class=\"admin-container__body\">\n <aside class=\"admin-container__nav\">\n @for (section of Sections; track section.id) {\n <button type=\"button\"\n class=\"admin-container__nav-item\"\n [class.admin-container__nav-item--active]=\"ActiveSection === section.id\"\n (click)=\"OnSectionClick(section)\">\n <i class=\"admin-container__nav-icon\" [class]=\"section.icon\"></i>\n <div class=\"admin-container__nav-text\">\n <div class=\"admin-container__nav-label\">{{ section.label }}</div>\n @if (section.description) {\n <div class=\"admin-container__nav-desc\">{{ section.description }}</div>\n }\n </div>\n </button>\n }\n </aside>\n\n <main class=\"admin-container__content\">\n @if (LoadError) {\n <div class=\"admin-container__error\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{ LoadError }}</span>\n </div>\n } @else if (IsLoading) {\n <div class=\"admin-container__loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading\u2026</span>\n </div>\n }\n <div class=\"admin-container__host\" [class.admin-container__host--hidden]=\"LoadError || IsLoading\">\n <ng-container #contentHost></ng-container>\n </div>\n </main>\n </div>\n</div>\n", styles: [":host { display: block; height: 100%; }\n\n.admin-container {\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.admin-container__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.admin-container__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.admin-container__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.admin-container__header-sub {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n/* Layout: sidebar + content */\n.admin-container__body {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n.admin-container__nav {\n width: 240px;\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.admin-container__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.admin-container__nav-item:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n.admin-container__nav-item--active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n.admin-container__nav-item--active:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n}\n.admin-container__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.admin-container__nav-text { flex: 1; min-width: 0; }\n.admin-container__nav-label {\n font-size: 13px;\n font-weight: 500;\n line-height: 1.2;\n}\n.admin-container__nav-desc {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 3px;\n line-height: 1.3;\n}\n.admin-container__nav-item--active .admin-container__nav-desc {\n color: color-mix(in srgb, var(--mj-brand-primary) 70%, var(--mj-text-muted));\n}\n\n/* Content area */\n.admin-container__content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-page);\n overflow: hidden;\n}\n\n/* Dynamic host */\n.admin-container__host {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.admin-container__host--hidden { display: none; }\n.admin-container__host > * {\n flex: 1;\n min-height: 0;\n display: block;\n}\n\n/* Empty + error + loading states */\n.admin-container__empty,\n.admin-container__error,\n.admin-container__loading {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n color: var(--mj-text-muted);\n font-size: 13px;\n padding: 32px;\n text-align: center;\n}\n.admin-container__error {\n color: var(--mj-status-error);\n}\n.admin-container__error i { font-size: 20px; }\n.admin-container__loading i { font-size: 16px; color: var(--mj-brand-primary); }\n\n@media (max-width: 700px) {\n .admin-container__body { flex-direction: column; }\n .admin-container__nav {\n width: 100%;\n height: auto;\n max-height: 220px;\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 .admin-container__nav-item { flex: 1 1 calc(50% - 8px); margin-bottom: 0; }\n .admin-container__nav-desc { display: none; }\n .admin-container__header { padding: 12px 14px; gap: 10px; }\n}\n"] }]
|
|
154
|
+
}], null, null); })();
|
|
155
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AdminIdentityAccessComponent, { className: "AdminIdentityAccessComponent", filePath: "src/Admin/admin-identity-access.component.ts", lineNumber: 17 }); })();
|
|
156
|
+
//# sourceMappingURL=admin-identity-access.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-identity-access.component.js","sourceRoot":"","sources":["../../src/Admin/admin-identity-access.component.ts","../../src/Admin/admin-container.component.html"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAgB,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;;;;ICiBjE,+BAAuC;IAAA,YAAyB;IAAA,iBAAM;;;IAA/B,cAAyB;IAAzB,4CAAyB;;;;IAR5E,kCAG0C;IAAlC,sNAAS,iCAAuB,KAAC;IACrC,wBAAgE;IAE5D,AADJ,+BAAuC,cACK;IAAA,YAAmB;IAAA,iBAAM;IACjE,sGAA2B;IAInC,AADI,iBAAM,EACD;;;;IATD,2FAAwE;IAEvC,cAAsB;IAAtB,8BAAsB;IAEf,eAAmB;IAAnB,sCAAmB;IAC3D,cAEC;IAFD,iDAEC;;;IAQT,+BAAoC;IAChC,wBAAgD;IAChD,4BAAM;IAAA,YAAe;IACzB,AADyB,iBAAO,EAC1B;;;IADI,eAAe;IAAf,sCAAe;;;IAGzB,+BAAsC;IAClC,wBAA2C;IAC3C,4BAAM;IAAA,6BAAQ;IAClB,AADkB,iBAAO,EACnB;;ADhCtB;;;GAGG;AAQI,IAAM,4BAA4B,GAAlC,MAAM,4BAA6B,SAAQ,2BAA2B;IACzD,cAAc,GAAG,mBAAmB,CAAC;IACrC,aAAa,GAAG,2BAA2B,CAAC;IAC5C,iBAAiB,GAAG,yCAAyC,CAAC;IAE9D,QAAQ,GAAmB;QACvC;YACI,EAAE,EAAE,OAAO;YACX,KAAK,EAAE,OAAO;YACd,IAAI,EAAE,mBAAmB;YACzB,WAAW,EAAE,sBAAsB;YACnC,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE;SAClE;QACD;YACI,EAAE,EAAE,OAAO;YACX,KAAK,EAAE,OAAO;YACd,IAAI,EAAE,yBAAyB;YAC/B,WAAW,EAAE,8BAA8B;YAC3C,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE;SAClE;QACD;YACI,EAAE,EAAE,MAAM;YACV,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,sBAAsB;YAC5B,WAAW,EAAE,2BAA2B;YACxC,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,wBAAwB,EAAE;SACzE;QACD;YACI,EAAE,EAAE,WAAW;YACf,KAAK,EAAE,WAAW;YAClB,IAAI,EAAE,yBAAyB;YAC/B,WAAW,EAAE,kCAAkC;YAC/C,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,0BAA0B,EAAE;SACxE;QACD;YACI,EAAE,EAAE,aAAa;YACjB,KAAK,EAAE,aAAa;YACpB,IAAI,EAAE,kBAAkB;YACxB,WAAW,EAAE,+BAA+B;YAC5C,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,oBAAoB,EAAE;SACrE;QACD;YACI,EAAE,EAAE,UAAU;YACd,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,iBAAiB;YACvB,WAAW,EAAE,+BAA+B;YAC5C,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE;SAC/D;KACJ,CAAC;6RAhDO,4BAA4B,yBAA5B,4BAA4B;6DAA5B,4BAA4B;YCdjC,AADJ,AADJ,8BAA6B,gBACe,aACM;YAAA,oBAA+B;YAAA,iBAAM;YAE3E,AADJ,2BAAK,YACyC;YAAA,YAAoB;YAAA,iBAAK;YACnE,8BAAyC;YAAA,YAAuB;YAExE,AADI,AADoE,iBAAM,EACpE,EACD;YAGL,AADJ,8BAAmC,gBACK;YAChC,oGAaC;YACL,iBAAQ;YAER,gCAAuC;YAMjC,AALF,iGAAiB,2EAKO;YAMxB,gCAAkG;YAC9F,kCAA0C;YAI1D,AADI,AADI,AADI,iBAAM,EACH,EACL,EACJ;;YA1C+C,eAAuB;YAAvB,gCAAuB;YAEtB,eAAoB;YAApB,wCAAoB;YACrB,eAAuB;YAAvB,2CAAuB;YAMhE,eAaC;YAbD,2BAaC;YAID,eAUC;YAVD,8DAUC;YACkC,eAA8D;YAA9D,+EAA8D;;;ADvBhG,4BAA4B;IAPxC,aAAa,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;GAO/C,4BAA4B,CAiDxC;;iFAjDY,4BAA4B;cANxC,SAAS;6BACM,KAAK,YACP,0BAA0B;;kFAI3B,4BAA4B","sourcesContent":["import { Component } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { AdminSection, BaseAdminContainerComponent } from './base-admin-container.component';\n\n/**\n * Admin → Identity & Access. Users, roles, app-role assignments,\n * entity permissions, and API keys.\n */\n@RegisterClass(BaseResourceComponent, 'AdminIdentityAccess')\n@Component({\n standalone: false,\n selector: 'mj-admin-identity-access',\n templateUrl: './admin-container.component.html',\n styleUrls: ['./admin-container.component.css']\n})\nexport class AdminIdentityAccessComponent extends BaseAdminContainerComponent {\n public readonly ContainerTitle = 'Identity & Access';\n public readonly ContainerIcon = 'fa-solid fa-shield-halved';\n public readonly ContainerSubtitle = 'Users, roles, permissions, and API keys';\n\n public readonly Sections: AdminSection[] = [\n {\n id: 'users',\n label: 'Users',\n icon: 'fa-solid fa-users',\n description: 'Manage user accounts',\n source: { kind: 'dashboard', dashboardName: 'User Management' }\n },\n {\n id: 'roles',\n label: 'Roles',\n icon: 'fa-solid fa-user-shield',\n description: 'Define roles and assignments',\n source: { kind: 'dashboard', dashboardName: 'Role Management' }\n },\n {\n id: 'apps',\n label: 'Apps',\n icon: 'fa-solid fa-th-large',\n description: 'Application configuration',\n source: { kind: 'dashboard', dashboardName: 'Application Management' }\n },\n {\n id: 'app-roles',\n label: 'App Roles',\n icon: 'fa-solid fa-people-roof',\n description: 'Role assignments per application',\n source: { kind: 'resource', driverClass: 'ApplicationRolesResource' }\n },\n {\n id: 'permissions',\n label: 'Permissions',\n icon: 'fa-solid fa-lock',\n description: 'Entity-level access and audit',\n source: { kind: 'dashboard', dashboardName: 'Entity Permissions' }\n },\n {\n id: 'api-keys',\n label: 'API Keys',\n icon: 'fa-solid fa-key',\n description: 'API authentication and scopes',\n source: { kind: 'resource', driverClass: 'APIKeysResource' }\n }\n ];\n}\n","<div class=\"admin-container\">\n <header class=\"admin-container__header\">\n <div class=\"admin-container__header-icon\"><i [class]=\"ContainerIcon\"></i></div>\n <div>\n <h3 class=\"admin-container__header-title\">{{ ContainerTitle }}</h3>\n <div class=\"admin-container__header-sub\">{{ ContainerSubtitle }}</div>\n </div>\n </header>\n\n <div class=\"admin-container__body\">\n <aside class=\"admin-container__nav\">\n @for (section of Sections; track section.id) {\n <button type=\"button\"\n class=\"admin-container__nav-item\"\n [class.admin-container__nav-item--active]=\"ActiveSection === section.id\"\n (click)=\"OnSectionClick(section)\">\n <i class=\"admin-container__nav-icon\" [class]=\"section.icon\"></i>\n <div class=\"admin-container__nav-text\">\n <div class=\"admin-container__nav-label\">{{ section.label }}</div>\n @if (section.description) {\n <div class=\"admin-container__nav-desc\">{{ section.description }}</div>\n }\n </div>\n </button>\n }\n </aside>\n\n <main class=\"admin-container__content\">\n @if (LoadError) {\n <div class=\"admin-container__error\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{ LoadError }}</span>\n </div>\n } @else if (IsLoading) {\n <div class=\"admin-container__loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading…</span>\n </div>\n }\n <div class=\"admin-container__host\" [class.admin-container__host--hidden]=\"LoadError || IsLoading\">\n <ng-container #contentHost></ng-container>\n </div>\n </main>\n </div>\n</div>\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AdminSection, BaseAdminContainerComponent } from './base-admin-container.component';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* Admin → Monitoring. System health, SQL execution logs, and outbound
|
|
5
|
+
* communication delivery monitoring.
|
|
6
|
+
*/
|
|
7
|
+
export declare class AdminMonitoringComponent extends BaseAdminContainerComponent {
|
|
8
|
+
readonly ContainerTitle = "Monitoring";
|
|
9
|
+
readonly ContainerIcon = "fa-solid fa-stethoscope";
|
|
10
|
+
readonly ContainerSubtitle = "System health and query execution logs";
|
|
11
|
+
readonly Sections: AdminSection[];
|
|
12
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<AdminMonitoringComponent, never>;
|
|
13
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<AdminMonitoringComponent, "mj-admin-monitoring", never, {}, {}, never, never, false, never>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=admin-monitoring.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-monitoring.component.d.ts","sourceRoot":"","sources":["../../src/Admin/admin-monitoring.component.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;;AAE7F;;;GAGG;AACH,qBAOa,wBAAyB,SAAQ,2BAA2B;IACrE,SAAgB,cAAc,gBAAgB;IAC9C,SAAgB,aAAa,6BAA6B;IAC1D,SAAgB,iBAAiB,4CAA4C;IAI7E,SAAgB,QAAQ,EAAE,YAAY,EAAE,CAetC;yCAtBO,wBAAwB;2CAAxB,wBAAwB;CAuBpC"}
|
|
@@ -0,0 +1,130 @@
|
|
|
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 { BaseAdminContainerComponent } from './base-admin-container.component';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
const _forTrack0 = ($index, $item) => $item.id;
|
|
13
|
+
function AdminMonitoringComponent_For_12_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
14
|
+
i0.ɵɵelementStart(0, "div", 17);
|
|
15
|
+
i0.ɵɵtext(1);
|
|
16
|
+
i0.ɵɵelementEnd();
|
|
17
|
+
} if (rf & 2) {
|
|
18
|
+
const section_r2 = i0.ɵɵnextContext().$implicit;
|
|
19
|
+
i0.ɵɵadvance();
|
|
20
|
+
i0.ɵɵtextInterpolate(section_r2.description);
|
|
21
|
+
} }
|
|
22
|
+
function AdminMonitoringComponent_For_12_Template(rf, ctx) { if (rf & 1) {
|
|
23
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
24
|
+
i0.ɵɵelementStart(0, "button", 13);
|
|
25
|
+
i0.ɵɵlistener("click", function AdminMonitoringComponent_For_12_Template_button_click_0_listener() { const section_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.OnSectionClick(section_r2)); });
|
|
26
|
+
i0.ɵɵelement(1, "i", 14);
|
|
27
|
+
i0.ɵɵelementStart(2, "div", 15)(3, "div", 16);
|
|
28
|
+
i0.ɵɵtext(4);
|
|
29
|
+
i0.ɵɵelementEnd();
|
|
30
|
+
i0.ɵɵconditionalCreate(5, AdminMonitoringComponent_For_12_Conditional_5_Template, 2, 1, "div", 17);
|
|
31
|
+
i0.ɵɵelementEnd()();
|
|
32
|
+
} if (rf & 2) {
|
|
33
|
+
const section_r2 = ctx.$implicit;
|
|
34
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
35
|
+
i0.ɵɵclassProp("admin-container__nav-item--active", ctx_r2.ActiveSection === section_r2.id);
|
|
36
|
+
i0.ɵɵadvance();
|
|
37
|
+
i0.ɵɵclassMap(section_r2.icon);
|
|
38
|
+
i0.ɵɵadvance(3);
|
|
39
|
+
i0.ɵɵtextInterpolate(section_r2.label);
|
|
40
|
+
i0.ɵɵadvance();
|
|
41
|
+
i0.ɵɵconditional(section_r2.description ? 5 : -1);
|
|
42
|
+
} }
|
|
43
|
+
function AdminMonitoringComponent_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
44
|
+
i0.ɵɵelementStart(0, "div", 10);
|
|
45
|
+
i0.ɵɵelement(1, "i", 18);
|
|
46
|
+
i0.ɵɵelementStart(2, "span");
|
|
47
|
+
i0.ɵɵtext(3);
|
|
48
|
+
i0.ɵɵelementEnd()();
|
|
49
|
+
} if (rf & 2) {
|
|
50
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
51
|
+
i0.ɵɵadvance(3);
|
|
52
|
+
i0.ɵɵtextInterpolate(ctx_r2.LoadError);
|
|
53
|
+
} }
|
|
54
|
+
function AdminMonitoringComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
55
|
+
i0.ɵɵelementStart(0, "div", 11);
|
|
56
|
+
i0.ɵɵelement(1, "i", 19);
|
|
57
|
+
i0.ɵɵelementStart(2, "span");
|
|
58
|
+
i0.ɵɵtext(3, "Loading\u2026");
|
|
59
|
+
i0.ɵɵelementEnd()();
|
|
60
|
+
} }
|
|
61
|
+
/**
|
|
62
|
+
* Admin → Monitoring. System health, SQL execution logs, and outbound
|
|
63
|
+
* communication delivery monitoring.
|
|
64
|
+
*/
|
|
65
|
+
let AdminMonitoringComponent = class AdminMonitoringComponent extends BaseAdminContainerComponent {
|
|
66
|
+
ContainerTitle = 'Monitoring';
|
|
67
|
+
ContainerIcon = 'fa-solid fa-stethoscope';
|
|
68
|
+
ContainerSubtitle = 'System health and query execution logs';
|
|
69
|
+
// Communication Monitor intentionally NOT included here — outbound delivery
|
|
70
|
+
// monitoring belongs in the Communications app, not in the Admin app.
|
|
71
|
+
Sections = [
|
|
72
|
+
{
|
|
73
|
+
id: 'diagnostics',
|
|
74
|
+
label: 'Diagnostics',
|
|
75
|
+
icon: 'fa-solid fa-stethoscope',
|
|
76
|
+
description: 'Runtime health and connectivity',
|
|
77
|
+
source: { kind: 'resource', driverClass: 'SystemDiagnosticsResource' }
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
id: 'sql-logging',
|
|
81
|
+
label: 'SQL Logging',
|
|
82
|
+
icon: 'fa-solid fa-file-code',
|
|
83
|
+
description: 'Captured SQL execution logs',
|
|
84
|
+
source: { kind: 'dashboard', dashboardName: 'SQL Logging' }
|
|
85
|
+
}
|
|
86
|
+
];
|
|
87
|
+
static ɵfac = /*@__PURE__*/ (() => { let ɵAdminMonitoringComponent_BaseFactory; return function AdminMonitoringComponent_Factory(__ngFactoryType__) { return (ɵAdminMonitoringComponent_BaseFactory || (ɵAdminMonitoringComponent_BaseFactory = i0.ɵɵgetInheritedFactory(AdminMonitoringComponent)))(__ngFactoryType__ || AdminMonitoringComponent); }; })();
|
|
88
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AdminMonitoringComponent, selectors: [["mj-admin-monitoring"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 19, vars: 7, consts: [["contentHost", ""], [1, "admin-container"], [1, "admin-container__header"], [1, "admin-container__header-icon"], [1, "admin-container__header-title"], [1, "admin-container__header-sub"], [1, "admin-container__body"], [1, "admin-container__nav"], ["type", "button", 1, "admin-container__nav-item", 3, "admin-container__nav-item--active"], [1, "admin-container__content"], [1, "admin-container__error"], [1, "admin-container__loading"], [1, "admin-container__host"], ["type", "button", 1, "admin-container__nav-item", 3, "click"], [1, "admin-container__nav-icon"], [1, "admin-container__nav-text"], [1, "admin-container__nav-label"], [1, "admin-container__nav-desc"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "fa-solid", "fa-spinner", "fa-spin"]], template: function AdminMonitoringComponent_Template(rf, ctx) { if (rf & 1) {
|
|
89
|
+
i0.ɵɵelementStart(0, "div", 1)(1, "header", 2)(2, "div", 3);
|
|
90
|
+
i0.ɵɵelement(3, "i");
|
|
91
|
+
i0.ɵɵelementEnd();
|
|
92
|
+
i0.ɵɵelementStart(4, "div")(5, "h3", 4);
|
|
93
|
+
i0.ɵɵtext(6);
|
|
94
|
+
i0.ɵɵelementEnd();
|
|
95
|
+
i0.ɵɵelementStart(7, "div", 5);
|
|
96
|
+
i0.ɵɵtext(8);
|
|
97
|
+
i0.ɵɵelementEnd()()();
|
|
98
|
+
i0.ɵɵelementStart(9, "div", 6)(10, "aside", 7);
|
|
99
|
+
i0.ɵɵrepeaterCreate(11, AdminMonitoringComponent_For_12_Template, 6, 6, "button", 8, _forTrack0);
|
|
100
|
+
i0.ɵɵelementEnd();
|
|
101
|
+
i0.ɵɵelementStart(13, "main", 9);
|
|
102
|
+
i0.ɵɵconditionalCreate(14, AdminMonitoringComponent_Conditional_14_Template, 4, 1, "div", 10)(15, AdminMonitoringComponent_Conditional_15_Template, 4, 0, "div", 11);
|
|
103
|
+
i0.ɵɵelementStart(16, "div", 12);
|
|
104
|
+
i0.ɵɵelementContainer(17, null, 0);
|
|
105
|
+
i0.ɵɵelementEnd()()()();
|
|
106
|
+
} if (rf & 2) {
|
|
107
|
+
i0.ɵɵadvance(3);
|
|
108
|
+
i0.ɵɵclassMap(ctx.ContainerIcon);
|
|
109
|
+
i0.ɵɵadvance(3);
|
|
110
|
+
i0.ɵɵtextInterpolate(ctx.ContainerTitle);
|
|
111
|
+
i0.ɵɵadvance(2);
|
|
112
|
+
i0.ɵɵtextInterpolate(ctx.ContainerSubtitle);
|
|
113
|
+
i0.ɵɵadvance(3);
|
|
114
|
+
i0.ɵɵrepeater(ctx.Sections);
|
|
115
|
+
i0.ɵɵadvance(3);
|
|
116
|
+
i0.ɵɵconditional(ctx.LoadError ? 14 : ctx.IsLoading ? 15 : -1);
|
|
117
|
+
i0.ɵɵadvance(2);
|
|
118
|
+
i0.ɵɵclassProp("admin-container__host--hidden", ctx.LoadError || ctx.IsLoading);
|
|
119
|
+
} }, styles: ["[_nghost-%COMP%] { display: block; height: 100%; }\n\n.admin-container[_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.admin-container__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.admin-container__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.admin-container__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.admin-container__header-sub[_ngcontent-%COMP%] {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n\n\n.admin-container__body[_ngcontent-%COMP%] {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n.admin-container__nav[_ngcontent-%COMP%] {\n width: 240px;\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.admin-container__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.admin-container__nav-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n.admin-container__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.admin-container__nav-item--active[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n}\n.admin-container__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.admin-container__nav-text[_ngcontent-%COMP%] { flex: 1; min-width: 0; }\n.admin-container__nav-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n line-height: 1.2;\n}\n.admin-container__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.admin-container__nav-item--active[_ngcontent-%COMP%] .admin-container__nav-desc[_ngcontent-%COMP%] {\n color: color-mix(in srgb, var(--mj-brand-primary) 70%, var(--mj-text-muted));\n}\n\n\n\n.admin-container__content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-page);\n overflow: hidden;\n}\n\n\n\n.admin-container__host[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.admin-container__host--hidden[_ngcontent-%COMP%] { display: none; }\n.admin-container__host[_ngcontent-%COMP%] > *[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n display: block;\n}\n\n\n\n.admin-container__empty[_ngcontent-%COMP%], \n.admin-container__error[_ngcontent-%COMP%], \n.admin-container__loading[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n color: var(--mj-text-muted);\n font-size: 13px;\n padding: 32px;\n text-align: center;\n}\n.admin-container__error[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n.admin-container__error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 20px; }\n.admin-container__loading[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 16px; color: var(--mj-brand-primary); }\n\n@media (max-width: 700px) {\n .admin-container__body[_ngcontent-%COMP%] { flex-direction: column; }\n .admin-container__nav[_ngcontent-%COMP%] {\n width: 100%;\n height: auto;\n max-height: 220px;\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 .admin-container__nav-item[_ngcontent-%COMP%] { flex: 1 1 calc(50% - 8px); margin-bottom: 0; }\n .admin-container__nav-desc[_ngcontent-%COMP%] { display: none; }\n .admin-container__header[_ngcontent-%COMP%] { padding: 12px 14px; gap: 10px; }\n}"] });
|
|
120
|
+
};
|
|
121
|
+
AdminMonitoringComponent = __decorate([
|
|
122
|
+
RegisterClass(BaseResourceComponent, 'AdminMonitoring')
|
|
123
|
+
], AdminMonitoringComponent);
|
|
124
|
+
export { AdminMonitoringComponent };
|
|
125
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AdminMonitoringComponent, [{
|
|
126
|
+
type: Component,
|
|
127
|
+
args: [{ standalone: false, selector: 'mj-admin-monitoring', template: "<div class=\"admin-container\">\n <header class=\"admin-container__header\">\n <div class=\"admin-container__header-icon\"><i [class]=\"ContainerIcon\"></i></div>\n <div>\n <h3 class=\"admin-container__header-title\">{{ ContainerTitle }}</h3>\n <div class=\"admin-container__header-sub\">{{ ContainerSubtitle }}</div>\n </div>\n </header>\n\n <div class=\"admin-container__body\">\n <aside class=\"admin-container__nav\">\n @for (section of Sections; track section.id) {\n <button type=\"button\"\n class=\"admin-container__nav-item\"\n [class.admin-container__nav-item--active]=\"ActiveSection === section.id\"\n (click)=\"OnSectionClick(section)\">\n <i class=\"admin-container__nav-icon\" [class]=\"section.icon\"></i>\n <div class=\"admin-container__nav-text\">\n <div class=\"admin-container__nav-label\">{{ section.label }}</div>\n @if (section.description) {\n <div class=\"admin-container__nav-desc\">{{ section.description }}</div>\n }\n </div>\n </button>\n }\n </aside>\n\n <main class=\"admin-container__content\">\n @if (LoadError) {\n <div class=\"admin-container__error\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{ LoadError }}</span>\n </div>\n } @else if (IsLoading) {\n <div class=\"admin-container__loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading\u2026</span>\n </div>\n }\n <div class=\"admin-container__host\" [class.admin-container__host--hidden]=\"LoadError || IsLoading\">\n <ng-container #contentHost></ng-container>\n </div>\n </main>\n </div>\n</div>\n", styles: [":host { display: block; height: 100%; }\n\n.admin-container {\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.admin-container__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.admin-container__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.admin-container__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.admin-container__header-sub {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n\n/* Layout: sidebar + content */\n.admin-container__body {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n.admin-container__nav {\n width: 240px;\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.admin-container__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.admin-container__nav-item:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n.admin-container__nav-item--active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n.admin-container__nav-item--active:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n}\n.admin-container__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.admin-container__nav-text { flex: 1; min-width: 0; }\n.admin-container__nav-label {\n font-size: 13px;\n font-weight: 500;\n line-height: 1.2;\n}\n.admin-container__nav-desc {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 3px;\n line-height: 1.3;\n}\n.admin-container__nav-item--active .admin-container__nav-desc {\n color: color-mix(in srgb, var(--mj-brand-primary) 70%, var(--mj-text-muted));\n}\n\n/* Content area */\n.admin-container__content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-page);\n overflow: hidden;\n}\n\n/* Dynamic host */\n.admin-container__host {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.admin-container__host--hidden { display: none; }\n.admin-container__host > * {\n flex: 1;\n min-height: 0;\n display: block;\n}\n\n/* Empty + error + loading states */\n.admin-container__empty,\n.admin-container__error,\n.admin-container__loading {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n color: var(--mj-text-muted);\n font-size: 13px;\n padding: 32px;\n text-align: center;\n}\n.admin-container__error {\n color: var(--mj-status-error);\n}\n.admin-container__error i { font-size: 20px; }\n.admin-container__loading i { font-size: 16px; color: var(--mj-brand-primary); }\n\n@media (max-width: 700px) {\n .admin-container__body { flex-direction: column; }\n .admin-container__nav {\n width: 100%;\n height: auto;\n max-height: 220px;\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 .admin-container__nav-item { flex: 1 1 calc(50% - 8px); margin-bottom: 0; }\n .admin-container__nav-desc { display: none; }\n .admin-container__header { padding: 12px 14px; gap: 10px; }\n}\n"] }]
|
|
128
|
+
}], null, null); })();
|
|
129
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AdminMonitoringComponent, { className: "AdminMonitoringComponent", filePath: "src/Admin/admin-monitoring.component.ts", lineNumber: 17 }); })();
|
|
130
|
+
//# sourceMappingURL=admin-monitoring.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-monitoring.component.js","sourceRoot":"","sources":["../../src/Admin/admin-monitoring.component.ts","../../src/Admin/admin-container.component.html"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAgB,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;;;;ICiBjE,+BAAuC;IAAA,YAAyB;IAAA,iBAAM;;;IAA/B,cAAyB;IAAzB,4CAAyB;;;;IAR5E,kCAG0C;IAAlC,kNAAS,iCAAuB,KAAC;IACrC,wBAAgE;IAE5D,AADJ,+BAAuC,cACK;IAAA,YAAmB;IAAA,iBAAM;IACjE,kGAA2B;IAInC,AADI,iBAAM,EACD;;;;IATD,2FAAwE;IAEvC,cAAsB;IAAtB,8BAAsB;IAEf,eAAmB;IAAnB,sCAAmB;IAC3D,cAEC;IAFD,iDAEC;;;IAQT,+BAAoC;IAChC,wBAAgD;IAChD,4BAAM;IAAA,YAAe;IACzB,AADyB,iBAAO,EAC1B;;;IADI,eAAe;IAAf,sCAAe;;;IAGzB,+BAAsC;IAClC,wBAA2C;IAC3C,4BAAM;IAAA,6BAAQ;IAClB,AADkB,iBAAO,EACnB;;ADhCtB;;;GAGG;AAQI,IAAM,wBAAwB,GAA9B,MAAM,wBAAyB,SAAQ,2BAA2B;IACrD,cAAc,GAAG,YAAY,CAAC;IAC9B,aAAa,GAAG,yBAAyB,CAAC;IAC1C,iBAAiB,GAAG,wCAAwC,CAAC;IAE7E,4EAA4E;IAC5E,sEAAsE;IACtD,QAAQ,GAAmB;QACvC;YACI,EAAE,EAAE,aAAa;YACjB,KAAK,EAAE,aAAa;YACpB,IAAI,EAAE,yBAAyB;YAC/B,WAAW,EAAE,iCAAiC;YAC9C,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,2BAA2B,EAAE;SACzE;QACD;YACI,EAAE,EAAE,aAAa;YACjB,KAAK,EAAE,aAAa;YACpB,IAAI,EAAE,uBAAuB;YAC7B,WAAW,EAAE,6BAA6B;YAC1C,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE;SAC9D;KACJ,CAAC;6QAtBO,wBAAwB,yBAAxB,wBAAwB;6DAAxB,wBAAwB;YCd7B,AADJ,AADJ,8BAA6B,gBACe,aACM;YAAA,oBAA+B;YAAA,iBAAM;YAE3E,AADJ,2BAAK,YACyC;YAAA,YAAoB;YAAA,iBAAK;YACnE,8BAAyC;YAAA,YAAuB;YAExE,AADI,AADoE,iBAAM,EACpE,EACD;YAGL,AADJ,8BAAmC,gBACK;YAChC,gGAaC;YACL,iBAAQ;YAER,gCAAuC;YAMjC,AALF,6FAAiB,uEAKO;YAMxB,gCAAkG;YAC9F,kCAA0C;YAI1D,AADI,AADI,AADI,iBAAM,EACH,EACL,EACJ;;YA1C+C,eAAuB;YAAvB,gCAAuB;YAEtB,eAAoB;YAApB,wCAAoB;YACrB,eAAuB;YAAvB,2CAAuB;YAMhE,eAaC;YAbD,2BAaC;YAID,eAUC;YAVD,8DAUC;YACkC,eAA8D;YAA9D,+EAA8D;;;ADvBhG,wBAAwB;IAPpC,aAAa,CAAC,qBAAqB,EAAE,iBAAiB,CAAC;GAO3C,wBAAwB,CAuBpC;;iFAvBY,wBAAwB;cANpC,SAAS;6BACM,KAAK,YACP,qBAAqB;;kFAItB,wBAAwB","sourcesContent":["import { Component } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { AdminSection, BaseAdminContainerComponent } from './base-admin-container.component';\n\n/**\n * Admin → Monitoring. System health, SQL execution logs, and outbound\n * communication delivery monitoring.\n */\n@RegisterClass(BaseResourceComponent, 'AdminMonitoring')\n@Component({\n standalone: false,\n selector: 'mj-admin-monitoring',\n templateUrl: './admin-container.component.html',\n styleUrls: ['./admin-container.component.css']\n})\nexport class AdminMonitoringComponent extends BaseAdminContainerComponent {\n public readonly ContainerTitle = 'Monitoring';\n public readonly ContainerIcon = 'fa-solid fa-stethoscope';\n public readonly ContainerSubtitle = 'System health and query execution logs';\n\n // Communication Monitor intentionally NOT included here — outbound delivery\n // monitoring belongs in the Communications app, not in the Admin app.\n public readonly Sections: AdminSection[] = [\n {\n id: 'diagnostics',\n label: 'Diagnostics',\n icon: 'fa-solid fa-stethoscope',\n description: 'Runtime health and connectivity',\n source: { kind: 'resource', driverClass: 'SystemDiagnosticsResource' }\n },\n {\n id: 'sql-logging',\n label: 'SQL Logging',\n icon: 'fa-solid fa-file-code',\n description: 'Captured SQL execution logs',\n source: { kind: 'dashboard', dashboardName: 'SQL Logging' }\n }\n ];\n}\n","<div class=\"admin-container\">\n <header class=\"admin-container__header\">\n <div class=\"admin-container__header-icon\"><i [class]=\"ContainerIcon\"></i></div>\n <div>\n <h3 class=\"admin-container__header-title\">{{ ContainerTitle }}</h3>\n <div class=\"admin-container__header-sub\">{{ ContainerSubtitle }}</div>\n </div>\n </header>\n\n <div class=\"admin-container__body\">\n <aside class=\"admin-container__nav\">\n @for (section of Sections; track section.id) {\n <button type=\"button\"\n class=\"admin-container__nav-item\"\n [class.admin-container__nav-item--active]=\"ActiveSection === section.id\"\n (click)=\"OnSectionClick(section)\">\n <i class=\"admin-container__nav-icon\" [class]=\"section.icon\"></i>\n <div class=\"admin-container__nav-text\">\n <div class=\"admin-container__nav-label\">{{ section.label }}</div>\n @if (section.description) {\n <div class=\"admin-container__nav-desc\">{{ section.description }}</div>\n }\n </div>\n </button>\n }\n </aside>\n\n <main class=\"admin-container__content\">\n @if (LoadError) {\n <div class=\"admin-container__error\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{ LoadError }}</span>\n </div>\n } @else if (IsLoading) {\n <div class=\"admin-container__loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading…</span>\n </div>\n }\n <div class=\"admin-container__host\" [class.admin-container__host--hidden]=\"LoadError || IsLoading\">\n <ng-container #contentHost></ng-container>\n </div>\n </main>\n </div>\n</div>\n"]}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { OnInit, OnDestroy, ChangeDetectorRef, ViewContainerRef, ComponentRef } from '@angular/core';
|
|
2
|
+
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/** A single sub-section inside an admin container's left-nav. */
|
|
5
|
+
export interface AdminSection {
|
|
6
|
+
/** Stable identifier — used in the URL `?section=` deep-link. */
|
|
7
|
+
id: string;
|
|
8
|
+
label: string;
|
|
9
|
+
icon: string;
|
|
10
|
+
description: string;
|
|
11
|
+
source: AdminSectionSource;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* How to resolve and instantiate the component for this sub-section.
|
|
15
|
+
*
|
|
16
|
+
* - `resource`: looks up `@RegisterClass(BaseResourceComponent, driverClass)` and renders it directly.
|
|
17
|
+
* - `dashboard`: looks up the MJ Dashboard record by name, then renders its `DriverClass` via the
|
|
18
|
+
* BaseDashboard registry with a synthetic `{ dashboard }` config (mirrors the shell's flow for
|
|
19
|
+
* `ResourceType: "Dashboards"` nav items).
|
|
20
|
+
*/
|
|
21
|
+
export type AdminSectionSource = {
|
|
22
|
+
kind: 'resource';
|
|
23
|
+
driverClass: string;
|
|
24
|
+
} | {
|
|
25
|
+
kind: 'dashboard';
|
|
26
|
+
dashboardName: string;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Shared base for all Admin app container resources. Subclasses declare:
|
|
30
|
+
* - ContainerTitle / ContainerIcon / ContainerSubtitle
|
|
31
|
+
* - Sections[]
|
|
32
|
+
* - @RegisterClass(BaseResourceComponent, '...')
|
|
33
|
+
*
|
|
34
|
+
* The base handles: left-nav state, URL deep-linking via NavigationService,
|
|
35
|
+
* dynamic component instantiation for both resource and dashboard sections,
|
|
36
|
+
* teardown on switch.
|
|
37
|
+
*/
|
|
38
|
+
export declare abstract class BaseAdminContainerComponent extends BaseResourceComponent implements OnInit, OnDestroy {
|
|
39
|
+
abstract readonly ContainerTitle: string;
|
|
40
|
+
abstract readonly ContainerIcon: string;
|
|
41
|
+
abstract readonly ContainerSubtitle: string;
|
|
42
|
+
abstract readonly Sections: AdminSection[];
|
|
43
|
+
protected contentHost: ViewContainerRef;
|
|
44
|
+
ActiveSection: string;
|
|
45
|
+
LoadError: string | null;
|
|
46
|
+
IsLoading: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Cache of section.id → ComponentRef. Once a sub-section is rendered we
|
|
49
|
+
* keep its component alive across switches by detaching + reattaching the
|
|
50
|
+
* view (instead of destroying + recreating). This preserves state — Event
|
|
51
|
+
* Monitor's captured events, GraphQL Console's history, query inputs,
|
|
52
|
+
* scroll position, etc. — and avoids expensive re-init.
|
|
53
|
+
*/
|
|
54
|
+
protected cache: Map<string, ComponentRef<unknown>>;
|
|
55
|
+
protected currentSectionId: string | null;
|
|
56
|
+
protected readonly cdr: ChangeDetectorRef;
|
|
57
|
+
ngOnInit(): Promise<void>;
|
|
58
|
+
ngOnDestroy(): void;
|
|
59
|
+
GetResourceDisplayName(): Promise<string>;
|
|
60
|
+
GetResourceIconClass(): Promise<string>;
|
|
61
|
+
/** Called by the framework on browser back/forward + deep-link entry. */
|
|
62
|
+
protected OnQueryParamsChanged(params: Record<string, string>, _source: 'popstate' | 'deeplink'): void;
|
|
63
|
+
OnSectionClick(section: AdminSection): Promise<void>;
|
|
64
|
+
private selectSection;
|
|
65
|
+
private renderSection;
|
|
66
|
+
private detachCurrent;
|
|
67
|
+
private createResourceRef;
|
|
68
|
+
private createDashboardRef;
|
|
69
|
+
/**
|
|
70
|
+
* Force the rendered sub-component's host element to fill the container
|
|
71
|
+
* cell. Mirrors what `tab-container` does for top-level resources — many
|
|
72
|
+
* dashboards rely on inline `height: 100%` to bound their internal layout
|
|
73
|
+
* (so their own `overflow-y: auto` regions actually scroll).
|
|
74
|
+
*/
|
|
75
|
+
private applyHostSizing;
|
|
76
|
+
private findSection;
|
|
77
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<BaseAdminContainerComponent, never>;
|
|
78
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<BaseAdminContainerComponent, never, never, {}, {}, never, never, true, never>;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=base-admin-container.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-admin-container.component.d.ts","sourceRoot":"","sources":["../../src/Admin/base-admin-container.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,MAAM,EACN,SAAS,EACT,iBAAiB,EAEjB,gBAAgB,EAChB,YAAY,EAGf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,qBAAqB,EAAiB,MAAM,2BAA2B,CAAC;;AAIjF,iEAAiE;AACjE,MAAM,WAAW,YAAY;IACzB,iEAAiE;IACjE,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,kBAAkB,CAAC;CAC9B;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,kBAAkB,GACxB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnD;;;;;;;;;GASG;AACH,8BACsB,2BAA4B,SAAQ,qBAAsB,YAAW,MAAM,EAAE,SAAS;IACxG,kBAAyB,cAAc,EAAE,MAAM,CAAC;IAChD,kBAAyB,aAAa,EAAE,MAAM,CAAC;IAC/C,kBAAyB,iBAAiB,EAAE,MAAM,CAAC;IACnD,kBAAyB,QAAQ,EAAE,YAAY,EAAE,CAAC;IAGlD,SAAS,CAAC,WAAW,EAAG,gBAAgB,CAAC;IAElC,aAAa,SAAM;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAChC,SAAS,UAAS;IAEzB;;;;;;OAMG;IACH,SAAS,CAAC,KAAK,qCAA4C;IAC3D,SAAS,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEjD,SAAS,CAAC,QAAQ,CAAC,GAAG,oBAA6B;IAE7B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB/B,WAAW,IAAI,IAAI;IASb,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IACzC,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAE7D,yEAAyE;cACtD,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI;IASlG,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;YAOnD,aAAa;YAoBb,aAAa;IAyB3B,OAAO,CAAC,aAAa;YAQP,iBAAiB;YAYjB,kBAAkB;IA2BhC;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,WAAW;yCApLD,2BAA2B;2CAA3B,2BAA2B;CAwLhD"}
|