@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,491 @@
|
|
|
1
|
+
/** Direct JSVision workspace for clients owned by the selected organization. */
|
|
2
|
+
import { Button, CheckGroup, col, cover, DataGrid, Dialog, fixed, Group, GroupBox, grow, Input, Label, RadioGroup, row, signal, spacer, Switch, TabView, Text, } from '@jsvision/ui';
|
|
3
|
+
import { formatAdminDateTime, formatOptionalAdminDateTime } from './admin-date-time.js';
|
|
4
|
+
import { authenticationUrlRows } from './client-authentication-dialog.js';
|
|
5
|
+
import { SelectableReadOnlyInput } from './selectable-read-only-input.js';
|
|
6
|
+
import { textValidator } from './user-dialog-fields.js';
|
|
7
|
+
/** Fixed safe labels for client-operation failures. */
|
|
8
|
+
const FAILURE_LABELS = {
|
|
9
|
+
validation: 'Validation failed',
|
|
10
|
+
unauthorized: 'Not authorized',
|
|
11
|
+
conflict: 'Conflict',
|
|
12
|
+
unavailable: 'Service unavailable',
|
|
13
|
+
'invalid-response': 'Invalid server response',
|
|
14
|
+
};
|
|
15
|
+
/** Returns the application name only when the session may inspect applications. */
|
|
16
|
+
function applicationLabel(client, options) {
|
|
17
|
+
if (!options.capabilities.canReadApplications)
|
|
18
|
+
return client.applicationId;
|
|
19
|
+
return (options.applications.find((application) => application.id === client.applicationId)?.name ??
|
|
20
|
+
client.applicationId);
|
|
21
|
+
}
|
|
22
|
+
/** Builds the compact identity and status columns used by the client overview. */
|
|
23
|
+
function clientColumns(options) {
|
|
24
|
+
return [
|
|
25
|
+
{ title: 'Name', accessor: (client) => client.clientName, width: '2fr', minWidth: 16 },
|
|
26
|
+
{ title: 'Client ID', accessor: (client) => client.clientId, width: '2fr', minWidth: 16 },
|
|
27
|
+
{
|
|
28
|
+
title: 'Application',
|
|
29
|
+
accessor: (client) => applicationLabel(client, options),
|
|
30
|
+
width: '2fr',
|
|
31
|
+
minWidth: 16,
|
|
32
|
+
},
|
|
33
|
+
{ title: 'Status', accessor: (client) => client.status, width: 10 },
|
|
34
|
+
];
|
|
35
|
+
}
|
|
36
|
+
/** Metadata-only columns used by secret management. */
|
|
37
|
+
const SECRET_COLUMNS = [
|
|
38
|
+
{ title: 'Label', accessor: (secret) => secret.label ?? 'Not provided', width: 14 },
|
|
39
|
+
{ title: 'Status', accessor: (secret) => secret.status, width: 8 },
|
|
40
|
+
{
|
|
41
|
+
title: 'Last used',
|
|
42
|
+
accessor: (secret) => formatOptionalAdminDateTime(secret.lastUsedAt, 'Never'),
|
|
43
|
+
width: 23,
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
title: 'Expires',
|
|
47
|
+
accessor: (secret) => formatOptionalAdminDateTime(secret.expiresAt, 'Never'),
|
|
48
|
+
width: 23,
|
|
49
|
+
},
|
|
50
|
+
{ title: 'Created', accessor: (secret) => formatAdminDateTime(secret.createdAt), width: 23 },
|
|
51
|
+
];
|
|
52
|
+
/** Labels for the client subviews shown by the detail tab pane. */
|
|
53
|
+
const CLIENT_DETAIL_SECTIONS = [
|
|
54
|
+
'Overview',
|
|
55
|
+
'Authentication',
|
|
56
|
+
'Protocol',
|
|
57
|
+
'Login experience',
|
|
58
|
+
'Credentials',
|
|
59
|
+
'Lifecycle',
|
|
60
|
+
];
|
|
61
|
+
/** Returns true for bounded scope text that cannot alter terminal rendering. */
|
|
62
|
+
function validScope(value) {
|
|
63
|
+
if (value.length > 2_048)
|
|
64
|
+
return false;
|
|
65
|
+
return ![...value].some((character) => {
|
|
66
|
+
const codePoint = character.codePointAt(0) ?? 0;
|
|
67
|
+
return codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
/** Returns whether the selected protocol combination matches server compatibility rules. */
|
|
71
|
+
function protocolIsValid(client, grants, authenticationMethod, requirePkce, scope) {
|
|
72
|
+
if (!grants.some(Boolean) || !validScope(scope))
|
|
73
|
+
return false;
|
|
74
|
+
if (client.clientType === 'public') {
|
|
75
|
+
return authenticationMethod === 2 && requirePkce && !grants[1];
|
|
76
|
+
}
|
|
77
|
+
return authenticationMethod !== 2;
|
|
78
|
+
}
|
|
79
|
+
/** Creates the feature-specific client workspace with ordinary Layout DSL primitives. */
|
|
80
|
+
export function createAdminClientWorkspace(options) {
|
|
81
|
+
const content = new Dialog({ title: 'OIDC Clients', width: 72, height: 20 });
|
|
82
|
+
content.closable = false;
|
|
83
|
+
content.resizable = false;
|
|
84
|
+
content.zoomable = false;
|
|
85
|
+
content.background = 'dialog';
|
|
86
|
+
let state = { kind: 'closed' };
|
|
87
|
+
let currentFocus = null;
|
|
88
|
+
let focusedClientId = null;
|
|
89
|
+
let detailClientId = null;
|
|
90
|
+
const selectedSection = signal(0);
|
|
91
|
+
const selectedSecretId = signal(null);
|
|
92
|
+
let disposed = false;
|
|
93
|
+
/** Creates an action button whose natural size is resolved by its Layout DSL row. */
|
|
94
|
+
const action = (label, intent, disabled = false) => new Button(label, { disabled, onClick: () => options.onIntent(intent) });
|
|
95
|
+
/** Adds a compact status row when a retained projection is loading or failed. */
|
|
96
|
+
const statusRow = (status) => {
|
|
97
|
+
if (!status)
|
|
98
|
+
return undefined;
|
|
99
|
+
const retry = status.retry
|
|
100
|
+
? new Button('~R~etry', { onClick: () => options.onIntent({ kind: 'retry' }) })
|
|
101
|
+
: undefined;
|
|
102
|
+
if (retry)
|
|
103
|
+
currentFocus = retry;
|
|
104
|
+
return fixed(row({ gap: 1 }, grow(new Text(status.label)), retry), 2);
|
|
105
|
+
};
|
|
106
|
+
/** Renders the complete same-organization catalog. */
|
|
107
|
+
const renderList = (projection, status) => {
|
|
108
|
+
const canCreate = options.organization?.status === 'active' &&
|
|
109
|
+
options.capabilities.canCreateClients &&
|
|
110
|
+
options.capabilities.canReadApplications &&
|
|
111
|
+
options.applications.some((application) => application.status === 'active');
|
|
112
|
+
const rows = signal([...projection.clients]);
|
|
113
|
+
const focused = signal(Math.max(0, projection.clients.findIndex((item) => item.id === focusedClientId)));
|
|
114
|
+
const grid = new DataGrid({
|
|
115
|
+
rows,
|
|
116
|
+
focused,
|
|
117
|
+
columns: clientColumns(options),
|
|
118
|
+
zebra: true,
|
|
119
|
+
onSelect: (_index, selected) => {
|
|
120
|
+
focusedClientId = selected.id;
|
|
121
|
+
options.onIntent({ kind: 'select', clientId: selected.id });
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
currentFocus = projection.clients.length > 0 ? grid.rows : null;
|
|
125
|
+
const clientCount = projection.clients.length;
|
|
126
|
+
const footer = clientCount === 0
|
|
127
|
+
? canCreate
|
|
128
|
+
? 'No OIDC clients. Use OIDC Clients > Create client.'
|
|
129
|
+
: 'No OIDC clients'
|
|
130
|
+
: `↑↓ Move · Enter View details · ${clientCount} ${clientCount === 1 ? 'client' : 'clients'}`;
|
|
131
|
+
content.add(cover(col({ gap: 1, padding: { top: 0, right: 1, bottom: 0, left: 1 } }, statusRow(status), grow(grid), fixed(new Text(footer), 1))));
|
|
132
|
+
};
|
|
133
|
+
/** Wraps one logical detail region in the established framed surface. */
|
|
134
|
+
const region = (title, child) => {
|
|
135
|
+
const box = new GroupBox({ title });
|
|
136
|
+
box.add(cover(child));
|
|
137
|
+
return box;
|
|
138
|
+
};
|
|
139
|
+
/** Produces a concise, read-only Overview while keeping name editing focused. */
|
|
140
|
+
const overviewSection = (projection, application) => {
|
|
141
|
+
const selected = projection.client;
|
|
142
|
+
const clientId = new SelectableReadOnlyInput(selected.clientId);
|
|
143
|
+
const identity = region('Identity', col(fixed(new Text(`Client name: ${selected.clientName}`), 1), fixed(row({ gap: 1 }, fixed(new Label('Client ID', clientId), 9), grow(clientId)), 1), fixed(new Text(`Client type: ${selected.clientType}`), 1), fixed(new Text(`Status: ${selected.status}`), 1), fixed(new Text(`Created: ${formatAdminDateTime(selected.createdAt)}`), 1), fixed(new Text(`Updated: ${formatAdminDateTime(selected.updatedAt)}`), 1)));
|
|
144
|
+
const context = region('Context', new Text([
|
|
145
|
+
`Organization: ${options.organization?.name ?? projection.organizationId}`,
|
|
146
|
+
`Application: ${application}`,
|
|
147
|
+
`Application type: ${selected.applicationType}`,
|
|
148
|
+
`Authentication: ${selected.tokenEndpointAuthMethod}`,
|
|
149
|
+
`Login methods: ${selected.loginMethods?.join(', ') ?? 'inherit'}`,
|
|
150
|
+
].join('\n')));
|
|
151
|
+
const protocol = region('Protocol summary', new Text(selected.grantTypes.join(' · ')));
|
|
152
|
+
const login = region('Login summary', new Text(selected.effectiveLoginMethods.join(' · ')));
|
|
153
|
+
return col({ gap: 1 }, fixed(row({ gap: 1 }, grow(identity), grow(context)), 8), grow(row({ gap: 1 }, grow(protocol), grow(login))), fixed(row({ gap: 1 }, action('~E~dit name', { kind: 'edit-name', clientId: selected.id }, !options.capabilities.canUpdateClients), spacer()), 2));
|
|
154
|
+
};
|
|
155
|
+
/** Shows all redirect and browser-origin collections in one direct CRUD grid. */
|
|
156
|
+
const authenticationSection = (projection) => {
|
|
157
|
+
const selected = projection.client;
|
|
158
|
+
const rows = signal(authenticationUrlRows(selected));
|
|
159
|
+
const focused = signal(0);
|
|
160
|
+
const selectedIndex = signal(-1);
|
|
161
|
+
const selectedRow = signal(null);
|
|
162
|
+
const grid = new DataGrid({
|
|
163
|
+
rows,
|
|
164
|
+
focused,
|
|
165
|
+
selected: selectedIndex,
|
|
166
|
+
columns: [
|
|
167
|
+
{ title: 'Type', accessor: (entry) => entry.type, width: 27 },
|
|
168
|
+
{ title: 'URL / origin', accessor: (entry) => entry.value, width: '1fr', minWidth: 20 },
|
|
169
|
+
],
|
|
170
|
+
zebra: true,
|
|
171
|
+
onSelect: (index, entry) => {
|
|
172
|
+
selectedIndex.set(index);
|
|
173
|
+
selectedRow.set(entry);
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
const edit = new Button('Edit', {
|
|
177
|
+
disabled: () => !options.capabilities.canUpdateClients || selectedRow() === null,
|
|
178
|
+
onClick: () => {
|
|
179
|
+
const target = selectedRow.peek();
|
|
180
|
+
if (target)
|
|
181
|
+
options.onIntent({ kind: 'edit-authentication-url', clientId: selected.id, row: target });
|
|
182
|
+
},
|
|
183
|
+
});
|
|
184
|
+
const remove = new Button('Delete', {
|
|
185
|
+
disabled: () => {
|
|
186
|
+
const target = selectedRow();
|
|
187
|
+
return !options.capabilities.canUpdateClients || target === null ||
|
|
188
|
+
(target.kind === 'redirect' && selected.redirectUris.length === 1);
|
|
189
|
+
},
|
|
190
|
+
onClick: () => {
|
|
191
|
+
const target = selectedRow.peek();
|
|
192
|
+
if (target)
|
|
193
|
+
options.onIntent({ kind: 'delete-authentication-url', clientId: selected.id, row: target });
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
return col({ gap: 1, padding: 1 }, grow(grid), fixed(row({ gap: 1 }, action('Add', { kind: 'add-authentication-url', clientId: selected.id }, !options.capabilities.canUpdateClients), edit, remove, spacer()), 2));
|
|
197
|
+
};
|
|
198
|
+
/** Edits and saves protocol values directly inside the Protocol tab. */
|
|
199
|
+
const protocolSection = (projection) => {
|
|
200
|
+
const selected = projection.client;
|
|
201
|
+
const grantNames = ['authorization_code', 'client_credentials', 'refresh_token'];
|
|
202
|
+
const authenticationNames = ['client_secret_basic', 'client_secret_post', 'none'];
|
|
203
|
+
const initialGrants = grantNames.map((grant) => selected.grantTypes.includes(grant));
|
|
204
|
+
const initialAuthentication = authenticationNames.indexOf(selected.tokenEndpointAuthMethod);
|
|
205
|
+
const grants = signal([...initialGrants]);
|
|
206
|
+
const authenticationMethod = signal(initialAuthentication);
|
|
207
|
+
const requirePkce = signal(selected.requirePkce);
|
|
208
|
+
const requireConsent = signal(selected.requireConsent);
|
|
209
|
+
const scope = signal(selected.scope);
|
|
210
|
+
const submitted = signal(false);
|
|
211
|
+
const grantChoices = new CheckGroup({
|
|
212
|
+
labels: ['Authorization code', 'Client credentials', 'Refresh token'],
|
|
213
|
+
value: grants,
|
|
214
|
+
});
|
|
215
|
+
const scopeInput = new Input({
|
|
216
|
+
value: scope,
|
|
217
|
+
maxLength: 2_048,
|
|
218
|
+
validator: textValidator(0, 2_048),
|
|
219
|
+
});
|
|
220
|
+
const authenticationChoices = selected.clientType === 'public'
|
|
221
|
+
? new Text('None (required, read only)')
|
|
222
|
+
: new RadioGroup({
|
|
223
|
+
labels: ['Client secret basic', 'Client secret post'],
|
|
224
|
+
value: authenticationMethod,
|
|
225
|
+
});
|
|
226
|
+
const pkceSwitch = new Switch({
|
|
227
|
+
value: requirePkce,
|
|
228
|
+
label: '~P~KCE required',
|
|
229
|
+
disabled: selected.clientType === 'public',
|
|
230
|
+
});
|
|
231
|
+
const consentSwitch = new Switch({
|
|
232
|
+
value: requireConsent,
|
|
233
|
+
label: 'Re~q~uire consent',
|
|
234
|
+
});
|
|
235
|
+
const isValid = () => protocolIsValid(selected, grants(), authenticationMethod(), requirePkce(), scope());
|
|
236
|
+
const isDirty = () => grants().some((value, index) => value !== initialGrants[index]) ||
|
|
237
|
+
authenticationMethod() !== initialAuthentication ||
|
|
238
|
+
requirePkce() !== selected.requirePkce ||
|
|
239
|
+
requireConsent() !== selected.requireConsent ||
|
|
240
|
+
scope() !== selected.scope;
|
|
241
|
+
const save = new Button('~S~ave', {
|
|
242
|
+
disabled: () => !options.capabilities.canUpdateClients || submitted() || !isValid() || !isDirty(),
|
|
243
|
+
onClick: () => {
|
|
244
|
+
submitted.set(true);
|
|
245
|
+
options.onIntent({
|
|
246
|
+
kind: 'save-protocol',
|
|
247
|
+
clientId: selected.id,
|
|
248
|
+
input: {
|
|
249
|
+
grantTypes: grants
|
|
250
|
+
.peek()
|
|
251
|
+
.flatMap((enabled, index) => (enabled ? [grantNames[index]] : [])),
|
|
252
|
+
responseTypes: ['code'],
|
|
253
|
+
scope: scope.peek(),
|
|
254
|
+
tokenEndpointAuthMethod: authenticationNames[authenticationMethod.peek()],
|
|
255
|
+
requirePkce: requirePkce.peek(),
|
|
256
|
+
requireConsent: requireConsent.peek(),
|
|
257
|
+
},
|
|
258
|
+
});
|
|
259
|
+
},
|
|
260
|
+
});
|
|
261
|
+
const form = col({ gap: 1 }, fixed(row({ gap: 1 }, grow(new Text(`Client type: ${selected.clientType} (read only)`)), grow(new Text('Response type: code (read only)'))), 1), fixed(row({ gap: 2 }, grow(col({}, fixed(new Text('Grant types'), 1), fixed(grantChoices, 3))), grow(col({}, fixed(new Text('Token endpoint authentication'), 1), fixed(authenticationChoices, 3)))), 4), fixed(row({ gap: 1 }, fixed(new Label('Scope', scopeInput), 18), grow(scopeInput)), 1), fixed(row({ gap: 2 }, pkceSwitch, consentSwitch, grow(new Text(() => isValid() ? '' : 'Not supported for this client type.'))), 2));
|
|
262
|
+
return col({ gap: 1, padding: { top: 1, right: 1, bottom: 1, left: 1 } }, grow(form), fixed(row({ gap: 1 }, save, spacer()), 2));
|
|
263
|
+
};
|
|
264
|
+
/** Edits and saves inherited or explicit login methods directly inside the tab. */
|
|
265
|
+
const loginSection = (projection) => {
|
|
266
|
+
const selected = projection.client;
|
|
267
|
+
const initiallyInherited = selected.loginMethods === null;
|
|
268
|
+
const inherited = signal(initiallyInherited);
|
|
269
|
+
const initialMethods = selected.loginMethods ?? selected.effectiveLoginMethods;
|
|
270
|
+
const initialSelection = [
|
|
271
|
+
initialMethods.includes('password'),
|
|
272
|
+
initialMethods.includes('magic_link'),
|
|
273
|
+
];
|
|
274
|
+
const methods = signal([...initialSelection]);
|
|
275
|
+
const submitted = signal(false);
|
|
276
|
+
const methodChoices = new CheckGroup({
|
|
277
|
+
labels: ['~P~assword', '~M~agic link'],
|
|
278
|
+
value: methods,
|
|
279
|
+
});
|
|
280
|
+
const canSave = () => inherited() || methods().some(Boolean);
|
|
281
|
+
const isDirty = () => inherited() !== initiallyInherited ||
|
|
282
|
+
(!inherited() && methods().some((value, index) => value !== initialSelection[index]));
|
|
283
|
+
const form = col({ gap: 1 }, fixed(new Text(`Organization defaults: ${options.organization?.name ?? projection.organizationId}`), 1), fixed(new Text(`Effective methods: ${selected.effectiveLoginMethods
|
|
284
|
+
.map((method) => (method === 'magic_link' ? 'Magic link' : 'Password'))
|
|
285
|
+
.join(', ')}`), 1), fixed(new Switch({ value: inherited, label: 'Use organization defaults' }), 1), fixed(new Text('Client login methods'), 1), fixed(methodChoices, 2), fixed(new Text(() => (canSave() ? '' : 'Select Password, Magic link, or both before saving.')), 2));
|
|
286
|
+
let wasInherited = inherited.peek();
|
|
287
|
+
form.onMount(() => {
|
|
288
|
+
form.bind(() => inherited(), (usesDefaults) => {
|
|
289
|
+
methodChoices.focusable = !usesDefaults;
|
|
290
|
+
methodChoices.setItemEnabled(0, !usesDefaults);
|
|
291
|
+
methodChoices.setItemEnabled(1, !usesDefaults);
|
|
292
|
+
if (wasInherited && !usesDefaults)
|
|
293
|
+
methods.set([false, false]);
|
|
294
|
+
if (usesDefaults) {
|
|
295
|
+
methods.set([
|
|
296
|
+
selected.effectiveLoginMethods.includes('password'),
|
|
297
|
+
selected.effectiveLoginMethods.includes('magic_link'),
|
|
298
|
+
]);
|
|
299
|
+
}
|
|
300
|
+
wasInherited = usesDefaults;
|
|
301
|
+
}, { relayout: true });
|
|
302
|
+
});
|
|
303
|
+
methodChoices.focusable = !inherited.peek();
|
|
304
|
+
methodChoices.setItemEnabled(0, !inherited.peek());
|
|
305
|
+
methodChoices.setItemEnabled(1, !inherited.peek());
|
|
306
|
+
const save = new Button('~S~ave', {
|
|
307
|
+
disabled: () => !options.capabilities.canUpdateClients || submitted() || !canSave() || !isDirty(),
|
|
308
|
+
onClick: () => {
|
|
309
|
+
submitted.set(true);
|
|
310
|
+
const selectedMethods = methods.peek();
|
|
311
|
+
options.onIntent({
|
|
312
|
+
kind: 'save-login',
|
|
313
|
+
clientId: selected.id,
|
|
314
|
+
input: {
|
|
315
|
+
loginMethods: inherited.peek()
|
|
316
|
+
? null
|
|
317
|
+
: [
|
|
318
|
+
selectedMethods[0] ? 'password' : null,
|
|
319
|
+
selectedMethods[1] ? 'magic_link' : null,
|
|
320
|
+
].filter((method) => method !== null),
|
|
321
|
+
},
|
|
322
|
+
});
|
|
323
|
+
},
|
|
324
|
+
});
|
|
325
|
+
return col({ gap: 1, padding: { top: 1, right: 1, bottom: 1, left: 1 } }, grow(form), fixed(row({ gap: 1 }, save, spacer()), 2));
|
|
326
|
+
};
|
|
327
|
+
/** Renders metadata-only client secrets and selection-dependent operations. */
|
|
328
|
+
const credentialsSection = (projection) => {
|
|
329
|
+
const selected = projection.client;
|
|
330
|
+
const currentSecret = projection.secrets.find((secret) => secret.id === selectedSecretId.peek());
|
|
331
|
+
if (!currentSecret)
|
|
332
|
+
selectedSecretId.set(projection.secrets[0]?.id ?? null);
|
|
333
|
+
const rows = signal([...projection.secrets]);
|
|
334
|
+
const focused = signal(Math.max(0, projection.secrets.findIndex((secret) => secret.id === selectedSecretId.peek())));
|
|
335
|
+
const grid = new DataGrid({
|
|
336
|
+
rows,
|
|
337
|
+
focused,
|
|
338
|
+
columns: SECRET_COLUMNS,
|
|
339
|
+
zebra: true,
|
|
340
|
+
onSelect: (_index, secret) => selectedSecretId.set(secret.id),
|
|
341
|
+
});
|
|
342
|
+
const actions = [];
|
|
343
|
+
if (selected.clientType === 'confidential') {
|
|
344
|
+
actions.push(action('A~d~d', { kind: 'generate-secret', clientId: selected.id }, !options.capabilities.canUpdateClients));
|
|
345
|
+
actions.push(new Button('D~e~lete', {
|
|
346
|
+
disabled: () => {
|
|
347
|
+
const secret = projection.secrets.find((candidate) => candidate.id === selectedSecretId());
|
|
348
|
+
return !options.capabilities.canRevokeClientSecrets || !secret;
|
|
349
|
+
},
|
|
350
|
+
onClick: () => {
|
|
351
|
+
const secretId = selectedSecretId.peek();
|
|
352
|
+
if (secretId)
|
|
353
|
+
options.onIntent({ kind: 'delete-secret', clientId: selected.id, secretId });
|
|
354
|
+
},
|
|
355
|
+
}));
|
|
356
|
+
}
|
|
357
|
+
return col({ gap: 1, padding: { top: 1, right: 1, bottom: 1, left: 1 } }, selected.clientType === 'public' &&
|
|
358
|
+
fixed(new Text('Public clients do not use client secrets.'), 1), grow(grid), fixed(row({ gap: 1 }, ...actions, spacer()), 2));
|
|
359
|
+
};
|
|
360
|
+
/** Keeps lifecycle operations together and separate from workspace navigation. */
|
|
361
|
+
const lifecycleSection = (projection) => {
|
|
362
|
+
const selected = projection.client;
|
|
363
|
+
const lifecycle = selected.status === 'inactive'
|
|
364
|
+
? action('~A~ctivate', { kind: 'activate', clientId: selected.id }, !options.capabilities.canUpdateClients)
|
|
365
|
+
: action('~D~eactivate', { kind: 'deactivate', clientId: selected.id }, !options.capabilities.canUpdateClients);
|
|
366
|
+
return col({ gap: 1, padding: { top: 1, right: 1, bottom: 1, left: 1 } }, fixed(new Text(`Current status: ${selected.status}`), 1), fixed(new Text(selected.status === 'active'
|
|
367
|
+
? 'Deactivation stops new sign-ins. The client can be activated again later.'
|
|
368
|
+
: 'Activation allows this client to start new sign-ins again.'), 2), fixed(new Text('Deleting this client permanently removes its protocol authority and secrets.'), 2), spacer(), fixed(row({ gap: 1 }, lifecycle, action('Delete', { kind: 'delete', clientId: selected.id }, !options.capabilities.canDeleteClients), spacer()), 2));
|
|
369
|
+
};
|
|
370
|
+
/** Renders one selected client in a full-width tab pane. */
|
|
371
|
+
const renderDetail = (projection, status) => {
|
|
372
|
+
const selected = projection.client;
|
|
373
|
+
const clientChanged = detailClientId !== selected.id;
|
|
374
|
+
if (clientChanged) {
|
|
375
|
+
detailClientId = selected.id;
|
|
376
|
+
selectedSecretId.set(null);
|
|
377
|
+
const sectionIndex = projection.kind === 'secrets' ? 4 : 0;
|
|
378
|
+
selectedSection.set(sectionIndex);
|
|
379
|
+
}
|
|
380
|
+
const application = options.capabilities.canReadApplications
|
|
381
|
+
? (projection.applicationName ?? applicationLabel(selected, options))
|
|
382
|
+
: selected.applicationId;
|
|
383
|
+
const back = action('~B~ack to OIDC clients', { kind: 'back' });
|
|
384
|
+
/** Wraps a subview in the Group required by TabView. */
|
|
385
|
+
const tabPage = (child) => {
|
|
386
|
+
const page = new Group();
|
|
387
|
+
page.add(cover(child));
|
|
388
|
+
return page;
|
|
389
|
+
};
|
|
390
|
+
const pages = [
|
|
391
|
+
overviewSection(projection, application),
|
|
392
|
+
authenticationSection(projection),
|
|
393
|
+
protocolSection(projection),
|
|
394
|
+
loginSection(projection),
|
|
395
|
+
credentialsSection(projection),
|
|
396
|
+
lifecycleSection(projection),
|
|
397
|
+
];
|
|
398
|
+
const tabs = signal(CLIENT_DETAIL_SECTIONS.map((title, index) => ({ title, content: tabPage(pages[index]) })));
|
|
399
|
+
const tabView = new TabView({
|
|
400
|
+
tabs,
|
|
401
|
+
active: selectedSection,
|
|
402
|
+
onChange: (index) => {
|
|
403
|
+
if (index === 4 && projection.client.clientType === 'confidential')
|
|
404
|
+
options.onIntent({ kind: 'secrets', clientId: projection.client.id });
|
|
405
|
+
},
|
|
406
|
+
});
|
|
407
|
+
content.add(cover(col({ gap: 1, padding: { top: 0, right: 1, bottom: 0, left: 1 } }, statusRow(status), grow(tabView), fixed(row({ gap: 1 }, back, spacer()), 2))));
|
|
408
|
+
currentFocus = tabView.strip;
|
|
409
|
+
};
|
|
410
|
+
/** Converts a legacy retained list into the current explicit list projection. */
|
|
411
|
+
const normalizePrevious = (previous, organizationId) => Array.isArray(previous)
|
|
412
|
+
? { kind: 'list', organizationId, clients: previous }
|
|
413
|
+
: previous;
|
|
414
|
+
/** Rebuilds content so removed views cannot leave terminal artifacts. */
|
|
415
|
+
const render = () => {
|
|
416
|
+
for (const child of [...content.children])
|
|
417
|
+
content.remove(child);
|
|
418
|
+
currentFocus = null;
|
|
419
|
+
if (disposed)
|
|
420
|
+
return;
|
|
421
|
+
if (!options.organization) {
|
|
422
|
+
content.add(cover(col({ gap: 1, padding: { top: 0, right: 1, bottom: 0, left: 1 } }, fixed(new Text('organization required'), 1), spacer())));
|
|
423
|
+
return;
|
|
424
|
+
}
|
|
425
|
+
if (state.kind === 'closed') {
|
|
426
|
+
content.add(cover(spacer()));
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
if (state.kind === 'list') {
|
|
430
|
+
detailClientId = null;
|
|
431
|
+
return renderList(state);
|
|
432
|
+
}
|
|
433
|
+
if (state.kind === 'detail')
|
|
434
|
+
return renderDetail(state);
|
|
435
|
+
if (state.kind === 'secrets')
|
|
436
|
+
return renderDetail(state);
|
|
437
|
+
const label = state.kind === 'loading'
|
|
438
|
+
? 'Loading OIDC clients…'
|
|
439
|
+
: state.kind === 'indeterminate'
|
|
440
|
+
? 'The operation outcome is unknown; reload is required'
|
|
441
|
+
: FAILURE_LABELS[state.failure];
|
|
442
|
+
if (state.previous) {
|
|
443
|
+
const previous = normalizePrevious(state.previous, state.organizationId);
|
|
444
|
+
const status = { label, retry: state.kind !== 'loading' };
|
|
445
|
+
if (previous.kind === 'list')
|
|
446
|
+
renderList(previous, status);
|
|
447
|
+
else if (previous.kind === 'detail')
|
|
448
|
+
renderDetail(previous, status);
|
|
449
|
+
else
|
|
450
|
+
renderDetail(previous, status);
|
|
451
|
+
return;
|
|
452
|
+
}
|
|
453
|
+
const retry = new Button('~R~etry', { onClick: () => options.onIntent({ kind: 'retry' }) });
|
|
454
|
+
content.add(cover(col({ gap: 1, padding: { top: 0, right: 1, bottom: 0, left: 1 } }, fixed(new Text(label), 1), state.kind !== 'loading' && row(retry, spacer()), spacer())));
|
|
455
|
+
if (state.kind !== 'loading')
|
|
456
|
+
currentFocus = retry;
|
|
457
|
+
};
|
|
458
|
+
return {
|
|
459
|
+
content,
|
|
460
|
+
setState(next) {
|
|
461
|
+
if (disposed)
|
|
462
|
+
return;
|
|
463
|
+
state = next;
|
|
464
|
+
render();
|
|
465
|
+
},
|
|
466
|
+
focusCurrent() {
|
|
467
|
+
if (currentFocus)
|
|
468
|
+
options.focusView?.(currentFocus);
|
|
469
|
+
},
|
|
470
|
+
clear() {
|
|
471
|
+
if (disposed)
|
|
472
|
+
return;
|
|
473
|
+
state = { kind: 'closed' };
|
|
474
|
+
focusedClientId = null;
|
|
475
|
+
detailClientId = null;
|
|
476
|
+
selectedSecretId.set(null);
|
|
477
|
+
render();
|
|
478
|
+
},
|
|
479
|
+
dispose() {
|
|
480
|
+
if (disposed)
|
|
481
|
+
return;
|
|
482
|
+
state = { kind: 'closed' };
|
|
483
|
+
focusedClientId = null;
|
|
484
|
+
detailClientId = null;
|
|
485
|
+
selectedSecretId.set(null);
|
|
486
|
+
render();
|
|
487
|
+
disposed = true;
|
|
488
|
+
},
|
|
489
|
+
};
|
|
490
|
+
}
|
|
491
|
+
//# sourceMappingURL=client-workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-workspace.js","sourceRoot":"","sources":["../../src/admin/client-workspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/** Shared bounded layout for irreversible Admin UI confirmation dialogs. */
|
|
2
|
+
import { Button, col, Scroller } from '@jsvision/ui';
|
|
3
|
+
/** Inputs required to render one complete deletion target and its fixed cascade warning. */
|
|
4
|
+
export interface DeleteConfirmationLayoutOptions {
|
|
5
|
+
/** Live dialog width, already capped to the terminal viewport. */
|
|
6
|
+
readonly dialogWidth: number;
|
|
7
|
+
/** Complete target and parent context retained for vertical inspection. */
|
|
8
|
+
readonly details: string;
|
|
9
|
+
/** Short affected-data warning kept visible above the action row. */
|
|
10
|
+
readonly warning: string;
|
|
11
|
+
/** Safe default action. */
|
|
12
|
+
readonly keep: Button;
|
|
13
|
+
/** Destructive action whose face may be clipped on a narrow terminal. */
|
|
14
|
+
readonly remove: Button;
|
|
15
|
+
}
|
|
16
|
+
/** Result used by a dialog to mount the layout and explicitly restore safe initial focus. */
|
|
17
|
+
export interface DeleteConfirmationLayout {
|
|
18
|
+
/** Complete Layout DSL tree. */
|
|
19
|
+
readonly content: ReturnType<typeof col>;
|
|
20
|
+
/** Scrollable target details that remain inspectable on a small terminal. */
|
|
21
|
+
readonly details: Scroller;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Returns a destructive button label that fits the confirmation row while retaining its action.
|
|
25
|
+
*
|
|
26
|
+
* The complete target remains available in the scrollable details; only the redundant button copy
|
|
27
|
+
* is shortened.
|
|
28
|
+
*/
|
|
29
|
+
export declare function deleteActionLabel(target: string, dialogWidth: number): string;
|
|
30
|
+
/**
|
|
31
|
+
* Builds a compact confirmation layout without truncating the authoritative target text.
|
|
32
|
+
*
|
|
33
|
+
* The cascade warning remains visible while long target details scroll vertically. Button bounds
|
|
34
|
+
* are capped to the available row, and only the redundant target copy in an oversized destructive
|
|
35
|
+
* label is shortened with an ellipsis.
|
|
36
|
+
*/
|
|
37
|
+
export declare function deleteConfirmationLayout(options: DeleteConfirmationLayoutOptions): DeleteConfirmationLayout;
|
|
38
|
+
//# sourceMappingURL=delete-confirmation-layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-confirmation-layout.d.ts","sourceRoot":"","sources":["../../src/admin/delete-confirmation-layout.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAE5E,OAAO,EAEL,MAAM,EACN,GAAG,EAKH,QAAQ,EAKT,MAAM,cAAc,CAAC;AAEtB,4FAA4F;AAC5F,MAAM,WAAW,+BAA+B;IAC9C,kEAAkE;IAClE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,qEAAqE;IACrE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,2BAA2B;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,6FAA6F;AAC7F,MAAM,WAAW,wBAAwB;IACvC,gCAAgC;IAChC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC;IACzC,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAiB7E;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,+BAA+B,GACvC,wBAAwB,CAsB1B"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/** Shared bounded layout for irreversible Admin UI confirmation dialogs. */
|
|
2
|
+
import { at, Button, col, fixed, Group, grow, row, Scroller, spacer, stringWidth, Text, wrapText, } from '@jsvision/ui';
|
|
3
|
+
/**
|
|
4
|
+
* Returns a destructive button label that fits the confirmation row while retaining its action.
|
|
5
|
+
*
|
|
6
|
+
* The complete target remains available in the scrollable details; only the redundant button copy
|
|
7
|
+
* is shortened.
|
|
8
|
+
*/
|
|
9
|
+
export function deleteActionLabel(target, dialogWidth) {
|
|
10
|
+
const full = `Delete ${target}`;
|
|
11
|
+
const contentWidth = Math.max(1, dialogWidth - 6);
|
|
12
|
+
const keepWidth = new Button('Keep').measure().width;
|
|
13
|
+
const maximumButtonWidth = Math.max(1, contentWidth - keepWidth - 2);
|
|
14
|
+
const chromeWidth = new Button('').measure().width;
|
|
15
|
+
const maximumTextWidth = Math.max(1, maximumButtonWidth - chromeWidth);
|
|
16
|
+
if (stringWidth(full) <= maximumTextWidth)
|
|
17
|
+
return full;
|
|
18
|
+
const prefix = 'Delete ';
|
|
19
|
+
const targetWidth = Math.max(0, maximumTextWidth - stringWidth(prefix) - 1);
|
|
20
|
+
let clippedTarget = '';
|
|
21
|
+
for (const character of target) {
|
|
22
|
+
if (stringWidth(clippedTarget + character) > targetWidth)
|
|
23
|
+
break;
|
|
24
|
+
clippedTarget += character;
|
|
25
|
+
}
|
|
26
|
+
return `${prefix}${clippedTarget}…`;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Builds a compact confirmation layout without truncating the authoritative target text.
|
|
30
|
+
*
|
|
31
|
+
* The cascade warning remains visible while long target details scroll vertically. Button bounds
|
|
32
|
+
* are capped to the available row, and only the redundant target copy in an oversized destructive
|
|
33
|
+
* label is shortened with an ellipsis.
|
|
34
|
+
*/
|
|
35
|
+
export function deleteConfirmationLayout(options) {
|
|
36
|
+
const contentWidth = Math.max(1, options.dialogWidth - 6);
|
|
37
|
+
const detailsWidth = Math.max(1, contentWidth - 1);
|
|
38
|
+
const detailsHeight = Math.max(1, wrapText(options.details, detailsWidth).length);
|
|
39
|
+
const detailsContent = new Group();
|
|
40
|
+
detailsContent.add(at(new Text(options.details), 0, 0, detailsWidth, detailsHeight));
|
|
41
|
+
const details = new Scroller({
|
|
42
|
+
content: detailsContent,
|
|
43
|
+
extent: { width: detailsWidth, height: detailsHeight },
|
|
44
|
+
scrollbars: 'vertical',
|
|
45
|
+
});
|
|
46
|
+
const warningHeight = Math.max(1, wrapText(options.warning, contentWidth).length);
|
|
47
|
+
return {
|
|
48
|
+
content: col({ gap: 1, padding: { top: 1, right: 2, bottom: 1, left: 2 } }, fixed(new Text(options.warning), warningHeight), grow(details), fixed(row({ gap: 1 }, spacer(), options.keep, options.remove), 2)),
|
|
49
|
+
details,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=delete-confirmation-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-confirmation-layout.js","sourceRoot":"","sources":["../../src/admin/delete-confirmation-layout.ts"],"names":[],"mappings":"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"}
|