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.any, 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}
}
); }, };