@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
@@ -4,7 +4,7 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
4
4
  * Distributed under the terms of the Modified BSD License.
5
5
  */
6
6
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
7
- import { KeyIcon, PersonIcon, OrganizationIcon, PeopleIcon, } from '@primer/octicons-react';
7
+ import { ChevronDownIcon, ChevronUpIcon, KeyIcon, PersonIcon, OrganizationIcon, PeopleIcon, } from '@primer/octicons-react';
8
8
  import { Box } from '@datalayer/primer-addons';
9
9
  import { ActionList, ActionMenu, Button, Dialog, Label, Spinner, Text, TextInput, } from '@primer/react';
10
10
  import { useToast } from '../../hooks/index.js';
@@ -16,7 +16,7 @@ import { PrincipalBadge } from '../principal/PrincipalBadge.js';
16
16
  // ---------------------------------------------------------------------------
17
17
  const ACCESS_LEVELS = ['view', 'update', 'execute'];
18
18
  const DEFAULT_PRINCIPAL_KINDS = [
19
- 'user',
19
+ 'personal',
20
20
  'team',
21
21
  'organization',
22
22
  ];
@@ -44,7 +44,7 @@ function normalizePrincipalKind(kindRaw) {
44
44
  if (kind === 'organization' || kind === 'org') {
45
45
  return 'organization';
46
46
  }
47
- return 'user';
47
+ return 'personal';
48
48
  }
49
49
  function toTitleCase(value) {
50
50
  if (!value) {
@@ -78,7 +78,30 @@ function ensurePrincipalDisplayName(kind, ...candidates) {
78
78
  return candidate.trim();
79
79
  }
80
80
  }
81
- return kind === 'organization' ? 'Organization' : 'Principal';
81
+ if (kind === 'organization') {
82
+ return 'Organization';
83
+ }
84
+ if (kind === 'team') {
85
+ return 'Team';
86
+ }
87
+ return 'Principal';
88
+ }
89
+ function formatPrincipalHandle(kind, handle, accountHandle) {
90
+ const normalizedHandle = String(handle || '').trim();
91
+ const normalizedAccountHandle = String(accountHandle || '').trim();
92
+ if (!normalizedHandle) {
93
+ return '';
94
+ }
95
+ if (kind === 'team') {
96
+ if (normalizedHandle.includes('/')) {
97
+ return `@${normalizedHandle}`;
98
+ }
99
+ if (normalizedAccountHandle) {
100
+ return `@${normalizedAccountHandle}/${normalizedHandle}`;
101
+ }
102
+ return `@${normalizedHandle}`;
103
+ }
104
+ return `@${normalizedHandle}`;
82
105
  }
83
106
  function isSharingAuthorizationMessage(message) {
84
107
  const normalized = (message || '').trim().toLowerCase();
@@ -139,7 +162,7 @@ function extractOwnerPrincipals(payload) {
139
162
  if (typeof entry === 'string') {
140
163
  const uid = entry.trim();
141
164
  return uid
142
- ? { kind: 'user', uid, handle: uid, displayName: uid }
165
+ ? { kind: 'personal', uid, handle: uid, displayName: uid }
143
166
  : null;
144
167
  }
145
168
  const uid = pickFirstString(entry?.uid, entry?.owner_uid, entry?.id);
@@ -169,7 +192,7 @@ function extractOwnerPrincipals(payload) {
169
192
  }
170
193
  const normalizedUid = uid.trim();
171
194
  return {
172
- kind: 'user',
195
+ kind: 'personal',
173
196
  uid: normalizedUid,
174
197
  handle: normalizedUid,
175
198
  displayName: normalizedUid,
@@ -201,7 +224,7 @@ function emptyAccessByLevel() {
201
224
  };
202
225
  }
203
226
  function bucketFor(kind) {
204
- return kind === 'user'
227
+ return kind === 'personal'
205
228
  ? 'userUids'
206
229
  : kind === 'team'
207
230
  ? 'teamUids'
@@ -255,7 +278,7 @@ function buildAclEntries(state, principalKinds) {
255
278
  }
256
279
  };
257
280
  for (const level of ACCESS_LEVELS) {
258
- state[level].userUids.forEach(uid => upsert('user', uid, level));
281
+ state[level].userUids.forEach(uid => upsert('personal', uid, level));
259
282
  state[level].teamUids.forEach(uid => upsert('team', uid, level));
260
283
  state[level].organizationUids.forEach(uid => upsert('organization', uid, level));
261
284
  }
@@ -315,11 +338,11 @@ function OwnerPrincipalRow({ ownerPrincipal, cache, showAvatarSkeleton = false,
315
338
  : '';
316
339
  const resolvedHandle = safeCachedHandle || safeOwnerHandle || ownerPrincipal.accountHandle;
317
340
  const resolvedAccountHandle = entry.accountHandle || ownerPrincipal.accountHandle;
318
- const resolvedDisplayName = ensurePrincipalDisplayName(ownerPrincipal.kind, ownerPrincipal.displayName, entry.displayName, resolvedHandle, ownerPrincipal.handle, ownerPrincipal.accountHandle, ownerPrincipal.uid);
341
+ const resolvedDisplayName = ensurePrincipalDisplayName(ownerPrincipal.kind, ownerPrincipal.displayName, entry.displayName, formatPrincipalHandle(ownerPrincipal.kind, resolvedHandle, resolvedAccountHandle), resolvedHandle, ownerPrincipal.handle, ownerPrincipal.accountHandle, ownerPrincipal.uid);
319
342
  const resolvedAvatarUrl = ownerPrincipal.avatarUrl || entry.avatarUrl;
320
343
  const resolvedOrigin = ownerPrincipal.origin ||
321
344
  entry.origin ||
322
- (ownerPrincipal.kind === 'user' ? 'Datalayer' : undefined);
345
+ (ownerPrincipal.kind === 'personal' ? 'Datalayer' : undefined);
323
346
  return (_jsx(Box, { sx: {
324
347
  display: 'inline-flex',
325
348
  alignItems: 'center',
@@ -333,14 +356,14 @@ function OwnerPrincipalRow({ ownerPrincipal, cache, showAvatarSkeleton = false,
333
356
  accountHandle: resolvedAccountHandle,
334
357
  avatarUrl: resolvedAvatarUrl,
335
358
  origin: resolvedOrigin,
336
- }, showPrincipalLabel: false, showApplyingToText: false, showOriginLabel: ownerPrincipal.kind === 'user', isAdmin: isPlatformAdmin, sx: { px: 0, py: 0, border: 'none', bg: 'transparent' } })) }));
359
+ }, showPrincipalLabel: false, showApplyingToText: false, showOriginLabel: ownerPrincipal.kind === 'personal', isAdmin: isPlatformAdmin, sx: { px: 0, py: 0, border: 'none', bg: 'transparent' } })) }));
337
360
  }
