From 37fa931debf27a5a9d59e8063cdc7feb457087da Mon Sep 17 00:00:00 2001 From: myronliu347 Date: Tue, 19 Feb 2019 18:16:23 +0800 Subject: [PATCH] feat(Tree): support rtl --- src/tree/main.scss | 2 ++ src/tree/rtl.scss | 34 ++++++++++++++++++++++++++++++++++ src/tree/view/tree-node.jsx | 11 ++++++++++- src/tree/view/tree.jsx | 13 +++++++++++-- 4 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 src/tree/rtl.scss diff --git a/src/tree/main.scss b/src/tree/main.scss index 0f9a2290e1..4496462b2c 100644 --- a/src/tree/main.scss +++ b/src/tree/main.scss @@ -272,3 +272,5 @@ } } } + +@import './rtl.scss'; diff --git a/src/tree/rtl.scss b/src/tree/rtl.scss new file mode 100644 index 0000000000..4aea9f3550 --- /dev/null +++ b/src/tree/rtl.scss @@ -0,0 +1,34 @@ +#{$tree-prefix}[dir='rtl'] { + #{$tree-prefix} { + &-switcher { + margin-left: $tree-switch-margint-right; + margin-right: 0; + } + &-switcher.#{$css-prefix}noop-line-noroot { + border-left: none; + border-right: $tree-switch-border-width $line-solid $tree-line-color; + } + &-right-angle { + left: auto; + right: - ($tree-child-indent-right + $tree-line-width + $tree-switch-border-width); + border-left: none; + border-right: $tree-line; + } + } + + &.#{$css-prefix}show-line #{$tree-prefix}-node #{$tree-prefix}-node:not(:last-child) { + margin-left: 0; + margin-right: $tree-child-indent-left; + border-left: none; + border-right: $tree-line; + padding-left: 0; + padding-right: $tree-child-indent-right; + } + + &.#{$css-prefix}node-indent { + #{$tree-prefix}-node #{$tree-prefix}-node { + margin-left: 0; + margin-right: $tree-child-indent; + } + } +} diff --git a/src/tree/view/tree-node.jsx b/src/tree/view/tree-node.jsx index bc3ffe993f..63ba1c6143 100644 --- a/src/tree/view/tree-node.jsx +++ b/src/tree/view/tree-node.jsx @@ -20,6 +20,7 @@ export default class TreeNode extends Component { static propTypes = { _key: PropTypes.string, prefix: PropTypes.string, + rtl: PropTypes.bool, className: PropTypes.string, /** * 树节点 @@ -73,6 +74,7 @@ export default class TreeNode extends Component { static defaultProps = { label: '---', + rtl: false, disabled: false, checkboxDisabled: false, isLeaf: false @@ -418,6 +420,7 @@ export default class TreeNode extends Component { render() { const { prefix, + rtl, className, children, isLeaf, @@ -459,7 +462,9 @@ export default class TreeNode extends Component { const defaultPaddingLeft = typeof isNodeBlock === 'object' ? parseInt(isNodeBlock.defaultPaddingLeft || 0) : 0; const indent = typeof isNodeBlock === 'object' ? parseInt(isNodeBlock.indent || 24) : 24; const level = pos.split('-').length - 2; - const innerStyle = isNodeBlock ? { paddingLeft: `${indent * level + defaultPaddingLeft}px` } : null; + const paddingLeftProp = rtl ? 'paddingRight' : 'paddingLeft'; + + const innerStyle = isNodeBlock ? { [paddingLeftProp]: `${indent * level + defaultPaddingLeft}px` } : null; const innerProps = { className: innerClassName, style: innerStyle, @@ -476,6 +481,10 @@ export default class TreeNode extends Component { innerProps.tabIndex = root.tabbableKey === _key ? '0' : '-1'; + if (rtl) { + others.dir = 'rtl'; + } + return (
  • { return data.map((item, index) => { const pos = `${prefix}-${index}`; @@ -881,7 +884,7 @@ export default class Tree extends Component { if (children && children.length) { props.children = loop(children, pos); } - const node = ; + const node = ; this._k2n[key].node = node; return node; }); @@ -891,6 +894,7 @@ export default class Tree extends Component { } renderByChildren() { + const { rtl } = this.props; const loop = (children, prefix = '0') => { return Children.map(children, (child, index) => { const pos = `${prefix}-${index}`; @@ -901,6 +905,7 @@ export default class Tree extends Component { } props._key = key; + props.rtl = rtl; const node = cloneElement(child, props); this._k2n[key].node = node; @@ -912,9 +917,13 @@ export default class Tree extends Component { } render() { - const { prefix, className, dataSource, showLine, isNodeBlock, isLabelBlock } = this.props; + const { prefix, rtl, className, dataSource, showLine, isNodeBlock, isLabelBlock } = this.props; const others = pickOthers(Object.keys(Tree.propTypes), this.props); + if (rtl) { + others.dir = 'rtl'; + } + const newClassName = cx({ [`${prefix}tree`]: true, [`${prefix}label-block`]: isLabelBlock,