This commit is contained in:
Allen 2019-01-06 14:47:22 +08:00 committed by GitHub
parent 22cc79961f
commit 782c630e58
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 21 additions and 40 deletions

View File

@ -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);

View File

@ -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;
}
};

View File

@ -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();
}

View File

@ -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();

View File

@ -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) {

View File

@ -60,26 +60,6 @@ describe('BootstrapTable', () => {
});
});
describe('when props.registerExposedAPI is defined', () => {
const registerExposedAPI = jest.fn();
beforeEach(() => {
registerExposedAPI.mockClear();
wrapper = shallow(
<BootstrapTable
keyField="id"
columns={ columns }
data={ data }
registerExposedAPI={ registerExposedAPI }
/>
);
});
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';