Как изменить поведение флажка заголовка в Tabulator.js ?

#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 . спасибо вам за вашу помощь