diff --git a/.gitignore b/.gitignore index f82259a..a67c980 100644 --- a/.gitignore +++ b/.gitignore @@ -4,15 +4,5 @@ examples/bundle.js yarn.lock package-lock.json -/PivotTable.js -/PivotTable.js.map -/PivotTableUI.js -/PivotTableUI.js.map -/PlotlyRenderers.js -/PlotlyRenderers.js.map -/TableRenderers.js -/TableRenderers.js.map -/Utilities.js -/Utilities.js.map + /__tests__/* -/pivottable.css diff --git a/PivotTable.js b/PivotTable.js new file mode 100644 index 0000000..baeaac9 --- /dev/null +++ b/PivotTable.js @@ -0,0 +1,66 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) {descriptor.writable = true;} Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) {defineProperties(Constructor.prototype, protoProps);} if (staticProps) {defineProperties(Constructor, staticProps);} return Constructor; }; }(); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _propTypes = require('prop-types'); + +var _propTypes2 = _interopRequireDefault(_propTypes); + +var _Utilities = require('./Utilities'); + +var _TableRenderers = require('./TableRenderers'); + +var _TableRenderers2 = _interopRequireDefault(_TableRenderers); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) {Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;} } + +/* eslint-disable react/prop-types */ +// eslint can't see inherited propTypes! + +var PivotTable = function (_React$PureComponent) { + _inherits(PivotTable, _React$PureComponent); + + function PivotTable() { + _classCallCheck(this, PivotTable); + + return _possibleConstructorReturn(this, (PivotTable.__proto__ || Object.getPrototypeOf(PivotTable)).apply(this, arguments)); + } + + _createClass(PivotTable, [{ + key: 'render', + value: function render() { + var Renderer = this.props.renderers[this.props.rendererName in this.props.renderers ? this.props.rendererName : Object.keys(this.props.renderers)[0]]; + return _react2.default.createElement(Renderer, this.props); + } + }]); + + return PivotTable; +}(_react2.default.PureComponent); + +PivotTable.propTypes = Object.assign({}, _Utilities.PivotData.propTypes, { + rendererName: _propTypes2.default.string, + renderers: _propTypes2.default.objectOf(_propTypes2.default.func) +}); + +PivotTable.defaultProps = Object.assign({}, _Utilities.PivotData.defaultProps, { + rendererName: 'Table', + renderers: _TableRenderers2.default +}); + +exports.default = PivotTable; +module.exports = exports.default; +// # sourceMappingURL=PivotTable.js.map diff --git a/PivotTable.js.map b/PivotTable.js.map new file mode 100644 index 0000000..0da1b41 --- /dev/null +++ b/PivotTable.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["src/PivotTable.jsx"],"names":["PivotTable","Renderer","props","renderers","rendererName","Object","keys","React","PureComponent","propTypes","assign","PivotData","PropTypes","string","objectOf","func","defaultProps","TableRenderers"],"mappings":";;;;;;;;AAAA;;;;AACA;;;;AACA;;AACA;;;;;;;;;;;;AAEA;AACA;;IAEMA,U;;;;;;;;;;;6BACK;AACP,UAAMC,WAAW,KAAKC,KAAL,CAAWC,SAAX,CACf,KAAKD,KAAL,CAAWE,YAAX,IAA2B,KAAKF,KAAL,CAAWC,SAAtC,GACI,KAAKD,KAAL,CAAWE,YADf,GAEIC,OAAOC,IAAP,CAAY,KAAKJ,KAAL,CAAWC,SAAvB,EAAkC,CAAlC,CAHW,CAAjB;AAKA,aAAO,8BAAC,QAAD,EAAc,KAAKD,KAAnB,CAAP;AACD;;;;EARsBK,gBAAMC,a;;AAW/BR,WAAWS,SAAX,GAAuBJ,OAAOK,MAAP,CAAc,EAAd,EAAkBC,qBAAUF,SAA5B,EAAuC;AAC5DL,gBAAcQ,oBAAUC,MADoC;AAE5DV,aAAWS,oBAAUE,QAAV,CAAmBF,oBAAUG,IAA7B;AAFiD,CAAvC,CAAvB;;AAKAf,WAAWgB,YAAX,GAA0BX,OAAOK,MAAP,CAAc,EAAd,EAAkBC,qBAAUK,YAA5B,EAA0C;AAClEZ,gBAAc,OADoD;AAElED,aAAWc;AAFuD,CAA1C,CAA1B;;kBAKejB,U","file":"PivotTable.js","sourcesContent":["import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport {PivotData} from './Utilities';\r\nimport TableRenderers from './TableRenderers';\r\n\r\n/* eslint-disable react/prop-types */\r\n// eslint can't see inherited propTypes!\r\n\r\nclass PivotTable extends React.PureComponent {\r\n render() {\r\n const Renderer = this.props.renderers[\r\n this.props.rendererName in this.props.renderers\r\n ? this.props.rendererName\r\n : Object.keys(this.props.renderers)[0]\r\n ];\r\n return ;\r\n }\r\n}\r\n\r\nPivotTable.propTypes = Object.assign({}, PivotData.propTypes, {\r\n rendererName: PropTypes.string,\r\n renderers: PropTypes.objectOf(PropTypes.func),\r\n});\r\n\r\nPivotTable.defaultProps = Object.assign({}, PivotData.defaultProps, {\r\n rendererName: 'Table',\r\n renderers: TableRenderers,\r\n});\r\n\r\nexport default PivotTable;\r\n"]} \ No newline at end of file diff --git a/PivotTableUI.js b/PivotTableUI.js new file mode 100644 index 0000000..5c96f3d --- /dev/null +++ b/PivotTableUI.js @@ -0,0 +1,720 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.Dropdown = exports.DraggableAttribute = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) {descriptor.writable = true;} Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) {defineProperties(Constructor.prototype, protoProps);} if (staticProps) {defineProperties(Constructor, staticProps);} return Constructor; }; }(); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _propTypes = require('prop-types'); + +var _propTypes2 = _interopRequireDefault(_propTypes); + +var _immutabilityHelper = require('immutability-helper'); + +var _immutabilityHelper2 = _interopRequireDefault(_immutabilityHelper); + +var _Utilities = require('./Utilities'); + +var _PivotTable = require('./PivotTable'); + +var _PivotTable2 = _interopRequireDefault(_PivotTable); + +var _reactSortablejs = require('react-sortablejs'); + +var _reactSortablejs2 = _interopRequireDefault(_reactSortablejs); + +var _reactDraggable = require('react-draggable'); + +var _reactDraggable2 = _interopRequireDefault(_reactDraggable); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) {Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;} } + +/* eslint-disable react/prop-types */ +// eslint can't see inherited propTypes! + +var DraggableAttribute = exports.DraggableAttribute = function (_React$Component) { + _inherits(DraggableAttribute, _React$Component); + + function DraggableAttribute(props) { + _classCallCheck(this, DraggableAttribute); + + var _this = _possibleConstructorReturn(this, (DraggableAttribute.__proto__ || Object.getPrototypeOf(DraggableAttribute)).call(this, props)); + + _this.state = { open: false, filterText: '' }; + return _this; + } + + _createClass(DraggableAttribute, [{ + key: 'toggleValue', + value: function toggleValue(value) { + if (value in this.props.valueFilter) { + this.props.removeValuesFromFilter(this.props.name, [value]); + } else { + this.props.addValuesToFilter(this.props.name, [value]); + } + } + }, { + key: 'matchesFilter', + value: function matchesFilter(x) { + return x.toLowerCase().trim().includes(this.state.filterText.toLowerCase().trim()); + } + }, { + key: 'selectOnly', + value: function selectOnly(e, value) { + e.stopPropagation(); + this.props.setValuesInFilter(this.props.name, Object.keys(this.props.attrValues).filter(function (y) { + return y !== value; + })); + } + }, { + key: 'getFilterBox', + value: function getFilterBox() { + var _this2 = this; + + var showMenu = Object.keys(this.props.attrValues).length < this.props.menuLimit; + + var values = Object.keys(this.props.attrValues); + var shown = values.filter(this.matchesFilter.bind(this)).sort(this.props.sorter); + + return _react2.default.createElement( + _reactDraggable2.default, + { handle: '.pvtDragHandle' }, + _react2.default.createElement( + 'div', + { + className: 'pvtFilterBox', + style: { + display: 'block', + cursor: 'initial', + zIndex: this.props.zIndex + }, + onClick: function onClick() { + return _this2.props.moveFilterBoxToTop(_this2.props.name); + } + }, + _react2.default.createElement( + 'a', + { onClick: function onClick() { + return _this2.setState({ open: false }); + }, className: 'pvtCloseX' }, + '\xD7' + ), + _react2.default.createElement( + 'span', + { className: 'pvtDragHandle' }, + '\u2630' + ), + _react2.default.createElement( + 'h4', + null, + this.props.name + ), + showMenu || _react2.default.createElement( + 'p', + null, + 'Muitos valores para carregar!' + ), + showMenu && _react2.default.createElement( + 'p', + null, + _react2.default.createElement('input', { + type: 'text', + placeholder: 'Filtros', + className: 'pvtSearch', + value: this.state.filterText, + onChange: function onChange(e) { + return _this2.setState({ + filterText: e.target.value + }); + } + }), + _react2.default.createElement('br', null), + _react2.default.createElement( + 'a', + { + role: 'button', + className: 'pvtButton', + onClick: function onClick() { + return _this2.props.removeValuesFromFilter(_this2.props.name, Object.keys(_this2.props.attrValues).filter(_this2.matchesFilter.bind(_this2))); + } + }, + 'Selecionar ', + values.length === shown.length ? 'Todos' : shown.length + ), + ' ', + _react2.default.createElement( + 'a', + { + role: 'button', + className: 'pvtButton', + onClick: function onClick() { + return _this2.props.addValuesToFilter(_this2.props.name, Object.keys(_this2.props.attrValues).filter(_this2.matchesFilter.bind(_this2))); + } + }, + 'Remover ', + values.length === shown.length ? 'Todos' : shown.length + ) + ), + showMenu && _react2.default.createElement( + 'div', + { className: 'pvtCheckContainer' }, + shown.map(function (x) { + return _react2.default.createElement( + 'p', + { + key: x, + onClick: function onClick() { + return _this2.toggleValue(x); + }, + className: x in _this2.props.valueFilter ? '' : 'selected' + }, + _react2.default.createElement( + 'a', + { className: 'pvtOnly', onClick: function onClick(e) { + return _this2.selectOnly(e, x); + } }, + 'apenas' + ), + _react2.default.createElement( + 'a', + { className: 'pvtOnlySpacer' }, + '\xA0' + ), + x === '' ? _react2.default.createElement( + 'em', + null, + 'nulo' + ) : x + ); + }) + ) + ) + ); + } + }, { + key: 'toggleFilterBox', + value: function toggleFilterBox() { + this.setState({ open: !this.state.open }); + this.props.moveFilterBoxToTop(this.props.name); + } + }, { + key: 'render', + value: function render() { + var filtered = Object.keys(this.props.valueFilter).length !== 0 ? 'pvtFilteredAttribute' : ''; + return _react2.default.createElement( + 'li', + { 'data-id': this.props.name }, + _react2.default.createElement( + 'span', + { className: 'pvtAttr ' + filtered }, + this.props.name, + _react2.default.createElement( + 'span', + { + className: 'pvtTriangle', + onClick: this.toggleFilterBox.bind(this) + }, + ' ', + '\u25BE' + ) + ), + this.state.open ? this.getFilterBox() : null + ); + } + }]); + + return DraggableAttribute; +}(_react2.default.Component); + +DraggableAttribute.defaultProps = { + valueFilter: {} +}; + +DraggableAttribute.propTypes = { + name: _propTypes2.default.string.isRequired, + addValuesToFilter: _propTypes2.default.func.isRequired, + removeValuesFromFilter: _propTypes2.default.func.isRequired, + attrValues: _propTypes2.default.objectOf(_propTypes2.default.number).isRequired, + valueFilter: _propTypes2.default.objectOf(_propTypes2.default.bool), + moveFilterBoxToTop: _propTypes2.default.func.isRequired, + sorter: _propTypes2.default.func.isRequired, + menuLimit: _propTypes2.default.number, + zIndex: _propTypes2.default.number +}; + +var Dropdown = exports.Dropdown = function (_React$PureComponent) { + _inherits(Dropdown, _React$PureComponent); + + function Dropdown() { + _classCallCheck(this, Dropdown); + + return _possibleConstructorReturn(this, (Dropdown.__proto__ || Object.getPrototypeOf(Dropdown)).apply(this, arguments)); + } + + _createClass(Dropdown, [{ + key: 'render', + value: function render() { + var _this4 = this; + + return _react2.default.createElement( + 'div', + { className: 'pvtDropdown', style: { zIndex: this.props.zIndex } }, + _react2.default.createElement( + 'div', + { + onClick: function onClick(e) { + e.stopPropagation(); + _this4.props.toggle(); + }, + className: 'pvtDropdownValue pvtDropdownCurrent ' + (this.props.open ? 'pvtDropdownCurrentOpen' : ''), + role: 'button' + }, + _react2.default.createElement( + 'div', + { className: 'pvtDropdownIcon' }, + this.props.open ? '×' : '▾' + ), + this.props.current || _react2.default.createElement( + 'span', + null, + '\xA0' + ) + ), + this.props.open && _react2.default.createElement( + 'div', + { className: 'pvtDropdownMenu' }, + this.props.values.map(function (r) { + return _react2.default.createElement( + 'div', + { + key: r, + role: 'button', + onClick: function onClick(e) { + e.stopPropagation(); + if (_this4.props.current === r) { + _this4.props.toggle(); + } else { + _this4.props.setValue(r); + } + }, + className: 'pvtDropdownValue ' + (r === _this4.props.current ? 'pvtDropdownActiveValue' : '') + }, + r + ); + }) + ) + ); + } + }]); + + return Dropdown; +}(_react2.default.PureComponent); + +var PivotTableUI = function (_React$PureComponent2) { + _inherits(PivotTableUI, _React$PureComponent2); + + function PivotTableUI(props) { + _classCallCheck(this, PivotTableUI); + + var _this5 = _possibleConstructorReturn(this, (PivotTableUI.__proto__ || Object.getPrototypeOf(PivotTableUI)).call(this, props)); + + _this5.state = { + unusedOrder: [], + zIndices: {}, + maxZIndex: 1000, + openDropdown: false, + attrValues: {}, + materializedInput: [] + }; + return _this5; + } + + _createClass(PivotTableUI, [{ + key: 'componentDidMount', + value: function componentDidMount() { + this.materializeInput(this.props.data); + } + }, { + key: 'componentDidUpdate', + value: function componentDidUpdate() { + this.materializeInput(this.props.data); + } + }, { + key: 'materializeInput', + value: function materializeInput(nextData) { + if (this.state.data === nextData) { + return; + } + var newState = { + data: nextData, + attrValues: {}, + materializedInput: [] + }; + var recordsProcessed = 0; + _Utilities.PivotData.forEachRecord(newState.data, this.props.derivedAttributes, function (record) { + newState.materializedInput.push(record); + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = Object.keys(record)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var attr = _step.value; + + if (!(attr in newState.attrValues)) { + newState.attrValues[attr] = {}; + if (recordsProcessed > 0) { + newState.attrValues[attr].null = recordsProcessed; + } + } + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return) { + _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + for (var _attr in newState.attrValues) { + var value = _attr in record ? record[_attr] : 'null'; + if (!(value in newState.attrValues[_attr])) { + newState.attrValues[_attr][value] = 0; + } + newState.attrValues[_attr][value]++; + } + recordsProcessed++; + }); + this.setState(newState); + } + }, { + key: 'sendPropUpdate', + value: function sendPropUpdate(command) { + this.props.onChange((0, _immutabilityHelper2.default)(this.props, command)); + } + }, { + key: 'propUpdater', + value: function propUpdater(key) { + var _this6 = this; + + return function (value) { + return _this6.sendPropUpdate(_defineProperty({}, key, { $set: value })); + }; + } + }, { + key: 'setValuesInFilter', + value: function setValuesInFilter(attribute, values) { + this.sendPropUpdate({ + valueFilter: _defineProperty({}, attribute, { + $set: values.reduce(function (r, v) { + r[v] = true; + return r; + }, {}) + }) + }); + } + }, { + key: 'addValuesToFilter', + value: function addValuesToFilter(attribute, values) { + if (attribute in this.props.valueFilter) { + this.sendPropUpdate({ + valueFilter: _defineProperty({}, attribute, values.reduce(function (r, v) { + r[v] = { $set: true }; + return r; + }, {})) + }); + } else { + this.setValuesInFilter(attribute, values); + } + } + }, { + key: 'removeValuesFromFilter', + value: function removeValuesFromFilter(attribute, values) { + this.sendPropUpdate({ + valueFilter: _defineProperty({}, attribute, { $unset: values }) + }); + } + }, { + key: 'moveFilterBoxToTop', + value: function moveFilterBoxToTop(attribute) { + this.setState((0, _immutabilityHelper2.default)(this.state, { + maxZIndex: { $set: this.state.maxZIndex + 1 }, + zIndices: _defineProperty({}, attribute, { $set: this.state.maxZIndex + 1 }) + })); + } + }, { + key: 'isOpen', + value: function isOpen(dropdown) { + return this.state.openDropdown === dropdown; + } + }, { + key: 'makeDnDCell', + value: function makeDnDCell(items, onChange, classes) { + var _this7 = this; + + return _react2.default.createElement( + _reactSortablejs2.default, + { + options: { + group: 'shared', + ghostClass: 'pvtPlaceholder', + filter: '.pvtFilterBox', + preventOnFilter: false + }, + tag: 'td', + className: classes, + onChange: onChange + }, + items.map(function (x) { + return _react2.default.createElement(DraggableAttribute, { + name: x, + key: x, + attrValues: _this7.state.attrValues[x], + valueFilter: _this7.props.valueFilter[x] || {}, + sorter: (0, _Utilities.getSort)(_this7.props.sorters, x), + menuLimit: _this7.props.menuLimit, + setValuesInFilter: _this7.setValuesInFilter.bind(_this7), + addValuesToFilter: _this7.addValuesToFilter.bind(_this7), + moveFilterBoxToTop: _this7.moveFilterBoxToTop.bind(_this7), + removeValuesFromFilter: _this7.removeValuesFromFilter.bind(_this7), + zIndex: _this7.state.zIndices[x] || _this7.state.maxZIndex + }); + }) + ); + } + }, { + key: 'render', + value: function render() { + var _this8 = this; + + var numValsAllowed = this.props.aggregators[this.props.aggregatorName]([])().numInputs || 0; + + var aggregatorCellOutlet = this.props.aggregators[this.props.aggregatorName]([])().outlet; + + var rendererName = this.props.rendererName in this.props.renderers ? this.props.rendererName : Object.keys(this.props.renderers)[0]; + + var rendererCell = _react2.default.createElement( + 'td', + { className: 'pvtRenderers' }, + _react2.default.createElement(Dropdown, { + current: rendererName, + values: Object.keys(this.props.renderers), + open: this.isOpen('renderer'), + zIndex: this.isOpen('renderer') ? this.state.maxZIndex + 1 : 1, + toggle: function toggle() { + return _this8.setState({ + openDropdown: _this8.isOpen('renderer') ? false : 'renderer' + }); + }, + setValue: this.propUpdater('rendererName') + }) + ); + + var sortIcons = { + key_a_to_z: { + rowSymbol: '↕', + colSymbol: '↔', + next: 'value_a_to_z' + }, + value_a_to_z: { + rowSymbol: '↓', + colSymbol: '→', + next: 'value_z_to_a' + }, + value_z_to_a: { rowSymbol: '↑', colSymbol: '←', next: 'key_a_to_z' } + }; + + var aggregatorCell = _react2.default.createElement( + 'td', + { className: 'pvtVals' }, + _react2.default.createElement(Dropdown, { + current: this.props.aggregatorName, + values: Object.keys(this.props.aggregators), + open: this.isOpen('aggregators'), + zIndex: this.isOpen('aggregators') ? this.state.maxZIndex + 1 : 1, + toggle: function toggle() { + return _this8.setState({ + openDropdown: _this8.isOpen('aggregators') ? false : 'aggregators' + }); + }, + setValue: this.propUpdater('aggregatorName') + }), + _react2.default.createElement( + 'a', + { + role: 'button', + className: 'pvtRowOrder', + onClick: function onClick() { + return _this8.propUpdater('rowOrder')(sortIcons[_this8.props.rowOrder].next); + } + }, + sortIcons[this.props.rowOrder].rowSymbol + ), + _react2.default.createElement( + 'a', + { + role: 'button', + className: 'pvtColOrder', + onClick: function onClick() { + return _this8.propUpdater('colOrder')(sortIcons[_this8.props.colOrder].next); + } + }, + sortIcons[this.props.colOrder].colSymbol + ), + numValsAllowed > 0 && _react2.default.createElement('br', null), + new Array(numValsAllowed).fill().map(function (n, i) { + return [_react2.default.createElement(Dropdown, { + key: i, + current: _this8.props.vals[i], + values: Object.keys(_this8.state.attrValues).filter(function (e) { + return !_this8.props.hiddenAttributes.includes(e) && !_this8.props.hiddenFromAggregators.includes(e); + }), + open: _this8.isOpen('val' + i), + zIndex: _this8.isOpen('val' + i) ? _this8.state.maxZIndex + 1 : 1, + toggle: function toggle() { + return _this8.setState({ + openDropdown: _this8.isOpen('val' + i) ? false : 'val' + i + }); + }, + setValue: function setValue(value) { + return _this8.sendPropUpdate({ + vals: { $splice: [[i, 1, value]] } + }); + } + }), i + 1 !== numValsAllowed ? _react2.default.createElement('br', { key: 'br' + i }) : null]; + }), + aggregatorCellOutlet && aggregatorCellOutlet(this.props.data) + ); + + var unusedAttrs = Object.keys(this.state.attrValues).filter(function (e) { + return !_this8.props.rows.includes(e) && !_this8.props.cols.includes(e) && !_this8.props.hiddenAttributes.includes(e) && !_this8.props.hiddenFromDragDrop.includes(e); + }).sort((0, _Utilities.sortAs)(this.state.unusedOrder)); + + var unusedLength = unusedAttrs.reduce(function (r, e) { + return r + e.length; + }, 0); + var horizUnused = unusedLength < this.props.unusedOrientationCutoff; + + var unusedAttrsCell = this.makeDnDCell(unusedAttrs, function (order) { + return _this8.setState({ unusedOrder: order }); + }, 'pvtAxisContainer pvtUnused ' + (horizUnused ? 'pvtHorizList' : 'pvtVertList')); + + var colAttrs = this.props.cols.filter(function (e) { + return !_this8.props.hiddenAttributes.includes(e) && !_this8.props.hiddenFromDragDrop.includes(e); + }); + + var colAttrsCell = this.makeDnDCell(colAttrs, this.propUpdater('cols'), 'pvtAxisContainer pvtHorizList pvtCols'); + + var rowAttrs = this.props.rows.filter(function (e) { + return !_this8.props.hiddenAttributes.includes(e) && !_this8.props.hiddenFromDragDrop.includes(e); + }); + var rowAttrsCell = this.makeDnDCell(rowAttrs, this.propUpdater('rows'), 'pvtAxisContainer pvtVertList pvtRows'); + var outputCell = _react2.default.createElement( + 'td', + { className: 'pvtOutput' }, + _react2.default.createElement(_PivotTable2.default, (0, _immutabilityHelper2.default)(this.props, { + data: { $set: this.state.materializedInput } + })) + ); + + if (horizUnused) { + return _react2.default.createElement( + 'table', + { className: 'pvtUi' }, + _react2.default.createElement( + 'tbody', + { onClick: function onClick() { + return _this8.setState({ openDropdown: false }); + } }, + _react2.default.createElement( + 'tr', + null, + rendererCell, + unusedAttrsCell + ), + _react2.default.createElement( + 'tr', + null, + aggregatorCell, + colAttrsCell + ), + _react2.default.createElement( + 'tr', + null, + rowAttrsCell, + outputCell + ) + ) + ); + } + + return _react2.default.createElement( + 'table', + { className: 'pvtUi' }, + _react2.default.createElement( + 'tbody', + { onClick: function onClick() { + return _this8.setState({ openDropdown: false }); + } }, + _react2.default.createElement( + 'tr', + null, + rendererCell, + aggregatorCell, + colAttrsCell + ), + _react2.default.createElement( + 'tr', + null, + unusedAttrsCell, + rowAttrsCell, + outputCell + ) + ) + ); + } + }]); + + return PivotTableUI; +}(_react2.default.PureComponent); + +PivotTableUI.propTypes = Object.assign({}, _PivotTable2.default.propTypes, { + onChange: _propTypes2.default.func.isRequired, + hiddenAttributes: _propTypes2.default.arrayOf(_propTypes2.default.string), + hiddenFromAggregators: _propTypes2.default.arrayOf(_propTypes2.default.string), + hiddenFromDragDrop: _propTypes2.default.arrayOf(_propTypes2.default.string), + unusedOrientationCutoff: _propTypes2.default.number, + menuLimit: _propTypes2.default.number +}); + +PivotTableUI.defaultProps = Object.assign({}, _PivotTable2.default.defaultProps, { + hiddenAttributes: [], + hiddenFromAggregators: [], + hiddenFromDragDrop: [], + unusedOrientationCutoff: 85, + menuLimit: 500 +}); + +exports.default = PivotTableUI; +// # sourceMappingURL=PivotTableUI.js.map diff --git a/PivotTableUI.js.map b/PivotTableUI.js.map new file mode 100644 index 0000000..a72282c --- /dev/null +++ b/PivotTableUI.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["src/PivotTableUI.jsx"],"names":["DraggableAttribute","props","state","open","filterText","value","valueFilter","removeValuesFromFilter","name","addValuesToFilter","x","toLowerCase","trim","includes","e","stopPropagation","setValuesInFilter","Object","keys","attrValues","filter","y","showMenu","length","menuLimit","values","shown","matchesFilter","bind","sort","sorter","display","cursor","zIndex","moveFilterBoxToTop","setState","target","map","toggleValue","selectOnly","filtered","toggleFilterBox","getFilterBox","React","Component","defaultProps","propTypes","PropTypes","string","isRequired","func","objectOf","number","bool","Dropdown","toggle","current","r","setValue","PureComponent","PivotTableUI","unusedOrder","zIndices","maxZIndex","openDropdown","materializedInput","materializeInput","data","nextData","newState","recordsProcessed","PivotData","forEachRecord","derivedAttributes","record","push","attr","null","command","onChange","key","sendPropUpdate","$set","attribute","reduce","v","$unset","dropdown","items","classes","group","ghostClass","preventOnFilter","sorters","numValsAllowed","aggregators","aggregatorName","numInputs","aggregatorCellOutlet","outlet","rendererName","renderers","rendererCell","isOpen","propUpdater","sortIcons","key_a_to_z","rowSymbol","colSymbol","next","value_a_to_z","value_z_to_a","aggregatorCell","rowOrder","colOrder","Array","fill","n","i","vals","hiddenAttributes","hiddenFromAggregators","$splice","unusedAttrs","rows","cols","hiddenFromDragDrop","unusedLength","horizUnused","unusedOrientationCutoff","unusedAttrsCell","makeDnDCell","order","colAttrs","colAttrsCell","rowAttrs","rowAttrsCell","outputCell","assign","PivotTable","arrayOf"],"mappings":"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","file":"PivotTableUI.js","sourcesContent":["import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport update from 'immutability-helper';\r\nimport {PivotData, sortAs, getSort} from './Utilities';\r\nimport PivotTable from './PivotTable';\r\nimport Sortable from 'react-sortablejs';\r\nimport Draggable from 'react-draggable';\r\n\r\n/* eslint-disable react/prop-types */\r\n// eslint can't see inherited propTypes!\r\n\r\nexport class DraggableAttribute extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {open: false, filterText: ''};\r\n }\r\n\r\n toggleValue(value) {\r\n if (value in this.props.valueFilter) {\r\n this.props.removeValuesFromFilter(this.props.name, [value]);\r\n } else {\r\n this.props.addValuesToFilter(this.props.name, [value]);\r\n }\r\n }\r\n\r\n matchesFilter(x) {\r\n return x\r\n .toLowerCase()\r\n .trim()\r\n .includes(this.state.filterText.toLowerCase().trim());\r\n }\r\n\r\n selectOnly(e, value) {\r\n e.stopPropagation();\r\n this.props.setValuesInFilter(\r\n this.props.name,\r\n Object.keys(this.props.attrValues).filter(y => y !== value)\r\n );\r\n }\r\n\r\n getFilterBox() {\r\n const showMenu =\r\n Object.keys(this.props.attrValues).length < this.props.menuLimit;\r\n\r\n const values = Object.keys(this.props.attrValues);\r\n const shown = values\r\n .filter(this.matchesFilter.bind(this))\r\n .sort(this.props.sorter);\r\n\r\n return (\r\n \r\n this.props.moveFilterBoxToTop(this.props.name)}\r\n >\r\n this.setState({open: false})} className=\"pvtCloseX\">\r\n ×\r\n \r\n \r\n

