@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.
- package/README.md +35 -24
- package/lib/api/constants.d.ts +3 -0
- package/lib/api/constants.js +3 -0
- package/lib/api/index.d.ts +0 -8
- package/lib/api/index.js +0 -8
- package/lib/cli-login.js +167 -0
- package/lib/client/base.d.ts +0 -3
- package/lib/client/base.js +0 -2
- package/lib/client/index.d.ts +10 -98
- package/lib/client/index.js +12 -21
- package/lib/components/avatars/UserAvatar.d.ts +16 -0
- package/lib/components/avatars/UserAvatar.js +47 -0
- package/lib/components/avatars/index.d.ts +1 -0
- package/lib/components/avatars/index.js +1 -0
- package/lib/components/billing/BillableAccountSelect.js +4 -0
- package/lib/components/billing/index.js +4 -0
- package/lib/components/checkout/StripeCheckout.js +48 -2
- package/lib/components/context/index.d.ts +0 -1
- package/lib/components/context/index.js +0 -1
- package/lib/components/display/DisplayHandle.d.ts +12 -0
- package/lib/components/display/DisplayHandle.js +11 -0
- package/lib/components/display/LiveRelativeTime.d.ts +1 -10
- package/lib/components/display/LiveRelativeTime.js +5 -16
- package/lib/components/display/index.d.ts +1 -0
- package/lib/components/display/index.js +1 -0
- package/lib/components/flashes/index.d.ts +0 -1
- package/lib/components/flashes/index.js +0 -1
- package/lib/components/index.d.ts +2 -0
- package/lib/components/index.js +2 -0
- package/lib/components/principal/Principal.d.ts +7 -0
- package/lib/components/principal/Principal.js +153 -16
- package/lib/components/principal/PrincipalAvatar.d.ts +1 -1
- package/lib/components/principal/PrincipalAvatar.js +4 -28
- package/lib/components/principal/PrincipalBadge.js +4 -4
- package/lib/components/principal/PrincipalDetailsOverlay.d.ts +4 -2
- package/lib/components/principal/PrincipalDetailsOverlay.js +27 -7
- package/lib/components/principal/PrincipalSwitcherMenu.js +76 -39
- package/lib/components/progress/index.d.ts +0 -1
- package/lib/components/progress/index.js +0 -1
- package/lib/components/sharing/ShareAccessComponent.d.ts +3 -2
- package/lib/components/sharing/ShareAccessComponent.js +180 -133
- package/lib/components/sharing/SharingEditor.js +4 -0
- package/lib/components/snippets/index.d.ts +1 -1
- package/lib/components/snippets/index.js +1 -1
- package/lib/components/students/StudentResultCircle.d.ts +21 -0
- package/lib/components/students/StudentResultCircle.js +59 -0
- package/lib/components/students/index.d.ts +1 -1
- package/lib/components/students/index.js +1 -1
- package/lib/components/time/LiveRelativeTime.d.ts +14 -0
- package/lib/components/time/LiveRelativeTime.js +43 -0
- package/lib/components/time/index.d.ts +1 -0
- package/lib/components/time/index.js +9 -0
- package/lib/components/timeline/Timeline.d.ts +20 -0
- package/lib/components/timeline/Timeline.js +90 -0
- package/lib/components/timeline/index.d.ts +1 -0
- package/lib/components/timeline/index.js +9 -0
- package/lib/components/tokens/index.d.ts +1 -1
- package/lib/components/tokens/index.js +1 -1
- package/lib/components/toolbars/index.d.ts +1 -3
- package/lib/components/toolbars/index.js +1 -3
- package/lib/hooks/cacheConverters.d.ts +21 -0
- package/lib/hooks/cacheConverters.js +110 -0
- package/lib/hooks/index.d.ts +0 -2
- package/lib/hooks/index.js +0 -2
- package/lib/hooks/useCache.d.ts +65 -36
- package/lib/hooks/useCache.js +424 -65
- package/lib/hooks/useDatalayer.js +3 -1
- package/lib/hooks/useIAM.js +1 -3
- package/lib/hooks/useLocationHandles.d.ts +3 -1
- package/lib/hooks/useLocationHandles.js +2 -1
- package/lib/hooks/usePrincipalStore.d.ts +2 -2
- package/lib/hooks/usePrincipalStore.js +97 -14
- package/lib/hooks/useProjectStore.d.ts +1 -1
- package/lib/hooks/useSelectedPrincipal.js +1 -1
- package/lib/hooks/useUser.js +19 -2
- package/lib/index.d.ts +1 -6
- package/lib/index.js +1 -13
- package/lib/main.js +3 -3
- package/lib/mocks/index.js +1 -1
- package/lib/mocks/models/index.d.ts +0 -1
- package/lib/mocks/models/index.js +0 -1
- package/lib/models/Datasource.d.ts +2 -2
- package/lib/models/IAM.d.ts +1 -1
- package/lib/models/IAMToken.d.ts +1 -1
- package/lib/models/School.d.ts +12 -3
- package/lib/models/Secret.d.ts +2 -2
- package/lib/models/Student.d.ts +13 -3
- package/lib/models/Usage.d.ts +11 -1
- package/lib/models/UserDTO.d.ts +2 -2
- package/lib/models/index.d.ts +0 -30
- package/lib/models/index.js +0 -30
- package/lib/routes/index.d.ts +1 -0
- package/lib/routes/index.js +1 -0
- package/lib/routes/publicPaths.d.ts +23 -0
- package/lib/routes/publicPaths.js +74 -0
- package/lib/state/State.d.ts +0 -12
- package/lib/state/State.js +0 -12
- package/lib/state/substates/CoreState.js +1 -1
- package/lib/state/substates/LayoutState.d.ts +12 -1
- package/lib/state/substates/index.d.ts +0 -7
- package/lib/state/substates/index.js +0 -7
- package/lib/utils/Date.d.ts +7 -0
- package/lib/utils/Date.js +43 -10
- package/lib/utils/Handles.js +3 -1
- package/lib/utils/index.d.ts +1 -1
- package/lib/utils/index.js +1 -1
- package/lib/views/api-keys/APIKeyEdit.d.ts +8 -0
- package/lib/views/{iam-tokens/IAMTokenEdit.js → api-keys/APIKeyEdit.js} +31 -31
- package/lib/views/api-keys/APIKeyNew.d.ts +8 -0
- package/lib/views/api-keys/APIKeyNew.js +143 -0
- package/lib/views/api-keys/APIKeys.d.ts +12 -0
- package/lib/views/api-keys/APIKeys.js +128 -0
- package/lib/views/api-keys/APIKeysStandalone.d.ts +2 -0
- package/lib/views/api-keys/APIKeysStandalone.js +117 -0
- package/lib/views/api-keys/index.d.ts +3 -0
- package/lib/{mocks/jupyter → views/api-keys}/index.js +3 -1
- package/lib/views/datasources/DatasourceDetail.d.ts +1 -1
- package/lib/views/datasources/DatasourceNew.d.ts +1 -1
- package/lib/views/datasources/Datasources.d.ts +1 -1
- package/lib/views/datasources/Datasources.js +12 -3
- package/lib/views/iam/SignInSimple.d.ts +37 -1
- package/lib/views/iam/SignInSimple.js +110 -12
- package/package.json +5 -3
- package/lib/App.css +0 -47
- package/lib/App.d.ts +0 -3
- package/lib/App.js +0 -21
- package/lib/api/runtimes/checkpoints.d.ts +0 -122
- package/lib/api/runtimes/checkpoints.js +0 -118
- package/lib/api/runtimes/environments.d.ts +0 -9
- package/lib/api/runtimes/environments.js +0 -29
- package/lib/api/runtimes/healthz.d.ts +0 -15
- package/lib/api/runtimes/healthz.js +0 -44
- package/lib/api/runtimes/index.d.ts +0 -12
- package/lib/api/runtimes/index.js +0 -16
- package/lib/api/runtimes/runtimes.d.ts +0 -138
- package/lib/api/runtimes/runtimes.js +0 -230
- package/lib/api/runtimes/snapshots.d.ts +0 -38
- package/lib/api/runtimes/snapshots.js +0 -82
- package/lib/api/spacer/documents.d.ts +0 -12
- package/lib/api/spacer/documents.js +0 -43
- package/lib/api/spacer/healthz.d.ts +0 -15
- package/lib/api/spacer/healthz.js +0 -44
- package/lib/api/spacer/index.d.ts +0 -15
- package/lib/api/spacer/index.js +0 -19
- package/lib/api/spacer/items.d.ts +0 -25
- package/lib/api/spacer/items.js +0 -55
- package/lib/api/spacer/lexicals.d.ts +0 -34
- package/lib/api/spacer/lexicals.js +0 -89
- package/lib/api/spacer/notebooks.d.ts +0 -34
- package/lib/api/spacer/notebooks.js +0 -89
- package/lib/api/spacer/spaces.d.ts +0 -84
- package/lib/api/spacer/spaces.js +0 -170
- package/lib/api/spacer/users.d.ts +0 -9
- package/lib/api/spacer/users.js +0 -29
- package/lib/client/mixins/RuntimesMixin.d.ts +0 -93
- package/lib/client/mixins/RuntimesMixin.js +0 -229
- package/lib/client/mixins/SpacerMixin.d.ts +0 -210
- package/lib/client/mixins/SpacerMixin.js +0 -615
- package/lib/client/utils/spacerUtils.d.ts +0 -18
- package/lib/client/utils/spacerUtils.js +0 -32
- package/lib/collaboration/DatalayerCollaboration.d.ts +0 -13
- package/lib/collaboration/DatalayerCollaboration.js +0 -28
- package/lib/collaboration/DatalayerCollaborationProvider.d.ts +0 -60
- package/lib/collaboration/DatalayerCollaborationProvider.js +0 -163
- package/lib/collaboration/index.d.ts +0 -2
- package/lib/collaboration/index.js +0 -6
- package/lib/components/context/SpaceSelect.d.ts +0 -2
- package/lib/components/context/SpaceSelect.js +0 -42
- package/lib/components/flashes/FlashDisclaimer.d.ts +0 -2
- package/lib/components/flashes/FlashDisclaimer.js +0 -17
- package/lib/components/icons/ArtifactIcon.d.ts +0 -10
- package/lib/components/icons/ArtifactIcon.js +0 -58
- package/lib/components/icons/index.d.ts +0 -1
- package/lib/components/icons/index.js +0 -5
- package/lib/components/nbgrader/NbGradesDetails.d.ts +0 -5
- package/lib/components/nbgrader/NbGradesDetails.js +0 -14
- package/lib/components/nbgrader/index.d.ts +0 -1
- package/lib/components/nbgrader/index.js +0 -5
- package/lib/components/progress/CreditsIndicator.d.ts +0 -33
- package/lib/components/progress/CreditsIndicator.js +0 -23
- package/lib/components/runtimes/RuntimeCellVariables.d.ts +0 -39
- package/lib/components/runtimes/RuntimeCellVariables.js +0 -172
- package/lib/components/runtimes/RuntimeCellVariablesDialog.d.ts +0 -37
- package/lib/components/runtimes/RuntimeCellVariablesDialog.js +0 -101
- package/lib/components/runtimes/RuntimeLauncherDialog.d.ts +0 -57
- package/lib/components/runtimes/RuntimeLauncherDialog.js +0 -275
- package/lib/components/runtimes/RuntimePickerBase.d.ts +0 -69
- package/lib/components/runtimes/RuntimePickerBase.js +0 -122
- package/lib/components/runtimes/RuntimePickerCell.d.ts +0 -34
- package/lib/components/runtimes/RuntimePickerCell.js +0 -104
- package/lib/components/runtimes/RuntimePickerNotebook.d.ts +0 -42
- package/lib/components/runtimes/RuntimePickerNotebook.js +0 -232
- package/lib/components/runtimes/RuntimeReservationControl.d.ts +0 -47
- package/lib/components/runtimes/RuntimeReservationControl.js +0 -42
- package/lib/components/runtimes/RuntimeSimplePicker.d.ts +0 -38
- package/lib/components/runtimes/RuntimeSimplePicker.js +0 -155
- package/lib/components/runtimes/RuntimeTransfer.d.ts +0 -16
- package/lib/components/runtimes/RuntimeTransfer.js +0 -5
- package/lib/components/runtimes/RuntimeUtils.d.ts +0 -17
- package/lib/components/runtimes/RuntimeUtils.js +0 -178
- package/lib/components/runtimes/RuntimeVariables.d.ts +0 -38
- package/lib/components/runtimes/RuntimeVariables.js +0 -75
- package/lib/components/runtimes/index.d.ts +0 -11
- package/lib/components/runtimes/index.js +0 -15
- package/lib/components/snapshots/SandboxSnapshotMenu.d.ts +0 -33
- package/lib/components/snapshots/SandboxSnapshotMenu.js +0 -169
- package/lib/components/snapshots/index.d.ts +0 -1
- package/lib/components/snapshots/index.js +0 -5
- package/lib/components/snippets/SnippetDialog.d.ts +0 -42
- package/lib/components/snippets/SnippetDialog.js +0 -42
- package/lib/components/students/StudentItemStatus.d.ts +0 -7
- package/lib/components/students/StudentItemStatus.js +0 -66
- package/lib/components/tokens/SpaceVariantToken.d.ts +0 -5
- package/lib/components/tokens/SpaceVariantToken.js +0 -23
- package/lib/components/toolbars/AssignmentEditorToolbar.d.ts +0 -4
- package/lib/components/toolbars/AssignmentEditorToolbar.js +0 -18
- package/lib/components/toolbars/DocumentEditorToolbar.d.ts +0 -2
- package/lib/components/toolbars/DocumentEditorToolbar.js +0 -12
- package/lib/components/toolbars/NotebookEditorToolbar.d.ts +0 -29
- package/lib/components/toolbars/NotebookEditorToolbar.js +0 -30
- package/lib/examples/CellExample.d.ts +0 -6
- package/lib/examples/CellExample.js +0 -20
- package/lib/examples/NotebookExample.d.ts +0 -6
- package/lib/examples/NotebookExample.js +0 -19
- package/lib/examples/lexical-theme.css +0 -436
- package/lib/examples/notebooks/IPyWidgetsExample.ipynb.json +0 -101
- package/lib/examples/notebooks/IPyWidgetsExampleWithState.ipynb.json +0 -112
- package/lib/examples/notebooks/Lite.ipynb.json +0 -128
- package/lib/examples/notebooks/Matplotlib.ipynb.json +0 -137
- package/lib/examples/notebooks/NotebookExample1.ipynb.json +0 -126
- package/lib/examples/notebooks/NotebookExample2.ipynb.json +0 -48
- package/lib/examples/notebooks/NotebookOutputs.ipynb.json +0 -49
- package/lib/examples/notebooks/NotebookToCExample.ipynb.json +0 -102
- package/lib/examples/notebooks/PyGWalker.ipynb.json +0 -55
- package/lib/hooks/useCellOutputshot.d.ts +0 -4
- package/lib/hooks/useCellOutputshot.js +0 -25
- package/lib/hooks/useProjects.d.ts +0 -628
- package/lib/hooks/useProjects.js +0 -190
- package/lib/hooks/useRuntimes.d.ts +0 -5
- package/lib/hooks/useRuntimes.js +0 -34
- package/lib/mocks/models/CourseMock.d.ts +0 -6
- package/lib/mocks/models/CourseMock.js +0 -29
- package/lib/mocks/models/SpaceMock.d.ts +0 -6
- package/lib/mocks/models/SpaceMock.js +0 -25
- package/lib/models/Assignment.d.ts +0 -7
- package/lib/models/Assignment.js +0 -5
- package/lib/models/Cell.d.ts +0 -8
- package/lib/models/Cell.js +0 -5
- package/lib/models/CodeBlock.d.ts +0 -10
- package/lib/models/CodeBlock.js +0 -5
- package/lib/models/CodeSandboxSnapshot.d.ts +0 -92
- package/lib/models/CodeSandboxSnapshot.js +0 -13
- package/lib/models/CodeSandboxSnapshotDTO.d.ts +0 -173
- package/lib/models/CodeSandboxSnapshotDTO.js +0 -139
- package/lib/models/CodefeedBlocks.d.ts +0 -7
- package/lib/models/CodefeedBlocks.js +0 -5
- package/lib/models/Content.d.ts +0 -5
- package/lib/models/Content.js +0 -5
- package/lib/models/Course.d.ts +0 -17
- package/lib/models/Course.js +0 -5
- package/lib/models/Dataset.d.ts +0 -16
- package/lib/models/Dataset.js +0 -5
- package/lib/models/Document.d.ts +0 -8
- package/lib/models/Document.js +0 -5
- package/lib/models/Environment.d.ts +0 -86
- package/lib/models/Environment.js +0 -5
- package/lib/models/EnvironmentDTO.d.ts +0 -125
- package/lib/models/EnvironmentDTO.js +0 -88
- package/lib/models/Exercise.d.ts +0 -16
- package/lib/models/Exercise.js +0 -5
- package/lib/models/Item.d.ts +0 -20
- package/lib/models/Item.js +0 -5
- package/lib/models/ItemDTO.d.ts +0 -74
- package/lib/models/ItemDTO.js +0 -186
- package/lib/models/ItemType.d.ts +0 -2
- package/lib/models/ItemType.js +0 -5
- package/lib/models/Lesson.d.ts +0 -5
- package/lib/models/Lesson.js +0 -5
- package/lib/models/LexicalDTO.d.ts +0 -155
- package/lib/models/LexicalDTO.js +0 -157
- package/lib/models/Library.d.ts +0 -10
- package/lib/models/Library.js +0 -5
- package/lib/models/Notebook.d.ts +0 -11
- package/lib/models/Notebook.js +0 -5
- package/lib/models/NotebookDTO.d.ts +0 -96
- package/lib/models/NotebookDTO.js +0 -153
- package/lib/models/Page.d.ts +0 -41
- package/lib/models/Page.js +0 -25
- package/lib/models/PageTag.d.ts +0 -19
- package/lib/models/PageTag.js +0 -94
- package/lib/models/ProjectDTO.d.ts +0 -89
- package/lib/models/ProjectDTO.js +0 -131
- package/lib/models/Runtime.d.ts +0 -123
- package/lib/models/Runtime.js +0 -18
- package/lib/models/RuntimeDTO.d.ts +0 -191
- package/lib/models/RuntimeDTO.js +0 -204
- package/lib/models/Space.d.ts +0 -35
- package/lib/models/Space.js +0 -66
- package/lib/models/SpaceDTO.d.ts +0 -334
- package/lib/models/SpaceDTO.js +0 -244
- package/lib/models/SpaceItem.d.ts +0 -10
- package/lib/models/SpaceItem.js +0 -5
- package/lib/models/SpaceMember.d.ts +0 -6
- package/lib/models/SpaceMember.js +0 -5
- package/lib/models/StudentItem.d.ts +0 -21
- package/lib/models/StudentItem.js +0 -5
- package/lib/services/DatalayerServiceManager.d.ts +0 -22
- package/lib/services/DatalayerServiceManager.js +0 -69
- package/lib/services/index.d.ts +0 -4
- package/lib/services/index.js +0 -7
- package/lib/services/reconnectToRuntime.d.ts +0 -32
- package/lib/services/reconnectToRuntime.js +0 -59
- package/lib/state/substates/CellState.d.ts +0 -12
- package/lib/state/substates/CellState.js +0 -22
- package/lib/state/substates/DocumentState.d.ts +0 -10
- package/lib/state/substates/DocumentState.js +0 -14
- package/lib/state/substates/GradeState.d.ts +0 -10
- package/lib/state/substates/GradeState.js +0 -14
- package/lib/state/substates/JupyterLabState.d.ts +0 -16
- package/lib/state/substates/JupyterLabState.js +0 -17
- package/lib/state/substates/NbformatState.d.ts +0 -13
- package/lib/state/substates/NbformatState.js +0 -16
- package/lib/state/substates/RuntimesState.d.ts +0 -79
- package/lib/state/substates/RuntimesState.js +0 -180
- package/lib/state/substates/SpaceState.d.ts +0 -11
- package/lib/state/substates/SpaceState.js +0 -16
- package/lib/stateful/index.d.ts +0 -2
- package/lib/stateful/index.js +0 -6
- package/lib/stateful/jupyter/exec/Python.d.ts +0 -5
- package/lib/stateful/jupyter/exec/Python.js +0 -100
- package/lib/stateful/jupyter/exec/Snippets.d.ts +0 -105
- package/lib/stateful/jupyter/exec/Snippets.js +0 -101
- package/lib/stateful/jupyter/exec/index.d.ts +0 -2
- package/lib/stateful/jupyter/exec/index.js +0 -6
- package/lib/stateful/jupyter/index.d.ts +0 -2
- package/lib/stateful/jupyter/index.js +0 -6
- package/lib/stateful/jupyter/kernelsHandler.d.ts +0 -8
- package/lib/stateful/jupyter/kernelsHandler.js +0 -39
- package/lib/stateful/runtimes/actions.d.ts +0 -102
- package/lib/stateful/runtimes/actions.js +0 -249
- package/lib/stateful/runtimes/apis.d.ts +0 -273
- package/lib/stateful/runtimes/apis.js +0 -5
- package/lib/stateful/runtimes/index.d.ts +0 -5
- package/lib/stateful/runtimes/index.js +0 -9
- package/lib/stateful/runtimes/settings.d.ts +0 -15
- package/lib/stateful/runtimes/settings.js +0 -31
- package/lib/stateful/runtimes/snapshots.d.ts +0 -25
- package/lib/stateful/runtimes/snapshots.js +0 -150
- package/lib/stateful/runtimes/utils.d.ts +0 -7
- package/lib/stateful/runtimes/utils.js +0 -14
- package/lib/utils/Cells.d.ts +0 -2
- package/lib/utils/Cells.js +0 -28
- package/lib/views/iam-tokens/IAMTokenEdit.d.ts +0 -6
- package/lib/views/iam-tokens/IAMTokenNew.d.ts +0 -8
- package/lib/views/iam-tokens/IAMTokenNew.js +0 -118
- package/lib/views/iam-tokens/IAMTokens.d.ts +0 -12
- package/lib/views/iam-tokens/IAMTokens.js +0 -87
- package/lib/views/iam-tokens/Tokens.d.ts +0 -2
- package/lib/views/iam-tokens/Tokens.js +0 -85
- package/lib/views/iam-tokens/index.d.ts +0 -3
- package/lib/views/iam-tokens/index.js +0 -7
- /package/lib/{mocks/jupyter/index.d.ts → cli-login.d.ts} +0 -0
- /package/lib/utils/{logger.d.ts → Logger.d.ts} +0 -0
- /package/lib/utils/{logger.js → Logger.js} +0 -0
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) 2023-2025 Datalayer, Inc.
|
|
3
|
-
* Distributed under the terms of the Modified BSD License.
|
|
4
|
-
*/
|
|
5
|
-
import { KernelExecutor } from '@datalayer/jupyter-react';
|
|
6
|
-
import { createSandboxSnapshotDownloadURL, uploadCodeSandboxSnapshot } from './index.js';
|
|
7
|
-
/**
|
|
8
|
-
* Snapshot a runtime through the frontend and upload it to the cloud.
|
|
9
|
-
*
|
|
10
|
-
* Note: You should use this only for browser runtimes.
|
|
11
|
-
*/
|
|
12
|
-
export async function createSandboxSnapshot(props) {
|
|
13
|
-
const { connection, metadata, onUploadProgress } = props;
|
|
14
|
-
const dump = await new KernelExecutor({ connection }).execute(GET_RUNTIME_SNAPSHOT_SNIPPET, {
|
|
15
|
-
storeHistory: false,
|
|
16
|
-
});
|
|
17
|
-
const serializedData = (dump.get(0)?.data['application/vnd.jupyter.stdout'] ??
|
|
18
|
-
'');
|
|
19
|
-
// Convert the data to blob.
|
|
20
|
-
const bytes = base64ToBytes(serializedData);
|
|
21
|
-
const file = new Blob([bytes.buffer]);
|
|
22
|
-
return uploadCodeSandboxSnapshot({
|
|
23
|
-
file,
|
|
24
|
-
metadata,
|
|
25
|
-
onProgress: onUploadProgress,
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
function base64ToBytes(base64) {
|
|
29
|
-
// Taken from https://developer.mozilla.org/en-US/docs/Web/API/Window/btoa#unicode_strings
|
|
30
|
-
const binString = atob(base64);
|
|
31
|
-
// @ts-expect-error TypeScript does not like this
|
|
32
|
-
return Uint8Array.from(binString, m => m.codePointAt(0));
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Load a snapshot within a browser kernel.
|
|
36
|
-
*
|
|
37
|
-
* Note: You should use this only for browser kernels.
|
|
38
|
-
*/
|
|
39
|
-
export async function loadBrowserSandboxSnapshot({ connection, id, }) {
|
|
40
|
-
const downloadURL = createSandboxSnapshotDownloadURL(id);
|
|
41
|
-
const response = await fetch(downloadURL);
|
|
42
|
-
const buffer = await response.arrayBuffer();
|
|
43
|
-
const base64 = bytesToBase64(new Uint8Array(buffer));
|
|
44
|
-
await new KernelExecutor({
|
|
45
|
-
connection,
|
|
46
|
-
}).execute(getLoadSandboxSnapshotSnippet(base64), {
|
|
47
|
-
storeHistory: false,
|
|
48
|
-
silent: true,
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
function bytesToBase64(bytes) {
|
|
52
|
-
// Taken from https://developer.mozilla.org/en-US/docs/Web/API/Window/btoa#unicode_strings
|
|
53
|
-
const binString = Array.from(bytes, byte => String.fromCodePoint(byte)).join('');
|
|
54
|
-
return btoa(binString);
|
|
55
|
-
}
|
|
56
|
-
const GET_RUNTIME_SNAPSHOT_SNIPPET = `def _create_snapshot():
|
|
57
|
-
import logging
|
|
58
|
-
import os
|
|
59
|
-
import pickle
|
|
60
|
-
from base64 import encodebytes
|
|
61
|
-
from tempfile import TemporaryFile
|
|
62
|
-
from types import BuiltinFunctionType, BuiltinMethodType, FunctionType, MethodType, MethodWrapperType, ModuleType, TracebackType
|
|
63
|
-
|
|
64
|
-
# print(pickle.DEFAULT_PROTOCOL)
|
|
65
|
-
|
|
66
|
-
class NotFound:
|
|
67
|
-
pass
|
|
68
|
-
|
|
69
|
-
missing = NotFound()
|
|
70
|
-
|
|
71
|
-
FORBIDDEN_TYPES = [type, BuiltinFunctionType, BuiltinMethodType, FunctionType, MethodType, MethodWrapperType, ModuleType, TracebackType, NotFound]
|
|
72
|
-
try:
|
|
73
|
-
from IPython.core.autocall import ExitAutocall
|
|
74
|
-
from IPython.core.interactiveshell import InteractiveShell
|
|
75
|
-
FORBIDDEN_TYPES.extend([ExitAutocall, InteractiveShell])
|
|
76
|
-
except ImportError:
|
|
77
|
-
pass
|
|
78
|
-
exclude = tuple(FORBIDDEN_TYPES)
|
|
79
|
-
|
|
80
|
-
all = frozenset(filter(lambda n: not n.startswith("_"), globals()))
|
|
81
|
-
|
|
82
|
-
line_separator = bytes(os.linesep, "utf-8")
|
|
83
|
-
with TemporaryFile() as dump:
|
|
84
|
-
for _n in all:
|
|
85
|
-
_v = globals().get(_n, missing)
|
|
86
|
-
|
|
87
|
-
if not (
|
|
88
|
-
isinstance(_v, exclude) or
|
|
89
|
-
# Special IPython variables
|
|
90
|
-
(_n == "In" and isinstance(_v, list)) or
|
|
91
|
-
(_n == "Out" and isinstance(_v, dict))
|
|
92
|
-
):
|
|
93
|
-
try:
|
|
94
|
-
dumped_n = _n.encode("utf-8") + line_separator + pickle.dumps(_v) + line_separator + b"\\x00" + line_separator
|
|
95
|
-
dump.write(dumped_n)
|
|
96
|
-
except BaseException as e:
|
|
97
|
-
logging.warning("Failed to dump variable [%s ([%s])].", _n, type(_v).__qualname__, exc_info=e)
|
|
98
|
-
else:
|
|
99
|
-
logging.debug("Variable [%s] dumped", _n)
|
|
100
|
-
|
|
101
|
-
dump.seek(0)
|
|
102
|
-
print(encodebytes(dump.read()).decode("ascii"))
|
|
103
|
-
|
|
104
|
-
_create_snapshot()
|
|
105
|
-
del _create_snapshot
|
|
106
|
-
`;
|
|
107
|
-
function getLoadSandboxSnapshotSnippet(content) {
|
|
108
|
-
return `async def _load_snapshot():
|
|
109
|
-
import os
|
|
110
|
-
import logging
|
|
111
|
-
import platform
|
|
112
|
-
import pickle
|
|
113
|
-
from base64 import decodebytes
|
|
114
|
-
is_pyodide = platform.node() == "emscripten"
|
|
115
|
-
|
|
116
|
-
snapshot = decodebytes("${content}".encode("ascii"))
|
|
117
|
-
line_sep = bytes(os.linesep, "utf-8")
|
|
118
|
-
variable_separator = b"\\x00" + line_sep
|
|
119
|
-
name = b""
|
|
120
|
-
value = b""
|
|
121
|
-
for line in snapshot.splitlines():
|
|
122
|
-
line += line_sep
|
|
123
|
-
if line == variable_separator:
|
|
124
|
-
name_s = name.strip().decode("utf-8")
|
|
125
|
-
try:
|
|
126
|
-
try:
|
|
127
|
-
globals()[name_s] = pickle.loads(value)
|
|
128
|
-
except ModuleNotFoundError as m:
|
|
129
|
-
if is_pyodide:
|
|
130
|
-
import micropip
|
|
131
|
-
logging.info(f'Installing %s...', m.name)
|
|
132
|
-
await micropip.install(m.name)
|
|
133
|
-
globals()[name_s] = pickle.loads(value)
|
|
134
|
-
else:
|
|
135
|
-
raise m
|
|
136
|
-
except BaseException as e:
|
|
137
|
-
logging.warning("Failed to load variable [%s].", name_s, exc_info=e)
|
|
138
|
-
else:
|
|
139
|
-
logging.debug("Variable [%s] loaded", name_s)
|
|
140
|
-
|
|
141
|
-
name = b""
|
|
142
|
-
value = b""
|
|
143
|
-
else:
|
|
144
|
-
if not name:
|
|
145
|
-
name = line
|
|
146
|
-
else:
|
|
147
|
-
value += line
|
|
148
|
-
await _load_snapshot()
|
|
149
|
-
del _load_snapshot`;
|
|
150
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) 2023-2025 Datalayer, Inc.
|
|
3
|
-
* Distributed under the terms of the Modified BSD License.
|
|
4
|
-
*/
|
|
5
|
-
const NON_REMOTE_LOCATION = ['browser', 'local'];
|
|
6
|
-
/**
|
|
7
|
-
* Check whether the location is remote or not.
|
|
8
|
-
*
|
|
9
|
-
* @param location The location to test
|
|
10
|
-
* @returns The result
|
|
11
|
-
*/
|
|
12
|
-
export function isRuntimeRemote(location) {
|
|
13
|
-
return !NON_REMOTE_LOCATION.includes(location);
|
|
14
|
-
}
|
package/lib/utils/Cells.d.ts
DELETED
package/lib/utils/Cells.js
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) 2023-2025 Datalayer, Inc.
|
|
3
|
-
* Distributed under the terms of the Modified BSD License.
|
|
4
|
-
*/
|
|
5
|
-
export const getDatasetCell = (dataset) => {
|
|
6
|
-
switch (dataset.contentType) {
|
|
7
|
-
case 'application/vnd.ms-excel':
|
|
8
|
-
case 'text/csv':
|
|
9
|
-
return `# --- ✅ Load the ${dataset.fileName}.${dataset.datasetExtension} dataset (${dataset.mimeType})
|
|
10
|
-
import pandas as pd
|
|
11
|
-
${dataset.fileName}_${dataset.datasetExtension} = pd.read_csv("${dataset.cdnUrl}")
|
|
12
|
-
${dataset.fileName}_${dataset.datasetExtension}
|
|
13
|
-
|
|
14
|
-
`;
|
|
15
|
-
case 'image/png':
|
|
16
|
-
case 'image/jpg':
|
|
17
|
-
case 'image/jpeg':
|
|
18
|
-
return `# --- ✅ Display the ${dataset.fileName}.${dataset.datasetExtension} dataset (${dataset.mimeType})
|
|
19
|
-
from IPython.display import Image
|
|
20
|
-
url = "${dataset.cdnUrl}"
|
|
21
|
-
Image(url, width=300)
|
|
22
|
-
|
|
23
|
-
`;
|
|
24
|
-
default:
|
|
25
|
-
return `# --- 😞 File of type ${dataset.contentType} is not supported for now.
|
|
26
|
-
`;
|
|
27
|
-
}
|
|
28
|
-
};
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export type IAMTokenEditProps = {
|
|
2
|
-
/** Route to navigate after delete. Defaults to '/settings/iam/tokens'. */
|
|
3
|
-
tokensListRoute?: string;
|
|
4
|
-
};
|
|
5
|
-
export declare const IAMTokenEdit: ({ tokensListRoute, }?: IAMTokenEditProps) => import("react/jsx-runtime").JSX.Element;
|
|
6
|
-
export default IAMTokenEdit;
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export type IAMTokenNewProps = {
|
|
2
|
-
/** Route to navigate when clicking "List my Tokens". Defaults to '/settings/iam/tokens'. */
|
|
3
|
-
tokensListRoute?: string;
|
|
4
|
-
/** Whether to render the "New API Key" title header in create mode. Defaults to true. */
|
|
5
|
-
showTitle?: boolean;
|
|
6
|
-
};
|
|
7
|
-
export declare const IAMTokenNew: ({ tokensListRoute, showTitle, }?: IAMTokenNewProps) => import("react/jsx-runtime").JSX.Element;
|
|
8
|
-
export default IAMTokenNew;
|
|
@@ -1,118 +0,0 @@
|
|
|
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 IAMTokenNew = ({ tokensListRoute = '/settings/iam/tokens', showTitle = true, } = {}) => {
|
|
14
|
-
const runStore = useRunStore();
|
|
15
|
-
const { useCreateToken } = useCache();
|
|
16
|
-
const createTokenMutation = useCreateToken();
|
|
17
|
-
const navigate = useNavigate();
|
|
18
|
-
const { enqueueToast } = useToast();
|
|
19
|
-
const [today, _] = useState(new Date());
|
|
20
|
-
const [showToken, setShowToken] = useState(false);
|
|
21
|
-
const [token, setToken] = useState();
|
|
22
|
-
const [formValues, setFormValues] = useState({
|
|
23
|
-
variant: 'user_token',
|
|
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 valueSubmit = () => {
|
|
79
|
-
runStore.layout().showBackdrop('Creating an token...');
|
|
80
|
-
createTokenMutation.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
|
-
setToken(resp.token);
|
|
90
|
-
setShowToken(true);
|
|
91
|
-
}
|
|
92
|
-
},
|
|
93
|
-
onSettled: () => {
|
|
94
|
-
runStore.layout().hideBackdrop();
|
|
95
|
-
},
|
|
96
|
-
});
|
|
97
|
-
};
|
|
98
|
-
return (_jsx(Box, { children: showToken ? (_jsxs(_Fragment, { children: [_jsx(PageHeader, { children: _jsx(PageHeader.TitleArea, { variant: "large", children: _jsx(PageHeader.Title, { children: "Your API Key is created" }) }) }), _jsx(Box, { children: _jsx(Text, { children: "Take note of the API Key value, you will not be able to see it after." }) }), _jsx(Box, { children: _jsxs(Text, { children: ["Name: ", token?.name] }) }), _jsx(Box, { children: _jsxs(Text, { children: ["Description: ", token?.description] }) }), _jsx(Box, { children: _jsxs(Text, { children: ["Expiration date: ", token?.expirationDate.toISOString()] }) }), _jsxs(Box, { children: [_jsx(Text, { mb: 2, children: "Value: " }), _jsxs(Box, { display: "flex", sx: { alignItems: 'center', gap: 2 }, children: [_jsx(Text, { as: "code", sx: {
|
|
99
|
-
color: 'fg.onEmphasis',
|
|
100
|
-
bg: 'neutral.emphasis',
|
|
101
|
-
p: 2,
|
|
102
|
-
overflowWrap: 'anywhere',
|
|
103
|
-
flex: 1,
|
|
104
|
-
}, children: token?.value }), _jsx(IconButton, { "aria-label": "Copy token to clipboard", icon: CopyIcon, size: "small", onClick: () => {
|
|
105
|
-
if (token?.value) {
|
|
106
|
-
navigator.clipboard.writeText(token.value);
|
|
107
|
-
enqueueToast('Token copied to clipboard', {
|
|
108
|
-
variant: 'success',
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
} })] })] }), _jsx(Box, { mt: 3, children: _jsx(Button, { onClick: e => navigate(tokensListRoute, 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: "Token type" }), _jsx(Select, { name: "type", value: formValues.variant, onChange: valueVariantChange, children: _jsx(Select.Option, { value: "user_token", children: "User Token" }) }), _jsx(FormControl.Caption, { children: "Pick the most appropriate token type." })] }), _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 ||
|
|
112
|
-
!validationResult.description ||
|
|
113
|
-
!validationResult.expirationDate, sx: { marginTop: 2 }, onClick: e => {
|
|
114
|
-
e.preventDefault();
|
|
115
|
-
valueSubmit();
|
|
116
|
-
}, children: "Create a token" })] }) }) })] })) }));
|
|
117
|
-
};
|
|
118
|
-
export default IAMTokenNew;
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export type IAMTokensProps = {
|
|
2
|
-
/** Route to navigate when clicking "New API Key" button. Defaults to '/new/token'. */
|
|
3
|
-
newTokenRoute?: string;
|
|
4
|
-
/** Base route for the tokens list (used for edit navigation). Defaults to current relative path. */
|
|
5
|
-
tokensListRoute?: 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 IAMTokens: ({ newTokenRoute, tokensListRoute, showTitle, showNewButton, }?: IAMTokensProps) => import("react/jsx-runtime").JSX.Element;
|
|
12
|
-
export default IAMTokens;
|
|
@@ -1,87 +0,0 @@
|
|
|
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, Text, Label, RelativeTime, ConfirmationDialog, } from '@primer/react';
|
|
8
|
-
import { Blankslate, 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 TokensTable = ({ tokensListRoute, showTitle = true, }) => {
|
|
14
|
-
const { useTokens, useDeleteToken } = useCache();
|
|
15
|
-
const { enqueueToast } = useToast();
|
|
16
|
-
const getTokensQuery = useTokens();
|
|
17
|
-
const deleteTokenMutation = useDeleteToken();
|
|
18
|
-
const navigate = useNavigate();
|
|
19
|
-
const [tokens, setTokens] = useState([]);
|
|
20
|
-
const [deletingToken, setDeletingToken] = useState(null);
|
|
21
|
-
const returnFocusRef = useRef(null);
|
|
22
|
-
useEffect(() => {
|
|
23
|
-
if (getTokensQuery.data) {
|
|
24
|
-
setTokens(getTokensQuery.data);
|
|
25
|
-
}
|
|
26
|
-
}, [getTokensQuery.data]);
|
|
27
|
-
const handleDeleteConfirm = () => {
|
|
28
|
-
if (!deletingToken)
|
|
29
|
-
return;
|
|
30
|
-
deleteTokenMutation.mutate(deletingToken.id, {
|
|
31
|
-
onSuccess: (resp) => {
|
|
32
|
-
if (resp.success) {
|
|
33
|
-
enqueueToast(`Token "${deletingToken.name}" deleted.`, {
|
|
34
|
-
variant: 'success',
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
enqueueToast(resp.message || 'Failed to delete token.', {
|
|
39
|
-
variant: 'error',
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
},
|
|
43
|
-
onError: () => {
|
|
44
|
-
enqueueToast('Failed to delete token.', { variant: 'error' });
|
|
45
|
-
},
|
|
46
|
-
onSettled: () => setDeletingToken(null),
|
|
47
|
-
});
|
|
48
|
-
};
|
|
49
|
-
return tokens.length === 0 ? (_jsxs(Blankslate, { border: true, spacious: true, 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: "tokens", children: "API Keys" }), _jsx(Table.Subtitle, { as: "p", id: "tokens-subtitle", children: "Your tokens." })] })), _jsx(DataTable, { "aria-labelledby": "teams", "aria-describedby": "teams-subtitle", data: tokens, columns: [
|
|
50
|
-
{
|
|
51
|
-
header: 'Type',
|
|
52
|
-
field: 'variant',
|
|
53
|
-
renderCell: token => _jsx(Label, { children: token.variant }),
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
header: 'Name',
|
|
57
|
-
field: 'name',
|
|
58
|
-
rowHeader: true,
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
header: 'Description',
|
|
62
|
-
field: 'description',
|
|
63
|
-
},
|
|
64
|
-
{
|
|
65
|
-
header: 'Expiration date',
|
|
66
|
-
field: 'expirationDate',
|
|
67
|
-
renderCell: token => (_jsx(RelativeTime, { date: new Date(token.expirationDate) })),
|
|
68
|
-
},
|
|
69
|
-
{
|
|
70
|
-
header: '',
|
|
71
|
-
field: 'id',
|
|
72
|
-
renderCell: token => (_jsxs(Box, { display: "flex", sx: { gap: 1 }, children: [_jsx(IconButton, { icon: EditIcon, "aria-label": "Edit", size: "small", variant: "invisible", onClick: e => navigate(tokensListRoute
|
|
73
|
-
? `${tokensListRoute}/${token.id}`
|
|
74
|
-
: `${token.id}`, e) }), _jsx(IconButton, { ref: returnFocusRef, icon: TrashIcon, "aria-label": "Delete", size: "small", variant: "invisible", sx: { color: 'danger.fg' }, onClick: () => setDeletingToken(token) })] })),
|
|
75
|
-
},
|
|
76
|
-
] })] }), deletingToken && (_jsxs(ConfirmationDialog, { title: "Delete token", onClose: gesture => {
|
|
77
|
-
if (gesture === 'confirm')
|
|
78
|
-
handleDeleteConfirm();
|
|
79
|
-
else
|
|
80
|
-
setDeletingToken(null);
|
|
81
|
-
}, confirmButtonContent: "Delete", confirmButtonType: "danger", children: ["Are you sure you want to delete the token", ' ', _jsx("strong", { children: deletingToken.name }), "? This action cannot be undone."] }))] }));
|
|
82
|
-
};
|
|
83
|
-
export const IAMTokens = ({ newTokenRoute = '/new/token', tokensListRoute, showTitle = true, showNewButton = true, } = {}) => {
|
|
84
|
-
const navigate = useNavigate();
|
|
85
|
-
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(newTokenRoute, e), children: "New API Key" }) }))] }) })) : null, _jsx(PageLayout.Content, { children: _jsx(Box, { children: _jsx(TokensTable, { tokensListRoute: tokensListRoute, showTitle: showTitle }) }) })] }));
|
|
86
|
-
};
|
|
87
|
-
export default IAMTokens;
|
|
@@ -1,85 +0,0 @@
|
|
|
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, Text, Label, RelativeTime, ConfirmationDialog, } from '@primer/react';
|
|
8
|
-
import { Blankslate, 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 TokensTable = () => {
|
|
14
|
-
const { useTokens, useDeleteToken } = useCache();
|
|
15
|
-
const { enqueueToast } = useToast();
|
|
16
|
-
const getTokensQuery = useTokens();
|
|
17
|
-
const deleteTokenMutation = useDeleteToken();
|
|
18
|
-
const navigate = useNavigate();
|
|
19
|
-
const [tokens, setTokens] = useState([]);
|
|
20
|
-
const [deletingToken, setDeletingToken] = useState(null);
|
|
21
|
-
const returnFocusRef = useRef(null);
|
|
22
|
-
useEffect(() => {
|
|
23
|
-
if (getTokensQuery.data) {
|
|
24
|
-
setTokens(getTokensQuery.data);
|
|
25
|
-
}
|
|
26
|
-
}, [getTokensQuery.data]);
|
|
27
|
-
const handleDeleteConfirm = () => {
|
|
28
|
-
if (!deletingToken)
|
|
29
|
-
return;
|
|
30
|
-
deleteTokenMutation.mutate(deletingToken.id, {
|
|
31
|
-
onSuccess: (resp) => {
|
|
32
|
-
if (resp.success) {
|
|
33
|
-
enqueueToast(`Token "${deletingToken.name}" deleted.`, {
|
|
34
|
-
variant: 'success',
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
enqueueToast(resp.message || 'Failed to delete token.', {
|
|
39
|
-
variant: 'error',
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
},
|
|
43
|
-
onError: () => {
|
|
44
|
-
enqueueToast('Failed to delete token.', { variant: 'error' });
|
|
45
|
-
},
|
|
46
|
-
onSettled: () => setDeletingToken(null),
|
|
47
|
-
});
|
|
48
|
-
};
|
|
49
|
-
return tokens.length === 0 ? (_jsxs(Blankslate, { border: true, spacious: true, children: [_jsx(Blankslate.Heading, { children: "Tokens" }), _jsx(Blankslate.Description, { children: _jsx(Text, { sx: { textAlign: 'center' }, children: "No Tokens found." }) })] })) : (_jsxs(_Fragment, { children: [_jsxs(Table.Container, { children: [_jsx(Table.Title, { as: "h2", id: "tokens", children: "Tokens" }), _jsx(Table.Subtitle, { as: "p", id: "tokens-subtitle", children: "Your tokens." }), _jsx(DataTable, { "aria-labelledby": "teams", "aria-describedby": "teams-subtitle", data: tokens, columns: [
|
|
50
|
-
{
|
|
51
|
-
header: 'Type',
|
|
52
|
-
field: 'variant',
|
|
53
|
-
renderCell: token => _jsx(Label, { children: token.variant }),
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
header: 'Name',
|
|
57
|
-
field: 'name',
|
|
58
|
-
rowHeader: true,
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
header: 'Description',
|
|
62
|
-
field: 'description',
|
|
63
|
-
},
|
|
64
|
-
{
|
|
65
|
-
header: 'Expiration date',
|
|
66
|
-
field: 'expirationDate',
|
|
67
|
-
renderCell: token => (_jsx(RelativeTime, { date: new Date(token.expirationDate) })),
|
|
68
|
-
},
|
|
69
|
-
{
|
|
70
|
-
header: '',
|
|
71
|
-
field: 'id',
|
|
72
|
-
renderCell: token => (_jsxs(Box, { display: "flex", sx: { gap: 1 }, children: [_jsx(IconButton, { icon: EditIcon, "aria-label": "Edit", size: "small", variant: "invisible", onClick: e => navigate(`${token.id}`, e) }), _jsx(IconButton, { ref: returnFocusRef, icon: TrashIcon, "aria-label": "Delete", size: "small", variant: "invisible", sx: { color: 'danger.fg' }, onClick: () => setDeletingToken(token) })] })),
|
|
73
|
-
},
|
|
74
|
-
] })] }), deletingToken && (_jsxs(ConfirmationDialog, { title: "Delete token", onClose: gesture => {
|
|
75
|
-
if (gesture === 'confirm')
|
|
76
|
-
handleDeleteConfirm();
|
|
77
|
-
else
|
|
78
|
-
setDeletingToken(null);
|
|
79
|
-
}, confirmButtonContent: "Delete", confirmButtonType: "danger", children: ["Are you sure you want to delete the token", ' ', _jsx("strong", { children: deletingToken.name }), "? This action cannot be undone."] }))] }));
|
|
80
|
-
};
|
|
81
|
-
export const Tokens = () => {
|
|
82
|
-
const navigate = useNavigate();
|
|
83
|
-
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: "Tokens" }) }), _jsx(PageHeader.Actions, { children: _jsx(Button, { size: "small", variant: "primary", onClick: e => navigate('/tokens/new', e), children: "New token" }) })] }) }), _jsx(PageLayout.Content, { children: _jsx(Box, { children: _jsx(TokensTable, {}) }) })] }));
|
|
84
|
-
};
|
|
85
|
-
export default Tokens;
|
|
File without changes
|
|
File without changes
|
|
File without changes
|