import PropTypes from '../_util/vue-types' import { getOptionProps, getComponentFromProp } from '../_util/props-util' function isString (str) { return typeof str === 'string' } export default { name: 'Step', props: { prefixCls: PropTypes.string, wrapperStyle: PropTypes.object, itemWidth: PropTypes.string, status: PropTypes.string, iconPrefix: PropTypes.string, icon: PropTypes.node, adjustMarginRight: PropTypes.string, stepNumber: PropTypes.string, description: PropTypes.any, title: PropTypes.any, progressDot: PropTypes.oneOfType([ PropTypes.bool, PropTypes.func, ]), tailContent: PropTypes.any, icons: PropTypes.shape({ finish: PropTypes.any, error: PropTypes.any, }).loose, }, methods: { renderIconNode () { const { prefixCls, stepNumber, status, iconPrefix, icons, } = getOptionProps(this) let progressDot = this.progressDot if (progressDot === undefined) { progressDot = this.$scopedSlots.progressDot } const icon = getComponentFromProp(this, 'icon') const title = getComponentFromProp(this, 'title') const description = getComponentFromProp(this, 'description') let iconNode const iconClassName = { [`${prefixCls}-icon`]: true, [`${iconPrefix}icon`]: true, [`${iconPrefix}icon-${icon}`]: icon && isString(icon), [`${iconPrefix}icon-check`]: !icon && status === 'finish' && (icons && !icons.finish), [`${iconPrefix}icon-close`]: !icon && status === 'error' && (icons && !icons.error), } const iconDot = // `progressDot` enjoy the highest priority if (progressDot) { if (typeof progressDot === 'function') { iconNode = ( {progressDot({ index: stepNumber - 1, status, title, description, prefixCls })} ) } else { iconNode = {iconDot} } } else if (icon && !isString(icon)) { iconNode = {icon} } else if (icons && icons.finish && status === 'finish') { iconNode = {icons.finish} } else if (icons && icons.error && status === 'error') { iconNode = {icons.error} } else if (icon || status === 'finish' || status === 'error') { iconNode = } else { iconNode = {stepNumber} } return iconNode }, }, render () { const { prefixCls, itemWidth, status = 'wait', tailContent, adjustMarginRight, } = getOptionProps(this) const title = getComponentFromProp(this, 'title') const description = getComponentFromProp(this, 'description') const classString = { [`${prefixCls}-item`]: true, [`${prefixCls}-item-${status}`]: true, [`${prefixCls}-item-custom`]: getComponentFromProp(this, 'icon'), } const stepProps = { class: classString, on: this.$listeners, } const stepItemStyle = {} if (itemWidth) { stepItemStyle.width = itemWidth } if (adjustMarginRight) { stepItemStyle.marginRight = adjustMarginRight } return (
{tailContent}
{this.renderIconNode()}
{title}
{description &&
{description}
}
) }, }