@portaidentity/cli 1.7.3 → 1.8.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.
Files changed (328) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +125 -105
  3. package/dist/admin/admin-date-time.d.ts +6 -0
  4. package/dist/admin/admin-date-time.d.ts.map +1 -0
  5. package/dist/admin/admin-date-time.js +33 -0
  6. package/dist/admin/admin-date-time.js.map +1 -0
  7. package/dist/admin/application-client-features.d.ts +38 -0
  8. package/dist/admin/application-client-features.d.ts.map +1 -0
  9. package/dist/admin/application-client-features.js +545 -0
  10. package/dist/admin/application-client-features.js.map +1 -0
  11. package/dist/admin/application-controller.d.ts +58 -0
  12. package/dist/admin/application-controller.d.ts.map +1 -0
  13. package/dist/admin/application-controller.js +286 -0
  14. package/dist/admin/application-controller.js.map +1 -0
  15. package/dist/admin/application-dialogs.d.ts +91 -0
  16. package/dist/admin/application-dialogs.d.ts.map +1 -0
  17. package/dist/admin/application-dialogs.js +250 -0
  18. package/dist/admin/application-dialogs.js.map +1 -0
  19. package/dist/admin/application-rbac-controller.d.ts +56 -0
  20. package/dist/admin/application-rbac-controller.d.ts.map +1 -0
  21. package/dist/admin/application-rbac-controller.js +280 -0
  22. package/dist/admin/application-rbac-controller.js.map +1 -0
  23. package/dist/admin/application-rbac-features.d.ts +51 -0
  24. package/dist/admin/application-rbac-features.d.ts.map +1 -0
  25. package/dist/admin/application-rbac-features.js +175 -0
  26. package/dist/admin/application-rbac-features.js.map +1 -0
  27. package/dist/admin/application-rbac-workspace.d.ts +62 -0
  28. package/dist/admin/application-rbac-workspace.d.ts.map +1 -0
  29. package/dist/admin/application-rbac-workspace.js +344 -0
  30. package/dist/admin/application-rbac-workspace.js.map +1 -0
  31. package/dist/admin/application-runtime.d.ts +44 -0
  32. package/dist/admin/application-runtime.d.ts.map +1 -0
  33. package/dist/admin/application-runtime.js +183 -0
  34. package/dist/admin/application-runtime.js.map +1 -0
  35. package/dist/admin/application-service.d.ts +39 -0
  36. package/dist/admin/application-service.d.ts.map +1 -0
  37. package/dist/admin/application-service.js +248 -0
  38. package/dist/admin/application-service.js.map +1 -0
  39. package/dist/admin/application-state.d.ts +109 -0
  40. package/dist/admin/application-state.d.ts.map +1 -0
  41. package/dist/admin/application-state.js +3 -0
  42. package/dist/admin/application-state.js.map +1 -0
  43. package/dist/admin/application-workspace.d.ts +77 -0
  44. package/dist/admin/application-workspace.d.ts.map +1 -0
  45. package/dist/admin/application-workspace.js +302 -0
  46. package/dist/admin/application-workspace.js.map +1 -0
  47. package/dist/admin/application.d.ts +88 -0
  48. package/dist/admin/application.d.ts.map +1 -0
  49. package/dist/admin/application.js +932 -0
  50. package/dist/admin/application.js.map +1 -0
  51. package/dist/admin/client-authentication-dialog.d.ts +77 -0
  52. package/dist/admin/client-authentication-dialog.d.ts.map +1 -0
  53. package/dist/admin/client-authentication-dialog.js +217 -0
  54. package/dist/admin/client-authentication-dialog.js.map +1 -0
  55. package/dist/admin/client-controller.d.ts +58 -0
  56. package/dist/admin/client-controller.d.ts.map +1 -0
  57. package/dist/admin/client-controller.js +462 -0
  58. package/dist/admin/client-controller.js.map +1 -0
  59. package/dist/admin/client-credential-dialogs.d.ts +36 -0
  60. package/dist/admin/client-credential-dialogs.d.ts.map +1 -0
  61. package/dist/admin/client-credential-dialogs.js +145 -0
  62. package/dist/admin/client-credential-dialogs.js.map +1 -0
  63. package/dist/admin/client-dialogs.d.ts +64 -0
  64. package/dist/admin/client-dialogs.d.ts.map +1 -0
  65. package/dist/admin/client-dialogs.js +110 -0
  66. package/dist/admin/client-dialogs.js.map +1 -0
  67. package/dist/admin/client-form-scroller.d.ts +17 -0
  68. package/dist/admin/client-form-scroller.d.ts.map +1 -0
  69. package/dist/admin/client-form-scroller.js +67 -0
  70. package/dist/admin/client-form-scroller.js.map +1 -0
  71. package/dist/admin/client-registration-dialog.d.ts +27 -0
  72. package/dist/admin/client-registration-dialog.d.ts.map +1 -0
  73. package/dist/admin/client-registration-dialog.js +195 -0
  74. package/dist/admin/client-registration-dialog.js.map +1 -0
  75. package/dist/admin/client-service.d.ts +41 -0
  76. package/dist/admin/client-service.d.ts.map +1 -0
  77. package/dist/admin/client-service.js +484 -0
  78. package/dist/admin/client-service.js.map +1 -0
  79. package/dist/admin/client-state.d.ts +157 -0
  80. package/dist/admin/client-state.d.ts.map +1 -0
  81. package/dist/admin/client-state.js +3 -0
  82. package/dist/admin/client-state.js.map +1 -0
  83. package/dist/admin/client-workspace.d.ts +88 -0
  84. package/dist/admin/client-workspace.d.ts.map +1 -0
  85. package/dist/admin/client-workspace.js +484 -0
  86. package/dist/admin/client-workspace.js.map +1 -0
  87. package/dist/admin/delete-confirmation-layout.d.ts +38 -0
  88. package/dist/admin/delete-confirmation-layout.d.ts.map +1 -0
  89. package/dist/admin/delete-confirmation-layout.js +52 -0
  90. package/dist/admin/delete-confirmation-layout.js.map +1 -0
  91. package/dist/admin/index.d.ts +64 -0
  92. package/dist/admin/index.d.ts.map +1 -0
  93. package/dist/admin/index.js +31 -0
  94. package/dist/admin/index.js.map +1 -0
  95. package/dist/admin/organization-controller.d.ts +77 -0
  96. package/dist/admin/organization-controller.d.ts.map +1 -0
  97. package/dist/admin/organization-controller.js +472 -0
  98. package/dist/admin/organization-controller.js.map +1 -0
  99. package/dist/admin/organization-dialogs.d.ts +63 -0
  100. package/dist/admin/organization-dialogs.d.ts.map +1 -0
  101. package/dist/admin/organization-dialogs.js +303 -0
  102. package/dist/admin/organization-dialogs.js.map +1 -0
  103. package/dist/admin/organization-service.d.ts +110 -0
  104. package/dist/admin/organization-service.d.ts.map +1 -0
  105. package/dist/admin/organization-service.js +548 -0
  106. package/dist/admin/organization-service.js.map +1 -0
  107. package/dist/admin/organization-workspace.d.ts +29 -0
  108. package/dist/admin/organization-workspace.d.ts.map +1 -0
  109. package/dist/admin/organization-workspace.js +421 -0
  110. package/dist/admin/organization-workspace.js.map +1 -0
  111. package/dist/admin/portability-controller.d.ts +83 -0
  112. package/dist/admin/portability-controller.d.ts.map +1 -0
  113. package/dist/admin/portability-controller.js +466 -0
  114. package/dist/admin/portability-controller.js.map +1 -0
  115. package/dist/admin/portability-service.d.ts +31 -0
  116. package/dist/admin/portability-service.d.ts.map +1 -0
  117. package/dist/admin/portability-service.js +51 -0
  118. package/dist/admin/portability-service.js.map +1 -0
  119. package/dist/admin/portability-state.d.ts +88 -0
  120. package/dist/admin/portability-state.d.ts.map +1 -0
  121. package/dist/admin/portability-state.js +3 -0
  122. package/dist/admin/portability-state.js.map +1 -0
  123. package/dist/admin/portability-workspace.d.ts +78 -0
  124. package/dist/admin/portability-workspace.d.ts.map +1 -0
  125. package/dist/admin/portability-workspace.js +337 -0
  126. package/dist/admin/portability-workspace.js.map +1 -0
  127. package/dist/admin/presentation.d.ts +46 -0
  128. package/dist/admin/presentation.d.ts.map +1 -0
  129. package/dist/admin/presentation.js +271 -0
  130. package/dist/admin/presentation.js.map +1 -0
  131. package/dist/admin/rbac-dialogs.d.ts +73 -0
  132. package/dist/admin/rbac-dialogs.d.ts.map +1 -0
  133. package/dist/admin/rbac-dialogs.js +345 -0
  134. package/dist/admin/rbac-dialogs.js.map +1 -0
  135. package/dist/admin/rbac-service.d.ts +47 -0
  136. package/dist/admin/rbac-service.d.ts.map +1 -0
  137. package/dist/admin/rbac-service.js +258 -0
  138. package/dist/admin/rbac-service.js.map +1 -0
  139. package/dist/admin/rbac-state.d.ts +129 -0
  140. package/dist/admin/rbac-state.d.ts.map +1 -0
  141. package/dist/admin/rbac-state.js +136 -0
  142. package/dist/admin/rbac-state.js.map +1 -0
  143. package/dist/admin/selectable-read-only-input.d.ts +18 -0
  144. package/dist/admin/selectable-read-only-input.d.ts.map +1 -0
  145. package/dist/admin/selectable-read-only-input.js +24 -0
  146. package/dist/admin/selectable-read-only-input.js.map +1 -0
  147. package/dist/admin/session-service.d.ts +169 -0
  148. package/dist/admin/session-service.d.ts.map +1 -0
  149. package/dist/admin/session-service.js +353 -0
  150. package/dist/admin/session-service.js.map +1 -0
  151. package/dist/admin/state.d.ts +301 -0
  152. package/dist/admin/state.d.ts.map +1 -0
  153. package/dist/admin/state.js +10 -0
  154. package/dist/admin/state.js.map +1 -0
  155. package/dist/admin/system-config-controller.d.ts +58 -0
  156. package/dist/admin/system-config-controller.d.ts.map +1 -0
  157. package/dist/admin/system-config-controller.js +218 -0
  158. package/dist/admin/system-config-controller.js.map +1 -0
  159. package/dist/admin/system-config-service.d.ts +54 -0
  160. package/dist/admin/system-config-service.d.ts.map +1 -0
  161. package/dist/admin/system-config-service.js +180 -0
  162. package/dist/admin/system-config-service.js.map +1 -0
  163. package/dist/admin/system-config-state.d.ts +77 -0
  164. package/dist/admin/system-config-state.d.ts.map +1 -0
  165. package/dist/admin/system-config-state.js +78 -0
  166. package/dist/admin/system-config-state.js.map +1 -0
  167. package/dist/admin/system-config-workspace.d.ts +47 -0
  168. package/dist/admin/system-config-workspace.d.ts.map +1 -0
  169. package/dist/admin/system-config-workspace.js +217 -0
  170. package/dist/admin/system-config-workspace.js.map +1 -0
  171. package/dist/admin/user-controller-types.d.ts +67 -0
  172. package/dist/admin/user-controller-types.d.ts.map +1 -0
  173. package/dist/admin/user-controller-types.js +3 -0
  174. package/dist/admin/user-controller-types.js.map +1 -0
  175. package/dist/admin/user-controller.d.ts +6 -0
  176. package/dist/admin/user-controller.d.ts.map +1 -0
  177. package/dist/admin/user-controller.js +674 -0
  178. package/dist/admin/user-controller.js.map +1 -0
  179. package/dist/admin/user-dialog-fields.d.ts +44 -0
  180. package/dist/admin/user-dialog-fields.d.ts.map +1 -0
  181. package/dist/admin/user-dialog-fields.js +130 -0
  182. package/dist/admin/user-dialog-fields.js.map +1 -0
  183. package/dist/admin/user-dialogs.d.ts +66 -0
  184. package/dist/admin/user-dialogs.d.ts.map +1 -0
  185. package/dist/admin/user-dialogs.js +374 -0
  186. package/dist/admin/user-dialogs.js.map +1 -0
  187. package/dist/admin/user-role-controller.d.ts +82 -0
  188. package/dist/admin/user-role-controller.d.ts.map +1 -0
  189. package/dist/admin/user-role-controller.js +337 -0
  190. package/dist/admin/user-role-controller.js.map +1 -0
  191. package/dist/admin/user-role-dialog.d.ts +94 -0
  192. package/dist/admin/user-role-dialog.d.ts.map +1 -0
  193. package/dist/admin/user-role-dialog.js +265 -0
  194. package/dist/admin/user-role-dialog.js.map +1 -0
  195. package/dist/admin/user-service-types.d.ts +100 -0
  196. package/dist/admin/user-service-types.d.ts.map +1 -0
  197. package/dist/admin/user-service-types.js +3 -0
  198. package/dist/admin/user-service-types.js.map +1 -0
  199. package/dist/admin/user-service.d.ts +14 -0
  200. package/dist/admin/user-service.d.ts.map +1 -0
  201. package/dist/admin/user-service.js +612 -0
  202. package/dist/admin/user-service.js.map +1 -0
  203. package/dist/admin/user-state.d.ts +158 -0
  204. package/dist/admin/user-state.d.ts.map +1 -0
  205. package/dist/admin/user-state.js +3 -0
  206. package/dist/admin/user-state.js.map +1 -0
  207. package/dist/admin/user-workspace.d.ts +65 -0
  208. package/dist/admin/user-workspace.d.ts.map +1 -0
  209. package/dist/admin/user-workspace.js +366 -0
  210. package/dist/admin/user-workspace.js.map +1 -0
  211. package/dist/auth/browser-flow.d.ts +27 -1
  212. package/dist/auth/browser-flow.d.ts.map +1 -1
  213. package/dist/auth/browser-flow.js +55 -33
  214. package/dist/auth/browser-flow.js.map +1 -1
  215. package/dist/auth/callback-server.d.ts.map +1 -1
  216. package/dist/auth/callback-server.js +5 -9
  217. package/dist/auth/callback-server.js.map +1 -1
  218. package/dist/auth/id-token-verifier.d.ts +39 -0
  219. package/dist/auth/id-token-verifier.d.ts.map +1 -0
  220. package/dist/auth/id-token-verifier.js +104 -0
  221. package/dist/auth/id-token-verifier.js.map +1 -0
  222. package/dist/auth/login-coordinator.d.ts +72 -0
  223. package/dist/auth/login-coordinator.d.ts.map +1 -0
  224. package/dist/auth/login-coordinator.js +190 -0
  225. package/dist/auth/login-coordinator.js.map +1 -0
  226. package/dist/auth/metadata.d.ts +2 -1
  227. package/dist/auth/metadata.d.ts.map +1 -1
  228. package/dist/auth/metadata.js +67 -6
  229. package/dist/auth/metadata.js.map +1 -1
  230. package/dist/auth/types.d.ts +14 -0
  231. package/dist/auth/types.d.ts.map +1 -1
  232. package/dist/client-factory.d.ts.map +1 -1
  233. package/dist/client-factory.js +15 -2
  234. package/dist/client-factory.js.map +1 -1
  235. package/dist/commands/admin.d.ts +22 -0
  236. package/dist/commands/admin.d.ts.map +1 -0
  237. package/dist/commands/admin.js +112 -0
  238. package/dist/commands/admin.js.map +1 -0
  239. package/dist/commands/app-claim.d.ts.map +1 -1
  240. package/dist/commands/app-claim.js +11 -4
  241. package/dist/commands/app-claim.js.map +1 -1
  242. package/dist/commands/app-module.d.ts.map +1 -1
  243. package/dist/commands/app-module.js +61 -12
  244. package/dist/commands/app-module.js.map +1 -1
  245. package/dist/commands/app-permission.d.ts.map +1 -1
  246. package/dist/commands/app-permission.js +66 -24
  247. package/dist/commands/app-permission.js.map +1 -1
  248. package/dist/commands/app-role.d.ts.map +1 -1
  249. package/dist/commands/app-role.js +48 -27
  250. package/dist/commands/app-role.js.map +1 -1
  251. package/dist/commands/app.d.ts.map +1 -1
  252. package/dist/commands/app.js +37 -25
  253. package/dist/commands/app.js.map +1 -1
  254. package/dist/commands/bulk.d.ts.map +1 -1
  255. package/dist/commands/bulk.js +9 -2
  256. package/dist/commands/bulk.js.map +1 -1
  257. package/dist/commands/client-secret.d.ts.map +1 -1
  258. package/dist/commands/client-secret.js +12 -6
  259. package/dist/commands/client-secret.js.map +1 -1
  260. package/dist/commands/client.d.ts +3 -2
  261. package/dist/commands/client.d.ts.map +1 -1
  262. package/dist/commands/client.js +87 -43
  263. package/dist/commands/client.js.map +1 -1
  264. package/dist/commands/config.d.ts +4 -0
  265. package/dist/commands/config.d.ts.map +1 -1
  266. package/dist/commands/config.js +68 -7
  267. package/dist/commands/config.js.map +1 -1
  268. package/dist/commands/export.d.ts +6 -0
  269. package/dist/commands/export.d.ts.map +1 -0
  270. package/dist/commands/export.js +182 -0
  271. package/dist/commands/export.js.map +1 -0
  272. package/dist/commands/import.d.ts +6 -0
  273. package/dist/commands/import.d.ts.map +1 -0
  274. package/dist/commands/import.js +142 -0
  275. package/dist/commands/import.js.map +1 -0
  276. package/dist/commands/keys.d.ts.map +1 -1
  277. package/dist/commands/keys.js +11 -4
  278. package/dist/commands/keys.js.map +1 -1
  279. package/dist/commands/login.d.ts.map +1 -1
  280. package/dist/commands/login.js +24 -10
  281. package/dist/commands/login.js.map +1 -1
  282. package/dist/commands/org.d.ts +2 -4
  283. package/dist/commands/org.d.ts.map +1 -1
  284. package/dist/commands/org.js +16 -76
  285. package/dist/commands/org.js.map +1 -1
  286. package/dist/commands/user-role.d.ts.map +1 -1
  287. package/dist/commands/user-role.js +19 -14
  288. package/dist/commands/user-role.js.map +1 -1
  289. package/dist/commands/user.d.ts +3 -2
  290. package/dist/commands/user.d.ts.map +1 -1
  291. package/dist/commands/user.js +47 -71
  292. package/dist/commands/user.js.map +1 -1
  293. package/dist/commands/version.d.ts +1 -1
  294. package/dist/commands/version.js +1 -1
  295. package/dist/credential-lock.d.ts +20 -0
  296. package/dist/credential-lock.d.ts.map +1 -0
  297. package/dist/credential-lock.js +130 -0
  298. package/dist/credential-lock.js.map +1 -0
  299. package/dist/credential-store.d.ts +14 -0
  300. package/dist/credential-store.d.ts.map +1 -1
  301. package/dist/credential-store.js +114 -3
  302. package/dist/credential-store.js.map +1 -1
  303. package/dist/error-handler.d.ts.map +1 -1
  304. package/dist/error-handler.js +2 -0
  305. package/dist/error-handler.js.map +1 -1
  306. package/dist/global-options.d.ts +8 -0
  307. package/dist/global-options.d.ts.map +1 -1
  308. package/dist/global-options.js +19 -8
  309. package/dist/global-options.js.map +1 -1
  310. package/dist/index.js +7 -5
  311. package/dist/index.js.map +1 -1
  312. package/dist/output.d.ts +11 -0
  313. package/dist/output.d.ts.map +1 -1
  314. package/dist/output.js +25 -6
  315. package/dist/output.js.map +1 -1
  316. package/dist/prompt.d.ts +2 -2
  317. package/dist/prompt.d.ts.map +1 -1
  318. package/dist/prompt.js +27 -7
  319. package/dist/prompt.js.map +1 -1
  320. package/package.json +7 -3
  321. package/dist/commands/gui.d.ts +0 -21
  322. package/dist/commands/gui.d.ts.map +0 -1
  323. package/dist/commands/gui.js +0 -67
  324. package/dist/commands/gui.js.map +0 -1
  325. package/dist/commands/provision.d.ts +0 -47
  326. package/dist/commands/provision.d.ts.map +0 -1
  327. package/dist/commands/provision.js +0 -444
  328. package/dist/commands/provision.js.map +0 -1
