@memberjunction/ng-dashboards 5.29.0 → 5.30.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/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +11 -9
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +21 -19
- package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +154 -154
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +8 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +2 -2
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.d.ts +1 -1
- package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.js +15 -2
- package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.js +17 -5
- package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +56 -71
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +0 -8
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +73 -74
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-adapter.d.ts +25 -0
- package/dist/DashboardBrowser/dashboard-share-adapter.d.ts.map +1 -0
- package/dist/DashboardBrowser/dashboard-share-adapter.js +99 -0
- package/dist/DashboardBrowser/dashboard-share-adapter.js.map +1 -0
- package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts +21 -104
- package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js +48 -530
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +5 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +17 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts +18 -1
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +251 -199
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/services/integration-data.service.d.ts +7 -2
- package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
- package/dist/Integration/services/integration-data.service.js +10 -2
- package/dist/Integration/services/integration-data.service.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +144 -144
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +12 -14
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +28 -57
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/Permissions/audit-log-resource.component.d.ts +38 -0
- package/dist/Permissions/audit-log-resource.component.d.ts.map +1 -0
- package/dist/Permissions/audit-log-resource.component.js +380 -0
- package/dist/Permissions/audit-log-resource.component.js.map +1 -0
- package/dist/Permissions/permissions-shared.d.ts +51 -0
- package/dist/Permissions/permissions-shared.d.ts.map +1 -0
- package/dist/Permissions/permissions-shared.js +91 -0
- package/dist/Permissions/permissions-shared.js.map +1 -0
- package/dist/Permissions/resource-access-resource.component.d.ts +45 -0
- package/dist/Permissions/resource-access-resource.component.d.ts.map +1 -0
- package/dist/Permissions/resource-access-resource.component.js +342 -0
- package/dist/Permissions/resource-access-resource.component.js.map +1 -0
- package/dist/Permissions/user-access-resource.component.d.ts +39 -0
- package/dist/Permissions/user-access-resource.component.d.ts.map +1 -0
- package/dist/Permissions/user-access-resource.component.js +346 -0
- package/dist/Permissions/user-access-resource.component.js.map +1 -0
- package/dist/component-studio-dashboards.module.d.ts +1 -0
- package/dist/component-studio-dashboards.module.d.ts.map +1 -1
- package/dist/component-studio-dashboards.module.js +7 -0
- package/dist/component-studio-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +24 -20
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +26 -1
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +4 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +4 -0
- package/dist/public-api.js.map +1 -1
- package/dist/shared/pipes/highlight-search.pipe.d.ts +1 -1
- package/dist/shared/pipes/highlight-search.pipe.d.ts.map +1 -1
- package/dist/shared/pipes/highlight-search.pipe.js +14 -4
- package/dist/shared/pipes/highlight-search.pipe.js.map +1 -1
- package/package.json +51 -50
|
@@ -0,0 +1,346 @@
|
|
|
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 { Metadata } from '@memberjunction/core';
|
|
9
|
+
import { PermissionEngine } from '@memberjunction/core-entities';
|
|
10
|
+
import { RegisterClass } from '@memberjunction/global';
|
|
11
|
+
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
12
|
+
import { groupPermissionsByDomain, loadPermissionsUsers, resolvePermissionsUser, } from './permissions-shared';
|
|
13
|
+
import * as i0 from "@angular/core";
|
|
14
|
+
import * as i1 from "@angular/forms";
|
|
15
|
+
import * as i2 from "@memberjunction/ng-ui-components";
|
|
16
|
+
import * as i3 from "@memberjunction/ng-shared-generic";
|
|
17
|
+
const _forTrack0 = ($index, $item) => $item.ID;
|
|
18
|
+
function PermissionsUserAccessResourceComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
19
|
+
i0.ɵɵelementStart(0, "div", 9);
|
|
20
|
+
i0.ɵɵelement(1, "i", 17);
|
|
21
|
+
i0.ɵɵelementStart(2, "span");
|
|
22
|
+
i0.ɵɵtext(3);
|
|
23
|
+
i0.ɵɵelementEnd()();
|
|
24
|
+
} if (rf & 2) {
|
|
25
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
26
|
+
i0.ɵɵadvance(3);
|
|
27
|
+
i0.ɵɵtextInterpolate(ctx_r0.ErrorMessage);
|
|
28
|
+
} }
|
|
29
|
+
function PermissionsUserAccessResourceComponent_For_18_Template(rf, ctx) { if (rf & 1) {
|
|
30
|
+
i0.ɵɵelementStart(0, "option", 13);
|
|
31
|
+
i0.ɵɵtext(1);
|
|
32
|
+
i0.ɵɵelementEnd();
|
|
33
|
+
} if (rf & 2) {
|
|
34
|
+
const user_r2 = ctx.$implicit;
|
|
35
|
+
i0.ɵɵproperty("ngValue", user_r2.ID);
|
|
36
|
+
i0.ɵɵadvance();
|
|
37
|
+
i0.ɵɵtextInterpolate2("", user_r2.Name, "", user_r2.Email ? " \u2014 " + user_r2.Email : "");
|
|
38
|
+
} }
|
|
39
|
+
function PermissionsUserAccessResourceComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
40
|
+
i0.ɵɵelementStart(0, "div", 14);
|
|
41
|
+
i0.ɵɵelement(1, "i", 18);
|
|
42
|
+
i0.ɵɵelementStart(2, "span");
|
|
43
|
+
i0.ɵɵtext(3);
|
|
44
|
+
i0.ɵɵelementEnd()();
|
|
45
|
+
} if (rf & 2) {
|
|
46
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
47
|
+
i0.ɵɵadvance(3);
|
|
48
|
+
i0.ɵɵtextInterpolate(ctx_r0.SelectedUserRoles.join(", "));
|
|
49
|
+
} }
|
|
50
|
+
function PermissionsUserAccessResourceComponent_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
51
|
+
i0.ɵɵelement(0, "mj-loading", 15);
|
|
52
|
+
} }
|
|
53
|
+
function PermissionsUserAccessResourceComponent_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
54
|
+
i0.ɵɵelementStart(0, "div", 16);
|
|
55
|
+
i0.ɵɵelement(1, "i", 19);
|
|
56
|
+
i0.ɵɵelementStart(2, "p");
|
|
57
|
+
i0.ɵɵtext(3, "Select a user above to see their access report.");
|
|
58
|
+
i0.ɵɵelementEnd()();
|
|
59
|
+
} }
|
|
60
|
+
function PermissionsUserAccessResourceComponent_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
61
|
+
i0.ɵɵelementStart(0, "div", 16);
|
|
62
|
+
i0.ɵɵelement(1, "i", 20);
|
|
63
|
+
i0.ɵɵelementStart(2, "p");
|
|
64
|
+
i0.ɵɵtext(3, "This user has no permissions granted in any domain.");
|
|
65
|
+
i0.ɵɵelementEnd()();
|
|
66
|
+
} }
|
|
67
|
+
function PermissionsUserAccessResourceComponent_Conditional_23_For_9_Conditional_9_For_14_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
68
|
+
i0.ɵɵelementStart(0, "span", 35);
|
|
69
|
+
i0.ɵɵtext(1);
|
|
70
|
+
i0.ɵɵelementEnd();
|
|
71
|
+
} if (rf & 2) {
|
|
72
|
+
const row_r5 = i0.ɵɵnextContext().$implicit;
|
|
73
|
+
i0.ɵɵadvance();
|
|
74
|
+
i0.ɵɵtextInterpolate(row_r5.ResourceID);
|
|
75
|
+
} }
|
|
76
|
+
function PermissionsUserAccessResourceComponent_Conditional_23_For_9_Conditional_9_For_14_For_10_Template(rf, ctx) { if (rf & 1) {
|
|
77
|
+
i0.ɵɵelementStart(0, "span", 37);
|
|
78
|
+
i0.ɵɵtext(1);
|
|
79
|
+
i0.ɵɵelementEnd();
|
|
80
|
+
} if (rf & 2) {
|
|
81
|
+
const action_r6 = ctx.$implicit;
|
|
82
|
+
i0.ɵɵadvance();
|
|
83
|
+
i0.ɵɵtextInterpolate(action_r6);
|
|
84
|
+
} }
|
|
85
|
+
function PermissionsUserAccessResourceComponent_Conditional_23_For_9_Conditional_9_For_14_Template(rf, ctx) { if (rf & 1) {
|
|
86
|
+
i0.ɵɵelementStart(0, "tr")(1, "td", 33)(2, "span", 34);
|
|
87
|
+
i0.ɵɵtext(3);
|
|
88
|
+
i0.ɵɵelementEnd();
|
|
89
|
+
i0.ɵɵconditionalCreate(4, PermissionsUserAccessResourceComponent_Conditional_23_For_9_Conditional_9_For_14_Conditional_4_Template, 2, 1, "span", 35);
|
|
90
|
+
i0.ɵɵelementEnd();
|
|
91
|
+
i0.ɵɵelementStart(5, "td");
|
|
92
|
+
i0.ɵɵtext(6);
|
|
93
|
+
i0.ɵɵelementEnd();
|
|
94
|
+
i0.ɵɵelementStart(7, "td")(8, "div", 36);
|
|
95
|
+
i0.ɵɵrepeaterCreate(9, PermissionsUserAccessResourceComponent_Conditional_23_For_9_Conditional_9_For_14_For_10_Template, 2, 1, "span", 37, i0.ɵɵrepeaterTrackByIdentity);
|
|
96
|
+
i0.ɵɵelementEnd()();
|
|
97
|
+
i0.ɵɵelementStart(11, "td")(12, "span", 38);
|
|
98
|
+
i0.ɵɵtext(13);
|
|
99
|
+
i0.ɵɵelementEnd()()();
|
|
100
|
+
} if (rf & 2) {
|
|
101
|
+
const row_r5 = ctx.$implicit;
|
|
102
|
+
i0.ɵɵadvance(3);
|
|
103
|
+
i0.ɵɵtextInterpolate(row_r5.ResourceName || row_r5.ResourceID || "\u2014");
|
|
104
|
+
i0.ɵɵadvance();
|
|
105
|
+
i0.ɵɵconditional(row_r5.ResourceID && row_r5.ResourceName && row_r5.ResourceName !== row_r5.ResourceID ? 4 : -1);
|
|
106
|
+
i0.ɵɵadvance(2);
|
|
107
|
+
i0.ɵɵtextInterpolate(row_r5.ResourceType);
|
|
108
|
+
i0.ɵɵadvance(3);
|
|
109
|
+
i0.ɵɵrepeater(row_r5.Actions);
|
|
110
|
+
i0.ɵɵadvance(3);
|
|
111
|
+
i0.ɵɵclassProp("effect-allow", row_r5.Effect === "Allow")("effect-deny", row_r5.Effect === "Deny");
|
|
112
|
+
i0.ɵɵadvance();
|
|
113
|
+
i0.ɵɵtextInterpolate1(" ", row_r5.Effect, " ");
|
|
114
|
+
} }
|
|
115
|
+
function PermissionsUserAccessResourceComponent_Conditional_23_For_9_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
116
|
+
i0.ɵɵelementStart(0, "div", 31)(1, "table", 32)(2, "thead")(3, "tr")(4, "th");
|
|
117
|
+
i0.ɵɵtext(5, "Resource");
|
|
118
|
+
i0.ɵɵelementEnd();
|
|
119
|
+
i0.ɵɵelementStart(6, "th");
|
|
120
|
+
i0.ɵɵtext(7, "Type");
|
|
121
|
+
i0.ɵɵelementEnd();
|
|
122
|
+
i0.ɵɵelementStart(8, "th");
|
|
123
|
+
i0.ɵɵtext(9, "Actions");
|
|
124
|
+
i0.ɵɵelementEnd();
|
|
125
|
+
i0.ɵɵelementStart(10, "th");
|
|
126
|
+
i0.ɵɵtext(11, "Effect");
|
|
127
|
+
i0.ɵɵelementEnd()()();
|
|
128
|
+
i0.ɵɵelementStart(12, "tbody");
|
|
129
|
+
i0.ɵɵrepeaterCreate(13, PermissionsUserAccessResourceComponent_Conditional_23_For_9_Conditional_9_For_14_Template, 14, 8, "tr", null, i0.ɵɵcomponentInstance().TrackByPermission, true);
|
|
130
|
+
i0.ɵɵelementEnd()()();
|
|
131
|
+
} if (rf & 2) {
|
|
132
|
+
const group_r4 = i0.ɵɵnextContext().$implicit;
|
|
133
|
+
i0.ɵɵadvance(13);
|
|
134
|
+
i0.ɵɵrepeater(group_r4.Rows);
|
|
135
|
+
} }
|
|
136
|
+
function PermissionsUserAccessResourceComponent_Conditional_23_For_9_Template(rf, ctx) { if (rf & 1) {
|
|
137
|
+
const _r3 = i0.ɵɵgetCurrentView();
|
|
138
|
+
i0.ɵɵelementStart(0, "div", 24)(1, "button", 25);
|
|
139
|
+
i0.ɵɵlistener("click", function PermissionsUserAccessResourceComponent_Conditional_23_For_9_Template_button_click_1_listener() { const group_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.ToggleGroup(group_r4)); });
|
|
140
|
+
i0.ɵɵelementStart(2, "div", 26);
|
|
141
|
+
i0.ɵɵelement(3, "i", 27);
|
|
142
|
+
i0.ɵɵelementStart(4, "span", 28);
|
|
143
|
+
i0.ɵɵtext(5);
|
|
144
|
+
i0.ɵɵelementEnd();
|
|
145
|
+
i0.ɵɵelementStart(6, "span", 29);
|
|
146
|
+
i0.ɵɵtext(7);
|
|
147
|
+
i0.ɵɵelementEnd()();
|
|
148
|
+
i0.ɵɵelement(8, "i", 30);
|
|
149
|
+
i0.ɵɵelementEnd();
|
|
150
|
+
i0.ɵɵconditionalCreate(9, PermissionsUserAccessResourceComponent_Conditional_23_For_9_Conditional_9_Template, 15, 0, "div", 31);
|
|
151
|
+
i0.ɵɵelementEnd();
|
|
152
|
+
} if (rf & 2) {
|
|
153
|
+
const group_r4 = ctx.$implicit;
|
|
154
|
+
i0.ɵɵclassProp("expanded", group_r4.Expanded);
|
|
155
|
+
i0.ɵɵadvance(3);
|
|
156
|
+
i0.ɵɵclassMap(group_r4.Icon);
|
|
157
|
+
i0.ɵɵadvance(2);
|
|
158
|
+
i0.ɵɵtextInterpolate(group_r4.DomainName);
|
|
159
|
+
i0.ɵɵadvance(2);
|
|
160
|
+
i0.ɵɵtextInterpolate(group_r4.Count);
|
|
161
|
+
i0.ɵɵadvance();
|
|
162
|
+
i0.ɵɵclassProp("rotated", group_r4.Expanded);
|
|
163
|
+
i0.ɵɵadvance();
|
|
164
|
+
i0.ɵɵconditional(group_r4.Expanded ? 9 : -1);
|
|
165
|
+
} }
|
|
166
|
+
function PermissionsUserAccessResourceComponent_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
167
|
+
i0.ɵɵelementStart(0, "div", 21)(1, "strong");
|
|
168
|
+
i0.ɵɵtext(2);
|
|
169
|
+
i0.ɵɵelementEnd();
|
|
170
|
+
i0.ɵɵtext(3);
|
|
171
|
+
i0.ɵɵelementStart(4, "strong");
|
|
172
|
+
i0.ɵɵtext(5);
|
|
173
|
+
i0.ɵɵelementEnd();
|
|
174
|
+
i0.ɵɵtext(6);
|
|
175
|
+
i0.ɵɵelementEnd();
|
|
176
|
+
i0.ɵɵelementStart(7, "div", 22);
|
|
177
|
+
i0.ɵɵrepeaterCreate(8, PermissionsUserAccessResourceComponent_Conditional_23_For_9_Template, 10, 9, "div", 23, i0.ɵɵcomponentInstance().TrackByDomain, true);
|
|
178
|
+
i0.ɵɵelementEnd();
|
|
179
|
+
} if (rf & 2) {
|
|
180
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
181
|
+
i0.ɵɵadvance(2);
|
|
182
|
+
i0.ɵɵtextInterpolate(ctx_r0.TotalCount);
|
|
183
|
+
i0.ɵɵadvance();
|
|
184
|
+
i0.ɵɵtextInterpolate1(" permission", ctx_r0.TotalCount === 1 ? "" : "s", " across ");
|
|
185
|
+
i0.ɵɵadvance(2);
|
|
186
|
+
i0.ɵɵtextInterpolate(ctx_r0.DomainGroups.length);
|
|
187
|
+
i0.ɵɵadvance();
|
|
188
|
+
i0.ɵɵtextInterpolate1(" domain", ctx_r0.DomainGroups.length === 1 ? "" : "s", " ");
|
|
189
|
+
i0.ɵɵadvance(2);
|
|
190
|
+
i0.ɵɵrepeater(ctx_r0.DomainGroups);
|
|
191
|
+
} }
|
|
192
|
+
/**
|
|
193
|
+
* User Access Report resource — one of three tabs in the Permissions admin application.
|
|
194
|
+
* Lets an admin pick any user and see every resource that user has access to across
|
|
195
|
+
* every registered permission domain. Powered by `PermissionEngine.GetAllUserPermissions`.
|
|
196
|
+
*/
|
|
197
|
+
let PermissionsUserAccessResourceComponent = class PermissionsUserAccessResourceComponent extends BaseResourceComponent {
|
|
198
|
+
cdr;
|
|
199
|
+
Users = [];
|
|
200
|
+
SelectedUserId = null;
|
|
201
|
+
SelectedUserRoles = [];
|
|
202
|
+
DomainGroups = [];
|
|
203
|
+
IsLoadingUsers = true;
|
|
204
|
+
IsLoadingPermissions = false;
|
|
205
|
+
ErrorMessage = null;
|
|
206
|
+
constructor(cdr) {
|
|
207
|
+
super();
|
|
208
|
+
this.cdr = cdr;
|
|
209
|
+
}
|
|
210
|
+
async GetResourceDisplayName(_data) {
|
|
211
|
+
return 'User Access Report';
|
|
212
|
+
}
|
|
213
|
+
async GetResourceIconClass(_data) {
|
|
214
|
+
return 'fa-solid fa-user';
|
|
215
|
+
}
|
|
216
|
+
async ngOnInit() {
|
|
217
|
+
super.ngOnInit();
|
|
218
|
+
await this.loadUsers();
|
|
219
|
+
this.NotifyLoadComplete();
|
|
220
|
+
}
|
|
221
|
+
ngOnDestroy() {
|
|
222
|
+
super.ngOnDestroy();
|
|
223
|
+
}
|
|
224
|
+
async loadUsers() {
|
|
225
|
+
this.IsLoadingUsers = true;
|
|
226
|
+
this.ErrorMessage = null;
|
|
227
|
+
try {
|
|
228
|
+
this.Users = await loadPermissionsUsers();
|
|
229
|
+
const md = new Metadata();
|
|
230
|
+
this.SelectedUserId = md.CurrentUser?.ID ?? null;
|
|
231
|
+
if (this.SelectedUserId) {
|
|
232
|
+
await this.loadPermissionsForSelectedUser();
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
catch (e) {
|
|
236
|
+
this.ErrorMessage = `Error loading users: ${e instanceof Error ? e.message : String(e)}`;
|
|
237
|
+
}
|
|
238
|
+
this.IsLoadingUsers = false;
|
|
239
|
+
this.cdr.detectChanges();
|
|
240
|
+
}
|
|
241
|
+
async OnUserChanged(userId) {
|
|
242
|
+
this.SelectedUserId = userId;
|
|
243
|
+
await this.loadPermissionsForSelectedUser();
|
|
244
|
+
}
|
|
245
|
+
async loadPermissionsForSelectedUser() {
|
|
246
|
+
this.IsLoadingPermissions = true;
|
|
247
|
+
this.ErrorMessage = null;
|
|
248
|
+
this.cdr.detectChanges();
|
|
249
|
+
try {
|
|
250
|
+
const user = await resolvePermissionsUser(this.SelectedUserId, this.Users);
|
|
251
|
+
if (!user) {
|
|
252
|
+
this.ErrorMessage = 'Could not load roles for the selected user.';
|
|
253
|
+
this.DomainGroups = [];
|
|
254
|
+
this.IsLoadingPermissions = false;
|
|
255
|
+
this.cdr.detectChanges();
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
this.SelectedUserRoles = (user.UserRoles ?? []).map((ur) => ur.Role).filter((n) => !!n);
|
|
259
|
+
const rows = await PermissionEngine.Instance.GetAllUserPermissions(user);
|
|
260
|
+
const orderMap = new Map();
|
|
261
|
+
for (const d of PermissionEngine.Instance.Domains) {
|
|
262
|
+
orderMap.set(d.Name, d.DisplayOrder ?? 999);
|
|
263
|
+
}
|
|
264
|
+
this.DomainGroups = groupPermissionsByDomain(rows, orderMap);
|
|
265
|
+
}
|
|
266
|
+
catch (e) {
|
|
267
|
+
this.ErrorMessage = `Error loading permissions: ${e instanceof Error ? e.message : String(e)}`;
|
|
268
|
+
this.DomainGroups = [];
|
|
269
|
+
}
|
|
270
|
+
this.IsLoadingPermissions = false;
|
|
271
|
+
this.cdr.detectChanges();
|
|
272
|
+
}
|
|
273
|
+
ToggleGroup(group) {
|
|
274
|
+
group.Expanded = !group.Expanded;
|
|
275
|
+
this.cdr.detectChanges();
|
|
276
|
+
}
|
|
277
|
+
TrackByDomain(_index, group) {
|
|
278
|
+
return group.DomainName;
|
|
279
|
+
}
|
|
280
|
+
TrackByPermission(_index, row) {
|
|
281
|
+
return row.SourceRecordID ?? `${row.DomainName}|${row.ResourceType}|${row.ResourceID ?? ''}|${row.GranteeID ?? ''}`;
|
|
282
|
+
}
|
|
283
|
+
ActionsLabel(actions) {
|
|
284
|
+
return actions.join(', ');
|
|
285
|
+
}
|
|
286
|
+
get TotalCount() {
|
|
287
|
+
return this.DomainGroups.reduce((sum, g) => sum + g.Count, 0);
|
|
288
|
+
}
|
|
289
|
+
static ɵfac = function PermissionsUserAccessResourceComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || PermissionsUserAccessResourceComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
290
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PermissionsUserAccessResourceComponent, selectors: [["mj-permissions-user-access-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 24, vars: 8, consts: [[1, "permissions-container"], [1, "header"], [1, "header-left"], [1, "fa-solid", "fa-user", "header-icon"], [1, "header-title"], [1, "header-actions"], ["mjButton", "", "variant", "secondary", 3, "click", "disabled"], [1, "fa-solid", "fa-arrows-rotate"], [1, "description"], [1, "message", "error-message"], [1, "selector-row"], ["for", "user-select", 1, "selector-label"], ["id", "user-select", 1, "mj-input", 3, "ngModelChange", "ngModel", "disabled"], [3, "ngValue"], ["title", "Roles assigned to this user", 1, "roles-badge"], ["text", "Loading permissions...", "size", "medium"], [1, "empty-state"], [1, "fa-solid", "fa-circle-exclamation"], [1, "fa-solid", "fa-user-tag"], [1, "fa-solid", "fa-user-slash"], [1, "fa-solid", "fa-folder-open"], [1, "total-summary"], [1, "domain-groups"], [1, "domain-group", 3, "expanded"], [1, "domain-group"], ["type", "button", 1, "domain-header", 3, "click"], [1, "domain-header-left"], [1, "domain-icon"], [1, "domain-name"], [1, "domain-count"], [1, "fa-solid", "fa-chevron-down", "toggle-icon"], [1, "domain-body"], [1, "perms-table"], [1, "resource-cell"], [1, "resource-name"], [1, "resource-id"], [1, "action-chips"], [1, "action-chip"], [1, "effect-badge"]], template: function PermissionsUserAccessResourceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
291
|
+
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2);
|
|
292
|
+
i0.ɵɵelement(3, "i", 3);
|
|
293
|
+
i0.ɵɵelementStart(4, "h2", 4);
|
|
294
|
+
i0.ɵɵtext(5, "User Access Report");
|
|
295
|
+
i0.ɵɵelementEnd()();
|
|
296
|
+
i0.ɵɵelementStart(6, "div", 5)(7, "button", 6);
|
|
297
|
+
i0.ɵɵlistener("click", function PermissionsUserAccessResourceComponent_Template_button_click_7_listener() { return ctx.loadUsers(); });
|
|
298
|
+
i0.ɵɵelement(8, "i", 7);
|
|
299
|
+
i0.ɵɵtext(9, " Refresh ");
|
|
300
|
+
i0.ɵɵelementEnd()()();
|
|
301
|
+
i0.ɵɵelementStart(10, "p", 8);
|
|
302
|
+
i0.ɵɵtext(11, " Select a user to see every resource they can access across all registered permission domains. ");
|
|
303
|
+
i0.ɵɵelementEnd();
|
|
304
|
+
i0.ɵɵconditionalCreate(12, PermissionsUserAccessResourceComponent_Conditional_12_Template, 4, 1, "div", 9);
|
|
305
|
+
i0.ɵɵelementStart(13, "div", 10)(14, "label", 11);
|
|
306
|
+
i0.ɵɵtext(15, "User:");
|
|
307
|
+
i0.ɵɵelementEnd();
|
|
308
|
+
i0.ɵɵelementStart(16, "select", 12);
|
|
309
|
+
i0.ɵɵlistener("ngModelChange", function PermissionsUserAccessResourceComponent_Template_select_ngModelChange_16_listener($event) { return ctx.OnUserChanged($event); });
|
|
310
|
+
i0.ɵɵrepeaterCreate(17, PermissionsUserAccessResourceComponent_For_18_Template, 2, 3, "option", 13, _forTrack0);
|
|
311
|
+
i0.ɵɵelementEnd();
|
|
312
|
+
i0.ɵɵconditionalCreate(19, PermissionsUserAccessResourceComponent_Conditional_19_Template, 4, 1, "div", 14);
|
|
313
|
+
i0.ɵɵelementEnd();
|
|
314
|
+
i0.ɵɵconditionalCreate(20, PermissionsUserAccessResourceComponent_Conditional_20_Template, 1, 0, "mj-loading", 15)(21, PermissionsUserAccessResourceComponent_Conditional_21_Template, 4, 0, "div", 16)(22, PermissionsUserAccessResourceComponent_Conditional_22_Template, 4, 0, "div", 16)(23, PermissionsUserAccessResourceComponent_Conditional_23_Template, 10, 4);
|
|
315
|
+
i0.ɵɵelementEnd();
|
|
316
|
+
} if (rf & 2) {
|
|
317
|
+
i0.ɵɵadvance(7);
|
|
318
|
+
i0.ɵɵproperty("disabled", ctx.IsLoadingUsers || ctx.IsLoadingPermissions);
|
|
319
|
+
i0.ɵɵadvance();
|
|
320
|
+
i0.ɵɵclassProp("fa-spin", ctx.IsLoadingUsers);
|
|
321
|
+
i0.ɵɵadvance(4);
|
|
322
|
+
i0.ɵɵconditional(ctx.ErrorMessage ? 12 : -1);
|
|
323
|
+
i0.ɵɵadvance(4);
|
|
324
|
+
i0.ɵɵproperty("ngModel", ctx.SelectedUserId)("disabled", ctx.IsLoadingUsers || ctx.IsLoadingPermissions);
|
|
325
|
+
i0.ɵɵadvance();
|
|
326
|
+
i0.ɵɵrepeater(ctx.Users);
|
|
327
|
+
i0.ɵɵadvance(2);
|
|
328
|
+
i0.ɵɵconditional(ctx.SelectedUserRoles.length > 0 ? 19 : -1);
|
|
329
|
+
i0.ɵɵadvance();
|
|
330
|
+
i0.ɵɵconditional(ctx.IsLoadingPermissions ? 20 : !ctx.SelectedUserId ? 21 : ctx.DomainGroups.length === 0 ? 22 : 23);
|
|
331
|
+
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.MJButtonDirective, i3.LoadingComponent], styles: [".permissions-container[_ngcontent-%COMP%] {\n padding: 24px;\n max-width: 1080px;\n margin: 0 auto;\n height: 100%;\n overflow-y: auto;\n box-sizing: border-box;\n}\n\n\n\n.header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n}\n\n.header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.header-icon[_ngcontent-%COMP%] {\n font-size: 24px;\n color: var(--mj-brand-primary);\n}\n\n.header-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 22px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n align-items: center;\n}\n\n.description[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 14px;\n margin-bottom: 20px;\n line-height: 1.5;\n}\n\n\n\n.tab-bar[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n border-bottom: 1px solid var(--mj-border-default);\n margin-bottom: 16px;\n}\n\n.tab[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n padding: 10px 16px;\n cursor: pointer;\n color: var(--mj-text-secondary);\n font: inherit;\n font-weight: 500;\n border-bottom: 2px solid transparent;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.tab[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.tab-active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.selector-row.wrap[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n}\n\n.mj-input.mono[_ngcontent-%COMP%] {\n font-family: var(--mj-font-mono, monospace);\n min-width: 300px;\n}\n\n.muted[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n\n\n.message[_ngcontent-%COMP%] {\n padding: 10px 14px;\n border-radius: 6px;\n margin-bottom: 16px;\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n}\n\n.error-message[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n}\n\n\n\n.user-selector-row[_ngcontent-%COMP%], \n.selector-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 20px;\n flex-wrap: wrap;\n}\n\n.user-selector-label[_ngcontent-%COMP%], \n.selector-label[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n#user-select[_ngcontent-%COMP%], \n#domain-select[_ngcontent-%COMP%] {\n min-width: 320px;\n flex: 0 1 auto;\n}\n\n.roles-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n text-align: center;\n padding: 48px 16px;\n color: var(--mj-text-muted);\n border: 1px dashed var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n margin-bottom: 12px;\n display: block;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n}\n\n.total-summary[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 13px;\n margin-bottom: 12px;\n}\n\n.total-summary[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n}\n\n\n\n.domain-groups[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.domain-group[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n background: var(--mj-bg-surface);\n}\n\n.domain-header[_ngcontent-%COMP%] {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border: none;\n cursor: pointer;\n text-align: left;\n color: var(--mj-text-primary);\n font: inherit;\n}\n\n.domain-header[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.domain-header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.domain-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 16px;\n}\n\n.domain-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 15px;\n}\n\n.domain-count[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 20px;\n padding: 0 8px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-radius: 10px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.toggle-icon[_ngcontent-%COMP%] {\n transition: transform 0.15s ease;\n color: var(--mj-text-muted);\n}\n\n.toggle-icon.rotated[_ngcontent-%COMP%] {\n transform: rotate(180deg);\n}\n\n.domain-body[_ngcontent-%COMP%] {\n padding: 0;\n background: var(--mj-bg-surface);\n overflow-x: auto;\n}\n\n\n\n.perms-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n}\n\n.perms-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%], \n.perms-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 8px 16px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: top;\n}\n\n.perms-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n font-weight: 600;\n text-transform: uppercase;\n font-size: 11px;\n letter-spacing: 0.5px;\n}\n\n.perms-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.perms-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.resource-cell[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.resource-name[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n font-weight: 500;\n}\n\n.resource-id[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 11px;\n font-family: var(--mj-font-mono, monospace);\n}\n\n\n\n.action-chips[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n.action-chip[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n}\n\n\n\n.effect-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.effect-allow[_ngcontent-%COMP%] {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.effect-deny[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}"] });
|
|
332
|
+
};
|
|
333
|
+
PermissionsUserAccessResourceComponent = __decorate([
|
|
334
|
+
RegisterClass(BaseResourceComponent, 'PermissionsUserAccessResource')
|
|
335
|
+
], PermissionsUserAccessResourceComponent);
|
|
336
|
+
export { PermissionsUserAccessResourceComponent };
|
|
337
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PermissionsUserAccessResourceComponent, [{
|
|
338
|
+
type: Component,
|
|
339
|
+
args: [{ standalone: false, selector: 'mj-permissions-user-access-resource', template: "<div class=\"permissions-container\">\n <div class=\"header\">\n <div class=\"header-left\">\n <i class=\"fa-solid fa-user header-icon\"></i>\n <h2 class=\"header-title\">User Access Report</h2>\n </div>\n <div class=\"header-actions\">\n <button mjButton variant=\"secondary\" (click)=\"loadUsers()\" [disabled]=\"IsLoadingUsers || IsLoadingPermissions\">\n <i class=\"fa-solid fa-arrows-rotate\" [class.fa-spin]=\"IsLoadingUsers\"></i> Refresh\n </button>\n </div>\n </div>\n\n <p class=\"description\">\n Select a user to see every resource they can access across all registered permission domains.\n </p>\n\n @if (ErrorMessage) {\n <div class=\"message error-message\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n <span>{{ ErrorMessage }}</span>\n </div>\n }\n\n <div class=\"selector-row\">\n <label class=\"selector-label\" for=\"user-select\">User:</label>\n <select\n id=\"user-select\"\n class=\"mj-input\"\n [ngModel]=\"SelectedUserId\"\n (ngModelChange)=\"OnUserChanged($event)\"\n [disabled]=\"IsLoadingUsers || IsLoadingPermissions\"\n >\n @for (user of Users; track user.ID) {\n <option [ngValue]=\"user.ID\">{{ user.Name }}{{ user.Email ? ' \u2014 ' + user.Email : '' }}</option>\n }\n </select>\n\n @if (SelectedUserRoles.length > 0) {\n <div class=\"roles-badge\" title=\"Roles assigned to this user\">\n <i class=\"fa-solid fa-user-tag\"></i>\n <span>{{ SelectedUserRoles.join(', ') }}</span>\n </div>\n }\n </div>\n\n @if (IsLoadingPermissions) {\n <mj-loading text=\"Loading permissions...\" size=\"medium\"></mj-loading>\n } @else if (!SelectedUserId) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-user-slash\"></i>\n <p>Select a user above to see their access report.</p>\n </div>\n } @else if (DomainGroups.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-folder-open\"></i>\n <p>This user has no permissions granted in any domain.</p>\n </div>\n } @else {\n <div class=\"total-summary\">\n <strong>{{ TotalCount }}</strong> permission{{ TotalCount === 1 ? '' : 's' }} across\n <strong>{{ DomainGroups.length }}</strong> domain{{ DomainGroups.length === 1 ? '' : 's' }}\n </div>\n\n <div class=\"domain-groups\">\n @for (group of DomainGroups; track TrackByDomain($index, group)) {\n <div class=\"domain-group\" [class.expanded]=\"group.Expanded\">\n <button type=\"button\" class=\"domain-header\" (click)=\"ToggleGroup(group)\">\n <div class=\"domain-header-left\">\n <i [class]=\"group.Icon\" class=\"domain-icon\"></i>\n <span class=\"domain-name\">{{ group.DomainName }}</span>\n <span class=\"domain-count\">{{ group.Count }}</span>\n </div>\n <i class=\"fa-solid fa-chevron-down toggle-icon\" [class.rotated]=\"group.Expanded\"></i>\n </button>\n\n @if (group.Expanded) {\n <div class=\"domain-body\">\n <table class=\"perms-table\">\n <thead>\n <tr>\n <th>Resource</th>\n <th>Type</th>\n <th>Actions</th>\n <th>Effect</th>\n </tr>\n </thead>\n <tbody>\n @for (row of group.Rows; track TrackByPermission($index, row)) {\n <tr>\n <td class=\"resource-cell\">\n <span class=\"resource-name\">{{ row.ResourceName || row.ResourceID || '\u2014' }}</span>\n @if (row.ResourceID && row.ResourceName && row.ResourceName !== row.ResourceID) {\n <span class=\"resource-id\">{{ row.ResourceID }}</span>\n }\n </td>\n <td>{{ row.ResourceType }}</td>\n <td>\n <div class=\"action-chips\">\n @for (action of row.Actions; track action) {\n <span class=\"action-chip\">{{ action }}</span>\n }\n </div>\n </td>\n <td>\n <span class=\"effect-badge\" [class.effect-allow]=\"row.Effect === 'Allow'\" [class.effect-deny]=\"row.Effect === 'Deny'\">\n {{ row.Effect }}\n </span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n }\n </div>\n }\n</div>\n", styles: [".permissions-container {\n padding: 24px;\n max-width: 1080px;\n margin: 0 auto;\n height: 100%;\n overflow-y: auto;\n box-sizing: border-box;\n}\n\n/* Header */\n.header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n}\n\n.header-left {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.header-icon {\n font-size: 24px;\n color: var(--mj-brand-primary);\n}\n\n.header-title {\n margin: 0;\n font-size: 22px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.header-actions {\n display: flex;\n gap: 8px;\n align-items: center;\n}\n\n.description {\n color: var(--mj-text-secondary);\n font-size: 14px;\n margin-bottom: 20px;\n line-height: 1.5;\n}\n\n/* Tab bar */\n.tab-bar {\n display: flex;\n gap: 4px;\n border-bottom: 1px solid var(--mj-border-default);\n margin-bottom: 16px;\n}\n\n.tab {\n background: transparent;\n border: none;\n padding: 10px 16px;\n cursor: pointer;\n color: var(--mj-text-secondary);\n font: inherit;\n font-weight: 500;\n border-bottom: 2px solid transparent;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.tab:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.tab-active {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.selector-row.wrap {\n flex-wrap: wrap;\n}\n\n.mj-input.mono {\n font-family: var(--mj-font-mono, monospace);\n min-width: 300px;\n}\n\n.muted {\n color: var(--mj-text-muted);\n}\n\n/* Messages */\n.message {\n padding: 10px 14px;\n border-radius: 6px;\n margin-bottom: 16px;\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n}\n\n.error-message {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n}\n\n/* User selector (legacy name kept for User Access tab, plus generic selector-row for Resource tab) */\n.user-selector-row,\n.selector-row {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 20px;\n flex-wrap: wrap;\n}\n\n.user-selector-label,\n.selector-label {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n#user-select,\n#domain-select {\n min-width: 320px;\n flex: 0 1 auto;\n}\n\n.roles-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n}\n\n/* Empty state */\n.empty-state {\n text-align: center;\n padding: 48px 16px;\n color: var(--mj-text-muted);\n border: 1px dashed var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n}\n\n.empty-state i {\n font-size: 32px;\n margin-bottom: 12px;\n display: block;\n}\n\n.empty-state p {\n margin: 0;\n font-size: 14px;\n}\n\n.total-summary {\n color: var(--mj-text-secondary);\n font-size: 13px;\n margin-bottom: 12px;\n}\n\n.total-summary strong {\n color: var(--mj-text-primary);\n}\n\n/* Domain groups */\n.domain-groups {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.domain-group {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n background: var(--mj-bg-surface);\n}\n\n.domain-header {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border: none;\n cursor: pointer;\n text-align: left;\n color: var(--mj-text-primary);\n font: inherit;\n}\n\n.domain-header:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.domain-header-left {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.domain-icon {\n color: var(--mj-brand-primary);\n font-size: 16px;\n}\n\n.domain-name {\n font-weight: 600;\n font-size: 15px;\n}\n\n.domain-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 20px;\n padding: 0 8px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-radius: 10px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.toggle-icon {\n transition: transform 0.15s ease;\n color: var(--mj-text-muted);\n}\n\n.toggle-icon.rotated {\n transform: rotate(180deg);\n}\n\n.domain-body {\n padding: 0;\n background: var(--mj-bg-surface);\n overflow-x: auto;\n}\n\n/* Permissions table */\n.perms-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n}\n\n.perms-table th,\n.perms-table td {\n padding: 8px 16px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: top;\n}\n\n.perms-table th {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n font-weight: 600;\n text-transform: uppercase;\n font-size: 11px;\n letter-spacing: 0.5px;\n}\n\n.perms-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.perms-table tbody tr:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.resource-cell {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.resource-name {\n color: var(--mj-text-primary);\n font-weight: 500;\n}\n\n.resource-id {\n color: var(--mj-text-muted);\n font-size: 11px;\n font-family: var(--mj-font-mono, monospace);\n}\n\n/* Action chips */\n.action-chips {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n.action-chip {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n}\n\n/* Effect badge */\n.effect-badge {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.effect-allow {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.effect-deny {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}\n"] }]
|
|
340
|
+
}], () => [{ type: i0.ChangeDetectorRef }], null); })();
|
|
341
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PermissionsUserAccessResourceComponent, { className: "PermissionsUserAccessResourceComponent", filePath: "src/Permissions/user-access-resource.component.ts", lineNumber: 27 }); })();
|
|
342
|
+
/** Tree-shaking prevention — referenced from `public-api.ts`. */
|
|
343
|
+
export function LoadPermissionsUserAccessResource() {
|
|
344
|
+
// intentionally empty
|
|
345
|
+
}
|
|
346
|
+
//# sourceMappingURL=user-access-resource.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-access-resource.component.js","sourceRoot":"","sources":["../../src/Permissions/user-access-resource.component.ts","../../src/Permissions/user-access-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\nimport { Metadata, NormalizedPermission, PermissionAction } from '@memberjunction/core';\nimport { PermissionEngine, ResourceData } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\n\nimport {\n PermissionsDomainGroup,\n PermissionsUserOption,\n groupPermissionsByDomain,\n loadPermissionsUsers,\n resolvePermissionsUser,\n} from './permissions-shared';\n\n/**\n * User Access Report resource — one of three tabs in the Permissions admin application.\n * Lets an admin pick any user and see every resource that user has access to across\n * every registered permission domain. Powered by `PermissionEngine.GetAllUserPermissions`.\n */\n@RegisterClass(BaseResourceComponent, 'PermissionsUserAccessResource')\n@Component({\n standalone: false,\n selector: 'mj-permissions-user-access-resource',\n templateUrl: './user-access-resource.component.html',\n styleUrls: ['./permissions-resource.component.css'],\n})\nexport class PermissionsUserAccessResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n Users: PermissionsUserOption[] = [];\n SelectedUserId: string | null = null;\n SelectedUserRoles: string[] = [];\n DomainGroups: PermissionsDomainGroup[] = [];\n IsLoadingUsers = true;\n IsLoadingPermissions = false;\n ErrorMessage: string | null = null;\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n override async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'User Access Report';\n }\n\n override async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-user';\n }\n\n override async ngOnInit(): Promise<void> {\n super.ngOnInit();\n await this.loadUsers();\n this.NotifyLoadComplete();\n }\n\n override ngOnDestroy(): void {\n super.ngOnDestroy();\n }\n\n async loadUsers(): Promise<void> {\n this.IsLoadingUsers = true;\n this.ErrorMessage = null;\n try {\n this.Users = await loadPermissionsUsers();\n const md = new Metadata();\n this.SelectedUserId = md.CurrentUser?.ID ?? null;\n if (this.SelectedUserId) {\n await this.loadPermissionsForSelectedUser();\n }\n } catch (e) {\n this.ErrorMessage = `Error loading users: ${e instanceof Error ? e.message : String(e)}`;\n }\n this.IsLoadingUsers = false;\n this.cdr.detectChanges();\n }\n\n async OnUserChanged(userId: string): Promise<void> {\n this.SelectedUserId = userId;\n await this.loadPermissionsForSelectedUser();\n }\n\n private async loadPermissionsForSelectedUser(): Promise<void> {\n this.IsLoadingPermissions = true;\n this.ErrorMessage = null;\n this.cdr.detectChanges();\n\n try {\n const user = await resolvePermissionsUser(this.SelectedUserId!, this.Users);\n if (!user) {\n this.ErrorMessage = 'Could not load roles for the selected user.';\n this.DomainGroups = [];\n this.IsLoadingPermissions = false;\n this.cdr.detectChanges();\n return;\n }\n\n this.SelectedUserRoles = (user.UserRoles ?? []).map((ur) => ur.Role).filter((n): n is string => !!n);\n const rows = await PermissionEngine.Instance.GetAllUserPermissions(user);\n const orderMap = new Map<string, number>();\n for (const d of PermissionEngine.Instance.Domains) {\n orderMap.set(d.Name, d.DisplayOrder ?? 999);\n }\n this.DomainGroups = groupPermissionsByDomain(rows, orderMap);\n } catch (e) {\n this.ErrorMessage = `Error loading permissions: ${e instanceof Error ? e.message : String(e)}`;\n this.DomainGroups = [];\n }\n\n this.IsLoadingPermissions = false;\n this.cdr.detectChanges();\n }\n\n ToggleGroup(group: PermissionsDomainGroup): void {\n group.Expanded = !group.Expanded;\n this.cdr.detectChanges();\n }\n\n TrackByDomain(_index: number, group: PermissionsDomainGroup): string {\n return group.DomainName;\n }\n\n TrackByPermission(_index: number, row: NormalizedPermission): string {\n return row.SourceRecordID ?? `${row.DomainName}|${row.ResourceType}|${row.ResourceID ?? ''}|${row.GranteeID ?? ''}`;\n }\n\n ActionsLabel(actions: PermissionAction[]): string {\n return actions.join(', ');\n }\n\n get TotalCount(): number {\n return this.DomainGroups.reduce((sum, g) => sum + g.Count, 0);\n }\n}\n\n/** Tree-shaking prevention — referenced from `public-api.ts`. */\nexport function LoadPermissionsUserAccessResource(): void {\n // intentionally empty\n}\n","<div class=\"permissions-container\">\n <div class=\"header\">\n <div class=\"header-left\">\n <i class=\"fa-solid fa-user header-icon\"></i>\n <h2 class=\"header-title\">User Access Report</h2>\n </div>\n <div class=\"header-actions\">\n <button mjButton variant=\"secondary\" (click)=\"loadUsers()\" [disabled]=\"IsLoadingUsers || IsLoadingPermissions\">\n <i class=\"fa-solid fa-arrows-rotate\" [class.fa-spin]=\"IsLoadingUsers\"></i> Refresh\n </button>\n </div>\n </div>\n\n <p class=\"description\">\n Select a user to see every resource they can access across all registered permission domains.\n </p>\n\n @if (ErrorMessage) {\n <div class=\"message error-message\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n <span>{{ ErrorMessage }}</span>\n </div>\n }\n\n <div class=\"selector-row\">\n <label class=\"selector-label\" for=\"user-select\">User:</label>\n <select\n id=\"user-select\"\n class=\"mj-input\"\n [ngModel]=\"SelectedUserId\"\n (ngModelChange)=\"OnUserChanged($event)\"\n [disabled]=\"IsLoadingUsers || IsLoadingPermissions\"\n >\n @for (user of Users; track user.ID) {\n <option [ngValue]=\"user.ID\">{{ user.Name }}{{ user.Email ? ' — ' + user.Email : '' }}</option>\n }\n </select>\n\n @if (SelectedUserRoles.length > 0) {\n <div class=\"roles-badge\" title=\"Roles assigned to this user\">\n <i class=\"fa-solid fa-user-tag\"></i>\n <span>{{ SelectedUserRoles.join(', ') }}</span>\n </div>\n }\n </div>\n\n @if (IsLoadingPermissions) {\n <mj-loading text=\"Loading permissions...\" size=\"medium\"></mj-loading>\n } @else if (!SelectedUserId) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-user-slash\"></i>\n <p>Select a user above to see their access report.</p>\n </div>\n } @else if (DomainGroups.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-folder-open\"></i>\n <p>This user has no permissions granted in any domain.</p>\n </div>\n } @else {\n <div class=\"total-summary\">\n <strong>{{ TotalCount }}</strong> permission{{ TotalCount === 1 ? '' : 's' }} across\n <strong>{{ DomainGroups.length }}</strong> domain{{ DomainGroups.length === 1 ? '' : 's' }}\n </div>\n\n <div class=\"domain-groups\">\n @for (group of DomainGroups; track TrackByDomain($index, group)) {\n <div class=\"domain-group\" [class.expanded]=\"group.Expanded\">\n <button type=\"button\" class=\"domain-header\" (click)=\"ToggleGroup(group)\">\n <div class=\"domain-header-left\">\n <i [class]=\"group.Icon\" class=\"domain-icon\"></i>\n <span class=\"domain-name\">{{ group.DomainName }}</span>\n <span class=\"domain-count\">{{ group.Count }}</span>\n </div>\n <i class=\"fa-solid fa-chevron-down toggle-icon\" [class.rotated]=\"group.Expanded\"></i>\n </button>\n\n @if (group.Expanded) {\n <div class=\"domain-body\">\n <table class=\"perms-table\">\n <thead>\n <tr>\n <th>Resource</th>\n <th>Type</th>\n <th>Actions</th>\n <th>Effect</th>\n </tr>\n </thead>\n <tbody>\n @for (row of group.Rows; track TrackByPermission($index, row)) {\n <tr>\n <td class=\"resource-cell\">\n <span class=\"resource-name\">{{ row.ResourceName || row.ResourceID || '—' }}</span>\n @if (row.ResourceID && row.ResourceName && row.ResourceName !== row.ResourceID) {\n <span class=\"resource-id\">{{ row.ResourceID }}</span>\n }\n </td>\n <td>{{ row.ResourceType }}</td>\n <td>\n <div class=\"action-chips\">\n @for (action of row.Actions; track action) {\n <span class=\"action-chip\">{{ action }}</span>\n }\n </div>\n </td>\n <td>\n <span class=\"effect-badge\" [class.effect-allow]=\"row.Effect === 'Allow'\" [class.effect-deny]=\"row.Effect === 'Deny'\">\n {{ row.Effect }}\n </span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n }\n </div>\n }\n</div>\n"]}
|
|
@@ -30,4 +30,5 @@ export declare class ComponentStudioDashboardsModule {
|
|
|
30
30
|
static ɵmod: i0.ɵɵNgModuleDeclaration<ComponentStudioDashboardsModule, [typeof i1.ComponentStudioDashboardComponent, typeof i2.TextImportDialogComponent, typeof i3.ArtifactSelectionDialogComponent, typeof i4.ArtifactLoadDialogComponent, typeof i5.ComponentBrowserComponent, typeof i6.ComponentPreviewComponent, typeof i7.EditorTabsComponent, typeof i8.SpecEditorComponent, typeof i9.CodeEditorPanelComponent, typeof i10.RequirementsEditorComponent, typeof i11.DataRequirementsEditorComponent, typeof i12.AIAssistantPanelComponent, typeof i13.NewComponentDialogComponent, typeof i14.SaveVersionDialogComponent], [typeof i15.CommonModule, typeof i16.FormsModule, typeof i16.ReactiveFormsModule, typeof i17.ContainerDirectivesModule, typeof i18.CodeEditorModule, typeof i19.MJReactModule, typeof i20.SharedGenericModule, typeof i21.MarkdownModule, typeof i22.MJButtonDirective, typeof i22.MJDialogComponent, typeof i22.MJDialogTitlebarComponent, typeof i22.MJDialogActionsComponent], [typeof i1.ComponentStudioDashboardComponent]>;
|
|
31
31
|
static ɵinj: i0.ɵɵInjectorDeclaration<ComponentStudioDashboardsModule>;
|
|
32
32
|
}
|
|
33
|
+
export { ComponentStudioDashboardComponent } from './ComponentStudio/component-studio-dashboard.component';
|
|
33
34
|
//# sourceMappingURL=component-studio-dashboards.module.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-studio-dashboards.module.d.ts","sourceRoot":"","sources":["../src/component-studio-dashboards.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA0BA;;;GAGG;AACH,qBAmCa,+BAA+B;yCAA/B,+BAA+B;0CAA/B,+BAA+B;0CAA/B,+BAA+B;CAAI"}
|
|
1
|
+
{"version":3,"file":"component-studio-dashboards.module.d.ts","sourceRoot":"","sources":["../src/component-studio-dashboards.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA0BA;;;GAGG;AACH,qBAmCa,+BAA+B;yCAA/B,+BAA+B;0CAA/B,+BAA+B;0CAA/B,+BAA+B;CAAI;AAQhD,OAAO,EAAE,iCAAiC,EAAE,MAAM,wDAAwD,CAAC"}
|
|
@@ -116,4 +116,11 @@ i0.ɵɵsetComponentScope(ComponentStudioDashboardComponent, [MJButtonDirective,
|
|
|
116
116
|
AIAssistantPanelComponent,
|
|
117
117
|
NewComponentDialogComponent,
|
|
118
118
|
SaveVersionDialogComponent], [i1.DatePipe]);
|
|
119
|
+
// JS-level re-export so that public-api.ts line 187 (`export * from
|
|
120
|
+
// './component-studio-dashboards.module'`) exposes the dashboard component
|
|
121
|
+
// class through a path that includes ɵɵsetComponentScope. Without this,
|
|
122
|
+
// the only export path is the ComponentStudio/index.ts barrel which
|
|
123
|
+
// imports the bare component file — creating a second ESBuild copy that
|
|
124
|
+
// lacks child-component scope metadata.
|
|
125
|
+
export { ComponentStudioDashboardComponent } from './ComponentStudio/component-studio-dashboard.component';
|
|
119
126
|
//# sourceMappingURL=component-studio-dashboards.module.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-studio-dashboards.module.js","sourceRoot":"","sources":["../src/component-studio-dashboards.module.ts"],"names":[],"mappings":"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","sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { MJButtonDirective, MJDialogComponent, MJDialogTitlebarComponent, MJDialogActionsComponent } from '@memberjunction/ng-ui-components';\nimport { ContainerDirectivesModule } from '@memberjunction/ng-container-directives';\nimport { CodeEditorModule } from '@memberjunction/ng-code-editor';\nimport { MJReactModule } from '@memberjunction/ng-react';\nimport { SharedGenericModule } from '@memberjunction/ng-shared-generic';\nimport { MarkdownModule } from '@memberjunction/ng-markdown';\n\n// Component Studio Components\nimport { ComponentStudioDashboardComponent } from './ComponentStudio/component-studio-dashboard.component';\nimport { TextImportDialogComponent } from './ComponentStudio/components/text-import-dialog.component';\nimport { ArtifactSelectionDialogComponent } from './ComponentStudio/components/artifact-selection-dialog.component';\nimport { ArtifactLoadDialogComponent } from './ComponentStudio/components/artifact-load-dialog.component';\nimport { ComponentBrowserComponent } from './ComponentStudio/components/browser/component-browser.component';\nimport { ComponentPreviewComponent } from './ComponentStudio/components/workspace/component-preview.component';\nimport { EditorTabsComponent } from './ComponentStudio/components/workspace/editor-tabs.component';\nimport { SpecEditorComponent } from './ComponentStudio/components/editors/spec-editor.component';\nimport { CodeEditorPanelComponent } from './ComponentStudio/components/editors/code-editor-panel.component';\nimport { RequirementsEditorComponent } from './ComponentStudio/components/editors/requirements-editor.component';\nimport { DataRequirementsEditorComponent } from './ComponentStudio/components/editors/data-requirements-editor.component';\nimport { AIAssistantPanelComponent } from './ComponentStudio/components/ai-assistant/ai-assistant-panel.component';\nimport { NewComponentDialogComponent } from './ComponentStudio/components/new-component-dialog/new-component-dialog.component';\nimport { SaveVersionDialogComponent } from './ComponentStudio/components/save-version-dialog/save-version-dialog.component';\n\n/**\n * ComponentStudioDashboardsModule — Component Studio feature area:\n * component browser, editors, preview, and AI assistant.\n */\n@NgModule({\n declarations: [\n ComponentStudioDashboardComponent,\n TextImportDialogComponent,\n ArtifactSelectionDialogComponent,\n ArtifactLoadDialogComponent,\n ComponentBrowserComponent,\n ComponentPreviewComponent,\n EditorTabsComponent,\n SpecEditorComponent,\n CodeEditorPanelComponent,\n RequirementsEditorComponent,\n DataRequirementsEditorComponent,\n AIAssistantPanelComponent,\n NewComponentDialogComponent,\n SaveVersionDialogComponent\n ],\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n ContainerDirectivesModule,\n CodeEditorModule,\n MJReactModule,\n SharedGenericModule,\n MarkdownModule,\n MJButtonDirective,\n MJDialogComponent,\n MJDialogTitlebarComponent,\n MJDialogActionsComponent\n ],\n exports: [\n ComponentStudioDashboardComponent\n ]\n})\nexport class ComponentStudioDashboardsModule { }\n"]}
|
|
1
|
+
{"version":3,"file":"component-studio-dashboards.module.js","sourceRoot":"","sources":["../src/component-studio-dashboards.module.ts"],"names":[],"mappings":"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","sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { MJButtonDirective, MJDialogComponent, MJDialogTitlebarComponent, MJDialogActionsComponent } from '@memberjunction/ng-ui-components';\nimport { ContainerDirectivesModule } from '@memberjunction/ng-container-directives';\nimport { CodeEditorModule } from '@memberjunction/ng-code-editor';\nimport { MJReactModule } from '@memberjunction/ng-react';\nimport { SharedGenericModule } from '@memberjunction/ng-shared-generic';\nimport { MarkdownModule } from '@memberjunction/ng-markdown';\n\n// Component Studio Components\nimport { ComponentStudioDashboardComponent } from './ComponentStudio/component-studio-dashboard.component';\nimport { TextImportDialogComponent } from './ComponentStudio/components/text-import-dialog.component';\nimport { ArtifactSelectionDialogComponent } from './ComponentStudio/components/artifact-selection-dialog.component';\nimport { ArtifactLoadDialogComponent } from './ComponentStudio/components/artifact-load-dialog.component';\nimport { ComponentBrowserComponent } from './ComponentStudio/components/browser/component-browser.component';\nimport { ComponentPreviewComponent } from './ComponentStudio/components/workspace/component-preview.component';\nimport { EditorTabsComponent } from './ComponentStudio/components/workspace/editor-tabs.component';\nimport { SpecEditorComponent } from './ComponentStudio/components/editors/spec-editor.component';\nimport { CodeEditorPanelComponent } from './ComponentStudio/components/editors/code-editor-panel.component';\nimport { RequirementsEditorComponent } from './ComponentStudio/components/editors/requirements-editor.component';\nimport { DataRequirementsEditorComponent } from './ComponentStudio/components/editors/data-requirements-editor.component';\nimport { AIAssistantPanelComponent } from './ComponentStudio/components/ai-assistant/ai-assistant-panel.component';\nimport { NewComponentDialogComponent } from './ComponentStudio/components/new-component-dialog/new-component-dialog.component';\nimport { SaveVersionDialogComponent } from './ComponentStudio/components/save-version-dialog/save-version-dialog.component';\n\n/**\n * ComponentStudioDashboardsModule — Component Studio feature area:\n * component browser, editors, preview, and AI assistant.\n */\n@NgModule({\n declarations: [\n ComponentStudioDashboardComponent,\n TextImportDialogComponent,\n ArtifactSelectionDialogComponent,\n ArtifactLoadDialogComponent,\n ComponentBrowserComponent,\n ComponentPreviewComponent,\n EditorTabsComponent,\n SpecEditorComponent,\n CodeEditorPanelComponent,\n RequirementsEditorComponent,\n DataRequirementsEditorComponent,\n AIAssistantPanelComponent,\n NewComponentDialogComponent,\n SaveVersionDialogComponent\n ],\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n ContainerDirectivesModule,\n CodeEditorModule,\n MJReactModule,\n SharedGenericModule,\n MarkdownModule,\n MJButtonDirective,\n MJDialogComponent,\n MJDialogTitlebarComponent,\n MJDialogActionsComponent\n ],\n exports: [\n ComponentStudioDashboardComponent\n ]\n})\nexport class ComponentStudioDashboardsModule { }\n\n// JS-level re-export so that public-api.ts line 187 (`export * from\n// './component-studio-dashboards.module'`) exposes the dashboard component\n// class through a path that includes ɵɵsetComponentScope. Without this,\n// the only export path is the ComponentStudio/index.ts barrel which\n// imports the bare component file — creating a second ESBuild copy that\n// lacks child-component scope metadata.\nexport { ComponentStudioDashboardComponent } from './ComponentStudio/component-studio-dashboard.component';\n"]}
|
|
@@ -15,34 +15,38 @@ import * as i13 from "./APIKeys/api-applications-panel.component";
|
|
|
15
15
|
import * as i14 from "./APIKeys/api-scopes-panel.component";
|
|
16
16
|
import * as i15 from "./APIKeys/api-usage-panel.component";
|
|
17
17
|
import * as i16 from "./ApplicationRoles/application-roles-resource.component";
|
|
18
|
-
import * as i17 from "./
|
|
19
|
-
import * as i18 from "./
|
|
20
|
-
import * as i19 from "./
|
|
21
|
-
import * as i20 from "./VersionHistory/components/
|
|
22
|
-
import * as i21 from "
|
|
23
|
-
import * as i22 from "
|
|
24
|
-
import * as i23 from "
|
|
25
|
-
import * as i24 from "@
|
|
26
|
-
import * as i25 from "@
|
|
27
|
-
import * as i26 from "@memberjunction/ng-
|
|
28
|
-
import * as i27 from "@memberjunction/ng-
|
|
29
|
-
import * as i28 from "@memberjunction/ng-
|
|
30
|
-
import * as i29 from "@memberjunction/ng-
|
|
31
|
-
import * as i30 from "@memberjunction/ng-
|
|
32
|
-
import * as i31 from "@memberjunction/ng-
|
|
33
|
-
import * as i32 from "@memberjunction/ng-
|
|
34
|
-
import * as i33 from "@memberjunction/ng-
|
|
35
|
-
import * as i34 from "
|
|
18
|
+
import * as i17 from "./Permissions/user-access-resource.component";
|
|
19
|
+
import * as i18 from "./Permissions/resource-access-resource.component";
|
|
20
|
+
import * as i19 from "./Permissions/audit-log-resource.component";
|
|
21
|
+
import * as i20 from "./VersionHistory/components/labels-resource.component";
|
|
22
|
+
import * as i21 from "./VersionHistory/components/diff-resource.component";
|
|
23
|
+
import * as i22 from "./VersionHistory/components/restore-resource.component";
|
|
24
|
+
import * as i23 from "./VersionHistory/components/graph-resource.component";
|
|
25
|
+
import * as i24 from "@angular/common";
|
|
26
|
+
import * as i25 from "@angular/forms";
|
|
27
|
+
import * as i26 from "@memberjunction/ng-ui-components";
|
|
28
|
+
import * as i27 from "@memberjunction/ng-container-directives";
|
|
29
|
+
import * as i28 from "@memberjunction/ng-shared-generic";
|
|
30
|
+
import * as i29 from "@memberjunction/ng-code-editor";
|
|
31
|
+
import * as i30 from "@memberjunction/ng-explorer-settings";
|
|
32
|
+
import * as i31 from "@memberjunction/ng-entity-relationship-diagram";
|
|
33
|
+
import * as i32 from "@memberjunction/ng-query-viewer";
|
|
34
|
+
import * as i33 from "@memberjunction/ng-dashboard-viewer";
|
|
35
|
+
import * as i34 from "@memberjunction/ng-versions";
|
|
36
|
+
import * as i35 from "@memberjunction/ng-export-service";
|
|
37
|
+
import * as i36 from "@memberjunction/ng-trees";
|
|
38
|
+
import * as i37 from "@memberjunction/ng-resource-permissions";
|
|
39
|
+
import * as i38 from "./shared/shared-pipes.module";
|
|
36
40
|
/**
|
|
37
41
|
* CoreDashboardsModule — eagerly loaded core features: Home, EntityAdmin,
|
|
38
42
|
* SystemDiagnostics, QueryBrowser, DashboardBrowser, APIKeys, VersionHistory.
|
|
39
43
|
*/
|
|
40
44
|
export declare class CoreDashboardsModule {
|
|
41
45
|
static ɵfac: i0.ɵɵFactoryDeclaration<CoreDashboardsModule, never>;
|
|
42
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<CoreDashboardsModule, [typeof i1.EntityAdminDashboardComponent, typeof i2.HomeDashboardComponent, typeof i3.ActionPinConfigDialogComponent, typeof i4.ActionPinRunnerDialogComponent, typeof i5.SystemDiagnosticsComponent, typeof i6.QueryBrowserResourceComponent, typeof i7.DashboardBrowserResourceComponent, typeof i8.DashboardShareDialogComponent, typeof i9.APIKeysResourceComponent, typeof i10.APIKeyCreateDialogComponent, typeof i11.APIKeyEditPanelComponent, typeof i12.APIKeyListComponent, typeof i13.APIApplicationsPanelComponent, typeof i14.APIScopesPanelComponent, typeof i15.APIUsagePanelComponent, typeof i16.ApplicationRolesResourceComponent, typeof i17.
|
|
46
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<CoreDashboardsModule, [typeof i1.EntityAdminDashboardComponent, typeof i2.HomeDashboardComponent, typeof i3.ActionPinConfigDialogComponent, typeof i4.ActionPinRunnerDialogComponent, typeof i5.SystemDiagnosticsComponent, typeof i6.QueryBrowserResourceComponent, typeof i7.DashboardBrowserResourceComponent, typeof i8.DashboardShareDialogComponent, typeof i9.APIKeysResourceComponent, typeof i10.APIKeyCreateDialogComponent, typeof i11.APIKeyEditPanelComponent, typeof i12.APIKeyListComponent, typeof i13.APIApplicationsPanelComponent, typeof i14.APIScopesPanelComponent, typeof i15.APIUsagePanelComponent, typeof i16.ApplicationRolesResourceComponent, typeof i17.PermissionsUserAccessResourceComponent, typeof i18.PermissionsResourceAccessResourceComponent, typeof i19.PermissionsAuditLogResourceComponent, typeof i20.VersionHistoryLabelsResourceComponent, typeof i21.VersionHistoryDiffResourceComponent, typeof i22.VersionHistoryRestoreResourceComponent, typeof i23.VersionHistoryGraphResourceComponent], [typeof i24.CommonModule, typeof i25.FormsModule, typeof i25.ReactiveFormsModule, typeof i26.MJButtonDirective, typeof i26.MJDatepickerComponent, typeof i26.MJWindowComponent, typeof i26.MJWindowTitlebarComponent, typeof i26.MJDropdownComponent, typeof i26.MJComboboxComponent, typeof i27.ContainerDirectivesModule, typeof i28.SharedGenericModule, typeof i29.CodeEditorModule, typeof i30.ExplorerSettingsModule, typeof i31.EntityRelationshipDiagramModule, typeof i32.QueryViewerModule, typeof i33.DashboardViewerModule, typeof i34.VersionsModule, typeof i35.ExportServiceModule, typeof i36.NgTreesModule, typeof i37.ResourcePermissionsModule, typeof i38.SharedPipesModule], [typeof i1.EntityAdminDashboardComponent, typeof i2.HomeDashboardComponent, typeof i5.SystemDiagnosticsComponent, typeof i6.QueryBrowserResourceComponent, typeof i7.DashboardBrowserResourceComponent, typeof i8.DashboardShareDialogComponent, typeof i9.APIKeysResourceComponent, typeof i10.APIKeyCreateDialogComponent, typeof i11.APIKeyEditPanelComponent, typeof i12.APIKeyListComponent, typeof i13.APIApplicationsPanelComponent, typeof i14.APIScopesPanelComponent, typeof i15.APIUsagePanelComponent, typeof i16.ApplicationRolesResourceComponent, typeof i17.PermissionsUserAccessResourceComponent, typeof i18.PermissionsResourceAccessResourceComponent, typeof i19.PermissionsAuditLogResourceComponent, typeof i20.VersionHistoryLabelsResourceComponent, typeof i21.VersionHistoryDiffResourceComponent, typeof i22.VersionHistoryRestoreResourceComponent, typeof i23.VersionHistoryGraphResourceComponent, typeof i38.SharedPipesModule]>;
|
|
43
47
|
static ɵinj: i0.ɵɵInjectorDeclaration<CoreDashboardsModule>;
|
|
44
48
|
}
|
|
45
|
-
export type { ShareDialogResult
|
|
49
|
+
export type { ShareDialogResult } from './DashboardBrowser/dashboard-share-dialog.component';
|
|
46
50
|
export { DashboardShareDialogComponent } from './DashboardBrowser/dashboard-share-dialog.component';
|
|
47
51
|
export { HomeApplication } from './Home/home-application';
|
|
48
52
|
//# sourceMappingURL=core-dashboards.module.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core-dashboards.module.d.ts","sourceRoot":"","sources":["../src/core-dashboards.module.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"core-dashboards.module.d.ts","sourceRoot":"","sources":["../src/core-dashboards.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDA;;;GAGG;AACH,qBA8Ea,oBAAoB;yCAApB,oBAAoB;0CAApB,oBAAoB;0CAApB,oBAAoB;CAAI;AAGrC,YAAY,EAAE,iBAAiB,EAAE,MAAM,qDAAqD,CAAC;AAC7F,OAAO,EAAE,6BAA6B,EAAE,MAAM,qDAAqD,CAAC;AAIpG,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC"}
|