Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
fix wrong higher order wrapping
  • Loading branch information
AllenFang committed Oct 24, 2017
commit 2ac1d3fe9f161bb240131a150925da2a1f377d77
8 changes: 5 additions & 3 deletions packages/react-bootstrap-table2/src/cell-edit/wrapper.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
/* eslint arrow-body-style: 0 */
/* eslint react/prop-types: 0 */
import React, { Component } from 'react';
import { Component } from 'react';
import PropTypes from 'prop-types';
import _ from '../utils';

import { cellEditElement } from '../table-factory';

class CellEditWrapper extends Component {
constructor(props) {
super(props);
Expand Down Expand Up @@ -88,7 +90,8 @@ class CellEditWrapper extends Component {
}

render() {
return React.cloneElement(this.props.elem, {
return cellEditElement({
...this.props,
onCellUpdate: this.handleCellUpdate,
onStartEditing: this.startEditing,
onEscapeEditing: this.escapeEditing,
Expand All @@ -98,7 +101,6 @@ class CellEditWrapper extends Component {
}

CellEditWrapper.propTypes = {
elem: PropTypes.element.isRequired,
onUpdateCell: PropTypes.func.isRequired
};

Expand Down
71 changes: 19 additions & 52 deletions packages/react-bootstrap-table2/src/container.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
/* eslint arrow-body-style: 0 */
/* eslint react/jsx-no-bind: 0 */
/* eslint no-return-assign: 0 */
/* eslint react/prop-types: 0 */
import React, { Component } from 'react';
import Store from './store/base';
import SortWrapper from './sort/wrapper';
import CellEditWrapper from './cell-edit/wrapper';
import RowSelectionWrapper from './row-selection/wrapper';

import {
wrapWithCellEdit,
wrapWithSelection,
wrapWithSort
} from './table-factory';

import _ from './utils';

const withDataStore = (Base) => {
return class BootstrapTableContainer extends Component {
const withDataStore = Base =>
class BootstrapTableContainer extends Component {
constructor(props) {
super(props);
this.store = new Store(props);
Expand Down Expand Up @@ -46,61 +48,26 @@ const withDataStore = (Base) => {
return false;
}

renderCellEdit(elem) {
return (
<CellEditWrapper
keyField={ this.props.keyField }
cellEdit={ this.props.cellEdit }
ref={ node => this.cellEditWrapper = node }
elem={ elem }
onUpdateCell={ this.handleUpdateCell }
/>
);
}

renderRowSelection(elem) {
return (
<RowSelectionWrapper
keyField={ this.props.keyField }
selectRow={ this.props.selectRow }
store={ this.store }
elem={ elem }
/>
);
}

renderSort(elem) {
return (
<SortWrapper elem={ elem } store={ this.store } />
);
}

render() {
const baseProps = {
...this.props,
store: this.store
};

let element = React.createElement(Base, baseProps);

// @TODO
// the logic of checking sort is enable or not should be placed in the props resolver..
// but currently, I've no idea to refactoring this
if (this.props.columns.filter(col => col.sort).length > 0) {
element = this.renderSort(element);
}

if (this.props.selectRow) {
element = this.renderRowSelection(element);
}

if (this.props.cellEdit) {
element = this.renderCellEdit(element);
return wrapWithCellEdit({
ref: node => this.cellEditWrapper = node,
onUpdateCell: this.handleUpdateCell,
...baseProps
});
} else if (this.props.selectRow) {
return wrapWithSelection(baseProps);
} else if (this.props.columns.filter(col => col.sort).length > 0) {
return wrapWithSort(baseProps);
}

return element;
return React.createElement(Base, baseProps);
}
};
};

export default withDataStore;
7 changes: 4 additions & 3 deletions packages/react-bootstrap-table2/src/row-selection/wrapper.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
/* eslint arrow-body-style: 0 */
/* eslint react/prop-types: 0 */
import React, { Component } from 'react';
import { Component } from 'react';
import PropTypes from 'prop-types';
import { selectionElement } from '../table-factory';

import Const from '../const';

Expand Down Expand Up @@ -65,15 +66,15 @@ class RowSelectionWrapper extends Component {
}

render() {
return React.cloneElement(this.props.elem, {
return selectionElement({
...this.props,
onRowSelect: this.handleRowSelect,
onAllRowsSelect: this.handleAllRowsSelect
});
}
}

RowSelectionWrapper.propTypes = {
elem: PropTypes.element.isRequired,
store: PropTypes.object.isRequired
};

Expand Down
8 changes: 5 additions & 3 deletions packages/react-bootstrap-table2/src/sort/wrapper.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
/* eslint arrow-body-style: 0 */
/* eslint react/prop-types: 0 */
/* eslint no-return-assign: 0 */
import React, { Component } from 'react';
import { Component } from 'react';
import PropTypes from 'prop-types';

import { sortableElement } from '../table-factory';

class SortWrapper extends Component {
constructor(props) {
super(props);
Expand All @@ -20,15 +22,15 @@ class SortWrapper extends Component {
}

render() {
return React.cloneElement(this.props.elem, {
return sortableElement({
...this.props,
ref: node => this.table = node,
onSort: this.handleSort
});
}
}

SortWrapper.propTypes = {
elem: PropTypes.element.isRequired,
store: PropTypes.object.isRequired
};

Expand Down
27 changes: 27 additions & 0 deletions packages/react-bootstrap-table2/src/table-factory.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import React from 'react';

import BootstrapTable from './bootstrap-table';

import SortWrapper from './sort/wrapper';
import RowSelectionWrapper from './row-selection/wrapper';
import CellEditWrapper from './cell-edit/wrapper';


export const wrapWithCellEdit = props =>
React.createElement(CellEditWrapper, { ...props });

export const wrapWithSelection = props =>
React.createElement(RowSelectionWrapper, { ...props });

export const wrapWithSort = props =>
React.createElement(SortWrapper, { ...props });

export const pureTable = props =>
React.createElement(BootstrapTable, { ...props });


export const sortableElement = props => pureTable(props);

export const selectionElement = props => wrapWithSort(props);

export const cellEditElement = props => wrapWithSelection(props);