devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
125 lines (122 loc) • 4.2 kB
JavaScript
/**
* DevExtreme (esm/viz/range_selector/slider.js)
* Version: 24.2.6
* Build date: Mon Mar 17 2025
*
* Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
import {
utils,
formatValue
} from "./common";
const animationSettings = utils.animationSettings;
import SliderMarker from "./slider_marker";
import supportUtils from "../../__internal/core/utils/m_support";
const SPLITTER_WIDTH = 8;
const TOUCH_SPLITTER_WIDTH = 20;
function getSliderTrackerWidth(sliderHandleWidth) {
return supportUtils.touchEvents || supportUtils.pointerEvents ? 20 : 8 < sliderHandleWidth ? sliderHandleWidth : 8
}
function Slider(params, index) {
this._translator = params.translator;
this._sliderGroup = params.renderer.g().attr({
class: "slider"
}).append(params.root);
this._line = params.renderer.path(null, "line").append(this._sliderGroup);
this._marker = new SliderMarker(params.renderer, this._sliderGroup, 1 === index);
this._tracker = params.renderer.rect().attr({
class: "slider-tracker",
fill: "#000000",
opacity: 1e-4
}).css({
cursor: "w-resize"
}).append(params.trackersGroup)
}
Slider.prototype = {
constructor: Slider,
cancelAnimation: function() {
this._sliderGroup.stopAnimation();
this._tracker.stopAnimation()
},
applyPosition: function(isAnimated) {
const slider = this._sliderGroup;
const tracker = this._tracker;
const attrs = {
translateX: this._position
};
this._marker.setPosition(this._position);
if (isAnimated) {
slider.animate(attrs, animationSettings);
tracker.animate(attrs, animationSettings)
} else {
slider.attr(attrs);
tracker.attr(attrs)
}
},
_setValid: function(isValid) {
this._marker.setValid(isValid);
this._line.attr({
stroke: this._colors[Number(isValid)]
})
},
_setText: function(text) {
this._marker.setText(text)
},
update: function(verticalRange, sliderHandleOptions, sliderMarkerOptions) {
this._formatOptions = {
format: sliderMarkerOptions.format,
customizeText: sliderMarkerOptions.customizeText
};
this._marker.applyOptions(sliderMarkerOptions, this._translator.getScreenRange());
this._colors = [sliderMarkerOptions.invalidRangeColor, sliderHandleOptions.color];
this._sliderGroup.attr({
translateY: verticalRange[0]
});
this._line.attr({
"stroke-width": sliderHandleOptions.width,
stroke: sliderHandleOptions.color,
"stroke-opacity": sliderHandleOptions.opacity,
sharp: "h",
points: [0, 0, 0, verticalRange[1] - verticalRange[0]]
});
const trackerWidth = getSliderTrackerWidth(sliderHandleOptions.width);
this._tracker.attr({
x: -trackerWidth / 2,
y: 0,
width: trackerWidth,
height: verticalRange[1] - verticalRange[0],
translateY: verticalRange[0]
})
},
toForeground: function() {
this._sliderGroup.toForeground()
},
getSliderTracker: function() {
return this._tracker
},
getPosition: function() {
return this._position
},
setDisplayValue: function(value) {
this._value = value;
this._setText(formatValue(value, this._formatOptions))
},
setOverlapped: function(isOverlapped) {
this._marker.setOverlapped(isOverlapped)
},
getValue: function() {
return this._value
},
on: function(event, handler) {
this._tracker.on(event, handler);
this._marker.getTracker().on(event, handler)
},
getCloudBorder: function() {
return this._marker.getBorderPosition()
},
dispose: function() {
this._marker.dispose()
}
};
export default Slider;