UNPKG

@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
/**----------------------------------------------------------------------------------------- * 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 };