Skip to content

feat(tree): add ellipsis #6817

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/tree/demos/enUS/index.demo-entry.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ override-click-behavior.vue
| expand-on-dragenter | `boolean` | `true` | Whether to expand nodes after dragenter. | |
| expand-on-click | `boolean` | `false` | Whether to expand or collapse nodes after click. | 2.29.1 |
| expanded-keys | `Array<string \| number>` | `undefined` | If set, expanded status will work in controlled manner. | |
| ellipsis | `boolean` | `false` | Whether to ellipsis the text that exceeds the width. | |
| filter | `(pattern: string, node: TreeOption) => boolean` | A simple string based filter. | The function that filter tree nodes based on pattern. | |
| get-children | `(option: any) => unknown` | `undefined` | Get children of the option. | 2.34.3 |
| indeterminate-keys | `Array<string \| number>` | `undefined` | Indeterminate keys of the tree. | |
Expand Down
55 changes: 55 additions & 0 deletions src/tree/demos/zhCN/ellipsis.demo.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<markdown>
# 省略

有时候节点的文本会很长,可以使用 `ellipsis` 来省略文本。
</markdown>

<script lang="ts">
import type { TreeOption } from 'naive-ui'
import { repeat } from 'seemly'
import { defineComponent, ref } from 'vue'

function createData(level = 4, baseKey = ''): TreeOption[] | undefined {
if (!level)
return undefined
return repeat(6 - level, undefined).map((_, index) => {
const key = `${baseKey}${level}${index}`
const label = createLabel(level)
return {
label,
key,
children: createData(level - 1, key)
}
})
}

function createLabel(level: number): string {
if (level === 4)
return '站在能分割世界的桥 还是看不清 在那些时刻 遮蔽我们 黑暗的心 究竟是什么'
if (level === 3)
return '住在我心里孤独的 孤独的海怪 痛苦之王 开始厌倦 深海的光 停滞的海浪 你的心里 有没有一点点想念我'
if (level === 2)
return '站在能看到灯火的桥 还是看不清 在那些夜晚 照亮我们 黑暗的心 究竟是什么'
if (level === 1)
return '于是他默默追逐着 横渡海峡 年轻的人 看着他们 为了彼岸 骄傲的 骄傲的 灭亡'
return ''
}

export default defineComponent({
setup() {
return {
data: createData(),
defaultExpandedKeys: ref(['40', '41'])
}
}
})
</script>

<template>
<n-tree
ellipsis
:data="data"
:default-expanded-keys="defaultExpandedKeys"
:selectable="false"
/>
</template>
2 changes: 2 additions & 0 deletions src/tree/demos/zhCN/index.demo-entry.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ node-props.vue
show-line.vue
checkbox-placement.vue
override-click-behavior.vue
ellipsis.vue
check-strategy-debug.vue
change-debug.vue
scrollbar-debug.vue
Expand Down Expand Up @@ -58,6 +59,7 @@ expand-debug.vue
| default-expanded-keys | `Array<string \| number>` | `[]` | 默认展开项 | |
| default-selected-keys | `Array<string \| number>` | `[]` | 默认选中的节点 | |
| draggable | `boolean` | `false` | 是否可拖拽 | |
| ellipsis | `boolean` | `false` | 是否省略超出宽度的文本 | |
| expand-on-dragenter | `boolean` | `true` | 是否在拖入后展开节点 | |
| expand-on-click | `boolean` | `false` | 是否在点击节点后展开或收缩节点 | 2.29.1 |
| expanded-keys | `Array<string \| number>` | `undefined` | 如果设定则展开受控 | |
Expand Down
14 changes: 10 additions & 4 deletions src/tree/src/Tree.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,9 @@ export function createTreeMateOptions<T>(
): TreeMateOptions<T, T, T> {
const settledGetChildren: GetChildren
= getChildren
|| ((node: T) => {
return (node as any)[childrenField]
})
|| ((node: T) => {
return (node as any)[childrenField]
})
return {
getIsGroup() {
return false
Expand Down Expand Up @@ -274,6 +274,10 @@ export const treeProps = {
type: Boolean,
default: true
},
ellipsis: {
type: Boolean,
default: false
},
checkboxPlacement: {
type: String as PropType<'left' | 'right'>,
default: 'left'
Expand Down Expand Up @@ -1748,6 +1752,7 @@ export default defineComponent({
blockLine,
draggable,
disabled,
ellipsis,
internalFocusable,
checkable,
handleKeydown,
Expand All @@ -1762,7 +1767,8 @@ export default defineComponent({
rtlEnabled && `${mergedClsPrefix}-tree--rtl`,
checkable && `${mergedClsPrefix}-tree--checkable`,
(blockLine || blockNode) && `${mergedClsPrefix}-tree--block-node`,
blockLine && `${mergedClsPrefix}-tree--block-line`
blockLine && `${mergedClsPrefix}-tree--block-line`,
ellipsis && `${mergedClsPrefix}-tree--ellipsis`
]
const createNode = (tmNode: TmNode | MotionData): VNode => {
return '__motion' in tmNode ? (
Expand Down
13 changes: 13 additions & 0 deletions src/tree/src/styles/index.cssr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,19 @@ export default cB('tree', `
`)
])
]),
cM('ellipsis', [
cB('tree-node', [
cB('tree-node-content', `
overflow: hidden;
`, [
cE('text', `
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
`)
])
])
]),
cB('tree-node-indent', `
flex-grow: 0;
flex-shrink: 0;
Expand Down