@nu-art/permissions-frontend 0.401.9 → 0.500.6
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/_entity/access-group/ModuleFE_AccessGroup.d.ts +12 -0
- package/_entity/access-group/ModuleFE_AccessGroup.js +15 -0
- package/_entity/access-group/module-pack.d.ts +1 -0
- package/_entity/access-group/module-pack.js +2 -0
- package/_entity/permission-scope/ModuleFE_PermissionScope.d.ts +12 -0
- package/_entity/permission-scope/ModuleFE_PermissionScope.js +15 -0
- package/_entity/permission-scope/module-pack.d.ts +1 -0
- package/_entity/permission-scope/module-pack.js +2 -0
- package/_entity/user-permissions/ModuleFE_UserPermissions.d.ts +16 -0
- package/_entity/user-permissions/ModuleFE_UserPermissions.js +83 -0
- package/_entity/user-permissions/module-pack.d.ts +1 -0
- package/_entity/user-permissions/module-pack.js +2 -0
- package/consts.d.ts +1 -2
- package/consts.js +0 -1
- package/core/module-pack.js +6 -7
- package/index.d.ts +13 -3
- package/index.js +13 -3
- package/modules/ModuleFE_PermissionsAssert.d.ts +4 -27
- package/modules/ModuleFE_PermissionsAssert.js +12 -58
- package/package.json +22 -12
- package/ui/Page_Permissions/Page_Permissions.d.ts +2 -0
- package/ui/Page_Permissions/Page_Permissions.js +186 -0
- package/ui/Page_Permissions/Page_Permissions.scss +217 -0
- package/ui/Page_Permissions/route.d.ts +2 -0
- package/ui/Page_Permissions/route.js +6 -0
- package/ui/PermissionGuard.d.ts +19 -0
- package/ui/PermissionGuard.js +16 -0
- package/ui/scope-editor/Component_ScopeLabels.d.ts +6 -0
- package/ui/scope-editor/Component_ScopeLabels.js +12 -0
- package/ui/scope-editor/Component_ScopeMultiSelect.d.ts +26 -0
- package/ui/scope-editor/Component_ScopeMultiSelect.js +109 -0
- package/ui/scope-editor/Component_ScopeMultiSelect.scss +151 -0
- package/ui/scope-editor/scope-utils.d.ts +7 -0
- package/ui/scope-editor/scope-utils.js +38 -0
- package/PermissionKey_FE.d.ts +0 -24
- package/PermissionKey_FE.js +0 -23
- package/_entity/permission-access-level/ModuleFE_PermissionAccessLevel.d.ts +0 -11
- package/_entity/permission-access-level/ModuleFE_PermissionAccessLevel.js +0 -12
- package/_entity/permission-access-level/index.d.ts +0 -2
- package/_entity/permission-access-level/index.js +0 -2
- package/_entity/permission-access-level/module-pack.d.ts +0 -1
- package/_entity/permission-access-level/module-pack.js +0 -2
- package/_entity/permission-access-level/shared.d.ts +0 -1
- package/_entity/permission-access-level/shared.js +0 -1
- package/_entity/permission-access-level/ui-components.d.ts +0 -37
- package/_entity/permission-access-level/ui-components.js +0 -21
- package/_entity/permission-api/ModuleFE_PermissionAPI.d.ts +0 -11
- package/_entity/permission-api/ModuleFE_PermissionAPI.js +0 -12
- package/_entity/permission-api/index.d.ts +0 -2
- package/_entity/permission-api/index.js +0 -2
- package/_entity/permission-api/module-pack.d.ts +0 -1
- package/_entity/permission-api/module-pack.js +0 -2
- package/_entity/permission-api/shared.d.ts +0 -1
- package/_entity/permission-api/shared.js +0 -1
- package/_entity/permission-api/ui-components.d.ts +0 -37
- package/_entity/permission-api/ui-components.js +0 -21
- package/_entity/permission-domain/ModuleFE_PermissionDomain.d.ts +0 -9
- package/_entity/permission-domain/ModuleFE_PermissionDomain.js +0 -10
- package/_entity/permission-domain/index.d.ts +0 -2
- package/_entity/permission-domain/index.js +0 -2
- package/_entity/permission-domain/module-pack.d.ts +0 -1
- package/_entity/permission-domain/module-pack.js +0 -2
- package/_entity/permission-domain/shared.d.ts +0 -1
- package/_entity/permission-domain/shared.js +0 -1
- package/_entity/permission-domain/ui-components.d.ts +0 -37
- package/_entity/permission-domain/ui-components.js +0 -21
- package/_entity/permission-group/ModuleFE_PermissionGroup.d.ts +0 -11
- package/_entity/permission-group/ModuleFE_PermissionGroup.js +0 -12
- package/_entity/permission-group/index.d.ts +0 -2
- package/_entity/permission-group/index.js +0 -2
- package/_entity/permission-group/module-pack.d.ts +0 -1
- package/_entity/permission-group/module-pack.js +0 -2
- package/_entity/permission-group/shared.d.ts +0 -1
- package/_entity/permission-group/shared.js +0 -1
- package/_entity/permission-group/ui-components.d.ts +0 -37
- package/_entity/permission-group/ui-components.js +0 -21
- package/_entity/permission-project/ModuleFE_PermissionProject.d.ts +0 -11
- package/_entity/permission-project/ModuleFE_PermissionProject.js +0 -12
- package/_entity/permission-project/index.d.ts +0 -2
- package/_entity/permission-project/index.js +0 -2
- package/_entity/permission-project/module-pack.d.ts +0 -1
- package/_entity/permission-project/module-pack.js +0 -2
- package/_entity/permission-project/shared.d.ts +0 -1
- package/_entity/permission-project/shared.js +0 -1
- package/_entity/permission-project/ui-components.d.ts +0 -37
- package/_entity/permission-project/ui-components.js +0 -21
- package/_entity/permission-user/ModuleFE_PermissionUser.d.ts +0 -11
- package/_entity/permission-user/ModuleFE_PermissionUser.js +0 -14
- package/_entity/permission-user/index.d.ts +0 -2
- package/_entity/permission-user/index.js +0 -2
- package/_entity/permission-user/module-pack.d.ts +0 -1
- package/_entity/permission-user/module-pack.js +0 -2
- package/_entity/permission-user/shared.d.ts +0 -1
- package/_entity/permission-user/shared.js +0 -1
- package/_entity/permission-user/ui-components.d.ts +0 -37
- package/_entity/permission-user/ui-components.js +0 -36
- package/_entity.d.ts +0 -12
- package/_entity.js +0 -18
- package/core/permission-keys.d.ts +0 -5
- package/core/permission-keys.js +0 -6
- package/shared.d.ts +0 -1
- package/shared.js +0 -19
- package/ui/ATS_ComponentPermissionKeys/ATS_ComponentPermissionKeys.d.ts +0 -11
- package/ui/ATS_ComponentPermissionKeys/ATS_ComponentPermissionKeys.js +0 -22
- package/ui/ATS_ComponentPermissionKeys/permission-keys-editor.scss +0 -153
- package/ui/ATS_ComponentPermissionKeys/subEditors/Component_AccessLevelsEditor.d.ts +0 -16
- package/ui/ATS_ComponentPermissionKeys/subEditors/Component_AccessLevelsEditor.js +0 -38
- package/ui/ATS_ComponentPermissionKeys/subEditors/permission-keys-editor.d.ts +0 -16
- package/ui/ATS_ComponentPermissionKeys/subEditors/permission-keys-editor.js +0 -33
- package/ui/ATS_Permissions/ATS_Permissions.d.ts +0 -8
- package/ui/ATS_Permissions/ATS_Permissions.js +0 -63
- package/ui/ATS_Permissions/ATS_Permissions.scss +0 -172
- package/ui/Component_SwitchView.d.ts +0 -23
- package/ui/Component_SwitchView.js +0 -32
- package/ui/Component_SwitchViewV2.d.ts +0 -21
- package/ui/Component_SwitchViewV2.js +0 -25
- package/ui/PermissionsComponent.d.ts +0 -21
- package/ui/PermissionsComponent.js +0 -42
- package/ui/PermissionsEditableComponent.d.ts +0 -18
- package/ui/PermissionsEditableComponent.js +0 -21
- package/ui/Renderer_RoleNames.d.ts +0 -1
- package/ui/Renderer_RoleNames.js +0 -7
- package/ui/index.d.ts +0 -8
- package/ui/index.js +0 -8
- package/ui/permission-editors/components.d.ts +0 -6
- package/ui/permission-editors/components.js +0 -9
- package/ui/permission-editors/editor-base.d.ts +0 -18
- package/ui/permission-editors/editor-base.js +0 -17
- package/ui/permission-editors/editor-base.scss +0 -298
- package/ui/permission-editors/permission-api-edior/permission-api-editor.d.ts +0 -16
- package/ui/permission-editors/permission-api-edior/permission-api-editor.js +0 -63
- package/ui/permission-editors/permission-api-edior/permission-api-editor.scss +0 -7
- package/ui/permission-editors/permission-domains-editor.d.ts +0 -9
- package/ui/permission-editors/permission-domains-editor.js +0 -139
- package/ui/permission-editors/permission-groups-editor.d.ts +0 -9
- package/ui/permission-editors/permission-groups-editor.js +0 -80
- package/ui/permission-editors/permission-project-editor/permission-project-editor.scss +0 -10
- package/ui/permission-editors/permission-project-editor/permission-projects-editor.d.ts +0 -10
- package/ui/permission-editors/permission-project-editor/permission-projects-editor.js +0 -52
- package/ui/permission-editors/permission-users-editor.d.ts +0 -9
- package/ui/permission-editors/permission-users-editor.js +0 -70
- package/ui/ui-props.d.ts +0 -16
- package/ui/ui-props.js +0 -62
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ModuleFE_BaseApi } from '@nu-art/db-api-frontend';
|
|
2
|
+
import { ApiCallerEventType } from '@nu-art/db-api-shared';
|
|
3
|
+
import { ThunderDispatcher } from '@nu-art/thunder-core';
|
|
4
|
+
import { DatabaseDef_AccessGroup } from '@nu-art/permissions-shared';
|
|
5
|
+
export interface OnAccessGroupUpdated {
|
|
6
|
+
__onAccessGroupUpdated: (...params: ApiCallerEventType<DatabaseDef_AccessGroup['dbType']>) => void;
|
|
7
|
+
}
|
|
8
|
+
export declare const dispatch_onAccessGroupChanged: ThunderDispatcher<OnAccessGroupUpdated, "__onAccessGroupUpdated", ApiCallerEventType<import("@nu-art/permissions-shared").DB_AccessGroup>, void>;
|
|
9
|
+
export declare class ModuleFE_AccessGroup_Class extends ModuleFE_BaseApi<DatabaseDef_AccessGroup> {
|
|
10
|
+
constructor();
|
|
11
|
+
}
|
|
12
|
+
export declare const ModuleFE_AccessGroup: ModuleFE_AccessGroup_Class;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ModuleFE_BaseApi, buildConfigFromDBDef } from '@nu-art/db-api-frontend';
|
|
2
|
+
import { CrudApiDef } from '@nu-art/db-api-shared';
|
|
3
|
+
import { ThunderDispatcher } from '@nu-art/thunder-core';
|
|
4
|
+
import { DBDef_AccessGroup } from '@nu-art/permissions-shared';
|
|
5
|
+
export const dispatch_onAccessGroupChanged = new ThunderDispatcher('__onAccessGroupUpdated');
|
|
6
|
+
export class ModuleFE_AccessGroup_Class extends ModuleFE_BaseApi {
|
|
7
|
+
constructor() {
|
|
8
|
+
super({
|
|
9
|
+
config: buildConfigFromDBDef(DBDef_AccessGroup),
|
|
10
|
+
crudApiDef: CrudApiDef(DBDef_AccessGroup.dbKey),
|
|
11
|
+
dispatcher: (...args) => dispatch_onAccessGroupChanged.dispatchAll(...args)
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export const ModuleFE_AccessGroup = new ModuleFE_AccessGroup_Class();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const ModulePackFE_AccessGroup: import("./ModuleFE_AccessGroup.js").ModuleFE_AccessGroup_Class[];
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ModuleFE_BaseApi } from '@nu-art/db-api-frontend';
|
|
2
|
+
import { ApiCallerEventType } from '@nu-art/db-api-shared';
|
|
3
|
+
import { ThunderDispatcher } from '@nu-art/thunder-core';
|
|
4
|
+
import { DatabaseDef_PermissionScope } from '@nu-art/permissions-shared';
|
|
5
|
+
export interface OnPermissionScopeUpdated {
|
|
6
|
+
__onPermissionScopeUpdated: (...params: ApiCallerEventType<DatabaseDef_PermissionScope['dbType']>) => void;
|
|
7
|
+
}
|
|
8
|
+
export declare const dispatch_onPermissionScopeChanged: ThunderDispatcher<OnPermissionScopeUpdated, "__onPermissionScopeUpdated", ApiCallerEventType<import("@nu-art/permissions-shared").DB_PermissionScope>, void>;
|
|
9
|
+
export declare class ModuleFE_PermissionScope_Class extends ModuleFE_BaseApi<DatabaseDef_PermissionScope> {
|
|
10
|
+
constructor();
|
|
11
|
+
}
|
|
12
|
+
export declare const ModuleFE_PermissionScope: ModuleFE_PermissionScope_Class;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ModuleFE_BaseApi, buildConfigFromDBDef } from '@nu-art/db-api-frontend';
|
|
2
|
+
import { CrudApiDef } from '@nu-art/db-api-shared';
|
|
3
|
+
import { ThunderDispatcher } from '@nu-art/thunder-core';
|
|
4
|
+
import { DBDef_PermissionScope } from '@nu-art/permissions-shared';
|
|
5
|
+
export const dispatch_onPermissionScopeChanged = new ThunderDispatcher('__onPermissionScopeUpdated');
|
|
6
|
+
export class ModuleFE_PermissionScope_Class extends ModuleFE_BaseApi {
|
|
7
|
+
constructor() {
|
|
8
|
+
super({
|
|
9
|
+
config: buildConfigFromDBDef(DBDef_PermissionScope),
|
|
10
|
+
crudApiDef: CrudApiDef(DBDef_PermissionScope.dbKey),
|
|
11
|
+
dispatcher: (...args) => dispatch_onPermissionScopeChanged.dispatchAll(...args)
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export const ModuleFE_PermissionScope = new ModuleFE_PermissionScope_Class();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const ModulePackFE_PermissionScope: import("./ModuleFE_PermissionScope.js").ModuleFE_PermissionScope_Class[];
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ModuleFE_BaseApi } from '@nu-art/db-api-frontend';
|
|
2
|
+
import { ApiCallerEventType } from '@nu-art/db-api-shared';
|
|
3
|
+
import { ThunderDispatcher } from '@nu-art/thunder-core';
|
|
4
|
+
import { API_UserPermissions, DatabaseDef_UserPermissions, Response_MyPermissions } from '@nu-art/permissions-shared';
|
|
5
|
+
export interface OnUserPermissionsUpdated {
|
|
6
|
+
__onUserPermissionsUpdated: (...params: ApiCallerEventType<DatabaseDef_UserPermissions['dbType']>) => void;
|
|
7
|
+
}
|
|
8
|
+
export declare const dispatch_onUserPermissionsChanged: ThunderDispatcher<OnUserPermissionsUpdated, "__onUserPermissionsUpdated", ApiCallerEventType<import("@nu-art/permissions-shared").DB_UserPermissions>, void>;
|
|
9
|
+
export declare class ModuleFE_UserPermissions_Class extends ModuleFE_BaseApi<DatabaseDef_UserPermissions> {
|
|
10
|
+
private myPermissions;
|
|
11
|
+
constructor();
|
|
12
|
+
fetchMyPermissions(_params?: API_UserPermissions['getMyPermissions']['Params']): Promise<Response_MyPermissions>;
|
|
13
|
+
private onMyPermissionsFetched;
|
|
14
|
+
getScopeEntries(): string[];
|
|
15
|
+
}
|
|
16
|
+
export declare const ModuleFE_UserPermissions: ModuleFE_UserPermissions_Class;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
2
|
+
var useValue = arguments.length > 2;
|
|
3
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
4
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
5
|
+
}
|
|
6
|
+
return useValue ? value : void 0;
|
|
7
|
+
};
|
|
8
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
9
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
10
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
11
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
12
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
13
|
+
var _, done = false;
|
|
14
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
15
|
+
var context = {};
|
|
16
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
17
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
18
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
19
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
20
|
+
if (kind === "accessor") {
|
|
21
|
+
if (result === void 0) continue;
|
|
22
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
23
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
24
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
25
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
26
|
+
}
|
|
27
|
+
else if (_ = accept(result)) {
|
|
28
|
+
if (kind === "field") initializers.unshift(_);
|
|
29
|
+
else descriptor[key] = _;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
33
|
+
done = true;
|
|
34
|
+
};
|
|
35
|
+
import { buildConfigFromDBDef, ModuleFE_BaseApi } from '@nu-art/db-api-frontend';
|
|
36
|
+
import { CrudApiDef, stringToUniqueId } from '@nu-art/db-api-shared';
|
|
37
|
+
import { ApiCaller } from '@nu-art/http-client';
|
|
38
|
+
import { ThunderDispatcher } from '@nu-art/thunder-core';
|
|
39
|
+
import { ApiDef_UserPermissions, DBDef_UserPermissions, } from '@nu-art/permissions-shared';
|
|
40
|
+
import { SessionKeyFE_Account } from '@nu-art/user-account-frontend';
|
|
41
|
+
export const dispatch_onUserPermissionsChanged = new ThunderDispatcher('__onUserPermissionsUpdated');
|
|
42
|
+
let ModuleFE_UserPermissions_Class = (() => {
|
|
43
|
+
let _classSuper = ModuleFE_BaseApi;
|
|
44
|
+
let _instanceExtraInitializers = [];
|
|
45
|
+
let _fetchMyPermissions_decorators;
|
|
46
|
+
return class ModuleFE_UserPermissions_Class extends _classSuper {
|
|
47
|
+
static {
|
|
48
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
49
|
+
_fetchMyPermissions_decorators = [ApiCaller(ApiDef_UserPermissions.getMyPermissions, {
|
|
50
|
+
onComplete: (m, ctx) => m.onMyPermissionsFetched(ctx.response),
|
|
51
|
+
})];
|
|
52
|
+
__esDecorate(this, null, _fetchMyPermissions_decorators, { kind: "method", name: "fetchMyPermissions", static: false, private: false, access: { has: obj => "fetchMyPermissions" in obj, get: obj => obj.fetchMyPermissions }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
53
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
54
|
+
}
|
|
55
|
+
myPermissions = (__runInitializers(this, _instanceExtraInitializers), []);
|
|
56
|
+
constructor() {
|
|
57
|
+
super({
|
|
58
|
+
config: buildConfigFromDBDef(DBDef_UserPermissions),
|
|
59
|
+
crudApiDef: CrudApiDef(DBDef_UserPermissions.dbKey),
|
|
60
|
+
dispatcher: (...args) => dispatch_onUserPermissionsChanged.dispatchAll(...args),
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
async fetchMyPermissions(_params) {
|
|
64
|
+
void _params;
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
onMyPermissionsFetched(response) {
|
|
68
|
+
this.myPermissions = response.scopeEntries;
|
|
69
|
+
}
|
|
70
|
+
getScopeEntries() {
|
|
71
|
+
const account = SessionKeyFE_Account.get();
|
|
72
|
+
if (!account)
|
|
73
|
+
return this.myPermissions;
|
|
74
|
+
const entityId = stringToUniqueId(account._id);
|
|
75
|
+
const cached = this.cache.unique(entityId);
|
|
76
|
+
if (cached)
|
|
77
|
+
return cached.scopeEntries;
|
|
78
|
+
return this.myPermissions;
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
})();
|
|
82
|
+
export { ModuleFE_UserPermissions_Class };
|
|
83
|
+
export const ModuleFE_UserPermissions = new ModuleFE_UserPermissions_Class();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const ModulePackFE_UserPermissions: import("./ModuleFE_UserPermissions.js").ModuleFE_UserPermissions_Class[];
|
package/consts.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { SessionData_StrictMode } from '@nu-art/permissions-shared';
|
|
2
2
|
import { SessionKey_FE } from '@nu-art/user-account-frontend';
|
|
3
|
-
export declare const SessionKey_Permissions_FE: SessionKey_FE<SessionData_Permissions>;
|
|
4
3
|
export declare const SessionKey_StrictMode_FE: SessionKey_FE<SessionData_StrictMode>;
|
package/consts.js
CHANGED
package/core/module-pack.js
CHANGED
|
@@ -17,13 +17,12 @@
|
|
|
17
17
|
* limitations under the License.
|
|
18
18
|
*/
|
|
19
19
|
import { ModuleFE_PermissionsAssert } from '../modules/ModuleFE_PermissionsAssert.js';
|
|
20
|
-
import {
|
|
20
|
+
import { ModulePackFE_PermissionScope } from '../_entity/permission-scope/module-pack.js';
|
|
21
|
+
import { ModulePackFE_UserPermissions } from '../_entity/user-permissions/module-pack.js';
|
|
22
|
+
import { ModulePackFE_AccessGroup } from '../_entity/access-group/module-pack.js';
|
|
21
23
|
export const ModulePackFE_Permissions = [
|
|
22
24
|
ModuleFE_PermissionsAssert,
|
|
23
|
-
...
|
|
24
|
-
...
|
|
25
|
-
...
|
|
26
|
-
...ModulePackFE_PermissionDomain,
|
|
27
|
-
...ModulePackFE_PermissionGroup,
|
|
28
|
-
...ModulePackFE_PermissionUser,
|
|
25
|
+
...ModulePackFE_PermissionScope,
|
|
26
|
+
...ModulePackFE_UserPermissions,
|
|
27
|
+
...ModulePackFE_AccessGroup,
|
|
29
28
|
];
|
package/index.d.ts
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
|
-
export * from './PermissionKey_FE.js';
|
|
2
1
|
export * from './core/module-pack.js';
|
|
3
|
-
export * from './ui/
|
|
2
|
+
export * from './ui/Page_Permissions/Page_Permissions.js';
|
|
3
|
+
export * from './ui/Page_Permissions/route.js';
|
|
4
|
+
export * from './ui/scope-editor/Component_ScopeLabels.js';
|
|
5
|
+
export * from './ui/scope-editor/Component_ScopeMultiSelect.js';
|
|
6
|
+
export * from './ui/scope-editor/scope-utils.js';
|
|
7
|
+
export * from './ui/PermissionGuard.js';
|
|
4
8
|
export * from './consts.js';
|
|
5
|
-
export * from './_entity.js';
|
|
9
|
+
export * from './_entity/permission-scope/ModuleFE_PermissionScope.js';
|
|
10
|
+
export * from './_entity/permission-scope/module-pack.js';
|
|
11
|
+
export * from './_entity/user-permissions/ModuleFE_UserPermissions.js';
|
|
12
|
+
export * from './_entity/user-permissions/module-pack.js';
|
|
13
|
+
export * from './_entity/access-group/ModuleFE_AccessGroup.js';
|
|
14
|
+
export * from './_entity/access-group/module-pack.js';
|
|
15
|
+
export * from './modules/ModuleFE_PermissionsAssert.js';
|
package/index.js
CHANGED
|
@@ -16,8 +16,18 @@
|
|
|
16
16
|
* See the License for the specific language governing permissions and
|
|
17
17
|
* limitations under the License.
|
|
18
18
|
*/
|
|
19
|
-
export * from './PermissionKey_FE.js';
|
|
20
19
|
export * from './core/module-pack.js';
|
|
21
|
-
export * from './ui/
|
|
20
|
+
export * from './ui/Page_Permissions/Page_Permissions.js';
|
|
21
|
+
export * from './ui/Page_Permissions/route.js';
|
|
22
|
+
export * from './ui/scope-editor/Component_ScopeLabels.js';
|
|
23
|
+
export * from './ui/scope-editor/Component_ScopeMultiSelect.js';
|
|
24
|
+
export * from './ui/scope-editor/scope-utils.js';
|
|
25
|
+
export * from './ui/PermissionGuard.js';
|
|
22
26
|
export * from './consts.js';
|
|
23
|
-
export * from './_entity.js';
|
|
27
|
+
export * from './_entity/permission-scope/ModuleFE_PermissionScope.js';
|
|
28
|
+
export * from './_entity/permission-scope/module-pack.js';
|
|
29
|
+
export * from './_entity/user-permissions/ModuleFE_UserPermissions.js';
|
|
30
|
+
export * from './_entity/user-permissions/module-pack.js';
|
|
31
|
+
export * from './_entity/access-group/ModuleFE_AccessGroup.js';
|
|
32
|
+
export * from './_entity/access-group/module-pack.js';
|
|
33
|
+
export * from './modules/ModuleFE_PermissionsAssert.js';
|
|
@@ -1,32 +1,9 @@
|
|
|
1
|
-
import { Module
|
|
2
|
-
import {
|
|
3
|
-
export type PermissionsModuleFEConfig = {
|
|
4
|
-
projectId: string;
|
|
5
|
-
};
|
|
1
|
+
import { Module } from '@nu-art/ts-common';
|
|
2
|
+
import type { PermissionScope } from '@nu-art/permissions-shared';
|
|
6
3
|
export interface OnPermissionsChanged {
|
|
7
4
|
__onPermissionsChanged: () => void;
|
|
8
5
|
}
|
|
9
|
-
export
|
|
10
|
-
|
|
11
|
-
}
|
|
12
|
-
export declare enum AccessLevel {
|
|
13
|
-
Undefined = 0,
|
|
14
|
-
NoAccessLevelsDefined = 1,
|
|
15
|
-
NoAccess = 2,
|
|
16
|
-
HasAccess = 3
|
|
17
|
-
}
|
|
18
|
-
export declare class ModuleFE_PermissionsAssert_Class extends Module<PermissionsModuleFEConfig> {
|
|
19
|
-
permissionKeys: TypedMap<PermissionKey_FE<any>>;
|
|
20
|
-
readonly v1: {
|
|
21
|
-
toggleStrictMode: (params: import("@nu-art/thunderstorm-shared").QueryParams) => import("@nu-art/thunderstorm-shared").BaseHttpRequest<import("@nu-art/thunderstorm-shared").QueryApi<void>>;
|
|
22
|
-
createProject: (params: import("@nu-art/thunderstorm-shared").QueryParams) => import("@nu-art/thunderstorm-shared").BaseHttpRequest<import("@nu-art/thunderstorm-shared").QueryApi<void>>;
|
|
23
|
-
};
|
|
24
|
-
constructor();
|
|
25
|
-
protected init(): void;
|
|
26
|
-
getAccessLevelByKeyString(key: string): AccessLevel;
|
|
27
|
-
getAccessLevel(key: PermissionKey_FE): AccessLevel;
|
|
28
|
-
getPermissionKey(key: string): PermissionKey_FE;
|
|
29
|
-
registerPermissionKey(key: PermissionKey_FE): void;
|
|
30
|
-
getAllPermissionKeys(): TypedMap<PermissionKey_FE<any>>;
|
|
6
|
+
export declare class ModuleFE_PermissionsAssert_Class extends Module {
|
|
7
|
+
hasScopeAccess(scope: PermissionScope, requiredValue: string): boolean;
|
|
31
8
|
}
|
|
32
9
|
export declare const ModuleFE_PermissionsAssert: ModuleFE_PermissionsAssert_Class;
|
|
@@ -16,65 +16,19 @@
|
|
|
16
16
|
* See the License for the specific language governing permissions and
|
|
17
17
|
* limitations under the License.
|
|
18
18
|
*/
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import { SessionKey_Permissions_FE, SessionKey_StrictMode_FE } from '../consts.js';
|
|
22
|
-
import { RendererKey_AccountMenu_SubHeader } from '@nu-art/user-account-frontend/consts';
|
|
23
|
-
import { Renderer_RoleNames } from '../ui/Renderer_RoleNames.js';
|
|
24
|
-
import { ApiDef_Permissions } from '@nu-art/permissions-shared';
|
|
25
|
-
// const dispatch_onPermissionsChanged = new ThunderDispatcher<OnPermissionsChanged, '__onPermissionsChanged'>('__onPermissionsChanged');
|
|
26
|
-
// const dispatch_onPermissionsFailed = new ThunderDispatcher<OnPermissionsFailed, '__onPermissionsFailed'>('__onPermissionsFailed');
|
|
27
|
-
export var AccessLevel;
|
|
28
|
-
(function (AccessLevel) {
|
|
29
|
-
AccessLevel[AccessLevel["Undefined"] = 0] = "Undefined";
|
|
30
|
-
AccessLevel[AccessLevel["NoAccessLevelsDefined"] = 1] = "NoAccessLevelsDefined";
|
|
31
|
-
AccessLevel[AccessLevel["NoAccess"] = 2] = "NoAccess";
|
|
32
|
-
AccessLevel[AccessLevel["HasAccess"] = 3] = "HasAccess";
|
|
33
|
-
})(AccessLevel || (AccessLevel = {}));
|
|
19
|
+
import { Module } from '@nu-art/ts-common';
|
|
20
|
+
import { ModuleFE_UserPermissions } from '../_entity/user-permissions/ModuleFE_UserPermissions.js';
|
|
34
21
|
export class ModuleFE_PermissionsAssert_Class extends Module {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
super.init();
|
|
46
|
-
ModuleFE_Utils.registerRenderer(RendererKey_AccountMenu_SubHeader, Renderer_RoleNames);
|
|
47
|
-
}
|
|
48
|
-
getAccessLevelByKeyString(key) {
|
|
49
|
-
return this.getAccessLevel(this.getPermissionKey(key));
|
|
50
|
-
}
|
|
51
|
-
getAccessLevel(key) {
|
|
52
|
-
const keyData = key.get();
|
|
53
|
-
if (!exists(keyData))
|
|
54
|
-
return SessionKey_StrictMode_FE.get() ? AccessLevel.Undefined : AccessLevel.HasAccess;
|
|
55
|
-
if (keyData.accessLevelIds.length === 0)
|
|
56
|
-
return AccessLevel.NoAccessLevelsDefined;
|
|
57
|
-
const userAccessLevels = SessionKey_Permissions_FE.get().domainToValueMap;
|
|
58
|
-
try {
|
|
59
|
-
const canAccess = _keys(keyData._accessLevels).reduce((hasAccess, domainId) => {
|
|
60
|
-
return hasAccess && userAccessLevels[domainId] >= keyData._accessLevels[domainId];
|
|
61
|
-
}, true);
|
|
62
|
-
return canAccess ? AccessLevel.HasAccess : AccessLevel.NoAccess;
|
|
63
|
-
}
|
|
64
|
-
catch (e) {
|
|
65
|
-
return AccessLevel.NoAccess;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
getPermissionKey(key) {
|
|
69
|
-
return this.permissionKeys[key];
|
|
70
|
-
}
|
|
71
|
-
registerPermissionKey(key) {
|
|
72
|
-
if (this.permissionKeys[key.key])
|
|
73
|
-
throw new BadImplementationException(`Registered PermissionKey '${key}' more than once!`);
|
|
74
|
-
this.permissionKeys[key.key] = key;
|
|
75
|
-
}
|
|
76
|
-
getAllPermissionKeys() {
|
|
77
|
-
return this.permissionKeys;
|
|
22
|
+
hasScopeAccess(scope, requiredValue) {
|
|
23
|
+
const scopeEntries = ModuleFE_UserPermissions.getScopeEntries();
|
|
24
|
+
const prefix = scope.key + ':';
|
|
25
|
+
const entry = scopeEntries.find(p => p.startsWith(prefix));
|
|
26
|
+
if (!entry)
|
|
27
|
+
return false;
|
|
28
|
+
const userValue = entry.substring(prefix.length);
|
|
29
|
+
const requiredIdx = scope.values.indexOf(requiredValue);
|
|
30
|
+
const userIdx = scope.values.indexOf(userValue);
|
|
31
|
+
return userIdx >= requiredIdx;
|
|
78
32
|
}
|
|
79
33
|
}
|
|
80
34
|
export const ModuleFE_PermissionsAssert = new ModuleFE_PermissionsAssert_Class();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nu-art/permissions-frontend",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.500.6",
|
|
4
4
|
"description": "Permissions Frontend",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"TacB0sS",
|
|
@@ -11,7 +11,6 @@
|
|
|
11
11
|
"nu-art",
|
|
12
12
|
"permissions",
|
|
13
13
|
"saml",
|
|
14
|
-
"thunderstorm",
|
|
15
14
|
"typescript",
|
|
16
15
|
"user-account"
|
|
17
16
|
],
|
|
@@ -35,15 +34,24 @@
|
|
|
35
34
|
"test": "ts-mocha -w -p src/test/tsconfig.json --timeout 0 --inspect=8107 --watch-files '**/*.ts' src/test/__all-tests.ts"
|
|
36
35
|
},
|
|
37
36
|
"dependencies": {
|
|
38
|
-
"@nu-art/
|
|
39
|
-
"@nu-art/
|
|
40
|
-
"@nu-art/
|
|
41
|
-
"@nu-art/
|
|
42
|
-
"@nu-art/
|
|
43
|
-
"@nu-art/
|
|
44
|
-
"@nu-art/
|
|
45
|
-
"@nu-art/
|
|
46
|
-
"@nu-art/
|
|
37
|
+
"@nu-art/app-config-frontend": "0.500.6",
|
|
38
|
+
"@nu-art/db-api-frontend": "0.500.6",
|
|
39
|
+
"@nu-art/sync-manager-frontend": "0.500.6",
|
|
40
|
+
"@nu-art/db-api-shared": "0.500.6",
|
|
41
|
+
"@nu-art/permissions-shared": "0.500.6",
|
|
42
|
+
"@nu-art/firebase-frontend": "0.500.6",
|
|
43
|
+
"@nu-art/firebase-shared": "0.500.6",
|
|
44
|
+
"@nu-art/thunder-core": "0.500.6",
|
|
45
|
+
"@nu-art/thunder-routing": "0.500.6",
|
|
46
|
+
"@nu-art/thunder-ui-modules": "0.500.6",
|
|
47
|
+
"@nu-art/thunder-notifications": "0.500.6",
|
|
48
|
+
"@nu-art/db-item-editor": "0.500.6",
|
|
49
|
+
"@nu-art/thunder-widgets": "0.500.6",
|
|
50
|
+
"@nu-art/editable-item": "0.500.6",
|
|
51
|
+
"@nu-art/ts-common": "0.500.6",
|
|
52
|
+
"@nu-art/ts-styles": "0.500.6",
|
|
53
|
+
"@nu-art/user-account-frontend": "0.500.6",
|
|
54
|
+
"@nu-art/user-account-shared": "0.500.6",
|
|
47
55
|
"express": "^4.18.2",
|
|
48
56
|
"firebase": "^11.9.0",
|
|
49
57
|
"firebase-admin": "13.4.0",
|
|
@@ -52,7 +60,8 @@
|
|
|
52
60
|
"react": "^18.0.0",
|
|
53
61
|
"react-dom": "^18.0.0",
|
|
54
62
|
"react-router-dom": "^6.9.0",
|
|
55
|
-
"saml2-js": "^4.0.1"
|
|
63
|
+
"saml2-js": "^4.0.1",
|
|
64
|
+
"@nu-art/http-client": "0.500.6"
|
|
56
65
|
},
|
|
57
66
|
"devDependencies": {
|
|
58
67
|
"@types/react": "^18.0.0",
|
|
@@ -63,6 +72,7 @@
|
|
|
63
72
|
"@types/chai": "^4.3.4",
|
|
64
73
|
"@types/mocha": "^10.0.1",
|
|
65
74
|
"@types/history": "^4.7.2",
|
|
75
|
+
"@types/request": "^2.48.1",
|
|
66
76
|
"@types/saml2-js": "^1.6.8"
|
|
67
77
|
},
|
|
68
78
|
"unitConfig": {
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/*
|
|
3
|
+
* Permissions management system
|
|
4
|
+
* Copyright (C) 2020 Adam van der Kruk aka TacB0sS
|
|
5
|
+
* Licensed under the Apache License, Version 2.0
|
|
6
|
+
*/
|
|
7
|
+
import { AwaitModules } from '@nu-art/sync-manager-frontend';
|
|
8
|
+
import { Filter, sortArray } from '@nu-art/ts-common';
|
|
9
|
+
import { ModuleFE_PermissionScope } from '../../_entity/permission-scope/ModuleFE_PermissionScope.js';
|
|
10
|
+
import { ModuleFE_AccessGroup } from '../../_entity/access-group/ModuleFE_AccessGroup.js';
|
|
11
|
+
import { ComponentSync, LL_H_C, LL_H_T, LL_V_L, SimpleListAdapter, TS_DropDown, TS_Input, TS_JSONViewer } from '@nu-art/thunder-widgets';
|
|
12
|
+
import { Component_ScopeMultiSelect } from '../scope-editor/Component_ScopeMultiSelect.js';
|
|
13
|
+
import { Component_ScopeLabels } from '../scope-editor/Component_ScopeLabels.js';
|
|
14
|
+
import './Page_Permissions.scss';
|
|
15
|
+
const memberFilter = new Filter(item => [item.label]);
|
|
16
|
+
const editableGroupTypes = new Set(['entity', 'custom']);
|
|
17
|
+
function resolveGroupLabel(id) {
|
|
18
|
+
return ModuleFE_AccessGroup.cache.unique(id)?.label ?? id;
|
|
19
|
+
}
|
|
20
|
+
function resolveScopeLabel(id) {
|
|
21
|
+
const entity = ModuleFE_PermissionScope.cache.unique(id);
|
|
22
|
+
return entity ? `${entity.key}:${entity.value}` : id;
|
|
23
|
+
}
|
|
24
|
+
function resolveIds(ids, resolver) {
|
|
25
|
+
if (!ids?.length)
|
|
26
|
+
return [];
|
|
27
|
+
return ids.map(resolver);
|
|
28
|
+
}
|
|
29
|
+
function buildResolvedDocument(group) {
|
|
30
|
+
const access = group.__access;
|
|
31
|
+
const result = {
|
|
32
|
+
_id: group._id,
|
|
33
|
+
_v: group._v,
|
|
34
|
+
type: group.type,
|
|
35
|
+
key: group.key,
|
|
36
|
+
label: group.label,
|
|
37
|
+
};
|
|
38
|
+
const members = resolveIds(group.members, resolveGroupLabel);
|
|
39
|
+
if (members.length)
|
|
40
|
+
result.members = members;
|
|
41
|
+
const scopeEntries = resolveIds((group.scopeEntries ?? []), resolveScopeLabel);
|
|
42
|
+
if (scopeEntries.length)
|
|
43
|
+
result.scopeEntries = scopeEntries;
|
|
44
|
+
if (access) {
|
|
45
|
+
const resolved = {};
|
|
46
|
+
for (const [role, ids] of Object.entries(access)) {
|
|
47
|
+
const labels = resolveIds(ids, resolveGroupLabel);
|
|
48
|
+
if (labels.length)
|
|
49
|
+
resolved[role] = labels;
|
|
50
|
+
}
|
|
51
|
+
if (Object.keys(resolved).length)
|
|
52
|
+
result.__access = resolved;
|
|
53
|
+
}
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
class Page_Permissions extends ComponentSync {
|
|
57
|
+
__onAccessGroupUpdated(..._params) {
|
|
58
|
+
this.forceUpdate();
|
|
59
|
+
}
|
|
60
|
+
__onPermissionScopeUpdated(..._params) {
|
|
61
|
+
this.forceUpdate();
|
|
62
|
+
}
|
|
63
|
+
deriveStateFromProps(_nextProps, state) {
|
|
64
|
+
return {
|
|
65
|
+
...state,
|
|
66
|
+
groupSearch: state?.groupSearch ?? '',
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
selectGroup = (group) => {
|
|
70
|
+
const isEditable = editableGroupTypes.has(group.type);
|
|
71
|
+
this.setState({
|
|
72
|
+
selectedGroupId: group._id,
|
|
73
|
+
editingGroup: isEditable ? {
|
|
74
|
+
...group,
|
|
75
|
+
members: [...group.members],
|
|
76
|
+
scopeEntries: group.scopeEntries ? [...group.scopeEntries] : [],
|
|
77
|
+
} : undefined,
|
|
78
|
+
});
|
|
79
|
+
};
|
|
80
|
+
onScopeEntriesChanged = (entries) => {
|
|
81
|
+
const draft = this.state.editingGroup;
|
|
82
|
+
if (!draft)
|
|
83
|
+
return;
|
|
84
|
+
this.setState({ editingGroup: { ...draft, scopeEntries: entries } });
|
|
85
|
+
};
|
|
86
|
+
addMember = (member) => {
|
|
87
|
+
const draft = this.state.editingGroup;
|
|
88
|
+
if (!draft)
|
|
89
|
+
return;
|
|
90
|
+
if (draft.members.includes(member._id))
|
|
91
|
+
return;
|
|
92
|
+
this.setState({ editingGroup: { ...draft, members: [...draft.members, member._id] } });
|
|
93
|
+
};
|
|
94
|
+
removeMember = (memberId) => {
|
|
95
|
+
const draft = this.state.editingGroup;
|
|
96
|
+
if (!draft)
|
|
97
|
+
return;
|
|
98
|
+
this.setState({ editingGroup: { ...draft, members: draft.members.filter(id => id !== memberId) } });
|
|
99
|
+
};
|
|
100
|
+
saveGroup = async () => {
|
|
101
|
+
const draft = this.state.editingGroup;
|
|
102
|
+
if (!draft)
|
|
103
|
+
return;
|
|
104
|
+
await ModuleFE_AccessGroup.upsert(draft);
|
|
105
|
+
};
|
|
106
|
+
cancelEdit = () => {
|
|
107
|
+
const selectedId = this.state.selectedGroupId;
|
|
108
|
+
if (!selectedId)
|
|
109
|
+
return;
|
|
110
|
+
const original = ModuleFE_AccessGroup.cache.unique(selectedId);
|
|
111
|
+
if (!original)
|
|
112
|
+
return;
|
|
113
|
+
this.setState({
|
|
114
|
+
editingGroup: editableGroupTypes.has(original.type) ? {
|
|
115
|
+
...original,
|
|
116
|
+
members: [...original.members],
|
|
117
|
+
scopeEntries: original.scopeEntries ? [...original.scopeEntries] : [],
|
|
118
|
+
} : undefined,
|
|
119
|
+
});
|
|
120
|
+
};
|
|
121
|
+
render() {
|
|
122
|
+
const groups = sortArray(ModuleFE_AccessGroup.cache.allMutable(), g => g.label);
|
|
123
|
+
const filteredGroups = this.state.groupSearch
|
|
124
|
+
? groups.filter(g => g.label.toLowerCase().includes(this.state.groupSearch.toLowerCase()))
|
|
125
|
+
: groups;
|
|
126
|
+
const selectedGroup = this.state.selectedGroupId
|
|
127
|
+
? groups.find(g => g._id === this.state.selectedGroupId)
|
|
128
|
+
: undefined;
|
|
129
|
+
return _jsxs(LL_H_T, { className: 'page-permissions', children: [this.renderListPanel(filteredGroups), this.renderDetailPanel(selectedGroup), this.renderDebugPanel(selectedGroup)] });
|
|
130
|
+
}
|
|
131
|
+
renderListPanel(groups) {
|
|
132
|
+
return _jsxs(LL_V_L, { className: 'page-permissions__list-panel', children: [_jsx("h2", { children: "Access Groups" }), _jsx(TS_Input, { type: 'text', value: this.state.groupSearch, placeholder: 'Filter groups...', saveEvent: ['change'], onChange: value => this.setState({ groupSearch: value }) }), _jsx(LL_V_L, { className: 'page-permissions__group-list', children: groups.length === 0
|
|
133
|
+
? _jsx("div", { className: 'empty-state', children: "No groups" })
|
|
134
|
+
: groups.map(group => this.renderGroupRow(group)) })] });
|
|
135
|
+
}
|
|
136
|
+
renderGroupRow(group) {
|
|
137
|
+
const isSelected = this.state.selectedGroupId === group._id;
|
|
138
|
+
const scopeCount = group.scopeEntries?.length ?? 0;
|
|
139
|
+
return _jsxs("div", { className: `page-permissions__group-row ${isSelected ? 'page-permissions__group-row--selected' : ''}`, onClick: () => this.selectGroup(group), children: [_jsxs(LL_H_C, { className: 'page-permissions__group-row-header', children: [_jsx("span", { className: 'page-permissions__group-row-name', children: group.label }), _jsx("span", { className: 'badge badge--info', children: group.type })] }), _jsxs("span", { className: 'page-permissions__group-row-meta', children: [scopeCount, " scope", scopeCount !== 1 ? 's' : '', " \u00B7 ", group.members.length, " member", group.members.length !== 1 ? 's' : ''] })] }, group._id);
|
|
140
|
+
}
|
|
141
|
+
renderDetailPanel(group) {
|
|
142
|
+
if (!group)
|
|
143
|
+
return _jsx(LL_V_L, { className: 'page-permissions__detail-panel page-permissions__detail-panel--empty', children: _jsx("div", { className: 'empty-state', children: "Select a group to view details" }) });
|
|
144
|
+
const isEditable = editableGroupTypes.has(group.type);
|
|
145
|
+
const draft = this.state.editingGroup;
|
|
146
|
+
return _jsxs(LL_V_L, { className: 'page-permissions__detail-panel', children: [_jsxs(LL_H_C, { className: 'page-permissions__detail-header', children: [_jsx("h3", { children: group.label }), _jsxs(LL_H_C, { style: { gap: 'var(--space-2)' }, children: [_jsx("span", { className: 'badge badge--info', children: group.type }), _jsx("span", { className: 'page-permissions__detail-key', children: group.key })] })] }), _jsxs(LL_V_L, { className: 'page-permissions__detail-section', children: [_jsx("h4", { children: "Scopes" }), isEditable && draft
|
|
147
|
+
? _jsx(Component_ScopeMultiSelect, { scopeEntries: (draft.scopeEntries ?? []), onChanged: this.onScopeEntriesChanged })
|
|
148
|
+
: _jsx(Component_ScopeLabels, { scopeEntries: group.scopeEntries ?? [], emptyMessage: 'No scopes assigned' })] }), _jsxs(LL_V_L, { className: 'page-permissions__detail-section', children: [_jsxs("h4", { children: ["Members (", isEditable && draft ? draft.members.length : group.members.length, ")"] }), isEditable && draft
|
|
149
|
+
? this.renderMemberEditor(draft)
|
|
150
|
+
: this.renderMemberReadonly(group)] }), isEditable && draft && _jsxs(LL_H_C, { className: 'editor-panel__actions', children: [_jsx("button", { className: 'btn btn--primary btn--sm', onClick: this.saveGroup, children: "Save" }), _jsx("button", { className: 'btn btn--ghost btn--sm', onClick: this.cancelEdit, children: "Reset" })] })] });
|
|
151
|
+
}
|
|
152
|
+
renderDebugPanel(group) {
|
|
153
|
+
if (!group)
|
|
154
|
+
return _jsx(LL_V_L, { className: 'page-permissions__debug-panel page-permissions__debug-panel--empty' });
|
|
155
|
+
const resolved = buildResolvedDocument(group);
|
|
156
|
+
return _jsxs(LL_V_L, { className: 'page-permissions__debug-panel', children: [_jsx("h4", { children: "Document" }), _jsx("div", { className: 'page-permissions__debug-tree', children: _jsx(TS_JSONViewer, { item: resolved, expandAll: true, compact: true }) })] });
|
|
157
|
+
}
|
|
158
|
+
renderMemberReadonly(group) {
|
|
159
|
+
if (group.members.length === 0)
|
|
160
|
+
return _jsx("span", { className: 'card-list__item-meta', children: "No members" });
|
|
161
|
+
return _jsx("div", { className: 'tags', children: group.members.map(memberId => {
|
|
162
|
+
const memberGroup = ModuleFE_AccessGroup.cache.unique(memberId);
|
|
163
|
+
return _jsx("span", { className: 'tag tag--accent', children: memberGroup?.label ?? memberId }, memberId);
|
|
164
|
+
}) });
|
|
165
|
+
}
|
|
166
|
+
renderMemberEditor(draft) {
|
|
167
|
+
return _jsxs(LL_V_L, { className: 'page-permissions__member-editor', children: [this.renderMemberTags(draft.members), this.renderAddMemberDropdown(draft.members)] });
|
|
168
|
+
}
|
|
169
|
+
renderMemberTags(members) {
|
|
170
|
+
if (members.length === 0)
|
|
171
|
+
return _jsx("span", { className: 'card-list__item-meta', children: "No members" });
|
|
172
|
+
return _jsx("div", { className: 'tags', children: members.map(memberId => {
|
|
173
|
+
const memberGroup = ModuleFE_AccessGroup.cache.unique(memberId);
|
|
174
|
+
return _jsxs("span", { className: 'tag tag--accent', children: [memberGroup?.label ?? memberId, _jsx("button", { className: 'tag__remove', onClick: () => this.removeMember(memberId), children: "\u00D7" })] }, memberId);
|
|
175
|
+
}) });
|
|
176
|
+
}
|
|
177
|
+
renderAddMemberDropdown(currentMembers) {
|
|
178
|
+
const memberSet = new Set(currentMembers);
|
|
179
|
+
const candidates = sortArray(ModuleFE_AccessGroup.cache.allMutable()
|
|
180
|
+
.filter(g => g._id !== this.state.selectedGroupId && !memberSet.has(g._id)), g => g.label);
|
|
181
|
+
if (candidates.length === 0)
|
|
182
|
+
return null;
|
|
183
|
+
return _jsx(TS_DropDown, { className: 'page-permissions__member-dropdown', adapter: SimpleListAdapter(candidates, node => _jsx(_Fragment, { children: node.item.label })), filter: memberFilter, placeholder: 'Add member...', onSelected: this.addMember });
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
export const APage_Permissions = () => (_jsx(AwaitModules, { modules: [ModuleFE_AccessGroup, ModuleFE_PermissionScope], children: _jsx(Page_Permissions, {}) }));
|