@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,158 @@
|
|
|
1
|
+
/** Immutable user administration values retained by the terminal application. */
|
|
2
|
+
/** Supported user lifecycle values. */
|
|
3
|
+
export type AdminUserStatus = 'active' | 'inactive' | 'locked';
|
|
4
|
+
/** Bounded row displayed in the user list. */
|
|
5
|
+
export interface AdminUserListItem {
|
|
6
|
+
/** Stable user UUID. */
|
|
7
|
+
readonly id: string;
|
|
8
|
+
/** UUID of the organization that owns the user. */
|
|
9
|
+
readonly organizationId: string;
|
|
10
|
+
/** User email address. */
|
|
11
|
+
readonly email: string;
|
|
12
|
+
/** OIDC given name, when present. */
|
|
13
|
+
readonly givenName: string | null;
|
|
14
|
+
/** OIDC family name, when present. */
|
|
15
|
+
readonly familyName: string | null;
|
|
16
|
+
/** Current lifecycle state. */
|
|
17
|
+
readonly status: AdminUserStatus;
|
|
18
|
+
}
|
|
19
|
+
/** One validated page of users. */
|
|
20
|
+
export interface AdminUserPage {
|
|
21
|
+
/** Validated rows in server order. */
|
|
22
|
+
readonly data: readonly AdminUserListItem[];
|
|
23
|
+
/** Total number of matching users. */
|
|
24
|
+
readonly total: number;
|
|
25
|
+
/** One-based page number. */
|
|
26
|
+
readonly page: number;
|
|
27
|
+
/** Fixed number of requested rows per page. */
|
|
28
|
+
readonly pageSize: number;
|
|
29
|
+
/** Number of available pages. */
|
|
30
|
+
readonly totalPages: number;
|
|
31
|
+
}
|
|
32
|
+
/** Allowlisted user detail safe for terminal presentation. */
|
|
33
|
+
export interface AdminUserDetail extends AdminUserListItem {
|
|
34
|
+
/** Whether the email address is verified. */
|
|
35
|
+
readonly emailVerified: boolean;
|
|
36
|
+
/** Whether the user currently has a password. */
|
|
37
|
+
readonly hasPassword: boolean;
|
|
38
|
+
/** OIDC middle name, when present. */
|
|
39
|
+
readonly middleName: string | null;
|
|
40
|
+
/** OIDC nickname, when present. */
|
|
41
|
+
readonly nickname: string | null;
|
|
42
|
+
/** OIDC preferred username, when present. */
|
|
43
|
+
readonly preferredUsername: string | null;
|
|
44
|
+
/** OIDC profile URL, when present. */
|
|
45
|
+
readonly profileUrl: string | null;
|
|
46
|
+
/** OIDC picture URL, when present. */
|
|
47
|
+
readonly pictureUrl: string | null;
|
|
48
|
+
/** OIDC website URL, when present. */
|
|
49
|
+
readonly websiteUrl: string | null;
|
|
50
|
+
/** OIDC gender value, when present. */
|
|
51
|
+
readonly gender: string | null;
|
|
52
|
+
/** OIDC birthdate, when present. */
|
|
53
|
+
readonly birthdate: string | null;
|
|
54
|
+
/** OIDC time zone, when present. */
|
|
55
|
+
readonly zoneinfo: string | null;
|
|
56
|
+
/** OIDC locale, when present. */
|
|
57
|
+
readonly locale: string | null;
|
|
58
|
+
/** OIDC phone number, when present. */
|
|
59
|
+
readonly phoneNumber: string | null;
|
|
60
|
+
/** Whether the phone number is verified. */
|
|
61
|
+
readonly phoneNumberVerified: boolean;
|
|
62
|
+
/** Address street, when present. */
|
|
63
|
+
readonly addressStreet: string | null;
|
|
64
|
+
/** Address locality, when present. */
|
|
65
|
+
readonly addressLocality: string | null;
|
|
66
|
+
/** Address region, when present. */
|
|
67
|
+
readonly addressRegion: string | null;
|
|
68
|
+
/** Address postal code, when present. */
|
|
69
|
+
readonly addressPostalCode: string | null;
|
|
70
|
+
/** Two-letter address country, when present. */
|
|
71
|
+
readonly addressCountry: string | null;
|
|
72
|
+
/** Whether two-factor authentication is enabled. */
|
|
73
|
+
readonly twoFactorEnabled: boolean;
|
|
74
|
+
/** Last successful login timestamp, when available. */
|
|
75
|
+
readonly lastLoginAt: string | null;
|
|
76
|
+
/** Non-negative successful login count. */
|
|
77
|
+
readonly loginCount: number;
|
|
78
|
+
/** User creation timestamp. */
|
|
79
|
+
readonly createdAt: string;
|
|
80
|
+
/** Most recent user update timestamp. */
|
|
81
|
+
readonly updatedAt: string;
|
|
82
|
+
}
|
|
83
|
+
/** One allowlisted user history entry. */
|
|
84
|
+
export interface AdminUserHistoryEntry {
|
|
85
|
+
/** Bounded event type. */
|
|
86
|
+
readonly eventType: string;
|
|
87
|
+
/** Actor UUID, or `System` for a server-generated event. */
|
|
88
|
+
readonly actor: string;
|
|
89
|
+
/** Event timestamp. */
|
|
90
|
+
readonly createdAt: string;
|
|
91
|
+
}
|
|
92
|
+
/** First validated page of user history. */
|
|
93
|
+
export interface AdminUserHistory {
|
|
94
|
+
/** Newest-first history rows. */
|
|
95
|
+
readonly entries: readonly AdminUserHistoryEntry[];
|
|
96
|
+
/** Whether more history exists on the server. */
|
|
97
|
+
readonly hasMore: boolean;
|
|
98
|
+
}
|
|
99
|
+
/** Plain-text invitation preview safe for terminal display. */
|
|
100
|
+
export interface AdminInvitationPreview {
|
|
101
|
+
/** Bounded email subject. */
|
|
102
|
+
readonly subject: string;
|
|
103
|
+
/** Bounded plain-text email body. */
|
|
104
|
+
readonly text: string;
|
|
105
|
+
}
|
|
106
|
+
/** Fixed user-operation failures safe to display. */
|
|
107
|
+
export type AdminUserFailureKind = 'validation' | 'unauthorized' | 'not-found' | 'conflict' | 'unavailable' | 'invalid-response';
|
|
108
|
+
/** Fixed outcome that may be displayed over a validated user view. */
|
|
109
|
+
export type AdminUserOutcome = AdminUserFailureKind | 'outcome-unknown';
|
|
110
|
+
/** A validated page with its currently selected row, when one is open. */
|
|
111
|
+
export interface AdminUserSelection {
|
|
112
|
+
/** Page retained behind the detail view. */
|
|
113
|
+
readonly page: AdminUserPage;
|
|
114
|
+
/** Selected row from the retained page. */
|
|
115
|
+
readonly selected: AdminUserListItem;
|
|
116
|
+
/** Validated detail for the selected row. */
|
|
117
|
+
readonly detail: AdminUserDetail;
|
|
118
|
+
/** Opaque update precondition retained by the controller, never rendered. */
|
|
119
|
+
readonly etag: string | null;
|
|
120
|
+
}
|
|
121
|
+
/** Previous validated projection retained while loading or after a recoverable failure. */
|
|
122
|
+
export type AdminUserProjection = {
|
|
123
|
+
readonly kind: 'page';
|
|
124
|
+
readonly page: AdminUserPage;
|
|
125
|
+
} | ({
|
|
126
|
+
readonly kind: 'detail';
|
|
127
|
+
} & AdminUserSelection) | ({
|
|
128
|
+
readonly kind: 'history';
|
|
129
|
+
readonly history: AdminUserHistory;
|
|
130
|
+
} & AdminUserSelection);
|
|
131
|
+
/** Complete user workspace state for one selected organization and session. */
|
|
132
|
+
export type AdminUserViewState = {
|
|
133
|
+
readonly kind: 'closed';
|
|
134
|
+
} | {
|
|
135
|
+
readonly kind: 'success';
|
|
136
|
+
readonly action: 'created' | 'invited';
|
|
137
|
+
} | {
|
|
138
|
+
readonly kind: 'indeterminate';
|
|
139
|
+
} | {
|
|
140
|
+
readonly kind: 'loading';
|
|
141
|
+
readonly previous?: AdminUserProjection;
|
|
142
|
+
} | {
|
|
143
|
+
readonly kind: 'page';
|
|
144
|
+
readonly page: AdminUserPage;
|
|
145
|
+
readonly outcome?: AdminUserOutcome;
|
|
146
|
+
} | ({
|
|
147
|
+
readonly kind: 'detail';
|
|
148
|
+
readonly outcome?: AdminUserOutcome;
|
|
149
|
+
} & AdminUserSelection) | ({
|
|
150
|
+
readonly kind: 'history';
|
|
151
|
+
readonly history: AdminUserHistory;
|
|
152
|
+
readonly outcome?: AdminUserOutcome;
|
|
153
|
+
} & AdminUserSelection) | {
|
|
154
|
+
readonly kind: 'failure';
|
|
155
|
+
readonly failure: AdminUserFailureKind;
|
|
156
|
+
readonly previous?: AdminUserProjection;
|
|
157
|
+
};
|
|
158
|
+
//# sourceMappingURL=user-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-state.d.ts","sourceRoot":"","sources":["../../src/admin/user-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-state.js","sourceRoot":"","sources":["../../src/admin/user-state.ts"],"names":[],"mappings":"AAAA,iFAAiF"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/** Direct JSVision workspace for browsing one organization's users. */
|
|
2
|
+
import { View } from '@jsvision/ui';
|
|
3
|
+
import type { AdminCapabilities } from './state.js';
|
|
4
|
+
import type { AdminUserStatus, AdminUserViewState } from './user-state.js';
|
|
5
|
+
/** Closed set of user actions emitted by the workspace. */
|
|
6
|
+
export type AdminUserIntent = {
|
|
7
|
+
readonly kind: 'search';
|
|
8
|
+
readonly value?: string;
|
|
9
|
+
} | {
|
|
10
|
+
readonly kind: 'filter';
|
|
11
|
+
readonly status?: AdminUserStatus;
|
|
12
|
+
} | {
|
|
13
|
+
readonly kind: 'page';
|
|
14
|
+
readonly page: number;
|
|
15
|
+
} | {
|
|
16
|
+
readonly kind: 'select';
|
|
17
|
+
readonly userId: string;
|
|
18
|
+
} | {
|
|
19
|
+
readonly kind: 'history';
|
|
20
|
+
} | {
|
|
21
|
+
readonly kind: 'retry';
|
|
22
|
+
} | {
|
|
23
|
+
readonly kind: 'back';
|
|
24
|
+
} | {
|
|
25
|
+
readonly kind: 'roles';
|
|
26
|
+
} | {
|
|
27
|
+
readonly kind: 'edit';
|
|
28
|
+
} | {
|
|
29
|
+
readonly kind: 'set-password';
|
|
30
|
+
} | {
|
|
31
|
+
readonly kind: 'clear-password';
|
|
32
|
+
} | {
|
|
33
|
+
readonly kind: 'verify-email';
|
|
34
|
+
} | {
|
|
35
|
+
readonly kind: 'deactivate';
|
|
36
|
+
} | {
|
|
37
|
+
readonly kind: 'activate';
|
|
38
|
+
} | {
|
|
39
|
+
readonly kind: 'delete';
|
|
40
|
+
};
|
|
41
|
+
/** Construction inputs for one user-specific workspace. */
|
|
42
|
+
export interface AdminUserWorkspaceOptions {
|
|
43
|
+
/** Exact capabilities from the currently verified session. */
|
|
44
|
+
readonly capabilities: AdminCapabilities;
|
|
45
|
+
/** Receives only a closed user intent; network work is owned by the application controller. */
|
|
46
|
+
readonly onIntent: (intent: AdminUserIntent) => void;
|
|
47
|
+
/** Focuses one mounted JSVision control through the owning application loop. */
|
|
48
|
+
readonly focusView?: (view: View) => void;
|
|
49
|
+
}
|
|
50
|
+
/** Mounted user workspace controlled through immutable validated state. */
|
|
51
|
+
export interface AdminUserWorkspace {
|
|
52
|
+
/** Content mounted inside the administration shell. */
|
|
53
|
+
readonly content: View;
|
|
54
|
+
/** Replaces the complete validated view state. */
|
|
55
|
+
readonly setState: (state: AdminUserViewState) => void;
|
|
56
|
+
/** Restores focus to the current view's primary control. */
|
|
57
|
+
readonly focusCurrent: () => void;
|
|
58
|
+
/** Removes retained user state and controls. */
|
|
59
|
+
readonly clear: () => void;
|
|
60
|
+
/** Permanently removes the workspace controls. */
|
|
61
|
+
readonly dispose: () => void;
|
|
62
|
+
}
|
|
63
|
+
/** Builds the direct user workspace without a reusable screen abstraction. */
|
|
64
|
+
export declare function createAdminUserWorkspace(options: AdminUserWorkspaceOptions): AdminUserWorkspace;
|
|
65
|
+
//# sourceMappingURL=user-workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-workspace.d.ts","sourceRoot":"","sources":["../../src/admin/user-workspace.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAEvE,OAAO,EAiBL,IAAI,EAEL,MAAM,cAAc,CAAC;AAGtB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,EAKV,eAAe,EACf,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AAEzB,2DAA2D;AAC3D,MAAM,MAAM,eAAe,GACvB;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAA;CAAE,GAC9D;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;CAAE,GACjC;IAAE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,GACnC;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;CAAE,GACjC;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;CAAE,GAC/B;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GAC7B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEhC,2DAA2D;AAC3D,MAAM,WAAW,yBAAyB;IACxC,8DAA8D;IAC9D,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC;IACzC,+FAA+F;IAC/F,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;IACrD,gFAAgF;IAChF,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;CAC3C;AAED,2EAA2E;AAC3E,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,kDAAkD;IAClD,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACvD,4DAA4D;IAC5D,QAAQ,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC;IAClC,gDAAgD;IAChD,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;IAC3B,kDAAkD;IAClD,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B;AA0DD,8EAA8E;AAC9E,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG,kBAAkB,CA4c/F"}
|
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
/** Direct JSVision workspace for browsing one organization's users. */
|
|
2
|
+
import { Button, col, ComboBox, cover, DataGrid, Dialog, fixed, GroupBox, grow, Input, Label, ListView, signal, spacer, Text, row, } from '@jsvision/ui';
|
|
3
|
+
import { formatAdminDateTime, formatOptionalAdminDateTime } from './admin-date-time.js';
|
|
4
|
+
/** Fixed labels for safe user-operation outcomes. */
|
|
5
|
+
const OUTCOME_LABELS = {
|
|
6
|
+
validation: 'Validation failed',
|
|
7
|
+
unauthorized: 'Not authorized',
|
|
8
|
+
'not-found': 'User not found',
|
|
9
|
+
conflict: 'Conflict',
|
|
10
|
+
unavailable: 'Service unavailable',
|
|
11
|
+
'invalid-response': 'Invalid server response',
|
|
12
|
+
'outcome-unknown': 'The operation outcome is unknown',
|
|
13
|
+
};
|
|
14
|
+
/** Columns shown in the user browser's standard JSVision data grid. */
|
|
15
|
+
const USER_COLUMNS = [
|
|
16
|
+
{ title: 'Email', accessor: (user) => user.email, width: '2fr', minWidth: 18 },
|
|
17
|
+
{
|
|
18
|
+
title: 'Name',
|
|
19
|
+
accessor: (user) => [user.givenName, user.familyName].filter(Boolean).join(' '),
|
|
20
|
+
width: '1fr',
|
|
21
|
+
minWidth: 12,
|
|
22
|
+
},
|
|
23
|
+
{ title: 'Status', accessor: (user) => user.status, width: 11 },
|
|
24
|
+
];
|
|
25
|
+
/** Converts a nullable validated value to readable terminal text. */
|
|
26
|
+
function optional(value) {
|
|
27
|
+
return value ?? 'Not provided';
|
|
28
|
+
}
|
|
29
|
+
/** Returns the previous safe projection retained beneath a loading/failure state. */
|
|
30
|
+
function previousState(previous) {
|
|
31
|
+
switch (previous.kind) {
|
|
32
|
+
case 'page':
|
|
33
|
+
return { kind: 'page', page: previous.page };
|
|
34
|
+
case 'detail':
|
|
35
|
+
return { ...previous };
|
|
36
|
+
case 'history':
|
|
37
|
+
return { ...previous };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** Builds the direct user workspace without a reusable screen abstraction. */
|
|
41
|
+
export function createAdminUserWorkspace(options) {
|
|
42
|
+
const content = new Dialog({ title: 'Users', width: 72, height: 20 });
|
|
43
|
+
content.closable = false;
|
|
44
|
+
content.resizable = false;
|
|
45
|
+
content.zoomable = false;
|
|
46
|
+
content.background = 'dialog';
|
|
47
|
+
let currentState = { kind: 'closed' };
|
|
48
|
+
let currentFocus = null;
|
|
49
|
+
let disposed = false;
|
|
50
|
+
const searchValue = signal('');
|
|
51
|
+
const filterStatus = signal(null);
|
|
52
|
+
let focusedUserId = null;
|
|
53
|
+
/** Reports when the dialog needs its bounded narrow-terminal presentation. */
|
|
54
|
+
const isCompact = () => (content.bounds.width || 74) < 60 || (content.bounds.height || 18) < 15;
|
|
55
|
+
/** Builds an action button whose natural size is resolved by its Layout DSL row. */
|
|
56
|
+
const action = (label, intent) => {
|
|
57
|
+
const button = new Button(label, { onClick: () => options.onIntent(intent) });
|
|
58
|
+
currentFocus ??= button;
|
|
59
|
+
return button;
|
|
60
|
+
};
|
|
61
|
+
/** Renders list browsing controls for one validated page. */
|
|
62
|
+
const renderPage = (state, status) => {
|
|
63
|
+
const compact = isCompact();
|
|
64
|
+
const searchInput = new Input({ value: searchValue, maxLength: 255 });
|
|
65
|
+
const searchButton = new Button('~S~earch', {
|
|
66
|
+
onClick: () => options.onIntent(searchValue.peek() ? { kind: 'search', value: searchValue.peek() } : { kind: 'search' }),
|
|
67
|
+
});
|
|
68
|
+
const searchBar = row({ gap: 1 }, fixed(new Label('~S~earch', searchInput), 7), grow(col(fixed(searchInput, 1), spacer())), searchButton);
|
|
69
|
+
currentFocus = searchInput;
|
|
70
|
+
const filters = [
|
|
71
|
+
['~A~ll', undefined],
|
|
72
|
+
['Act~i~ve', 'active'],
|
|
73
|
+
['I~n~active', 'inactive'],
|
|
74
|
+
['~L~ocked', 'locked'],
|
|
75
|
+
];
|
|
76
|
+
let filterBar;
|
|
77
|
+
if (compact) {
|
|
78
|
+
const statuses = signal([
|
|
79
|
+
null,
|
|
80
|
+
'active',
|
|
81
|
+
'inactive',
|
|
82
|
+
'locked',
|
|
83
|
+
]);
|
|
84
|
+
const filter = new ComboBox({
|
|
85
|
+
items: statuses,
|
|
86
|
+
getText: (status) => status ?? 'All',
|
|
87
|
+
value: filterStatus,
|
|
88
|
+
editable: false,
|
|
89
|
+
onSelect: (_index, status) => options.onIntent(status ? { kind: 'filter', status } : { kind: 'filter' }),
|
|
90
|
+
});
|
|
91
|
+
filterBar = row({ gap: 1 }, fixed(new Text('Status'), 6), grow(filter));
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
const filterControls = [];
|
|
95
|
+
for (const [label, status] of filters) {
|
|
96
|
+
filterControls.push(new Button(label, {
|
|
97
|
+
onClick: () => {
|
|
98
|
+
filterStatus.set(status ?? null);
|
|
99
|
+
options.onIntent(status ? { kind: 'filter', status } : { kind: 'filter' });
|
|
100
|
+
},
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
filterBar = row({ gap: 1 }, ...filterControls, spacer(), fixed(new Text(`Filter: ${filterStatus.peek() ?? 'All'}`), 16));
|
|
104
|
+
}
|
|
105
|
+
const rows = signal([...state.page.data]);
|
|
106
|
+
const focused = signal(Math.max(0, state.page.data.findIndex((user) => user.id === focusedUserId)));
|
|
107
|
+
const grid = new DataGrid({
|
|
108
|
+
rows,
|
|
109
|
+
columns: USER_COLUMNS,
|
|
110
|
+
focused,
|
|
111
|
+
zebra: true,
|
|
112
|
+
onSelect: (_index, user) => {
|
|
113
|
+
focusedUserId = user.id;
|
|
114
|
+
options.onIntent({ kind: 'select', userId: user.id });
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
currentFocus = grid.rows;
|
|
118
|
+
const previous = new Button('~P~revious', {
|
|
119
|
+
disabled: state.page.page <= 1,
|
|
120
|
+
onClick: () => options.onIntent({ kind: 'page', page: state.page.page - 1 }),
|
|
121
|
+
});
|
|
122
|
+
const next = new Button('~N~ext', {
|
|
123
|
+
disabled: state.page.page >= state.page.totalPages,
|
|
124
|
+
onClick: () => options.onIntent({ kind: 'page', page: state.page.page + 1 }),
|
|
125
|
+
});
|
|
126
|
+
const pager = row({ gap: 1 }, previous, grow(new Text(`Page ${state.page.page} of ${Math.max(1, state.page.totalPages)}`)), spacer(), state.outcome && fixed(new Text(OUTCOME_LABELS[state.outcome]), compact ? 18 : 26), next);
|
|
127
|
+
const retry = status?.retry
|
|
128
|
+
? new Button('~R~etry', { onClick: () => options.onIntent({ kind: 'retry' }) })
|
|
129
|
+
: undefined;
|
|
130
|
+
const pageLayout = col({
|
|
131
|
+
gap: compact ? 0 : 1,
|
|
132
|
+
padding: { top: 0, right: 1, bottom: 0, left: 1 },
|
|
133
|
+
}, status && fixed(row({ gap: 1 }, grow(new Text(status.label)), retry), 2), fixed(searchBar, 2), fixed(filterBar, compact ? 1 : 2), grow(grid), fixed(new Text(state.page.data.length === 0
|
|
134
|
+
? searchValue.peek() || filterStatus.peek()
|
|
135
|
+
? 'No matching users'
|
|
136
|
+
: 'No users'
|
|
137
|
+
: `↑↓ Move · Enter View details · ${state.page.total} ${state.page.total === 1 ? 'user' : 'users'}`), 1), fixed(pager, 2));
|
|
138
|
+
content.add(cover(pageLayout));
|
|
139
|
+
if (retry)
|
|
140
|
+
currentFocus = retry;
|
|
141
|
+
};
|
|
142
|
+
/** Returns every action valid for the selected user and current capabilities. */
|
|
143
|
+
const detailActions = (user) => {
|
|
144
|
+
const actions = [];
|
|
145
|
+
if (options.capabilities.canReadRoles) {
|
|
146
|
+
actions.push({ label: 'Roles', intent: { kind: 'roles' } });
|
|
147
|
+
}
|
|
148
|
+
if (options.capabilities.canUpdateUsers) {
|
|
149
|
+
actions.push({ label: '~E~dit', intent: { kind: 'edit' } });
|
|
150
|
+
actions.push({ label: 'Set password', intent: { kind: 'set-password' } });
|
|
151
|
+
if (user.hasPassword)
|
|
152
|
+
actions.push({ label: 'Clear password', intent: { kind: 'clear-password' } });
|
|
153
|
+
if (!user.emailVerified)
|
|
154
|
+
actions.push({ label: 'Verify email', intent: { kind: 'verify-email' } });
|
|
155
|
+
}
|
|
156
|
+
if (options.capabilities.canManageUserLifecycle) {
|
|
157
|
+
if (user.status === 'active') {
|
|
158
|
+
actions.push({ label: 'Deactivate', intent: { kind: 'deactivate' } });
|
|
159
|
+
}
|
|
160
|
+
else if (user.status === 'inactive')
|
|
161
|
+
actions.push({ label: 'Activate', intent: { kind: 'activate' } });
|
|
162
|
+
}
|
|
163
|
+
if (options.capabilities.canDeleteUsers)
|
|
164
|
+
actions.push({ label: 'Delete', intent: { kind: 'delete' } });
|
|
165
|
+
return actions;
|
|
166
|
+
};
|
|
167
|
+
/** Builds a bounded list for detail values that cannot all fit in a small terminal. */
|
|
168
|
+
const detailList = (lines) => new ListView({
|
|
169
|
+
items: signal([...lines]),
|
|
170
|
+
getText: (line) => line,
|
|
171
|
+
sorted: false,
|
|
172
|
+
});
|
|
173
|
+
/** Renders the allowlisted detail projection and exact available actions. */
|
|
174
|
+
const renderDetail = (state, status) => {
|
|
175
|
+
const user = state.detail;
|
|
176
|
+
const compact = isCompact();
|
|
177
|
+
const identityLines = [
|
|
178
|
+
`Email: ${user.email} (${user.emailVerified ? 'verified' : 'unverified'})`,
|
|
179
|
+
`Name: ${optional(user.givenName)} ${optional(user.middleName)} ${optional(user.familyName)}`,
|
|
180
|
+
`Username: ${optional(user.preferredUsername)} Nickname: ${optional(user.nickname)}`,
|
|
181
|
+
`Gender: ${optional(user.gender)} Birthdate: ${optional(user.birthdate)}`,
|
|
182
|
+
`Locale: ${optional(user.locale)} Time zone: ${optional(user.zoneinfo)}`,
|
|
183
|
+
`Profile: ${optional(user.profileUrl)}`,
|
|
184
|
+
`Picture: ${optional(user.pictureUrl)}`,
|
|
185
|
+
`Website: ${optional(user.websiteUrl)}`,
|
|
186
|
+
];
|
|
187
|
+
const accountLines = [
|
|
188
|
+
`Phone: ${optional(user.phoneNumber)} (${user.phoneNumberVerified ? 'verified' : 'unverified'})`,
|
|
189
|
+
`Street: ${optional(user.addressStreet)}`,
|
|
190
|
+
`Locality: ${optional(user.addressLocality)}`,
|
|
191
|
+
`Region: ${optional(user.addressRegion)}`,
|
|
192
|
+
`Postal: ${optional(user.addressPostalCode)} Country: ${optional(user.addressCountry)}`,
|
|
193
|
+
`Status: ${user.status} Password: ${user.hasPassword ? 'set' : 'not set'}`,
|
|
194
|
+
`Two-factor: ${user.twoFactorEnabled ? 'enabled' : 'disabled'} Logins: ${user.loginCount}`,
|
|
195
|
+
`Last login: ${formatOptionalAdminDateTime(user.lastLoginAt, 'Not provided')}`,
|
|
196
|
+
`Created: ${formatAdminDateTime(user.createdAt)}`,
|
|
197
|
+
`Updated: ${formatAdminDateTime(user.updatedAt)}`,
|
|
198
|
+
];
|
|
199
|
+
const actions = state.outcome === 'outcome-unknown' ? [] : detailActions(user);
|
|
200
|
+
const navigation = row({ gap: 1 }, action('~B~ack to users', { kind: 'back' }), options.capabilities.canReadUsers && action('~H~istory', { kind: 'history' }), spacer(), state.outcome && new Text(OUTCOME_LABELS[state.outcome]));
|
|
201
|
+
const retry = status?.retry
|
|
202
|
+
? new Button('~R~etry', { onClick: () => options.onIntent({ kind: 'retry' }) })
|
|
203
|
+
: undefined;
|
|
204
|
+
const statusRow = status && fixed(row({ gap: 1 }, grow(new Text(status.label)), retry), 2);
|
|
205
|
+
if (compact) {
|
|
206
|
+
const rows = signal([
|
|
207
|
+
...identityLines.map((label) => ({ label })),
|
|
208
|
+
...accountLines.map((label) => ({ label })),
|
|
209
|
+
...actions.map(({ label, intent }) => ({
|
|
210
|
+
label: `Action: ${label.replaceAll('~', '')}`,
|
|
211
|
+
intent,
|
|
212
|
+
})),
|
|
213
|
+
]);
|
|
214
|
+
const list = new ListView({
|
|
215
|
+
items: rows,
|
|
216
|
+
getText: (row) => row.label,
|
|
217
|
+
sorted: false,
|
|
218
|
+
onSelect: (_index, row) => {
|
|
219
|
+
if (row.intent)
|
|
220
|
+
options.onIntent(row.intent);
|
|
221
|
+
},
|
|
222
|
+
});
|
|
223
|
+
const section = new GroupBox({ title: 'User details & operations' });
|
|
224
|
+
section.add(cover(list));
|
|
225
|
+
content.add(cover(col({ gap: 1, padding: { top: 0, right: 1, bottom: 0, left: 1 } }, statusRow, grow(section), fixed(navigation, 2))));
|
|
226
|
+
currentFocus = list.rows;
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
const identity = detailList(identityLines);
|
|
230
|
+
const account = detailList(accountLines);
|
|
231
|
+
const identitySection = new GroupBox({ title: 'Identity' });
|
|
232
|
+
identitySection.add(cover(identity));
|
|
233
|
+
const accountSection = new GroupBox({ title: 'Account & security' });
|
|
234
|
+
accountSection.add(cover(account));
|
|
235
|
+
const primaryKinds = new Set([
|
|
236
|
+
'roles',
|
|
237
|
+
'edit',
|
|
238
|
+
'set-password',
|
|
239
|
+
'clear-password',
|
|
240
|
+
'verify-email',
|
|
241
|
+
]);
|
|
242
|
+
const primaryActions = actions.filter(({ intent }) => primaryKinds.has(intent.kind));
|
|
243
|
+
const lifecycleActions = actions.filter(({ intent }) => !primaryKinds.has(intent.kind));
|
|
244
|
+
const operationRows = [primaryActions, lifecycleActions]
|
|
245
|
+
.filter((items) => items.length > 0)
|
|
246
|
+
.map((items) => fixed(row({ gap: 1 }, spacer(), ...items.map((item) => action(item.label, item.intent))), 2));
|
|
247
|
+
const operationsSection = new GroupBox({ title: 'Operations' });
|
|
248
|
+
operationsSection.add(cover(operationRows.length > 0
|
|
249
|
+
? col({ gap: 0 }, ...operationRows)
|
|
250
|
+
: col(grow(new Text('No available operations')))));
|
|
251
|
+
content.add(cover(col({ gap: 0, padding: { top: 0, right: 1, bottom: 0, left: 1 } }, statusRow, grow(row({ gap: 1 }, grow(identitySection), grow(accountSection))), fixed(operationsSection, Math.max(4, operationRows.length * 2 + 2)), fixed(navigation, 2))));
|
|
252
|
+
currentFocus = identity.rows;
|
|
253
|
+
}
|
|
254
|
+
if (retry)
|
|
255
|
+
currentFocus = retry;
|
|
256
|
+
};
|
|
257
|
+
/** Renders the bounded first history page. */
|
|
258
|
+
const renderHistory = (state, status) => {
|
|
259
|
+
const entries = signal([...state.history.entries]);
|
|
260
|
+
const list = new ListView({
|
|
261
|
+
items: entries,
|
|
262
|
+
getText: (entry) => `${formatAdminDateTime(entry.createdAt)} — ${entry.eventType} — ${entry.actor}`,
|
|
263
|
+
sorted: false,
|
|
264
|
+
});
|
|
265
|
+
const historySection = new GroupBox({ title: `History for ${state.detail.email}` });
|
|
266
|
+
historySection.add(cover(list));
|
|
267
|
+
const back = action('~B~ack to user', { kind: 'back' });
|
|
268
|
+
const retry = status?.retry
|
|
269
|
+
? new Button('~R~etry', { onClick: () => options.onIntent({ kind: 'retry' }) })
|
|
270
|
+
: undefined;
|
|
271
|
+
content.add(cover(col({ gap: 1, padding: { top: 0, right: 1, bottom: 0, left: 1 } }, status && fixed(row({ gap: 1 }, grow(new Text(status.label)), retry), 2), grow(historySection), fixed(row({ gap: 1 }, back, spacer(), state.history.hasMore && new Text('More entries exist'), state.outcome && new Text(OUTCOME_LABELS[state.outcome])), 2))));
|
|
272
|
+
currentFocus = list.rows;
|
|
273
|
+
if (retry)
|
|
274
|
+
currentFocus = retry;
|
|
275
|
+
};
|
|
276
|
+
/** Rebuilds only this feature-specific content from validated state. */
|
|
277
|
+
const render = () => {
|
|
278
|
+
for (const child of [...content.children])
|
|
279
|
+
content.remove(child);
|
|
280
|
+
currentFocus = null;
|
|
281
|
+
if (disposed || currentState.kind === 'closed')
|
|
282
|
+
return;
|
|
283
|
+
if (currentState.kind === 'success') {
|
|
284
|
+
content.add(cover(col({ padding: { top: 1, right: 1, bottom: 1, left: 1 } }, new Text(currentState.action === 'created' ? 'User created' : 'Invitation sent'), spacer())));
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
if (currentState.kind === 'indeterminate') {
|
|
288
|
+
content.add(cover(col({ padding: { top: 1, right: 1, bottom: 1, left: 1 } }, new Text(OUTCOME_LABELS['outcome-unknown']), spacer())));
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
if (currentState.kind === 'loading') {
|
|
292
|
+
if (currentState.previous) {
|
|
293
|
+
const previous = previousState(currentState.previous);
|
|
294
|
+
const status = { label: 'Loading users…', retry: false };
|
|
295
|
+
if (previous.kind === 'page')
|
|
296
|
+
renderPage(previous, status);
|
|
297
|
+
else if (previous.kind === 'detail')
|
|
298
|
+
renderDetail(previous, status);
|
|
299
|
+
else if (previous.kind === 'history')
|
|
300
|
+
renderHistory(previous, status);
|
|
301
|
+
}
|
|
302
|
+
else
|
|
303
|
+
content.add(cover(col({ padding: { top: 1, right: 1, bottom: 1, left: 1 } }, new Text('Loading users…'), spacer())));
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
if (currentState.kind === 'failure') {
|
|
307
|
+
if (currentState.previous) {
|
|
308
|
+
const previous = previousState(currentState.previous);
|
|
309
|
+
const status = { label: OUTCOME_LABELS[currentState.failure], retry: true };
|
|
310
|
+
if (previous.kind === 'page')
|
|
311
|
+
renderPage(previous, status);
|
|
312
|
+
else if (previous.kind === 'detail')
|
|
313
|
+
renderDetail(previous, status);
|
|
314
|
+
else if (previous.kind === 'history')
|
|
315
|
+
renderHistory(previous, status);
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
const retry = action('~R~etry', { kind: 'retry' });
|
|
319
|
+
content.add(cover(col({ gap: 1, padding: { top: 1, right: 1, bottom: 1, left: 1 } }, new Text(OUTCOME_LABELS[currentState.failure]), row({ gap: 1 }, spacer(), retry), spacer())));
|
|
320
|
+
}
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
if (currentState.kind === 'page')
|
|
324
|
+
renderPage(currentState);
|
|
325
|
+
else if (currentState.kind === 'detail')
|
|
326
|
+
renderDetail(currentState);
|
|
327
|
+
else
|
|
328
|
+
renderHistory(currentState);
|
|
329
|
+
};
|
|
330
|
+
content.onMount(render);
|
|
331
|
+
return {
|
|
332
|
+
content,
|
|
333
|
+
setState: (state) => {
|
|
334
|
+
if (!disposed) {
|
|
335
|
+
currentState = state;
|
|
336
|
+
render();
|
|
337
|
+
}
|
|
338
|
+
},
|
|
339
|
+
focusCurrent: () => {
|
|
340
|
+
if (!currentFocus)
|
|
341
|
+
return;
|
|
342
|
+
if (options.focusView)
|
|
343
|
+
options.focusView(currentFocus);
|
|
344
|
+
else
|
|
345
|
+
content.host?.healFocus?.(content);
|
|
346
|
+
},
|
|
347
|
+
clear: () => {
|
|
348
|
+
if (disposed)
|
|
349
|
+
return;
|
|
350
|
+
currentState = { kind: 'closed' };
|
|
351
|
+
searchValue.set('');
|
|
352
|
+
filterStatus.set(null);
|
|
353
|
+
focusedUserId = null;
|
|
354
|
+
render();
|
|
355
|
+
},
|
|
356
|
+
dispose: () => {
|
|
357
|
+
disposed = true;
|
|
358
|
+
currentState = { kind: 'closed' };
|
|
359
|
+
searchValue.set('');
|
|
360
|
+
filterStatus.set(null);
|
|
361
|
+
focusedUserId = null;
|
|
362
|
+
render();
|
|
363
|
+
},
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
//# sourceMappingURL=user-workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-workspace.js","sourceRoot":"","sources":["../../src/admin/user-workspace.ts"],"names":[],"mappings":"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"}
|