feat: dropdown tree selection.
This commit is contained in:
+67
-7
@@ -721,31 +721,91 @@ export class Dropdown {
|
|||||||
source.forEach(it => it.__checked = allchecked ? 1 : 0);
|
source.forEach(it => it.__checked = allchecked ? 1 : 0);
|
||||||
list = [];
|
list = [];
|
||||||
} else {
|
} else {
|
||||||
item.__checked = checkbox.indeterminate ? 2 : checkbox.checked ? 1 : 0;
|
|
||||||
const all = this._var.container.querySelector('input[isall="1"]');
|
const all = this._var.container.querySelector('input[isall="1"]');
|
||||||
|
const val = checkbox.dataset.value;
|
||||||
|
const getSelectedList = () => {
|
||||||
|
const list = [];
|
||||||
|
const cache = {};
|
||||||
|
source.filter(it => it.__p == null).forEach(it => {
|
||||||
|
if (it.__checked === 1) {
|
||||||
|
list.push(it);
|
||||||
|
cache[getValue(it, valuekey, textkey)] = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
source.filter(it => it.__p != null).forEach(it => {
|
||||||
|
if (cache[it.__p]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (it.__checked === 1) {
|
||||||
|
list.push(it);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return list;
|
||||||
|
};
|
||||||
if (checkbox.checked) {
|
if (checkbox.checked) {
|
||||||
if (source.some(it => it.__checked) == null) {
|
item.__checked = 1;
|
||||||
|
if (item.__p != null) {
|
||||||
|
// parent
|
||||||
|
if (!source.filter(it => it.__p === item.__p).some(it => it.__checked !== 1)) {
|
||||||
|
const parent = source.filter(it => String(getValue(it, valuekey, textkey)) === item.__p)[0];
|
||||||
|
if (parent != null) {
|
||||||
|
parent.__checked = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (item.children?.length > 0) {
|
||||||
|
// children
|
||||||
|
source.filter(it => it.__p === val).forEach(it => it.__checked = 1);
|
||||||
|
}
|
||||||
|
if (!source.some(it => it.__checked !== 1)) {
|
||||||
this._var.allChecked = true;
|
this._var.allChecked = true;
|
||||||
if (all != null) {
|
if (all != null) {
|
||||||
all.checked = true;
|
all.checked = true;
|
||||||
}
|
}
|
||||||
list = [];
|
list = [];
|
||||||
} else {
|
} else {
|
||||||
list = source.filter(it => it.__checked);
|
list = getSelectedList();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const val = checkbox.dataset.value;
|
if (item.children?.length > 0) {
|
||||||
|
if (item.__checked === 2) {
|
||||||
|
item.__checked = 0;
|
||||||
|
// children
|
||||||
|
source.filter(it => it.__p === val).forEach(it => it.__checked = 0);
|
||||||
|
} else {
|
||||||
|
item.__checked = 2;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
item.__checked = 0;
|
||||||
|
}
|
||||||
|
if (item.__p != null) {
|
||||||
|
// parent
|
||||||
|
const parent = source.filter(it => String(getValue(it, valuekey, textkey)) === item.__p)[0];
|
||||||
|
if (parent != null) {
|
||||||
|
const some = source.filter(it => it.__p === item.__p).some(it => it.__checked === 1 || it.__checked === 2);
|
||||||
|
parent.__checked = some ? 2 : 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (this._var.allChecked) {
|
if (this._var.allChecked) {
|
||||||
this._var.allChecked = false;
|
this._var.allChecked = false;
|
||||||
if (all != null) {
|
if (all != null) {
|
||||||
all.checked = false;
|
all.checked = false;
|
||||||
}
|
}
|
||||||
list = source.filter(it => String(getValue(it, valuekey, textkey)) !== val);
|
}
|
||||||
} else {
|
list = getSelectedList();
|
||||||
list = this.selectedList.filter(it => String(getValue(it, valuekey, textkey)) !== val);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// refresh selection
|
||||||
|
const checkboxes = this._var.container.querySelectorAll('input.dataitem');
|
||||||
|
checkboxes.forEach(c => {
|
||||||
|
const val = c.dataset.value;
|
||||||
|
const it = source.filter(it => String(getValue(it, valuekey, textkey)) === val)[0];
|
||||||
|
if (it != null) {
|
||||||
|
c.checked = it.__checked === 1 || it.__checked === 2;
|
||||||
|
c.indeterminate = it.__checked === 2;
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
|
||||||
if (this._var.allChecked) {
|
if (this._var.allChecked) {
|
||||||
this._var.label.innerText = r('allItem', '( All )');
|
this._var.label.innerText = r('allItem', '( All )');
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user