@progress/kendo-angular-inputs
Version:
Kendo UI for Angular Inputs Package - Everything you need to build professional form functionality (Checkbox, ColorGradient, ColorPalette, ColorPicker, FlatColorPicker, FormField, MaskedTextBox, NumericTextBox, RadioButton, RangeSlider, Slider, Switch, Te
207 lines (206 loc) • 6.2 kB
JavaScript
/**-----------------------------------------------------------------------------------------
* Copyright © 2025 Progress Software Corporation. All rights reserved.
* Licensed under commercial license. See LICENSE.md in the project root for more information
*-------------------------------------------------------------------------------------------*/
import { areSame, isPresent } from '../common/utils';
import { add, subtract, multiply, divide, remainder, fractionLength, toFixedPrecision } from '../common/math';
import { isDevMode } from '@angular/core';
/**
* @hidden
*/
export const calculateFixedTrackSize = ({ max, min, smallStep, fixedTickWidth }) => ((max - min) / smallStep) * fixedTickWidth;
/**
* @hidden
*/
export const calculateTicksCount = (min = 0, max = 0, smallStep = 1) => {
if (smallStep <= 0) {
throw new Error('Invalid argument: smallStep must be a positive number');
}
const adjustedRange = Math.abs(subtract(max, min));
const adjustedRatio = Math.floor(divide(adjustedRange, smallStep));
const result = add(adjustedRatio, 1);
return result;
};
/**
* @hidden
*/
export const calculateValueFromTick = (index, { max, min, smallStep, reverse, vertical }) => {
const value = add(min, multiply(index, smallStep));
return vertical || reverse ? Math.abs(subtract(value, max)) : value;
};
/**
* @hidden
*/
export const calculateHandlePosition = ({ trackWidth, min, max, value }) => {
const step = trackWidth / Math.abs(max - min);
const pos = isPresent(value) ? step * (value - min) : min;
return Math.floor(pos);
};
/**
* @hidden
*/
export const decreaseValueToStep = (value, { max, min, smallStep, largeStep }, large = false) => {
const step = large && largeStep ? multiply(smallStep, largeStep) : smallStep;
const stepValue = subtract(value, min);
let result;
const stepRemainder = remainder(stepValue, step);
if (stepRemainder === 0) {
result = subtract(stepValue, step);
}
else {
result = subtract(stepValue, stepRemainder);
}
return limitValue(add(result, min), min, max);
};
/**
* @hidden
*/
export const increaseValueToStep = (value, { max, min, smallStep, largeStep }, large = false) => {
const step = large && largeStep ? multiply(smallStep, largeStep) : smallStep;
const stepValue = subtract(value, min);
const stepRemainder = remainder(stepValue, step);
const result = add(subtract(stepValue, stepRemainder), step);
return limitValue(add(result, min), min, max);
};
/**
* @hidden
*/
export const isStartHandle = (dragHandle) => dragHandle.id.indexOf('k-start-handle') > -1;
/**
* @hidden
*/
export const snapValue = (value, options) => {
const { smallStep, min, max } = options;
const limited = limitValue(value, min, max);
if (value !== limited) {
return limited;
}
const left = decreaseValueToStep(value, options);
const right = increaseValueToStep(value, options);
if ((value - min) % smallStep === 0) {
return value;
}
if (right - value <= (right - left) / 2) {
return right;
}
return left;
};
/**
* @hidden
*/
export const trimValue = (max, min, value) => {
if (value > max) {
return max;
}
if (value < min) {
return min;
}
return value;
};
/**
* @hidden
*/
export const trimValueRange = (max, min, value) => {
return value ? [trimValue(max, min, value[0]), trimValue(max, min, value[1])] : [min, min];
};
/**
* @hidden
*/
export const identity = (value) => value;
/**
* @hidden
*/
export const isSameRange = (value1, value2) => areSame(value1[0], value2[0]) && areSame(value1[1], value2[1]);
/**
* @hidden
*/
export const elementOffset = (element) => {
const box = element.getBoundingClientRect();
const documentElement = document.documentElement;
return {
left: box.left + (window.pageXOffset || documentElement.scrollLeft) - (documentElement.clientLeft || 0),
top: box.top + (window.pageYOffset || documentElement.scrollTop) - (documentElement.clientTop || 0)
};
};
/**
* @hidden
*/
export const limitValue = (value, min, max) => {
return Math.max(Math.min(value, max), min);
};
/**
* @hidden
*/
export const eventValue = (eventArgs, scaleElement, options) => {
const { min, max, vertical, rtl } = options;
const trackOffset = elementOffset(scaleElement);
const offset = vertical ? eventArgs.pageY - trackOffset.top : eventArgs.pageX - trackOffset.left;
const scale = (max - min) / (vertical ? scaleElement.clientHeight : scaleElement.clientWidth);
const offsetValue = offset * scale;
let value = rtl || vertical ? max - offsetValue : min + offsetValue;
const stepFractionLength = fractionLength(options.smallStep);
value = toFixedPrecision(value, stepFractionLength + 1);
return snapValue(value, options);
};
/**
* @hidden
*/
export const isButton = (element) => {
return element.className.indexOf('k-button-increase') >= 0 || element.className.indexOf('k-button-decrease') >= 0;
};
/**
* @hidden
*/
export const increment = (options) => {
return increaseValueToStep(options.value, options);
};
/**
* @hidden
*/
export const decrement = (options) => {
return decreaseValueToStep(options.value, options);
};
/**
* @hidden
*/
export const incrementLarge = (options) => {
return increaseValueToStep(options.value, options, true);
};
/**
* @hidden
*/
export const decrementLarge = (options) => {
return decreaseValueToStep(options.value, options, true);
};
/**
* @hidden
*/
export const validateValue = (value) => {
if (isDevMode && value && value[0] > value[1]) {
throw new Error('[RangeSlider] The start value should not be greater than the end value.');
}
};
/**
* @hidden
*/
export default {
calculateFixedTrackSize,
calculateValueFromTick,
calculateTicksCount,
calculateHandlePosition,
decreaseValueToStep,
decrement,
decrementLarge,
eventValue,
identity,
increment,
incrementLarge,
isButton,
isSameRange,
isStartHandle,
increaseValueToStep,
trimValue,
trimValueRange,
snapValue,
validateValue
};