170 lines
5.2 KiB
JavaScript
170 lines
5.2 KiB
JavaScript
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
/* eslint react/prop-types: 0 */
|
|
import * as React from 'react';
|
|
import { clsx } from 'clsx';
|
|
import KeyCode from "@rc-component/util/es/KeyCode";
|
|
import Rail from "./Rail";
|
|
import { UnstableContext } from "./UnstableContext";
|
|
import StepIcon, { StepIconSemanticContext } from "./StepIcon";
|
|
import { StepsContext } from "./Context";
|
|
function hasContent(value) {
|
|
return value !== undefined && value !== null;
|
|
}
|
|
export default function Step(props) {
|
|
const {
|
|
// style
|
|
prefixCls,
|
|
classNames,
|
|
styles,
|
|
// data
|
|
data,
|
|
last,
|
|
nextStatus,
|
|
active,
|
|
index,
|
|
// render
|
|
itemRender,
|
|
iconRender,
|
|
itemWrapperRender,
|
|
// events
|
|
onClick
|
|
} = props;
|
|
const itemCls = `${prefixCls}-item`;
|
|
|
|
// ======================== Contexts ========================
|
|
const {
|
|
railFollowPrevStatus
|
|
} = React.useContext(UnstableContext);
|
|
const {
|
|
ItemComponent
|
|
} = React.useContext(StepsContext);
|
|
|
|
// ========================== Data ==========================
|
|
const {
|
|
onClick: onItemClick,
|
|
title,
|
|
subTitle,
|
|
content,
|
|
description,
|
|
disabled,
|
|
icon,
|
|
status,
|
|
className,
|
|
style,
|
|
classNames: itemClassNames = {},
|
|
styles: itemStyles = {},
|
|
...restItemProps
|
|
} = data;
|
|
const mergedContent = content ?? description;
|
|
const renderInfo = {
|
|
item: {
|
|
...data,
|
|
content: mergedContent
|
|
},
|
|
index,
|
|
active
|
|
};
|
|
|
|
// ========================= Click ==========================
|
|
const clickable = !!(onClick || onItemClick) && !disabled;
|
|
const accessibilityProps = {};
|
|
if (clickable) {
|
|
accessibilityProps.role = 'button';
|
|
accessibilityProps.tabIndex = 0;
|
|
accessibilityProps.onClick = e => {
|
|
onItemClick?.(e);
|
|
onClick(index);
|
|
};
|
|
accessibilityProps.onKeyDown = e => {
|
|
const {
|
|
which
|
|
} = e;
|
|
if (which === KeyCode.ENTER || which === KeyCode.SPACE) {
|
|
onClick(index);
|
|
}
|
|
};
|
|
}
|
|
|
|
// ========================= Render =========================
|
|
const mergedStatus = status || 'wait';
|
|
const hasTitle = hasContent(title);
|
|
const hasSubTitle = hasContent(subTitle);
|
|
const classString = clsx(itemCls, `${itemCls}-${mergedStatus}`, {
|
|
[`${itemCls}-custom`]: icon,
|
|
[`${itemCls}-active`]: active,
|
|
[`${itemCls}-disabled`]: disabled === true,
|
|
[`${itemCls}-empty-header`]: !hasTitle && !hasSubTitle
|
|
}, className, classNames.item, itemClassNames.root);
|
|
let iconNode = /*#__PURE__*/React.createElement(StepIcon, null);
|
|
if (iconRender) {
|
|
iconNode = iconRender(iconNode, {
|
|
...renderInfo,
|
|
components: {
|
|
Icon: StepIcon
|
|
}
|
|
});
|
|
}
|
|
const wrapperNode = /*#__PURE__*/React.createElement("div", {
|
|
className: clsx(`${itemCls}-wrapper`, classNames.itemWrapper, itemClassNames.wrapper),
|
|
style: {
|
|
...styles.itemWrapper,
|
|
...itemStyles.wrapper
|
|
}
|
|
}, /*#__PURE__*/React.createElement(StepIconSemanticContext.Provider, {
|
|
value: {
|
|
className: itemClassNames.icon,
|
|
style: itemStyles.icon
|
|
}
|
|
}, iconNode), /*#__PURE__*/React.createElement("div", {
|
|
className: clsx(`${itemCls}-section`, classNames.itemSection, itemClassNames.section),
|
|
style: {
|
|
...styles.itemSection,
|
|
...itemStyles.section
|
|
}
|
|
}, /*#__PURE__*/React.createElement("div", {
|
|
className: clsx(`${itemCls}-header`, classNames.itemHeader, itemClassNames.header),
|
|
style: {
|
|
...styles.itemHeader,
|
|
...itemStyles.header
|
|
}
|
|
}, hasTitle && /*#__PURE__*/React.createElement("div", {
|
|
className: clsx(`${itemCls}-title`, classNames.itemTitle, itemClassNames.title),
|
|
style: {
|
|
...styles.itemTitle,
|
|
...itemStyles.title
|
|
}
|
|
}, title), hasSubTitle && /*#__PURE__*/React.createElement("div", {
|
|
title: typeof subTitle === 'string' ? subTitle : undefined,
|
|
className: clsx(`${itemCls}-subtitle`, classNames.itemSubtitle, itemClassNames.subtitle),
|
|
style: {
|
|
...styles.itemSubtitle,
|
|
...itemStyles.subtitle
|
|
}
|
|
}, subTitle), !last && /*#__PURE__*/React.createElement(Rail, {
|
|
prefixCls: itemCls,
|
|
className: clsx(classNames.itemRail, itemClassNames.rail),
|
|
style: {
|
|
...styles.itemRail,
|
|
...itemStyles.rail
|
|
},
|
|
status: railFollowPrevStatus ? status : nextStatus
|
|
})), hasContent(mergedContent) && /*#__PURE__*/React.createElement("div", {
|
|
className: clsx(`${itemCls}-content`, classNames.itemContent, itemClassNames.content),
|
|
style: {
|
|
...styles.itemContent,
|
|
...itemStyles.content
|
|
}
|
|
}, mergedContent)));
|
|
let stepNode = /*#__PURE__*/React.createElement(ItemComponent, _extends({}, restItemProps, accessibilityProps, {
|
|
className: classString,
|
|
style: {
|
|
...styles.item,
|
|
...itemStyles.root,
|
|
...style
|
|
}
|
|
}), itemWrapperRender ? itemWrapperRender(wrapperNode) : wrapperNode);
|
|
if (itemRender) {
|
|
stepNode = itemRender(stepNode, renderInfo) || null;
|
|
}
|
|
return stepNode;
|
|
} |