* Fix ExtensionManager bug and add test to bandaid * Add tools configuration to extension manager preinit * Fix reducing of configs * Merge internal with external configs * Merge internal with external configs * Remove dialog from init in measurementstable * Testing injected configuration * New way to set config * Add new prop to dialog provider to allow disabling last position * Remove code from preinit in cornerstone * Add new prop to dialog provider to allow disabling last position * Add centralize to dialogs * Reorder dialogs when adding them * Fix draggable styles (cursor) * Remove repositioning methods from labelling flow and remove overlay from labelling manager * Fix empty array being set in bringToFront * Add new command to update table and pass commands manager to modules/preinit hook * Ad UIContextMenu service / factory * Use new contextmenu service in measurementspanel extension * Use dialogs for arrow annotate in default * Remove positioning funcionality from tool context menu * Add context menu service * Pass commandsModule to extension * Update edit description dialog and simple dialog to position relative * Remove style code from labelling flow and manager * Remove eventdata from labelling * Remove labelling code from measurement init * Add commandsmanager to provider * Update contextmenu provider and service * Add touchstart and mouseclick to hide contextmenu * Hide labelling if click/touch * Remove labelling and context menu dead code * Fix undefined bug if ViewerMain grid has no children * Fix broken prop on context menu * Update commandsmodule based on master * Fix broken configuration * Update script tag config * Remove cornerstone from toolcontextmenu * Remove cornerstone from toolcontextmenu * Split labelling and context menu providers * Split labelling and context menu providers * Update test * Destructure extensions into new array * CR Update: Move default arrow config to cornerstone instead of default * CR Update: Fix app configuration props structure * CR Update: Fix app configuration prop in script tag and extract commands manager from providers * CR Update: Create custom providers to use commandsManager * CR Update: Use services directly in measurementspanel * CR Update: Pass components to providers * CR Update: Remove position from dialog * CR Update: fix dialog prop check * CR Update: Fix comments * CR Update: Update documentation * CR Update: Add test default configuration * CR Update: Add default empy array to extensions * CR Update: Update i18n configuration all ot match current function configuration * CR Update: Add defaults to injected dependencies in configuration and extension configuration * CR Update: Add defaults to configuration with no args * Update documentation * CR Update: Add default for tools * CR Update: Update config object to i18n * CR Update: spread defaults * CR Update: Add tool configuration example to cornerstone extension * CR Update: Add tool configuration to netlify (testing) * CR Update: Remove netlify config for tools * CR Update: Rollback changes to i18n to be fixed later * CR Update: Update documentation and pass whole cornerstone config object instead of tools key SEE: https://www.conventionalcommits.org/en/v1.0.0/#commit-message-with-both-and-breaking-change-footer BREAKING CHANGE: modifies the exposed react <App /> components props. The contract for providing configuration for the app has changed. Please reference updated documentation for guidance.
148 lines
3.5 KiB
JavaScript
148 lines
3.5 KiB
JavaScript
import React, {
|
|
createContext,
|
|
useContext,
|
|
useEffect,
|
|
useCallback,
|
|
} from 'react';
|
|
import PropTypes from 'prop-types';
|
|
|
|
import { useDialog } from '@ohif/ui';
|
|
import { useLabellingFlow } from '@ohif/ui';
|
|
|
|
const ContextMenuContext = createContext(null);
|
|
const { Provider } = ContextMenuContext;
|
|
|
|
export const useContextMenu = () => useContext(ContextMenuContext);
|
|
|
|
const ContextMenuProvider = ({
|
|
children,
|
|
service,
|
|
contextMenuComponent: ContextMenuComponent,
|
|
onDelete,
|
|
}) => {
|
|
const { create, dismiss } = useDialog();
|
|
const { show: showLabellingFlow } = useLabellingFlow();
|
|
|
|
/**
|
|
* Sets the implementation of a context menu service that can be used by extensions.
|
|
*
|
|
* @returns void
|
|
*/
|
|
useEffect(() => {
|
|
if (service) {
|
|
service.setServiceImplementation({
|
|
show,
|
|
hide,
|
|
});
|
|
}
|
|
}, [hide, service, show]);
|
|
|
|
const hide = useCallback(() => dismiss({ id: 'context-menu' }), [dismiss]);
|
|
|
|
/**
|
|
* Show the context menu and override its configuration props.
|
|
*
|
|
* @param {ContextMenuProps} props { eventData, isTouchEvent, onClose, visible }
|
|
* @returns void
|
|
*/
|
|
const show = useCallback(
|
|
({ event }) => {
|
|
hide();
|
|
create({
|
|
id: 'context-menu',
|
|
isDraggable: false,
|
|
preservePosition: false,
|
|
content: ContextMenuComponent,
|
|
contentProps: {
|
|
eventData: event,
|
|
onDelete: (nearbyToolData, eventData) =>
|
|
onDelete(nearbyToolData, eventData),
|
|
onClose: () => dismiss({ id: 'context-menu' }),
|
|
onSetLabel: (eventData, measurementData) =>
|
|
showLabellingFlow({
|
|
event: eventData,
|
|
centralize: true,
|
|
props: {
|
|
measurementData,
|
|
skipAddLabelButton: true,
|
|
editLocation: true,
|
|
},
|
|
}),
|
|
onSetDescription: (eventData, measurementData) =>
|
|
showLabellingFlow({
|
|
event: eventData,
|
|
centralize: false,
|
|
defaultPosition: _getDefaultPosition(eventData),
|
|
props: {
|
|
measurementData,
|
|
editDescriptionOnDialog: true,
|
|
},
|
|
}),
|
|
},
|
|
defaultPosition: _getDefaultPosition(event),
|
|
});
|
|
},
|
|
[ContextMenuComponent, create, dismiss, hide, onDelete, showLabellingFlow]
|
|
);
|
|
|
|
const _getDefaultPosition = event => ({
|
|
x: (event && event.currentPoints.client.x) || 0,
|
|
y: (event && event.currentPoints.client.y) || 0,
|
|
});
|
|
|
|
return (
|
|
<Provider
|
|
value={{
|
|
show,
|
|
hide,
|
|
}}
|
|
>
|
|
{children}
|
|
</Provider>
|
|
);
|
|
};
|
|
|
|
/**
|
|
* Higher Order Component to use the context menu methods through a Class Component.
|
|
*
|
|
* @returns
|
|
*/
|
|
export const withContextMenu = Component => {
|
|
return function WrappedComponent(props) {
|
|
const { show, hide } = useContextMenu();
|
|
return (
|
|
<Component
|
|
{...props}
|
|
modal={{
|
|
show,
|
|
hide,
|
|
}}
|
|
/>
|
|
);
|
|
};
|
|
};
|
|
|
|
ContextMenuProvider.defaultProps = {
|
|
service: null,
|
|
};
|
|
|
|
ContextMenuProvider.propTypes = {
|
|
children: PropTypes.oneOfType([
|
|
PropTypes.arrayOf(PropTypes.node),
|
|
PropTypes.node,
|
|
]).isRequired,
|
|
service: PropTypes.shape({
|
|
setServiceImplementation: PropTypes.func,
|
|
}),
|
|
contextMenuComponent: PropTypes.oneOfType([
|
|
PropTypes.arrayOf(PropTypes.node),
|
|
PropTypes.node,
|
|
PropTypes.func,
|
|
]).isRequired,
|
|
onDelete: PropTypes.func.isRequired,
|
|
};
|
|
|
|
export default ContextMenuProvider;
|
|
|
|
export const ContextMenuConsumer = ContextMenuContext.Consumer;
|