@memberjunction/ng-dashboards 5.28.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.
Files changed (125) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  2. package/dist/AI/components/agents/agent-configuration.component.js +11 -9
  3. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  4. package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
  5. package/dist/AI/components/agents/agent-editor.component.js +21 -19
  6. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  7. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +154 -154
  8. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  9. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  10. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +8 -0
  11. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  12. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +1 -1
  13. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  14. package/dist/AI/components/vectors/vector-management-resource.component.js +2 -2
  15. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  16. package/dist/APIKeys/api-applications-panel.component.d.ts +1 -1
  17. package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
  18. package/dist/APIKeys/api-applications-panel.component.js +15 -2
  19. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  20. package/dist/APIKeys/api-key-edit-panel.component.d.ts.map +1 -1
  21. package/dist/APIKeys/api-key-edit-panel.component.js +17 -5
  22. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
  23. package/dist/Archiving/components/archive-config-resource.component.d.ts +20 -0
  24. package/dist/Archiving/components/archive-config-resource.component.d.ts.map +1 -0
  25. package/dist/Archiving/components/archive-config-resource.component.js +46 -0
  26. package/dist/Archiving/components/archive-config-resource.component.js.map +1 -0
  27. package/dist/Archiving/components/archive-runs-resource.component.d.ts +20 -0
  28. package/dist/Archiving/components/archive-runs-resource.component.d.ts.map +1 -0
  29. package/dist/Archiving/components/archive-runs-resource.component.js +46 -0
  30. package/dist/Archiving/components/archive-runs-resource.component.js.map +1 -0
  31. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  32. package/dist/Credentials/components/credentials-list-resource.component.js +56 -71
  33. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  34. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +0 -8
  35. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
  36. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +73 -74
  37. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  38. package/dist/DashboardBrowser/dashboard-share-adapter.d.ts +25 -0
  39. package/dist/DashboardBrowser/dashboard-share-adapter.d.ts.map +1 -0
  40. package/dist/DashboardBrowser/dashboard-share-adapter.js +99 -0
  41. package/dist/DashboardBrowser/dashboard-share-adapter.js.map +1 -0
  42. package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts +21 -104
  43. package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts.map +1 -1
  44. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +48 -530
  45. package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
  46. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +5 -0
  47. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  48. package/dist/DataExplorer/data-explorer-dashboard.component.js +17 -0
  49. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  50. package/dist/Integration/components/connections/connections.component.d.ts +18 -1
  51. package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
  52. package/dist/Integration/components/connections/connections.component.js +251 -199
  53. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  54. package/dist/Integration/services/integration-data.service.d.ts +7 -2
  55. package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
  56. package/dist/Integration/services/integration-data.service.js +10 -2
  57. package/dist/Integration/services/integration-data.service.js.map +1 -1
  58. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +144 -144
  59. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  60. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  61. package/dist/Lists/components/lists-operations-resource.component.js +12 -14
  62. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  63. package/dist/MCP/components/mcp-connection-dialog.component.js +1 -1
  64. package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
  65. package/dist/MCP/mcp-dashboard.component.d.ts +170 -0
  66. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
  67. package/dist/MCP/mcp-dashboard.component.js +2521 -758
  68. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  69. package/dist/MCP/mcp-filter-panel.component.d.ts +16 -1
  70. package/dist/MCP/mcp-filter-panel.component.d.ts.map +1 -1
  71. package/dist/MCP/mcp-filter-panel.component.js +187 -60
  72. package/dist/MCP/mcp-filter-panel.component.js.map +1 -1
  73. package/dist/MCP/mcp-resource.component.d.ts +0 -9
  74. package/dist/MCP/mcp-resource.component.d.ts.map +1 -1
  75. package/dist/MCP/mcp-resource.component.js +1 -10
  76. package/dist/MCP/mcp-resource.component.js.map +1 -1
  77. package/dist/MCP/mcp.module.d.ts +7 -6
  78. package/dist/MCP/mcp.module.d.ts.map +1 -1
  79. package/dist/MCP/mcp.module.js +4 -8
  80. package/dist/MCP/mcp.module.js.map +1 -1
  81. package/dist/Permissions/audit-log-resource.component.d.ts +38 -0
  82. package/dist/Permissions/audit-log-resource.component.d.ts.map +1 -0
  83. package/dist/Permissions/audit-log-resource.component.js +380 -0
  84. package/dist/Permissions/audit-log-resource.component.js.map +1 -0
  85. package/dist/Permissions/permissions-shared.d.ts +51 -0
  86. package/dist/Permissions/permissions-shared.d.ts.map +1 -0
  87. package/dist/Permissions/permissions-shared.js +91 -0
  88. package/dist/Permissions/permissions-shared.js.map +1 -0
  89. package/dist/Permissions/resource-access-resource.component.d.ts +45 -0
  90. package/dist/Permissions/resource-access-resource.component.d.ts.map +1 -0
  91. package/dist/Permissions/resource-access-resource.component.js +342 -0
  92. package/dist/Permissions/resource-access-resource.component.js.map +1 -0
  93. package/dist/Permissions/user-access-resource.component.d.ts +39 -0
  94. package/dist/Permissions/user-access-resource.component.d.ts.map +1 -0
  95. package/dist/Permissions/user-access-resource.component.js +346 -0
  96. package/dist/Permissions/user-access-resource.component.js.map +1 -0
  97. package/dist/QueryBrowser/query-browser-resource.component.d.ts +13 -3
  98. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  99. package/dist/QueryBrowser/query-browser-resource.component.js +186 -139
  100. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  101. package/dist/archiving-dashboards.module.d.ts +19 -0
  102. package/dist/archiving-dashboards.module.d.ts.map +1 -0
  103. package/dist/archiving-dashboards.module.js +52 -0
  104. package/dist/archiving-dashboards.module.js.map +1 -0
  105. package/dist/component-studio-dashboards.module.d.ts +1 -0
  106. package/dist/component-studio-dashboards.module.d.ts.map +1 -1
  107. package/dist/component-studio-dashboards.module.js +7 -0
  108. package/dist/component-studio-dashboards.module.js.map +1 -1
  109. package/dist/core-dashboards.module.d.ts +24 -19
  110. package/dist/core-dashboards.module.d.ts.map +1 -1
  111. package/dist/core-dashboards.module.js +30 -1
  112. package/dist/core-dashboards.module.js.map +1 -1
  113. package/dist/module.d.ts +13 -12
  114. package/dist/module.d.ts.map +1 -1
  115. package/dist/module.js +7 -0
  116. package/dist/module.js.map +1 -1
  117. package/dist/public-api.d.ts +7 -1
  118. package/dist/public-api.d.ts.map +1 -1
  119. package/dist/public-api.js +8 -0
  120. package/dist/public-api.js.map +1 -1
  121. package/dist/shared/pipes/highlight-search.pipe.d.ts +1 -1
  122. package/dist/shared/pipes/highlight-search.pipe.d.ts.map +1 -1
  123. package/dist/shared/pipes/highlight-search.pipe.js +14 -4
  124. package/dist/shared/pipes/highlight-search.pipe.js.map +1 -1
  125. package/package.json +52 -48
