@devexperts/dxcharts-lite
Version:
97 lines (95 loc) • 3.63 kB
JavaScript
/*
* Copyright (C) 2019 - 2025 Devexperts Solutions IE Limited
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
* If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
/**
* Auxiliary sub-model to apply X,Y auto-scaling feature.
* Transforms the original ViewportModel.
* @doc-tags auto-scale,viewport,scaling
*/
export class AutoScaleViewportSubModel {
constructor(delegate, highLowProviders) {
this.delegate = delegate;
// post processors can apply some changes to high low before applying it
this.highLowPostProcessor = {};
this.highLowProviders = highLowProviders !== null && highLowProviders !== void 0 ? highLowProviders : {};
}
/**
* Sets a HighLowProvider for a given name.
* @param {string} name - The name of the HighLowProvider.
* @param {HighLowProvider} provider - The HighLowProvider to be set.
*/
setHighLowProvider(name, provider) {
this.highLowProviders[name] = provider;
}
/**
* Deletes a high-low provider from the list of high-low providers.
* @param {string} name - The name of the high-low provider to be deleted.
*/
deleteHighLowProvider(name) {
delete this.highLowProviders[name];
}
/**
* Sets a HighLowPostProcessor for a given name.
*
* @param {string} name - The name of the HighLowPostProcessor.
* @param {HighLowPostProcessor} processor - The HighLowPostProcessor to be set.
* @returns {void}
*/
setHighLowPostProcessor(name, processor) {
this.highLowPostProcessor[name] = processor;
}
/**
* Sets the auto and recalculates the state of the viewport model.
* @param {ViewportModelState} state - The state of the viewport model.
* @returns {void}
*/
doAutoYScale(state) {
autoScaleYViewportTransformer(this.delegate, state, Object.values(this.highLowProviders), Object.values(this.highLowPostProcessor));
}
}
/**
* Y auto-scale viewport transformer. Calculates highLow for all chart visuals and recalculates the Y scale.
* @param vm
* @param state
* @param highLowProviders
* @param highLowPostProcessors
*/
export const autoScaleYViewportTransformer = (vm, state, highLowProviders, highLowPostProcessors) => {
const highLowList = highLowProviders
.filter(provider => provider.isHighLowActive())
.map(provider => provider.calculateHighLow(state));
const highLow = mergeHighLow(highLowList);
const postProcessedHighLow = highLowPostProcessors.reduce((prevResult, postProcessor) => postProcessor(prevResult), highLow);
state.yStart = postProcessedHighLow.low;
state.yEnd = postProcessedHighLow.high;
state.zoomY = vm.calculateZoomY(state.yStart, state.yEnd);
};
/**
* Merges an array of HighLow objects into a single HighLow object.
* @param {HighLow[]} input - The array of HighLow objects to be merged.
* @returns {HighLow} - The merged HighLow object.
*/
export function mergeHighLow(input) {
if (input.length === 0) {
return getDefaultHighLow();
}
let max = input[0].high;
let min = input[0].low;
input.forEach(highLow => {
if (isFinite(highLow.high) && highLow.high >= max) {
max = highLow.high;
}
if (isFinite(highLow.low) && highLow.low <= min) {
min = highLow.low;
}
});
return { low: min, high: max };
}
export const getDefaultHighLow = () => {
return {
high: Number.MIN_SAFE_INTEGER,
low: Number.MAX_SAFE_INTEGER,
};
};