Skip to content

feat: add dashDensity in showLine #101

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

Merged
merged 1 commit into from
Aug 10, 2024
Merged
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
8 changes: 7 additions & 1 deletion examples/Feature.vue
Original file line number Diff line number Diff line change
@@ -147,7 +147,7 @@
<div style="height: 300px">
<VTree
:data="showLineTreeData"
:showLine="{ type: showLineType, polyline: showLinePolyline }"
:showLine="{ type: showLineType, polyline: showLinePolyline, dashDensity }"
defaultExpandAll
animation
/>
@@ -169,6 +169,9 @@
{{ showLineType }}
</button>
<p>当前连接线类型:{{showLineType}}</p>
<p v-if="showLineType === 'dashed'">
虚线密度:<input type="range" v-model.number="dashDensity" :min="1" :max="10" :step="1" /> {{ dashDensity }}
</p>
</div>
<div class="desc-block">
showLine.polyline:
@@ -437,6 +440,8 @@ export default defineComponent({
showLineType.value = type
}

const dashDensity = ref(3)

const showLinePolyline = ref(false)
const onShowLinePolylineBtnClick = (polyline: boolean) => {
showLinePolyline.value = polyline
@@ -485,6 +490,7 @@ export default defineComponent({
onShowLineTypeBtnClick,
showLinePolyline,
onShowLinePolylineBtnClick,
dashDensity,

// 自定义节点
nodeSlotDescText,
3 changes: 1 addition & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@wsfe/vue-tree",
"version": "4.0.1",
"version": "4.1.0",
"types": "./types",
"description": "A vue tree component using virtual list.",
"main": "./dist/vue-tree.umd.js",
@@ -67,7 +67,6 @@
"@vue/repl": "^4.3.0",
"@vue/test-utils": "^2.4.6",
"@vue/vue3-jest": "^29.2.6",
"@wsfe/vue-tree": "^4.0.1",
"autoprefixer": "^10.4.19",
"happy-dom": "^14.12.0",
"less": "^4.2.0",
7 changes: 0 additions & 7 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions site/.vitepress/code/ShowLine.vue
Original file line number Diff line number Diff line change
@@ -19,6 +19,12 @@
<input type="radio" id="showline-polyline-false" :value="false" v-model="polyline" />
<label for="showline-polyline-false">false</label>
</div>

<div v-if="type === 'dashed'">
<span>showLine.dashDensity: </span>
<input type="range" :min="1" :max="10" :step="1" v-model.number="dashDensity" />
<span>{{ dashDensity }}</span>
</div>
</div>
<VTree :data="data" :showLine="showLine" animation defaultExpandAll />
</template>
@@ -29,11 +35,13 @@ import VTree from '@wsfe/vue-tree'

const type = ref('solid')
const polyline = ref(false)
const dashDensity = ref(3)

const showLine = computed(() => {
return {
type: type.value,
polyline: polyline.value,
dashDensity: dashDensity.value,
}
})

2 changes: 1 addition & 1 deletion site/.vitepress/components/PlaygroundLink.vue
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<template>
<a :href="withBase(`/playground${serializedCode}`)" target="_blank" rel="noreferrer noopener">{{ text || i18n.openInPlayground }}</a>
<a :href="withBase('/playground') + serializedCode" target="_blank" rel="noreferrer noopener">{{ text || i18n.openInPlayground }}</a>
</template>

<script setup lang="ts">
9 changes: 9 additions & 0 deletions site/.vitepress/config.mts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import path from 'node:path'
import { defineConfig } from 'vitepress'
import zh from './zh.mjs'
import en from './en.mjs'
@@ -31,6 +32,14 @@ export default defineConfig({
{ icon: 'github', link: 'https://github.com/wsfe/vue-tree' }
]
},
vite: {
resolve: {
alias: {
'@wsfe/vue-tree/style.css': path.resolve('src/styles/index.less'),
'@wsfe/vue-tree': path.resolve('src'),
},
},
},

locales: {
root: {
74 changes: 37 additions & 37 deletions site/api/vtree.md

Large diffs are not rendered by default.

74 changes: 37 additions & 37 deletions site/en/api/vtree.md

Large diffs are not rendered by default.

19 changes: 13 additions & 6 deletions src/components/TreeNode.vue
Original file line number Diff line number Diff line change
@@ -10,9 +10,9 @@
width: `${nodeIndent}px`,
}"
>
<polyline
<path
fill="none"
:points="polylinePoints(index === data._level - 1)"
:d="polylinePoints(index === data._level - 1)"
:stroke-width="strokeWidth"
:stroke="showLineParams.color"
:stroke-dasharray="strokeDasharray"
@@ -114,14 +114,21 @@ const showLineParams = computed(() => {
type: showLineType.solid,
color: '#D3D3D3',
polyline: false,
dashDensity: 3,
}
let params: Required<ShowLine> = defaultParams
if (typeof props.showLine === 'object') {
let dashDensity = defaultParams.dashDensity
if (typeof props.showLine.dashDensity === 'number' && props.showLine.dashDensity >= 1 && props.showLine.dashDensity <= 10) {
dashDensity = props.showLine.dashDensity
}

params = {
width: props.showLine.width ?? defaultParams.width,
type: props.showLine.type ?? defaultParams.type,
color: props.showLine.color ?? defaultParams.color,
polyline: props.showLine.polyline ?? defaultParams.polyline,
dashDensity,
}
}
return params
@@ -132,18 +139,18 @@ const strokeWidth = computed(() => showLineParams.value.width * 100 / props.node
const strokeDasharray = computed(() => {
switch (showLineParams.value.type) {
case showLineType.dashed:
return '25'
return 100 / (showLineParams.value.dashDensity * 2)
default:
break
}
return 'none'
})

const polylinePoints = (isDirectParentLine: boolean) => {
if (!showLineParams.value.polyline || !isDirectParentLine) return '50,0 50,100'
if (!showLineParams.value.polyline || !isDirectParentLine) return 'M50,0 L50,100'
const parent = props.getNode(props.data[props.keyField])?._parent
if (parent && props.noSiblingNodeMap[parent[props.keyField]] && props.noSiblingNodeMap[props.data[props.keyField]]) return '50,0 50,50 100,50 50,50'
return '50,0 50,50 100,50 50,50 50,100'
if (parent && props.noSiblingNodeMap[parent[props.keyField]] && props.noSiblingNodeMap[props.data[props.keyField]]) return 'M50,0 L50,50 M100,50 L50,50'
return 'M50,0 L50,100 M100,50 L50,50'
}

const {
8 changes: 8 additions & 0 deletions src/types/index.ts
Original file line number Diff line number Diff line change
@@ -31,10 +31,18 @@ export interface INonReactiveData {
blockNodes: TreeNode[]
}

// Utils to generate types like 1 | 2 | 3
type Enumerate<N extends number, Acc extends number[] = []> = Acc['length'] extends N
? Acc[number]
: Enumerate<N, [...Acc, Acc['length']]>

type IntRange<F extends number, T extends number> = Exclude<Enumerate<T>, Enumerate<F>>

export interface ShowLine {
/** 连接线宽度,svg stroke-width, 默认 1px */
width?: number
type?: showLineType
color?: string
polyline?: boolean
dashDensity?: IntRange<1, 11>
}