@datalayer/core 1.0.24 → 1.1.41

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 (364) hide show
  1. package/README.md +35 -24
  2. package/lib/api/constants.d.ts +3 -0
  3. package/lib/api/constants.js +3 -0
  4. package/lib/api/index.d.ts +0 -8
  5. package/lib/api/index.js +0 -8
  6. package/lib/cli-login.js +167 -0
  7. package/lib/client/base.d.ts +0 -3
  8. package/lib/client/base.js +0 -2
  9. package/lib/client/index.d.ts +10 -98
  10. package/lib/client/index.js +12 -21
  11. package/lib/components/avatars/UserAvatar.d.ts +16 -0
  12. package/lib/components/avatars/UserAvatar.js +47 -0
  13. package/lib/components/avatars/index.d.ts +1 -0
  14. package/lib/components/avatars/index.js +1 -0
  15. package/lib/components/billing/BillableAccountSelect.js +4 -0
  16. package/lib/components/billing/index.js +4 -0
  17. package/lib/components/checkout/StripeCheckout.js +48 -2
  18. package/lib/components/context/index.d.ts +0 -1
  19. package/lib/components/context/index.js +0 -1
  20. package/lib/components/display/DisplayHandle.d.ts +12 -0
  21. package/lib/components/display/DisplayHandle.js +11 -0
  22. package/lib/components/display/LiveRelativeTime.d.ts +1 -10
  23. package/lib/components/display/LiveRelativeTime.js +5 -16
  24. package/lib/components/display/index.d.ts +1 -0
  25. package/lib/components/display/index.js +1 -0
  26. package/lib/components/flashes/index.d.ts +0 -1
  27. package/lib/components/flashes/index.js +0 -1
  28. package/lib/components/index.d.ts +2 -0
  29. package/lib/components/index.js +2 -0
  30. package/lib/components/principal/Principal.d.ts +7 -0
  31. package/lib/components/principal/Principal.js +153 -16
  32. package/lib/components/principal/PrincipalAvatar.d.ts +1 -1
  33. package/lib/components/principal/PrincipalAvatar.js +4 -28
  34. package/lib/components/principal/PrincipalBadge.js +4 -4
  35. package/lib/components/principal/PrincipalDetailsOverlay.d.ts +4 -2
  36. package/lib/components/principal/PrincipalDetailsOverlay.js +27 -7
  37. package/lib/components/principal/PrincipalSwitcherMenu.js +76 -39
  38. package/lib/components/progress/index.d.ts +0 -1
  39. package/lib/components/progress/index.js +0 -1
  40. package/lib/components/sharing/ShareAccessComponent.d.ts +3 -2
  41. package/lib/components/sharing/ShareAccessComponent.js +180 -133
  42. package/lib/components/sharing/SharingEditor.js +4 -0
  43. package/lib/components/snippets/index.d.ts +1 -1
  44. package/lib/components/snippets/index.js +1 -1
  45. package/lib/components/students/StudentResultCircle.d.ts +21 -0
  46. package/lib/components/students/StudentResultCircle.js +59 -0
  47. package/lib/components/students/index.d.ts +1 -1
  48. package/lib/components/students/index.js +1 -1
  49. package/lib/components/time/LiveRelativeTime.d.ts +14 -0
  50. package/lib/components/time/LiveRelativeTime.js +43 -0
  51. package/lib/components/time/index.d.ts +1 -0
  52. package/lib/components/time/index.js +9 -0
  53. package/lib/components/timeline/Timeline.d.ts +20 -0
  54. package/lib/components/timeline/Timeline.js +90 -0
  55. package/lib/components/timeline/index.d.ts +1 -0
  56. package/lib/components/timeline/index.js +9 -0
  57. package/lib/components/tokens/index.d.ts +1 -1
  58. package/lib/components/tokens/index.js +1 -1
  59. package/lib/components/toolbars/index.d.ts +1 -3
  60. package/lib/components/toolbars/index.js +1 -3
  61. package/lib/hooks/cacheConverters.d.ts +21 -0
  62. package/lib/hooks/cacheConverters.js +110 -0
  63. package/lib/hooks/index.d.ts +0 -2
  64. package/lib/hooks/index.js +0 -2
  65. package/lib/hooks/useCache.d.ts +65 -36
  66. package/lib/hooks/useCache.js +424 -65
  67. package/lib/hooks/useDatalayer.js +3 -1
  68. package/lib/hooks/useIAM.js +1 -3
  69. package/lib/hooks/useLocationHandles.d.ts +3 -1
  70. package/lib/hooks/useLocationHandles.js +2 -1
  71. package/lib/hooks/usePrincipalStore.d.ts +2 -2
  72. package/lib/hooks/usePrincipalStore.js +97 -14
  73. package/lib/hooks/useProjectStore.d.ts +1 -1
  74. package/lib/hooks/useSelectedPrincipal.js +1 -1
  75. package/lib/hooks/useUser.js +19 -2
  76. package/lib/index.d.ts +1 -6
  77. package/lib/index.js +1 -13
  78. package/lib/main.js +3 -3
  79. package/lib/mocks/index.js +1 -1
  80. package/lib/mocks/models/index.d.ts +0 -1
  81. package/lib/mocks/models/index.js +0 -1
  82. package/lib/models/Datasource.d.ts +2 -2
  83. package/lib/models/IAM.d.ts +1 -1
  84. package/lib/models/IAMToken.d.ts +1 -1
  85. package/lib/models/School.d.ts +12 -3
  86. package/lib/models/Secret.d.ts +2 -2
  87. package/lib/models/Student.d.ts +13 -3
  88. package/lib/models/Usage.d.ts +11 -1
  89. package/lib/models/UserDTO.d.ts +2 -2
  90. package/lib/models/index.d.ts +0 -30
  91. package/lib/models/index.js +0 -30
  92. package/lib/routes/index.d.ts +1 -0
  93. package/lib/routes/index.js +1 -0
  94. package/lib/routes/publicPaths.d.ts +23 -0
  95. package/lib/routes/publicPaths.js +74 -0
  96. package/lib/state/State.d.ts +0 -12
  97. package/lib/state/State.js +0 -12
  98. package/lib/state/substates/CoreState.js +1 -1
  99. package/lib/state/substates/LayoutState.d.ts +12 -1
  100. package/lib/state/substates/index.d.ts +0 -7
  101. package/lib/state/substates/index.js +0 -7
  102. package/lib/utils/Date.d.ts +7 -0
  103. package/lib/utils/Date.js +43 -10
  104. package/lib/utils/Handles.js +3 -1
  105. package/lib/utils/index.d.ts +1 -1
  106. package/lib/utils/index.js +1 -1
  107. package/lib/views/api-keys/APIKeyEdit.d.ts +8 -0
  108. package/lib/views/{iam-tokens/IAMTokenEdit.js → api-keys/APIKeyEdit.js} +31 -31
  109. package/lib/views/api-keys/APIKeyNew.d.ts +8 -0
  110. package/lib/views/api-keys/APIKeyNew.js +143 -0
  111. package/lib/views/api-keys/APIKeys.d.ts +12 -0
  112. package/lib/views/api-keys/APIKeys.js +128 -0
  113. package/lib/views/api-keys/APIKeysStandalone.d.ts +2 -0
  114. package/lib/views/api-keys/APIKeysStandalone.js +117 -0
  115. package/lib/views/api-keys/index.d.ts +3 -0
  116. package/lib/{mocks/jupyter → views/api-keys}/index.js +3 -1
  117. package/lib/views/datasources/DatasourceDetail.d.ts +1 -1
  118. package/lib/views/datasources/DatasourceNew.d.ts +1 -1
  119. package/lib/views/datasources/Datasources.d.ts +1 -1
  120. package/lib/views/datasources/Datasources.js +12 -3
  121. package/lib/views/iam/SignInSimple.d.ts +37 -1
  122. package/lib/views/iam/SignInSimple.js +110 -12
  123. package/package.json +5 -3
  124. package/lib/App.css +0 -47
  125. package/lib/App.d.ts +0 -3
  126. package/lib/App.js +0 -21
  127. package/lib/api/runtimes/checkpoints.d.ts +0 -122
  128. package/lib/api/runtimes/checkpoints.js +0 -118
  129. package/lib/api/runtimes/environments.d.ts +0 -9
  130. package/lib/api/runtimes/environments.js +0 -29
  131. package/lib/api/runtimes/healthz.d.ts +0 -15
  132. package/lib/api/runtimes/healthz.js +0 -44
  133. package/lib/api/runtimes/index.d.ts +0 -12
  134. package/lib/api/runtimes/index.js +0 -16
  135. package/lib/api/runtimes/runtimes.d.ts +0 -138
  136. package/lib/api/runtimes/runtimes.js +0 -230
  137. package/lib/api/runtimes/snapshots.d.ts +0 -38
  138. package/lib/api/runtimes/snapshots.js +0 -82
  139. package/lib/api/spacer/documents.d.ts +0 -12
  140. package/lib/api/spacer/documents.js +0 -43
  141. package/lib/api/spacer/healthz.d.ts +0 -15
  142. package/lib/api/spacer/healthz.js +0 -44
  143. package/lib/api/spacer/index.d.ts +0 -15
  144. package/lib/api/spacer/index.js +0 -19
  145. package/lib/api/spacer/items.d.ts +0 -25
  146. package/lib/api/spacer/items.js +0 -55
  147. package/lib/api/spacer/lexicals.d.ts +0 -34
  148. package/lib/api/spacer/lexicals.js +0 -89
  149. package/lib/api/spacer/notebooks.d.ts +0 -34
  150. package/lib/api/spacer/notebooks.js +0 -89
  151. package/lib/api/spacer/spaces.d.ts +0 -84
  152. package/lib/api/spacer/spaces.js +0 -170
  153. package/lib/api/spacer/users.d.ts +0 -9
  154. package/lib/api/spacer/users.js +0 -29
  155. package/lib/client/mixins/RuntimesMixin.d.ts +0 -93
  156. package/lib/client/mixins/RuntimesMixin.js +0 -229
  157. package/lib/client/mixins/SpacerMixin.d.ts +0 -210
  158. package/lib/client/mixins/SpacerMixin.js +0 -615
  159. package/lib/client/utils/spacerUtils.d.ts +0 -18
  160. package/lib/client/utils/spacerUtils.js +0 -32
  161. package/lib/collaboration/DatalayerCollaboration.d.ts +0 -13
  162. package/lib/collaboration/DatalayerCollaboration.js +0 -28
  163. package/lib/collaboration/DatalayerCollaborationProvider.d.ts +0 -60
  164. package/lib/collaboration/DatalayerCollaborationProvider.js +0 -163
  165. package/lib/collaboration/index.d.ts +0 -2
  166. package/lib/collaboration/index.js +0 -6
  167. package/lib/components/context/SpaceSelect.d.ts +0 -2
  168. package/lib/components/context/SpaceSelect.js +0 -42
  169. package/lib/components/flashes/FlashDisclaimer.d.ts +0 -2
  170. package/lib/components/flashes/FlashDisclaimer.js +0 -17
  171. package/lib/components/icons/ArtifactIcon.d.ts +0 -10
  172. package/lib/components/icons/ArtifactIcon.js +0 -58
  173. package/lib/components/icons/index.d.ts +0 -1
  174. package/lib/components/icons/index.js +0 -5
  175. package/lib/components/nbgrader/NbGradesDetails.d.ts +0 -5
  176. package/lib/components/nbgrader/NbGradesDetails.js +0 -14
  177. package/lib/components/nbgrader/index.d.ts +0 -1
  178. package/lib/components/nbgrader/index.js +0 -5
  179. package/lib/components/progress/CreditsIndicator.d.ts +0 -33
  180. package/lib/components/progress/CreditsIndicator.js +0 -23
  181. package/lib/components/runtimes/RuntimeCellVariables.d.ts +0 -39
  182. package/lib/components/runtimes/RuntimeCellVariables.js +0 -172
  183. package/lib/components/runtimes/RuntimeCellVariablesDialog.d.ts +0 -37
  184. package/lib/components/runtimes/RuntimeCellVariablesDialog.js +0 -101
  185. package/lib/components/runtimes/RuntimeLauncherDialog.d.ts +0 -57
  186. package/lib/components/runtimes/RuntimeLauncherDialog.js +0 -275
  187. package/lib/components/runtimes/RuntimePickerBase.d.ts +0 -69
  188. package/lib/components/runtimes/RuntimePickerBase.js +0 -122
  189. package/lib/components/runtimes/RuntimePickerCell.d.ts +0 -34
  190. package/lib/components/runtimes/RuntimePickerCell.js +0 -104
  191. package/lib/components/runtimes/RuntimePickerNotebook.d.ts +0 -42
  192. package/lib/components/runtimes/RuntimePickerNotebook.js +0 -232
  193. package/lib/components/runtimes/RuntimeReservationControl.d.ts +0 -47
  194. package/lib/components/runtimes/RuntimeReservationControl.js +0 -42
  195. package/lib/components/runtimes/RuntimeSimplePicker.d.ts +0 -38
  196. package/lib/components/runtimes/RuntimeSimplePicker.js +0 -155
  197. package/lib/components/runtimes/RuntimeTransfer.d.ts +0 -16
  198. package/lib/components/runtimes/RuntimeTransfer.js +0 -5
  199. package/lib/components/runtimes/RuntimeUtils.d.ts +0 -17
  200. package/lib/components/runtimes/RuntimeUtils.js +0 -178
  201. package/lib/components/runtimes/RuntimeVariables.d.ts +0 -38
  202. package/lib/components/runtimes/RuntimeVariables.js +0 -75
  203. package/lib/components/runtimes/index.d.ts +0 -11
  204. package/lib/components/runtimes/index.js +0 -15
  205. package/lib/components/snapshots/SandboxSnapshotMenu.d.ts +0 -33
  206. package/lib/components/snapshots/SandboxSnapshotMenu.js +0 -169
  207. package/lib/components/snapshots/index.d.ts +0 -1
  208. package/lib/components/snapshots/index.js +0 -5
  209. package/lib/components/snippets/SnippetDialog.d.ts +0 -42
  210. package/lib/components/snippets/SnippetDialog.js +0 -42
  211. package/lib/components/students/StudentItemStatus.d.ts +0 -7
  212. package/lib/components/students/StudentItemStatus.js +0 -66
  213. package/lib/components/tokens/SpaceVariantToken.d.ts +0 -5
  214. package/lib/components/tokens/SpaceVariantToken.js +0 -23
  215. package/lib/components/toolbars/AssignmentEditorToolbar.d.ts +0 -4
  216. package/lib/components/toolbars/AssignmentEditorToolbar.js +0 -18
  217. package/lib/components/toolbars/DocumentEditorToolbar.d.ts +0 -2
  218. package/lib/components/toolbars/DocumentEditorToolbar.js +0 -12
  219. package/lib/components/toolbars/NotebookEditorToolbar.d.ts +0 -29
  220. package/lib/components/toolbars/NotebookEditorToolbar.js +0 -30
  221. package/lib/examples/CellExample.d.ts +0 -6
  222. package/lib/examples/CellExample.js +0 -20
  223. package/lib/examples/NotebookExample.d.ts +0 -6
  224. package/lib/examples/NotebookExample.js +0 -19
  225. package/lib/examples/lexical-theme.css +0 -436
  226. package/lib/examples/notebooks/IPyWidgetsExample.ipynb.json +0 -101
  227. package/lib/examples/notebooks/IPyWidgetsExampleWithState.ipynb.json +0 -112
  228. package/lib/examples/notebooks/Lite.ipynb.json +0 -128
  229. package/lib/examples/notebooks/Matplotlib.ipynb.json +0 -137
  230. package/lib/examples/notebooks/NotebookExample1.ipynb.json +0 -126
  231. package/lib/examples/notebooks/NotebookExample2.ipynb.json +0 -48
  232. package/lib/examples/notebooks/NotebookOutputs.ipynb.json +0 -49
  233. package/lib/examples/notebooks/NotebookToCExample.ipynb.json +0 -102
  234. package/lib/examples/notebooks/PyGWalker.ipynb.json +0 -55
  235. package/lib/hooks/useCellOutputshot.d.ts +0 -4
  236. package/lib/hooks/useCellOutputshot.js +0 -25
  237. package/lib/hooks/useProjects.d.ts +0 -628
  238. package/lib/hooks/useProjects.js +0 -190
  239. package/lib/hooks/useRuntimes.d.ts +0 -5
  240. package/lib/hooks/useRuntimes.js +0 -34
  241. package/lib/mocks/models/CourseMock.d.ts +0 -6
  242. package/lib/mocks/models/CourseMock.js +0 -29
  243. package/lib/mocks/models/SpaceMock.d.ts +0 -6
  244. package/lib/mocks/models/SpaceMock.js +0 -25
  245. package/lib/models/Assignment.d.ts +0 -7
  246. package/lib/models/Assignment.js +0 -5
  247. package/lib/models/Cell.d.ts +0 -8
  248. package/lib/models/Cell.js +0 -5
  249. package/lib/models/CodeBlock.d.ts +0 -10
  250. package/lib/models/CodeBlock.js +0 -5
  251. package/lib/models/CodeSandboxSnapshot.d.ts +0 -92
  252. package/lib/models/CodeSandboxSnapshot.js +0 -13
  253. package/lib/models/CodeSandboxSnapshotDTO.d.ts +0 -173
  254. package/lib/models/CodeSandboxSnapshotDTO.js +0 -139
  255. package/lib/models/CodefeedBlocks.d.ts +0 -7
  256. package/lib/models/CodefeedBlocks.js +0 -5
  257. package/lib/models/Content.d.ts +0 -5
  258. package/lib/models/Content.js +0 -5
  259. package/lib/models/Course.d.ts +0 -17
  260. package/lib/models/Course.js +0 -5
  261. package/lib/models/Dataset.d.ts +0 -16
  262. package/lib/models/Dataset.js +0 -5
  263. package/lib/models/Document.d.ts +0 -8
  264. package/lib/models/Document.js +0 -5
  265. package/lib/models/Environment.d.ts +0 -86
  266. package/lib/models/Environment.js +0 -5
  267. package/lib/models/EnvironmentDTO.d.ts +0 -125
  268. package/lib/models/EnvironmentDTO.js +0 -88
  269. package/lib/models/Exercise.d.ts +0 -16
  270. package/lib/models/Exercise.js +0 -5
  271. package/lib/models/Item.d.ts +0 -20
  272. package/lib/models/Item.js +0 -5
  273. package/lib/models/ItemDTO.d.ts +0 -74
  274. package/lib/models/ItemDTO.js +0 -186
  275. package/lib/models/ItemType.d.ts +0 -2
  276. package/lib/models/ItemType.js +0 -5
  277. package/lib/models/Lesson.d.ts +0 -5
  278. package/lib/models/Lesson.js +0 -5
  279. package/lib/models/LexicalDTO.d.ts +0 -155
  280. package/lib/models/LexicalDTO.js +0 -157
  281. package/lib/models/Library.d.ts +0 -10
  282. package/lib/models/Library.js +0 -5
  283. package/lib/models/Notebook.d.ts +0 -11
  284. package/lib/models/Notebook.js +0 -5
  285. package/lib/models/NotebookDTO.d.ts +0 -96
  286. package/lib/models/NotebookDTO.js +0 -153
  287. package/lib/models/Page.d.ts +0 -41
  288. package/lib/models/Page.js +0 -25
  289. package/lib/models/PageTag.d.ts +0 -19
  290. package/lib/models/PageTag.js +0 -94
  291. package/lib/models/ProjectDTO.d.ts +0 -89
  292. package/lib/models/ProjectDTO.js +0 -131
  293. package/lib/models/Runtime.d.ts +0 -123
  294. package/lib/models/Runtime.js +0 -18
  295. package/lib/models/RuntimeDTO.d.ts +0 -191
  296. package/lib/models/RuntimeDTO.js +0 -204
  297. package/lib/models/Space.d.ts +0 -35
  298. package/lib/models/Space.js +0 -66
  299. package/lib/models/SpaceDTO.d.ts +0 -334
  300. package/lib/models/SpaceDTO.js +0 -244
  301. package/lib/models/SpaceItem.d.ts +0 -10
  302. package/lib/models/SpaceItem.js +0 -5
  303. package/lib/models/SpaceMember.d.ts +0 -6
  304. package/lib/models/SpaceMember.js +0 -5
  305. package/lib/models/StudentItem.d.ts +0 -21
  306. package/lib/models/StudentItem.js +0 -5
  307. package/lib/services/DatalayerServiceManager.d.ts +0 -22
  308. package/lib/services/DatalayerServiceManager.js +0 -69
  309. package/lib/services/index.d.ts +0 -4
  310. package/lib/services/index.js +0 -7
  311. package/lib/services/reconnectToRuntime.d.ts +0 -32
  312. package/lib/services/reconnectToRuntime.js +0 -59
  313. package/lib/state/substates/CellState.d.ts +0 -12
  314. package/lib/state/substates/CellState.js +0 -22
  315. package/lib/state/substates/DocumentState.d.ts +0 -10
  316. package/lib/state/substates/DocumentState.js +0 -14
  317. package/lib/state/substates/GradeState.d.ts +0 -10
  318. package/lib/state/substates/GradeState.js +0 -14
  319. package/lib/state/substates/JupyterLabState.d.ts +0 -16
  320. package/lib/state/substates/JupyterLabState.js +0 -17
  321. package/lib/state/substates/NbformatState.d.ts +0 -13
  322. package/lib/state/substates/NbformatState.js +0 -16
  323. package/lib/state/substates/RuntimesState.d.ts +0 -79
  324. package/lib/state/substates/RuntimesState.js +0 -180
  325. package/lib/state/substates/SpaceState.d.ts +0 -11
  326. package/lib/state/substates/SpaceState.js +0 -16
  327. package/lib/stateful/index.d.ts +0 -2
  328. package/lib/stateful/index.js +0 -6
  329. package/lib/stateful/jupyter/exec/Python.d.ts +0 -5
  330. package/lib/stateful/jupyter/exec/Python.js +0 -100
  331. package/lib/stateful/jupyter/exec/Snippets.d.ts +0 -105
  332. package/lib/stateful/jupyter/exec/Snippets.js +0 -101
  333. package/lib/stateful/jupyter/exec/index.d.ts +0 -2
  334. package/lib/stateful/jupyter/exec/index.js +0 -6
  335. package/lib/stateful/jupyter/index.d.ts +0 -2
  336. package/lib/stateful/jupyter/index.js +0 -6
  337. package/lib/stateful/jupyter/kernelsHandler.d.ts +0 -8
  338. package/lib/stateful/jupyter/kernelsHandler.js +0 -39
  339. package/lib/stateful/runtimes/actions.d.ts +0 -102
  340. package/lib/stateful/runtimes/actions.js +0 -249
  341. package/lib/stateful/runtimes/apis.d.ts +0 -273
  342. package/lib/stateful/runtimes/apis.js +0 -5
  343. package/lib/stateful/runtimes/index.d.ts +0 -5
  344. package/lib/stateful/runtimes/index.js +0 -9
  345. package/lib/stateful/runtimes/settings.d.ts +0 -15
  346. package/lib/stateful/runtimes/settings.js +0 -31
  347. package/lib/stateful/runtimes/snapshots.d.ts +0 -25
  348. package/lib/stateful/runtimes/snapshots.js +0 -150
  349. package/lib/stateful/runtimes/utils.d.ts +0 -7
  350. package/lib/stateful/runtimes/utils.js +0 -14
  351. package/lib/utils/Cells.d.ts +0 -2
  352. package/lib/utils/Cells.js +0 -28
  353. package/lib/views/iam-tokens/IAMTokenEdit.d.ts +0 -6
  354. package/lib/views/iam-tokens/IAMTokenNew.d.ts +0 -8
  355. package/lib/views/iam-tokens/IAMTokenNew.js +0 -118
  356. package/lib/views/iam-tokens/IAMTokens.d.ts +0 -12
  357. package/lib/views/iam-tokens/IAMTokens.js +0 -87
  358. package/lib/views/iam-tokens/Tokens.d.ts +0 -2
  359. package/lib/views/iam-tokens/Tokens.js +0 -85
  360. package/lib/views/iam-tokens/index.d.ts +0 -3
  361. package/lib/views/iam-tokens/index.js +0 -7
  362. /package/lib/{mocks/jupyter/index.d.ts → cli-login.d.ts} +0 -0
  363. /package/lib/utils/{logger.d.ts → Logger.d.ts} +0 -0
  364. /package/lib/utils/{logger.js → Logger.js} +0 -0
