Skip to content

Commit 5602315

Browse files
committed
feat: support renderNodeActions
1 parent 277bc33 commit 5602315

File tree

4 files changed

+51
-5
lines changed

4 files changed

+51
-5
lines changed

example/Basic.vue

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,14 @@
7272
<label>renderNodeValue</label>
7373
<input v-model="state.useRenderNodeValueSlot" type="checkbox" />
7474
</div>
75+
<div>
76+
<label>renderNodeActions</label>
77+
<select v-model="state.useRenderNodeActionsSlot">
78+
<option :value="false">default(false)</option>
79+
<option :value="true">true</option>
80+
<option value="custom">custom</option>
81+
</select>
82+
</div>
7583
</div>
7684
</div>
7785
<div class="block">
@@ -89,6 +97,7 @@
8997
:collapsed-on-click-brackets="state.collapsedOnClickBrackets"
9098
:show-icon="state.showIcon"
9199
:show-key-value-space="state.showKeyValueSpace"
100+
:render-node-actions="typeof state.useRenderNodeActionsSlot === 'boolean' ? state.useRenderNodeActionsSlot : undefined"
92101
style="position: relative"
93102
>
94103
<template v-if="state.useRenderNodeKeySlot" #renderNodeKey="{ node, defaultKey }">
@@ -104,6 +113,11 @@
104113
</template>
105114
<template v-else>{{ defaultValue }}</template>
106115
</template>
116+
117+
<template v-if="state.useRenderNodeActionsSlot === 'custom'" #renderNodeActions="{ node, defaultActions }">
118+
<span><a :href="node.content" target="_blank">link</a></span>
119+
<span @click="defaultActions.copy" style="margin-left: 4px;">copy</span>
120+
</template>
107121
</vue-json-pretty>
108122
</div>
109123
</div>
@@ -158,6 +172,7 @@ export default defineComponent({
158172
collapsedOnClickBrackets: true,
159173
useRenderNodeKeySlot: false,
160174
useRenderNodeValueSlot: false,
175+
useRenderNodeActionsSlot: false,
161176
indent: 2,
162177
deep: 4,
163178
setPathCollapsible: false,

src/components/Tree/index.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ export default defineComponent({
6666
},
6767
},
6868

69-
slots: ['renderNodeKey', 'renderNodeValue'],
69+
slots: ['renderNodeKey', 'renderNodeValue', 'renderNodeActions'],
7070

7171
emits: [
7272
'nodeClick',
@@ -272,7 +272,8 @@ export default defineComponent({
272272
return () => {
273273
const renderNodeKey = props.renderNodeKey ?? slots.renderNodeKey;
274274
const renderNodeValue = props.renderNodeValue ?? slots.renderNodeValue;
275-
275+
const renderNodeActions = props.renderNodeActions || slots.renderNodeActions || false;
276+
276277
const nodeContent =
277278
state.visibleData &&
278279
state.visibleData.map(item => (
@@ -300,6 +301,7 @@ export default defineComponent({
300301
showKeyValueSpace={props.showKeyValueSpace}
301302
renderNodeKey={renderNodeKey}
302303
renderNodeValue={renderNodeValue}
304+
renderNodeActions={renderNodeActions}
303305
onNodeClick={handleNodeClick}
304306
onNodeMouseover={handleNodeMouseover}
305307
onBracketsClick={handleBracketsClick}

src/components/TreeNode/index.tsx

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,13 @@ export const treeNodePropsPass = {
4444
renderNodeValue: Function as PropType<
4545
(opt: { node: NodeDataType; defaultValue: string | JSX.Element }) => unknown
4646
>,
47+
// Custom render for node actions.
48+
renderNodeActions: {
49+
type: [Boolean, Function] as PropType<
50+
boolean | ((opt: { node: NodeDataType; defaultActions: { copy: () => void } }) => unknown)
51+
>,
52+
default: false,
53+
},
4754
// Define the selection method supported by the data level, which is not available by default.
4855
selectableType: String as PropType<'multiple' | 'single' | ''>,
4956
// Whether to display the selection control.
@@ -239,6 +246,18 @@ export default defineComponent({
239246
copy(copiedData);
240247
}
241248

249+
const renderNodeActions = () => {
250+
const render = props.renderNodeActions;
251+
if (render === false) return null;
252+
else if (render === true) return <span onClick={handleCopy} class="vjs-tree-node-actions-item">copy</span>;
253+
const defaultActions = {
254+
copy: handleCopy,
255+
};
256+
return render
257+
? render({ node: props.node, defaultActions })
258+
: null;
259+
};
260+
242261
return () => {
243262
const { node } = props;
244263

@@ -333,9 +352,11 @@ export default defineComponent({
333352
)}
334353
</span>
335354

336-
<span class="vjs-tree-node-actions">
337-
<span onClick={handleCopy}>copy</span>
338-
</span>
355+
{props.renderNodeActions !== false && (
356+
<span class="vjs-tree-node-actions">
357+
{ renderNodeActions() }
358+
</span>
359+
)}
339360
</div>
340361
);
341362
};

src/components/TreeNode/styles.less

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,14 @@
4747
padding: 0 4px;
4848
background-color: @highlight-bg-color;
4949
border-radius: 4px;
50+
51+
.@{css-prefix}-tree-node-actions-item {
52+
cursor: pointer;
53+
54+
&:hover {
55+
color: @color-primary;
56+
}
57+
}
5058
}
5159

5260
&.dark {

0 commit comments

Comments
 (0)