in clns-acuity-vahub/vahub/src/main/webapp/src/app/common/trellising/store/reducer/TrellisingReducer.ts [285:404]
function updateZoom(state: TabStore, action: ActionWithPayload<any>): Map<string, any> {
if (action.payload.zoom && (action.payload.xAxis || action.payload.yAxis)) {
// we need to calculate zoom range specifically for biomarkers
// because we can't show more than a number of subjects, check BIOMARKERS_X_MAX, BIOMARKERS_Y_MAX
if (action.payload.tabId === TabId.BIOMARKERS_HEATMAP_PLOT) {
const {
zoom: {
zoomMax, zoomMin, absMax, absMin
},
} = action.payload;
const biomarkersMax = action.payload.xAxis ? BIOMARKERS_X_MAX : BIOMARKERS_Y_MAX;
const range = zoomMax - zoomMin + 1;
return state.setIn(['tabs', action.payload.tabId, action.payload.xAxis ? 'xAxis' : 'yAxis', 'zoom'],
new ZoomRecord({
absMax: absMax,
absMin: absMin,
zoomMax: range > biomarkersMax ? (zoomMin + biomarkersMax) - 1
: zoomMax,
zoomMin: zoomMin > zoomMax ? zoomMax : zoomMin
}));
} else {
return state.setIn(['tabs', action.payload.tabId, action.payload.xAxis ? 'xAxis' : 'yAxis', 'zoom'],
new ZoomRecord({
absMax: action.payload.zoom.absMax,
absMin: action.payload.zoom.absMin,
zoomMax: action.payload.zoom.zoomMax,
zoomMin: action.payload.zoom.zoomMin
}));
}
} else {
const plots: List<IPlot> = state.getIn(['tabs', action.payload.tabId, 'plots']);
const trellisDesign: TrellisDesign = state.getIn(['tabs', action.payload.tabId, 'trellisDesign']);
// new ranges calculated based on data
// !!!!
const plotUtilsService = PlotUtilsFactory.getPlotUtilsService(plots.get(0));
const zoomRanges: ZoomRanges = plotUtilsService.calculateZoomRanges(plots, trellisDesign, action.payload.tabId);
// existing ranges
const existingZoomX: IZoom = state.getIn(['tabs', action.payload.tabId, 'xAxis', 'zoom'], undefined);
const existingZoomY: IZoom = state.getIn(['tabs', action.payload.tabId, 'yAxis', 'zoom'], undefined);
const hasZoomX: boolean = !action.payload.resetToDefault && existingZoomX
&& (existingZoomX.absMax !== existingZoomX.zoomMax || existingZoomX.absMin !== existingZoomX.zoomMin);
const hasZoomY: boolean = !action.payload.resetToDefault && existingZoomY
&& (existingZoomY.absMax !== existingZoomY.zoomMax || existingZoomY.absMin !== existingZoomY.zoomMin);
return state.withMutations(mutatorState => {
if (action.payload.tabId !== TabId.BIOMARKERS_HEATMAP_PLOT) {
const setting = mutatorState.getIn(['tabs', action.payload.tabId, 'plotSettings']);
mutatorState.setIn(['tabs', action.payload.tabId, 'xAxis', 'zoom'], new ZoomRecord({
absMax: zoomRanges.x.max,
absMin: zoomRanges.x.min,
zoomMax: (!hasZoomX || zoomRanges.x.max < existingZoomX.zoomMax) ? zoomRanges.x.max : existingZoomX.zoomMax,
zoomMin: (!hasZoomX || zoomRanges.x.min > existingZoomX.zoomMin) ? zoomRanges.x.min : existingZoomX.zoomMin
}));
let zoomYMax = (!hasZoomY || zoomRanges.y.max < existingZoomY.zoomMax) ? zoomRanges.y.max : existingZoomY.zoomMax;
let zoomYMin = (!hasZoomY || zoomRanges.y.min > existingZoomY.zoomMin) ? zoomRanges.y.min : existingZoomY.zoomMin;
if (action.payload.tabId === TabId.TUMOUR_RESPONSE_PRIOR_THERAPY && !hasZoomY) {
if (setting.get('trellisedBy') === TherapiesType.ALL_PRIOR_THERAPIES) {
zoomYMax = zoomRanges.y.max > MAX_BARS_ALL_PRIOR_THERAPIES - 1 ? MAX_BARS_ALL_PRIOR_THERAPIES - 1
: zoomRanges.y.max;
zoomYMin = zoomRanges.y.min;
} else {
zoomYMin = zoomRanges.y.min;
zoomYMax = zoomRanges.y.max;
}
}
mutatorState.setIn(['tabs', action.payload.tabId, 'yAxis', 'zoom'], new ZoomRecord({
absMax: zoomRanges.y.max,
absMin: zoomRanges.y.min,
zoomMax: zoomYMax,
zoomMin: zoomYMin
}));
} else {
let zoomXMin, zoomXMax;
if (!hasZoomX) {
// For biomarkers we need to start from the top left corner
zoomXMin = zoomRanges.x.min;
zoomXMax = Math.min(zoomRanges.x.max, zoomRanges.x.min + BIOMARKERS_X_MAX - 1);
} else {
// if we have existing zoom set to 9 and our new zoom comes as 1, we'll set the zoom to 9 which is wrong
zoomXMin = Math.max(existingZoomX.zoomMin, zoomRanges.x.min);
zoomXMax = Math.min(existingZoomX.zoomMax, zoomRanges.x.max);
if (zoomXMax - zoomXMin + 1 > BIOMARKERS_X_MAX) {
zoomXMax = zoomXMin + BIOMARKERS_X_MAX - 1;
}
}
let zoomYMin, zoomYMax;
if (!hasZoomY) {
// For biomarkers we need to start from the top left corner
zoomYMax = zoomRanges.y.max;
zoomYMin = Math.max(zoomRanges.y.min, zoomRanges.y.max - BIOMARKERS_Y_MAX + 1);
} else {
zoomYMin = Math.max(existingZoomY.zoomMin, zoomRanges.y.min);
zoomYMax = Math.min(existingZoomY.zoomMax, zoomRanges.y.max);
if (zoomYMax - zoomYMin + 1 > BIOMARKERS_Y_MAX) {
zoomYMin = zoomYMax - BIOMARKERS_Y_MAX + 1;
}
}
mutatorState.setIn(['tabs', action.payload.tabId, 'xAxis', 'zoom'], new ZoomRecord({
absMax: zoomRanges.x.max,
absMin: zoomRanges.x.min,
zoomMax: zoomXMax,
zoomMin: zoomXMin
}));
mutatorState.setIn(['tabs', action.payload.tabId, 'yAxis', 'zoom'], new ZoomRecord({
absMax: zoomRanges.y.max,
absMin: zoomRanges.y.min,
zoomMax: zoomYMax,
zoomMin: zoomYMin
}));
}
});
}
}