#javascript #tabulator
#javascript #табулятор
Вопрос:
Я хочу, чтобы логика после нажатия флажка верхнего заголовка была другой. В настоящее время (я использую пользовательский форматер) он выбирает все строки первого уровня.
Я хочу, чтобы щелчок выбирал / отменял выбор всех строк, которые НЕ являются родительскими. Или, по крайней мере, не выбирать родительские строки.
В текущей настройке родительской строки tree toggle
щелкните, а затем отмените выбор.
пользовательский форматировщик выглядит примерно так. Честно говоря, я не понимаю код. Я попытался поставить консоль.войдите в каждое addEventListener
из приведенных ниже определений, но оно не было запущено.
Я предполагаю, что ответ может быть в registerHeaderSelectCheckbox
, но я понятия не имею, как его использовать.
Рабочий jsFiddle для тестирования.
formatter: function(cell, formatterParams, onRendered) {
const data = cell.getRow().getData();
if (do_not_show_checkbox_ids.indexOf(data['id']) == -1) {
var checkbox = document.createElement("input");
checkbox.type = 'checkbox';
if (this.table.modExists("selectRow", true)) {
checkbox.addEventListener("click", (e) => {
e.stopPropagation();
});
if (typeof cell.getRow == 'function') {
var row = cell.getRow();
if (row._getSelf().type == "row") {
checkbox.addEventListener("change", (e) => {
row.toggleSelect();
});
checkbox.checked = row.isSelected amp;amp; row.isSelected();
this.table.modules.selectRow.registerRowSelectCheckbox(row, checkbox);
} else {
checkbox = "";
}
} else {
checkbox.addEventListener("change", (e) => {
if (this.table.modules.selectRow.selectedRows.length) {
this.table.deselectRow();
} else {
this.table.selectRow(formatterParams.rowRange);
}
});
this.table.modules.selectRow.registerHeaderSelectCheckbox(checkbox);
}
}
return checkbox;
}
return null;
},
Комментарии:
1. вы хотите изменить функциональность заголовка при нажатии, чтобы выбрать дочерние дочерние узлы вместо родительских
Ответ №1:
titleFormatter
опция предназначена для флажка строки заголовка, а formatter
опция — для флажка строк
var do_not_show_checkbox_ids = [1];
function customFormatter(isHeader = false) {
return function(cell, formatterParams, onRendered) {
var checkbox = null;
// check if selectable is true in options
if (this.table.modExists("selectRow", true)) {
checkbox = document.createElement("input");
checkbox.type = 'checkbox';
// add click event in checkbox
checkbox.addEventListener("click", (e) => {
console.log('header', isHeader);
e.stopPropagation();
});
// check if cell has getRow function if yes then it may be row
if (typeof cell.getRow == 'function') {
// get cell row
var row = cell.getRow();
// get cell data for condition testing
const data = cell.getData();
// if is row and not skippable id
if (row._getSelf().type == "row" amp;amp; do_not_show_checkbox_ids.indexOf(data['id']) == -1) {
// add change event to toggle cell row
checkbox.addEventListener("change", (e) => {
row.toggleSelect();
});
// update checkbox after row toggle
checkbox.checked = row.isSelected amp;amp; row.isSelected();
// registering for if row clicked from anywhere then checkbox check/uncheck
this.table.modules.selectRow.registerRowSelectCheckbox(row, checkbox);
} else {
// if is row and skippable id
checkbox = "";
}
} else {
// header checkbox then add change addEventListener for selecting/deselecting all rows.
checkbox.addEventListener("change", (e) => {
// get all rows
this.table.getRows().forEach(row => {
// get row nodes/children
row.getTreeChildren().forEach(child => {
// check if child selected if yes then deselect else select
child.isSelected() ? child.deselect() : child.select();
})
});
// for selecting/deselecting all rows
// if (this.table.modules.selectRow.selectedRows.length) {
// console.log('header', isHeader);
// this.table.deselectRow();
// } else {
// this.table.selectRow(formatterParams.rowRange);
// }
});
// updating internal header checkbox
this.table.modules.selectRow.registerHeaderSelectCheckbox(checkbox);
}
return checkbox;
}
return null;
};
}
var tableDataNested = [{
id: 1,
name: "BalanceOil",
_children: [{
id: 11,
name: "BalanceOil ",
cena: 31,
mn: 1,
cena_1: 159
},
{
id: 12,
name: "BalanceOil Aqua",
cena: 41,
mn: 1,
cena_1: 159
},
]
},
{
id: 2,
name: "Xtend",
cena: 23,
mn: 1
},
{
id: 2,
name: "Xtend",
cena: 23,
mn: 1
},
{
id: 2,
name: "Xtend",
cena: 23,
mn: 1
},
{
id: 3,
name: "Zinobiotic",
cena: 24,
mn: 1
}
];
var table = new Tabulator("#example-table", {
movableColumns: true,
data: tableDataNested,
dataTree: true,
selectable: true,
columns: [{
title: "Name",
field: "name",
headerSort: false,
width: 200
},
{
title: "Cena",
field: "cena",
headerSort: false
},
{
titleFormatter: customFormatter(true),
formatter: customFormatter(),
hozAlign: "center",
headerSort: false,
cellClick: function(e, cell) {
console.log('header', e, cell)
this.recalc();
}
},
{
title: "mn",
field: "mn",
editor: "number",
headerSort: false,
cellEdited: function(cell) {
updateSum(cell);
}
},
{
title: "Sum",
field: "sum",
headerSort: false
}
],
rowClick: function(e, row) {
// console.log(table.getRows().length);
},
rowSelectionChanged: function(data, rows) {
// console.log(data, rows);
// console.log(this.getData());
},
renderComplete: function(t) {
this.getRows().forEach(function(value, index) {
// console.log(value.isSelected());
var children = value.getTreeChildren();
for (let j = 0; j < children.length; j ) {
const name = children[j].getData().name;
}
children.forEach(function(value, index) {
// console.log("cena");
var cena = value.getData().cena; //price
// console.log(cena);
var mnozstvi = value.getData().mn; //amount
value.update({
sum: cena * mnozstvi
});
});
updateSum(value.getCell("mn"));
});
},
rowClick: function(e, row) {
if (row.getTreeChildren().length > 0) {
table.deselectRow(row.getData().id);
row.treeToggle();
}
},
});
function updateSum(cell) {
var cena = cell.getData().cena; //price
var mnozstvi = cell.getValue(); //amount
if (mnozstvi) {
cell.getRow().update({
sum: cena * mnozstvi
});
}
}
Вот рабочий пример
tabulator
ссылки на документацию — выбор строк и дерево данных
Примечание: Для получения информации о том, как tabulator
выбор строки работает внутри, проверьте здесь
Комментарии:
1. выглядит неплохо. Я хочу, чтобы флажок заголовка при нажатии выбирал / отменял выбор 1) дочерних дочерних узлов вместо родительских и 2) не выбирать родительский «BalanceOil»
2. конечно, я имею в виду родительские строки… «BalanceOil» — это всего лишь пример.
3. @Radek я обновил код только для выбора дочерних узлов строки при изменении флажка заголовка
4. Привет, Чандан, это почти то, что я хочу. Наверное, я хочу, чтобы мои комментарии были не совсем понятны. Если вы прочитали мой вопрос и увидели картинки, я хочу выбрать все строки, у которых нет дочерних элементов. Я изменил ваш последний jsFiddle jsfiddle.net/radek/votcwder/6 и теперь это на 99% то, чего я хочу. Вы видите, что он не отменит выбор всех, но сделает инверсию. Я должен быть в состоянии закончить это. Я принимаю ваш ответ и большое вам спасибо за вашу помощь. Я все еще не до конца понимаю решение. Позже у меня будет более глубокий.
5. это именно то, что я хочу jsfiddle.net/radek/votcwder/35 . спасибо вам за вашу помощь