@@ -0,0 +1,143 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /*
3
+ * Copyright (c) 2023-2025 Datalayer, Inc.
4
+ * Distributed under the terms of the Modified BSD License.
5
+ */
6
+ import { useEffect, useState } from 'react';
7
+ import { PageHeader, FormControl, Button, TextInput, Textarea, Select, Text, IconButton, } from '@primer/react';
8
+ import { Box } from '@datalayer/primer-addons';
9
+ import { CopyIcon } from '@primer/octicons-react';
10
+ import { Calendar, defaultCalendarStrings } from '@fluentui/react';
11
+ import { useCache, useNavigate, useToast } from '../../hooks/index.js';
12
+ import { useRunStore } from '../../state/index.js';
13
+ export const APIKeyNew = ({ apiKeysListRoute = '/settings/iam/api-keys', showTitle = true, } = {}) => {
14
+ const runStore = useRunStore();
15
+ const { useCreateToken: useCreateAPIKey } = useCache();
16
+ const createAPIKeyMutation = useCreateAPIKey();
17
+ const navigate = useNavigate();
18
+ const { enqueueToast } = useToast();
19
+ const [today, _] = useState(new Date());
20
+ const [showAPIKey, setShowAPIKey] = useState(false);
21
+ const [apiKey, setAPIKey] = useState();
22
+ const [formValues, setFormValues] = useState({
23
+ variant: 'secret',
24
+ name: undefined,
25
+ description: undefined,
26
+ expirationDate: undefined,
27
+ });
28
+ const [validationResult, setValidationResult] = useState({
29
+ variant: undefined,
30
+ name: undefined,
31
+ description: undefined,
32
+ expirationDate: undefined,
33
+ });
34
+ const valueVariantChange = (event) => {
35
+ setFormValues(prevFormValues => ({
36
+ ...prevFormValues,
37
+ variant: event.target.value,
38
+ }));
39
+ };
40
+ const valueNameChange = (event) => {
41
+ setFormValues(prevFormValues => ({
42
+ ...prevFormValues,
43
+ name: event.target.value,
44
+ }));
45
+ };
46
+ const valueDescriptionChange = (event) => {
47
+ setFormValues(prevFormValues => ({
48
+ ...prevFormValues,
49
+ description: event.target.value,
50
+ }));
51
+ };
52
+ const expirationDateChange = (expirationDate) => {
53
+ setFormValues(prevFormValues => ({
54
+ ...prevFormValues,
55
+ expirationDate,
56
+ }));
57
+ };
58
+ useEffect(() => {
59
+ setValidationResult({
60
+ ...validationResult,
61
+ name: formValues.name === undefined
62
+ ? undefined
63
+ : formValues.name.length > 2
64
+ ? true
65
+ : false,
66
+ description: formValues.description === undefined
67
+ ? undefined
68
+ : formValues.description.length > 2
69
+ ? true
70
+ : false,
71
+ expirationDate: formValues.expirationDate === undefined
72
+ ? undefined
73
+ : formValues.expirationDate.getTime() > today.getTime()
74
+ ? true
75
+ : false,
76
+ });
77
+ }, [formValues]);
78
+ const submitAPIKey = () => {
79
+ runStore.layout().showBackdrop('Creating an API key...');
80
+ createAPIKeyMutation.mutate({
81
+ name: formValues.name,
82
+ variant: formValues.variant,
83
+ description: formValues.description,
84
+ expirationDate: formValues.expirationDate,
85
+ }, {
86
+ onSuccess: (resp) => {
87
+ if (resp.success && resp.token) {
88
+ enqueueToast(resp.message, { variant: 'success' });
89
+ setAPIKey(resp.token);
90
+ setShowAPIKey(true);
91
+ }
92
+ },
93
+ onSettled: () => {
94
+ runStore.layout().hideBackdrop();
95
+ },
96
+ });
97
+ };
98
+ return (_jsx(Box, { children: showAPIKey ? (_jsxs(_Fragment, { children: [_jsx(PageHeader, { children: _jsx(PageHeader.TitleArea, { variant: "large", children: _jsx(PageHeader.Title, { children: "Your API Key Is Created" }) }) }), _jsxs(Box, { sx: {
99
+ border: '1px solid',
100
+ borderColor: 'accent.muted',
101
+ borderRadius: 2,
102
+ p: 3,
103
+ bg: 'canvas.subtle',
104
+ mb: 3,
105
+ }, children: [_jsx(Text, { sx: { fontWeight: 600, color: 'accent.fg' }, children: "Important" }), _jsx(Text, { as: "p", sx: { mt: 1, color: 'fg.muted' }, children: "Save this API key now. You will not be able to see the full value again after leaving this page." })] }), _jsxs(Box, { sx: {
106
+ border: '1px solid',
107
+ borderColor: 'border.default',
108
+ borderRadius: 2,
109
+ p: 3,
110
+ bg: 'canvas.default',
111
+ }, children: [_jsxs(Box, { display: "grid", gridTemplateColumns: "minmax(120px, 180px) 1fr", sx: { rowGap: 2, columnGap: 3, mb: 3 }, children: [_jsx(Text, { sx: { color: 'fg.muted' }, children: "Name" }), _jsx(Text, { sx: { fontWeight: 600 }, children: apiKey?.name || '-' }), _jsx(Text, { sx: { color: 'fg.muted' }, children: "Description" }), _jsx(Text, { children: apiKey?.description || '-' }), _jsx(Text, { sx: { color: 'fg.muted' }, children: "Expiration date" }), _jsx(Text, { children: apiKey?.expirationDate
112
+ ? `${apiKey.expirationDate.toLocaleString()} (${apiKey.expirationDate.toISOString()})`
113
+ : '-' })] }), _jsx(Text, { sx: { color: 'fg.muted', mb: 2 }, children: "API key value" }), _jsxs(Box, { display: "flex", sx: {
114
+ alignItems: 'flex-start',
115
+ gap: 2,
116
+ }, children: [_jsx(Text, { as: "code", sx: {
117
+ color: 'fg.default',
118
+ bg: 'canvas.inset',
119
+ border: '1px solid',
120
+ borderColor: 'border.default',
121
+ borderRadius: 2,
122
+ p: 2,
123
+ overflowWrap: 'anywhere',
124
+ fontSize: 0,
125
+ lineHeight: '20px',
126
+ flex: 1,
127
+ maxHeight: 140,
128
+ overflowY: 'auto',
129
+ }, children: apiKey?.value }), _jsx(IconButton, { "aria-label": "Copy API key to clipboard", icon: CopyIcon, size: "small", onClick: () => {
130
+ if (apiKey?.value) {
131
+ navigator.clipboard.writeText(apiKey.value);
132
+ enqueueToast('API key copied to clipboard', {
133
+ variant: 'success',
134
+ });
135
+ }
136
+ } })] })] }), _jsx(Box, { mt: 3, children: _jsx(Button, { onClick: e => navigate(apiKeysListRoute, e), children: "List my API Keys" }) })] })) : (_jsxs(_Fragment, { children: [showTitle ? (_jsx(PageHeader, { children: _jsx(PageHeader.TitleArea, { variant: "large", children: _jsx(PageHeader.Title, { children: "New API Key" }) }) })) : null, _jsx(Box, { display: "grid", gridTemplateColumns: "1fr 1fr", sx: { gap: 3 }, children: _jsx(Box, { children: _jsxs(Box, { sx: { label: { marginTop: 2 } }, children: [_jsxs(FormControl, { required: true, children: [_jsx(FormControl.Label, { children: "Type" }), _jsxs(Select, { name: "type", value: formValues.variant, onChange: valueVariantChange, children: [_jsx(Select.Option, { value: "secret", children: "Secret" }), _jsx(Select.Option, { value: "publishable", disabled: true, children: "Publishable (coming soon)" }), _jsx(Select.Option, { value: "restricted", disabled: true, children: "Restricted (coming soon)" }), _jsx(Select.Option, { value: "temporary", disabled: true, children: "Temporary (coming soon)" })] }), _jsx(FormControl.Caption, { children: "Secret is currently available. Additional API key types are coming soon." })] }), _jsxs(FormControl, { required: true, children: [_jsx(FormControl.Label, { children: "Name" }), _jsx(TextInput, { block: true, value: formValues.name, onChange: valueNameChange, autoFocus: true }), _jsx(FormControl.Caption, { children: "Hint: The token name is a short name that identifies in a unique way your token." }), validationResult.name === false && (_jsx(FormControl.Validation, { variant: "error", children: "Name length must be between 2 and 32 characters." }))] }), _jsxs(FormControl, { required: true, children: [_jsx(FormControl.Label, { children: "Expiration day" }), _jsx(Calendar, { showGoToToday: true, onSelectDate: expirationDateChange, value: formValues.expirationDate, strings: defaultCalendarStrings }), validationResult.expirationDate !== true ? (_jsx(FormControl.Validation, { variant: "error", children: "Pick an expiration date in the future." })) : (_jsxs(FormControl.Validation, { variant: "success", children: ["Expiration date:", ' ', formValues.expirationDate?.toLocaleDateString(), "."] }))] }), _jsxs(FormControl, { required: true, children: [_jsx(FormControl.Label, { children: "Description" }), _jsx(Textarea, { block: true, value: formValues.description, onChange: valueDescriptionChange }), validationResult.description === false && (_jsx(FormControl.Validation, { variant: "error", children: "Description must have more than 2 characters." }))] }), _jsx(Button, { variant: "primary", disabled: !validationResult.name ||
137
+ !validationResult.description ||
138
+ !validationResult.expirationDate, sx: { marginTop: 2 }, onClick: e => {
139
+ e.preventDefault();
140
+ submitAPIKey();
141
+ }, children: "Create an API key" })] }) }) })] })) }));
142
+ };
143
+ export default APIKeyNew;
@@ -0,0 +1,12 @@
1
+ export type APIKeysProps = {
2
+ /** Route to navigate when clicking "New API Key" button. Defaults to '/new/api-key'. */
3
+ newAPIKeyRoute?: string;
4
+ /** Base route for the API keys list (used for edit navigation). Defaults to current relative path. */
5
+ apiKeysListRoute?: string;
6
+ /** Whether to display view titles/headings. Defaults to true. */
7
+ showTitle?: boolean;
8
+ /** Whether to render the "New API Key" button in this component header. Defaults to true. */
9
+ showNewButton?: boolean;
10
+ };
11
+ export declare const APIKeys: ({ newAPIKeyRoute, apiKeysListRoute, showTitle, showNewButton, }?: APIKeysProps) => import("react/jsx-runtime").JSX.Element;
12
+ export default APIKeys;
@@ -0,0 +1,128 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /*
3
+ * Copyright (c) 2023-2025 Datalayer, Inc.
4
+ * Distributed under the terms of the Modified BSD License.
5
+ */
6
+ import { useState, useEffect, useRef } from 'react';
7
+ import { PageLayout, Button, IconButton, Spinner, TextInput, Text, Label, RelativeTime, } from '@primer/react';
8
+ import { Blankslate, Dialog, PageHeader, Table, DataTable, } from '@primer/react/experimental';
9
+ import { Box } from '@datalayer/primer-addons';
10
+ import { EditIcon } from '@datalayer/icons-react';
11
+ import { TrashIcon } from '@primer/octicons-react';
12
+ import { useCache, useNavigate, useToast } from '../../hooks/index.js';
13
+ const APIKeysTable = ({ apiKeysListRoute, showTitle = true, }) => {
14
+ const { useTokens: useAPIKeys, useDeleteToken: useDeleteAPIKey } = useCache();
15
+ const { enqueueToast } = useToast();
16
+ const getAPIKeysQuery = useAPIKeys();
17
+ const deleteAPIKeyMutation = useDeleteAPIKey();
18
+ const navigate = useNavigate();
19
+ const [apiKeys, setApiKeys] = useState([]);
20
+ const [deletingAPIKey, setDeletingAPIKey] = useState(null);
21
+ const [deleteNameConfirm, setDeleteNameConfirm] = useState('');
22
+ const returnFocusRef = useRef(null);
23
+ const showInitialSpinner = apiKeys.length === 0
24
+ && (getAPIKeysQuery.isLoading
25
+ || getAPIKeysQuery.isFetching
26
+ || !Array.isArray(getAPIKeysQuery.data));
27
+ useEffect(() => {
28
+ if (getAPIKeysQuery.data) {
29
+ const normalized = getAPIKeysQuery.data.filter((apiKey) => Boolean(apiKey));
30
+ setApiKeys(normalized);
31
+ }
32
+ }, [getAPIKeysQuery.data]);
33
+ const confirmDeleteAPIKey = () => {
34
+ if (!deletingAPIKey)
35
+ return;
36
+ if (deleteNameConfirm.trim() !== deletingAPIKey.name) {
37
+ enqueueToast('Please type the API key name exactly to confirm deletion.', {
38
+ variant: 'error',
39
+ });
40
+ return;
41
+ }
42
+ deleteAPIKeyMutation.mutate(deletingAPIKey.id, {
43
+ onSuccess: (resp) => {
44
+ if (resp?.success) {
45
+ enqueueToast(`API key "${deletingAPIKey.name}" deleted.`, {
46
+ variant: 'success',
47
+ });
48
+ }
49
+ else {
50
+ enqueueToast(resp?.message || 'Failed to delete API key.', {
51
+ variant: 'error',
52
+ });
53
+ }
54
+ },
55
+ onError: () => {
56
+ enqueueToast('Failed to delete API key.', { variant: 'error' });
57
+ },
58
+ onSettled: () => {
59
+ setDeletingAPIKey(null);
60
+ setDeleteNameConfirm('');
61
+ },
62
+ });
63
+ };
64
+ return apiKeys.length === 0 ? (_jsx(Blankslate, { border: true, spacious: true, children: showInitialSpinner ? (_jsx(Box, { sx: {
65
+ display: 'flex',
66
+ alignItems: 'center',
67
+ justifyContent: 'center',
68
+ minHeight: '40px',
69
+ }, children: _jsx(Spinner, {}) })) : (_jsxs(_Fragment, { children: [showTitle && _jsx(Blankslate.Heading, { children: "API Keys" }), _jsx(Blankslate.Description, { children: _jsx(Text, { sx: { textAlign: 'center' }, children: "No API Keys found." }) })] })) })) : (_jsxs(_Fragment, { children: [_jsxs(Table.Container, { children: [showTitle && (_jsxs(_Fragment, { children: [_jsx(Table.Title, { as: "h2", id: "api-keys", children: "API Keys" }), _jsx(Table.Subtitle, { as: "p", id: "api-keys-subtitle", children: "Your API keys." })] })), _jsx(DataTable, { "aria-labelledby": "api-keys", "aria-describedby": "api-keys-subtitle", data: apiKeys, columns: [
70
+ {
71
+ header: 'Type',
72
+ field: 'variant',
73
+ renderCell: apiKey => _jsx(Label, { children: apiKey.variant }),
74
+ },
75
+ {
76
+ header: 'Name',
77
+ field: 'name',
78
+ rowHeader: true,
79
+ },
80
+ {
81
+ header: 'Description',
82
+ field: 'description',
83
+ },
84
+ {
85
+ header: 'Expiration date',
86
+ field: 'expirationDate',
87
+ renderCell: apiKey => (_jsx(RelativeTime, { date: new Date(apiKey.expirationDate) })),
88
+ },
89
+ {
90
+ header: '',
91
+ field: 'id',
92
+ renderCell: apiKey => (_jsxs(Box, { display: "flex", sx: { gap: 1 }, children: [_jsx(IconButton, { icon: EditIcon, "aria-label": "Edit", size: "small", variant: "invisible", onClick: e => navigate(apiKeysListRoute
93
+ ? `${apiKeysListRoute}/${apiKey.id}`
94
+ : `${apiKey.id}`, e) }), _jsx(IconButton, { ref: returnFocusRef, icon: TrashIcon, "aria-label": "Delete", size: "small", variant: "invisible", sx: { color: 'danger.fg' }, onClick: () => {
95
+ setDeletingAPIKey(apiKey);
96
+ setDeleteNameConfirm('');
97
+ } })] })),
98
+ },
99
+ ] })] }), deletingAPIKey && (_jsxs(Dialog, { title: "Delete API key", onClose: () => {
100
+ setDeletingAPIKey(null);
101
+ setDeleteNameConfirm('');
102
+ }, footerButtons: [
103
+ {
104
+ buttonType: 'default',
105
+ content: 'Cancel',
106
+ onClick: () => {
107
+ setDeletingAPIKey(null);
108
+ setDeleteNameConfirm('');
109
+ },
110
+ },
111
+ {
112
+ buttonType: 'danger',
113
+ content: 'Delete',
114
+ disabled: deleteNameConfirm.trim() !== deletingAPIKey.name,
115
+ onClick: event => {
116
+ if (!event.defaultPrevented) {
117
+ event.preventDefault();
118
+ confirmDeleteAPIKey();
119
+ }
120
+ },
121
+ },
122
+ ], children: ["Are you sure you want to delete the API key", ' ', _jsx("strong", { children: deletingAPIKey.name }), "? This action cannot be undone.", _jsxs(Text, { sx: { mt: 3, display: 'block', color: 'fg.muted' }, children: ["Type ", _jsx("strong", { children: deletingAPIKey.name }), " to confirm deletion."] }), _jsx(TextInput, { block: true, value: deleteNameConfirm, onChange: e => setDeleteNameConfirm(e.target.value), placeholder: "Retype API key name", sx: { mt: 2 }, autoFocus: true })] }))] }));
123
+ };
124
+ export const APIKeys = ({ newAPIKeyRoute = '/new/api-key', apiKeysListRoute, showTitle = true, showNewButton = true, } = {}) => {
125
+ const navigate = useNavigate();
126
+ return (_jsxs(PageLayout, { containerWidth: "full", padding: "normal", style: { overflow: 'visible', minHeight: 'calc(100vh - 45px)' }, children: [showTitle || showNewButton ? (_jsx(PageLayout.Header, { children: _jsxs(PageHeader, { children: [showTitle && (_jsx(PageHeader.TitleArea, { variant: "large", children: _jsx(PageHeader.Title, { children: "API Keys" }) })), showNewButton && (_jsx(PageHeader.Actions, { children: _jsx(Button, { size: "small", variant: "primary", onClick: e => navigate(newAPIKeyRoute, e), children: "New API Key" }) }))] }) })) : null, _jsx(PageLayout.Content, { children: _jsx(Box, { children: _jsx(APIKeysTable, { apiKeysListRoute: apiKeysListRoute, showTitle: showTitle }) }) })] }));
127
+ };
128
+ export default APIKeys;
@@ -0,0 +1,2 @@
1
+ export declare const APIKeysStandalone: () => import("react/jsx-runtime").JSX.Element;
2
+ export default APIKeysStandalone;
@@ -0,0 +1,117 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /*
3
+ * Copyright (c) 2023-2025 Datalayer, Inc.
4
+ * Distributed under the terms of the Modified BSD License.
5
+ */
6
+ import { useState, useEffect, useRef } from 'react';
7
+ import { PageLayout, Button, IconButton, TextInput, Text, Label, RelativeTime, } from '@primer/react';
8
+ import { Blankslate, Dialog, PageHeader, Table, DataTable, } from '@primer/react/experimental';
9
+ import { Box } from '@datalayer/primer-addons';
10
+ import { EditIcon } from '@datalayer/icons-react';
11
+ import { TrashIcon } from '@primer/octicons-react';
12
+ import { useCache, useNavigate, useToast } from '../../hooks/index.js';
13
+ const APIKeysTable = () => {
14
+ const { useTokens: useAPIKeys, useDeleteToken: useDeleteAPIKey } = useCache();
15
+ const { enqueueToast } = useToast();
16
+ const getAPIKeysQuery = useAPIKeys();
17
+ const deleteAPIKeyMutation = useDeleteAPIKey();
18
+ const navigate = useNavigate();
19
+ const [apiKeys, setApiKeys] = useState([]);
20
+ const [deletingAPIKey, setDeletingAPIKey] = useState(null);
21
+ const [deleteNameConfirm, setDeleteNameConfirm] = useState('');
22
+ const returnFocusRef = useRef(null);
23
+ useEffect(() => {
24
+ if (getAPIKeysQuery.data) {
25
+ const normalized = getAPIKeysQuery.data.filter((apiKey) => Boolean(apiKey));
26
+ setApiKeys(normalized);
27
+ }
28
+ }, [getAPIKeysQuery.data]);
29
+ const confirmDeleteAPIKey = () => {
30
+ if (!deletingAPIKey)
31
+ return;
32
+ if (deleteNameConfirm.trim() !== deletingAPIKey.name) {
33
+ enqueueToast('Please type the API key name exactly to confirm deletion.', {
34
+ variant: 'error',
35
+ });
36
+ return;
37
+ }
38
+ deleteAPIKeyMutation.mutate(deletingAPIKey.id, {
39
+ onSuccess: (resp) => {
40
+ if (resp?.success) {
41
+ enqueueToast(`API key "${deletingAPIKey.name}" deleted.`, {
42
+ variant: 'success',
43
+ });
44
+ }
45
+ else {
46
+ enqueueToast(resp?.message || 'Failed to delete API key.', {
47
+ variant: 'error',
48
+ });
49
+ }
50
+ },
51
+ onError: () => {
52
+ enqueueToast('Failed to delete API key.', { variant: 'error' });
53
+ },
54
+ onSettled: () => {
55
+ setDeletingAPIKey(null);
56
+ setDeleteNameConfirm('');
57
+ },
58
+ });
59
+ };
60
+ return apiKeys.length === 0 ? (_jsxs(Blankslate, { border: true, spacious: true, children: [_jsx(Blankslate.Heading, { children: "API Keys" }), _jsx(Blankslate.Description, { children: _jsx(Text, { sx: { textAlign: 'center' }, children: "No API Keys found." }) })] })) : (_jsxs(_Fragment, { children: [_jsxs(Table.Container, { children: [_jsx(Table.Title, { as: "h2", id: "api-keys", children: "API Keys" }), _jsx(Table.Subtitle, { as: "p", id: "api-keys-subtitle", children: "Your API keys." }), _jsx(DataTable, { "aria-labelledby": "api-keys", "aria-describedby": "api-keys-subtitle", data: apiKeys, columns: [
61
+ {
62
+ header: 'Type',
63
+ field: 'variant',
64
+ renderCell: apiKey => _jsx(Label, { children: apiKey.variant }),
65
+ },
66
+ {
67
+ header: 'Name',
68
+ field: 'name',
69
+ rowHeader: true,
70
+ },
71
+ {
72
+ header: 'Description',
73
+ field: 'description',
74
+ },
75
+ {
76
+ header: 'Expiration date',
77
+ field: 'expirationDate',
78
+ renderCell: apiKey => (_jsx(RelativeTime, { date: new Date(apiKey.expirationDate) })),
79
+ },
80
+ {
81
+ header: '',
82
+ field: 'id',
83
+ renderCell: apiKey => (_jsxs(Box, { display: "flex", sx: { gap: 1 }, children: [_jsx(IconButton, { icon: EditIcon, "aria-label": "Edit", size: "small", variant: "invisible", onClick: e => navigate(`${apiKey.id}`, e) }), _jsx(IconButton, { ref: returnFocusRef, icon: TrashIcon, "aria-label": "Delete", size: "small", variant: "invisible", sx: { color: 'danger.fg' }, onClick: () => {
84
+ setDeletingAPIKey(apiKey);
85
+ setDeleteNameConfirm('');
86
+ } })] })),
87
+ },
88
+ ] })] }), deletingAPIKey && (_jsxs(Dialog, { title: "Delete API key", onClose: () => {
89
+ setDeletingAPIKey(null);
90
+ setDeleteNameConfirm('');
91
+ }, footerButtons: [
92
+ {
93
+ buttonType: 'default',
94
+ content: 'Cancel',
95
+ onClick: () => {
96
+ setDeletingAPIKey(null);
97
+ setDeleteNameConfirm('');
98
+ },
99
+ },
100
+ {
101
+ buttonType: 'danger',
102
+ content: 'Delete',
103
+ disabled: deleteNameConfirm.trim() !== deletingAPIKey.name,
104
+ onClick: event => {
105
+ if (!event.defaultPrevented) {
106
+ event.preventDefault();
107
+ confirmDeleteAPIKey();
108
+ }
109
+ },
110
+ },
111
+ ], children: ["Are you sure you want to delete the API key", ' ', _jsx("strong", { children: deletingAPIKey.name }), "? This action cannot be undone.", _jsxs(Text, { sx: { mt: 3, display: 'block', color: 'fg.muted' }, children: ["Type ", _jsx("strong", { children: deletingAPIKey.name }), " to confirm deletion."] }), _jsx(TextInput, { block: true, value: deleteNameConfirm, onChange: e => setDeleteNameConfirm(e.target.value), placeholder: "Retype API key name", sx: { mt: 2 }, autoFocus: true })] }))] }));
112
+ };
113
+ export const APIKeysStandalone = () => {
114
+ const navigate = useNavigate();
115
+ return (_jsxs(PageLayout, { containerWidth: "full", padding: "normal", style: { overflow: 'visible', minHeight: 'calc(100vh - 45px)' }, children: [_jsx(PageLayout.Header, { children: _jsxs(PageHeader, { children: [_jsx(PageHeader.TitleArea, { variant: "large", children: _jsx(PageHeader.Title, { children: "API Keys" }) }), _jsx(PageHeader.Actions, { children: _jsx(Button, { size: "small", variant: "primary", onClick: e => navigate('/api-keys/new', e), children: "New API key" }) })] }) }), _jsx(PageLayout.Content, { children: _jsx(Box, { children: _jsx(APIKeysTable, {}) }) })] }));
116
+ };
117
+ export default APIKeysStandalone;
@@ -0,0 +1,3 @@
1
+ export * from './APIKeyEdit';
2
+ export * from './APIKeyNew';
3
+ export * from './APIKeys';
@@ -1,5 +1,7 @@
1
- export {};
2
1
  /*
3
2
  * Copyright (c) 2023-2025 Datalayer, Inc.
4
3
  * Distributed under the terms of the Modified BSD License.
5
4
  */
