From e1f0af6a83d36276b93272f22de3e8514aafe913 Mon Sep 17 00:00:00 2001 From: Saif Ur Rehman Date: Sat, 11 May 2019 01:32:43 +0500 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20Group/Nested=20Data?= =?UTF-8?q?=20Handling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/body-renderer.js | 4 +- src/datamanager.js | 114 ++++++++++++++++++++++++++++++------------- 2 files changed, 83 insertions(+), 35 deletions(-) diff --git a/src/body-renderer.js b/src/body-renderer.js index b635fc3..25f279a 100644 --- a/src/body-renderer.js +++ b/src/body-renderer.js @@ -87,7 +87,7 @@ export default class BodyRenderer { if (cell.content === '') return cell; if (this.options.hooks.columnTotal) { - const columnValues = this.visibleRows.map(row => row[i].content); + const columnValues = this.visibleRows.filter(d => !d.meta.excludeFromTotal).map(row => row[i].content); const result = this.options.hooks.columnTotal.call(this.instance, columnValues, cell); if (result != null) { cell.content = result; @@ -95,7 +95,7 @@ export default class BodyRenderer { } } - cell.content = this.visibleRows.reduce((acc, prevRow) => { + cell.content = this.visibleRows.filter(d => !d.meta.excludeFromTotal).reduce((acc, prevRow) => { const prevCell = prevRow[i]; if (typeof prevCell.content === 'number') { if (acc == null) acc = 0; diff --git a/src/datamanager.js b/src/datamanager.js index c0899c4..f9288c6 100644 --- a/src/datamanager.js +++ b/src/datamanager.js @@ -27,6 +27,7 @@ export default class DataManager { this.rowCount = 0; this.columns = []; this.rows = []; + this.flatData = []; this.prepareColumns(); this.prepareRows(); @@ -144,51 +145,97 @@ export default class DataManager { prepareRows() { this.validateData(this.data); - this.rows = this.data.map((d, i) => { - const index = this._getNextRowCount(); + this.rows = []; + for (let d of this.data) { + this.addRow(d); + } + } - let row = []; - let meta = { - rowIndex: index - }; + addRow(d) { + if (Array.isArray(d)) { + this.addArrayRow(d); + } else if (d._isGroup) { + this.addGroupObject(d); + } else { + this.addObjectRow(d); + } + } - if (Array.isArray(d)) { - // row is an array - if (this.options.checkboxColumn) { - row.push(this.getCheckboxHTML()); - } - if (this.options.serialNoColumn) { - row.push((index + 1) + ''); - } - row = row.concat(d); + addArrayRow(d) { + const index = this._getNextRowCount(); + let row = []; + let meta = { + rowIndex: index + }; - while (row.length < this.columns.length) { - row.push(''); - } + if (this.options.checkboxColumn) { + row.push(this.getCheckboxHTML()); + } + if (this.options.serialNoColumn) { + row.push((index + 1) + ''); + } + row = row.concat(d); + + while (row.length < this.columns.length) { + row.push(''); + } + this.rows.push(this.prepareRow(row, meta)); + this.flatData.push(d); + } + + addObjectRow(d) { + const index = this._getNextRowCount(); + let row = []; + let meta = { + rowIndex: index + }; + + for (let col of this.columns) { + if (col.id === '_checkbox') { + row.push(this.getCheckboxHTML()); + } else if (col.id === '_rowIndex') { + row.push((index + 1) + ''); } else { - // row is an object - for (let col of this.columns) { - if (col.id === '_checkbox') { - row.push(this.getCheckboxHTML()); - } else if (col.id === '_rowIndex') { - row.push((index + 1) + ''); - } else { - row.push(d[col.id]); - } - } + row.push(d[col.id]); + } + } - meta.indent = d.indent || 0; + meta.indent = d.indent || 0; + meta.excludeFromTotal = d._excludeFromTotal; + + this.rows.push(this.prepareRow(row, meta)); + this.flatData.push(d); + } + + addGroupObject(group) { + let parentIndent; + if (group.totals) { + group.totals._excludeFromTotal = true; + group.totals._isGroupTotal = true; + group.totals.indent = group.indent || 0; + parentIndent = group.totals.indent; + this.addRow(group.totals); + } + + for (let d of group.rows || []) { + // if group has a total row, make sure its child rows are indented properly + if (parentIndent != null) { + d.indent = parentIndent + 1; } - return this.prepareRow(row, meta); - }); + this.addRow(d); + } + + // insert empty row for groups without totals row + if (group.rows && group.rows.length && !group.totals) { + this.addRow({}); + } } prepareTreeRows() { this.rows.forEach((row, i) => { if (isNumber(row.meta.indent)) { - // if (i === 36) debugger; const nextRow = this.getRow(i + 1); row.meta.isLeaf = !nextRow || notSet(nextRow.meta.indent) || @@ -245,6 +292,7 @@ export default class DataManager { this.validateData(rows); this.rows.push(...this.prepareRows(rows)); + this.flatData.push(...rows); } sortRows(colIndex, sortOrder = 'none') { @@ -592,7 +640,7 @@ export default class DataManager { * @memberof DataManager */ getData(rowIndex) { - return this.data[rowIndex]; + return this.flatData[rowIndex]; } hasColumn(name) { From 8981ee8694ff65a7e71153de6b3e5571cd28b8b0 Mon Sep 17 00:00:00 2001 From: Saif Ur Rehman Date: Wed, 15 May 2019 16:50:36 +0500 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20=F0=9F=90=9B=20Improve=20list=20view?= =?UTF-8?q?=20padding=20for=20nested=20data?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/datamanager.js | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/datamanager.js b/src/datamanager.js index f9288c6..6f8191b 100644 --- a/src/datamanager.js +++ b/src/datamanager.js @@ -209,8 +209,10 @@ export default class DataManager { } addGroupObject(group) { + let view = group.totals ? 'tree' : 'list'; + let parentIndent; - if (group.totals) { + if (view === 'tree' && group.totals) { group.totals._excludeFromTotal = true; group.totals._isGroupTotal = true; group.totals.indent = group.indent || 0; @@ -218,18 +220,27 @@ export default class DataManager { this.addRow(group.totals); } - for (let d of group.rows || []) { + for (let i = 0; i < group.rows.length; ++i) { + let row = group.rows[i]; + // if group has a total row, make sure its child rows are indented properly if (parentIndent != null) { - d.indent = parentIndent + 1; + row.indent = parentIndent + 1; } - this.addRow(d); - } + // padding row for list view + if (view === 'list' && row._isGroup && this.rows.length) { + this.addRow({}); + } + + this.addRow(row); - // insert empty row for groups without totals row - if (group.rows && group.rows.length && !group.totals) { - this.addRow({}); + // padding row for list view + if (view === 'list' && row._isGroup) { + if (i + 1 < group.rows.length && !group.rows[i + 1]._isGroup) { + this.addRow({}); + } + } } } From 01736cfa1175e48946feecc86ebc572e946aa1ab Mon Sep 17 00:00:00 2001 From: Saif Ur Rehman Date: Thu, 16 May 2019 16:34:20 +0500 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=F0=9F=90=9B=20Grouped=20data=20list?= =?UTF-8?q?=20view=20padding=20fix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/datamanager.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/datamanager.js b/src/datamanager.js index 6f8191b..fe3142b 100644 --- a/src/datamanager.js +++ b/src/datamanager.js @@ -210,8 +210,9 @@ export default class DataManager { addGroupObject(group) { let view = group.totals ? 'tree' : 'list'; - let parentIndent; + + // totals row for tree view if (view === 'tree' && group.totals) { group.totals._excludeFromTotal = true; group.totals._isGroupTotal = true; @@ -220,6 +221,11 @@ export default class DataManager { this.addRow(group.totals); } + // padding row for list view + if (view === 'list' && this.rows.length) { + this.addRow({}); + } + for (let i = 0; i < group.rows.length; ++i) { let row = group.rows[i]; @@ -228,11 +234,6 @@ export default class DataManager { row.indent = parentIndent + 1; } - // padding row for list view - if (view === 'list' && row._isGroup && this.rows.length) { - this.addRow({}); - } - this.addRow(row); // padding row for list view