@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,472 @@
|
|
|
1
|
+
/** Operation ownership for the selected-organization management workspace. */
|
|
2
|
+
import { readFile as readBinaryFile } from 'node:fs/promises';
|
|
3
|
+
import { openFile as openNativeFile } from '@jsvision/files';
|
|
4
|
+
import { Button, col, Commands, cover, Dialog, fixed, row, spacer, Text, } from '@jsvision/ui';
|
|
5
|
+
/** Command value shared with the Organizations menu. */
|
|
6
|
+
export const MANAGE_ORGANIZATION_COMMAND = 'manage-organization';
|
|
7
|
+
/** Returns a stable identity for one authenticated organization context. */
|
|
8
|
+
function contextKey(state, sessionEpoch) {
|
|
9
|
+
return state.kind === 'authenticated' && state.organization
|
|
10
|
+
? `${sessionEpoch}:${state.organization.id}`
|
|
11
|
+
: undefined;
|
|
12
|
+
}
|
|
13
|
+
/** Returns a fixed failure for a completed non-success mutation. */
|
|
14
|
+
function mutationFailure(result) {
|
|
15
|
+
return result.kind === 'failure' ? result.failure : 'unavailable';
|
|
16
|
+
}
|
|
17
|
+
/** Supported image suffixes and the media type declared to the server. */
|
|
18
|
+
const IMAGE_CONTENT_TYPES = [
|
|
19
|
+
['.png', 'image/png'],
|
|
20
|
+
['.jpg', 'image/jpeg'],
|
|
21
|
+
['.jpeg', 'image/jpeg'],
|
|
22
|
+
['.webp', 'image/webp'],
|
|
23
|
+
['.ico', 'image/x-icon'],
|
|
24
|
+
['.svg', 'image/svg+xml'],
|
|
25
|
+
];
|
|
26
|
+
/** Maximum decoded byte size for each stored branding image slot. */
|
|
27
|
+
const ASSET_LIMITS = {
|
|
28
|
+
logo: 2 * 1024 * 1024,
|
|
29
|
+
favicon: 512 * 1024,
|
|
30
|
+
};
|
|
31
|
+
/** Resolves an approved media type from a user-selected filename. */
|
|
32
|
+
function imageContentType(path) {
|
|
33
|
+
const normalized = path.toLowerCase();
|
|
34
|
+
return IMAGE_CONTENT_TYPES.find(([suffix]) => normalized.endsWith(suffix))?.[1];
|
|
35
|
+
}
|
|
36
|
+
/** Opens one focused Keep/confirm dialog and always removes it. */
|
|
37
|
+
async function confirmAction(host, title, message, action) {
|
|
38
|
+
const dialog = new Dialog({ title, width: 46, height: 9, centered: true });
|
|
39
|
+
const keep = new Button('Keep', { command: Commands.cancel, default: true });
|
|
40
|
+
const confirm = new Button(action, { command: Commands.ok });
|
|
41
|
+
dialog.add(cover(col({ padding: 1, gap: 1 }, fixed(new Text(message), 1), spacer(), fixed(row({ gap: 1, justify: 'end' }, keep, confirm), 2))));
|
|
42
|
+
host.desktop.addWindow(dialog);
|
|
43
|
+
host.loop.focusView(keep);
|
|
44
|
+
try {
|
|
45
|
+
return (await host.loop.execView(dialog)) === Commands.ok;
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
host.desktop.removeWindow(dialog);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** Creates the small controller for one active organization at a time. */
|
|
52
|
+
export function createAdminOrganizationController(options) {
|
|
53
|
+
let key;
|
|
54
|
+
let organizationId;
|
|
55
|
+
let generation = 0;
|
|
56
|
+
let workspace;
|
|
57
|
+
let mounted = false;
|
|
58
|
+
let projection;
|
|
59
|
+
const pendingTabs = new Set();
|
|
60
|
+
let disposed = false;
|
|
61
|
+
/** Publishes state only to the current workspace owner. */
|
|
62
|
+
const publish = (state) => {
|
|
63
|
+
if (!disposed)
|
|
64
|
+
workspace?.setState(state);
|
|
65
|
+
};
|
|
66
|
+
/** Mounts the workspace only after its first authoritative load has settled. */
|
|
67
|
+
const mount = () => {
|
|
68
|
+
if (!mounted && workspace) {
|
|
69
|
+
options.mountWorkspace(workspace.content);
|
|
70
|
+
mounted = true;
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
/** Publishes authoritative data with current per-tab pending ownership. */
|
|
74
|
+
const publishReady = (feedback = {}) => {
|
|
75
|
+
if (!projection)
|
|
76
|
+
return;
|
|
77
|
+
publish({
|
|
78
|
+
kind: 'ready',
|
|
79
|
+
...projection,
|
|
80
|
+
...(pendingTabs.size > 0 ? { pendingTabs: [...pendingTabs] } : {}),
|
|
81
|
+
...feedback,
|
|
82
|
+
});
|
|
83
|
+
};
|
|
84
|
+
/** Closes the current workspace and invalidates every late continuation. */
|
|
85
|
+
const close = () => {
|
|
86
|
+
generation += 1;
|
|
87
|
+
pendingTabs.clear();
|
|
88
|
+
projection = undefined;
|
|
89
|
+
workspace?.clear?.();
|
|
90
|
+
workspace = undefined;
|
|
91
|
+
mounted = false;
|
|
92
|
+
options.mountWorkspace(null);
|
|
93
|
+
};
|
|
94
|
+
/** Returns true only for a continuation that still owns the selected context. */
|
|
95
|
+
const owns = (capturedGeneration, capturedId) => !disposed && generation === capturedGeneration && organizationId === capturedId;
|
|
96
|
+
/** Returns true when the latest verified session may update the captured organization. */
|
|
97
|
+
const hasCapability = (owner, capability) => {
|
|
98
|
+
const state = options.readState();
|
|
99
|
+
return (owns(owner.generation, owner.organizationId) &&
|
|
100
|
+
state.kind === 'authenticated' &&
|
|
101
|
+
state.organization?.id === owner.organizationId &&
|
|
102
|
+
(capability === 'update'
|
|
103
|
+
? state.capabilities.canUpdateOrganizations
|
|
104
|
+
: state.capabilities.canSuspendOrganizations));
|
|
105
|
+
};
|
|
106
|
+
/** Ends the stale workspace and delegates authentication to the existing coordinator. */
|
|
107
|
+
const sessionInvalid = () => {
|
|
108
|
+
close();
|
|
109
|
+
options.requestAuthentication();
|
|
110
|
+
};
|
|
111
|
+
/** Loads the complete organization and asset metadata into one authoritative projection. */
|
|
112
|
+
const load = async (owner) => {
|
|
113
|
+
const operations = options.readOperations();
|
|
114
|
+
const selectedId = owner?.organizationId ?? organizationId;
|
|
115
|
+
const capturedGeneration = owner?.generation ?? generation;
|
|
116
|
+
if (!selectedId || !owns(capturedGeneration, selectedId)) {
|
|
117
|
+
return { kind: 'stale' };
|
|
118
|
+
}
|
|
119
|
+
if (!operations)
|
|
120
|
+
return { kind: 'failure', failure: 'unavailable' };
|
|
121
|
+
if (projection)
|
|
122
|
+
publish({ kind: 'loading', previous: projection });
|
|
123
|
+
const organizationResult = await operations.get(selectedId, new AbortController().signal);
|
|
124
|
+
if (!owns(capturedGeneration, selectedId))
|
|
125
|
+
return { kind: 'stale' };
|
|
126
|
+
if (organizationResult.kind === 'session-invalid') {
|
|
127
|
+
sessionInvalid();
|
|
128
|
+
return { kind: 'stale' };
|
|
129
|
+
}
|
|
130
|
+
if (organizationResult.kind === 'failure') {
|
|
131
|
+
if (!projection) {
|
|
132
|
+
mount();
|
|
133
|
+
publish({ kind: 'failure', failure: organizationResult.failure });
|
|
134
|
+
}
|
|
135
|
+
return organizationResult;
|
|
136
|
+
}
|
|
137
|
+
const assetResult = await operations.listAssets(selectedId, new AbortController().signal);
|
|
138
|
+
if (!owns(capturedGeneration, selectedId))
|
|
139
|
+
return { kind: 'stale' };
|
|
140
|
+
if (assetResult.kind === 'session-invalid') {
|
|
141
|
+
sessionInvalid();
|
|
142
|
+
return { kind: 'stale' };
|
|
143
|
+
}
|
|
144
|
+
if (assetResult.kind === 'failure') {
|
|
145
|
+
if (!projection) {
|
|
146
|
+
mount();
|
|
147
|
+
publish({
|
|
148
|
+
kind: 'failure',
|
|
149
|
+
failure: assetResult.failure,
|
|
150
|
+
organization: organizationResult.value,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
return assetResult;
|
|
154
|
+
}
|
|
155
|
+
projection = { organization: organizationResult.value, assets: assetResult.value };
|
|
156
|
+
options.onOrganizationChange?.(organizationResult.value);
|
|
157
|
+
mount();
|
|
158
|
+
publishReady();
|
|
159
|
+
if (!owner)
|
|
160
|
+
workspace?.focusCurrent();
|
|
161
|
+
return { kind: 'success' };
|
|
162
|
+
};
|
|
163
|
+
/** Runs one tab-owned mutation and reconciles its authoritative resources. */
|
|
164
|
+
const mutate = async (tab, invoke, reload = load, capturedOwner, requiredCapability = 'update') => {
|
|
165
|
+
const operations = options.readOperations();
|
|
166
|
+
const selectedId = capturedOwner?.organizationId ?? organizationId;
|
|
167
|
+
const capturedGeneration = capturedOwner?.generation ?? generation;
|
|
168
|
+
const owner = selectedId
|
|
169
|
+
? { generation: capturedGeneration, organizationId: selectedId }
|
|
170
|
+
: undefined;
|
|
171
|
+
if (!operations || !owner || !hasCapability(owner, requiredCapability) || pendingTabs.has(tab)) {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
pendingTabs.add(tab);
|
|
175
|
+
publishReady();
|
|
176
|
+
const result = await invoke(operations, owner.organizationId);
|
|
177
|
+
if (!owns(capturedGeneration, owner.organizationId))
|
|
178
|
+
return;
|
|
179
|
+
if (result.kind === 'session-invalid')
|
|
180
|
+
return sessionInvalid();
|
|
181
|
+
if (result.kind === 'cancelled') {
|
|
182
|
+
pendingTabs.delete(tab);
|
|
183
|
+
publishReady();
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
if (result.kind === 'success') {
|
|
187
|
+
const reloadResult = await reload(owner);
|
|
188
|
+
if (!owns(capturedGeneration, owner.organizationId) || reloadResult.kind === 'stale')
|
|
189
|
+
return;
|
|
190
|
+
pendingTabs.delete(tab);
|
|
191
|
+
if (reloadResult.kind === 'success')
|
|
192
|
+
publishReady({ savedTab: tab });
|
|
193
|
+
else
|
|
194
|
+
publishReady({ failure: reloadResult.failure, feedbackTab: tab });
|
|
195
|
+
workspace?.focusCurrent();
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
const reloadResult = await reload(owner);
|
|
199
|
+
if (!owns(capturedGeneration, owner.organizationId) || reloadResult.kind === 'stale')
|
|
200
|
+
return;
|
|
201
|
+
pendingTabs.delete(tab);
|
|
202
|
+
if (reloadResult.kind === 'success') {
|
|
203
|
+
publishReady({
|
|
204
|
+
failure: mutationFailure(result),
|
|
205
|
+
feedbackTab: tab,
|
|
206
|
+
reloadedAfterFailure: true,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
publishReady({ failure: reloadResult.failure, feedbackTab: tab });
|
|
211
|
+
}
|
|
212
|
+
workspace?.focusCurrent();
|
|
213
|
+
};
|
|
214
|
+
/** Reloads both authentication resources once after a save outcome. */
|
|
215
|
+
const reloadAuthentication = async (owner) => {
|
|
216
|
+
const operations = options.readOperations();
|
|
217
|
+
const selectedId = owner.organizationId;
|
|
218
|
+
const current = projection;
|
|
219
|
+
if (!owns(owner.generation, selectedId))
|
|
220
|
+
return { kind: 'stale' };
|
|
221
|
+
if (!operations || !current)
|
|
222
|
+
return { kind: 'failure', failure: 'unavailable' };
|
|
223
|
+
const methods = await operations.getLoginMethods(selectedId, new AbortController().signal);
|
|
224
|
+
if (!owns(owner.generation, selectedId))
|
|
225
|
+
return { kind: 'stale' };
|
|
226
|
+
if (methods.kind === 'session-invalid') {
|
|
227
|
+
sessionInvalid();
|
|
228
|
+
return { kind: 'stale' };
|
|
229
|
+
}
|
|
230
|
+
const policy = await operations.getTwoFactorPolicy(selectedId, new AbortController().signal);
|
|
231
|
+
if (!owns(owner.generation, selectedId))
|
|
232
|
+
return { kind: 'stale' };
|
|
233
|
+
if (policy.kind === 'session-invalid') {
|
|
234
|
+
sessionInvalid();
|
|
235
|
+
return { kind: 'stale' };
|
|
236
|
+
}
|
|
237
|
+
if (methods.kind === 'success' && policy.kind === 'success') {
|
|
238
|
+
projection = {
|
|
239
|
+
...current,
|
|
240
|
+
organization: {
|
|
241
|
+
...current.organization,
|
|
242
|
+
defaultLoginMethods: methods.value,
|
|
243
|
+
twoFactorPolicy: policy.value,
|
|
244
|
+
},
|
|
245
|
+
};
|
|
246
|
+
return { kind: 'success' };
|
|
247
|
+
}
|
|
248
|
+
if (methods.kind === 'failure')
|
|
249
|
+
return methods;
|
|
250
|
+
if (policy.kind === 'failure')
|
|
251
|
+
return policy;
|
|
252
|
+
return { kind: 'stale' };
|
|
253
|
+
};
|
|
254
|
+
/** Reloads only uploaded image metadata after one immediate asset action. */
|
|
255
|
+
const reloadAssets = async (owner) => {
|
|
256
|
+
const operations = options.readOperations();
|
|
257
|
+
const selectedId = owner.organizationId;
|
|
258
|
+
const current = projection;
|
|
259
|
+
if (!owns(owner.generation, selectedId))
|
|
260
|
+
return { kind: 'stale' };
|
|
261
|
+
if (!operations || !current)
|
|
262
|
+
return { kind: 'failure', failure: 'unavailable' };
|
|
263
|
+
const result = await operations.listAssets(selectedId, new AbortController().signal);
|
|
264
|
+
if (!owns(owner.generation, selectedId))
|
|
265
|
+
return { kind: 'stale' };
|
|
266
|
+
if (result.kind === 'session-invalid') {
|
|
267
|
+
sessionInvalid();
|
|
268
|
+
return { kind: 'stale' };
|
|
269
|
+
}
|
|
270
|
+
if (result.kind === 'failure')
|
|
271
|
+
return result;
|
|
272
|
+
projection = { ...current, assets: result.value };
|
|
273
|
+
return { kind: 'success' };
|
|
274
|
+
};
|
|
275
|
+
/** Selects, validates, and immediately uploads one local branding image. */
|
|
276
|
+
const uploadAsset = async (assetType, owner) => {
|
|
277
|
+
if (!projection || !hasCapability(owner, 'update') || pendingTabs.has('branding'))
|
|
278
|
+
return;
|
|
279
|
+
const pick = options.openFile ?? ((pickerOptions) => openNativeFile(options.host, pickerOptions));
|
|
280
|
+
let path;
|
|
281
|
+
try {
|
|
282
|
+
path = await pick({
|
|
283
|
+
title: 'Select image (PNG, JPEG, WebP, ICO, SVG)',
|
|
284
|
+
wildcard: '*.*',
|
|
285
|
+
filter: (entry) => entry.kind === 'dir' ||
|
|
286
|
+
(entry.kind === 'file' && imageContentType(entry.name) !== undefined),
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
catch {
|
|
290
|
+
if (owns(owner.generation, owner.organizationId)) {
|
|
291
|
+
publishReady({ failure: 'file-read', feedbackTab: 'branding' });
|
|
292
|
+
workspace?.focusCurrent();
|
|
293
|
+
}
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
if (!owns(owner.generation, owner.organizationId))
|
|
297
|
+
return;
|
|
298
|
+
if (!path) {
|
|
299
|
+
workspace?.focusCurrent();
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
const contentType = imageContentType(path);
|
|
303
|
+
if (!contentType) {
|
|
304
|
+
publishReady({ failure: 'file-type', feedbackTab: 'branding' });
|
|
305
|
+
workspace?.focusCurrent();
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
let bytes;
|
|
309
|
+
try {
|
|
310
|
+
bytes = await (options.readFile ?? readBinaryFile)(path);
|
|
311
|
+
}
|
|
312
|
+
catch {
|
|
313
|
+
if (owns(owner.generation, owner.organizationId)) {
|
|
314
|
+
publishReady({ failure: 'file-read', feedbackTab: 'branding' });
|
|
315
|
+
workspace?.focusCurrent();
|
|
316
|
+
}
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
if (!owns(owner.generation, owner.organizationId))
|
|
320
|
+
return;
|
|
321
|
+
if (bytes.length === 0 || bytes.length > ASSET_LIMITS[assetType]) {
|
|
322
|
+
publishReady({ failure: 'file-size', feedbackTab: 'branding' });
|
|
323
|
+
workspace?.focusCurrent();
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
await mutate('branding', (operations, id) => operations.uploadAsset(id, assetType, { contentType, data: Buffer.from(bytes).toString('base64') }, new AbortController().signal), reloadAssets, owner);
|
|
327
|
+
};
|
|
328
|
+
/** Confirms and immediately removes one stored branding image. */
|
|
329
|
+
const removeAsset = async (assetType, owner) => {
|
|
330
|
+
if (!projection || !hasCapability(owner, 'update') || pendingTabs.has('branding'))
|
|
331
|
+
return;
|
|
332
|
+
const label = assetType === 'logo' ? 'logo' : 'favicon';
|
|
333
|
+
const confirmed = await confirmAction(options.host, `Remove ${label}`, `Remove the uploaded ${label}?`, 'Remove');
|
|
334
|
+
if (!owns(owner.generation, owner.organizationId))
|
|
335
|
+
return;
|
|
336
|
+
if (!confirmed) {
|
|
337
|
+
workspace?.focusCurrent();
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
await mutate('branding', (operations, id) => operations.deleteAsset(id, assetType, new AbortController().signal), reloadAssets, owner);
|
|
341
|
+
};
|
|
342
|
+
/** Applies only changed authentication resources in a fixed sequential order. */
|
|
343
|
+
const saveAuthentication = async (intent, owner) => {
|
|
344
|
+
const current = projection?.organization;
|
|
345
|
+
if (!current || !hasCapability(owner, 'update'))
|
|
346
|
+
return;
|
|
347
|
+
const methodsChanged = intent.loginMethods.length !== current.defaultLoginMethods.length ||
|
|
348
|
+
intent.loginMethods.some((method) => !current.defaultLoginMethods.includes(method));
|
|
349
|
+
const policyChanged = intent.twoFactorPolicy !== current.twoFactorPolicy;
|
|
350
|
+
if (!methodsChanged && !policyChanged)
|
|
351
|
+
return;
|
|
352
|
+
await mutate('authentication', async (operations, id) => {
|
|
353
|
+
if (methodsChanged) {
|
|
354
|
+
const result = await operations.updateLoginMethods(id, intent.loginMethods);
|
|
355
|
+
if (result.kind !== 'success')
|
|
356
|
+
return result;
|
|
357
|
+
if (!owns(owner.generation, owner.organizationId))
|
|
358
|
+
return { kind: 'cancelled' };
|
|
359
|
+
}
|
|
360
|
+
return policyChanged
|
|
361
|
+
? operations.updateTwoFactorPolicy(id, intent.twoFactorPolicy)
|
|
362
|
+
: { kind: 'success' };
|
|
363
|
+
}, reloadAuthentication, owner);
|
|
364
|
+
};
|
|
365
|
+
/** Handles one focused lifecycle action. */
|
|
366
|
+
const lifecycle = async (action, owner) => {
|
|
367
|
+
const current = projection?.organization;
|
|
368
|
+
if (!current || !hasCapability(owner, 'suspend') || pendingTabs.has('overview'))
|
|
369
|
+
return;
|
|
370
|
+
if (action === 'suspend') {
|
|
371
|
+
if (current.isSuperAdmin)
|
|
372
|
+
return;
|
|
373
|
+
const confirmed = await confirmAction(options.host, 'Suspend organization', `Suspend ${current.name}?`, 'Suspend');
|
|
374
|
+
if (!owns(owner.generation, owner.organizationId))
|
|
375
|
+
return;
|
|
376
|
+
if (!confirmed) {
|
|
377
|
+
workspace?.focusCurrent();
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
await mutate('overview', (operations, id) => operations[action](id), load, owner, 'suspend');
|
|
382
|
+
};
|
|
383
|
+
/** Dispatches one workspace intent only while its opening context still owns the controller. */
|
|
384
|
+
const dispatchIntent = (intent, owner) => {
|
|
385
|
+
if (!owns(owner.generation, owner.organizationId))
|
|
386
|
+
return;
|
|
387
|
+
switch (intent.kind) {
|
|
388
|
+
case 'save-overview':
|
|
389
|
+
if (!hasCapability(owner, 'update'))
|
|
390
|
+
return;
|
|
391
|
+
void mutate('overview', (operations, id) => operations.update(id, intent.input), load, owner);
|
|
392
|
+
return;
|
|
393
|
+
case 'activate':
|
|
394
|
+
case 'suspend':
|
|
395
|
+
void lifecycle(intent.kind, owner);
|
|
396
|
+
return;
|
|
397
|
+
case 'save-authentication':
|
|
398
|
+
if (!hasCapability(owner, 'update'))
|
|
399
|
+
return;
|
|
400
|
+
void saveAuthentication(intent, owner);
|
|
401
|
+
return;
|
|
402
|
+
case 'save-branding':
|
|
403
|
+
if (!hasCapability(owner, 'update'))
|
|
404
|
+
return;
|
|
405
|
+
void mutate('branding', (operations, id) => operations.updateBranding(id, intent.input), load, owner);
|
|
406
|
+
return;
|
|
407
|
+
case 'upload-asset':
|
|
408
|
+
if (!hasCapability(owner, 'update'))
|
|
409
|
+
return;
|
|
410
|
+
void uploadAsset(intent.assetType, owner);
|
|
411
|
+
return;
|
|
412
|
+
case 'remove-asset':
|
|
413
|
+
if (!hasCapability(owner, 'update'))
|
|
414
|
+
return;
|
|
415
|
+
void removeAsset(intent.assetType, owner);
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
};
|
|
419
|
+
/** Handles a direct controller intent in the current selected-organization context. */
|
|
420
|
+
const handleIntent = (intent) => {
|
|
421
|
+
const selectedId = organizationId;
|
|
422
|
+
if (!selectedId)
|
|
423
|
+
return;
|
|
424
|
+
dispatchIntent(intent, { generation, organizationId: selectedId });
|
|
425
|
+
};
|
|
426
|
+
return {
|
|
427
|
+
syncContext(state, sessionEpoch) {
|
|
428
|
+
const nextKey = contextKey(state, sessionEpoch);
|
|
429
|
+
if (nextKey === key)
|
|
430
|
+
return;
|
|
431
|
+
if (workspace || key !== undefined)
|
|
432
|
+
close();
|
|
433
|
+
key = nextKey;
|
|
434
|
+
organizationId = state.kind === 'authenticated' ? state.organization?.id : undefined;
|
|
435
|
+
},
|
|
436
|
+
handleCommand(command) {
|
|
437
|
+
if (command !== MANAGE_ORGANIZATION_COMMAND)
|
|
438
|
+
return false;
|
|
439
|
+
const state = options.readState();
|
|
440
|
+
if (disposed ||
|
|
441
|
+
workspace ||
|
|
442
|
+
state.kind !== 'authenticated' ||
|
|
443
|
+
!state.organization ||
|
|
444
|
+
!state.capabilities.canReadOrganizations) {
|
|
445
|
+
return true;
|
|
446
|
+
}
|
|
447
|
+
organizationId = state.organization.id;
|
|
448
|
+
const workspaceOwner = { generation, organizationId: state.organization.id };
|
|
449
|
+
workspace = options.workspaceFactory({
|
|
450
|
+
capabilities: state.capabilities,
|
|
451
|
+
onIntent: (intent) => dispatchIntent(intent, workspaceOwner),
|
|
452
|
+
focusView: (view) => options.host.loop.focusView(view),
|
|
453
|
+
onClose: () => {
|
|
454
|
+
close();
|
|
455
|
+
options.onWorkspaceClosed?.();
|
|
456
|
+
},
|
|
457
|
+
});
|
|
458
|
+
void load();
|
|
459
|
+
return true;
|
|
460
|
+
},
|
|
461
|
+
handleIntent,
|
|
462
|
+
isOpen: () => workspace !== undefined,
|
|
463
|
+
close,
|
|
464
|
+
dispose() {
|
|
465
|
+
if (disposed)
|
|
466
|
+
return;
|
|
467
|
+
close();
|
|
468
|
+
disposed = true;
|
|
469
|
+
},
|
|
470
|
+
};
|
|
471
|
+
}
|
|
472
|
+
//# sourceMappingURL=organization-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organization-controller.js","sourceRoot":"","sources":["../../src/admin/organization-controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/** Organization and identity dialogs for the embedded administration application. */
|
|
2
|
+
import type { CreateOrganizationInput } from '@portaidentity/sdk';
|
|
3
|
+
import type { EventLoop, ModalDialogHost } from '@jsvision/ui';
|
|
4
|
+
import type { AdminCapabilities, AdminConnectionState, AdminOrganizationFailureKind, AdminOrganizationContext, AdminOrganizationResult } from './state.js';
|
|
5
|
+
/** Authenticated state accepted by the read-only identity dialog. */
|
|
6
|
+
export type AuthenticatedAdminState = Extract<AdminConnectionState, {
|
|
7
|
+
readonly kind: 'authenticated';
|
|
8
|
+
}>;
|
|
9
|
+
/** Inputs supplied by the application-owned organization listing operation. */
|
|
10
|
+
export interface OrganizationChooserOptions {
|
|
11
|
+
/** Capabilities from the current live verified session. */
|
|
12
|
+
readonly capabilities: AdminCapabilities;
|
|
13
|
+
/** Current list operation, omitted when listing is not allowed. */
|
|
14
|
+
readonly organizations?: Promise<AdminOrganizationResult<readonly AdminOrganizationContext[]>>;
|
|
15
|
+
/** Fixed failure retained while an authoritative organization list is reloaded. */
|
|
16
|
+
readonly failure?: AdminOrganizationFailureKind;
|
|
17
|
+
}
|
|
18
|
+
/** User choice returned by the organization chooser. */
|
|
19
|
+
export type OrganizationChoiceResult = {
|
|
20
|
+
readonly kind: 'switch';
|
|
21
|
+
readonly organization: AdminOrganizationContext;
|
|
22
|
+
} | {
|
|
23
|
+
readonly kind: 'delete';
|
|
24
|
+
readonly organization: AdminOrganizationContext;
|
|
25
|
+
} | {
|
|
26
|
+
readonly kind: 'create';
|
|
27
|
+
} | {
|
|
28
|
+
readonly kind: 'reauthenticate';
|
|
29
|
+
} | {
|
|
30
|
+
readonly kind: 'cancel';
|
|
31
|
+
};
|
|
32
|
+
/** User choice returned by the create-organization form. */
|
|
33
|
+
export type CreateOrganizationDialogResult = {
|
|
34
|
+
readonly kind: 'create';
|
|
35
|
+
readonly input: CreateOrganizationInput;
|
|
36
|
+
} | {
|
|
37
|
+
readonly kind: 'cancel';
|
|
38
|
+
};
|
|
39
|
+
/** Result of the irreversible organization-deletion dialog. */
|
|
40
|
+
export type DeleteOrganizationDialogResult = {
|
|
41
|
+
readonly kind: 'delete';
|
|
42
|
+
readonly organizationId: string;
|
|
43
|
+
} | {
|
|
44
|
+
readonly kind: 'cancel';
|
|
45
|
+
};
|
|
46
|
+
/** Modal host needed for abort-driven organization deletion confirmation. */
|
|
47
|
+
export interface AdminOrganizationDeleteDialogHost extends ModalDialogHost {
|
|
48
|
+
/** Event loop that can close an owned modal when its operation is cancelled. */
|
|
49
|
+
readonly loop: ModalDialogHost['loop'] & Pick<EventLoop, 'endModal' | 'focusView'>;
|
|
50
|
+
}
|
|
51
|
+
/** Explicit choice returned by the blocking unauthenticated gate. */
|
|
52
|
+
export type AuthenticationGateChoice = 'authenticate' | 'quit';
|
|
53
|
+
/** Shows the mandatory authentication gate and returns one explicit user choice. */
|
|
54
|
+
export declare function showAuthenticationGate(host: ModalDialogHost): Promise<AuthenticationGateChoice>;
|
|
55
|
+
/** Shows trusted identity details and restores the previously focused control on close. */
|
|
56
|
+
export declare function showWhoAmIDialog(host: ModalDialogHost, state: AuthenticatedAdminState, insecure: boolean): Promise<void>;
|
|
57
|
+
/** Shows the organization list and returns only an explicit typed choice. */
|
|
58
|
+
export declare function showOrganizationChooser(host: ModalDialogHost, options: OrganizationChooserOptions): Promise<OrganizationChoiceResult>;
|
|
59
|
+
/** Shows the bounded create form and omits blank optional fields from its result. */
|
|
60
|
+
export declare function showCreateOrganizationDialog(host: ModalDialogHost): Promise<CreateOrganizationDialogResult>;
|
|
61
|
+
/** Shows the tenant-owned cascade before permanently deleting an organization. */
|
|
62
|
+
export declare function showDeleteOrganizationDialog(host: AdminOrganizationDeleteDialogHost, operationSignal: AbortSignal, organization: AdminOrganizationContext): Promise<DeleteOrganizationDialogResult>;
|
|
63
|
+
//# sourceMappingURL=organization-dialogs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organization-dialogs.d.ts","sourceRoot":"","sources":["../../src/admin/organization-dialogs.ts"],"names":[],"mappings":"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"}
|