feat: handle uncheck tree and partial select
This commit is contained in:
parent
b6f621cdfe
commit
8698268836
1 changed files with 31 additions and 2 deletions
|
|
@ -41,6 +41,7 @@ const nodes = defineModel<Node[]>('nodes', { required: true });
|
|||
|
||||
const emits = defineEmits<{
|
||||
(e: 'checked'): void;
|
||||
(e: 'unchecked'): void;
|
||||
(e: 'select', node: Node, ancestor?: Node[]): void;
|
||||
(e: 'open', node: Node, ancestor?: Node[]): void;
|
||||
(e: 'delete', node: Node): void;
|
||||
|
|
@ -55,6 +56,15 @@ const maxLevel = computed(() =>
|
|||
}, 0),
|
||||
);
|
||||
|
||||
function recursiveSelect(node: Node) {
|
||||
if (node.children) {
|
||||
node.children.forEach((v) => {
|
||||
v.checked = true;
|
||||
recursiveSelect(v);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function recursiveDeselect(node: Node) {
|
||||
if (node.children) {
|
||||
node.children.forEach((v) => {
|
||||
|
|
@ -63,10 +73,17 @@ function recursiveDeselect(node: Node) {
|
|||
});
|
||||
}
|
||||
}
|
||||
|
||||
function toggleCheck(node: Node) {
|
||||
node.checked = !node.checked;
|
||||
if (node.checked === false) recursiveDeselect(node);
|
||||
if (node.checked === true) emits('checked');
|
||||
if (node.checked === false) {
|
||||
recursiveDeselect(node);
|
||||
emits('unchecked');
|
||||
}
|
||||
if (node.checked === true) {
|
||||
recursiveSelect(node);
|
||||
emits('checked');
|
||||
}
|
||||
}
|
||||
|
||||
function toggleExpand(node: Node, ancestor?: []) {
|
||||
|
|
@ -161,6 +178,10 @@ function toggleExpand(node: Node, ancestor?: []) {
|
|||
<input
|
||||
type="checkbox"
|
||||
v-model="node.checked"
|
||||
:indeterminate="
|
||||
node.children?.some((v) => !v.checked) &&
|
||||
!node.children?.every((v) => !v.checked)
|
||||
"
|
||||
:style="`accent-color: var(--blue-7)`"
|
||||
@click="toggleCheck(node)"
|
||||
/>
|
||||
|
|
@ -230,6 +251,14 @@ function toggleExpand(node: Node, ancestor?: []) {
|
|||
$emit('checked');
|
||||
}
|
||||
"
|
||||
@unchecked="
|
||||
() => {
|
||||
if (node.children?.every((v) => v.checked === false)) {
|
||||
node.checked = false;
|
||||
}
|
||||
$emit('checked');
|
||||
}
|
||||
"
|
||||
@select="
|
||||
(v) =>
|
||||
$emit(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue