@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,88 @@
1
+ /** Immutable state and closed user intents for the terminal portability workspace. */
2
+ import type { ExportManifestRequest, PortabilityApplyResult, PortabilityCategory, PortabilityEntityType, PortabilityPreviewResult, PortabilityResultError, PortabilityScope } from '@portaidentity/sdk';
3
+ /** Existing-record policies offered by the import tab after a successful preview. */
4
+ export type AdminPortabilityImportMode = 'keep-existing' | 'update-existing';
5
+ /** Application selection retained by the export tab. */
6
+ export type AdminPortabilityApplicationSelection = {
7
+ readonly kind: 'all';
8
+ } | {
9
+ readonly kind: 'selected';
10
+ readonly slugs: readonly string[];
11
+ };
12
+ /** Complete explicit export selection shown to the operator. */
13
+ export interface AdminPortabilityExportSelection {
14
+ /** Selected organization or complete-environment scope, when available. */
15
+ readonly scope?: PortabilityScope;
16
+ /** Manifest sections selected for export. */
17
+ readonly categories: readonly PortabilityCategory[];
18
+ /** All eligible applications or an explicit slug collection. */
19
+ readonly applications: AdminPortabilityApplicationSelection;
20
+ }
21
+ /** Safe local-file details shown by the import tab. */
22
+ export interface AdminPortabilityImportSelection {
23
+ /** Final filename component displayed in the selectable read-only field. */
24
+ readonly filename: string;
25
+ /** Existing-record policy selected for a later apply. */
26
+ readonly mode: AdminPortabilityImportMode;
27
+ }
28
+ /** Fixed operator feedback that cannot expose local paths or remote error details. */
29
+ export type AdminPortabilityFeedback = 'Could not read the manifest file.' | 'The manifest file is too large.' | 'Invalid manifest.' | 'Could not save the export file.' | 'Export is unavailable.' | 'Preview is unavailable.' | 'Apply is unavailable.';
30
+ /** Portability operations that may temporarily disable their owning controls. */
31
+ export type AdminPortabilityPendingOperation = 'choose-manifest' | 'export' | 'preview' | 'apply';
32
+ /** An applied result with one-time credentials removed before reusable view state. */
33
+ export type AdminPortabilityAppliedResult = Omit<PortabilityApplyResult, 'credentials'>;
34
+ /** Complete immutable state rendered by the portability workspace. */
35
+ export type AdminPortabilityWorkspaceState = {
36
+ readonly kind: 'closed';
37
+ } | {
38
+ readonly kind: 'ready';
39
+ /** Current explicit export choices. */
40
+ readonly exportSelection?: AdminPortabilityExportSelection;
41
+ /** Chosen import file and mode, when a valid local manifest is loaded. */
42
+ readonly importSelection?: AdminPortabilityImportSelection;
43
+ /** Most recent successful or rejected preview. */
44
+ readonly preview?: PortabilityPreviewResult;
45
+ /** Most recent committed counts without plaintext credentials. */
46
+ readonly applied?: AdminPortabilityAppliedResult;
47
+ /** Current locally owned asynchronous operation. */
48
+ readonly pending?: AdminPortabilityPendingOperation;
49
+ /** Fixed safe feedback for the most recent local or remote failure. */
50
+ readonly feedback?: AdminPortabilityFeedback;
51
+ /** Ordered rejected-record errors focused by the import result surface. */
52
+ readonly errors?: readonly PortabilityResultError[];
53
+ /** First dependency group that should receive focus after rejection. */
54
+ readonly focusedEntity?: PortabilityEntityType;
55
+ };
56
+ /** Closed set of actions emitted by the view and handled by its controller. */
57
+ export type AdminPortabilityIntent = {
58
+ readonly kind: 'set-export-scope';
59
+ readonly scope: PortabilityScope;
60
+ } | {
61
+ readonly kind: 'set-export-category';
62
+ readonly category: PortabilityCategory;
63
+ readonly selected: boolean;
64
+ } | {
65
+ readonly kind: 'set-all-applications';
66
+ readonly selected: boolean;
67
+ } | {
68
+ readonly kind: 'set-application';
69
+ readonly slug: string;
70
+ readonly selected: boolean;
71
+ } | {
72
+ readonly kind: 'export';
73
+ readonly request: ExportManifestRequest;
74
+ } | {
75
+ readonly kind: 'choose-manifest';
76
+ } | {
77
+ readonly kind: 'set-import-mode';
78
+ readonly mode: AdminPortabilityImportMode;
79
+ } | {
80
+ readonly kind: 'preview';
81
+ readonly mode?: AdminPortabilityImportMode;
82
+ } | {
83
+ readonly kind: 'apply';
84
+ readonly mode?: AdminPortabilityImportMode;
85
+ } | {
86
+ readonly kind: 'close';
87
+ };
88
+ //# sourceMappingURL=portability-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portability-state.d.ts","sourceRoot":"","sources":["../../src/admin/portability-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Immutable state and closed user intents for the terminal portability workspace. */
2
+ export {};
3
+ //# sourceMappingURL=portability-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portability-state.js","sourceRoot":"","sources":["../../src/admin/portability-state.ts"],"names":[],"mappings":"AAAA,sFAAsF"}
@@ -0,0 +1,78 @@
1
+ /** Maximized Layout DSL workspace for selective manifest export and import. */
2
+ import { Dialog } from '@jsvision/ui';
3
+ import type { View } from '@jsvision/ui';
4
+ import type { AdminPortabilityIntent, AdminPortabilityWorkspaceState } from './portability-state.js';
5
+ /** Capability subset needed to render and gate one portability workspace. */
6
+ export interface AdminPortabilityCapabilities {
7
+ /** Whether manifest export may be requested. */
8
+ readonly canExportData: boolean;
9
+ /** Whether manifest import may be requested. */
10
+ readonly canImportData: boolean;
11
+ /** Whether complete-environment scope may be offered. */
12
+ readonly isSuperAdmin: boolean;
13
+ /** Whether organization data may be exported. */
14
+ readonly canReadOrganizations: boolean;
15
+ /** Whether global applications may be exported. */
16
+ readonly canReadApplications: boolean;
17
+ /** Whether application roles may be exported. */
18
+ readonly canReadRoles: boolean;
19
+ /** Whether application permissions may be exported. */
20
+ readonly canReadPermissions: boolean;
21
+ /** Whether application claims may be exported. */
22
+ readonly canReadClaims: boolean;
23
+ /** Whether organization users may be exported. */
24
+ readonly canReadUsers: boolean;
25
+ /** Whether organization OIDC clients may be exported. */
26
+ readonly canReadClients: boolean;
27
+ }
28
+ /** Safe selected-organization details used only for scope presentation. */
29
+ export interface AdminPortabilityOrganization {
30
+ /** Stable organization identifier. */
31
+ readonly id: string;
32
+ /** Organization display name. */
33
+ readonly name: string;
34
+ /** Organization natural key used by the manifest. */
35
+ readonly slug: string;
36
+ /** Current organization lifecycle state. */
37
+ readonly status: 'active' | 'suspended';
38
+ /** The control-plane organization is excluded from portable tenant records. */
39
+ readonly isSuperAdmin?: boolean;
40
+ }
41
+ /** Safe global application choice shown by application-related exports. */
42
+ export interface AdminPortabilityApplication {
43
+ /** Stable application identifier. */
44
+ readonly id: string;
45
+ /** Application display name. */
46
+ readonly name: string;
47
+ /** Application natural key used by the manifest. */
48
+ readonly slug: string;
49
+ }
50
+ /** Construction values for one terminal portability workspace. */
51
+ export interface AdminPortabilityWorkspaceOptions {
52
+ /** Explicit capabilities derived from the current verified session. */
53
+ readonly capabilities: AdminPortabilityCapabilities;
54
+ /** Selected organization, when the shell currently owns one. */
55
+ readonly organization?: AdminPortabilityOrganization;
56
+ /** Global applications available for explicit selection. */
57
+ readonly applications: readonly AdminPortabilityApplication[];
58
+ /** Receives closed user intents while the controller owns side effects. */
59
+ readonly onIntent: (intent: AdminPortabilityIntent) => void;
60
+ /** Focuses one mounted control through the application event loop. */
61
+ readonly focusView?: (view: View) => void;
62
+ /** Releases controller ownership after a direct frame close. */
63
+ readonly onClose?: () => void;
64
+ }
65
+ /** Mounted workspace controlled only through immutable state replacement. */
66
+ export interface AdminPortabilityWorkspace {
67
+ /** Maximized modeless window mounted into the administration desktop. */
68
+ readonly content: Dialog;
69
+ /** Replaces the complete rendered state. */
70
+ readonly setState: (state: AdminPortabilityWorkspaceState) => void;
71
+ /** Restores focus inside the currently selected tab. */
72
+ readonly focusCurrent: () => void;
73
+ /** Releases retained view state. */
74
+ readonly clear: () => void;
75
+ }
76
+ /** Creates the maximized two-tab portability workspace. */
77
+ export declare function createAdminPortabilityWorkspace(options: AdminPortabilityWorkspaceOptions): AdminPortabilityWorkspace;
78
+ //# sourceMappingURL=portability-workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portability-workspace.d.ts","sourceRoot":"","sources":["../../src/admin/portability-workspace.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAE/E,OAAO,EAKL,MAAM,EAUP,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAe,IAAI,EAAE,MAAM,cAAc,CAAC;AAUtD,OAAO,KAAK,EAIV,sBAAsB,EACtB,8BAA8B,EAC/B,MAAM,wBAAwB,CAAC;AAGhC,6EAA6E;AAC7E,MAAM,WAAW,4BAA4B;IAC3C,gDAAgD;IAChD,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,gDAAgD;IAChD,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,yDAAyD;IACzD,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,iDAAiD;IACjD,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC;IACvC,mDAAmD;IACnD,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC,iDAAiD;IACjD,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,uDAAuD;IACvD,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,kDAAkD;IAClD,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,kDAAkD;IAClD,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,yDAAyD;IACzD,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;CAClC;AAED,2EAA2E;AAC3E,MAAM,WAAW,4BAA4B;IAC3C,sCAAsC;IACtC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,iCAAiC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qDAAqD;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,WAAW,CAAC;IACxC,+EAA+E;IAC/E,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,2EAA2E;AAC3E,MAAM,WAAW,2BAA2B;IAC1C,qCAAqC;IACrC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,kEAAkE;AAClE,MAAM,WAAW,gCAAgC;IAC/C,uEAAuE;IACvE,QAAQ,CAAC,YAAY,EAAE,4BAA4B,CAAC;IACpD,gEAAgE;IAChE,QAAQ,CAAC,YAAY,CAAC,EAAE,4BAA4B,CAAC;IACrD,4DAA4D;IAC5D,QAAQ,CAAC,YAAY,EAAE,SAAS,2BAA2B,EAAE,CAAC;IAC9D,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,sBAAsB,KAAK,IAAI,CAAC;IAC5D,sEAAsE;IACtE,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAC1C,gEAAgE;IAChE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AAED,6EAA6E;AAC7E,MAAM,WAAW,yBAAyB;IACxC,yEAAyE;IACzE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,4CAA4C;IAC5C,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,8BAA8B,KAAK,IAAI,CAAC;IACnE,wDAAwD;IACxD,QAAQ,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC;IAClC,oCAAoC;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;CAC5B;AAiKD,2DAA2D;AAC3D,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,gCAAgC,GACxC,yBAAyB,CAwP3B"}
@@ -0,0 +1,337 @@
1
+ /** Maximized Layout DSL workspace for selective manifest export and import. */
2
+ import { Button, CheckGroup, col, cover, Dialog, fixed, Group, grow, RadioGroup, row, signal, spacer, TabView, Text, } from '@jsvision/ui';
3
+ import { SelectableReadOnlyInput } from './selectable-read-only-input.js';
4
+ /** Manifest categories in the same order used throughout the UI. */
5
+ const CATEGORIES = [
6
+ 'organizations',
7
+ 'applications_authorization',
8
+ 'users_assignments',
9
+ 'oidc_clients',
10
+ ];
11
+ /** Human-readable labels aligned with the manifest category catalog. */
12
+ const CATEGORY_LABELS = [
13
+ 'Organizations',
14
+ 'Applications, roles, permissions, and claims',
15
+ 'Users and assignments',
16
+ 'OIDC clients',
17
+ ];
18
+ /** Result groups in server dependency order. */
19
+ const ENTITY_ORDER = [
20
+ 'organizations',
21
+ 'applications',
22
+ 'application_modules',
23
+ 'roles',
24
+ 'permissions',
25
+ 'claim_definitions',
26
+ 'role_permission_mappings',
27
+ 'users',
28
+ 'user_role_assignments',
29
+ 'user_claim_values',
30
+ 'clients',
31
+ ];
32
+ /** Display labels for result groups. */
33
+ const ENTITY_LABELS = {
34
+ organizations: 'Organizations',
35
+ applications: 'Applications',
36
+ application_modules: 'Application modules',
37
+ roles: 'Roles',
38
+ permissions: 'Permissions',
39
+ claim_definitions: 'Claim definitions',
40
+ role_permission_mappings: 'Role permissions',
41
+ users: 'Users',
42
+ user_role_assignments: 'User role assignments',
43
+ user_claim_values: 'User claim values',
44
+ clients: 'Clients',
45
+ };
46
+ /** Modeless dialog that asks its controller to close owned work. */
47
+ class PortabilityDialog extends Dialog {
48
+ closeOwnedWorkspace;
49
+ /** Creates the fixed full-page surface. */
50
+ constructor(closeOwnedWorkspace) {
51
+ super({ title: 'Import / Export', width: 72, height: 20 });
52
+ this.closeOwnedWorkspace = closeOwnedWorkspace;
53
+ this.resizable = false;
54
+ this.zoomable = true;
55
+ this.minWidth = 49;
56
+ this.minHeight = 19;
57
+ this.onMount(() => {
58
+ if (!this.isZoomed())
59
+ this.zoom();
60
+ this.zoomable = false;
61
+ });
62
+ }
63
+ /** Delegates direct frame closure to the owner when one exists. */
64
+ close() {
65
+ if (this.closeOwnedWorkspace)
66
+ this.closeOwnedWorkspace();
67
+ else
68
+ super.close();
69
+ }
70
+ }
71
+ /** Wraps one Layout DSL tree in the Group required by TabView. */
72
+ function tabPage(child) {
73
+ const page = new Group();
74
+ page.add(cover(child));
75
+ return page;
76
+ }
77
+ /** Returns whether an export category is locally available. */
78
+ function canExportCategory(category, capabilities) {
79
+ if (!capabilities.canExportData)
80
+ return false;
81
+ switch (category) {
82
+ case 'organizations':
83
+ return capabilities.canReadOrganizations;
84
+ case 'applications_authorization':
85
+ return (capabilities.canReadApplications &&
86
+ capabilities.canReadRoles &&
87
+ capabilities.canReadPermissions &&
88
+ capabilities.canReadClaims);
89
+ case 'users_assignments':
90
+ return capabilities.canReadUsers && capabilities.canReadRoles && capabilities.canReadClaims;
91
+ case 'oidc_clients':
92
+ return capabilities.canReadClients && capabilities.canReadApplications;
93
+ }
94
+ }
95
+ /** Creates the safe first export selection for the current shell context. */
96
+ function initialExportSelection(options) {
97
+ const scope = options.organization && !options.organization.isSuperAdmin
98
+ ? { kind: 'organization', organization_slug: options.organization.slug }
99
+ : options.capabilities.isSuperAdmin
100
+ ? { kind: 'environment' }
101
+ : undefined;
102
+ return {
103
+ ...(scope ? { scope } : {}),
104
+ categories: CATEGORIES.filter((category) => category !== 'oidc_clients' && canExportCategory(category, options.capabilities)),
105
+ applications: { kind: 'all' },
106
+ };
107
+ }
108
+ /** Returns whether selected categories need an explicit application choice. */
109
+ function needsApplications(categories) {
110
+ return categories.some((category) => category === 'applications_authorization' || category === 'oidc_clients');
111
+ }
112
+ /** Converts a UI application choice to the exact SDK request shape. */
113
+ function applicationRequest(selection) {
114
+ return selection.kind === 'all'
115
+ ? { all_applications: true, application_slugs: [] }
116
+ : { all_applications: false, application_slugs: selection.slugs };
117
+ }
118
+ /** Returns whether a complete export request can be sent. */
119
+ function validExportSelection(selection) {
120
+ if (!selection.scope || selection.categories.length === 0)
121
+ return false;
122
+ return !(needsApplications(selection.categories) &&
123
+ selection.applications.kind === 'selected' &&
124
+ selection.applications.slugs.length === 0);
125
+ }
126
+ /** Produces one compact line for a result group. */
127
+ function summaryLine(result, entity) {
128
+ const counts = result.summary[entity];
129
+ if (!counts)
130
+ return undefined;
131
+ const total = counts.created + counts.updated + counts.skipped + counts.rejected;
132
+ if (total === 0)
133
+ return undefined;
134
+ return `${ENTITY_LABELS[entity]}: ${counts.created} created, ${counts.updated} updated, ${counts.skipped} skipped, ${counts.rejected} rejected`;
135
+ }
136
+ /** Formats a public natural key without retaining it outside the rendered control. */
137
+ function errorLine(error) {
138
+ return `${ENTITY_LABELS[error.entity_type]}: ${Object.values(error.natural_key).join(' / ')} — ${error.code}`;
139
+ }
140
+ /** Creates the maximized two-tab portability workspace. */
141
+ export function createAdminPortabilityWorkspace(options) {
142
+ const content = new PortabilityDialog(options.onClose);
143
+ const activeTab = signal(options.capabilities.canExportData ? 0 : 1);
144
+ let state = {
145
+ kind: 'ready',
146
+ exportSelection: initialExportSelection(options),
147
+ };
148
+ let currentTabs;
149
+ let tabFocus = [null, null];
150
+ let readExportSelection = () => initialExportSelection(options);
151
+ /** Builds the fixed permission state used by an unauthorized tab. */
152
+ const permissionPage = (operation) => tabPage(col({ padding: 1, gap: 1 }, fixed(new Text(`${operation} permission required`), 1)));
153
+ /** Builds the export controls and their compact selection summary. */
154
+ const exportPage = () => {
155
+ if (!options.capabilities.canExportData)
156
+ return permissionPage('Export');
157
+ const ready = state.kind === 'ready' ? state : undefined;
158
+ const selection = ready?.exportSelection ?? initialExportSelection(options);
159
+ const scope = signal(selection.scope?.kind === 'environment' ? 1 : 0);
160
+ const categoryValues = signal(CATEGORIES.map((category) => selection.categories.includes(category)));
161
+ const categories = new CheckGroup({ labels: CATEGORY_LABELS, value: categoryValues });
162
+ CATEGORIES.forEach((category, index) => {
163
+ categories.setItemEnabled(index, canExportCategory(category, options.capabilities));
164
+ });
165
+ const applicationMode = signal(selection.applications.kind === 'all' ? 0 : 1);
166
+ const applicationModes = new RadioGroup({
167
+ labels: ['All applications', 'Selected applications'],
168
+ value: applicationMode,
169
+ });
170
+ const selectedSlugs = selection.applications.kind === 'selected' ? selection.applications.slugs : [];
171
+ const applicationValues = signal(options.applications.map((application) => selectedSlugs.includes(application.slug)));
172
+ const applicationChoices = new CheckGroup({
173
+ labels: options.applications.map((application) => application.name),
174
+ value: applicationValues,
175
+ });
176
+ const selectedCategories = () => CATEGORIES.filter((_, index) => categoryValues()[index] === true);
177
+ const selectedApplications = () => applicationMode() === 0
178
+ ? { kind: 'all' }
179
+ : {
180
+ kind: 'selected',
181
+ slugs: options.applications.flatMap((application, index) => applicationValues()[index] ? [application.slug] : []),
182
+ };
183
+ const currentSelection = () => {
184
+ const scopeIndex = scope();
185
+ const selectedScope = scopeIndex === 1 && options.capabilities.isSuperAdmin
186
+ ? { kind: 'environment' }
187
+ : options.organization && !options.organization.isSuperAdmin
188
+ ? { kind: 'organization', organization_slug: options.organization.slug }
189
+ : undefined;
190
+ return {
191
+ ...(selectedScope ? { scope: selectedScope } : {}),
192
+ categories: selectedCategories(),
193
+ applications: selectedApplications(),
194
+ };
195
+ };
196
+ readExportSelection = currentSelection;
197
+ const exportAction = new Button('Export…', {
198
+ disabled: () => ready?.pending !== undefined || !validExportSelection(currentSelection()),
199
+ onClick: () => {
200
+ const current = currentSelection();
201
+ if (!current.scope || !validExportSelection(current))
202
+ return;
203
+ const request = {
204
+ scope: current.scope,
205
+ categories: current.categories,
206
+ application_selection: applicationRequest(current.applications),
207
+ };
208
+ options.onIntent({ kind: 'export', request });
209
+ },
210
+ });
211
+ const close = new Button('Close', { onClick: () => options.onIntent({ kind: 'close' }) });
212
+ const scopeLabels = [
213
+ `Selected organization${options.organization ? `: ${options.organization.name}${options.organization.isSuperAdmin ? ' (not exportable)' : ''}` : ' required'}`,
214
+ ...(options.capabilities.isSuperAdmin ? ['Entire environment'] : []),
215
+ ];
216
+ const scopeControl = new RadioGroup({ labels: scopeLabels, value: scope });
217
+ if (options.organization?.isSuperAdmin)
218
+ scopeControl.setItemEnabled(0, false);
219
+ const summary = new Text(() => {
220
+ const current = currentSelection();
221
+ return `${current.categories.length} categories · ${current.applications.kind === 'all' ? 'All applications' : `${current.applications.slugs.length} applications`}`;
222
+ });
223
+ const page = tabPage(col({ padding: 1, gap: 1 }, fixed(row({ gap: 1 }, fixed(new Text('Scope'), 14), grow(scopeControl)), scopeLabels.length), fixed(row({ gap: 1 }, fixed(new Text('Categories'), 14), grow(categories)), CATEGORIES.length), fixed(row({ gap: 1 }, fixed(new Text('Applications'), 14), grow(applicationModes), options.applications.length > 0 && grow(applicationChoices)), Math.max(2, options.applications.length)), fixed(summary, 1), ready?.feedback && fixed(new Text(ready.feedback), 1), spacer(), fixed(row({ gap: 1 }, exportAction, close, spacer()), 2)));
224
+ tabFocus = [scopeControl, tabFocus[1] ?? null];
225
+ return page;
226
+ };
227
+ /** Builds ordered preview/apply output without introducing a scrolling surface. */
228
+ const resultRows = (result) => {
229
+ if (!result)
230
+ return [new Text('No preview')];
231
+ const errors = [...result.errors].sort((left, right) => ENTITY_ORDER.indexOf(left.entity_type) - ENTITY_ORDER.indexOf(right.entity_type));
232
+ if (errors.length > 0) {
233
+ return errors.map((error) => new SelectableReadOnlyInput(errorLine(error)));
234
+ }
235
+ const lines = ENTITY_ORDER.flatMap((entity) => {
236
+ const line = summaryLine(result, entity);
237
+ return line ? [new Text(line)] : [];
238
+ });
239
+ return lines.length > 0 ? lines : [new Text('No changes')];
240
+ };
241
+ /** Builds the import file, preview, confirmation, and result controls. */
242
+ const importPage = () => {
243
+ if (!options.capabilities.canImportData)
244
+ return permissionPage('Import');
245
+ const ready = state.kind === 'ready' ? state : undefined;
246
+ const initialMode = ready?.importSelection?.mode === 'update-existing' ? 1 : 0;
247
+ const mode = signal(initialMode);
248
+ const modeControl = new RadioGroup({
249
+ labels: ['Keep existing records', 'Update existing records'],
250
+ value: mode,
251
+ });
252
+ const selectedMode = () => mode() === 1 ? 'update-existing' : 'keep-existing';
253
+ const previewIsCurrent = () => ready?.preview !== undefined && selectedMode() === ready.importSelection?.mode;
254
+ const appliedIsCurrent = () => ready?.applied !== undefined && selectedMode() === ready.importSelection?.mode;
255
+ let modeMounted = false;
256
+ modeControl.onMount(() => {
257
+ modeControl.bind(selectedMode, (selected) => {
258
+ if (!modeMounted) {
259
+ modeMounted = true;
260
+ return;
261
+ }
262
+ options.onIntent({ kind: 'set-import-mode', mode: selected });
263
+ });
264
+ });
265
+ const choose = new Button('Choose manifest…', {
266
+ disabled: ready?.pending !== undefined,
267
+ onClick: () => options.onIntent({ kind: 'choose-manifest' }),
268
+ });
269
+ const previewAction = new Button('Preview', {
270
+ disabled: () => !ready?.importSelection || ready.pending !== undefined,
271
+ onClick: () => options.onIntent({ kind: 'preview', mode: selectedMode() }),
272
+ });
273
+ const apply = new Button('Apply', {
274
+ disabled: () => !previewIsCurrent() || ready?.preview?.errors.length !== 0 || ready?.pending !== undefined,
275
+ onClick: () => options.onIntent({ kind: 'apply', mode: selectedMode() }),
276
+ });
277
+ const close = new Button('Close', { onClick: () => options.onIntent({ kind: 'close' }) });
278
+ const filename = new SelectableReadOnlyInput(ready?.importSelection?.filename ?? 'No manifest selected');
279
+ const visibleResult = appliedIsCurrent()
280
+ ? ready?.applied
281
+ : previewIsCurrent()
282
+ ? ready?.preview
283
+ : undefined;
284
+ const rows = resultRows(visibleResult);
285
+ const resultColumn = col({ gap: 1 }, ...rows.map((view) => fixed(view, 1)));
286
+ const page = tabPage(col({ padding: 1, gap: 1 }, fixed(row({ gap: 1 }, choose, fixed(filename, 32), spacer()), 2), fixed(modeControl, 2), fixed(row({ gap: 1 }, previewAction, apply, close, spacer()), 2), ready?.feedback && fixed(new Text(ready.feedback), 1), grow(resultColumn)));
287
+ const firstError = rows.find((view) => view instanceof SelectableReadOnlyInput) ?? null;
288
+ tabFocus = [tabFocus[0] ?? null, firstError ?? choose];
289
+ if (firstError)
290
+ firstError.onMount(() => options.focusView?.(firstError));
291
+ return page;
292
+ };
293
+ /** Rebuilds both retained pages from one state snapshot. */
294
+ const render = () => {
295
+ for (const child of [...content.children])
296
+ content.remove(child);
297
+ if (state.kind === 'closed')
298
+ return;
299
+ tabFocus = [null, null];
300
+ const tabs = signal([
301
+ { title: 'Export', content: exportPage() },
302
+ { title: 'Import', content: importPage() },
303
+ ]);
304
+ currentTabs = new TabView({ tabs, active: activeTab });
305
+ content.add(cover(currentTabs));
306
+ };
307
+ render();
308
+ return {
309
+ content,
310
+ setState(next) {
311
+ if (next.kind === 'ready' &&
312
+ (next.importSelection !== undefined ||
313
+ next.preview !== undefined ||
314
+ next.applied !== undefined)) {
315
+ activeTab.set(1);
316
+ }
317
+ state =
318
+ next.kind === 'ready' && !next.exportSelection
319
+ ? { ...next, exportSelection: readExportSelection() }
320
+ : next;
321
+ render();
322
+ },
323
+ focusCurrent() {
324
+ // Pending operations disable actions; the tab header remains a valid focus target.
325
+ const preferred = tabFocus[activeTab.peek()];
326
+ const focus = preferred && !preferred.state.disabled ? preferred : currentTabs?.strip;
327
+ if (focus)
328
+ options.focusView?.(focus);
329
+ },
330
+ clear() {
331
+ state = { kind: 'closed' };
332
+ activeTab.set(options.capabilities.canExportData ? 0 : 1);
333
+ render();
334
+ },
335
+ };
336
+ }
337
+ //# sourceMappingURL=portability-workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portability-workspace.js","sourceRoot":"","sources":["../../src/admin/portability-workspace.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAE/E,OAAO,EACL,MAAM,EACN,UAAU,EACV,GAAG,EACH,KAAK,EACL,MAAM,EACN,KAAK,EACL,KAAK,EACL,IAAI,EACJ,UAAU,EACV,GAAG,EACH,MAAM,EACN,MAAM,EACN,OAAO,EACP,IAAI,GACL,MAAM,cAAc,CAAC;AAkBtB,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AA8E1E,oEAAoE;AACpE,MAAM,UAAU,GAAmC;IACjD,eAAe;IACf,4BAA4B;IAC5B,mBAAmB;IACnB,cAAc;CACf,CAAC;AAEF,wEAAwE;AACxE,MAAM,eAAe,GAAG;IACtB,eAAe;IACf,8CAA8C;IAC9C,uBAAuB;IACvB,cAAc;CACN,CAAC;AAEX,gDAAgD;AAChD,MAAM,YAAY,GAAqC;IACrD,eAAe;IACf,cAAc;IACd,qBAAqB;IACrB,OAAO;IACP,aAAa;IACb,mBAAmB;IACnB,0BAA0B;IAC1B,OAAO;IACP,uBAAuB;IACvB,mBAAmB;IACnB,SAAS;CACV,CAAC;AAEF,wCAAwC;AACxC,MAAM,aAAa,GAAoD;IACrE,aAAa,EAAE,eAAe;IAC9B,YAAY,EAAE,cAAc;IAC5B,mBAAmB,EAAE,qBAAqB;IAC1C,KAAK,EAAE,OAAO;IACd,WAAW,EAAE,aAAa;IAC1B,iBAAiB,EAAE,mBAAmB;IACtC,wBAAwB,EAAE,kBAAkB;IAC5C,KAAK,EAAE,OAAO;IACd,qBAAqB,EAAE,uBAAuB;IAC9C,iBAAiB,EAAE,mBAAmB;IACtC,OAAO,EAAE,SAAS;CACnB,CAAC;AAEF,oEAAoE;AACpE,MAAM,iBAAkB,SAAQ,MAAM;IAEP,mBAAmB;IADhD,2CAA2C;IAC3C,YAA6B,mBAAgC;QAC3D,KAAK,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;mCADhC,mBAAmB;QAE9C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;YAChB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;gBAAE,IAAI,CAAC,IAAI,EAAE,CAAC;YAClC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,mEAAmE;IAC1D,KAAK;QACZ,IAAI,IAAI,CAAC,mBAAmB;YAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC;;YACpD,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF;AAED,kEAAkE;AAClE,SAAS,OAAO,CAAC,KAAW;IAC1B,MAAM,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;IACzB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACvB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+DAA+D;AAC/D,SAAS,iBAAiB,CACxB,QAA6B,EAC7B,YAA0C;IAE1C,IAAI,CAAC,YAAY,CAAC,aAAa;QAAE,OAAO,KAAK,CAAC;IAC9C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,eAAe;YAClB,OAAO,YAAY,CAAC,oBAAoB,CAAC;QAC3C,KAAK,4BAA4B;YAC/B,OAAO,CACL,YAAY,CAAC,mBAAmB;gBAChC,YAAY,CAAC,YAAY;gBACzB,YAAY,CAAC,kBAAkB;gBAC/B,YAAY,CAAC,aAAa,CAC3B,CAAC;QACJ,KAAK,mBAAmB;YACtB,OAAO,YAAY,CAAC,YAAY,IAAI,YAAY,CAAC,YAAY,IAAI,YAAY,CAAC,aAAa,CAAC;QAC9F,KAAK,cAAc;YACjB,OAAO,YAAY,CAAC,cAAc,IAAI,YAAY,CAAC,mBAAmB,CAAC;IAC3E,CAAC;AACH,CAAC;AAED,6EAA6E;AAC7E,SAAS,sBAAsB,CAC7B,OAAyC;IAEzC,MAAM,KAAK,GACT,OAAO,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,YAAY;QACxD,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,iBAAiB,EAAE,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE;QACxE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,YAAY;YACjC,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE;YACzB,CAAC,CAAC,SAAS,CAAC;IAClB,OAAO;QACL,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,UAAU,EAAE,UAAU,CAAC,MAAM,CAC3B,CAAC,QAAQ,EAAE,EAAE,CACX,QAAQ,KAAK,cAAc,IAAI,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,CACnF;QACD,YAAY,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;KAC9B,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,SAAS,iBAAiB,CAAC,UAA0C;IACnE,OAAO,UAAU,CAAC,IAAI,CACpB,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,KAAK,4BAA4B,IAAI,QAAQ,KAAK,cAAc,CACvF,CAAC;AACJ,CAAC;AAED,uEAAuE;AACvE,SAAS,kBAAkB,CAAC,SAA+C;IACzE,OAAO,SAAS,CAAC,IAAI,KAAK,KAAK;QAC7B,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE;QACnD,CAAC,CAAC,EAAE,gBAAgB,EAAE,KAAK,EAAE,iBAAiB,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC;AACtE,CAAC;AAED,6DAA6D;AAC7D,SAAS,oBAAoB,CAAC,SAA0C;IACtE,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxE,OAAO,CAAC,CACN,iBAAiB,CAAC,SAAS,CAAC,UAAU,CAAC;QACvC,SAAS,CAAC,YAAY,CAAC,IAAI,KAAK,UAAU;QAC1C,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAC1C,CAAC;AACJ,CAAC;AAED,oDAAoD;AACpD,SAAS,WAAW,CAClB,MAA6B,EAC7B,MAA6B;IAE7B,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjF,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAClC,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,OAAO,aAAa,MAAM,CAAC,OAAO,aAAa,MAAM,CAAC,OAAO,aAAa,MAAM,CAAC,QAAQ,WAAW,CAAC;AAClJ,CAAC;AAED,sFAAsF;AACtF,SAAS,SAAS,CAAC,KAA6B;IAC9C,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;AAChH,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,+BAA+B,CAC7C,OAAyC;IAEzC,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,IAAI,KAAK,GAAmC;QAC1C,IAAI,EAAE,OAAO;QACb,eAAe,EAAE,sBAAsB,CAAC,OAAO,CAAC;KACjD,CAAC;IACF,IAAI,WAAgC,CAAC;IACrC,IAAI,QAAQ,GAA6B,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACtD,IAAI,mBAAmB,GAAG,GAAoC,EAAE,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAEjG,qEAAqE;IACrE,MAAM,cAAc,GAAG,CAAC,SAA8B,EAAS,EAAE,CAC/D,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,SAAS,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAE/F,sEAAsE;IACtE,MAAM,UAAU,GAAG,GAAU,EAAE;QAC7B,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,aAAa;YAAE,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;QACzE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QACzD,MAAM,SAAS,GAAG,KAAK,EAAE,eAAe,IAAI,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAC5E,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,MAAM,cAAc,GAAG,MAAM,CAC3B,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CACtE,CAAC;QACF,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;QACtF,UAAU,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;YACrC,UAAU,CAAC,cAAc,CAAC,KAAK,EAAE,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;QACH,MAAM,eAAe,GAAG,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9E,MAAM,gBAAgB,GAAG,IAAI,UAAU,CAAC;YACtC,MAAM,EAAE,CAAC,kBAAkB,EAAE,uBAAuB,CAAC;YACrD,KAAK,EAAE,eAAe;SACvB,CAAC,CAAC;QACH,MAAM,aAAa,GACjB,SAAS,CAAC,YAAY,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACjF,MAAM,iBAAiB,GAAG,MAAM,CAC9B,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CACpF,CAAC;QACF,MAAM,kBAAkB,GAAG,IAAI,UAAU,CAAC;YACxC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC;YACnE,KAAK,EAAE,iBAAiB;SACzB,CAAC,CAAC;QACH,MAAM,kBAAkB,GAAG,GAAmC,EAAE,CAC9D,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;QACpE,MAAM,oBAAoB,GAAG,GAAyC,EAAE,CACtE,eAAe,EAAE,KAAK,CAAC;YACrB,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE;YACjB,CAAC,CAAC;gBACE,IAAI,EAAE,UAAU;gBAChB,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,EAAE,CACzD,iBAAiB,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CACrD;aACF,CAAC;QACR,MAAM,gBAAgB,GAAG,GAAoC,EAAE;YAC7D,MAAM,UAAU,GAAG,KAAK,EAAE,CAAC;YAC3B,MAAM,aAAa,GACjB,UAAU,KAAK,CAAC,IAAI,OAAO,CAAC,YAAY,CAAC,YAAY;gBACnD,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE;gBACzB,CAAC,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,YAAY;oBAC1D,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,iBAAiB,EAAE,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE;oBACxE,CAAC,CAAC,SAAS,CAAC;YAClB,OAAO;gBACL,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClD,UAAU,EAAE,kBAAkB,EAAE;gBAChC,YAAY,EAAE,oBAAoB,EAAE;aACrC,CAAC;QACJ,CAAC,CAAC;QACF,mBAAmB,GAAG,gBAAgB,CAAC;QACvC,MAAM,YAAY,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE;YACzC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,SAAS,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,EAAE,CAAC;YACzF,OAAO,EAAE,GAAG,EAAE;gBACZ,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;gBACnC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;oBAAE,OAAO;gBAC7D,MAAM,OAAO,GAA0B;oBACrC,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,UAAU,EAAE,OAAO,CAAC,UAAU;oBAC9B,qBAAqB,EAAE,kBAAkB,CAAC,OAAO,CAAC,YAAY,CAAC;iBAChE,CAAC;gBACF,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;YAChD,CAAC;SACF,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1F,MAAM,WAAW,GAAG;YAClB,wBAAwB,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,YAAY,CAAC,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE;YAC9J,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACrE,CAAC;QACF,MAAM,YAAY,GAAG,IAAI,UAAU,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3E,IAAI,OAAO,CAAC,YAAY,EAAE,YAAY;YAAE,YAAY,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC9E,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE;YAC5B,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;YACnC,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,iBAAiB,OAAO,CAAC,YAAY,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,eAAe,EAAE,CAAC;QACvK,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,CAClB,GAAG,CACD,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EACtB,KAAK,CACH,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,EACjE,WAAW,CAAC,MAAM,CACnB,EACD,KAAK,CACH,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EACpE,UAAU,CAAC,MAAM,CAClB,EACD,KAAK,CACH,GAAG,CACD,EAAE,GAAG,EAAE,CAAC,EAAE,EACV,KAAK,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC,EACnC,IAAI,CAAC,gBAAgB,CAAC,EACtB,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAC5D,EACD,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CACzC,EACD,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,EACjB,KAAK,EAAE,QAAQ,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EACrD,MAAM,EAAE,EACR,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CACzD,CACF,CAAC;QACF,QAAQ,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,mFAAmF;IACnF,MAAM,UAAU,GAAG,CAAC,MAAyC,EAAmB,EAAE;QAChF,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CACpC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACd,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CACnF,CAAC;QACF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,uBAAuB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC9E,CAAC;QACD,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC5C,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACzC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtC,CAAC,CAAC,CAAC;QACH,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC;IAEF,0EAA0E;IAC1E,MAAM,UAAU,GAAG,GAAU,EAAE;QAC7B,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,aAAa;YAAE,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;QACzE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QACzD,MAAM,WAAW,GAAG,KAAK,EAAE,eAAe,EAAE,IAAI,KAAK,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/E,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;QACjC,MAAM,WAAW,GAAG,IAAI,UAAU,CAAC;YACjC,MAAM,EAAE,CAAC,uBAAuB,EAAE,yBAAyB,CAAC;YAC5D,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QACH,MAAM,YAAY,GAAG,GAA+B,EAAE,CACpD,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,eAAe,CAAC;QACrD,MAAM,gBAAgB,GAAG,GAAY,EAAE,CACrC,KAAK,EAAE,OAAO,KAAK,SAAS,IAAI,YAAY,EAAE,KAAK,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC;QACjF,MAAM,gBAAgB,GAAG,GAAY,EAAE,CACrC,KAAK,EAAE,OAAO,KAAK,SAAS,IAAI,YAAY,EAAE,KAAK,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC;QACjF,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE;YACvB,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,QAAQ,EAAE,EAAE;gBAC1C,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,WAAW,GAAG,IAAI,CAAC;oBACnB,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAChE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,kBAAkB,EAAE;YAC5C,QAAQ,EAAE,KAAK,EAAE,OAAO,KAAK,SAAS;YACtC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;SAC7D,CAAC,CAAC;QACH,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE;YAC1C,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,eAAe,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;YACtE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,CAAC;SAC3E,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE;YAChC,QAAQ,EAAE,GAAG,EAAE,CACb,CAAC,gBAAgB,EAAE,IAAI,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,EAAE,OAAO,KAAK,SAAS;YAC5F,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,CAAC;SACzE,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1F,MAAM,QAAQ,GAAG,IAAI,uBAAuB,CAC1C,KAAK,EAAE,eAAe,EAAE,QAAQ,IAAI,sBAAsB,CAC3D,CAAC;QACF,MAAM,aAAa,GAAG,gBAAgB,EAAE;YACtC,CAAC,CAAC,KAAK,EAAE,OAAO;YAChB,CAAC,CAAC,gBAAgB,EAAE;gBAClB,CAAC,CAAC,KAAK,EAAE,OAAO;gBAChB,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,IAAI,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;QACvC,MAAM,YAAY,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,MAAM,IAAI,GAAG,OAAO,CAClB,GAAG,CACD,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EACtB,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,EAChE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,EACrB,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,EAChE,KAAK,EAAE,QAAQ,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EACrD,IAAI,CAAC,YAAY,CAAC,CACnB,CACF,CAAC;QACF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,YAAY,uBAAuB,CAAC,IAAI,IAAI,CAAC;QACxF,QAAQ,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,UAAU,IAAI,MAAM,CAAC,CAAC;QACvD,IAAI,UAAU;YAAE,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QAC1E,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,4DAA4D;IAC5D,MAAM,MAAM,GAAG,GAAS,EAAE;QACxB,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjE,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO;QACpC,QAAQ,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACxB,MAAM,IAAI,GAAkB,MAAM,CAAC;YACjC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE;YAC1C,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE;SAC3C,CAAC,CAAC;QACH,WAAW,GAAG,IAAI,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC;IAEF,MAAM,EAAE,CAAC;IACT,OAAO;QACL,OAAO;QACP,QAAQ,CAAC,IAAI;YACX,IACE,IAAI,CAAC,IAAI,KAAK,OAAO;gBACrB,CAAC,IAAI,CAAC,eAAe,KAAK,SAAS;oBACjC,IAAI,CAAC,OAAO,KAAK,SAAS;oBAC1B,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,EAC7B,CAAC;gBACD,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC;YACD,KAAK;gBACH,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe;oBAC5C,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,eAAe,EAAE,mBAAmB,EAAE,EAAE;oBACrD,CAAC,CAAC,IAAI,CAAC;YACX,MAAM,EAAE,CAAC;QACX,CAAC;QACD,YAAY;YACV,mFAAmF;YACnF,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC;YACtF,IAAI,KAAK;gBAAE,OAAO,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;QACD,KAAK;YACH,KAAK,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YAC3B,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,MAAM,EAAE,CAAC;QACX,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,46 @@
1
+ /** JSVision presentation for the embedded Porta administration shell. */
2
+ import type { Size2D, StatusLine } from '@jsvision/ui';
3
+ import { Desktop, MenuBar, View } from '@jsvision/ui';
4
+ import type { AdminConnectionState } from './state.js';
5
+ /** Command names handled by the administration application. */
6
+ export declare const ADMIN_COMMANDS: {
7
+ readonly authenticate: 'authenticate';
8
+ readonly retry: 'retry';
9
+ readonly reauthenticate: 'reauthenticate';
10
+ readonly whoAmI: 'who-am-i';
11
+ readonly createOrganization: 'create-organization';
12
+ readonly switchOrganization: 'switch-organization';
13
+ readonly manageOrganization: 'manage-organization';
14
+ readonly browseUsers: 'browse-users';
15
+ readonly createUser: 'create-user';
16
+ readonly inviteUser: 'invite-user';
17
+ readonly unavailableUser: 'user-action-unavailable';
18
+ readonly browseApplications: 'browse-applications';
19
+ readonly createApplication: 'create-application';
20
+ readonly browseClients: 'browse-clients';
21
+ readonly createClient: 'create-client';
22
+ readonly unavailableClient: 'client-action-unavailable';
23
+ readonly portability: "portability";
24
+ readonly systemConfig: "system-config";
25
+ readonly cancel: 'cancel';
26
+ };
27
+ /** Presentation objects mounted into one JSVision application. */
28
+ export interface AdminPresentation {
29
+ /** Full-screen body mounted between the application chrome rows. */
30
+ readonly content: Desktop;
31
+ /** Global and organization menu bar. */
32
+ readonly menu?: MenuBar;
33
+ /** Keyboard shortcut bar. */
34
+ readonly status: StatusLine;
35
+ /** Replaces displayed state and requests a repaint. */
36
+ readonly setState: (state: AdminConnectionState) => void;
37
+ /** Returns the state currently owned by the view. */
38
+ readonly getState: () => AdminConnectionState;
39
+ /** Mounts exactly one feature workspace, or restores the landing view. */
40
+ readonly setWorkspace: (workspace: View | null) => void;
41
+ /** Compatibility alias used by the existing user controller. */
42
+ readonly setUserWorkspace: (workspace: View | null) => void;
43
+ }
44
+ /** Builds the real JSVision view tree and application chrome. */
45
+ export declare function createAdminPresentation(initialState: AdminConnectionState, _insecure: boolean, viewport?: Size2D, utf8?: boolean): AdminPresentation;
46
+ //# sourceMappingURL=presentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation.d.ts","sourceRoot":"","sources":["../../src/admin/presentation.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAEzE,OAAO,KAAK,EAAe,MAAM,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAEL,OAAO,EAGP,OAAO,EAKP,IAAI,EAEL,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAIvD,+DAA+D;AAC/D,eAAO,MAAM,cAAc;aACzB,YAAY,EAAE,cAAc;aAC5B,KAAK,EAAE,OAAO;aACd,cAAc,EAAE,gBAAgB;aAChC,MAAM,EAAE,UAAU;aAClB,kBAAkB,EAAE,qBAAqB;aACzC,kBAAkB,EAAE,qBAAqB;aACzC,kBAAkB,EAAE,qBAAqB;aACzC,WAAW,EAAE,cAAc;aAC3B,UAAU,EAAE,aAAa;aACzB,UAAU,EAAE,aAAa;aACzB,eAAe,EAAE,yBAAyB;aAC1C,kBAAkB,EAAE,qBAAqB;aACzC,iBAAiB,EAAE,oBAAoB;aACvC,aAAa,EAAE,gBAAgB;aAC/B,YAAY,EAAE,eAAe;aAC7B,iBAAiB,EAAE,2BAA2B;aAC9C,WAAW;aACX,YAAY;aACZ,MAAM,EAAE,QAAQ;CACR,CAAC;AAMX,kEAAkE;AAClE,MAAM,WAAW,iBAAiB;IAChC,oEAAoE;IACpE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,wCAAwC;IACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,6BAA6B;IAC7B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,uDAAuD;IACvD,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;IACzD,qDAAqD;IACrD,QAAQ,CAAC,QAAQ,EAAE,MAAM,oBAAoB,CAAC;IAC9C,0EAA0E;IAC1E,QAAQ,CAAC,YAAY,EAAE,CAAC,SAAS,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IACxD,gEAAgE;IAChE,QAAQ,CAAC,gBAAgB,EAAE,CAAC,SAAS,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;CAC7D;AAuBD,iEAAiE;AACjE,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,oBAAoB,EAClC,SAAS,EAAE,OAAO,EAClB,QAAQ,CAAC,EAAE,MAAM,EACjB,IAAI,UAAO,GACV,iBAAiB,CAgPnB"}