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<{
|
const emits = defineEmits<{
|
||||||
(e: 'checked'): void;
|
(e: 'checked'): void;
|
||||||
|
(e: 'unchecked'): void;
|
||||||
(e: 'select', node: Node, ancestor?: Node[]): void;
|
(e: 'select', node: Node, ancestor?: Node[]): void;
|
||||||
(e: 'open', node: Node, ancestor?: Node[]): void;
|
(e: 'open', node: Node, ancestor?: Node[]): void;
|
||||||
(e: 'delete', node: Node): void;
|
(e: 'delete', node: Node): void;
|
||||||
|
|
@ -55,6 +56,15 @@ const maxLevel = computed(() =>
|
||||||
}, 0),
|
}, 0),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
function recursiveSelect(node: Node) {
|
||||||
|
if (node.children) {
|
||||||
|
node.children.forEach((v) => {
|
||||||
|
v.checked = true;
|
||||||
|
recursiveSelect(v);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function recursiveDeselect(node: Node) {
|
function recursiveDeselect(node: Node) {
|
||||||
if (node.children) {
|
if (node.children) {
|
||||||
node.children.forEach((v) => {
|
node.children.forEach((v) => {
|
||||||
|
|
@ -63,10 +73,17 @@ function recursiveDeselect(node: Node) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function toggleCheck(node: Node) {
|
function toggleCheck(node: Node) {
|
||||||
node.checked = !node.checked;
|
node.checked = !node.checked;
|
||||||
if (node.checked === false) recursiveDeselect(node);
|
if (node.checked === false) {
|
||||||
if (node.checked === true) emits('checked');
|
recursiveDeselect(node);
|
||||||
|
emits('unchecked');
|
||||||
|
}
|
||||||
|
if (node.checked === true) {
|
||||||
|
recursiveSelect(node);
|
||||||
|
emits('checked');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function toggleExpand(node: Node, ancestor?: []) {
|
function toggleExpand(node: Node, ancestor?: []) {
|
||||||
|
|
@ -161,6 +178,10 @@ function toggleExpand(node: Node, ancestor?: []) {
|
||||||
<input
|
<input
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
v-model="node.checked"
|
v-model="node.checked"
|
||||||
|
:indeterminate="
|
||||||
|
node.children?.some((v) => !v.checked) &&
|
||||||
|
!node.children?.every((v) => !v.checked)
|
||||||
|
"
|
||||||
:style="`accent-color: var(--blue-7)`"
|
:style="`accent-color: var(--blue-7)`"
|
||||||
@click="toggleCheck(node)"
|
@click="toggleCheck(node)"
|
||||||
/>
|
/>
|
||||||
|
|
@ -230,6 +251,14 @@ function toggleExpand(node: Node, ancestor?: []) {
|
||||||
$emit('checked');
|
$emit('checked');
|
||||||
}
|
}
|
||||||
"
|
"
|
||||||
|
@unchecked="
|
||||||
|
() => {
|
||||||
|
if (node.children?.every((v) => v.checked === false)) {
|
||||||
|
node.checked = false;
|
||||||
|
}
|
||||||
|
$emit('checked');
|
||||||
|
}
|
||||||
|
"
|
||||||
@select="
|
@select="
|
||||||
(v) =>
|
(v) =>
|
||||||
$emit(
|
$emit(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue