@datalayer/core 1.0.25 → 1.1.43
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 +11 -134
- package/lib/api/index.d.ts +0 -9
- package/lib/api/index.js +0 -9
- package/lib/cli-login.js +167 -0
- package/lib/client/auth/AuthenticationManager.d.ts +3 -3
- package/lib/client/auth/AuthenticationManager.js +13 -13
- package/lib/client/auth/strategies.d.ts +2 -2
- package/lib/client/auth/strategies.js +6 -6
- package/lib/client/base.d.ts +9 -12
- package/lib/client/base.js +17 -19
- package/lib/client/index.d.ts +10 -98
- package/lib/client/index.js +12 -21
- package/lib/client/mixins/IAMMixin.js +26 -26
- package/lib/components/auth/Login.js +2 -2
- 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/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.js +4 -0
- 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 +0 -1
- package/lib/components/index.js +0 -1
- 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 +79 -42
- 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 +194 -147
- 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.js +4 -0
- package/lib/components/time/index.js +4 -0
- package/lib/components/timeline/index.js +4 -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/config/Configuration.d.ts +13 -13
- package/lib/config/Configuration.js +5 -5
- 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 +64 -35
- package/lib/hooks/useCache.js +661 -306
- package/lib/hooks/useDatalayer.js +3 -1
- package/lib/hooks/useIAM.js +2 -4
- 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/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/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/UserSettings.d.ts +1 -1
- package/lib/models/UserSettings.js +1 -1
- package/lib/models/index.d.ts +0 -30
- package/lib/models/index.js +0 -30
- package/lib/otel/client/OtelClient.d.ts +2 -2
- package/lib/otel/client/OtelClient.js +2 -2
- package/lib/otel/hooks/index.js +5 -5
- package/lib/otel/types.d.ts +1 -1
- package/lib/otel/views/OtelLive.js +1 -1
- 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 +13 -13
- package/lib/state/substates/IAMState.d.ts +1 -1
- package/lib/state/substates/IAMState.js +14 -14
- package/lib/state/substates/LayoutState.d.ts +12 -1
- package/lib/state/substates/SurveysState.d.ts +1 -1
- package/lib/state/substates/SurveysState.js +10 -10
- package/lib/state/substates/index.d.ts +0 -7
- package/lib/state/substates/index.js +0 -7
- package/lib/utils/Handles.js +3 -1
- package/lib/utils/index.d.ts +0 -1
- package/lib/utils/index.js +0 -1
- package/lib/views/api-keys/APIKeys.js +12 -3
- 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 +111 -13
- 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/scheduler/index.d.ts +0 -6
- package/lib/api/scheduler/index.js +0 -10
- package/lib/api/scheduler/schedules.d.ts +0 -85
- package/lib/api/scheduler/schedules.js +0 -78
- 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/scheduler/ScheduleMenu.d.ts +0 -54
- package/lib/components/scheduler/ScheduleMenu.js +0 -154
- package/lib/components/scheduler/index.d.ts +0 -1
- package/lib/components/scheduler/index.js +0 -5
- 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/jupyter/index.js +0 -5
- 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/{mocks/jupyter/index.d.ts → cli-login.d.ts} +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { jsx as _jsx,
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
/*
|
|
3
3
|
* Copyright (c) 2023-2025 Datalayer, Inc.
|
|
4
4
|
* Distributed under the terms of the Modified BSD License.
|
|
5
5
|
*/
|
|
6
6
|
import { useState, useEffect, useRef } from 'react';
|
|
7
|
-
import { PageLayout, Button, IconButton, TextInput, Text, Label, RelativeTime, } from '@primer/react';
|
|
7
|
+
import { PageLayout, Button, IconButton, Spinner, TextInput, Text, Label, RelativeTime, } from '@primer/react';
|
|
8
8
|
import { Blankslate, Dialog, PageHeader, Table, DataTable, } from '@primer/react/experimental';
|
|
9
9
|
import { Box } from '@datalayer/primer-addons';
|
|
10
10
|
import { EditIcon } from '@datalayer/icons-react';
|
|
@@ -20,6 +20,10 @@ const APIKeysTable = ({ apiKeysListRoute, showTitle = true, }) => {
|
|
|
20
20
|
const [deletingAPIKey, setDeletingAPIKey] = useState(null);
|
|
21
21
|
const [deleteNameConfirm, setDeleteNameConfirm] = useState('');
|
|
22
22
|
const returnFocusRef = useRef(null);
|
|
23
|
+
const showInitialSpinner = apiKeys.length === 0
|
|
24
|
+
&& (getAPIKeysQuery.isLoading
|
|
25
|
+
|| getAPIKeysQuery.isFetching
|
|
26
|
+
|| !Array.isArray(getAPIKeysQuery.data));
|
|
23
27
|
useEffect(() => {
|
|
24
28
|
if (getAPIKeysQuery.data) {
|
|
25
29
|
const normalized = getAPIKeysQuery.data.filter((apiKey) => Boolean(apiKey));
|
|
@@ -57,7 +61,12 @@ const APIKeysTable = ({ apiKeysListRoute, showTitle = true, }) => {
|
|
|
57
61
|
},
|
|
58
62
|
});
|
|
59
63
|
};
|
|
60
|
-
return apiKeys.length === 0 ? (
|
|
64
|
+
return apiKeys.length === 0 ? (_jsx(Blankslate, { border: true, spacious: true, children: showInitialSpinner ? (_jsx(Box, { sx: {
|
|
65
|
+
display: 'flex',
|
|
66
|
+
alignItems: 'center',
|
|
67
|
+
justifyContent: 'center',
|
|
68
|
+
minHeight: '40px',
|
|
69
|
+
}, children: _jsx(Spinner, {}) })) : (_jsxs(_Fragment, { children: [showTitle && _jsx(Blankslate.Heading, { children: "API Keys" }), _jsx(Blankslate.Description, { children: _jsx(Text, { sx: { textAlign: 'center' }, children: "No API Keys found." }) })] })) })) : (_jsxs(_Fragment, { children: [_jsxs(Table.Container, { children: [showTitle && (_jsxs(_Fragment, { children: [_jsx(Table.Title, { as: "h2", id: "api-keys", children: "API Keys" }), _jsx(Table.Subtitle, { as: "p", id: "api-keys-subtitle", children: "Your API keys." })] })), _jsx(DataTable, { "aria-labelledby": "api-keys", "aria-describedby": "api-keys-subtitle", data: apiKeys, columns: [
|
|
61
70
|
{
|
|
62
71
|
header: 'Type',
|
|
63
72
|
field: 'variant',
|
|
@@ -2,7 +2,7 @@ export type DatasourceDetailProps = {
|
|
|
2
2
|
/** Optional principal uid used to scope datasource reads/updates. */
|
|
3
3
|
principalUid?: string;
|
|
4
4
|
/** Optional principal kind used to scope datasource reads/updates. */
|
|
5
|
-
principalKind?: '
|
|
5
|
+
principalKind?: 'personal' | 'organization' | 'team';
|
|
6
6
|
};
|
|
7
7
|
export declare const DatasourceDetail: ({ principalUid, principalKind, }?: DatasourceDetailProps) => import("react/jsx-runtime").JSX.Element;
|
|
8
8
|
export default DatasourceDetail;
|
|
@@ -7,7 +7,7 @@ export type DatasourceNewProps = {
|
|
|
7
7
|
/** Optional principal uid used to scope datasource creation. */
|
|
8
8
|
principalUid?: string;
|
|
9
9
|
/** Optional principal kind used to scope datasource creation. */
|
|
10
|
-
principalKind?: '
|
|
10
|
+
principalKind?: 'personal' | 'organization' | 'team';
|
|
11
11
|
/** Optional contextual principal summary rendered below the page intro. */
|
|
12
12
|
accountPrincipal?: ReactNode;
|
|
13
13
|
};
|
|
@@ -6,7 +6,7 @@ export type DatasourcesProps = {
|
|
|
6
6
|
/** Optional principal uid used to scope datasource reads. */
|
|
7
7
|
principalUid?: string;
|
|
8
8
|
/** Optional principal kind used to scope datasource reads. */
|
|
9
|
-
principalKind?: '
|
|
9
|
+
principalKind?: 'personal' | 'organization' | 'team';
|
|
10
10
|
};
|
|
11
11
|
export declare const Datasources: ({ newDatasourceRoute, datasourcesListRoute, principalUid, principalKind, }?: DatasourcesProps) => import("react/jsx-runtime").JSX.Element;
|
|
12
12
|
export default Datasources;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
/*
|
|
3
3
|
* Copyright (c) 2023-2025 Datalayer, Inc.
|
|
4
4
|
* Distributed under the terms of the Modified BSD License.
|
|
5
5
|
*/
|
|
6
6
|
import { useState, useEffect } from 'react';
|
|
7
|
-
import { PageLayout, Button, IconButton, Text, Label, Heading, } from '@primer/react';
|
|
7
|
+
import { PageLayout, Button, IconButton, Spinner, Text, Label, Heading, } from '@primer/react';
|
|
8
8
|
import { Blankslate, Table, DataTable } from '@primer/react/experimental';
|
|
9
9
|
import { DatabaseIcon } from '@primer/octicons-react';
|
|
10
10
|
import { Box } from '@datalayer/primer-addons';
|
|
@@ -15,12 +15,21 @@ const DatasourcesTable = ({ datasourcesListRoute, principalUid, principalKind, }
|
|
|
15
15
|
const datasourcesQuery = useDatasources({ principalUid, principalKind });
|
|
16
16
|
const navigate = useNavigate();
|
|
17
17
|
const [datasources, setDatasources] = useState([]);
|
|
18
|
+
const showInitialSpinner = datasources.length === 0
|
|
19
|
+
&& (datasourcesQuery.isLoading
|
|
20
|
+
|| datasourcesQuery.isFetching
|
|
21
|
+
|| !Array.isArray(datasourcesQuery.data));
|
|
18
22
|
useEffect(() => {
|
|
19
23
|
if (datasourcesQuery.data) {
|
|
20
24
|
setDatasources(datasourcesQuery.data || []);
|
|
21
25
|
}
|
|
22
26
|
}, [datasourcesQuery.data]);
|
|
23
|
-
return datasources.length === 0 ? (
|
|
27
|
+
return datasources.length === 0 ? (_jsx(Blankslate, { border: true, spacious: true, children: showInitialSpinner ? (_jsx(Box, { sx: {
|
|
28
|
+
display: 'flex',
|
|
29
|
+
alignItems: 'center',
|
|
30
|
+
justifyContent: 'center',
|
|
31
|
+
minHeight: '40px',
|
|
32
|
+
}, children: _jsx(Spinner, {}) })) : (_jsxs(_Fragment, { children: [_jsx(Blankslate.Heading, { children: "Datasources" }), _jsx(Blankslate.Description, { children: _jsx(Text, { sx: { textAlign: 'center' }, children: "No Datasources found." }) })] })) })) : (_jsx(Table.Container, { children: _jsx(DataTable, { "aria-labelledby": "teams", "aria-describedby": "teams-subtitle", data: datasources, columns: [
|
|
24
33
|
// @ts-ignore
|
|
25
34
|
{
|
|
26
35
|
header: 'Type',
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* `{ handle, password }`, then calls `onSignIn(token, handle)` on
|
|
6
6
|
* success so the caller can persist credentials as needed.
|
|
7
7
|
*
|
|
8
|
-
* @module views/
|
|
8
|
+
* @module views/iam
|
|
9
9
|
*/
|
|
10
10
|
import React from 'react';
|
|
11
11
|
export interface SignInSimpleProps {
|
|
@@ -25,19 +25,55 @@ export interface SignInSimpleProps {
|
|
|
25
25
|
* `{ success: boolean; token?: string; message?: string }`.
|
|
26
26
|
*/
|
|
27
27
|
loginUrl?: string;
|
|
28
|
+
/**
|
|
29
|
+
* Optional product/app name shown as heading.
|
|
30
|
+
*/
|
|
31
|
+
name?: string;
|
|
28
32
|
/**
|
|
29
33
|
* Optional heading text. Defaults to `"Datalayer OTEL"`.
|
|
34
|
+
* @deprecated Use `name`.
|
|
30
35
|
*/
|
|
31
36
|
title?: string;
|
|
32
37
|
/**
|
|
33
38
|
* Optional subtitle / description.
|
|
34
39
|
*/
|
|
35
40
|
description?: string;
|
|
41
|
+
/**
|
|
42
|
+
* Optional icon element rendered next to the heading.
|
|
43
|
+
*/
|
|
44
|
+
icon?: React.ReactNode;
|
|
36
45
|
/**
|
|
37
46
|
* Leading icon element rendered next to the title.
|
|
38
47
|
* Defaults to `<TelescopeIcon size={24} />`.
|
|
48
|
+
* @deprecated Use `icon`.
|
|
39
49
|
*/
|
|
40
50
|
leadingIcon?: React.ReactNode;
|
|
51
|
+
/**
|
|
52
|
+
* Show GitHub OAuth sign-in button.
|
|
53
|
+
*/
|
|
54
|
+
github?: boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Show Google OAuth sign-in button.
|
|
57
|
+
*/
|
|
58
|
+
google?: boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Show LinkedIn OAuth sign-in button.
|
|
61
|
+
*/
|
|
62
|
+
linkedin?: boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Show API key sign-in button.
|
|
65
|
+
*/
|
|
66
|
+
apiKey?: boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Show sign up button.
|
|
69
|
+
*/
|
|
70
|
+
signUp?: boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Optional target route to navigate to after social sign-in callback.
|
|
73
|
+
* - `undefined` keeps current behavior (use current route when not `/`).
|
|
74
|
+
* - `null`/empty disables forwarding any callback navigation target.
|
|
75
|
+
*/
|
|
76
|
+
socialSignInNavigationTarget?: string | null;
|
|
41
77
|
}
|
|
42
78
|
export declare const SignInSimple: React.FC<SignInSimpleProps>;
|
|
43
79
|
export default SignInSimple;
|
|
@@ -10,29 +10,122 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
10
10
|
* `{ handle, password }`, then calls `onSignIn(token, handle)` on
|
|
11
11
|
* success so the caller can persist credentials as needed.
|
|
12
12
|
*
|
|
13
|
-
* @module views/
|
|
13
|
+
* @module views/iam
|
|
14
14
|
*/
|
|
15
15
|
import { useState, useCallback, useRef, useMemo, useEffect, } from 'react';
|
|
16
|
+
import { PageConfig, URLExt } from '@jupyterlab/coreutils';
|
|
16
17
|
import { Box, Button, FormControl, Heading, Text, Textarea, TextInput, } from '@primer/react';
|
|
17
18
|
import { EyeIcon, EyeClosedIcon, KeyIcon, LinkExternalIcon, TelescopeIcon, } from '@primer/octicons-react';
|
|
18
|
-
import {
|
|
19
|
+
import { GithubMarkIcon, LinkedInGreyIcon } from '@datalayer/icons-react';
|
|
20
|
+
import { isInsideJupyterLab } from '../../utils/Jupyter.js';
|
|
21
|
+
const GoogleIcon = () => (_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", preserveAspectRatio: "xMidYMid", viewBox: "0 0 256 262", height: "16px", fill: "currentColor", "aria-hidden": "true", children: [_jsx("path", { fill: "currentColor", d: "M255.878 133.451c0-10.734-.871-18.567-2.756-26.69H130.55v48.448h71.947c-1.45 12.04-9.283 30.172-26.69 42.356l-.244 1.622 38.755 30.023 2.685.268c24.659-22.774 38.875-56.282 38.875-96.027" }), _jsx("path", { fill: "currentColor", d: "M130.55 261.1c35.248 0 64.839-11.605 86.453-31.622l-41.196-31.913c-11.024 7.688-25.82 13.055-45.257 13.055-34.523 0-63.824-22.773-74.269-54.25l-1.531.13-40.298 31.187-.527 1.465C35.393 231.798 79.49 261.1 130.55 261.1" }), _jsx("path", { fill: "currentColor", d: "M56.281 156.37c-2.756-8.123-4.351-16.827-4.351-25.82 0-8.994 1.595-17.697 4.206-25.82l-.073-1.73L15.26 71.312l-1.335.635C5.077 89.644 0 109.517 0 130.55s5.077 40.905 13.925 58.602l42.356-32.782" }), _jsx("path", { fill: "currentColor", d: "M130.55 50.479c24.514 0 41.05 10.589 50.479 19.438l36.844-35.974C195.245 12.91 165.798 0 130.55 0 79.49 0 35.393 29.301 13.925 71.947l42.211 32.783c10.59-31.477 39.891-54.251 74.414-54.251" })] }));
|
|
22
|
+
const OAUTH2_PROVIDERS = {
|
|
23
|
+
github: {
|
|
24
|
+
name: 'github',
|
|
25
|
+
oauth2CallbackServerRoute: 'jupyter_iam/oauth2/callback',
|
|
26
|
+
oauth2CallbackUIRoute: '/iam/oauth2/github/callback',
|
|
27
|
+
},
|
|
28
|
+
google: {
|
|
29
|
+
name: 'google',
|
|
30
|
+
oauth2CallbackServerRoute: 'jupyter_iam/oauth2/callback',
|
|
31
|
+
oauth2CallbackUIRoute: '/iam/oauth2/google/callback',
|
|
32
|
+
},
|
|
33
|
+
linkedin: {
|
|
34
|
+
name: 'linkedin',
|
|
35
|
+
oauth2CallbackServerRoute: 'jupyter_iam/oauth2/callback',
|
|
36
|
+
oauth2CallbackUIRoute: '/iam/oauth2/linkedin/callback',
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
const getIAMUrlFromDocumentConfig = () => {
|
|
40
|
+
if (typeof document === 'undefined') {
|
|
41
|
+
return '';
|
|
42
|
+
}
|
|
43
|
+
const configScript = document.getElementById('datalayer-config-data');
|
|
44
|
+
if (!configScript?.textContent) {
|
|
45
|
+
return '';
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
const config = JSON.parse(configScript.textContent);
|
|
49
|
+
return String(config?.iamUrl || '').replace(/\/$/, '');
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return '';
|
|
53
|
+
}
|
|
54
|
+
};
|
|
19
55
|
// ── Component ────────────────────────────────────────────────────────
|
|
20
|
-
export const SignInSimple = ({ onSignIn, onApiKeySignIn, loginUrl: loginUrlProp, title = 'Datalayer OTEL', description = 'Sign in to access the observability dashboard.', leadingIcon = _jsx(TelescopeIcon, { size: 24 }), }) => {
|
|
56
|
+
export const SignInSimple = ({ onSignIn, onApiKeySignIn, loginUrl: loginUrlProp, name, title = 'Datalayer OTEL', description = 'Sign in to access the observability dashboard.', icon, leadingIcon = _jsx(TelescopeIcon, { size: 24 }), github = false, google = false, linkedin = false, apiKey = false, signUp = true, socialSignInNavigationTarget, }) => {
|
|
57
|
+
const headingText = name ?? title;
|
|
58
|
+
const headingIcon = icon ?? leadingIcon;
|
|
21
59
|
const loginUrl = useMemo(() => {
|
|
22
60
|
if (loginUrlProp)
|
|
23
61
|
return loginUrlProp;
|
|
24
|
-
const
|
|
25
|
-
return
|
|
62
|
+
const iamUrl = getIAMUrlFromDocumentConfig();
|
|
63
|
+
return iamUrl ? `${iamUrl}/api/iam/v1/login` : '/api/iam/v1/login';
|
|
26
64
|
}, [loginUrlProp]);
|
|
27
65
|
const [handle, setHandle] = useState('');
|
|
28
66
|
const [password, setPassword] = useState('');
|
|
29
67
|
const [showPassword, setShowPassword] = useState(false);
|
|
30
68
|
const [loading, setLoading] = useState(false);
|
|
69
|
+
const [socialLoading, setSocialLoading] = useState(false);
|
|
31
70
|
const [error, setError] = useState(null);
|
|
32
71
|
// API Key dialog state
|
|
33
72
|
const [showApiKeyDialog, setShowApiKeyDialog] = useState(false);
|
|
34
|
-
const [
|
|
73
|
+
const [apiKeyValue, setApiKeyValue] = useState('');
|
|
35
74
|
const apiKeyRef = useRef(null);
|
|
75
|
+
const buildCallbackURI = useCallback((providerSpec) => {
|
|
76
|
+
if (isInsideJupyterLab()) {
|
|
77
|
+
return URLExt.join(PageConfig.getBaseUrl(), providerSpec.oauth2CallbackServerRoute);
|
|
78
|
+
}
|
|
79
|
+
return `${window.location.protocol}//${window.location.hostname}${window.location.port ? `:${window.location.port}` : ''}${providerSpec.oauth2CallbackUIRoute}`;
|
|
80
|
+
}, []);
|
|
81
|
+
const currentRelativeRoute = useMemo(() => {
|
|
82
|
+
if (typeof window === 'undefined') {
|
|
83
|
+
return '/';
|
|
84
|
+
}
|
|
85
|
+
const route = `${window.location.pathname}${window.location.search}${window.location.hash}`;
|
|
86
|
+
return route.startsWith('/') ? route : '/';
|
|
87
|
+
}, []);
|
|
88
|
+
const startOAuthSignIn = useCallback(async (providerSpec) => {
|
|
89
|
+
setError(null);
|
|
90
|
+
setSocialLoading(true);
|
|
91
|
+
try {
|
|
92
|
+
const iamUrl = getIAMUrlFromDocumentConfig();
|
|
93
|
+
const params = new URLSearchParams({
|
|
94
|
+
provider: providerSpec.name,
|
|
95
|
+
callback_uri: buildCallbackURI(providerSpec),
|
|
96
|
+
});
|
|
97
|
+
const explicitNavigationTarget = socialSignInNavigationTarget === undefined
|
|
98
|
+
? undefined
|
|
99
|
+
: String(socialSignInNavigationTarget || '').trim();
|
|
100
|
+
const callbackNavigationTarget = explicitNavigationTarget === undefined
|
|
101
|
+
? currentRelativeRoute && currentRelativeRoute !== '/'
|
|
102
|
+
? currentRelativeRoute
|
|
103
|
+
: undefined
|
|
104
|
+
: explicitNavigationTarget &&
|
|
105
|
+
explicitNavigationTarget.startsWith('/') &&
|
|
106
|
+
!explicitNavigationTarget.startsWith('//')
|
|
107
|
+
? explicitNavigationTarget
|
|
108
|
+
: undefined;
|
|
109
|
+
if (callbackNavigationTarget) {
|
|
110
|
+
params.set('post_auth_redirect', callbackNavigationTarget);
|
|
111
|
+
}
|
|
112
|
+
const endpointBase = iamUrl || '';
|
|
113
|
+
const endpoint = `${endpointBase}/api/iam/v1/oauth2/authz/url?${params.toString()}`;
|
|
114
|
+
const response = await fetch(endpoint);
|
|
115
|
+
const payload = await response.json();
|
|
116
|
+
const authorizationURL = payload?.autorization_url;
|
|
117
|
+
if (!response.ok || !authorizationURL) {
|
|
118
|
+
throw new Error(payload?.message || 'Unable to start social sign-in.');
|
|
119
|
+
}
|
|
120
|
+
window.location.assign(authorizationURL);
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
setError(err instanceof Error ? err.message : 'Unable to start social sign-in.');
|
|
124
|
+
}
|
|
125
|
+
finally {
|
|
126
|
+
setSocialLoading(false);
|
|
127
|
+
}
|
|
128
|
+
}, [buildCallbackURI, currentRelativeRoute, socialSignInNavigationTarget]);
|
|
36
129
|
useEffect(() => {
|
|
37
130
|
if (showApiKeyDialog) {
|
|
38
131
|
apiKeyRef.current?.focus();
|
|
@@ -40,14 +133,14 @@ export const SignInSimple = ({ onSignIn, onApiKeySignIn, loginUrl: loginUrlProp,
|
|
|
40
133
|
}, [showApiKeyDialog]);
|
|
41
134
|
const closeApiKeyDialog = useCallback(() => {
|
|
42
135
|
setShowApiKeyDialog(false);
|
|
43
|
-
|
|
136
|
+
setApiKeyValue('');
|
|
44
137
|
}, []);
|
|
45
138
|
const handleApiKeyAuthenticate = useCallback(() => {
|
|
46
|
-
if (!
|
|
139
|
+
if (!apiKeyValue.trim() || !onApiKeySignIn)
|
|
47
140
|
return;
|
|
48
|
-
onApiKeySignIn(
|
|
141
|
+
onApiKeySignIn(apiKeyValue.trim());
|
|
49
142
|
closeApiKeyDialog();
|
|
50
|
-
}, [
|
|
143
|
+
}, [apiKeyValue, onApiKeySignIn, closeApiKeyDialog]);
|
|
51
144
|
const handleSignUp = useCallback(() => {
|
|
52
145
|
window.open('https://datalayer.ai/signup', '_blank', 'noopener,noreferrer');
|
|
53
146
|
}, []);
|
|
@@ -104,7 +197,12 @@ export const SignInSimple = ({ onSignIn, onApiKeySignIn, loginUrl: loginUrlProp,
|
|
|
104
197
|
gap: 2,
|
|
105
198
|
mb: 4,
|
|
106
199
|
justifyContent: 'center',
|
|
107
|
-
}, children: [
|
|
200
|
+
}, children: [headingIcon, _jsx(Heading, { sx: { fontSize: 3 }, children: headingText })] }), _jsx(Text, { as: "p", sx: { fontSize: 1, color: 'fg.muted', mb: 3, textAlign: 'center' }, children: description }), _jsxs(FormControl, { required: true, sx: { mb: 3 }, children: [_jsx(FormControl.Label, { children: "Username" }), _jsx(TextInput, { autoFocus: true, block: true, placeholder: "Your username", value: handle, onChange: e => setHandle(e.target.value), onKeyDown: handleKeyDown })] }), _jsxs(FormControl, { required: true, sx: { mb: 3 }, children: [_jsx(FormControl.Label, { children: "Password" }), _jsx(TextInput, { block: true, placeholder: "Your password", type: showPassword ? 'text' : 'password', value: password, onChange: e => setPassword(e.target.value), onKeyDown: handleKeyDown, trailingAction: _jsx(TextInput.Action, { onClick: () => setShowPassword(!showPassword), icon: showPassword ? EyeClosedIcon : EyeIcon, "aria-label": showPassword ? 'Hide password' : 'Show password', sx: { color: 'var(--fgColor-muted)' } }) })] }), error && (_jsx(Text, { sx: { color: 'danger.fg', fontSize: 1, mb: 3, display: 'block' }, children: error })), _jsx(Button, { variant: "primary", block: true, disabled: loading || !handle || !password, onClick: submit, children: loading ? 'Signing in…' : 'Sign in' }), (github || google || linkedin) && (_jsxs(_Fragment, { children: [_jsxs(Box, { sx: {
|
|
201
|
+
display: 'flex',
|
|
202
|
+
alignItems: 'center',
|
|
203
|
+
gap: 2,
|
|
204
|
+
my: 3,
|
|
205
|
+
}, children: [_jsx(Box, { sx: { flex: 1, height: '1px', bg: 'border.default' } }), _jsx(Text, { sx: { fontSize: 0, color: 'fg.muted' }, children: "or" }), _jsx(Box, { sx: { flex: 1, height: '1px', bg: 'border.default' } })] }), github && (_jsx(Button, { block: true, leadingVisual: GithubMarkIcon, disabled: socialLoading, onClick: () => startOAuthSignIn(OAUTH2_PROVIDERS.github), sx: { mb: 2 }, children: "Sign in with GitHub" })), google && (_jsx(Button, { block: true, leadingVisual: GoogleIcon, disabled: socialLoading, onClick: () => startOAuthSignIn(OAUTH2_PROVIDERS.google), sx: { mb: linkedin ? 2 : 0 }, children: "Sign in with Google" })), linkedin && (_jsx(Button, { block: true, leadingVisual: LinkedInGreyIcon, disabled: socialLoading, onClick: () => startOAuthSignIn(OAUTH2_PROVIDERS.linkedin), children: "Sign in with LinkedIn" }))] })), signUp && (_jsx(Box, { sx: { mt: 2, display: 'flex', justifyContent: 'center' }, children: _jsx(Button, { size: "small", variant: "invisible", leadingVisual: LinkExternalIcon, onClick: handleSignUp, children: "Sign Up" }) })), apiKey && onApiKeySignIn && (_jsxs(_Fragment, { children: [_jsxs(Box, { sx: {
|
|
108
206
|
display: 'flex',
|
|
109
207
|
alignItems: 'center',
|
|
110
208
|
gap: 2,
|
|
@@ -134,11 +232,11 @@ export const SignInSimple = ({ onSignIn, onApiKeySignIn, loginUrl: loginUrlProp,
|
|
|
134
232
|
bg: 'canvas.overlay',
|
|
135
233
|
color: 'fg.default',
|
|
136
234
|
boxShadow: 'shadow.large',
|
|
137
|
-
}, children: [_jsx(Heading, { id: "signin-api-key-title", sx: { fontSize: 2, mb: 2 }, children: "Enter your API Key" }), _jsxs(FormControl, { required: true, children: [_jsx(FormControl.Label, { children: "API Key" }), _jsx(Textarea, { block: true, required: true, autoFocus: true, placeholder: "Paste your API key here", value:
|
|
235
|
+
}, children: [_jsx(Heading, { id: "signin-api-key-title", sx: { fontSize: 2, mb: 2 }, children: "Enter your API Key" }), _jsxs(FormControl, { required: true, children: [_jsx(FormControl.Label, { children: "API Key" }), _jsx(Textarea, { block: true, required: true, autoFocus: true, placeholder: "Paste your API key here", value: apiKeyValue, onInput: (e) => setApiKeyValue(e.target.value), ref: apiKeyRef })] }), _jsxs(Box, { sx: {
|
|
138
236
|
mt: 3,
|
|
139
237
|
display: 'flex',
|
|
140
238
|
justifyContent: 'flex-end',
|
|
141
239
|
gap: 2,
|
|
142
|
-
}, children: [_jsx(Button, { type: "button", onClick: closeApiKeyDialog, children: "Cancel" }), _jsx(Button, { type: "submit", variant: "primary", disabled: !
|
|
240
|
+
}, children: [_jsx(Button, { type: "button", onClick: closeApiKeyDialog, children: "Cancel" }), _jsx(Button, { type: "submit", variant: "primary", disabled: !apiKeyValue.trim(), children: "Authenticate" })] })] }) }))] }))] }) }));
|
|
143
241
|
};
|
|
144
242
|
export default SignInSimple;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@datalayer/core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.43",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"workspaces": [
|
|
6
6
|
".",
|
|
@@ -51,8 +51,9 @@
|
|
|
51
51
|
"clean:lib": "rimraf lib tsconfig.tsbuildinfo",
|
|
52
52
|
"clean:dist": "rimraf dist",
|
|
53
53
|
"clean:cache": "rimraf node_modules/.vite",
|
|
54
|
-
"build": "npm run clean && gulp resources-to-lib && tsc -b && vite build",
|
|
54
|
+
"build": "npm run clean && gulp resources-to-lib && tsc -b && vite build && vite build --config vite.cli-login.config.ts",
|
|
55
55
|
"build:lib": "npm run clean:lib && gulp resources-to-lib && tsc -b && node scripts/fix-esm-imports.cjs",
|
|
56
|
+
"build:cli-login": "vite build --config vite.cli-login.config.ts",
|
|
56
57
|
"build:types": "npm run clean:lib && tsc -b",
|
|
57
58
|
"build:nextjs": "npm run build --workspace=nextjj-example",
|
|
58
59
|
"build:examples": "npm run build:nextjs",
|
|
@@ -89,7 +90,7 @@
|
|
|
89
90
|
"watch:lib:src": "tsc -b -w",
|
|
90
91
|
"type-check:watch": "tsc -b -w --noEmit",
|
|
91
92
|
"examples": "run-p jupyter:start examples:vite",
|
|
92
|
-
"examples:vite": "
|
|
93
|
+
"examples:vite": "VITE_DATALAYER_URL=http://localhost:8888 vite --config vite.examples.config.ts",
|
|
93
94
|
"examples:nextjs": "npm run dev --workspace=nextjj-example",
|
|
94
95
|
"jupyter:start": "./dev/sh/start-jupyter-server.sh",
|
|
95
96
|
"prepare": "husky || true",
|
|
@@ -102,6 +103,7 @@
|
|
|
102
103
|
"rebuild:fresh": "npm run create:patches && npm install && npm run build && npm run clean:cache"
|
|
103
104
|
},
|
|
104
105
|
"dependencies": {
|
|
106
|
+
"@datalayer/design": "^1.0.0",
|
|
105
107
|
"@datalayer/icons-react": "^1.0.7",
|
|
106
108
|
"@datalayer/jupyter-lexical": "^1.0.16",
|
|
107
109
|
"@datalayer/jupyter-react": "^2.0.7",
|
package/lib/App.css
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) 2023-2025 Datalayer, Inc.
|
|
3
|
-
* Distributed under the terms of the Modified BSD License.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
#root {
|
|
7
|
-
max-width: 1280px;
|
|
8
|
-
margin: 0 auto;
|
|
9
|
-
padding: 2rem;
|
|
10
|
-
/* text-align: center; */
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
.logo {
|
|
14
|
-
height: 6em;
|
|
15
|
-
padding: 1.5em;
|
|
16
|
-
will-change: filter;
|
|
17
|
-
transition: filter 300ms;
|
|
18
|
-
}
|
|
19
|
-
.logo:hover {
|
|
20
|
-
filter: drop-shadow(0 0 2em #646cffaa);
|
|
21
|
-
}
|
|
22
|
-
.logo.react:hover {
|
|
23
|
-
filter: drop-shadow(0 0 2em #61dafbaa);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
@keyframes logo-spin {
|
|
27
|
-
from {
|
|
28
|
-
transform: rotate(0deg);
|
|
29
|
-
}
|
|
30
|
-
to {
|
|
31
|
-
transform: rotate(360deg);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
@media (prefers-reduced-motion: no-preference) {
|
|
36
|
-
a:nth-of-type(2) .logo {
|
|
37
|
-
animation: logo-spin infinite 20s linear;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
.card {
|
|
42
|
-
padding: 2em;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
.read-the-docs {
|
|
46
|
-
color: #888;
|
|
47
|
-
}
|
package/lib/App.d.ts
DELETED
package/lib/App.js
DELETED
|
@@ -1,21 +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 } from 'react';
|
|
7
|
-
import reactLogo from './assets/react.svg';
|
|
8
|
-
import { useJupyter, JupyterReactTheme } from '@datalayer/jupyter-react';
|
|
9
|
-
import { CellExample } from './examples/CellExample.js';
|
|
10
|
-
import { NotebookExample } from './examples/NotebookExample.js';
|
|
11
|
-
import './App.css';
|
|
12
|
-
export function App() {
|
|
13
|
-
const { serviceManager } = useJupyter({
|
|
14
|
-
jupyterServerUrl: 'https://oss.datalayer.run/api/jupyter-server',
|
|
15
|
-
jupyterServerToken: '60c1661cc408f978c309d04157af55c9588ff9557c9380e4fb50785750703da6',
|
|
16
|
-
startDefaultKernel: true,
|
|
17
|
-
});
|
|
18
|
-
const [count, setCount] = useState(0);
|
|
19
|
-
return (_jsxs("div", { className: "App", children: [_jsx(_Fragment, { children: _jsxs(JupyterReactTheme, { children: [serviceManager && _jsx(CellExample, { serviceManager: serviceManager }), serviceManager && (_jsx(NotebookExample, { serviceManager: serviceManager }))] }) }), _jsxs("div", { children: [_jsx("a", { href: "https://reactjs.org", target: "_blank", rel: "noreferrer", children: _jsx("img", { src: reactLogo, className: "logo react", alt: "React logo" }) }), _jsx("a", { href: "https://vitejs.dev", target: "_blank", rel: "noreferrer", children: _jsx("img", { src: "/vite.svg", className: "logo", alt: "Vite logo" }) })] }), _jsx("h1", { children: "React + Vite" }), _jsx("h2", { children: "On CodeSandbox!" }), _jsxs("div", { className: "card", children: [_jsxs("button", { onClick: () => setCount(count => count + 1), children: ["count is ", count] }), _jsxs("p", { children: ["Edit ", _jsx("code", { children: "src/App.tsx" }), " and save to test HMR."] }), _jsx("p", { children: "Tip: you can use the inspector button next to address bar to click on components in the preview and open the code in the editor!" })] }), _jsx("p", { className: "read-the-docs", children: "Click on the Vite and React logos to learn more" })] }));
|
|
20
|
-
}
|
|
21
|
-
export default App;
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A single runtime checkpoint record.
|
|
3
|
-
*/
|
|
4
|
-
export interface RuntimeCheckpointData {
|
|
5
|
-
/** Unique identifier (ULID) */
|
|
6
|
-
id: string;
|
|
7
|
-
/** Human-readable name */
|
|
8
|
-
name: string;
|
|
9
|
-
/** Checkpoint description */
|
|
10
|
-
description: string;
|
|
11
|
-
/** Runtime that was checkpointed */
|
|
12
|
-
runtime_uid: string;
|
|
13
|
-
/** Agentspec identifier (e.g. "mocks/monitor-sales-kpis") */
|
|
14
|
-
agent_spec_id: string;
|
|
15
|
-
/** Full agentspec payload */
|
|
16
|
-
agentspec: Record<string, any>;
|
|
17
|
-
/** Additional metadata */
|
|
18
|
-
metadata: Record<string, any>;
|
|
19
|
-
/** Checkpoint mode: criu (full) or light (history-only) */
|
|
20
|
-
checkpoint_mode?: 'criu' | 'light';
|
|
21
|
-
/** Lightweight checkpoint message history */
|
|
22
|
-
messages?: string[];
|
|
23
|
-
/** Status: requested | created | failed | deleted */
|
|
24
|
-
status: string;
|
|
25
|
-
/** Human-readable details about the current status (e.g. error message) */
|
|
26
|
-
status_message?: string;
|
|
27
|
-
/** ISO 8601 timestamp */
|
|
28
|
-
updated_at: string;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Request payload for creating a checkpoint.
|
|
32
|
-
*/
|
|
33
|
-
export interface CreateRuntimeCheckpointRequest {
|
|
34
|
-
/** Runtime UID of the runtime that was checkpointed */
|
|
35
|
-
runtime_uid: string;
|
|
36
|
-
/** Human-readable name */
|
|
37
|
-
name?: string;
|
|
38
|
-
/** Checkpoint description */
|
|
39
|
-
description?: string;
|
|
40
|
-
/** Agentspec identifier */
|
|
41
|
-
agentspec_id?: string;
|
|
42
|
-
/** Full agentspec payload to persist */
|
|
43
|
-
agentspec?: Record<string, any>;
|
|
44
|
-
/** Additional metadata */
|
|
45
|
-
metadata?: Record<string, any>;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Response for listing checkpoints.
|
|
49
|
-
*/
|
|
50
|
-
export interface ListRuntimeCheckpointsResponse {
|
|
51
|
-
success: boolean;
|
|
52
|
-
message: string;
|
|
53
|
-
checkpoints: RuntimeCheckpointData[];
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Response for getting a single checkpoint.
|
|
57
|
-
*/
|
|
58
|
-
export interface GetRuntimeCheckpointResponse {
|
|
59
|
-
success: boolean;
|
|
60
|
-
message: string;
|
|
61
|
-
checkpoint: RuntimeCheckpointData;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Response for creating a checkpoint.
|
|
65
|
-
*/
|
|
66
|
-
export interface CreateRuntimeCheckpointResponse {
|
|
67
|
-
success: boolean;
|
|
68
|
-
message: string;
|
|
69
|
-
checkpoint: RuntimeCheckpointData;
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* List runtime checkpoints for a specific runtime.
|
|
73
|
-
* @param token - Authentication token
|
|
74
|
-
* @param baseUrl - Base URL for the runtimes API
|
|
75
|
-
* @param runtimeUid - Runtime UID to list checkpoints for
|
|
76
|
-
* @returns Promise resolving to list of checkpoints
|
|
77
|
-
*/
|
|
78
|
-
export declare const listCheckpoints: (token: string, baseUrl?: string, runtimeUid?: string) => Promise<ListRuntimeCheckpointsResponse>;
|
|
79
|
-
/**
|
|
80
|
-
* Get a single runtime checkpoint by ID.
|
|
81
|
-
* @param token - Authentication token
|
|
82
|
-
* @param runtimeUid - The runtime UID
|
|
83
|
-
* @param checkpointId - The checkpoint ID (ULID)
|
|
84
|
-
* @param baseUrl - Base URL for the runtimes API
|
|
85
|
-
* @returns Promise resolving to checkpoint details
|
|
86
|
-
*/
|
|
87
|
-
export declare const getCheckpoint: (token: string, runtimeUid: string, checkpointId: string, baseUrl?: string) => Promise<GetRuntimeCheckpointResponse>;
|
|
88
|
-
/**
|
|
89
|
-
* Create a checkpoint record (after a CRIU checkpoint has been taken).
|
|
90
|
-
* @param token - Authentication token
|
|
91
|
-
* @param data - Checkpoint creation payload (runtime_uid, agentspec, etc.)
|
|
92
|
-
* @param baseUrl - Base URL for the runtimes API
|
|
93
|
-
* @returns Promise resolving to the created checkpoint
|
|
94
|
-
*/
|
|
95
|
-
export declare const createCheckpoint: (token: string, data: CreateRuntimeCheckpointRequest, baseUrl?: string) => Promise<CreateRuntimeCheckpointResponse>;
|
|
96
|
-
/**
|
|
97
|
-
* Poll a checkpoint until it reaches one of the target statuses.
|
|
98
|
-
*
|
|
99
|
-
* Useful for waiting until an async pause (status "paused")
|
|
100
|
-
* completes before proceeding. Checkpoint status stays "paused"
|
|
101
|
-
* during resume — only the agent runtime status transitions.
|
|
102
|
-
*
|
|
103
|
-
* @param token - Authentication token
|
|
104
|
-
* @param runtimeUid - The runtime UID that owns the checkpoint
|
|
105
|
-
* @param checkpointId - The checkpoint ID (ULID) to poll
|
|
106
|
-
* @param targetStatuses - Set of statuses that signal completion (e.g. ["paused", "failed"])
|
|
107
|
-
* @param baseUrl - Base URL for the runtimes API
|
|
108
|
-
* @param intervalMs - Polling interval in milliseconds (default: 2000)
|
|
109
|
-
* @param timeoutMs - Maximum wait time in milliseconds (default: 600000 = 10 min)
|
|
110
|
-
* @returns Promise resolving to the checkpoint data once a target status is reached
|
|
111
|
-
* @throws {Error} If polling times out or the request fails
|
|
112
|
-
*/
|
|
113
|
-
export declare const waitForCheckpointStatus: (token: string, runtimeUid: string, checkpointId: string, targetStatuses: string[], baseUrl?: string, intervalMs?: number, timeoutMs?: number) => Promise<RuntimeCheckpointData>;
|
|
114
|
-
/**
|
|
115
|
-
* Delete a runtime checkpoint.
|
|
116
|
-
* @param token - Authentication token
|
|
117
|
-
* @param runtimeUid - The runtime UID that owns the checkpoint
|
|
118
|
-
* @param checkpointId - The checkpoint ID (ULID) to delete
|
|
119
|
-
* @param baseUrl - Base URL for the runtimes API
|
|
120
|
-
* @returns Promise resolving when deletion is complete
|
|
121
|
-
*/
|
|
122
|
-
export declare const deleteCheckpoint: (token: string, runtimeUid: string, checkpointId: string, baseUrl?: string) => Promise<void>;
|