Skip to content

Commit 629cd27

Browse files
committed
Add treeNodeActivate event
1 parent 483eb79 commit 629cd27

File tree

7 files changed

+40
-18
lines changed

7 files changed

+40
-18
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@grapoza/vue-tree",
3-
"version": "6.0.0",
3+
"version": "6.1.0",
44
"description": "Tree components for Vue 3",
55
"author": "Gregg Rapoza <grapoza@gmail.com>",
66
"license": "MIT",

src/components/TreeView.spec.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -648,6 +648,19 @@ describe('TreeView.vue', () => {
648648
});
649649
});
650650

651+
describe('when a node fires a treeNodeActivate event', () => {
652+
653+
beforeEach(async () => {
654+
const { nodes, modelDefaults } = generateNodes(['es']);
655+
wrapper = await createWrapper({ modelValue: nodes, modelDefaults, selectionMode: SelectionMode.Multiple });
656+
wrapper.findComponent(TreeViewNode).vm.$emit("treeNodeActivate", wrapper.vm.metaModel[0]);
657+
});
658+
659+
it('should emit a treeNodeActivate event', () => {
660+
expect(wrapper.emitted('treeNodeActivate').length).to.equal(1);
661+
});
662+
});
663+
651664
describe('when created with nodes that do not contain an explicit id property', () => {
652665

653666
it('should fall back to the id property (note: this test is testing implementation [v-for iteration key for nodes] and not functionality)', async () => {

src/components/TreeView.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
@treeNodeExpandedChange="(t)=>$emit(TreeEvent.ExpandedChange, t)"
2626
@treeNodeChildrenLoad="(t)=>$emit(TreeEvent.ChildrenLoad, t)"
2727
@treeNodeSelectedChange="handleNodeSelectedChange"
28+
@treeNodeActivate="(t)=>$emit(TreeEvent.Activate, t)"
2829
@treeNodeAdd="(t, p)=>$emit(TreeEvent.Add, t, p)"
2930
@treeNodeDelete="handleChildDeletion"
3031
@treeNodeAriaFocusableChange="handleFocusableChange"
@@ -129,6 +130,7 @@ const model = defineModel({ type: Array, required: true });
129130
// EMITS
130131
131132
const emit = defineEmits([
133+
TreeEvent.Activate,
132134
TreeEvent.Add,
133135
TreeEvent.CheckboxChange,
134136
TreeEvent.ChildrenLoad,

src/components/TreeViewNode.spec.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1762,17 +1762,17 @@ describe('TreeViewNode.vue', () => {
17621762
});
17631763
});
17641764

1765-
describe('and the node does not have an input', () => {
1765+
describe('always', () => {
17661766

17671767
beforeEach(async () => {
17681768
let defaultProps = getDefaultPropsData();
17691769
wrapper = await createWrapper(Object.assign(defaultProps, { modelValue: generateMetaNodes(['es'])[0] }));
17701770
await triggerKeydown(wrapper, wrapper.vm.ariaKeyMap.activateItem[0]);
17711771
});
17721772

1773-
it('should not fire any custom events', () => {
1774-
expect(Object.getOwnPropertyNames(wrapper.emitted()).length).to.equal(1);
1775-
expect(Object.getOwnPropertyNames(wrapper.emitted())[0]).to.equal('keydown');
1773+
it('should emit a treeNodeActivate event', () => {
1774+
expect(wrapper.emitted().treeNodeActivate).to.be.an("array").that.has.length(1);
1775+
expect(wrapper.emitted().treeNodeActivate[0][0]).to.equal(wrapper.vm.metaModel);
17761776
});
17771777
});
17781778
});

src/components/TreeViewNode.vue

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@
204204
@treeNodeExpandedChange="(t)=>$emit(TreeEvent.ExpandedChange, t)"
205205
@treeNodeChildrenLoad="(t)=>$emit(TreeEvent.ChildrenLoad, t)"
206206
@treeNodeSelectedChange="(t)=>$emit(TreeEvent.SelectedChange, t)"
207+
@treeNodeActivate="(t)=>$emit(TreeEvent.Activate, t)"
207208
@treeNodeAdd="(t, p)=>$emit(TreeEvent.Add, t, p)"
208209
@treeNodeDelete="handleChildDeletion"
209210
@treeNodeAriaFocusableChange="(t)=>$emit(TreeEvent.FocusableChange, t)"
@@ -290,6 +291,7 @@ const props = defineProps({
290291
// EMITS
291292
292293
const emit = defineEmits([
294+
TreeEvent.Activate,
293295
TreeEvent.Add,
294296
TreeEvent.Click,
295297
TreeEvent.CheckboxChange,
@@ -524,6 +526,9 @@ function onKeyDown(event) {
524526
target.dispatchEvent(clickEvent);
525527
}
526528
}
529+
530+
// Bubble activation out so users can apply handling for any kind of node
531+
emit(TreeEvent.Activate, metaModel.value);
527532
}
528533
else if (props.ariaKeyMap.selectItem.includes(event.keyCode)) {
529534
// Toggles selection for the focused node.

src/enums/event.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const events = Object.freeze({
1111
ExpandedChange: 'treeNodeExpandedChange',
1212
ChildrenLoad: 'treeNodeChildrenLoad',
1313
SelectedChange: 'treeNodeSelectedChange',
14+
Activate: 'treeNodeActivate',
1415

1516
// Focus
1617
FocusableChange: 'treeNodeAriaFocusableChange',

src/stories/Home.stories.mdx

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -294,19 +294,20 @@ The `modelDefaults` property's return value contains any data about the node's c
294294

295295
## Events
296296

297-
| Event | Description | Handler Parameters |
298-
|:----------------------------|:---------------------------------------------------------------|:----------------------------------------------------------------------------|
299-
| treeNodeAdd | Emitted when a node is added | `target` The meta model of the target (child) node <br/> `parent` The model of the parent node |
300-
| treeNodeClick | Emitted when a node is clicked | `target` The meta model of the target node <br/> `event` The original event |
301-
| treeNodeDblclick | Emitted when a node is double clicked | `target` The meta model of the target node <br/> `event` The original event |
302-
| treeNodeDelete | Emitted when a node is deleted | `target` The meta model of the target node |
303-
| treeNodeCheckboxChange | Emitted when a node's checkbox emits a change event | `target` The meta model of the target node <br/> `event` The original event |
304-
| treeNodeChildCheckboxChange | Emitted when a child node's checkbox emits a change event | `target` The meta model of the target node (the parent of the changed node) <br/> `child` The model of changed node <br/> `event` The original event |
305-
| treeNodeRadioChange | Emitted when a node's radio button emits a change event | `target` The meta model of the target node <br/> `event` The original event |
306-
| treeNodeExpandedChange | Emitted when a node is expanded or collapsed | `target` The meta model of the target node |
307-
| treeNodeSelectedChange | Emitted when a node is selected or deselected | `target` The meta model of the target node |
308-
| treeNodeChildrenLoad | Emitted when a node's children are done loading asynchronously | `target` The meta model of the target node |
309-
| treeRootNodesLoad | Emitted when the root nodes are done loading asynchronously | |
297+
| Event | Description | Handler Parameters |
298+
|:----------------------------|:-----------------------------------------------------------------|:----------------------------------------------------------------------------|
299+
| treeNodeAdd | Emitted when a node is added | `target` The meta model of the target (child) node <br/> `parent` The model of the parent node |
300+
| treeNodeClick | Emitted when a node is clicked | `target` The meta model of the target node <br/> `event` The original event |
301+
| treeNodeDblclick | Emitted when a node is double clicked | `target` The meta model of the target node <br/> `event` The original event |
302+
| treeNodeDelete | Emitted when a node is deleted | `target` The meta model of the target node |
303+
| treeNodeCheckboxChange | Emitted when a node's checkbox emits a change event | `target` The meta model of the target node <br/> `event` The original event |
304+
| treeNodeChildCheckboxChange | Emitted when a child node's checkbox emits a change event | `target` The meta model of the target node (the parent of the changed node) <br/> `child` The model of changed node <br/> `event` The original event |
305+
| treeNodeRadioChange | Emitted when a node's radio button emits a change event | `target` The meta model of the target node <br/> `event` The original event |
306+
| treeNodeExpandedChange | Emitted when a node is expanded or collapsed | `target` The meta model of the target node |
307+
| treeNodeSelectedChange | Emitted when a node is selected or deselected | `target` The meta model of the target node |
308+
| treeNodeActivate | Emitted when a node is focused and the activation key is pressed | `target` The meta model of the target node |
309+
| treeNodeChildrenLoad | Emitted when a node's children are done loading asynchronously | `target` The meta model of the target node |
310+
| treeRootNodesLoad | Emitted when the root nodes are done loading asynchronously | |
310311

311312
## CSS Classes
312313

0 commit comments

Comments
 (0)