bootstrap-vue
Version:
With more than 85 components, over 45 available plugins, several directives, and 1000+ icons, BootstrapVue provides one of the most comprehensive implementations of the Bootstrap v4 component and grid system available for Vue.js v2.6, complete with extens
134 lines (127 loc) • 4.43 kB
JavaScript
import { extend } from '../../vue'
import { NAME_PROGRESS_BAR } from '../../constants/components'
import { PROP_TYPE_BOOLEAN, PROP_TYPE_NUMBER_STRING, PROP_TYPE_STRING } from '../../constants/props'
import { htmlOrText } from '../../utils/html'
import { isBoolean } from '../../utils/inspect'
import { mathMax, mathPow } from '../../utils/math'
import { toFixed, toFloat, toInteger } from '../../utils/number'
import { makeProp, makePropsConfigurable } from '../../utils/props'
import { toString } from '../../utils/string'
import { normalizeSlotMixin } from '../../mixins/normalize-slot'
// --- Props ---
export const props = makePropsConfigurable(
{
animated: makeProp(PROP_TYPE_BOOLEAN, null),
label: makeProp(PROP_TYPE_STRING),
labelHtml: makeProp(PROP_TYPE_STRING),
max: makeProp(PROP_TYPE_NUMBER_STRING, null),
precision: makeProp(PROP_TYPE_NUMBER_STRING, null),
showProgress: makeProp(PROP_TYPE_BOOLEAN, null),
showValue: makeProp(PROP_TYPE_BOOLEAN, null),
striped: makeProp(PROP_TYPE_BOOLEAN, null),
value: makeProp(PROP_TYPE_NUMBER_STRING, 0),
variant: makeProp(PROP_TYPE_STRING)
},
NAME_PROGRESS_BAR
)
// --- Main component ---
// @vue/component
export const BProgressBar = /*#__PURE__*/ extend({
name: NAME_PROGRESS_BAR,
mixins: [normalizeSlotMixin],
inject: {
getBvProgress: {
default: /* istanbul ignore next */ () => () => ({})
}
},
props,
computed: {
bvProgress() {
return this.getBvProgress()
},
progressBarClasses() {
const { computedAnimated, computedVariant } = this
return [
computedVariant ? `bg-${computedVariant}` : '',
this.computedStriped || computedAnimated ? 'progress-bar-striped' : '',
computedAnimated ? 'progress-bar-animated' : ''
]
},
progressBarStyles() {
return {
width: 100 * (this.computedValue / this.computedMax) + '%'
}
},
computedValue() {
return toFloat(this.value, 0)
},
computedMax() {
// Prefer our max over parent setting
// Default to `100` for invalid values (`-x`, `0`, `NaN`)
const max = toFloat(this.max) || toFloat(this.bvProgress.max, 0)
return max > 0 ? max : 100
},
computedPrecision() {
// Prefer our precision over parent setting
// Default to `0` for invalid values (`-x`, `NaN`)
return mathMax(toInteger(this.precision, toInteger(this.bvProgress.precision, 0)), 0)
},
computedProgress() {
const precision = this.computedPrecision
const p = mathPow(10, precision)
return toFixed((100 * p * this.computedValue) / this.computedMax / p, precision)
},
computedVariant() {
// Prefer our variant over parent setting
return this.variant || this.bvProgress.variant
},
computedStriped() {
// Prefer our striped over parent setting
return isBoolean(this.striped) ? this.striped : this.bvProgress.striped || false
},
computedAnimated() {
// Prefer our animated over parent setting
return isBoolean(this.animated) ? this.animated : this.bvProgress.animated || false
},
computedShowProgress() {
// Prefer our showProgress over parent setting
return isBoolean(this.showProgress)
? this.showProgress
: this.bvProgress.showProgress || false
},
computedShowValue() {
// Prefer our showValue over parent setting
return isBoolean(this.showValue) ? this.showValue : this.bvProgress.showValue || false
}
},
render(h) {
const { label, labelHtml, computedValue, computedPrecision } = this
let $children
let domProps = {}
if (this.hasNormalizedSlot()) {
$children = this.normalizeSlot()
} else if (label || labelHtml) {
domProps = htmlOrText(labelHtml, label)
} else if (this.computedShowProgress) {
$children = this.computedProgress
} else if (this.computedShowValue) {
$children = toFixed(computedValue, computedPrecision)
}
return h(
'div',
{
staticClass: 'progress-bar',
class: this.progressBarClasses,
style: this.progressBarStyles,
attrs: {
role: 'progressbar',
'aria-valuemin': '0',
'aria-valuemax': toString(this.computedMax),
'aria-valuenow': toFixed(computedValue, computedPrecision)
},
domProps
},
$children
)
}
})