UNPKG

@devexperts/dxcharts-lite

Version:
97 lines (95 loc) 3.63 kB
/* * Copyright (C) 2019 - 2026 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, }; };