5
+ export * from './APIKeyEdit.js';
6
+ export * from './APIKeyNew.js';
7
+ export * from './APIKeys.js';
@@ -2,7 +2,7 @@ export type DatasourceDetailProps = {
2
2
  /** Optional principal uid used to scope datasource reads/updates. */
3
3
  principalUid?: string;
4
4
  /** Optional principal kind used to scope datasource reads/updates. */
5
- principalKind?: 'user' | 'organization' | 'team';
5
+ principalKind?: 'personal' | 'organization' | 'team';
6
6
  };
7
7
  export declare const DatasourceDetail: ({ principalUid, principalKind, }?: DatasourceDetailProps) => import("react/jsx-runtime").JSX.Element;
8
8
  export default DatasourceDetail;
@@ -7,7 +7,7 @@ export type DatasourceNewProps = {
7
7
  /** Optional principal uid used to scope datasource creation. */
8
8
  principalUid?: string;
9
9
  /** Optional principal kind used to scope datasource creation. */
10
- principalKind?: 'user' | 'organization' | 'team';
10
+ principalKind?: 'personal' | 'organization' | 'team';
11
11
  /** Optional contextual principal summary rendered below the page intro. */
12
12
  accountPrincipal?: ReactNode;
13
13
  };
@@ -6,7 +6,7 @@ export type DatasourcesProps = {
6
6
  /** Optional principal uid used to scope datasource reads. */
7
7
  principalUid?: string;
8
8
  /** Optional principal kind used to scope datasource reads. */
9
- principalKind?: 'user' | 'organization' | 'team';
9
+ principalKind?: 'personal' | 'organization' | 'team';
10
10
  };
