|
@@ -1,9 +1,10 @@
|
|
|
-import React, { isValidElement, cloneElement } from 'react';
|
|
|
+import React, { isValidElement, cloneElement, ReactNode } from 'react';
|
|
|
import BaseComponent, { BaseProps } from '../_base/baseComponent';
|
|
|
import PropTypes from 'prop-types';
|
|
|
import classNames from 'classnames';
|
|
|
import { cssClasses, strings } from '@douyinfe/semi-foundation/button/constants';
|
|
|
-import { Type, Size } from './Button';
|
|
|
+import { get } from 'lodash';
|
|
|
+import { Type, Size, ButtonProps } from './Button';
|
|
|
|
|
|
import '@douyinfe/semi-foundation/button/button.scss';
|
|
|
|
|
@@ -39,9 +40,41 @@ export default class ButtonGroup extends BaseComponent<ButtonGroupProps> {
|
|
|
size: 'default',
|
|
|
};
|
|
|
|
|
|
+ getInnerWithLine(inner) {
|
|
|
+ const innerWithLine: ReactNode[] = [];
|
|
|
+ let lineCls = `${prefixCls}-group-line`;
|
|
|
+ if (inner.length > 1) {
|
|
|
+ inner.slice(0, -1).forEach(item => {
|
|
|
+ const isButtonType = get(item, 'type.elementType') === 'Button';
|
|
|
+ const buttonProps = get(item, 'props') as ButtonProps;
|
|
|
+ if (buttonProps) {
|
|
|
+ const { type, theme, disabled } = buttonProps;
|
|
|
+ lineCls = classNames(
|
|
|
+ `${prefixCls}-group-line`,
|
|
|
+ `${prefixCls}-group-line-${theme ?? 'light'}`,
|
|
|
+ `${prefixCls}-group-line-${type ?? 'primary'}`,
|
|
|
+ {
|
|
|
+ [`${prefixCls}-group-line-disabled`]: disabled,
|
|
|
+ }
|
|
|
+ );
|
|
|
+ }
|
|
|
+ if (isButtonType) {
|
|
|
+ innerWithLine.push(item, <span className={lineCls} />);
|
|
|
+ } else {
|
|
|
+ innerWithLine.push(item);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ innerWithLine.push(inner.slice(-1));
|
|
|
+ return innerWithLine;
|
|
|
+ } else {
|
|
|
+ return inner;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
render() {
|
|
|
const { children, disabled, size, type, className, 'aria-label': ariaLabel, ...rest } = this.props;
|
|
|
- let inner;
|
|
|
+ let inner: ReactNode[];
|
|
|
+ let innerWithLine: ReactNode[] = [];
|
|
|
const cls = classNames(`${prefixCls}-group`, className);
|
|
|
|
|
|
if (children) {
|
|
@@ -50,7 +83,8 @@ export default class ButtonGroup extends BaseComponent<ButtonGroupProps> {
|
|
|
? cloneElement(itm, { disabled, size, type, ...itm.props, ...rest, key: index })
|
|
|
: itm
|
|
|
));
|
|
|
+ innerWithLine = this.getInnerWithLine(inner);
|
|
|
}
|
|
|
- return <div className={cls} role="group" aria-label={ariaLabel}>{inner}</div>;
|
|
|
+ return <div className={cls} role="group" aria-label={ariaLabel}>{innerWithLine}</div>;
|
|
|
}
|
|
|
}
|