@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,421 @@
|
|
|
1
|
+
/** Direct JSVision workspace for the selected organization's settings. */
|
|
2
|
+
import { Button, CheckGroup, col, ComboBox, cover, Dialog, fixed, Group, grow, Input, Label, RadioGroup, row, signal, spacer, TabView, Text, } from '@jsvision/ui';
|
|
3
|
+
import { formatAdminDateTime } from './admin-date-time.js';
|
|
4
|
+
import { SelectableReadOnlyInput } from './selectable-read-only-input.js';
|
|
5
|
+
import { textValidator } from './user-dialog-fields.js';
|
|
6
|
+
/** Fixed failure labels that are safe to render. */
|
|
7
|
+
const FAILURE_LABELS = {
|
|
8
|
+
validation: 'Validation failed',
|
|
9
|
+
unauthorized: 'Not authorized',
|
|
10
|
+
conflict: 'Conflict',
|
|
11
|
+
unavailable: 'Service unavailable',
|
|
12
|
+
'invalid-response': 'Invalid server response',
|
|
13
|
+
'file-type': 'Choose a PNG, JPEG, WebP, ICO, or SVG image',
|
|
14
|
+
'file-size': 'The selected image exceeds the allowed size',
|
|
15
|
+
'file-read': 'The selected image could not be read',
|
|
16
|
+
};
|
|
17
|
+
/** Modeless organization dialog that reports direct frame-close actions to its owner. */
|
|
18
|
+
class OrganizationDialog extends Dialog {
|
|
19
|
+
onClose;
|
|
20
|
+
/** Creates the fixed workspace surface and retains its optional close callback. */
|
|
21
|
+
constructor(onClose) {
|
|
22
|
+
super({ title: 'Organization', width: 72, height: 20 });
|
|
23
|
+
this.onClose = onClose;
|
|
24
|
+
}
|
|
25
|
+
/** Lets the controller remove an owned workspace without leaving stale state behind. */
|
|
26
|
+
close() {
|
|
27
|
+
if (this.onClose)
|
|
28
|
+
this.onClose();
|
|
29
|
+
else
|
|
30
|
+
super.close();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** Wraps one Layout DSL tree in the Group required by TabView. */
|
|
34
|
+
function tabPage(child) {
|
|
35
|
+
const page = new Group();
|
|
36
|
+
page.add(cover(child));
|
|
37
|
+
return page;
|
|
38
|
+
}
|
|
39
|
+
/** Returns whether an organization name is safe and within the public contract. */
|
|
40
|
+
function validName(value) {
|
|
41
|
+
const trimmed = value.trim();
|
|
42
|
+
if (trimmed.length === 0 || trimmed.length > 255)
|
|
43
|
+
return false;
|
|
44
|
+
for (const character of value) {
|
|
45
|
+
const codePoint = character.codePointAt(0) ?? 0;
|
|
46
|
+
if (codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f))
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
/** Returns a field-specific organization name error, or no error when valid. */
|
|
52
|
+
function nameError(value) {
|
|
53
|
+
const trimmed = value.trim();
|
|
54
|
+
if (trimmed.length === 0)
|
|
55
|
+
return 'Name is required.';
|
|
56
|
+
return validName(value)
|
|
57
|
+
? undefined
|
|
58
|
+
: 'Name must be at most 255 characters and contain no control characters.';
|
|
59
|
+
}
|
|
60
|
+
/** Returns whether an optional fallback image URL is safe to send. */
|
|
61
|
+
function validBrandingUrl(value) {
|
|
62
|
+
const normalized = value.trim();
|
|
63
|
+
if (normalized.length === 0)
|
|
64
|
+
return true;
|
|
65
|
+
try {
|
|
66
|
+
const url = new URL(normalized);
|
|
67
|
+
if (url.username || url.password)
|
|
68
|
+
return false;
|
|
69
|
+
if (url.protocol === 'https:')
|
|
70
|
+
return true;
|
|
71
|
+
return (url.protocol === 'http:' &&
|
|
72
|
+
(url.hostname === 'localhost' || url.hostname === '127.0.0.1' || url.hostname === '[::1]'));
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/** Formats decoded bytes without exposing unnecessary precision. */
|
|
79
|
+
function formatBytes(size) {
|
|
80
|
+
if (size < 1024)
|
|
81
|
+
return `${size} B`;
|
|
82
|
+
const kibibytes = size / 1024;
|
|
83
|
+
if (kibibytes < 1024)
|
|
84
|
+
return `${Number(kibibytes.toFixed(1))} KiB`;
|
|
85
|
+
return `${Number((kibibytes / 1024).toFixed(1))} MiB`;
|
|
86
|
+
}
|
|
87
|
+
/** Builds the maximized organization workspace with one direct page per concern. */
|
|
88
|
+
export function createAdminOrganizationWorkspace(options) {
|
|
89
|
+
const content = new OrganizationDialog(options.onClose);
|
|
90
|
+
content.resizable = false;
|
|
91
|
+
content.zoomable = false;
|
|
92
|
+
content.minWidth = 49;
|
|
93
|
+
content.minHeight = 19;
|
|
94
|
+
content.background = 'dialog';
|
|
95
|
+
let state = { kind: 'closed' };
|
|
96
|
+
let currentFocus = null;
|
|
97
|
+
let currentTabs;
|
|
98
|
+
let tabFocus = [];
|
|
99
|
+
let dialogLauncher = null;
|
|
100
|
+
const selectedTab = signal(0);
|
|
101
|
+
/** Replaces a retained launcher with its equivalent control after a state rerender. */
|
|
102
|
+
const reconcileLauncher = (kind, view) => {
|
|
103
|
+
if (dialogLauncher?.kind === kind)
|
|
104
|
+
dialogLauncher = { kind, view };
|
|
105
|
+
};
|
|
106
|
+
/** Returns the one-line operation feedback owned by a tab. */
|
|
107
|
+
const operationFeedback = (tab) => {
|
|
108
|
+
if (state.kind !== 'ready')
|
|
109
|
+
return 'No changes';
|
|
110
|
+
if (state.pendingTabs?.includes(tab))
|
|
111
|
+
return 'Saving…';
|
|
112
|
+
if (state.feedbackTab === tab && state.failure) {
|
|
113
|
+
const failure = FAILURE_LABELS[state.failure];
|
|
114
|
+
return state.reloadedAfterFailure
|
|
115
|
+
? `Reloaded after failure: ${failure}`
|
|
116
|
+
: `Failed: ${failure}`;
|
|
117
|
+
}
|
|
118
|
+
if (state.savedTab === tab)
|
|
119
|
+
return 'Saved';
|
|
120
|
+
return 'No changes';
|
|
121
|
+
};
|
|
122
|
+
/** Builds a labelled one-row field without stretching its editor across the whole tab. */
|
|
123
|
+
const field = (label, control, controlWidth) => row({ gap: 1 }, fixed(new Label(label, control), 18), fixed(control, controlWidth), spacer());
|
|
124
|
+
/** Builds the editable Overview page from one authoritative projection. */
|
|
125
|
+
const overviewPage = (organization, pending) => {
|
|
126
|
+
const canUpdate = options.capabilities.canUpdateOrganizations;
|
|
127
|
+
const canLifecycle = options.capabilities.canSuspendOrganizations;
|
|
128
|
+
const name = signal(organization.name);
|
|
129
|
+
const locale = signal(organization.defaultLocale);
|
|
130
|
+
const localeItems = signal(organization.defaultLocale === 'en' ? ['en'] : [organization.defaultLocale, 'en']);
|
|
131
|
+
const nameInput = new Input({
|
|
132
|
+
value: name,
|
|
133
|
+
maxLength: 255,
|
|
134
|
+
validator: textValidator(1, 255, false),
|
|
135
|
+
});
|
|
136
|
+
const localeInput = new ComboBox({
|
|
137
|
+
items: localeItems,
|
|
138
|
+
getText: (value) => value,
|
|
139
|
+
value: locale,
|
|
140
|
+
editable: false,
|
|
141
|
+
});
|
|
142
|
+
nameInput.focusable = canUpdate;
|
|
143
|
+
localeInput.focusable = canUpdate;
|
|
144
|
+
localeInput.input.focusable = canUpdate;
|
|
145
|
+
/** Returns only values that differ from the last authoritative state. */
|
|
146
|
+
const changes = () => {
|
|
147
|
+
const input = {};
|
|
148
|
+
const nextName = name().trim();
|
|
149
|
+
if (nextName !== organization.name)
|
|
150
|
+
input.name = nextName;
|
|
151
|
+
const nextLocale = locale();
|
|
152
|
+
if (nextLocale && nextLocale !== organization.defaultLocale)
|
|
153
|
+
input.defaultLocale = nextLocale;
|
|
154
|
+
return input;
|
|
155
|
+
};
|
|
156
|
+
const save = new Button('~S~ave', {
|
|
157
|
+
disabled: () => !canUpdate || pending || !validName(name()) || Object.keys(changes()).length === 0,
|
|
158
|
+
onClick: () => options.onIntent({ kind: 'save-overview', input: changes() }),
|
|
159
|
+
});
|
|
160
|
+
const lifecycleKind = 'lifecycle';
|
|
161
|
+
const lifecycle = organization.status === 'suspended'
|
|
162
|
+
? new Button('~A~ctivate', {
|
|
163
|
+
disabled: !canLifecycle || pending,
|
|
164
|
+
onClick: () => options.onIntent({ kind: 'activate' }),
|
|
165
|
+
})
|
|
166
|
+
: new Button('~S~uspend', {
|
|
167
|
+
disabled: !canLifecycle || organization.isSuperAdmin || pending,
|
|
168
|
+
onClick: () => {
|
|
169
|
+
dialogLauncher = { kind: lifecycleKind, view: lifecycle };
|
|
170
|
+
options.onIntent({ kind: 'suspend' });
|
|
171
|
+
},
|
|
172
|
+
});
|
|
173
|
+
reconcileLauncher(lifecycleKind, lifecycle);
|
|
174
|
+
const notices = [
|
|
175
|
+
organization.defaultLocale !== 'en'
|
|
176
|
+
? `${organization.defaultLocale} is unsupported here; it is preserved until English is selected.`
|
|
177
|
+
: undefined,
|
|
178
|
+
organization.isSuperAdmin
|
|
179
|
+
? 'The super-admin control-plane organization cannot be suspended.'
|
|
180
|
+
: !canLifecycle
|
|
181
|
+
? 'This action requires organization suspend permission.'
|
|
182
|
+
: undefined,
|
|
183
|
+
].filter((value) => value !== undefined);
|
|
184
|
+
const page = tabPage(col({ gap: 1, padding: 1 }, fixed(field('Name', nameInput, 24), 1), fixed(field('Default locale', localeInput, 16), 1), fixed(field('ID', new SelectableReadOnlyInput(organization.id), 36), 1), fixed(field('Slug', new SelectableReadOnlyInput(organization.slug), 24), 1), fixed(new Text(`Status: ${organization.status.toUpperCase()}`), 1), fixed(new Text(`Created: ${formatAdminDateTime(organization.createdAt)}`), 1), fixed(new Text(`Updated: ${formatAdminDateTime(organization.updatedAt)}`), 1), ...notices.map((notice) => fixed(new Text(notice), 1)), fixed(new Text(() => nameError(name()) ?? operationFeedback('overview')), 1), spacer(), fixed(row({ gap: 1 }, save, spacer(), lifecycle), 2)));
|
|
185
|
+
currentFocus =
|
|
186
|
+
canUpdate || (canLifecycle && !(organization.status === 'active' && organization.isSuperAdmin))
|
|
187
|
+
? canUpdate
|
|
188
|
+
? nameInput
|
|
189
|
+
: lifecycle
|
|
190
|
+
: null;
|
|
191
|
+
return page;
|
|
192
|
+
};
|
|
193
|
+
/** Builds organization login-method defaults and password-login 2FA policy controls. */
|
|
194
|
+
const authenticationPage = (organization, pending) => {
|
|
195
|
+
const methodNames = ['password', 'magic_link'];
|
|
196
|
+
const policyNames = [
|
|
197
|
+
'optional',
|
|
198
|
+
'required_email',
|
|
199
|
+
'required_totp',
|
|
200
|
+
'required_any',
|
|
201
|
+
];
|
|
202
|
+
const initialMethods = methodNames.map((method) => organization.defaultLoginMethods.includes(method));
|
|
203
|
+
const methods = signal([...initialMethods]);
|
|
204
|
+
const initialPolicy = Math.max(0, policyNames.indexOf(organization.twoFactorPolicy));
|
|
205
|
+
const policy = signal(initialPolicy);
|
|
206
|
+
const methodChoices = new CheckGroup({
|
|
207
|
+
labels: ['~P~assword', '~M~agic link'],
|
|
208
|
+
value: methods,
|
|
209
|
+
});
|
|
210
|
+
const policyChoices = new RadioGroup({
|
|
211
|
+
labels: [
|
|
212
|
+
'Optional',
|
|
213
|
+
'Required email OTP',
|
|
214
|
+
'Required authenticator / TOTP',
|
|
215
|
+
'Require either',
|
|
216
|
+
],
|
|
217
|
+
value: policy,
|
|
218
|
+
});
|
|
219
|
+
const canUpdate = options.capabilities.canUpdateOrganizations;
|
|
220
|
+
const enabled = canUpdate && !pending;
|
|
221
|
+
methodChoices.focusable = enabled;
|
|
222
|
+
policyChoices.focusable = enabled;
|
|
223
|
+
for (let index = 0; index < methodNames.length; index += 1) {
|
|
224
|
+
methodChoices.setItemEnabled(index, enabled);
|
|
225
|
+
}
|
|
226
|
+
for (let index = 0; index < policyNames.length; index += 1) {
|
|
227
|
+
policyChoices.setItemEnabled(index, enabled);
|
|
228
|
+
}
|
|
229
|
+
const hasMethod = () => methods().some(Boolean);
|
|
230
|
+
const dirty = () => methods().some((value, index) => value !== initialMethods[index]) ||
|
|
231
|
+
policy() !== initialPolicy;
|
|
232
|
+
const save = new Button('~S~ave', {
|
|
233
|
+
disabled: () => !enabled || !hasMethod() || !dirty(),
|
|
234
|
+
onClick: () => {
|
|
235
|
+
const selectedMethods = methods
|
|
236
|
+
.peek()
|
|
237
|
+
.flatMap((selected, index) => selected ? [methodNames[index]] : []);
|
|
238
|
+
const twoFactorPolicy = policyNames[policy.peek()];
|
|
239
|
+
options.onIntent({
|
|
240
|
+
kind: 'save-authentication',
|
|
241
|
+
loginMethods: selectedMethods,
|
|
242
|
+
twoFactorPolicy,
|
|
243
|
+
});
|
|
244
|
+
},
|
|
245
|
+
});
|
|
246
|
+
tabFocus = [tabFocus[0] ?? null, enabled ? methodChoices : null, tabFocus[2] ?? null];
|
|
247
|
+
return tabPage(col({ gap: 0, padding: 1 }, fixed(row({ gap: 2 }, grow(col(fixed(new Text('Login methods'), 1), fixed(methodChoices, 2))), grow(col(fixed(new Text('Password-login 2FA'), 1), fixed(policyChoices, 4)))), 5), fixed(new Text("OIDC clients configured to inherit use these login methods. Password-login 2FA is organization-wide and takes effect at each user's next password authentication. Magic link is passwordless: no OTP or TOTP follows."), 4), fixed(new Text(() => hasMethod()
|
|
248
|
+
? operationFeedback('authentication')
|
|
249
|
+
: 'Select at least one login method before saving.'), 1), spacer(), fixed(row(save, spacer()), 2)));
|
|
250
|
+
};
|
|
251
|
+
/** Builds the four text settings and two immediate uploaded-image rows. */
|
|
252
|
+
const brandingPage = (projection, pending) => {
|
|
253
|
+
const organization = projection.organization;
|
|
254
|
+
const values = {
|
|
255
|
+
companyName: signal(organization.brandingCompanyName ?? ''),
|
|
256
|
+
primaryColor: signal(organization.brandingPrimaryColor ?? ''),
|
|
257
|
+
logoUrl: signal(organization.brandingLogoUrl ?? ''),
|
|
258
|
+
faviconUrl: signal(organization.brandingFaviconUrl ?? ''),
|
|
259
|
+
};
|
|
260
|
+
const inputs = {
|
|
261
|
+
companyName: new Input({
|
|
262
|
+
value: values.companyName,
|
|
263
|
+
maxLength: 255,
|
|
264
|
+
validator: textValidator(0, 255),
|
|
265
|
+
}),
|
|
266
|
+
primaryColor: new Input({
|
|
267
|
+
value: values.primaryColor,
|
|
268
|
+
maxLength: 7,
|
|
269
|
+
placeholder: '#RRGGBB',
|
|
270
|
+
}),
|
|
271
|
+
logoUrl: new Input({ value: values.logoUrl, maxLength: 2_048 }),
|
|
272
|
+
faviconUrl: new Input({ value: values.faviconUrl, maxLength: 2_048 }),
|
|
273
|
+
};
|
|
274
|
+
const enabled = options.capabilities.canUpdateOrganizations && !pending;
|
|
275
|
+
for (const input of Object.values(inputs))
|
|
276
|
+
input.focusable = enabled;
|
|
277
|
+
const valid = () => values.companyName().trim().length <= 255 &&
|
|
278
|
+
(values.primaryColor().trim().length === 0 ||
|
|
279
|
+
/^#[0-9A-Fa-f]{6}$/.test(values.primaryColor().trim())) &&
|
|
280
|
+
validBrandingUrl(values.logoUrl()) &&
|
|
281
|
+
validBrandingUrl(values.faviconUrl());
|
|
282
|
+
/** Returns the first field-specific branding validation error. */
|
|
283
|
+
const validationError = () => {
|
|
284
|
+
if (values.companyName().trim().length > 255) {
|
|
285
|
+
return 'Company name must be at most 255 characters.';
|
|
286
|
+
}
|
|
287
|
+
const color = values.primaryColor().trim();
|
|
288
|
+
if (color.length > 0 && !/^#[0-9A-Fa-f]{6}$/.test(color)) {
|
|
289
|
+
return 'Primary color must use #RRGGBB.';
|
|
290
|
+
}
|
|
291
|
+
if (!validBrandingUrl(values.logoUrl())) {
|
|
292
|
+
return 'Fallback logo URL must use HTTPS or loopback HTTP.';
|
|
293
|
+
}
|
|
294
|
+
if (!validBrandingUrl(values.faviconUrl())) {
|
|
295
|
+
return 'Fallback favicon URL must use HTTPS or loopback HTTP.';
|
|
296
|
+
}
|
|
297
|
+
return undefined;
|
|
298
|
+
};
|
|
299
|
+
const changes = () => {
|
|
300
|
+
const input = {};
|
|
301
|
+
const compare = (key, next, previous) => {
|
|
302
|
+
const normalized = next.trim() || null;
|
|
303
|
+
if (normalized !== previous)
|
|
304
|
+
input[key] = normalized;
|
|
305
|
+
};
|
|
306
|
+
compare('companyName', values.companyName(), organization.brandingCompanyName);
|
|
307
|
+
compare('primaryColor', values.primaryColor(), organization.brandingPrimaryColor);
|
|
308
|
+
compare('logoUrl', values.logoUrl(), organization.brandingLogoUrl);
|
|
309
|
+
compare('faviconUrl', values.faviconUrl(), organization.brandingFaviconUrl);
|
|
310
|
+
return input;
|
|
311
|
+
};
|
|
312
|
+
const save = new Button('~S~ave', {
|
|
313
|
+
disabled: () => !enabled || !valid() || Object.keys(changes()).length === 0,
|
|
314
|
+
onClick: () => options.onIntent({ kind: 'save-branding', input: changes() }),
|
|
315
|
+
});
|
|
316
|
+
tabFocus = [tabFocus[0] ?? null, tabFocus[1] ?? null, enabled ? inputs.companyName : null];
|
|
317
|
+
const assetRow = (label, type) => {
|
|
318
|
+
const asset = projection.assets.find((candidate) => candidate.assetType === type);
|
|
319
|
+
const metadata = asset
|
|
320
|
+
? `${asset.contentType} · ${formatBytes(asset.size)} · ${formatAdminDateTime(asset.updatedAt)}`
|
|
321
|
+
: `No uploaded ${label.toLowerCase()}`;
|
|
322
|
+
const uploadKind = `${type}-upload`;
|
|
323
|
+
const removeKind = `${type}-remove`;
|
|
324
|
+
const upload = new Button(asset ? 'Replace' : 'Add', {
|
|
325
|
+
disabled: !enabled,
|
|
326
|
+
onClick: () => {
|
|
327
|
+
dialogLauncher = { kind: uploadKind, view: upload };
|
|
328
|
+
options.onIntent({ kind: 'upload-asset', assetType: type });
|
|
329
|
+
},
|
|
330
|
+
});
|
|
331
|
+
reconcileLauncher(uploadKind, upload);
|
|
332
|
+
let remove;
|
|
333
|
+
if (asset) {
|
|
334
|
+
const action = new Button('Remove', {
|
|
335
|
+
disabled: !enabled,
|
|
336
|
+
onClick: () => {
|
|
337
|
+
dialogLauncher = { kind: removeKind, view: action };
|
|
338
|
+
options.onIntent({ kind: 'remove-asset', assetType: type });
|
|
339
|
+
},
|
|
340
|
+
});
|
|
341
|
+
remove = action;
|
|
342
|
+
reconcileLauncher(removeKind, action);
|
|
343
|
+
}
|
|
344
|
+
else if (dialogLauncher?.kind === removeKind) {
|
|
345
|
+
dialogLauncher = { kind: uploadKind, view: upload };
|
|
346
|
+
}
|
|
347
|
+
return col(fixed(row({ gap: 1 }, fixed(new Text(label), 18), grow(new Text(metadata))), 1), row({ gap: 1 }, spacer({ fixed: 18 }), upload, remove ?? false, spacer()));
|
|
348
|
+
};
|
|
349
|
+
const fields = col({ gap: 1 }, fixed(field('Company name', inputs.companyName, 24), 1), fixed(field('Primary color', inputs.primaryColor, 10), 1), fixed(field('Fallback logo URL', inputs.logoUrl, 24), 1), fixed(field('Fallback favicon', inputs.faviconUrl, 24), 1));
|
|
350
|
+
return tabPage(col({ padding: 1 }, fixed(fields, 7), spacer({ fixed: 1 }), fixed(assetRow('Logo', 'logo'), 3), fixed(assetRow('Favicon', 'favicon'), 3), fixed(new Text(() => validationError() ?? operationFeedback('branding')), 1), fixed(row(save, spacer()), 2)));
|
|
351
|
+
};
|
|
352
|
+
/** Renders all tabs from one retained authoritative projection. */
|
|
353
|
+
const renderProjection = (projection) => {
|
|
354
|
+
tabFocus = [];
|
|
355
|
+
const pending = state.kind === 'ready' && state.pendingTabs?.includes('overview') === true;
|
|
356
|
+
const overview = overviewPage(projection.organization, pending);
|
|
357
|
+
tabFocus = [currentFocus, null, null];
|
|
358
|
+
const tabs = signal([
|
|
359
|
+
{ title: 'Overview', content: overview },
|
|
360
|
+
{
|
|
361
|
+
title: 'Authentication',
|
|
362
|
+
content: authenticationPage(projection.organization, state.kind === 'ready' && state.pendingTabs?.includes('authentication') === true),
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
title: 'Branding',
|
|
366
|
+
content: brandingPage(projection, state.kind === 'ready' && state.pendingTabs?.includes('branding') === true),
|
|
367
|
+
},
|
|
368
|
+
]);
|
|
369
|
+
const tabView = new TabView({ tabs, active: selectedTab });
|
|
370
|
+
currentTabs = tabView;
|
|
371
|
+
const status = state.kind === 'loading' ? 'Loading organization…' : undefined;
|
|
372
|
+
content.add(cover(col(status && fixed(new Text(status), 1), grow(tabView))));
|
|
373
|
+
if (selectedTab.peek() !== 0)
|
|
374
|
+
currentFocus = tabView.strip;
|
|
375
|
+
};
|
|
376
|
+
/** Rebuilds the retained tree so replaced states cannot leave stale controls. */
|
|
377
|
+
const render = () => {
|
|
378
|
+
for (const child of [...content.children])
|
|
379
|
+
content.remove(child);
|
|
380
|
+
currentFocus = null;
|
|
381
|
+
currentTabs = undefined;
|
|
382
|
+
tabFocus = [];
|
|
383
|
+
if (state.kind === 'closed')
|
|
384
|
+
return;
|
|
385
|
+
if (state.kind === 'ready') {
|
|
386
|
+
content.title.set(`${state.organization.name} — Organization`);
|
|
387
|
+
renderProjection(state);
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
if (state.kind === 'loading' && state.previous) {
|
|
391
|
+
content.title.set(`${state.previous.organization.name} — Organization`);
|
|
392
|
+
renderProjection(state.previous);
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
const failure = state.kind === 'failure' ? FAILURE_LABELS[state.failure] : 'Loading organization…';
|
|
396
|
+
content.title.set('Organization');
|
|
397
|
+
content.add(cover(col({ gap: 1, padding: 1 }, fixed(new Text(failure), 1), spacer())));
|
|
398
|
+
};
|
|
399
|
+
return {
|
|
400
|
+
content,
|
|
401
|
+
setState(next) {
|
|
402
|
+
state = next;
|
|
403
|
+
render();
|
|
404
|
+
},
|
|
405
|
+
focusCurrent() {
|
|
406
|
+
const focus = dialogLauncher?.view ??
|
|
407
|
+
(currentTabs ? tabFocus[selectedTab.peek()] ?? currentTabs.strip : currentFocus);
|
|
408
|
+
if (focus)
|
|
409
|
+
options.focusView?.(focus);
|
|
410
|
+
if (state.kind === 'ready' && !state.pendingTabs?.length)
|
|
411
|
+
dialogLauncher = null;
|
|
412
|
+
},
|
|
413
|
+
clear() {
|
|
414
|
+
state = { kind: 'closed' };
|
|
415
|
+
selectedTab.set(0);
|
|
416
|
+
dialogLauncher = null;
|
|
417
|
+
render();
|
|
418
|
+
},
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
//# sourceMappingURL=organization-workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organization-workspace.js","sourceRoot":"","sources":["../../src/admin/organization-workspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/** Operation ownership and local file workflow for terminal manifest portability. */
|
|
2
|
+
import type { EventLoop, ModalDialogHost, View } from '@jsvision/ui';
|
|
3
|
+
import type { AdminApplicationOperations } from './application-service.js';
|
|
4
|
+
import type { AdminPortabilityWorkspace, AdminPortabilityWorkspaceOptions } from './portability-workspace.js';
|
|
5
|
+
import type { AdminPortabilityOperations } from './portability-service.js';
|
|
6
|
+
import type { AdminPortabilityIntent } from './portability-state.js';
|
|
7
|
+
import type { AdminConnectionState } from './state.js';
|
|
8
|
+
/** Stable command recognized by the portability controller and presentation. */
|
|
9
|
+
export declare const PORTABILITY_COMMAND = "portability";
|
|
10
|
+
/** Modal host required by file, confirmation, and one-time-secret dialogs. */
|
|
11
|
+
export interface AdminPortabilityControllerHost extends ModalDialogHost {
|
|
12
|
+
/** Event-loop operations used by the direct save dialog and focus restoration. */
|
|
13
|
+
readonly loop: ModalDialogHost['loop'] & Pick<EventLoop, 'endModal' | 'focusView'>;
|
|
14
|
+
}
|
|
15
|
+
/** Local dialog seams kept injectable for deterministic controller tests. */
|
|
16
|
+
export interface AdminPortabilityDialogs {
|
|
17
|
+
/** Chooses one existing JSON manifest. */
|
|
18
|
+
readonly chooseManifest: () => Promise<string | null | undefined>;
|
|
19
|
+
/** Chooses one output path seeded with the server-provided filename. */
|
|
20
|
+
readonly saveManifest: (filename: string) => Promise<string | null | undefined>;
|
|
21
|
+
/** Asks once before applying a successful preview. */
|
|
22
|
+
readonly confirmApply: () => Promise<boolean>;
|
|
23
|
+
/** Shows one credential and resolves only after the operator dismisses it. */
|
|
24
|
+
readonly showOneTimeClientSecret: (signal: AbortSignal, value: {
|
|
25
|
+
readonly clientName: string;
|
|
26
|
+
readonly clientId: string;
|
|
27
|
+
readonly label: string | null;
|
|
28
|
+
readonly plaintext: string;
|
|
29
|
+
readonly expiresAt: string | null;
|
|
30
|
+
}) => Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
/** Local UTF-8 file operations kept outside the view. */
|
|
33
|
+
export interface AdminPortabilityFiles {
|
|
34
|
+
/** Reads no more than the supplied byte limit. */
|
|
35
|
+
readonly readUtf8: (path: string, maximumBytes: number) => Promise<string>;
|
|
36
|
+
/** Writes one complete UTF-8 manifest. */
|
|
37
|
+
readonly writeUtf8: (path: string, content: string) => Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
/** Controller construction boundaries. */
|
|
40
|
+
export interface AdminPortabilityControllerOptions {
|
|
41
|
+
/** Existing administration application host. */
|
|
42
|
+
readonly host: AdminPortabilityControllerHost;
|
|
43
|
+
/** Reads the current verified connection and selected organization. */
|
|
44
|
+
readonly readState: () => AdminConnectionState;
|
|
45
|
+
/** Reads the current session's manifest operations. */
|
|
46
|
+
readonly readOperations: () => AdminPortabilityOperations | undefined;
|
|
47
|
+
/** Reads the existing global application catalog operation when available. */
|
|
48
|
+
readonly readApplicationOperations?: () => Pick<AdminApplicationOperations, 'listAll'> | undefined;
|
|
49
|
+
/** Mounts or removes only this workspace. */
|
|
50
|
+
readonly mountWorkspace: (content: View | null) => void;
|
|
51
|
+
/** Builds the direct workspace; tests may inject a deterministic boundary. */
|
|
52
|
+
readonly workspaceFactory?: (options: AdminPortabilityWorkspaceOptions) => Pick<AdminPortabilityWorkspace, 'content' | 'setState' | 'focusCurrent'> & {
|
|
53
|
+
readonly clear?: () => void;
|
|
54
|
+
};
|
|
55
|
+
/** Enters the existing authentication recovery flow after a final session failure. */
|
|
56
|
+
readonly requestAuthentication?: () => void;
|
|
57
|
+
/** Refreshes command availability after direct workspace closure. */
|
|
58
|
+
readonly onWorkspaceClosed?: () => void;
|
|
59
|
+
/** Refreshes command availability immediately before the workspace is mounted. */
|
|
60
|
+
readonly onWorkspaceOpened?: () => void;
|
|
61
|
+
/** Injectable modal operations. */
|
|
62
|
+
readonly dialogs?: Partial<AdminPortabilityDialogs>;
|
|
63
|
+
/** Injectable local file operations. */
|
|
64
|
+
readonly files?: Partial<AdminPortabilityFiles>;
|
|
65
|
+
}
|
|
66
|
+
/** Application-owned portability controller. */
|
|
67
|
+
export interface AdminPortabilityController {
|
|
68
|
+
/** Applies the latest verified-session ownership epoch. */
|
|
69
|
+
readonly syncContext: (state: AdminConnectionState, sessionEpoch: number) => void;
|
|
70
|
+
/** Opens the workspace for its stable command. */
|
|
71
|
+
readonly handleCommand: (command: string) => boolean;
|
|
72
|
+
/** Handles one closed view intent. */
|
|
73
|
+
readonly handleIntent: (intent: AdminPortabilityIntent) => void;
|
|
74
|
+
/** Returns whether this controller owns a mounted workspace. */
|
|
75
|
+
readonly isOpen: () => boolean;
|
|
76
|
+
/** Cancels local ownership and closes the workspace. */
|
|
77
|
+
readonly cancelActiveOperation: () => void;
|
|
78
|
+
/** Releases the reusable controller permanently. */
|
|
79
|
+
readonly dispose: () => void;
|
|
80
|
+
}
|
|
81
|
+
/** Creates direct controller ownership for one maximized portability workspace. */
|
|
82
|
+
export declare function createAdminPortabilityController(options: AdminPortabilityControllerOptions): AdminPortabilityController;
|
|
83
|
+
//# sourceMappingURL=portability-controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portability-controller.d.ts","sourceRoot":"","sources":["../../src/admin/portability-controller.ts"],"names":[],"mappings":"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"}
|