@@ -0,0 +1,39 @@
1
+ import { ChangeDetectorRef, OnDestroy, OnInit } from '@angular/core';
2
+ import { NormalizedPermission, PermissionAction } from '@memberjunction/core';
3
+ import { ResourceData } from '@memberjunction/core-entities';
4
+ import { BaseResourceComponent } from '@memberjunction/ng-shared';
5
+ import { PermissionsDomainGroup, PermissionsUserOption } from './permissions-shared';
6
+ import * as i0 from "@angular/core";
7
+ /**
8
+ * User Access Report resource — one of three tabs in the Permissions admin application.
9
+ * Lets an admin pick any user and see every resource that user has access to across
10
+ * every registered permission domain. Powered by `PermissionEngine.GetAllUserPermissions`.
11
+ */
12
+ export declare class PermissionsUserAccessResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {
13
+ private cdr;
14
+ Users: PermissionsUserOption[];
15
+ SelectedUserId: string | null;
16
+ SelectedUserRoles: string[];
17
+ DomainGroups: PermissionsDomainGroup[];
18
+ IsLoadingUsers: boolean;
19
+ IsLoadingPermissions: boolean;
20
+ ErrorMessage: string | null;
21
+ constructor(cdr: ChangeDetectorRef);
22
+ GetResourceDisplayName(_data: ResourceData): Promise<string>;
23
+ GetResourceIconClass(_data: ResourceData): Promise<string>;
24
+ ngOnInit(): Promise<void>;
25
+ ngOnDestroy(): void;
26
+ loadUsers(): Promise<void>;
27
+ OnUserChanged(userId: string): Promise<void>;
28
+ private loadPermissionsForSelectedUser;
29
+ ToggleGroup(group: PermissionsDomainGroup): void;
30
+ TrackByDomain(_index: number, group: PermissionsDomainGroup): string;
31
+ TrackByPermission(_index: number, row: NormalizedPermission): string;
32
+ ActionsLabel(actions: PermissionAction[]): string;
33
+ get TotalCount(): number;
34
+ static ɵfac: i0.ɵɵFactoryDeclaration<PermissionsUserAccessResourceComponent, never>;
35
+ static ɵcmp: i0.ɵɵComponentDeclaration<PermissionsUserAccessResourceComponent, "mj-permissions-user-access-resource", never, {}, {}, never, never, false, never>;
36
+ }
37
+ /** Tree-shaking prevention — referenced from `public-api.ts`. */
38
+ export declare function LoadPermissionsUserAccessResource(): void;
39
+ //# sourceMappingURL=user-access-resource.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-access-resource.component.d.ts","sourceRoot":"","sources":["../../src/Permissions/user-access-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAa,SAAS,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAY,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,EAAoB,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,OAAO,EACH,sBAAsB,EACtB,qBAAqB,EAIxB,MAAM,sBAAsB,CAAC;;AAE9B;;;;GAIG;AACH,qBAOa,sCAAuC,SAAQ,qBAAsB,YAAW,MAAM,EAAE,SAAS;IAS9F,OAAO,CAAC,GAAG;IARvB,KAAK,EAAE,qBAAqB,EAAE,CAAM;IACpC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;IACrC,iBAAiB,EAAE,MAAM,EAAE,CAAM;IACjC,YAAY,EAAE,sBAAsB,EAAE,CAAM;IAC5C,cAAc,UAAQ;IACtB,oBAAoB,UAAS;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;gBAEf,GAAG,EAAE,iBAAiB;IAI3B,sBAAsB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAI5D,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAI1D,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,WAAW,IAAI,IAAI;IAItB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB1B,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAKpC,8BAA8B;IA+B5C,WAAW,CAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI;IAKhD,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,sBAAsB,GAAG,MAAM;IAIpE,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,oBAAoB,GAAG,MAAM;IAIpE,YAAY,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM;IAIjD,IAAI,UAAU,IAAI,MAAM,CAEvB;yCAvGQ,sCAAsC;2CAAtC,sCAAsC;CAwGlD;AAED,iEAAiE;AACjE,wBAAgB,iCAAiC,IAAI,IAAI,CAExD"}
@@ -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"]}
@@ -1,7 +1,8 @@
1
1
  import { OnInit, OnDestroy, ChangeDetectorRef, ElementRef, NgZone } from '@angular/core';
