feat: add check behaviour
This commit is contained in:
parent
d057499418
commit
479b933a54
1 changed files with 33 additions and 3 deletions
|
|
@ -24,7 +24,27 @@ type Props = {
|
||||||
const props = defineProps<Props>();
|
const props = defineProps<Props>();
|
||||||
const nodes = defineModel<Node[]>('nodes', { required: true });
|
const nodes = defineModel<Node[]>('nodes', { required: true });
|
||||||
|
|
||||||
|
const emits = defineEmits<{ (e: 'checked'): void }>();
|
||||||
|
|
||||||
const dec = props.decoration?.find((v) => v.level === (props.level || 0));
|
const dec = props.decoration?.find((v) => v.level === (props.level || 0));
|
||||||
|
|
||||||
|
function recursiveDeselect(node: Node) {
|
||||||
|
if (node.children) {
|
||||||
|
node.children.forEach((v) => {
|
||||||
|
v.selected = false;
|
||||||
|
recursiveDeselect(v);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function toggleCheck(node: Node) {
|
||||||
|
node.selected = !node.selected;
|
||||||
|
if (node.selected === false) recursiveDeselect(node);
|
||||||
|
if (node.selected === true) emits('checked');
|
||||||
|
}
|
||||||
|
|
||||||
|
function toggleExpand(node: Node) {
|
||||||
|
node.opened = !node.opened;
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
|
@ -33,16 +53,20 @@ const dec = props.decoration?.find((v) => v.level === (props.level || 0));
|
||||||
<slot
|
<slot
|
||||||
v-if="$slots['item']"
|
v-if="$slots['item']"
|
||||||
name="item"
|
name="item"
|
||||||
:data="{ node, onclick: () => (node.selected = !node.selected) }"
|
:data="{ node, toggleExpand, toggleCheck }"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<div
|
<div
|
||||||
class="item__content row items-center no-wrap"
|
class="item__content row items-center no-wrap"
|
||||||
@click="node.opened = expandable ? !node.opened : node.opened"
|
@click="toggleExpand(node)"
|
||||||
>
|
>
|
||||||
<label class="flex items-center item__checkbox" @click.stop>
|
<label class="flex items-center item__checkbox" @click.stop>
|
||||||
<input type="checkbox" v-model="node.selected" />
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
v-model="node.selected"
|
||||||
|
@click="toggleCheck(node)"
|
||||||
|
/>
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
|
|
@ -73,6 +97,12 @@ const dec = props.decoration?.find((v) => v.level === (props.level || 0));
|
||||||
class="item__children"
|
class="item__children"
|
||||||
v-if="node.children"
|
v-if="node.children"
|
||||||
v-model:nodes="node.children"
|
v-model:nodes="node.children"
|
||||||
|
@checked="
|
||||||
|
() => {
|
||||||
|
node.selected = true;
|
||||||
|
$emit('checked');
|
||||||
|
}
|
||||||
|
"
|
||||||
:level="(level || 0) + 1"
|
:level="(level || 0) + 1"
|
||||||
:expandable
|
:expandable
|
||||||
:decoration
|
:decoration
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue