From 59c205c1afdafda13d891c58b3e50a21814d6d25 Mon Sep 17 00:00:00 2001 From: gustavoFKGrupo Date: Thu, 14 Apr 2022 15:56:53 -0300 Subject: [PATCH] translate --- .gitignore | 12 +- PivotTable.js | 66 +++ PivotTable.js.map | 1 + PivotTableUI.js | 720 ++++++++++++++++++++++++++++ PivotTableUI.js.map | 1 + PlotlyRenderers.js | 265 ++++++++++ PlotlyRenderers.js.map | 1 + TableRenderers.js | 435 +++++++++++++++++ TableRenderers.js.map | 1 + Utilities.js | 1034 ++++++++++++++++++++++++++++++++++++++++ Utilities.js.map | 1 + pivottable.css | 343 +++++++++++++ 12 files changed, 2869 insertions(+), 11 deletions(-) create mode 100644 PivotTable.js create mode 100644 PivotTable.js.map create mode 100644 PivotTableUI.js create mode 100644 PivotTableUI.js.map create mode 100644 PlotlyRenderers.js create mode 100644 PlotlyRenderers.js.map create mode 100644 TableRenderers.js create mode 100644 TableRenderers.js.map create mode 100644 Utilities.js create mode 100644 Utilities.js.map create mode 100644 pivottable.css 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":";;;;;;;;;AAAA;;;;AACA;;;;AACA;;;;AACA;;AACA;;;;AACA;;;;AACA;;;;;;;;;;;;;;AAEA;AACA;;IAEaA,kB,WAAAA,kB;;;AACX,8BAAYC,KAAZ,EAAmB;AAAA;;AAAA,wIACXA,KADW;;AAEjB,UAAKC,KAAL,GAAa,EAACC,MAAM,KAAP,EAAcC,YAAY,EAA1B,EAAb;AAFiB;AAGlB;;;;gCAEWC,K,EAAO;AACjB,UAAIA,SAAS,KAAKJ,KAAL,CAAWK,WAAxB,EAAqC;AACnC,aAAKL,KAAL,CAAWM,sBAAX,CAAkC,KAAKN,KAAL,CAAWO,IAA7C,EAAmD,CAACH,KAAD,CAAnD;AACD,OAFD,MAEO;AACL,aAAKJ,KAAL,CAAWQ,iBAAX,CAA6B,KAAKR,KAAL,CAAWO,IAAxC,EAA8C,CAACH,KAAD,CAA9C;AACD;AACF;;;kCAEaK,C,EAAG;AACf,aAAOA,EACJC,WADI,GAEJC,IAFI,GAGJC,QAHI,CAGK,KAAKX,KAAL,CAAWE,UAAX,CAAsBO,WAAtB,GAAoCC,IAApC,EAHL,CAAP;AAID;;;+BAEUE,C,EAAGT,K,EAAO;AACnBS,QAAEC,eAAF;AACA,WAAKd,KAAL,CAAWe,iBAAX,CACE,KAAKf,KAAL,CAAWO,IADb,EAEES,OAAOC,IAAP,CAAY,KAAKjB,KAAL,CAAWkB,UAAvB,EAAmCC,MAAnC,CAA0C;AAAA,eAAKC,MAAMhB,KAAX;AAAA,OAA1C,CAFF;AAID;;;mCAEc;AAAA;;AACb,UAAMiB,WACJL,OAAOC,IAAP,CAAY,KAAKjB,KAAL,CAAWkB,UAAvB,EAAmCI,MAAnC,GAA4C,KAAKtB,KAAL,CAAWuB,SADzD;;AAGA,UAAMC,SAASR,OAAOC,IAAP,CAAY,KAAKjB,KAAL,CAAWkB,UAAvB,CAAf;AACA,UAAMO,QAAQD,OACXL,MADW,CACJ,KAAKO,aAAL,CAAmBC,IAAnB,CAAwB,IAAxB,CADI,EAEXC,IAFW,CAEN,KAAK5B,KAAL,CAAW6B,MAFL,CAAd;;AAIA,aACE;AAAC,gCAAD;AAAA,UAAW,QAAO,gBAAlB;AACE;AAAA;AAAA;AACE,uBAAU,cADZ;AAEE,mBAAO;AACLC,uBAAS,OADJ;AAELC,sBAAQ,SAFH;AAGLC,sBAAQ,KAAKhC,KAAL,CAAWgC;AAHd,aAFT;AAOE,qBAAS;AAAA,qBAAM,OAAKhC,KAAL,CAAWiC,kBAAX,CAA8B,OAAKjC,KAAL,CAAWO,IAAzC,CAAN;AAAA;AAPX;AASE;AAAA;AAAA,cAAG,SAAS;AAAA,uBAAM,OAAK2B,QAAL,CAAc,EAAChC,MAAM,KAAP,EAAd,CAAN;AAAA,eAAZ,EAAgD,WAAU,WAA1D;AAAA;AAAA,WATF;AAYE;AAAA;AAAA,cAAM,WAAU,eAAhB;AAAA;AAAA,WAZF;AAaE;AAAA;AAAA;AAAK,iBAAKF,KAAL,CAAWO;AAAhB,WAbF;AAeGc,sBAAY;AAAA;AAAA;AAAA;AAAA,WAff;AAiBGA,sBACC;AAAA;AAAA;AACE;AACE,oBAAK,MADP;AAEE,2BAAY,eAFd;AAGE,yBAAU,WAHZ;AAIE,qBAAO,KAAKpB,KAAL,CAAWE,UAJpB;AAKE,wBAAU;AAAA,uBACR,OAAK+B,QAAL,CAAc;AACZ/B,8BAAYU,EAAEsB,MAAF,CAAS/B;AADT,iBAAd,CADQ;AAAA;AALZ,cADF;AAYE,qDAZF;AAaE;AAAA;AAAA;AACE,sBAAK,QADP;AAEE,2BAAU,WAFZ;AAGE,yBAAS;AAAA,yBACP,OAAKJ,KAAL,CAAWM,sBAAX,CACE,OAAKN,KAAL,CAAWO,IADb,EAEES,OAAOC,IAAP,CAAY,OAAKjB,KAAL,CAAWkB,UAAvB,EAAmCC,MAAnC,CACE,OAAKO,aAAL,CAAmBC,IAAnB,CAAwB,MAAxB,CADF,CAFF,CADO;AAAA;AAHX;AAAA;AAYUH,qBAAOF,MAAP,KAAkBG,MAAMH,MAAxB,GAAiC,KAAjC,GAAyCG,MAAMH;AAZzD,aAbF;AA0BO,eA1BP;AA2BE;AAAA;AAAA;AACE,sBAAK,QADP;AAEE,2BAAU,WAFZ;AAGE,yBAAS;AAAA,yBACP,OAAKtB,KAAL,CAAWQ,iBAAX,CACE,OAAKR,KAAL,CAAWO,IADb,EAEES,OAAOC,IAAP,CAAY,OAAKjB,KAAL,CAAWkB,UAAvB,EAAmCC,MAAnC,CACE,OAAKO,aAAL,CAAmBC,IAAnB,CAAwB,MAAxB,CADF,CAFF,CADO;AAAA;AAHX;AAAA;AAYYH,qBAAOF,MAAP,KAAkBG,MAAMH,MAAxB,GAAiC,KAAjC,GAAyCG,MAAMH;AAZ3D;AA3BF,WAlBJ;AA8DGD,sBACC;AAAA;AAAA,cAAK,WAAU,mBAAf;AACGI,kBAAMW,GAAN,CAAU;AAAA,qBACT;AAAA;AAAA;AACE,uBAAK3B,CADP;AAEE,2BAAS;AAAA,2BAAM,OAAK4B,WAAL,CAAiB5B,CAAjB,CAAN;AAAA,mBAFX;AAGE,6BAAWA,KAAK,OAAKT,KAAL,CAAWK,WAAhB,GAA8B,EAA9B,GAAmC;AAHhD;AAKE;AAAA;AAAA,oBAAG,WAAU,SAAb,EAAuB,SAAS;AAAA,6BAAK,OAAKiC,UAAL,CAAgBzB,CAAhB,EAAmBJ,CAAnB,CAAL;AAAA,qBAAhC;AAAA;AAAA,iBALF;AAQE;AAAA;AAAA,oBAAG,WAAU,eAAb;AAAA;AAAA,iBARF;AAUGA,sBAAM,EAAN,GAAW;AAAA;AAAA;AAAA;AAAA,iBAAX,GAA2BA;AAV9B,eADS;AAAA,aAAV;AADH;AA/DJ;AADF,OADF;AAqFD;;;sCAEiB;AAChB,WAAKyB,QAAL,CAAc,EAAChC,MAAM,CAAC,KAAKD,KAAL,CAAWC,IAAnB,EAAd;AACA,WAAKF,KAAL,CAAWiC,kBAAX,CAA8B,KAAKjC,KAAL,CAAWO,IAAzC;AACD;;;6BAEQ;AACP,UAAMgC,WACJvB,OAAOC,IAAP,CAAY,KAAKjB,KAAL,CAAWK,WAAvB,EAAoCiB,MAApC,KAA+C,CAA/C,GACI,sBADJ,GAEI,EAHN;AAIA,aACE;AAAA;AAAA,UAAI,WAAS,KAAKtB,KAAL,CAAWO,IAAxB;AACE;AAAA;AAAA,YAAM,WAAW,aAAagC,QAA9B;AACG,eAAKvC,KAAL,CAAWO,IADd;AAEE;AAAA;AAAA;AACE,yBAAU,aADZ;AAEE,uBAAS,KAAKiC,eAAL,CAAqBb,IAArB,CAA0B,IAA1B;AAFX;AAIG,eAJH;AAAA;AAAA;AAFF,SADF;AAYG,aAAK1B,KAAL,CAAWC,IAAX,GAAkB,KAAKuC,YAAL,EAAlB,GAAwC;AAZ3C,OADF;AAgBD;;;;EAvJqCC,gBAAMC,S;;AA0J9C5C,mBAAmB6C,YAAnB,GAAkC;AAChCvC,eAAa;AADmB,CAAlC;;AAIAN,mBAAmB8C,SAAnB,GAA+B;AAC7BtC,QAAMuC,oBAAUC,MAAV,CAAiBC,UADM;AAE7BxC,qBAAmBsC,oBAAUG,IAAV,CAAeD,UAFL;AAG7B1C,0BAAwBwC,oBAAUG,IAAV,CAAeD,UAHV;AAI7B9B,cAAY4B,oBAAUI,QAAV,CAAmBJ,oBAAUK,MAA7B,EAAqCH,UAJpB;AAK7B3C,eAAayC,oBAAUI,QAAV,CAAmBJ,oBAAUM,IAA7B,CALgB;AAM7BnB,sBAAoBa,oBAAUG,IAAV,CAAeD,UANN;AAO7BnB,UAAQiB,oBAAUG,IAAV,CAAeD,UAPM;AAQ7BzB,aAAWuB,oBAAUK,MARQ;AAS7BnB,UAAQc,oBAAUK;AATW,CAA/B;;IAYaE,Q,WAAAA,Q;;;;;;;;;;;6BACF;AAAA;;AACP,aACE;AAAA;AAAA,UAAK,WAAU,aAAf,EAA6B,OAAO,EAACrB,QAAQ,KAAKhC,KAAL,CAAWgC,MAApB,EAApC;AACE;AAAA;AAAA;AACE,qBAAS,oBAAK;AACZnB,gBAAEC,eAAF;AACA,qBAAKd,KAAL,CAAWsD,MAAX;AACD,aAJH;AAKE,uBACE,0CACC,KAAKtD,KAAL,CAAWE,IAAX,GAAkB,wBAAlB,GAA6C,EAD9C,CANJ;AASE,kBAAK;AATP;AAWE;AAAA;AAAA,cAAK,WAAU,iBAAf;AAAkC,iBAAKF,KAAL,CAAWE,IAAX,GAAkB,GAAlB,GAAwB;AAA1D,WAXF;AAYG,eAAKF,KAAL,CAAWuD,OAAX,IAAsB;AAAA;AAAA;AAAA;AAAA;AAZzB,SADF;AAgBG,aAAKvD,KAAL,CAAWE,IAAX,IACC;AAAA;AAAA,YAAK,WAAU,iBAAf;AACG,eAAKF,KAAL,CAAWwB,MAAX,CAAkBY,GAAlB,CAAsB;AAAA,mBACrB;AAAA;AAAA;AACE,qBAAKoB,CADP;AAEE,sBAAK,QAFP;AAGE,yBAAS,oBAAK;AACZ3C,oBAAEC,eAAF;AACA,sBAAI,OAAKd,KAAL,CAAWuD,OAAX,KAAuBC,CAA3B,EAA8B;AAC5B,2BAAKxD,KAAL,CAAWsD,MAAX;AACD,mBAFD,MAEO;AACL,2BAAKtD,KAAL,CAAWyD,QAAX,CAAoBD,CAApB;AACD;AACF,iBAVH;AAWE,2BACE,uBACCA,MAAM,OAAKxD,KAAL,CAAWuD,OAAjB,GAA2B,wBAA3B,GAAsD,EADvD;AAZJ;AAgBGC;AAhBH,aADqB;AAAA,WAAtB;AADH;AAjBJ,OADF;AA2CD;;;;EA7C2Bd,gBAAMgB,a;;IAgD9BC,Y;;;AACJ,wBAAY3D,KAAZ,EAAmB;AAAA;;AAAA,6HACXA,KADW;;AAEjB,WAAKC,KAAL,GAAa;AACX2D,mBAAa,EADF;AAEXC,gBAAU,EAFC;AAGXC,iBAAW,IAHA;AAIXC,oBAAc,KAJH;AAKX7C,kBAAY,EALD;AAMX8C,yBAAmB;AANR,KAAb;AAFiB;AAUlB;;;;wCAEmB;AAClB,WAAKC,gBAAL,CAAsB,KAAKjE,KAAL,CAAWkE,IAAjC;AACD;;;yCAEoB;AACnB,WAAKD,gBAAL,CAAsB,KAAKjE,KAAL,CAAWkE,IAAjC;AACD;;;qCAEgBC,Q,EAAU;AACzB,UAAI,KAAKlE,KAAL,CAAWiE,IAAX,KAAoBC,QAAxB,EAAkC;AAChC;AACD;AACD,UAAMC,WAAW;AACfF,cAAMC,QADS;AAEfjD,oBAAY,EAFG;AAGf8C,2BAAmB;AAHJ,OAAjB;AAKA,UAAIK,mBAAmB,CAAvB;AACAC,2BAAUC,aAAV,CACEH,SAASF,IADX,EAEE,KAAKlE,KAAL,CAAWwE,iBAFb,EAGE,UAASC,MAAT,EAAiB;AACfL,iBAASJ,iBAAT,CAA2BU,IAA3B,CAAgCD,MAAhC;AADe;AAAA;AAAA;;AAAA;AAEf,+BAAmBzD,OAAOC,IAAP,CAAYwD,MAAZ,CAAnB,8HAAwC;AAAA,gBAA7BE,IAA6B;;AACtC,gBAAI,EAAEA,QAAQP,SAASlD,UAAnB,CAAJ,EAAoC;AAClCkD,uBAASlD,UAAT,CAAoByD,IAApB,IAA4B,EAA5B;AACA,kBAAIN,mBAAmB,CAAvB,EAA0B;AACxBD,yBAASlD,UAAT,CAAoByD,IAApB,EAA0BC,IAA1B,GAAiCP,gBAAjC;AACD;AACF;AACF;AATc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAUf,aAAK,IAAMM,KAAX,IAAmBP,SAASlD,UAA5B,EAAwC;AACtC,cAAMd,QAAQuE,SAAQF,MAAR,GAAiBA,OAAOE,KAAP,CAAjB,GAAgC,MAA9C;AACA,cAAI,EAAEvE,SAASgE,SAASlD,UAAT,CAAoByD,KAApB,CAAX,CAAJ,EAA2C;AACzCP,qBAASlD,UAAT,CAAoByD,KAApB,EAA0BvE,KAA1B,IAAmC,CAAnC;AACD;AACDgE,mBAASlD,UAAT,CAAoByD,KAApB,EAA0BvE,KAA1B;AACD;AACDiE;AACD,OArBH;AAuBA,WAAKnC,QAAL,CAAckC,QAAd;AACD;;;mCAEcS,O,EAAS;AACtB,WAAK7E,KAAL,CAAW8E,QAAX,CAAoB,kCAAO,KAAK9E,KAAZ,EAAmB6E,OAAnB,CAApB;AACD;;;gCAEWE,G,EAAK;AAAA;;AACf,aAAO;AAAA,eAAS,OAAKC,cAAL,qBAAsBD,GAAtB,EAA4B,EAACE,MAAM7E,KAAP,EAA5B,EAAT;AAAA,OAAP;AACD;;;sCAEiB8E,S,EAAW1D,M,EAAQ;AACnC,WAAKwD,cAAL,CAAoB;AAClB3E,yCACG6E,SADH,EACe;AACXD,gBAAMzD,OAAO2D,MAAP,CAAc,UAAC3B,CAAD,EAAI4B,CAAJ,EAAU;AAC5B5B,cAAE4B,CAAF,IAAO,IAAP;AACA,mBAAO5B,CAAP;AACD,WAHK,EAGH,EAHG;AADK,SADf;AADkB,OAApB;AAUD;;;sCAEiB0B,S,EAAW1D,M,EAAQ;AACnC,UAAI0D,aAAa,KAAKlF,KAAL,CAAWK,WAA5B,EAAyC;AACvC,aAAK2E,cAAL,CAAoB;AAClB3E,2CACG6E,SADH,EACe1D,OAAO2D,MAAP,CAAc,UAAC3B,CAAD,EAAI4B,CAAJ,EAAU;AACnC5B,cAAE4B,CAAF,IAAO,EAACH,MAAM,IAAP,EAAP;AACA,mBAAOzB,CAAP;AACD,WAHY,EAGV,EAHU,CADf;AADkB,SAApB;AAQD,OATD,MASO;AACL,aAAKzC,iBAAL,CAAuBmE,SAAvB,EAAkC1D,MAAlC;AACD;AACF;;;2CAEsB0D,S,EAAW1D,M,EAAQ;AACxC,WAAKwD,cAAL,CAAoB;AAClB3E,yCAAe6E,SAAf,EAA2B,EAACG,QAAQ7D,MAAT,EAA3B;AADkB,OAApB;AAGD;;;uCAEkB0D,S,EAAW;AAC5B,WAAKhD,QAAL,CACE,kCAAO,KAAKjC,KAAZ,EAAmB;AACjB6D,mBAAW,EAACmB,MAAM,KAAKhF,KAAL,CAAW6D,SAAX,GAAuB,CAA9B,EADM;AAEjBD,sCAAYqB,SAAZ,EAAwB,EAACD,MAAM,KAAKhF,KAAL,CAAW6D,SAAX,GAAuB,CAA9B,EAAxB;AAFiB,OAAnB,CADF;AAMD;;;2BAEMwB,Q,EAAU;AACf,aAAO,KAAKrF,KAAL,CAAW8D,YAAX,KAA4BuB,QAAnC;AACD;;;gCAEWC,K,EAAOT,Q,EAAUU,O,EAAS;AAAA;;AACpC,aACE;AAAC,iCAAD;AAAA;AACE,mBAAS;AACPC,mBAAO,QADA;AAEPC,wBAAY,gBAFL;AAGPvE,oBAAQ,eAHD;AAIPwE,6BAAiB;AAJV,WADX;AAOE,eAAI,IAPN;AAQE,qBAAWH,OARb;AASE,oBAAUV;AATZ;AAWGS,cAAMnD,GAAN,CAAU;AAAA,iBACT,8BAAC,kBAAD;AACE,kBAAM3B,CADR;AAEE,iBAAKA,CAFP;AAGE,wBAAY,OAAKR,KAAL,CAAWiB,UAAX,CAAsBT,CAAtB,CAHd;AAIE,yBAAa,OAAKT,KAAL,CAAWK,WAAX,CAAuBI,CAAvB,KAA6B,EAJ5C;AAKE,oBAAQ,wBAAQ,OAAKT,KAAL,CAAW4F,OAAnB,EAA4BnF,CAA5B,CALV;AAME,uBAAW,OAAKT,KAAL,CAAWuB,SANxB;AAOE,+BAAmB,OAAKR,iBAAL,CAAuBY,IAAvB,CAA4B,MAA5B,CAPrB;AAQE,+BAAmB,OAAKnB,iBAAL,CAAuBmB,IAAvB,CAA4B,MAA5B,CARrB;AASE,gCAAoB,OAAKM,kBAAL,CAAwBN,IAAxB,CAA6B,MAA7B,CATtB;AAUE,oCAAwB,OAAKrB,sBAAL,CAA4BqB,IAA5B,CAAiC,MAAjC,CAV1B;AAWE,oBAAQ,OAAK1B,KAAL,CAAW4D,QAAX,CAAoBpD,CAApB,KAA0B,OAAKR,KAAL,CAAW6D;AAX/C,YADS;AAAA,SAAV;AAXH,OADF;AA6BD;;;6BAEQ;AAAA;;AACP,UAAM+B,iBACJ,KAAK7F,KAAL,CAAW8F,WAAX,CAAuB,KAAK9F,KAAL,CAAW+F,cAAlC,EAAkD,EAAlD,IAAwDC,SAAxD,IAAqE,CADvE;;AAGA,UAAMC,uBAAuB,KAAKjG,KAAL,CAAW8F,WAAX,CAC3B,KAAK9F,KAAL,CAAW+F,cADgB,EAE3B,EAF2B,IAErBG,MAFR;;AAIA,UAAMC,eACJ,KAAKnG,KAAL,CAAWmG,YAAX,IAA2B,KAAKnG,KAAL,CAAWoG,SAAtC,GACI,KAAKpG,KAAL,CAAWmG,YADf,GAEInF,OAAOC,IAAP,CAAY,KAAKjB,KAAL,CAAWoG,SAAvB,EAAkC,CAAlC,CAHN;;AAKA,UAAMC,eACJ;AAAA;AAAA,UAAI,WAAU,cAAd;AACE,sCAAC,QAAD;AACE,mBAASF,YADX;AAEE,kBAAQnF,OAAOC,IAAP,CAAY,KAAKjB,KAAL,CAAWoG,SAAvB,CAFV;AAGE,gBAAM,KAAKE,MAAL,CAAY,UAAZ,CAHR;AAIE,kBAAQ,KAAKA,MAAL,CAAY,UAAZ,IAA0B,KAAKrG,KAAL,CAAW6D,SAAX,GAAuB,CAAjD,GAAqD,CAJ/D;AAKE,kBAAQ;AAAA,mBACN,OAAK5B,QAAL,CAAc;AACZ6B,4BAAc,OAAKuC,MAAL,CAAY,UAAZ,IAA0B,KAA1B,GAAkC;AADpC,aAAd,CADM;AAAA,WALV;AAUE,oBAAU,KAAKC,WAAL,CAAiB,cAAjB;AAVZ;AADF,OADF;;AAiBA,UAAMC,YAAY;AAChBC,oBAAY;AACVC,qBAAW,GADD;AAEVC,qBAAW,GAFD;AAGVC,gBAAM;AAHI,SADI;AAMhBC,sBAAc;AACZH,qBAAW,GADC;AAEZC,qBAAW,GAFC;AAGZC,gBAAM;AAHM,SANE;AAWhBE,sBAAc,EAACJ,WAAW,GAAZ,EAAiBC,WAAW,GAA5B,EAAiCC,MAAM,YAAvC;AAXE,OAAlB;;AAcA,UAAMG,iBACJ;AAAA;AAAA,UAAI,WAAU,SAAd;AACE,sCAAC,QAAD;AACE,mBAAS,KAAK/G,KAAL,CAAW+F,cADtB;AAEE,kBAAQ/E,OAAOC,IAAP,CAAY,KAAKjB,KAAL,CAAW8F,WAAvB,CAFV;AAGE,gBAAM,KAAKQ,MAAL,CAAY,aAAZ,CAHR;AAIE,kBAAQ,KAAKA,MAAL,CAAY,aAAZ,IAA6B,KAAKrG,KAAL,CAAW6D,SAAX,GAAuB,CAApD,GAAwD,CAJlE;AAKE,kBAAQ;AAAA,mBACN,OAAK5B,QAAL,CAAc;AACZ6B,4BAAc,OAAKuC,MAAL,CAAY,aAAZ,IAA6B,KAA7B,GAAqC;AADvC,aAAd,CADM;AAAA,WALV;AAUE,oBAAU,KAAKC,WAAL,CAAiB,gBAAjB;AAVZ,UADF;AAaE;AAAA;AAAA;AACE,kBAAK,QADP;AAEE,uBAAU,aAFZ;AAGE,qBAAS;AAAA,qBACP,OAAKA,WAAL,CAAiB,UAAjB,EAA6BC,UAAU,OAAKxG,KAAL,CAAWgH,QAArB,EAA+BJ,IAA5D,CADO;AAAA;AAHX;AAOGJ,oBAAU,KAAKxG,KAAL,CAAWgH,QAArB,EAA+BN;AAPlC,SAbF;AAsBE;AAAA;AAAA;AACE,kBAAK,QADP;AAEE,uBAAU,aAFZ;AAGE,qBAAS;AAAA,qBACP,OAAKH,WAAL,CAAiB,UAAjB,EAA6BC,UAAU,OAAKxG,KAAL,CAAWiH,QAArB,EAA+BL,IAA5D,CADO;AAAA;AAHX;AAOGJ,oBAAU,KAAKxG,KAAL,CAAWiH,QAArB,EAA+BN;AAPlC,SAtBF;AA+BGd,yBAAiB,CAAjB,IAAsB,yCA/BzB;AAgCG,YAAIqB,KAAJ,CAAUrB,cAAV,EAA0BsB,IAA1B,GAAiC/E,GAAjC,CAAqC,UAACgF,CAAD,EAAIC,CAAJ;AAAA,iBAAU,CAC9C,8BAAC,QAAD;AACE,iBAAKA,CADP;AAEE,qBAAS,OAAKrH,KAAL,CAAWsH,IAAX,CAAgBD,CAAhB,CAFX;AAGE,oBAAQrG,OAAOC,IAAP,CAAY,OAAKhB,KAAL,CAAWiB,UAAvB,EAAmCC,MAAnC,CACN;AAAA,qBACE,CAAC,OAAKnB,KAAL,CAAWuH,gBAAX,CAA4B3G,QAA5B,CAAqCC,CAArC,CAAD,IACA,CAAC,OAAKb,KAAL,CAAWwH,qBAAX,CAAiC5G,QAAjC,CAA0CC,CAA1C,CAFH;AAAA,aADM,CAHV;AAQE,kBAAM,OAAKyF,MAAL,SAAkBe,CAAlB,CARR;AASE,oBAAQ,OAAKf,MAAL,SAAkBe,CAAlB,IAAyB,OAAKpH,KAAL,CAAW6D,SAAX,GAAuB,CAAhD,GAAoD,CAT9D;AAUE,oBAAQ;AAAA,qBACN,OAAK5B,QAAL,CAAc;AACZ6B,8BAAc,OAAKuC,MAAL,SAAkBe,CAAlB,IAAyB,KAAzB,WAAuCA;AADzC,eAAd,CADM;AAAA,aAVV;AAeE,sBAAU;AAAA,qBACR,OAAKrC,cAAL,CAAoB;AAClBsC,sBAAM,EAACG,SAAS,CAAC,CAACJ,CAAD,EAAI,CAAJ,EAAOjH,KAAP,CAAD,CAAV;AADY,eAApB,CADQ;AAAA;AAfZ,YAD8C,EAsB9CiH,IAAI,CAAJ,KAAUxB,cAAV,GAA2B,sCAAI,YAAUwB,CAAd,GAA3B,GAAmD,IAtBL,CAAV;AAAA,SAArC,CAhCH;AAwDGpB,gCAAwBA,qBAAqB,KAAKjG,KAAL,CAAWkE,IAAhC;AAxD3B,OADF;;AA6DA,UAAMwD,cAAc1G,OAAOC,IAAP,CAAY,KAAKhB,KAAL,CAAWiB,UAAvB,EACjBC,MADiB,CAEhB;AAAA,eACE,CAAC,OAAKnB,KAAL,CAAW2H,IAAX,CAAgB/G,QAAhB,CAAyBC,CAAzB,CAAD,IACA,CAAC,OAAKb,KAAL,CAAW4H,IAAX,CAAgBhH,QAAhB,CAAyBC,CAAzB,CADD,IAEA,CAAC,OAAKb,KAAL,CAAWuH,gBAAX,CAA4B3G,QAA5B,CAAqCC,CAArC,CAFD,IAGA,CAAC,OAAKb,KAAL,CAAW6H,kBAAX,CAA8BjH,QAA9B,CAAuCC,CAAvC,CAJH;AAAA,OAFgB,EAQjBe,IARiB,CAQZ,uBAAO,KAAK3B,KAAL,CAAW2D,WAAlB,CARY,CAApB;;AAUA,UAAMkE,eAAeJ,YAAYvC,MAAZ,CAAmB,UAAC3B,CAAD,EAAI3C,CAAJ;AAAA,eAAU2C,IAAI3C,EAAES,MAAhB;AAAA,OAAnB,EAA2C,CAA3C,CAArB;AACA,UAAMyG,cAAcD,eAAe,KAAK9H,KAAL,CAAWgI,uBAA9C;;AAEA,UAAMC,kBAAkB,KAAKC,WAAL,CACtBR,WADsB,EAEtB;AAAA,eAAS,OAAKxF,QAAL,CAAc,EAAC0B,aAAauE,KAAd,EAAd,CAAT;AAAA,OAFsB,mCAIpBJ,cAAc,cAAd,GAA+B,aAJX,EAAxB;;AAQA,UAAMK,WAAW,KAAKpI,KAAL,CAAW4H,IAAX,CAAgBzG,MAAhB,CACf;AAAA,eACE,CAAC,OAAKnB,KAAL,CAAWuH,gBAAX,CAA4B3G,QAA5B,CAAqCC,CAArC,CAAD,IACA,CAAC,OAAKb,KAAL,CAAW6H,kBAAX,CAA8BjH,QAA9B,CAAuCC,CAAvC,CAFH;AAAA,OADe,CAAjB;;AAMA,UAAMwH,eAAe,KAAKH,WAAL,CACnBE,QADmB,EAEnB,KAAK7B,WAAL,CAAiB,MAAjB,CAFmB,EAGnB,uCAHmB,CAArB;;AAMA,UAAM+B,WAAW,KAAKtI,KAAL,CAAW2H,IAAX,CAAgBxG,MAAhB,CACf;AAAA,eACE,CAAC,OAAKnB,KAAL,CAAWuH,gBAAX,CAA4B3G,QAA5B,CAAqCC,CAArC,CAAD,IACA,CAAC,OAAKb,KAAL,CAAW6H,kBAAX,CAA8BjH,QAA9B,CAAuCC,CAAvC,CAFH;AAAA,OADe,CAAjB;AAKA,UAAM0H,eAAe,KAAKL,WAAL,CACnBI,QADmB,EAEnB,KAAK/B,WAAL,CAAiB,MAAjB,CAFmB,EAGnB,sCAHmB,CAArB;AAKA,UAAMiC,aACJ;AAAA;AAAA,UAAI,WAAU,WAAd;AACE,sCAAC,oBAAD,EACM,kCAAO,KAAKxI,KAAZ,EAAmB;AACrBkE,gBAAM,EAACe,MAAM,KAAKhF,KAAL,CAAW+D,iBAAlB;AADe,SAAnB,CADN;AADF,OADF;;AAUA,UAAI+D,WAAJ,EAAiB;AACf,eACE;AAAA;AAAA,YAAO,WAAU,OAAjB;AACE;AAAA;AAAA,cAAO,SAAS;AAAA,uBAAM,OAAK7F,QAAL,CAAc,EAAC6B,cAAc,KAAf,EAAd,CAAN;AAAA,eAAhB;AACE;AAAA;AAAA;AACGsC,0BADH;AAEG4B;AAFH,aADF;AAKE;AAAA;AAAA;AACGlB,4BADH;AAEGsB;AAFH,aALF;AASE;AAAA;AAAA;AACGE,0BADH;AAEGC;AAFH;AATF;AADF,SADF;AAkBD;;AAED,aACE;AAAA;AAAA,UAAO,WAAU,OAAjB;AACE;AAAA;AAAA,YAAO,SAAS;AAAA,qBAAM,OAAKtG,QAAL,CAAc,EAAC6B,cAAc,KAAf,EAAd,CAAN;AAAA,aAAhB;AACE;AAAA;AAAA;AACGsC,wBADH;AAEGU,0BAFH;AAGGsB;AAHH,WADF;AAME;AAAA;AAAA;AACGJ,2BADH;AAEGM,wBAFH;AAGGC;AAHH;AANF;AADF,OADF;AAgBD;;;;EAnVwB9F,gBAAMgB,a;;AAsVjCC,aAAad,SAAb,GAAyB7B,OAAOyH,MAAP,CAAc,EAAd,EAAkBC,qBAAW7F,SAA7B,EAAwC;AAC/DiC,YAAUhC,oBAAUG,IAAV,CAAeD,UADsC;AAE/DuE,oBAAkBzE,oBAAU6F,OAAV,CAAkB7F,oBAAUC,MAA5B,CAF6C;AAG/DyE,yBAAuB1E,oBAAU6F,OAAV,CAAkB7F,oBAAUC,MAA5B,CAHwC;AAI/D8E,sBAAoB/E,oBAAU6F,OAAV,CAAkB7F,oBAAUC,MAA5B,CAJ2C;AAK/DiF,2BAAyBlF,oBAAUK,MAL4B;AAM/D5B,aAAWuB,oBAAUK;AAN0C,CAAxC,CAAzB;;AASAQ,aAAaf,YAAb,GAA4B5B,OAAOyH,MAAP,CAAc,EAAd,EAAkBC,qBAAW9F,YAA7B,EAA2C;AACrE2E,oBAAkB,EADmD;AAErEC,yBAAuB,EAF8C;AAGrEK,sBAAoB,EAHiD;AAIrEG,2BAAyB,EAJ4C;AAKrEzG,aAAW;AAL0D,CAA3C,CAA5B;;kBAQeoC,Y","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; +}