devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
167 lines (166 loc) • 6.16 kB
JavaScript
/**
* DevExtreme (esm/ui/progress_bar.js)
* Version: 21.1.4
* Build date: Mon Jun 21 2021
*
* Copyright (c) 2012 - 2021 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
import $ from "../core/renderer";
import TrackBar from "./track_bar";
import {
extend
} from "../core/utils/extend";
import {
isFunction
} from "../core/utils/type";
import registerComponent from "../core/component_registrator";
var PROGRESSBAR_CLASS = "dx-progressbar";
var PROGRESSBAR_CONTAINER_CLASS = "dx-progressbar-container";
var PROGRESSBAR_RANGE_CONTAINER_CLASS = "dx-progressbar-range-container";
var PROGRESSBAR_RANGE_CLASS = "dx-progressbar-range";
var PROGRESSBAR_WRAPPER_CLASS = "dx-progressbar-wrapper";
var PROGRESSBAR_STATUS_CLASS = "dx-progressbar-status";
var PROGRESSBAR_INDETERMINATE_SEGMENT_CONTAINER = "dx-progressbar-animating-container";
var PROGRESSBAR_INDETERMINATE_SEGMENT = "dx-progressbar-animating-segment";
var ProgressBar = TrackBar.inherit({
_getDefaultOptions: function() {
return extend(this.callBase(), {
value: 0,
statusFormat: function(ratio) {
return "Progress: " + Math.round(100 * ratio) + "%"
},
showStatus: true,
onComplete: null,
activeStateEnabled: false,
statusPosition: "bottom left",
_animatingSegmentCount: 0
})
},
_defaultOptionsRules: function() {
return this.callBase().concat([{
device: function(_device) {
return "android" === _device.platform
},
options: {
_animatingSegmentCount: 2
}
}])
},
_initMarkup: function() {
this._renderStatus();
this._createCompleteAction();
this.callBase();
this.$element().addClass(PROGRESSBAR_CLASS);
this._$wrapper.addClass(PROGRESSBAR_WRAPPER_CLASS);
this._$bar.addClass(PROGRESSBAR_CONTAINER_CLASS);
this.setAria("role", "progressbar");
$("<div>").addClass(PROGRESSBAR_RANGE_CONTAINER_CLASS).appendTo(this._$wrapper).append(this._$bar);
this._$range.addClass(PROGRESSBAR_RANGE_CLASS);
this._toggleStatus(this.option("showStatus"))
},
_useTemplates: function() {
return false
},
_createCompleteAction: function() {
this._completeAction = this._createActionByOption("onComplete")
},
_renderStatus: function() {
this._$status = $("<div>").addClass(PROGRESSBAR_STATUS_CLASS)
},
_renderIndeterminateState: function() {
this._$segmentContainer = $("<div>").addClass(PROGRESSBAR_INDETERMINATE_SEGMENT_CONTAINER);
var segments = this.option("_animatingSegmentCount");
for (var i = 0; i < segments; i++) {
$("<div>").addClass(PROGRESSBAR_INDETERMINATE_SEGMENT).addClass(PROGRESSBAR_INDETERMINATE_SEGMENT + "-" + (i + 1)).appendTo(this._$segmentContainer)
}
this._$segmentContainer.appendTo(this._$wrapper)
},
_toggleStatus: function(value) {
var splitPosition = this.option("statusPosition").split(" ");
if (value) {
if ("top" === splitPosition[0] || "left" === splitPosition[0]) {
this._$status.prependTo(this._$wrapper)
} else {
this._$status.appendTo(this._$wrapper)
}
} else {
this._$status.detach()
}
this._togglePositionClass()
},
_togglePositionClass: function() {
var position = this.option("statusPosition");
var splitPosition = position.split(" ");
this._$wrapper.removeClass("dx-position-top-left dx-position-top-right dx-position-bottom-left dx-position-bottom-right dx-position-left dx-position-right");
var positionClass = "dx-position-" + splitPosition[0];
if (splitPosition[1]) {
positionClass += "-" + splitPosition[1]
}
this._$wrapper.addClass(positionClass)
},
_toggleIndeterminateState: function(value) {
if (value) {
this._renderIndeterminateState();
this._$bar.toggle(false)
} else {
this._$bar.toggle(true);
this._$segmentContainer.remove();
delete this._$segmentContainer
}
},
_renderValue: function() {
var val = this.option("value");
var max = this.option("max");
if (!val && 0 !== val) {
this._toggleIndeterminateState(true);
return
}
if (this._$segmentContainer) {
this._toggleIndeterminateState(false)
}
if (val === max) {
this._completeAction()
}
this.callBase();
this._setStatus()
},
_setStatus: function() {
var format = this.option("statusFormat");
if (isFunction(format)) {
format = format.bind(this)
} else {
format = function(value) {
return value
}
}
var statusText = format(this._currentRatio, this.option("value"));
this._$status.text(statusText)
},
_dispose: function() {
this._$status.remove();
this.callBase()
},
_optionChanged: function(args) {
switch (args.name) {
case "statusFormat":
this._setStatus();
break;
case "showStatus":
this._toggleStatus(args.value);
break;
case "statusPosition":
this._toggleStatus(this.option("showStatus"));
break;
case "onComplete":
this._createCompleteAction();
break;
case "_animatingSegmentCount":
break;
default:
this.callBase(args)
}
}
});
registerComponent("dxProgressBar", ProgressBar);
export default ProgressBar;