@datalayer/core 1.0.24 → 1.1.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -24
- package/lib/api/constants.d.ts +3 -0
- package/lib/api/constants.js +3 -0
- package/lib/api/index.d.ts +0 -8
- package/lib/api/index.js +0 -8
- package/lib/cli-login.js +167 -0
- package/lib/client/base.d.ts +0 -3
- package/lib/client/base.js +0 -2
- package/lib/client/index.d.ts +10 -98
- package/lib/client/index.js +12 -21
- package/lib/components/avatars/UserAvatar.d.ts +16 -0
- package/lib/components/avatars/UserAvatar.js +47 -0
- package/lib/components/avatars/index.d.ts +1 -0
- package/lib/components/avatars/index.js +1 -0
- package/lib/components/billing/BillableAccountSelect.js +4 -0
- package/lib/components/billing/index.js +4 -0
- package/lib/components/checkout/StripeCheckout.js +48 -2
- package/lib/components/context/index.d.ts +0 -1
- package/lib/components/context/index.js +0 -1
- package/lib/components/display/DisplayHandle.d.ts +12 -0
- package/lib/components/display/DisplayHandle.js +11 -0
- package/lib/components/display/LiveRelativeTime.d.ts +1 -10
- package/lib/components/display/LiveRelativeTime.js +5 -16
- package/lib/components/display/index.d.ts +1 -0
- package/lib/components/display/index.js +1 -0
- package/lib/components/flashes/index.d.ts +0 -1
- package/lib/components/flashes/index.js +0 -1
- package/lib/components/index.d.ts +2 -0
- package/lib/components/index.js +2 -0
- package/lib/components/principal/Principal.d.ts +7 -0
- package/lib/components/principal/Principal.js +153 -16
- package/lib/components/principal/PrincipalAvatar.d.ts +1 -1
- package/lib/components/principal/PrincipalAvatar.js +4 -28
- package/lib/components/principal/PrincipalBadge.js +4 -4
- package/lib/components/principal/PrincipalDetailsOverlay.d.ts +4 -2
- package/lib/components/principal/PrincipalDetailsOverlay.js +27 -7
- package/lib/components/principal/PrincipalSwitcherMenu.js +76 -39
- package/lib/components/progress/index.d.ts +0 -1
- package/lib/components/progress/index.js +0 -1
- package/lib/components/sharing/ShareAccessComponent.d.ts +3 -2
- package/lib/components/sharing/ShareAccessComponent.js +180 -133
- package/lib/components/sharing/SharingEditor.js +4 -0
- package/lib/components/snippets/index.d.ts +1 -1
- package/lib/components/snippets/index.js +1 -1
- package/lib/components/students/StudentResultCircle.d.ts +21 -0
- package/lib/components/students/StudentResultCircle.js +59 -0
- package/lib/components/students/index.d.ts +1 -1
- package/lib/components/students/index.js +1 -1
- package/lib/components/time/LiveRelativeTime.d.ts +14 -0
- package/lib/components/time/LiveRelativeTime.js +43 -0
- package/lib/components/time/index.d.ts +1 -0
- package/lib/components/time/index.js +9 -0
- package/lib/components/timeline/Timeline.d.ts +20 -0
- package/lib/components/timeline/Timeline.js +90 -0
- package/lib/components/timeline/index.d.ts +1 -0
- package/lib/components/timeline/index.js +9 -0
- package/lib/components/tokens/index.d.ts +1 -1
- package/lib/components/tokens/index.js +1 -1
- package/lib/components/toolbars/index.d.ts +1 -3
- package/lib/components/toolbars/index.js +1 -3
- package/lib/hooks/cacheConverters.d.ts +21 -0
- package/lib/hooks/cacheConverters.js +110 -0
- package/lib/hooks/index.d.ts +0 -2
- package/lib/hooks/index.js +0 -2
- package/lib/hooks/useCache.d.ts +65 -36
- package/lib/hooks/useCache.js +424 -65
- package/lib/hooks/useDatalayer.js +3 -1
- package/lib/hooks/useIAM.js +1 -3
- package/lib/hooks/useLocationHandles.d.ts +3 -1
- package/lib/hooks/useLocationHandles.js +2 -1
- package/lib/hooks/usePrincipalStore.d.ts +2 -2
- package/lib/hooks/usePrincipalStore.js +97 -14
- package/lib/hooks/useProjectStore.d.ts +1 -1
- package/lib/hooks/useSelectedPrincipal.js +1 -1
- package/lib/hooks/useUser.js +19 -2
- package/lib/index.d.ts +1 -6
- package/lib/index.js +1 -13
- package/lib/main.js +3 -3
- package/lib/mocks/index.js +1 -1
- package/lib/mocks/models/index.d.ts +0 -1
- package/lib/mocks/models/index.js +0 -1
- package/lib/models/Datasource.d.ts +2 -2
- package/lib/models/IAM.d.ts +1 -1
- package/lib/models/IAMToken.d.ts +1 -1
- package/lib/models/School.d.ts +12 -3
- package/lib/models/Secret.d.ts +2 -2
- package/lib/models/Student.d.ts +13 -3
- package/lib/models/Usage.d.ts +11 -1
- package/lib/models/UserDTO.d.ts +2 -2
- package/lib/models/index.d.ts +0 -30
- package/lib/models/index.js +0 -30
- package/lib/routes/index.d.ts +1 -0
- package/lib/routes/index.js +1 -0
- package/lib/routes/publicPaths.d.ts +23 -0
- package/lib/routes/publicPaths.js +74 -0
- package/lib/state/State.d.ts +0 -12
- package/lib/state/State.js +0 -12
- package/lib/state/substates/CoreState.js +1 -1
- package/lib/state/substates/LayoutState.d.ts +12 -1
- package/lib/state/substates/index.d.ts +0 -7
- package/lib/state/substates/index.js +0 -7
- package/lib/utils/Date.d.ts +7 -0
- package/lib/utils/Date.js +43 -10
- package/lib/utils/Handles.js +3 -1
- package/lib/utils/index.d.ts +1 -1
- package/lib/utils/index.js +1 -1
- package/lib/views/api-keys/APIKeyEdit.d.ts +8 -0
- package/lib/views/{iam-tokens/IAMTokenEdit.js → api-keys/APIKeyEdit.js} +31 -31
- package/lib/views/api-keys/APIKeyNew.d.ts +8 -0
- package/lib/views/api-keys/APIKeyNew.js +143 -0
- package/lib/views/api-keys/APIKeys.d.ts +12 -0
- package/lib/views/api-keys/APIKeys.js +128 -0
- package/lib/views/api-keys/APIKeysStandalone.d.ts +2 -0
- package/lib/views/api-keys/APIKeysStandalone.js +117 -0
- package/lib/views/api-keys/index.d.ts +3 -0
- package/lib/{mocks/jupyter → views/api-keys}/index.js +3 -1
- package/lib/views/datasources/DatasourceDetail.d.ts +1 -1
- package/lib/views/datasources/DatasourceNew.d.ts +1 -1
- package/lib/views/datasources/Datasources.d.ts +1 -1
- package/lib/views/datasources/Datasources.js +12 -3
- package/lib/views/iam/SignInSimple.d.ts +37 -1
- package/lib/views/iam/SignInSimple.js +110 -12
- package/package.json +5 -3
- package/lib/App.css +0 -47
- package/lib/App.d.ts +0 -3
- package/lib/App.js +0 -21
- package/lib/api/runtimes/checkpoints.d.ts +0 -122
- package/lib/api/runtimes/checkpoints.js +0 -118
- package/lib/api/runtimes/environments.d.ts +0 -9
- package/lib/api/runtimes/environments.js +0 -29
- package/lib/api/runtimes/healthz.d.ts +0 -15
- package/lib/api/runtimes/healthz.js +0 -44
- package/lib/api/runtimes/index.d.ts +0 -12
- package/lib/api/runtimes/index.js +0 -16
- package/lib/api/runtimes/runtimes.d.ts +0 -138
- package/lib/api/runtimes/runtimes.js +0 -230
- package/lib/api/runtimes/snapshots.d.ts +0 -38
- package/lib/api/runtimes/snapshots.js +0 -82
- package/lib/api/spacer/documents.d.ts +0 -12
- package/lib/api/spacer/documents.js +0 -43
- package/lib/api/spacer/healthz.d.ts +0 -15
- package/lib/api/spacer/healthz.js +0 -44
- package/lib/api/spacer/index.d.ts +0 -15
- package/lib/api/spacer/index.js +0 -19
- package/lib/api/spacer/items.d.ts +0 -25
- package/lib/api/spacer/items.js +0 -55
- package/lib/api/spacer/lexicals.d.ts +0 -34
- package/lib/api/spacer/lexicals.js +0 -89
- package/lib/api/spacer/notebooks.d.ts +0 -34
- package/lib/api/spacer/notebooks.js +0 -89
- package/lib/api/spacer/spaces.d.ts +0 -84
- package/lib/api/spacer/spaces.js +0 -170
- package/lib/api/spacer/users.d.ts +0 -9
- package/lib/api/spacer/users.js +0 -29
- package/lib/client/mixins/RuntimesMixin.d.ts +0 -93
- package/lib/client/mixins/RuntimesMixin.js +0 -229
- package/lib/client/mixins/SpacerMixin.d.ts +0 -210
- package/lib/client/mixins/SpacerMixin.js +0 -615
- package/lib/client/utils/spacerUtils.d.ts +0 -18
- package/lib/client/utils/spacerUtils.js +0 -32
- package/lib/collaboration/DatalayerCollaboration.d.ts +0 -13
- package/lib/collaboration/DatalayerCollaboration.js +0 -28
- package/lib/collaboration/DatalayerCollaborationProvider.d.ts +0 -60
- package/lib/collaboration/DatalayerCollaborationProvider.js +0 -163
- package/lib/collaboration/index.d.ts +0 -2
- package/lib/collaboration/index.js +0 -6
- package/lib/components/context/SpaceSelect.d.ts +0 -2
- package/lib/components/context/SpaceSelect.js +0 -42
- package/lib/components/flashes/FlashDisclaimer.d.ts +0 -2
- package/lib/components/flashes/FlashDisclaimer.js +0 -17
- package/lib/components/icons/ArtifactIcon.d.ts +0 -10
- package/lib/components/icons/ArtifactIcon.js +0 -58
- package/lib/components/icons/index.d.ts +0 -1
- package/lib/components/icons/index.js +0 -5
- package/lib/components/nbgrader/NbGradesDetails.d.ts +0 -5
- package/lib/components/nbgrader/NbGradesDetails.js +0 -14
- package/lib/components/nbgrader/index.d.ts +0 -1
- package/lib/components/nbgrader/index.js +0 -5
- package/lib/components/progress/CreditsIndicator.d.ts +0 -33
- package/lib/components/progress/CreditsIndicator.js +0 -23
- package/lib/components/runtimes/RuntimeCellVariables.d.ts +0 -39
- package/lib/components/runtimes/RuntimeCellVariables.js +0 -172
- package/lib/components/runtimes/RuntimeCellVariablesDialog.d.ts +0 -37
- package/lib/components/runtimes/RuntimeCellVariablesDialog.js +0 -101
- package/lib/components/runtimes/RuntimeLauncherDialog.d.ts +0 -57
- package/lib/components/runtimes/RuntimeLauncherDialog.js +0 -275
- package/lib/components/runtimes/RuntimePickerBase.d.ts +0 -69
- package/lib/components/runtimes/RuntimePickerBase.js +0 -122
- package/lib/components/runtimes/RuntimePickerCell.d.ts +0 -34
- package/lib/components/runtimes/RuntimePickerCell.js +0 -104
- package/lib/components/runtimes/RuntimePickerNotebook.d.ts +0 -42
- package/lib/components/runtimes/RuntimePickerNotebook.js +0 -232
- package/lib/components/runtimes/RuntimeReservationControl.d.ts +0 -47
- package/lib/components/runtimes/RuntimeReservationControl.js +0 -42
- package/lib/components/runtimes/RuntimeSimplePicker.d.ts +0 -38
- package/lib/components/runtimes/RuntimeSimplePicker.js +0 -155
- package/lib/components/runtimes/RuntimeTransfer.d.ts +0 -16
- package/lib/components/runtimes/RuntimeTransfer.js +0 -5
- package/lib/components/runtimes/RuntimeUtils.d.ts +0 -17
- package/lib/components/runtimes/RuntimeUtils.js +0 -178
- package/lib/components/runtimes/RuntimeVariables.d.ts +0 -38
- package/lib/components/runtimes/RuntimeVariables.js +0 -75
- package/lib/components/runtimes/index.d.ts +0 -11
- package/lib/components/runtimes/index.js +0 -15
- package/lib/components/snapshots/SandboxSnapshotMenu.d.ts +0 -33
- package/lib/components/snapshots/SandboxSnapshotMenu.js +0 -169
- package/lib/components/snapshots/index.d.ts +0 -1
- package/lib/components/snapshots/index.js +0 -5
- package/lib/components/snippets/SnippetDialog.d.ts +0 -42
- package/lib/components/snippets/SnippetDialog.js +0 -42
- package/lib/components/students/StudentItemStatus.d.ts +0 -7
- package/lib/components/students/StudentItemStatus.js +0 -66
- package/lib/components/tokens/SpaceVariantToken.d.ts +0 -5
- package/lib/components/tokens/SpaceVariantToken.js +0 -23
- package/lib/components/toolbars/AssignmentEditorToolbar.d.ts +0 -4
- package/lib/components/toolbars/AssignmentEditorToolbar.js +0 -18
- package/lib/components/toolbars/DocumentEditorToolbar.d.ts +0 -2
- package/lib/components/toolbars/DocumentEditorToolbar.js +0 -12
- package/lib/components/toolbars/NotebookEditorToolbar.d.ts +0 -29
- package/lib/components/toolbars/NotebookEditorToolbar.js +0 -30
- package/lib/examples/CellExample.d.ts +0 -6
- package/lib/examples/CellExample.js +0 -20
- package/lib/examples/NotebookExample.d.ts +0 -6
- package/lib/examples/NotebookExample.js +0 -19
- package/lib/examples/lexical-theme.css +0 -436
- package/lib/examples/notebooks/IPyWidgetsExample.ipynb.json +0 -101
- package/lib/examples/notebooks/IPyWidgetsExampleWithState.ipynb.json +0 -112
- package/lib/examples/notebooks/Lite.ipynb.json +0 -128
- package/lib/examples/notebooks/Matplotlib.ipynb.json +0 -137
- package/lib/examples/notebooks/NotebookExample1.ipynb.json +0 -126
- package/lib/examples/notebooks/NotebookExample2.ipynb.json +0 -48
- package/lib/examples/notebooks/NotebookOutputs.ipynb.json +0 -49
- package/lib/examples/notebooks/NotebookToCExample.ipynb.json +0 -102
- package/lib/examples/notebooks/PyGWalker.ipynb.json +0 -55
- package/lib/hooks/useCellOutputshot.d.ts +0 -4
- package/lib/hooks/useCellOutputshot.js +0 -25
- package/lib/hooks/useProjects.d.ts +0 -628
- package/lib/hooks/useProjects.js +0 -190
- package/lib/hooks/useRuntimes.d.ts +0 -5
- package/lib/hooks/useRuntimes.js +0 -34
- package/lib/mocks/models/CourseMock.d.ts +0 -6
- package/lib/mocks/models/CourseMock.js +0 -29
- package/lib/mocks/models/SpaceMock.d.ts +0 -6
- package/lib/mocks/models/SpaceMock.js +0 -25
- package/lib/models/Assignment.d.ts +0 -7
- package/lib/models/Assignment.js +0 -5
- package/lib/models/Cell.d.ts +0 -8
- package/lib/models/Cell.js +0 -5
- package/lib/models/CodeBlock.d.ts +0 -10
- package/lib/models/CodeBlock.js +0 -5
- package/lib/models/CodeSandboxSnapshot.d.ts +0 -92
- package/lib/models/CodeSandboxSnapshot.js +0 -13
- package/lib/models/CodeSandboxSnapshotDTO.d.ts +0 -173
- package/lib/models/CodeSandboxSnapshotDTO.js +0 -139
- package/lib/models/CodefeedBlocks.d.ts +0 -7
- package/lib/models/CodefeedBlocks.js +0 -5
- package/lib/models/Content.d.ts +0 -5
- package/lib/models/Content.js +0 -5
- package/lib/models/Course.d.ts +0 -17
- package/lib/models/Course.js +0 -5
- package/lib/models/Dataset.d.ts +0 -16
- package/lib/models/Dataset.js +0 -5
- package/lib/models/Document.d.ts +0 -8
- package/lib/models/Document.js +0 -5
- package/lib/models/Environment.d.ts +0 -86
- package/lib/models/Environment.js +0 -5
- package/lib/models/EnvironmentDTO.d.ts +0 -125
- package/lib/models/EnvironmentDTO.js +0 -88
- package/lib/models/Exercise.d.ts +0 -16
- package/lib/models/Exercise.js +0 -5
- package/lib/models/Item.d.ts +0 -20
- package/lib/models/Item.js +0 -5
- package/lib/models/ItemDTO.d.ts +0 -74
- package/lib/models/ItemDTO.js +0 -186
- package/lib/models/ItemType.d.ts +0 -2
- package/lib/models/ItemType.js +0 -5
- package/lib/models/Lesson.d.ts +0 -5
- package/lib/models/Lesson.js +0 -5
- package/lib/models/LexicalDTO.d.ts +0 -155
- package/lib/models/LexicalDTO.js +0 -157
- package/lib/models/Library.d.ts +0 -10
- package/lib/models/Library.js +0 -5
- package/lib/models/Notebook.d.ts +0 -11
- package/lib/models/Notebook.js +0 -5
- package/lib/models/NotebookDTO.d.ts +0 -96
- package/lib/models/NotebookDTO.js +0 -153
- package/lib/models/Page.d.ts +0 -41
- package/lib/models/Page.js +0 -25
- package/lib/models/PageTag.d.ts +0 -19
- package/lib/models/PageTag.js +0 -94
- package/lib/models/ProjectDTO.d.ts +0 -89
- package/lib/models/ProjectDTO.js +0 -131
- package/lib/models/Runtime.d.ts +0 -123
- package/lib/models/Runtime.js +0 -18
- package/lib/models/RuntimeDTO.d.ts +0 -191
- package/lib/models/RuntimeDTO.js +0 -204
- package/lib/models/Space.d.ts +0 -35
- package/lib/models/Space.js +0 -66
- package/lib/models/SpaceDTO.d.ts +0 -334
- package/lib/models/SpaceDTO.js +0 -244
- package/lib/models/SpaceItem.d.ts +0 -10
- package/lib/models/SpaceItem.js +0 -5
- package/lib/models/SpaceMember.d.ts +0 -6
- package/lib/models/SpaceMember.js +0 -5
- package/lib/models/StudentItem.d.ts +0 -21
- package/lib/models/StudentItem.js +0 -5
- package/lib/services/DatalayerServiceManager.d.ts +0 -22
- package/lib/services/DatalayerServiceManager.js +0 -69
- package/lib/services/index.d.ts +0 -4
- package/lib/services/index.js +0 -7
- package/lib/services/reconnectToRuntime.d.ts +0 -32
- package/lib/services/reconnectToRuntime.js +0 -59
- package/lib/state/substates/CellState.d.ts +0 -12
- package/lib/state/substates/CellState.js +0 -22
- package/lib/state/substates/DocumentState.d.ts +0 -10
- package/lib/state/substates/DocumentState.js +0 -14
- package/lib/state/substates/GradeState.d.ts +0 -10
- package/lib/state/substates/GradeState.js +0 -14
- package/lib/state/substates/JupyterLabState.d.ts +0 -16
- package/lib/state/substates/JupyterLabState.js +0 -17
- package/lib/state/substates/NbformatState.d.ts +0 -13
- package/lib/state/substates/NbformatState.js +0 -16
- package/lib/state/substates/RuntimesState.d.ts +0 -79
- package/lib/state/substates/RuntimesState.js +0 -180
- package/lib/state/substates/SpaceState.d.ts +0 -11
- package/lib/state/substates/SpaceState.js +0 -16
- package/lib/stateful/index.d.ts +0 -2
- package/lib/stateful/index.js +0 -6
- package/lib/stateful/jupyter/exec/Python.d.ts +0 -5
- package/lib/stateful/jupyter/exec/Python.js +0 -100
- package/lib/stateful/jupyter/exec/Snippets.d.ts +0 -105
- package/lib/stateful/jupyter/exec/Snippets.js +0 -101
- package/lib/stateful/jupyter/exec/index.d.ts +0 -2
- package/lib/stateful/jupyter/exec/index.js +0 -6
- package/lib/stateful/jupyter/index.d.ts +0 -2
- package/lib/stateful/jupyter/index.js +0 -6
- package/lib/stateful/jupyter/kernelsHandler.d.ts +0 -8
- package/lib/stateful/jupyter/kernelsHandler.js +0 -39
- package/lib/stateful/runtimes/actions.d.ts +0 -102
- package/lib/stateful/runtimes/actions.js +0 -249
- package/lib/stateful/runtimes/apis.d.ts +0 -273
- package/lib/stateful/runtimes/apis.js +0 -5
- package/lib/stateful/runtimes/index.d.ts +0 -5
- package/lib/stateful/runtimes/index.js +0 -9
- package/lib/stateful/runtimes/settings.d.ts +0 -15
- package/lib/stateful/runtimes/settings.js +0 -31
- package/lib/stateful/runtimes/snapshots.d.ts +0 -25
- package/lib/stateful/runtimes/snapshots.js +0 -150
- package/lib/stateful/runtimes/utils.d.ts +0 -7
- package/lib/stateful/runtimes/utils.js +0 -14
- package/lib/utils/Cells.d.ts +0 -2
- package/lib/utils/Cells.js +0 -28
- package/lib/views/iam-tokens/IAMTokenEdit.d.ts +0 -6
- package/lib/views/iam-tokens/IAMTokenNew.d.ts +0 -8
- package/lib/views/iam-tokens/IAMTokenNew.js +0 -118
- package/lib/views/iam-tokens/IAMTokens.d.ts +0 -12
- package/lib/views/iam-tokens/IAMTokens.js +0 -87
- package/lib/views/iam-tokens/Tokens.d.ts +0 -2
- package/lib/views/iam-tokens/Tokens.js +0 -85
- package/lib/views/iam-tokens/index.d.ts +0 -3
- package/lib/views/iam-tokens/index.js +0 -7
- /package/lib/{mocks/jupyter/index.d.ts → cli-login.d.ts} +0 -0
- /package/lib/utils/{logger.d.ts → Logger.d.ts} +0 -0
- /package/lib/utils/{logger.js → Logger.js} +0 -0
|
@@ -0,0 +1,47 @@
|
|
|
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
|
+
/**
|
|
7
|
+
* UserAvatar – Single source of truth for rendering a user's avatar.
|
|
8
|
+
*
|
|
9
|
+
* When a real (non-Gravatar) avatar URL is available it renders a
|
|
10
|
+
* {@link DLAvatar}. Otherwise it falls back to a themed, colormoded
|
|
11
|
+
* {@link AlienIcon} placeholder so every consumer (profile, sidebar,
|
|
12
|
+
* principal overlay, …) shares the same default look.
|
|
13
|
+
*/
|
|
14
|
+
import { AlienIcon } from '@datalayer/icons-react';
|
|
15
|
+
import { Box, useColorPalette } from '@datalayer/primer-addons';
|
|
16
|
+
import { DLAvatar } from './DLAvatar.js';
|
|
17
|
+
/**
|
|
18
|
+
* Returns `true` when the given URL points to a real user avatar (i.e. not a
|
|
19
|
+
* Gravatar default placeholder).
|
|
20
|
+
*/
|
|
21
|
+
export function hasRealAvatar(url) {
|
|
22
|
+
if (!url) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
if (url.startsWith('https://www.gravatar.com/avatar')) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
export const UserAvatar = ({ avatarUrl, size = 100, square = true, iconSize, }) => {
|
|
31
|
+
const palette = useColorPalette();
|
|
32
|
+
if (hasRealAvatar(avatarUrl)) {
|
|
33
|
+
return _jsx(DLAvatar, { square: square, src: avatarUrl, size: size });
|
|
34
|
+
}
|
|
35
|
+
const resolvedIconSize = iconSize ?? Math.round(size * 0.48);
|
|
36
|
+
return (_jsx(Box, { sx: {
|
|
37
|
+
width: size,
|
|
38
|
+
height: size,
|
|
39
|
+
borderRadius: square ? 2 : '50%',
|
|
40
|
+
bg: 'accent.subtle',
|
|
41
|
+
display: 'flex',
|
|
42
|
+
alignItems: 'center',
|
|
43
|
+
justifyContent: 'center',
|
|
44
|
+
'--datalayer-icon-fg': palette.primary,
|
|
45
|
+
}, children: _jsx(AlienIcon, { size: resolvedIconSize, themed: true, colormoded: true }) }));
|
|
46
|
+
};
|
|
47
|
+
export default UserAvatar;
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright (c) 2023-2025 Datalayer, Inc.
|
|
4
|
+
* Distributed under the terms of the Modified BSD License.
|
|
5
|
+
*/
|
|
2
6
|
/*
|
|
3
7
|
* Copyright (c) 2023-2026 Datalayer, Inc.
|
|
4
8
|
* Distributed under the terms of the Modified BSD License.
|
|
@@ -670,6 +670,37 @@ export function StripeCheckout({ checkoutPortal, appearance, accountUid, showSta
|
|
|
670
670
|
}
|
|
671
671
|
void startSubscriptionCheckout(pendingSubscriptionPlan);
|
|
672
672
|
}, [pendingSubscriptionPlan, startSubscriptionCheckout]);
|
|
673
|
+
// Auto-open the subscription checkout when the page is opened with
|
|
674
|
+
// `?upgrade` or `?action=upgrade` (e.g. from the Plan Overview
|
|
675
|
+
// "Upgrade to Team Plan" CTA).
|
|
676
|
+
useEffect(() => {
|
|
677
|
+
if (typeof window === 'undefined') {
|
|
678
|
+
return;
|
|
679
|
+
}
|
|
680
|
+
if (autoActionTriggeredRef.current) {
|
|
681
|
+
return;
|
|
682
|
+
}
|
|
683
|
+
if (isPaidSubscription || isCancellationScheduled) {
|
|
684
|
+
return;
|
|
685
|
+
}
|
|
686
|
+
try {
|
|
687
|
+
const params = new URLSearchParams(window.location.search);
|
|
688
|
+
const action = String(params.get('action') || '').toLowerCase();
|
|
689
|
+
const shouldAutoUpgrade = params.has('upgrade') || action === 'upgrade';
|
|
690
|
+
if (shouldAutoUpgrade && pendingSubscriptionPlan) {
|
|
691
|
+
autoActionTriggeredRef.current = true;
|
|
692
|
+
startPendingSubscriptionCheckout();
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
catch (_error) {
|
|
696
|
+
// Ignore malformed URLs.
|
|
697
|
+
}
|
|
698
|
+
}, [
|
|
699
|
+
isPaidSubscription,
|
|
700
|
+
isCancellationScheduled,
|
|
701
|
+
pendingSubscriptionPlan,
|
|
702
|
+
startPendingSubscriptionCheckout,
|
|
703
|
+
]);
|
|
673
704
|
const openPortal = useCallback((url) => {
|
|
674
705
|
if (!url) {
|
|
675
706
|
return;
|
|
@@ -825,7 +856,22 @@ export function StripeCheckout({ checkoutPortal, appearance, accountUid, showSta
|
|
|
825
856
|
checkout ||
|
|
826
857
|
!pendingSubscriptionPlan, children: subscriptionPaymentIntentMutation.isPending
|
|
827
858
|
? 'Preparing checkout...'
|
|
828
|
-
: 'Continue pending payment' }), _jsx(Button, { variant: "danger", onClick: onCancelSubscription, children: "Cancel pending plan change" })] })
|
|
859
|
+
: 'Continue pending payment' }), _jsx(Button, { variant: "danger", onClick: onCancelSubscription, children: "Cancel pending plan change" })] }), cancelViewOpen && (_jsxs(Box, { sx: {
|
|
860
|
+
marginTop: 'var(--stack-gap-normal)',
|
|
861
|
+
border: '1px solid',
|
|
862
|
+
borderColor: 'border.default',
|
|
863
|
+
borderRadius: 'var(--borderRadius-medium)',
|
|
864
|
+
backgroundColor: 'canvas.subtle',
|
|
865
|
+
padding: 'var(--stack-padding-normal)',
|
|
866
|
+
display: 'grid',
|
|
867
|
+
gap: 'var(--stack-gap-condensed)',
|
|
868
|
+
}, children: [_jsx(Text, { as: "h4", sx: { fontWeight: 'bold' }, children: "Cancel pending plan change" }), _jsx(Text, { as: "p", sx: { color: 'fg.muted' }, children: "This pending plan change will be canceled immediately." }), _jsxs(Box, { sx: {
|
|
869
|
+
display: 'flex',
|
|
870
|
+
gap: 'var(--stack-gap-condensed)',
|
|
871
|
+
flexWrap: 'wrap',
|
|
872
|
+
}, children: [_jsx(Button, { variant: "danger", onClick: () => void onConfirmCancelSubscription(), disabled: isCancelActionPending, leadingVisual: () => isCancelActionPending ? _jsx(Spinner, { size: "small" }) : undefined, children: isCancelActionPending
|
|
873
|
+
? 'Canceling pending plan change...'
|
|
874
|
+
: 'Confirm cancel pending plan change' }), _jsx(Button, { variant: "default", onClick: onAbortCancelView, disabled: isCancelActionPending, children: "Keep pending plan change" })] })] }))] })) : !isPaidSubscription ? (_jsxs(_Fragment, { children: [_jsxs(Box, { role: "radiogroup", sx: {
|
|
829
875
|
display: 'grid',
|
|
830
876
|
gap: 'var(--stack-gap-condensed)',
|
|
831
877
|
maxHeight: '260px',
|
|
@@ -847,7 +893,7 @@ export function StripeCheckout({ checkoutPortal, appearance, accountUid, showSta
|
|
|
847
893
|
subscriptionPaymentIntentMutation.isPending ||
|
|
848
894
|
checkout, children: subscriptionPaymentIntentMutation.isPending
|
|
849
895
|
? 'Preparing Team plan checkout...'
|
|
850
|
-
: '
|
|
896
|
+
: 'Upgrade to Team Plan' })] })) : null] })) : null;
|
|
851
897
|
const topUpSection = (_jsxs(Box, { children: [_jsx(Text, { as: "h3", sx: sectionTitleSx, children: "Topup your wallet with credits" }), _jsx(Box, { role: "radiogroup", sx: {
|
|
852
898
|
display: 'grid',
|
|
853
899
|
gap: 'var(--stack-gap-normal)',
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export type DisplayHandleProps = {
|
|
3
|
+
handle?: string;
|
|
4
|
+
withAt?: boolean;
|
|
5
|
+
fallback?: string;
|
|
6
|
+
};
|
|
7
|
+
export declare const displayHandleText: (handle?: string, options?: {
|
|
8
|
+
withAt?: boolean;
|
|
9
|
+
fallback?: string;
|
|
10
|
+
}) => string;
|
|
11
|
+
export declare const DisplayHandle: React.FC<DisplayHandleProps>;
|
|
12
|
+
export default DisplayHandle;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { formatFriendlyHandle } from '../../utils/Handles.js';
|
|
3
|
+
export const displayHandleText = (handle, options) => {
|
|
4
|
+
const withAt = options?.withAt ?? true;
|
|
5
|
+
const fallback = options?.fallback ?? 'unknown';
|
|
6
|
+
const friendly = formatFriendlyHandle(handle);
|
|
7
|
+
const normalized = String(friendly || '').trim() || fallback;
|
|
8
|
+
return withAt ? `@${normalized}` : normalized;
|
|
9
|
+
};
|
|
10
|
+
export const DisplayHandle = ({ handle, withAt = true, fallback = 'unknown', }) => _jsx(_Fragment, { children: displayHandleText(handle, { withAt, fallback }) });
|
|
11
|
+
export default DisplayHandle;
|
|
@@ -1,10 +1 @@
|
|
|
1
|
-
|
|
2
|
-
value?: Date | string | number;
|
|
3
|
-
refreshIntervalMs?: number;
|
|
4
|
-
fallback?: string;
|
|
5
|
-
};
|
|
6
|
-
/**
|
|
7
|
-
* Display a live-updating relative time label (e.g. "5m ago").
|
|
8
|
-
*/
|
|
9
|
-
export declare function LiveRelativeTime({ value, refreshIntervalMs, fallback, }: ILiveRelativeTimeProps): JSX.Element;
|
|
10
|
-
export {};
|
|
1
|
+
export { LiveRelativeTime } from '../time/LiveRelativeTime';
|
|
@@ -1,21 +1,10 @@
|
|
|
1
|
-
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
2
1
|
/*
|
|
3
2
|
* Copyright (c) 2023-2025 Datalayer, Inc.
|
|
4
3
|
* Distributed under the terms of the Modified BSD License.
|
|
5
4
|
*/
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
* Display a live-updating relative time label (e.g. "5m ago").
|
|
5
|
+
/*
|
|
6
|
+
* Copyright (c) 2023-2026 Datalayer, Inc.
|
|
7
|
+
* Distributed under the terms of the Modified BSD License.
|
|
10
8
|
*/
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
useEffect(() => {
|
|
14
|
-
const timer = window.setInterval(() => {
|
|
15
|
-
setNow(new Date());
|
|
16
|
-
}, refreshIntervalMs);
|
|
17
|
-
return () => window.clearInterval(timer);
|
|
18
|
-
}, [refreshIntervalMs]);
|
|
19
|
-
const label = useMemo(() => formatRelativeTime(value, now), [value, now]);
|
|
20
|
-
return _jsx(_Fragment, { children: label ?? fallback });
|
|
21
|
-
}
|
|
9
|
+
// Backward compatibility export. Use ../../components/time/LiveRelativeTime.
|
|
10
|
+
export { LiveRelativeTime } from '../time/LiveRelativeTime.js';
|
|
@@ -2,6 +2,7 @@ export * from './AvatarSkeleton';
|
|
|
2
2
|
export * from './CenteredSpinner';
|
|
3
3
|
export * from './CodePreview';
|
|
4
4
|
export * from './DatalayerBox';
|
|
5
|
+
export * from './DisplayHandle';
|
|
5
6
|
export * from './HorizontalCenter';
|
|
6
7
|
export * from './JupyterDialog';
|
|
7
8
|
export * from './LiveRelativeTime';
|
|
@@ -6,6 +6,7 @@ export * from './AvatarSkeleton.js';
|
|
|
6
6
|
export * from './CenteredSpinner.js';
|
|
7
7
|
export * from './CodePreview.js';
|
|
8
8
|
export * from './DatalayerBox.js';
|
|
9
|
+
export * from './DisplayHandle.js';
|
|
9
10
|
export * from './HorizontalCenter.js';
|
|
10
11
|
export * from './JupyterDialog.js';
|
|
11
12
|
export * from './LiveRelativeTime.js';
|
package/lib/components/index.js
CHANGED
|
@@ -17,6 +17,8 @@ export type PrincipalDescriptor = {
|
|
|
17
17
|
kind: PrincipalKind;
|
|
18
18
|
uid?: string;
|
|
19
19
|
displayName: string;
|
|
20
|
+
name?: string;
|
|
21
|
+
description?: string;
|
|
20
22
|
handle?: string;
|
|
21
23
|
accountHandle?: string;
|
|
22
24
|
firstName?: string;
|
|
@@ -31,6 +33,11 @@ export type PrincipalProps = {
|
|
|
31
33
|
avatarSize?: number;
|
|
32
34
|
gap?: number;
|
|
33
35
|
square?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Maximum length of the placeholder (handle or uid) shown before the real
|
|
38
|
+
* display name resolves. Defaults to {@link DEFAULT_PLACEHOLDER_MAX_LENGTH}.
|
|
39
|
+
*/
|
|
40
|
+
placeholderMaxLength?: number;
|
|
34
41
|
sx?: any;
|
|
35
42
|
};
|
|
36
43
|
export declare const Principal: React.FC<PrincipalProps>;
|
|
@@ -1,18 +1,139 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright (c) 2023-2025 Datalayer, Inc.
|
|
4
|
+
* Distributed under the terms of the Modified BSD License.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Principal – common, tunable display for an actor (user / team /
|
|
8
|
+
* organization). Combines a {@link PrincipalAvatar} with a
|
|
9
|
+
* {@link PrincipalDetailsOverlay} so all spots that need to show
|
|
10
|
+
* "avatar + clickable name with details overlay" can share a single
|
|
11
|
+
* component.
|
|
12
|
+
*/
|
|
13
|
+
import * as React from 'react';
|
|
2
14
|
import { Box } from '@datalayer/primer-addons';
|
|
3
15
|
import { useCache } from '../../hooks/index.js';
|
|
16
|
+
import { useIAMStore } from '../../state/index.js';
|
|
4
17
|
import { PrincipalAvatar } from './PrincipalAvatar.js';
|
|
5
18
|
import { PrincipalDetailsOverlay } from './PrincipalDetailsOverlay.js';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Default maximum length applied to the placeholder shown before a principal's
|
|
21
|
+
* real display name has been resolved. The placeholder (derived from the given
|
|
22
|
+
* handle or uid) is truncated to this many characters.
|
|
23
|
+
*/
|
|
24
|
+
const DEFAULT_PLACEHOLDER_MAX_LENGTH = 10;
|
|
25
|
+
/**
|
|
26
|
+
* Generic, non-informative display names that callers pass while the real
|
|
27
|
+
* entity is still loading. When the provided display name is one of these we
|
|
28
|
+
* prefer a handle/uid-derived placeholder instead.
|
|
29
|
+
*/
|
|
30
|
+
const GENERIC_PLACEHOLDER_DISPLAY_NAMES = new Set([
|
|
31
|
+
'unknown',
|
|
32
|
+
'principal',
|
|
33
|
+
'personal',
|
|
34
|
+
'team',
|
|
35
|
+
'organization',
|
|
36
|
+
'billable account',
|
|
37
|
+
]);
|
|
38
|
+
/** Truncate a placeholder string to `maxLength`, appending an ellipsis. */
|
|
39
|
+
function truncatePlaceholder(value, maxLength) {
|
|
40
|
+
const trimmed = value.trim();
|
|
41
|
+
if (maxLength <= 0 || trimmed.length <= maxLength) {
|
|
42
|
+
return trimmed;
|
|
43
|
+
}
|
|
44
|
+
return `${trimmed.slice(0, maxLength)}\u2026`;
|
|
45
|
+
}
|
|
46
|
+
export const Principal = ({ principal, isAdmin = false, avatarSize = 20, gap = 2, square = false, placeholderMaxLength = DEFAULT_PLACEHOLDER_MAX_LENGTH, sx, }) => {
|
|
47
|
+
const { useUser, useOrganizationByHandle, useTeam, useUserPublicProfileByHandle, useOrganizationPublicProfileByHandle, } = useCache();
|
|
48
|
+
// When no user is authenticated (anonymous visitor, e.g. public pages), the
|
|
49
|
+
// authenticated `useUser` / `useOrganization` endpoints return 401, which
|
|
50
|
+
// triggers a global logout + redirect to sign-in. For anonymous visitors we
|
|
51
|
+
// resolve the principal through the public-by-handle endpoints instead, which
|
|
52
|
+
// are anonymous-accessible and therefore never redirect.
|
|
53
|
+
const { user: authenticatedUser } = useIAMStore();
|
|
54
|
+
const isAnonymous = !authenticatedUser;
|
|
55
|
+
const normalizedUid = String(principal.uid || '').trim();
|
|
56
|
+
const normalizedProvidedHandle = String(principal.handle || '').trim();
|
|
57
|
+
const normalizedProvidedAccountHandle = String(principal.accountHandle || '').trim();
|
|
58
|
+
const providedHandleIsUidPlaceholder = !!normalizedProvidedHandle &&
|
|
59
|
+
!!normalizedUid &&
|
|
60
|
+
normalizedProvidedHandle === normalizedUid;
|
|
61
|
+
const providedAccountHandleIsUidPlaceholder = !!normalizedProvidedAccountHandle &&
|
|
62
|
+
!!normalizedUid &&
|
|
63
|
+
normalizedProvidedAccountHandle === normalizedUid;
|
|
64
|
+
const principalHandle = String((!providedHandleIsUidPlaceholder ? principal.handle : '') ||
|
|
65
|
+
(!providedAccountHandleIsUidPlaceholder ? principal.accountHandle : '') ||
|
|
66
|
+
'').trim();
|
|
67
|
+
const teamPathParts = principal.kind === 'team' ? principalHandle.split('/') : [];
|
|
68
|
+
const teamOrganizationHandleFromPath = String(teamPathParts[0] || '').trim();
|
|
69
|
+
const teamOrganizationHandleFromAccount = principal.kind === 'team' && !providedAccountHandleIsUidPlaceholder
|
|
70
|
+
? String(principal.accountHandle || '').trim()
|
|
71
|
+
: '';
|
|
72
|
+
const teamOrganizationHandle = teamOrganizationHandleFromPath || teamOrganizationHandleFromAccount;
|
|
73
|
+
const hydratedUserQuery = useUser(!isAnonymous && principal.kind === 'personal'
|
|
74
|
+
? String(principal.uid || '')
|
|
75
|
+
: '');
|
|
76
|
+
// Authenticated organizations are fetched by handle via the accounts
|
|
77
|
+
// endpoint (`/api/iam/v1/accounts/{handle}`). The by-uid organization
|
|
78
|
+
// endpoint (`/api/iam/v1/organizations/{uid}`) is not served and 404s, so we
|
|
79
|
+
// never look an organization up by uid here.
|
|
80
|
+
const organizationLookupHandle = String(principalHandle || '')
|
|
81
|
+
.replace(/^@+/, '')
|
|
82
|
+
.trim();
|
|
83
|
+
const hydratedOrgQuery = useOrganizationByHandle(!isAnonymous && principal.kind === 'organization'
|
|
84
|
+
? organizationLookupHandle
|
|
85
|
+
: '');
|
|
86
|
+
const teamOrganizationQuery = useOrganizationByHandle(principal.kind === 'team' ? teamOrganizationHandle : '');
|
|
87
|
+
const hydratedTeamQuery = useTeam(principal.kind === 'team' ? String(principal.uid || '') : '', principal.kind === 'team'
|
|
88
|
+
? String(teamOrganizationQuery.data?.id || '')
|
|
89
|
+
: '');
|
|
90
|
+
const hydratedPublicUserQuery = useUserPublicProfileByHandle(isAnonymous && principal.kind === 'personal' ? principalHandle : '');
|
|
91
|
+
const hydratedPublicOrgQuery = useOrganizationPublicProfileByHandle(isAnonymous && principal.kind === 'organization' ? principalHandle : '');
|
|
92
|
+
// Normalise the public (snake_case) profile payloads into the same camelCase
|
|
93
|
+
// shape the authenticated entities expose, so downstream logic is uniform.
|
|
94
|
+
const normalizedPublicUser = React.useMemo(() => {
|
|
95
|
+
const profile = hydratedPublicUserQuery.data;
|
|
96
|
+
if (!profile) {
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
const displayName = String(profile.display_name ||
|
|
100
|
+
[profile.first_name, profile.last_name].filter(Boolean).join(' ') ||
|
|
101
|
+
'').trim();
|
|
102
|
+
return {
|
|
103
|
+
displayName,
|
|
104
|
+
firstName: profile.first_name,
|
|
105
|
+
lastName: profile.last_name,
|
|
106
|
+
handle: profile.handle,
|
|
107
|
+
avatarUrl: profile.avatar_url,
|
|
108
|
+
origin: profile.origin,
|
|
109
|
+
email: profile.email,
|
|
110
|
+
};
|
|
111
|
+
}, [hydratedPublicUserQuery.data]);
|
|
112
|
+
const normalizedPublicOrg = React.useMemo(() => {
|
|
113
|
+
const profile = hydratedPublicOrgQuery.data;
|
|
114
|
+
if (!profile) {
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
displayName: String(profile.display_name || profile.name || '').trim(),
|
|
119
|
+
name: profile.name,
|
|
120
|
+
description: profile.description || profile.description_t,
|
|
121
|
+
handle: profile.handle,
|
|
122
|
+
avatarUrl: profile.avatar_url,
|
|
123
|
+
};
|
|
124
|
+
}, [hydratedPublicOrgQuery.data]);
|
|
125
|
+
const hydratedEntity = principal.kind === 'personal'
|
|
126
|
+
? isAnonymous
|
|
127
|
+
? normalizedPublicUser
|
|
128
|
+
: hydratedUserQuery.data
|
|
12
129
|
: principal.kind === 'organization'
|
|
13
|
-
?
|
|
14
|
-
|
|
15
|
-
|
|
130
|
+
? isAnonymous
|
|
131
|
+
? normalizedPublicOrg
|
|
132
|
+
: hydratedOrgQuery.data
|
|
133
|
+
: principal.kind === 'team'
|
|
134
|
+
? hydratedTeamQuery.data
|
|
135
|
+
: undefined;
|
|
136
|
+
const hydratedDisplayName = principal.kind === 'personal'
|
|
16
137
|
? String(hydratedEntity?.displayName ||
|
|
17
138
|
[
|
|
18
139
|
hydratedEntity?.firstName,
|
|
@@ -27,16 +148,32 @@ export const Principal = ({ principal, isAdmin = false, avatarSize = 20, gap = 2
|
|
|
27
148
|
const resolvedPrincipal = {
|
|
28
149
|
...principal,
|
|
29
150
|
displayName: hydratedDisplayName ||
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
151
|
+
(() => {
|
|
152
|
+
const providedDisplayName = String(principal.displayName || '').trim();
|
|
153
|
+
const providedIsGenericPlaceholder = !providedDisplayName ||
|
|
154
|
+
GENERIC_PLACEHOLDER_DISPLAY_NAMES.has(providedDisplayName.toLowerCase()) ||
|
|
155
|
+
(!!normalizedUid && providedDisplayName === normalizedUid);
|
|
156
|
+
// While the real display name is unresolved, prefer the given handle
|
|
157
|
+
// (or uid) as a placeholder, truncated to a maximum length. Only fall
|
|
158
|
+
// back to the caller-provided display name when it is meaningful.
|
|
159
|
+
const placeholder = truncatePlaceholder(principalHandle || normalizedProvidedHandle || normalizedUid || '', placeholderMaxLength);
|
|
160
|
+
if (providedIsGenericPlaceholder) {
|
|
161
|
+
return placeholder || providedDisplayName || 'Unknown';
|
|
162
|
+
}
|
|
163
|
+
return providedDisplayName || placeholder || 'Unknown';
|
|
164
|
+
})(),
|
|
165
|
+
handle: (!providedHandleIsUidPlaceholder ? principal.handle : undefined) ||
|
|
35
166
|
String(hydratedEntity?.handle || '').trim() ||
|
|
36
167
|
undefined,
|
|
37
|
-
accountHandle: principal.accountHandle ||
|
|
168
|
+
accountHandle: (!providedAccountHandleIsUidPlaceholder ? principal.accountHandle : undefined) ||
|
|
38
169
|
String(hydratedEntity?.handle || '').trim() ||
|
|
39
170
|
undefined,
|
|
171
|
+
name: principal.name ||
|
|
172
|
+
String(hydratedEntity?.name || '').trim() ||
|
|
173
|
+
undefined,
|
|
174
|
+
description: principal.description ||
|
|
175
|
+
String(hydratedEntity?.description || '').trim() ||
|
|
176
|
+
undefined,
|
|
40
177
|
avatarUrl: principal.avatarUrl || hydratedEntity?.avatarUrl || undefined,
|
|
41
178
|
firstName: principal.firstName || hydratedEntity?.firstName || undefined,
|
|
42
179
|
lastName: principal.lastName || hydratedEntity?.lastName || undefined,
|
|
@@ -49,6 +186,6 @@ export const Principal = ({ principal, isAdmin = false, avatarSize = 20, gap = 2
|
|
|
49
186
|
gap,
|
|
50
187
|
minWidth: 0,
|
|
51
188
|
...sx,
|
|
52
|
-
}, children: [_jsx(PrincipalAvatar, { kind: resolvedPrincipal.kind, avatarUrl: resolvedPrincipal.avatarUrl, alt: resolvedPrincipal.displayName, size: avatarSize, square: square }), _jsx(PrincipalDetailsOverlay, { kind: resolvedPrincipal.kind, uid: resolvedPrincipal.uid, displayName: resolvedPrincipal.displayName, handle: resolvedPrincipal.handle, accountHandle: resolvedPrincipal.accountHandle, firstName: resolvedPrincipal.firstName, lastName: resolvedPrincipal.lastName, email: resolvedPrincipal.email, origin: resolvedPrincipal.origin, avatarUrl: resolvedPrincipal.avatarUrl, isAdmin: isAdmin })] }));
|
|
189
|
+
}, children: [_jsx(PrincipalAvatar, { kind: resolvedPrincipal.kind, avatarUrl: resolvedPrincipal.avatarUrl, alt: resolvedPrincipal.displayName, size: avatarSize, square: square }), _jsx(PrincipalDetailsOverlay, { kind: resolvedPrincipal.kind, uid: resolvedPrincipal.uid, displayName: resolvedPrincipal.displayName, name: resolvedPrincipal.name, description: resolvedPrincipal.description, handle: resolvedPrincipal.handle, accountHandle: resolvedPrincipal.accountHandle, firstName: resolvedPrincipal.firstName, lastName: resolvedPrincipal.lastName, email: resolvedPrincipal.email, origin: resolvedPrincipal.origin, avatarUrl: resolvedPrincipal.avatarUrl, isAdmin: isAdmin })] }));
|
|
53
190
|
};
|
|
54
191
|
export default Principal;
|
|
@@ -3,42 +3,18 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
3
3
|
* Copyright (c) 2023-2025 Datalayer, Inc.
|
|
4
4
|
* Distributed under the terms of the Modified BSD License.
|
|
5
5
|
*/
|
|
6
|
-
import { Box
|
|
6
|
+
import { Box } from '@datalayer/primer-addons';
|
|
7
7
|
import { OrganizationIcon, PeopleIcon } from '@primer/octicons-react';
|
|
8
|
-
import {
|
|
9
|
-
import { DLAvatar } from '../avatars/index.js';
|
|
10
|
-
function hasRealAvatar(url) {
|
|
11
|
-
if (!url) {
|
|
12
|
-
return false;
|
|
13
|
-
}
|
|
14
|
-
if (url.startsWith('https://www.gravatar.com/avatar')) {
|
|
15
|
-
return false;
|
|
16
|
-
}
|
|
17
|
-
return true;
|
|
18
|
-
}
|
|
8
|
+
import { UserAvatar } from '../avatars/index.js';
|
|
19
9
|
function getFallbackIconSize(size) {
|
|
20
10
|
return Math.max(12, Math.round(size * 0.62));
|
|
21
11
|
}
|
|
22
12
|
export function PrincipalAvatar({ kind, avatarUrl, alt, size = 20, square = false, }) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
return (_jsx(DLAvatar, { src: avatarUrl, alt: alt || 'User', size: size, square: square }));
|
|
13
|
+
if (kind === 'personal') {
|
|
14
|
+
return (_jsx(UserAvatar, { avatarUrl: avatarUrl, size: size, square: square, iconSize: getFallbackIconSize(size) }));
|
|
26
15
|
}
|
|
27
16
|
const iconSize = getFallbackIconSize(size);
|
|
28
17
|
const borderRadius = square ? 2 : '50%';
|
|
29
|
-
if (kind === 'user') {
|
|
30
|
-
return (_jsx(Box, { sx: {
|
|
31
|
-
width: size,
|
|
32
|
-
height: size,
|
|
33
|
-
display: 'inline-flex',
|
|
34
|
-
alignItems: 'center',
|
|
35
|
-
justifyContent: 'center',
|
|
36
|
-
bg: 'accent.subtle',
|
|
37
|
-
borderRadius,
|
|
38
|
-
overflow: 'hidden',
|
|
39
|
-
'--datalayer-icon-fg': palette.primary,
|
|
40
|
-
}, "aria-label": alt || 'User', children: _jsx(AlienIcon, { size: iconSize }) }));
|
|
41
|
-
}
|
|
42
18
|
const Icon = kind === 'team' ? PeopleIcon : OrganizationIcon;
|
|
43
19
|
return (_jsx(Box, { sx: {
|
|
44
20
|
width: size,
|
|
@@ -71,7 +71,7 @@ export const PrincipalBadge = ({ principal: providedPrincipal, showPrincipalLabe
|
|
|
71
71
|
kind: 'team',
|
|
72
72
|
uid: selectedPrincipalUid,
|
|
73
73
|
handle: `${orgHandle}/${teamHandle}`,
|
|
74
|
-
accountHandle:
|
|
74
|
+
accountHandle: orgHandle,
|
|
75
75
|
displayName: `@${formatFriendlyHandle(orgHandle)}/${formatFriendlyHandle(teamHandle)}`,
|
|
76
76
|
origin: 'Datalayer',
|
|
77
77
|
};
|
|
@@ -85,7 +85,7 @@ export const PrincipalBadge = ({ principal: providedPrincipal, showPrincipalLabe
|
|
|
85
85
|
? `@${formatFriendlyHandle(resolvedHandle)}`
|
|
86
86
|
: '@me';
|
|
87
87
|
return {
|
|
88
|
-
kind: '
|
|
88
|
+
kind: 'personal',
|
|
89
89
|
uid: user?.id || selectedPrincipalUid,
|
|
90
90
|
displayName: fullName || fallbackHandle,
|
|
91
91
|
handle: resolvedHandle,
|
|
@@ -110,7 +110,7 @@ export const PrincipalBadge = ({ principal: providedPrincipal, showPrincipalLabe
|
|
|
110
110
|
user?.email,
|
|
111
111
|
user?.avatarUrl,
|
|
112
112
|
]);
|
|
113
|
-
const userLookupUid = basePrincipal.kind === '
|
|
113
|
+
const userLookupUid = basePrincipal.kind === 'personal' ? String(basePrincipal.uid || '') : '';
|
|
114
114
|
const organizationLookupUid = basePrincipal.kind === 'organization'
|
|
115
115
|
? String(basePrincipal.uid || '')
|
|
116
116
|
: '';
|
|
@@ -168,7 +168,7 @@ export const PrincipalBadge = ({ principal: providedPrincipal, showPrincipalLabe
|
|
|
168
168
|
fallbackHandle;
|
|
169
169
|
const origin = normalizeUserOrigin(resolvedUser?.origin || basePrincipal.origin);
|
|
170
170
|
return {
|
|
171
|
-
kind: '
|
|
171
|
+
kind: 'personal',
|
|
172
172
|
uid: resolvedUser?.uid || basePrincipal.uid,
|
|
173
173
|
displayName: resolvedDisplayName,
|
|
174
174
|
handle: resolvedHandle,
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
export type PrincipalKind = '
|
|
1
|
+
export type PrincipalKind = 'personal' | 'team' | 'organization';
|
|
2
2
|
export type PrincipalDetailsOverlayProps = {
|
|
3
3
|
kind: PrincipalKind;
|
|
4
4
|
uid?: string;
|
|
5
5
|
displayName: string;
|
|
6
|
+
name?: string;
|
|
7
|
+
description?: string;
|
|
6
8
|
handle?: string;
|
|
7
9
|
accountHandle?: string;
|
|
8
10
|
firstName?: string;
|
|
@@ -19,5 +21,5 @@ export declare function buildPrincipalProfilePath({ kind, uid, handle, accountHa
|
|
|
19
21
|
accountHandle?: string;
|
|
20
22
|
isAdmin?: boolean;
|
|
21
23
|
}): string | null;
|
|
22
|
-
export declare function PrincipalDetailsOverlay({ kind, uid, displayName, handle, accountHandle, firstName, lastName, email, origin, avatarUrl, isAdmin, }: PrincipalDetailsOverlayProps): JSX.Element;
|
|
24
|
+
export declare function PrincipalDetailsOverlay({ kind, uid, displayName, name, description, handle, accountHandle, firstName, lastName, email, origin, avatarUrl, isAdmin, }: PrincipalDetailsOverlayProps): JSX.Element;
|
|
23
25
|
export default PrincipalDetailsOverlay;
|