@portaidentity/cli 1.7.3 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/README.md +125 -105
- package/dist/admin/admin-date-time.d.ts +6 -0
- package/dist/admin/admin-date-time.d.ts.map +1 -0
- package/dist/admin/admin-date-time.js +33 -0
- package/dist/admin/admin-date-time.js.map +1 -0
- package/dist/admin/application-client-features.d.ts +38 -0
- package/dist/admin/application-client-features.d.ts.map +1 -0
- package/dist/admin/application-client-features.js +545 -0
- package/dist/admin/application-client-features.js.map +1 -0
- package/dist/admin/application-controller.d.ts +58 -0
- package/dist/admin/application-controller.d.ts.map +1 -0
- package/dist/admin/application-controller.js +286 -0
- package/dist/admin/application-controller.js.map +1 -0
- package/dist/admin/application-dialogs.d.ts +91 -0
- package/dist/admin/application-dialogs.d.ts.map +1 -0
- package/dist/admin/application-dialogs.js +250 -0
- package/dist/admin/application-dialogs.js.map +1 -0
- package/dist/admin/application-rbac-controller.d.ts +56 -0
- package/dist/admin/application-rbac-controller.d.ts.map +1 -0
- package/dist/admin/application-rbac-controller.js +280 -0
- package/dist/admin/application-rbac-controller.js.map +1 -0
- package/dist/admin/application-rbac-features.d.ts +51 -0
- package/dist/admin/application-rbac-features.d.ts.map +1 -0
- package/dist/admin/application-rbac-features.js +175 -0
- package/dist/admin/application-rbac-features.js.map +1 -0
- package/dist/admin/application-rbac-workspace.d.ts +62 -0
- package/dist/admin/application-rbac-workspace.d.ts.map +1 -0
- package/dist/admin/application-rbac-workspace.js +344 -0
- package/dist/admin/application-rbac-workspace.js.map +1 -0
- package/dist/admin/application-runtime.d.ts +44 -0
- package/dist/admin/application-runtime.d.ts.map +1 -0
- package/dist/admin/application-runtime.js +183 -0
- package/dist/admin/application-runtime.js.map +1 -0
- package/dist/admin/application-service.d.ts +39 -0
- package/dist/admin/application-service.d.ts.map +1 -0
- package/dist/admin/application-service.js +248 -0
- package/dist/admin/application-service.js.map +1 -0
- package/dist/admin/application-state.d.ts +109 -0
- package/dist/admin/application-state.d.ts.map +1 -0
- package/dist/admin/application-state.js +3 -0
- package/dist/admin/application-state.js.map +1 -0
- package/dist/admin/application-workspace.d.ts +77 -0
- package/dist/admin/application-workspace.d.ts.map +1 -0
- package/dist/admin/application-workspace.js +302 -0
- package/dist/admin/application-workspace.js.map +1 -0
- package/dist/admin/application.d.ts +88 -0
- package/dist/admin/application.d.ts.map +1 -0
- package/dist/admin/application.js +932 -0
- package/dist/admin/application.js.map +1 -0
- package/dist/admin/client-authentication-dialog.d.ts +77 -0
- package/dist/admin/client-authentication-dialog.d.ts.map +1 -0
- package/dist/admin/client-authentication-dialog.js +217 -0
- package/dist/admin/client-authentication-dialog.js.map +1 -0
- package/dist/admin/client-controller.d.ts +58 -0
- package/dist/admin/client-controller.d.ts.map +1 -0
- package/dist/admin/client-controller.js +462 -0
- package/dist/admin/client-controller.js.map +1 -0
- package/dist/admin/client-credential-dialogs.d.ts +36 -0
- package/dist/admin/client-credential-dialogs.d.ts.map +1 -0
- package/dist/admin/client-credential-dialogs.js +145 -0
- package/dist/admin/client-credential-dialogs.js.map +1 -0
- package/dist/admin/client-dialogs.d.ts +64 -0
- package/dist/admin/client-dialogs.d.ts.map +1 -0
- package/dist/admin/client-dialogs.js +110 -0
- package/dist/admin/client-dialogs.js.map +1 -0
- package/dist/admin/client-form-scroller.d.ts +17 -0
- package/dist/admin/client-form-scroller.d.ts.map +1 -0
- package/dist/admin/client-form-scroller.js +67 -0
- package/dist/admin/client-form-scroller.js.map +1 -0
- package/dist/admin/client-registration-dialog.d.ts +27 -0
- package/dist/admin/client-registration-dialog.d.ts.map +1 -0
- package/dist/admin/client-registration-dialog.js +195 -0
- package/dist/admin/client-registration-dialog.js.map +1 -0
- package/dist/admin/client-service.d.ts +41 -0
- package/dist/admin/client-service.d.ts.map +1 -0
- package/dist/admin/client-service.js +486 -0
- package/dist/admin/client-service.js.map +1 -0
- package/dist/admin/client-state.d.ts +159 -0
- package/dist/admin/client-state.d.ts.map +1 -0
- package/dist/admin/client-state.js +3 -0
- package/dist/admin/client-state.js.map +1 -0
- package/dist/admin/client-workspace.d.ts +88 -0
- package/dist/admin/client-workspace.d.ts.map +1 -0
- package/dist/admin/client-workspace.js +491 -0
- package/dist/admin/client-workspace.js.map +1 -0
- package/dist/admin/delete-confirmation-layout.d.ts +38 -0
- package/dist/admin/delete-confirmation-layout.d.ts.map +1 -0
- package/dist/admin/delete-confirmation-layout.js +52 -0
- package/dist/admin/delete-confirmation-layout.js.map +1 -0
- package/dist/admin/index.d.ts +64 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +31 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/organization-controller.d.ts +77 -0
- package/dist/admin/organization-controller.d.ts.map +1 -0
- package/dist/admin/organization-controller.js +472 -0
- package/dist/admin/organization-controller.js.map +1 -0
- package/dist/admin/organization-dialogs.d.ts +63 -0
- package/dist/admin/organization-dialogs.d.ts.map +1 -0
- package/dist/admin/organization-dialogs.js +303 -0
- package/dist/admin/organization-dialogs.js.map +1 -0
- package/dist/admin/organization-service.d.ts +110 -0
- package/dist/admin/organization-service.d.ts.map +1 -0
- package/dist/admin/organization-service.js +548 -0
- package/dist/admin/organization-service.js.map +1 -0
- package/dist/admin/organization-workspace.d.ts +29 -0
- package/dist/admin/organization-workspace.d.ts.map +1 -0
- package/dist/admin/organization-workspace.js +421 -0
- package/dist/admin/organization-workspace.js.map +1 -0
- package/dist/admin/portability-controller.d.ts +83 -0
- package/dist/admin/portability-controller.d.ts.map +1 -0
- package/dist/admin/portability-controller.js +466 -0
- package/dist/admin/portability-controller.js.map +1 -0
- package/dist/admin/portability-service.d.ts +31 -0
- package/dist/admin/portability-service.d.ts.map +1 -0
- package/dist/admin/portability-service.js +51 -0
- package/dist/admin/portability-service.js.map +1 -0
- package/dist/admin/portability-state.d.ts +88 -0
- package/dist/admin/portability-state.d.ts.map +1 -0
- package/dist/admin/portability-state.js +3 -0
- package/dist/admin/portability-state.js.map +1 -0
- package/dist/admin/portability-workspace.d.ts +78 -0
- package/dist/admin/portability-workspace.d.ts.map +1 -0
- package/dist/admin/portability-workspace.js +337 -0
- package/dist/admin/portability-workspace.js.map +1 -0
- package/dist/admin/presentation.d.ts +46 -0
- package/dist/admin/presentation.d.ts.map +1 -0
- package/dist/admin/presentation.js +271 -0
- package/dist/admin/presentation.js.map +1 -0
- package/dist/admin/rbac-dialogs.d.ts +73 -0
- package/dist/admin/rbac-dialogs.d.ts.map +1 -0
- package/dist/admin/rbac-dialogs.js +345 -0
- package/dist/admin/rbac-dialogs.js.map +1 -0
- package/dist/admin/rbac-service.d.ts +47 -0
- package/dist/admin/rbac-service.d.ts.map +1 -0
- package/dist/admin/rbac-service.js +258 -0
- package/dist/admin/rbac-service.js.map +1 -0
- package/dist/admin/rbac-state.d.ts +129 -0
- package/dist/admin/rbac-state.d.ts.map +1 -0
- package/dist/admin/rbac-state.js +136 -0
- package/dist/admin/rbac-state.js.map +1 -0
- package/dist/admin/selectable-read-only-input.d.ts +18 -0
- package/dist/admin/selectable-read-only-input.d.ts.map +1 -0
- package/dist/admin/selectable-read-only-input.js +24 -0
- package/dist/admin/selectable-read-only-input.js.map +1 -0
- package/dist/admin/session-service.d.ts +169 -0
- package/dist/admin/session-service.d.ts.map +1 -0
- package/dist/admin/session-service.js +353 -0
- package/dist/admin/session-service.js.map +1 -0
- package/dist/admin/state.d.ts +301 -0
- package/dist/admin/state.d.ts.map +1 -0
- package/dist/admin/state.js +10 -0
- package/dist/admin/state.js.map +1 -0
- package/dist/admin/system-config-controller.d.ts +58 -0
- package/dist/admin/system-config-controller.d.ts.map +1 -0
- package/dist/admin/system-config-controller.js +218 -0
- package/dist/admin/system-config-controller.js.map +1 -0
- package/dist/admin/system-config-service.d.ts +54 -0
- package/dist/admin/system-config-service.d.ts.map +1 -0
- package/dist/admin/system-config-service.js +180 -0
- package/dist/admin/system-config-service.js.map +1 -0
- package/dist/admin/system-config-state.d.ts +77 -0
- package/dist/admin/system-config-state.d.ts.map +1 -0
- package/dist/admin/system-config-state.js +78 -0
- package/dist/admin/system-config-state.js.map +1 -0
- package/dist/admin/system-config-workspace.d.ts +47 -0
- package/dist/admin/system-config-workspace.d.ts.map +1 -0
- package/dist/admin/system-config-workspace.js +217 -0
- package/dist/admin/system-config-workspace.js.map +1 -0
- package/dist/admin/user-controller-types.d.ts +67 -0
- package/dist/admin/user-controller-types.d.ts.map +1 -0
- package/dist/admin/user-controller-types.js +3 -0
- package/dist/admin/user-controller-types.js.map +1 -0
- package/dist/admin/user-controller.d.ts +6 -0
- package/dist/admin/user-controller.d.ts.map +1 -0
- package/dist/admin/user-controller.js +674 -0
- package/dist/admin/user-controller.js.map +1 -0
- package/dist/admin/user-dialog-fields.d.ts +44 -0
- package/dist/admin/user-dialog-fields.d.ts.map +1 -0
- package/dist/admin/user-dialog-fields.js +130 -0
- package/dist/admin/user-dialog-fields.js.map +1 -0
- package/dist/admin/user-dialogs.d.ts +66 -0
- package/dist/admin/user-dialogs.d.ts.map +1 -0
- package/dist/admin/user-dialogs.js +374 -0
- package/dist/admin/user-dialogs.js.map +1 -0
- package/dist/admin/user-role-controller.d.ts +82 -0
- package/dist/admin/user-role-controller.d.ts.map +1 -0
- package/dist/admin/user-role-controller.js +337 -0
- package/dist/admin/user-role-controller.js.map +1 -0
- package/dist/admin/user-role-dialog.d.ts +94 -0
- package/dist/admin/user-role-dialog.d.ts.map +1 -0
- package/dist/admin/user-role-dialog.js +265 -0
- package/dist/admin/user-role-dialog.js.map +1 -0
- package/dist/admin/user-service-types.d.ts +100 -0
- package/dist/admin/user-service-types.d.ts.map +1 -0
- package/dist/admin/user-service-types.js +3 -0
- package/dist/admin/user-service-types.js.map +1 -0
- package/dist/admin/user-service.d.ts +14 -0
- package/dist/admin/user-service.d.ts.map +1 -0
- package/dist/admin/user-service.js +612 -0
- package/dist/admin/user-service.js.map +1 -0
- package/dist/admin/user-state.d.ts +158 -0
- package/dist/admin/user-state.d.ts.map +1 -0
- package/dist/admin/user-state.js +3 -0
- package/dist/admin/user-state.js.map +1 -0
- package/dist/admin/user-workspace.d.ts +65 -0
- package/dist/admin/user-workspace.d.ts.map +1 -0
- package/dist/admin/user-workspace.js +366 -0
- package/dist/admin/user-workspace.js.map +1 -0
- package/dist/auth/browser-flow.d.ts +27 -1
- package/dist/auth/browser-flow.d.ts.map +1 -1
- package/dist/auth/browser-flow.js +55 -33
- package/dist/auth/browser-flow.js.map +1 -1
- package/dist/auth/callback-server.d.ts.map +1 -1
- package/dist/auth/callback-server.js +5 -9
- package/dist/auth/callback-server.js.map +1 -1
- package/dist/auth/id-token-verifier.d.ts +39 -0
- package/dist/auth/id-token-verifier.d.ts.map +1 -0
- package/dist/auth/id-token-verifier.js +104 -0
- package/dist/auth/id-token-verifier.js.map +1 -0
- package/dist/auth/login-coordinator.d.ts +72 -0
- package/dist/auth/login-coordinator.d.ts.map +1 -0
- package/dist/auth/login-coordinator.js +190 -0
- package/dist/auth/login-coordinator.js.map +1 -0
- package/dist/auth/metadata.d.ts +2 -1
- package/dist/auth/metadata.d.ts.map +1 -1
- package/dist/auth/metadata.js +67 -6
- package/dist/auth/metadata.js.map +1 -1
- package/dist/auth/types.d.ts +14 -0
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/client-factory.d.ts.map +1 -1
- package/dist/client-factory.js +15 -2
- package/dist/client-factory.js.map +1 -1
- package/dist/commands/admin.d.ts +22 -0
- package/dist/commands/admin.d.ts.map +1 -0
- package/dist/commands/admin.js +112 -0
- package/dist/commands/admin.js.map +1 -0
- package/dist/commands/app-claim.d.ts.map +1 -1
- package/dist/commands/app-claim.js +11 -4
- package/dist/commands/app-claim.js.map +1 -1
- package/dist/commands/app-module.d.ts.map +1 -1
- package/dist/commands/app-module.js +61 -12
- package/dist/commands/app-module.js.map +1 -1
- package/dist/commands/app-permission.d.ts.map +1 -1
- package/dist/commands/app-permission.js +66 -24
- package/dist/commands/app-permission.js.map +1 -1
- package/dist/commands/app-role.d.ts.map +1 -1
- package/dist/commands/app-role.js +48 -27
- package/dist/commands/app-role.js.map +1 -1
- package/dist/commands/app.d.ts.map +1 -1
- package/dist/commands/app.js +37 -25
- package/dist/commands/app.js.map +1 -1
- package/dist/commands/bulk.d.ts.map +1 -1
- package/dist/commands/bulk.js +9 -2
- package/dist/commands/bulk.js.map +1 -1
- package/dist/commands/client-secret.d.ts.map +1 -1
- package/dist/commands/client-secret.js +12 -6
- package/dist/commands/client-secret.js.map +1 -1
- package/dist/commands/client.d.ts +3 -2
- package/dist/commands/client.d.ts.map +1 -1
- package/dist/commands/client.js +102 -43
- package/dist/commands/client.js.map +1 -1
- package/dist/commands/config.d.ts +4 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +68 -7
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/export.d.ts +6 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +182 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/import.d.ts +6 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +142 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/keys.d.ts.map +1 -1
- package/dist/commands/keys.js +11 -4
- package/dist/commands/keys.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +24 -10
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/org.d.ts +2 -4
- package/dist/commands/org.d.ts.map +1 -1
- package/dist/commands/org.js +16 -76
- package/dist/commands/org.js.map +1 -1
- package/dist/commands/user-role.d.ts.map +1 -1
- package/dist/commands/user-role.js +19 -14
- package/dist/commands/user-role.js.map +1 -1
- package/dist/commands/user.d.ts +3 -2
- package/dist/commands/user.d.ts.map +1 -1
- package/dist/commands/user.js +47 -71
- package/dist/commands/user.js.map +1 -1
- package/dist/commands/version.d.ts +1 -1
- package/dist/commands/version.js +1 -1
- package/dist/credential-lock.d.ts +20 -0
- package/dist/credential-lock.d.ts.map +1 -0
- package/dist/credential-lock.js +130 -0
- package/dist/credential-lock.js.map +1 -0
- package/dist/credential-store.d.ts +14 -0
- package/dist/credential-store.d.ts.map +1 -1
- package/dist/credential-store.js +114 -3
- package/dist/credential-store.js.map +1 -1
- package/dist/error-handler.d.ts.map +1 -1
- package/dist/error-handler.js +2 -0
- package/dist/error-handler.js.map +1 -1
- package/dist/global-options.d.ts +8 -0
- package/dist/global-options.d.ts.map +1 -1
- package/dist/global-options.js +19 -8
- package/dist/global-options.js.map +1 -1
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/output.d.ts +11 -0
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +25 -6
- package/dist/output.js.map +1 -1
- package/dist/prompt.d.ts +2 -2
- package/dist/prompt.d.ts.map +1 -1
- package/dist/prompt.js +27 -7
- package/dist/prompt.js.map +1 -1
- package/package.json +7 -3
- package/dist/commands/gui.d.ts +0 -21
- package/dist/commands/gui.d.ts.map +0 -1
- package/dist/commands/gui.js +0 -67
- package/dist/commands/gui.js.map +0 -1
- package/dist/commands/provision.d.ts +0 -47
- package/dist/commands/provision.d.ts.map +0 -1
- package/dist/commands/provision.js +0 -444
- package/dist/commands/provision.js.map +0 -1
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
/** Exact-context orchestration for direct roles assigned to one selected user. */
|
|
2
|
+
import { createAdminUserRoleDialog } from './user-role-dialog.js';
|
|
3
|
+
/** Creates the focused selected-user role workflow controller. */
|
|
4
|
+
export function createAdminUserRoleController(options) {
|
|
5
|
+
let generation = 0;
|
|
6
|
+
let operation;
|
|
7
|
+
let operationKind;
|
|
8
|
+
let mutationDispatched = false;
|
|
9
|
+
let projection;
|
|
10
|
+
let recoveryRequired = false;
|
|
11
|
+
let disposed = false;
|
|
12
|
+
/** Publishes only while this controller still owns the focused dialog. */
|
|
13
|
+
const publish = (state) => {
|
|
14
|
+
if (!disposed)
|
|
15
|
+
options.publishState(state);
|
|
16
|
+
};
|
|
17
|
+
/** Confirms exact organization, user, and session ownership for one continuation. */
|
|
18
|
+
const owns = (capturedGeneration, context, controller) => {
|
|
19
|
+
const current = options.readContext();
|
|
20
|
+
return (!disposed &&
|
|
21
|
+
generation === capturedGeneration &&
|
|
22
|
+
operation === controller &&
|
|
23
|
+
!controller.signal.aborted &&
|
|
24
|
+
current.organizationId === context.organizationId &&
|
|
25
|
+
current.userId === context.userId &&
|
|
26
|
+
current.sessionEpoch === context.sessionEpoch);
|
|
27
|
+
};
|
|
28
|
+
/** Publishes a fixed failure while retaining the last validated role data. */
|
|
29
|
+
const publishFailure = (failure) => {
|
|
30
|
+
publish({ kind: 'failure', failure, ...(projection ? { previous: projection } : {}) });
|
|
31
|
+
};
|
|
32
|
+
/** Clears protected state and enters the existing authentication flow. */
|
|
33
|
+
const requireAuthentication = () => {
|
|
34
|
+
generation += 1;
|
|
35
|
+
operation?.abort();
|
|
36
|
+
operation = undefined;
|
|
37
|
+
operationKind = undefined;
|
|
38
|
+
mutationDispatched = false;
|
|
39
|
+
projection = undefined;
|
|
40
|
+
recoveryRequired = false;
|
|
41
|
+
options.setRecoveryRequired?.(false);
|
|
42
|
+
publish({ kind: 'closed' });
|
|
43
|
+
options.requestAuthentication();
|
|
44
|
+
};
|
|
45
|
+
/** Retains validated state until an explicit read-only Reload reconciles it. */
|
|
46
|
+
const requireReconciliation = () => {
|
|
47
|
+
recoveryRequired = true;
|
|
48
|
+
options.setRecoveryRequired?.(true);
|
|
49
|
+
publish({ kind: 'indeterminate', ...(projection ? { previous: projection } : {}) });
|
|
50
|
+
};
|
|
51
|
+
/** Cancels one owned continuation and records uncertainty only after dispatch. */
|
|
52
|
+
const cancel = (reconcileDispatchedMutation = false) => {
|
|
53
|
+
const uncertain = reconcileDispatchedMutation && mutationDispatched;
|
|
54
|
+
generation += 1;
|
|
55
|
+
operation?.abort();
|
|
56
|
+
operation = undefined;
|
|
57
|
+
operationKind = undefined;
|
|
58
|
+
mutationDispatched = false;
|
|
59
|
+
if (uncertain)
|
|
60
|
+
requireReconciliation();
|
|
61
|
+
};
|
|
62
|
+
/** Adds safe application labels without changing role identity or ownership. */
|
|
63
|
+
const assignedRows = (roles, applications) => {
|
|
64
|
+
const names = new Map(applications.map((application) => [application.id, application.name]));
|
|
65
|
+
return Object.freeze(roles.map((role) => {
|
|
66
|
+
const applicationName = names.get(role.applicationId);
|
|
67
|
+
return Object.freeze({ ...role, ...(applicationName ? { applicationName } : {}) });
|
|
68
|
+
}));
|
|
69
|
+
};
|
|
70
|
+
/** Loads direct assignments and readable applications for the exact current context. */
|
|
71
|
+
const load = async () => {
|
|
72
|
+
if (disposed || operation)
|
|
73
|
+
return;
|
|
74
|
+
const context = options.readContext();
|
|
75
|
+
const operations = options.readOperations();
|
|
76
|
+
if (!operations)
|
|
77
|
+
return;
|
|
78
|
+
const controller = new AbortController();
|
|
79
|
+
operation = controller;
|
|
80
|
+
operationKind = 'load';
|
|
81
|
+
const capturedGeneration = ++generation;
|
|
82
|
+
try {
|
|
83
|
+
const roleResult = await operations.listUserRoles(context.organizationId, context.userId, controller.signal);
|
|
84
|
+
if (!owns(capturedGeneration, context, controller))
|
|
85
|
+
return;
|
|
86
|
+
if (roleResult.kind === 'session-invalid') {
|
|
87
|
+
requireAuthentication();
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (roleResult.kind === 'failure') {
|
|
91
|
+
publishFailure(roleResult.failure);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const applicationResult = await options.listApplications(controller.signal);
|
|
95
|
+
if (!owns(capturedGeneration, context, controller))
|
|
96
|
+
return;
|
|
97
|
+
if (applicationResult.kind === 'session-invalid') {
|
|
98
|
+
requireAuthentication();
|
|
99
|
+
}
|
|
100
|
+
else if (applicationResult.kind === 'failure') {
|
|
101
|
+
publishFailure(applicationResult.failure);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
projection = {
|
|
105
|
+
kind: 'ready',
|
|
106
|
+
organizationId: context.organizationId,
|
|
107
|
+
userId: context.userId,
|
|
108
|
+
assignedRoles: assignedRows(roleResult.value, applicationResult.value),
|
|
109
|
+
applications: applicationResult.value,
|
|
110
|
+
availableRoles: [],
|
|
111
|
+
};
|
|
112
|
+
recoveryRequired = false;
|
|
113
|
+
options.setRecoveryRequired?.(false);
|
|
114
|
+
publish(projection);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
if (operation === controller) {
|
|
119
|
+
operation = undefined;
|
|
120
|
+
operationKind = undefined;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
/** Loads one application's roles and removes assignments already held by the user. */
|
|
125
|
+
const loadAvailableRoles = async (applicationId) => {
|
|
126
|
+
if (disposed || recoveryRequired || (operation && operationKind !== 'available'))
|
|
127
|
+
return;
|
|
128
|
+
if (operationKind === 'available')
|
|
129
|
+
cancel();
|
|
130
|
+
const context = options.readContext();
|
|
131
|
+
const operations = options.readOperations();
|
|
132
|
+
if (!operations || !projection)
|
|
133
|
+
return;
|
|
134
|
+
projection = {
|
|
135
|
+
kind: 'ready',
|
|
136
|
+
organizationId: projection.organizationId,
|
|
137
|
+
userId: projection.userId,
|
|
138
|
+
assignedRoles: projection.assignedRoles,
|
|
139
|
+
applications: projection.applications,
|
|
140
|
+
availableRoles: [],
|
|
141
|
+
};
|
|
142
|
+
publish(projection);
|
|
143
|
+
const controller = new AbortController();
|
|
144
|
+
operation = controller;
|
|
145
|
+
operationKind = 'available';
|
|
146
|
+
const capturedGeneration = ++generation;
|
|
147
|
+
try {
|
|
148
|
+
const result = await operations.listRoles(applicationId, controller.signal);
|
|
149
|
+
if (!owns(capturedGeneration, context, controller))
|
|
150
|
+
return;
|
|
151
|
+
if (result.kind === 'session-invalid') {
|
|
152
|
+
requireAuthentication();
|
|
153
|
+
}
|
|
154
|
+
else if (result.kind === 'failure') {
|
|
155
|
+
publishFailure(result.failure);
|
|
156
|
+
}
|
|
157
|
+
else if (projection) {
|
|
158
|
+
const assignedIds = new Set(projection.assignedRoles.map((role) => role.id));
|
|
159
|
+
projection = {
|
|
160
|
+
...projection,
|
|
161
|
+
availableRoles: Object.freeze(result.value.filter((role) => !assignedIds.has(role.id))),
|
|
162
|
+
availableRolesApplicationId: applicationId,
|
|
163
|
+
};
|
|
164
|
+
publish(projection);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
finally {
|
|
168
|
+
if (operation === controller) {
|
|
169
|
+
operation = undefined;
|
|
170
|
+
operationKind = undefined;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
/** Interprets one mutation result before authoritative reconciliation. */
|
|
175
|
+
const acceptsReload = (result) => {
|
|
176
|
+
mutationDispatched = false;
|
|
177
|
+
if (result.kind === 'session-invalid') {
|
|
178
|
+
requireAuthentication();
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
if (result.kind === 'outcome-unknown') {
|
|
182
|
+
requireReconciliation();
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
if (result.kind === 'failure') {
|
|
186
|
+
publishFailure(result.failure);
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
if (result.kind === 'cancelled')
|
|
190
|
+
return false;
|
|
191
|
+
if ('reauthenticationRequired' in result && result.reauthenticationRequired) {
|
|
192
|
+
requireAuthentication();
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
return true;
|
|
196
|
+
};
|
|
197
|
+
/** Runs one one-role mutation and reloads only after a definite committed success. */
|
|
198
|
+
const mutate = async (roleId, remove) => {
|
|
199
|
+
if (disposed || operation || recoveryRequired)
|
|
200
|
+
return;
|
|
201
|
+
const context = options.readContext();
|
|
202
|
+
const operations = options.readOperations();
|
|
203
|
+
if (!operations)
|
|
204
|
+
return;
|
|
205
|
+
const controller = new AbortController();
|
|
206
|
+
operation = controller;
|
|
207
|
+
operationKind = 'mutation';
|
|
208
|
+
const capturedGeneration = ++generation;
|
|
209
|
+
try {
|
|
210
|
+
mutationDispatched = true;
|
|
211
|
+
const result = remove
|
|
212
|
+
? await operations.removeUserRoles(context.organizationId, context.userId, [roleId], controller.signal)
|
|
213
|
+
: await operations.assignUserRoles(context.organizationId, context.userId, [roleId], controller.signal);
|
|
214
|
+
if (!owns(capturedGeneration, context, controller))
|
|
215
|
+
return;
|
|
216
|
+
if (!acceptsReload(result))
|
|
217
|
+
return;
|
|
218
|
+
operation = undefined;
|
|
219
|
+
operationKind = undefined;
|
|
220
|
+
await load();
|
|
221
|
+
}
|
|
222
|
+
finally {
|
|
223
|
+
if (operation === controller) {
|
|
224
|
+
operation = undefined;
|
|
225
|
+
operationKind = undefined;
|
|
226
|
+
mutationDispatched = false;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
return {
|
|
231
|
+
load,
|
|
232
|
+
loadAvailableRoles,
|
|
233
|
+
assignRole: (roleId) => mutate(roleId, false),
|
|
234
|
+
removeRole: (roleId) => mutate(roleId, true),
|
|
235
|
+
reload: load,
|
|
236
|
+
cancelActiveOperation: () => cancel(true),
|
|
237
|
+
dispose() {
|
|
238
|
+
if (disposed)
|
|
239
|
+
return;
|
|
240
|
+
cancel(true);
|
|
241
|
+
disposed = true;
|
|
242
|
+
projection = undefined;
|
|
243
|
+
if (!recoveryRequired)
|
|
244
|
+
options.setRecoveryRequired?.(false);
|
|
245
|
+
options.publishState({ kind: 'closed' });
|
|
246
|
+
},
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
/** Opens one modal User Roles workflow using the existing shell event loop. */
|
|
250
|
+
export function openAdminUserRoleWorkflow(options) {
|
|
251
|
+
const initialState = options.readState();
|
|
252
|
+
const initialSelection = options.readSelection();
|
|
253
|
+
const initialOperations = options.readOperations();
|
|
254
|
+
if (initialState.kind !== 'authenticated' ||
|
|
255
|
+
!initialState.organization ||
|
|
256
|
+
!initialState.capabilities.canReadRoles ||
|
|
257
|
+
!initialSelection ||
|
|
258
|
+
!initialOperations) {
|
|
259
|
+
return undefined;
|
|
260
|
+
}
|
|
261
|
+
let controller;
|
|
262
|
+
let closed = false;
|
|
263
|
+
const dialog = createAdminUserRoleDialog({
|
|
264
|
+
organization: { id: initialState.organization.id, name: initialState.organization.name },
|
|
265
|
+
user: { id: initialSelection.selected.id, label: initialSelection.detail.email },
|
|
266
|
+
capabilities: initialState.capabilities,
|
|
267
|
+
viewport: {
|
|
268
|
+
width: options.host.desktop.bounds.width,
|
|
269
|
+
height: options.host.desktop.bounds.height,
|
|
270
|
+
},
|
|
271
|
+
focusView: (view) => options.host.loop.focusView(view),
|
|
272
|
+
onIntent: (intent) => {
|
|
273
|
+
if (!controller || closed)
|
|
274
|
+
return;
|
|
275
|
+
if (intent.kind === 'load-available')
|
|
276
|
+
void controller.loadAvailableRoles(intent.applicationId);
|
|
277
|
+
else if (intent.kind === 'assign')
|
|
278
|
+
void controller.assignRole(intent.roleId);
|
|
279
|
+
else if (intent.kind === 'remove')
|
|
280
|
+
void controller.removeRole(intent.roleId);
|
|
281
|
+
else if (intent.kind === 'reload')
|
|
282
|
+
void controller.reload();
|
|
283
|
+
else
|
|
284
|
+
close();
|
|
285
|
+
},
|
|
286
|
+
});
|
|
287
|
+
/** Releases state before removing the window from the shell's desktop. */
|
|
288
|
+
const close = (endModal = true) => {
|
|
289
|
+
if (closed)
|
|
290
|
+
return;
|
|
291
|
+
closed = true;
|
|
292
|
+
const ownedController = controller;
|
|
293
|
+
controller = undefined;
|
|
294
|
+
ownedController?.dispose();
|
|
295
|
+
dialog.clear();
|
|
296
|
+
dialog.dispose();
|
|
297
|
+
if (endModal)
|
|
298
|
+
options.host.loop.endModal(undefined);
|
|
299
|
+
options.host.desktop.removeWindow(dialog.content);
|
|
300
|
+
options.onClosed();
|
|
301
|
+
};
|
|
302
|
+
controller = createAdminUserRoleController({
|
|
303
|
+
readContext: () => {
|
|
304
|
+
const active = options.readState();
|
|
305
|
+
const activeSelection = options.readSelection();
|
|
306
|
+
return {
|
|
307
|
+
organizationId: active.kind === 'authenticated' ? (active.organization?.id ?? '') : '',
|
|
308
|
+
userId: activeSelection?.selected.id ?? '',
|
|
309
|
+
sessionEpoch: options.readSessionEpoch(),
|
|
310
|
+
};
|
|
311
|
+
},
|
|
312
|
+
readOperations: options.readOperations,
|
|
313
|
+
listApplications: () => {
|
|
314
|
+
const active = options.readState();
|
|
315
|
+
if (active.kind !== 'authenticated' || !active.capabilities.canReadApplications) {
|
|
316
|
+
return Promise.resolve({ kind: 'success', value: [] });
|
|
317
|
+
}
|
|
318
|
+
return (options.readApplicationOperations()?.listAll() ??
|
|
319
|
+
Promise.resolve({ kind: 'failure', failure: 'unavailable' }));
|
|
320
|
+
},
|
|
321
|
+
publishState: (state) => {
|
|
322
|
+
dialog.setState(state);
|
|
323
|
+
dialog.focusCurrent();
|
|
324
|
+
},
|
|
325
|
+
setRecoveryRequired: options.setRecoveryRequired,
|
|
326
|
+
requestAuthentication: () => {
|
|
327
|
+
close();
|
|
328
|
+
options.requestAuthentication();
|
|
329
|
+
},
|
|
330
|
+
});
|
|
331
|
+
options.host.desktop.addWindow(dialog.content);
|
|
332
|
+
void options.host.loop.execView(dialog.content).finally(() => close(false));
|
|
333
|
+
dialog.focusCurrent();
|
|
334
|
+
void controller.load();
|
|
335
|
+
return { close };
|
|
336
|
+
}
|
|
337
|
+
//# sourceMappingURL=user-role-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-role-controller.js","sourceRoot":"","sources":["../../src/admin/user-role-controller.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAiBlF,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAqFlE,kEAAkE;AAClE,MAAM,UAAU,6BAA6B,CAC3C,OAAuC;IAEvC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,SAAsC,CAAC;IAC3C,IAAI,aAA4D,CAAC;IACjE,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAC/B,IAAI,UAAoD,CAAC;IACzD,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAC7B,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,0EAA0E;IAC1E,MAAM,OAAO,GAAG,CAAC,KAA6B,EAAQ,EAAE;QACtD,IAAI,CAAC,QAAQ;YAAE,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC;IAEF,qFAAqF;IACrF,MAAM,IAAI,GAAG,CACX,kBAA0B,EAC1B,OAA6B,EAC7B,UAA2B,EAClB,EAAE;QACX,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACtC,OAAO,CACL,CAAC,QAAQ;YACT,UAAU,KAAK,kBAAkB;YACjC,SAAS,KAAK,UAAU;YACxB,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO;YAC1B,OAAO,CAAC,cAAc,KAAK,OAAO,CAAC,cAAc;YACjD,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM;YACjC,OAAO,CAAC,YAAY,KAAK,OAAO,CAAC,YAAY,CAC9C,CAAC;IACJ,CAAC,CAAC;IAEF,8EAA8E;IAC9E,MAAM,cAAc,GAAG,CAAC,OAA6B,EAAQ,EAAE;QAC7D,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACzF,CAAC,CAAC;IAEF,0EAA0E;IAC1E,MAAM,qBAAqB,GAAG,GAAS,EAAE;QACvC,UAAU,IAAI,CAAC,CAAC;QAChB,SAAS,EAAE,KAAK,EAAE,CAAC;QACnB,SAAS,GAAG,SAAS,CAAC;QACtB,aAAa,GAAG,SAAS,CAAC;QAC1B,kBAAkB,GAAG,KAAK,CAAC;QAC3B,UAAU,GAAG,SAAS,CAAC;QACvB,gBAAgB,GAAG,KAAK,CAAC;QACzB,OAAO,CAAC,mBAAmB,EAAE,CAAC,KAAK,CAAC,CAAC;QACrC,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5B,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAClC,CAAC,CAAC;IAEF,gFAAgF;IAChF,MAAM,qBAAqB,GAAG,GAAS,EAAE;QACvC,gBAAgB,GAAG,IAAI,CAAC;QACxB,OAAO,CAAC,mBAAmB,EAAE,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC,CAAC;IAEF,kFAAkF;IAClF,MAAM,MAAM,GAAG,CAAC,2BAA2B,GAAG,KAAK,EAAQ,EAAE;QAC3D,MAAM,SAAS,GAAG,2BAA2B,IAAI,kBAAkB,CAAC;QACpE,UAAU,IAAI,CAAC,CAAC;QAChB,SAAS,EAAE,KAAK,EAAE,CAAC;QACnB,SAAS,GAAG,SAAS,CAAC;QACtB,aAAa,GAAG,SAAS,CAAC;QAC1B,kBAAkB,GAAG,KAAK,CAAC;QAC3B,IAAI,SAAS;YAAE,qBAAqB,EAAE,CAAC;IACzC,CAAC,CAAC;IAEF,gFAAgF;IAChF,MAAM,YAAY,GAAG,CACnB,KAA2B,EAC3B,YAAyC,EACP,EAAE;QACpC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7F,OAAO,MAAM,CAAC,MAAM,CAClB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACjB,MAAM,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACtD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACrF,CAAC,CAAC,CACH,CAAC;IACJ,CAAC,CAAC;IAEF,wFAAwF;IACxF,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;QACrC,IAAI,QAAQ,IAAI,SAAS;YAAE,OAAO;QAClC,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,UAAU,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;QAC5C,IAAI,CAAC,UAAU;YAAE,OAAO;QACxB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,SAAS,GAAG,UAAU,CAAC;QACvB,aAAa,GAAG,MAAM,CAAC;QACvB,MAAM,kBAAkB,GAAG,EAAE,UAAU,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,aAAa,CAC/C,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,MAAM,EACd,UAAU,CAAC,MAAM,CAClB,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,UAAU,CAAC;gBAAE,OAAO;YAC3D,IAAI,UAAU,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBAC1C,qBAAqB,EAAE,CAAC;gBACxB,OAAO;YACT,CAAC;YACD,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAClC,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBACnC,OAAO;YACT,CAAC;YACD,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAC5E,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,UAAU,CAAC;gBAAE,OAAO;YAC3D,IAAI,iBAAiB,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBACjD,qBAAqB,EAAE,CAAC;YAC1B,CAAC;iBAAM,IAAI,iBAAiB,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAChD,cAAc,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC5C,CAAC;iBAAM,CAAC;gBACN,UAAU,GAAG;oBACX,IAAI,EAAE,OAAO;oBACb,cAAc,EAAE,OAAO,CAAC,cAAc;oBACtC,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,aAAa,EAAE,YAAY,CAAC,UAAU,CAAC,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC;oBACtE,YAAY,EAAE,iBAAiB,CAAC,KAAK;oBACrC,cAAc,EAAE,EAAE;iBACnB,CAAC;gBACF,gBAAgB,GAAG,KAAK,CAAC;gBACzB,OAAO,CAAC,mBAAmB,EAAE,CAAC,KAAK,CAAC,CAAC;gBACrC,OAAO,CAAC,UAAU,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;gBAC7B,SAAS,GAAG,SAAS,CAAC;gBACtB,aAAa,GAAG,SAAS,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,sFAAsF;IACtF,MAAM,kBAAkB,GAAG,KAAK,EAAE,aAAqB,EAAiB,EAAE;QACxE,IAAI,QAAQ,IAAI,gBAAgB,IAAI,CAAC,SAAS,IAAI,aAAa,KAAK,WAAW,CAAC;YAAE,OAAO;QACzF,IAAI,aAAa,KAAK,WAAW;YAAE,MAAM,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,UAAU,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;QAC5C,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU;YAAE,OAAO;QACvC,UAAU,GAAG;YACX,IAAI,EAAE,OAAO;YACb,cAAc,EAAE,UAAU,CAAC,cAAc;YACzC,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,aAAa,EAAE,UAAU,CAAC,aAAa;YACvC,YAAY,EAAE,UAAU,CAAC,YAAY;YACrC,cAAc,EAAE,EAAE;SACnB,CAAC;QACF,OAAO,CAAC,UAAU,CAAC,CAAC;QACpB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,SAAS,GAAG,UAAU,CAAC;QACvB,aAAa,GAAG,WAAW,CAAC;QAC5B,MAAM,kBAAkB,GAAG,EAAE,UAAU,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,aAAa,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;YAC5E,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,UAAU,CAAC;gBAAE,OAAO;YAC3D,IAAI,MAAM,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBACtC,qBAAqB,EAAE,CAAC;YAC1B,CAAC;iBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACrC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACjC,CAAC;iBAAM,IAAI,UAAU,EAAE,CAAC;gBACtB,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC7E,UAAU,GAAG;oBACX,GAAG,UAAU;oBACb,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;oBACvF,2BAA2B,EAAE,aAAa;iBAC3C,CAAC;gBACF,OAAO,CAAC,UAAU,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;gBAC7B,SAAS,GAAG,SAAS,CAAC;gBACtB,aAAa,GAAG,SAAS,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,0EAA0E;IAC1E,MAAM,aAAa,GAAG,CAAC,MAA0D,EAAW,EAAE;QAC5F,kBAAkB,GAAG,KAAK,CAAC;QAC3B,IAAI,MAAM,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YACtC,qBAAqB,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YACtC,qBAAqB,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9B,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC/B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,KAAK,CAAC;QAC9C,IAAI,0BAA0B,IAAI,MAAM,IAAI,MAAM,CAAC,wBAAwB,EAAE,CAAC;YAC5E,qBAAqB,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,sFAAsF;IACtF,MAAM,MAAM,GAAG,KAAK,EAAE,MAAc,EAAE,MAAe,EAAiB,EAAE;QACtE,IAAI,QAAQ,IAAI,SAAS,IAAI,gBAAgB;YAAE,OAAO;QACtD,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,UAAU,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;QAC5C,IAAI,CAAC,UAAU;YAAE,OAAO;QACxB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,SAAS,GAAG,UAAU,CAAC;QACvB,aAAa,GAAG,UAAU,CAAC;QAC3B,MAAM,kBAAkB,GAAG,EAAE,UAAU,CAAC;QACxC,IAAI,CAAC;YACH,kBAAkB,GAAG,IAAI,CAAC;YAC1B,MAAM,MAAM,GAAG,MAAM;gBACnB,CAAC,CAAC,MAAM,UAAU,CAAC,eAAe,CAC9B,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,MAAM,EACd,CAAC,MAAM,CAAC,EACR,UAAU,CAAC,MAAM,CAClB;gBACH,CAAC,CAAC,MAAM,UAAU,CAAC,eAAe,CAC9B,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,MAAM,EACd,CAAC,MAAM,CAAC,EACR,UAAU,CAAC,MAAM,CAClB,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,UAAU,CAAC;gBAAE,OAAO;YAC3D,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;gBAAE,OAAO;YACnC,SAAS,GAAG,SAAS,CAAC;YACtB,aAAa,GAAG,SAAS,CAAC;YAC1B,MAAM,IAAI,EAAE,CAAC;QACf,CAAC;gBAAS,CAAC;YACT,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;gBAC7B,SAAS,GAAG,SAAS,CAAC;gBACtB,aAAa,GAAG,SAAS,CAAC;gBAC1B,kBAAkB,GAAG,KAAK,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACL,IAAI;QACJ,kBAAkB;QAClB,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;QAC7C,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;QAC5C,MAAM,EAAE,IAAI;QACZ,qBAAqB,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;QACzC,OAAO;YACL,IAAI,QAAQ;gBAAE,OAAO;YACrB,MAAM,CAAC,IAAI,CAAC,CAAC;YACb,QAAQ,GAAG,IAAI,CAAC;YAChB,UAAU,GAAG,SAAS,CAAC;YACvB,IAAI,CAAC,gBAAgB;gBAAE,OAAO,CAAC,mBAAmB,EAAE,CAAC,KAAK,CAAC,CAAC;YAC5D,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC3C,CAAC;KACF,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,yBAAyB,CACvC,OAAqC;IAErC,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IACzC,MAAM,gBAAgB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IACjD,MAAM,iBAAiB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IACnD,IACE,YAAY,CAAC,IAAI,KAAK,eAAe;QACrC,CAAC,YAAY,CAAC,YAAY;QAC1B,CAAC,YAAY,CAAC,YAAY,CAAC,YAAY;QACvC,CAAC,gBAAgB;QACjB,CAAC,iBAAiB,EAClB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,UAA+C,CAAC;IACpD,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,MAAM,GAAwB,yBAAyB,CAAC;QAC5D,YAAY,EAAE,EAAE,EAAE,EAAE,YAAY,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,CAAC,YAAY,CAAC,IAAI,EAAE;QACxF,IAAI,EAAE,EAAE,EAAE,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE;QAChF,YAAY,EAAE,YAAY,CAAC,YAAY;QACvC,QAAQ,EAAE;YACR,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;YACxC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM;SAC3C;QACD,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QACtD,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YACnB,IAAI,CAAC,UAAU,IAAI,MAAM;gBAAE,OAAO;YAClC,IAAI,MAAM,CAAC,IAAI,KAAK,gBAAgB;gBAClC,KAAK,UAAU,CAAC,kBAAkB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;iBACtD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;gBAAE,KAAK,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;iBACxE,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;gBAAE,KAAK,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;iBACxE,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;gBAAE,KAAK,UAAU,CAAC,MAAM,EAAE,CAAC;;gBACvD,KAAK,EAAE,CAAC;QACf,CAAC;KACF,CAAC,CAAC;IAEH,0EAA0E;IAC1E,MAAM,KAAK,GAAG,CAAC,QAAQ,GAAG,IAAI,EAAQ,EAAE;QACtC,IAAI,MAAM;YAAE,OAAO;QACnB,MAAM,GAAG,IAAI,CAAC;QACd,MAAM,eAAe,GAAG,UAAU,CAAC;QACnC,UAAU,GAAG,SAAS,CAAC;QACvB,eAAe,EAAE,OAAO,EAAE,CAAC;QAC3B,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,IAAI,QAAQ;YAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAClD,OAAO,CAAC,QAAQ,EAAE,CAAC;IACrB,CAAC,CAAC;IAEF,UAAU,GAAG,6BAA6B,CAAC;QACzC,WAAW,EAAE,GAAG,EAAE;YAChB,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;YACnC,MAAM,eAAe,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YAChD,OAAO;gBACL,cAAc,EAAE,MAAM,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;gBACtF,MAAM,EAAE,eAAe,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE;gBAC1C,YAAY,EAAE,OAAO,CAAC,gBAAgB,EAAE;aACzC,CAAC;QACJ,CAAC;QACD,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,gBAAgB,EAAE,GAAG,EAAE;YACrB,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;YACnC,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,mBAAmB,EAAE,CAAC;gBAChF,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YACzD,CAAC;YACD,OAAO,CACL,OAAO,CAAC,yBAAyB,EAAE,EAAE,OAAO,EAAE;gBAC9C,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAC7D,CAAC;QACJ,CAAC;QACD,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE;YACtB,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACvB,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,CAAC;QACD,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;QAChD,qBAAqB,EAAE,GAAG,EAAE;YAC1B,KAAK,EAAE,CAAC;YACR,OAAO,CAAC,qBAAqB,EAAE,CAAC;QAClC,CAAC;KACF,CAAC,CAAC;IACH,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/C,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5E,MAAM,CAAC,YAAY,EAAE,CAAC;IACtB,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC;IACvB,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/** Focused DataGrid dialog for direct roles assigned to one selected user. */
|
|
2
|
+
import { Dialog } from '@jsvision/ui';
|
|
3
|
+
import type { View } from '@jsvision/ui';
|
|
4
|
+
import type { AdminApplication } from './application-state.js';
|
|
5
|
+
import type { AdminRbacFailureKind, AdminRole } from './rbac-state.js';
|
|
6
|
+
import type { AdminCapabilities } from './state.js';
|
|
7
|
+
/** Assigned role with an optional validated application label for presentation. */
|
|
8
|
+
export interface AdminAssignedUserRole extends AdminRole {
|
|
9
|
+
/** Application name when the current session may read the application catalog. */
|
|
10
|
+
readonly applicationName?: string;
|
|
11
|
+
}
|
|
12
|
+
/** Last complete validated projection retained by the focused dialog. */
|
|
13
|
+
export interface AdminUserRoleReadyProjection {
|
|
14
|
+
/** Ready-state discriminator. */
|
|
15
|
+
readonly kind: 'ready';
|
|
16
|
+
/** Organization that owns the selected user. */
|
|
17
|
+
readonly organizationId: string;
|
|
18
|
+
/** Selected user whose assignments are displayed. */
|
|
19
|
+
readonly userId: string;
|
|
20
|
+
/** Complete direct role assignments for the selected user. */
|
|
21
|
+
readonly assignedRoles: readonly AdminAssignedUserRole[];
|
|
22
|
+
/** Applications visible to the current session. */
|
|
23
|
+
readonly applications: readonly AdminApplication[];
|
|
24
|
+
/** Unassigned roles for the application currently chosen by Add. */
|
|
25
|
+
readonly availableRoles: readonly AdminRole[];
|
|
26
|
+
/** Application that owns `availableRoles`; absent while no successful role read is current. */
|
|
27
|
+
readonly availableRolesApplicationId?: string;
|
|
28
|
+
}
|
|
29
|
+
/** Complete state accepted by the focused User Roles dialog. */
|
|
30
|
+
export type AdminUserRoleViewState = {
|
|
31
|
+
readonly kind: 'closed';
|
|
32
|
+
} | AdminUserRoleReadyProjection | {
|
|
33
|
+
readonly kind: 'indeterminate';
|
|
34
|
+
readonly previous?: AdminUserRoleReadyProjection;
|
|
35
|
+
} | {
|
|
36
|
+
readonly kind: 'failure';
|
|
37
|
+
readonly failure: AdminRbacFailureKind;
|
|
38
|
+
readonly previous?: AdminUserRoleReadyProjection;
|
|
39
|
+
};
|
|
40
|
+
/** Closed set of direct actions emitted by the focused dialog. */
|
|
41
|
+
export type AdminUserRoleIntent = {
|
|
42
|
+
readonly kind: 'load-available';
|
|
43
|
+
readonly applicationId: string;
|
|
44
|
+
} | {
|
|
45
|
+
readonly kind: 'assign';
|
|
46
|
+
readonly roleId: string;
|
|
47
|
+
} | {
|
|
48
|
+
readonly kind: 'remove';
|
|
49
|
+
readonly roleId: string;
|
|
50
|
+
} | {
|
|
51
|
+
readonly kind: 'reload';
|
|
52
|
+
} | {
|
|
53
|
+
readonly kind: 'close';
|
|
54
|
+
};
|
|
55
|
+
/** Construction inputs for one selected user's role dialog. */
|
|
56
|
+
export interface AdminUserRoleDialogOptions {
|
|
57
|
+
/** Selected organization label and immutable owner. */
|
|
58
|
+
readonly organization: {
|
|
59
|
+
readonly id: string;
|
|
60
|
+
readonly name: string;
|
|
61
|
+
};
|
|
62
|
+
/** Selected user label and immutable owner. */
|
|
63
|
+
readonly user: {
|
|
64
|
+
readonly id: string;
|
|
65
|
+
readonly label: string;
|
|
66
|
+
};
|
|
67
|
+
/** Exact capabilities from the current verified session. */
|
|
68
|
+
readonly capabilities: AdminCapabilities;
|
|
69
|
+
/** Current terminal surface used to keep the modal fully visible. */
|
|
70
|
+
readonly viewport: {
|
|
71
|
+
readonly width: number;
|
|
72
|
+
readonly height: number;
|
|
73
|
+
};
|
|
74
|
+
/** Receives one explicit dialog action. */
|
|
75
|
+
readonly onIntent: (intent: AdminUserRoleIntent) => void;
|
|
76
|
+
/** Focuses a mounted control through the owning application loop. */
|
|
77
|
+
readonly focusView?: (view: View) => void;
|
|
78
|
+
}
|
|
79
|
+
/** Mounted owner for the focused User Roles dialog. */
|
|
80
|
+
export interface AdminUserRoleDialog {
|
|
81
|
+
/** Dialog mounted by the selected-user controller. */
|
|
82
|
+
readonly content: Dialog;
|
|
83
|
+
/** Replaces the complete validated projection. */
|
|
84
|
+
readonly setState: (state: AdminUserRoleViewState) => void;
|
|
85
|
+
/** Restores focus to the current grid or choice. */
|
|
86
|
+
readonly focusCurrent: () => void;
|
|
87
|
+
/** Clears protected role data without disposing the owner. */
|
|
88
|
+
readonly clear: () => void;
|
|
89
|
+
/** Releases retained rows and reactive sort observers. */
|
|
90
|
+
readonly dispose: () => void;
|
|
91
|
+
}
|
|
92
|
+
/** Creates the direct focused dialog without a reusable CRUD abstraction. */
|
|
93
|
+
export declare function createAdminUserRoleDialog(options: AdminUserRoleDialogOptions): AdminUserRoleDialog;
|
|
94
|
+
//# sourceMappingURL=user-role-dialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-role-dialog.d.ts","sourceRoot":"","sources":["../../src/admin/user-role-dialog.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAE9E,OAAO,EAOL,MAAM,EAUP,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAA6B,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,mFAAmF;AACnF,MAAM,WAAW,qBAAsB,SAAQ,SAAS;IACtD,kFAAkF;IAClF,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,yEAAyE;AACzE,MAAM,WAAW,4BAA4B;IAC3C,iCAAiC;IACjC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,gDAAgD;IAChD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,qDAAqD;IACrD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,8DAA8D;IAC9D,QAAQ,CAAC,aAAa,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACzD,mDAAmD;IACnD,QAAQ,CAAC,YAAY,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACnD,oEAAoE;IACpE,QAAQ,CAAC,cAAc,EAAE,SAAS,SAAS,EAAE,CAAC;IAC9C,+FAA+F;IAC/F,QAAQ,CAAC,2BAA2B,CAAC,EAAE,MAAM,CAAC;CAC/C;AAED,gEAAgE;AAChE,MAAM,MAAM,sBAAsB,GAC9B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B,4BAA4B,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,4BAA4B,CAAA;CAAE,GACpF;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,4BAA4B,CAAC;CAClD,CAAC;AAEN,kEAAkE;AAClE,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GACnE;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAE/B,+DAA+D;AAC/D,MAAM,WAAW,0BAA0B;IACzC,uDAAuD;IACvD,QAAQ,CAAC,YAAY,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D,4DAA4D;IAC5D,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC;IACzC,qEAAqE;IACrE,QAAQ,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACvE,2CAA2C;IAC3C,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACzD,qEAAqE;IACrE,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;CAC3C;AAED,uDAAuD;AACvD,MAAM,WAAW,mBAAmB;IAClC,sDAAsD;IACtD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,kDAAkD;IAClD,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,CAAC;IAC3D,oDAAoD;IACpD,QAAQ,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC;IAClC,8DAA8D;IAC9D,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;IAC3B,0DAA0D;IAC1D,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B;AAuCD,6EAA6E;AAC7E,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,0BAA0B,GAClC,mBAAmB,CA0RrB"}
|