@gen3/workspaces 0.12.47 → 0.12.48

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/dts/components/CompactDictionaryPanel/CompactDictionaryPanel.d.ts.map +1 -1
  2. package/dist/dts/components/CompactDictionaryPanel/CompactDictionaryPanel.js +6 -2
  3. package/dist/dts/components/CompactDictionaryPanel/CompactDictionaryPanel.js.map +1 -1
  4. package/dist/dts/components/KernelLifecyclePanel/KernelSelector.js +2 -2
  5. package/dist/dts/components/KernelLifecyclePanel/KernelSelector.js.map +1 -1
  6. package/dist/dts/config.d.ts +0 -2
  7. package/dist/dts/config.d.ts.map +1 -1
  8. package/dist/dts/config.js +0 -34
  9. package/dist/dts/config.js.map +1 -1
  10. package/dist/dts/pages/WorkspacesCenter/data.d.ts.map +1 -1
  11. package/dist/dts/pages/WorkspacesCenter/data.js +42 -3
  12. package/dist/dts/pages/WorkspacesCenter/data.js.map +1 -1
  13. package/dist/dts/server/workspaceAssetsHandler.d.ts.map +1 -1
  14. package/dist/dts/server/workspaceAssetsHandler.js +0 -1
  15. package/dist/dts/server/workspaceAssetsHandler.js.map +1 -1
  16. package/dist/dts/workspace/WorkspaceCenter.js +2 -2
  17. package/dist/dts/workspace/WorkspaceCenter.js.map +1 -1
  18. package/dist/dts/workspace/WorkspaceLayout/SettingsPanel.d.ts +1 -1
  19. package/dist/dts/workspace/WorkspaceLayout/SettingsPanel.d.ts.map +1 -1
  20. package/dist/dts/workspace/WorkspaceLayout/SettingsPanel.js +2 -2
  21. package/dist/dts/workspace/WorkspaceLayout/SettingsPanel.js.map +1 -1
  22. package/dist/dts/workspace/WorkspaceLayout/ToolsPanel.d.ts +2 -1
  23. package/dist/dts/workspace/WorkspaceLayout/ToolsPanel.d.ts.map +1 -1
  24. package/dist/dts/workspace/WorkspaceLayout/ToolsPanel.js +2 -2
  25. package/dist/dts/workspace/WorkspaceLayout/ToolsPanel.js.map +1 -1
  26. package/dist/dts/workspace/WorkspaceLayout/WorkspaceLayout.d.ts +3 -1
  27. package/dist/dts/workspace/WorkspaceLayout/WorkspaceLayout.d.ts.map +1 -1
  28. package/dist/dts/workspace/WorkspaceLayout/WorkspaceLayout.js +2 -3
  29. package/dist/dts/workspace/WorkspaceLayout/WorkspaceLayout.js.map +1 -1
  30. package/dist/dts/workspace/tiers/types.d.ts +4 -2
  31. package/dist/dts/workspace/tiers/types.d.ts.map +1 -1
  32. package/dist/dts/workspace/types.d.ts +1 -0
  33. package/dist/dts/workspace/types.d.ts.map +1 -1
  34. package/dist/index/cjs/index.js +100 -68
  35. package/dist/index/cjs/index.js.map +1 -1
  36. package/dist/index/esm/index.js +101 -69
  37. package/dist/index/esm/index.js.map +1 -1
  38. package/dist/index.d.ts +4 -2
  39. package/dist/server/cjs/server.js +0 -1
  40. package/dist/server/cjs/server.js.map +1 -1
  41. package/dist/server/esm/server.js +0 -1
  42. package/dist/server/esm/server.js.map +1 -1
  43. package/package.json +4 -4
@@ -6,10 +6,11 @@ import { Icon } from '@iconify-icon/react';
6
6
  import { GEN3_API, GEN3_WORKSPACE_API, gen3Api, useCoreSelector, selectJEGActiveWorkspaceStatus, useCoreDispatch, setJEGActiveWorkspaceStatus, WorkspaceStatus, setJEGRequestedWorkspaceStatus, RequestedWorkspaceStatus, setJEGActiveWorkspaceId, isFetchBaseQueryError, selectJEGRequestedWorkspaceStatus, selectJEGRequestedWorkspaceStatusTimestamp, isTimeGreaterThan, formatUptimeInMinutes, selectJEGKernelIds, removeManyJEGActiveKernels, upsertManyJEGActiveKernels, normalizeRtkError, selectAllJEGKernels, addJEGActiveKernel, selectWorkspaceTier, setWorkspaceTier, selectWorkspaceFullscreen, setWorkspaceFullscreen, useGetDictionaryFromUrlQuery, useUserAuth, GEN3_COMMONS_NAME } from '@gen3/core';
