From e2a71447c3cc6a5ce1752cf5992aded1c06a4039 Mon Sep 17 00:00:00 2001 From: aaronlisman Date: Wed, 2 Nov 2016 15:28:53 -0400 Subject: [PATCH] add columnFormatter property to table, allowing devs to assign components to render cells add tests for columnFormatters --- build/reactable.js | 15 ++++++++--- lib/reactable/table.js | 2 +- lib/reactable/td.js | 6 +++++ lib/reactable/tr.js | 7 +++-- src/reactable/table.jsx | 2 +- src/reactable/td.jsx | 2 ++ src/reactable/tr.jsx | 9 +++++-- test.html | 32 ++++++++++++++++++----- tests/reactable_test.jsx | 55 ++++++++++++++++++++++++++++++++++++++++ 9 files changed, 114 insertions(+), 16 deletions(-) diff --git a/build/reactable.js b/build/reactable.js index 92b762b5..341e3942 100644 --- a/build/reactable.js +++ b/build/reactable.js @@ -475,6 +475,12 @@ window.ReactDOM["default"] = window.ReactDOM; if ((0, _unsafe.isUnsafe)(this.props.children)) { return _react['default'].createElement('td', _extends({}, mergedProps, { dangerouslySetInnerHTML: { __html: this.props.children.toString() } })); + } else if (typeof this.props.formatter !== 'undefined') { + return _react['default'].createElement( + 'td', + mergedProps, + _react['default'].createElement(this.props.formatter, _extends({}, mergedProps, { text: this.props.children })) + ); } else { return _react['default'].createElement( 'td', @@ -537,6 +543,9 @@ window.ReactDOM["default"] = window.ReactDOM; } children = children.concat(this.props.columns.map((function (column, i) { + + var formatter = this.props.columnFormatters ? this.props.columnFormatters[column.key] : undefined; + if (this.props.data.hasOwnProperty(column.key)) { var value = this.props.data[column.key]; var props = {}; @@ -548,11 +557,11 @@ window.ReactDOM["default"] = window.ReactDOM; return _react['default'].createElement( _td.Td, - _extends({ column: column, key: column.key }, props), + _extends({ column: column, formatter: formatter, key: column.key }, props), value ); } else { - return _react['default'].createElement(_td.Td, { column: column, key: column.key }); + return _react['default'].createElement(_td.Td, { column: column, formatter: formatter, key: column.key }); } }).bind(this))); } @@ -1448,7 +1457,7 @@ window.ReactDOM["default"] = window.ReactDOM; } } - return _react['default'].createElement(_tr.Tr, _extends({ columns: columns, key: i, data: data }, props)); + return _react['default'].createElement(_tr.Tr, _extends({ columns: columns, key: i, data: data, columnFormatters: this.props.columnFormatters }, props)); }).bind(this))); } diff --git a/lib/reactable/table.js b/lib/reactable/table.js index e2235b66..2084a27e 100644 --- a/lib/reactable/table.js +++ b/lib/reactable/table.js @@ -462,7 +462,7 @@ var Table = (function (_React$Component) { } } - return _react2['default'].createElement(_tr.Tr, _extends({ columns: columns, key: i, data: data }, props)); + return _react2['default'].createElement(_tr.Tr, _extends({ columns: columns, key: i, data: data, columnFormatters: this.props.columnFormatters }, props)); }).bind(this))); } diff --git a/lib/reactable/td.js b/lib/reactable/td.js index 28449fa1..8b3dad9d 100644 --- a/lib/reactable/td.js +++ b/lib/reactable/td.js @@ -69,6 +69,12 @@ var Td = (function (_React$Component) { if ((0, _unsafe.isUnsafe)(this.props.children)) { return _react2['default'].createElement('td', _extends({}, mergedProps, { dangerouslySetInnerHTML: { __html: this.props.children.toString() } })); + } else if (typeof this.props.formatter !== 'undefined') { + return _react2['default'].createElement( + 'td', + mergedProps, + _react2['default'].createElement(this.props.formatter, _extends({}, mergedProps, { text: this.props.children })) + ); } else { return _react2['default'].createElement( 'td', diff --git a/lib/reactable/tr.js b/lib/reactable/tr.js index c91e872c..332869d4 100644 --- a/lib/reactable/tr.js +++ b/lib/reactable/tr.js @@ -46,6 +46,9 @@ var Tr = (function (_React$Component) { } children = children.concat(this.props.columns.map((function (column, i) { + + var formatter = this.props.columnFormatters ? this.props.columnFormatters[column.key] : undefined; + if (this.props.data.hasOwnProperty(column.key)) { var value = this.props.data[column.key]; var props = {}; @@ -57,11 +60,11 @@ var Tr = (function (_React$Component) { return _react2['default'].createElement( _td.Td, - _extends({ column: column, key: column.key }, props), + _extends({ column: column, formatter: formatter, key: column.key }, props), value ); } else { - return _react2['default'].createElement(_td.Td, { column: column, key: column.key }); + return _react2['default'].createElement(_td.Td, { column: column, formatter: formatter, key: column.key }); } }).bind(this))); } diff --git a/src/reactable/table.jsx b/src/reactable/table.jsx index 82601180..4ca5cbac 100644 --- a/src/reactable/table.jsx +++ b/src/reactable/table.jsx @@ -424,7 +424,7 @@ export class Table extends React.Component { } return ( - + ); }.bind(this))); } diff --git a/src/reactable/td.jsx b/src/reactable/td.jsx index 23c22d1d..3569242f 100644 --- a/src/reactable/td.jsx +++ b/src/reactable/td.jsx @@ -34,6 +34,8 @@ export class Td extends React.Component { if (isUnsafe(this.props.children)) { return + } else if (typeof this.props.formatter !== 'undefined') { + return ; } else { return {stringifiedChildProps || this.props.children} diff --git a/src/reactable/tr.jsx b/src/reactable/tr.jsx index 5374f96a..2ecfbc89 100644 --- a/src/reactable/tr.jsx +++ b/src/reactable/tr.jsx @@ -14,7 +14,11 @@ export class Tr extends React.Component { ) { if (typeof(children.concat) === 'undefined') { console.log(children); } + children = children.concat(this.props.columns.map(function(column, i) { + + const formatter = (this.props.columnFormatters) ? this.props.columnFormatters[column.key] : undefined; + if (this.props.data.hasOwnProperty(column.key)) { var value = this.props.data[column.key]; var props = {}; @@ -28,9 +32,10 @@ export class Tr extends React.Component { value = value.value; } - return {value}; + + return {value}; } else { - return ; + return ; } }.bind(this))); } diff --git a/test.html b/test.html index e45d78ef..7cbed9f8 100644 --- a/test.html +++ b/test.html @@ -1,8 +1,9 @@ - - + + +