diff --git a/packages/react-bootstrap-table2-toolkit/README.md b/packages/react-bootstrap-table2-toolkit/README.md index 5d502e1..f26c366 100644 --- a/packages/react-bootstrap-table2-toolkit/README.md +++ b/packages/react-bootstrap-table2-toolkit/README.md @@ -120,4 +120,7 @@ Custom the csv file separator. Default is `false`. Give true to avoid to attach the csv header. #### noAutoBOM - [bool] -Default is `true`. \ No newline at end of file +Default is `true`. + +#### exportAll - [bool] +Default is `true`. `false` will only export current data which display on table. \ No newline at end of file diff --git a/packages/react-bootstrap-table2-toolkit/context.js b/packages/react-bootstrap-table2-toolkit/context.js index 4ae5e19..386820f 100644 --- a/packages/react-bootstrap-table2-toolkit/context.js +++ b/packages/react-bootstrap-table2-toolkit/context.js @@ -69,7 +69,8 @@ class ToolkitProvider extends statelessDrcorator(React.Component) { columns: this.props.columns, data: this.props.data, bootstrap4: this.props.bootstrap4, - setDependencyModules: this.setDependencyModules + setDependencyModules: this.setDependencyModules, + registerExposedAPI: this.registerExposedAPI }; if (this.props.search) { baseProps.search = { diff --git a/packages/react-bootstrap-table2-toolkit/src/op/csv.js b/packages/react-bootstrap-table2-toolkit/src/op/csv.js index b3803aa..8c6ced3 100644 --- a/packages/react-bootstrap-table2-toolkit/src/op/csv.js +++ b/packages/react-bootstrap-table2-toolkit/src/op/csv.js @@ -4,13 +4,14 @@ const csvDefaultOptions = { fileName: 'spreadsheet.csv', separator: ',', ignoreHeader: false, - noAutoBOM: true + noAutoBOM: true, + exportAll: true }; export default Base => class CSVOperation extends Base { handleExportCSV = () => { - const { columns, data, exportCSV } = this.props; + const { columns, exportCSV } = this.props; const meta = getMetaInfo(columns); const options = exportCSV === true ? csvDefaultOptions : @@ -18,6 +19,8 @@ export default Base => ...csvDefaultOptions, ...exportCSV }; + + const data = options.exportAll ? this.props.data : this.getData(); const content = transform(data, meta, this._.get, options); save(content, options); } diff --git a/packages/react-bootstrap-table2-toolkit/statelessOp.js b/packages/react-bootstrap-table2-toolkit/statelessOp.js index b39287d..6c248c1 100644 --- a/packages/react-bootstrap-table2-toolkit/statelessOp.js +++ b/packages/react-bootstrap-table2-toolkit/statelessOp.js @@ -1,4 +1,10 @@ import Operation from './src/op'; export default Base => - class StatelessOperation extends Operation.csvOperation(Base) {}; + class StatelessOperation extends Operation.csvOperation(Base) { + registerExposedAPI = (...exposedFuncs) => { + exposedFuncs.forEach((func) => { + this[func.name] = func; + }); + } + }; diff --git a/packages/react-bootstrap-table2/src/bootstrap-table.js b/packages/react-bootstrap-table2/src/bootstrap-table.js index 9afaab0..99ef4b2 100644 --- a/packages/react-bootstrap-table2/src/bootstrap-table.js +++ b/packages/react-bootstrap-table2/src/bootstrap-table.js @@ -15,6 +15,15 @@ class BootstrapTable extends PropsBaseResolver(Component) { constructor(props) { super(props); this.validateProps(); + if (props.registerExposedAPI) { + const getData = () => this.getData(); + props.registerExposedAPI(getData); + } + } + + // Exposed APIs + getData = () => { + return this.props.data; } render() { diff --git a/packages/react-bootstrap-table2/test/bootstrap-table.test.js b/packages/react-bootstrap-table2/test/bootstrap-table.test.js index 4991018..23986a8 100644 --- a/packages/react-bootstrap-table2/test/bootstrap-table.test.js +++ b/packages/react-bootstrap-table2/test/bootstrap-table.test.js @@ -46,6 +46,40 @@ describe('BootstrapTable', () => { }); }); + describe('getData', () => { + let instance; + + beforeEach(() => { + wrapper = shallow( + ); + instance = wrapper.instance(); + }); + + it('should return props.data', () => { + expect(instance.getData()).toEqual(data); + }); + }); + + 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';