fix(bugs): fixing lots of bugs regarding release candidate (#3700)
This commit is contained in:
parent
29aeb070e0
commit
8bc12a37d0
@ -35,6 +35,7 @@ dotenv.config();
|
|||||||
const defineValues = {
|
const defineValues = {
|
||||||
/* Application */
|
/* Application */
|
||||||
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
|
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
|
||||||
|
'process.env.NODE_DEBUG': JSON.stringify(process.env.NODE_DEBUG),
|
||||||
'process.env.DEBUG': JSON.stringify(process.env.DEBUG),
|
'process.env.DEBUG': JSON.stringify(process.env.DEBUG),
|
||||||
'process.env.PUBLIC_URL': JSON.stringify(process.env.PUBLIC_URL || '/'),
|
'process.env.PUBLIC_URL': JSON.stringify(process.env.PUBLIC_URL || '/'),
|
||||||
'process.env.BUILD_NUM': JSON.stringify(BUILD_NUM),
|
'process.env.BUILD_NUM': JSON.stringify(BUILD_NUM),
|
||||||
|
|||||||
@ -28,7 +28,6 @@ function commandsModule({
|
|||||||
toolGroupService,
|
toolGroupService,
|
||||||
cineService,
|
cineService,
|
||||||
toolbarService,
|
toolbarService,
|
||||||
stateSyncService,
|
|
||||||
uiDialogService,
|
uiDialogService,
|
||||||
cornerstoneViewportService,
|
cornerstoneViewportService,
|
||||||
uiNotificationService,
|
uiNotificationService,
|
||||||
@ -155,7 +154,7 @@ function commandsModule({
|
|||||||
* @param props - containing the updates to apply
|
* @param props - containing the updates to apply
|
||||||
* @param props.measurementKey - chooses the measurement key to apply the
|
* @param props.measurementKey - chooses the measurement key to apply the
|
||||||
* code to. This will typically be finding or site to apply a
|
* code to. This will typically be finding or site to apply a
|
||||||
* finind code or a findingSites code.
|
* finding code or a findingSites code.
|
||||||
* @param props.code - A coding scheme value from DICOM, including:
|
* @param props.code - A coding scheme value from DICOM, including:
|
||||||
* * CodeValue - the language independent code, for example '1234'
|
* * CodeValue - the language independent code, for example '1234'
|
||||||
* * CodingSchemeDesignator - the issue of the code value
|
* * CodingSchemeDesignator - the issue of the code value
|
||||||
@ -225,6 +224,25 @@ function commandsModule({
|
|||||||
arrowTextCallback: ({ callback, data }) => {
|
arrowTextCallback: ({ callback, data }) => {
|
||||||
callInputDialog(uiDialogService, data, callback);
|
callInputDialog(uiDialogService, data, callback);
|
||||||
},
|
},
|
||||||
|
cleanUpCrosshairs: () => {
|
||||||
|
// if the crosshairs tool is active, deactivate it and set window level active
|
||||||
|
// since we are going back to main non-mpr HP
|
||||||
|
const activeViewportToolGroup = toolGroupService.getToolGroup(null);
|
||||||
|
|
||||||
|
if (activeViewportToolGroup._toolInstances?.Crosshairs?.mode === Enums.ToolModes.Active) {
|
||||||
|
actions.toolbarServiceRecordInteraction({
|
||||||
|
interactionType: 'tool',
|
||||||
|
commands: [
|
||||||
|
{
|
||||||
|
commandOptions: {
|
||||||
|
toolName: 'WindowLevel',
|
||||||
|
},
|
||||||
|
context: 'CORNERSTONE',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
toggleCine: () => {
|
toggleCine: () => {
|
||||||
const { viewports } = viewportGridService.getState();
|
const { viewports } = viewportGridService.getState();
|
||||||
const { isCineEnabled } = cineService.getState();
|
const { isCineEnabled } = cineService.getState();
|
||||||
@ -294,18 +312,8 @@ function commandsModule({
|
|||||||
}
|
}
|
||||||
|
|
||||||
const toolGroup = toolGroupService.getToolGroup(toolGroupId);
|
const toolGroup = toolGroupService.getToolGroup(toolGroupId);
|
||||||
const toolGroupViewportIds = toolGroup?.getViewportIds?.();
|
|
||||||
|
|
||||||
// if toolGroup has been destroyed, or its viewports have been removed
|
if (!toolGroup) {
|
||||||
if (!toolGroupViewportIds || !toolGroupViewportIds.length) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const filteredViewports = Array.from(viewports.values()).filter(viewport => {
|
|
||||||
return toolGroupViewportIds.includes(viewport.viewportId);
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!filteredViewports.length) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -708,6 +716,9 @@ function commandsModule({
|
|||||||
setToolbarToggled: {
|
setToolbarToggled: {
|
||||||
commandFn: actions.setToolbarToggled,
|
commandFn: actions.setToolbarToggled,
|
||||||
},
|
},
|
||||||
|
cleanUpCrosshairs: {
|
||||||
|
commandFn: actions.cleanUpCrosshairs,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
@ -24,18 +24,7 @@ const mpr: Types.HangingProtocol.Protocol = {
|
|||||||
// Turns off crosshairs when switching out of MPR mode
|
// Turns off crosshairs when switching out of MPR mode
|
||||||
onProtocolExit: [
|
onProtocolExit: [
|
||||||
{
|
{
|
||||||
commandName: 'toolbarServiceRecordInteraction',
|
commandName: 'cleanUpCrosshairs',
|
||||||
commandOptions: {
|
|
||||||
interactionType: 'tool',
|
|
||||||
commands: [
|
|
||||||
{
|
|
||||||
commandOptions: {
|
|
||||||
toolName: 'WindowLevel',
|
|
||||||
},
|
|
||||||
context: 'CORNERSTONE',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|||||||
@ -224,9 +224,11 @@ class CornerstoneCacheService {
|
|||||||
const segDisplaySetInstanceUID = segmentation.displaySetInstanceUID;
|
const segDisplaySetInstanceUID = segmentation.displaySetInstanceUID;
|
||||||
const segDisplaySet = displaySetService.getDisplaySetByUID(segDisplaySetInstanceUID);
|
const segDisplaySet = displaySetService.getDisplaySetByUID(segDisplaySetInstanceUID);
|
||||||
|
|
||||||
|
const instance = segDisplaySet.instances?.[0] || segDisplaySet.instance;
|
||||||
|
|
||||||
const shouldDisplaySeg = segmentationService.shouldRenderSegmentation(
|
const shouldDisplaySeg = segmentationService.shouldRenderSegmentation(
|
||||||
viewportDisplaySetInstanceUIDs,
|
viewportDisplaySetInstanceUIDs,
|
||||||
segDisplaySet.instances[0].FrameOfReferenceUID
|
instance.FrameOfReferenceUID
|
||||||
);
|
);
|
||||||
|
|
||||||
if (shouldDisplaySeg) {
|
if (shouldDisplaySeg) {
|
||||||
|
|||||||
@ -160,7 +160,7 @@ export default class StaticWadoClient extends api.DICOMwebClient {
|
|||||||
if (!valueElem) {
|
if (!valueElem) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (valueElem.vr == 'DA') {
|
if (valueElem.vr === 'DA' && valueElem.Value?.[0]) {
|
||||||
return this.compareDateRange(testValue, valueElem.Value[0]);
|
return this.compareDateRange(testValue, valueElem.Value[0]);
|
||||||
}
|
}
|
||||||
const value = valueElem.Value;
|
const value = valueElem.Value;
|
||||||
|
|||||||
@ -33,7 +33,6 @@ function PanelStudyBrowser({
|
|||||||
const [studyDisplayList, setStudyDisplayList] = useState([]);
|
const [studyDisplayList, setStudyDisplayList] = useState([]);
|
||||||
const [displaySets, setDisplaySets] = useState([]);
|
const [displaySets, setDisplaySets] = useState([]);
|
||||||
const [thumbnailImageSrcMap, setThumbnailImageSrcMap] = useState({});
|
const [thumbnailImageSrcMap, setThumbnailImageSrcMap] = useState({});
|
||||||
const isMounted = useRef(true);
|
|
||||||
|
|
||||||
const onDoubleClickThumbnailHandler = displaySetInstanceUID => {
|
const onDoubleClickThumbnailHandler = displaySetInstanceUID => {
|
||||||
let updatedViewports = [];
|
let updatedViewports = [];
|
||||||
@ -120,17 +119,11 @@ function PanelStudyBrowser({
|
|||||||
}
|
}
|
||||||
// When the image arrives, render it and store the result in the thumbnailImgSrcMap
|
// When the image arrives, render it and store the result in the thumbnailImgSrcMap
|
||||||
newImageSrcEntry[dSet.displaySetInstanceUID] = await getImageSrc(imageId);
|
newImageSrcEntry[dSet.displaySetInstanceUID] = await getImageSrc(imageId);
|
||||||
if (!isMounted.current) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
setThumbnailImageSrcMap(prevState => {
|
setThumbnailImageSrcMap(prevState => {
|
||||||
return { ...prevState, ...newImageSrcEntry };
|
return { ...prevState, ...newImageSrcEntry };
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
return () => {
|
|
||||||
isMounted.current = false;
|
|
||||||
};
|
|
||||||
}, [StudyInstanceUIDs, dataSource, displaySetService, getImageSrc]);
|
}, [StudyInstanceUIDs, dataSource, displaySetService, getImageSrc]);
|
||||||
|
|
||||||
// ~~ displaySets
|
// ~~ displaySets
|
||||||
|
|||||||
@ -170,6 +170,7 @@ const commandsModule = ({
|
|||||||
stageIndex,
|
stageIndex,
|
||||||
reset = false,
|
reset = false,
|
||||||
}: HangingProtocolParams): boolean => {
|
}: HangingProtocolParams): boolean => {
|
||||||
|
const primaryToolBeforeHPChange = toolbarService.getActivePrimaryTool();
|
||||||
try {
|
try {
|
||||||
// Stores in the state the display set selector id to displaySetUID mapping
|
// Stores in the state the display set selector id to displaySetUID mapping
|
||||||
// Pass in viewportId for the active viewport. This item will get set as
|
// Pass in viewportId for the active viewport. This item will get set as
|
||||||
@ -241,7 +242,29 @@ const commandsModule = ({
|
|||||||
stateSyncService.store(stateSyncReduce);
|
stateSyncService.store(stateSyncReduce);
|
||||||
// This is a default action applied
|
// This is a default action applied
|
||||||
const { protocol } = hangingProtocolService.getActiveProtocol();
|
const { protocol } = hangingProtocolService.getActiveProtocol();
|
||||||
actions.toggleHpTools(protocol);
|
actions.toggleHpTools();
|
||||||
|
|
||||||
|
// try to use the same tool in the new hanging protocol stage
|
||||||
|
const primaryButton = toolbarService.getButton(primaryToolBeforeHPChange);
|
||||||
|
if (primaryButton) {
|
||||||
|
// is there any type of interaction on this button, if not it might be in the
|
||||||
|
// items. This is a bit of a hack, but it works for now.
|
||||||
|
|
||||||
|
let interactionType = primaryButton.props?.interactionType;
|
||||||
|
|
||||||
|
if (!interactionType && primaryButton.props?.items) {
|
||||||
|
const firstItem = primaryButton.props.items[0];
|
||||||
|
interactionType = firstItem.props?.interactionType || firstItem.props?.type;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (interactionType) {
|
||||||
|
toolbarService.recordInteraction({
|
||||||
|
interactionType,
|
||||||
|
...primaryButton.props,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Send the notification about updating the state
|
// Send the notification about updating the state
|
||||||
if (protocolId !== hpInfo.protocolId) {
|
if (protocolId !== hpInfo.protocolId) {
|
||||||
// The old protocol callbacks are used for turning off things
|
// The old protocol callbacks are used for turning off things
|
||||||
@ -253,7 +276,8 @@ const commandsModule = ({
|
|||||||
commandsManager.run(protocol.callbacks?.onProtocolEnter);
|
commandsManager.run(protocol.callbacks?.onProtocolEnter);
|
||||||
return true;
|
return true;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
actions.toggleHpTools(hangingProtocolService.getActiveProtocol());
|
console.error(e);
|
||||||
|
actions.toggleHpTools();
|
||||||
uiNotificationService.show({
|
uiNotificationService.show({
|
||||||
title: 'Apply Hanging Protocol',
|
title: 'Apply Hanging Protocol',
|
||||||
message: 'The hanging protocol could not be applied.',
|
message: 'The hanging protocol could not be applied.',
|
||||||
|
|||||||
@ -188,7 +188,8 @@ function DataSourceWrapper(props) {
|
|||||||
!isSamePage || (!isLoading && (newOffset !== previousOffset || isLocationUpdated));
|
!isSamePage || (!isLoading && (newOffset !== previousOffset || isLocationUpdated));
|
||||||
|
|
||||||
if (isDataInvalid) {
|
if (isDataInvalid) {
|
||||||
getData().catch(() => {
|
getData().catch(e => {
|
||||||
|
console.error(e);
|
||||||
// If there is a data source configuration API, then the Worklist will popup the dialog to attempt to configure it
|
// If there is a data source configuration API, then the Worklist will popup the dialog to attempt to configure it
|
||||||
// and attempt to resolve this issue.
|
// and attempt to resolve this issue.
|
||||||
if (dataSource.getConfig().configurationAPI) {
|
if (dataSource.getConfig().configurationAPI) {
|
||||||
|
|||||||
@ -74,7 +74,7 @@ function _getInstance(StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
return series.instances.find(instance => instance.SOPInstanceUID === SOPInstanceUID);
|
return series.getInstance(SOPInstanceUID);
|
||||||
}
|
}
|
||||||
|
|
||||||
function _getInstanceByImageId(imageId) {
|
function _getInstanceByImageId(imageId) {
|
||||||
|
|||||||
@ -1,9 +1,26 @@
|
|||||||
function createSeriesMetadata(instances) {
|
function createSeriesMetadata(SeriesInstanceUID) {
|
||||||
const { SeriesInstanceUID } = instances[0];
|
const instances = [];
|
||||||
|
const instancesMap = new Map();
|
||||||
|
|
||||||
return {
|
return {
|
||||||
SeriesInstanceUID,
|
SeriesInstanceUID,
|
||||||
instances,
|
instances,
|
||||||
|
addInstance: function (newInstance) {
|
||||||
|
this.addInstances([newInstance]);
|
||||||
|
},
|
||||||
|
addInstances: function (newInstances) {
|
||||||
|
for (let i = 0, len = newInstances.length; i < len; i++) {
|
||||||
|
const instance = newInstances[i];
|
||||||
|
|
||||||
|
if (!instancesMap.has(instance.SOPInstanceUID)) {
|
||||||
|
instancesMap.set(instance.SOPInstanceUID, instance);
|
||||||
|
instances.push(instance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
getInstance: function (SOPInstanceUID) {
|
||||||
|
return instancesMap.get(SOPInstanceUID);
|
||||||
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -8,54 +8,29 @@ function createStudyMetadata(StudyInstanceUID) {
|
|||||||
isLoaded: false,
|
isLoaded: false,
|
||||||
series: [],
|
series: [],
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @param {object} instance
|
* @param {object} instance
|
||||||
* @returns {bool} true if series were added; false if series already exist
|
|
||||||
*/
|
*/
|
||||||
addInstanceToSeries: function (instance) {
|
addInstanceToSeries: function (instance) {
|
||||||
const { SeriesInstanceUID } = instance;
|
this.addInstancesToSeries([instance]);
|
||||||
if (!this.StudyDescription) {
|
|
||||||
this.StudyDescription = instance.StudyDescription;
|
|
||||||
}
|
|
||||||
const existingSeries = this.series.find(s => s.SeriesInstanceUID === SeriesInstanceUID);
|
|
||||||
|
|
||||||
if (existingSeries) {
|
|
||||||
existingSeries.instances.push(instance);
|
|
||||||
} else {
|
|
||||||
const series = createSeriesMetadata([instance]);
|
|
||||||
this.series.push(series);
|
|
||||||
const { Modality } = series;
|
|
||||||
if (this.ModalitiesInStudy.indexOf(Modality) === -1) {
|
|
||||||
this.ModalitiesInStudy.push(Modality);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @param {object[]} instances
|
* @param {object[]} instances
|
||||||
* @param {string} instances[].SeriesInstanceUID
|
* @param {string} instances[].SeriesInstanceUID
|
||||||
* @param {string} instances[].StudyDescription
|
* @param {string} instances[].StudyDescription
|
||||||
* @returns {bool} true if series were added; false if series already exist
|
|
||||||
*/
|
*/
|
||||||
addInstancesToSeries: function (instances) {
|
addInstancesToSeries: function (instances) {
|
||||||
const { SeriesInstanceUID } = instances[0];
|
const { SeriesInstanceUID } = instances[0];
|
||||||
if (!this.StudyDescription) {
|
if (!this.StudyDescription) {
|
||||||
this.StudyDescription = instances[0].StudyDescription;
|
this.StudyDescription = instances[0].StudyDescription;
|
||||||
}
|
}
|
||||||
const existingSeries = this.series.find(s => s.SeriesInstanceUID === SeriesInstanceUID);
|
let series = this.series.find(s => s.SeriesInstanceUID === SeriesInstanceUID);
|
||||||
|
|
||||||
if (existingSeries) {
|
if (!series) {
|
||||||
// Only add instances not already present, so generate a map
|
const series = createSeriesMetadata(SeriesInstanceUID);
|
||||||
// of existing instances and filter the to add by things
|
|
||||||
// already present.
|
|
||||||
const sopMap = {};
|
|
||||||
existingSeries.instances.forEach(it => (sopMap[it.SOPInstanceUID] = it));
|
|
||||||
const newInstances = instances.filter(it => !sopMap[it.SOPInstanceUID]);
|
|
||||||
existingSeries.instances.push(...newInstances);
|
|
||||||
} else {
|
|
||||||
const series = createSeriesMetadata(instances);
|
|
||||||
this.series.push(series);
|
this.series.push(series);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
series.addInstances(instances);
|
||||||
},
|
},
|
||||||
|
|
||||||
setSeriesMetadata: function (SeriesInstanceUID, seriesMetadata) {
|
setSeriesMetadata: function (SeriesInstanceUID, seriesMetadata) {
|
||||||
@ -64,7 +39,8 @@ function createStudyMetadata(StudyInstanceUID) {
|
|||||||
if (existingSeries) {
|
if (existingSeries) {
|
||||||
existingSeries = Object.assign(existingSeries, seriesMetadata);
|
existingSeries = Object.assign(existingSeries, seriesMetadata);
|
||||||
} else {
|
} else {
|
||||||
this.series.push(Object.assign({ instances: [] }, seriesMetadata));
|
const series = createSeriesMetadata(SeriesInstanceUID);
|
||||||
|
this.series.push(Object.assign(series, seriesMetadata));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@ -115,7 +115,13 @@ export default class ToolbarService extends PubSubService {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const commandsManager = this._commandsManager;
|
const commandsManager = this._commandsManager;
|
||||||
const { groupId, itemId, interactionType, commands } = interaction;
|
const { groupId, itemId, commands, type } = interaction;
|
||||||
|
let { interactionType } = interaction;
|
||||||
|
|
||||||
|
// if not interaction type, assume the type can be used
|
||||||
|
if (!interactionType) {
|
||||||
|
interactionType = type;
|
||||||
|
}
|
||||||
|
|
||||||
switch (interactionType) {
|
switch (interactionType) {
|
||||||
case 'action': {
|
case 'action': {
|
||||||
@ -228,6 +234,10 @@ export default class ToolbarService extends PubSubService {
|
|||||||
return activeTools;
|
return activeTools;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getActivePrimaryTool() {
|
||||||
|
return this.state.primaryToolId;
|
||||||
|
}
|
||||||
|
|
||||||
/** Sets the toggle state of a button to the isToggled state */
|
/** Sets the toggle state of a button to the isToggled state */
|
||||||
public setToggled(id: string, isToggled: boolean): void {
|
public setToggled(id: string, isToggled: boolean): void {
|
||||||
if (isToggled) {
|
if (isToggled) {
|
||||||
@ -259,7 +269,9 @@ export default class ToolbarService extends PubSubService {
|
|||||||
}
|
}
|
||||||
for (const buttonId of Object.keys(this.buttons)) {
|
for (const buttonId of Object.keys(this.buttons)) {
|
||||||
const { primary, items } = this.buttons[buttonId].props || {};
|
const { primary, items } = this.buttons[buttonId].props || {};
|
||||||
if (primary?.id === id) { return primary; }
|
if (primary?.id === id) {
|
||||||
|
return primary;
|
||||||
|
}
|
||||||
const found = items?.find(childButton => childButton.id === id);
|
const found = items?.find(childButton => childButton.id === id);
|
||||||
if (found) {
|
if (found) {
|
||||||
return found;
|
return found;
|
||||||
|
|||||||
@ -153,3 +153,14 @@ directly from
|
|||||||
Your public folder should look like this:
|
Your public folder should look like this:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
|
:::note
|
||||||
|
When hosting the DICOM JSON files, it is important to be aware that certain providers
|
||||||
|
do not automatically handle the 404 error and fallback to index.html. For example, Netlify
|
||||||
|
handles this, but Azure does not. Consequently, when you attempt to access a link with a
|
||||||
|
specific URL, a 404 error will be displayed.
|
||||||
|
|
||||||
|
This issue also occurs locally, where the http-server does not handle it. However,
|
||||||
|
if you utilize the `serve` package (npx serve ./dist -l 8080 -s), it effectively addresses this problem.
|
||||||
|
:::
|
||||||
|
|||||||
@ -18,13 +18,15 @@ It can be compiled with Java and Gradle, and then run against a set of dicom, in
|
|||||||
the example located in /dicom/study1 outputting to /dicomweb, and then a server
|
the example located in /dicom/study1 outputting to /dicomweb, and then a server
|
||||||
run against that data, like this:
|
run against that data, like this:
|
||||||
|
|
||||||
```
|
```bash
|
||||||
git clone https://github.com/OHIF/static-wado
|
git clone https://github.com/OHIF/static-wado
|
||||||
cd static-wado
|
cd static-wado
|
||||||
./gradlew installDist
|
./gradlew installDist
|
||||||
StaticWado/build/install/StaticWado/bin/StaticWado -d /dicomweb /dicom/study1
|
StaticWado/build/install/StaticWado/bin/StaticWado -d /dicomweb /dicom/study1
|
||||||
cd /dicomweb
|
cd /dicomweb
|
||||||
npx http-server -p 5000 --cors -g
|
npx http-server -p 5000 --cors -g
|
||||||
|
|
||||||
|
# you can use npx serve ./dist -l 8080 -s as an alternative to http-server
|
||||||
```
|
```
|
||||||
|
|
||||||
There is then a dev environment in the platform/app directory which can be
|
There is then a dev environment in the platform/app directory which can be
|
||||||
|
|||||||
@ -106,6 +106,8 @@ yarn global add http-server
|
|||||||
# Serve the files in our current directory
|
# Serve the files in our current directory
|
||||||
# Accessible at: `http://localhost:8080`
|
# Accessible at: `http://localhost:8080`
|
||||||
npx http-server ./dist
|
npx http-server ./dist
|
||||||
|
|
||||||
|
# you can use npx serve ./dist -l 8080 -s as an alternative to http-server
|
||||||
```
|
```
|
||||||
|
|
||||||
:::caution
|
:::caution
|
||||||
|
|||||||
@ -44,8 +44,10 @@ Download the index.html and the build (against the /ohif/ path) from [here](http
|
|||||||
|
|
||||||
Then run the
|
Then run the
|
||||||
|
|
||||||
```
|
```bash
|
||||||
npx http-server unzipped-folder
|
npx http-server unzipped-folder
|
||||||
|
|
||||||
|
# you can use npx serve ./dist -l 8080 -s as an alternative to http-server
|
||||||
```
|
```
|
||||||
|
|
||||||
You should be able to see
|
You should be able to see
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user