diff --git a/packages/react-bootstrap-table2-toolkit/src/op/csv.js b/packages/react-bootstrap-table2-toolkit/src/op/csv.js index 5f05a4e..47a6339 100644 --- a/packages/react-bootstrap-table2-toolkit/src/op/csv.js +++ b/packages/react-bootstrap-table2-toolkit/src/op/csv.js @@ -25,13 +25,19 @@ export default Base => let data; if (typeof source !== 'undefined') { data = source; + } else if (options.exportAll) { + data = this.props.data; } else { - data = options.exportAll ? this.props.data : this.getData(); + const payload = {}; + this.tableExposedAPIEmitter.emit('get.table.data', payload); + data = payload.result; } // filter data if (options.onlyExportSelection) { - const selections = this.getSelected(); + const payload = {}; + this.tableExposedAPIEmitter.emit('get.selected.rows', payload); + const selections = payload.result; data = data.filter(row => !!selections.find(sel => row[keyField] === sel)); } const content = transform(data, meta, this._.get, options); diff --git a/packages/react-bootstrap-table2-toolkit/statelessOp.js b/packages/react-bootstrap-table2-toolkit/statelessOp.js index 6c248c1..85444bf 100644 --- a/packages/react-bootstrap-table2-toolkit/statelessOp.js +++ b/packages/react-bootstrap-table2-toolkit/statelessOp.js @@ -2,9 +2,7 @@ import Operation from './src/op'; export default Base => class StatelessOperation extends Operation.csvOperation(Base) { - registerExposedAPI = (...exposedFuncs) => { - exposedFuncs.forEach((func) => { - this[func.name] = func; - }); + registerExposedAPI = (tableExposedAPIEmitter) => { + this.tableExposedAPIEmitter = tableExposedAPIEmitter; } }; diff --git a/packages/react-bootstrap-table2/src/bootstrap-table.js b/packages/react-bootstrap-table2/src/bootstrap-table.js index 8bcd7c1..c77c107 100644 --- a/packages/react-bootstrap-table2/src/bootstrap-table.js +++ b/packages/react-bootstrap-table2/src/bootstrap-table.js @@ -14,13 +14,10 @@ class BootstrapTable extends PropsBaseResolver(Component) { constructor(props) { super(props); this.validateProps(); - if (props.registerExposedAPI) { - props.registerExposedAPI(this.getData); - } } // Exposed APIs - getData() { + getData = () => { return this.visibleRows(); } diff --git a/packages/react-bootstrap-table2/src/contexts/index.js b/packages/react-bootstrap-table2/src/contexts/index.js index 12bfb9a..7caf60c 100644 --- a/packages/react-bootstrap-table2/src/contexts/index.js +++ b/packages/react-bootstrap-table2/src/contexts/index.js @@ -1,6 +1,8 @@ /* eslint no-return-assign: 0 */ +/* eslint no-param-reassign: 0 */ /* eslint class-methods-use-this: 0 */ import React, { Component } from 'react'; +import EventEmitter from 'events'; import _ from '../utils'; import createDataContext from './data-context'; import createSortContext from './sort-context'; @@ -16,6 +18,13 @@ const withContext = Base => super(props); this.DataContext = createDataContext(); + if (props.registerExposedAPI) { + const exposedAPIEmitter = new EventEmitter(); + exposedAPIEmitter.on('get.table.data', payload => payload.result = this.table.getData()); + exposedAPIEmitter.on('get.selected.rows', payload => payload.result = this.selectionContext.getSelected()); + props.registerExposedAPI(exposedAPIEmitter); + } + if (props.columns.filter(col => col.sort).length > 0) { this.SortContext = createSortContext( dataOperator, this.isRemoteSort, this.handleRemoteSortChange); @@ -255,9 +264,8 @@ const withContext = Base => } render() { - const { keyField, columns, bootstrap4, registerExposedAPI } = this.props; + const { keyField, columns, bootstrap4 } = this.props; const baseProps = { keyField, columns }; - if (registerExposedAPI) baseProps.registerExposedAPI = registerExposedAPI; let base = this.renderBase(); diff --git a/packages/react-bootstrap-table2/src/contexts/selection-context.js b/packages/react-bootstrap-table2/src/contexts/selection-context.js index 2bdd321..9c44cff 100644 --- a/packages/react-bootstrap-table2/src/contexts/selection-context.js +++ b/packages/react-bootstrap-table2/src/contexts/selection-context.js @@ -14,14 +14,6 @@ class SelectionProvider extends React.Component { keyField: PropTypes.string.isRequired } - constructor(props) { - super(props); - if (props.registerExposedAPI) { - const getSelected = () => this.getSelected(); - props.registerExposedAPI(getSelected); - } - } - state = { selected: this.props.selectRow.selected || [] }; componentWillReceiveProps(nextProps) { diff --git a/packages/react-bootstrap-table2/test/bootstrap-table.test.js b/packages/react-bootstrap-table2/test/bootstrap-table.test.js index 23986a8..a543111 100644 --- a/packages/react-bootstrap-table2/test/bootstrap-table.test.js +++ b/packages/react-bootstrap-table2/test/bootstrap-table.test.js @@ -60,26 +60,6 @@ describe('BootstrapTable', () => { }); }); - describe('when props.registerExposedAPI is defined', () => { - const registerExposedAPI = jest.fn(); - beforeEach(() => { - registerExposedAPI.mockClear(); - wrapper = shallow( - - ); - }); - - it('should call props.registerExposedAPI correctly', () => { - expect(registerExposedAPI).toHaveBeenCalledTimes(1); - expect(registerExposedAPI.mock.calls[0][0].name).toEqual('getData'); - }); - }); - describe('when props.classes was defined', () => { const classes = 'foo';