UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

188 lines (187 loc) 6.68 kB
/** * DevExtreme (esm/__internal/ui/m_progress_bar.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 _extends from "@babel/runtime/helpers/esm/extends"; import registerComponent from "../../core/component_registrator"; import $ from "../../core/renderer"; import { isFunction } from "../../core/utils/type"; import TrackBar from "../ui/m_track_bar"; const PROGRESSBAR_CLASS = "dx-progressbar"; const PROGRESSBAR_CONTAINER_CLASS = "dx-progressbar-container"; const PROGRESSBAR_RANGE_CONTAINER_CLASS = "dx-progressbar-range-container"; const PROGRESSBAR_RANGE_CLASS = "dx-progressbar-range"; const PROGRESSBAR_WRAPPER_CLASS = "dx-progressbar-wrapper"; const PROGRESSBAR_STATUS_CLASS = "dx-progressbar-status"; const PROGRESSBAR_INDETERMINATE_SEGMENT_CONTAINER = "dx-progressbar-animating-container"; const PROGRESSBAR_INDETERMINATE_SEGMENT = "dx-progressbar-animating-segment"; class ProgressBar extends TrackBar { _getDefaultOptions() { return _extends({}, super._getDefaultOptions(), { value: 0, statusFormat: ratio => `Progress: ${Math.round(100*ratio)}%`, showStatus: true, onComplete: null, activeStateEnabled: false, statusPosition: "bottom left", _animatingSegmentCount: 0 }) } _defaultOptionsRules() { return super._defaultOptionsRules().concat([{ device: device => "android" === device.platform, options: { _animatingSegmentCount: 2 } }]) } _toggleReadOnlyState() { this.setAria("readonly", void 0) } _initMarkup() { this._renderStatus(); this._createCompleteAction(); super._initMarkup(); this.$element().addClass("dx-progressbar"); this._$wrapper.addClass("dx-progressbar-wrapper"); this._$bar.addClass("dx-progressbar-container"); this.setAria("role", "progressbar"); $("<div>").addClass("dx-progressbar-range-container").appendTo(this._$wrapper).append(this._$bar); this._$range.addClass("dx-progressbar-range"); const { showStatus: showStatus } = this.option(); this._toggleStatus(showStatus) } _useTemplates() { return false } _createCompleteAction() { this._completeAction = this._createActionByOption("onComplete") } _renderStatus() { this._$status = $("<div>").addClass("dx-progressbar-status") } _renderIndeterminateState() { this._$segmentContainer = $("<div>").addClass("dx-progressbar-animating-container"); const { _animatingSegmentCount: segments } = this.option(); for (let i = 0; i < segments; i += 1) { $("<div>").addClass(PROGRESSBAR_INDETERMINATE_SEGMENT).addClass(`${PROGRESSBAR_INDETERMINATE_SEGMENT}-${i+1}`).appendTo(this._$segmentContainer) } this._$segmentContainer.appendTo(this._$wrapper) } _toggleStatus(value) { const { statusPosition: statusPosition } = this.option(); const splitPosition = 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() { const { statusPosition: statusPosition } = this.option(); const splitPosition = statusPosition.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"); let positionClass = `dx-position-${splitPosition[0]}`; if (splitPosition[1]) { positionClass += `-${splitPosition[1]}` } this._$wrapper.addClass(positionClass) } _toggleIndeterminateState(value) { if (value) { this._renderIndeterminateState(); this._$bar.toggle(false) } else { var _this$_$segmentContai; this._$bar.toggle(true); null === (_this$_$segmentContai = this._$segmentContainer) || void 0 === _this$_$segmentContai || _this$_$segmentContai.remove(); delete this._$segmentContainer } } _renderValue() { const { value: value, max: max } = this.option(); if (!value && 0 !== value) { this._toggleIndeterminateState(true); return } if (this._$segmentContainer) { this._toggleIndeterminateState(false) } if (value === max) { this._completeAction() } super._renderValue(); this._setStatus() } _setStatus() { const { statusFormat: statusFormat } = this.option(); let format = statusFormat; if (isFunction(format)) { format = format.bind(this) } else { format = function(value) { return value } } const statusText = format(this._currentRatio, this.option("value")); this._$status.text(statusText) } _dispose() { this._$status.remove(); super._dispose() } _optionChanged(args) { const { name: name, value: value } = args; switch (name) { case "statusFormat": this._setStatus(); break; case "showStatus": this._toggleStatus(value); break; case "statusPosition": { const { showStatus: showStatus } = this.option(); this._toggleStatus(showStatus); break } case "onComplete": this._createCompleteAction(); break; case "_animatingSegmentCount": break; default: super._optionChanged(args) } } } registerComponent("dxProgressBar", ProgressBar); export default ProgressBar;