338
361
  function AccessPrincipalRow({ entry, cache, showAvatarSkeleton = false, isPlatformAdmin, }) {
339
362
  const cached = cache[principalKey(entry.kind, entry.uid)] || {};
340
363
  const cachedHandle = cached.handle;
341
364
  const safeCachedHandle = cachedHandle && cachedHandle !== entry.uid ? cachedHandle : '';
342
365
  const resolvedHandle = safeCachedHandle || cached.accountHandle;
343
- const resolvedDisplayName = ensurePrincipalDisplayName(entry.kind, cached.displayName, resolvedHandle, entry.uid);
366
+ const resolvedDisplayName = ensurePrincipalDisplayName(entry.kind, cached.displayName, formatPrincipalHandle(entry.kind, resolvedHandle, cached.accountHandle), resolvedHandle, entry.uid);
344
367
  return (_jsx(Box, { sx: {
345
368
  display: 'inline-flex',
346
369
  alignItems: 'center',
@@ -354,12 +377,12 @@ function AccessPrincipalRow({ entry, cache, showAvatarSkeleton = false, isPlatfo
354
377
  accountHandle: cached.accountHandle,
355
378
  avatarUrl: cached.avatarUrl,
356
379
  origin: cached.origin || 'Datalayer',
357
- }, showPrincipalLabel: false, showApplyingToText: false, showOriginLabel: entry.kind === 'user', isAdmin: isPlatformAdmin, sx: { px: 0, py: 0, border: 'none', bg: 'transparent' } })) }));
380
+ }, showPrincipalLabel: false, showApplyingToText: false, showOriginLabel: entry.kind === 'personal', isAdmin: isPlatformAdmin, sx: { px: 0, py: 0, border: 'none', bg: 'transparent' } })) }));
358
381
  }
359
382
  // ---------------------------------------------------------------------------
360
383
  // Main component.
361
384
  // ---------------------------------------------------------------------------