11
11
  export declare const Datasources: ({ newDatasourceRoute, datasourcesListRoute, principalUid, principalKind, }?: DatasourcesProps) => import("react/jsx-runtime").JSX.Element;
12
12
  export default Datasources;
@@ -1,10 +1,10 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  /*
3
3
  * Copyright (c) 2023-2025 Datalayer, Inc.
4
4
  * Distributed under the terms of the Modified BSD License.
5
5
  */
6
6
  import { useState, useEffect } from 'react';
7
- import { PageLayout, Button, IconButton, Text, Label, Heading, } from '@primer/react';
7
+ import { PageLayout, Button, IconButton, Spinner, Text, Label, Heading, } from '@primer/react';
8
8
  import { Blankslate, Table, DataTable } from '@primer/react/experimental';
9
9
  import { DatabaseIcon } from '@primer/octicons-react';
10
10
  import { Box } from '@datalayer/primer-addons';
@@ -15,12 +15,21 @@ const DatasourcesTable = ({ datasourcesListRoute, principalUid, principalKind, }
15
15
  const datasourcesQuery = useDatasources({ principalUid, principalKind });
16
16
  const navigate = useNavigate();
17
17
  const [datasources, setDatasources] = useState([]);
18
+ const showInitialSpinner = datasources.length === 0
19
+ && (datasourcesQuery.isLoading
20
+ || datasourcesQuery.isFetching
21
+ || !Array.isArray(datasourcesQuery.data));
18
22
  useEffect(() => {
19
23
  if (datasourcesQuery.data) {
20
24
  setDatasources(datasourcesQuery.data || []);
21
25
  }
22
26
  }, [datasourcesQuery.data]);
23
- return datasources.length === 0 ? (_jsxs(Blankslate, { border: true, spacious: true, children: [_jsx(Blankslate.Heading, { children: "Datasources" }), _jsx(Blankslate.Description, { children: _jsx(Text, { sx: { textAlign: 'center' }, children: "No Datasources found." }) })] })) : (_jsx(Table.Container, { children: _jsx(DataTable, { "aria-labelledby": "teams", "aria-describedby": "teams-subtitle", data: datasources, columns: [
27
+ return datasources.length === 0 ? (_jsx(Blankslate, { border: true, spacious: true, children: showInitialSpinner ? (_jsx(Box, { sx: {
28
+ display: 'flex',
29
+ alignItems: 'center',
30
+ justifyContent: 'center',
31
+ minHeight: '40px',
32
+ }, children: _jsx(Spinner, {}) })) : (_jsxs(_Fragment, { children: [_jsx(Blankslate.Heading, { children: "Datasources" }), _jsx(Blankslate.Description, { children: _jsx(Text, { sx: { textAlign: 'center' }, children: "No Datasources found." }) })] })) })) : (_jsx(Table.Container, { children: _jsx(DataTable, { "aria-labelledby": "teams", "aria-describedby": "teams-subtitle", data: datasources, columns: [
24
33
  // @ts-ignore
25
34
  {
26
35
  header: 'Type',
@@ -5,7 +5,7 @@
5
5
  * `{ handle, password }`, then calls `onSignIn(token, handle)` on
6
6
  * success so the caller can persist credentials as needed.
7
7
  *
8
- * @module views/signin
8
+ * @module views/iam
9
9
  */
10
10
  import React from 'react';
11
11
  export interface SignInSimpleProps {
@@ -25,19 +25,55 @@ export interface SignInSimpleProps {
25
25
  * `{ success: boolean; token?: string; message?: string }`.
26
26
  */
27
27
  loginUrl?: string;
28
+ /**
29
+ * Optional product/app name shown as heading.
30
+ */
31
+ name?: string;
28
32
  /**
29
33
  * Optional heading text. Defaults to `"Datalayer OTEL"`.
34
+ * @deprecated Use `name`.
30
35
  */
31
36
  title?: string;
32
37
  /**
33
38
  * Optional subtitle / description.
34
39
  */
35
40
  description?: string;
41
+ /**
42
+ * Optional icon element rendered next to the heading.
43
+ */
44
+ icon?: React.ReactNode;
36
45
  /**
37
46
  * Leading icon element rendered next to the title.
38
47
  * Defaults to `<TelescopeIcon size={24} />`.
48
+ * @deprecated Use `icon`.
39
49
  */
40
50
  leadingIcon?: React.ReactNode;
51
+ /**
52
+ * Show GitHub OAuth sign-in button.
53
+ */
54
+ github?: boolean;
55
+ /**
56
+ * Show Google OAuth sign-in button.
57
+ */
58
+ google?: boolean;
59
+ /**
60
+ * Show LinkedIn OAuth sign-in button.
61
+ */
62
+ linkedin?: boolean;
63
+ /**
64
+ * Show API key sign-in button.
65
+ */
66
+ apiKey?: boolean;
67
+ /**
68
+ * Show sign up button.
69
+ */
70
+ signUp?: boolean;
71
+ /**
72
+ * Optional target route to navigate to after social sign-in callback.
73
+ * - `undefined` keeps current behavior (use current route when not `/`).
74
+ * - `null`/empty disables forwarding any callback navigation target.
75
+ */
76
+ socialSignInNavigationTarget?: string | null;
41
77
  }
42
78
  export declare const SignInSimple: React.FC<SignInSimpleProps>;
43
79
  export default SignInSimple;