@@ -0,0 +1,265 @@
1
+ /** Focused DataGrid dialog for direct roles assigned to one selected user. */
2
+ import { Button, col, ComboBox, cover, createRoot, DataGrid, Dialog, effect, fixed, grow, Label, row, signal, sortRows, spacer, Text, } from '@jsvision/ui';
3
+ const FAILURE_LABELS = {
4
+ validation: 'Validation failed',
5
+ unauthorized: 'Not authorized',
6
+ conflict: 'Conflict',
7
+ unavailable: 'Service unavailable',
8
+ 'invalid-response': 'Invalid server response',
9
+ };
10
+ /** Returns the last validated projection retained under a fixed status. */
11
+ function retainedProjection(state) {
12
+ if (state.kind === 'ready')
13
+ return state;
14
+ if (state.kind === 'failure' || state.kind === 'indeterminate')
15
+ return state.previous;
16
+ return undefined;
17
+ }
18
+ /** Returns the fixed safe notice for a non-ready state. */
19
+ function stateNotice(state) {
20
+ if (state.kind === 'indeterminate')
21
+ return 'The operation outcome is unknown; reload is required';
22
+ if (state.kind === 'failure')
23
+ return FAILURE_LABELS[state.failure];
24
+ return undefined;
25
+ }
26
+ /** Clears positional selection whenever the DataGrid display order changes. */
27
+ function clearSelectionOnSort(sort, selected) {
28
+ return createRoot((dispose) => {
29
+ let initialized = false;
30
+ effect(() => {
31
+ sort();
32
+ if (initialized)
33
+ selected.set(-1);
34
+ initialized = true;
35
+ });
36
+ return dispose;
37
+ });
38
+ }
39
+ /** Creates the direct focused dialog without a reusable CRUD abstraction. */
40
+ export function createAdminUserRoleDialog(options) {
41
+ const content = new Dialog({
42
+ title: `Roles for ${options.user.label}`,
43
+ width: Math.max(1, Math.min(72, options.viewport.width)),
44
+ height: Math.max(1, Math.min(20, options.viewport.height)),
45
+ centered: true,
46
+ });
47
+ content.closable = false;
48
+ content.resizable = false;
49
+ content.zoomable = false;
50
+ content.background = 'dialog';
51
+ let state = { kind: 'closed' };
52
+ let rows = signal([]);
53
+ let selected = signal(-1);
54
+ let sort = signal(null);
55
+ let currentFocus;
56
+ let selectedApplicationId;
57
+ let adding = false;
58
+ let confirming;
59
+ let disposeSort = () => undefined;
60
+ let disposeApplicationChoice = () => undefined;
61
+ let disposed = false;
62
+ /** Removes every currently rendered child before rebuilding the dialog. */
63
+ const clearChildren = () => {
64
+ for (const child of [...content.children])
65
+ content.remove(child);
66
+ currentFocus = undefined;
67
+ };
68
+ /** Resolves the selected assigned role after the current sort is applied. */
69
+ const selectedRole = (columns) => sortRows(rows(), columns, sort())[selected()];
70
+ /** Builds columns using an application name only when one is safely available. */
71
+ const columnsFor = (projection) => {
72
+ const applicationNames = new Map((options.capabilities.canReadApplications ? (projection?.applications ?? []) : []).map((application) => [application.id, application.name]));
73
+ return [
74
+ {
75
+ title: 'Application',
76
+ accessor: (role) => role.applicationName ?? applicationNames.get(role.applicationId) ?? role.applicationId,
77
+ width: '1fr',
78
+ minWidth: 18,
79
+ },
80
+ { title: 'Name', accessor: (role) => role.name, width: '1fr', minWidth: 18 },
81
+ { title: 'Slug', accessor: (role) => role.slug, width: '1fr', minWidth: 18 },
82
+ ];
83
+ };
84
+ /** Restores the assigned-role grid and direct action row. */
85
+ const renderAssignments = (projection) => {
86
+ disposeSort();
87
+ rows = signal([...(projection?.assignedRoles ?? [])]);
88
+ selected = signal(-1);
89
+ sort = signal(null);
90
+ disposeSort = clearSelectionOnSort(sort, selected);
91
+ const columns = columnsFor(projection);
92
+ const grid = new DataGrid({
93
+ rows,
94
+ columns,
95
+ selected,
96
+ sort,
97
+ zebra: true,
98
+ });
99
+ const mutationsBlocked = state.kind === 'indeterminate';
100
+ const addAllowed = !mutationsBlocked &&
101
+ options.capabilities.canAssignRoles &&
102
+ options.capabilities.canReadApplications;
103
+ const add = new Button('Add', {
104
+ disabled: !addAllowed,
105
+ onClick: () => {
106
+ adding = true;
107
+ selectedApplicationId = undefined;
108
+ render();
109
+ },
110
+ });
111
+ const remove = new Button('Remove', {
112
+ disabled: () => mutationsBlocked || !options.capabilities.canAssignRoles || !selectedRole(columns),
113
+ onClick: () => {
114
+ const target = selectedRole(columns);
115
+ if (target) {
116
+ confirming = target;
117
+ render();
118
+ }
119
+ },
120
+ });
121
+ const reload = new Button('Reload', {
122
+ onClick: () => options.onIntent({ kind: 'reload' }),
123
+ });
124
+ const close = new Button('Close', {
125
+ onClick: () => options.onIntent({ kind: 'close' }),
126
+ });
127
+ const notices = [
128
+ stateNotice(state),
129
+ !options.capabilities.canAssignRoles ? 'Role assign permission required.' : undefined,
130
+ options.capabilities.canAssignRoles && !options.capabilities.canReadApplications
131
+ ? 'Application read permission required to add a role.'
132
+ : undefined,
133
+ ].filter((notice) => notice !== undefined);
134
+ content.add(cover(col({ gap: 1, padding: 1 }, fixed(new Text(`Organization: ${options.organization.name}`), 1), ...notices.map((notice) => fixed(new Text(notice), 1)), grow(grid), fixed(row({ gap: 1 }, add, remove, spacer(), reload, close), 2))));
135
+ currentFocus = grid.rows;
136
+ };
137
+ /** Builds the two-step application and unassigned-role choice. */
138
+ const renderAdd = (projection) => {
139
+ const availableRoles = selectedApplicationId !== undefined &&
140
+ projection.availableRolesApplicationId === selectedApplicationId
141
+ ? projection.availableRoles
142
+ : [];
143
+ const application = signal(projection.applications.find((item) => item.id === selectedApplicationId) ?? null);
144
+ const role = signal(null);
145
+ const applicationChoice = new ComboBox({
146
+ items: signal([...projection.applications]),
147
+ getText: (item) => `${item.name} — ${item.slug}`,
148
+ value: application,
149
+ editable: false,
150
+ });
151
+ const roleChoice = new ComboBox({
152
+ items: signal([...availableRoles]),
153
+ getText: (item) => `${item.name} — ${item.slug}`,
154
+ value: role,
155
+ editable: false,
156
+ });
157
+ disposeApplicationChoice();
158
+ disposeApplicationChoice = createRoot((dispose) => {
159
+ effect(() => {
160
+ const next = application();
161
+ if (next && next.id !== selectedApplicationId) {
162
+ selectedApplicationId = next.id;
163
+ role.set(null);
164
+ options.onIntent({ kind: 'load-available', applicationId: next.id });
165
+ }
166
+ });
167
+ return dispose;
168
+ });
169
+ const assign = new Button('Assign', {
170
+ disabled: () => role() === null || projection.availableRolesApplicationId !== selectedApplicationId,
171
+ onClick: () => {
172
+ const target = role.peek();
173
+ if (target &&
174
+ selectedApplicationId !== undefined &&
175
+ projection.availableRolesApplicationId === selectedApplicationId &&
176
+ target.applicationId === selectedApplicationId) {
177
+ adding = false;
178
+ selectedApplicationId = undefined;
179
+ options.onIntent({ kind: 'assign', roleId: target.id });
180
+ render();
181
+ }
182
+ },
183
+ });
184
+ const cancel = new Button('Cancel', {
185
+ onClick: () => {
186
+ adding = false;
187
+ selectedApplicationId = undefined;
188
+ render();
189
+ },
190
+ });
191
+ content.add(cover(col({ gap: 1, padding: 1 }, fixed(new Text(`Assign a role to ${options.user.label}`), 1), fixed(row({ gap: 1 }, fixed(new Label('Application', applicationChoice), 14), grow(applicationChoice)), 1), fixed(row({ gap: 1 }, fixed(new Label('Role', roleChoice), 14), grow(roleChoice)), 1), grow(new Text(projection.applications.length === 0
192
+ ? 'No applications are available.'
193
+ : selectedApplicationId && projection.availableRoles.length === 0
194
+ ? 'No unassigned roles are available.'
195
+ : 'Select one application and one unassigned role.')), fixed(row({ gap: 1 }, spacer(), assign, cancel), 2))));
196
+ currentFocus = applicationChoice;
197
+ };
198
+ /** Shows one explicit confirmation before removing a direct assignment. */
199
+ const renderConfirmation = (role) => {
200
+ const keep = new Button('Keep', {
201
+ onClick: () => {
202
+ confirming = undefined;
203
+ render();
204
+ },
205
+ });
206
+ const remove = new Button(`Remove ${role.name}`, {
207
+ onClick: () => {
208
+ confirming = undefined;
209
+ options.onIntent({ kind: 'remove', roleId: role.id });
210
+ render();
211
+ },
212
+ });
213
+ content.add(cover(col({ gap: 1, padding: 1 }, fixed(new Text('Are you sure?'), 1), fixed(new Text(`Role: ${role.name}`), 1), grow(new Text('This removes the role assignment from the selected user.')), fixed(row({ gap: 1 }, spacer(), keep, remove), 2))));
214
+ currentFocus = keep;
215
+ };
216
+ /** Rebuilds the bounded dialog from one immutable state snapshot. */
217
+ const render = () => {
218
+ if (disposed)
219
+ return;
220
+ clearChildren();
221
+ const projection = retainedProjection(state);
222
+ if (confirming) {
223
+ renderConfirmation(confirming);
224
+ }
225
+ else if (adding && projection) {
226
+ renderAdd(projection);
227
+ }
228
+ else {
229
+ adding = false;
230
+ renderAssignments(projection);
231
+ }
232
+ };
233
+ render();
234
+ return {
235
+ content,
236
+ setState(next) {
237
+ if (disposed)
238
+ return;
239
+ state = next;
240
+ render();
241
+ },
242
+ focusCurrent() {
243
+ if (currentFocus)
244
+ options.focusView?.(currentFocus);
245
+ },
246
+ clear() {
247
+ if (disposed)
248
+ return;
249
+ state = { kind: 'closed' };
250
+ adding = false;
251
+ confirming = undefined;
252
+ selectedApplicationId = undefined;
253
+ render();
254
+ },
255
+ dispose() {
256
+ if (disposed)
257
+ return;
258
+ clearChildren();
259
+ disposeSort();
260
+ disposeApplicationChoice();
261
+ disposed = true;
262
+ },
263
+ };
264
+ }
265
+ //# sourceMappingURL=user-role-dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-role-dialog.js","sourceRoot":"","sources":["../../src/admin/user-role-dialog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ /** Public contracts for the validated user administration service. */
2
+ import type { CreateUserInput, InviteUserInput, UpdateUserInput, UserStatus } from '@portaidentity/sdk';
3
+ import type { AdminInvitationPreview, AdminUserDetail, AdminUserFailureKind, AdminUserHistory, AdminUserListItem, AdminUserPage } from './user-state.js';
4
+ /** Local create input without a second organization source. */
5
+ export type AdminCreateUserInput = Omit<CreateUserInput, 'organizationId'> & {
6
+ /** Local-only confirmation that is never sent to Porta. */
7
+ readonly passwordConfirmation?: string;
8
+ };
9
+ /** Local invitation input without authorization assignments or a second organization source. */
10
+ export type AdminInviteUserInput = Omit<InviteUserInput, 'organizationId' | 'roles' | 'claims'>;
11
+ /** Local password input with a confirmation that is never sent to Porta. */
12
+ export interface AdminSetPasswordInput {
13
+ /** New password. */
14
+ readonly password: string;
15
+ /** Local confirmation of the new password. */
16
+ readonly passwordConfirmation: string;
17
+ }
18
+ /** User list request controlled by the workspace. */
19
+ export interface AdminUserListRequest {
20
+ /** One-based page number. */
21
+ readonly page: number;
22
+ /** Optional bounded search text. */
23
+ readonly search?: string;
24
+ /** Optional exact status filter. */
25
+ readonly status?: UserStatus;
26
+ }
27
+ /** Validated detail plus an opaque update precondition. */
28
+ export interface AdminUserDetailResult {
29
+ /** Safe detail projection. */
30
+ readonly detail: AdminUserDetail;
31
+ /** Opaque ETag retained for a later update. */
32
+ readonly etag: string | null;
33
+ }
34
+ /** Allowlisted result of accepting a user invitation. */
35
+ export interface AdminInvitedUser {
36
+ /** Stable UUID of the invited user. */
37
+ readonly userId: string;
38
+ /** Invited email address. */
39
+ readonly email: string;
40
+ /** Whether a new user was created. */
41
+ readonly created: boolean;
42
+ /** Whether an invitation message was sent. */
43
+ readonly invitationSent: boolean;
44
+ /** Invitation expiration timestamp. */
45
+ readonly expiresAt: string;
46
+ }
47
+ /** Sanitized result of a read operation. */
48
+ export type AdminUserReadResult<T> = {
49
+ readonly kind: 'success';
50
+ readonly value: T;
51
+ } | {
52
+ readonly kind: 'session-invalid';
53
+ } | {
54
+ readonly kind: 'failure';
55
+ readonly failure: AdminUserFailureKind;
56
+ };
57
+ /** Sanitized result of a mutation operation. */
58
+ export type AdminUserMutationResult<T = void> = (T extends void ? {
59
+ readonly kind: 'success';
60
+ } : {
61
+ readonly kind: 'success';
62
+ readonly value: T;
63
+ }) | {
64
+ readonly kind: 'session-invalid';
65
+ } | {
66
+ readonly kind: 'outcome-unknown';
67
+ } | {
68
+ readonly kind: 'failure';
69
+ readonly failure: Exclude<AdminUserFailureKind, 'invalid-response'>;
70
+ };
71
+ /** User operations consumed by the administration controller. */
72
+ export interface AdminUserOperations {
73
+ /** Loads one validated user page. */
74
+ readonly list: (organizationId: string, request: AdminUserListRequest) => Promise<AdminUserReadResult<AdminUserPage>>;
75
+ /** Loads one validated user detail. */
76
+ readonly get: (organizationId: string, userId: string) => Promise<AdminUserReadResult<AdminUserDetailResult>>;
77
+ /** Loads the first validated history page. */
78
+ readonly getHistory: (organizationId: string, userId: string) => Promise<AdminUserReadResult<AdminUserHistory>>;
79
+ /** Loads a safe plain-text invitation preview. */
80
+ readonly previewInvitation: (organizationId: string, input: AdminInviteUserInput) => Promise<AdminUserReadResult<AdminInvitationPreview>>;
81
+ /** Creates a user and returns its validated list projection. */
82
+ readonly create: (organizationId: string, input: AdminCreateUserInput) => Promise<AdminUserMutationResult<AdminUserListItem>>;
83
+ /** Invites a user and returns the allowlisted acceptance result. */
84
+ readonly invite: (organizationId: string, input: AdminInviteUserInput) => Promise<AdminUserMutationResult<AdminInvitedUser>>;
85
+ /** Updates a user and returns its validated list projection. */
86
+ readonly update: (organizationId: string, userId: string, input: UpdateUserInput, etag?: string) => Promise<AdminUserMutationResult<AdminUserListItem>>;
87
+ /** Sets a password after local confirmation. */
88
+ readonly setPassword: (organizationId: string, userId: string, input: AdminSetPasswordInput) => Promise<AdminUserMutationResult>;
89
+ /** Clears the user's password. */
90
+ readonly clearPassword: (organizationId: string, userId: string) => Promise<AdminUserMutationResult>;
91
+ /** Marks the user's email as verified. */
92
+ readonly verifyEmail: (organizationId: string, userId: string) => Promise<AdminUserMutationResult>;
93
+ /** Deactivates the user. */
94
+ readonly deactivate: (organizationId: string, userId: string) => Promise<AdminUserMutationResult>;
95
+ /** Activates the user. */
96
+ readonly activate: (organizationId: string, userId: string) => Promise<AdminUserMutationResult>;
97
+ /** Permanently deletes the user. */
98
+ readonly delete: (organizationId: string, userId: string) => Promise<AdminUserMutationResult>;
99
+ }
100
+ //# sourceMappingURL=user-service-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-service-types.d.ts","sourceRoot":"","sources":["../../src/admin/user-service-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Public contracts for the validated user administration service. */
2
+ export {};
3
+ //# sourceMappingURL=user-service-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-service-types.js","sourceRoot":"","sources":["../../src/admin/user-service-types.ts"],"names":[],"mappings":"AAAA,sEAAsE"}
@@ -0,0 +1,14 @@
1
+ /** Validated SDK boundary for user administration. */
2
+ import type { UsersDomain } from '@portaidentity/sdk';
3
+ import type { AdminUserOperations } from './user-service-types.js';
4
+ export type * from './user-service-types.js';
5
+ /**
6
+ * Creates the narrow user boundary used by the terminal application.
7
+ *
8
+ * The SDK domain is obtained only when a validated operation is invoked.
9
+ *
10
+ * @param domain - Returns the user domain for the current verified session.
11
+ * @returns Validated user operations with fixed safe outcomes.
12
+ */
13
+ export declare function createAdminUserOperations(domain: () => Pick<UsersDomain, 'list' | 'get' | 'getHistory' | 'invitePreview' | 'create' | 'invite' | 'update' | 'setPassword' | 'clearPassword' | 'verifyEmail' | 'deactivate' | 'activate' | 'delete'>): AdminUserOperations;
14
+ //# sourceMappingURL=user-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-service.d.ts","sourceRoot":"","sources":["../../src/admin/user-service.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAGtD,OAAO,KAAK,EAKV,WAAW,EAEZ,MAAM,oBAAoB,CAAC;AAO5B,OAAO,KAAK,EAKV,mBAAmB,EAEpB,MAAM,yBAAyB,CAAC;AAEjC,mBAAmB,yBAAyB,CAAC;AAme7C;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,IAAI,CAChB,WAAW,EACT,MAAM,GACN,KAAK,GACL,YAAY,GACZ,eAAe,GACf,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,aAAa,GACb,eAAe,GACf,aAAa,GACb,YAAY,GACZ,UAAU,GACV,QAAQ,CACX,GACA,mBAAmB,CA8JrB"}