2
2
  import { Subject } from 'rxjs';
3
3
  import { BaseResourceComponent } from '@memberjunction/ng-shared';
4
- import { QueryInfo, QueryCategoryInfo } from '@memberjunction/core';
4
+ import { QueryInfo, QueryCategoryInfo, CompositeKey } from '@memberjunction/core';
5
+ import { TreeBranchConfig } from '@memberjunction/ng-trees';
5
6
  import { ResourceData } from '@memberjunction/core-entities';
6
7
  import { QueryEntityLinkClickEvent, QueryRowClickEvent } from '@memberjunction/ng-query-viewer';
7
8
  import { CompositionTokenClickEvent } from '@memberjunction/ng-code-editor';
@@ -65,12 +66,19 @@ export declare class QueryBrowserResourceComponent extends BaseResourceComponent
65
66
  DrawerDescription: string;
66
67
  DrawerCategoryID: string;
67
68
  DrawerStatus: 'Pending' | 'Approved' | 'Rejected' | 'Expired';
69
+ DrawerReusable: boolean;
68
70
  IsSavingDrawer: boolean;
69
71
  DrawerNameError: boolean;
70
72
  DrawerSaveError: string | null;
71
73
  /** Ordered status options for the drawer dropdown — all valid Query statuses */
72
74
  readonly DrawerStatuses: Array<'Pending' | 'Approved' | 'Rejected' | 'Expired'>;
73
75
  private initialDrawerSnapshot;
76
+ /** The category ID of the most recently interacted-with folder in the tree */
77
+ private activeCategoryID;
78
+ /** Tree dropdown config for Query Categories (branches only, no leaves) */
79
+ CategoryBranchConfig: TreeBranchConfig;
80
+ /** The DrawerCategoryID as a CompositeKey for the tree dropdown binding */
81
+ get DrawerCategoryIDAsKey(): CompositeKey | null;
74
82
  constructor(cdr: ChangeDetectorRef, elementRef: ElementRef, zone: NgZone);
75
83
  ngOnInit(): void;
76
84
  ngOnDestroy(): void;
@@ -126,8 +134,8 @@ export declare class QueryBrowserResourceComponent extends BaseResourceComponent
126
134
  get CanEditQuery(): boolean;
127
135
  /** Close the drawer when Escape is pressed (if open). */
128
136
  OnEscapeKey(): void;
129
- /** Open the drawer in create mode. */
130
- OpenCreateDrawer(): void;
137
+ /** Open the drawer in create mode, optionally pre-selecting a category. */
138
+ OpenCreateDrawer(categoryID?: string): void;
131
139
  /**
132
140
  * Open the drawer in edit mode, pre-populated from a QueryInfo.
133
141
  * Stops event propagation so clicking the edit icon doesn't also select the query.
@@ -141,6 +149,8 @@ export declare class QueryBrowserResourceComponent extends BaseResourceComponent
141
149
  OnDrawerBackdropClick(): void;
142
150
  /** Update DrawerSQL when the code editor emits a change. */
143
151
  OnDrawerSQLChange(value: string): void;
152
+ /** Update DrawerCategoryID when the tree dropdown selection changes. */
153
+ OnDrawerCategoryChange(value: CompositeKey | CompositeKey[] | null): void;
144
154
  private get currentDrawerSnapshot();
145
155
  private captureDrawerSnapshot;
146
156
  get IsDrawerDirty(): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"query-browser-resource.component.d.ts","sourceRoot":"","sources":["../../src/QueryBrowser/query-browser-resource.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query-browser-resource.component.d.ts","sourceRoot":"","sources":["../../src/QueryBrowser/query-browser-resource.component.ts"],"names":[],"mappings":"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"}