362
- export function ShareAccessComponent({ isOpen, requestUrl, resourceLabel, resourceName, resourceDescription: _resourceDescription, onSharingAccessRestrictedChange, defaultAccessLevel = 'view', principalKinds = DEFAULT_PRINCIPAL_KINDS, displayMode = 'dialog', onClose, }) {
385
+ export function ShareAccessComponent({ isOpen, requestUrl, resourceLabel, resourceName, resourceDescription: _resourceDescription, expanded = false, onSharingAccessRestrictedChange, defaultAccessLevel = 'view', principalKinds = DEFAULT_PRINCIPAL_KINDS, displayMode = 'dialog', onClose, }) {
363
386
  void _resourceDescription;
364
387
  const { token, user } = useIAMStore();
365
388
  const { configuration } = useCoreStore();
@@ -368,6 +391,7 @@ export function ShareAccessComponent({ isOpen, requestUrl, resourceLabel, resour
368
391
  // ----- State -----
369
392
  const [isLoading, setIsLoading] = useState(false);
370
393
  const [isSaving, setIsSaving] = useState(false);
394
+ const [isExpanded, setIsExpanded] = useState(expanded);
371
395
  const [selectedAccessLevel, setSelectedAccessLevel] = useState(defaultAccessLevel);
372
396
  const [access, setAccess] = useState(emptyAccessByLevel());
373
397
  const [ownerPrincipals, setOwnerPrincipals] = useState([]);
@@ -530,7 +554,7 @@ export function ShareAccessComponent({ isOpen, requestUrl, resourceLabel, resour
530
554
  handle: owner.handle || owner.uid,
531
555
  avatarUrl: owner.avatarUrl,
532
556
  accountHandle: owner.accountHandle,
533
- origin: owner.kind === 'user' ? owner.origin : undefined,
557
+ origin: owner.kind === 'personal' ? owner.origin : undefined,
534
558
  });
535
559
  });
536
560
  setAccess(hydrated);
@@ -618,11 +642,13 @@ export function ShareAccessComponent({ isOpen, requestUrl, resourceLabel, resour
618
642
  setShareablePrincipals(mapped);
619
643
  mapped.forEach(principal => {
620
644
  mergePrincipalCacheEntry(principal.kind, principal.uid, {
621
- displayName: principal.name || principal.handle,
645
+ displayName: principal.name ||
646
+ formatPrincipalHandle(principal.kind, principal.handle, principal.organizationHandle || undefined) ||
647
+ principal.handle,
622
648
  handle: principal.handle,
623
649
  avatarUrl: principal.avatarUrl || undefined,
624
650
  accountHandle: principal.organizationHandle || undefined,
625
- origin: principal.kind === 'user' ? 'Datalayer' : undefined,
651
+ origin: principal.kind === 'personal' ? 'Datalayer' : undefined,
626
652
  });
627
653
  });
628
654
  }
@@ -726,7 +752,7 @@ export function ShareAccessComponent({ isOpen, requestUrl, resourceLabel, resour
726
752
  const origin = normalizeUserOrigin(pickFirstString(entry?.origin, entry?.origin_s, entry?.origin_t));
727
753
  const avatarUrl = pickFirstString(entry?.avatar_url_s, entry?.avatarUrl, entry?.avatar_url);
728
754
  return {
729
- kind: 'user',
755
+ kind: 'personal',
730
756
  uid,
731
757
  handle: handle || uid,
732
758
  displayName: displayName || handle || uid,
@@ -746,7 +772,10 @@ export function ShareAccessComponent({ isOpen, requestUrl, resourceLabel, resour
746
772
  kind: 'team',
747
773
  uid,
748
774
  handle: handle || uid,
749
- displayName: pickFirstString(entry?.name_t, entry?.name) || handle || uid,
775
+ displayName: pickFirstString(entry?.name_t, entry?.name) ||
776
+ formatPrincipalHandle('team', handle || uid, pickFirstString(entry?.organization_handle_s, entry?.organizationHandle, entry?.organization_handle) || undefined) ||
777
+ handle ||
778
+ uid,
750
779
  accountHandle: pickFirstString(entry?.organization_handle_s, entry?.organizationHandle, entry?.organization_handle) || undefined,
751
780
  };
752
781
  })
@@ -762,7 +791,10 @@ export function ShareAccessComponent({ isOpen, requestUrl, resourceLabel, resour
762
791
  kind: 'organization',
763
792
  uid,
764
793
  handle: handle || uid,
765
- displayName: pickFirstString(entry?.name_t, entry?.name) || handle || uid,
794
+ displayName: pickFirstString(entry?.name_t, entry?.name) ||
795
+ formatPrincipalHandle('organization', handle || uid) ||
796
+ handle ||
797
+ uid,
766
798
  };
767
799
  })
768
800
  .filter(Boolean);
@@ -777,7 +809,7 @@ export function ShareAccessComponent({ isOpen, requestUrl, resourceLabel, resour
777
809
  handle: result.handle,
778
810
  avatarUrl: result.avatarUrl,
779
811
  accountHandle: result.accountHandle,
780
- origin: result.kind === 'user' ? result.origin : undefined,
812
+ origin: result.kind === 'personal' ? result.origin : undefined,
781
813
  });
782
814
  });
783
815
  setSearchResults(filtered);
@@ -820,11 +852,11 @@ export function ShareAccessComponent({ isOpen, requestUrl, resourceLabel, resour
820
852
  }
821
853
  const userUids = Array.from(new Set([
822
854
  ...aclEntries
823
- .filter(e => e.kind === 'user')
855
+ .filter(e => e.kind === 'personal')
824
856
  .map(e => e.uid)
825
857
  .filter(Boolean),
826
858
  ...ownerPrincipals
827
- .filter(o => o.kind === 'user')
859
+ .filter(o => o.kind === 'personal')
828
860
  .map(o => o.uid)
829
861
  .filter(Boolean),
830
862
  ]));
@@ -832,7 +864,7 @@ export function ShareAccessComponent({ isOpen, requestUrl, resourceLabel, resour
832
864
  if (!uid || userHydrationMissesRef.current.has(uid)) {
833
865
  return false;
834
866
  }
835
- const cached = principalCache[principalKey('user', uid)] || {};
867
+ const cached = principalCache[principalKey('personal', uid)] || {};
836
868
  return (!cached.displayName ||
837
869
  !cached.avatarUrl ||
838
870
  !cached.origin ||
@@ -881,7 +913,7 @@ export function ShareAccessComponent({ isOpen, requestUrl, resourceLabel, resour
881
913
  handle;
882
914
  const avatarUrl = pickFirstString(entry?.avatar_url_s, entry?.avatarUrl, entry?.avatar_url);
883
915
  const origin = normalizeUserOrigin(pickFirstString(entry?.origin, entry?.origin_s, entry?.origin_t));
884
- mergePrincipalCacheEntry('user', uid, {
916
+ mergePrincipalCacheEntry('personal', uid, {
885
917
  displayName,
886
918
  handle,
887
919
  avatarUrl: avatarUrl || undefined,
@@ -1125,12 +1157,17 @@ export function ShareAccessComponent({ isOpen, requestUrl, resourceLabel, resour
1125
1157
  const groupedShareable = useMemo(() => {
1126
1158
  const filtered = shareablePrincipals.filter(p => principalKindsSet.has(p.kind));
1127
1159
  const selfUid = pickFirstString(user?.uid);
1128
- const self = filtered.filter(p => p.kind === 'user' && p.uid === selfUid);
1129
- const otherUsers = filtered.filter(p => p.kind === 'user' && p.uid !== selfUid);
1160
+ const self = filtered.filter(p => p.kind === 'personal' && p.uid === selfUid);
1161
+ const otherUsers = filtered.filter(p => p.kind === 'personal' && p.uid !== selfUid);
1130
1162
  const orgs = filtered.filter(p => p.kind === 'organization');
1131
1163
  const teams = filtered.filter(p => p.kind === 'team');
1132
1164
  return { self, otherUsers, orgs, teams };
1133
1165
  }, [shareablePrincipals, principalKindsSet, user?.uid]);
1166
+ useEffect(() => {
1167
+ if (isOpen) {
1168
+ setIsExpanded(expanded);
1169
+ }
1170
+ }, [isOpen, expanded]);
1134
1171
  if (!isOpen) {
1135
1172
  return null;
1136
1173
  }
@@ -1143,7 +1180,7 @@ export function ShareAccessComponent({ isOpen, requestUrl, resourceLabel, resour
1143
1180
  const alreadyAdded = hasPrincipal(access, selectedAccessLevel, principal.kind, principal.uid);
1144
1181
  const cached = principalCache[principalKey(principal.kind, principal.uid)] || {};
1145
1182
  const displayName = principal.name || cached.displayName || principal.handle || principal.uid;
1146
- const Icon = principal.kind === 'user'
1183
+ const Icon = principal.kind === 'personal'
1147
1184
  ? PersonIcon
1148
1185
  : principal.kind === 'organization'
1149
1186
  ? OrganizationIcon
@@ -1182,7 +1219,7 @@ export function ShareAccessComponent({ isOpen, requestUrl, resourceLabel, resour
1182
1219
  alignItems: 'center',
1183
1220
  gap: 1,
1184
1221
  flexWrap: 'wrap',
1185
- }, children: [_jsx(Text, { sx: { fontWeight: 'semibold' }, children: displayName }), principal.kind === 'user' &&
1222
+ }, children: [_jsx(Text, { sx: { fontWeight: 'semibold' }, children: displayName }), principal.kind === 'personal' &&
1186
1223
  user?.uid &&
1187
1224
  principal.uid === user.uid && (_jsx(Label, { size: "small", variant: "accent", children: "You" }))] }), _jsxs(Text, { sx: { fontSize: 0, color: 'fg.muted' }, children: ["@", principal.handle, principal.kind === 'team' && principal.organizationHandle && (_jsxs(Text, { as: "span", sx: { color: 'fg.muted' }, children: [' · ', "org @", principal.organizationHandle] }))] })] })] }), _jsxs(Box, { sx: { display: 'inline-flex', alignItems: 'center', gap: 1 }, children: [_jsx(Icon, { size: 14 }), alreadyAdded ? (_jsx(Label, { size: "small", variant: "success", children: "Added" })) : (_jsx(Text, { sx: { fontSize: 0, color: 'fg.muted' }, children: "Add" }))] })] }, principalKey(principal.kind, principal.uid)));
1188
1225
  };
@@ -1225,7 +1262,7 @@ export function ShareAccessComponent({ isOpen, requestUrl, resourceLabel, resour
1225
1262
  alignItems: 'flex-start',
1226
1263
  justifyContent: 'space-between',
1227
1264
  gap: 2,
1228
- }, children: [_jsx(Box, { sx: { display: 'grid', gap: 1 }, children: _jsxs(Text, { sx: { fontSize: 1, color: 'fg.muted' }, children: ["Share ", resourceName || `this ${resourceLabel.toLowerCase()}`, ". Pick a principal below \u2014 they will be granted the selected access level."] }) }), _jsxs(ActionMenu, { children: [_jsx(ActionMenu.Anchor, { children: _jsxs(Button, { variant: "default", size: "small", leadingVisual: KeyIcon, disabled: isSaving || isReadOnly, children: ["Access: ", ACCESS_LEVEL_LABELS[selectedAccessLevel]] }) }), _jsx(ActionMenu.Overlay, { width: "small", children: _jsx(ActionList, { selectionVariant: "single", children: ACCESS_LEVELS.map(level => (_jsx(ActionList.Item, { selected: selectedAccessLevel === level, onSelect: () => setSelectedAccessLevel(level), children: ACCESS_LEVEL_LABELS[level] }, level))) }) })] })] }), _jsxs(Box, { sx: {
1265
+ }, children: [_jsx(Box, { sx: { display: 'grid', gap: 1 }, children: _jsxs(Text, { sx: { fontSize: 1, color: 'fg.muted' }, children: ["Share ", resourceName || `this ${resourceLabel.toLowerCase()}`, ". Pick a principal below \u2014 they will be granted the selected access level."] }) }), _jsxs(ActionMenu, { children: [_jsxs(Box, { sx: { display: 'inline-flex', alignItems: 'center', gap: 1 }, children: [_jsx(ActionMenu.Anchor, { children: _jsxs(Button, { variant: "default", size: "small", leadingVisual: KeyIcon, disabled: isSaving || isReadOnly, children: ["Access: ", ACCESS_LEVEL_LABELS[selectedAccessLevel]] }) }), _jsx(Button, { variant: "invisible", size: "small", leadingVisual: isExpanded ? ChevronUpIcon : ChevronDownIcon, onClick: () => setIsExpanded(previous => !previous), "aria-label": isExpanded ? 'Shrink sharing details' : 'Expand sharing details', children: isExpanded ? 'Shrink details' : 'Expand details' })] }), _jsx(ActionMenu.Overlay, { width: "small", children: _jsx(ActionList, { selectionVariant: "single", children: ACCESS_LEVELS.map(level => (_jsx(ActionList.Item, { selected: selectedAccessLevel === level, onSelect: () => setSelectedAccessLevel(level), children: ACCESS_LEVEL_LABELS[level] }, level))) }) })] })] }), !isExpanded && (_jsxs(Box, { sx: {
1229
1266
  px: 3,
1230
1267
  py: 2,
1231
1268
  borderRadius: 2,
@@ -1235,118 +1272,128 @@ export function ShareAccessComponent({ isOpen, requestUrl, resourceLabel, resour
1235
1272
  bg: 'canvas.default',
1236
1273
  display: 'grid',
1237
1274
  gap: 1,
1238
- }, children: [_jsx(Text, { sx: { fontSize: 1, color: 'fg.muted' }, children: "Owner" }), ownerPrincipals.length > 0 ? (_jsx(Box, { sx: { display: 'grid' }, children: ownerPrincipals.map((ownerPrincipal, index) => (_jsx(Box, { sx: {
1239
- py: 1,
1240
- borderTopWidth: index === 0 ? 0 : 1,
1241
- borderTopStyle: 'solid',
1242
- borderColor: 'border.subtle',
1243
- }, children: _jsx(OwnerPrincipalRow, { ownerPrincipal: ownerPrincipal, cache: principalCache, showAvatarSkeleton: ownerPrincipal.kind === 'user' &&
1244
- Boolean(hydratingUserUids[ownerPrincipal.uid]), isPlatformAdmin: isPlatformAdmin }) }, principalKey(ownerPrincipal.kind, ownerPrincipal.uid)))) })) : (_jsx(Text, { sx: { fontSize: 1, color: 'fg.muted' }, children: "Owner information is not available." }))] }), _jsxs(Box, { sx: {
1245
- px: 3,
1246
- py: 2,
1247
- borderRadius: 2,
1248
- borderWidth: 1,
1249
- borderStyle: 'solid',
1250
- borderColor: 'border.default',
1251
- bg: 'canvas.default',
1252
- display: 'grid',
1253
- gap: 2,
1254
- }, children: [_jsxs(Box, { sx: {
1255
- display: 'flex',
1256
- alignItems: 'center',
1257
- justifyContent: 'space-between',
1258
- gap: 2,
1259
- }, children: [_jsx(Text, { sx: { fontSize: 1, fontWeight: 600 }, children: "Share with\u2026" }), isLoadingShareable && (_jsxs(Box, { sx: { display: 'inline-flex', alignItems: 'center', gap: 1 }, children: [_jsx(Spinner, { size: "small" }), _jsx(Text, { sx: { fontSize: 0, color: 'fg.muted' }, children: "Loading\u2026" })] }))] }), !isLoadingShareable &&
1260
- groupedShareable.self.length === 0 &&
1261
- groupedShareable.otherUsers.length === 0 &&
1262
- groupedShareable.orgs.length === 0 &&
1263
- groupedShareable.teams.length === 0 ? (_jsx(Text, { sx: { fontSize: 1, color: 'fg.muted' }, children: "No principals available to share with." })) : (_jsxs(Box, { sx: { display: 'grid', gap: 2 }, children: [renderShareableGroup('You', groupedShareable.self), renderShareableGroup('Other users', groupedShareable.otherUsers), renderShareableGroup('Your organizations', groupedShareable.orgs), renderShareableGroup('Your teams', groupedShareable.teams)] }))] }), _jsxs(Box, { sx: {
1264
- px: 3,
1265
- py: 2,
1266
- borderRadius: 2,
1267
- borderWidth: 1,
1268
- borderStyle: 'solid',
1269
- borderColor: 'border.subtle',
1270
- bg: 'canvas.subtle',
1271
- display: 'grid',
1272
- gap: 1,
1273
- }, children: [_jsx(Text, { sx: { fontSize: 0, color: 'fg.muted' }, children: "Or search for any user, team, or organization" }), _jsxs(Box, { sx: { position: 'relative' }, ref: searchContainerRef, children: [_jsx(TextInput, { ref: searchInputRef, block: true, value: searchQuery, onChange: e => {
1274
- const next = e.target.value;
1275
- setSearchQuery(next);
1276
- setIsSearchOverlayOpen(next.trim().length > 0);
1277
- }, onFocus: () => {
1278
- if (searchQuery.trim().length > 0) {
1279
- setIsSearchOverlayOpen(true);
1280
- }
1281
- }, onKeyDown: e => {
1282
- if (e.key === 'Escape') {
1283
- e.preventDefault();
1284
- setIsSearchOverlayOpen(false);
1285
- }
1286
- }, placeholder: "Search by handle, name, or email", "aria-label": "Search principals", disabled: isSaving }), canShowSearchResults && (_jsx(Box, { sx: {
1287
- position: 'absolute',
1288
- top: 'calc(100% + 8px)',
1289
- left: 0,
1290
- right: 0,
1291
- zIndex: 100,
1292
- borderWidth: 1,
1293
- borderStyle: 'solid',
1294
- borderColor: 'border.default',
1295
- borderRadius: 2,
1296
- maxHeight: '220px',
1297
- overflowY: 'auto',
1298
- bg: 'canvas.overlay',
1299
- boxShadow: 'shadow.medium',
1300
- }, children: isSearching ? (_jsxs(Box, { sx: {
1301
- px: 3,
1302
- py: 2,
1303
- display: 'inline-flex',
1304
- alignItems: 'center',
1305
- gap: 2,
1306
- }, children: [_jsx(Spinner, { size: "small" }), _jsx(Text, { sx: { fontSize: 1, color: 'fg.muted' }, children: "Searching\u2026" })] })) : searchResults.length === 0 ? (_jsx(Box, { sx: { px: 3, py: 2 }, children: _jsx(Text, { sx: { fontSize: 1, color: 'fg.muted' }, children: "No principals found." }) })) : (_jsx(ActionList, { children: searchResults.map(result => (_jsxs(ActionList.Item, { onSelect: () => handleSearchResultSelect(result), children: [_jsx(ActionList.LeadingVisual, { children: _jsx(PrincipalAvatar, { kind: result.kind, avatarUrl: result.avatarUrl, alt: result.displayName, size: 18 }) }), _jsxs(Box, { sx: {
1307
- display: 'inline-flex',
1308
- alignItems: 'center',
1309
- gap: 1,
1310
- flexWrap: 'wrap',
1311
- }, children: [_jsx(Text, { children: result.displayName }), result.kind === 'user' && (_jsx(Label, { size: "small", variant: "secondary", children: result.origin ||
1312
- principalCache[principalKey('user', result.uid)]
1313
- ?.origin ||
1314
- 'Datalayer' }))] }), _jsxs(ActionList.Description, { variant: "block", children: ["@", result.handle] })] }, principalKey(result.kind, result.uid)))) })) }))] })] }), _jsxs(Box, { sx: {
1315
- px: 3,
1316
- py: 2,
1317
- borderRadius: 2,
1318
- borderWidth: 1,
1319
- borderStyle: 'solid',
1320
- borderColor: 'border.default',
1321
- bg: 'canvas.default',
1322
- display: 'grid',
1323
- gap: 1,
1324
- }, children: [_jsx(Text, { sx: { fontSize: 1, color: 'fg.muted' }, children: "Access Control List (ACL)" }), _jsx(Box, { sx: {
1275
+ }, children: [_jsx(Text, { sx: { fontSize: 1, color: 'fg.muted' }, children: "Sharing details are collapsed." }), _jsxs(Text, { sx: { fontSize: 0, color: 'fg.muted' }, children: [aclEntries.length, " principal", aclEntries.length === 1 ? '' : 's', " currently granted access."] })] })), isExpanded && (_jsxs(_Fragment, { children: [_jsxs(Box, { sx: {
1276
+ px: 3,
1277
+ py: 2,
1278
+ borderRadius: 2,
1325
1279
  borderWidth: 1,
1326
1280
  borderStyle: 'solid',
1327
1281
  borderColor: 'border.default',
1282
+ bg: 'canvas.default',
1283
+ display: 'grid',
1284
+ gap: 1,
1285
+ }, children: [_jsx(Text, { sx: { fontSize: 1, color: 'fg.muted' }, children: "Owner" }), ownerPrincipals.length > 0 ? (_jsx(Box, { sx: { display: 'grid' }, children: ownerPrincipals.map((ownerPrincipal, index) => (_jsx(Box, { sx: {
1286
+ py: 1,
1287
+ borderTopWidth: index === 0 ? 0 : 1,
1288
+ borderTopStyle: 'solid',
1289
+ borderColor: 'border.subtle',
1290
+ }, children: _jsx(OwnerPrincipalRow, { ownerPrincipal: ownerPrincipal, cache: principalCache, showAvatarSkeleton: ownerPrincipal.kind === 'personal' &&
1291
+ Boolean(hydratingUserUids[ownerPrincipal.uid]), isPlatformAdmin: isPlatformAdmin }) }, principalKey(ownerPrincipal.kind, ownerPrincipal.uid)))) })) : (_jsx(Text, { sx: { fontSize: 1, color: 'fg.muted' }, children: "Owner information is not available." }))] }), _jsxs(Box, { sx: {
1292
+ px: 3,
1293
+ py: 2,
1328
1294
  borderRadius: 2,
1329
- maxHeight: '220px',
1330
- overflowY: 'auto',
1331
- bg: 'canvas.subtle',
1332
- }, children: aclEntries.length === 0 ? (_jsx(Box, { sx: { px: 3, py: 2 }, children: _jsx(Text, { sx: { fontSize: 1, color: 'fg.muted' }, children: "No principals shared yet." }) })) : (_jsx(Box, { sx: { display: 'grid' }, children: aclEntries.map(entry => (_jsxs(Box, { sx: {
1333
- px: 3,
1334
- py: 2,
1295
+ borderWidth: 1,
1296
+ borderStyle: 'solid',
1297
+ borderColor: 'border.default',
1298
+ bg: 'canvas.default',
1299
+ display: 'grid',
1300
+ gap: 2,
1301
+ }, children: [_jsxs(Box, { sx: {
1335
1302
  display: 'flex',
1336
1303
  alignItems: 'center',
1337
1304
  justifyContent: 'space-between',
1338
1305
  gap: 2,
1339
- borderTopWidth: 1,
1340
- borderTopStyle: 'solid',
1341
- borderColor: 'border.subtle',
1342
- '&:first-of-type': { borderTop: 'none' },
1343
- }, children: [_jsx(AccessPrincipalRow, { entry: entry, cache: principalCache, showAvatarSkeleton: entry.kind === 'user' &&
1344
- Boolean(hydratingUserUids[entry.uid]), isPlatformAdmin: isPlatformAdmin }), _jsx(Box, { sx: {
1306
+ }, children: [_jsx(Text, { sx: { fontSize: 1, fontWeight: 600 }, children: "Share with\u2026" }), isLoadingShareable && (_jsxs(Box, { sx: { display: 'inline-flex', alignItems: 'center', gap: 1 }, children: [_jsx(Spinner, { size: "small" }), _jsx(Text, { sx: { fontSize: 0, color: 'fg.muted' }, children: "Loading\u2026" })] }))] }), !isLoadingShareable &&
1307
+ groupedShareable.self.length === 0 &&
1308
+ groupedShareable.otherUsers.length === 0 &&
1309
+ groupedShareable.orgs.length === 0 &&
1310
+ groupedShareable.teams.length === 0 ? (_jsx(Text, { sx: { fontSize: 1, color: 'fg.muted' }, children: "No principals available to share with." })) : (_jsxs(Box, { sx: { display: 'grid', gap: 2 }, children: [renderShareableGroup('You', groupedShareable.self), renderShareableGroup('Other users', groupedShareable.otherUsers), renderShareableGroup('Your organizations', groupedShareable.orgs), renderShareableGroup('Your teams', groupedShareable.teams)] }))] }), _jsxs(Box, { sx: {
1311
+ px: 3,
1312
+ py: 2,
1313
+ borderRadius: 2,
1314
+ borderWidth: 1,
1315
+ borderStyle: 'solid',
1316
+ borderColor: 'border.subtle',
1317
+ bg: 'canvas.subtle',
1318
+ display: 'grid',
1319
+ gap: 1,
1320
+ }, children: [_jsx(Text, { sx: { fontSize: 0, color: 'fg.muted' }, children: "Or search for any user, team, or organization" }), _jsxs(Box, { sx: { position: 'relative' }, ref: searchContainerRef, children: [_jsx(TextInput, { ref: searchInputRef, block: true, value: searchQuery, onChange: e => {
1321
+ const next = e.target.value;
1322
+ setSearchQuery(next);
1323
+ setIsSearchOverlayOpen(next.trim().length > 0);
1324
+ }, onFocus: () => {
1325
+ if (searchQuery.trim().length > 0) {
1326
+ setIsSearchOverlayOpen(true);
1327
+ }
1328
+ }, onKeyDown: e => {
1329
+ if (e.key === 'Escape') {
1330
+ e.preventDefault();
1331
+ setIsSearchOverlayOpen(false);
1332
+ }
1333
+ }, placeholder: "Search by handle, name, or email", "aria-label": "Search principals", disabled: isSaving }), canShowSearchResults && (_jsx(Box, { sx: {
1334
+ position: 'absolute',
1335
+ top: 'calc(100% + 8px)',
1336
+ left: 0,
1337
+ right: 0,
1338
+ zIndex: 100,
1339
+ borderWidth: 1,
1340
+ borderStyle: 'solid',
1341
+ borderColor: 'border.default',
1342
+ borderRadius: 2,
1343
+ maxHeight: '220px',
1344
+ overflowY: 'auto',
1345
+ bg: 'canvas.overlay',
1346
+ boxShadow: 'shadow.medium',
1347
+ }, children: isSearching ? (_jsxs(Box, { sx: {
1348
+ px: 3,
1349
+ py: 2,
1350
+ display: 'inline-flex',
1351
+ alignItems: 'center',
1352
+ gap: 2,
1353
+ }, children: [_jsx(Spinner, { size: "small" }), _jsx(Text, { sx: { fontSize: 1, color: 'fg.muted' }, children: "Searching\u2026" })] })) : searchResults.length === 0 ? (_jsx(Box, { sx: { px: 3, py: 2 }, children: _jsx(Text, { sx: { fontSize: 1, color: 'fg.muted' }, children: "No principals found." }) })) : (_jsx(ActionList, { children: searchResults.map(result => (_jsxs(ActionList.Item, { onSelect: () => handleSearchResultSelect(result), children: [_jsx(ActionList.LeadingVisual, { children: _jsx(PrincipalAvatar, { kind: result.kind, avatarUrl: result.avatarUrl, alt: result.displayName, size: 18 }) }), _jsxs(Box, { sx: {
1354
+ display: 'inline-flex',
1355
+ alignItems: 'center',
1356
+ gap: 1,
1357
+ flexWrap: 'wrap',
1358
+ }, children: [_jsx(Text, { children: result.displayName }), result.kind === 'personal' && (_jsx(Label, { size: "small", variant: "secondary", children: result.origin ||
1359
+ principalCache[principalKey('personal', result.uid)]
1360
+ ?.origin ||
1361
+ 'Datalayer' }))] }), _jsxs(ActionList.Description, { variant: "block", children: ["@", result.handle] })] }, principalKey(result.kind, result.uid)))) })) }))] })] }), _jsxs(Box, { sx: {
1362
+ px: 3,
1363
+ py: 2,
1364
+ borderRadius: 2,
1365
+ borderWidth: 1,
1366
+ borderStyle: 'solid',
1367
+ borderColor: 'border.default',
1368
+ bg: 'canvas.default',
1369
+ display: 'grid',
1370
+ gap: 1,
1371
+ }, children: [_jsx(Text, { sx: { fontSize: 1, color: 'fg.muted' }, children: "Access Control List (ACL)" }), _jsx(Box, { sx: {
1372
+ borderWidth: 1,
1373
+ borderStyle: 'solid',
1374
+ borderColor: 'border.default',
1375
+ borderRadius: 2,
1376
+ maxHeight: '220px',
1377
+ overflowY: 'auto',
1378
+ bg: 'canvas.subtle',
1379
+ }, children: aclEntries.length === 0 ? (_jsx(Box, { sx: { px: 3, py: 2 }, children: _jsx(Text, { sx: { fontSize: 1, color: 'fg.muted' }, children: "No principals shared yet." }) })) : (_jsx(Box, { sx: { display: 'grid' }, children: aclEntries.map(entry => (_jsxs(Box, { sx: {
1380
+ px: 3,
1381
+ py: 2,
1345
1382
  display: 'flex',
1346
- flexWrap: 'wrap',
1347
- gap: 1,
1348
- justifyContent: 'flex-end',
1349
- }, children: entry.levels.map(level => (_jsx(Label, { size: "small", variant: "secondary", children: ACCESS_LEVEL_LABELS[level] }, level))) }), _jsx(Button, { size: "small", variant: "invisible", onClick: () => removePrincipal(entry.kind, entry.uid), disabled: isSaving, children: "Remove" })] }, principalKey(entry.kind, entry.uid)))) })) })] })] }), _jsxs(Box, { sx: {
1383
+ alignItems: 'center',
1384
+ justifyContent: 'space-between',
1385
+ gap: 2,
1386
+ borderTopWidth: 1,
1387
+ borderTopStyle: 'solid',
1388
+ borderColor: 'border.subtle',
1389
+ '&:first-of-type': { borderTop: 'none' },
1390
+ }, children: [_jsx(AccessPrincipalRow, { entry: entry, cache: principalCache, showAvatarSkeleton: entry.kind === 'personal' &&
1391
+ Boolean(hydratingUserUids[entry.uid]), isPlatformAdmin: isPlatformAdmin }), _jsx(Box, { sx: {
1392
+ display: 'flex',
1393
+ flexWrap: 'wrap',
1394
+ gap: 1,
1395
+ justifyContent: 'flex-end',
1396
+ }, children: entry.levels.map(level => (_jsx(Label, { size: "small", variant: "secondary", children: ACCESS_LEVEL_LABELS[level] }, level))) }), _jsx(Button, { size: "small", variant: "invisible", onClick: () => removePrincipal(entry.kind, entry.uid), disabled: isSaving, children: "Remove" })] }, principalKey(entry.kind, entry.uid)))) })) })] })] }))] }), _jsxs(Box, { sx: {
1350
1397
  display: 'flex',
1351
1398
  justifyContent: 'flex-end',
1352
1399
  alignItems: 'center',
@@ -1,4 +1,8 @@
1
1
  import { jsx as _jsx, 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
+ */
2
6
  /*
3
7
  * Copyright (c) 2023-2026 Datalayer, Inc.
4
8
  * Distributed under the terms of the Modified BSD License.
@@ -1 +1 @@
1
- export * from './SnippetDialog';
1
+ export {};
@@ -2,4 +2,4 @@
2
2
  * Copyright (c) 2023-2025 Datalayer, Inc.
3
3
  * Distributed under the terms of the Modified BSD License.
4
4
  */
5
- export * from './SnippetDialog.js';
5
+ export {};
@@ -0,0 +1,21 @@
1
+ export type StudentResultStatus = 'pass' | 'fail' | 'partial' | 'none';
2
+ type Props = {
3
+ /**
4
+ * Result status: success (green), failure (red) or none (no result yet,
5
+ * rendered as a neutral outlined/empty circle with no fill color).
6
+ */
7
+ status: StudentResultStatus;
8
+ /**
9
+ * Human readable explanation shown in the tooltip (e.g. "Exercise passed").
10
+ */
11
+ label: string;
12
+ };
13
+ /**
14
+ * A small green/yellow/red/neutral result circle with an explanatory tooltip.
15
+ *
16
+ * Standalone component reused across the course progress and report views so
17
+ * the meaning of the green (success) / red (failure) / empty (no result yet)
18
+ * status is discoverable on hover and focus.
19
+ */
20
+ export declare const StudentResultCircle: (props: Props) => import("react/jsx-runtime").JSX.Element;
21
+ export default StudentResultCircle;