Общие итоги Slickgrid

Есть ли способ показать общие итоги в Slickgrid с группировкой?

Я нашел следующее:

1) В документации Реализация строки итогов через поставщик данных < / а>. Но тогда я не могу использовать функции DataView и группировки.

2) Существует плагин для SlickGrid, который называется плагином итоговых данных Slickgrid. Но это не позволяет использовать возможности группировки.


person Orbitum    schedule 29.04.2014    source источник
comment
Второй вариант, который вы найдете, кажется многообещающим, вы должны сначала попытаться создать свой код с группировкой, а затем прикрепить / зарегистрировать TotalGrouping, поскольку кажется, что это очень легко прикрепить.   -  person ghiscoding    schedule 02.05.2014
comment
Спасибо за ответ! Я не уверен, что полностью вас понял. Не могли бы вы привести пример кода?   -  person Orbitum    schedule 08.05.2014


Ответы (2)


  1. Добавить функцию TotalsDataProvider
function TotalsDataProvider(dataView, columns) {
  var totals = {};
  var totalsMetadata = {
  // Style the totals row differently.
    cssClasses: "totals",
    columns: {}
  };
  // Make the totals not editable.
  for (var i = 0; i < columns.length; i++) {
    totalsMetadata.columns[i] = { editor: null };
  }
  this.getLength = function() {
    return dataView.getLength() + 1;
  }
  this.getItem = function(index) {
    return (index < dataView.getLength()) ? dataView.getItem(index) : totals;
  };

  // Some group-functions from DataView
  this.setRefreshHints = function(hints) {
    return dataView.setRefreshHints(hints);
  };
  this.collapseGroup = function(varArgs) {
    return dataView.collapseGroup(varArgs);
  };
  this.expandGroup = function(varArgs) {
    return dataView.expandGroup(varArgs);
  };

  this.updateTotals = function() {
    var columnIdx = columns.length;
    while (columnIdx--) {
      var column = columns[columnIdx];
      if (!column.hasTotal) { // Just add in your column "hasTotal: true" 
        continue;
      }
      var total = 0;
      var i = dataView.getLength();
      while (i--) {
        total += (dataView.getItem(i)[column.field] || 0);
      }
      totals[column.field] = total;
    }
  };
  this.getItemMetadata = function(index) {
    return (index != dataView.getLength()) ? dataView.getItemMetadata(index) : totalsMetadata;
  };
  this.updateTotals();
}
  1. Добавьте в свои столбцы опцию hasTotal: true. Например:
var columns = [
        {id: "id", name: "Index", field: "id", hasTotal: true},
        {id: "title", name: "Title", field: "title"},
        {id: "duration", name: "Duration", field: "duration", hasTotal: true},
        {id: "%", name: "% Complete", field: "percentComplete", hasTotal: true},
        {id: "start", name: "Start", field: "start"},
        {id: "finish", name: "Finish", field: "finish"},
        {id: "effort-driven", name: "Effort Driven", field: "effortDriven"}
      ];
  1. Измените переменную сетки и добавьте переменную dataProvider выше:
//grid = new Slick.Grid("#myGrid", dataView, columns, options);
var dataProvider = new TotalsDataProvider(dataView, columns);
grid = new Slick.Grid("#myGrid", dataProvider, columns, options);
  1. Каждый раз, когда вы меняете данные (путем фильтрации или с помощью grid.onCellCange), вам необходимо обновить общие данные:
// The data has changed - recalculate the totals.
dataProvider.updateTotals(); 
// Rerender the totals row (last row).     
grid.invalidateRow(dataProvider.getLength() - 1);
grid.render();
person Денис Смаль    schedule 16.02.2017
comment
Спасибо за Ваш ответ! Вроде более элегантное решение, чем мое. Позже протестирую. - person Orbitum; 17.02.2017

Я нашел обходной путь. Алгоритм следующий:

  1. Собирать данные JSON
  2. Подсчитайте общие итоги по нужным столбцам
  3. Вставьте дополнительную строку (элемент массива) в нижнюю часть массива данных JSON с дополнительным параметром, например noGrouping:true
  4. Отправить данные в DataView usingdataView.setItems(JSONDataArray)
  5. В slick.dataview.js в функции addTotals после строки:

    g.collapsed = groupCollapsed ^ toggledGroups[g.groupingKey]; добавить:

    if(g.rows[0].noGrouping) {
      g.collapsed = true;
    }
    

    Так что группа общих итогов всегда сворачивается

  6. При необходимости добавьте форматирование в slick.groupitemmetadataprovider.js для функции defaultGroupCellFormatter

person Orbitum    schedule 14.05.2014