UNPKG

@bpanel/bpanel-ui

Version:

reusable React component library used in the bpanel GUI

402 lines (324 loc) 11.8 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _values = require('babel-runtime/core-js/object/values'); var _values2 = _interopRequireDefault(_values); var _entries = require('babel-runtime/core-js/object/entries'); var _entries2 = _interopRequireDefault(_entries); var _getIterator2 = require('babel-runtime/core-js/get-iterator'); var _getIterator3 = _interopRequireDefault(_getIterator2); var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray'); var _slicedToArray3 = _interopRequireDefault(_slicedToArray2); var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of'); var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _moment = require('moment'); var _moment2 = _interopRequireDefault(_moment); var _bsert = require('bsert'); var _bsert2 = _interopRequireDefault(_bsert); var _lodash = require('lodash'); var _index = require('../index'); var _utils = require('../../utils'); var _bpanelUtils = require('@bpanel/bpanel-utils'); var _ExpandedDataRow = require('./ExpandedDataRow'); var _ExpandedDataRow2 = _interopRequireDefault(_ExpandedDataRow); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /* * TransactionTable * * Wrapper around Table to display * transaction related information * * TODO: better logic around setting custom * TxManager options at runtime with props */ var TransactionTable = function (_PureComponent) { (0, _inherits3.default)(TransactionTable, _PureComponent); /* * Create a TransactionTable * Initialize a txManager with default options * @constructor * */ function TransactionTable() { (0, _classCallCheck3.default)(this, TransactionTable); var _this = (0, _possibleConstructorReturn3.default)(this, (TransactionTable.__proto__ || (0, _getPrototypeOf2.default)(TransactionTable)).call(this)); _this.txManager = _bpanelUtils.TxManager.fromOptions(_bpanelUtils.TxManagerOptions); // TODO: use for caching purposes _this._headers = null; return _this; } /* * Get proptypes * * @static * @returns {Object} */ (0, _createClass3.default)(TransactionTable, [{ key: 'formatTableData', /* * Format table data from output of UXTX.toJSON * Maps props.headerMap values that correspond to * UXTX.toJSON values into an object with keys * of the headerMap key * * This allows for arbitrarily selecting * column headers * * @param {Object[]} transactions - list of transaction json * @param {String} wallet - wallet the txs belong to * @returns {Tuple[Object[], Object[]]} * * TODO: allow function in headerMap * that can return a component? */ value: function formatTableData(transactions, UXTXOptions) { var txns = this.txManager.parse(transactions, UXTXOptions); var _props = this.props, headerMap = _props.headerMap, expandedMap = _props.expandedMap; // tableInput and expandedData are lists // each index corresponds to a single data point // tableInput renders the columns // expandedData renders the dropdown // expandedData mainData renders at the top // expandedData subData renders at the bottom // ugly but functional... var _txns$reduce = txns.reduce(function (acc, tx) { var tmp = {}; var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = (0, _getIterator3.default)((0, _entries2.default)(headerMap)), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var _ref = _step.value; var _ref2 = (0, _slicedToArray3.default)(_ref, 2); var key = _ref2[0]; var val = _ref2[1]; tmp[val] = tx[key]; } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } acc.tableInput.push(tmp); tmp = { mainData: {}, subData: {} }; var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = (0, _getIterator3.default)((0, _entries2.default)(expandedMap.mainData)), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var _ref3 = _step2.value; var _ref4 = (0, _slicedToArray3.default)(_ref3, 2); var _key = _ref4[0]; var _val = _ref4[1]; tmp.mainData[_val] = tx[_key]; } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } var _iteratorNormalCompletion3 = true; var _didIteratorError3 = false; var _iteratorError3 = undefined; try { for (var _iterator3 = (0, _getIterator3.default)((0, _entries2.default)(expandedMap.subData)), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { var _ref5 = _step3.value; var _ref6 = (0, _slicedToArray3.default)(_ref5, 2); var _key2 = _ref6[0]; var _val2 = _ref6[1]; tmp.subData[_val2] = tx[_key2]; } } catch (err) { _didIteratorError3 = true; _iteratorError3 = err; } finally { try { if (!_iteratorNormalCompletion3 && _iterator3.return) { _iterator3.return(); } } finally { if (_didIteratorError3) { throw _iteratorError3; } } } acc.expandedData.push(tmp); return acc; }, { tableInput: [], expandedData: [] }), tableInput = _txns$reduce.tableInput, expandedData = _txns$reduce.expandedData; return [tableInput, expandedData]; } /* * Get header values * TODO: cache result and only * compute if things changed * * Remove certain fields if they are not passed in as a prop * TODO: allow for dynamic label removal * * @returns {String[]} */ }, { key: 'getHeaders', value: function getHeaders() { var headers = (0, _values2.default)(this.props.headerMap); if (!this.props.wallet) headers = (0, _lodash.without)(headers, 'Wallet'); return headers; } /* * Render * @returns {JSX} */ }, { key: 'render', value: function render() { var _props2 = this.props, transactions = _props2.transactions, UXTXOptions = _props2.UXTXOptions, wallet = _props2.wallet, chain = _props2.chain; if (wallet) UXTXOptions.wallet = wallet; if (chain) UXTXOptions.chain = chain; var _formatTableData = this.formatTableData(transactions, UXTXOptions), _formatTableData2 = (0, _slicedToArray3.default)(_formatTableData, 2), tableData = _formatTableData2[0], expandedData = _formatTableData2[1]; // TODO: only invoke if headerMap is different var headers = this.getHeaders(); // TODO: can colHeaders be more than just text? // TODO: make expandedHeight slightly larger if // rendering extra links var _props3 = this.props, _ExpandedComponent = _props3.ExpandedComponent, expandedHeight = _props3.expandedHeight; return _react2.default.createElement( 'div', null, _react2.default.createElement(_index.Table, { colHeaders: headers, tableData: tableData, expandedHeight: expandedHeight, ExpandedComponent: function ExpandedComponent(props) { return _react2.default.createElement(_ExpandedComponent, props); }, expandedData: expandedData, onRowClick: function onRowClick(e) {} }) ); } }], [{ key: 'setTxManager', /* * set TxManager to use * useful for setting custom TxManager options * * @static * @returns {void} */ value: function setTxManager(txManager) { (0, _bsert2.default)(txManager instanceof _bpanelUtils.TxManager); this.txManager = txManager; } }, { key: 'propTypes', get: function get() { return { TxManagerOptions: _propTypes2.default.object, // see TxManagerOptions transactions: _propTypes2.default.array, // bcoin tx json wallet: _propTypes2.default.string, headerMap: _propTypes2.default.object, // UXTX.toJSON -> table headers mapping expandedHeight: _propTypes2.default.number // pass along to Table }; } /* * Get default props * headerMap: * map of bpanel-utils.UXTX.toJSON output -> table header names * expandedMap.mainData * expandedMap.subData * maps from bpanel-utils UXTX.toJSON output -> expanded view data * * @static * @returns {Object} */ }, { key: 'defaultProps', get: function get() { return { // list of transactions from bcoin api transactions: [], wallet: null, protocol: null, headerMap: { date: 'Date', uxtype: 'Send/Receive', wallet: 'Wallet', accountLabel: 'Account', amount: 'Amount', confirmations: 'Confirmations', addressLabel: 'Address' }, expandedMap: { mainData: { hash: 'Tx Hash', block: 'Block Hash' }, subData: { coinbaseLabel: 'Is Coinbase', segwitLabel: 'Is Segwit', weight: 'Weight', inputAmount: 'Input Total', outputAmount: 'Output Total', confirmations: 'Number of Confirmations', fee: 'Fee', rate: 'Fee/kB', inputCount: 'Input Count', outputCount: 'Output Count', size: 'Size', height: 'Block Height' } }, expandedHeight: 420, ExpandedComponent: _ExpandedDataRow2.default, TxManagerOptions: _bpanelUtils.TxManagerOptions, UXTXOptions: _bpanelUtils.UXTXOptions }; } }]); return TransactionTable; }(_react.PureComponent); exports.default = (0, _utils.connectTheme)(TransactionTable);