@datalayer/core 1.0.25 → 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 +14 -26
- 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/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/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 +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.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/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 +407 -52
- 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/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/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/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/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 +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/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,154 +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, useMemo, useState } from 'react';
|
|
7
|
-
import { ActionList, ActionMenu, Box, Button, Dialog, FormControl, IconButton, Spinner, Text, TextInput, } from '@primer/react';
|
|
8
|
-
import { ClockIcon, TrashIcon } from '@primer/octicons-react';
|
|
9
|
-
import { disableSchedule, updateSchedule, upsertSchedule, } from '../../api/scheduler/schedules.js';
|
|
10
|
-
import { DEFAULT_SERVICE_URLS } from '../../api/constants.js';
|
|
11
|
-
const SCHEDULE_PRESETS = [
|
|
12
|
-
{ id: 'every-minute', label: 'Every minute', cron: '* * * * *' },
|
|
13
|
-
{ id: 'hourly', label: 'Every hour', cron: '0 * * * *' },
|
|
14
|
-
{ id: 'daily', label: 'Every day', cron: '0 0 * * *' },
|
|
15
|
-
];
|
|
16
|
-
const DEFAULT_CRON_EXPRESSION = '* * * * *';
|
|
17
|
-
const presetFromCron = (cronExpression) => {
|
|
18
|
-
const normalized = cronExpression.trim();
|
|
19
|
-
const preset = SCHEDULE_PRESETS.find(item => item.cron === normalized);
|
|
20
|
-
return preset ? preset.id : 'custom';
|
|
21
|
-
};
|
|
22
|
-
/**
|
|
23
|
-
* Self-contained schedule menu that lets a user pick a cron schedule for a
|
|
24
|
-
* notebook and persists it to the scheduler service.
|
|
25
|
-
*
|
|
26
|
-
* The component owns its loading state and renders a spinner in place of the
|
|
27
|
-
* anchor icon while a save request is in flight. The scheduler service URL is
|
|
28
|
-
* configurable through the `baseUrl` prop.
|
|
29
|
-
*/
|
|
30
|
-
export const ScheduleMenu = ({ notebookUid, scheduleUid, token, baseUrl = DEFAULT_SERVICE_URLS.SCHEDULER, enabled, icon = ClockIcon, iconColor, ariaLabel = 'Schedule execution', initialPreset = 'every-minute', initialCronExpression, onSaved, onDeleted, onError, }) => {
|
|
31
|
-
const providedInitialCron = (initialCronExpression || '').trim();
|
|
32
|
-
const hasProvidedInitialCron = providedInitialCron.length > 0;
|
|
33
|
-
const initialCron = hasProvidedInitialCron
|
|
34
|
-
? providedInitialCron
|
|
35
|
-
: DEFAULT_CRON_EXPRESSION;
|
|
36
|
-
const [cronExpression, setCronExpression] = useState(initialCron);
|
|
37
|
-
const [hasExplicitCron, setHasExplicitCron] = useState(hasProvidedInitialCron);
|
|
38
|
-
const [isSaving, setIsSaving] = useState(false);
|
|
39
|
-
const [isDeleting, setIsDeleting] = useState(false);
|
|
40
|
-
const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);
|
|
41
|
-
const [deleteConfirmUid, setDeleteConfirmUid] = useState('');
|
|
42
|
-
useEffect(() => {
|
|
43
|
-
const nextProvidedCron = (initialCronExpression || '').trim();
|
|
44
|
-
const nextHasExplicitCron = nextProvidedCron.length > 0;
|
|
45
|
-
setHasExplicitCron(nextHasExplicitCron);
|
|
46
|
-
setCronExpression(nextHasExplicitCron ? nextProvidedCron : DEFAULT_CRON_EXPRESSION);
|
|
47
|
-
}, [initialCronExpression, scheduleUid, notebookUid]);
|
|
48
|
-
const preset = useMemo(() => (hasExplicitCron ? presetFromCron(cronExpression) : 'custom'), [cronExpression, hasExplicitCron]);
|
|
49
|
-
const isEnabled = (enabled ?? true) &&
|
|
50
|
-
Boolean(token) &&
|
|
51
|
-
Boolean(notebookUid || scheduleUid) &&
|
|
52
|
-
!isSaving &&
|
|
53
|
-
!isDeleting;
|
|
54
|
-
const selectedPresetDescription = useMemo(() => {
|
|
55
|
-
if (!hasExplicitCron) {
|
|
56
|
-
return 'Not scheduled';
|
|
57
|
-
}
|
|
58
|
-
const selected = SCHEDULE_PRESETS.find(item => item.cron === cronExpression.trim());
|
|
59
|
-
if (selected) {
|
|
60
|
-
return `${selected.label} (${selected.cron})`;
|
|
61
|
-
}
|
|
62
|
-
return `Custom (${cronExpression || 'Cron expression not set'})`;
|
|
63
|
-
}, [cronExpression, hasExplicitCron]);
|
|
64
|
-
const saveSchedule = async (nextPreset, nextCron) => {
|
|
65
|
-
const cron = nextCron.trim();
|
|
66
|
-
if (!token || (!notebookUid && !scheduleUid) || !cron) {
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
setIsSaving(true);
|
|
70
|
-
try {
|
|
71
|
-
let schedule;
|
|
72
|
-
if (scheduleUid) {
|
|
73
|
-
const response = await updateSchedule(token, scheduleUid, {
|
|
74
|
-
cronExpression: cron,
|
|
75
|
-
preset: nextPreset,
|
|
76
|
-
}, baseUrl);
|
|
77
|
-
schedule = response.schedule;
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
const response = await upsertSchedule(token, {
|
|
81
|
-
notebookUid: notebookUid,
|
|
82
|
-
cronExpression: cron,
|
|
83
|
-
preset: nextPreset,
|
|
84
|
-
enabled: true,
|
|
85
|
-
}, baseUrl);
|
|
86
|
-
schedule = response.schedule;
|
|
87
|
-
}
|
|
88
|
-
onSaved?.(schedule);
|
|
89
|
-
}
|
|
90
|
-
catch (error) {
|
|
91
|
-
onError?.(error);
|
|
92
|
-
}
|
|
93
|
-
finally {
|
|
94
|
-
setIsSaving(false);
|
|
95
|
-
}
|
|
96
|
-
};
|
|
97
|
-
const selectPreset = (nextPreset) => {
|
|
98
|
-
const next = SCHEDULE_PRESETS.find(item => item.id === nextPreset);
|
|
99
|
-
if (!next) {
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
setHasExplicitCron(true);
|
|
103
|
-
setCronExpression(next.cron);
|
|
104
|
-
void saveSchedule(nextPreset, next.cron);
|
|
105
|
-
};
|
|
106
|
-
const applyCustomCron = () => {
|
|
107
|
-
const value = cronExpression.trim();
|
|
108
|
-
const inferredPreset = presetFromCron(value);
|
|
109
|
-
void saveSchedule(inferredPreset, value);
|
|
110
|
-
};
|
|
111
|
-
const performDeleteSchedule = async () => {
|
|
112
|
-
if (!token || !scheduleUid) {
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
setIsDeleting(true);
|
|
116
|
-
try {
|
|
117
|
-
const response = await disableSchedule(token, scheduleUid, baseUrl);
|
|
118
|
-
setIsDeleteDialogOpen(false);
|
|
119
|
-
setDeleteConfirmUid('');
|
|
120
|
-
onDeleted?.(response.schedule);
|
|
121
|
-
}
|
|
122
|
-
catch (error) {
|
|
123
|
-
onError?.(error);
|
|
124
|
-
}
|
|
125
|
-
finally {
|
|
126
|
-
setIsDeleting(false);
|
|
127
|
-
}
|
|
128
|
-
};
|
|
129
|
-
return (_jsxs(_Fragment, { children: [_jsxs(ActionMenu, { children: [_jsx(ActionMenu.Anchor, { children: _jsx(IconButton, { icon: isSaving ? () => _jsx(Spinner, { size: "small" }) : icon, variant: "invisible", sx: iconColor ? { color: iconColor } : undefined, "aria-label": ariaLabel, title: isSaving
|
|
130
|
-
? `${ariaLabel} (saving…)`
|
|
131
|
-
: isEnabled
|
|
132
|
-
? ariaLabel
|
|
133
|
-
: `${ariaLabel} (disabled)` }) }), _jsxs(ActionMenu.Overlay, { width: "medium", sx: { minWidth: 300 }, children: [_jsx(Box, { sx: {
|
|
134
|
-
px: 3,
|
|
135
|
-
pt: 3,
|
|
136
|
-
pb: 2,
|
|
137
|
-
borderBottom: '1px solid',
|
|
138
|
-
borderColor: 'border.default',
|
|
139
|
-
}, children: _jsx(Text, { as: "p", sx: { fontWeight: 600 }, children: "Schedule" }) }), _jsx(ActionList, { selectionVariant: "single", showDividers: true, children: SCHEDULE_PRESETS.map(option => (_jsxs(ActionList.Item, { selected: preset === option.id, disabled: !isEnabled, onSelect: () => selectPreset(option.id), children: [option.label, _jsx(ActionList.Description, { variant: "block", children: option.cron })] }, option.id))) }), _jsxs(Box, { sx: { p: 3, borderTop: '1px solid', borderColor: 'border.default' }, children: [_jsx(Text, { as: "p", sx: { fontSize: 0, color: 'fg.muted', mb: 2 }, children: "Cron Expression" }), _jsx(TextInput, { value: cronExpression, onChange: event => {
|
|
140
|
-
const value = event.currentTarget.value;
|
|
141
|
-
setHasExplicitCron(value.trim().length > 0);
|
|
142
|
-
setCronExpression(value);
|
|
143
|
-
}, placeholder: "* * * * *", "aria-label": "Cron expression", block: true, disabled: !isEnabled }), _jsxs(Box, { sx: { mt: 2, display: 'flex', gap: 2, flexWrap: 'wrap' }, children: [_jsx(Button, { size: "small", onClick: applyCustomCron, disabled: !isEnabled, children: "Apply Cron" }), scheduleUid ? (_jsx(Button, { size: "small", variant: "danger", leadingVisual: TrashIcon, onClick: () => setIsDeleteDialogOpen(true), disabled: !isEnabled, children: "Delete Schedule" })) : null] }), _jsxs(Text, { as: "p", sx: { mt: 2, fontSize: 0, color: 'fg.muted' }, children: ["Current: ", selectedPresetDescription] })] })] })] }), isDeleteDialogOpen && scheduleUid ? (_jsx(Dialog, { title: "Delete schedule", onClose: () => {
|
|
144
|
-
if (isDeleting) {
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
setIsDeleteDialogOpen(false);
|
|
148
|
-
setDeleteConfirmUid('');
|
|
149
|
-
}, width: "medium", children: _jsxs(Box, { sx: { display: 'grid', gap: 3 }, children: [_jsxs(Text, { children: ["This action will disable the schedule and remove planned runs. Type", ' ', _jsx(Text, { as: "span", sx: { fontWeight: 700 }, children: scheduleUid }), ' ', "to confirm."] }), _jsxs(FormControl, { children: [_jsx(FormControl.Label, { children: "Schedule UID" }), _jsx(TextInput, { value: deleteConfirmUid, onChange: event => setDeleteConfirmUid(event.currentTarget.value), placeholder: scheduleUid, autoFocus: true })] }), _jsxs(Box, { sx: { display: 'flex', justifyContent: 'flex-end', gap: 2 }, children: [_jsx(Button, { variant: "default", onClick: () => {
|
|
150
|
-
setIsDeleteDialogOpen(false);
|
|
151
|
-
setDeleteConfirmUid('');
|
|
152
|
-
}, disabled: isDeleting, children: "Cancel" }), _jsx(Button, { variant: "danger", onClick: () => void performDeleteSchedule(), disabled: isDeleting || deleteConfirmUid !== scheduleUid, children: "Delete schedule" })] })] }) })) : null] }));
|
|
153
|
-
};
|
|
154
|
-
export default ScheduleMenu;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './ScheduleMenu';
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { type PropsWithChildren } from 'react';
|
|
2
|
-
import { Kernel } from '@jupyterlab/services';
|
|
3
|
-
import { IMultiServiceManager } from '../../stateful/runtimes';
|
|
4
|
-
/**
|
|
5
|
-
* Code Sandbox snapshot menu component properties
|
|
6
|
-
*/
|
|
7
|
-
type ICodeSandboxSnapshotMenu = {
|
|
8
|
-
/**
|
|
9
|
-
* Application multi service manager.
|
|
10
|
-
*/
|
|
11
|
-
multiServiceManager?: IMultiServiceManager;
|
|
12
|
-
/**
|
|
13
|
-
* Connection to the current kernel.
|
|
14
|
-
*
|
|
15
|
-
* It is needed only for browser kernels.
|
|
16
|
-
*/
|
|
17
|
-
connection?: Kernel.IKernelConnection;
|
|
18
|
-
/**
|
|
19
|
-
* Pod name
|
|
20
|
-
*
|
|
21
|
-
* It is needed for remote kernels.
|
|
22
|
-
*/
|
|
23
|
-
podName?: string;
|
|
24
|
-
/**
|
|
25
|
-
* Whether the menu is disabled.
|
|
26
|
-
*/
|
|
27
|
-
disabled: boolean;
|
|
28
|
-
};
|
|
29
|
-
/**
|
|
30
|
-
* Code Sandbox Snapshot menu component.
|
|
31
|
-
*/
|
|
32
|
-
export declare function SandboxSnapshotMenu({ children, connection, podName, multiServiceManager, disabled, }: PropsWithChildren<ICodeSandboxSnapshotMenu>): JSX.Element;
|
|
33
|
-
export {};
|
|
@@ -1,169 +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 { useCallback, useEffect, useState, } from 'react';
|
|
7
|
-
import { DeviceCameraIcon } from '@primer/octicons-react';
|
|
8
|
-
import { ActionList, ActionMenu, Flash, FormControl, Select, Spinner, } from '@primer/react';
|
|
9
|
-
import { Dialog } from '@primer/react/experimental';
|
|
10
|
-
import { Box } from '@datalayer/primer-addons';
|
|
11
|
-
import { useToast } from '../../hooks/index.js';
|
|
12
|
-
import { createSandboxSnapshot, getSandboxSnapshots, loadBrowserSandboxSnapshot, loadSandboxSnapshot, } from '../../stateful/runtimes/index.js';
|
|
13
|
-
import { useRuntimesStore } from '../../state/index.js';
|
|
14
|
-
import { createSandboxSnapshotName } from '../../utils/index.js';
|
|
15
|
-
/**
|
|
16
|
-
* Code Sandbox Snapshot menu component.
|
|
17
|
-
*/
|
|
18
|
-
export function SandboxSnapshotMenu({ children, connection, podName, multiServiceManager, disabled = false, }) {
|
|
19
|
-
const { addSandboxSnapshot, runtimesRunUrl, runtimeSnapshots, setSandboxSnapshots, } = useRuntimesStore();
|
|
20
|
-
const { enqueueToast, trackAsyncTask } = useToast();
|
|
21
|
-
const [openLoadDialog, setOpenLoadDialog] = useState(false);
|
|
22
|
-
const [loadingSandboxSnapshot, setLoadingSandboxSnapshot] = useState(false);
|
|
23
|
-
const [takingSandboxSnapshot, setTakingSandboxSnapshot] = useState(false);
|
|
24
|
-
const [selection, setSelection] = useState(runtimeSnapshots[0]?.id ?? '');
|
|
25
|
-
const [error, setError] = useState();
|
|
26
|
-
useEffect(() => {
|
|
27
|
-
getSandboxSnapshots()
|
|
28
|
-
.then(snapshots => {
|
|
29
|
-
setSandboxSnapshots(snapshots);
|
|
30
|
-
if (!selection && snapshots.length > 0) {
|
|
31
|
-
setSelection(snapshots[0].id);
|
|
32
|
-
}
|
|
33
|
-
})
|
|
34
|
-
.catch(reason => {
|
|
35
|
-
console.error(`Failed to fetch remote kernel snapshots; ${reason}`);
|
|
36
|
-
});
|
|
37
|
-
}, [runtimesRunUrl]);
|
|
38
|
-
const onLoadSandboxSnapshot = useCallback(() => {
|
|
39
|
-
setError(undefined);
|
|
40
|
-
setOpenLoadDialog(true);
|
|
41
|
-
}, []);
|
|
42
|
-
const onSandboxSnapshotChanged = useCallback(event => {
|
|
43
|
-
setSelection(event.target.value);
|
|
44
|
-
}, []);
|
|
45
|
-
const onLoadSandboxSnapshotSubmit = useCallback(async ({ id, connection, podName, }) => {
|
|
46
|
-
if (podName) {
|
|
47
|
-
await loadSandboxSnapshot({ id: podName, from: id });
|
|
48
|
-
enqueueToast(`Code Sandbox snapshot ${podName} is loaded.`, {
|
|
49
|
-
variant: 'success',
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
else if (connection) {
|
|
53
|
-
await loadBrowserSandboxSnapshot({ connection, id });
|
|
54
|
-
enqueueToast(`Code Sandbox snapshot ${id} is loaded.`, {
|
|
55
|
-
variant: 'success',
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
}, []);
|
|
59
|
-
const onTakeSandboxSnapshot = useCallback(async () => {
|
|
60
|
-
try {
|
|
61
|
-
setTakingSandboxSnapshot(true);
|
|
62
|
-
let snapshot;
|
|
63
|
-
let task;
|
|
64
|
-
let ref = '';
|
|
65
|
-
let snapshotName = '';
|
|
66
|
-
if (podName && multiServiceManager?.remote) {
|
|
67
|
-
snapshotName = createSandboxSnapshotName('cloud');
|
|
68
|
-
task = multiServiceManager.remote.runtimesManager.snapshotRuntime({
|
|
69
|
-
podName,
|
|
70
|
-
name: snapshotName,
|
|
71
|
-
description: snapshotName,
|
|
72
|
-
stop: false,
|
|
73
|
-
});
|
|
74
|
-
ref = podName.split('-', 2).reverse()[0];
|
|
75
|
-
task.then(s => {
|
|
76
|
-
snapshot = s;
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
else if (connection && multiServiceManager?.browser) {
|
|
80
|
-
const model = connection.model;
|
|
81
|
-
ref = model.id;
|
|
82
|
-
snapshotName = createSandboxSnapshotName('browser');
|
|
83
|
-
let isPending = true;
|
|
84
|
-
task = createSandboxSnapshot({
|
|
85
|
-
connection: multiServiceManager.browser.kernels.connectTo({
|
|
86
|
-
model,
|
|
87
|
-
}),
|
|
88
|
-
metadata: { filename: `${snapshotName}.data` },
|
|
89
|
-
onUploadProgress: () => {
|
|
90
|
-
if (isPending) {
|
|
91
|
-
isPending = false;
|
|
92
|
-
// Get the kernel snapshot uid.
|
|
93
|
-
getSandboxSnapshots().then(snapshots => {
|
|
94
|
-
snapshot = snapshots.find(s => s.name === snapshotName);
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
},
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
if (task) {
|
|
101
|
-
trackAsyncTask(task, {
|
|
102
|
-
error: {
|
|
103
|
-
message: (reason, data) => {
|
|
104
|
-
const msg = reason === 'Empty snapshot'
|
|
105
|
-
? `Runtime ${ref} will not be snapshotted as it does not contain any serializable state.`
|
|
106
|
-
: `Failed to snapshot runtime ${ref} - ${reason}`;
|
|
107
|
-
return msg;
|
|
108
|
-
},
|
|
109
|
-
},
|
|
110
|
-
pending: { message: `Taking a snapshot of runtime ${ref}…` },
|
|
111
|
-
success: {
|
|
112
|
-
message: () => `Runtime ${ref} successfully snapshotted as ${snapshotName}.`,
|
|
113
|
-
},
|
|
114
|
-
});
|
|
115
|
-
await task;
|
|
116
|
-
if (snapshot) {
|
|
117
|
-
addSandboxSnapshot(snapshot);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
finally {
|
|
122
|
-
setTakingSandboxSnapshot(false);
|
|
123
|
-
}
|
|
124
|
-
}, [connection, podName, multiServiceManager]);
|
|
125
|
-
return (_jsxs(_Fragment, { children: [_jsxs(ActionMenu, { children: [_jsx(ActionMenu.Button, { leadingVisual: DeviceCameraIcon, variant: "invisible", size: "small", disabled: loadingSandboxSnapshot || takingSandboxSnapshot || disabled, children: children }), _jsx(ActionMenu.Overlay, { children: _jsxs(ActionList, { children: [_jsx(ActionList.Item, { onSelect: onLoadSandboxSnapshot, disabled: loadingSandboxSnapshot || runtimeSnapshots.length === 0, children: "Load a code sandbox snapshot\u2026" }), _jsx(ActionList.Item, { onSelect: onTakeSandboxSnapshot, disabled: takingSandboxSnapshot, children: "Take a code sandbox snapshot" })] }) })] }), openLoadDialog && (_jsx(Dialog, { title: _jsx("span", { style: { color: 'var(--fgColor-default)' }, children: "Choose a code sandbox snapshot to load" }), onClose: () => {
|
|
126
|
-
setOpenLoadDialog(false);
|
|
127
|
-
}, footerButtons: [
|
|
128
|
-
{
|
|
129
|
-
buttonType: 'default',
|
|
130
|
-
content: 'Cancel',
|
|
131
|
-
onClick: event => {
|
|
132
|
-
if (!event.defaultPrevented) {
|
|
133
|
-
event.preventDefault();
|
|
134
|
-
setOpenLoadDialog(false);
|
|
135
|
-
}
|
|
136
|
-
},
|
|
137
|
-
},
|
|
138
|
-
{
|
|
139
|
-
buttonType: 'primary',
|
|
140
|
-
content: loadingSandboxSnapshot ? (_jsx(Spinner, { size: "small" })) : ('Load'),
|
|
141
|
-
disabled: loadingSandboxSnapshot,
|
|
142
|
-
onClick: async (event) => {
|
|
143
|
-
if (!event.defaultPrevented) {
|
|
144
|
-
event.preventDefault();
|
|
145
|
-
setLoadingSandboxSnapshot(true);
|
|
146
|
-
try {
|
|
147
|
-
setError(undefined);
|
|
148
|
-
const snapshot = runtimeSnapshots.find(s => s.id === selection);
|
|
149
|
-
if (snapshot && (connection || podName)) {
|
|
150
|
-
await onLoadSandboxSnapshotSubmit({
|
|
151
|
-
connection,
|
|
152
|
-
id: snapshot.id,
|
|
153
|
-
podName,
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
else {
|
|
157
|
-
setError('No code sandbox snapshot found.');
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
finally {
|
|
161
|
-
setLoadingSandboxSnapshot(false);
|
|
162
|
-
setOpenLoadDialog(false);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
},
|
|
166
|
-
autoFocus: true,
|
|
167
|
-
},
|
|
168
|
-
], children: _jsxs(Box, { as: "form", children: [_jsxs(FormControl, { children: [_jsx(FormControl.Label, { children: "Snapshot" }), _jsx(Select, { name: "snapshot", value: selection, onChange: onSandboxSnapshotChanged, block: true, children: runtimeSnapshots.map(s => (_jsx(Select.Option, { value: s.id, children: s.name ? `${s.name} (${s.id})` : s.id }, s.id))) })] }), error && _jsx(Flash, { variant: "danger", children: error })] }) }))] }));
|
|
169
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './SandboxSnapshotMenu';
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { CodeCellModel } from '@jupyterlab/cells';
|
|
2
|
-
import type { IMarkdownParser, IRenderMime } from '@jupyterlab/rendermime';
|
|
3
|
-
import { ITranslator } from '@jupyterlab/translation';
|
|
4
|
-
import type { ISnippet } from '../../models';
|
|
5
|
-
/**
|
|
6
|
-
* {@link SnippetDialog} properties
|
|
7
|
-
*/
|
|
8
|
-
export interface ISnippetDialogProps {
|
|
9
|
-
/**
|
|
10
|
-
* Code cell model
|
|
11
|
-
*/
|
|
12
|
-
model: CodeCellModel;
|
|
13
|
-
/**
|
|
14
|
-
* Callback request the dialog closure.
|
|
15
|
-
*/
|
|
16
|
-
onClose: () => void;
|
|
17
|
-
/**
|
|
18
|
-
* Code snippets language
|
|
19
|
-
*/
|
|
20
|
-
language: string;
|
|
21
|
-
/**
|
|
22
|
-
* Code snippets
|
|
23
|
-
*/
|
|
24
|
-
snippets: ISnippet[];
|
|
25
|
-
/**
|
|
26
|
-
* Markdown parser
|
|
27
|
-
*/
|
|
28
|
-
markdownParser?: IMarkdownParser;
|
|
29
|
-
/**
|
|
30
|
-
* HTML sanitizer
|
|
31
|
-
*/
|
|
32
|
-
sanitizer?: IRenderMime.ISanitizer;
|
|
33
|
-
/**
|
|
34
|
-
* Application translator
|
|
35
|
-
*/
|
|
36
|
-
translator?: ITranslator;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Dialog to inject snippet in a cell.
|
|
40
|
-
*/
|
|
41
|
-
export declare function SnippetDialog(props: ISnippetDialogProps): JSX.Element;
|
|
42
|
-
export default SnippetDialog;
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
/*
|
|
3
|
-
* Copyright (c) 2023-2025 Datalayer, Inc.
|
|
4
|
-
* Distributed under the terms of the Modified BSD License.
|
|
5
|
-
*/
|
|
6
|
-
import { useCallback, useMemo, useState } from 'react';
|
|
7
|
-
import { nullTranslator } from '@jupyterlab/translation';
|
|
8
|
-
import { FormControl, Select, Text } from '@primer/react';
|
|
9
|
-
import { Box } from '@datalayer/primer-addons';
|
|
10
|
-
import { Dialog } from '@primer/react/experimental';
|
|
11
|
-
import { Markdown } from '../display/index.js';
|
|
12
|
-
/**
|
|
13
|
-
* Dialog to inject snippet in a cell.
|
|
14
|
-
*/
|
|
15
|
-
export function SnippetDialog(props) {
|
|
16
|
-
const { model, onClose, language, snippets, markdownParser, sanitizer, translator, } = props;
|
|
17
|
-
const [selection, setSelection] = useState(snippets[0]);
|
|
18
|
-
const trans = useMemo(() => (translator ?? nullTranslator).load('jupyterlab'), [translator]);
|
|
19
|
-
const onSelectionChange = useCallback((e) => {
|
|
20
|
-
const selection = e.target.value;
|
|
21
|
-
setSelection(snippets[parseInt(selection, 10)]);
|
|
22
|
-
}, [setSelection, snippets]);
|
|
23
|
-
const injectSnippet = useCallback(() => {
|
|
24
|
-
const size = model.sharedModel.getSource().length;
|
|
25
|
-
model.sharedModel.updateSource(size, size, '\n'.repeat(size ? 2 : 0) + selection.code);
|
|
26
|
-
onClose();
|
|
27
|
-
}, [model, selection, onClose]);
|
|
28
|
-
return (_jsx(Dialog, { title: _jsx("span", { style: { color: 'var(--fgColor-default)' }, children: "Pick a snippet to inject" }), onClose: onClose, footerButtons: [
|
|
29
|
-
{
|
|
30
|
-
buttonType: 'default',
|
|
31
|
-
content: trans.__('Cancel'),
|
|
32
|
-
onClick: onClose,
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
buttonType: 'primary',
|
|
36
|
-
content: trans.__('Inject snippet'),
|
|
37
|
-
onClick: injectSnippet,
|
|
38
|
-
autoFocus: true,
|
|
39
|
-
},
|
|
40
|
-
], children: _jsx(Box, { as: "form", children: _jsxs(FormControl, { children: [_jsx(FormControl.Label, {}), _jsx(Select, { block: true, onChange: onSelectionChange, children: snippets.map((snippet, index) => (_jsx(Select.Option, { value: `${index}`, children: snippet.title }, index))) }), _jsxs(FormControl.Caption, { children: [selection.description && (_jsx(Text, { as: "p", children: selection.description })), markdownParser ? (_jsx(Markdown, { markdownParser: markdownParser, sanitizer: sanitizer, text: `\`\`\`${language}\n${selection.code}\`\`\`` })) : (_jsx("code", { children: selection.code }))] })] }) }) }));
|
|
41
|
-
}
|
|
42
|
-
export default SnippetDialog;
|
|
@@ -1,66 +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 { useMemo } from 'react';
|
|
7
|
-
import { useTheme, Tooltip, Button } from '@primer/react';
|
|
8
|
-
import { Box } from '@datalayer/primer-addons';
|
|
9
|
-
const getExercisePoints = (studentItem) => {
|
|
10
|
-
if (studentItem && studentItem.points) {
|
|
11
|
-
return studentItem.points;
|
|
12
|
-
}
|
|
13
|
-
return 0;
|
|
14
|
-
};
|
|
15
|
-
export const StudentItemStatus = (props) => {
|
|
16
|
-
const { student, studentItem } = props;
|
|
17
|
-
const { theme } = useTheme();
|
|
18
|
-
const okColor = useMemo(() => theme?.colorSchemes.light.colors.success.muted, []);
|
|
19
|
-
const nokColor = useMemo(() => theme?.colorSchemes.light.colors.severe.muted, []);
|
|
20
|
-
if (student && studentItem) {
|
|
21
|
-
switch (studentItem.itemType) {
|
|
22
|
-
case 'dataset': {
|
|
23
|
-
const datasetColor = studentItem?.completed ? okColor : nokColor;
|
|
24
|
-
return (_jsx(Box, { sx: {
|
|
25
|
-
backgroundColor: datasetColor,
|
|
26
|
-
width: '14px',
|
|
27
|
-
height: '14px',
|
|
28
|
-
borderRadius: 3,
|
|
29
|
-
}, ml: 1 }));
|
|
30
|
-
}
|
|
31
|
-
case 'lesson': {
|
|
32
|
-
const lessonColor = studentItem?.completed ? okColor : nokColor;
|
|
33
|
-
return (_jsx(Box, { sx: {
|
|
34
|
-
backgroundColor: lessonColor,
|
|
35
|
-
width: '14px',
|
|
36
|
-
height: '14px',
|
|
37
|
-
borderRadius: 3,
|
|
38
|
-
}, ml: 1 }));
|
|
39
|
-
}
|
|
40
|
-
case 'exercise': {
|
|
41
|
-
const exerciseColor = getExercisePoints(studentItem) > 0 ? okColor : nokColor;
|
|
42
|
-
return (_jsx(Box, { sx: {
|
|
43
|
-
backgroundColor: exerciseColor,
|
|
44
|
-
width: '14px',
|
|
45
|
-
height: '14px',
|
|
46
|
-
borderRadius: 3,
|
|
47
|
-
}, ml: 1 }));
|
|
48
|
-
}
|
|
49
|
-
case 'assignment':
|
|
50
|
-
return (_jsxs(Box, { display: "flex", children: [studentItem.nbgradesTotalScore !== undefined &&
|
|
51
|
-
studentItem.nbgradesTotalPoints !== undefined && (_jsxs(Box, { children: [studentItem.nbgradesTotalScore, " /", ' ', studentItem.nbgradesTotalPoints] })), studentItem.nbgrades && (_jsx(Box, { display: "flex", ml: 3, children: studentItem?.nbgrades.map(grade => {
|
|
52
|
-
const gradeColor = grade.score_f === grade.points_f ? okColor : nokColor;
|
|
53
|
-
return (_jsx(Tooltip, { text: grade.grade_id_s, children: _jsx(Button, { variant: "invisible", children: _jsx(Box, { sx: {
|
|
54
|
-
backgroundColor: gradeColor,
|
|
55
|
-
width: '14px',
|
|
56
|
-
height: '14px',
|
|
57
|
-
borderRadius: 3,
|
|
58
|
-
}, ml: 1 }) }) }));
|
|
59
|
-
}) }))] }));
|
|
60
|
-
default:
|
|
61
|
-
return _jsx(_Fragment, {});
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
return _jsx(_Fragment, {});
|
|
65
|
-
};
|
|
66
|
-
export default StudentItemStatus;
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } 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 { Token } from '@primer/react';
|
|
7
|
-
import { ProjectIcon } from '@primer/octicons-react';
|
|
8
|
-
import { StudentIcon } from '@datalayer/icons-react';
|
|
9
|
-
export const SpaceVariantToken = (props) => {
|
|
10
|
-
const variant = String(props.variant || 'default').toLowerCase();
|
|
11
|
-
if (variant.includes('project')) {
|
|
12
|
-
return _jsx(Token, { text: "project", leadingVisual: ProjectIcon });
|
|
13
|
-
}
|
|
14
|
-
switch (variant) {
|
|
15
|
-
case 'default':
|
|
16
|
-
return _jsx(Token, { text: "default" });
|
|
17
|
-
case 'course':
|
|
18
|
-
return _jsx(Token, { text: "course", leadingVisual: StudentIcon });
|
|
19
|
-
default:
|
|
20
|
-
return _jsx(Token, { text: String(variant || 'default') });
|
|
21
|
-
}
|
|
22
|
-
};
|
|
23
|
-
export default SpaceVariantToken;
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } 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 { Button } from '@primer/react';
|
|
7
|
-
import { Box } from '@datalayer/primer-addons';
|
|
8
|
-
import { RepoPushIcon } from '@primer/octicons-react';
|
|
9
|
-
// import { PlayIcon, StopIcon } from '@primer/octicons-react';
|
|
10
|
-
// import { notebookStore } from '@datalayer/jupyter-react';
|
|
11
|
-
import { useGradeStore } from '../../state/index.js';
|
|
12
|
-
export const AssignmentEditorToolbar = (props) => {
|
|
13
|
-
// const { notebookId } = props;
|
|
14
|
-
// const notebook = notebookStore.getState().selectNotebook(notebookId);
|
|
15
|
-
const { grade } = useGradeStore();
|
|
16
|
-
return (_jsx(Box, { display: "flex", children: _jsx(Box, { children: _jsx(Button, { variant: "invisible", size: "small", leadingVisual: RepoPushIcon, onClick: () => grade(new Date()), children: "Grade" }) }) }));
|
|
17
|
-
};
|
|
18
|
-
export default AssignmentEditorToolbar;
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } 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 { Button, Box } from '@primer/react';
|
|
7
|
-
import { RepoPushIcon } from '@primer/octicons-react';
|
|
8
|
-
import { documentStore } from '../../state/index.js';
|
|
9
|
-
export const DocumentEditorToolbar = () => {
|
|
10
|
-
return (_jsx(Box, { display: "flex", children: _jsx(Box, { children: _jsx(Button, { variant: "invisible", size: "small", leadingVisual: RepoPushIcon, onClick: () => documentStore.getState().save(new Date()), children: "Save" }) }) }));
|
|
11
|
-
};
|
|
12
|
-
export default DocumentEditorToolbar;
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { Session } from '@jupyterlab/services';
|
|
2
|
-
import { CommandRegistry } from '@lumino/commands';
|
|
3
|
-
import type { IRuntimeDesc } from '../../models';
|
|
4
|
-
/**
|
|
5
|
-
* NotebookEditorToolbar component properties
|
|
6
|
-
*/
|
|
7
|
-
export type INotebookEditorToolbar = {
|
|
8
|
-
/**
|
|
9
|
-
* Jupyter commands registry
|
|
10
|
-
*/
|
|
11
|
-
commandRegistry?: CommandRegistry;
|
|
12
|
-
/**
|
|
13
|
-
* Kernel description
|
|
14
|
-
*/
|
|
15
|
-
runtimeDesc?: IRuntimeDesc;
|
|
16
|
-
/**
|
|
17
|
-
* Callback to save the notebook model
|
|
18
|
-
*/
|
|
19
|
-
save: () => void;
|
|
20
|
-
/**
|
|
21
|
-
* Session connection
|
|
22
|
-
*/
|
|
23
|
-
sessionConnection?: Session.ISessionConnection;
|
|
24
|
-
};
|
|
25
|
-
/**
|
|
26
|
-
* Notebook editor toolbar
|
|
27
|
-
*/
|
|
28
|
-
export declare function NotebookEditorToolbar(props: INotebookEditorToolbar): JSX.Element;
|
|
29
|
-
export default NotebookEditorToolbar;
|