([]);
diff --git a/extensions/default/src/Toolbar/ToolBoxWrapper.tsx b/extensions/default/src/Toolbar/ToolBoxWrapper.tsx
index d40c9015a..7a292299c 100644
--- a/extensions/default/src/Toolbar/ToolBoxWrapper.tsx
+++ b/extensions/default/src/Toolbar/ToolBoxWrapper.tsx
@@ -1,17 +1,24 @@
import React from 'react';
import classNames from 'classnames';
import { ToolButton } from '@ohif/ui-next';
+import { useToolbar } from '@ohif/core/src/hooks/useToolbar';
/**
* Wraps the ToolButtonList component to handle the OHIF toolbar button structure
* @param props - Component props
* @returns Component
*/
-export function ToolBoxButtonGroupWrapper({ groupId, items, onInteraction, ...props }) {
- if (!items || !groupId) {
+export function ToolBoxButtonGroupWrapper({ groupId, buttonSection, ...props }) {
+ const { onInteraction, toolbarButtons } = useToolbar({
+ buttonSection,
+ });
+
+ if (!groupId) {
return null;
}
+ const items = toolbarButtons.map(button => button.componentProps);
+
return (
{items.map(item => (
@@ -20,16 +27,22 @@ export function ToolBoxButtonGroupWrapper({ groupId, items, onInteraction, ...pr
key={item.id}
size="small"
className={props.disabled && 'text-primary'}
- onInteraction={() =>
- onInteraction?.({ groupId, itemId: item.id, commands: item.commands })
- }
+ onInteraction={event => {
+ onInteraction?.({
+ event,
+ groupId,
+ commands: item.commands,
+ itemId: item.id,
+ item,
+ });
+ }}
/>
))}
);
}
-export function ToolBoxButtonWrapper({ onInteraction, ...props }) {
+export function ToolBoxButtonWrapper({ onInteraction, options, ...props }) {
return (
onInteraction?.({ itemId: props.id, commands: props.commands })}
+ onInteraction={event => {
+ onInteraction?.({
+ event,
+ itemId: props.id,
+ commands: props.commands,
+ options,
+ });
+ }}
/>
);
diff --git a/extensions/default/src/Toolbar/ToolButtonListWrapper.tsx b/extensions/default/src/Toolbar/ToolButtonListWrapper.tsx
index d1477f727..fb995846f 100644
--- a/extensions/default/src/Toolbar/ToolButtonListWrapper.tsx
+++ b/extensions/default/src/Toolbar/ToolButtonListWrapper.tsx
@@ -7,23 +7,11 @@ import {
ToolButtonListItem,
ToolButtonListDivider,
} from '@ohif/ui-next';
-
-interface ButtonItem {
- id: string;
- icon?: string;
- label?: string;
- tooltip?: string;
- isActive?: boolean;
- disabledText?: string;
- commands?: Record;
- disabled?: boolean;
- className?: string;
-}
+import { useToolbar } from '@ohif/core/src';
interface ToolButtonListWrapperProps {
groupId: string;
- primary: ButtonItem;
- items: ButtonItem[];
+ buttonSection: string;
onInteraction?: (details: {
groupId: string;
itemId: string;
@@ -39,10 +27,22 @@ interface ToolButtonListWrapperProps {
*/
export default function ToolButtonListWrapper({
groupId,
- primary,
- items,
- onInteraction,
+ buttonSection,
}: ToolButtonListWrapperProps) {
+ const { onInteraction, toolbarButtons } = useToolbar({
+ buttonSection,
+ });
+
+ if (!toolbarButtons?.length) {
+ return null;
+ }
+
+ const primary =
+ toolbarButtons.find(button => button.componentProps.isActive)?.componentProps ||
+ toolbarButtons[0].componentProps;
+
+ const items = toolbarButtons.map(button => button.componentProps);
+
return (
@@ -63,20 +63,22 @@ export default function ToolButtonListWrapper({
- {items.map(item => (
-
- onInteraction?.({ groupId, itemId: item.id, commands: item.commands })
- }
- >
- {item.label || item.tooltip || item.id}
-
- ))}
+ {items.map(item => {
+ return (
+
+ onInteraction?.({ groupId, itemId: item.id, commands: item.commands })
+ }
+ >
+ {item.label || item.tooltip || item.id}
+
+ );
+ })}
diff --git a/extensions/default/src/Toolbar/ToolbarButtonGroupWithServices.tsx b/extensions/default/src/Toolbar/ToolbarButtonGroupWithServices.tsx
index 300270a14..4b0a79478 100644
--- a/extensions/default/src/Toolbar/ToolbarButtonGroupWithServices.tsx
+++ b/extensions/default/src/Toolbar/ToolbarButtonGroupWithServices.tsx
@@ -19,6 +19,7 @@ function ToolbarButtonGroupWithServices({ groupId, items, onInteraction, size })
groupId,
itemId: item.id,
commands: item.commands,
+ item,
});
}}
// Note: this is necessary since tooltip will add
diff --git a/extensions/default/src/Toolbar/ToolbarSplitButtonWithServices.tsx b/extensions/default/src/Toolbar/ToolbarSplitButtonWithServices.tsx
index ccd3870ea..392df4a27 100644
--- a/extensions/default/src/Toolbar/ToolbarSplitButtonWithServices.tsx
+++ b/extensions/default/src/Toolbar/ToolbarSplitButtonWithServices.tsx
@@ -23,7 +23,7 @@ function ToolbarSplitButtonWithServices({
onInteraction({
groupId,
itemId: item.id,
- commands: item.commands,
+ item,
});
},
})),
diff --git a/extensions/default/src/ViewerLayout/ResizablePanelsHook.tsx b/extensions/default/src/ViewerLayout/ResizablePanelsHook.tsx
index 60dad54eb..463212e8d 100644
--- a/extensions/default/src/ViewerLayout/ResizablePanelsHook.tsx
+++ b/extensions/default/src/ViewerLayout/ResizablePanelsHook.tsx
@@ -16,6 +16,10 @@ import { panelGroupDefinition } from './constants/panels';
* @param width the max and min width to set on the element
*/
const setMinMaxWidth = (elem, width?) => {
+ if (!elem) {
+ return;
+ }
+
elem.style.minWidth = width === undefined ? '' : `${width}px`;
elem.style.maxWidth = elem.style.minWidth;
};
diff --git a/extensions/default/src/customizations/reportDialogCustomization.tsx b/extensions/default/src/customizations/reportDialogCustomization.tsx
index df0df017b..9ebbd59f4 100644
--- a/extensions/default/src/customizations/reportDialogCustomization.tsx
+++ b/extensions/default/src/customizations/reportDialogCustomization.tsx
@@ -20,7 +20,9 @@ function ReportDialog({ dataSources, hide, onSave, onCancel }: ReportDialogProps
dataSources?.[0]?.value ?? null
);
- const handleSave = (reportName: string) => {
+ const [reportName, setReportName] = useState('');
+
+ const handleSave = () => {
onSave({
reportName,
dataSource: selectedDataSource,
@@ -62,7 +64,11 @@ function ReportDialog({ dataSources, hide, onSave, onCancel }: ReportDialogProps
)}
-
+
diff --git a/extensions/default/src/getToolbarModule.tsx b/extensions/default/src/getToolbarModule.tsx
index 92ada7ef5..e0aaf6e41 100644
--- a/extensions/default/src/getToolbarModule.tsx
+++ b/extensions/default/src/getToolbarModule.tsx
@@ -60,27 +60,6 @@ export default function getToolbarModule({ commandsManager, servicesManager }: w
name: 'ohif.progressDropdown',
defaultComponent: ProgressDropdownWithService,
},
- {
- name: 'evaluate.group.promoteToPrimary',
- evaluate: ({ viewportId, button, itemId }) => {
- const { items } = button.props;
-
- if (!itemId) {
- return {
- primary: button.props.primary,
- items,
- };
- }
-
- // other wise we can move the clicked tool to the primary button
- const clickedItemProps = items.find(item => item.id === itemId || item.itemId === itemId);
-
- return {
- primary: clickedItemProps,
- items,
- };
- },
- },
{
name: 'evaluate.cine',
evaluate: () => {
diff --git a/extensions/default/src/index.ts b/extensions/default/src/index.ts
index 91f92eb55..f11d3d237 100644
--- a/extensions/default/src/index.ts
+++ b/extensions/default/src/index.ts
@@ -34,6 +34,7 @@ import promptLabelAnnotation from './utils/promptLabelAnnotation';
import usePatientInfo from './hooks/usePatientInfo';
import { PanelStudyBrowserHeader } from './Panels/StudyBrowser/PanelStudyBrowserHeader';
import * as utils from './utils';
+import { Toolbox } from './utils';
import MoreDropdownMenu from './Components/MoreDropdownMenu';
import requestDisplaySetCreationForStudy from './Panels/requestDisplaySetCreationForStudy';
const defaultExtension: Types.Extensions.Extension = {
@@ -97,6 +98,7 @@ export {
usePatientInfo,
PanelStudyBrowserHeader,
utils,
+ Toolbox,
MoreDropdownMenu,
requestDisplaySetCreationForStudy,
callInputDialog,
diff --git a/extensions/default/src/utils/Toolbox.tsx b/extensions/default/src/utils/Toolbox.tsx
new file mode 100644
index 000000000..404c1ca7e
--- /dev/null
+++ b/extensions/default/src/utils/Toolbox.tsx
@@ -0,0 +1,122 @@
+import React from 'react';
+import { PanelSection, ToolSettings } from '@ohif/ui-next';
+import { useSystem, useToolbar } from '@ohif/core';
+import classnames from 'classnames';
+
+interface ButtonProps {
+ isActive?: boolean;
+ options?: unknown;
+}
+
+/**
+ * A toolbox is a collection of buttons and commands that they invoke, used to provide
+ * custom control panels to users. This component is a generic UI component that
+ * interacts with services and commands in a generic fashion. While it might
+ * seem unconventional to import it from the UI and integrate it into the JSX,
+ * it belongs in the UI components as there isn't anything in this component that
+ * couldn't be used for a completely different type of app. It plays a crucial
+ * role in enhancing the app with a toolbox by providing a way to integrate
+ * and display various tools and their corresponding options
+ */
+export function Toolbox({ buttonSectionId, title }: { buttonSectionId: string; title: string }) {
+ const { servicesManager } = useSystem();
+ const { toolbarService } = servicesManager.services;
+
+ const { toolbarButtons: toolboxSections, onInteraction } = useToolbar({
+ servicesManager,
+ buttonSection: buttonSectionId,
+ });
+
+ if (!toolboxSections.length) {
+ return null;
+ }
+
+ // Ensure we have proper button sections at the top level.
+ if (!toolboxSections.every(section => section.componentProps.buttonSection)) {
+ throw new Error(
+ 'Toolbox accepts only button sections at the top level, not buttons. Create at least one button section.'
+ );
+ }
+
+ // Helper to check a list of buttons for an active tool.
+ const findActiveOptions = (buttons: any[]): unknown => {
+ for (const tool of buttons) {
+ if (tool.componentProps.isActive) {
+ return tool.componentProps.options;
+ }
+ if (tool.componentProps.buttonSection) {
+ const nestedButtons = toolbarService.getButtonPropsInButtonSection(
+ tool.componentProps.buttonSection
+ ) as ButtonProps[];
+ const activeNested = nestedButtons.find(nested => nested.isActive);
+ if (activeNested) {
+ return activeNested.options;
+ }
+ }
+ }
+ return null;
+ };
+
+ // Look for active tool options across all sections.
+ const activeToolOptions = toolboxSections.reduce((activeOptions, section) => {
+ if (activeOptions) {
+ return activeOptions;
+ }
+ const sectionId = section.componentProps.buttonSection;
+ const buttons = toolbarService.getButtonSection(sectionId);
+ return findActiveOptions(buttons);
+ }, null);
+
+ // Define the interaction handler once.
+ const handleInteraction = ({ itemId }: { itemId: string }) => {
+ onInteraction?.({ itemId });
+ };
+
+ return (
+
+
+ {title}
+
+
+ {toolboxSections.map(section => {
+ const sectionId = section.componentProps.buttonSection;
+ const buttons = toolbarService.getButtonSection(sectionId) as any[];
+
+ return (
+
+ {buttons.map(tool => {
+ if (!tool) {
+ return null;
+ }
+ const { id, Component, componentProps } = tool;
+
+ return (
+
+
+
+ );
+ })}
+
+ );
+ })}
+ {activeToolOptions && (
+
+
+
+ )}
+
+
+ );
+}
diff --git a/extensions/default/src/utils/callInputDialog.tsx b/extensions/default/src/utils/callInputDialog.tsx
index 34b4bb177..10efb96a0 100644
--- a/extensions/default/src/utils/callInputDialog.tsx
+++ b/extensions/default/src/utils/callInputDialog.tsx
@@ -57,6 +57,10 @@ export async function callInputDialog({
submitOnEnter = true,
}: {
uiDialogService: AppTypes.UIDialogService;
+ defaultValue?: string;
+ title?: string;
+ placeholder?: string;
+ submitOnEnter?: boolean;
}) {
const dialogId = 'dialog-enter-annotation';
diff --git a/extensions/default/src/utils/index.ts b/extensions/default/src/utils/index.ts
index 81118c67f..edf2485e0 100644
--- a/extensions/default/src/utils/index.ts
+++ b/extensions/default/src/utils/index.ts
@@ -1 +1,2 @@
export { addIcon } from './addIcon';
+export * from './Toolbox';
diff --git a/extensions/measurement-tracking/package.json b/extensions/measurement-tracking/package.json
index 66e1be0a4..0022c432d 100644
--- a/extensions/measurement-tracking/package.json
+++ b/extensions/measurement-tracking/package.json
@@ -32,8 +32,8 @@
"start": "yarn run dev"
},
"peerDependencies": {
- "@cornerstonejs/core": "^3.0.1",
- "@cornerstonejs/tools": "^3.0.1",
+ "@cornerstonejs/core": "^3.0.4",
+ "@cornerstonejs/tools": "^3.0.4",
"@ohif/core": "3.10.0-beta.116",
"@ohif/extension-cornerstone-dicom-sr": "3.10.0-beta.116",
"@ohif/extension-default": "3.10.0-beta.116",
diff --git a/extensions/tmtv/src/Panels/RectangleROIOptions.tsx b/extensions/tmtv/src/Panels/RectangleROIOptions.tsx
index 19101ba06..d6ebf7490 100644
--- a/extensions/tmtv/src/Panels/RectangleROIOptions.tsx
+++ b/extensions/tmtv/src/Panels/RectangleROIOptions.tsx
@@ -1,9 +1,11 @@
-import React, { useState, useCallback, useReducer, useEffect } from 'react';
+import React, { useCallback, useReducer } from 'react';
import { Button } from '@ohif/ui';
import ROIThresholdConfiguration, {
ROI_STAT,
} from './PanelROIThresholdSegmentation/ROIThresholdConfiguration';
import * as cs3dTools from '@cornerstonejs/tools';
+import { useSystem } from '@ohif/core';
+import { useSegmentations } from '@ohif/extension-cornerstone';
const LOWER_CT_THRESHOLD_DEFAULT = -1024;
const UPPER_CT_THRESHOLD_DEFAULT = 1024;
@@ -40,9 +42,10 @@ function reducer(state, action) {
}
}
-function RectangleROIOptions({ servicesManager, commandsManager }: withAppTypes) {
- const { segmentationService } = servicesManager.services;
- const [selectedSegmentationId, setSelectedSegmentationId] = useState(null);
+function RectangleROIOptions() {
+ const { commandsManager } = useSystem();
+ const segmentations = useSegmentations();
+ const activeSegmentation = segmentations[0];
const runCommand = useCallback(
(commandName, commandOptions = {}) => {
@@ -61,58 +64,20 @@ function RectangleROIOptions({ servicesManager, commandsManager }: withAppTypes)
});
const handleROIThresholding = useCallback(() => {
- const segmentationId = selectedSegmentationId;
+ if (!activeSegmentation) {
+ return;
+ }
+
+ const segmentationId = activeSegmentation.segmentationId;
const activeSegmentIndex =
cs3dTools.segmentation.segmentIndex.getActiveSegmentIndex(segmentationId);
- // run the threshold based on the active segment index
- // Todo: later find a way to associate each rectangle with a segment (e.g., maybe with color?)
runCommand('thresholdSegmentationByRectangleROITool', {
segmentationId,
config,
segmentIndex: activeSegmentIndex,
});
- }, [selectedSegmentationId, config]);
-
- useEffect(() => {
- const segmentations = segmentationService.getSegmentationRepresentations();
-
- if (!segmentations.length) {
- return;
- }
-
- const isActive = segmentations.find(seg => seg.isActive);
- setSelectedSegmentationId(isActive.id);
- }, []);
-
- /**
- * Update UI based on segmentation changes (added, removed, updated)
- */
- useEffect(() => {
- // ~~ Subscription
- const updated = segmentationService.EVENTS.SEGMENTATION_MODIFIED;
- const subscriptions = [];
-
- [updated].forEach(evt => {
- const { unsubscribe } = segmentationService.subscribe(evt, () => {
- const segmentations = segmentationService.getSegmentationRepresentations();
-
- if (!segmentations.length) {
- return;
- }
-
- const isActive = segmentations.find(seg => seg.isActive);
- setSelectedSegmentationId(isActive.id);
- });
- subscriptions.push(unsubscribe);
- });
-
- return () => {
- subscriptions.forEach(unsub => {
- unsub();
- });
- };
- }, []);
+ }, [activeSegmentation, config]);
return (
@@ -121,7 +86,7 @@ function RectangleROIOptions({ servicesManager, commandsManager }: withAppTypes)
dispatch={dispatch}
runCommand={runCommand}
/>
- {selectedSegmentationId !== null && (
+ {activeSegmentation && (
diff --git a/platform/ui-next/src/components/OHIFToolbox/index.ts b/platform/ui-next/src/components/OHIFToolbox/index.ts
index e5c0d5de7..8b54506bb 100644
--- a/platform/ui-next/src/components/OHIFToolbox/index.ts
+++ b/platform/ui-next/src/components/OHIFToolbox/index.ts
@@ -1,3 +1 @@
-import { ToolboxUI } from './ToolboxUI';
-import Toolbox from './Toolbox';
-export { ToolboxUI, Toolbox };
+export * from './ToolboxUI';
diff --git a/platform/ui-next/src/components/StudyItem/StudyItem.tsx b/platform/ui-next/src/components/StudyItem/StudyItem.tsx
index 20c748be3..7b3bb9167 100644
--- a/platform/ui-next/src/components/StudyItem/StudyItem.tsx
+++ b/platform/ui-next/src/components/StudyItem/StudyItem.tsx
@@ -41,7 +41,10 @@ const StudyItem = ({
{date}
-
+
{date}
@@ -49,7 +52,10 @@ const StudyItem = ({
{description}
-
+
{description}
diff --git a/platform/ui-next/src/components/ToolButton/ToolButton.tsx b/platform/ui-next/src/components/ToolButton/ToolButton.tsx
index 7d530d52f..e7002701f 100644
--- a/platform/ui-next/src/components/ToolButton/ToolButton.tsx
+++ b/platform/ui-next/src/components/ToolButton/ToolButton.tsx
@@ -50,7 +50,7 @@ function ToolButton(props: ToolButtonProps) {
className,
} = props;
- const { buttonSizeClass, iconSizeClass } = sizeClasses[size];
+ const { buttonSizeClass, iconSizeClass } = sizeClasses[size] || sizeClasses.default;
const buttonClasses = cn(
baseClasses,
diff --git a/platform/ui-next/src/components/index.ts b/platform/ui-next/src/components/index.ts
index 78ef6800d..be9145409 100644
--- a/platform/ui-next/src/components/index.ts
+++ b/platform/ui-next/src/components/index.ts
@@ -52,7 +52,7 @@ import { ThumbnailList } from './ThumbnailList';
import { PanelSection } from './PanelSection';
import { DisplaySetMessageListTooltip } from './DisplaySetMessageListTooltip';
import { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from './Tooltip';
-import { ToolboxUI, Toolbox } from './OHIFToolbox';
+import { ToolboxUI } from './OHIFToolbox';
import Numeric from './Numeric';
import { InputDialog, PresetDialog } from './OHIFDialogs';
import { AboutModal, ImageModal, UserPreferencesModal } from './OHIFModals';
@@ -105,6 +105,7 @@ import {
ToolButtonListItem,
ToolButtonListDivider,
} from './ToolButton';
+import { ToolSettings } from './OHIFToolSettings';
export {
Numeric,
@@ -173,7 +174,6 @@ export {
PanelSection,
DisplaySetMessageListTooltip,
ToolboxUI,
- Toolbox,
DropdownMenu,
DropdownMenuTrigger,
DropdownMenuContent,
@@ -236,4 +236,5 @@ export {
ImageModal,
UserPreferencesModal,
FooterAction,
+ ToolSettings,
};
diff --git a/platform/ui-next/src/contextProviders/ToolboxContext.tsx b/platform/ui-next/src/contextProviders/ToolboxContext.tsx
deleted file mode 100644
index 23c87f80f..000000000
--- a/platform/ui-next/src/contextProviders/ToolboxContext.tsx
+++ /dev/null
@@ -1,109 +0,0 @@
-import React, { createContext, useContext, useReducer } from 'react';
-
-export const initialState = {};
-
-export const toolboxReducer = (state, action) => {
- const { toolbarSectionId } = action.payload;
-
- if (!state[toolbarSectionId]) {
- state[toolbarSectionId] = { activeTool: null, toolOptions: {}, selectedEvent: false };
- }
-
- switch (action.type) {
- case 'SET_ACTIVE_TOOL':
- return {
- ...state,
- [toolbarSectionId]: {
- ...state[toolbarSectionId],
- activeTool: action.payload.activeTool,
- selectedEvent: true,
- },
- };
- case 'UPDATE_TOOL_OPTION':
- const { toolName, optionName, value } = action.payload;
- return {
- ...state,
- [toolbarSectionId]: {
- ...state[toolbarSectionId],
- selectedEvent: false,
- toolOptions: {
- ...state[toolbarSectionId].toolOptions,
- [toolName]: state[toolbarSectionId].toolOptions[toolName].map(option =>
- option.id === optionName ? { ...option, value } : option
- ),
- },
- },
- };
- case 'INITIALIZE_TOOL_OPTIONS':
- // Initialize tool options for each toolbarSectionId
- return {
- ...state,
- selectedEvent: false,
- [action.toolbarSectionId]: {
- ...state[action.toolbarSectionId],
- toolOptions: action.payload,
- },
- };
- default:
- return state;
- }
-};
-
-const ToolboxContext = createContext();
-
-export const ToolboxProvider = ({ children }) => {
- const [state, dispatch] = useReducer(toolboxReducer, initialState);
-
- const handleToolSelect = (toolbarSectionId, toolName) => {
- dispatch({
- type: 'SET_ACTIVE_TOOL',
- payload: { toolbarSectionId, activeTool: toolName },
- });
- };
-
- const handleToolOptionChange = (toolbarSectionId, toolName, optionName, newValue) => {
- dispatch({
- type: 'UPDATE_TOOL_OPTION',
- payload: { toolbarSectionId, toolName, optionName, value: newValue },
- });
- };
-
- const initializeToolOptions = (toolbarSectionId, toolOptions) => {
- dispatch({
- type: 'INITIALIZE_TOOL_OPTIONS',
- toolbarSectionId,
- payload: toolOptions,
- });
- };
-
- const api = { handleToolSelect, handleToolOptionChange, initializeToolOptions };
-
- const value = { state, api };
-
- return {children};
-};
-
-/**
- * Custom hook for accessing toolbox state and actions for a specific toolbar section.
- * You can use this hook to access the state and actions for a specific toolbar section (
- * defined by the toolbarSectionId) in your custom toolbar components. This hook
- * helps to manage the state and actions for the tools and their options in the toolbar.
- */
-export const useToolbox = toolbarSectionId => {
- const context = useContext(ToolboxContext);
- if (context === undefined) {
- throw new Error('useToolbox must be used within a ToolboxProvider');
- }
- const { state, api } = context;
-
- return {
- state: state[toolbarSectionId] || { activeTool: null, toolOptions: {} },
- api: {
- handleToolSelect: toolName => api.handleToolSelect(toolbarSectionId, toolName),
- handleToolOptionChange: (toolName, optionName, value) =>
- api.handleToolOptionChange(toolbarSectionId, toolName, optionName, value),
- initializeToolOptions: toolOptions =>
- api.initializeToolOptions(toolbarSectionId, toolOptions),
- },
- };
-};
diff --git a/platform/ui-next/src/contextProviders/index.ts b/platform/ui-next/src/contextProviders/index.ts
index 91181d26b..61140c085 100644
--- a/platform/ui-next/src/contextProviders/index.ts
+++ b/platform/ui-next/src/contextProviders/index.ts
@@ -1,13 +1,11 @@
import NotificationProvider, { useNotification } from './NotificationProvider';
import { ViewportGridContext, ViewportGridProvider, useViewportGrid } from './ViewportGridProvider';
-import { ToolboxProvider, useToolbox } from './ToolboxContext';
import { ModalProvider, useModal } from './ModalProvider';
import { DialogProvider, useDialog } from './DialogProvider';
import ManagedDialog from './ManagedDialog';
export { useNotification, NotificationProvider };
export { ViewportGridContext, ViewportGridProvider, useViewportGrid };
-export { ToolboxProvider, useToolbox };
export { ModalProvider, useModal };
export { DialogProvider, useDialog };
export { ManagedDialog };
diff --git a/platform/ui-next/src/index.ts b/platform/ui-next/src/index.ts
index e492e5cbd..f4869cfaa 100644
--- a/platform/ui-next/src/index.ts
+++ b/platform/ui-next/src/index.ts
@@ -33,6 +33,7 @@ import {
PanelSection,
DisplaySetMessageListTooltip,
ToolboxUI,
+ ToolSettings,
DoubleSlider,
Label,
Slider,
@@ -98,7 +99,6 @@ import {
ToolButtonListDropDown,
ToolButtonListItem,
ToolButtonListDivider,
- Toolbox,
Numeric,
InputDialog,
PresetDialog,
@@ -113,8 +113,6 @@ import { DataRow } from './components/DataRow';
import {
useNotification,
NotificationProvider,
- useToolbox,
- ToolboxProvider,
useModal,
ModalProvider,
DialogProvider,
@@ -232,9 +230,6 @@ export {
ToolButtonListDropDown,
ToolButtonListItem,
ToolButtonListDivider,
- ToolboxProvider,
- Toolbox,
- useToolbox,
utils,
Numeric,
AboutModal,
@@ -249,4 +244,5 @@ export {
DialogProvider,
useDialog,
ManagedDialog,
+ ToolSettings,
};
diff --git a/tests/Reset.spec.ts b/tests/Reset.spec.ts
index 0c6b6ae63..23360def7 100644
--- a/tests/Reset.spec.ts
+++ b/tests/Reset.spec.ts
@@ -13,6 +13,6 @@ test('should reset the image to its original state', async ({ page }) => {
await page.getByTestId('MoreTools-split-button-secondary').click();
await page.getByTestId('invert').click();
await page.getByTestId('MoreTools-split-button-secondary').click();
- await page.getByTestId('Reset').click();
+ await page.getByText('Reset View').click();
await checkForScreenshot(page, page, screenShotPaths.reset.resetDisplayedCorrectly);
});
diff --git a/yarn.lock b/yarn.lock
index 3de185ea2..f3d0bebe3 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1393,10 +1393,10 @@
resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9"
integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==
-"@cornerstonejs/adapters@^3.0.1":
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-3.0.1.tgz#596e302d7155ee64b7c20bcfedc57ce6ca10d5fb"
- integrity sha512-Ym6s4cTpMkojap5QZ8MXZ8hDbs2TMMN/ypqU7wKMwAY2LGoltoeGw0Z/7LL+iostbaSw3fVs+TZzJSKhKw8Bug==
+"@cornerstonejs/adapters@^3.0.4":
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-3.0.4.tgz#3aea5f65e95fbb067885eb51ebcae2cacd673465"
+ integrity sha512-TJtW0biDf0wgi+XxQFqvKXT/Cf8ueyUruohH9n/RJsWiyE8z1/LOBxOqCZNkToGGs1EbO51T/PMPIUWordW43w==
dependencies:
"@babel/runtime-corejs2" "^7.17.8"
buffer "^6.0.3"
@@ -1429,19 +1429,19 @@
resolved "https://registry.yarnpkg.com/@cornerstonejs/codec-openjph/-/codec-openjph-2.4.5.tgz#8690b61a86fa53ef38a70eee9d665a79229517c0"
integrity sha512-MZCUy8VG0VG5Nl1l58+g+kH3LujAzLYTfJqkwpWI2gjSrGXnP6lgwyy4GmPRZWVoS40/B1LDNALK905cNWm+sg==
-"@cornerstonejs/core@^3.0.1":
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-3.0.1.tgz#8a938013c148d752d2c4f4eba7bd63048a6c814a"
- integrity sha512-K+cOoN/TzJIPRRoaWWNkhJ+2CdkBBX8BA64DG0aBVOthlwJPRqK2YQE6PTTVRx18mjMA4to/m3de0emFNKrTzQ==
+"@cornerstonejs/core@^3.0.4":
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-3.0.4.tgz#a75e0e86cc3ac4cd19355c30f8f531ebe279ae36"
+ integrity sha512-6rMiqhBjyz3wsalPOAFjThfPUJnWVOs7Xqe3xLFvqd1qIFW1q42bqlQ7ak2DRMUMtC1nLURk6YIMhkWxK+t+7A==
dependencies:
"@kitware/vtk.js" "32.9.0"
comlink "^4.4.1"
gl-matrix "^3.4.3"
-"@cornerstonejs/dicom-image-loader@^3.0.1":
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-3.0.1.tgz#e18f716620ab176d88c25b9efd25fc0983bce180"
- integrity sha512-t4bI6rVOt4J8YOHRR9Mh9ClInajc98qqI6fwsByiXmtc2Y4INrZ1uaRspFnOJBosbr+EwsJBV7iT2yt6Jk6CjA==
+"@cornerstonejs/dicom-image-loader@^3.0.4":
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-3.0.4.tgz#0c553e1b01fc90d956d216d72686f6dcda9400f7"
+ integrity sha512-w0NoutE7+/C2FeT1YHo0cnMJpZ17ARH0qwyGwWockFwuJkUVjRcU5ZW1sT0ABNOPUHqZse/K/YmH2IX+ppaScQ==
dependencies:
"@cornerstonejs/codec-charls" "^1.2.3"
"@cornerstonejs/codec-libjpeg-turbo-8bit" "^1.2.2"
@@ -1459,10 +1459,10 @@
dependencies:
"@icr/polyseg-wasm" "0.4.0"
-"@cornerstonejs/tools@^3.0.1":
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-3.0.1.tgz#4d707992283235d79532f35e60e8c763b174ccef"
- integrity sha512-fRjoXJ46mdpYc5JZ/FUn0g1vCK4LohnNjgZl+O72HK2reMdc5/dQeCueJCT+tBMay04sJMUHm0tAke2DN10FBQ==
+"@cornerstonejs/tools@^3.0.4":
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-3.0.4.tgz#413031f55dd7aca30168bfd13fe52911ba81f795"
+ integrity sha512-gkenXhOS6lYYmQhKDwayojeObTU/KiG9k+JEC/hoOBhRdoFZljyXfQtnljKFHL+G9rkdbNKxXq/a3+C9Bn7EVg==
dependencies:
"@types/offscreencanvas" "2019.7.3"
comlink "^4.4.1"
@@ -1574,10 +1574,10 @@
resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz#2cbcf822bf3764c9658c4d2e568bd0c0cb748016"
integrity sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==
-"@cypress/request@^3.0.6":
- version "3.0.7"
- resolved "https://registry.yarnpkg.com/@cypress/request/-/request-3.0.7.tgz#6a74a4da98d9e5ae9121d6e2d9c14780c9b5cf1a"
- integrity sha512-LzxlLEMbBOPYB85uXrDqvD4MgcenjRBLIns3zyhx7vTPj/0u2eQhzXvPiGcaJrV38Q9dbkExWp6cOHPJ+EtFYg==
+"@cypress/request@^3.0.7":
+ version "3.0.8"
+ resolved "https://registry.yarnpkg.com/@cypress/request/-/request-3.0.8.tgz#992f1f42ba03ebb14fa5d97290abe9d015ed0815"
+ integrity sha512-h0NFgh1mJmm1nr4jCwkGHwKneVYKghUyWe6TMNrk0B9zsjAJxpg8C4/+BAcmLgCPa1vj1V8rNUaILl+zYRUWBQ==
dependencies:
aws-sign2 "~0.7.0"
aws4 "^1.8.0"
@@ -1592,7 +1592,7 @@
json-stringify-safe "~5.0.1"
mime-types "~2.1.19"
performance-now "^2.1.0"
- qs "6.13.1"
+ qs "6.14.0"
safe-buffer "^5.1.2"
tough-cookie "^5.0.0"
tunnel-agent "^0.6.0"
@@ -7322,6 +7322,14 @@ cachedir@^2.3.0:
resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.4.0.tgz#7fef9cf7367233d7c88068fe6e34ed0d355a610d"
integrity sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==
+call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6"
+ integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==
+ dependencies:
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+
call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9"
@@ -7333,6 +7341,14 @@ call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bin
get-intrinsic "^1.2.4"
set-function-length "^1.2.1"
+call-bound@^1.0.2:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a"
+ integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==
+ dependencies:
+ call-bind-apply-helpers "^1.0.2"
+ get-intrinsic "^1.3.0"
+
caller-callsite@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134"
@@ -7571,7 +7587,7 @@ ci-info@^3.2.0, ci-info@^3.6.1:
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4"
integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==
-ci-info@^4.0.0:
+ci-info@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.1.0.tgz#92319d2fa29d2620180ea5afed31f589bc98cf83"
integrity sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==
@@ -8513,12 +8529,12 @@ cypress-file-upload@^5.0.8:
resolved "https://registry.yarnpkg.com/cypress-file-upload/-/cypress-file-upload-5.0.8.tgz#d8824cbeaab798e44be8009769f9a6c9daa1b4a1"
integrity sha512-+8VzNabRk3zG6x8f8BWArF/xA/W0VK4IZNx3MV0jFWrJS/qKn8eHfa5nU73P9fOQAgwHFJx7zjg4lwOnljMO8g==
-cypress@^14.0.0:
- version "14.0.0"
- resolved "https://registry.yarnpkg.com/cypress/-/cypress-14.0.0.tgz#a71cb0a243a0bfeb97b6973ab9c5291ca5288e93"
- integrity sha512-kEGqQr23so5IpKeg/dp6GVi7RlHx1NmW66o2a2Q4wk9gRaAblLZQSiZJuDI8UMC4LlG5OJ7Q6joAiqTrfRNbTw==
+cypress@^14.1.0:
+ version "14.1.0"
+ resolved "https://registry.yarnpkg.com/cypress/-/cypress-14.1.0.tgz#b2dbe7bbc529dc0c93ffd4e0e9fa59763afba0b8"
+ integrity sha512-pPPj8Uu9NwjaaiXAEcjYZZmgsq6v9Zs1Nw6a+zRF+ANgYSNhH4S32SjFRsvMcuOHR/8dp4GBJhBPqIPSs+TxaA==
dependencies:
- "@cypress/request" "^3.0.6"
+ "@cypress/request" "^3.0.7"
"@cypress/xvfb" "^1.2.4"
"@types/sinonjs__fake-timers" "8.1.1"
"@types/sizzle" "^2.3.2"
@@ -8529,7 +8545,7 @@ cypress@^14.0.0:
cachedir "^2.3.0"
chalk "^4.1.0"
check-more-types "^2.24.0"
- ci-info "^4.0.0"
+ ci-info "^4.1.0"
cli-cursor "^3.1.0"
cli-table3 "~0.6.1"
commander "^6.2.1"
@@ -9507,6 +9523,15 @@ dotenv@~16.3.1:
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.2.tgz#3cb611ce5a63002dbabf7c281bc331f69d28f03f"
integrity sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ==
+dunder-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a"
+ integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==
+ dependencies:
+ call-bind-apply-helpers "^1.0.1"
+ es-errors "^1.3.0"
+ gopd "^1.2.0"
+
duplexer@^0.1.1, duplexer@^0.1.2, duplexer@~0.1.1:
version "0.1.2"
resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6"
@@ -9762,6 +9787,11 @@ es-define-property@^1.0.0:
dependencies:
get-intrinsic "^1.2.4"
+es-define-property@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa"
+ integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==
+
es-errors@^1.2.1, es-errors@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
@@ -9814,6 +9844,13 @@ es-object-atoms@^1.0.0:
dependencies:
es-errors "^1.3.0"
+es-object-atoms@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1"
+ integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==
+ dependencies:
+ es-errors "^1.3.0"
+
es-set-tostringtag@^2.0.1, es-set-tostringtag@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777"
@@ -11103,6 +11140,22 @@ get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@
has-symbols "^1.0.3"
hasown "^2.0.0"
+get-intrinsic@^1.2.5, get-intrinsic@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01"
+ integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==
+ dependencies:
+ call-bind-apply-helpers "^1.0.2"
+ es-define-property "^1.0.1"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.1.1"
+ function-bind "^1.1.2"
+ get-proto "^1.0.1"
+ gopd "^1.2.0"
+ has-symbols "^1.1.0"
+ hasown "^2.0.2"
+ math-intrinsics "^1.1.0"
+
get-nonce@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3"
@@ -11138,6 +11191,14 @@ get-port@5.1.1, get-port@^5.1.1:
resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193"
integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==
+get-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1"
+ integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==
+ dependencies:
+ dunder-proto "^1.0.1"
+ es-object-atoms "^1.0.0"
+
get-stdin@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-7.0.0.tgz#8d5de98f15171a125c5e516643c7a6d0ea8a96f6"
@@ -11451,6 +11512,11 @@ gopd@^1.0.1:
dependencies:
get-intrinsic "^1.1.3"
+gopd@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1"
+ integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==
+
got@^12.1.0:
version "12.6.1"
resolved "https://registry.yarnpkg.com/got/-/got-12.6.1.tgz#8869560d1383353204b5a9435f782df9c091f549"
@@ -11581,6 +11647,11 @@ has-symbols@^1.0.2, has-symbols@^1.0.3:
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+has-symbols@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338"
+ integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==
+
has-tostringtag@^1.0.0, has-tostringtag@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc"
@@ -14289,6 +14360,11 @@ material-colors@^1.2.1:
resolved "https://registry.yarnpkg.com/material-colors/-/material-colors-1.2.6.tgz#6d1958871126992ceecc72f4bcc4d8f010865f46"
integrity sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==
+math-intrinsics@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9"
+ integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==
+
mathjs@^11.2:
version "11.12.0"
resolved "https://registry.yarnpkg.com/mathjs/-/mathjs-11.12.0.tgz#e933e5941930d44763ddfc5bfb08b90059449b2c"
@@ -15651,6 +15727,11 @@ object-inspect@^1.13.1:
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff"
integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==
+object-inspect@^1.13.3:
+ version "1.13.4"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213"
+ integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==
+
object-is@^1.1.2, object-is@^1.1.5:
version "1.1.6"
resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07"
@@ -17353,12 +17434,12 @@ qs@6.13.0, qs@^6.10.0, qs@^6.12.3:
dependencies:
side-channel "^1.0.6"
-qs@6.13.1:
- version "6.13.1"
- resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.1.tgz#3ce5fc72bd3a8171b85c99b93c65dd20b7d1b16e"
- integrity sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==
+qs@6.14.0:
+ version "6.14.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930"
+ integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==
dependencies:
- side-channel "^1.0.6"
+ side-channel "^1.1.0"
query-string@^4.1.0:
version "4.3.4"
@@ -18790,6 +18871,35 @@ shx@^0.3.3:
minimist "^1.2.3"
shelljs "^0.8.5"
+side-channel-list@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad"
+ integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==
+ dependencies:
+ es-errors "^1.3.0"
+ object-inspect "^1.13.3"
+
+side-channel-map@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42"
+ integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==
+ dependencies:
+ call-bound "^1.0.2"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.5"
+ object-inspect "^1.13.3"
+
+side-channel-weakmap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea"
+ integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==
+ dependencies:
+ call-bound "^1.0.2"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.5"
+ object-inspect "^1.13.3"
+ side-channel-map "^1.0.1"
+
side-channel@^1.0.4, side-channel@^1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2"
@@ -18800,6 +18910,17 @@ side-channel@^1.0.4, side-channel@^1.0.6:
get-intrinsic "^1.2.4"
object-inspect "^1.13.1"
+side-channel@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9"
+ integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==
+ dependencies:
+ es-errors "^1.3.0"
+ object-inspect "^1.13.3"
+ side-channel-list "^1.0.0"
+ side-channel-map "^1.0.1"
+ side-channel-weakmap "^1.0.2"
+
signal-exit@3.0.7, signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7:
version "3.0.7"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"