@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,374 @@
|
|
|
1
|
+
/** Focused modal dialogs for user administration. */
|
|
2
|
+
import { Button, CheckGroup, col, Commands, cover, Dialog, fixed, Group, grow, Input, Label, Memo, row, signal, spacer, TabView, Text, } from '@jsvision/ui';
|
|
3
|
+
import { runAbortableAdminDialog } from './application-runtime.js';
|
|
4
|
+
import { deleteActionLabel, deleteConfirmationLayout } from './delete-confirmation-layout.js';
|
|
5
|
+
import { addCreateProfile, profileInput, profileSignals, profileTabs, SecretInput, textValidator, validInputs, } from './user-dialog-fields.js';
|
|
6
|
+
/** Returns a dialog size capped to the current terminal surface. */
|
|
7
|
+
function dialogSize(host, preferredWidth, preferredHeight) {
|
|
8
|
+
return {
|
|
9
|
+
width: Math.max(1, Math.min(preferredWidth, host.desktop.bounds.width)),
|
|
10
|
+
height: Math.max(1, Math.min(preferredHeight, host.desktop.bounds.height)),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/** Validates bounded multiline text while rejecting terminal control sequences. */
|
|
14
|
+
function validMultilineText(value, maximum) {
|
|
15
|
+
if (value.length > maximum)
|
|
16
|
+
return false;
|
|
17
|
+
for (const character of value) {
|
|
18
|
+
const codePoint = character.codePointAt(0) ?? 0;
|
|
19
|
+
if (codePoint === 0x0a || codePoint === 0x0d)
|
|
20
|
+
continue;
|
|
21
|
+
if (codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f))
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
/** Creates one naturally sized trailing action row. */
|
|
27
|
+
function actionRow(...buttons) {
|
|
28
|
+
return fixed(row({ gap: 1, justify: 'end' }, ...buttons), 2);
|
|
29
|
+
}
|
|
30
|
+
/** Creates one padded form row with a stable label column. */
|
|
31
|
+
function inputRow(label, input) {
|
|
32
|
+
return fixed(row({ gap: 1 }, fixed(new Label(label, input), 18), grow(input)), 1);
|
|
33
|
+
}
|
|
34
|
+
/** Collects nested inputs from Layout DSL groups for form-wide validation. */
|
|
35
|
+
function descendantInputs(root) {
|
|
36
|
+
const result = [];
|
|
37
|
+
const visit = (view) => {
|
|
38
|
+
if (view instanceof Input)
|
|
39
|
+
result.push(view);
|
|
40
|
+
if (view instanceof Group)
|
|
41
|
+
for (const child of view.children)
|
|
42
|
+
visit(child);
|
|
43
|
+
};
|
|
44
|
+
visit(root);
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
/** Converts an abort into the ordinary dialog cancellation command. */
|
|
48
|
+
async function runDialog(host, dialog, operationSignal) {
|
|
49
|
+
host.desktop.addWindow(dialog);
|
|
50
|
+
try {
|
|
51
|
+
return await runAbortableAdminDialog(host.loop, operationSignal, async () => (await host.loop.execView(dialog)) ?? Commands.cancel);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
if (error instanceof DOMException && error.name === 'AbortError')
|
|
55
|
+
return Commands.cancel;
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
host.desktop.removeWindow(dialog);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** Shows the complete create-user form and clears password signals on every exit. */
|
|
63
|
+
export async function showCreateUserDialog(host, operationSignal) {
|
|
64
|
+
const { width, height } = dialogSize(host, 76, 23);
|
|
65
|
+
const email = signal('');
|
|
66
|
+
const values = profileSignals();
|
|
67
|
+
const password = signal('');
|
|
68
|
+
const confirmation = signal('');
|
|
69
|
+
const emailValidator = textValidator(3, 255, false);
|
|
70
|
+
const passwordValidator = textValidator(8, 128);
|
|
71
|
+
const confirmationValidator = textValidator(8, 128);
|
|
72
|
+
const emailInput = new Input({
|
|
73
|
+
value: email,
|
|
74
|
+
maxLength: 255,
|
|
75
|
+
validator: emailValidator,
|
|
76
|
+
});
|
|
77
|
+
const givenNameInput = profileInput(values.givenName, 255);
|
|
78
|
+
const familyNameInput = profileInput(values.familyName, 255);
|
|
79
|
+
const passwordInput = new SecretInput({
|
|
80
|
+
value: password,
|
|
81
|
+
maxLength: 128,
|
|
82
|
+
validator: passwordValidator,
|
|
83
|
+
});
|
|
84
|
+
const confirmationInput = new SecretInput({
|
|
85
|
+
value: confirmation,
|
|
86
|
+
maxLength: 128,
|
|
87
|
+
validator: confirmationValidator,
|
|
88
|
+
});
|
|
89
|
+
const basic = new Group();
|
|
90
|
+
basic.add(cover(col({ gap: 1, padding: 1 }, inputRow('Email *', emailInput), inputRow('Given name', givenNameInput), inputRow('Family name', familyNameInput), inputRow('Password', passwordInput), inputRow('Confirm password', confirmationInput), fixed(new Text('* Required'), 1))));
|
|
91
|
+
const tabs = signal([
|
|
92
|
+
{ title: '~B~asic', content: basic },
|
|
93
|
+
...profileTabs(values),
|
|
94
|
+
]);
|
|
95
|
+
const dialog = new Dialog({ title: 'Create user', width, height, centered: true });
|
|
96
|
+
const inputs = [emailInput, givenNameInput, familyNameInput, passwordInput, confirmationInput];
|
|
97
|
+
for (const tab of tabs.peek().slice(1))
|
|
98
|
+
inputs.push(...descendantInputs(tab.content));
|
|
99
|
+
const canCreate = () => {
|
|
100
|
+
const emailValue = email();
|
|
101
|
+
const passwordValue = password();
|
|
102
|
+
const confirmationValue = confirmation();
|
|
103
|
+
const inputsAreBounded = inputs.every((input) => textValidator(0, input.getMaxLength()).isValid(input.getValueSignal()()));
|
|
104
|
+
return (inputsAreBounded &&
|
|
105
|
+
emailValidator.isValid(emailValue) &&
|
|
106
|
+
emailValue.includes('@') &&
|
|
107
|
+
passwordValidator.isValid(passwordValue) &&
|
|
108
|
+
confirmationValidator.isValid(confirmationValue) &&
|
|
109
|
+
passwordValue === confirmationValue);
|
|
110
|
+
};
|
|
111
|
+
const createButton = new Button('~C~reate', {
|
|
112
|
+
command: Commands.ok,
|
|
113
|
+
default: true,
|
|
114
|
+
disabled: () => !canCreate(),
|
|
115
|
+
});
|
|
116
|
+
dialog.add(cover(col({ gap: 1, padding: { top: 1, right: 2, bottom: 1, left: 2 } }, grow(new TabView({ tabs, active: signal(0) })), actionRow(createButton, new Button('Cancel', { command: Commands.cancel })))));
|
|
117
|
+
try {
|
|
118
|
+
while (true) {
|
|
119
|
+
const command = await runDialog(host, dialog, operationSignal);
|
|
120
|
+
if (command !== Commands.ok)
|
|
121
|
+
return { kind: 'cancel' };
|
|
122
|
+
if (!validInputs(inputs) || !canCreate())
|
|
123
|
+
continue;
|
|
124
|
+
const input = {
|
|
125
|
+
email: email.peek(),
|
|
126
|
+
...(password.peek()
|
|
127
|
+
? { password: password.peek(), passwordConfirmation: confirmation.peek() }
|
|
128
|
+
: {}),
|
|
129
|
+
};
|
|
130
|
+
addCreateProfile(input, values);
|
|
131
|
+
return { kind: 'create', input };
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
finally {
|
|
135
|
+
password.set('');
|
|
136
|
+
confirmation.set('');
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/** Shows a bounded plain-text invitation preview. */
|
|
140
|
+
async function showInvitationPreview(host, operationSignal, preview) {
|
|
141
|
+
const { width, height } = dialogSize(host, 72, 20);
|
|
142
|
+
const dialog = new Dialog({ title: 'Invitation preview', width, height, centered: true });
|
|
143
|
+
dialog.add(cover(col({ gap: 1, padding: { top: 1, right: 2, bottom: 1, left: 2 } }, grow(new Text(`Subject: ${preview.subject}\n\n${preview.text}`)), actionRow(new Button('~O~K', { command: Commands.ok, default: true })))));
|
|
144
|
+
await runDialog(host, dialog, operationSignal);
|
|
145
|
+
}
|
|
146
|
+
/** Shows the invite form with a same-input, non-assignment preview action. */
|
|
147
|
+
export async function showInviteUserDialog(host, operationSignal, loadPreview) {
|
|
148
|
+
const { width, height } = dialogSize(host, 68, 21);
|
|
149
|
+
const email = signal('');
|
|
150
|
+
const givenName = signal('');
|
|
151
|
+
const familyName = signal('');
|
|
152
|
+
const locale = signal('');
|
|
153
|
+
const personalMessage = signal('');
|
|
154
|
+
const message = signal('');
|
|
155
|
+
const inputs = [
|
|
156
|
+
new Input({ value: email, maxLength: 255, validator: textValidator(3, 255, false) }),
|
|
157
|
+
new Input({ value: givenName, maxLength: 255, validator: textValidator(1, 255) }),
|
|
158
|
+
new Input({ value: familyName, maxLength: 255, validator: textValidator(1, 255) }),
|
|
159
|
+
new Input({ value: locale, maxLength: 10, validator: textValidator(0, 10) }),
|
|
160
|
+
];
|
|
161
|
+
const personalMessageMemo = new Memo({ value: personalMessage });
|
|
162
|
+
const dialog = new Dialog({ title: 'Invite user', width, height, centered: true });
|
|
163
|
+
let previewBusy = false;
|
|
164
|
+
let parentOpen = true;
|
|
165
|
+
let previewGeneration = 0;
|
|
166
|
+
const collect = () => {
|
|
167
|
+
if (!validInputs(inputs) ||
|
|
168
|
+
!email.peek().includes('@') ||
|
|
169
|
+
!validMultilineText(personalMessage.peek(), 500))
|
|
170
|
+
return undefined;
|
|
171
|
+
return {
|
|
172
|
+
email: email.peek(),
|
|
173
|
+
...(givenName.peek() ? { givenName: givenName.peek() } : {}),
|
|
174
|
+
...(familyName.peek() ? { familyName: familyName.peek() } : {}),
|
|
175
|
+
...(locale.peek() ? { locale: locale.peek() } : {}),
|
|
176
|
+
...(personalMessage.peek() ? { personalMessage: personalMessage.peek() } : {}),
|
|
177
|
+
};
|
|
178
|
+
};
|
|
179
|
+
const previewButton = new Button('~P~review', {
|
|
180
|
+
disabled: () => previewBusy,
|
|
181
|
+
onClick: () => {
|
|
182
|
+
const input = collect();
|
|
183
|
+
if (!input || previewBusy) {
|
|
184
|
+
message.set('Validation failed');
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
previewBusy = true;
|
|
188
|
+
const generation = ++previewGeneration;
|
|
189
|
+
void loadPreview(input)
|
|
190
|
+
.then(async (result) => {
|
|
191
|
+
if (!parentOpen || generation !== previewGeneration || operationSignal.aborted)
|
|
192
|
+
return;
|
|
193
|
+
if (result.kind === 'success')
|
|
194
|
+
await showInvitationPreview(host, operationSignal, result.value);
|
|
195
|
+
else if (parentOpen && generation === previewGeneration)
|
|
196
|
+
message.set(result.kind === 'session-invalid'
|
|
197
|
+
? 'Authentication is required'
|
|
198
|
+
: result.failure === 'invalid-response'
|
|
199
|
+
? 'Invalid server response'
|
|
200
|
+
: 'Preview unavailable');
|
|
201
|
+
})
|
|
202
|
+
.finally(() => {
|
|
203
|
+
if (parentOpen && generation === previewGeneration)
|
|
204
|
+
previewBusy = false;
|
|
205
|
+
});
|
|
206
|
+
},
|
|
207
|
+
});
|
|
208
|
+
const inviteButton = new Button('~I~nvite', {
|
|
209
|
+
command: Commands.ok,
|
|
210
|
+
default: true,
|
|
211
|
+
disabled: () => previewBusy,
|
|
212
|
+
});
|
|
213
|
+
const cancelButton = new Button('Cancel', { command: Commands.cancel });
|
|
214
|
+
dialog.add(cover(col({ padding: { top: 1, right: 2, bottom: 1, left: 2 } }, fixed(col({ gap: 1 }, inputRow('Email', inputs[0]), inputRow('Given name', inputs[1]), inputRow('Family name', inputs[2]), inputRow('Locale', inputs[3])), 7), spacer({ fixed: 1 }), fixed(row({ gap: 1 }, fixed(new Label('Personal message', personalMessageMemo), 18), grow(personalMessageMemo)), 4), fixed(new Text(message), 1), spacer(), fixed(row({ gap: 1, justify: 'end' }, previewButton, inviteButton, cancelButton), 2))));
|
|
215
|
+
try {
|
|
216
|
+
while (true) {
|
|
217
|
+
const command = await runDialog(host, dialog, operationSignal);
|
|
218
|
+
if (command !== Commands.ok)
|
|
219
|
+
return { kind: 'cancel' };
|
|
220
|
+
if (previewBusy)
|
|
221
|
+
continue;
|
|
222
|
+
const input = collect();
|
|
223
|
+
if (input)
|
|
224
|
+
return { kind: 'invite', input };
|
|
225
|
+
message.set('Validation failed');
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
finally {
|
|
229
|
+
parentOpen = false;
|
|
230
|
+
previewGeneration += 1;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/** Adds one changed profile field, using null for an explicit clear. */
|
|
234
|
+
function changedField(input, key, current, original) {
|
|
235
|
+
if (current !== (original ?? ''))
|
|
236
|
+
Object.assign(input, { [key]: current || null });
|
|
237
|
+
}
|
|
238
|
+
/** Shows a read-only-email profile editor and returns only touched fields. */
|
|
239
|
+
export async function showEditUserDialog(host, operationSignal, detail) {
|
|
240
|
+
const { width, height } = dialogSize(host, 76, 23);
|
|
241
|
+
const values = profileSignals(detail);
|
|
242
|
+
const givenNameInput = profileInput(values.givenName, 255);
|
|
243
|
+
const familyNameInput = profileInput(values.familyName, 255);
|
|
244
|
+
const verified = signal([detail.phoneNumberVerified]);
|
|
245
|
+
const verification = new CheckGroup({ labels: ['Phone number ~v~erified'], value: verified });
|
|
246
|
+
const basic = new Group();
|
|
247
|
+
basic.add(cover(col({ gap: 1, padding: 1 }, fixed(new Text(`Email: ${detail.email} (read only)`), 1), inputRow('Given name', givenNameInput), inputRow('Family name', familyNameInput), fixed(verification, 1))));
|
|
248
|
+
const tabs = signal([
|
|
249
|
+
{ title: '~B~asic', content: basic },
|
|
250
|
+
...profileTabs(values),
|
|
251
|
+
]);
|
|
252
|
+
const dialog = new Dialog({ title: 'Edit user', width, height, centered: true });
|
|
253
|
+
dialog.add(cover(col({ gap: 1, padding: { top: 1, right: 2, bottom: 1, left: 2 } }, grow(new TabView({ tabs, active: signal(0) })), actionRow(new Button('~S~ave', { command: Commands.ok, default: true }), new Button('Cancel', { command: Commands.cancel })))));
|
|
254
|
+
const inputs = [givenNameInput, familyNameInput];
|
|
255
|
+
for (const tab of tabs.peek().slice(1))
|
|
256
|
+
inputs.push(...descendantInputs(tab.content));
|
|
257
|
+
while (true) {
|
|
258
|
+
const command = await runDialog(host, dialog, operationSignal);
|
|
259
|
+
if (command !== Commands.ok)
|
|
260
|
+
return { kind: 'cancel' };
|
|
261
|
+
if (!validInputs(inputs))
|
|
262
|
+
continue;
|
|
263
|
+
const input = {};
|
|
264
|
+
const fields = [
|
|
265
|
+
['givenName', 'givenName', detail.givenName],
|
|
266
|
+
['familyName', 'familyName', detail.familyName],
|
|
267
|
+
['middleName', 'middleName', detail.middleName],
|
|
268
|
+
['nickname', 'nickname', detail.nickname],
|
|
269
|
+
['preferredUsername', 'preferredUsername', detail.preferredUsername],
|
|
270
|
+
['profileUrl', 'profileUrl', detail.profileUrl],
|
|
271
|
+
['pictureUrl', 'pictureUrl', detail.pictureUrl],
|
|
272
|
+
['websiteUrl', 'websiteUrl', detail.websiteUrl],
|
|
273
|
+
['gender', 'gender', detail.gender],
|
|
274
|
+
['birthdate', 'birthdate', detail.birthdate],
|
|
275
|
+
['zoneinfo', 'zoneinfo', detail.zoneinfo],
|
|
276
|
+
['locale', 'locale', detail.locale],
|
|
277
|
+
['phoneNumber', 'phoneNumber', detail.phoneNumber],
|
|
278
|
+
];
|
|
279
|
+
for (const [key, source, original] of fields)
|
|
280
|
+
changedField(input, key, values[source].peek(), original);
|
|
281
|
+
if (verified.peek()[0] !== detail.phoneNumberVerified)
|
|
282
|
+
input.phoneNumberVerified = Boolean(verified.peek()[0]);
|
|
283
|
+
const address = {};
|
|
284
|
+
const addressFields = [
|
|
285
|
+
['street', 'addressStreet', detail.addressStreet],
|
|
286
|
+
['locality', 'addressLocality', detail.addressLocality],
|
|
287
|
+
['region', 'addressRegion', detail.addressRegion],
|
|
288
|
+
['postalCode', 'addressPostalCode', detail.addressPostalCode],
|
|
289
|
+
['country', 'addressCountry', detail.addressCountry],
|
|
290
|
+
];
|
|
291
|
+
for (const [key, source, original] of addressFields) {
|
|
292
|
+
const current = values[source].peek();
|
|
293
|
+
if (current !== (original ?? ''))
|
|
294
|
+
address[key] = current || null;
|
|
295
|
+
}
|
|
296
|
+
if (Object.keys(address).length > 0)
|
|
297
|
+
input.address = address;
|
|
298
|
+
return { kind: 'update', input };
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
/** Shows a masked set-password form and clears both secret signals on every exit. */
|
|
302
|
+
export async function showSetUserPasswordDialog(host, operationSignal, email) {
|
|
303
|
+
const { width, height } = dialogSize(host, 62, 14);
|
|
304
|
+
const password = signal('');
|
|
305
|
+
const confirmation = signal('');
|
|
306
|
+
const passwordInput = new SecretInput({
|
|
307
|
+
value: password,
|
|
308
|
+
maxLength: 128,
|
|
309
|
+
validator: textValidator(8, 128, false),
|
|
310
|
+
});
|
|
311
|
+
const confirmationInput = new SecretInput({
|
|
312
|
+
value: confirmation,
|
|
313
|
+
maxLength: 128,
|
|
314
|
+
validator: textValidator(8, 128, false),
|
|
315
|
+
});
|
|
316
|
+
const dialog = new Dialog({ title: 'Set password', width, height, centered: true });
|
|
317
|
+
dialog.add(cover(col({ gap: 1, padding: { top: 1, right: 2, bottom: 1, left: 2 } }, fixed(new Text(`User: ${email}`), 1), inputRow('Password', passwordInput), inputRow('Confirm password', confirmationInput), spacer(), actionRow(new Button('~S~et password', { command: Commands.ok, default: true }), new Button('Cancel', { command: Commands.cancel })))));
|
|
318
|
+
try {
|
|
319
|
+
while (true) {
|
|
320
|
+
const command = await runDialog(host, dialog, operationSignal);
|
|
321
|
+
if (command !== Commands.ok)
|
|
322
|
+
return { kind: 'cancel' };
|
|
323
|
+
if (validInputs([passwordInput, confirmationInput]) &&
|
|
324
|
+
password.peek() === confirmation.peek()) {
|
|
325
|
+
return {
|
|
326
|
+
kind: 'set-password',
|
|
327
|
+
input: { password: password.peek(), passwordConfirmation: confirmation.peek() },
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
finally {
|
|
333
|
+
password.set('');
|
|
334
|
+
confirmation.set('');
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
/** Shows one explicit user action with its exact email target. */
|
|
338
|
+
export async function showUserConfirmationDialog(host, operationSignal, action, email) {
|
|
339
|
+
const labels = {
|
|
340
|
+
'clear-password': 'Clear password',
|
|
341
|
+
'verify-email': 'Verify email',
|
|
342
|
+
deactivate: 'Deactivate',
|
|
343
|
+
activate: 'Activate',
|
|
344
|
+
};
|
|
345
|
+
const { width, height } = dialogSize(host, 58, 11);
|
|
346
|
+
const label = labels[action];
|
|
347
|
+
const targetState = action === 'deactivate' ? 'inactive' : action === 'activate' ? 'active' : undefined;
|
|
348
|
+
const dialog = new Dialog({ title: label, width, height, centered: true });
|
|
349
|
+
dialog.add(cover(col({ padding: { top: 1, right: 2, bottom: 1, left: 2 } }, fixed(new Text(`${label} for ${email}?${targetState ? `\nTarget state: ${targetState}` : ''}`), 2), spacer(), actionRow(new Button(label, { command: Commands.ok, default: true }), new Button('Cancel', { command: Commands.cancel })))));
|
|
350
|
+
return (await runDialog(host, dialog, operationSignal)) === Commands.ok
|
|
351
|
+
? { kind: action }
|
|
352
|
+
: { kind: 'cancel' };
|
|
353
|
+
}
|
|
354
|
+
/** Shows the irreversible physical user-deletion warning with Keep initially focused. */
|
|
355
|
+
export async function showDeleteUserDialog(host, operationSignal, organization, user) {
|
|
356
|
+
if (!organization || user.organizationId !== organization.id)
|
|
357
|
+
return { kind: 'cancel' };
|
|
358
|
+
const { width, height } = dialogSize(host, 64, 12);
|
|
359
|
+
const keep = new Button('Keep', { command: Commands.cancel, default: true });
|
|
360
|
+
const remove = new Button(deleteActionLabel(user.email, width), { command: Commands.yes });
|
|
361
|
+
const dialog = new Dialog({ title: 'Delete user', width, height, centered: true });
|
|
362
|
+
const confirmation = deleteConfirmationLayout({
|
|
363
|
+
dialogWidth: width,
|
|
364
|
+
details: `Organization: ${organization.name}\nUser: ${user.email}`,
|
|
365
|
+
warning: 'This physically deletes identity and security data. Audit records are retained separately.',
|
|
366
|
+
keep,
|
|
367
|
+
remove,
|
|
368
|
+
});
|
|
369
|
+
dialog.add(cover(confirmation.content));
|
|
370
|
+
const outcome = runDialog(host, dialog, operationSignal);
|
|
371
|
+
host.loop.focusView(keep);
|
|
372
|
+
return (await outcome) === Commands.yes ? { kind: 'delete' } : { kind: 'cancel' };
|
|
373
|
+
}
|
|
374
|
+
//# sourceMappingURL=user-dialogs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-dialogs.js","sourceRoot":"","sources":["../../src/admin/user-dialogs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/** Exact-context orchestration for direct roles assigned to one selected user. */
|
|
2
|
+
import type { AdminApplicationOperations } from './application-service.js';
|
|
3
|
+
import type { AdminApplication, AdminApplicationReadResult } from './application-state.js';
|
|
4
|
+
import type { AdminRbacOperations } from './rbac-service.js';
|
|
5
|
+
import type { AdminUserRoleViewState } from './user-role-dialog.js';
|
|
6
|
+
import type { AdminConnectionState } from './state.js';
|
|
7
|
+
import type { AdminUserDialogHost } from './user-dialogs.js';
|
|
8
|
+
import type { AdminUserSelection } from './user-state.js';
|
|
9
|
+
/** Immutable owner used to reject work from an old organization, user, or session. */
|
|
10
|
+
export interface AdminUserRoleContext {
|
|
11
|
+
/** Organization that owns the selected user. */
|
|
12
|
+
readonly organizationId: string;
|
|
13
|
+
/** Selected user whose direct roles are being managed. */
|
|
14
|
+
readonly userId: string;
|
|
15
|
+
/** Epoch advanced whenever the verified session is replaced. */
|
|
16
|
+
readonly sessionEpoch: number;
|
|
17
|
+
}
|
|
18
|
+
/** Exact RBAC operations required by the selected-user workflow. */
|
|
19
|
+
export type AdminUserRoleOperations = Pick<AdminRbacOperations, 'listUserRoles' | 'listRoles' | 'assignUserRoles' | 'removeUserRoles'>;
|
|
20
|
+
/** Dependencies for one selected-user role controller. */
|
|
21
|
+
export interface AdminUserRoleControllerOptions {
|
|
22
|
+
/** Reads the latest selected organization, user, and verified session. */
|
|
23
|
+
readonly readContext: () => AdminUserRoleContext;
|
|
24
|
+
/** Reads validated RBAC operations from the current authenticated session. */
|
|
25
|
+
readonly readOperations: () => AdminUserRoleOperations | undefined;
|
|
26
|
+
/** Loads the complete validated application catalog when that capability is available. */
|
|
27
|
+
readonly listApplications: (signal?: AbortSignal) => Promise<AdminApplicationReadResult<readonly AdminApplication[]>>;
|
|
28
|
+
/** Publishes immutable validated state to the focused dialog. */
|
|
29
|
+
readonly publishState: (state: AdminUserRoleViewState) => void;
|
|
30
|
+
/** Enters the existing authentication flow after a definite session transition. */
|
|
31
|
+
readonly requestAuthentication: () => void;
|
|
32
|
+
/** Gates sibling mutations while an unknown outcome awaits explicit Reload. */
|
|
33
|
+
readonly setRecoveryRequired?: (required: boolean) => void;
|
|
34
|
+
}
|
|
35
|
+
/** Direct selected-user role workflow boundary. */
|
|
36
|
+
export interface AdminUserRoleController {
|
|
37
|
+
/** Loads direct assignments and the readable application catalog. */
|
|
38
|
+
readonly load: () => Promise<void>;
|
|
39
|
+
/** Loads unassigned roles for one application selected by Add. */
|
|
40
|
+
readonly loadAvailableRoles: (applicationId: string) => Promise<void>;
|
|
41
|
+
/** Assigns one role and reloads authoritative assignments. */
|
|
42
|
+
readonly assignRole: (roleId: string) => Promise<void>;
|
|
43
|
+
/** Removes one role and reloads authoritative assignments. */
|
|
44
|
+
readonly removeRole: (roleId: string) => Promise<void>;
|
|
45
|
+
/** Performs deliberate read-only reconciliation without replaying a mutation. */
|
|
46
|
+
readonly reload: () => Promise<void>;
|
|
47
|
+
/** Cancels owned work and requires reconciliation after a dispatched mutation. */
|
|
48
|
+
readonly cancelActiveOperation: () => void;
|
|
49
|
+
/** Releases the controller and clears protected state. */
|
|
50
|
+
readonly dispose: () => void;
|
|
51
|
+
}
|
|
52
|
+
/** Inputs for mounting one complete focused User Roles modal from the User workspace. */
|
|
53
|
+
export interface AdminUserRoleWorkflowOptions {
|
|
54
|
+
/** Existing shell-owned modal host. */
|
|
55
|
+
readonly host: AdminUserDialogHost;
|
|
56
|
+
/** Reads the latest verified shell state and capabilities. */
|
|
57
|
+
readonly readState: () => AdminConnectionState;
|
|
58
|
+
/** Reads the selected user retained by the existing User controller. */
|
|
59
|
+
readonly readSelection: () => AdminUserSelection | undefined;
|
|
60
|
+
/** Reads the current verified-session epoch. */
|
|
61
|
+
readonly readSessionEpoch: () => number;
|
|
62
|
+
/** Reads validated RBAC operations from the current session. */
|
|
63
|
+
readonly readOperations: () => AdminUserRoleOperations | undefined;
|
|
64
|
+
/** Reads application operations used to label and choose roles. */
|
|
65
|
+
readonly readApplicationOperations: () => Pick<AdminApplicationOperations, 'listAll'> | undefined;
|
|
66
|
+
/** Gates sibling mutations while read-only reconciliation is required. */
|
|
67
|
+
readonly setRecoveryRequired?: (required: boolean) => void;
|
|
68
|
+
/** Enters the existing authentication flow after definite authority loss. */
|
|
69
|
+
readonly requestAuthentication: () => void;
|
|
70
|
+
/** Runs after the modal releases its controller, state, and window. */
|
|
71
|
+
readonly onClosed: () => void;
|
|
72
|
+
}
|
|
73
|
+
/** Handle used by the User controller to cancel the focused modal on context changes. */
|
|
74
|
+
export interface AdminUserRoleWorkflow {
|
|
75
|
+
/** Closes the modal and releases all owned asynchronous work. */
|
|
76
|
+
readonly close: () => void;
|
|
77
|
+
}
|
|
78
|
+
/** Creates the focused selected-user role workflow controller. */
|
|
79
|
+
export declare function createAdminUserRoleController(options: AdminUserRoleControllerOptions): AdminUserRoleController;
|
|
80
|
+
/** Opens one modal User Roles workflow using the existing shell event loop. */
|
|
81
|
+
export declare function openAdminUserRoleWorkflow(options: AdminUserRoleWorkflowOptions): AdminUserRoleWorkflow | undefined;
|
|
82
|
+
//# sourceMappingURL=user-role-controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-role-controller.d.ts","sourceRoot":"","sources":["../../src/admin/user-role-controller.ts"],"names":[],"mappings":"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"}
|