|
|
@@ -15,19 +15,17 @@ const TagSelectOption = ({ children, checked, onChange, value }) => (
|
|
|
{children}
|
|
|
</CheckableTag>
|
|
|
);
|
|
|
-TagSelectOption.defaultProps = {
|
|
|
- displayName: 'TagSelectOption',
|
|
|
-};
|
|
|
+
|
|
|
+TagSelectOption.isTagSelectOption = true;
|
|
|
|
|
|
class TagSelect extends Component {
|
|
|
static defaultProps = {
|
|
|
- initialValue: [],
|
|
|
+ defaultValue: [],
|
|
|
};
|
|
|
|
|
|
state = {
|
|
|
- checkedAll: false,
|
|
|
expand: false,
|
|
|
- checkedTags: this.props.initialValue || [],
|
|
|
+ checkedTags: this.props.defaultValue || [],
|
|
|
};
|
|
|
|
|
|
onSelectAll = (checked) => {
|
|
|
@@ -37,10 +35,7 @@ class TagSelect extends Component {
|
|
|
checkedTags = this.getAllTags();
|
|
|
}
|
|
|
|
|
|
- this.setState({
|
|
|
- checkedAll: checked,
|
|
|
- checkedTags,
|
|
|
- });
|
|
|
+ this.setState({ checkedTags });
|
|
|
|
|
|
if (onChange) {
|
|
|
onChange(checkedTags);
|
|
|
@@ -50,7 +45,7 @@ class TagSelect extends Component {
|
|
|
getAllTags() {
|
|
|
const { children } = this.props;
|
|
|
const checkedTags = children
|
|
|
- .filter(child => child.props.displayName === 'TagSelectOption')
|
|
|
+ .filter(child => this.isTagSelectOption(child))
|
|
|
.map(child => child.props.value);
|
|
|
return checkedTags;
|
|
|
}
|
|
|
@@ -66,12 +61,7 @@ class TagSelect extends Component {
|
|
|
checkedTags.splice(index, 1);
|
|
|
}
|
|
|
|
|
|
- const tags = this.getAllTags();
|
|
|
-
|
|
|
- this.setState({
|
|
|
- checkedAll: tags.length === checkedTags.length,
|
|
|
- checkedTags,
|
|
|
- });
|
|
|
+ this.setState({ checkedTags });
|
|
|
|
|
|
if (onChange) {
|
|
|
onChange(checkedTags);
|
|
|
@@ -84,10 +74,18 @@ class TagSelect extends Component {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
+ isTagSelectOption = (node) => {
|
|
|
+ return node && node.type && (
|
|
|
+ node.type.isTagSelectOption || node.type.displayName === 'TagSelectOption'
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
render() {
|
|
|
- const { checkedTags, checkedAll, expand } = this.state;
|
|
|
+ const { checkedTags, expand } = this.state;
|
|
|
const { children, className, style, expandable } = this.props;
|
|
|
|
|
|
+ const checkedAll = this.getAllTags().length === checkedTags.length;
|
|
|
+
|
|
|
const cls = classNames(styles.tagSelect, className, {
|
|
|
[styles.hasExpandTag]: expandable,
|
|
|
[styles.expanded]: expand,
|
|
|
@@ -103,16 +101,22 @@ class TagSelect extends Component {
|
|
|
全部
|
|
|
</CheckableTag>
|
|
|
{
|
|
|
- checkedTags && children.filter(child => child.props.displayName === 'TagSelectOption').map(child => React.cloneElement(child, {
|
|
|
- key: `tag-select-${child.props.value}`,
|
|
|
- checked: checkedTags.indexOf(child.props.value) > -1,
|
|
|
- onChange: this.handleTagChange,
|
|
|
- }))
|
|
|
+ checkedTags && children
|
|
|
+ .map((child) => {
|
|
|
+ if (this.isTagSelectOption(child)) {
|
|
|
+ return React.cloneElement(child, {
|
|
|
+ key: `tag-select-${child.props.value}`,
|
|
|
+ checked: checkedTags.indexOf(child.props.value) > -1,
|
|
|
+ onChange: this.handleTagChange,
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return child;
|
|
|
+ })
|
|
|
}
|
|
|
{
|
|
|
expandable && (
|
|
|
<a className={styles.trigger} onClick={this.handleExpand}>
|
|
|
- { expand ? '收起' : '展开'} <Icon type={expand ? 'up' : 'down'} />
|
|
|
+ {expand ? '收起' : '展开'} <Icon type={expand ? 'up' : 'down'} />
|
|
|
</a>
|
|
|
)
|
|
|
}
|