Skip to content

Commit

Permalink
Merge 96b4f5f into 665b2ef
Browse files Browse the repository at this point in the history
  • Loading branch information
haiiaaa committed Apr 23, 2018
2 parents 665b2ef + 96b4f5f commit 517380f
Show file tree
Hide file tree
Showing 7 changed files with 229 additions and 0 deletions.
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,12 @@ Collapses data into the specified row header provided. `rowNum` is the row head
#### `.expand(rowNum)`
Expands collapsed data that has previously been collapsed. The `expand` method is chainable.

#### `.collapseAll()`
Collapses all data. The `collapseAll` method is chainable.

#### `.expandAll()`
Expands all data. The `expandAll` method is chainable.

#### `.toggle(rowNum)`
Toggles data from collapsed to expanded or vice-versa. The `toggle` method is chainable.

Expand Down
31 changes: 31 additions & 0 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,9 @@ export default class Pivot {
* @returns {Object} pivot object
*/
collapse(rowNum) {
// already collapsed
if (this.collapsedRows[this.data.table[rowNum].row]) { return this; }

const returnedData = collapse(rowNum, this.data);

if (returnedData.collapsed) {
Expand All @@ -89,6 +92,34 @@ export default class Pivot {
return this;
}

/**
* Collapses all header rows
* @returns {Object} pivot object
*/
collapseAll() {
this.data.table
.map((row, rowNum) => row.type === 'rowHeader' ? rowNum : null)
.filter(rowNum => rowNum !== null)
.reverse()
.forEach(rowNum => { this.collapse(rowNum); });

return this;
}

/**
* Expands all header rows
* @returns {Object} pivot object
*/
expandAll() {
this.data.table
.map((row, rowNum) => row.type === 'rowHeader' ? rowNum : null)
.filter(rowNum => rowNum !== null)
.reverse()
.forEach(rowNum => { this.expand(rowNum); });

return this;
}

/**
* Toggles the given header row
* @param {number} rowNum The header row to toggle the collapsed/expanded state
Expand Down
4 changes: 4 additions & 0 deletions test/index.spec.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import 'babel-polyfill';
import constructorTest from './index/constructor';
import collapseTest from './index/collapse';
import collapseAllTest from './index/collapseAll';
import getDataTest from './index/getData';
import expandTest from './index/expand';
import expandAllTest from './index/expandAll';
import toggleTest from './index/toggle';
import getUniqueValuesTest from './index/getUniqueValues';
import filterTest from './index/filter';
Expand All @@ -11,8 +13,10 @@ import updateTest from './index/update';
describe('pivot', () => {
describe('constructor', constructorTest);
describe('collapse', collapseTest);
describe('collapseAll', collapseAllTest);
describe('getData', getDataTest);
describe('expand', expandTest);
describe('expandAll', expandAllTest);
describe('toggle', toggleTest);
describe('getUniqueValues', getUniqueValuesTest);
describe('filter', filterTest);
Expand Down
68 changes: 68 additions & 0 deletions test/index/collapseAll.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import { expect } from 'chai';
import Pivot from '../../src';

const dataArray = [
['name', 'gender', 'house', 'age'],
['Jon', 'm', 'Stark', 14],
['Arya', 'f', 'Stark', 10],
['Cersei', 'f', 'Baratheon', 38],
['Tywin', 'm', 'Lannister', 67],
['Tyrion', 'm', 'Lannister', 34],
['Joffrey', 'm', 'Baratheon', 18],
['Bran', 'm', 'Stark', 8],
['Jaime', 'm', 'Lannister', 32],
['Sansa', 'f', 'Stark', 12],
];
const rowsToPivotTestOne = ['gender', 'name'];
const colsToPivotTestOne = ['house'];
const aggregationCategory = 'age';
const aggregationType = 'sum';

const expectedTable = [
{ value: ['sum age', 'Stark', 'Baratheon', 'Lannister', 'Totals'], type: 'colHeader', depth: 0, row: 0 },
{ value: ['f', 22, 38, '', ''], type: 'rowHeader', depth: 0, row: 1 },
{ value: ['m', 22, 18, 133, ''], type: 'rowHeader', depth: 0, row: 5 },
{ value: ['Totals', 44, 56, 133, ''], type: 'aggregated' },
];
const expectedRawData = [
{ value: ['sum age', 'Stark', 'Baratheon', 'Lannister'], type: 'colHeader', depth: 0, row: 0 },
{ value: ['f', 22, 38, ''], type: 'rowHeader', depth: 0 },
{ value: ['m', 22, 18, 133], type: 'rowHeader', depth: 0 },
];

const create = () => new Pivot(
dataArray,
rowsToPivotTestOne,
colsToPivotTestOne,
aggregationCategory,
aggregationType,
);

export default () => {
it('should collapse all header rows', () => {
const pivot = create();

pivot.collapseAll();

expect(pivot.data.table).to.deep.equal(expectedTable);
expect(pivot.data.rawData).to.deep.equal(expectedRawData);
});

it('should not fail if called multiple times', () => {
const pivot = create();

pivot.collapseAll();
pivot.collapseAll();

expect(pivot.data.table).to.deep.equal(expectedTable);
expect(pivot.data.rawData).to.deep.equal(expectedRawData);
});

it('should be chainable', () => {
const pivot = create();

const result = pivot.collapseAll();

expect(result).to.equal(pivot);
});
};
15 changes: 15 additions & 0 deletions test/index/expand.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,21 @@ export default () => {
expect(pivot.getData(1)).to.deep.equal(uncollapsedData);
});

it('should return table to normal state after collapsing the same row twice', () => {
const pivot = new Pivot(
dataArray,
rowsToPivotTestOne,
colsToPivotTestOne,
aggregationCategory,
aggregationType,
);

pivot.collapse(5).collapse(5).expand(5);

expect(pivot.data.table).to.have.lengthOf(13);
expect(pivot.data.rawData).to.have.lengthOf(12);
});

it('should expand correct rows', () => {
const pivot = new Pivot(
dataArray,
Expand Down
88 changes: 88 additions & 0 deletions test/index/expandAll.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
import { expect } from 'chai';
import Pivot from '../../src';

const dataArray = [
['name', 'gender', 'house', 'age'],
['Jon', 'm', 'Stark', 14],
['Arya', 'f', 'Stark', 10],
['Cersei', 'f', 'Baratheon', 38],
['Tywin', 'm', 'Lannister', 67],
['Tyrion', 'm', 'Lannister', 34],
['Joffrey', 'm', 'Baratheon', 18],
['Bran', 'm', 'Stark', 8],
['Jaime', 'm', 'Lannister', 32],
['Sansa', 'f', 'Stark', 12],
];
const rowsToPivotTestOne = ['gender', 'name'];
const colsToPivotTestOne = ['house'];
const aggregationCategory = 'age';
const aggregationType = 'sum';

const expectedTable = [
{ value: ['sum age', 'Stark', 'Baratheon', 'Lannister', 'Totals'], type: 'colHeader', depth: 0, row: 0 },
{ value: ['f', 22, 38, '', ''], depth: 0, type: 'rowHeader', row: 1 },
{ value: ['Arya', 10, '', '', 10], type: 'data', depth: 1, row: 2 },
{ value: ['Cersei', '', 38, '', 38], type: 'data', depth: 1, row: 3 },
{ value: ['Sansa', 12, '', '', 12], type: 'data', depth: 1, row: 4 },
{ value: ['m', 22, 18, 133, ''], depth: 0, type: 'rowHeader', row: 5 },
{ value: ['Bran', 8, '', '', 8], type: 'data', depth: 1, row: 6 },
{ value: ['Jaime', '', '', 32, 32], type: 'data', depth: 1, row: 7 },
{ value: ['Joffrey', '', 18, '', 18], type: 'data', depth: 1, row: 8 },
{ value: ['Jon', 14, '', '', 14], type: 'data', depth: 1, row: 9 },
{ value: ['Tyrion', '', '', 34, 34], type: 'data', depth: 1, row: 10 },
{ value: ['Tywin', '', '', 67, 67], type: 'data', depth: 1, row: 11 },
{ value: ['Totals', 44, 56, 133, ''], type: 'aggregated' },
];
const expectedRawData = [
{ value: ['sum age', 'Stark', 'Baratheon', 'Lannister'], type: 'colHeader', depth: 0, row: 0 },
{ value: ['f', 22, 38, ''], type: 'rowHeader', depth: 0 },
{ value: ['Arya', [{ name: 'Arya', gender: 'f', house: 'Stark', age: 10 }], '', ''], type: 'data', depth: 1 },
{ value: ['Cersei', '', [{ name: 'Cersei', gender: 'f', house: 'Baratheon', age: 38 }], ''], type: 'data', depth: 1 },
{ value: ['Sansa', [{ name: 'Sansa', gender: 'f', house: 'Stark', age: 12 }], '', ''], type: 'data', depth: 1 },
{ value: ['m', 22, 18, 133], type: 'rowHeader', depth: 0 },
{ value: ['Bran', [{ name: 'Bran', gender: 'm', house: 'Stark', age: 8 }], '', ''], type: 'data', depth: 1 },
{ value: ['Jaime', '', '', [{ name: 'Jaime', gender: 'm', house: 'Lannister', age: 32 }]], type: 'data', depth: 1 },
{ value: ['Joffrey', '', [{ name: 'Joffrey', gender: 'm', house: 'Baratheon', age: 18 }], ''], type: 'data', depth: 1 },
{ value: ['Jon', [{ name: 'Jon', gender: 'm', house: 'Stark', age: 14 }], '', ''], type: 'data', depth: 1 },
{ value: ['Tyrion', '', '', [{ name: 'Tyrion', gender: 'm', house: 'Lannister', age: 34 }]], type: 'data', depth: 1 },
{ value: ['Tywin', '', '', [{ name: 'Tywin', gender: 'm', house: 'Lannister', age: 67 }]], type: 'data', depth: 1 },
];

const create = () => new Pivot(
dataArray,
rowsToPivotTestOne,
colsToPivotTestOne,
aggregationCategory,
aggregationType,
);

export default () => {
it('should expand all header rows', () => {
const pivot = create();
pivot.collapseAll();

pivot.expandAll();

expect(pivot.data.table).to.deep.equal(expectedTable);
expect(pivot.data.rawData).to.deep.equal(expectedRawData);
});

it('should not fail if called multiple times', () => {
const pivot = create();
pivot.collapse(5).collapse(1);

pivot.expandAll();
pivot.expandAll();

expect(pivot.data.table).to.deep.equal(expectedTable);
expect(pivot.data.rawData).to.deep.equal(expectedRawData);
});

it('should be chainable', () => {
const pivot = create();

const result = pivot.expandAll();

expect(result).to.equal(pivot);
});
};
17 changes: 17 additions & 0 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -519,6 +519,12 @@ babel-plugin-transform-regenerator@^6.3.13:
dependencies:
regenerator-transform "0.9.8"

babel-plugin-transform-runtime@^6.23.0:
version "6.23.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee"
dependencies:
babel-runtime "^6.22.0"

babel-plugin-transform-strict-mode@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.22.0.tgz#e008df01340fdc87e959da65991b7e05970c8c7c"
Expand Down Expand Up @@ -584,6 +590,13 @@ babel-runtime@^6.18.0, babel-runtime@^6.22.0:
core-js "^2.4.0"
regenerator-runtime "^0.10.0"

babel-runtime@^6.23.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
dependencies:
core-js "^2.4.0"
regenerator-runtime "^0.11.0"

babel-template@^6.0.16, babel-template@^6.1.18, babel-template@^6.16.0, babel-template@^6.22.0, babel-template@^6.23.0:
version "6.23.0"
resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.23.0.tgz#04d4f270adbb3aa704a8143ae26faa529238e638"
Expand Down Expand Up @@ -2819,6 +2832,10 @@ regenerator-runtime@^0.10.0:
version "0.10.3"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz#8c4367a904b51ea62a908ac310bf99ff90a82a3e"

regenerator-runtime@^0.11.0:
version "0.11.1"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"

regenerator-transform@0.9.8:
version "0.9.8"
resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.8.tgz#0f88bb2bc03932ddb7b6b7312e68078f01026d6c"
Expand Down

0 comments on commit 517380f

Please sign in to comment.