UNPKG

@6thquake/react-material

Version:

React components that implement Google's Material Design.

364 lines (318 loc) 12.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _react = _interopRequireDefault(require("react")); var _reactDom = _interopRequireDefault(require("react-dom")); var _propTypes = _interopRequireDefault(require("prop-types")); var _immutabilityHelper = _interopRequireDefault(require("immutability-helper")); var _CrossTabulationUtilities = require("./CrossTabulationUtilities"); var _CrossTabulation = _interopRequireDefault(require("./CrossTabulation")); var _CrossTabulationAttribute = _interopRequireDefault(require("./CrossTabulationAttribute")); var _CrossTabulationDropZone = _interopRequireDefault(require("./CrossTabulationDropZone")); var _styles = require("../../styles"); /** * @ignore - do not document. */ var styles = function styles(theme) { return { table: { color: '#2a3f5f', fontFamily: theme.typography.fontFamily, borderCollapse: 'collapse' }, renderers: { border: '1px solid #a2b1c6', background: '#f2f5fa', paddingLeft: '5px', userSelect: 'none' }, axis: { border: '1px solid #a2b1c6', background: '#f2f5fa', padding: '5px', minWidth: '20px', minHeight: '20px', height: '20px' }, vaxis: { verticalAlign: 'top' }, orders: { cursor: 'pointer', width: '15px', marginLeft: '5px', display: 'inline-block', userSelect: 'none', textDecoration: 'none !important' } }; }; /** * @ignore - internal component. */ var AbundantCrossTabulationContent = /*#__PURE__*/ function (_React$PureComponent) { (0, _inherits2.default)(AbundantCrossTabulationContent, _React$PureComponent); function AbundantCrossTabulationContent(props) { var _this; (0, _classCallCheck2.default)(this, AbundantCrossTabulationContent); _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(AbundantCrossTabulationContent).call(this, props)); _this.state = { unusedOrder: [], zIndices: {}, maxZIndex: 1000 }; return _this; } (0, _createClass2.default)(AbundantCrossTabulationContent, [{ key: "componentWillMount", value: function componentWillMount() { this.materializeInput(this.props.data); } }, { key: "componentWillUpdate", value: function componentWillUpdate(nextProps) { this.materializeInput(nextProps.data); } }, { key: "materializeInput", value: function materializeInput(nextData) { if (this.data === nextData) { return; } this.data = nextData; var attrValues = {}; var materializedInput = []; var recordsProcessed = 0; _CrossTabulationUtilities.CrossTabulationData.forEachRecord(this.data, this.props.derivedAttributes, function (record) { materializedInput.push(record); for (var _i = 0, _Object$keys = Object.keys(record); _i < _Object$keys.length; _i++) { var _attr = _Object$keys[_i]; if (!(_attr in attrValues)) { attrValues[_attr] = {}; if (recordsProcessed > 0) { attrValues[_attr].null = recordsProcessed; } } } for (var attr in attrValues) { var value = attr in record ? record[attr] : 'null'; if (!(value in attrValues[attr])) { attrValues[attr][value] = 0; } attrValues[attr][value]++; } recordsProcessed++; }); this.materializedInput = materializedInput; this.attrValues = attrValues; } }, { key: "sendPropUpdate", value: function sendPropUpdate(command) { this.props.onChange((0, _immutabilityHelper.default)(this.props, command)); } }, { key: "propUpdater", value: function propUpdater(key) { var _this2 = this; return function (value) { return _this2.sendPropUpdate((0, _defineProperty2.default)({}, key, { $set: value })); }; } }, { key: "setValuesInFilter", value: function setValuesInFilter(attribute, values) { this.sendPropUpdate({ valueFilter: (0, _defineProperty2.default)({}, 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: (0, _defineProperty2.default)({}, 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: (0, _defineProperty2.default)({}, attribute, { $unset: values }) }); } }, { key: "makeDnDCell", value: function makeDnDCell(items, onChange, classes) { return _react.default.createElement("td", { className: classes }, _react.default.createElement(_CrossTabulationDropZone.default, { items: items, onDrop: onChange, attrValuess: this.attrValues, valueFilters: this.props.valueFilter, sorters: this.props.sorters, menuLimit: this.props.menuLimit, setValuesInFilter: this.setValuesInFilter.bind(this), addValuesToFilter: this.addValuesToFilter.bind(this), removeValuesFromFilter: this.removeValuesFromFilter.bind(this), zIndices: this.state.zIndices, maxZIndex: this.state.maxZIndex })); } }, { key: "render", value: function render() { var _this3 = this; var classes = this.props.classes; var numValsAllowed = this.props.aggregators[this.props.aggregatorName]([])().numInputs || 0; var rendererName = this.props.rendererName in this.props.renderers ? this.props.rendererName : Object.keys(this.props.renderers)[0]; var rendererCell = _react.default.createElement("td", { className: classes.renderers }, _react.default.createElement(_CrossTabulationAttribute.default, { label: "renderer", current: rendererName, values: Object.keys(this.props.renderers), 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 = _react.default.createElement("td", { className: classes.axis }, _react.default.createElement(_CrossTabulationAttribute.default, { label: "aggregators", current: this.props.aggregatorName, values: Object.keys(this.props.aggregators), setValue: this.propUpdater('aggregatorName') }), _react.default.createElement("a", { role: "button", className: classes.orders, onClick: function onClick() { return _this3.propUpdater('rowOrder')(sortIcons[_this3.props.rowOrder].next); } }, sortIcons[this.props.rowOrder].rowSymbol), _react.default.createElement("a", { role: "button", className: classes.orders, onClick: function onClick() { return _this3.propUpdater('colOrder')(sortIcons[_this3.props.colOrder].next); } }, sortIcons[this.props.colOrder].colSymbol), numValsAllowed > 0 && _react.default.createElement("br", null), new Array(numValsAllowed).fill().map(function (n, i) { return [_react.default.createElement(_CrossTabulationAttribute.default, { label: "value", key: i, current: _this3.props.vals[i], values: Object.keys(_this3.attrValues).filter(function (e) { return !_this3.props.hiddenAttributes.includes(e) && !_this3.props.hiddenFromAggregators.includes(e); }), setValue: function setValue(value) { return _this3.sendPropUpdate({ vals: { $splice: [[i, 1, value]] } }); } }), i + 1 !== numValsAllowed ? _react.default.createElement("br", { key: "br".concat(i) }) : null]; })); var unusedAttrs = Object.keys(this.attrValues).filter(function (e) { return !_this3.props.rows.includes(e) && !_this3.props.cols.includes(e) && !_this3.props.hiddenAttributes.includes(e) && !_this3.props.hiddenFromDragDrop.includes(e); }).sort((0, _CrossTabulationUtilities.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 _this3.setState({ unusedOrder: order }); }, classes.axis); var colAttrs = this.props.cols.filter(function (e) { return !_this3.props.hiddenAttributes.includes(e) && !_this3.props.hiddenFromDragDrop.includes(e); }); var colAttrsCell = this.makeDnDCell(colAttrs, this.propUpdater('cols').bind(this), classes.axis); var rowAttrs = this.props.rows.filter(function (e) { return !_this3.props.hiddenAttributes.includes(e) && !_this3.props.hiddenFromDragDrop.includes(e); }); var rowAttrsCell = this.makeDnDCell(rowAttrs, this.propUpdater('rows').bind(this), classes.axis); var outputCell = _react.default.createElement("td", null, _react.default.createElement(_CrossTabulation.default, (0, _immutabilityHelper.default)(this.props, { data: { $set: this.materializedInput } }))); if (horizUnused) { return _react.default.createElement("table", { className: classes.table, width: "100%" }, _react.default.createElement("tbody", null, _react.default.createElement("tr", null, rendererCell, unusedAttrsCell), _react.default.createElement("tr", null, aggregatorCell, colAttrsCell), _react.default.createElement("tr", null, rowAttrsCell, outputCell))); } return _react.default.createElement("table", { className: classes.table }, _react.default.createElement("tbody", null, _react.default.createElement("tr", null, rendererCell, aggregatorCell, colAttrsCell), _react.default.createElement("tr", null, unusedAttrsCell, rowAttrsCell, outputCell))); } }]); return AbundantCrossTabulationContent; }(_react.default.PureComponent); AbundantCrossTabulationContent.propTypes = (0, _extends2.default)({}, _CrossTabulation.default.propTypes, { onChange: _propTypes.default.func.isRequired, hiddenAttributes: _propTypes.default.arrayOf(_propTypes.default.string), hiddenFromAggregators: _propTypes.default.arrayOf(_propTypes.default.string), hiddenFromDragDrop: _propTypes.default.arrayOf(_propTypes.default.string), unusedOrientationCutoff: _propTypes.default.number, menuLimit: _propTypes.default.number }); AbundantCrossTabulationContent.defaultProps = (0, _extends2.default)({}, _CrossTabulation.default.defaultProps, { hiddenAttributes: [], hiddenFromAggregators: [], hiddenFromDragDrop: [], unusedOrientationCutoff: 85, menuLimit: 500 }); var _default = (0, _styles.withStyles)(styles, { name: 'RMAbundantCrossTabulationContent' })(AbundantCrossTabulationContent); exports.default = _default;