{this.props.name}

\r\n\r\n {showMenu ||

(too many values to show)

}\r\n\r\n {showMenu && (\r\n

\r\n \r\n this.setState({\r\n filterText: e.target.value,\r\n })\r\n }\r\n />\r\n
\r\n \r\n this.props.removeValuesFromFilter(\r\n this.props.name,\r\n Object.keys(this.props.attrValues).filter(\r\n this.matchesFilter.bind(this)\r\n )\r\n )\r\n }\r\n >\r\n Select {values.length === shown.length ? 'All' : shown.length}\r\n {' '}\r\n \r\n this.props.addValuesToFilter(\r\n this.props.name,\r\n Object.keys(this.props.attrValues).filter(\r\n this.matchesFilter.bind(this)\r\n )\r\n )\r\n }\r\n >\r\n Deselect {values.length === shown.length ? 'All' : shown.length}\r\n \r\n

\r\n )}\r\n\r\n {showMenu && (\r\n
\r\n {shown.map(x => (\r\n this.toggleValue(x)}\r\n className={x in this.props.valueFilter ? '' : 'selected'}\r\n >\r\n this.selectOnly(e, x)}>\r\n only\r\n \r\n  \r\n\r\n {x === '' ? null : x}\r\n

\r\n ))}\r\n
\r\n )}\r\n \r\n
\r\n );\r\n }\r\n\r\n toggleFilterBox() {\r\n this.setState({open: !this.state.open});\r\n this.props.moveFilterBoxToTop(this.props.name);\r\n }\r\n\r\n render() {\r\n const filtered =\r\n Object.keys(this.props.valueFilter).length !== 0\r\n ? 'pvtFilteredAttribute'\r\n : '';\r\n return (\r\n
  • \r\n \r\n {this.props.name}\r\n \r\n {' '}\r\n ▾\r\n \r\n \r\n\r\n {this.state.open ? this.getFilterBox() : null}\r\n
  • \r\n );\r\n }\r\n}\r\n\r\nDraggableAttribute.defaultProps = {\r\n valueFilter: {},\r\n};\r\n\r\nDraggableAttribute.propTypes = {\r\n name: PropTypes.string.isRequired,\r\n addValuesToFilter: PropTypes.func.isRequired,\r\n removeValuesFromFilter: PropTypes.func.isRequired,\r\n attrValues: PropTypes.objectOf(PropTypes.number).isRequired,\r\n valueFilter: PropTypes.objectOf(PropTypes.bool),\r\n moveFilterBoxToTop: PropTypes.func.isRequired,\r\n sorter: PropTypes.func.isRequired,\r\n menuLimit: PropTypes.number,\r\n zIndex: PropTypes.number,\r\n};\r\n\r\nexport class Dropdown extends React.PureComponent {\r\n render() {\r\n return (\r\n
    \r\n {\r\n e.stopPropagation();\r\n this.props.toggle();\r\n }}\r\n className={\r\n 'pvtDropdownValue pvtDropdownCurrent ' +\r\n (this.props.open ? 'pvtDropdownCurrentOpen' : '')\r\n }\r\n role=\"button\"\r\n >\r\n
    {this.props.open ? '×' : '▾'}
    \r\n {this.props.current ||  }\r\n
    \r\n\r\n {this.props.open && (\r\n
    \r\n {this.props.values.map(r => (\r\n {\r\n e.stopPropagation();\r\n if (this.props.current === r) {\r\n this.props.toggle();\r\n } else {\r\n this.props.setValue(r);\r\n }\r\n }}\r\n className={\r\n 'pvtDropdownValue ' +\r\n (r === this.props.current ? 'pvtDropdownActiveValue' : '')\r\n }\r\n >\r\n {r}\r\n
    \r\n ))}\r\n \r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\nclass PivotTableUI extends React.PureComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n unusedOrder: [],\r\n zIndices: {},\r\n maxZIndex: 1000,\r\n openDropdown: false,\r\n attrValues: {},\r\n materializedInput: [],\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n this.materializeInput(this.props.data);\r\n }\r\n\r\n componentDidUpdate() {\r\n this.materializeInput(this.props.data);\r\n }\r\n\r\n materializeInput(nextData) {\r\n if (this.state.data === nextData) {\r\n return;\r\n }\r\n const newState = {\r\n data: nextData,\r\n attrValues: {},\r\n materializedInput: [],\r\n };\r\n let recordsProcessed = 0;\r\n PivotData.forEachRecord(\r\n newState.data,\r\n this.props.derivedAttributes,\r\n function(record) {\r\n newState.materializedInput.push(record);\r\n for (const attr of Object.keys(record)) {\r\n if (!(attr in newState.attrValues)) {\r\n newState.attrValues[attr] = {};\r\n if (recordsProcessed > 0) {\r\n newState.attrValues[attr].null = recordsProcessed;\r\n }\r\n }\r\n }\r\n for (const attr in newState.attrValues) {\r\n const value = attr in record ? record[attr] : 'null';\r\n if (!(value in newState.attrValues[attr])) {\r\n newState.attrValues[attr][value] = 0;\r\n }\r\n newState.attrValues[attr][value]++;\r\n }\r\n recordsProcessed++;\r\n }\r\n );\r\n this.setState(newState);\r\n }\r\n\r\n sendPropUpdate(command) {\r\n this.props.onChange(update(this.props, command));\r\n }\r\n\r\n propUpdater(key) {\r\n return value => this.sendPropUpdate({[key]: {$set: value}});\r\n }\r\n\r\n setValuesInFilter(attribute, values) {\r\n this.sendPropUpdate({\r\n valueFilter: {\r\n [attribute]: {\r\n $set: values.reduce((r, v) => {\r\n r[v] = true;\r\n return r;\r\n }, {}),\r\n },\r\n },\r\n });\r\n }\r\n\r\n addValuesToFilter(attribute, values) {\r\n if (attribute in this.props.valueFilter) {\r\n this.sendPropUpdate({\r\n valueFilter: {\r\n [attribute]: values.reduce((r, v) => {\r\n r[v] = {$set: true};\r\n return r;\r\n }, {}),\r\n },\r\n });\r\n } else {\r\n this.setValuesInFilter(attribute, values);\r\n }\r\n }\r\n\r\n removeValuesFromFilter(attribute, values) {\r\n this.sendPropUpdate({\r\n valueFilter: {[attribute]: {$unset: values}},\r\n });\r\n }\r\n\r\n moveFilterBoxToTop(attribute) {\r\n this.setState(\r\n update(this.state, {\r\n maxZIndex: {$set: this.state.maxZIndex + 1},\r\n zIndices: {[attribute]: {$set: this.state.maxZIndex + 1}},\r\n })\r\n );\r\n }\r\n\r\n isOpen(dropdown) {\r\n return this.state.openDropdown === dropdown;\r\n }\r\n\r\n makeDnDCell(items, onChange, classes) {\r\n return (\r\n \r\n {items.map(x => (\r\n \r\n ))}\r\n \r\n );\r\n }\r\n\r\n render() {\r\n const numValsAllowed =\r\n this.props.aggregators[this.props.aggregatorName]([])().numInputs || 0;\r\n\r\n const aggregatorCellOutlet = this.props.aggregators[\r\n this.props.aggregatorName\r\n ]([])().outlet;\r\n\r\n const rendererName =\r\n this.props.rendererName in this.props.renderers\r\n ? this.props.rendererName\r\n : Object.keys(this.props.renderers)[0];\r\n\r\n const rendererCell = (\r\n \r\n \r\n this.setState({\r\n openDropdown: this.isOpen('renderer') ? false : 'renderer',\r\n })\r\n }\r\n setValue={this.propUpdater('rendererName')}\r\n />\r\n \r\n );\r\n\r\n const sortIcons = {\r\n key_a_to_z: {\r\n rowSymbol: '↕',\r\n colSymbol: '↔',\r\n next: 'value_a_to_z',\r\n },\r\n value_a_to_z: {\r\n rowSymbol: '↓',\r\n colSymbol: '→',\r\n next: 'value_z_to_a',\r\n },\r\n value_z_to_a: {rowSymbol: '↑', colSymbol: '←', next: 'key_a_to_z'},\r\n };\r\n\r\n const aggregatorCell = (\r\n \r\n \r\n this.setState({\r\n openDropdown: this.isOpen('aggregators') ? false : 'aggregators',\r\n })\r\n }\r\n setValue={this.propUpdater('aggregatorName')}\r\n />\r\n \r\n this.propUpdater('rowOrder')(sortIcons[this.props.rowOrder].next)\r\n }\r\n >\r\n {sortIcons[this.props.rowOrder].rowSymbol}\r\n \r\n \r\n this.propUpdater('colOrder')(sortIcons[this.props.colOrder].next)\r\n }\r\n >\r\n {sortIcons[this.props.colOrder].colSymbol}\r\n \r\n {numValsAllowed > 0 &&
    }\r\n {new Array(numValsAllowed).fill().map((n, i) => [\r\n \r\n !this.props.hiddenAttributes.includes(e) &&\r\n !this.props.hiddenFromAggregators.includes(e)\r\n )}\r\n open={this.isOpen(`val${i}`)}\r\n zIndex={this.isOpen(`val${i}`) ? this.state.maxZIndex + 1 : 1}\r\n toggle={() =>\r\n this.setState({\r\n openDropdown: this.isOpen(`val${i}`) ? false : `val${i}`,\r\n })\r\n }\r\n setValue={value =>\r\n this.sendPropUpdate({\r\n vals: {$splice: [[i, 1, value]]},\r\n })\r\n }\r\n />,\r\n i + 1 !== numValsAllowed ?
    : null,\r\n ])}\r\n {aggregatorCellOutlet && aggregatorCellOutlet(this.props.data)}\r\n \r\n );\r\n\r\n const unusedAttrs = Object.keys(this.state.attrValues)\r\n .filter(\r\n e =>\r\n !this.props.rows.includes(e) &&\r\n !this.props.cols.includes(e) &&\r\n !this.props.hiddenAttributes.includes(e) &&\r\n !this.props.hiddenFromDragDrop.includes(e)\r\n )\r\n .sort(sortAs(this.state.unusedOrder));\r\n\r\n const unusedLength = unusedAttrs.reduce((r, e) => r + e.length, 0);\r\n const horizUnused = unusedLength < this.props.unusedOrientationCutoff;\r\n\r\n const unusedAttrsCell = this.makeDnDCell(\r\n unusedAttrs,\r\n order => this.setState({unusedOrder: order}),\r\n `pvtAxisContainer pvtUnused ${\r\n horizUnused ? 'pvtHorizList' : 'pvtVertList'\r\n }`\r\n );\r\n\r\n const colAttrs = this.props.cols.filter(\r\n e =>\r\n !this.props.hiddenAttributes.includes(e) &&\r\n !this.props.hiddenFromDragDrop.includes(e)\r\n );\r\n\r\n const colAttrsCell = this.makeDnDCell(\r\n colAttrs,\r\n this.propUpdater('cols'),\r\n 'pvtAxisContainer pvtHorizList pvtCols'\r\n );\r\n\r\n const rowAttrs = this.props.rows.filter(\r\n e =>\r\n !this.props.hiddenAttributes.includes(e) &&\r\n !this.props.hiddenFromDragDrop.includes(e)\r\n );\r\n const rowAttrsCell = this.makeDnDCell(\r\n rowAttrs,\r\n this.propUpdater('rows'),\r\n 'pvtAxisContainer pvtVertList pvtRows'\r\n );\r\n const outputCell = (\r\n \r\n \r\n \r\n );\r\n\r\n if (horizUnused) {\r\n return (\r\n \r\n this.setState({openDropdown: false})}>\r\n \r\n {rendererCell}\r\n {unusedAttrsCell}\r\n \r\n \r\n {aggregatorCell}\r\n {colAttrsCell}\r\n \r\n \r\n {rowAttrsCell}\r\n {outputCell}\r\n \r\n \r\n
    \r\n );\r\n }\r\n\r\n return (\r\n \r\n this.setState({openDropdown: false})}>\r\n \r\n {rendererCell}\r\n {aggregatorCell}\r\n {colAttrsCell}\r\n \r\n \r\n {unusedAttrsCell}\r\n {rowAttrsCell}\r\n {outputCell}\r\n \r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nPivotTableUI.propTypes = Object.assign({}, PivotTable.propTypes, {\r\n onChange: PropTypes.func.isRequired,\r\n hiddenAttributes: PropTypes.arrayOf(PropTypes.string),\r\n hiddenFromAggregators: PropTypes.arrayOf(PropTypes.string),\r\n hiddenFromDragDrop: PropTypes.arrayOf(PropTypes.string),\r\n unusedOrientationCutoff: PropTypes.number,\r\n menuLimit: PropTypes.number,\r\n});\r\n\r\nPivotTableUI.defaultProps = Object.assign({}, PivotTable.defaultProps, {\r\n hiddenAttributes: [],\r\n hiddenFromAggregators: [],\r\n hiddenFromDragDrop: [],\r\n unusedOrientationCutoff: 85,\r\n menuLimit: 500,\r\n});\r\n\r\nexport default PivotTableUI;\r\n"]} \ No newline at end of file diff --git a/PlotlyRenderers.js b/PlotlyRenderers.js new file mode 100644 index 0000000..ed6da89 --- /dev/null +++ b/PlotlyRenderers.js @@ -0,0 +1,265 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) {descriptor.writable = true;} Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) {defineProperties(Constructor.prototype, protoProps);} if (staticProps) {defineProperties(Constructor, staticProps);} return Constructor; }; }(); + +exports.default = createPlotlyRenderers; + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _propTypes = require('prop-types'); + +var _propTypes2 = _interopRequireDefault(_propTypes); + +var _Utilities = require('./Utilities'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) {Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;} } + +/* eslint-disable react/prop-types */ +// eslint can't see inherited propTypes! + +function makeRenderer(PlotlyComponent) { + var traceOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var layoutOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + var transpose = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + + var Renderer = function (_React$PureComponent) { + _inherits(Renderer, _React$PureComponent); + + function Renderer() { + _classCallCheck(this, Renderer); + + return _possibleConstructorReturn(this, (Renderer.__proto__ || Object.getPrototypeOf(Renderer)).apply(this, arguments)); + } + + _createClass(Renderer, [{ + key: 'render', + value: function render() { + var pivotData = new _Utilities.PivotData(this.props); + var rowKeys = pivotData.getRowKeys(); + var colKeys = pivotData.getColKeys(); + var traceKeys = transpose ? colKeys : rowKeys; + if (traceKeys.length === 0) { + traceKeys.push([]); + } + var datumKeys = transpose ? rowKeys : colKeys; + if (datumKeys.length === 0) { + datumKeys.push([]); + } + + var fullAggName = this.props.aggregatorName; + var numInputs = this.props.aggregators[fullAggName]([])().numInputs || 0; + if (numInputs !== 0) { + fullAggName += ' de ' + this.props.vals.slice(0, numInputs).join(', '); + } + + var data = traceKeys.map(function (traceKey) { + var values = []; + var labels = []; + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = datumKeys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var datumKey = _step.value; + + var val = parseFloat(pivotData.getAggregator(transpose ? datumKey : traceKey, transpose ? traceKey : datumKey).value()); + values.push(isFinite(val) ? val : null); + labels.push(datumKey.join('-') || ' '); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return) { + _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + var trace = { name: traceKey.join('-') || fullAggName }; + if (traceOptions.type === 'pie') { + trace.values = values; + trace.labels = labels.length > 1 ? labels : [fullAggName]; + } else { + trace.x = transpose ? values : labels; + trace.y = transpose ? labels : values; + } + return Object.assign(trace, traceOptions); + }); + + var titleText = fullAggName; + var hAxisTitle = transpose ? this.props.rows.join('-') : this.props.cols.join('-'); + var groupByTitle = transpose ? this.props.cols.join('-') : this.props.rows.join('-'); + if (hAxisTitle !== '') { + titleText += ' vs ' + hAxisTitle; + } + if (groupByTitle !== '') { + titleText += ' por ' + groupByTitle; + } + + var layout = { + title: titleText, + hovermode: 'closest', + /* eslint-disable no-magic-numbers */ + width: window.innerWidth / 1.5, + height: window.innerHeight / 1.4 - 50 + /* eslint-enable no-magic-numbers */ + }; + + if (traceOptions.type === 'pie') { + var columns = Math.ceil(Math.sqrt(data.length)); + var rows = Math.ceil(data.length / columns); + layout.grid = { columns: columns, rows: rows }; + data.forEach(function (d, i) { + d.domain = { + row: Math.floor(i / columns), + column: i - columns * Math.floor(i / columns) + }; + if (data.length > 1) { + d.title = d.name; + } + }); + if (data[0].labels.length === 1) { + layout.showlegend = false; + } + } else { + layout.xaxis = { + title: transpose ? fullAggName : null, + automargin: true + }; + layout.yaxis = { + title: transpose ? null : fullAggName, + automargin: true + }; + } + + return _react2.default.createElement(PlotlyComponent, { + data: data, + layout: Object.assign(layout, layoutOptions, this.props.plotlyOptions), + config: this.props.plotlyConfig, + onUpdate: this.props.onRendererUpdate + }); + } + }]); + + return Renderer; + }(_react2.default.PureComponent); + + Renderer.defaultProps = Object.assign({}, _Utilities.PivotData.defaultProps, { + plotlyOptions: {}, + plotlyConfig: {} + }); + Renderer.propTypes = Object.assign({}, _Utilities.PivotData.propTypes, { + plotlyOptions: _propTypes2.default.object, + plotlyConfig: _propTypes2.default.object, + onRendererUpdate: _propTypes2.default.func + }); + + return Renderer; +} + +function makeScatterRenderer(PlotlyComponent) { + var Renderer = function (_React$PureComponent2) { + _inherits(Renderer, _React$PureComponent2); + + function Renderer() { + _classCallCheck(this, Renderer); + + return _possibleConstructorReturn(this, (Renderer.__proto__ || Object.getPrototypeOf(Renderer)).apply(this, arguments)); + } + + _createClass(Renderer, [{ + key: 'render', + value: function render() { + var pivotData = new _Utilities.PivotData(this.props); + var rowKeys = pivotData.getRowKeys(); + var colKeys = pivotData.getColKeys(); + if (rowKeys.length === 0) { + rowKeys.push([]); + } + if (colKeys.length === 0) { + colKeys.push([]); + } + + var data = { x: [], y: [], text: [], type: 'scatter', mode: 'markers' }; + + rowKeys.map(function (rowKey) { + colKeys.map(function (colKey) { + var v = pivotData.getAggregator(rowKey, colKey).value(); + if (v !== null) { + data.x.push(colKey.join('-')); + data.y.push(rowKey.join('-')); + data.text.push(v); + } + }); + }); + + var layout = { + title: this.props.rows.join('-') + ' vs ' + this.props.cols.join('-'), + hovermode: 'closest', + /* eslint-disable no-magic-numbers */ + xaxis: { title: this.props.cols.join('-'), automargin: true }, + yaxis: { title: this.props.rows.join('-'), automargin: true }, + width: window.innerWidth / 1.5, + height: window.innerHeight / 1.4 - 50 + /* eslint-enable no-magic-numbers */ + }; + + return _react2.default.createElement(PlotlyComponent, { + data: [data], + layout: Object.assign(layout, this.props.plotlyOptions), + config: this.props.plotlyConfig, + onUpdate: this.props.onRendererUpdate + }); + } + }]); + + return Renderer; + }(_react2.default.PureComponent); + + Renderer.defaultProps = Object.assign({}, _Utilities.PivotData.defaultProps, { + plotlyOptions: {}, + plotlyConfig: {} + }); + Renderer.propTypes = Object.assign({}, _Utilities.PivotData.propTypes, { + plotlyOptions: _propTypes2.default.object, + plotlyConfig: _propTypes2.default.object, + onRendererUpdate: _propTypes2.default.func + }); + + return Renderer; +} + +function createPlotlyRenderers(PlotlyComponent) { + return { + 'Gráfico de Colunas Agrupadas': makeRenderer(PlotlyComponent, { type: 'bar' }, { barmode: 'group' }), + 'Gráfico de Colunas Empilhadas': makeRenderer(PlotlyComponent, { type: 'bar' }, { barmode: 'relative' }), + 'Gráfico de Barras Agrupadas': makeRenderer(PlotlyComponent, { type: 'bar', orientation: 'h' }, { barmode: 'group' }, true), + 'Gráfico de Barras Empilhadas': makeRenderer(PlotlyComponent, { type: 'bar', orientation: 'h' }, { barmode: 'relative' }, true), + 'Gráfico de Linhas': makeRenderer(PlotlyComponent), + 'Gráfico de Pontos': makeRenderer(PlotlyComponent, { mode: 'markers' }, {}, true), + 'Gráfico de Área': makeRenderer(PlotlyComponent, { stackgroup: 1 }), + 'Gráfico de Dispersão': makeScatterRenderer(PlotlyComponent), + 'Gráfico de Setores': makeRenderer(PlotlyComponent, { type: 'pie', scalegroup: 1, hoverinfo: 'label+value', textinfo: 'none' }, {}, true) + }; +} +module.exports = exports.default; +// # sourceMappingURL=PlotlyRenderers.js.map diff --git a/PlotlyRenderers.js.map b/PlotlyRenderers.js.map new file mode 100644 index 0000000..20697e5 --- /dev/null +++ b/PlotlyRenderers.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["src/PlotlyRenderers.jsx"],"names":["createPlotlyRenderers","makeRenderer","PlotlyComponent","traceOptions","layoutOptions","transpose","Renderer","pivotData","PivotData","props","rowKeys","getRowKeys","colKeys","getColKeys","traceKeys","length","push","datumKeys","fullAggName","aggregatorName","numInputs","aggregators","vals","slice","join","data","map","values","labels","datumKey","val","parseFloat","getAggregator","traceKey","value","isFinite","trace","name","type","x","y","Object","assign","titleText","hAxisTitle","rows","cols","groupByTitle","layout","title","hovermode","width","window","innerWidth","height","innerHeight","columns","Math","ceil","sqrt","grid","forEach","d","i","domain","row","floor","column","showlegend","xaxis","automargin","yaxis","plotlyOptions","plotlyConfig","onRendererUpdate","React","PureComponent","defaultProps","propTypes","PropTypes","object","func","makeScatterRenderer","text","mode","v","rowKey","colKey","barmode","orientation","stackgroup","scalegroup","hoverinfo","textinfo"],"mappings":"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","file":"PlotlyRenderers.js","sourcesContent":["import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport {PivotData} from './Utilities';\r\n\r\n/* eslint-disable react/prop-types */\r\n// eslint can't see inherited propTypes!\r\n\r\nfunction makeRenderer(\r\n PlotlyComponent,\r\n traceOptions = {},\r\n layoutOptions = {},\r\n transpose = false\r\n) {\r\n class Renderer extends React.PureComponent {\r\n render() {\r\n const pivotData = new PivotData(this.props);\r\n const rowKeys = pivotData.getRowKeys();\r\n const colKeys = pivotData.getColKeys();\r\n const traceKeys = transpose ? colKeys : rowKeys;\r\n if (traceKeys.length === 0) {\r\n traceKeys.push([]);\r\n }\r\n const datumKeys = transpose ? rowKeys : colKeys;\r\n if (datumKeys.length === 0) {\r\n datumKeys.push([]);\r\n }\r\n\r\n let fullAggName = this.props.aggregatorName;\r\n const numInputs =\r\n this.props.aggregators[fullAggName]([])().numInputs || 0;\r\n if (numInputs !== 0) {\r\n fullAggName += ` of ${this.props.vals.slice(0, numInputs).join(', ')}`;\r\n }\r\n\r\n const data = traceKeys.map(traceKey => {\r\n const values = [];\r\n const labels = [];\r\n for (const datumKey of datumKeys) {\r\n const val = parseFloat(\r\n pivotData\r\n .getAggregator(\r\n transpose ? datumKey : traceKey,\r\n transpose ? traceKey : datumKey\r\n )\r\n .value()\r\n );\r\n values.push(isFinite(val) ? val : null);\r\n labels.push(datumKey.join('-') || ' ');\r\n }\r\n const trace = {name: traceKey.join('-') || fullAggName};\r\n if (traceOptions.type === 'pie') {\r\n trace.values = values;\r\n trace.labels = labels.length > 1 ? labels : [fullAggName];\r\n } else {\r\n trace.x = transpose ? values : labels;\r\n trace.y = transpose ? labels : values;\r\n }\r\n return Object.assign(trace, traceOptions);\r\n });\r\n\r\n let titleText = fullAggName;\r\n const hAxisTitle = transpose\r\n ? this.props.rows.join('-')\r\n : this.props.cols.join('-');\r\n const groupByTitle = transpose\r\n ? this.props.cols.join('-')\r\n : this.props.rows.join('-');\r\n if (hAxisTitle !== '') {\r\n titleText += ` vs ${hAxisTitle}`;\r\n }\r\n if (groupByTitle !== '') {\r\n titleText += ` by ${groupByTitle}`;\r\n }\r\n\r\n const layout = {\r\n title: titleText,\r\n hovermode: 'closest',\r\n /* eslint-disable no-magic-numbers */\r\n width: window.innerWidth / 1.5,\r\n height: window.innerHeight / 1.4 - 50,\r\n /* eslint-enable no-magic-numbers */\r\n };\r\n\r\n if (traceOptions.type === 'pie') {\r\n const columns = Math.ceil(Math.sqrt(data.length));\r\n const rows = Math.ceil(data.length / columns);\r\n layout.grid = {columns, rows};\r\n data.forEach((d, i) => {\r\n d.domain = {\r\n row: Math.floor(i / columns),\r\n column: i - columns * Math.floor(i / columns),\r\n };\r\n if (data.length > 1) {\r\n d.title = d.name;\r\n }\r\n });\r\n if (data[0].labels.length === 1) {\r\n layout.showlegend = false;\r\n }\r\n } else {\r\n layout.xaxis = {\r\n title: transpose ? fullAggName : null,\r\n automargin: true,\r\n };\r\n layout.yaxis = {\r\n title: transpose ? null : fullAggName,\r\n automargin: true,\r\n };\r\n }\r\n\r\n return (\r\n \r\n );\r\n }\r\n }\r\n\r\n Renderer.defaultProps = Object.assign({}, PivotData.defaultProps, {\r\n plotlyOptions: {},\r\n plotlyConfig: {},\r\n });\r\n Renderer.propTypes = Object.assign({}, PivotData.propTypes, {\r\n plotlyOptions: PropTypes.object,\r\n plotlyConfig: PropTypes.object,\r\n onRendererUpdate: PropTypes.func,\r\n });\r\n\r\n return Renderer;\r\n}\r\n\r\nfunction makeScatterRenderer(PlotlyComponent) {\r\n class Renderer extends React.PureComponent {\r\n render() {\r\n const pivotData = new PivotData(this.props);\r\n const rowKeys = pivotData.getRowKeys();\r\n const colKeys = pivotData.getColKeys();\r\n if (rowKeys.length === 0) {\r\n rowKeys.push([]);\r\n }\r\n if (colKeys.length === 0) {\r\n colKeys.push([]);\r\n }\r\n\r\n const data = {x: [], y: [], text: [], type: 'scatter', mode: 'markers'};\r\n\r\n rowKeys.map(rowKey => {\r\n colKeys.map(colKey => {\r\n const v = pivotData.getAggregator(rowKey, colKey).value();\r\n if (v !== null) {\r\n data.x.push(colKey.join('-'));\r\n data.y.push(rowKey.join('-'));\r\n data.text.push(v);\r\n }\r\n });\r\n });\r\n\r\n const layout = {\r\n title: this.props.rows.join('-') + ' vs ' + this.props.cols.join('-'),\r\n hovermode: 'closest',\r\n /* eslint-disable no-magic-numbers */\r\n xaxis: {title: this.props.cols.join('-'), automargin: true},\r\n yaxis: {title: this.props.rows.join('-'), automargin: true},\r\n width: window.innerWidth / 1.5,\r\n height: window.innerHeight / 1.4 - 50,\r\n /* eslint-enable no-magic-numbers */\r\n };\r\n\r\n return (\r\n \r\n );\r\n }\r\n }\r\n\r\n Renderer.defaultProps = Object.assign({}, PivotData.defaultProps, {\r\n plotlyOptions: {},\r\n plotlyConfig: {},\r\n });\r\n Renderer.propTypes = Object.assign({}, PivotData.propTypes, {\r\n plotlyOptions: PropTypes.object,\r\n plotlyConfig: PropTypes.object,\r\n onRendererUpdate: PropTypes.func,\r\n });\r\n\r\n return Renderer;\r\n}\r\n\r\nexport default function createPlotlyRenderers(PlotlyComponent) {\r\n return {\r\n 'Grouped Column Chart': makeRenderer(\r\n PlotlyComponent,\r\n {type: 'bar'},\r\n {barmode: 'group'}\r\n ),\r\n 'Stacked Column Chart': makeRenderer(\r\n PlotlyComponent,\r\n {type: 'bar'},\r\n {barmode: 'relative'}\r\n ),\r\n 'Grouped Bar Chart': makeRenderer(\r\n PlotlyComponent,\r\n {type: 'bar', orientation: 'h'},\r\n {barmode: 'group'},\r\n true\r\n ),\r\n 'Stacked Bar Chart': makeRenderer(\r\n PlotlyComponent,\r\n {type: 'bar', orientation: 'h'},\r\n {barmode: 'relative'},\r\n true\r\n ),\r\n 'Line Chart': makeRenderer(PlotlyComponent),\r\n 'Dot Chart': makeRenderer(PlotlyComponent, {mode: 'markers'}, {}, true),\r\n 'Area Chart': makeRenderer(PlotlyComponent, {stackgroup: 1}),\r\n 'Scatter Chart': makeScatterRenderer(PlotlyComponent),\r\n 'Multiple Pie Chart': makeRenderer(\r\n PlotlyComponent,\r\n {type: 'pie', scalegroup: 1, hoverinfo: 'label+value', textinfo: 'none'},\r\n {},\r\n true\r\n ),\r\n };\r\n}\r\n"]} \ No newline at end of file diff --git a/TableRenderers.js b/TableRenderers.js new file mode 100644 index 0000000..8c1272c --- /dev/null +++ b/TableRenderers.js @@ -0,0 +1,435 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) {descriptor.writable = true;} Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) {defineProperties(Constructor.prototype, protoProps);} if (staticProps) {defineProperties(Constructor, staticProps);} return Constructor; }; }(); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _propTypes = require('prop-types'); + +var _propTypes2 = _interopRequireDefault(_propTypes); + +var _Utilities = require('./Utilities'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) {Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;} } + +// helper function for setting row/col-span in pivotTableRenderer +var spanSize = function spanSize(arr, i, j) { + var x = void 0; + if (i !== 0) { + var asc = void 0, + end = void 0; + var noDraw = true; + for (x = 0, end = j, asc = end >= 0; asc ? x <= end : x >= end; asc ? x++ : x--) { + if (arr[i - 1][x] !== arr[i][x]) { + noDraw = false; + } + } + if (noDraw) { + return -1; + } + } + var len = 0; + while (i + len < arr.length) { + var asc1 = void 0, + end1 = void 0; + var stop = false; + for (x = 0, end1 = j, asc1 = end1 >= 0; asc1 ? x <= end1 : x >= end1; asc1 ? x++ : x--) { + if (arr[i][x] !== arr[i + len][x]) { + stop = true; + } + } + if (stop) { + break; + } + len++; + } + return len; +}; + +function redColorScaleGenerator(values) { + var min = Math.min.apply(Math, values); + var max = Math.max.apply(Math, values); + return function (x) { + // eslint-disable-next-line no-magic-numbers + var nonRed = 255 - Math.round(255 * (x - min) / (max - min)); + return { backgroundColor: 'rgb(255,' + nonRed + ',' + nonRed + ')' }; + }; +} + +function makeRenderer() { + var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + var TableRenderer = function (_React$PureComponent) { + _inherits(TableRenderer, _React$PureComponent); + + function TableRenderer() { + _classCallCheck(this, TableRenderer); + + return _possibleConstructorReturn(this, (TableRenderer.__proto__ || Object.getPrototypeOf(TableRenderer)).apply(this, arguments)); + } + + _createClass(TableRenderer, [{ + key: 'render', + value: function render() { + var _this2 = this; + + var pivotData = new _Utilities.PivotData(this.props); + var colAttrs = pivotData.props.cols; + var rowAttrs = pivotData.props.rows; + var rowKeys = pivotData.getRowKeys(); + var colKeys = pivotData.getColKeys(); + var grandTotalAggregator = pivotData.getAggregator([], []); + + var valueCellColors = function valueCellColors() {}; + var rowTotalColors = function rowTotalColors() {}; + var colTotalColors = function colTotalColors() {}; + if (opts.heatmapMode) { + var colorScaleGenerator = this.props.tableColorScaleGenerator; + var rowTotalValues = colKeys.map(function (x) { + return pivotData.getAggregator([], x).value(); + }); + rowTotalColors = colorScaleGenerator(rowTotalValues); + var colTotalValues = rowKeys.map(function (x) { + return pivotData.getAggregator(x, []).value(); + }); + colTotalColors = colorScaleGenerator(colTotalValues); + + if (opts.heatmapMode === 'full') { + var allValues = []; + rowKeys.map(function (r) { + return colKeys.map(function (c) { + return allValues.push(pivotData.getAggregator(r, c).value()); + }); + }); + var colorScale = colorScaleGenerator(allValues); + valueCellColors = function valueCellColors(r, c, v) { + return colorScale(v); + }; + } else if (opts.heatmapMode === 'row') { + var rowColorScales = {}; + rowKeys.map(function (r) { + var rowValues = colKeys.map(function (x) { + return pivotData.getAggregator(r, x).value(); + }); + rowColorScales[r] = colorScaleGenerator(rowValues); + }); + valueCellColors = function valueCellColors(r, c, v) { + return rowColorScales[r](v); + }; + } else if (opts.heatmapMode === 'col') { + var colColorScales = {}; + colKeys.map(function (c) { + var colValues = rowKeys.map(function (x) { + return pivotData.getAggregator(x, c).value(); + }); + colColorScales[c] = colorScaleGenerator(colValues); + }); + valueCellColors = function valueCellColors(r, c, v) { + return colColorScales[c](v); + }; + } + } + + var getClickHandler = this.props.tableOptions && this.props.tableOptions.clickCallback ? function (value, rowValues, colValues) { + var filters = {}; + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = Object.keys(colAttrs || {})[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var i = _step.value; + + var attr = colAttrs[i]; + if (colValues[i] !== null) { + filters[attr] = colValues[i]; + } + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return) { + _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = Object.keys(rowAttrs || {})[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var _i = _step2.value; + + var attr = rowAttrs[_i]; + if (rowValues[_i] !== null) { + filters[attr] = rowValues[_i]; + } + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2.return) { + _iterator2.return(); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + + return function (e) { + return _this2.props.tableOptions.clickCallback(e, value, filters, pivotData); + }; + } : null; + + return _react2.default.createElement( + 'table', + { className: 'pvtTable' }, + _react2.default.createElement( + 'thead', + null, + colAttrs.map(function (c, j) { + return _react2.default.createElement( + 'tr', + { key: 'colAttr' + j }, + j === 0 && rowAttrs.length !== 0 && _react2.default.createElement('th', { colSpan: rowAttrs.length, rowSpan: colAttrs.length }), + _react2.default.createElement( + 'th', + { className: 'pvtAxisLabel' }, + c + ), + colKeys.map(function (colKey, i) { + var x = spanSize(colKeys, i, j); + if (x === -1) { + return null; + } + return _react2.default.createElement( + 'th', + { + className: 'pvtColLabel', + key: 'colKey' + i, + colSpan: x, + rowSpan: j === colAttrs.length - 1 && rowAttrs.length !== 0 ? 2 : 1 + }, + colKey[j] + ); + }), + j === 0 && _react2.default.createElement( + 'th', + { + className: 'pvtTotalLabel', + rowSpan: colAttrs.length + (rowAttrs.length === 0 ? 0 : 1) + }, + 'Totais' + ) + ); + }), + rowAttrs.length !== 0 && _react2.default.createElement( + 'tr', + null, + rowAttrs.map(function (r, i) { + return _react2.default.createElement( + 'th', + { className: 'pvtAxisLabel', key: 'rowAttr' + i }, + r + ); + }), + _react2.default.createElement( + 'th', + { className: 'pvtTotalLabel' }, + colAttrs.length === 0 ? 'Totais' : null + ) + ) + ), + _react2.default.createElement( + 'tbody', + null, + rowKeys.map(function (rowKey, i) { + var totalAggregator = pivotData.getAggregator(rowKey, []); + return _react2.default.createElement( + 'tr', + { key: 'rowKeyRow' + i }, + rowKey.map(function (txt, j) { + var x = spanSize(rowKeys, i, j); + if (x === -1) { + return null; + } + return _react2.default.createElement( + 'th', + { + key: 'rowKeyLabel' + i + '-' + j, + className: 'pvtRowLabel', + rowSpan: x, + colSpan: j === rowAttrs.length - 1 && colAttrs.length !== 0 ? 2 : 1 + }, + txt + ); + }), + colKeys.map(function (colKey, j) { + var aggregator = pivotData.getAggregator(rowKey, colKey); + return _react2.default.createElement( + 'td', + { + className: 'pvtVal', + key: 'pvtVal' + i + '-' + j, + onClick: getClickHandler && getClickHandler(aggregator.value(), rowKey, colKey), + style: valueCellColors(rowKey, colKey, aggregator.value()) + }, + aggregator.format(aggregator.value()) + ); + }), + _react2.default.createElement( + 'td', + { + className: 'pvtTotal', + onClick: getClickHandler && getClickHandler(totalAggregator.value(), rowKey, [null]), + style: colTotalColors(totalAggregator.value()) + }, + totalAggregator.format(totalAggregator.value()) + ) + ); + }), + _react2.default.createElement( + 'tr', + null, + _react2.default.createElement( + 'th', + { + className: 'pvtTotalLabel', + colSpan: rowAttrs.length + (colAttrs.length === 0 ? 0 : 1) + }, + 'Totais' + ), + colKeys.map(function (colKey, i) { + var totalAggregator = pivotData.getAggregator([], colKey); + return _react2.default.createElement( + 'td', + { + className: 'pvtTotal', + key: 'total' + i, + onClick: getClickHandler && getClickHandler(totalAggregator.value(), [null], colKey), + style: rowTotalColors(totalAggregator.value()) + }, + totalAggregator.format(totalAggregator.value()) + ); + }), + _react2.default.createElement( + 'td', + { + onClick: getClickHandler && getClickHandler(grandTotalAggregator.value(), [null], [null]), + className: 'pvtGrandTotal' + }, + grandTotalAggregator.format(grandTotalAggregator.value()) + ) + ) + ) + ); + } + }]); + + return TableRenderer; + }(_react2.default.PureComponent); + + TableRenderer.defaultProps = _Utilities.PivotData.defaultProps; + TableRenderer.propTypes = _Utilities.PivotData.propTypes; + TableRenderer.defaultProps.tableColorScaleGenerator = redColorScaleGenerator; + TableRenderer.defaultProps.tableOptions = {}; + TableRenderer.propTypes.tableColorScaleGenerator = _propTypes2.default.func; + TableRenderer.propTypes.tableOptions = _propTypes2.default.object; + return TableRenderer; +} + +var TSVExportRenderer = function (_React$PureComponent2) { + _inherits(TSVExportRenderer, _React$PureComponent2); + + function TSVExportRenderer() { + _classCallCheck(this, TSVExportRenderer); + + return _possibleConstructorReturn(this, (TSVExportRenderer.__proto__ || Object.getPrototypeOf(TSVExportRenderer)).apply(this, arguments)); + } + + _createClass(TSVExportRenderer, [{ + key: 'render', + value: function render() { + var pivotData = new _Utilities.PivotData(this.props); + var rowKeys = pivotData.getRowKeys(); + var colKeys = pivotData.getColKeys(); + if (rowKeys.length === 0) { + rowKeys.push([]); + } + if (colKeys.length === 0) { + colKeys.push([]); + } + + var headerRow = pivotData.props.rows.map(function (r) { + return r; + }); + if (colKeys.length === 1 && colKeys[0].length === 0) { + headerRow.push(this.props.aggregatorName); + } else { + colKeys.map(function (c) { + return headerRow.push(c.join('-')); + }); + } + + var result = rowKeys.map(function (r) { + var row = r.map(function (x) { + return x; + }); + colKeys.map(function (c) { + var v = pivotData.getAggregator(r, c).value(); + row.push(v ? v : ''); + }); + return row; + }); + + result.unshift(headerRow); + + return _react2.default.createElement('textarea', { + value: result.map(function (r) { + return r.join('\t'); + }).join('\n'), + style: { width: window.innerWidth / 2, height: window.innerHeight / 2 }, + readOnly: true + }); + } + }]); + + return TSVExportRenderer; +}(_react2.default.PureComponent); + +TSVExportRenderer.defaultProps = _Utilities.PivotData.defaultProps; +TSVExportRenderer.propTypes = _Utilities.PivotData.propTypes; + +exports.default = { + Tabela: makeRenderer(), + 'Tabela Mapa de Calor': makeRenderer({ heatmapMode: 'full' }), + 'Tabela Mapa de Calor Colunas': makeRenderer({ heatmapMode: 'col' }), + 'Tabela Mapa de Calor Linhas': makeRenderer({ heatmapMode: 'row' }), + 'Exportar Para TSV': TSVExportRenderer +}; +module.exports = exports.default; +// # sourceMappingURL=TableRenderers.js.map diff --git a/TableRenderers.js.map b/TableRenderers.js.map new file mode 100644 index 0000000..b15e23b --- /dev/null +++ b/TableRenderers.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["src/TableRenderers.jsx"],"names":["spanSize","arr","i","j","x","asc","end","noDraw","len","length","asc1","end1","stop","redColorScaleGenerator","values","min","Math","apply","max","nonRed","round","backgroundColor","makeRenderer","opts","TableRenderer","pivotData","PivotData","props","colAttrs","cols","rowAttrs","rows","rowKeys","getRowKeys","colKeys","getColKeys","grandTotalAggregator","getAggregator","valueCellColors","rowTotalColors","colTotalColors","heatmapMode","colorScaleGenerator","tableColorScaleGenerator","rowTotalValues","map","value","colTotalValues","allValues","push","r","c","colorScale","v","rowColorScales","rowValues","colColorScales","colValues","getClickHandler","tableOptions","clickCallback","filters","Object","keys","attr","e","colKey","rowKey","totalAggregator","txt","aggregator","format","React","PureComponent","defaultProps","propTypes","PropTypes","func","object","TSVExportRenderer","headerRow","aggregatorName","join","result","row","unshift","width","window","innerWidth","height","innerHeight","Table"],"mappings":"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","file":"TableRenderers.js","sourcesContent":["import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport {PivotData} from './Utilities';\r\n\r\n// helper function for setting row/col-span in pivotTableRenderer\r\nconst spanSize = function(arr, i, j) {\r\n let x;\r\n if (i !== 0) {\r\n let asc, end;\r\n let noDraw = true;\r\n for (\r\n x = 0, end = j, asc = end >= 0;\r\n asc ? x <= end : x >= end;\r\n asc ? x++ : x--\r\n ) {\r\n if (arr[i - 1][x] !== arr[i][x]) {\r\n noDraw = false;\r\n }\r\n }\r\n if (noDraw) {\r\n return -1;\r\n }\r\n }\r\n let len = 0;\r\n while (i + len < arr.length) {\r\n let asc1, end1;\r\n let stop = false;\r\n for (\r\n x = 0, end1 = j, asc1 = end1 >= 0;\r\n asc1 ? x <= end1 : x >= end1;\r\n asc1 ? x++ : x--\r\n ) {\r\n if (arr[i][x] !== arr[i + len][x]) {\r\n stop = true;\r\n }\r\n }\r\n if (stop) {\r\n break;\r\n }\r\n len++;\r\n }\r\n return len;\r\n};\r\n\r\nfunction redColorScaleGenerator(values) {\r\n const min = Math.min.apply(Math, values);\r\n const max = Math.max.apply(Math, values);\r\n return x => {\r\n // eslint-disable-next-line no-magic-numbers\r\n const nonRed = 255 - Math.round((255 * (x - min)) / (max - min));\r\n return {backgroundColor: `rgb(255,${nonRed},${nonRed})`};\r\n };\r\n}\r\n\r\nfunction makeRenderer(opts = {}) {\r\n class TableRenderer extends React.PureComponent {\r\n render() {\r\n const pivotData = new PivotData(this.props);\r\n const colAttrs = pivotData.props.cols;\r\n const rowAttrs = pivotData.props.rows;\r\n const rowKeys = pivotData.getRowKeys();\r\n const colKeys = pivotData.getColKeys();\r\n const grandTotalAggregator = pivotData.getAggregator([], []);\r\n\r\n let valueCellColors = () => {};\r\n let rowTotalColors = () => {};\r\n let colTotalColors = () => {};\r\n if (opts.heatmapMode) {\r\n const colorScaleGenerator = this.props.tableColorScaleGenerator;\r\n const rowTotalValues = colKeys.map(x =>\r\n pivotData.getAggregator([], x).value()\r\n );\r\n rowTotalColors = colorScaleGenerator(rowTotalValues);\r\n const colTotalValues = rowKeys.map(x =>\r\n pivotData.getAggregator(x, []).value()\r\n );\r\n colTotalColors = colorScaleGenerator(colTotalValues);\r\n\r\n if (opts.heatmapMode === 'full') {\r\n const allValues = [];\r\n rowKeys.map(r =>\r\n colKeys.map(c =>\r\n allValues.push(pivotData.getAggregator(r, c).value())\r\n )\r\n );\r\n const colorScale = colorScaleGenerator(allValues);\r\n valueCellColors = (r, c, v) => colorScale(v);\r\n } else if (opts.heatmapMode === 'row') {\r\n const rowColorScales = {};\r\n rowKeys.map(r => {\r\n const rowValues = colKeys.map(x =>\r\n pivotData.getAggregator(r, x).value()\r\n );\r\n rowColorScales[r] = colorScaleGenerator(rowValues);\r\n });\r\n valueCellColors = (r, c, v) => rowColorScales[r](v);\r\n } else if (opts.heatmapMode === 'col') {\r\n const colColorScales = {};\r\n colKeys.map(c => {\r\n const colValues = rowKeys.map(x =>\r\n pivotData.getAggregator(x, c).value()\r\n );\r\n colColorScales[c] = colorScaleGenerator(colValues);\r\n });\r\n valueCellColors = (r, c, v) => colColorScales[c](v);\r\n }\r\n }\r\n\r\n const getClickHandler =\r\n this.props.tableOptions && this.props.tableOptions.clickCallback\r\n ? (value, rowValues, colValues) => {\r\n const filters = {};\r\n for (const i of Object.keys(colAttrs || {})) {\r\n const attr = colAttrs[i];\r\n if (colValues[i] !== null) {\r\n filters[attr] = colValues[i];\r\n }\r\n }\r\n for (const i of Object.keys(rowAttrs || {})) {\r\n const attr = rowAttrs[i];\r\n if (rowValues[i] !== null) {\r\n filters[attr] = rowValues[i];\r\n }\r\n }\r\n return e =>\r\n this.props.tableOptions.clickCallback(\r\n e,\r\n value,\r\n filters,\r\n pivotData\r\n );\r\n }\r\n : null;\r\n\r\n return (\r\n \r\n \r\n {colAttrs.map(function(c, j) {\r\n return (\r\n \r\n {j === 0 && rowAttrs.length !== 0 && (\r\n \r\n {colKeys.map(function(colKey, i) {\r\n const x = spanSize(colKeys, i, j);\r\n if (x === -1) {\r\n return null;\r\n }\r\n return (\r\n \r\n {colKey[j]}\r\n \r\n );\r\n })}\r\n\r\n {j === 0 && (\r\n \r\n Totals\r\n \r\n )}\r\n \r\n );\r\n })}\r\n\r\n {rowAttrs.length !== 0 && (\r\n \r\n {rowAttrs.map(function(r, i) {\r\n return (\r\n \r\n );\r\n })}\r\n \r\n \r\n )}\r\n \r\n\r\n \r\n {rowKeys.map(function(rowKey, i) {\r\n const totalAggregator = pivotData.getAggregator(rowKey, []);\r\n return (\r\n \r\n {rowKey.map(function(txt, j) {\r\n const x = spanSize(rowKeys, i, j);\r\n if (x === -1) {\r\n return null;\r\n }\r\n return (\r\n \r\n {txt}\r\n \r\n );\r\n })}\r\n {colKeys.map(function(colKey, j) {\r\n const aggregator = pivotData.getAggregator(rowKey, colKey);\r\n return (\r\n \r\n {aggregator.format(aggregator.value())}\r\n \r\n );\r\n })}\r\n \r\n {totalAggregator.format(totalAggregator.value())}\r\n \r\n \r\n );\r\n })}\r\n\r\n \r\n \r\n Totals\r\n \r\n\r\n {colKeys.map(function(colKey, i) {\r\n const totalAggregator = pivotData.getAggregator([], colKey);\r\n return (\r\n \r\n {totalAggregator.format(totalAggregator.value())}\r\n \r\n );\r\n })}\r\n\r\n \r\n {grandTotalAggregator.format(grandTotalAggregator.value())}\r\n \r\n \r\n \r\n
    \r\n )}\r\n {c}
    \r\n {r}\r\n \r\n {colAttrs.length === 0 ? 'Totals' : null}\r\n
    \r\n );\r\n }\r\n }\r\n\r\n TableRenderer.defaultProps = PivotData.defaultProps;\r\n TableRenderer.propTypes = PivotData.propTypes;\r\n TableRenderer.defaultProps.tableColorScaleGenerator = redColorScaleGenerator;\r\n TableRenderer.defaultProps.tableOptions = {};\r\n TableRenderer.propTypes.tableColorScaleGenerator = PropTypes.func;\r\n TableRenderer.propTypes.tableOptions = PropTypes.object;\r\n return TableRenderer;\r\n}\r\n\r\nclass TSVExportRenderer extends React.PureComponent {\r\n render() {\r\n const pivotData = new PivotData(this.props);\r\n const rowKeys = pivotData.getRowKeys();\r\n const colKeys = pivotData.getColKeys();\r\n if (rowKeys.length === 0) {\r\n rowKeys.push([]);\r\n }\r\n if (colKeys.length === 0) {\r\n colKeys.push([]);\r\n }\r\n\r\n const headerRow = pivotData.props.rows.map(r => r);\r\n if (colKeys.length === 1 && colKeys[0].length === 0) {\r\n headerRow.push(this.props.aggregatorName);\r\n } else {\r\n colKeys.map(c => headerRow.push(c.join('-')));\r\n }\r\n\r\n const result = rowKeys.map(r => {\r\n const row = r.map(x => x);\r\n colKeys.map(c => {\r\n const v = pivotData.getAggregator(r, c).value();\r\n row.push(v ? v : '');\r\n });\r\n return row;\r\n });\r\n\r\n result.unshift(headerRow);\r\n\r\n return (\r\n r.join('\\t')).join('\\n')}\r\n style={{width: window.innerWidth / 2, height: window.innerHeight / 2}}\r\n readOnly={true}\r\n />\r\n );\r\n }\r\n}\r\n\r\nTSVExportRenderer.defaultProps = PivotData.defaultProps;\r\nTSVExportRenderer.propTypes = PivotData.propTypes;\r\n\r\nexport default {\r\n Table: makeRenderer(),\r\n 'Table Heatmap': makeRenderer({heatmapMode: 'full'}),\r\n 'Table Col Heatmap': makeRenderer({heatmapMode: 'col'}),\r\n 'Table Row Heatmap': makeRenderer({heatmapMode: 'row'}),\r\n 'Exportable TSV': TSVExportRenderer,\r\n};\r\n"]} \ No newline at end of file diff --git a/Utilities.js b/Utilities.js new file mode 100644 index 0000000..75c7cfe --- /dev/null +++ b/Utilities.js @@ -0,0 +1,1034 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.PivotData = exports.sortAs = exports.getSort = exports.numberFormat = exports.naturalSort = exports.locales = exports.derivers = exports.aggregators = exports.aggregatorTemplates = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) {descriptor.writable = true;} Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) {defineProperties(Constructor.prototype, protoProps);} if (staticProps) {defineProperties(Constructor, staticProps);} return Constructor; }; }(); + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) {break;} } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i.return) {_i.return();} } finally { if (_d) {throw _e;} } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } throw new TypeError("Invalid attempt to destructure non-iterable instance"); }; }(); + +var _propTypes = require('prop-types'); + +var _propTypes2 = _interopRequireDefault(_propTypes); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } return Array.from(arr); } + +/* + * decaffeinate suggestions: + * DS101: Remove unnecessary use of Array.from + * DS102: Remove unnecessary code created because of implicit returns + * DS104: Avoid inline assignments + * DS201: Simplify complex destructure assignments + * DS203: Remove `|| {}` from converted for-own loops + * DS205: Consider reworking code to avoid use of IIFEs + * DS207: Consider shorter variations of null checks + * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md + */ + +var addSeparators = function addSeparators(nStr, thousandsSep, decimalSep) { + var x = String(nStr).split('.'); + var x1 = x[0]; + var x2 = x.length > 1 ? decimalSep + x[1] : ''; + var rgx = /(\d+)(\d{3})/; + while (rgx.test(x1)) { + x1 = x1.replace(rgx, '$1' + thousandsSep + '$2'); + } + return x1 + x2; +}; + +var numberFormat = function numberFormat(opts_in) { + var defaults = { + digitsAfterDecimal: 2, + scaler: 1, + thousandsSep: ',', + decimalSep: '.', + prefix: '', + suffix: '' + }; + var opts = Object.assign({}, defaults, opts_in); + return function (x) { + if (isNaN(x) || !isFinite(x)) { + return ''; + } + var result = addSeparators((opts.scaler * x).toFixed(opts.digitsAfterDecimal), opts.thousandsSep, opts.decimalSep); + return String(opts.prefix) + result + opts.suffix; + }; +}; + +var rx = /(\d+)|(\D+)/g; +var rd = /\d/; +var rz = /^0/; +var naturalSort = function naturalSort(as, bs) { + // nulls first + if (bs !== null && as === null) { + return -1; + } + if (as !== null && bs === null) { + return 1; + } + + // then raw NaNs + if (typeof as === 'number' && isNaN(as)) { + return -1; + } + if (typeof bs === 'number' && isNaN(bs)) { + return 1; + } + + // numbers and numbery strings group together + var nas = Number(as); + var nbs = Number(bs); + if (nas < nbs) { + return -1; + } + if (nas > nbs) { + return 1; + } + + // within that, true numbers before numbery strings + if (typeof as === 'number' && typeof bs !== 'number') { + return -1; + } + if (typeof bs === 'number' && typeof as !== 'number') { + return 1; + } + if (typeof as === 'number' && typeof bs === 'number') { + return 0; + } + + // 'Infinity' is a textual number, so less than 'A' + if (isNaN(nbs) && !isNaN(nas)) { + return -1; + } + if (isNaN(nas) && !isNaN(nbs)) { + return 1; + } + + // finally, "smart" string sorting per http://stackoverflow.com/a/4373421/112871 + var a = String(as); + var b = String(bs); + if (a === b) { + return 0; + } + if (!rd.test(a) || !rd.test(b)) { + return a > b ? 1 : -1; + } + + // special treatment for strings containing digits + a = a.match(rx); + b = b.match(rx); + while (a.length && b.length) { + var a1 = a.shift(); + var b1 = b.shift(); + if (a1 !== b1) { + if (rd.test(a1) && rd.test(b1)) { + return a1.replace(rz, '.0') - b1.replace(rz, '.0'); + } + return a1 > b1 ? 1 : -1; + } + } + return a.length - b.length; +}; + +var sortAs = function sortAs(order) { + var mapping = {}; + + // sort lowercased keys similarly + var l_mapping = {}; + for (var i in order) { + var x = order[i]; + mapping[x] = i; + if (typeof x === 'string') { + l_mapping[x.toLowerCase()] = i; + } + } + return function (a, b) { + if (a in mapping && b in mapping) { + return mapping[a] - mapping[b]; + } else if (a in mapping) { + return -1; + } else if (b in mapping) { + return 1; + } else if (a in l_mapping && b in l_mapping) { + return l_mapping[a] - l_mapping[b]; + } else if (a in l_mapping) { + return -1; + } else if (b in l_mapping) { + return 1; + } + return naturalSort(a, b); + }; +}; + +var getSort = function getSort(sorters, attr) { + if (sorters) { + if (typeof sorters === 'function') { + var sort = sorters(attr); + if (typeof sort === 'function') { + return sort; + } + } else if (attr in sorters) { + return sorters[attr]; + } + } + return naturalSort; +}; + +// aggregator templates default to US number formatting but this is overrideable +var usFmt = numberFormat(); +var usFmtInt = numberFormat({ digitsAfterDecimal: 0 }); +var usFmtPct = numberFormat({ + digitsAfterDecimal: 1, + scaler: 100, + suffix: '%' +}); + +var aggregatorTemplates = { + count: function count() { + var formatter = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : usFmtInt; + + return function () { + return function () { + return { + count: 0, + push: function push() { + this.count++; + }, + value: function value() { + return this.count; + }, + + format: formatter + }; + }; + }; + }, + uniques: function uniques(fn) { + var formatter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : usFmtInt; + + return function (_ref) { + var _ref2 = _slicedToArray(_ref, 1), + attr = _ref2[0]; + + return function () { + return { + uniq: [], + push: function push(record) { + if (!Array.from(this.uniq).includes(record[attr])) { + this.uniq.push(record[attr]); + } + }, + value: function value() { + return fn(this.uniq); + }, + + format: formatter, + numInputs: typeof attr !== 'undefined' ? 0 : 1 + }; + }; + }; + }, + sum: function sum() { + var formatter = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : usFmt; + + return function (_ref3) { + var _ref4 = _slicedToArray(_ref3, 1), + attr = _ref4[0]; + + return function () { + return { + sum: 0, + push: function push(record) { + if (!isNaN(parseFloat(record[attr]))) { + this.sum += parseFloat(record[attr]); + } + }, + value: function value() { + return this.sum; + }, + + format: formatter, + numInputs: typeof attr !== 'undefined' ? 0 : 1 + }; + }; + }; + }, + extremes: function extremes(mode) { + var formatter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : usFmt; + + return function (_ref5) { + var _ref6 = _slicedToArray(_ref5, 1), + attr = _ref6[0]; + + return function (data) { + return { + val: null, + sorter: getSort(typeof data !== 'undefined' ? data.sorters : null, attr), + push: function push(record) { + var x = record[attr]; + if (['min', 'max'].includes(mode)) { + x = parseFloat(x); + if (!isNaN(x)) { + this.val = Math[mode](x, this.val !== null ? this.val : x); + } + } + if (mode === 'first' && this.sorter(x, this.val !== null ? this.val : x) <= 0) { + this.val = x; + } + if (mode === 'last' && this.sorter(x, this.val !== null ? this.val : x) >= 0) { + this.val = x; + } + }, + value: function value() { + return this.val; + }, + format: function format(x) { + if (isNaN(x)) { + return x; + } + return formatter(x); + }, + + numInputs: typeof attr !== 'undefined' ? 0 : 1 + }; + }; + }; + }, + quantile: function quantile(q) { + var formatter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : usFmt; + + return function (_ref7) { + var _ref8 = _slicedToArray(_ref7, 1), + attr = _ref8[0]; + + return function () { + return { + vals: [], + push: function push(record) { + var x = parseFloat(record[attr]); + if (!isNaN(x)) { + this.vals.push(x); + } + }, + value: function value() { + if (this.vals.length === 0) { + return null; + } + this.vals.sort(function (a, b) { + return a - b; + }); + var i = (this.vals.length - 1) * q; + return (this.vals[Math.floor(i)] + this.vals[Math.ceil(i)]) / 2.0; + }, + + format: formatter, + numInputs: typeof attr !== 'undefined' ? 0 : 1 + }; + }; + }; + }, + runningStat: function runningStat() { + var mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'mean'; + var ddof = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; + var formatter = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : usFmt; + + return function (_ref9) { + var _ref10 = _slicedToArray(_ref9, 1), + attr = _ref10[0]; + + return function () { + return { + n: 0.0, + m: 0.0, + s: 0.0, + push: function push(record) { + var x = parseFloat(record[attr]); + if (isNaN(x)) { + return; + } + this.n += 1.0; + if (this.n === 1.0) { + this.m = x; + } + var m_new = this.m + (x - this.m) / this.n; + this.s = this.s + (x - this.m) * (x - m_new); + this.m = m_new; + }, + value: function value() { + if (mode === 'mean') { + if (this.n === 0) { + return 0 / 0; + } + return this.m; + } + if (this.n <= ddof) { + return 0; + } + switch (mode) { + case 'var': + return this.s / (this.n - ddof); + case 'stdev': + return Math.sqrt(this.s / (this.n - ddof)); + default: + throw new Error('unknown mode for runningStat'); + } + }, + + format: formatter, + numInputs: typeof attr !== 'undefined' ? 0 : 1 + }; + }; + }; + }, + sumOverSum: function sumOverSum() { + var formatter = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : usFmt; + + return function (_ref11) { + var _ref12 = _slicedToArray(_ref11, 2), + num = _ref12[0], + denom = _ref12[1]; + + return function () { + return { + sumNum: 0, + sumDenom: 0, + push: function push(record) { + if (!isNaN(parseFloat(record[num]))) { + this.sumNum += parseFloat(record[num]); + } + if (!isNaN(parseFloat(record[denom]))) { + this.sumDenom += parseFloat(record[denom]); + } + }, + value: function value() { + return this.sumNum / this.sumDenom; + }, + + format: formatter, + numInputs: typeof num !== 'undefined' && typeof denom !== 'undefined' ? 0 : 2 + }; + }; + }; + }, + fractionOf: function fractionOf(wrapped) { + var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'total'; + var formatter = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : usFmtPct; + + return function () { + for (var _len = arguments.length, x = Array(_len), _key = 0; _key < _len; _key++) { + x[_key] = arguments[_key]; + } + + return function (data, rowKey, colKey) { + return { + selector: { total: [[], []], row: [rowKey, []], col: [[], colKey] }[type], + inner: wrapped.apply(undefined, _toConsumableArray(Array.from(x || [])))(data, rowKey, colKey), + push: function push(record) { + this.inner.push(record); + }, + + format: formatter, + value: function value() { + return this.inner.value() / data.getAggregator.apply(data, _toConsumableArray(Array.from(this.selector || []))).inner.value(); + }, + + numInputs: wrapped.apply(undefined, _toConsumableArray(Array.from(x || [])))().numInputs + }; + }; + }; + } +}; + +aggregatorTemplates.countUnique = function (f) { + return aggregatorTemplates.uniques(function (x) { + return x.length; + }, f); +}; +aggregatorTemplates.listUnique = function (s) { + return aggregatorTemplates.uniques(function (x) { + return x.join(s); + }, function (x) { + return x; + }); +}; +aggregatorTemplates.max = function (f) { + return aggregatorTemplates.extremes('max', f); +}; +aggregatorTemplates.min = function (f) { + return aggregatorTemplates.extremes('min', f); +}; +aggregatorTemplates.first = function (f) { + return aggregatorTemplates.extremes('first', f); +}; +aggregatorTemplates.last = function (f) { + return aggregatorTemplates.extremes('last', f); +}; +aggregatorTemplates.median = function (f) { + return aggregatorTemplates.quantile(0.5, f); +}; +aggregatorTemplates.average = function (f) { + return aggregatorTemplates.runningStat('mean', 1, f); +}; +aggregatorTemplates.var = function (ddof, f) { + return aggregatorTemplates.runningStat('var', ddof, f); +}; +aggregatorTemplates.stdev = function (ddof, f) { + return aggregatorTemplates.runningStat('stdev', ddof, f); +}; + +// default aggregators & renderers use US naming and number formatting +var aggregators = function (tpl) { + return { + Contar: tpl.count(usFmtInt), + 'Contar Valores Únicos': tpl.countUnique(usFmtInt), + 'Listar Valores Únicos': tpl.listUnique(', '), + Soma: tpl.sum(usFmt), + 'Soma Inteira': tpl.sum(usFmtInt), + Media: tpl.average(usFmt), + Mediana: tpl.median(usFmt), + 'Variação de Modelo': tpl.var(1, usFmt), + 'Desvio Padrão de Modelo': tpl.stdev(1, usFmt), + Minimo: tpl.min(usFmt), + Maximo: tpl.max(usFmt), + Primeiro: tpl.first(usFmt), + Ultimo: tpl.last(usFmt), + 'Soma Sobre Soma': tpl.sumOverSum(usFmt), + 'Soma Como Fração do Total': tpl.fractionOf(tpl.sum(), 'total', usFmtPct), + 'Soma Como Fração de Linhas': tpl.fractionOf(tpl.sum(), 'row', usFmtPct), + 'Soma Como Fração de Colunas': tpl.fractionOf(tpl.sum(), 'col', usFmtPct), + 'Contar Como Fração do Total': tpl.fractionOf(tpl.count(), 'total', usFmtPct), + 'Contar Como Fração de Linhas': tpl.fractionOf(tpl.count(), 'row', usFmtPct), + 'Contar Como Fração de Colunas': tpl.fractionOf(tpl.count(), 'col', usFmtPct) + }; +}(aggregatorTemplates); + +var locales = { + en: { + aggregators: aggregators, + localeStrings: { + renderError: 'Ocorreu um erro ao renderizar os resultados da Tabela Dinâmica.', + computeError: 'Ocorreu um erro ao calcular os resultados da Tabela Dinâmica.', + uiRenderError: 'Ocorreu um erro ao renderizar a interface do usuário da Tabela Dinâmica', + selectAll: 'Selecione Todos', + selectNone: 'Selecione Nenhum', + tooMany: '(Muitos para Listar)', + filterResults: 'Filtrar Valores', + apply: 'Aplicar', + cancel: 'Cancelar', + totals: 'Totais', + vs: 'vs', + by: 'por' + } + } +}; + +// dateFormat deriver l10n requires month and day names to be passed in directly +var mthNamesEn = ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez']; +var dayNamesEn = ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sab']; +var zeroPad = function zeroPad(number) { + return ('0' + number).substr(-2, 2); +}; // eslint-disable-line no-magic-numbers + +var derivers = { + bin: function bin(col, binWidth) { + return function (record) { + return record[col] - record[col] % binWidth; + }; + }, + dateFormat: function dateFormat(col, formatString) { + var utcOutput = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var mthNames = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : mthNamesEn; + var dayNames = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : dayNamesEn; + + var utc = utcOutput ? 'UTC' : ''; + return function (record) { + var date = new Date(Date.parse(record[col])); + if (isNaN(date)) { + return ''; + } + return formatString.replace(/%(.)/g, function (m, p) { + switch (p) { + case 'y': + return date['get' + utc + 'FullYear'](); + case 'm': + return zeroPad(date['get' + utc + 'Month']() + 1); + case 'n': + return mthNames[date['get' + utc + 'Month']()]; + case 'd': + return zeroPad(date['get' + utc + 'Date']()); + case 'w': + return dayNames[date['get' + utc + 'Day']()]; + case 'x': + return date['get' + utc + 'Day'](); + case 'H': + return zeroPad(date['get' + utc + 'Hours']()); + case 'M': + return zeroPad(date['get' + utc + 'Minutes']()); + case 'S': + return zeroPad(date['get' + utc + 'Seconds']()); + default: + return '%' + p; + } + }); + }; + } +}; + +/* +Data Model class +*/ + +var PivotData = function () { + function PivotData() { + var _this = this; + + var inputProps = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + _classCallCheck(this, PivotData); + + this.props = Object.assign({}, PivotData.defaultProps, inputProps); + _propTypes2.default.checkPropTypes(PivotData.propTypes, this.props, 'prop', 'PivotData'); + + this.aggregator = this.props.aggregators[this.props.aggregatorName](this.props.vals); + this.tree = {}; + this.rowKeys = []; + this.colKeys = []; + this.rowTotals = {}; + this.colTotals = {}; + this.allTotal = this.aggregator(this, [], []); + this.sorted = false; + + // iterate through input, accumulating data for cells + PivotData.forEachRecord(this.props.data, this.props.derivedAttributes, function (record) { + if (_this.filter(record)) { + _this.processRecord(record); + } + }); + } + + _createClass(PivotData, [{ + key: 'filter', + value: function filter(record) { + for (var k in this.props.valueFilter) { + if (record[k] in this.props.valueFilter[k]) { + return false; + } + } + return true; + } + }, { + key: 'forEachMatchingRecord', + value: function forEachMatchingRecord(criteria, callback) { + var _this2 = this; + + return PivotData.forEachRecord(this.props.data, this.props.derivedAttributes, function (record) { + if (!_this2.filter(record)) { + return; + } + for (var k in criteria) { + var v = criteria[k]; + if (v !== (k in record ? record[k] : 'null')) { + return; + } + } + callback(record); + }); + } + }, { + key: 'arrSort', + value: function arrSort(attrs) { + var _this3 = this; + + var a = void 0; + var sortersArr = function () { + var result = []; + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = Array.from(attrs)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + a = _step.value; + + result.push(getSort(_this3.props.sorters, a)); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return) { + _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + return result; + }(); + return function (a, b) { + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = Object.keys(sortersArr || {})[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var i = _step2.value; + + var sorter = sortersArr[i]; + var comparison = sorter(a[i], b[i]); + if (comparison !== 0) { + return comparison; + } + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2.return) { + _iterator2.return(); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + + return 0; + }; + } + }, { + key: 'sortKeys', + value: function sortKeys() { + var _this4 = this; + + if (!this.sorted) { + this.sorted = true; + var v = function v(r, c) { + return _this4.getAggregator(r, c).value(); + }; + switch (this.props.rowOrder) { + case 'value_a_to_z': + this.rowKeys.sort(function (a, b) { + return naturalSort(v(a, []), v(b, [])); + }); + break; + case 'value_z_to_a': + this.rowKeys.sort(function (a, b) { + return -naturalSort(v(a, []), v(b, [])); + }); + break; + default: + this.rowKeys.sort(this.arrSort(this.props.rows)); + } + switch (this.props.colOrder) { + case 'value_a_to_z': + this.colKeys.sort(function (a, b) { + return naturalSort(v([], a), v([], b)); + }); + break; + case 'value_z_to_a': + this.colKeys.sort(function (a, b) { + return -naturalSort(v([], a), v([], b)); + }); + break; + default: + this.colKeys.sort(this.arrSort(this.props.cols)); + } + } + } + }, { + key: 'getColKeys', + value: function getColKeys() { + this.sortKeys(); + return this.colKeys; + } + }, { + key: 'getRowKeys', + value: function getRowKeys() { + this.sortKeys(); + return this.rowKeys; + } + }, { + key: 'processRecord', + value: function processRecord(record) { + // this code is called in a tight loop + var colKey = []; + var rowKey = []; + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + for (var _iterator3 = Array.from(this.props.cols)[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var x = _step3.value; + + colKey.push(x in record ? record[x] : 'null'); + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3.return) { + _iterator3.return(); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + + var _iteratorNormalCompletion4 = true; + var _didIteratorError4 = false; + var _iteratorError4 = undefined; + + try { + for (var _iterator4 = Array.from(this.props.rows)[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { + var _x16 = _step4.value; + + rowKey.push(_x16 in record ? record[_x16] : 'null'); + } + } catch (err) { + _didIteratorError4 = true; + _iteratorError4 = err; + } finally { + try { + if (!_iteratorNormalCompletion4 && _iterator4.return) { + _iterator4.return(); + } + } finally { + if (_didIteratorError4) { + throw _iteratorError4; + } + } + } + + var flatRowKey = rowKey.join(String.fromCharCode(0)); + var flatColKey = colKey.join(String.fromCharCode(0)); + + this.allTotal.push(record); + + if (rowKey.length !== 0) { + if (!this.rowTotals[flatRowKey]) { + this.rowKeys.push(rowKey); + this.rowTotals[flatRowKey] = this.aggregator(this, rowKey, []); + } + this.rowTotals[flatRowKey].push(record); + } + + if (colKey.length !== 0) { + if (!this.colTotals[flatColKey]) { + this.colKeys.push(colKey); + this.colTotals[flatColKey] = this.aggregator(this, [], colKey); + } + this.colTotals[flatColKey].push(record); + } + + if (colKey.length !== 0 && rowKey.length !== 0) { + if (!this.tree[flatRowKey]) { + this.tree[flatRowKey] = {}; + } + if (!this.tree[flatRowKey][flatColKey]) { + this.tree[flatRowKey][flatColKey] = this.aggregator(this, rowKey, colKey); + } + this.tree[flatRowKey][flatColKey].push(record); + } + } + }, { + key: 'getAggregator', + value: function getAggregator(rowKey, colKey) { + var agg = void 0; + var flatRowKey = rowKey.join(String.fromCharCode(0)); + var flatColKey = colKey.join(String.fromCharCode(0)); + if (rowKey.length === 0 && colKey.length === 0) { + agg = this.allTotal; + } else if (rowKey.length === 0) { + agg = this.colTotals[flatColKey]; + } else if (colKey.length === 0) { + agg = this.rowTotals[flatRowKey]; + } else { + agg = this.tree[flatRowKey][flatColKey]; + } + return agg || { + value: function value() { + return null; + }, + format: function format() { + return ''; + } + }; + } + }]); + + return PivotData; +}(); + +// can handle arrays or jQuery selections of tables + + +PivotData.forEachRecord = function (input, derivedAttributes, f) { + var addRecord = void 0, + record = void 0; + if (Object.getOwnPropertyNames(derivedAttributes).length === 0) { + addRecord = f; + } else { + addRecord = function addRecord(record) { + for (var k in derivedAttributes) { + var derived = derivedAttributes[k](record); + if (derived !== null) { + record[k] = derived; + } + } + return f(record); + }; + } + + // if it's a function, have it call us back + if (typeof input === 'function') { + return input(addRecord); + } else if (Array.isArray(input)) { + if (Array.isArray(input[0])) { + // array of arrays + return function () { + var result = []; + var _iteratorNormalCompletion5 = true; + var _didIteratorError5 = false; + var _iteratorError5 = undefined; + + try { + for (var _iterator5 = Object.keys(input || {})[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { + var i = _step5.value; + + var compactRecord = input[i]; + if (i > 0) { + record = {}; + var _iteratorNormalCompletion6 = true; + var _didIteratorError6 = false; + var _iteratorError6 = undefined; + + try { + for (var _iterator6 = Object.keys(input[0] || {})[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { + var j = _step6.value; + + var k = input[0][j]; + record[k] = compactRecord[j]; + } + } catch (err) { + _didIteratorError6 = true; + _iteratorError6 = err; + } finally { + try { + if (!_iteratorNormalCompletion6 && _iterator6.return) { + _iterator6.return(); + } + } finally { + if (_didIteratorError6) { + throw _iteratorError6; + } + } + } + + result.push(addRecord(record)); + } + } + } catch (err) { + _didIteratorError5 = true; + _iteratorError5 = err; + } finally { + try { + if (!_iteratorNormalCompletion5 && _iterator5.return) { + _iterator5.return(); + } + } finally { + if (_didIteratorError5) { + throw _iteratorError5; + } + } + } + + return result; + }(); + } + + // array of objects + return function () { + var result1 = []; + var _iteratorNormalCompletion7 = true; + var _didIteratorError7 = false; + var _iteratorError7 = undefined; + + try { + for (var _iterator7 = Array.from(input)[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) { + record = _step7.value; + + result1.push(addRecord(record)); + } + } catch (err) { + _didIteratorError7 = true; + _iteratorError7 = err; + } finally { + try { + if (!_iteratorNormalCompletion7 && _iterator7.return) { + _iterator7.return(); + } + } finally { + if (_didIteratorError7) { + throw _iteratorError7; + } + } + } + + return result1; + }(); + } + throw new Error('unknown input format'); +}; + +PivotData.defaultProps = { + aggregators: aggregators, + cols: [], + rows: [], + vals: [], + aggregatorName: 'Contar', + sorters: {}, + valueFilter: {}, + rowOrder: 'key_a_to_z', + colOrder: 'key_a_to_z', + derivedAttributes: {} +}; +PivotData.propTypes = { + data: _propTypes2.default.oneOfType([_propTypes2.default.array, _propTypes2.default.object, _propTypes2.default.func]).isRequired, + aggregatorName: _propTypes2.default.string, + cols: _propTypes2.default.arrayOf(_propTypes2.default.string), + rows: _propTypes2.default.arrayOf(_propTypes2.default.string), + vals: _propTypes2.default.arrayOf(_propTypes2.default.string), + valueFilter: _propTypes2.default.objectOf(_propTypes2.default.objectOf(_propTypes2.default.bool)), + sorters: _propTypes2.default.oneOfType([_propTypes2.default.func, _propTypes2.default.objectOf(_propTypes2.default.func)]), + derivedAttributes: _propTypes2.default.objectOf(_propTypes2.default.func), + rowOrder: _propTypes2.default.oneOf(['key_a_to_z', 'value_a_to_z', 'value_z_to_a']), + colOrder: _propTypes2.default.oneOf(['key_a_to_z', 'value_a_to_z', 'value_z_to_a']) +}; + +exports.aggregatorTemplates = aggregatorTemplates; +exports.aggregators = aggregators; +exports.derivers = derivers; +exports.locales = locales; +exports.naturalSort = naturalSort; +exports.numberFormat = numberFormat; +exports.getSort = getSort; +exports.sortAs = sortAs; +exports.PivotData = PivotData; +// # sourceMappingURL=Utilities.js.map diff --git a/Utilities.js.map b/Utilities.js.map new file mode 100644 index 0000000..d32e479 --- /dev/null +++ b/Utilities.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["src/Utilities.js"],"names":["addSeparators","nStr","thousandsSep","decimalSep","x","String","split","x1","x2","length","rgx","test","replace","numberFormat","opts_in","defaults","digitsAfterDecimal","scaler","prefix","suffix","opts","Object","assign","isNaN","isFinite","result","toFixed","rx","rd","rz","naturalSort","as","bs","nas","Number","nbs","a","b","match","a1","shift","b1","sortAs","order","mapping","l_mapping","i","toLowerCase","getSort","sorters","attr","sort","usFmt","usFmtInt","usFmtPct","aggregatorTemplates","count","formatter","push","value","format","uniques","fn","uniq","record","Array","from","includes","numInputs","sum","parseFloat","extremes","mode","data","val","sorter","Math","quantile","q","vals","floor","ceil","runningStat","ddof","n","m","s","m_new","sqrt","Error","sumOverSum","num","denom","sumNum","sumDenom","fractionOf","wrapped","type","rowKey","colKey","selector","total","row","col","inner","getAggregator","countUnique","f","listUnique","join","max","min","first","last","median","average","var","stdev","aggregators","Count","tpl","Sum","Average","Median","Minimum","Maximum","First","Last","locales","en","localeStrings","renderError","computeError","uiRenderError","selectAll","selectNone","tooMany","filterResults","apply","cancel","totals","vs","by","mthNamesEn","dayNamesEn","zeroPad","number","substr","derivers","bin","binWidth","dateFormat","formatString","utcOutput","mthNames","dayNames","utc","date","Date","parse","p","PivotData","inputProps","props","defaultProps","PropTypes","checkPropTypes","propTypes","aggregator","aggregatorName","tree","rowKeys","colKeys","rowTotals","colTotals","allTotal","sorted","forEachRecord","derivedAttributes","filter","processRecord","k","valueFilter","criteria","callback","v","attrs","sortersArr","keys","comparison","r","c","rowOrder","arrSort","rows","colOrder","cols","sortKeys","flatRowKey","fromCharCode","flatColKey","agg","input","addRecord","getOwnPropertyNames","derived","isArray","compactRecord","j","result1","oneOfType","array","object","func","isRequired","string","arrayOf","objectOf","bool","oneOf"],"mappings":"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","file":"Utilities.js","sourcesContent":["import PropTypes from 'prop-types';\r\n\r\n/*\r\n * decaffeinate suggestions:\r\n * DS101: Remove unnecessary use of Array.from\r\n * DS102: Remove unnecessary code created because of implicit returns\r\n * DS104: Avoid inline assignments\r\n * DS201: Simplify complex destructure assignments\r\n * DS203: Remove `|| {}` from converted for-own loops\r\n * DS205: Consider reworking code to avoid use of IIFEs\r\n * DS207: Consider shorter variations of null checks\r\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\r\n */\r\n\r\nconst addSeparators = function(nStr, thousandsSep, decimalSep) {\r\n const x = String(nStr).split('.');\r\n let x1 = x[0];\r\n const x2 = x.length > 1 ? decimalSep + x[1] : '';\r\n const rgx = /(\\d+)(\\d{3})/;\r\n while (rgx.test(x1)) {\r\n x1 = x1.replace(rgx, `$1${thousandsSep}$2`);\r\n }\r\n return x1 + x2;\r\n};\r\n\r\nconst numberFormat = function(opts_in) {\r\n const defaults = {\r\n digitsAfterDecimal: 2,\r\n scaler: 1,\r\n thousandsSep: ',',\r\n decimalSep: '.',\r\n prefix: '',\r\n suffix: '',\r\n };\r\n const opts = Object.assign({}, defaults, opts_in);\r\n return function(x) {\r\n if (isNaN(x) || !isFinite(x)) {\r\n return '';\r\n }\r\n const result = addSeparators(\r\n (opts.scaler * x).toFixed(opts.digitsAfterDecimal),\r\n opts.thousandsSep,\r\n opts.decimalSep\r\n );\r\n return `${opts.prefix}${result}${opts.suffix}`;\r\n };\r\n};\r\n\r\nconst rx = /(\\d+)|(\\D+)/g;\r\nconst rd = /\\d/;\r\nconst rz = /^0/;\r\nconst naturalSort = (as, bs) => {\r\n // nulls first\r\n if (bs !== null && as === null) {\r\n return -1;\r\n }\r\n if (as !== null && bs === null) {\r\n return 1;\r\n }\r\n\r\n // then raw NaNs\r\n if (typeof as === 'number' && isNaN(as)) {\r\n return -1;\r\n }\r\n if (typeof bs === 'number' && isNaN(bs)) {\r\n return 1;\r\n }\r\n\r\n // numbers and numbery strings group together\r\n const nas = Number(as);\r\n const nbs = Number(bs);\r\n if (nas < nbs) {\r\n return -1;\r\n }\r\n if (nas > nbs) {\r\n return 1;\r\n }\r\n\r\n // within that, true numbers before numbery strings\r\n if (typeof as === 'number' && typeof bs !== 'number') {\r\n return -1;\r\n }\r\n if (typeof bs === 'number' && typeof as !== 'number') {\r\n return 1;\r\n }\r\n if (typeof as === 'number' && typeof bs === 'number') {\r\n return 0;\r\n }\r\n\r\n // 'Infinity' is a textual number, so less than 'A'\r\n if (isNaN(nbs) && !isNaN(nas)) {\r\n return -1;\r\n }\r\n if (isNaN(nas) && !isNaN(nbs)) {\r\n return 1;\r\n }\r\n\r\n // finally, \"smart\" string sorting per http://stackoverflow.com/a/4373421/112871\r\n let a = String(as);\r\n let b = String(bs);\r\n if (a === b) {\r\n return 0;\r\n }\r\n if (!rd.test(a) || !rd.test(b)) {\r\n return a > b ? 1 : -1;\r\n }\r\n\r\n // special treatment for strings containing digits\r\n a = a.match(rx);\r\n b = b.match(rx);\r\n while (a.length && b.length) {\r\n const a1 = a.shift();\r\n const b1 = b.shift();\r\n if (a1 !== b1) {\r\n if (rd.test(a1) && rd.test(b1)) {\r\n return a1.replace(rz, '.0') - b1.replace(rz, '.0');\r\n }\r\n return a1 > b1 ? 1 : -1;\r\n }\r\n }\r\n return a.length - b.length;\r\n};\r\n\r\nconst sortAs = function(order) {\r\n const mapping = {};\r\n\r\n // sort lowercased keys similarly\r\n const l_mapping = {};\r\n for (const i in order) {\r\n const x = order[i];\r\n mapping[x] = i;\r\n if (typeof x === 'string') {\r\n l_mapping[x.toLowerCase()] = i;\r\n }\r\n }\r\n return function(a, b) {\r\n if (a in mapping && b in mapping) {\r\n return mapping[a] - mapping[b];\r\n } else if (a in mapping) {\r\n return -1;\r\n } else if (b in mapping) {\r\n return 1;\r\n } else if (a in l_mapping && b in l_mapping) {\r\n return l_mapping[a] - l_mapping[b];\r\n } else if (a in l_mapping) {\r\n return -1;\r\n } else if (b in l_mapping) {\r\n return 1;\r\n }\r\n return naturalSort(a, b);\r\n };\r\n};\r\n\r\nconst getSort = function(sorters, attr) {\r\n if (sorters) {\r\n if (typeof sorters === 'function') {\r\n const sort = sorters(attr);\r\n if (typeof sort === 'function') {\r\n return sort;\r\n }\r\n } else if (attr in sorters) {\r\n return sorters[attr];\r\n }\r\n }\r\n return naturalSort;\r\n};\r\n\r\n// aggregator templates default to US number formatting but this is overrideable\r\nconst usFmt = numberFormat();\r\nconst usFmtInt = numberFormat({digitsAfterDecimal: 0});\r\nconst usFmtPct = numberFormat({\r\n digitsAfterDecimal: 1,\r\n scaler: 100,\r\n suffix: '%',\r\n});\r\n\r\nconst aggregatorTemplates = {\r\n count(formatter = usFmtInt) {\r\n return () =>\r\n function() {\r\n return {\r\n count: 0,\r\n push() {\r\n this.count++;\r\n },\r\n value() {\r\n return this.count;\r\n },\r\n format: formatter,\r\n };\r\n };\r\n },\r\n\r\n uniques(fn, formatter = usFmtInt) {\r\n return function([attr]) {\r\n return function() {\r\n return {\r\n uniq: [],\r\n push(record) {\r\n if (!Array.from(this.uniq).includes(record[attr])) {\r\n this.uniq.push(record[attr]);\r\n }\r\n },\r\n value() {\r\n return fn(this.uniq);\r\n },\r\n format: formatter,\r\n numInputs: typeof attr !== 'undefined' ? 0 : 1,\r\n };\r\n };\r\n };\r\n },\r\n\r\n sum(formatter = usFmt) {\r\n return function([attr]) {\r\n return function() {\r\n return {\r\n sum: 0,\r\n push(record) {\r\n if (!isNaN(parseFloat(record[attr]))) {\r\n this.sum += parseFloat(record[attr]);\r\n }\r\n },\r\n value() {\r\n return this.sum;\r\n },\r\n format: formatter,\r\n numInputs: typeof attr !== 'undefined' ? 0 : 1,\r\n };\r\n };\r\n };\r\n },\r\n\r\n extremes(mode, formatter = usFmt) {\r\n return function([attr]) {\r\n return function(data) {\r\n return {\r\n val: null,\r\n sorter: getSort(\r\n typeof data !== 'undefined' ? data.sorters : null,\r\n attr\r\n ),\r\n push(record) {\r\n let x = record[attr];\r\n if (['min', 'max'].includes(mode)) {\r\n x = parseFloat(x);\r\n if (!isNaN(x)) {\r\n this.val = Math[mode](x, this.val !== null ? this.val : x);\r\n }\r\n }\r\n if (\r\n mode === 'first' &&\r\n this.sorter(x, this.val !== null ? this.val : x) <= 0\r\n ) {\r\n this.val = x;\r\n }\r\n if (\r\n mode === 'last' &&\r\n this.sorter(x, this.val !== null ? this.val : x) >= 0\r\n ) {\r\n this.val = x;\r\n }\r\n },\r\n value() {\r\n return this.val;\r\n },\r\n format(x) {\r\n if (isNaN(x)) {\r\n return x;\r\n }\r\n return formatter(x);\r\n },\r\n numInputs: typeof attr !== 'undefined' ? 0 : 1,\r\n };\r\n };\r\n };\r\n },\r\n\r\n quantile(q, formatter = usFmt) {\r\n return function([attr]) {\r\n return function() {\r\n return {\r\n vals: [],\r\n push(record) {\r\n const x = parseFloat(record[attr]);\r\n if (!isNaN(x)) {\r\n this.vals.push(x);\r\n }\r\n },\r\n value() {\r\n if (this.vals.length === 0) {\r\n return null;\r\n }\r\n this.vals.sort((a, b) => a - b);\r\n const i = (this.vals.length - 1) * q;\r\n return (this.vals[Math.floor(i)] + this.vals[Math.ceil(i)]) / 2.0;\r\n },\r\n format: formatter,\r\n numInputs: typeof attr !== 'undefined' ? 0 : 1,\r\n };\r\n };\r\n };\r\n },\r\n\r\n runningStat(mode = 'mean', ddof = 1, formatter = usFmt) {\r\n return function([attr]) {\r\n return function() {\r\n return {\r\n n: 0.0,\r\n m: 0.0,\r\n s: 0.0,\r\n push(record) {\r\n const x = parseFloat(record[attr]);\r\n if (isNaN(x)) {\r\n return;\r\n }\r\n this.n += 1.0;\r\n if (this.n === 1.0) {\r\n this.m = x;\r\n }\r\n const m_new = this.m + (x - this.m) / this.n;\r\n this.s = this.s + (x - this.m) * (x - m_new);\r\n this.m = m_new;\r\n },\r\n value() {\r\n if (mode === 'mean') {\r\n if (this.n === 0) {\r\n return 0 / 0;\r\n }\r\n return this.m;\r\n }\r\n if (this.n <= ddof) {\r\n return 0;\r\n }\r\n switch (mode) {\r\n case 'var':\r\n return this.s / (this.n - ddof);\r\n case 'stdev':\r\n return Math.sqrt(this.s / (this.n - ddof));\r\n default:\r\n throw new Error('unknown mode for runningStat');\r\n }\r\n },\r\n format: formatter,\r\n numInputs: typeof attr !== 'undefined' ? 0 : 1,\r\n };\r\n };\r\n };\r\n },\r\n\r\n sumOverSum(formatter = usFmt) {\r\n return function([num, denom]) {\r\n return function() {\r\n return {\r\n sumNum: 0,\r\n sumDenom: 0,\r\n push(record) {\r\n if (!isNaN(parseFloat(record[num]))) {\r\n this.sumNum += parseFloat(record[num]);\r\n }\r\n if (!isNaN(parseFloat(record[denom]))) {\r\n this.sumDenom += parseFloat(record[denom]);\r\n }\r\n },\r\n value() {\r\n return this.sumNum / this.sumDenom;\r\n },\r\n format: formatter,\r\n numInputs:\r\n typeof num !== 'undefined' && typeof denom !== 'undefined' ? 0 : 2,\r\n };\r\n };\r\n };\r\n },\r\n\r\n fractionOf(wrapped, type = 'total', formatter = usFmtPct) {\r\n return (...x) =>\r\n function(data, rowKey, colKey) {\r\n return {\r\n selector: {total: [[], []], row: [rowKey, []], col: [[], colKey]}[\r\n type\r\n ],\r\n inner: wrapped(...Array.from(x || []))(data, rowKey, colKey),\r\n push(record) {\r\n this.inner.push(record);\r\n },\r\n format: formatter,\r\n value() {\r\n return (\r\n this.inner.value() /\r\n data\r\n .getAggregator(...Array.from(this.selector || []))\r\n .inner.value()\r\n );\r\n },\r\n numInputs: wrapped(...Array.from(x || []))().numInputs,\r\n };\r\n };\r\n },\r\n};\r\n\r\naggregatorTemplates.countUnique = f =>\r\n aggregatorTemplates.uniques(x => x.length, f);\r\naggregatorTemplates.listUnique = s =>\r\n aggregatorTemplates.uniques(\r\n x => x.join(s),\r\n x => x\r\n );\r\naggregatorTemplates.max = f => aggregatorTemplates.extremes('max', f);\r\naggregatorTemplates.min = f => aggregatorTemplates.extremes('min', f);\r\naggregatorTemplates.first = f => aggregatorTemplates.extremes('first', f);\r\naggregatorTemplates.last = f => aggregatorTemplates.extremes('last', f);\r\naggregatorTemplates.median = f => aggregatorTemplates.quantile(0.5, f);\r\naggregatorTemplates.average = f =>\r\n aggregatorTemplates.runningStat('mean', 1, f);\r\naggregatorTemplates.var = (ddof, f) =>\r\n aggregatorTemplates.runningStat('var', ddof, f);\r\naggregatorTemplates.stdev = (ddof, f) =>\r\n aggregatorTemplates.runningStat('stdev', ddof, f);\r\n\r\n// default aggregators & renderers use US naming and number formatting\r\nconst aggregators = (tpl => ({\r\n Count: tpl.count(usFmtInt),\r\n 'Count Unique Values': tpl.countUnique(usFmtInt),\r\n 'List Unique Values': tpl.listUnique(', '),\r\n Sum: tpl.sum(usFmt),\r\n 'Integer Sum': tpl.sum(usFmtInt),\r\n Average: tpl.average(usFmt),\r\n Median: tpl.median(usFmt),\r\n 'Sample Variance': tpl.var(1, usFmt),\r\n 'Sample Standard Deviation': tpl.stdev(1, usFmt),\r\n Minimum: tpl.min(usFmt),\r\n Maximum: tpl.max(usFmt),\r\n First: tpl.first(usFmt),\r\n Last: tpl.last(usFmt),\r\n 'Sum over Sum': tpl.sumOverSum(usFmt),\r\n 'Sum as Fraction of Total': tpl.fractionOf(tpl.sum(), 'total', usFmtPct),\r\n 'Sum as Fraction of Rows': tpl.fractionOf(tpl.sum(), 'row', usFmtPct),\r\n 'Sum as Fraction of Columns': tpl.fractionOf(tpl.sum(), 'col', usFmtPct),\r\n 'Count as Fraction of Total': tpl.fractionOf(tpl.count(), 'total', usFmtPct),\r\n 'Count as Fraction of Rows': tpl.fractionOf(tpl.count(), 'row', usFmtPct),\r\n 'Count as Fraction of Columns': tpl.fractionOf(tpl.count(), 'col', usFmtPct),\r\n}))(aggregatorTemplates);\r\n\r\nconst locales = {\r\n en: {\r\n aggregators,\r\n localeStrings: {\r\n renderError: 'An error occurred rendering the PivotTable results.',\r\n computeError: 'An error occurred computing the PivotTable results.',\r\n uiRenderError: 'An error occurred rendering the PivotTable UI.',\r\n selectAll: 'Select All',\r\n selectNone: 'Select None',\r\n tooMany: '(too many to list)',\r\n filterResults: 'Filter values',\r\n apply: 'Apply',\r\n cancel: 'Cancel',\r\n totals: 'Totals',\r\n vs: 'vs',\r\n by: 'by',\r\n },\r\n },\r\n};\r\n\r\n// dateFormat deriver l10n requires month and day names to be passed in directly\r\nconst mthNamesEn = [\r\n 'Jan',\r\n 'Feb',\r\n 'Mar',\r\n 'Apr',\r\n 'May',\r\n 'Jun',\r\n 'Jul',\r\n 'Aug',\r\n 'Sep',\r\n 'Oct',\r\n 'Nov',\r\n 'Dec',\r\n];\r\nconst dayNamesEn = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\r\nconst zeroPad = number => `0${number}`.substr(-2, 2); // eslint-disable-line no-magic-numbers\r\n\r\nconst derivers = {\r\n bin(col, binWidth) {\r\n return record => record[col] - (record[col] % binWidth);\r\n },\r\n dateFormat(\r\n col,\r\n formatString,\r\n utcOutput = false,\r\n mthNames = mthNamesEn,\r\n dayNames = dayNamesEn\r\n ) {\r\n const utc = utcOutput ? 'UTC' : '';\r\n return function(record) {\r\n const date = new Date(Date.parse(record[col]));\r\n if (isNaN(date)) {\r\n return '';\r\n }\r\n return formatString.replace(/%(.)/g, function(m, p) {\r\n switch (p) {\r\n case 'y':\r\n return date[`get${utc}FullYear`]();\r\n case 'm':\r\n return zeroPad(date[`get${utc}Month`]() + 1);\r\n case 'n':\r\n return mthNames[date[`get${utc}Month`]()];\r\n case 'd':\r\n return zeroPad(date[`get${utc}Date`]());\r\n case 'w':\r\n return dayNames[date[`get${utc}Day`]()];\r\n case 'x':\r\n return date[`get${utc}Day`]();\r\n case 'H':\r\n return zeroPad(date[`get${utc}Hours`]());\r\n case 'M':\r\n return zeroPad(date[`get${utc}Minutes`]());\r\n case 'S':\r\n return zeroPad(date[`get${utc}Seconds`]());\r\n default:\r\n return `%${p}`;\r\n }\r\n });\r\n };\r\n },\r\n};\r\n\r\n/*\r\nData Model class\r\n*/\r\n\r\nclass PivotData {\r\n constructor(inputProps = {}) {\r\n this.props = Object.assign({}, PivotData.defaultProps, inputProps);\r\n PropTypes.checkPropTypes(\r\n PivotData.propTypes,\r\n this.props,\r\n 'prop',\r\n 'PivotData'\r\n );\r\n\r\n this.aggregator = this.props.aggregators[this.props.aggregatorName](\r\n this.props.vals\r\n );\r\n this.tree = {};\r\n this.rowKeys = [];\r\n this.colKeys = [];\r\n this.rowTotals = {};\r\n this.colTotals = {};\r\n this.allTotal = this.aggregator(this, [], []);\r\n this.sorted = false;\r\n\r\n // iterate through input, accumulating data for cells\r\n PivotData.forEachRecord(\r\n this.props.data,\r\n this.props.derivedAttributes,\r\n record => {\r\n if (this.filter(record)) {\r\n this.processRecord(record);\r\n }\r\n }\r\n );\r\n }\r\n\r\n filter(record) {\r\n for (const k in this.props.valueFilter) {\r\n if (record[k] in this.props.valueFilter[k]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n forEachMatchingRecord(criteria, callback) {\r\n return PivotData.forEachRecord(\r\n this.props.data,\r\n this.props.derivedAttributes,\r\n record => {\r\n if (!this.filter(record)) {\r\n return;\r\n }\r\n for (const k in criteria) {\r\n const v = criteria[k];\r\n if (v !== (k in record ? record[k] : 'null')) {\r\n return;\r\n }\r\n }\r\n callback(record);\r\n }\r\n );\r\n }\r\n\r\n arrSort(attrs) {\r\n let a;\r\n const sortersArr = (() => {\r\n const result = [];\r\n for (a of Array.from(attrs)) {\r\n result.push(getSort(this.props.sorters, a));\r\n }\r\n return result;\r\n })();\r\n return function(a, b) {\r\n for (const i of Object.keys(sortersArr || {})) {\r\n const sorter = sortersArr[i];\r\n const comparison = sorter(a[i], b[i]);\r\n if (comparison !== 0) {\r\n return comparison;\r\n }\r\n }\r\n return 0;\r\n };\r\n }\r\n\r\n sortKeys() {\r\n if (!this.sorted) {\r\n this.sorted = true;\r\n const v = (r, c) => this.getAggregator(r, c).value();\r\n switch (this.props.rowOrder) {\r\n case 'value_a_to_z':\r\n this.rowKeys.sort((a, b) => naturalSort(v(a, []), v(b, [])));\r\n break;\r\n case 'value_z_to_a':\r\n this.rowKeys.sort((a, b) => -naturalSort(v(a, []), v(b, [])));\r\n break;\r\n default:\r\n this.rowKeys.sort(this.arrSort(this.props.rows));\r\n }\r\n switch (this.props.colOrder) {\r\n case 'value_a_to_z':\r\n this.colKeys.sort((a, b) => naturalSort(v([], a), v([], b)));\r\n break;\r\n case 'value_z_to_a':\r\n this.colKeys.sort((a, b) => -naturalSort(v([], a), v([], b)));\r\n break;\r\n default:\r\n this.colKeys.sort(this.arrSort(this.props.cols));\r\n }\r\n }\r\n }\r\n\r\n getColKeys() {\r\n this.sortKeys();\r\n return this.colKeys;\r\n }\r\n\r\n getRowKeys() {\r\n this.sortKeys();\r\n return this.rowKeys;\r\n }\r\n\r\n processRecord(record) {\r\n // this code is called in a tight loop\r\n const colKey = [];\r\n const rowKey = [];\r\n for (const x of Array.from(this.props.cols)) {\r\n colKey.push(x in record ? record[x] : 'null');\r\n }\r\n for (const x of Array.from(this.props.rows)) {\r\n rowKey.push(x in record ? record[x] : 'null');\r\n }\r\n const flatRowKey = rowKey.join(String.fromCharCode(0));\r\n const flatColKey = colKey.join(String.fromCharCode(0));\r\n\r\n this.allTotal.push(record);\r\n\r\n if (rowKey.length !== 0) {\r\n if (!this.rowTotals[flatRowKey]) {\r\n this.rowKeys.push(rowKey);\r\n this.rowTotals[flatRowKey] = this.aggregator(this, rowKey, []);\r\n }\r\n this.rowTotals[flatRowKey].push(record);\r\n }\r\n\r\n if (colKey.length !== 0) {\r\n if (!this.colTotals[flatColKey]) {\r\n this.colKeys.push(colKey);\r\n this.colTotals[flatColKey] = this.aggregator(this, [], colKey);\r\n }\r\n this.colTotals[flatColKey].push(record);\r\n }\r\n\r\n if (colKey.length !== 0 && rowKey.length !== 0) {\r\n if (!this.tree[flatRowKey]) {\r\n this.tree[flatRowKey] = {};\r\n }\r\n if (!this.tree[flatRowKey][flatColKey]) {\r\n this.tree[flatRowKey][flatColKey] = this.aggregator(\r\n this,\r\n rowKey,\r\n colKey\r\n );\r\n }\r\n this.tree[flatRowKey][flatColKey].push(record);\r\n }\r\n }\r\n\r\n getAggregator(rowKey, colKey) {\r\n let agg;\r\n const flatRowKey = rowKey.join(String.fromCharCode(0));\r\n const flatColKey = colKey.join(String.fromCharCode(0));\r\n if (rowKey.length === 0 && colKey.length === 0) {\r\n agg = this.allTotal;\r\n } else if (rowKey.length === 0) {\r\n agg = this.colTotals[flatColKey];\r\n } else if (colKey.length === 0) {\r\n agg = this.rowTotals[flatRowKey];\r\n } else {\r\n agg = this.tree[flatRowKey][flatColKey];\r\n }\r\n return (\r\n agg || {\r\n value() {\r\n return null;\r\n },\r\n format() {\r\n return '';\r\n },\r\n }\r\n );\r\n }\r\n}\r\n\r\n// can handle arrays or jQuery selections of tables\r\nPivotData.forEachRecord = function(input, derivedAttributes, f) {\r\n let addRecord, record;\r\n if (Object.getOwnPropertyNames(derivedAttributes).length === 0) {\r\n addRecord = f;\r\n } else {\r\n addRecord = function(record) {\r\n for (const k in derivedAttributes) {\r\n const derived = derivedAttributes[k](record);\r\n if (derived !== null) {\r\n record[k] = derived;\r\n }\r\n }\r\n return f(record);\r\n };\r\n }\r\n\r\n // if it's a function, have it call us back\r\n if (typeof input === 'function') {\r\n return input(addRecord);\r\n } else if (Array.isArray(input)) {\r\n if (Array.isArray(input[0])) {\r\n // array of arrays\r\n return (() => {\r\n const result = [];\r\n for (const i of Object.keys(input || {})) {\r\n const compactRecord = input[i];\r\n if (i > 0) {\r\n record = {};\r\n for (const j of Object.keys(input[0] || {})) {\r\n const k = input[0][j];\r\n record[k] = compactRecord[j];\r\n }\r\n result.push(addRecord(record));\r\n }\r\n }\r\n return result;\r\n })();\r\n }\r\n\r\n // array of objects\r\n return (() => {\r\n const result1 = [];\r\n for (record of Array.from(input)) {\r\n result1.push(addRecord(record));\r\n }\r\n return result1;\r\n })();\r\n }\r\n throw new Error('unknown input format');\r\n};\r\n\r\nPivotData.defaultProps = {\r\n aggregators: aggregators,\r\n cols: [],\r\n rows: [],\r\n vals: [],\r\n aggregatorName: 'Count',\r\n sorters: {},\r\n valueFilter: {},\r\n rowOrder: 'key_a_to_z',\r\n colOrder: 'key_a_to_z',\r\n derivedAttributes: {},\r\n};\r\n\r\nPivotData.propTypes = {\r\n data: PropTypes.oneOfType([PropTypes.array, PropTypes.object, PropTypes.func])\r\n .isRequired,\r\n aggregatorName: PropTypes.string,\r\n cols: PropTypes.arrayOf(PropTypes.string),\r\n rows: PropTypes.arrayOf(PropTypes.string),\r\n vals: PropTypes.arrayOf(PropTypes.string),\r\n valueFilter: PropTypes.objectOf(PropTypes.objectOf(PropTypes.bool)),\r\n sorters: PropTypes.oneOfType([\r\n PropTypes.func,\r\n PropTypes.objectOf(PropTypes.func),\r\n ]),\r\n derivedAttributes: PropTypes.objectOf(PropTypes.func),\r\n rowOrder: PropTypes.oneOf(['key_a_to_z', 'value_a_to_z', 'value_z_to_a']),\r\n colOrder: PropTypes.oneOf(['key_a_to_z', 'value_a_to_z', 'value_z_to_a']),\r\n};\r\n\r\nexport {\r\n aggregatorTemplates,\r\n aggregators,\r\n derivers,\r\n locales,\r\n naturalSort,\r\n numberFormat,\r\n getSort,\r\n sortAs,\r\n PivotData,\r\n};\r\n"]} \ No newline at end of file diff --git a/pivottable.css b/pivottable.css new file mode 100644 index 0000000..2ce162f --- /dev/null +++ b/pivottable.css @@ -0,0 +1,343 @@ +.pvtUi { + color: black; + font-family: Verdana; + border-collapse: collapse; +} +.pvtUi select { + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + -khtml-user-select: none; + -ms-user-select: none; +} + +.pvtUi td.pvtOutput { + vertical-align: top; +} + +table.pvtTable { + font-size: 8pt; + text-align: left; + border-collapse: collapse; + margin-top: 3px; + margin-left: 3px; + font-family: Verdana; + font-weight: 500; +} +table.pvtTable thead tr th, +table.pvtTable tbody tr th { + background-color: #fafafa; + border: 1px solid #e5e5e5; + font-size: 8pt; + padding: 5px; +} + +table.pvtTable .pvtColLabel { + text-align: center; +} +table.pvtTable .pvtTotalLabel { + text-align: right; +} + +table.pvtTable tbody tr td { + color: black; + padding: 5px; + background-color: #fff; + border: 1px solid #c8d4e3; + vertical-align: top; + text-align: right; +} + +.pvtTotal, +.pvtGrandTotal { + font-weight: bold; +} + +.pvtRowOrder, +.pvtColOrder { + cursor: pointer; + width: 15px; + margin-left: 5px; + display: inline-block; + user-select: none; + text-decoration: none !important; + -webkit-user-select: none; + -moz-user-select: none; + -khtml-user-select: none; + -ms-user-select: none; +} + +.pvtAxisContainer, +.pvtVals { + border: 1px solid #f0f0f0; + background: #fafafa; + padding: 5px; + min-width: 20px; + min-height: 20px; +} + +.pvtRenderers { + padding-left: 5px; + user-select: none; + padding-bottom: 6px; +} + +.pvtDropdown { + color: black; + display: inline-block; + position: relative; + -webkit-user-select: none; + -moz-user-select: none; + -khtml-user-select: none; + -ms-user-select: none; + margin: 3px; +} +.pvtDropdown:hover { + border: #8b82f5; +} + +.pvtDropdownIcon { + float: right; + color: #d9d9d9; +} +.pvtDropdownCurrent { + text-align: left; + border: 1px solid #d9d9d9; + border-radius: 4px; + display: inline-block; + position: relative; + width: 210px; + box-sizing: border-box; + background: white; +} +.pvtDropdownCurrent:hover { + border: 1px solid #8b82f5; +} + +.pvtDropdownCurrentOpen { + border-radius: 4px 4px 0 0; +} + +.pvtDropdownMenu { + background: white; + position: absolute; + width: 100%; + margin-top: -1px; + border-radius: 0 0 4px 4px; + border: 1px solid #d9d9d9; + border-top: 1px solid #dfe8f3; + box-sizing: border-box; + z-index: 300; + height: 300px; + overflow: auto; +} + +.pvtDropdownValue { + padding: 2px 5px; + font-size: 14px; + text-align: left; +} +.pvtDropdownActiveValue { + background: #fafafa; +} + +.pvtVals { + text-align: center; + white-space: nowrap; + vertical-align: top; + padding-bottom: 12px; +} + +.pvtRows { + height: 35px; +} + +.pvtAxisContainer li { + padding: 8px 6px; + list-style-type: none; + cursor: move; +} +.pvtAxisContainer li.pvtPlaceholder { + -webkit-border-radius: 5px; + padding: 3px 15px; + -moz-border-radius: 5px; + border-radius: 5px; + border: 1px dashed #a2b1c6; +} +.pvtAxisContainer li.pvtPlaceholder span.pvtAttr { + display: none; +} + +.pvtAxisContainer li span.pvtAttr { + -webkit-text-size-adjust: 100%; + background: white; + border: 1px solid #c8d4e3; + padding: 2px 5px; + white-space: nowrap; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + -khtml-user-select: none; + -ms-user-select: none; +} + +.pvtTriangle { + cursor: pointer; + color: #506784; +} + +.pvtHorizList li { + display: inline-block; +} +.pvtVertList { + vertical-align: top; +} + +.pvtFilteredAttribute { + font-style: italic; +} + +.sortable-chosen .pvtFilterBox { + display: none !important; +} + +.pvtCloseX { + position: absolute; + right: 5px; + top: 5px; + font-size: 18px; + cursor: pointer; + text-decoration: none !important; +} + +.pvtDragHandle { + position: absolute; + left: 5px; + top: 5px; + font-size: 18px; + cursor: move; + color: #a2b1c6; +} + +.pvtButton { + color: #ffffff; + border-radius: 5px; + padding: 3px 6px; + background: #5e56e7; + border: 1px solid; + font-size: 14px; + margin: 3px; + transition: 0.34s all cubic-bezier(0.19, 1, 0.22, 1); + text-decoration: none !important; +} + +.pvtButton:hover { + opacity: 0.4; + color: white; + } + +.pvtButton:active { + /* background: white;*/ +} + +.pvtFilterBox input { + border: 1px solid #c8d4e3; + border-radius: 5px; + color: #506784; + padding: 0 3px; + font-size: 14px; +} +.pvtFilterBox input:hover { + border: 1px solid #5e56e7; +} + + + +.pvtFilterBox input:focus { + border-color: #5e56e7; + outline: none; +} + +.pvtFilterBox { + z-index: 1500; + width: 300px; + border-radius: 5px; + border: 1px solid #e0e0e0; + background-color: #fff; + position: absolute; + text-align: center; + user-select: none; + min-height: 100px; + -webkit-user-select: none; + -moz-user-select: none; + -khtml-user-select: none; + -ms-user-select: none; +} + +.pvtFilterBox h4 { + margin: 15px; +} +.pvtFilterBox p { + margin: 12px auto; +} +.pvtFilterBox button { + color: #2a3f5f; +} +.pvtFilterBox input[type='text'] { + width: 230px; + color: #2a3f5f; + margin-bottom: 12px; +} + +.pvtCheckContainer { + text-align: left; + font-size: 14px; + white-space: nowrap; + overflow-y: scroll; + width: 100%; + max-height: 30vh; + border-top: 1px solid #dfe8f3; +} + +.pvtCheckContainer p { + margin: 0; + margin-bottom: 1px; + padding: 3px; + cursor: default; +} + +.pvtCheckContainer p.selected { + background: #f0f0f0; +} + +.pvtOnly { + color: #f0f0f0; + display: none; + width: 35px; + float: left; + font-size: 12px; + padding-left: 5px; + padding-right: 30px; + cursor: default; + visibility: hidden; +} + +.pvtOnlySpacer { + display: block; + width: 35px; + float: left; +} + +.pvtCheckContainer p:hover .pvtOnly { + display: block; +} +.pvtCheckContainer p:hover .pvtOnlySpacer { + display: none; +} + +.pvtRendererArea { + padding: 5px; +}