7
7
  import { useDeepCompareEffect } from 'use-deep-compare';
8
8
  import { notifications } from '@mantine/notifications';
9
- import { useDisclosure } from '@mantine/hooks';
9
+ import { useElementSize, useDisclosure } from '@mantine/hooks';
10
10
  import { IoSettingsSharp } from 'react-icons/io5';
11
11
  import { BsFillInfoCircleFill } from 'react-icons/bs';
12
12
  import { MdKeyboardArrowDown, MdKeyboardArrowRight } from 'react-icons/md';
13
+ import { merge } from 'lodash';
13
14
 
14
15
  const WorkspaceTierCard = ({ label, description, tier, features = [], tooltip = 'Launch workspace', buttonLabel = 'Launch', onSelectTier, baseColor })=>{
15
16
  const handleClick = useCallback(()=>onSelectTier(tier), [
@@ -1848,7 +1849,7 @@ const KernelSelector = ({ handleLaunchKernel, isLaunchingLoading, onKernelSelect
1848
1849
  id: "klp-kernel-spec",
1849
1850
  value: selectedKernelName,
1850
1851
  onChange: (value)=>setSelectedKernelName(value),
1851
- disabled: disabled,
1852
+ disabled: disabled || isError,
1852
1853
  data: kernelSpecs?.length === 0 ? [
1853
1854
  {
1854
1855
  value: 'python3',
@@ -1889,7 +1890,7 @@ const KernelSelector = ({ handleLaunchKernel, isLaunchingLoading, onKernelSelect
1889
1890
  onClick: ()=>handleLaunchKernel(selectedKernelName || 'python3'),
1890
1891
  loading: isLaunchingLoading,
1891
1892
  fullWidth: true,
1892
- disabled: disabled,
1893
+ disabled: disabled || isError,
1893
1894
  children: isLaunchingLoading ? 'Working...' : 'Launch Kernel'
1894
1895
  })
1895
1896
  ]
@@ -2200,7 +2201,7 @@ function HorizontalAccordion({ label, expanded, setExpanded, children, expandedW
2200
2201
  });
2201
2202
  }
2202
2203
 
2203
- const SettingsPanel = ({ showKernels, expanded, setExpanded })=>{
2204
+ const SettingsPanel = ({ showKernels, expanded, setExpanded, width = 380 })=>{
2204
2205
  const currentTier = useCoreSelector(selectWorkspaceTier);
2205
2206
  const coreDispatch = useCoreDispatch();
2206
2207
  const onUpgradeToRemote = useCallback(()=>{
@@ -2213,7 +2214,7 @@ const SettingsPanel = ({ showKernels, expanded, setExpanded })=>{
2213
2214
  expanded: expanded,
2214
2215
  setExpanded: setExpanded,
2215
2216
  rightSide: true,
2216
- expandedWidth: 380,
2217
+ expandedWidth: width,
2217
2218
  children: /*#__PURE__*/ jsxs(Stack, {
2218
2219
  gap: "sm",
2219
2220
  className: PanelStyle,
@@ -2362,41 +2363,6 @@ const WorkspaceToolbar = ({ toolbarConfiguration })=>{
2362
2363
  });
2363
2364
  };
2364
2365
 
2365
- const WORKSPACE_TIER_INFORMATION = {
2366
- free: {
2367
- tier: 'free',
2368
- toolbar: {
2369
- label: 'JupyterLite',
2370
- description: 'Running via JupyterLite',
2371
- showStop: false,
2372
- showStatus: false
2373
- },
2374
- settings: {
2375
- showKernels: false
2376
- },
2377
- dataAndTools: {
2378
- enabled: true,
2379
- tabs: []
2380
- }
2381
- },
2382
- remote: {
2383
- tier: 'remote',
2384
- toolbar: {
2385
- label: 'Remote Compute Environment',
2386
- description: 'Running with Remote Kernels',
2387
- showStop: true,
2388
- showStatus: true
2389
- },
2390
- settings: {
2391
- showKernels: true
2392
- },
2393
- dataAndTools: {
2394
- enabled: true,
2395
- tabs: []
2396
- }
2397
- }
2398
- };
2399
-
2400
2366
  // Streaming LLM client — OpenAI, Anthropic, Gemini, Ollama
2401
2367
  // All requests go directly from the browser to provider APIs (no backend proxy).
2402
2368
  const DEFAULT_OLLAMA_URL = 'http://localhost:11434';
@@ -3551,6 +3517,9 @@ const FieldLinkCountBadge = ({ fieldsCount, linksCount })=>{
3551
3517
  };
3552
3518
 
3553
3519
  const CompactDictionaryPanel = ({ schemaUrl = '_dictionary/_all' })=>{
3520
+ const { ref, width } = useElementSize();
3521
+ const isNarrow = width > 0 && width < 280;
3522
+ const isCompact = width > 0 && width < 360;
3554
3523
  const [nodes, setNodes] = useState([]);
3555
3524
  const [search, setSearch] = useState('');
3556
3525
  const [expandedId, setExpandedId] = useState(null);
@@ -3583,7 +3552,8 @@ const CompactDictionaryPanel = ({ schemaUrl = '_dictionary/_all' })=>{
3583
3552
  });
3584
3553
  }
3585
3554
  return /*#__PURE__*/ jsxs("div", {
3586
- className: "relative flex flex-col gap-2 bg-base-lightest p-2 ",
3555
+ ref: ref,
3556
+ className: "relative flex h-full flex-col gap-2 overflow-hidden bg-base-lightest p-2",
3587
3557
  children: [
3588
3558
  /*#__PURE__*/ jsx(LoadingOverlay, {
3589
3559
  visible: isFetching
@@ -3603,7 +3573,7 @@ const CompactDictionaryPanel = ({ schemaUrl = '_dictionary/_all' })=>{
3603
3573
  ]
3604
3574
  }),
3605
3575
  /*#__PURE__*/ jsx("div", {
3606
- className: "flex flex-col gap-0.5",
3576
+ className: "flex min-h-0 flex-1 flex-col gap-0.5 overflow-y-auto",
3607
3577
  children: filtered.map((node)=>{
3608
3578
  const isExpanded = expandedId === node.id;
3609
3579
  const propCount = Object.keys(node.properties).length;
@@ -3614,27 +3584,45 @@ const CompactDictionaryPanel = ({ schemaUrl = '_dictionary/_all' })=>{
3614
3584
  /*#__PURE__*/ jsxs("button", {
3615
3585
  type: "button",
3616
3586
  onClick: ()=>setExpandedId(isExpanded ? null : node.id),
3617
- className: "flex w-full items-center gap-2 px-2.5 py-2 text-left hover:bg-base-lightest hover:bg-opacity-50",
3587
+ className: "flex w-full flex-col px-2.5 py-2 text-left hover:bg-base-lightest hover:bg-opacity-50",
3618
3588
  "aria-label": `Expand description for ${node.title}`,
3619
3589
  "aria-expanded": isExpanded,
3620
3590
  children: [
3621
- isExpanded ? /*#__PURE__*/ jsx(MdKeyboardArrowDown, {}) : /*#__PURE__*/ jsx(MdKeyboardArrowRight, {}),
3622
3591
  /*#__PURE__*/ jsxs("div", {
3623
- className: "min-w-0 flex-1",
3592
+ className: "flex w-full items-center gap-2",
3624
3593
  children: [
3625
- /*#__PURE__*/ jsx("div", {
3626
- className: "truncate text-xs font-semibold text-base-darkest",
3627
- children: node.title
3594
+ isExpanded ? /*#__PURE__*/ jsx(MdKeyboardArrowDown, {}) : /*#__PURE__*/ jsx(MdKeyboardArrowRight, {}),
3595
+ /*#__PURE__*/ jsxs("div", {
3596
+ className: "min-w-0 flex-1",
3597
+ children: [
3598
+ /*#__PURE__*/ jsx("div", {
3599
+ className: "truncate text-xs font-semibold text-base-darkest",
3600
+ children: node.title
3601
+ }),
3602
+ !isNarrow && node.category && /*#__PURE__*/ jsx("div", {
3603
+ className: "truncate text-sm text-base-darker",
3604
+ children: node.category
3605
+ })
3606
+ ]
3628
3607
  }),
3629
- node.category && /*#__PURE__*/ jsx("div", {
3630
- className: "truncate text-sm text-base-darker",
3631
- children: node.category
3608
+ !isNarrow && /*#__PURE__*/ jsx(FieldLinkCountBadge, {
3609
+ fieldsCount: propCount,
3610
+ linksCount: linkCount
3632
3611
  })
3633
3612
  ]
3634
3613
  }),
3635
- /*#__PURE__*/ jsx(FieldLinkCountBadge, {
3636
- fieldsCount: propCount,
3637
- linksCount: linkCount
3614
+ isNarrow && /*#__PURE__*/ jsxs("div", {
3615
+ className: "flex w-full items-center justify-between pl-5 pt-0.5",
3616
+ children: [
3617
+ node.category && /*#__PURE__*/ jsx("span", {
3618
+ className: "truncate text-xs text-base-darker",
3619
+ children: node.category
3620
+ }),
3621
+ /*#__PURE__*/ jsx(FieldLinkCountBadge, {
3622
+ fieldsCount: propCount,
3623
+ linksCount: linkCount
3624
+ })
3625
+ ]
3638
3626
  })
3639
3627
  ]
3640
3628
  }),
@@ -3656,7 +3644,7 @@ const CompactDictionaryPanel = ({ schemaUrl = '_dictionary/_all' })=>{
3656
3644
  /*#__PURE__*/ jsx(Table.Th, {
3657
3645
  children: "Type"
3658
3646
  }),
3659
- /*#__PURE__*/ jsx(Table.Th, {})
3647
+ !isCompact && /*#__PURE__*/ jsx(Table.Th, {})
3660
3648
  ]
3661
3649
  })
3662
3650
  }),
@@ -3677,8 +3665,9 @@ const CompactDictionaryPanel = ({ schemaUrl = '_dictionary/_all' })=>{
3677
3665
  children: info.type
3678
3666
  })
3679
3667
  }),
3680
- /*#__PURE__*/ jsx(Table.Td, {
3668
+ !isCompact && /*#__PURE__*/ jsx(Table.Td, {
3681
3669
  children: info.enum && /*#__PURE__*/ jsx(Scroller, {
3670
+ draggable: true,
3682
3671
  children: /*#__PURE__*/ jsx(Group, {
3683
3672
  gap: "xs",
3684
3673
  wrap: "nowrap",
@@ -3690,6 +3679,7 @@ const CompactDictionaryPanel = ({ schemaUrl = '_dictionary/_all' })=>{
3690
3679
  label: value,
3691
3680
  className: "font-bold text-secondary-contrast",
3692
3681
  color: "accent-light",
3682
+ noTruncate: true,
3693
3683
  children: value
3694
3684
  })
3695
3685
  }, value))
@@ -3805,17 +3795,17 @@ const DataToolsPanel = ({ schemaUrl = DEFAULT_DICTIONARY_SCHEMA_URL, kbUrl })=>{
3805
3795
  });
3806
3796
  };
3807
3797
 
3808
- const ToolsPanel = ({ expanded = true, setExpanded = ()=>{} })=>{
3798
+ const ToolsPanel = ({ expanded = true, setExpanded = ()=>{}, width = 310 })=>{
3809
3799
  return /*#__PURE__*/ jsx(HorizontalAccordion, {
3810
3800
  label: "Data & Tools",
3811
3801
  expanded: expanded,
3812
3802
  setExpanded: setExpanded,
3813
- expandedWidth: 310,
3803
+ expandedWidth: width,
3814
3804
  children: /*#__PURE__*/ jsx(DataToolsPanel, {})
3815
3805
  });
3816
3806
  };
3817
3807
 
3818
- const WorkspaceLayout = ({ children })=>{
3808
+ const WorkspaceLayout = ({ children, tierConfiguration })=>{
3819
3809
  const workspaceTier = useCoreSelector((state)=>selectWorkspaceTier(state));
3820
3810
  const [toolsExpanded, { set: setToolsExpanded }] = useDisclosure(true);
3821
3811
  const [settingsExpanded, { set: setSettingsExpanded }] = useDisclosure(true);
@@ -3825,20 +3815,22 @@ const WorkspaceLayout = ({ children })=>{
3825
3815
  className: "flex flex-col w-full grow",
3826
3816
  children: [
3827
3817
  /*#__PURE__*/ jsx(WorkspaceToolbar, {
3828
- toolbarConfiguration: WORKSPACE_TIER_INFORMATION[workspaceTier].toolbar
3818
+ toolbarConfiguration: tierConfiguration.toolbar
3829
3819
  }),
3830
3820
  /*#__PURE__*/ jsxs("div", {
3831
3821
  className: "flex w-full grow",
3832
3822
  children: [
3833
- WORKSPACE_TIER_INFORMATION[workspaceTier].dataAndTools.enabled && /*#__PURE__*/ jsx(ToolsPanel, {
3823
+ tierConfiguration.dataAndTools.enabled && /*#__PURE__*/ jsx(ToolsPanel, {
3834
3824
  expanded: toolsExpanded && !isFullScreen,
3835
- setExpanded: setToolsExpanded
3825
+ setExpanded: setToolsExpanded,
3826
+ width: tierConfiguration.dataAndTools.width
3836
3827
  }),
3837
3828
  children,
3838
3829
  /*#__PURE__*/ jsx(SettingsPanel, {
3839
- showKernels: WORKSPACE_TIER_INFORMATION[workspaceTier].settings.showKernels,
3830
+ showKernels: tierConfiguration.settings.showKernels,
3840
3831
  expanded: settingsExpanded && !isFullScreen,
3841
- setExpanded: setSettingsExpanded
3832
+ setExpanded: setSettingsExpanded,
3833
+ width: tierConfiguration.settings.width
3842
3834
  })
3843
3835
  ]
3844
3836
  })
@@ -3892,6 +3884,7 @@ const WorkspaceCenter = ({ workspaces, landingPage, tierConfiguration })=>{
3892
3884
  }
3893
3885
  if (workspaceTier === 'free') {
3894
3886
  return /*#__PURE__*/ jsx(WorkspaceLayout, {
3887
+ tierConfiguration: tierConfiguration.free,
3895
3888
  children: /*#__PURE__*/ jsx(FreeWorkspace, {})
3896
3889
  });
3897
3890
  }
@@ -3900,6 +3893,7 @@ const WorkspaceCenter = ({ workspaces, landingPage, tierConfiguration })=>{
3900
3893
  children: /*#__PURE__*/ jsx(MicroContainerReduxProvider, {
3901
3894
  enabled: true,
3902
3895
  children: /*#__PURE__*/ jsx(WorkspaceLayout, {
3896
+ tierConfiguration: tierConfiguration.remote,
3903
3897
  children: /*#__PURE__*/ jsx(RemoteComputeWorkspace, {
3904
3898
  tenantId: authContext?.tenantId || 'default',
3905
3899
  workspaceId: authContext?.workspaceId || 'workspace-default',
@@ -3943,22 +3937,60 @@ const DEFAULT_WORKSPACES_CONFIGURATION = {
3943
3937
  workspaces: {},
3944
3938
  tierConfiguration: {
3945
3939
  free: {
3946
- baseUrl: process.env.FREE_WORKSPACE_ASSETS_BASE_URL ?? '/api/workspace-assets/free'
3940
+ baseUrl: process.env.FREE_WORKSPACE_ASSETS_BASE_URL ?? '/api/workspace-assets/free',
3941
+ toolbar: {
3942
+ label: 'JupyterLite',
3943
+ description: 'Running via JupyterLite',
3944
+ showStop: false,
3945
+ showStatus: false
3946
+ },
3947
+ settings: {
3948
+ showKernels: false
3949
+ },
3950
+ dataAndTools: {
3951
+ enabled: true,
3952
+ tabs: [
3953
+ {
3954
+ label: 'Dictionary',
3955
+ description: 'Data Dictionary',
3956
+ app: 'dictionary'
3957
+ }
3958
+ ],
3959
+ width: 300
3960
+ }
3947
3961
  },
3948
3962
  remote: {
3949
- baseUrl: process.env.REMOTE_COMPUTE_WORKSPACE_ASSETS_BASE_URL ?? '/api/workspace-assets/remote'
3963
+ baseUrl: process.env.REMOTE_COMPUTE_WORKSPACE_ASSETS_BASE_URL ?? '/api/workspace-assets/remote',
3964
+ toolbar: {
3965
+ label: 'Remote Compute Environment',
3966
+ description: 'Running with Remote Kernels',
3967
+ showStop: true,
3968
+ showStatus: true
3969
+ },
3970
+ settings: {
3971
+ showKernels: true
3972
+ },
3973
+ dataAndTools: {
3974
+ enabled: true,
3975
+ tabs: [
3976
+ {
3977
+ label: 'Dictionary',
3978
+ description: 'Data Dictionary',
3979
+ app: 'dictionary'
3980
+ }
3981
+ ]
3982
+ }
3950
3983
  }
3951
3984
  }
3952
3985
  };
3953
3986
  const WorkspacesCenterPageGetServerSideProps = async ()=>{
3954
3987
  try {
3955
3988
  const workspacesCenterConfiguration = await ContentSource.getContentDatabase().get(`${GEN3_COMMONS_NAME}/workspaces.json`);
3989
+ const mergedConfiguration = merge({}, DEFAULT_WORKSPACES_CONFIGURATION, workspacesCenterConfiguration);
3956
3990
  return {
3957
3991
  props: {
3958
3992
  ...await getNavPageLayoutPropsFromConfig(),
3959
- configuration: {
3960
- ...workspacesCenterConfiguration
3961
- }
3993
+ configuration: mergedConfiguration
3962
3994
  }
3963
3995
  };
3964
3996
  } catch (error) {