| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282 |
- /**
- * DevExtreme (ui/range_slider.js)
- * Version: 19.1.16
- * Build date: Tue Oct 18 2022
- *
- * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
- * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
- */
- "use strict";
- var $ = require("../core/renderer");
- var eventsEngine = require("../events/core/events_engine");
- var Slider = require("./slider");
- var SliderHandle = require("./slider/ui.slider_handle");
- var registerComponent = require("../core/component_registrator");
- var extend = require("../core/utils/extend").extend;
- var applyServerDecimalSeparator = require("../core/utils/common").applyServerDecimalSeparator;
- var eventUtils = require("../events/utils");
- var messageLocalization = require("../localization/message");
- var RANGE_SLIDER_CLASS = "dx-rangeslider";
- var RANGE_SLIDER_START_HANDLE_CLASS = RANGE_SLIDER_CLASS + "-start-handle";
- var RANGE_SLIDER_END_HANDLE_CLASS = RANGE_SLIDER_CLASS + "-end-handle";
- var RangeSlider = Slider.inherit({
- _supportedKeys: function() {
- var isRTL = this.option("rtlEnabled");
- var that = this;
- var _changeHandle = function(e, capturedHandle) {
- if (that.option("start") === that.option("end")) {
- that._capturedHandle = capturedHandle;
- e.target = that._capturedHandle;
- eventsEngine.trigger(that._capturedHandle, "focus")
- }
- };
- var _setHandleValue = function(e, step, sign) {
- var isStart = $(e.target).hasClass(RANGE_SLIDER_START_HANDLE_CLASS);
- var valueOption = isStart ? "start" : "end";
- var val = that.option(valueOption);
- step = that._valueStep(step);
- val += sign * (isRTL ? -step : step);
- that.option(valueOption, val)
- };
- var moveHandleRight = function(e, step) {
- _changeHandle(e, isRTL ? that._$handleStart : that._$handleEnd);
- _setHandleValue(e, step, 1)
- };
- var moveHandleLeft = function(e, step) {
- _changeHandle(e, isRTL ? that._$handleEnd : that._$handleStart);
- _setHandleValue(e, step, -1)
- };
- return extend(this.callBase(), {
- leftArrow: function(e) {
- e.preventDefault();
- e.stopPropagation();
- moveHandleLeft(e, this.option("step"))
- },
- rightArrow: function(e) {
- e.preventDefault();
- e.stopPropagation();
- moveHandleRight(e, this.option("step"))
- },
- pageUp: function(e) {
- e.preventDefault();
- e.stopPropagation();
- moveHandleRight(e, this.option("step") * this.option("keyStep"))
- },
- pageDown: function(e) {
- e.preventDefault();
- e.stopPropagation();
- moveHandleLeft(e, this.option("step") * this.option("keyStep"))
- },
- home: function(e) {
- e.preventDefault();
- e.stopPropagation();
- var isStart = $(e.target).hasClass(RANGE_SLIDER_START_HANDLE_CLASS);
- var valueOption = isStart ? "start" : "end";
- var startOption = isStart ? "min" : "start";
- var val = this.option(startOption);
- this.option(valueOption, val)
- },
- end: function(e) {
- e.preventDefault();
- e.stopPropagation();
- var isStart = $(e.target).hasClass(RANGE_SLIDER_START_HANDLE_CLASS);
- var valueOption = isStart ? "start" : "end";
- var endOption = isStart ? "end" : "max";
- var val = this.option(endOption);
- this.option(valueOption, val)
- }
- })
- },
- _getDefaultOptions: function() {
- return extend(this.callBase(), {
- start: 40,
- end: 60,
- value: [40, 60],
- startName: "",
- endName: ""
- })
- },
- _renderSubmitElement: function() {
- var $element = this.$element();
- this._$submitStartElement = $("<input>").attr("type", "hidden").attr("name", this.option("startName")).appendTo($element);
- this._$submitEndElement = $("<input>").attr("type", "hidden").attr("name", this.option("endName")).appendTo($element)
- },
- _initOptions: function(options) {
- this.callBase(options);
- var initialValue = this.initialOption("value");
- var value = this.option("value");
- if (value[0] === initialValue[0] && value[1] === initialValue[1]) {
- this.option("value", [this.option("start"), this.option("end")])
- } else {
- this.option({
- start: value[0],
- end: value[1]
- })
- }
- },
- _initMarkup: function() {
- this.$element().addClass(RANGE_SLIDER_CLASS);
- this.callBase()
- },
- _renderContentImpl: function() {
- this._callHandlerMethod("repaint");
- this.callBase()
- },
- _renderHandle: function() {
- this._$handleStart = this._renderHandleImpl(this.option("start"), this._$handleStart).addClass(RANGE_SLIDER_START_HANDLE_CLASS);
- this._$handleEnd = this._renderHandleImpl(this.option("end"), this._$handleEnd).addClass(RANGE_SLIDER_END_HANDLE_CLASS);
- this._updateHandleAriaLabels()
- },
- _startHandler: function(args) {
- var e = args.event;
- var $range = this._$range;
- var rangeWidth = $range.width();
- var eventOffsetX = eventUtils.eventData(e).x - this._$bar.offset().left;
- var startHandleX = $range.position().left;
- var endHandleX = $range.position().left + rangeWidth;
- var rtlEnabled = this.option("rtlEnabled");
- var startHandleIsClosest = (rtlEnabled ? -1 : 1) * ((startHandleX + endHandleX) / 2 - eventOffsetX) > 0;
- this._capturedHandle = startHandleIsClosest ? this._$handleStart : this._$handleEnd;
- this.callBase(args)
- },
- _updateHandleAriaLabels: function() {
- this.setAria("label", messageLocalization.getFormatter("dxRangeSlider-ariaFrom")(this.option("dxRangeSlider-ariaFrom")), this._$handleStart);
- this.setAria("label", messageLocalization.getFormatter("dxRangeSlider-ariaTill")(this.option("dxRangeSlider-ariaTill")), this._$handleEnd)
- },
- _activeHandle: function() {
- return this._capturedHandle
- },
- _updateHandlePosition: function(e) {
- var rtlEnabled = this.option("rtlEnabled");
- var offsetDirection = rtlEnabled ? -1 : 1;
- var max = this.option("max");
- var min = this.option("min");
- var newRatio = this._startOffset + offsetDirection * e.event.offset / this._swipePixelRatio();
- newRatio = newRatio.toPrecision(12);
- var newValue = newRatio * (max - min) + min;
- this._updateSelectedRangePosition(newRatio, newRatio);
- SliderHandle.getInstance(this._activeHandle()).fitTooltipPosition;
- this._changeValueOnSwipe(newRatio);
- var startValue = this.option("start");
- var endValue = this.option("end");
- var $nextHandle;
- if (startValue === endValue) {
- if (newValue < startValue) {
- $nextHandle = this._$handleStart
- } else {
- $nextHandle = this._$handleEnd
- }
- eventsEngine.trigger($nextHandle, "focus");
- if ($nextHandle && $nextHandle !== this._capturedHandle) {
- this._updateSelectedRangePosition((startValue - min) / (max - min), (endValue - min) / (max - min));
- this._toggleActiveState(this._activeHandle(), false);
- this._toggleActiveState($nextHandle, true);
- this._capturedHandle = $nextHandle
- }
- this._updateSelectedRangePosition(newRatio, newRatio);
- this._changeValueOnSwipe(newRatio)
- }
- },
- _updateSelectedRangePosition: function(leftRatio, rightRatio) {
- var rtlEnabled = this.option("rtlEnabled");
- var moveRight = this._capturedHandle === this._$handleStart && rtlEnabled || this._capturedHandle === this._$handleEnd && !rtlEnabled;
- var prop = moveRight ? "right" : "left";
- if (rtlEnabled ^ moveRight) {
- this._$range.css(prop, 100 - 100 * rightRatio + "%")
- } else {
- this._$range.css(prop, 100 * leftRatio + "%")
- }
- },
- _setValueOnSwipe: function(value) {
- var option = this._capturedHandle === this._$handleStart ? "start" : "end";
- var start = this.option("start");
- var end = this.option("end");
- var max = this.option("max");
- var min = this.option("min");
- start = Math.min(Math.max(start, min), max);
- end = Math.min(Math.max(end, min), max);
- if ("start" === option) {
- start = value > end ? end : value
- } else {
- end = value < start ? start : value
- }
- this.option("value", [start, end])
- },
- _renderValue: function() {
- var valStart = this.option("start");
- var valEnd = this.option("end");
- var min = this.option("min");
- var max = this.option("max");
- var rtlEnabled = this.option("rtlEnabled");
- valStart = Math.max(min, Math.min(valStart, max));
- valEnd = Math.max(valStart, Math.min(valEnd, max));
- this._setOptionSilent("start", valStart);
- this._setOptionSilent("end", valEnd);
- this._setOptionSilent("value", [valStart, valEnd]);
- this._$submitStartElement.val(applyServerDecimalSeparator(valStart));
- this._$submitEndElement.val(applyServerDecimalSeparator(valEnd));
- var ratio1 = max === min ? 0 : (valStart - min) / (max - min);
- var ratio2 = max === min ? 0 : (valEnd - min) / (max - min);
- var startOffset = parseFloat((100 * ratio1).toPrecision(12)) + "%";
- var endOffset = parseFloat((100 * (1 - ratio2)).toPrecision(12)) + "%";
- !this._needPreventAnimation && this._setRangeStyles({
- right: rtlEnabled ? startOffset : endOffset,
- left: rtlEnabled ? endOffset : startOffset
- });
- SliderHandle.getInstance(this._$handleStart).option("value", valStart);
- SliderHandle.getInstance(this._$handleEnd).option("value", valEnd)
- },
- _callHandlerMethod: function(name, args) {
- SliderHandle.getInstance(this._$handleStart)[name](args);
- SliderHandle.getInstance(this._$handleEnd)[name](args)
- },
- _setValueOption: function() {
- var start = this.option("start");
- var end = this.option("end");
- this.option("value", [start, end])
- },
- _optionChanged: function(args) {
- switch (args.name) {
- case "value":
- if (args.value[0] === args.previousValue[0] && args.value[1] === args.previousValue[1]) {
- break
- }
- this._setOptionSilent("start", args.value[0]);
- this._setOptionSilent("end", args.value[1]);
- this._renderValue();
- var start = this.option("start");
- var end = this.option("end");
- this._createActionByOption("onValueChanged", {
- excludeValidators: ["disabled", "readOnly"]
- })({
- start: start,
- end: end,
- value: [start, end],
- event: this._valueChangeEventInstance
- });
- this.validationRequest.fire({
- value: [start, end],
- editor: this
- });
- this._saveValueChangeEvent(void 0);
- break;
- case "start":
- case "end":
- this._setValueOption();
- break;
- case "startName":
- this._$submitStartElement.attr("name", args.value);
- break;
- case "endName":
- this._$submitEndElement.attr("name", args.value);
- break;
- case "name":
- break;
- default:
- this.callBase(args)
- }
- }
- });
- registerComponent("dxRangeSlider", RangeSlider);
- module.exports = RangeSlider;
- module.exports.default = module.exports;
|