function updateZoom()

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
                    }));
                }
            });
        }
    }