Skip to content

Commit 4a5b934

Browse files
committed
feat: support showLineNumber, close #35 #48
1 parent 1469744 commit 4a5b934

File tree

8 files changed

+71
-45
lines changed

8 files changed

+71
-45
lines changed

example/App.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ export default defineComponent({
3737

3838
const onActiveChange = (key: string) => {
3939
state.activeKey = key;
40+
if (!state.opened.includes(key)) {
41+
state.opened.push(key);
42+
}
4043
};
4144

4245
return {

example/Basic.vue

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@
1818
<label>showLine</label>
1919
<input v-model="state.showLine" type="checkbox" />
2020
</div>
21+
<div>
22+
<label>showLineNumber</label>
23+
<input v-model="state.showLineNumber" type="checkbox" />
24+
</div>
2125
<div>
2226
<label>showDoubleQuotes</label>
2327
<input v-model="state.showDoubleQuotes" type="checkbox" />
@@ -58,9 +62,11 @@
5862
:show-double-quotes="state.showDoubleQuotes"
5963
:show-length="state.showLength"
6064
:show-line="state.showLine"
65+
:show-line-number="state.showLineNumber"
6166
:collapsed-on-click-brackets="state.collapsedOnClickBrackets"
6267
:custom-value-formatter="state.useCustomLinkFormatter ? customLinkFormatter : null"
6368
:show-icon="state.showIcon"
69+
style="position: relative"
6470
/>
6571
</div>
6672
</div>
@@ -85,9 +91,6 @@ const defaultData = {
8591
'Traffic paradise: How to design streets for people and unmanned vehicles in the future?',
8692
source: 'Netease smart',
8793
link: 'http://netease.smart/traffic-paradise/1235',
88-
author: {
89-
names: ['Daniel', 'Mike', 'John'],
90-
},
9194
},
9295
{
9396
news_id: 51182,
@@ -110,6 +113,7 @@ export default defineComponent({
110113
data: defaultData,
111114
showLength: false,
112115
showLine: true,
116+
showLineNumber: false,
113117
showDoubleQuotes: true,
114118
collapsedOnClickBrackets: true,
115119
useCustomLinkFormatter: false,

example/Editable.vue

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
<input v-model="state.showLine" type="checkbox" />
1616
</div>
1717
<div>
18-
<label>showDoubleQuotes</label>
19-
<input v-model="state.showDoubleQuotes" type="checkbox" />
18+
<label>showLineNumber</label>
19+
<input v-model="state.showLineNumber" type="checkbox" />
2020
</div>
2121
<div>
2222
<label>editable</label>
@@ -44,9 +44,10 @@
4444
<vue-json-pretty
4545
v-model:data="state.data"
4646
:deep="state.deep"
47-
:show-double-quotes="state.showDoubleQuotes"
47+
:show-double-quotes="true"
4848
:show-length="state.showLength"
4949
:show-line="state.showLine"
50+
:show-line-number="state.showLineNumber"
5051
:editable="state.editable"
5152
:editable-trigger="state.editableTrigger"
5253
/>
@@ -85,7 +86,7 @@ const defaultData = {
8586
};
8687
8788
export default defineComponent({
88-
name: 'SelectControl',
89+
name: 'Editable',
8990
components: {
9091
VueJsonPretty,
9192
},
@@ -95,7 +96,7 @@ export default defineComponent({
9596
data: defaultData,
9697
showLength: false,
9798
showLine: true,
98-
showDoubleQuotes: true,
99+
showLineNumber: false,
99100
editable: true,
100101
editableTrigger: 'click',
101102
deep: 3,

example/SelectControl.vue

Lines changed: 11 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66

77
<h3>Options:</h3>
88
<div class="options">
9+
<div>
10+
<label>showIcon</label>
11+
<input v-model="state.showIcon" type="checkbox" />
12+
</div>
913
<div>
1014
<label>selectableType</label>
1115
<select v-model="state.selectableType">
@@ -34,8 +38,8 @@
3438
<input v-model="state.showLine" type="checkbox" />
3539
</div>
3640
<div>
37-
<label>showDoubleQuotes</label>
38-
<input v-model="state.showDoubleQuotes" type="checkbox" />
41+
<label>showLineNumber</label>
42+
<input v-model="state.showLineNumber" type="checkbox" />
3943
</div>
4044
<div>
4145
<label>highlightSelectedNode</label>
@@ -53,10 +57,6 @@
5357
<option :value="4">4</option>
5458
</select>
5559
</div>
56-
<div>
57-
<label>use custom formatter</label>
58-
<input v-model="state.useCustomLinkFormatter" type="checkbox" />
59-
</div>
6060
</div>
6161
<h3>v-model:selectedValue:</h3>
6262
<div>{{ state.selectedValue }}</div>
@@ -75,16 +75,17 @@
7575
:data="state.data"
7676
:path="state.path"
7777
:deep="state.deep"
78-
:show-double-quotes="state.showDoubleQuotes"
78+
:show-double-quotes="true"
7979
:highlight-selected-node="state.highlightSelectedNode"
8080
:show-length="state.showLength"
8181
:show-line="state.showLine"
82+
:show-line-number="state.showLineNumber"
8283
:select-on-click-node="state.selectOnClickNode"
8384
:collapsed-on-click-brackets="state.collapsedOnClickBrackets"
8485
:path-selectable="(path, data) => typeof state.data !== 'number'"
8586
:selectable-type="state.selectableType"
8687
:show-select-controller="state.showSelectController"
87-
:custom-value-formatter="state.useCustomLinkFormatter ? customLinkFormatter : null"
88+
:show-icon="state.showIcon"
8889
@nodeClick="handleClick"
8990
@selectedChange="handleChange"
9091
/>
@@ -137,15 +138,15 @@ export default defineComponent({
137138
showSelectController: true,
138139
showLength: false,
139140
showLine: true,
140-
showDoubleQuotes: true,
141+
showLineNumber: false,
141142
highlightSelectedNode: true,
142143
selectOnClickNode: true,
143144
collapsedOnClickBrackets: true,
144-
useCustomLinkFormatter: false,
145145
path: 'res',
146146
deep: 3,
147147
itemData: {},
148148
itemPath: '',
149+
showIcon: false,
149150
});
150151
151152
const handleClick = (path, data) => {
@@ -158,14 +159,6 @@ export default defineComponent({
158159
// console.log('newVal: ', newVal, ' oldVal: ', oldVal);
159160
};
160161
161-
const customLinkFormatter = (data, key, path, defaultFormatted) => {
162-
if (typeof data === 'string' && data.startsWith('http://')) {
163-
return `<a style="color:red;" href="${data}" target="_blank">"${data}"</a>`;
164-
} else {
165-
return defaultFormatted;
166-
}
167-
};
168-
169162
watch(
170163
() => state.val,
171164
newVal => {
@@ -192,18 +185,8 @@ export default defineComponent({
192185
},
193186
);
194187
195-
watch(
196-
() => state.useCustomLinkFormatter,
197-
async () => {
198-
state.renderOK = false;
199-
await nextTick();
200-
state.renderOK = true;
201-
},
202-
);
203-
204188
return {
205189
state,
206-
customLinkFormatter,
207190
handleClick,
208191
handleChange,
209192
};

src/components/Tree/index.tsx

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
1-
import { defineComponent, reactive, computed, watchEffect, ref, PropType } from 'vue';
1+
import {
2+
defineComponent,
3+
reactive,
4+
computed,
5+
watchEffect,
6+
ref,
7+
PropType,
8+
CSSProperties,
9+
} from 'vue';
210
import TreeNode, { treeNodePropsPass, NodeDataType } from 'src/components/TreeNode';
311
import { emitError, jsonFlatten, JSONDataType, cloneDeep } from 'src/utils';
412
import './styles.less';
@@ -54,6 +62,7 @@ export default defineComponent({
5462
type: [String, Array] as PropType<string | string[]>,
5563
default: () => '',
5664
},
65+
style: Object as PropType<CSSProperties>,
5766
},
5867

5968
emits: ['nodeClick', 'bracketsClick', 'selectedChange', 'update:selectedValue', 'update:data'],
@@ -98,8 +107,9 @@ export default defineComponent({
98107
if (startHiddenItem && startHiddenItem.path === item.path) {
99108
const isObject = startHiddenItem.type === 'objectStart';
100109
const mergeItem = {
101-
...startHiddenItem,
102110
...item,
111+
...startHiddenItem,
112+
showComma: item.showComma,
103113
content: isObject ? '{...}' : '[...]',
104114
type: isObject ? 'objectCollapsed' : 'arrayCollapsed',
105115
} as NodeDataType;
@@ -203,7 +213,6 @@ export default defineComponent({
203213
const rootPath = props.path;
204214
new Function('data', 'val', `data${path.slice(rootPath.length)}=val`)(newData, value);
205215
emit('update:data', newData);
206-
console.log(newData);
207216
};
208217

209218
watchEffect(() => {
@@ -240,6 +249,7 @@ export default defineComponent({
240249
showDoubleQuotes,
241250
showLength,
242251
showLine,
252+
showLineNumber,
243253
showSelectController,
244254
selectOnClickNode,
245255
pathSelectable,
@@ -252,6 +262,7 @@ export default defineComponent({
252262
editable,
253263
editableTrigger,
254264
showIcon,
265+
style,
255266
} = this;
256267

257268
const { onTreeNodeClick, onBracketsClick, onSelectedChange, onTreeScroll, onValueChange } =
@@ -271,6 +282,7 @@ export default defineComponent({
271282
checked={selectedPaths.includes(item.path)}
272283
selectable-type={selectableType}
273284
show-line={showLine}
285+
show-line-number={showLineNumber}
274286
show-select-controller={showSelectController}
275287
select-on-click-node={selectOnClickNode}
276288
path-selectable={pathSelectable}
@@ -293,7 +305,12 @@ export default defineComponent({
293305
'vjs-tree': true,
294306
'is-virtual': virtual,
295307
}}
296-
onScroll={virtual ? onTreeScroll: undefined}
308+
onScroll={virtual ? onTreeScroll : undefined}
309+
style={
310+
showLineNumber
311+
? { paddingLeft: `${Number(flatData.length.toString().length) * 12}px`, ...style }
312+
: style
313+
}
297314
>
298315
{virtual ? (
299316
<div style={{ height: `${height}px` }}>

src/components/TreeNode/index.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ export const treeNodePropsPass = {
4242
type: Boolean,
4343
default: true,
4444
},
45+
showLineNumber: {
46+
type: Boolean,
47+
default: false,
48+
},
4549
// Whether to trigger selection when clicking on the node.
4650
selectOnClickNode: {
4751
type: Boolean,
@@ -227,9 +231,11 @@ export default defineComponent({
227231
showLength,
228232
collapsed,
229233
showLine,
234+
showLineNumber,
230235
editable,
231236
editableTrigger,
232237
showIcon,
238+
style,
233239
} = this;
234240

235241
const {
@@ -246,10 +252,14 @@ export default defineComponent({
246252
class={{
247253
'vjs-tree__node': true,
248254
'has-selector': showSelectController,
255+
'has-carets': showIcon,
249256
'is-highlight': highlightSelectedNode && checked,
250257
}}
251258
onClick={onNodeClick}
259+
style={style}
252260
>
261+
{showLineNumber && <span class="vjs-node__index">{node.id + 1}</span>}
262+
253263
{showSelectController &&
254264
state.selectable &&
255265
node.type !== 'objectEnd' &&

src/components/TreeNode/styles.less

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,13 @@
99
position: relative;
1010
line-height: 20px;
1111

12-
&.has-selector {
13-
padding-left: @selector-span;
12+
&.has-carets {
13+
padding-left: 15px;
14+
}
15+
16+
&.has-selector,
17+
&.has-carets.has-selector {
18+
padding-left: 30px;
1419
}
1520

1621
&.is-highlight,
@@ -32,6 +37,12 @@
3237
}
3338
}
3439

40+
.@{css-prefix}-node__index {
41+
position: absolute;
42+
right: 100%;
43+
margin-right: 4px;
44+
}
45+
3546
.@{css-prefix}-comment {
3647
color: @comment-color;
3748
}

src/themes.less

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,3 @@
2121

2222
/* common border-color */
2323
@border-color: #bfcbd9;
24-
25-
/* 左侧可选区域占用空间 */
26-
@selector-span: 30px;

0 commit comments

Comments
 (0)