mirror of
https://github.com/gosticks/react-bootstrap-table2.git
synced 2026-06-29 21:50:07 +00:00
Compare commits
260 Commits
react-boot
...
react-boot
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f86876ba51 | ||
|
|
44569d6df9 | ||
|
|
3663d1d4fe | ||
|
|
6225f0e5cb | ||
|
|
f0fd06a5f5 | ||
|
|
b181c98a38 | ||
|
|
1f51f1a08d | ||
|
|
586acaed68 | ||
|
|
528be5c058 | ||
|
|
76575bd9f1 | ||
|
|
54b98f41f4 | ||
|
|
ffac3a42c5 | ||
|
|
97b9e1097b | ||
|
|
a6de7fa84a | ||
|
|
3ec849bd94 | ||
|
|
208feb9849 | ||
|
|
a3ba464f40 | ||
|
|
cb970cded5 | ||
|
|
d5d8c54d98 | ||
|
|
2ec55f6de9 | ||
|
|
f7406bcafc | ||
|
|
925d3d7841 | ||
|
|
62c69490f2 | ||
|
|
3f957db56b | ||
|
|
495875792f | ||
|
|
c0416fc307 | ||
|
|
f7ba8e377d | ||
|
|
0d64443b26 | ||
|
|
7919a4001d | ||
|
|
fadbcdaa24 | ||
|
|
ec77a0539d | ||
|
|
b792803974 | ||
|
|
f0e37b130c | ||
|
|
03ece4b1fc | ||
|
|
0ec5b6cb9f | ||
|
|
e6d4a9641b | ||
|
|
5a442bf7ed | ||
|
|
a18932e9eb | ||
|
|
c36aa24c65 | ||
|
|
81ddd2c25b | ||
|
|
4af5b4f6ef | ||
|
|
dbd0f89a3d | ||
|
|
35b1e37940 | ||
|
|
6eaffe1993 | ||
|
|
46f0ce493b | ||
|
|
18b785d655 | ||
|
|
7b15bf45d9 | ||
|
|
0d4d32c6e4 | ||
|
|
760d459414 | ||
|
|
77301c2cf1 | ||
|
|
78ea63074e | ||
|
|
9c677fe174 | ||
|
|
c13b3fa197 | ||
|
|
167352f199 | ||
|
|
fc0b99e8a0 | ||
|
|
74bf885d47 | ||
|
|
400c307871 | ||
|
|
b1c086f424 | ||
|
|
d534c425d3 | ||
|
|
4ecf2433d0 | ||
|
|
6c086c3892 | ||
|
|
1e72c80566 | ||
|
|
8f4dc9907a | ||
|
|
2f7d0104a0 | ||
|
|
4f6809de84 | ||
|
|
216bc10142 | ||
|
|
5307e58813 | ||
|
|
143acde35e | ||
|
|
2525465a5a | ||
|
|
6d08a24a8f | ||
|
|
906180ad3f | ||
|
|
0ff0c33aa9 | ||
|
|
37e79a654b | ||
|
|
4e7cfdf5ea | ||
|
|
6f4e779a3e | ||
|
|
38d3e2df05 | ||
|
|
4e204f1ccd | ||
|
|
7e29999b40 | ||
|
|
01cf69392f | ||
|
|
7d7688582b | ||
|
|
e26065b116 | ||
|
|
485503c54d | ||
|
|
3c37716dd2 | ||
|
|
1a7f86a321 | ||
|
|
475f8c67b0 | ||
|
|
26314254be | ||
|
|
6522f6d964 | ||
|
|
ecaf439e66 | ||
|
|
90d03676ad | ||
|
|
2585a62697 | ||
|
|
6afe58a081 | ||
|
|
6f5bd1a13d | ||
|
|
85a9ab72af | ||
|
|
258ea43225 | ||
|
|
7a7b708029 | ||
|
|
0cf89861af | ||
|
|
eb74625835 | ||
|
|
cbaec4c655 | ||
|
|
04c21cb63d | ||
|
|
7d72002b6e | ||
|
|
279cc25da0 | ||
|
|
1152bb8440 | ||
|
|
88befb8136 | ||
|
|
42c6bc0337 | ||
|
|
6e753bb955 | ||
|
|
64df3e1fae | ||
|
|
5cdd1ad093 | ||
|
|
36e754b6bc | ||
|
|
6730dcf60d | ||
|
|
fb54809dc9 | ||
|
|
d43c622fdb | ||
|
|
7253d7a1d7 | ||
|
|
a6daa50417 | ||
|
|
b11019ce20 | ||
|
|
dda47f7b7d | ||
|
|
4da8ba7ecc | ||
|
|
2ff0b27747 | ||
|
|
c3f279fb0c | ||
|
|
06bcf1edca | ||
|
|
fc1f75cfac | ||
|
|
1cf12ab707 | ||
|
|
288ccc1049 | ||
|
|
f13c139f63 | ||
|
|
e72ad0586e | ||
|
|
c2044fe8b5 | ||
|
|
a7b3690a7c | ||
|
|
68afc348db | ||
|
|
5404124a78 | ||
|
|
d592871c0d | ||
|
|
6019e550fd | ||
|
|
765a49fb07 | ||
|
|
fe2fd93c20 | ||
|
|
19ba336e32 | ||
|
|
a50148fe85 | ||
|
|
c96156503f | ||
|
|
ed2ba2a5c5 | ||
|
|
f87fe3e544 | ||
|
|
43e73313e6 | ||
|
|
888aa1d08b | ||
|
|
028834da8b | ||
|
|
8f3b989b00 | ||
|
|
fe8761427d | ||
|
|
27a09de008 | ||
|
|
20ba8cc24e | ||
|
|
b8b52e7fc0 | ||
|
|
05a8c3be5f | ||
|
|
2f9bedbeeb | ||
|
|
01be6fc275 | ||
|
|
c20a4bb220 | ||
|
|
ed21b3cb65 | ||
|
|
f2a44c976d | ||
|
|
ca5189d8ad | ||
|
|
03f51c36ac | ||
|
|
607202b4e9 | ||
|
|
4db4f4fb2d | ||
|
|
1d7df6819e | ||
|
|
e4b6993692 | ||
|
|
b15d7a3412 | ||
|
|
b172c6801c | ||
|
|
dc1f4dcc38 | ||
|
|
a82e611358 | ||
|
|
c64951fd6f | ||
|
|
a35701fabf | ||
|
|
f54c1f77b4 | ||
|
|
377534512a | ||
|
|
09032349d0 | ||
|
|
4dd39aeed8 | ||
|
|
a1477e2ad3 | ||
|
|
f34cb4bf63 | ||
|
|
3dc9cd3941 | ||
|
|
e8458b4b63 | ||
|
|
1d87ce9ffc | ||
|
|
88e1a0774b | ||
|
|
11d4f40089 | ||
|
|
41dc3ef619 | ||
|
|
4501ddb632 | ||
|
|
05657ee217 | ||
|
|
c91f521913 | ||
|
|
9ee9c7de43 | ||
|
|
42dbd00fd9 | ||
|
|
bd9150f88f | ||
|
|
3956fbca11 | ||
|
|
240bcd75c0 | ||
|
|
6de57737ea | ||
|
|
33a8da701b | ||
|
|
d5ddd8c3af | ||
|
|
6f9361934a | ||
|
|
6bc81dddd0 | ||
|
|
c11539b9fb | ||
|
|
94f1a5ee57 | ||
|
|
de27072ceb | ||
|
|
55336108a0 | ||
|
|
923439dc81 | ||
|
|
d80ae13513 | ||
|
|
ceebdf5a13 | ||
|
|
0eda54b772 | ||
|
|
3ed4d87b29 | ||
|
|
8a8c2d4964 | ||
|
|
3cea9658c7 | ||
|
|
9f9203bffa | ||
|
|
4011cae18e | ||
|
|
60f32f0336 | ||
|
|
a5cb806d98 | ||
|
|
9382ed587b | ||
|
|
a11913c49a | ||
|
|
4635b60da0 | ||
|
|
4d9e20e9c8 | ||
|
|
931cf80450 | ||
|
|
5dd1f1e9ea | ||
|
|
a8083ac17d | ||
|
|
096799c403 | ||
|
|
6dee718081 | ||
|
|
936a82954c | ||
|
|
ba24990994 | ||
|
|
e7ccd47817 | ||
|
|
a0af964d76 | ||
|
|
865be93ef7 | ||
|
|
65a596a0e9 | ||
|
|
024bba15fa | ||
|
|
f9217930e7 | ||
|
|
fc34ea12e6 | ||
|
|
b0f411e934 | ||
|
|
28a1077bad | ||
|
|
ca32eee28e | ||
|
|
7030b54cbd | ||
|
|
4d7378e3f1 | ||
|
|
88234fead0 | ||
|
|
dea780519f | ||
|
|
577973a147 | ||
|
|
c4f14e2b69 | ||
|
|
38bb2290dc | ||
|
|
feedcb9f4b | ||
|
|
8bfbc14bd9 | ||
|
|
ee4eb8f2c6 | ||
|
|
8fa6389c81 | ||
|
|
9a354444d0 | ||
|
|
2533a63430 | ||
|
|
81e0080aa6 | ||
|
|
094a0682f1 | ||
|
|
3f2c6201d9 | ||
|
|
280c423298 | ||
|
|
fc813e80b6 | ||
|
|
4bb2ae2ba0 | ||
|
|
09fadeb02b | ||
|
|
283179ebe1 | ||
|
|
e83dd1bf07 | ||
|
|
760011ac03 | ||
|
|
067a94bea7 | ||
|
|
d8ecc6277b | ||
|
|
216befae4b | ||
|
|
3c9cd22d42 | ||
|
|
d84b614599 | ||
|
|
85f1eba7cb | ||
|
|
045ca4adb0 | ||
|
|
2263282629 | ||
|
|
a2d082babf | ||
|
|
79d5a51a39 | ||
|
|
51e0cc9129 | ||
|
|
659f2e2636 | ||
|
|
badce54b95 |
@@ -9,9 +9,10 @@ cache:
|
|||||||
|
|
||||||
branches:
|
branches:
|
||||||
only:
|
only:
|
||||||
# skip master branch when it's under development phase
|
- master
|
||||||
# - master
|
|
||||||
- develop
|
- develop
|
||||||
|
except:
|
||||||
|
- gh-pages-src
|
||||||
|
|
||||||
before_install:
|
before_install:
|
||||||
- curl -o- -L https://yarnpkg.com/install.sh | bash -s
|
- curl -o- -L https://yarnpkg.com/install.sh | bash -s
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ Additionally, asking questions and requesting new features are welcomed via [iss
|
|||||||
# Pull Requests
|
# Pull Requests
|
||||||
Check [here](./docs/development.md) for getting started with development.
|
Check [here](./docs/development.md) for getting started with development.
|
||||||
|
|
||||||
|
* PR base is `develop` branch
|
||||||
* We recommend filing an [issue](https://github.com/react-bootstrap-table/react-bootstrap-table2/issues) before you implement any new features.
|
* We recommend filing an [issue](https://github.com/react-bootstrap-table/react-bootstrap-table2/issues) before you implement any new features.
|
||||||
* Please ensure that all the test suites have passed before submitting a PR. Besides, always test the actual business logic.
|
* Please ensure that all the test suites have passed before submitting a PR. Besides, always test the actual business logic.
|
||||||
* If your PR is trying to fix a bug, please describe the details as much as you could and tag the bug number with hashtag.
|
* If your PR is trying to fix a bug, please describe the details as much as you could and tag the bug number with hashtag.
|
||||||
|
|||||||
21
LICENSE
Normal file
21
LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2018 react-bootstrap-table2
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
35
README.md
35
README.md
@@ -1,12 +1,43 @@
|
|||||||
# react-bootstrap-table2
|
# react-bootstrap-table2
|
||||||
|
[](https://travis-ci.org/react-bootstrap-table/react-bootstrap-table2)
|
||||||
Rebuilt [react-bootstrap-table](https://github.com/AllenFang/react-bootstrap-table)
|
Rebuilt [react-bootstrap-table](https://github.com/AllenFang/react-bootstrap-table)
|
||||||
|
|
||||||
## Development
|
> `react-bootstrap-table2`'s npm module name is [**`react-bootstrap-table-next`**](https://www.npmjs.com/package/react-bootstrap-table-next) due to some guys already used it
|
||||||
Please check [development guide](./docs/development.md).
|
|
||||||
|
`react-bootstrap-table2` separate some functionalities from core modules to other modules like following:
|
||||||
|
|
||||||
|
* [`react-bootstrap-table-next`](https://www.npmjs.com/package/react-bootstrap-table-next)
|
||||||
|
* [`react-bootstrap-table2-filter`](https://www.npmjs.com/package/react-bootstrap-table2-filter)
|
||||||
|
* [`react-bootstrap-table2-editor`](https://www.npmjs.com/package/react-bootstrap-table2-editor)
|
||||||
|
* [`react-bootstrap-table2-paginator`](https://www.npmjs.com/package/react-bootstrap-table2-paginator)
|
||||||
|
* [`react-bootstrap-table2-overlay`](https://www.npmjs.com/package/react-bootstrap-table2-overlay)
|
||||||
|
* [`react-bootstrap-table2-toolkit`](https://www.npmjs.com/package/react-bootstrap-table2-toolkit)
|
||||||
|
|
||||||
|
This can help your application with less bundled size and also help us have clean design to avoid handling to much logic in kernal module(SRP).
|
||||||
|
|
||||||
|
## Migration
|
||||||
|
If you are the user from legacy [`react-bootstrap-table`](https://github.com/AllenFang/react-bootstrap-table/), please have a look on [this](./docs/migration.md).
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
See [getting started](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/getting-started.html).
|
See [getting started](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/getting-started.html).
|
||||||
|
|
||||||
|
## Online Demo
|
||||||
|
See `react-bootstrap-table2` [storybook](https://react-bootstrap-table.github.io/react-bootstrap-table2/storybook/index.html).
|
||||||
|
|
||||||
## Roadmap
|
## Roadmap
|
||||||
See [release plans](https://react-bootstrap-table.github.io/react-bootstrap-table2/blog/2018/01/24/release-plan.html).
|
See [release plans](https://react-bootstrap-table.github.io/react-bootstrap-table2/blog/2018/01/24/release-plan.html).
|
||||||
|
|
||||||
|
## Development
|
||||||
|
Please check [development guide](./docs/development.md).
|
||||||
|
|
||||||
|
## How should I run storybook example in my local?
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ git clone https://github.com/react-bootstrap-table/react-bootstrap-table2.git
|
||||||
|
$ cd react-bootstrap-table2
|
||||||
|
$ yarn install
|
||||||
|
$ yarn storybook
|
||||||
|
$ Go to localhost:6006
|
||||||
|
```
|
||||||
|
|
||||||
|
**Storybook examples: [`packages/react-bootstrap-table2-example/examples`](https://github.com/react-bootstrap-table/react-bootstrap-table2/tree/master/packages/react-bootstrap-table2-example/examples)**
|
||||||
1
_config.yml
Normal file
1
_config.yml
Normal file
@@ -0,0 +1 @@
|
|||||||
|
theme: jekyll-theme-cayman
|
||||||
@@ -9,18 +9,25 @@
|
|||||||
|
|
||||||
#### Optional
|
#### Optional
|
||||||
* [remote](#remote)
|
* [remote](#remote)
|
||||||
|
* [bootstrap4](#bootstrap4)
|
||||||
* [loading](#loading)
|
* [loading](#loading)
|
||||||
* [caption](#caption)
|
* [caption](#caption)
|
||||||
* [striped](#striped)
|
* [striped](#striped)
|
||||||
* [bordered](#bordered)
|
* [bordered](#bordered)
|
||||||
* [hover](#hover)
|
* [hover](#hover)
|
||||||
* [condensed](#condensed)
|
* [condensed](#condensed)
|
||||||
|
* [id](#id)
|
||||||
|
* [classes](#classes)
|
||||||
|
* [wrapperClasses](#wrapperClasses)
|
||||||
|
* [headerClasses](#headerClasses)
|
||||||
* [cellEdit](#cellEdit)
|
* [cellEdit](#cellEdit)
|
||||||
* [selectRow](#selectRow)
|
* [selectRow](#selectRow)
|
||||||
|
* [expandRow](#expandRow)
|
||||||
* [rowStyle](#rowStyle)
|
* [rowStyle](#rowStyle)
|
||||||
* [rowClasses](#rowClasses)
|
* [rowClasses](#rowClasses)
|
||||||
* [rowEvents](#rowEvents)
|
* [rowEvents](#rowEvents)
|
||||||
* [defaultSorted](#defaultSorted)
|
* [defaultSorted](#defaultSorted)
|
||||||
|
* [defaultSortDirection](#defaultSortDirection)
|
||||||
* [pagination](#pagination)
|
* [pagination](#pagination)
|
||||||
* [filter](#filter)
|
* [filter](#filter)
|
||||||
* [onTableChange](#onTableChange)
|
* [onTableChange](#onTableChange)
|
||||||
@@ -59,14 +66,17 @@ A special case for remote pagination:
|
|||||||
remote={ { pagination: true, filter: false, sort: false } }
|
remote={ { pagination: true, filter: false, sort: false } }
|
||||||
```
|
```
|
||||||
|
|
||||||
There is a apecial case for remote pagination, even you only specified the paignation need to handle as remote, `react-bootstrap-table2` will handle all the table changes(filter, sort etc) as remote mode, because `react-bootstrap-table2` only know the data of current page, but filtering, searching or sort need to work on overall datas.
|
There is a special case for remote pagination, even you only specified the pagination need to handle as remote, `react-bootstrap-table2` will handle all the table changes(filter, sort etc) as remote mode, because `react-bootstrap-table2` only know the data of current page, but filtering, searching or sort need to work on overall data.
|
||||||
|
|
||||||
|
### <a name='bootstrap4'>bootstrap4 - [Bool]</a>
|
||||||
|
`true` to indicate your bootstrap version is 4. Default version is 3.
|
||||||
|
|
||||||
### <a name='loading'>loading - [Bool]</a>
|
### <a name='loading'>loading - [Bool]</a>
|
||||||
Telling if table is loading or not, for example: waiting data loading, filtering etc. It's **only** valid when [`remote`](#remote) is enabled.
|
Telling if table is loading or not, for example: waiting data loading, filtering etc. It's **only** valid when [`remote`](#remote) is enabled.
|
||||||
When `loading` is `true`, `react-bootstrap-table2` will attend to render a overlay on table via [`overlay`](#overlay) prop, if [`overlay`](#overlay) prop is not given, `react-bootstrap-table2` will ignore the overlay rendering.
|
When `loading` is `true`, `react-bootstrap-table2` will attend to render a overlay on table via [`overlay`](#overlay) prop, if [`overlay`](#overlay) prop is not given, `react-bootstrap-table2` will ignore the overlay rendering.
|
||||||
|
|
||||||
### <a name='overlay'>overlay - [Function]</a>
|
### <a name='overlay'>overlay - [Function]</a>
|
||||||
`overlay` accept a factory funtion which should returning a higher order component. By default, `react-bootstrap-table2-overlay` can be a good option for you:
|
`overlay` accept a factory function which should returning a higher order component. By default, `react-bootstrap-table2-overlay` can be a good option for you:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
$ npm install react-bootstrap-table2-overlay
|
$ npm install react-bootstrap-table2-overlay
|
||||||
@@ -100,12 +110,26 @@ Same as bootstrap `.table-hover` class for adding mouse hover effect (grey backg
|
|||||||
### <a name='condensed'>condensed - [Bool]</a>
|
### <a name='condensed'>condensed - [Bool]</a>
|
||||||
Same as bootstrap `.table-condensed` class for making a table more compact by cutting cell padding in half.
|
Same as bootstrap `.table-condensed` class for making a table more compact by cutting cell padding in half.
|
||||||
|
|
||||||
|
### <a name='id'>id - [String]</a>
|
||||||
|
Customize id on `table` element.
|
||||||
|
### <a name='classes'>classes - [String]</a>
|
||||||
|
Customize class on `table` element.
|
||||||
|
|
||||||
|
### <a name='wrapperClasses'>wrapperClasses - [String]</a>
|
||||||
|
Customize class on the outer element which wrap up the `table` element.
|
||||||
|
|
||||||
|
### <a name='headerClasses'>headerClasses - [String]</a>
|
||||||
|
Customize class on the header row(`tr`).
|
||||||
|
|
||||||
### <a name='cellEdit'>cellEdit - [Object]</a>
|
### <a name='cellEdit'>cellEdit - [Object]</a>
|
||||||
Makes table cells editable, please see [cellEdit definition](./cell-edit.md) for more detail.
|
Makes table cells editable, please see [cellEdit definition](./cell-edit.md) for more detail.
|
||||||
|
|
||||||
### <a name='selectRow'>selectRow - [Object]</a>
|
### <a name='selectRow'>selectRow - [Object]</a>
|
||||||
Makes table rows selectable, please see [selectRow definition](./row-selection.md) for more detail.
|
Makes table rows selectable, please see [selectRow definition](./row-selection.md) for more detail.
|
||||||
|
|
||||||
|
### <a name='expandRow'>expandRow - [Object]</a>
|
||||||
|
Makes table rows expandable, please see [expandRow definition](./row-expand.md) for more detail.
|
||||||
|
|
||||||
### <a name='rowStyle'>rowStyle = [Object | Function]</a>
|
### <a name='rowStyle'>rowStyle = [Object | Function]</a>
|
||||||
Custom the style of table rows:
|
Custom the style of table rows:
|
||||||
|
|
||||||
@@ -145,7 +169,7 @@ Custom the events on row:
|
|||||||
|
|
||||||
```js
|
```js
|
||||||
const rowEvents = {
|
const rowEvents = {
|
||||||
onClick: (e) => {
|
onClick: (e, row, rowIndex) => {
|
||||||
....
|
....
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -162,8 +186,11 @@ const defaultSorted = [{
|
|||||||
}];
|
}];
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### <a name='defaultSortDirection'>defaultSortDirection - [String]</a>
|
||||||
|
Default sort direction when user click on header column at first time, available value is `asc` and `desc`. Default is `desc`.
|
||||||
|
|
||||||
### <a name='pagination'>pagination - [Object]</a>
|
### <a name='pagination'>pagination - [Object]</a>
|
||||||
`pagination` allow user to render a pagination panel on the bottom of table. But pagination funcitonality is separated from core of `react-bootstrap-table2` so that you are suppose to install `react-bootstrap-table2-paginator` additionaly.
|
`pagination` allow user to render a pagination panel on the bottom of table. But pagination functionality is separated from core of `react-bootstrap-table2` so that you are suppose to install `react-bootstrap-table2-paginator` additionally.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
$ npm install react-bootstrap-table2-paginator --save
|
$ npm install react-bootstrap-table2-paginator --save
|
||||||
@@ -188,6 +215,7 @@ paginator({
|
|||||||
totalSize, // Total data size. It's necessary when remote is enabled
|
totalSize, // Total data size. It's necessary when remote is enabled
|
||||||
pageStartIndex: 0, // first page will be 0, default is 1
|
pageStartIndex: 0, // first page will be 0, default is 1
|
||||||
paginationSize: 3, // the pagination bar size, default is 5
|
paginationSize: 3, // the pagination bar size, default is 5
|
||||||
|
showTotal: true, // display pagination information
|
||||||
sizePerPageList: [ {
|
sizePerPageList: [ {
|
||||||
text: '5', value: 5
|
text: '5', value: 5
|
||||||
}, {
|
}, {
|
||||||
@@ -205,15 +233,16 @@ paginator({
|
|||||||
prePageTitle: 'Go to previous', // the title of previous page button
|
prePageTitle: 'Go to previous', // the title of previous page button
|
||||||
firstPageTitle: 'Go to first', // the title of first page button
|
firstPageTitle: 'Go to first', // the title of first page button
|
||||||
lastPageTitle: 'Go to last', // the title of last page button
|
lastPageTitle: 'Go to last', // the title of last page button
|
||||||
hideSizePerPage: true, // hide the size per page dorpdown
|
hideSizePerPage: true, // hide the size per page dropdown
|
||||||
hidePageListOnlyOnePage: true, // hide pagination bar when only one page, default is false
|
hidePageListOnlyOnePage: true, // hide pagination bar when only one page, default is false
|
||||||
onPageChange: (page, sizePerPage) => {}, // callback function when page was changing
|
onPageChange: (page, sizePerPage) => {}, // callback function when page was changing
|
||||||
onSizePerPageChange: (sizePerPage, page) => {}, // callback function when page size was changing
|
onSizePerPageChange: (sizePerPage, page) => {}, // callback function when page size was changing
|
||||||
|
paginationTotalRenderer: (from, to, size) => { ... } // custom the pagination total
|
||||||
})
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
### <a name='filter'>filter - [Object]</a>
|
### <a name='filter'>filter - [Object]</a>
|
||||||
`filter` allow user to filter data by column. However, filter funcitonality is separated from core of `react-bootstrap-table2` so that you are suppose to install `react-bootstrap-table2-filter` firstly.
|
`filter` allow user to filter data by column. However, filter functionality is separated from core of `react-bootstrap-table2` so that you are suppose to install `react-bootstrap-table2-filter` firstly.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
$ npm install react-bootstrap-table2-filter --save
|
$ npm install react-bootstrap-table2-filter --save
|
||||||
|
|||||||
151
docs/columns.md
151
docs/columns.md
@@ -12,6 +12,7 @@ Available properties in a column object:
|
|||||||
* [formatExtraData](#formatExtraData)
|
* [formatExtraData](#formatExtraData)
|
||||||
* [sort](#sort)
|
* [sort](#sort)
|
||||||
* [sortFunc](#sortFunc)
|
* [sortFunc](#sortFunc)
|
||||||
|
* [onSort](#onSort)
|
||||||
* [classes](#classes)
|
* [classes](#classes)
|
||||||
* [style](#style)
|
* [style](#style)
|
||||||
* [title](#title)
|
* [title](#title)
|
||||||
@@ -31,8 +32,16 @@ Available properties in a column object:
|
|||||||
* [validator](#validator)
|
* [validator](#validator)
|
||||||
* [editCellStyle](#editCellStyle)
|
* [editCellStyle](#editCellStyle)
|
||||||
* [editCellClasses](#editCellClasses)
|
* [editCellClasses](#editCellClasses)
|
||||||
|
* [editorStyle](#editorStyle)
|
||||||
|
* [editorClasses](#editorClasses)
|
||||||
|
* [editor](#editor)
|
||||||
|
* [editorRenderer](#editorRenderer)
|
||||||
* [filter](#filter)
|
* [filter](#filter)
|
||||||
* [filterValue](#filterValue)
|
* [filterValue](#filterValue)
|
||||||
|
* [csvType](#csvType)
|
||||||
|
* [csvFormatter](#csvFormatter)
|
||||||
|
* [csvText](#csvText)
|
||||||
|
* [csvExport](#csvExport)
|
||||||
|
|
||||||
Following is a most simplest and basic usage:
|
Following is a most simplest and basic usage:
|
||||||
|
|
||||||
@@ -86,6 +95,10 @@ dataField: 'address.city'
|
|||||||
* `rowIndex`
|
* `rowIndex`
|
||||||
* [`formatExtraData`](#formatExtraData)
|
* [`formatExtraData`](#formatExtraData)
|
||||||
|
|
||||||
|
> Attention:
|
||||||
|
> Don't use any state data or any external data in formatter function, please pass them via [`formatExtraData`](#formatExtraData).
|
||||||
|
> In addition, please make formatter function as pure function as possible as you can.
|
||||||
|
|
||||||
## <a name='headerFormatter'>column.headerFormatter - [Function]</a>
|
## <a name='headerFormatter'>column.headerFormatter - [Function]</a>
|
||||||
`headerFormatter` allow you to customize the header column and only accept a callback function which take three arguments and a JSX/String are expected for return.
|
`headerFormatter` allow you to customize the header column and only accept a callback function which take three arguments and a JSX/String are expected for return.
|
||||||
|
|
||||||
@@ -122,8 +135,21 @@ Enable the column sort via a `true` value given.
|
|||||||
```
|
```
|
||||||
> The possible value of `order` argument is **`asc`** and **`desc`**.
|
> The possible value of `order` argument is **`asc`** and **`desc`**.
|
||||||
|
|
||||||
|
## <a name='sortFunc'>column.onSort - [Function]</a>
|
||||||
|
`column.onSort` is an event listener for sort change event:
|
||||||
|
|
||||||
|
```js
|
||||||
|
{
|
||||||
|
// omit...
|
||||||
|
sort: true,
|
||||||
|
onSort: (field, order) => {
|
||||||
|
// ....
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## <a name='classes'>column.classes - [String | Function]</a>
|
## <a name='classes'>column.classes - [String | Function]</a>
|
||||||
It's availabe to have custom class on table column:
|
It's available to have custom class on table column:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
{
|
{
|
||||||
@@ -151,7 +177,7 @@ In addition, `classes` also accept a callback function which have more power to
|
|||||||
A new `String` will be the result as element class.
|
A new `String` will be the result as element class.
|
||||||
|
|
||||||
## <a name='headerClasses'>column.headerClasses - [String | Function]</a>
|
## <a name='headerClasses'>column.headerClasses - [String | Function]</a>
|
||||||
It's similar to [`column.classes`](#classes), `headerClasses` is availabe to have customized class on table header column:
|
It's similar to [`column.classes`](#classes), `headerClasses` is available to have customized class on table header column:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
{
|
{
|
||||||
@@ -176,7 +202,7 @@ Furthermore, it also accept a callback function which takes 2 arguments and a `S
|
|||||||
A new `String` will be the result of element headerClasses.
|
A new `String` will be the result of element headerClasses.
|
||||||
|
|
||||||
## <a name='style'>column.style - [Object | Function]</a>
|
## <a name='style'>column.style - [Object | Function]</a>
|
||||||
It's availabe to have custom style on table column:
|
It's available to have custom style on table column:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
{
|
{
|
||||||
@@ -206,7 +232,7 @@ A new `Object` will be the result of element style.
|
|||||||
|
|
||||||
|
|
||||||
## <a name='headerStyle'>column.headerStyle - [Object | Function]</a>
|
## <a name='headerStyle'>column.headerStyle - [Object | Function]</a>
|
||||||
It's availabe to have customized inline-style on table header column:
|
It's available to have customized inline-style on table header column:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
{
|
{
|
||||||
@@ -264,7 +290,7 @@ A new `String` will be the result of element title.
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
It's also availabe to custom via a callback function:
|
It's also available to custom via a callback function:
|
||||||
```js
|
```js
|
||||||
{
|
{
|
||||||
headerTitle: function callback(column, colIndex) { ... }
|
headerTitle: function callback(column, colIndex) { ... }
|
||||||
@@ -387,7 +413,7 @@ A new `Object` will be the result of element HTML attributes.
|
|||||||
|
|
||||||
> Caution:
|
> Caution:
|
||||||
|
|
||||||
> If `column.classes`, `column.style`, `column.title`, `column.hidden` or `column.align` was given at the same time, property `attrs` has lower priorty and it will be overwrited.
|
> If `column.classes`, `column.style`, `column.title`, `column.hidden` or `column.align` was given at the same time, property `attrs` has lower priority and it will be overwritten.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
{
|
{
|
||||||
@@ -398,7 +424,7 @@ A new `Object` will be the result of element HTML attributes.
|
|||||||
```
|
```
|
||||||
|
|
||||||
## <a name='headerAttrs'>column.headerAttrs - [Object | Function]</a>
|
## <a name='headerAttrs'>column.headerAttrs - [Object | Function]</a>
|
||||||
`headerAttrs` is similiar to [`column.attrs`](#attrs) but it works for header column.
|
`headerAttrs` is similar to [`column.attrs`](#attrs) but it works for header column.
|
||||||
```js
|
```js
|
||||||
{
|
{
|
||||||
// omit...
|
// omit...
|
||||||
@@ -430,7 +456,7 @@ A new `Object` will be the result of element headerAttrs.
|
|||||||
|
|
||||||
> Caution:
|
> Caution:
|
||||||
> Same as [column.attrs](#attrs), it has lower priority and will be
|
> Same as [column.attrs](#attrs), it has lower priority and will be
|
||||||
> overwrited when other props related to HTML attributes were given.
|
> overwritten when other props related to HTML attributes were given.
|
||||||
|
|
||||||
### <a name='headerSortingClasses'>headerSortingClasses - [String | Function]</a>
|
### <a name='headerSortingClasses'>headerSortingClasses - [String | Function]</a>
|
||||||
|
|
||||||
@@ -453,7 +479,7 @@ const headerSortingClasses = (column, sortOrder, isLastSorting, colIndex) => { .
|
|||||||
|
|
||||||
### <a name='headerSortingStyle'>headerSortingStyle - [Object | Function]</a>
|
### <a name='headerSortingStyle'>headerSortingStyle - [Object | Function]</a>
|
||||||
|
|
||||||
It's similiar to [headerSortingClasses](#headerSortingClasses). It allows to customize the style of header cell when this column is sorting. A style `Object` and `callback` are acceptable. `callback` takes **4** arguments and an `Object` is expected to return:
|
It's similar to [headerSortingClasses](#headerSortingClasses). It allows to customize the style of header cell when this column is sorting. A style `Object` and `callback` are acceptable. `callback` takes **4** arguments and an `Object` is expected to return:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
const sortingHeaderStyle = {
|
const sortingHeaderStyle = {
|
||||||
@@ -488,7 +514,7 @@ If a callback function given, you can control the editable level as cell level:
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
The return value can be a bool or an object. If your valiation is pass, return `true` explicitly. If your valiation is invalid, return following object instead:
|
The return value can be a bool or an object. If your validation is pass, return `true` explicitly. If your validation is invalid, return following object instead:
|
||||||
```js
|
```js
|
||||||
{
|
{
|
||||||
valid: false,
|
valid: false,
|
||||||
@@ -538,10 +564,100 @@ Or take a callback function
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## <a name='editorStyle'>column.editorStyle - [Object | Function]</a>
|
||||||
|
This is almost same as [`column.editCellStyle`](#editCellStyle), but `column.editorStyle` is custom the style on editor instead of cell(`td`).
|
||||||
|
|
||||||
|
## <a name='editorClasses'>column.editorClasses - [Object | Function]</a>
|
||||||
|
This is almost same as [`column.editCellClasses`](#editCellClasses), but `column.editorClasses` is custom the class on editor instead of cell(`td`).
|
||||||
|
|
||||||
|
## <a name='editor'>column.editor - [Object]</a>
|
||||||
|
`column.editor` allow you to custom the type of cell editor by following predefined type:
|
||||||
|
|
||||||
|
* Text(Default)
|
||||||
|
* Dropdown
|
||||||
|
* Date
|
||||||
|
* Textarea
|
||||||
|
* Checkbox
|
||||||
|
|
||||||
|
Following is a quite example:
|
||||||
|
|
||||||
|
```js
|
||||||
|
import cellEditFactory, { Type } from 'react-bootstrap-table2-editor';
|
||||||
|
|
||||||
|
const columns = [
|
||||||
|
//...
|
||||||
|
, {
|
||||||
|
dataField: 'done',
|
||||||
|
text: 'Done',
|
||||||
|
editor: {
|
||||||
|
type: Type.CHECKBOX,
|
||||||
|
value: 'Y:N'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
];
|
||||||
|
```
|
||||||
|
|
||||||
|
If you want more information, please check [here](https://github.com/react-bootstrap-table/react-bootstrap-table2/tree/master/packages/react-bootstrap-table2-editor).
|
||||||
|
|
||||||
|
## <a name='editorRenderer'>column.editorRenderer - [Function]</a>
|
||||||
|
If you feel above predefined editors are not satisfied to your requirement, you can totally custom the editor via `column.editorRenderer`:
|
||||||
|
|
||||||
|
```js
|
||||||
|
import cellEditFactory, { Type } from 'react-bootstrap-table2-editor';
|
||||||
|
|
||||||
|
// Custom Editor
|
||||||
|
class QualityRanger extends React.Component {
|
||||||
|
static propTypes = {
|
||||||
|
value: PropTypes.number,
|
||||||
|
onUpdate: PropTypes.func.isRequired
|
||||||
|
}
|
||||||
|
static defaultProps = {
|
||||||
|
value: 0
|
||||||
|
}
|
||||||
|
getValue() {
|
||||||
|
return parseInt(this.range.value, 10);
|
||||||
|
}
|
||||||
|
render() {
|
||||||
|
const { value, onUpdate, ...rest } = this.props;
|
||||||
|
return [
|
||||||
|
<input
|
||||||
|
{ ...rest }
|
||||||
|
key="range"
|
||||||
|
ref={ node => this.range = node }
|
||||||
|
type="range"
|
||||||
|
min="0"
|
||||||
|
max="100"
|
||||||
|
/>,
|
||||||
|
<button
|
||||||
|
key="submit"
|
||||||
|
className="btn btn-default"
|
||||||
|
onClick={ () => onUpdate(this.getValue()) }
|
||||||
|
>
|
||||||
|
done
|
||||||
|
</button>
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const columns = [
|
||||||
|
//...
|
||||||
|
, {
|
||||||
|
dataField: 'done',
|
||||||
|
text: 'Done',
|
||||||
|
editorRenderer: (editorProps, value, row, column, rowIndex, columnIndex) =>
|
||||||
|
<QualityRanger { ...editorProps } value={ value } />;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
```
|
||||||
|
|
||||||
## <a name='filter'>column.filter - [Object]</a>
|
## <a name='filter'>column.filter - [Object]</a>
|
||||||
Configure `column.filter` will able to setup a column level filter on the header column. Currently, `react-bootstrap-table2` support following filters:
|
Configure `column.filter` will able to setup a column level filter on the header column. Currently, `react-bootstrap-table2` support following filters:
|
||||||
|
|
||||||
* Text(`textFilter`)
|
* Text(`textFilter`)
|
||||||
|
* Select(`selectFilter`)
|
||||||
|
* Number(`numberFilter`)
|
||||||
|
* Date(`dateFilter`)
|
||||||
|
|
||||||
We have a quick example to show you how to use `column.filter`:
|
We have a quick example to show you how to use `column.filter`:
|
||||||
|
|
||||||
@@ -559,7 +675,7 @@ import { textFilter } from 'react-bootstrap-table2-filter';
|
|||||||
For some reason of simple customization, `react-bootstrap-table2` allow you to pass some props to filter factory function. Please check [here](https://github.com/react-bootstrap-table/react-bootstrap-table2/tree/master/packages/react-bootstrap-table2-filter/README.md) for more detail tutorial.
|
For some reason of simple customization, `react-bootstrap-table2` allow you to pass some props to filter factory function. Please check [here](https://github.com/react-bootstrap-table/react-bootstrap-table2/tree/master/packages/react-bootstrap-table2-filter/README.md) for more detail tutorial.
|
||||||
|
|
||||||
## <a name='filterValue'>column.filterValue - [Function]</a>
|
## <a name='filterValue'>column.filterValue - [Function]</a>
|
||||||
Sometimes, if the cell/column value that you don't want to filter on them, you can define `filterValue` to return a actual value you wanna be filterd:
|
Sometimes, if the cell/column value that you don't want to filter on them, you can define `filterValue` to return a actual value you wanna be filtered:
|
||||||
|
|
||||||
**Parameters**
|
**Parameters**
|
||||||
* `cell`: The value of current cell.
|
* `cell`: The value of current cell.
|
||||||
@@ -578,3 +694,16 @@ A final `String` value you want to be filtered.
|
|||||||
filterValue: (cell, row) => owners[cell]
|
filterValue: (cell, row) => owners[cell]
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## <a name='csvType'>column.csvType - [Object]</a>
|
||||||
|
Default is `String`. Currently, the available value is `String` and `Number`. If `Number` assigned, the cell value will not wrapped with double quote.
|
||||||
|
|
||||||
|
## <a name='csvFormatter'>column.csvFormatter - [Function]</a>
|
||||||
|
|
||||||
|
This is same as [`column.formatter`](#formatter). But `csvFormatter` only for CSV export and called when export CSV.
|
||||||
|
|
||||||
|
## <a name='csvText'>column.csvText - [String]</a>
|
||||||
|
Custom the CSV header cell, Default is [`column.text`](#text).
|
||||||
|
|
||||||
|
## <a name='csvExport'>column.csvExport - [Bool]</a>
|
||||||
|
Default is `true`, `false` will hide this column when export CSV.
|
||||||
|
|||||||
148
docs/migration.md
Normal file
148
docs/migration.md
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
# Migration Guide
|
||||||
|
|
||||||
|
* Please see the [CHANGELOG](https://react-bootstrap-table.github.io/react-bootstrap-table2/blog/2018/01/24/new-version-0.1.0.html) for `react-bootstrap-table2` first drop.
|
||||||
|
* Please see the [Road Map](https://react-bootstrap-table.github.io/react-bootstrap-table2/blog/2018/01/24/release-plan.html) for `react-bootstrap-table2` in 2018/Q1.
|
||||||
|
* Feel free to see the [official docs](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/about.html), we list all the basic usage here!!
|
||||||
|
|
||||||
|
## Preface
|
||||||
|
|
||||||
|
Currently, **I still can't implement all the mainly features in legacy `react-bootstrap-table`**, so please watch our github repo or [blog](https://react-bootstrap-table.github.io/react-bootstrap-table2/blog/) to make sure the legacy features you wanted are already implemented on `react-bootstrap-table2`. Anyway, ask me by open issue is ok.
|
||||||
|
|
||||||
|
-----
|
||||||
|
|
||||||
|
`react-bootstrap-table2` separate some functionalities from core modules to other modules like following:
|
||||||
|
|
||||||
|
* [`react-bootstrap-table-next`](https://www.npmjs.com/package/react-bootstrap-table-next)
|
||||||
|
* Core table module, include sorting and row selection
|
||||||
|
* [`react-bootstrap-table2-filter`](https://www.npmjs.com/package/react-bootstrap-table2-filter)
|
||||||
|
* Column filter Addons
|
||||||
|
* [`react-bootstrap-table2-editor`](https://www.npmjs.com/package/react-bootstrap-table2-editor)
|
||||||
|
* Cell Editing Addons
|
||||||
|
* [`react-bootstrap-table2-paginator`](https://www.npmjs.com/package/react-bootstrap-table2-paginator)
|
||||||
|
* Pagination Addons
|
||||||
|
* [`react-bootstrap-table2-overlay`](https://www.npmjs.com/package/react-bootstrap-table2-overlay)
|
||||||
|
* Overlay/Loading Addons
|
||||||
|
* [`react-bootstrap-table2-toolkit`](https://www.npmjs.com/package/react-bootstrap-table2-toolkit)
|
||||||
|
* Table Toolkits, like search, csv etc.
|
||||||
|
|
||||||
|
This can help your application with less bundled size and also help `react-bootstrap-table2` have clean design to avoid handling to much logic in kernel module(SRP). Hence, which means you probably need to install above addons when you need specific features.
|
||||||
|
|
||||||
|
## Core Table Migration
|
||||||
|
|
||||||
|
There is a big change is that there's no `TableHeaderColumn` in the `react-bootstrap-table2`, instead you are supposed to be define the `columns` prop on `BootstrapTable`:
|
||||||
|
|
||||||
|
```js
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price'
|
||||||
|
}];
|
||||||
|
|
||||||
|
<BootstrapTable keyField='id' data={ products } columns={ columns } />
|
||||||
|
```
|
||||||
|
|
||||||
|
The `text` property is just same as the children for the `TableHeaderColumn`, if you want to custom the header, there's a new property is: [`headerFormatter`](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/column-props.html#columnheaderformatter-function).
|
||||||
|
|
||||||
|
* [`BootstrapTable` Definition](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/table-props.html)
|
||||||
|
* [Column Definition](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/column-props.html)
|
||||||
|
|
||||||
|
## Table Sort
|
||||||
|
|
||||||
|
Please see [Work with table sort](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/basic-sort.html).
|
||||||
|
|
||||||
|
- [x] Basic sorting
|
||||||
|
- [x] Custom sort function
|
||||||
|
- [x] Default Sort
|
||||||
|
- [x] Remote mode
|
||||||
|
- [x] Custom the sorting header
|
||||||
|
- [x] Sort event listener
|
||||||
|
- [ ] Custom the sort caret
|
||||||
|
- [ ] Sort management
|
||||||
|
- [ ] Multi sort
|
||||||
|
|
||||||
|
Due to no `TableHeaderColumn` so that no `dataSort` here, please add [`sort`](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/column-props.html#columnsort-bool) property on column definition.
|
||||||
|
|
||||||
|
## Row Selection
|
||||||
|
|
||||||
|
Please see [Work with selection](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/basic-row-select.html).
|
||||||
|
Please see [available selectRow configurations](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/row-select-props.html).
|
||||||
|
|
||||||
|
No huge change for row selection.
|
||||||
|
|
||||||
|
## Column Filter
|
||||||
|
|
||||||
|
Please see [Work with column filter](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/basic-filter.html).
|
||||||
|
Please see [available filter configuration](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/filter-props.html).
|
||||||
|
|
||||||
|
- [x] Text Filter
|
||||||
|
- [x] Custom Text Filter
|
||||||
|
- [x] Remote Filter
|
||||||
|
- [x] Custom Filter Component
|
||||||
|
- [ ] Regex Filter
|
||||||
|
- [x] Select Filter
|
||||||
|
- [x] Custom Select Filter
|
||||||
|
- [X] Number Filter
|
||||||
|
- [X] Date Filter
|
||||||
|
- [X] Array Filter
|
||||||
|
- [X] Programmatically Filter
|
||||||
|
|
||||||
|
Remember to install [`react-bootstrap-table2-filter`](https://www.npmjs.com/package/react-bootstrap-table2-filter) firstly.
|
||||||
|
|
||||||
|
Due to no `TableHeaderColumn` so that no `filter` here, please add [`filter`](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/column-props.html#columnfilter-object) property on column definition and [`filter`](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/table-props.html#filter-object) prop on `BootstrapTable`.
|
||||||
|
|
||||||
|
## Cell Edit
|
||||||
|
|
||||||
|
Please see [Work with cell edit](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/basic-celledit.html).
|
||||||
|
Please see [available cell edit configurations](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/cell-edit-props.html).
|
||||||
|
|
||||||
|
Remember to install [`react-bootstrap-table2-editor`](https://www.npmjs.com/package/react-bootstrap-table2-editor) firstly.
|
||||||
|
|
||||||
|
No big changes for cell editing, [`validator`](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/column-props.html#columnvalidator-function) will not support the async call(Promise).
|
||||||
|
|
||||||
|
## Pagination
|
||||||
|
|
||||||
|
Please see [Work with pagination](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/basic-pagination.html).
|
||||||
|
Please see [available pagination configurations](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/pagination-props.html).
|
||||||
|
|
||||||
|
Remember to install [`react-bootstrap-table2-paginator`](https://www.npmjs.com/package/react-bootstrap-table2-paginator) firstly.
|
||||||
|
|
||||||
|
No big changes for pagination, but still can't custom the pagination list, button and sizePerPage dropdown.
|
||||||
|
|
||||||
|
## Table Search
|
||||||
|
The usage of search functionality is a little bit different from legacy search. The mainly different thing is developer have to render the search input field, we do believe it will be very flexible for all the developers who want to custom the search position or search field itself.
|
||||||
|
|
||||||
|
- [x] Custom search component and position
|
||||||
|
- [x] Custom search value
|
||||||
|
- [ ] Clear search
|
||||||
|
- [ ] Multiple search
|
||||||
|
- [ ] Strict search
|
||||||
|
|
||||||
|
## Row Expand
|
||||||
|
- [x] Expand Row Events
|
||||||
|
- [x] Expand Row Indicator
|
||||||
|
- [x] Expand Row Management
|
||||||
|
- [x] Custom Expand Row Indicators
|
||||||
|
- [ ] Compatiable with Row Selection
|
||||||
|
- [ ] Expand Column position
|
||||||
|
- [ ] Expand Column Style/Class
|
||||||
|
|
||||||
|
## Export CSV
|
||||||
|
Export CSV functionality is like search, which is one of functionality in the `react-bootstrap-table2-toolkit`. All of the legacy functions we already implemented.
|
||||||
|
|
||||||
|
## Remote
|
||||||
|
|
||||||
|
> It's totally different in `react-bootstrap-table2`. Please [see](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/basic-remote.html).
|
||||||
|
|
||||||
|
|
||||||
|
## Row insert/Delete
|
||||||
|
Not support yet
|
||||||
|
|
||||||
|
## Keyboard Navigation
|
||||||
|
Not support yet
|
||||||
129
docs/row-expand.md
Normal file
129
docs/row-expand.md
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
|
||||||
|
# Row expand
|
||||||
|
`react-bootstrap-table2` supports the row expand feature. By passing prop `expandRow` to enable this functionality.
|
||||||
|
|
||||||
|
> Default is click to expand/collapse a row. In addition, we don't support any way to chagne this mechanism!
|
||||||
|
|
||||||
|
## Required
|
||||||
|
* [renderer (**required**)](#renderer)
|
||||||
|
|
||||||
|
## Optional
|
||||||
|
* [expanded](#expanded)
|
||||||
|
* [nonExpandable](#nonExpandable)
|
||||||
|
* [onExpand](#onExpand)
|
||||||
|
* [onExpandAll](#onExpandAll)
|
||||||
|
* [showExpandColumn](#showExpandColumn)
|
||||||
|
* [expandColumnRenderer](#expandColumnRenderer)
|
||||||
|
* [expandHeaderColumnRenderer](#expandHeaderColumnRenderer)
|
||||||
|
|
||||||
|
### <a name="renderer">expandRow.renderer - [Function]</a>
|
||||||
|
|
||||||
|
Specify the content of expand row, `react-bootstrap-table2` will pass a row object as argument and expect return a react element.
|
||||||
|
|
||||||
|
#### values
|
||||||
|
* **row**
|
||||||
|
|
||||||
|
#### examples
|
||||||
|
|
||||||
|
```js
|
||||||
|
const expandRow = {
|
||||||
|
renderer: row => (
|
||||||
|
<div>
|
||||||
|
<p>{ `This Expand row is belong to rowKey ${row.id}` }</p>
|
||||||
|
<p>You can render anything here, also you can add additional data on every row object</p>
|
||||||
|
<p>expandRow.renderer callback will pass the origin row object to you</p>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
<BootstrapTable
|
||||||
|
keyField='id'
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
expandRow={ expandRow }
|
||||||
|
/>
|
||||||
|
```
|
||||||
|
|
||||||
|
### <a name='expanded'>expandRow.expanded - [Array]</a>
|
||||||
|
`expandRow.expanded` allow you have default row expandations on table.
|
||||||
|
|
||||||
|
```js
|
||||||
|
const expandRow = {
|
||||||
|
renderer: (row) => ...
|
||||||
|
expanded: [1, 3] // should be a row keys array
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
### <a name='nonExpandable'>expandRow.nonExpandable - [Array]</a>
|
||||||
|
This prop allow you to restrict some rows which can not be expanded by user. `expandRow.nonExpandable` accept an rowkeys array.
|
||||||
|
|
||||||
|
```js
|
||||||
|
const expandRow = {
|
||||||
|
renderer: (row) => ...
|
||||||
|
nonExpandable: [1, 3 ,5]
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
### <a name='onExpand'>expandRow.onExpand - [Function]</a>
|
||||||
|
This callback function will be called when a row is expand/collapse and pass following four arguments:
|
||||||
|
`row`, `isExpand`, `rowIndex` and `e`.
|
||||||
|
|
||||||
|
```js
|
||||||
|
const expandRow = {
|
||||||
|
renderer: (row) => ...
|
||||||
|
onExpand: (row, isExpand, rowIndex, e) => {
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
### <a name='onExpandAll'>expandRow.onExpandAll - [Function]</a>
|
||||||
|
This callback function will be called when expand/collapse all. It only work when you configure [`expandRow.showExpandColumn`](#showExpandColumn) as `true`.
|
||||||
|
|
||||||
|
```js
|
||||||
|
const expandRow = {
|
||||||
|
renderer: (row) => ...
|
||||||
|
onExpandAll: (isExpandAll, results, e) => {
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
### <a name='expandColumnRenderer'>expandRow.expandColumnRenderer - [Function]</a>
|
||||||
|
Provide a callback function which allow you to custom the expand indicator. This callback only have one argument which is an object and contain one property `expanded` which indicate if current row is expanded
|
||||||
|
|
||||||
|
|
||||||
|
```js
|
||||||
|
const expandRow = {
|
||||||
|
renderer: (row) => ...
|
||||||
|
expandColumnRenderer: ({ expanded }) => (
|
||||||
|
// ....
|
||||||
|
)
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
> By default, `react-bootstrap-table2` will help you to handle the click event, it's not necessary to handle again by developer.
|
||||||
|
|
||||||
|
### <a name='expandHeaderColumnRenderer'>expandRow.expandHeaderColumnRenderer - [Function]</a>
|
||||||
|
Provide a callback function which allow you to custom the expand indicator in the expand header column. This callback only have one argument which is an object and contain one property `isAnyExpands` which indicate if there's any rows are expanded:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const expandRow = {
|
||||||
|
renderer: (row) => ...
|
||||||
|
expandHeaderColumnRenderer: ({ isAnyExpands }) => (
|
||||||
|
// ....
|
||||||
|
)
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
> By default, `react-bootstrap-table2` will help you to handle the click event, it's not necessary to handle again by developer.
|
||||||
|
|
||||||
|
### <a name='showExpandColumn'>expandRow.showExpandColumn - [Bool]</a>
|
||||||
|
Default is `false`, if you want to have a expand indicator, give this prop as `true`
|
||||||
|
|
||||||
|
```js
|
||||||
|
const expandRow = {
|
||||||
|
renderer: (row) => ...
|
||||||
|
showExpandColumn: true
|
||||||
|
};
|
||||||
|
```
|
||||||
@@ -6,6 +6,7 @@
|
|||||||
* [mode (**required**)](#mode)
|
* [mode (**required**)](#mode)
|
||||||
|
|
||||||
## Optional
|
## Optional
|
||||||
|
* [selected](#selected)
|
||||||
* [style](#style)
|
* [style](#style)
|
||||||
* [classes)](#classes)
|
* [classes)](#classes)
|
||||||
* [bgColor](#bgColor)
|
* [bgColor](#bgColor)
|
||||||
@@ -15,6 +16,8 @@
|
|||||||
* [onSelect](#onSelect)
|
* [onSelect](#onSelect)
|
||||||
* [onSelectAll](#onSelectAll)
|
* [onSelectAll](#onSelectAll)
|
||||||
* [hideSelectColumn](#hideSelectColumn)
|
* [hideSelectColumn](#hideSelectColumn)
|
||||||
|
* [selectionRenderer](#selectionRenderer)
|
||||||
|
* [selectionHeaderRenderer](#selectionHeaderRenderer)
|
||||||
|
|
||||||
### <a name="mode">selectRow.mode - [String]</a>
|
### <a name="mode">selectRow.mode - [String]</a>
|
||||||
|
|
||||||
@@ -52,6 +55,16 @@ const selectRow = {
|
|||||||
/>
|
/>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### <a name='selected'>selectRow.selected - [Array]</a>
|
||||||
|
`selectRow.selected` allow you have default selections on table.
|
||||||
|
|
||||||
|
```js
|
||||||
|
const selectRow = {
|
||||||
|
mode: 'checkbox',
|
||||||
|
selected: [1, 3] // should be a row keys array
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
### <a name='style'>selectRow.style - [Object | Function]</a>
|
### <a name='style'>selectRow.style - [Object | Function]</a>
|
||||||
`selectRow.style` allow you to have custom style on selected rows:
|
`selectRow.style` allow you to have custom style on selected rows:
|
||||||
|
|
||||||
@@ -91,7 +104,7 @@ const selectRow = {
|
|||||||
```
|
```
|
||||||
|
|
||||||
### <a name='bgColor'>selectRow.bgColor - [String | Function]</a>
|
### <a name='bgColor'>selectRow.bgColor - [String | Function]</a>
|
||||||
The backgroud color when row is selected
|
The background color when row is selected
|
||||||
|
|
||||||
```js
|
```js
|
||||||
const selectRow = {
|
const selectRow = {
|
||||||
@@ -145,14 +158,42 @@ const selectRow = {
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
### <a name='onSelect'>selectRow.onSelect - [Function]</a>
|
### <a name='selectionRenderer'>selectRow.selectionRenderer - [Function]</a>
|
||||||
This callback function will be called when a row is select/unselect and pass following three arguments:
|
Provide a callback function which allow you to custom the checkbox/radio box. This callback only have one argument which is an object and contain following properties:
|
||||||
`row`, `isSelect` and `rowIndex`.
|
|
||||||
|
|
||||||
```js
|
```js
|
||||||
const selectRow = {
|
const selectRow = {
|
||||||
mode: 'checkbox',
|
mode: 'checkbox',
|
||||||
onSelect: (row, isSelect, rowIndex) => {
|
selectionRenderer: ({ mode, checked, disabled }) => (
|
||||||
|
// ....
|
||||||
|
)
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
> By default, `react-bootstrap-table2` will help you to handle the click event, it's not necessary to handle again by developer.
|
||||||
|
|
||||||
|
### <a name='selectionHeaderRenderer'>selectRow.selectionHeaderRenderer - [Function]</a>
|
||||||
|
Provide a callback function which allow you to custom the checkbox/radio box in the selection header column. This callback only have one argument which is an object and contain following properties:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const selectRow = {
|
||||||
|
mode: 'checkbox',
|
||||||
|
selectionHeaderRenderer: ({ mode, checked, indeterminate }) => (
|
||||||
|
// ....
|
||||||
|
)
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
> By default, `react-bootstrap-table2` will help you to handle the click event, it's not necessary to handle again by developer.
|
||||||
|
|
||||||
|
### <a name='onSelect'>selectRow.onSelect - [Function]</a>
|
||||||
|
This callback function will be called when a row is select/unselect and pass following three arguments:
|
||||||
|
`row`, `isSelect`, `rowIndex` and `e`.
|
||||||
|
|
||||||
|
```js
|
||||||
|
const selectRow = {
|
||||||
|
mode: 'checkbox',
|
||||||
|
onSelect: (row, isSelect, rowIndex, e) => {
|
||||||
// ...
|
// ...
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -164,7 +205,7 @@ This callback function will be called when select/unselect all and it only work
|
|||||||
```js
|
```js
|
||||||
const selectRow = {
|
const selectRow = {
|
||||||
mode: 'checkbox',
|
mode: 'checkbox',
|
||||||
onSelectAll: (isSelect, results) => {
|
onSelectAll: (isSelect, results, e) => {
|
||||||
// ...
|
// ...
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -17,14 +17,17 @@ const JS_PKGS = [
|
|||||||
'react-bootstrap-table2-editor',
|
'react-bootstrap-table2-editor',
|
||||||
'react-bootstrap-table2-filter',
|
'react-bootstrap-table2-filter',
|
||||||
'react-bootstrap-table2-overlay',
|
'react-bootstrap-table2-overlay',
|
||||||
'react-bootstrap-table2-paginator'
|
'react-bootstrap-table2-paginator',
|
||||||
|
'react-bootstrap-table2-toolkit'
|
||||||
].reduce((pkg, curr) => `${curr}|${pkg}`, '');
|
].reduce((pkg, curr) => `${curr}|${pkg}`, '');
|
||||||
|
|
||||||
const JS_SKIPS = `+(${TEST}|${LIB}|${DIST}|${NODE_MODULES})`;
|
const JS_SKIPS = `+(${TEST}|${LIB}|${DIST}|${NODE_MODULES})`;
|
||||||
|
|
||||||
const STYLE_PKGS = [
|
const STYLE_PKGS = [
|
||||||
'react-bootstrap-table2',
|
'react-bootstrap-table2',
|
||||||
'react-bootstrap-table2-paginator'
|
'react-bootstrap-table2-filter',
|
||||||
|
'react-bootstrap-table2-paginator',
|
||||||
|
'react-bootstrap-table2-toolkit',
|
||||||
].reduce((pkg, curr) => `${curr}|${pkg}`, '');
|
].reduce((pkg, curr) => `${curr}|${pkg}`, '');
|
||||||
|
|
||||||
const STYLE_SKIPS = `+(${NODE_MODULES})`;
|
const STYLE_SKIPS = `+(${NODE_MODULES})`;
|
||||||
@@ -71,9 +74,16 @@ function styles() {
|
|||||||
.pipe(gulp.dest(PKG_PATH));
|
.pipe(gulp.dest(PKG_PATH));
|
||||||
}
|
}
|
||||||
|
|
||||||
function umd() {
|
function umd(done) {
|
||||||
return gulp.src('./webpack.prod.config.babel.js')
|
gulp.parallel(
|
||||||
.pipe(shell(['webpack --config <%= file.path %>']));
|
() => gulp.src('./webpack/next.umd.babel.js').pipe(shell(['webpack --config <%= file.path %>'])),
|
||||||
|
() => gulp.src('./webpack/editor.umd.babel.js').pipe(shell(['webpack --config <%= file.path %>'])),
|
||||||
|
() => gulp.src('./webpack/filter.umd.babel.js').pipe(shell(['webpack --config <%= file.path %>'])),
|
||||||
|
() => gulp.src('./webpack/overlay.umd.babel.js').pipe(shell(['webpack --config <%= file.path %>'])),
|
||||||
|
() => gulp.src('./webpack/paginator.umd.babel.js').pipe(shell(['webpack --config <%= file.path %>'])),
|
||||||
|
() => gulp.src('./webpack/toolkit.umd.babel.js').pipe(shell(['webpack --config <%= file.path %>']))
|
||||||
|
)();
|
||||||
|
done();
|
||||||
}
|
}
|
||||||
|
|
||||||
const buildJS = gulp.parallel(umd, scripts);
|
const buildJS = gulp.parallel(umd, scripts);
|
||||||
|
|||||||
31
package.json
31
package.json
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "react-bootstrap-table2",
|
"name": "react-bootstrap-table2",
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
|
"private": true,
|
||||||
"description": "Rebuilt for react-bootstrap-table",
|
"description": "Rebuilt for react-bootstrap-table",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -10,21 +11,29 @@
|
|||||||
"pretest": "yarn lint --cache",
|
"pretest": "yarn lint --cache",
|
||||||
"test": "jest",
|
"test": "jest",
|
||||||
"test:coverage": "jest --coverage",
|
"test:coverage": "jest --coverage",
|
||||||
"test:watch": "jest --watch",
|
"test:watch": "jest --coverage --watch",
|
||||||
"storybook": "cd ./packages/react-bootstrap-table2-example && yarn storybook",
|
"storybook": "cd ./packages/react-bootstrap-table2-example && yarn storybook",
|
||||||
"gh-pages:clean": "cd ./packages/react-bootstrap-table2-example && yarn gh-pages:clean",
|
"gh-pages:clean": "cd ./packages/react-bootstrap-table2-example && yarn gh-pages:clean",
|
||||||
"gh-pages:build": "cd ./packages/react-bootstrap-table2-example && yarn gh-pages:build"
|
"gh-pages:build": "cd ./packages/react-bootstrap-table2-example && yarn gh-pages:build",
|
||||||
|
"release": "yarn install && yarn build && lerna publish"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "git+https://github.com/react-bootstrap-table/react-bootstrap-table2.git"
|
"url": "git+https://github.com/react-bootstrap-table/react-bootstrap-table2.git"
|
||||||
},
|
},
|
||||||
"author": "AllenFang",
|
"author": "AllenFang",
|
||||||
"contributors": [{
|
"contributors": [
|
||||||
|
{
|
||||||
|
"name": "Allen Fang",
|
||||||
|
"email": "ayu780129@hotmail.com",
|
||||||
|
"url": "https://github.com/AllenFang"
|
||||||
|
},
|
||||||
|
{
|
||||||
"name": "Chun-MingChen",
|
"name": "Chun-MingChen",
|
||||||
"email": "nick830314@gmail.com",
|
"email": "nick830314@gmail.com",
|
||||||
"url": "https://github.com/Chun-MingChen"
|
"url": "https://github.com/Chun-MingChen"
|
||||||
}],
|
}
|
||||||
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/react-bootstrap-table/react-bootstrap-table2/issues"
|
"url": "https://github.com/react-bootstrap-table/react-bootstrap-table2/issues"
|
||||||
@@ -41,8 +50,8 @@
|
|||||||
"babel-preset-stage-0": "6.24.1",
|
"babel-preset-stage-0": "6.24.1",
|
||||||
"babel-register": "6.24.1",
|
"babel-register": "6.24.1",
|
||||||
"css-loader": "0.28.1",
|
"css-loader": "0.28.1",
|
||||||
"enzyme": "3.1.1",
|
"enzyme": "3.3.0",
|
||||||
"enzyme-adapter-react-16": "1.0.4",
|
"enzyme-adapter-react-16": "1.1.1",
|
||||||
"eslint": "4.5.0",
|
"eslint": "4.5.0",
|
||||||
"eslint-config-airbnb": "15.1.0",
|
"eslint-config-airbnb": "15.1.0",
|
||||||
"eslint-loader": "1.9.0",
|
"eslint-loader": "1.9.0",
|
||||||
@@ -60,7 +69,7 @@
|
|||||||
"jest": "20.0.4",
|
"jest": "20.0.4",
|
||||||
"jsdom": "11.2.0",
|
"jsdom": "11.2.0",
|
||||||
"jsdom-global": "3.0.2",
|
"jsdom-global": "3.0.2",
|
||||||
"lerna": "2.0.0",
|
"lerna": "2.8.0",
|
||||||
"node-sass": "4.5.3",
|
"node-sass": "4.5.3",
|
||||||
"react-test-renderer": "16.0.0",
|
"react-test-renderer": "16.0.0",
|
||||||
"sass-loader": "6.0.6",
|
"sass-loader": "6.0.6",
|
||||||
@@ -72,12 +81,14 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"classnames": "2.2.5",
|
"classnames": "2.2.5",
|
||||||
"prop-types": "15.5.10",
|
"prop-types": "15.5.10",
|
||||||
"react": "16.0.0",
|
"react": "16.3.2",
|
||||||
"react-dom": "16.0.0"
|
"react-dom": "16.3.2",
|
||||||
|
"underscore": "1.9.1"
|
||||||
},
|
},
|
||||||
"jest": {
|
"jest": {
|
||||||
"collectCoverageFrom": [
|
"collectCoverageFrom": [
|
||||||
"packages/**/*.js"
|
"packages/*/src/**/*.js",
|
||||||
|
"packages/*/index.js"
|
||||||
],
|
],
|
||||||
"roots": [
|
"roots": [
|
||||||
"<rootDir>/packages"
|
"<rootDir>/packages"
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
|
|
||||||
**[Live Demo For Cell Edit](https://react-bootstrap-table.github.io/react-bootstrap-table2/storybook/index.html?selectedKind=Cell%20Editing)**
|
**[Live Demo For Cell Edit](https://react-bootstrap-table.github.io/react-bootstrap-table2/storybook/index.html?selectedKind=Cell%20Editing)**
|
||||||
|
|
||||||
|
**[API&Props Definitation](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/cell-edit-props.html)**
|
||||||
|
|
||||||
-----
|
-----
|
||||||
|
|
||||||
## Install
|
## Install
|
||||||
@@ -46,14 +48,182 @@ How user save their new editings? We offer two ways:
|
|||||||
* Column Level (Configure [column.editable](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/column-props.html#columneditable-bool-function) as bool value)
|
* Column Level (Configure [column.editable](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/column-props.html#columneditable-bool-function) as bool value)
|
||||||
* Cell Level (Configure [column.editable](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/column-props.html#columneditable-bool-function) as a callback function)
|
* Cell Level (Configure [column.editable](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/column-props.html#columneditable-bool-function) as a callback function)
|
||||||
|
|
||||||
## Customize Style/Class
|
## Validation
|
||||||
Currently, we only support the editing cell style/class customization, in the future, we will offer more customizations.
|
|
||||||
|
|
||||||
|
[column.validator](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/column-props.html#columnvalidator-function) will help you to work on it!
|
||||||
|
## Customize Style/Class
|
||||||
### Editing Cell
|
### Editing Cell
|
||||||
|
|
||||||
* Customize the editing cell style via [column.editCellStyle](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/column-props.html#columneditcellstyle-object-function)
|
* Customize the editing cell style via [column.editCellStyle](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/column-props.html#columneditcellstyle-object-function)
|
||||||
* Customize the editing cell classname via [column.editCellClasses](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/column-props.html#columneditcellclasses-string-function)
|
* Customize the editing cell classname via [column.editCellClasses](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/column-props.html#columneditcellclasses-string-function)
|
||||||
|
|
||||||
## Validation
|
### Editor
|
||||||
|
* Customize the editor style via [column.editorStyle](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/column-props.html#columneditorstyle-object-function)
|
||||||
|
* Customize the editor classname via [column.editoClasses](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/column-props.html#columneditorclasses-string-function)
|
||||||
|
|
||||||
[`column.validator`](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/column-props.html#columnvalidator-function) will help you to work on it!
|
## Rich Editors
|
||||||
|
`react-bootstrap-table2` have following predefined editor:
|
||||||
|
|
||||||
|
* Text(Default)
|
||||||
|
* Dropdown
|
||||||
|
* Date
|
||||||
|
* Textarea
|
||||||
|
* Checkbox
|
||||||
|
|
||||||
|
In a nutshell, you just only give a [column.editor](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/column-props.html#columneditor-object) and define the `type`:
|
||||||
|
|
||||||
|
```js
|
||||||
|
import { Type } from 'react-bootstrap-table2-editor';
|
||||||
|
const columns = [
|
||||||
|
..., {
|
||||||
|
dataField: 'done',
|
||||||
|
text: 'Done',
|
||||||
|
editor: {
|
||||||
|
type: Type.SELECT | Type.TEXTAREA | Type.CHECKBOX | Type.DATE,
|
||||||
|
... // The rest properties will be rendered into the editor's DOM element
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
In the following, we go though all the predefined editors:
|
||||||
|
|
||||||
|
### Dropdown Editor
|
||||||
|
Dropdown editor give a select menu to choose a data from a list, the `editor.options` is required property for dropdown editor.
|
||||||
|
|
||||||
|
```js
|
||||||
|
import { Type } from 'react-bootstrap-table2-editor';
|
||||||
|
const columns = [
|
||||||
|
..., {
|
||||||
|
dataField: 'type',
|
||||||
|
text: 'Job Type',
|
||||||
|
editor: {
|
||||||
|
type: Type.SELECT,
|
||||||
|
options: [{
|
||||||
|
value: 'A',
|
||||||
|
label: 'A'
|
||||||
|
}, {
|
||||||
|
value: 'B',
|
||||||
|
label: 'B'
|
||||||
|
}, {
|
||||||
|
value: 'C',
|
||||||
|
label: 'C'
|
||||||
|
}, {
|
||||||
|
value: 'D',
|
||||||
|
label: 'D'
|
||||||
|
}, {
|
||||||
|
value: 'E',
|
||||||
|
label: 'E'
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
```
|
||||||
|
|
||||||
|
### Date Editor
|
||||||
|
Date editor is use `<input type="date">`, the configuration is very simple:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const columns = [
|
||||||
|
..., {
|
||||||
|
dataField: 'inStockDate',
|
||||||
|
text: 'Stock Date',
|
||||||
|
formatter: (cell) => {
|
||||||
|
let dateObj = cell;
|
||||||
|
if (typeof cell !== 'object') {
|
||||||
|
dateObj = new Date(cell);
|
||||||
|
}
|
||||||
|
return `${('0' + dateObj.getDate()).slice(-2)}/${('0' + (dateObj.getMonth() + 1)).slice(-2)}/${dateObj.getFullYear()}`;
|
||||||
|
},
|
||||||
|
editor: {
|
||||||
|
type: Type.DATE
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
```
|
||||||
|
|
||||||
|
### Textarea Editor
|
||||||
|
Textarea editor is use `<input type="textarea">`, user can press `ENTER` to change line and in the `react-bootstrap-table2`, user allow to save result via press `SHIFT` + `ENTER`.
|
||||||
|
|
||||||
|
```js
|
||||||
|
const columns = [
|
||||||
|
..., {
|
||||||
|
dataField: 'comment',
|
||||||
|
text: 'Product Comments',
|
||||||
|
editor: {
|
||||||
|
type: Type.TEXTAREA
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
```
|
||||||
|
### Checkbox Editor
|
||||||
|
Checkbox editor allow you to have a pair value choice, the `editor.value` is required value to represent the actual value for check and uncheck.
|
||||||
|
|
||||||
|
```js
|
||||||
|
const columns = [
|
||||||
|
..., {
|
||||||
|
dataField: 'comment',
|
||||||
|
text: 'Product Comments',
|
||||||
|
editor: {
|
||||||
|
type: Type.CHECKBOX,
|
||||||
|
value: 'Y:N'
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
```
|
||||||
|
|
||||||
|
## Customize Editor
|
||||||
|
If you feel above predefined editors are not satisfied to your requirement, you can certainly custom the editor via [column.editorRenderer](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/column-props.html#columneditorrenderer-function). It accept a function and pass following arguments when function called:
|
||||||
|
|
||||||
|
* `editorProps`: Some useful attributes you can use on DOM editor, like class, style etc.
|
||||||
|
* `value`: Current cell value
|
||||||
|
* `row`: Current row data
|
||||||
|
* `column`: Current column definition
|
||||||
|
* `rowIndex`: Current row index
|
||||||
|
* `columnIndex`: Current column index
|
||||||
|
|
||||||
|
> Note when implement a custom React editor component, this component should have a **getValue** function which return current value on editor
|
||||||
|
|
||||||
|
> Note when you want to save value, you can call **editorProps.onUpdate** function
|
||||||
|
|
||||||
|
Following is a short example:
|
||||||
|
|
||||||
|
```js
|
||||||
|
class QualityRanger extends React.Component {
|
||||||
|
static propTypes = {
|
||||||
|
value: PropTypes.number,
|
||||||
|
onUpdate: PropTypes.func.isRequired
|
||||||
|
}
|
||||||
|
static defaultProps = {
|
||||||
|
value: 0
|
||||||
|
}
|
||||||
|
getValue() {
|
||||||
|
return parseInt(this.range.value, 10);
|
||||||
|
}
|
||||||
|
render() {
|
||||||
|
const { value, onUpdate, ...rest } = this.props;
|
||||||
|
return [
|
||||||
|
<input
|
||||||
|
{ ...rest }
|
||||||
|
key="range"
|
||||||
|
ref={ node => this.range = node }
|
||||||
|
type="range"
|
||||||
|
min="0"
|
||||||
|
max="100"
|
||||||
|
/>,
|
||||||
|
<button
|
||||||
|
key="submit"
|
||||||
|
className="btn btn-default"
|
||||||
|
onClick={ () => onUpdate(this.getValue()) }
|
||||||
|
>
|
||||||
|
done
|
||||||
|
</button>
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const columns = [
|
||||||
|
..., {
|
||||||
|
dataField: 'quality',
|
||||||
|
text: 'Product Quality',
|
||||||
|
editorRenderer: (editorProps, value, row, column, rowIndex, columnIndex) => (
|
||||||
|
<QualityRanger { ...editorProps } value={ value } />
|
||||||
|
)
|
||||||
|
}];
|
||||||
|
```
|
||||||
|
|||||||
@@ -1,16 +1,19 @@
|
|||||||
import wrapperFactory from './src/wrapper';
|
import createContext from './src/context';
|
||||||
import editingCellFactory from './src/editing-cell';
|
import editingCellFactory from './src/editing-cell';
|
||||||
import {
|
import {
|
||||||
|
EDITTYPE,
|
||||||
CLICK_TO_CELL_EDIT,
|
CLICK_TO_CELL_EDIT,
|
||||||
DBCLICK_TO_CELL_EDIT,
|
DBCLICK_TO_CELL_EDIT,
|
||||||
DELAY_FOR_DBCLICK
|
DELAY_FOR_DBCLICK
|
||||||
} from './src/const';
|
} from './src/const';
|
||||||
|
|
||||||
export default (options = {}) => ({
|
export default (options = {}) => ({
|
||||||
wrapperFactory,
|
createContext,
|
||||||
editingCellFactory,
|
editingCellFactory,
|
||||||
CLICK_TO_CELL_EDIT,
|
CLICK_TO_CELL_EDIT,
|
||||||
DBCLICK_TO_CELL_EDIT,
|
DBCLICK_TO_CELL_EDIT,
|
||||||
DELAY_FOR_DBCLICK,
|
DELAY_FOR_DBCLICK,
|
||||||
options
|
options
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export const Type = EDITTYPE;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "react-bootstrap-table2-editor",
|
"name": "react-bootstrap-table2-editor",
|
||||||
"version": "0.0.3",
|
"version": "1.0.0",
|
||||||
"description": "it's the editor addon for react-bootstrap-table2",
|
"description": "it's the editor addon for react-bootstrap-table2",
|
||||||
"main": "./lib/index.js",
|
"main": "./lib/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -28,6 +28,11 @@
|
|||||||
],
|
],
|
||||||
"author": "AllenFang",
|
"author": "AllenFang",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
|
{
|
||||||
|
"name": "Allen Fang",
|
||||||
|
"email": "ayu780129@hotmail.com",
|
||||||
|
"url": "https://github.com/AllenFang"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "Chun-MingChen",
|
"name": "Chun-MingChen",
|
||||||
"email": "nick830314@gmail.com",
|
"email": "nick830314@gmail.com",
|
||||||
@@ -36,7 +41,7 @@
|
|||||||
],
|
],
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"prop-types": "^15.0.0",
|
"prop-types": "^15.0.0",
|
||||||
"react": "^16.0.0",
|
"react": "^16.3.0",
|
||||||
"react-dom": "^16.0.0"
|
"react-dom": "^16.3.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
61
packages/react-bootstrap-table2-editor/src/checkbox-editor.js
vendored
Normal file
61
packages/react-bootstrap-table2-editor/src/checkbox-editor.js
vendored
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
/* eslint no-return-assign: 0 */
|
||||||
|
import React, { Component } from 'react';
|
||||||
|
import cs from 'classnames';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
|
class CheckBoxEditor extends Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
this.state = {
|
||||||
|
checked: props.defaultValue.toString() === props.value.split(':')[0]
|
||||||
|
};
|
||||||
|
this.handleChange = this.handleChange.bind(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
this.checkbox.focus();
|
||||||
|
}
|
||||||
|
|
||||||
|
getValue() {
|
||||||
|
const [positive, negative] = this.props.value.split(':');
|
||||||
|
return this.checkbox.checked ? positive : negative;
|
||||||
|
}
|
||||||
|
|
||||||
|
handleChange(e) {
|
||||||
|
if (this.props.onChange) this.props.onChange(e);
|
||||||
|
const { target } = e;
|
||||||
|
this.setState(() => ({ checked: target.checked }));
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const { defaultValue, className, ...rest } = this.props;
|
||||||
|
const editorClass = cs('editor edit-chseckbox checkbox', className);
|
||||||
|
return (
|
||||||
|
<input
|
||||||
|
ref={ node => this.checkbox = node }
|
||||||
|
type="checkbox"
|
||||||
|
className={ editorClass }
|
||||||
|
{ ...rest }
|
||||||
|
checked={ this.state.checked }
|
||||||
|
onChange={ this.handleChange }
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CheckBoxEditor.propTypes = {
|
||||||
|
className: PropTypes.oneOfType([
|
||||||
|
PropTypes.string,
|
||||||
|
PropTypes.object
|
||||||
|
]),
|
||||||
|
value: PropTypes.string,
|
||||||
|
defaultValue: PropTypes.any,
|
||||||
|
onChange: PropTypes.func
|
||||||
|
};
|
||||||
|
CheckBoxEditor.defaultProps = {
|
||||||
|
className: '',
|
||||||
|
value: 'on:off',
|
||||||
|
defaultValue: false,
|
||||||
|
onChange: undefined
|
||||||
|
};
|
||||||
|
export default CheckBoxEditor;
|
||||||
@@ -2,3 +2,11 @@ export const TIME_TO_CLOSE_MESSAGE = 3000;
|
|||||||
export const DELAY_FOR_DBCLICK = 200;
|
export const DELAY_FOR_DBCLICK = 200;
|
||||||
export const CLICK_TO_CELL_EDIT = 'click';
|
export const CLICK_TO_CELL_EDIT = 'click';
|
||||||
export const DBCLICK_TO_CELL_EDIT = 'dbclick';
|
export const DBCLICK_TO_CELL_EDIT = 'dbclick';
|
||||||
|
|
||||||
|
export const EDITTYPE = {
|
||||||
|
TEXT: 'text',
|
||||||
|
SELECT: 'select',
|
||||||
|
TEXTAREA: 'textarea',
|
||||||
|
CHECKBOX: 'checkbox',
|
||||||
|
DATE: 'date'
|
||||||
|
};
|
||||||
|
|||||||
@@ -1,16 +1,22 @@
|
|||||||
/* eslint react/prop-types: 0 */
|
/* eslint react/prop-types: 0 */
|
||||||
import React, { Component } from 'react';
|
/* eslint react/require-default-props: 0 */
|
||||||
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
import { CLICK_TO_CELL_EDIT, DBCLICK_TO_CELL_EDIT } from './const';
|
import { CLICK_TO_CELL_EDIT, DBCLICK_TO_CELL_EDIT } from './const';
|
||||||
|
|
||||||
export default (
|
export default (
|
||||||
Base,
|
_,
|
||||||
{ _, remoteResolver }
|
dataOperator,
|
||||||
|
isRemoteCellEdit,
|
||||||
|
handleCellChange
|
||||||
) => {
|
) => {
|
||||||
let EditingCell;
|
let EditingCell;
|
||||||
return class CellEditWrapper extends remoteResolver(Component) {
|
const CellEditContext = React.createContext();
|
||||||
|
|
||||||
|
class CellEditProvider extends React.Component {
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
|
data: PropTypes.array.isRequired,
|
||||||
|
selectRow: PropTypes.object,
|
||||||
options: PropTypes.shape({
|
options: PropTypes.shape({
|
||||||
mode: PropTypes.oneOf([CLICK_TO_CELL_EDIT, DBCLICK_TO_CELL_EDIT]).isRequired,
|
mode: PropTypes.oneOf([CLICK_TO_CELL_EDIT, DBCLICK_TO_CELL_EDIT]).isRequired,
|
||||||
onErrorMessageDisappear: PropTypes.func,
|
onErrorMessageDisappear: PropTypes.func,
|
||||||
@@ -19,7 +25,7 @@ export default (
|
|||||||
afterSaveCell: PropTypes.func,
|
afterSaveCell: PropTypes.func,
|
||||||
nonEditableRows: PropTypes.func,
|
nonEditableRows: PropTypes.func,
|
||||||
timeToCloseMessage: PropTypes.number,
|
timeToCloseMessage: PropTypes.number,
|
||||||
errorMessage: PropTypes.string
|
errorMessage: PropTypes.any
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -33,41 +39,32 @@ export default (
|
|||||||
this.state = {
|
this.state = {
|
||||||
ridx: null,
|
ridx: null,
|
||||||
cidx: null,
|
cidx: null,
|
||||||
message: null,
|
message: null
|
||||||
isDataChanged: false
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillReceiveProps(nextProps) {
|
componentWillReceiveProps(nextProps) {
|
||||||
if (nextProps.cellEdit && this.isRemoteCellEdit()) {
|
if (nextProps.cellEdit && isRemoteCellEdit()) {
|
||||||
if (nextProps.cellEdit.options.errorMessage) {
|
if (nextProps.cellEdit.options.errorMessage) {
|
||||||
this.setState(() => ({
|
this.setState(() => ({
|
||||||
isDataChanged: false,
|
|
||||||
message: nextProps.cellEdit.options.errorMessage
|
message: nextProps.cellEdit.options.errorMessage
|
||||||
}));
|
}));
|
||||||
} else {
|
} else {
|
||||||
this.setState(() => ({
|
|
||||||
isDataChanged: true
|
|
||||||
}));
|
|
||||||
this.escapeEditing();
|
this.escapeEditing();
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
this.setState(() => ({
|
|
||||||
isDataChanged: false
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
handleCellUpdate(row, column, newValue) {
|
handleCellUpdate(row, column, newValue) {
|
||||||
const { keyField, cellEdit, store } = this.props;
|
const { keyField, cellEdit, data } = this.props;
|
||||||
const { beforeSaveCell, afterSaveCell } = cellEdit.options;
|
const { beforeSaveCell, afterSaveCell } = cellEdit.options;
|
||||||
const oldValue = _.get(row, column.dataField);
|
const oldValue = _.get(row, column.dataField);
|
||||||
const rowId = _.get(row, keyField);
|
const rowId = _.get(row, keyField);
|
||||||
if (_.isFunction(beforeSaveCell)) beforeSaveCell(oldValue, newValue, row, column);
|
if (_.isFunction(beforeSaveCell)) beforeSaveCell(oldValue, newValue, row, column);
|
||||||
if (this.isRemoteCellEdit()) {
|
if (isRemoteCellEdit()) {
|
||||||
this.handleCellChange(rowId, column.dataField, newValue);
|
handleCellChange(rowId, column.dataField, newValue);
|
||||||
} else {
|
} else {
|
||||||
store.edit(rowId, column.dataField, newValue);
|
dataOperator.editCell(data, keyField, rowId, column.dataField, newValue);
|
||||||
if (_.isFunction(afterSaveCell)) afterSaveCell(oldValue, newValue, row, column);
|
if (_.isFunction(afterSaveCell)) afterSaveCell(oldValue, newValue, row, column);
|
||||||
this.completeEditing();
|
this.completeEditing();
|
||||||
}
|
}
|
||||||
@@ -77,8 +74,7 @@ export default (
|
|||||||
this.setState(() => ({
|
this.setState(() => ({
|
||||||
ridx: null,
|
ridx: null,
|
||||||
cidx: null,
|
cidx: null,
|
||||||
message: null,
|
message: null
|
||||||
isDataChanged: true
|
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,8 +82,7 @@ export default (
|
|||||||
const editing = () => {
|
const editing = () => {
|
||||||
this.setState(() => ({
|
this.setState(() => ({
|
||||||
ridx,
|
ridx,
|
||||||
cidx,
|
cidx
|
||||||
isDataChanged: false
|
|
||||||
}));
|
}));
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -103,18 +98,19 @@ export default (
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { isDataChanged, ...stateRest } = this.state;
|
|
||||||
const {
|
const {
|
||||||
cellEdit: {
|
cellEdit: {
|
||||||
options: { nonEditableRows, errorMessage, ...optionsRest },
|
options: { nonEditableRows, errorMessage, ...optionsRest },
|
||||||
editingCellFactory,
|
editingCellFactory,
|
||||||
|
createContext,
|
||||||
...cellEditRest
|
...cellEditRest
|
||||||
}
|
}
|
||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
const newCellEdit = {
|
const newCellEdit = {
|
||||||
...optionsRest,
|
...optionsRest,
|
||||||
...cellEditRest,
|
...cellEditRest,
|
||||||
...stateRest,
|
...this.state,
|
||||||
EditingCell,
|
EditingCell,
|
||||||
nonEditableRows: _.isDefined(nonEditableRows) ? nonEditableRows() : [],
|
nonEditableRows: _.isDefined(nonEditableRows) ? nonEditableRows() : [],
|
||||||
onStart: this.startEditing,
|
onStart: this.startEditing,
|
||||||
@@ -123,13 +119,16 @@ export default (
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Base
|
<CellEditContext.Provider
|
||||||
{ ...this.props }
|
value={ { cellEdit: newCellEdit } }
|
||||||
data={ this.props.store.data }
|
>
|
||||||
isDataChanged={ isDataChanged }
|
{ this.props.children }
|
||||||
cellEdit={ newCellEdit }
|
</CellEditContext.Provider>
|
||||||
/>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
Provider: CellEditProvider,
|
||||||
|
Consumer: CellEditContext.Consumer
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
42
packages/react-bootstrap-table2-editor/src/date-editor.js
vendored
Normal file
42
packages/react-bootstrap-table2-editor/src/date-editor.js
vendored
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
/* eslint no-return-assign: 0 */
|
||||||
|
import React, { Component } from 'react';
|
||||||
|
import cs from 'classnames';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
|
class DateEditor extends Component {
|
||||||
|
componentDidMount() {
|
||||||
|
const { defaultValue } = this.props;
|
||||||
|
this.date.valueAsDate = new Date(defaultValue);
|
||||||
|
this.date.focus();
|
||||||
|
}
|
||||||
|
|
||||||
|
getValue() {
|
||||||
|
return this.date.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const { defaultValue, className, ...rest } = this.props;
|
||||||
|
const editorClass = cs('form-control editor edit-date', className);
|
||||||
|
return (
|
||||||
|
<input
|
||||||
|
ref={ node => this.date = node }
|
||||||
|
type="date"
|
||||||
|
className={ editorClass }
|
||||||
|
{ ...rest }
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DateEditor.propTypes = {
|
||||||
|
className: PropTypes.oneOfType([
|
||||||
|
PropTypes.string,
|
||||||
|
PropTypes.object
|
||||||
|
]),
|
||||||
|
defaultValue: PropTypes.string
|
||||||
|
};
|
||||||
|
DateEditor.defaultProps = {
|
||||||
|
className: '',
|
||||||
|
defaultValue: ''
|
||||||
|
};
|
||||||
|
export default DateEditor;
|
||||||
61
packages/react-bootstrap-table2-editor/src/dropdown-editor.js
vendored
Normal file
61
packages/react-bootstrap-table2-editor/src/dropdown-editor.js
vendored
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
/* eslint no-return-assign: 0 */
|
||||||
|
import React, { Component } from 'react';
|
||||||
|
import cs from 'classnames';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
|
class DropDownEditor extends Component {
|
||||||
|
componentDidMount() {
|
||||||
|
const { defaultValue } = this.props;
|
||||||
|
this.select.value = defaultValue;
|
||||||
|
this.select.focus();
|
||||||
|
}
|
||||||
|
|
||||||
|
getValue() {
|
||||||
|
return this.select.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const { defaultValue, className, options, ...rest } = this.props;
|
||||||
|
const editorClass = cs('form-control editor edit-select', className);
|
||||||
|
|
||||||
|
const attr = {
|
||||||
|
...rest,
|
||||||
|
className: editorClass
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<select
|
||||||
|
{ ...attr }
|
||||||
|
ref={ node => this.select = node }
|
||||||
|
defaultValue={ defaultValue }
|
||||||
|
>
|
||||||
|
{
|
||||||
|
options.map(({ label, value }) => (
|
||||||
|
<option key={ value } value={ value }>{ label }</option>
|
||||||
|
))
|
||||||
|
}
|
||||||
|
</select>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DropDownEditor.propTypes = {
|
||||||
|
defaultValue: PropTypes.oneOfType([
|
||||||
|
PropTypes.string,
|
||||||
|
PropTypes.number
|
||||||
|
]),
|
||||||
|
className: PropTypes.string,
|
||||||
|
style: PropTypes.object,
|
||||||
|
options: PropTypes.oneOfType([
|
||||||
|
PropTypes.arrayOf(PropTypes.shape({
|
||||||
|
label: PropTypes.string,
|
||||||
|
value: PropTypes.any
|
||||||
|
}))
|
||||||
|
]).isRequired
|
||||||
|
};
|
||||||
|
DropDownEditor.defaultProps = {
|
||||||
|
className: '',
|
||||||
|
defaultValue: '',
|
||||||
|
style: {}
|
||||||
|
};
|
||||||
|
export default DropDownEditor;
|
||||||
@@ -6,15 +6,21 @@ import React, { Component } from 'react';
|
|||||||
import cs from 'classnames';
|
import cs from 'classnames';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
|
import DropdownEditor from './dropdown-editor';
|
||||||
|
import TextAreaEditor from './textarea-editor';
|
||||||
|
import CheckBoxEditor from './checkbox-editor';
|
||||||
|
import DateEditor from './date-editor';
|
||||||
import TextEditor from './text-editor';
|
import TextEditor from './text-editor';
|
||||||
import EditorIndicator from './editor-indicator';
|
import EditorIndicator from './editor-indicator';
|
||||||
import { TIME_TO_CLOSE_MESSAGE } from './const';
|
import { TIME_TO_CLOSE_MESSAGE, EDITTYPE } from './const';
|
||||||
|
|
||||||
export default _ =>
|
export default _ =>
|
||||||
class EditingCell extends Component {
|
class EditingCell extends Component {
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
row: PropTypes.object.isRequired,
|
row: PropTypes.object.isRequired,
|
||||||
|
rowIndex: PropTypes.number.isRequired,
|
||||||
column: PropTypes.object.isRequired,
|
column: PropTypes.object.isRequired,
|
||||||
|
columnIndex: PropTypes.number.isRequired,
|
||||||
onUpdate: PropTypes.func.isRequired,
|
onUpdate: PropTypes.func.isRequired,
|
||||||
onEscape: PropTypes.func.isRequired,
|
onEscape: PropTypes.func.isRequired,
|
||||||
timeToCloseMessage: PropTypes.number,
|
timeToCloseMessage: PropTypes.number,
|
||||||
@@ -71,8 +77,8 @@ export default _ =>
|
|||||||
}, timeToCloseMessage);
|
}, timeToCloseMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
beforeComplete(row, column, newValue) {
|
beforeComplete(newValue) {
|
||||||
const { onUpdate } = this.props;
|
const { onUpdate, row, column } = this.props;
|
||||||
if (_.isFunction(column.validator)) {
|
if (_.isFunction(column.validator)) {
|
||||||
const validateForm = column.validator(newValue, row, column);
|
const validateForm = column.validator(newValue, row, column);
|
||||||
if (_.isObject(validateForm) && !validateForm.valid) {
|
if (_.isObject(validateForm) && !validateForm.valid) {
|
||||||
@@ -87,28 +93,20 @@ export default _ =>
|
|||||||
}
|
}
|
||||||
|
|
||||||
handleBlur() {
|
handleBlur() {
|
||||||
const { onEscape, blurToSave, row, column } = this.props;
|
const { onEscape, blurToSave } = this.props;
|
||||||
if (blurToSave) {
|
if (blurToSave) {
|
||||||
const value = this.editor.text.value;
|
this.beforeComplete(this.editor.getValue());
|
||||||
if (!_.isDefined(value)) {
|
|
||||||
// TODO: for other custom or embed editor
|
|
||||||
}
|
|
||||||
this.beforeComplete(row, column, value);
|
|
||||||
} else {
|
} else {
|
||||||
onEscape();
|
onEscape();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
handleKeyDown(e) {
|
handleKeyDown(e) {
|
||||||
const { onEscape, row, column } = this.props;
|
const { onEscape } = this.props;
|
||||||
if (e.keyCode === 27) { // ESC
|
if (e.keyCode === 27) { // ESC
|
||||||
onEscape();
|
onEscape();
|
||||||
} else if (e.keyCode === 13) { // ENTER
|
} else if (e.keyCode === 13) { // ENTER
|
||||||
const value = e.currentTarget.value;
|
this.beforeComplete(this.editor.getValue());
|
||||||
if (!_.isDefined(value)) {
|
|
||||||
// TODO: for other custom or embed editor
|
|
||||||
}
|
|
||||||
this.beforeComplete(row, column, value);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,31 +120,73 @@ export default _ =>
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { invalidMessage } = this.state;
|
let editor;
|
||||||
const { row, column, className, style } = this.props;
|
const { row, column, className, style, rowIndex, columnIndex } = this.props;
|
||||||
const { dataField } = column;
|
const { dataField } = column;
|
||||||
|
|
||||||
const value = _.get(row, dataField);
|
const value = _.get(row, dataField);
|
||||||
const editorAttrs = {
|
const hasError = _.isDefined(this.state.invalidMessage);
|
||||||
|
|
||||||
|
let customEditorClass = column.editorClasses || '';
|
||||||
|
if (_.isFunction(column.editorClasses)) {
|
||||||
|
customEditorClass = column.editorClasses(value, row, rowIndex, columnIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
let editorStyle = column.editorStyle || {};
|
||||||
|
if (_.isFunction(column.editorStyle)) {
|
||||||
|
editorStyle = column.editorStyle(value, row, rowIndex, columnIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
const editorClass = cs({
|
||||||
|
animated: hasError,
|
||||||
|
shake: hasError
|
||||||
|
}, customEditorClass);
|
||||||
|
|
||||||
|
let editorProps = {
|
||||||
|
ref: node => this.editor = node,
|
||||||
|
defaultValue: value,
|
||||||
|
style: editorStyle,
|
||||||
|
className: editorClass,
|
||||||
onKeyDown: this.handleKeyDown,
|
onKeyDown: this.handleKeyDown,
|
||||||
onBlur: this.handleBlur
|
onBlur: this.handleBlur
|
||||||
};
|
};
|
||||||
|
|
||||||
const hasError = _.isDefined(invalidMessage);
|
const isDefaultEditorDefined = _.isObject(column.editor);
|
||||||
const editorClass = hasError ? cs('animated', 'shake') : null;
|
|
||||||
|
if (isDefaultEditorDefined) {
|
||||||
|
editorProps = {
|
||||||
|
...editorProps,
|
||||||
|
...column.editor
|
||||||
|
};
|
||||||
|
} else if (_.isFunction(column.editorRenderer)) {
|
||||||
|
editorProps = {
|
||||||
|
...editorProps,
|
||||||
|
onUpdate: this.beforeComplete
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_.isFunction(column.editorRenderer)) {
|
||||||
|
editor = column.editorRenderer(editorProps, value, row, column, rowIndex, columnIndex);
|
||||||
|
} else if (isDefaultEditorDefined && column.editor.type === EDITTYPE.SELECT) {
|
||||||
|
editor = <DropdownEditor { ...editorProps } />;
|
||||||
|
} else if (isDefaultEditorDefined && column.editor.type === EDITTYPE.TEXTAREA) {
|
||||||
|
editor = <TextAreaEditor { ...editorProps } />;
|
||||||
|
} else if (isDefaultEditorDefined && column.editor.type === EDITTYPE.CHECKBOX) {
|
||||||
|
editor = <CheckBoxEditor { ...editorProps } />;
|
||||||
|
} else if (isDefaultEditorDefined && column.editor.type === EDITTYPE.DATE) {
|
||||||
|
editor = <DateEditor { ...editorProps } />;
|
||||||
|
} else {
|
||||||
|
editor = <TextEditor { ...editorProps } />;
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<td
|
<td
|
||||||
className={ cs('react-bootstrap-table-editing-cell', className) }
|
className={ cs('react-bootstrap-table-editing-cell', className) }
|
||||||
style={ style }
|
style={ style }
|
||||||
onClick={ this.handleClick }
|
onClick={ this.handleClick }
|
||||||
>
|
>
|
||||||
<TextEditor
|
{ editor }
|
||||||
ref={ node => this.editor = node }
|
{ hasError ? <EditorIndicator invalidMessage={ this.state.invalidMessage } /> : null }
|
||||||
defaultValue={ value }
|
|
||||||
className={ editorClass }
|
|
||||||
{ ...editorAttrs }
|
|
||||||
/>
|
|
||||||
{ hasError ? <EditorIndicator invalidMessage={ invalidMessage } /> : null }
|
|
||||||
</td>
|
</td>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,10 @@ class TextEditor extends Component {
|
|||||||
this.text.focus();
|
this.text.focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getValue() {
|
||||||
|
return this.text.value;
|
||||||
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { defaultValue, className, ...rest } = this.props;
|
const { defaultValue, className, ...rest } = this.props;
|
||||||
const editorClass = cs('form-control editor edit-text', className);
|
const editorClass = cs('form-control editor edit-text', className);
|
||||||
@@ -32,9 +36,10 @@ TextEditor.propTypes = {
|
|||||||
defaultValue: PropTypes.oneOfType([
|
defaultValue: PropTypes.oneOfType([
|
||||||
PropTypes.string,
|
PropTypes.string,
|
||||||
PropTypes.number
|
PropTypes.number
|
||||||
]).isRequired
|
])
|
||||||
};
|
};
|
||||||
TextEditor.defaultProps = {
|
TextEditor.defaultProps = {
|
||||||
className: null
|
className: null,
|
||||||
|
defaultValue: ''
|
||||||
};
|
};
|
||||||
export default TextEditor;
|
export default TextEditor;
|
||||||
|
|||||||
60
packages/react-bootstrap-table2-editor/src/textarea-editor.js
vendored
Normal file
60
packages/react-bootstrap-table2-editor/src/textarea-editor.js
vendored
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
/* eslint no-return-assign: 0 */
|
||||||
|
import React, { Component } from 'react';
|
||||||
|
import cs from 'classnames';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
|
class TextAreaEditor extends Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
this.handleKeyDown = this.handleKeyDown.bind(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
const { defaultValue } = this.props;
|
||||||
|
this.text.value = defaultValue;
|
||||||
|
this.text.focus();
|
||||||
|
}
|
||||||
|
|
||||||
|
getValue() {
|
||||||
|
return this.text.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
handleKeyDown(e) {
|
||||||
|
if (e.keyCode === 13 && !e.shiftKey) return;
|
||||||
|
if (this.props.onKeyDown) {
|
||||||
|
this.props.onKeyDown(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const { defaultValue, className, ...rest } = this.props;
|
||||||
|
const editorClass = cs('form-control editor edit-textarea', className);
|
||||||
|
return (
|
||||||
|
<textarea
|
||||||
|
ref={ node => this.text = node }
|
||||||
|
type="textarea"
|
||||||
|
className={ editorClass }
|
||||||
|
{ ...rest }
|
||||||
|
onKeyDown={ this.handleKeyDown }
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TextAreaEditor.propTypes = {
|
||||||
|
className: PropTypes.oneOfType([
|
||||||
|
PropTypes.string,
|
||||||
|
PropTypes.object
|
||||||
|
]),
|
||||||
|
defaultValue: PropTypes.oneOfType([
|
||||||
|
PropTypes.string,
|
||||||
|
PropTypes.number
|
||||||
|
]),
|
||||||
|
onKeyDown: PropTypes.func
|
||||||
|
};
|
||||||
|
TextAreaEditor.defaultProps = {
|
||||||
|
className: '',
|
||||||
|
defaultValue: '',
|
||||||
|
onKeyDown: undefined
|
||||||
|
};
|
||||||
|
export default TextAreaEditor;
|
||||||
430
packages/react-bootstrap-table2-editor/test/context.test.js
Normal file
430
packages/react-bootstrap-table2-editor/test/context.test.js
Normal file
@@ -0,0 +1,430 @@
|
|||||||
|
import 'jsdom-global/register';
|
||||||
|
import React from 'react';
|
||||||
|
import { shallow } from 'enzyme';
|
||||||
|
import _ from 'react-bootstrap-table-next/src/utils';
|
||||||
|
import dataOperator from 'react-bootstrap-table-next/src/store/operators';
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next/src/bootstrap-table';
|
||||||
|
|
||||||
|
import {
|
||||||
|
CLICK_TO_CELL_EDIT,
|
||||||
|
DBCLICK_TO_CELL_EDIT,
|
||||||
|
DELAY_FOR_DBCLICK
|
||||||
|
} from '../src/const';
|
||||||
|
import createCellEditContext from '../src/context';
|
||||||
|
import cellEditFactory from '../index';
|
||||||
|
|
||||||
|
describe('CellEditContext', () => {
|
||||||
|
let wrapper;
|
||||||
|
let cellEdit;
|
||||||
|
let CellEditContext;
|
||||||
|
|
||||||
|
const data = [{
|
||||||
|
id: 1,
|
||||||
|
name: 'A'
|
||||||
|
}, {
|
||||||
|
id: 2,
|
||||||
|
name: 'B'
|
||||||
|
}];
|
||||||
|
|
||||||
|
const keyField = 'id';
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Name'
|
||||||
|
}];
|
||||||
|
|
||||||
|
const defaultCellEdit = {
|
||||||
|
mode: CLICK_TO_CELL_EDIT
|
||||||
|
};
|
||||||
|
|
||||||
|
const defaultSelectRow = undefined;
|
||||||
|
|
||||||
|
const mockBase = jest.fn((props => (
|
||||||
|
<BootstrapTable
|
||||||
|
data={ data }
|
||||||
|
columns={ columns }
|
||||||
|
keyField={ keyField }
|
||||||
|
{ ...props }
|
||||||
|
/>
|
||||||
|
)));
|
||||||
|
|
||||||
|
const handleCellChange = jest.fn();
|
||||||
|
|
||||||
|
function shallowContext(
|
||||||
|
customCellEdit = defaultCellEdit,
|
||||||
|
enableRemote = false,
|
||||||
|
selectRow = defaultSelectRow
|
||||||
|
) {
|
||||||
|
mockBase.mockReset();
|
||||||
|
handleCellChange.mockReset();
|
||||||
|
CellEditContext = createCellEditContext(
|
||||||
|
_,
|
||||||
|
dataOperator,
|
||||||
|
jest.fn().mockReturnValue(enableRemote),
|
||||||
|
handleCellChange
|
||||||
|
);
|
||||||
|
cellEdit = cellEditFactory(customCellEdit);
|
||||||
|
return (
|
||||||
|
<CellEditContext.Provider
|
||||||
|
cellEdit={ cellEdit }
|
||||||
|
keyField={ keyField }
|
||||||
|
columns={ columns }
|
||||||
|
selectRow={ selectRow }
|
||||||
|
data={ data }
|
||||||
|
>
|
||||||
|
<CellEditContext.Consumer>
|
||||||
|
{
|
||||||
|
cellEditProps => mockBase(cellEditProps)
|
||||||
|
}
|
||||||
|
</CellEditContext.Consumer>
|
||||||
|
</CellEditContext.Provider>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('default render', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext());
|
||||||
|
wrapper.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have correct Provider property after calling createCellEditContext', () => {
|
||||||
|
expect(CellEditContext.Provider).toBeDefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have correct Consumer property after calling createCellEditContext', () => {
|
||||||
|
expect(CellEditContext.Consumer).toBeDefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have correct state.ridx', () => {
|
||||||
|
expect(wrapper.state().ridx).toBeNull();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have correct state.cidx', () => {
|
||||||
|
expect(wrapper.state().cidx).toBeNull();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have correct state.message', () => {
|
||||||
|
expect(wrapper.state().message).toBeNull();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should pass correct cell editing props to children element', () => {
|
||||||
|
expect(wrapper.length).toBe(1);
|
||||||
|
expect(JSON.stringify(mockBase.mock.calls[0])).toEqual(JSON.stringify([{
|
||||||
|
cellEdit: {
|
||||||
|
...defaultCellEdit,
|
||||||
|
CLICK_TO_CELL_EDIT,
|
||||||
|
DBCLICK_TO_CELL_EDIT,
|
||||||
|
DELAY_FOR_DBCLICK,
|
||||||
|
...wrapper.state(),
|
||||||
|
nonEditableRows: []
|
||||||
|
}
|
||||||
|
}]));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('componentWillReceiveProps', () => {
|
||||||
|
const initialState = { ridx: 1, cidx: 1, message: 'test' };
|
||||||
|
describe('if nextProps.cellEdit is not existing', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext());
|
||||||
|
wrapper.setState(initialState);
|
||||||
|
wrapper.render();
|
||||||
|
wrapper.instance().componentWillReceiveProps({});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not set state.message', () => {
|
||||||
|
expect(wrapper.state().message).toBe(initialState.message);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not set state.ridx', () => {
|
||||||
|
expect(wrapper.state().ridx).toBe(initialState.ridx);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not set state.cidx', () => {
|
||||||
|
expect(wrapper.state().cidx).toBe(initialState.cidx);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('if nextProps.cellEdit is existing but remote cell editing is disable', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext());
|
||||||
|
wrapper.setState(initialState);
|
||||||
|
wrapper.render();
|
||||||
|
wrapper.instance().componentWillReceiveProps({
|
||||||
|
cellEdit: cellEditFactory(defaultCellEdit)
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not set state.message', () => {
|
||||||
|
expect(wrapper.state().message).toBe(initialState.message);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not set state.ridx', () => {
|
||||||
|
expect(wrapper.state().ridx).toBe(initialState.ridx);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not set state.cidx', () => {
|
||||||
|
expect(wrapper.state().cidx).toBe(initialState.cidx);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('if nextProps.cellEdit is existing and remote cell editing is enable', () => {
|
||||||
|
describe('if nextProps.cellEdit.options.errorMessage is defined', () => {
|
||||||
|
let message;
|
||||||
|
beforeEach(() => {
|
||||||
|
message = 'validation fail';
|
||||||
|
wrapper = shallow(shallowContext(defaultCellEdit, true));
|
||||||
|
wrapper.setState(initialState);
|
||||||
|
wrapper.render();
|
||||||
|
wrapper.instance().componentWillReceiveProps({
|
||||||
|
cellEdit: cellEditFactory({
|
||||||
|
...defaultCellEdit,
|
||||||
|
errorMessage: message
|
||||||
|
})
|
||||||
|
});
|
||||||
|
wrapper.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should set state.message', () => {
|
||||||
|
expect(wrapper.state('message')).toBe(message);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not set state.ridx', () => {
|
||||||
|
expect(wrapper.state().ridx).toBe(initialState.ridx);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not set state.cidx', () => {
|
||||||
|
expect(wrapper.state().cidx).toBe(initialState.cidx);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('if nextProps.cellEdit.options.errorMessage is not defined', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext(defaultCellEdit, true));
|
||||||
|
wrapper.setState(initialState);
|
||||||
|
wrapper.instance().componentWillReceiveProps({
|
||||||
|
cellEdit: cellEditFactory({ ...defaultCellEdit })
|
||||||
|
});
|
||||||
|
wrapper.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not set state.message', () => {
|
||||||
|
expect(wrapper.state('message')).toBe(initialState.message);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should set correct state.ridx', () => {
|
||||||
|
expect(wrapper.state().ridx).toBeNull();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should set correct state.cidx', () => {
|
||||||
|
expect(wrapper.state().cidx).toBeNull();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('handleCellUpdate', () => {
|
||||||
|
const row = data[1];
|
||||||
|
const column = columns[1];
|
||||||
|
const newValue = 'This is new value';
|
||||||
|
const oldValue = row[column.dataField];
|
||||||
|
|
||||||
|
describe('if cellEdit.beforeSaveCell prop is defined', () => {
|
||||||
|
const beforeSaveCell = jest.fn();
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
beforeSaveCell.mockReset();
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultCellEdit,
|
||||||
|
beforeSaveCell
|
||||||
|
}));
|
||||||
|
wrapper.instance().handleCellUpdate(
|
||||||
|
row,
|
||||||
|
column,
|
||||||
|
newValue
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should call cellEdit.beforeSaveCell correctly', () => {
|
||||||
|
expect(beforeSaveCell).toHaveBeenCalledTimes(1);
|
||||||
|
expect(beforeSaveCell).toHaveBeenCalledWith(oldValue, newValue, row, column);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when remote cell editing is enable', () => {
|
||||||
|
const afterSaveCell = jest.fn();
|
||||||
|
beforeEach(() => {
|
||||||
|
afterSaveCell.mockReset();
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultCellEdit,
|
||||||
|
afterSaveCell
|
||||||
|
}, true));
|
||||||
|
wrapper.instance().handleCellUpdate(
|
||||||
|
row,
|
||||||
|
column,
|
||||||
|
newValue
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should call handleCellChange correctly', () => {
|
||||||
|
expect(handleCellChange).toHaveBeenCalledTimes(1);
|
||||||
|
expect(handleCellChange).toHaveBeenCalledWith(row[keyField], column.dataField, newValue);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not call cellEdit.afterSaveCell even if it is defined', () => {
|
||||||
|
expect(afterSaveCell).toHaveBeenCalledTimes(0);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when remote cell editing is disable', () => {
|
||||||
|
const afterSaveCell = jest.fn();
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
afterSaveCell.mockReset();
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultCellEdit,
|
||||||
|
afterSaveCell
|
||||||
|
}));
|
||||||
|
wrapper.setState({
|
||||||
|
ridx: 1,
|
||||||
|
cidx: 1
|
||||||
|
});
|
||||||
|
wrapper.instance().handleCellUpdate(
|
||||||
|
row,
|
||||||
|
column,
|
||||||
|
newValue
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not call handleCellChange correctly', () => {
|
||||||
|
expect(handleCellChange).toHaveBeenCalledTimes(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should set state correctly', () => {
|
||||||
|
expect(wrapper.state('ridx')).toBeNull();
|
||||||
|
expect(wrapper.state('cidx')).toBeNull();
|
||||||
|
expect(wrapper.state('message')).toBeNull();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should call cellEdit.afterSaveCell if it is defined', () => {
|
||||||
|
expect(afterSaveCell).toHaveBeenCalledTimes(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('completeEditing', () => {
|
||||||
|
const initialState = { ridx: 1, cidx: 1, message: 'test' };
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext());
|
||||||
|
wrapper.setState(initialState);
|
||||||
|
wrapper.render();
|
||||||
|
wrapper.instance().completeEditing();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should set state correctly', () => {
|
||||||
|
expect(wrapper.state().ridx).toBeNull();
|
||||||
|
expect(wrapper.state().cidx).toBeNull();
|
||||||
|
expect(wrapper.state().message).toBeNull();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('startEditing', () => {
|
||||||
|
const ridx = 0;
|
||||||
|
const cidx = 1;
|
||||||
|
|
||||||
|
describe('if selectRow prop is not defined', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext());
|
||||||
|
wrapper.render();
|
||||||
|
wrapper.instance().startEditing(ridx, cidx);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should set state correctly', () => {
|
||||||
|
expect(wrapper.state().ridx).toEqual(ridx);
|
||||||
|
expect(wrapper.state().cidx).toEqual(cidx);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('if selectRow prop is defined', () => {
|
||||||
|
describe('and selectRow.clickToEdit is enable', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext(
|
||||||
|
defaultCellEdit,
|
||||||
|
false,
|
||||||
|
{
|
||||||
|
...defaultSelectRow,
|
||||||
|
clickToEdit: true
|
||||||
|
}
|
||||||
|
));
|
||||||
|
wrapper.render();
|
||||||
|
wrapper.instance().startEditing(ridx, cidx);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should set state correctly', () => {
|
||||||
|
expect(wrapper.state().ridx).toEqual(ridx);
|
||||||
|
expect(wrapper.state().cidx).toEqual(cidx);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('and selectRow.clickToSelect is disable', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext(
|
||||||
|
defaultCellEdit,
|
||||||
|
false,
|
||||||
|
{
|
||||||
|
...defaultSelectRow,
|
||||||
|
clickToSelect: false
|
||||||
|
}
|
||||||
|
));
|
||||||
|
wrapper.render();
|
||||||
|
wrapper.instance().startEditing(ridx, cidx);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should set state correctly', () => {
|
||||||
|
expect(wrapper.state().ridx).toEqual(ridx);
|
||||||
|
expect(wrapper.state().cidx).toEqual(cidx);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('and selectRow.clickToEdit & selectRow.clickToSelect is enable', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext(
|
||||||
|
defaultCellEdit,
|
||||||
|
false,
|
||||||
|
{
|
||||||
|
...defaultSelectRow,
|
||||||
|
clickToEdit: false,
|
||||||
|
clickToSelect: true
|
||||||
|
}
|
||||||
|
));
|
||||||
|
wrapper.render();
|
||||||
|
wrapper.instance().startEditing(ridx, cidx);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not set state', () => {
|
||||||
|
expect(wrapper.state().ridx).toBeNull();
|
||||||
|
expect(wrapper.state().cidx).toBeNull();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('escapeEditing', () => {
|
||||||
|
const initialState = { ridx: 1, cidx: 1 };
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext());
|
||||||
|
wrapper.setState(initialState);
|
||||||
|
wrapper.instance().escapeEditing();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should set state correctly', () => {
|
||||||
|
expect(wrapper.state().ridx).toBeNull();
|
||||||
|
expect(wrapper.state().cidx).toBeNull();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -6,7 +6,12 @@ import { shallow, mount } from 'enzyme';
|
|||||||
|
|
||||||
import _ from 'react-bootstrap-table-next/src/utils';
|
import _ from 'react-bootstrap-table-next/src/utils';
|
||||||
import editingCellFactory from '../src/editing-cell';
|
import editingCellFactory from '../src/editing-cell';
|
||||||
|
import * as constants from '../src/const';
|
||||||
import TextEditor from '../src/text-editor';
|
import TextEditor from '../src/text-editor';
|
||||||
|
import DateEditor from '../src/date-editor';
|
||||||
|
import DropDownEditor from '../src/dropdown-editor';
|
||||||
|
import TextAreaEditor from '../src/textarea-editor';
|
||||||
|
import CheckBoxEditor from '../src/checkbox-editor';
|
||||||
import EditorIndicator from '../src/editor-indicator';
|
import EditorIndicator from '../src/editor-indicator';
|
||||||
|
|
||||||
const EditingCell = editingCellFactory(_);
|
const EditingCell = editingCellFactory(_);
|
||||||
@@ -28,6 +33,9 @@ describe('EditingCell', () => {
|
|||||||
name: 'A'
|
name: 'A'
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const rowIndex = 1;
|
||||||
|
const columnIndex = 1;
|
||||||
|
|
||||||
let column = {
|
let column = {
|
||||||
dataField: 'id',
|
dataField: 'id',
|
||||||
text: 'ID'
|
text: 'ID'
|
||||||
@@ -36,9 +44,11 @@ describe('EditingCell', () => {
|
|||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
onEscape = sinon.stub();
|
onEscape = sinon.stub();
|
||||||
onUpdate = sinon.stub();
|
onUpdate = sinon.stub();
|
||||||
wrapper = shallow(
|
wrapper = mount(
|
||||||
<EditingCell
|
<EditingCell
|
||||||
row={ row }
|
row={ row }
|
||||||
|
rowIndex={ rowIndex }
|
||||||
|
columnIndex={ columnIndex }
|
||||||
column={ column }
|
column={ column }
|
||||||
onUpdate={ onUpdate }
|
onUpdate={ onUpdate }
|
||||||
onEscape={ onEscape }
|
onEscape={ onEscape }
|
||||||
@@ -58,7 +68,7 @@ describe('EditingCell', () => {
|
|||||||
expect(textEditor.props().defaultValue).toEqual(row[column.dataField]);
|
expect(textEditor.props().defaultValue).toEqual(row[column.dataField]);
|
||||||
expect(textEditor.props().onKeyDown).toBeDefined();
|
expect(textEditor.props().onKeyDown).toBeDefined();
|
||||||
expect(textEditor.props().onBlur).toBeDefined();
|
expect(textEditor.props().onBlur).toBeDefined();
|
||||||
expect(textEditor.props().className).toBeNull();
|
expect(textEditor.props().className).toEqual('');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should not render EditorIndicator due to state.invalidMessage is null', () => {
|
it('should not render EditorIndicator due to state.invalidMessage is null', () => {
|
||||||
@@ -69,7 +79,8 @@ describe('EditingCell', () => {
|
|||||||
it('when press ENTER on TextEditor should call onUpdate correctly', () => {
|
it('when press ENTER on TextEditor should call onUpdate correctly', () => {
|
||||||
const newValue = 'test';
|
const newValue = 'test';
|
||||||
const textEditor = wrapper.find(TextEditor);
|
const textEditor = wrapper.find(TextEditor);
|
||||||
textEditor.simulate('keyDown', { keyCode: 13, currentTarget: { value: newValue } });
|
sinon.stub(textEditor.instance(), 'getValue').returns(newValue);
|
||||||
|
textEditor.simulate('keyDown', { keyCode: 13 });
|
||||||
expect(onUpdate.callCount).toBe(1);
|
expect(onUpdate.callCount).toBe(1);
|
||||||
expect(onUpdate.calledWith(row, column, newValue)).toBe(true);
|
expect(onUpdate.calledWith(row, column, newValue)).toBe(true);
|
||||||
});
|
});
|
||||||
@@ -92,6 +103,8 @@ describe('EditingCell', () => {
|
|||||||
wrapper = shallow(
|
wrapper = shallow(
|
||||||
<EditingCell
|
<EditingCell
|
||||||
row={ row }
|
row={ row }
|
||||||
|
rowIndex={ rowIndex }
|
||||||
|
columnIndex={ columnIndex }
|
||||||
column={ column }
|
column={ column }
|
||||||
onUpdate={ onUpdate }
|
onUpdate={ onUpdate }
|
||||||
onEscape={ onEscape }
|
onEscape={ onEscape }
|
||||||
@@ -112,6 +125,8 @@ describe('EditingCell', () => {
|
|||||||
wrapper = shallow(
|
wrapper = shallow(
|
||||||
<EditingCell
|
<EditingCell
|
||||||
row={ row }
|
row={ row }
|
||||||
|
rowIndex={ rowIndex }
|
||||||
|
columnIndex={ columnIndex }
|
||||||
column={ column }
|
column={ column }
|
||||||
onUpdate={ onUpdate }
|
onUpdate={ onUpdate }
|
||||||
onEscape={ onEscape }
|
onEscape={ onEscape }
|
||||||
@@ -126,12 +141,140 @@ describe('EditingCell', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('if column.editorClasses is defined', () => {
|
||||||
|
let columnWithEditorClasses;
|
||||||
|
const classes = 'test test1';
|
||||||
|
|
||||||
|
describe('and it is a function', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
columnWithEditorClasses = {
|
||||||
|
...column,
|
||||||
|
editorClasses: jest.fn(() => classes)
|
||||||
|
};
|
||||||
|
wrapper = shallow(
|
||||||
|
<EditingCell
|
||||||
|
row={ row }
|
||||||
|
rowIndex={ rowIndex }
|
||||||
|
columnIndex={ columnIndex }
|
||||||
|
column={ columnWithEditorClasses }
|
||||||
|
onUpdate={ onUpdate }
|
||||||
|
onEscape={ onEscape }
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render TextEditor with correct props', () => {
|
||||||
|
const textEditor = wrapper.find(TextEditor);
|
||||||
|
expect(textEditor.props().className).toEqual(classes);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should call column.editorClasses correctly', () => {
|
||||||
|
expect(columnWithEditorClasses.editorClasses).toHaveBeenCalledTimes(1);
|
||||||
|
expect(columnWithEditorClasses.editorClasses).toHaveBeenCalledWith(
|
||||||
|
_.get(row, column.dataField),
|
||||||
|
row,
|
||||||
|
rowIndex,
|
||||||
|
columnIndex
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('and it is a string', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
columnWithEditorClasses = {
|
||||||
|
...column,
|
||||||
|
editorClasses: classes
|
||||||
|
};
|
||||||
|
wrapper = shallow(
|
||||||
|
<EditingCell
|
||||||
|
row={ row }
|
||||||
|
rowIndex={ rowIndex }
|
||||||
|
columnIndex={ columnIndex }
|
||||||
|
column={ columnWithEditorClasses }
|
||||||
|
onUpdate={ onUpdate }
|
||||||
|
onEscape={ onEscape }
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render TextEditor with correct props', () => {
|
||||||
|
const textEditor = wrapper.find(TextEditor);
|
||||||
|
expect(textEditor.props().className).toEqual(classes);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('if column.editorStyle is defined', () => {
|
||||||
|
let columnWithEditorStyle;
|
||||||
|
const style = { color: 'red' };
|
||||||
|
|
||||||
|
describe('and it is a function', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
columnWithEditorStyle = {
|
||||||
|
...column,
|
||||||
|
editorStyle: jest.fn(() => style)
|
||||||
|
};
|
||||||
|
wrapper = shallow(
|
||||||
|
<EditingCell
|
||||||
|
row={ row }
|
||||||
|
rowIndex={ rowIndex }
|
||||||
|
columnIndex={ columnIndex }
|
||||||
|
column={ columnWithEditorStyle }
|
||||||
|
onUpdate={ onUpdate }
|
||||||
|
onEscape={ onEscape }
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render TextEditor with correct props', () => {
|
||||||
|
const textEditor = wrapper.find(TextEditor);
|
||||||
|
expect(textEditor.props().style).toEqual(style);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should call column.editorStyle correctly', () => {
|
||||||
|
expect(columnWithEditorStyle.editorStyle).toHaveBeenCalledTimes(1);
|
||||||
|
expect(columnWithEditorStyle.editorStyle).toHaveBeenCalledWith(
|
||||||
|
_.get(row, column.dataField),
|
||||||
|
row,
|
||||||
|
rowIndex,
|
||||||
|
columnIndex
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('and it is an object', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
columnWithEditorStyle = {
|
||||||
|
...column,
|
||||||
|
editorStyle: style
|
||||||
|
};
|
||||||
|
wrapper = shallow(
|
||||||
|
<EditingCell
|
||||||
|
row={ row }
|
||||||
|
rowIndex={ rowIndex }
|
||||||
|
columnIndex={ columnIndex }
|
||||||
|
column={ columnWithEditorStyle }
|
||||||
|
onUpdate={ onUpdate }
|
||||||
|
onEscape={ onEscape }
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render TextEditor with correct props', () => {
|
||||||
|
const textEditor = wrapper.find(TextEditor);
|
||||||
|
expect(textEditor.props().style).toEqual(style);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('if blurToSave prop is true', () => {
|
describe('if blurToSave prop is true', () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
wrapper = mount(
|
wrapper = mount(
|
||||||
<TableRowWrapper>
|
<TableRowWrapper>
|
||||||
<EditingCell
|
<EditingCell
|
||||||
row={ row }
|
row={ row }
|
||||||
|
rowIndex={ rowIndex }
|
||||||
|
columnIndex={ columnIndex }
|
||||||
column={ column }
|
column={ column }
|
||||||
onUpdate={ onUpdate }
|
onUpdate={ onUpdate }
|
||||||
onEscape={ onEscape }
|
onEscape={ onEscape }
|
||||||
@@ -167,12 +310,14 @@ describe('EditingCell', () => {
|
|||||||
wrapper = mount(
|
wrapper = mount(
|
||||||
<EditingCell
|
<EditingCell
|
||||||
row={ row }
|
row={ row }
|
||||||
|
rowIndex={ rowIndex }
|
||||||
|
columnIndex={ columnIndex }
|
||||||
column={ column }
|
column={ column }
|
||||||
onUpdate={ onUpdate }
|
onUpdate={ onUpdate }
|
||||||
onEscape={ onEscape }
|
onEscape={ onEscape }
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
wrapper.instance().beforeComplete(row, column, newValue);
|
wrapper.instance().beforeComplete(newValue);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should call column.validator successfully', () => {
|
it('should call column.validator successfully', () => {
|
||||||
@@ -218,7 +363,17 @@ describe('EditingCell', () => {
|
|||||||
text: 'ID',
|
text: 'ID',
|
||||||
validator: validatorCallBack
|
validator: validatorCallBack
|
||||||
};
|
};
|
||||||
wrapper.instance().beforeComplete(row, column, newValue);
|
wrapper = mount(
|
||||||
|
<EditingCell
|
||||||
|
row={ row }
|
||||||
|
rowIndex={ rowIndex }
|
||||||
|
columnIndex={ columnIndex }
|
||||||
|
column={ column }
|
||||||
|
onUpdate={ onUpdate }
|
||||||
|
onEscape={ onEscape }
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
wrapper.instance().beforeComplete(newValue);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should call column.validator successfully', () => {
|
it('should call column.validator successfully', () => {
|
||||||
@@ -231,4 +386,156 @@ describe('EditingCell', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('if column.editorRenderer is defined', () => {
|
||||||
|
const TestEditor = () => <input type="text" />;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
column = {
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'ID',
|
||||||
|
editorRenderer: sinon.stub().returns(<TestEditor />)
|
||||||
|
};
|
||||||
|
|
||||||
|
wrapper = mount(
|
||||||
|
<EditingCell
|
||||||
|
row={ row }
|
||||||
|
rowIndex={ rowIndex }
|
||||||
|
columnIndex={ columnIndex }
|
||||||
|
column={ column }
|
||||||
|
onUpdate={ onUpdate }
|
||||||
|
onEscape={ onEscape }
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should call column.editorRenderer correctly', () => {
|
||||||
|
expect(column.editorRenderer.callCount).toBe(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render correctly', () => {
|
||||||
|
expect(wrapper.find(TestEditor)).toHaveLength(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('if column.editor is select', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
column = {
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'ID',
|
||||||
|
editor: {
|
||||||
|
type: constants.EDITTYPE.SELECT,
|
||||||
|
options: [{
|
||||||
|
value: 1,
|
||||||
|
label: 'A'
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
wrapper = mount(
|
||||||
|
<EditingCell
|
||||||
|
row={ row }
|
||||||
|
rowIndex={ rowIndex }
|
||||||
|
columnIndex={ columnIndex }
|
||||||
|
column={ column }
|
||||||
|
onUpdate={ onUpdate }
|
||||||
|
onEscape={ onEscape }
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render dropdown editor successfully', () => {
|
||||||
|
const editor = wrapper.find(DropDownEditor);
|
||||||
|
expect(wrapper.length).toBe(1);
|
||||||
|
expect(editor.length).toBe(1);
|
||||||
|
expect(editor.props().options).toEqual(column.editor.options);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('if column.editor is textarea', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
column = {
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'ID',
|
||||||
|
editor: {
|
||||||
|
type: constants.EDITTYPE.TEXTAREA
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
wrapper = mount(
|
||||||
|
<EditingCell
|
||||||
|
row={ row }
|
||||||
|
rowIndex={ rowIndex }
|
||||||
|
columnIndex={ columnIndex }
|
||||||
|
column={ column }
|
||||||
|
onUpdate={ onUpdate }
|
||||||
|
onEscape={ onEscape }
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render textarea editor successfully', () => {
|
||||||
|
const editor = wrapper.find(TextAreaEditor);
|
||||||
|
expect(wrapper.length).toBe(1);
|
||||||
|
expect(editor.length).toBe(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('if column.editor is checkbox', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
column = {
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'ID',
|
||||||
|
editor: {
|
||||||
|
type: constants.EDITTYPE.CHECKBOX
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
wrapper = mount(
|
||||||
|
<EditingCell
|
||||||
|
row={ row }
|
||||||
|
rowIndex={ rowIndex }
|
||||||
|
columnIndex={ columnIndex }
|
||||||
|
column={ column }
|
||||||
|
onUpdate={ onUpdate }
|
||||||
|
onEscape={ onEscape }
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render checkbox editor successfully', () => {
|
||||||
|
const editor = wrapper.find(CheckBoxEditor);
|
||||||
|
expect(wrapper.length).toBe(1);
|
||||||
|
expect(editor.length).toBe(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('if column.editor is date', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
column = {
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'ID',
|
||||||
|
editor: {
|
||||||
|
type: constants.EDITTYPE.DATE
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
wrapper = mount(
|
||||||
|
<EditingCell
|
||||||
|
row={ row }
|
||||||
|
rowIndex={ rowIndex }
|
||||||
|
columnIndex={ columnIndex }
|
||||||
|
column={ column }
|
||||||
|
onUpdate={ onUpdate }
|
||||||
|
onEscape={ onEscape }
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render date editor successfully', () => {
|
||||||
|
const editor = wrapper.find(DateEditor);
|
||||||
|
expect(wrapper.length).toBe(1);
|
||||||
|
expect(editor.length).toBe(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,330 +0,0 @@
|
|||||||
import React from 'react';
|
|
||||||
import sinon from 'sinon';
|
|
||||||
import { shallow } from 'enzyme';
|
|
||||||
|
|
||||||
import _ from 'react-bootstrap-table-next/src/utils';
|
|
||||||
import remoteResolver from 'react-bootstrap-table-next/src/props-resolver/remote-resolver';
|
|
||||||
import Store from 'react-bootstrap-table-next/src/store';
|
|
||||||
import BootstrapTable from 'react-bootstrap-table-next/src/bootstrap-table';
|
|
||||||
import cellEditFactory from '..';
|
|
||||||
import * as Const from '../src/const';
|
|
||||||
import wrapperFactory from '../src/wrapper';
|
|
||||||
|
|
||||||
describe('CellEditWrapper', () => {
|
|
||||||
let wrapper;
|
|
||||||
let instance;
|
|
||||||
const onTableChangeCB = sinon.stub();
|
|
||||||
const columns = [{
|
|
||||||
dataField: 'id',
|
|
||||||
text: 'ID'
|
|
||||||
}, {
|
|
||||||
dataField: 'name',
|
|
||||||
text: 'Name'
|
|
||||||
}];
|
|
||||||
const data = [{
|
|
||||||
id: 1,
|
|
||||||
name: 'A'
|
|
||||||
}, {
|
|
||||||
id: 2,
|
|
||||||
name: 'B'
|
|
||||||
}];
|
|
||||||
|
|
||||||
const createTableProps = (props = {}) => {
|
|
||||||
const { cellEdit, ...rest } = props;
|
|
||||||
const tableProps = {
|
|
||||||
keyField: 'id',
|
|
||||||
columns,
|
|
||||||
data,
|
|
||||||
_,
|
|
||||||
store: new Store('id'),
|
|
||||||
cellEdit: cellEditFactory(cellEdit),
|
|
||||||
onTableChange: onTableChangeCB,
|
|
||||||
...rest
|
|
||||||
};
|
|
||||||
tableProps.store.data = data;
|
|
||||||
return tableProps;
|
|
||||||
};
|
|
||||||
|
|
||||||
const CellEditWrapper = wrapperFactory(BootstrapTable, {
|
|
||||||
_,
|
|
||||||
remoteResolver
|
|
||||||
});
|
|
||||||
|
|
||||||
const createCellEditWrapper = (props, renderFragment = true) => {
|
|
||||||
wrapper = shallow(<CellEditWrapper { ...props } />);
|
|
||||||
instance = wrapper.instance();
|
|
||||||
if (renderFragment) {
|
|
||||||
const fragment = instance.render();
|
|
||||||
wrapper = shallow(<div>{ fragment }</div>);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
onTableChangeCB.reset();
|
|
||||||
});
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
const props = createTableProps({
|
|
||||||
cellEdit: { mode: Const.CLICK_TO_CELL_EDIT }
|
|
||||||
});
|
|
||||||
createCellEditWrapper(props);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render CellEditWrapper correctly', () => {
|
|
||||||
expect(wrapper.length).toBe(1);
|
|
||||||
expect(wrapper.find(BootstrapTable)).toBeDefined();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should have correct state', () => {
|
|
||||||
expect(instance.state.ridx).toBeNull();
|
|
||||||
expect(instance.state.cidx).toBeNull();
|
|
||||||
expect(instance.state.message).toBeNull();
|
|
||||||
expect(instance.state.isDataChanged).toBeFalsy();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should inject correct props to base component', () => {
|
|
||||||
const base = wrapper.find(BootstrapTable);
|
|
||||||
expect(base.props().cellEdit).toBeDefined();
|
|
||||||
expect(base.props().cellEdit.onStart).toBeDefined();
|
|
||||||
expect(base.props().cellEdit.onEscape).toBeDefined();
|
|
||||||
expect(base.props().cellEdit.onUpdate).toBeDefined();
|
|
||||||
expect(base.props().cellEdit.EditingCell).toBeDefined();
|
|
||||||
expect(base.props().cellEdit.ridx).toBeNull();
|
|
||||||
expect(base.props().cellEdit.cidx).toBeNull();
|
|
||||||
expect(base.props().cellEdit.message).toBeNull();
|
|
||||||
expect(base.props().isDataChanged).toBe(instance.state.isDataChanged);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when receive new cellEdit prop', () => {
|
|
||||||
const spy = jest.spyOn(CellEditWrapper.prototype, 'escapeEditing');
|
|
||||||
|
|
||||||
describe('and cellEdit is not work on remote', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
const props = createTableProps({
|
|
||||||
cellEdit: { mode: Const.CLICK_TO_CELL_EDIT }
|
|
||||||
});
|
|
||||||
createCellEditWrapper(props);
|
|
||||||
wrapper.setProps({ cellEdit: props.cellEdit });
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should always setting state.isDataChanged as false', () => {
|
|
||||||
expect(instance.state.isDataChanged).toBeFalsy();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('and cellEdit is work on remote', () => {
|
|
||||||
let errorMessage;
|
|
||||||
let props;
|
|
||||||
beforeEach(() => {
|
|
||||||
props = createTableProps({
|
|
||||||
cellEdit: { mode: Const.CLICK_TO_CELL_EDIT },
|
|
||||||
remote: true
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('and cellEdit.errorMessage is defined', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
createCellEditWrapper(props, false);
|
|
||||||
errorMessage = 'test';
|
|
||||||
const newCellEdit = {
|
|
||||||
...props.cellEdit,
|
|
||||||
options: { ...props.cellEdit.options, errorMessage }
|
|
||||||
};
|
|
||||||
wrapper.setProps({ cellEdit: newCellEdit });
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should setting correct state', () => {
|
|
||||||
expect(instance.state.isDataChanged).toBeFalsy();
|
|
||||||
expect(instance.state.message).toEqual(errorMessage);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('and cellEdit.errorMessage is undefined', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
errorMessage = null;
|
|
||||||
createCellEditWrapper(props, false);
|
|
||||||
const newCellEdit = {
|
|
||||||
...props.cellEdit,
|
|
||||||
options: { ...props.cellEdit.options, errorMessage }
|
|
||||||
};
|
|
||||||
wrapper.setProps({ cellEdit: newCellEdit });
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should setting correct state', () => {
|
|
||||||
expect(wrapper.state().isDataChanged).toBeTruthy();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should escape current editing', () => {
|
|
||||||
expect(spy).toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('call escapeEditing function', () => {
|
|
||||||
it('should set state correctly', () => {
|
|
||||||
instance.escapeEditing();
|
|
||||||
expect(instance.state.ridx).toBeNull();
|
|
||||||
expect(instance.state.cidx).toBeNull();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('call startEditing function', () => {
|
|
||||||
const ridx = 1;
|
|
||||||
const cidx = 3;
|
|
||||||
|
|
||||||
it('should set state correctly', () => {
|
|
||||||
instance.startEditing(ridx, cidx);
|
|
||||||
expect(instance.state.ridx).toEqual(ridx);
|
|
||||||
expect(instance.state.cidx).toEqual(cidx);
|
|
||||||
expect(instance.state.isDataChanged).toBeFalsy();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('if selectRow.clickToSelect is defined', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
const selectRow = { mode: 'checkbox', clickToSelect: true };
|
|
||||||
const props = createTableProps({
|
|
||||||
cellEdit: { mode: Const.CLICK_TO_CELL_EDIT },
|
|
||||||
selectRow
|
|
||||||
});
|
|
||||||
createCellEditWrapper(props);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should not set state', () => {
|
|
||||||
instance.startEditing(ridx, cidx);
|
|
||||||
expect(instance.state.ridx).toBeNull();
|
|
||||||
expect(instance.state.cidx).toBeDefined();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('if selectRow.clickToSelect and selectRow.clickToEdit is defined', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
const selectRow = { mode: 'checkbox', clickToSelect: true, clickToEdit: true };
|
|
||||||
const props = createTableProps({
|
|
||||||
cellEdit: { mode: Const.CLICK_TO_CELL_EDIT },
|
|
||||||
selectRow
|
|
||||||
});
|
|
||||||
createCellEditWrapper(props);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should set state correctly', () => {
|
|
||||||
instance.startEditing(ridx, cidx);
|
|
||||||
expect(instance.state.ridx).toEqual(ridx);
|
|
||||||
expect(instance.state.cidx).toEqual(cidx);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('call completeEditing function', () => {
|
|
||||||
it('should set state correctly', () => {
|
|
||||||
instance.completeEditing();
|
|
||||||
expect(instance.state.ridx).toBeNull();
|
|
||||||
expect(instance.state.cidx).toBeNull();
|
|
||||||
expect(instance.state.message).toBeNull();
|
|
||||||
expect(instance.state.isDataChanged).toBeTruthy();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('call handleCellUpdate function', () => {
|
|
||||||
let props;
|
|
||||||
const row = data[0];
|
|
||||||
const column = columns[1];
|
|
||||||
const newValue = 'new name';
|
|
||||||
|
|
||||||
describe('when cell edit is work on remote', () => {
|
|
||||||
const spy = jest.spyOn(CellEditWrapper.prototype, 'handleCellChange');
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
props = createTableProps({
|
|
||||||
cellEdit: { mode: Const.CLICK_TO_CELL_EDIT },
|
|
||||||
remote: true
|
|
||||||
});
|
|
||||||
createCellEditWrapper(props);
|
|
||||||
instance.handleCellUpdate(row, column, newValue);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should calling handleCellChange correctly', () => {
|
|
||||||
expect(spy).toHaveBeenCalled();
|
|
||||||
expect(spy.mock.calls).toHaveLength(1);
|
|
||||||
expect(spy.mock.calls[0]).toHaveLength(3);
|
|
||||||
expect(spy.mock.calls[0][0]).toEqual(row.id);
|
|
||||||
expect(spy.mock.calls[0][1]).toEqual(column.dataField);
|
|
||||||
expect(spy.mock.calls[0][2]).toEqual(newValue);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when cell edit is not work on remote', () => {
|
|
||||||
const spyOnCompleteEditing = jest.spyOn(CellEditWrapper.prototype, 'completeEditing');
|
|
||||||
const spyOnStoreEdit = jest.spyOn(Store.prototype, 'edit');
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
props = createTableProps({
|
|
||||||
cellEdit: { mode: Const.CLICK_TO_CELL_EDIT }
|
|
||||||
});
|
|
||||||
createCellEditWrapper(props);
|
|
||||||
instance.handleCellUpdate(row, column, newValue);
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
spyOnStoreEdit.mockReset();
|
|
||||||
spyOnCompleteEditing.mockReset();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should calling props.store.edit', () => {
|
|
||||||
expect(spyOnStoreEdit).toHaveBeenCalled();
|
|
||||||
expect(spyOnStoreEdit.mock.calls).toHaveLength(1);
|
|
||||||
expect(spyOnStoreEdit.mock.calls[0]).toHaveLength(3);
|
|
||||||
expect(spyOnStoreEdit.mock.calls[0][0]).toEqual(row.id);
|
|
||||||
expect(spyOnStoreEdit.mock.calls[0][1]).toEqual(column.dataField);
|
|
||||||
expect(spyOnStoreEdit.mock.calls[0][2]).toEqual(newValue);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should calling completeEditing function', () => {
|
|
||||||
expect(spyOnCompleteEditing).toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('if cellEdit.afterSaveCell prop defined', () => {
|
|
||||||
const aftereSaveCellCallBack = sinon.stub();
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
props = createTableProps({
|
|
||||||
cellEdit: {
|
|
||||||
mode: Const.CLICK_TO_CELL_EDIT,
|
|
||||||
afterSaveCell: aftereSaveCellCallBack
|
|
||||||
}
|
|
||||||
});
|
|
||||||
createCellEditWrapper(props);
|
|
||||||
instance.handleCellUpdate(row, column, newValue);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should calling cellEdit.afterSaveCell correctly', () => {
|
|
||||||
expect(aftereSaveCellCallBack.callCount).toBe(1);
|
|
||||||
expect(aftereSaveCellCallBack.calledWith(
|
|
||||||
row[column.dataField], newValue, row, column)
|
|
||||||
).toBe(true);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('if cellEdit.beforeSaveCell prop defined', () => {
|
|
||||||
const beforeSaveCellCallBack = sinon.stub();
|
|
||||||
beforeEach(() => {
|
|
||||||
props = createTableProps({
|
|
||||||
cellEdit: {
|
|
||||||
mode: Const.CLICK_TO_CELL_EDIT,
|
|
||||||
beforeSaveCell: beforeSaveCellCallBack
|
|
||||||
}
|
|
||||||
});
|
|
||||||
createCellEditWrapper(props);
|
|
||||||
instance.handleCellUpdate(row, column, newValue);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should calling cellEdit.beforeSaveCell correctly', () => {
|
|
||||||
expect(beforeSaveCellCallBack.callCount).toBe(1);
|
|
||||||
expect(beforeSaveCellCallBack.calledWith(
|
|
||||||
row[column.dataField], newValue, row, column)
|
|
||||||
).toBe(true);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
{
|
{
|
||||||
"presets": ["react", "es2015", "stage-0", ["env", {"modules": false} ]]
|
"presets": ["react", "es2015", "stage-0", ["env", {"modules": false} ]],
|
||||||
|
"plugins": ["transform-class-properties"]
|
||||||
}
|
}
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script>
|
<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script>
|
||||||
|
<!-- <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css" integrity="sha384-Smlep5jCw/wG7hdkwQ/Z5nLIefveQRIY9nfy6xoR1uRYBtpZgI6339F5dgvm/e9B" crossorigin="anonymous"> -->
|
||||||
@@ -1,12 +1,14 @@
|
|||||||
const path = require('path');
|
const path = require('path');
|
||||||
|
|
||||||
const sourcePath = path.join(__dirname, '../../react-bootstrap-table2');
|
const sourcePath = path.join(__dirname, '../../react-bootstrap-table2/index.js');
|
||||||
const paginationSourcePath = path.join(__dirname, '../../react-bootstrap-table2-paginator');
|
const paginationSourcePath = path.join(__dirname, '../../react-bootstrap-table2-paginator/index.js');
|
||||||
const overlaySourcePath = path.join(__dirname, '../../react-bootstrap-table2-overlay');
|
const overlaySourcePath = path.join(__dirname, '../../react-bootstrap-table2-overlay/index.js');
|
||||||
const filterSourcePath = path.join(__dirname, '../../react-bootstrap-table2-filter');
|
const filterSourcePath = path.join(__dirname, '../../react-bootstrap-table2-filter/index.js');
|
||||||
const editorSourcePath = path.join(__dirname, '../../react-bootstrap-table2-editor');
|
const editorSourcePath = path.join(__dirname, '../../react-bootstrap-table2-editor/index.js');
|
||||||
const sourceStylePath = path.join(__dirname, '../../react-bootstrap-table2/style');
|
const sourceStylePath = path.join(__dirname, '../../react-bootstrap-table2/style');
|
||||||
const paginationStylePath = path.join(__dirname, '../../react-bootstrap-table2-paginator/style');
|
const paginationStylePath = path.join(__dirname, '../../react-bootstrap-table2-paginator/style');
|
||||||
|
const filterStylePath = path.join(__dirname, '../../react-bootstrap-table2-filter/style');
|
||||||
|
const toolkitSourcePath = path.join(__dirname, '../../react-bootstrap-table2-toolkit/index.js');
|
||||||
const storyPath = path.join(__dirname, '../stories');
|
const storyPath = path.join(__dirname, '../stories');
|
||||||
const examplesPath = path.join(__dirname, '../examples');
|
const examplesPath = path.join(__dirname, '../examples');
|
||||||
const srcPath = path.join(__dirname, '../src');
|
const srcPath = path.join(__dirname, '../src');
|
||||||
@@ -22,6 +24,7 @@ const aliasPath = {
|
|||||||
'react-bootstrap-table2-filter': filterSourcePath,
|
'react-bootstrap-table2-filter': filterSourcePath,
|
||||||
'react-bootstrap-table2-overlay': overlaySourcePath,
|
'react-bootstrap-table2-overlay': overlaySourcePath,
|
||||||
'react-bootstrap-table2-paginator': paginationSourcePath,
|
'react-bootstrap-table2-paginator': paginationSourcePath,
|
||||||
|
'react-bootstrap-table2-toolkit': toolkitSourcePath
|
||||||
};
|
};
|
||||||
|
|
||||||
const loaders = [{
|
const loaders = [{
|
||||||
@@ -33,15 +36,14 @@ const loaders = [{
|
|||||||
}, {
|
}, {
|
||||||
test: /\.js?$/,
|
test: /\.js?$/,
|
||||||
use: ['babel-loader'],
|
use: ['babel-loader'],
|
||||||
exclude: /node_modules/,
|
exclude: /node_modules/
|
||||||
include: [sourcePath, paginationSourcePath, overlaySourcePath, filterSourcePath, editorSourcePath, storyPath]
|
|
||||||
}, {
|
}, {
|
||||||
test: /\.css$/,
|
test: /\.css$/,
|
||||||
use: ['style-loader', 'css-loader'],
|
use: ['style-loader', 'css-loader'],
|
||||||
}, {
|
}, {
|
||||||
test: /\.scss$/,
|
test: /\.scss$/,
|
||||||
use: ['style-loader', 'css-loader', 'sass-loader'],
|
use: ['style-loader', 'css-loader', 'sass-loader'],
|
||||||
include: [storyPath, sourceStylePath, paginationStylePath],
|
include: [storyPath, sourceStylePath, paginationStylePath, filterStylePath],
|
||||||
}, {
|
}, {
|
||||||
test: /\.(jpg|png|woff|woff2|eot|ttf|svg)$/,
|
test: /\.(jpg|png|woff|woff2|eot|ttf|svg)$/,
|
||||||
loader: 'url-loader?limit=100000',
|
loader: 'url-loader?limit=100000',
|
||||||
|
|||||||
@@ -18,6 +18,9 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
// omit...
|
||||||
|
|
||||||
<BootstrapTable
|
<BootstrapTable
|
||||||
keyField="id"
|
keyField="id"
|
||||||
data={ products }
|
data={ products }
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
|
||||||
const columns = [{
|
const columns = [{
|
||||||
dataField: 'id',
|
dataField: 'id',
|
||||||
text: 'Product ID'
|
text: 'Product ID'
|
||||||
|
|||||||
52
packages/react-bootstrap-table2-example/examples/basic/customized-id-classes.js
vendored
Normal file
52
packages/react-bootstrap-table2-example/examples/basic/customized-id-classes.js
vendored
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsGenerator();
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price'
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price'
|
||||||
|
}];
|
||||||
|
|
||||||
|
<BootstrapTable id="bar" keyField='id' data={ products } columns={ columns } />
|
||||||
|
<BootstrapTable classes="foo" keyField='id' data={ products } columns={ columns } />
|
||||||
|
<BootstrapTable wrapperClasses="boo" keyField="id" data={ products } columns={ columns } />
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<h4> Customized table ID </h4>
|
||||||
|
<BootstrapTable id="bar" keyField="id" data={ products } columns={ columns } />
|
||||||
|
|
||||||
|
<h4> Customized table className </h4>
|
||||||
|
<BootstrapTable classes="foo" keyField="id" data={ products } columns={ columns } />
|
||||||
|
|
||||||
|
<h4> Customized wrapper className </h4>
|
||||||
|
<BootstrapTable wrapperClasses="boo" keyField="id" data={ products } columns={ columns } />
|
||||||
|
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
@@ -18,6 +18,8 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
|
||||||
const columns = [{
|
const columns = [{
|
||||||
dataField: 'id',
|
dataField: 'id',
|
||||||
text: 'Product ID'
|
text: 'Product ID'
|
||||||
|
|||||||
32
packages/react-bootstrap-table2-example/examples/basic/large-table.js
vendored
Normal file
32
packages/react-bootstrap-table2-example/examples/basic/large-table.js
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import cellEditFactory from 'react-bootstrap-table2-editor';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsGenerator(5000);
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price'
|
||||||
|
}];
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
selectRow={ { mode: 'checkbox' } }
|
||||||
|
cellEdit={ cellEditFactory({
|
||||||
|
mode: 'click'
|
||||||
|
}) }
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
@@ -15,9 +15,12 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
// omit...
|
||||||
|
|
||||||
<BootstrapTable keyField='id' data={ [] } columns={ columns } noDataIndication="Table is Empty" />
|
<BootstrapTable keyField='id' data={ [] } columns={ columns } noDataIndication="Table is Empty" />
|
||||||
|
|
||||||
// Following is more customizable example
|
// Following is a more flexible example
|
||||||
|
|
||||||
function indication() {
|
function indication() {
|
||||||
// return something here
|
// return something here
|
||||||
|
|||||||
@@ -18,6 +18,9 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
// omit...
|
||||||
|
|
||||||
<BootstrapTable
|
<BootstrapTable
|
||||||
keyField="id"
|
keyField="id"
|
||||||
data={ products }
|
data={ products }
|
||||||
|
|||||||
@@ -19,8 +19,9 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
import cellEditFactory from 'react-bootstrap-table2-editor';
|
import cellEditFactory from 'react-bootstrap-table2-editor';
|
||||||
// ...
|
|
||||||
const columns = [{
|
const columns = [{
|
||||||
dataField: 'id',
|
dataField: 'id',
|
||||||
text: 'Product ID'
|
text: 'Product ID'
|
||||||
|
|||||||
@@ -23,8 +23,9 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
import cellEditFactory from 'react-bootstrap-table2-editor';
|
import cellEditFactory from 'react-bootstrap-table2-editor';
|
||||||
// ...
|
|
||||||
const columns = [{
|
const columns = [{
|
||||||
dataField: 'id',
|
dataField: 'id',
|
||||||
text: 'Product ID'
|
text: 'Product ID'
|
||||||
|
|||||||
@@ -21,8 +21,9 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
import cellEditFactory from 'react-bootstrap-table2-editor';
|
import cellEditFactory from 'react-bootstrap-table2-editor';
|
||||||
// ...
|
|
||||||
const columns = [{
|
const columns = [{
|
||||||
dataField: 'id',
|
dataField: 'id',
|
||||||
text: 'Product ID'
|
text: 'Product ID'
|
||||||
|
|||||||
@@ -27,8 +27,9 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
import cellEditFactory from 'react-bootstrap-table2-editor';
|
import cellEditFactory from 'react-bootstrap-table2-editor';
|
||||||
// ...
|
|
||||||
const columns = [{
|
const columns = [{
|
||||||
dataField: 'id',
|
dataField: 'id',
|
||||||
text: 'Product ID'
|
text: 'Product ID'
|
||||||
|
|||||||
@@ -34,8 +34,9 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
import cellEditFactory from 'react-bootstrap-table2-editor';
|
import cellEditFactory from 'react-bootstrap-table2-editor';
|
||||||
// ...
|
|
||||||
const columns = [{
|
const columns = [{
|
||||||
dataField: 'id',
|
dataField: 'id',
|
||||||
text: 'Product ID'
|
text: 'Product ID'
|
||||||
|
|||||||
@@ -21,8 +21,9 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
import cellEditFactory from 'react-bootstrap-table2-editor';
|
import cellEditFactory from 'react-bootstrap-table2-editor';
|
||||||
// ...
|
|
||||||
const columns = [{
|
const columns = [{
|
||||||
dataField: 'id',
|
dataField: 'id',
|
||||||
text: 'Product ID'
|
text: 'Product ID'
|
||||||
@@ -45,6 +46,7 @@ const columns = [{
|
|||||||
|
|
||||||
export default () => (
|
export default () => (
|
||||||
<div>
|
<div>
|
||||||
|
<h3>Only Product Price is bigger than 2101 is editable</h3>
|
||||||
<BootstrapTable
|
<BootstrapTable
|
||||||
keyField="id"
|
keyField="id"
|
||||||
data={ products }
|
data={ products }
|
||||||
|
|||||||
64
packages/react-bootstrap-table2-example/examples/cell-edit/checkbox-editor-table.js
vendored
Normal file
64
packages/react-bootstrap-table2-example/examples/cell-edit/checkbox-editor-table.js
vendored
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
/* eslint react/prefer-stateless-function: 0 */
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import cellEditFactory, { Type } from 'react-bootstrap-table2-editor';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { todosGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const todos = todosGenerator();
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Todo ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'todo',
|
||||||
|
text: 'Todo Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'done',
|
||||||
|
text: 'Done',
|
||||||
|
editor: {
|
||||||
|
type: Type.CHECKBOX,
|
||||||
|
value: 'Y:N'
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import cellEditFactory, { Type } from 'react-bootstrap-table2-editor';
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Todo ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'todo',
|
||||||
|
text: 'Todo Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'done',
|
||||||
|
text: 'Done',
|
||||||
|
editor: {
|
||||||
|
type: Type.CHECKBOX,
|
||||||
|
value: 'Y:N'
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ todos }
|
||||||
|
columns={ columns }
|
||||||
|
cellEdit={ cellEditFactory({ mode: 'click', blurToSave: true }) }
|
||||||
|
/>
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<h3>Dropdown Editor</h3>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ todos }
|
||||||
|
columns={ columns }
|
||||||
|
cellEdit={ cellEditFactory({ mode: 'click', blurToSave: true }) }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
@@ -20,8 +20,9 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
import cellEditFactory from 'react-bootstrap-table2-editor';
|
import cellEditFactory from 'react-bootstrap-table2-editor';
|
||||||
// ...
|
|
||||||
const columns = [{
|
const columns = [{
|
||||||
dataField: 'id',
|
dataField: 'id',
|
||||||
text: 'Product ID'
|
text: 'Product ID'
|
||||||
@@ -43,6 +44,7 @@ const columns = [{
|
|||||||
|
|
||||||
export default () => (
|
export default () => (
|
||||||
<div>
|
<div>
|
||||||
|
<h3>Click to edit cell</h3>
|
||||||
<BootstrapTable
|
<BootstrapTable
|
||||||
keyField="id"
|
keyField="id"
|
||||||
data={ products }
|
data={ products }
|
||||||
|
|||||||
@@ -20,8 +20,9 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
import cellEditFactory from 'react-bootstrap-table2-editor';
|
import cellEditFactory from 'react-bootstrap-table2-editor';
|
||||||
// ...
|
|
||||||
const columns = [{
|
const columns = [{
|
||||||
dataField: 'id',
|
dataField: 'id',
|
||||||
text: 'Product ID'
|
text: 'Product ID'
|
||||||
@@ -48,6 +49,7 @@ const columns = [{
|
|||||||
|
|
||||||
export default () => (
|
export default () => (
|
||||||
<div>
|
<div>
|
||||||
|
<h3>Product Name is non editable</h3>
|
||||||
<BootstrapTable
|
<BootstrapTable
|
||||||
keyField="id"
|
keyField="id"
|
||||||
data={ products }
|
data={ products }
|
||||||
|
|||||||
130
packages/react-bootstrap-table2-example/examples/cell-edit/custom-editor-table.js
vendored
Normal file
130
packages/react-bootstrap-table2-example/examples/cell-edit/custom-editor-table.js
vendored
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
/* eslint react/prefer-stateless-function: 0 */
|
||||||
|
/* eslint no-return-assign: 0 */
|
||||||
|
/* eslint no-unused-vars: 0 */
|
||||||
|
import React from 'react';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import cellEditFactory from 'react-bootstrap-table2-editor';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsQualityGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsQualityGenerator();
|
||||||
|
|
||||||
|
class QualityRanger extends React.Component {
|
||||||
|
static propTypes = {
|
||||||
|
value: PropTypes.number,
|
||||||
|
onUpdate: PropTypes.func.isRequired
|
||||||
|
}
|
||||||
|
static defaultProps = {
|
||||||
|
value: 0
|
||||||
|
}
|
||||||
|
getValue() {
|
||||||
|
return parseInt(this.range.value, 10);
|
||||||
|
}
|
||||||
|
render() {
|
||||||
|
const { value, onUpdate, ...rest } = this.props;
|
||||||
|
return [
|
||||||
|
<input
|
||||||
|
{ ...rest }
|
||||||
|
key="range"
|
||||||
|
ref={ node => this.range = node }
|
||||||
|
type="range"
|
||||||
|
min="0"
|
||||||
|
max="100"
|
||||||
|
/>,
|
||||||
|
<button
|
||||||
|
key="submit"
|
||||||
|
className="btn btn-default"
|
||||||
|
onClick={ () => onUpdate(this.getValue()) }
|
||||||
|
>
|
||||||
|
done
|
||||||
|
</button>
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'quality',
|
||||||
|
text: 'Product Quality',
|
||||||
|
editorRenderer: (editorProps, value, row, column, rowIndex, columnIndex) => (
|
||||||
|
<QualityRanger { ...editorProps } value={ value } />
|
||||||
|
)
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import cellEditFactory from 'react-bootstrap-table2-editor';
|
||||||
|
|
||||||
|
class QualityRanger extends React.Component {
|
||||||
|
static propTypes = {
|
||||||
|
value: PropTypes.number,
|
||||||
|
onUpdate: PropTypes.func.isRequired
|
||||||
|
}
|
||||||
|
static defaultProps = {
|
||||||
|
value: 0
|
||||||
|
}
|
||||||
|
getValue() {
|
||||||
|
return parseInt(this.range.value, 10);
|
||||||
|
}
|
||||||
|
render() {
|
||||||
|
const { value, onUpdate, ...rest } = this.props;
|
||||||
|
return [
|
||||||
|
<input
|
||||||
|
{ ...rest }
|
||||||
|
key="range"
|
||||||
|
ref={ node => this.range = node }
|
||||||
|
type="range"
|
||||||
|
min="0"
|
||||||
|
max="100"
|
||||||
|
/>,
|
||||||
|
<button
|
||||||
|
key="submit"
|
||||||
|
className="btn btn-default"
|
||||||
|
onClick={ () => onUpdate(this.getValue()) }
|
||||||
|
>
|
||||||
|
done
|
||||||
|
</button>
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'quality',
|
||||||
|
text: 'Product Quality',
|
||||||
|
editorRenderer: (editorProps, value, row, rowIndex, columnIndex) => (
|
||||||
|
<QualityRanger { ...editorProps } value={ value } />
|
||||||
|
)
|
||||||
|
}];
|
||||||
|
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
cellEdit={ cellEditFactory({ mode: 'click', blurToSave: true }) }
|
||||||
|
/>
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<h3>Dropdown Editor</h3>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
cellEdit={ cellEditFactory({ mode: 'click', blurToSave: true }) }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
77
packages/react-bootstrap-table2-example/examples/cell-edit/date-editor-table.js
vendored
Normal file
77
packages/react-bootstrap-table2-example/examples/cell-edit/date-editor-table.js
vendored
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
/* eslint prefer-template: 0 */
|
||||||
|
/* eslint react/prefer-stateless-function: 0 */
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import cellEditFactory, { Type } from 'react-bootstrap-table2-editor';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { stockGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const stocks = stockGenerator();
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'inStockDate',
|
||||||
|
text: 'Stock Date',
|
||||||
|
formatter: (cell) => {
|
||||||
|
let dateObj = cell;
|
||||||
|
if (typeof cell !== 'object') {
|
||||||
|
dateObj = new Date(cell);
|
||||||
|
}
|
||||||
|
return `${('0' + dateObj.getDate()).slice(-2)}/${('0' + (dateObj.getMonth() + 1)).slice(-2)}/${dateObj.getFullYear()}`;
|
||||||
|
},
|
||||||
|
editor: {
|
||||||
|
type: Type.DATE
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import cellEditFactory, { Type } from 'react-bootstrap-table2-editor';
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'inStockDate',
|
||||||
|
text: 'Stock Date',
|
||||||
|
formatter: (cell) => {
|
||||||
|
let dateObj = cell;
|
||||||
|
if (typeof cell !== 'object') {
|
||||||
|
dateObj = new Date(cell);
|
||||||
|
}
|
||||||
|
return \`$\{('0' + dateObj.getDate()).slice(-2)}/$\{('0' + (dateObj.getMonth() + 1)).slice(-2)}/$\{dateObj.getFullYear()}\`;
|
||||||
|
},
|
||||||
|
editor: {
|
||||||
|
type: Type.DATE
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ stocks }
|
||||||
|
columns={ columns }
|
||||||
|
cellEdit={ cellEditFactory({ mode: 'click', blurToSave: true }) }
|
||||||
|
/>
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<h3>Dropdown Editor</h3>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ stocks }
|
||||||
|
columns={ columns }
|
||||||
|
cellEdit={ cellEditFactory({ mode: 'click', blurToSave: true }) }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
@@ -19,8 +19,9 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
import cellEditFactory from 'react-bootstrap-table2-editor';
|
import cellEditFactory from 'react-bootstrap-table2-editor';
|
||||||
// ...
|
|
||||||
const columns = [{
|
const columns = [{
|
||||||
dataField: 'id',
|
dataField: 'id',
|
||||||
text: 'Product ID'
|
text: 'Product ID'
|
||||||
@@ -42,6 +43,7 @@ const columns = [{
|
|||||||
|
|
||||||
export default () => (
|
export default () => (
|
||||||
<div>
|
<div>
|
||||||
|
<h3>Double click to edit cell</h3>
|
||||||
<BootstrapTable
|
<BootstrapTable
|
||||||
keyField="id"
|
keyField="id"
|
||||||
data={ products }
|
data={ products }
|
||||||
|
|||||||
100
packages/react-bootstrap-table2-example/examples/cell-edit/dropdown-editor-table.js
vendored
Normal file
100
packages/react-bootstrap-table2-example/examples/cell-edit/dropdown-editor-table.js
vendored
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
/* eslint react/prefer-stateless-function: 0 */
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import cellEditFactory, { Type } from 'react-bootstrap-table2-editor';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { jobsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const jobs = jobsGenerator();
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Job ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Job Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'owner',
|
||||||
|
text: 'Job Owner'
|
||||||
|
}, {
|
||||||
|
dataField: 'type',
|
||||||
|
text: 'Job Type',
|
||||||
|
editor: {
|
||||||
|
type: Type.SELECT,
|
||||||
|
options: [{
|
||||||
|
value: 'A',
|
||||||
|
label: 'A'
|
||||||
|
}, {
|
||||||
|
value: 'B',
|
||||||
|
label: 'B'
|
||||||
|
}, {
|
||||||
|
value: 'C',
|
||||||
|
label: 'C'
|
||||||
|
}, {
|
||||||
|
value: 'D',
|
||||||
|
label: 'D'
|
||||||
|
}, {
|
||||||
|
value: 'E',
|
||||||
|
label: 'E'
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import cellEditFactory, { Type } from 'react-bootstrap-table2-editor';
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Job ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Job Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'owner',
|
||||||
|
text: 'Job Owner'
|
||||||
|
}, {
|
||||||
|
dataField: 'type',
|
||||||
|
text: 'Job Type',
|
||||||
|
editor: {
|
||||||
|
type: Type.SELECT,
|
||||||
|
options: [{
|
||||||
|
value: 'A',
|
||||||
|
label: 'A'
|
||||||
|
}, {
|
||||||
|
value: 'B',
|
||||||
|
label: 'B'
|
||||||
|
}, {
|
||||||
|
value: 'C',
|
||||||
|
label: 'C'
|
||||||
|
}, {
|
||||||
|
value: 'D',
|
||||||
|
label: 'D'
|
||||||
|
}, {
|
||||||
|
value: 'E',
|
||||||
|
label: 'E'
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ jobs }
|
||||||
|
columns={ columns }
|
||||||
|
cellEdit={ cellEditFactory({ mode: 'click', blurToSave: true }) }
|
||||||
|
/>
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<h3>Dropdown Editor</h3>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ jobs }
|
||||||
|
columns={ columns }
|
||||||
|
cellEdit={ cellEditFactory({ mode: 'click', blurToSave: true }) }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
61
packages/react-bootstrap-table2-example/examples/cell-edit/editor-class-table.js
vendored
Normal file
61
packages/react-bootstrap-table2-example/examples/cell-edit/editor-class-table.js
vendored
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
/* eslint no-unused-vars: 0 */
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import cellEditFactory from 'react-bootstrap-table2-editor';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsGenerator();
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name',
|
||||||
|
editorClasses: 'editing-name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price',
|
||||||
|
editorClasses: (cell, row, rowIndex, colIndex) =>
|
||||||
|
(cell > 2101 ? 'editing-price-bigger-than-2101' : 'editing-price-small-than-2101')
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import cellEditFactory from 'react-bootstrap-table2-editor';
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name',
|
||||||
|
editorClasses: 'editing-name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price',
|
||||||
|
editorClasses: (cell, row, rowIndex, colIndex) =>
|
||||||
|
(cell > 2101 ? 'editing-price-bigger-than-2101' : 'editing-price-small-than-2101')
|
||||||
|
}];
|
||||||
|
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
cellEdit={ cellEditFactory({ mode: 'click' }) }
|
||||||
|
/>
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
cellEdit={ cellEditFactory({ mode: 'click' }) }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
69
packages/react-bootstrap-table2-example/examples/cell-edit/editor-style-table.js
vendored
Normal file
69
packages/react-bootstrap-table2-example/examples/cell-edit/editor-style-table.js
vendored
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
/* eslint no-unused-vars: 0 */
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import cellEditFactory from 'react-bootstrap-table2-editor';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsGenerator();
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name',
|
||||||
|
editorStyle: {
|
||||||
|
backgroundColor: '#20B2AA'
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price',
|
||||||
|
editorStyle: (cell, row, rowIndex, colIndex) => {
|
||||||
|
const backgroundColor = cell > 2101 ? '#00BFFF' : '#00FFFF';
|
||||||
|
return { backgroundColor };
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import cellEditFactory from 'react-bootstrap-table2-editor';
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name',
|
||||||
|
editorStyle: {
|
||||||
|
backgroundColor: '#20B2AA'
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price',
|
||||||
|
editorStyle: (cell, row, rowIndex, colIndex) => {
|
||||||
|
const backgroundColor = cell > 2101 ? '#00BFFF' : '#00FFFF';
|
||||||
|
return { backgroundColor };
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
cellEdit={ cellEditFactory({ mode: 'click' }) }
|
||||||
|
/>
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
cellEdit={ cellEditFactory({ mode: 'click' }) }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
@@ -19,8 +19,9 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
import cellEditFactory from 'react-bootstrap-table2-editor';
|
import cellEditFactory from 'react-bootstrap-table2-editor';
|
||||||
// ...
|
|
||||||
const columns = [{
|
const columns = [{
|
||||||
dataField: 'id',
|
dataField: 'id',
|
||||||
text: 'Product ID'
|
text: 'Product ID'
|
||||||
@@ -45,6 +46,7 @@ const columns = [{
|
|||||||
`;
|
`;
|
||||||
export default () => (
|
export default () => (
|
||||||
<div>
|
<div>
|
||||||
|
<h3>Product ID: 0, 3 is non editable</h3>
|
||||||
<BootstrapTable
|
<BootstrapTable
|
||||||
keyField="id"
|
keyField="id"
|
||||||
data={ products }
|
data={ products }
|
||||||
|
|||||||
68
packages/react-bootstrap-table2-example/examples/cell-edit/textarea-editor-table.js
vendored
Normal file
68
packages/react-bootstrap-table2-example/examples/cell-edit/textarea-editor-table.js
vendored
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
/* eslint react/prefer-stateless-function: 0 */
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import cellEditFactory, { Type } from 'react-bootstrap-table2-editor';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { jobsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const jobs = jobsGenerator();
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Job ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Job Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'owner',
|
||||||
|
text: 'Job Owner'
|
||||||
|
}, {
|
||||||
|
dataField: 'type',
|
||||||
|
text: 'Job Type',
|
||||||
|
editor: {
|
||||||
|
type: Type.TEXTAREA
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import cellEditFactory, { Type } from 'react-bootstrap-table2-editor';
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Job ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Job Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'owner',
|
||||||
|
text: 'Job Owner'
|
||||||
|
}, {
|
||||||
|
dataField: 'type',
|
||||||
|
text: 'Job Type',
|
||||||
|
editor: {
|
||||||
|
type: Type.TEXTAREA
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ jobs }
|
||||||
|
columns={ columns }
|
||||||
|
cellEdit={ cellEditFactory({ mode: 'click', blurToSave: true }) }
|
||||||
|
/>
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<h3>Dropdown Editor</h3>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ jobs }
|
||||||
|
columns={ columns }
|
||||||
|
cellEdit={ cellEditFactory({ mode: 'click', blurToSave: true }) }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
184
packages/react-bootstrap-table2-example/examples/column-filter/advance-custom-filter.js
vendored
Normal file
184
packages/react-bootstrap-table2-example/examples/column-filter/advance-custom-filter.js
vendored
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
/* eslint no-return-assign: 0 */
|
||||||
|
import React from 'react';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { textFilter, customFilter, Comparator, FILTER_TYPES } from 'react-bootstrap-table2-filter';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsGenerator(8);
|
||||||
|
|
||||||
|
class PriceFilter extends React.Component {
|
||||||
|
static propTypes = {
|
||||||
|
column: PropTypes.object.isRequired,
|
||||||
|
onFilter: PropTypes.func.isRequired
|
||||||
|
}
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
this.filter = this.filter.bind(this);
|
||||||
|
this.getValue = this.getValue.bind(this);
|
||||||
|
this.onChange = this.onChange.bind(this);
|
||||||
|
this.state = { value: 2100 };
|
||||||
|
}
|
||||||
|
onChange(e) {
|
||||||
|
this.setState({ value: e.target.value });
|
||||||
|
}
|
||||||
|
getValue() {
|
||||||
|
return parseInt(this.range.value, 10);
|
||||||
|
}
|
||||||
|
filter() {
|
||||||
|
this.props.onFilter({
|
||||||
|
number: this.getValue(),
|
||||||
|
comparator: this.select.value
|
||||||
|
});
|
||||||
|
}
|
||||||
|
render() {
|
||||||
|
return [
|
||||||
|
<input
|
||||||
|
key="range"
|
||||||
|
ref={ node => this.range = node }
|
||||||
|
type="range"
|
||||||
|
min="2100"
|
||||||
|
max="2110"
|
||||||
|
onChange={ this.onChange }
|
||||||
|
/>,
|
||||||
|
<p
|
||||||
|
key="show"
|
||||||
|
ref={ node => this.showValue = node }
|
||||||
|
style={ { textAlign: 'center' } }
|
||||||
|
>
|
||||||
|
{ this.state.value }
|
||||||
|
</p>,
|
||||||
|
<select
|
||||||
|
key="select"
|
||||||
|
ref={ node => this.select = node }
|
||||||
|
className="form-control"
|
||||||
|
>
|
||||||
|
<option value={ Comparator.GT }>></option>
|
||||||
|
<option value={ Comparator.EQ }>=</option>
|
||||||
|
<option value={ Comparator.LT }><</option>
|
||||||
|
</select>,
|
||||||
|
<button
|
||||||
|
key="submit"
|
||||||
|
className="btn btn-warning"
|
||||||
|
onClick={ this.filter }
|
||||||
|
>
|
||||||
|
{ `Filter ${this.props.column.text}` }
|
||||||
|
</button>
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name',
|
||||||
|
filter: textFilter()
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price',
|
||||||
|
filter: customFilter({
|
||||||
|
type: FILTER_TYPES.NUMBER // ask react-bootstrap-table to filter data as number
|
||||||
|
}),
|
||||||
|
filterRenderer: (onFilter, column) =>
|
||||||
|
<PriceFilter onFilter={ onFilter } column={ column } />
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { textFilter, customFilter, Comparator, FILTER_TYPES } from 'react-bootstrap-table2-filter';
|
||||||
|
|
||||||
|
class PriceFilter extends React.Component {
|
||||||
|
static propTypes = {
|
||||||
|
column: PropTypes.object.isRequired,
|
||||||
|
onFilter: PropTypes.func.isRequired
|
||||||
|
}
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
this.filter = this.filter.bind(this);
|
||||||
|
this.getValue = this.getValue.bind(this);
|
||||||
|
this.onChange = this.onChange.bind(this);
|
||||||
|
this.state = { value: 2100 };
|
||||||
|
}
|
||||||
|
onChange(e) {
|
||||||
|
this.setState({ value: e.target.value });
|
||||||
|
}
|
||||||
|
getValue() {
|
||||||
|
return parseInt(this.range.value, 10);
|
||||||
|
}
|
||||||
|
filter() {
|
||||||
|
this.props.onFilter({
|
||||||
|
number: this.getValue(),
|
||||||
|
comparator: this.select.value
|
||||||
|
});
|
||||||
|
}
|
||||||
|
render() {
|
||||||
|
return [
|
||||||
|
<input
|
||||||
|
key="range"
|
||||||
|
ref={ node => this.range = node }
|
||||||
|
type="range"
|
||||||
|
min="2100"
|
||||||
|
max="2110"
|
||||||
|
onChange={ this.onChange }
|
||||||
|
/>,
|
||||||
|
<p
|
||||||
|
key="show"
|
||||||
|
ref={ node => this.showValue = node }
|
||||||
|
style={ { textAlign: 'center' } }
|
||||||
|
>
|
||||||
|
{ this.state.value }
|
||||||
|
</p>,
|
||||||
|
<select
|
||||||
|
key="select"
|
||||||
|
ref={ node => this.select = node }
|
||||||
|
className="form-control"
|
||||||
|
>
|
||||||
|
<option value={ Comparator.GT }>></option>
|
||||||
|
<option value={ Comparator.EQ }>=</option>
|
||||||
|
<option value={ Comparator.LT }><</option>
|
||||||
|
</select>,
|
||||||
|
<button
|
||||||
|
key="submit"
|
||||||
|
className="btn btn-warning"
|
||||||
|
onClick={ this.filter }
|
||||||
|
>
|
||||||
|
{ \`Filter $\{this.props.column.text}\` }
|
||||||
|
</button>
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name',
|
||||||
|
filter: textFilter()
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price',
|
||||||
|
filter: customFilter({
|
||||||
|
type: FILTER_TYPES.NUMBER // ask react-bootstrap-table to filter data as number
|
||||||
|
}),
|
||||||
|
filterRenderer: (onFilter, column) =>
|
||||||
|
<PriceFilter onFilter={ onFilter } column={ column } />
|
||||||
|
}];
|
||||||
|
|
||||||
|
<BootstrapTable keyField='id' data={ products } columns={ columns } filter={ filterFactory() } />
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
filter={ filterFactory() }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
86
packages/react-bootstrap-table2-example/examples/column-filter/clear-all-filters.js
vendored
Normal file
86
packages/react-bootstrap-table2-example/examples/column-filter/clear-all-filters.js
vendored
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { textFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsGenerator(8);
|
||||||
|
|
||||||
|
let nameFilter;
|
||||||
|
let priceFilter;
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name',
|
||||||
|
filter: textFilter({
|
||||||
|
getFilter: (filter) => {
|
||||||
|
nameFilter = filter;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price',
|
||||||
|
filter: textFilter({
|
||||||
|
getFilter: (filter) => {
|
||||||
|
priceFilter = filter;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
const handleClick = () => {
|
||||||
|
nameFilter('');
|
||||||
|
priceFilter('');
|
||||||
|
};
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { textFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
|
||||||
|
let nameFilter;
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name',
|
||||||
|
filter: textFilter({
|
||||||
|
getFilter: (filter) => {
|
||||||
|
// nameFilter was assigned once the component has been mounted.
|
||||||
|
nameFilter = filter;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price',
|
||||||
|
filter: textFilter()
|
||||||
|
}];
|
||||||
|
|
||||||
|
const handleClick = () => {
|
||||||
|
nameFilter(0);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<button className="btn btn-lg btn-primary" onClick={ handleClick }> filter columns by 0 </button>
|
||||||
|
|
||||||
|
<BootstrapTable keyField='id' data={ products } columns={ columns } filter={ filterFactory() } />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<button className="btn btn-lg btn-primary" onClick={ handleClick }> Clear all filters </button>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
filter={ filterFactory() }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
78
packages/react-bootstrap-table2-example/examples/column-filter/custom-date-filter.js
vendored
Normal file
78
packages/react-bootstrap-table2-example/examples/column-filter/custom-date-filter.js
vendored
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { dateFilter, Comparator } from 'react-bootstrap-table2-filter';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { stockGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const stocks = stockGenerator(8);
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'inStockDate',
|
||||||
|
text: 'InStock Date',
|
||||||
|
formatter: cell => cell.toString(),
|
||||||
|
filter: dateFilter({
|
||||||
|
delay: 400,
|
||||||
|
placeholder: 'custom placeholder',
|
||||||
|
withoutEmptyComparatorOption: true,
|
||||||
|
comparators: [Comparator.EQ, Comparator.GT, Comparator.LT],
|
||||||
|
style: { display: 'inline-grid' },
|
||||||
|
className: 'custom-datefilter-class',
|
||||||
|
comparatorStyle: { backgroundColor: 'antiquewhite' },
|
||||||
|
comparatorClassName: 'custom-comparator-class',
|
||||||
|
dateStyle: { backgroundColor: 'cadetblue', margin: '0px' },
|
||||||
|
dateClassName: 'custom-date-class'
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { dateFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'inStockDate',
|
||||||
|
text: 'InStock Date',
|
||||||
|
filter: dateFilter({
|
||||||
|
delay: 400,
|
||||||
|
placeholder: 'custom placeholder',
|
||||||
|
withoutEmptyComparatorOption: true,
|
||||||
|
comparators: [Comparator.EQ, Comparator.GT, Comparator.LT],
|
||||||
|
style: { display: 'inline-grid' },
|
||||||
|
className: 'custom-datefilter-class',
|
||||||
|
comparatorStyle: { backgroundColor: 'antiquewhite' },
|
||||||
|
comparatorClassName: 'custom-comparator-class',
|
||||||
|
dateStyle: { backgroundColor: 'cadetblue', margin: '0px' },
|
||||||
|
dateClassName: 'custom-date-class'
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ stocks }
|
||||||
|
columns={ columns }
|
||||||
|
filter={ filterFactory() }
|
||||||
|
/>
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ stocks }
|
||||||
|
columns={ columns }
|
||||||
|
filter={ filterFactory() }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
@@ -3,9 +3,9 @@ import React from 'react';
|
|||||||
import BootstrapTable from 'react-bootstrap-table-next';
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
import filterFactory, { textFilter } from 'react-bootstrap-table2-filter';
|
import filterFactory, { textFilter } from 'react-bootstrap-table2-filter';
|
||||||
import Code from 'components/common/code-block';
|
import Code from 'components/common/code-block';
|
||||||
import { jobsGenerator } from 'utils/common';
|
import { jobsGenerator1 } from 'utils/common';
|
||||||
|
|
||||||
const jobs = jobsGenerator(5);
|
const jobs = jobsGenerator1(5);
|
||||||
|
|
||||||
const owners = ['Allen', 'Bob', 'Cat'];
|
const owners = ['Allen', 'Bob', 'Cat'];
|
||||||
const types = ['Cloud Service', 'Message Service', 'Add Service', 'Edit Service', 'Money'];
|
const types = ['Cloud Service', 'Message Service', 'Add Service', 'Edit Service', 'Money'];
|
||||||
@@ -32,6 +32,7 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
import filterFactory, { textFilter } from 'react-bootstrap-table2-filter';
|
import filterFactory, { textFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
|
||||||
const owners = ['Allen', 'Bob', 'Cat'];
|
const owners = ['Allen', 'Bob', 'Cat'];
|
||||||
|
|||||||
128
packages/react-bootstrap-table2-example/examples/column-filter/custom-filter.js
vendored
Normal file
128
packages/react-bootstrap-table2-example/examples/column-filter/custom-filter.js
vendored
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
/* eslint no-return-assign: 0 */
|
||||||
|
import React from 'react';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { textFilter, customFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsGenerator(8);
|
||||||
|
|
||||||
|
class PriceFilter extends React.Component {
|
||||||
|
static propTypes = {
|
||||||
|
column: PropTypes.object.isRequired,
|
||||||
|
onFilter: PropTypes.func.isRequired
|
||||||
|
}
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
this.filter = this.filter.bind(this);
|
||||||
|
this.getValue = this.getValue.bind(this);
|
||||||
|
}
|
||||||
|
getValue() {
|
||||||
|
return this.input.value;
|
||||||
|
}
|
||||||
|
filter() {
|
||||||
|
this.props.onFilter(this.getValue());
|
||||||
|
}
|
||||||
|
render() {
|
||||||
|
return [
|
||||||
|
<input
|
||||||
|
key="input"
|
||||||
|
ref={ node => this.input = node }
|
||||||
|
type="text"
|
||||||
|
placeholder="Input price"
|
||||||
|
/>,
|
||||||
|
<button
|
||||||
|
key="submit"
|
||||||
|
className="btn btn-warning"
|
||||||
|
onClick={ this.filter }
|
||||||
|
>
|
||||||
|
{ `Find ${this.props.column.text}` }
|
||||||
|
</button>
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name',
|
||||||
|
filter: textFilter()
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price',
|
||||||
|
filter: customFilter(),
|
||||||
|
filterRenderer: (onFilter, column) =>
|
||||||
|
<PriceFilter onFilter={ onFilter } column={ column } />
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { textFilter, customFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
|
||||||
|
class PriceFilter extends React.Component {
|
||||||
|
static propTypes = {
|
||||||
|
column: PropTypes.object.isRequired,
|
||||||
|
onFilter: PropTypes.func.isRequired
|
||||||
|
}
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
this.filter = this.filter.bind(this);
|
||||||
|
this.getValue = this.getValue.bind(this);
|
||||||
|
}
|
||||||
|
getValue() {
|
||||||
|
return this.input.value;
|
||||||
|
}
|
||||||
|
filter() {
|
||||||
|
this.props.onFilter(this.getValue());
|
||||||
|
}
|
||||||
|
render() {
|
||||||
|
return [
|
||||||
|
<input
|
||||||
|
key="input"
|
||||||
|
ref={ node => this.input = node }
|
||||||
|
type="text"
|
||||||
|
placeholder="Input price"
|
||||||
|
/>,
|
||||||
|
<button
|
||||||
|
key="submit"
|
||||||
|
className="btn btn-warning"
|
||||||
|
onClick={ this.filter }
|
||||||
|
>
|
||||||
|
{ \`Filter $\{this.props.column.text}\` }
|
||||||
|
</button>
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name',
|
||||||
|
filter: textFilter()
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price',
|
||||||
|
filter: customFilter(),
|
||||||
|
filterRenderer: (onFilter, column) =>
|
||||||
|
<PriceFilter onFilter={ onFilter } column={ column } />
|
||||||
|
}];
|
||||||
|
|
||||||
|
<BootstrapTable keyField='id' data={ products } columns={ columns } filter={ filterFactory() } />
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
filter={ filterFactory() }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
80
packages/react-bootstrap-table2-example/examples/column-filter/custom-multi-select-filter.js
vendored
Normal file
80
packages/react-bootstrap-table2-example/examples/column-filter/custom-multi-select-filter.js
vendored
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { multiSelectFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsQualityGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsQualityGenerator(6);
|
||||||
|
|
||||||
|
const selectOptions = {
|
||||||
|
0: 'good',
|
||||||
|
1: 'Bad',
|
||||||
|
2: 'unknown'
|
||||||
|
};
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'quality',
|
||||||
|
text: 'Product Quailty',
|
||||||
|
formatter: cell => selectOptions[cell],
|
||||||
|
filter: multiSelectFilter({
|
||||||
|
options: selectOptions,
|
||||||
|
withoutEmptyOption: true,
|
||||||
|
style: {
|
||||||
|
backgroundColor: 'pink'
|
||||||
|
},
|
||||||
|
className: 'test-classname',
|
||||||
|
datamycustomattr: 'datamycustomattr'
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { multiSelectFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
|
||||||
|
const selectOptions = {
|
||||||
|
0: 'good',
|
||||||
|
1: 'Bad',
|
||||||
|
2: 'unknown'
|
||||||
|
};
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'quality',
|
||||||
|
text: 'Product Quailty',
|
||||||
|
formatter: cell => selectOptions[cell],
|
||||||
|
filter: multiSelectFilter({
|
||||||
|
options: selectOptions,
|
||||||
|
withoutEmptyOption: true,
|
||||||
|
style: {
|
||||||
|
backgroundColor: 'pink'
|
||||||
|
},
|
||||||
|
className: 'test-classname',
|
||||||
|
datamycustomattr: 'datamycustomattr'
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
<BootstrapTable keyField='id' data={ products } columns={ columns } filter={ filterFactory() } />
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
filter={ filterFactory() }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
74
packages/react-bootstrap-table2-example/examples/column-filter/custom-number-filter.js
vendored
Normal file
74
packages/react-bootstrap-table2-example/examples/column-filter/custom-number-filter.js
vendored
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { numberFilter, Comparator } from 'react-bootstrap-table2-filter';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsGenerator(8);
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price',
|
||||||
|
filter: numberFilter({
|
||||||
|
options: [2100, 2103, 2105],
|
||||||
|
delay: 600,
|
||||||
|
placeholder: 'custom placeholder',
|
||||||
|
withoutEmptyComparatorOption: true,
|
||||||
|
comparators: [Comparator.EQ, Comparator.GT, Comparator.LT],
|
||||||
|
style: { display: 'inline-grid' },
|
||||||
|
className: 'custom-numberfilter-class',
|
||||||
|
comparatorStyle: { backgroundColor: 'antiquewhite' },
|
||||||
|
comparatorClassName: 'custom-comparator-class',
|
||||||
|
numberStyle: { backgroundColor: 'cadetblue', margin: '0px' },
|
||||||
|
numberClassName: 'custom-number-class'
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { numberFilter, Comparator } from 'react-bootstrap-table2-filter';
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price',
|
||||||
|
filter: numberFilter({
|
||||||
|
options: [2100, 2103, 2105],
|
||||||
|
delay: 600,
|
||||||
|
placeholder: 'custom placeholder',
|
||||||
|
withoutEmptyComparatorOption: true,
|
||||||
|
comparators: [Comparator.EQ, Comparator.GT, Comparator.LT],
|
||||||
|
style: { display: 'inline-grid' },
|
||||||
|
className: 'custom-numberfilter-class',
|
||||||
|
comparatorStyle: { backgroundColor: 'antiquewhite' },
|
||||||
|
comparatorClassName: 'custom-comparator-class',
|
||||||
|
numberStyle: { backgroundColor: 'cadetblue', margin: '0px' },
|
||||||
|
numberClassName: 'custom-number-class'
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
<BootstrapTable keyField='id' data={ products } columns={ columns } filter={ filterFactory() } />
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
filter={ filterFactory() }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
80
packages/react-bootstrap-table2-example/examples/column-filter/custom-select-filter.js
vendored
Normal file
80
packages/react-bootstrap-table2-example/examples/column-filter/custom-select-filter.js
vendored
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { selectFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsQualityGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsQualityGenerator(6);
|
||||||
|
|
||||||
|
const selectOptions = {
|
||||||
|
0: 'good',
|
||||||
|
1: 'Bad',
|
||||||
|
2: 'unknown'
|
||||||
|
};
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'quality',
|
||||||
|
text: 'Product Quailty',
|
||||||
|
formatter: cell => selectOptions[cell],
|
||||||
|
filter: selectFilter({
|
||||||
|
options: selectOptions,
|
||||||
|
withoutEmptyOption: true,
|
||||||
|
style: {
|
||||||
|
backgroundColor: 'pink'
|
||||||
|
},
|
||||||
|
className: 'test-classname',
|
||||||
|
datamycustomattr: 'datamycustomattr'
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { selectFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
|
||||||
|
const selectOptions = {
|
||||||
|
0: 'good',
|
||||||
|
1: 'Bad',
|
||||||
|
2: 'unknown'
|
||||||
|
};
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'quality',
|
||||||
|
text: 'Product Quailty',
|
||||||
|
formatter: cell => selectOptions[cell],
|
||||||
|
filter: selectFilter({
|
||||||
|
options: selectOptions,
|
||||||
|
withoutEmptyOption: true,
|
||||||
|
style: {
|
||||||
|
backgroundColor: 'pink'
|
||||||
|
},
|
||||||
|
className: 'test-classname',
|
||||||
|
datamycustomattr: 'datamycustomattr'
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
<BootstrapTable keyField='id' data={ products } columns={ columns } filter={ filterFactory() } />
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
filter={ filterFactory() }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
@@ -29,6 +29,7 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
import filterFactory, { textFilter } from 'react-bootstrap-table2-filter';
|
import filterFactory, { textFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
|
||||||
const columns = [{
|
const columns = [{
|
||||||
|
|||||||
60
packages/react-bootstrap-table2-example/examples/column-filter/date-filter-default-value.js
vendored
Normal file
60
packages/react-bootstrap-table2-example/examples/column-filter/date-filter-default-value.js
vendored
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { dateFilter, Comparator } from 'react-bootstrap-table2-filter';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { stockGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const stocks = stockGenerator(8);
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'inStockDate',
|
||||||
|
text: 'InStock Date',
|
||||||
|
formatter: cell => cell.toString(),
|
||||||
|
filter: dateFilter({
|
||||||
|
defaultValue: { date: new Date(2018, 0, 1), comparator: Comparator.GT }
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { dateFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'inStockDate',
|
||||||
|
text: 'InStock Date',
|
||||||
|
filter: dateFilter({
|
||||||
|
defaultValue: { date: new Date(2018, 0, 1), comparator: Comparator.GT }
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ stocks }
|
||||||
|
columns={ columns }
|
||||||
|
filter={ filterFactory() }
|
||||||
|
/>
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ stocks }
|
||||||
|
columns={ columns }
|
||||||
|
filter={ filterFactory() }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
56
packages/react-bootstrap-table2-example/examples/column-filter/date-filter.js
vendored
Normal file
56
packages/react-bootstrap-table2-example/examples/column-filter/date-filter.js
vendored
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { dateFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { stockGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const stocks = stockGenerator(8);
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'inStockDate',
|
||||||
|
text: 'InStock Date',
|
||||||
|
formatter: cell => cell.toString(),
|
||||||
|
filter: dateFilter()
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { dateFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'inStockDate',
|
||||||
|
text: 'InStock Date',
|
||||||
|
filter: dateFilter()
|
||||||
|
}];
|
||||||
|
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ stocks }
|
||||||
|
columns={ columns }
|
||||||
|
filter={ filterFactory() }
|
||||||
|
/>
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ stocks }
|
||||||
|
columns={ columns }
|
||||||
|
filter={ filterFactory() }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { multiSelectFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsQualityGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsQualityGenerator(6);
|
||||||
|
|
||||||
|
const selectOptions = {
|
||||||
|
0: 'good',
|
||||||
|
1: 'Bad',
|
||||||
|
2: 'unknown'
|
||||||
|
};
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'quality',
|
||||||
|
text: 'Product Quailty',
|
||||||
|
formatter: cell => selectOptions[cell],
|
||||||
|
filter: multiSelectFilter({
|
||||||
|
options: selectOptions,
|
||||||
|
defaultValue: [0, 2]
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { multiSelectFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
|
||||||
|
const selectOptions = {
|
||||||
|
0: 'good',
|
||||||
|
1: 'Bad',
|
||||||
|
2: 'unknown'
|
||||||
|
};
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'quality',
|
||||||
|
text: 'Product Quailty',
|
||||||
|
formatter: cell => selectOptions[cell],
|
||||||
|
filter: multiSelectFilter({
|
||||||
|
options: selectOptions,
|
||||||
|
defaultValue: [0, 2]
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
<BootstrapTable keyField='id' data={ products } columns={ columns } filter={ filterFactory() } />
|
||||||
|
`;
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
filter={ filterFactory() }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
67
packages/react-bootstrap-table2-example/examples/column-filter/multi-select-filter.js
vendored
Normal file
67
packages/react-bootstrap-table2-example/examples/column-filter/multi-select-filter.js
vendored
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { multiSelectFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsQualityGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsQualityGenerator(6);
|
||||||
|
|
||||||
|
const selectOptions = {
|
||||||
|
0: 'good',
|
||||||
|
1: 'Bad',
|
||||||
|
2: 'unknown'
|
||||||
|
};
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'quality',
|
||||||
|
text: 'Product Quailty',
|
||||||
|
formatter: cell => selectOptions[cell],
|
||||||
|
filter: multiSelectFilter({
|
||||||
|
options: selectOptions
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { multiSelectFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
|
||||||
|
const selectOptions = {
|
||||||
|
0: 'good',
|
||||||
|
1: 'Bad',
|
||||||
|
2: 'unknown'
|
||||||
|
};
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'quality',
|
||||||
|
text: 'Product Quailty',
|
||||||
|
formatter: cell => selectOptions[cell],
|
||||||
|
filter: multiSelectFilter({
|
||||||
|
options: selectOptions
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
<BootstrapTable keyField='id' data={ products } columns={ columns } filter={ filterFactory() } />
|
||||||
|
`;
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
filter={ filterFactory() }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
54
packages/react-bootstrap-table2-example/examples/column-filter/number-filter-default-value.js
vendored
Normal file
54
packages/react-bootstrap-table2-example/examples/column-filter/number-filter-default-value.js
vendored
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { numberFilter, Comparator } from 'react-bootstrap-table2-filter';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsGenerator(8);
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price',
|
||||||
|
filter: numberFilter({
|
||||||
|
defaultValue: { number: 2103, comparator: Comparator.GT }
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { numberFilter, Comparator } from 'react-bootstrap-table2-filter';
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price',
|
||||||
|
filter: numberFilter({
|
||||||
|
defaultValue: { number: 2103, comparator: Comparator.GT }
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
<BootstrapTable keyField='id' data={ products } columns={ columns } filter={ filterFactory() } />
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
filter={ filterFactory() }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
50
packages/react-bootstrap-table2-example/examples/column-filter/number-filter.js
vendored
Normal file
50
packages/react-bootstrap-table2-example/examples/column-filter/number-filter.js
vendored
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { numberFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsGenerator(8);
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price',
|
||||||
|
filter: numberFilter()
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { numberFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price',
|
||||||
|
filter: numberFilter()
|
||||||
|
}];
|
||||||
|
|
||||||
|
<BootstrapTable keyField='id' data={ products } columns={ columns } filter={ filterFactory() } />
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
filter={ filterFactory() }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
86
packages/react-bootstrap-table2-example/examples/column-filter/programmatically-date-filter.js
vendored
Normal file
86
packages/react-bootstrap-table2-example/examples/column-filter/programmatically-date-filter.js
vendored
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { dateFilter, Comparator } from 'react-bootstrap-table2-filter';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { stockGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const stocks = stockGenerator(8);
|
||||||
|
|
||||||
|
let inStockDateFilter;
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'inStockDate',
|
||||||
|
text: 'InStock Date',
|
||||||
|
formatter: cell => cell.toString(),
|
||||||
|
filter: dateFilter({
|
||||||
|
getFilter: (filter) => {
|
||||||
|
// inStockDateFilter was assigned once the component has been mounted.
|
||||||
|
inStockDateFilter = filter;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
const handleClick = () => {
|
||||||
|
inStockDateFilter({
|
||||||
|
date: new Date(2018, 0, 1),
|
||||||
|
comparator: Comparator.GT
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { dateFilter, Comparator } from 'react-bootstrap-table2-filter';
|
||||||
|
|
||||||
|
let inStockDateFilter;
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'inStockDate',
|
||||||
|
text: 'InStock Date',
|
||||||
|
filter: dateFilter({
|
||||||
|
getFilter: (filter) => {
|
||||||
|
// inStockDateFilter was assigned once the component has been mounted.
|
||||||
|
inStockDateFilter = filter;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
const handleClick = () => {
|
||||||
|
inStockDateFilter({
|
||||||
|
date: new Date(2018, 0, 1),
|
||||||
|
comparator: Comparator.GT
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<button className="btn btn-lg btn-primary" onClick={ handleClick }> filter InStock Date columns which is greater than 2018.01.01 </button>
|
||||||
|
|
||||||
|
<BootstrapTable keyField='id' data={ stocks } columns={ columns } filter={ filterFactory() } />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<button className="btn btn-lg btn-primary" onClick={ handleClick }> filter InStock Date columns which is greater than 2018.01.01 </button>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ stocks }
|
||||||
|
columns={ columns }
|
||||||
|
filter={ filterFactory() }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
@@ -0,0 +1,95 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { multiSelectFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsQualityGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsQualityGenerator(6);
|
||||||
|
|
||||||
|
let qualityFilter;
|
||||||
|
|
||||||
|
const selectOptions = {
|
||||||
|
0: 'good',
|
||||||
|
1: 'Bad',
|
||||||
|
2: 'unknown'
|
||||||
|
};
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'quality',
|
||||||
|
text: 'Product Quality',
|
||||||
|
formatter: cell => selectOptions[cell],
|
||||||
|
filter: multiSelectFilter({
|
||||||
|
options: selectOptions,
|
||||||
|
getFilter: (filter) => {
|
||||||
|
// qualityFilter was assigned once the component has been mounted.
|
||||||
|
qualityFilter = filter;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
const handleClick = () => {
|
||||||
|
qualityFilter([0, 2]);
|
||||||
|
};
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { multiSelectFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
|
||||||
|
let qualityFilter;
|
||||||
|
|
||||||
|
const selectOptions = {
|
||||||
|
0: 'good',
|
||||||
|
1: 'Bad',
|
||||||
|
2: 'unknown'
|
||||||
|
};
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'quality',
|
||||||
|
text: 'Product Quality',
|
||||||
|
formatter: cell => selectOptions[cell],
|
||||||
|
filter: multiSelectFilter({
|
||||||
|
options: selectOptions,
|
||||||
|
getFilter: (filter) => {
|
||||||
|
// qualityFilter was assigned once the component has been mounted.
|
||||||
|
qualityFilter = filter;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
const handleClick = () => {
|
||||||
|
qualityFilter([0, 2]);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<button className="btn btn-lg btn-primary" onClick={ handleClick }>{' filter columns by option "good" and "unknow" '}</button>
|
||||||
|
<BootstrapTable keyField='id' data={ products } columns={ columns } filter={ filterFactory() } />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<button className="btn btn-lg btn-primary" onClick={ handleClick }>{' filter columns by option "good" and "unknow" '}</button>
|
||||||
|
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
filter={ filterFactory() }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
85
packages/react-bootstrap-table2-example/examples/column-filter/programmatically-number-filter.js
vendored
Normal file
85
packages/react-bootstrap-table2-example/examples/column-filter/programmatically-number-filter.js
vendored
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { numberFilter, Comparator } from 'react-bootstrap-table2-filter';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsGenerator(8);
|
||||||
|
|
||||||
|
let priceFilter;
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price',
|
||||||
|
filter: numberFilter({
|
||||||
|
getFilter: (filter) => {
|
||||||
|
// pricerFilter was assigned once the component has been mounted.
|
||||||
|
priceFilter = filter;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
const handleClick = () => {
|
||||||
|
priceFilter({
|
||||||
|
number: 2103,
|
||||||
|
comparator: Comparator.GT
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { numberFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
|
||||||
|
let priceFilter;
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price',
|
||||||
|
filter: numberFilter({
|
||||||
|
getFilter: (filter) => {
|
||||||
|
// pricerFilter was assigned once the component has been mounted.
|
||||||
|
priceFilter = filter;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
const handleClick = () => {
|
||||||
|
priceFilter({
|
||||||
|
number: 2103,
|
||||||
|
comparator: Comparator.GT
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<button className="btn btn-lg btn-primary" onClick={ handleClick }> filter all columns which is greater than 2103 </button>
|
||||||
|
|
||||||
|
<BootstrapTable keyField='id' data={ products } columns={ columns } filter={ filterFactory() } />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<button className="btn btn-lg btn-primary" onClick={ handleClick }> filter all columns which is greater than 2103 </button>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
filter={ filterFactory() }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
96
packages/react-bootstrap-table2-example/examples/column-filter/programmatically-select-filter.js
vendored
Normal file
96
packages/react-bootstrap-table2-example/examples/column-filter/programmatically-select-filter.js
vendored
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { selectFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsQualityGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsQualityGenerator(6);
|
||||||
|
|
||||||
|
let qualityFilter;
|
||||||
|
|
||||||
|
const selectOptions = {
|
||||||
|
0: 'good',
|
||||||
|
1: 'Bad',
|
||||||
|
2: 'unknown'
|
||||||
|
};
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'quality',
|
||||||
|
text: 'Product Quality',
|
||||||
|
formatter: cell => selectOptions[cell],
|
||||||
|
filter: selectFilter({
|
||||||
|
options: selectOptions,
|
||||||
|
getFilter: (filter) => {
|
||||||
|
// qualityFilter was assigned once the component has been mounted.
|
||||||
|
qualityFilter = filter;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
const handleClick = () => {
|
||||||
|
qualityFilter(0);
|
||||||
|
};
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { selectFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
|
||||||
|
let qualityFilter;
|
||||||
|
|
||||||
|
const selectOptions = {
|
||||||
|
0: 'good',
|
||||||
|
1: 'Bad',
|
||||||
|
2: 'unknown'
|
||||||
|
};
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'quality',
|
||||||
|
text: 'Product Quality',
|
||||||
|
formatter: cell => selectOptions[cell],
|
||||||
|
filter: selectFilter({
|
||||||
|
options: selectOptions,
|
||||||
|
getFilter: (filter) => {
|
||||||
|
// qualityFilter was assigned once the component has been mounted.
|
||||||
|
qualityFilter = filter;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
const handleClick = () => {
|
||||||
|
qualityFilter(0);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<button className="btn btn-lg btn-primary" onClick={ handleClick }>{' filter columns by option "good" '}</button>
|
||||||
|
|
||||||
|
<BootstrapTable keyField='id' data={ products } columns={ columns } filter={ filterFactory() } />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<button className="btn btn-lg btn-primary" onClick={ handleClick }>{' filter columns by option "good" '}</button>
|
||||||
|
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
filter={ filterFactory() }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
81
packages/react-bootstrap-table2-example/examples/column-filter/programmatically-text-filter.js
vendored
Normal file
81
packages/react-bootstrap-table2-example/examples/column-filter/programmatically-text-filter.js
vendored
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { textFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsGenerator(8);
|
||||||
|
|
||||||
|
let nameFilter;
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name',
|
||||||
|
filter: textFilter({
|
||||||
|
getFilter: (filter) => {
|
||||||
|
// nameFilter was assigned once the component has been mounted.
|
||||||
|
nameFilter = filter;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price',
|
||||||
|
filter: textFilter()
|
||||||
|
}];
|
||||||
|
|
||||||
|
const handleClick = () => {
|
||||||
|
nameFilter(0);
|
||||||
|
};
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { textFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
|
||||||
|
let nameFilter;
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name',
|
||||||
|
filter: textFilter({
|
||||||
|
getFilter: (filter) => {
|
||||||
|
// nameFilter was assigned once the component has been mounted.
|
||||||
|
nameFilter = filter;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price',
|
||||||
|
filter: textFilter()
|
||||||
|
}];
|
||||||
|
|
||||||
|
const handleClick = () => {
|
||||||
|
nameFilter(0);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<button className="btn btn-lg btn-primary" onClick={ handleClick }> filter columns by 0 </button>
|
||||||
|
|
||||||
|
<BootstrapTable keyField='id' data={ products } columns={ columns } filter={ filterFactory() } />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<button className="btn btn-lg btn-primary" onClick={ handleClick }> filter columns by 0 </button>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
filter={ filterFactory() }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
70
packages/react-bootstrap-table2-example/examples/column-filter/select-filter-default-value.js
vendored
Normal file
70
packages/react-bootstrap-table2-example/examples/column-filter/select-filter-default-value.js
vendored
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { selectFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsQualityGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsQualityGenerator(6);
|
||||||
|
|
||||||
|
const selectOptions = {
|
||||||
|
0: 'good',
|
||||||
|
1: 'Bad',
|
||||||
|
2: 'unknown'
|
||||||
|
};
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'quality',
|
||||||
|
text: 'Product Quailty',
|
||||||
|
formatter: cell => selectOptions[cell],
|
||||||
|
filter: selectFilter({
|
||||||
|
options: selectOptions,
|
||||||
|
defaultValue: 2
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { selectFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
|
||||||
|
const selectOptions = {
|
||||||
|
0: 'good',
|
||||||
|
1: 'Bad',
|
||||||
|
2: 'unknown'
|
||||||
|
};
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'quality',
|
||||||
|
text: 'Product Quailty',
|
||||||
|
formatter: cell => selectOptions[cell],
|
||||||
|
filter: selectFilter({
|
||||||
|
options: selectOptions,
|
||||||
|
defaultValue: 2
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
<BootstrapTable keyField='id' data={ products } columns={ columns } filter={ filterFactory() } />
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
filter={ filterFactory() }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
69
packages/react-bootstrap-table2-example/examples/column-filter/select-filter-like-comparator.js
vendored
Normal file
69
packages/react-bootstrap-table2-example/examples/column-filter/select-filter-like-comparator.js
vendored
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { selectFilter, Comparator } from 'react-bootstrap-table2-filter';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsGenerator(6);
|
||||||
|
|
||||||
|
const selectOptions = {
|
||||||
|
'03': '03',
|
||||||
|
'04': '04',
|
||||||
|
'01': '01'
|
||||||
|
};
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price',
|
||||||
|
filter: selectFilter({
|
||||||
|
options: selectOptions,
|
||||||
|
comparator: Comparator.LIKE // default is Comparator.EQ
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { selectFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
|
||||||
|
const selectOptions = {
|
||||||
|
'03': '03',
|
||||||
|
'04': '04',
|
||||||
|
'01': '01'
|
||||||
|
};
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price',
|
||||||
|
filter: selectFilter({
|
||||||
|
options: selectOptions,
|
||||||
|
comparator: Comparator.LIKE // default is Comparator.EQ
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
<BootstrapTable keyField='id' data={ products } columns={ columns } filter={ filterFactory() } />
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<h3>Select Filter with LIKE Comparator</h3>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
filter={ filterFactory() }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
68
packages/react-bootstrap-table2-example/examples/column-filter/select-filter.js
vendored
Normal file
68
packages/react-bootstrap-table2-example/examples/column-filter/select-filter.js
vendored
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { selectFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsQualityGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsQualityGenerator(6);
|
||||||
|
|
||||||
|
const selectOptions = {
|
||||||
|
0: 'good',
|
||||||
|
1: 'Bad',
|
||||||
|
2: 'unknown'
|
||||||
|
};
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'quality',
|
||||||
|
text: 'Product Quailty',
|
||||||
|
formatter: cell => selectOptions[cell],
|
||||||
|
filter: selectFilter({
|
||||||
|
options: selectOptions
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { selectFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
|
||||||
|
const selectOptions = {
|
||||||
|
0: 'good',
|
||||||
|
1: 'Bad',
|
||||||
|
2: 'unknown'
|
||||||
|
};
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'quality',
|
||||||
|
text: 'Product Quailty',
|
||||||
|
formatter: cell => selectOptions[cell],
|
||||||
|
filter: selectFilter({
|
||||||
|
options: selectOptions
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
|
||||||
|
<BootstrapTable keyField='id' data={ products } columns={ columns } filter={ filterFactory() } />
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
filter={ filterFactory() }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
51
packages/react-bootstrap-table2-example/examples/column-filter/text-filter-caseSensitive.js
vendored
Normal file
51
packages/react-bootstrap-table2-example/examples/column-filter/text-filter-caseSensitive.js
vendored
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { textFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsGenerator(8);
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name',
|
||||||
|
filter: textFilter({ caseSensitive: true })
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price'
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import filterFactory, { textFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name',
|
||||||
|
filter: textFilter({ caseSensitive: true })
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price'
|
||||||
|
}];
|
||||||
|
|
||||||
|
<BootstrapTable keyField='id' data={ products } columns={ columns } filter={ filterFactory() } />
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<h3>Product Name is case sensitive</h3>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
filter={ filterFactory() }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
@@ -22,6 +22,7 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
import filterFactory, { textFilter } from 'react-bootstrap-table2-filter';
|
import filterFactory, { textFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
|
||||||
const columns = [{
|
const columns = [{
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
import filterFactory, { textFilter, Comparator } from 'react-bootstrap-table2-filter';
|
import filterFactory, { textFilter, Comparator } from 'react-bootstrap-table2-filter';
|
||||||
|
|
||||||
const columns = [{
|
const columns = [{
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
import filterFactory, { textFilter } from 'react-bootstrap-table2-filter';
|
import filterFactory, { textFilter } from 'react-bootstrap-table2-filter';
|
||||||
|
|
||||||
const columns = [{
|
const columns = [{
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
|
||||||
const columns = [{
|
const columns = [{
|
||||||
dataField: 'id',
|
dataField: 'id',
|
||||||
text: 'Product ID',
|
text: 'Product ID',
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
|
||||||
const columns = [{
|
const columns = [{
|
||||||
dataField: 'id',
|
dataField: 'id',
|
||||||
text: 'Product ID',
|
text: 'Product ID',
|
||||||
@@ -39,6 +41,7 @@ const columns = [{
|
|||||||
|
|
||||||
export default () => (
|
export default () => (
|
||||||
<div>
|
<div>
|
||||||
|
<h3>Try to hover on Product ID Cell</h3>
|
||||||
<BootstrapTable keyField="id" data={ products } columns={ columns } />
|
<BootstrapTable keyField="id" data={ products } columns={ columns } />
|
||||||
<Code>{ sourceCode }</Code>
|
<Code>{ sourceCode }</Code>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
|
||||||
const columns = [{
|
const columns = [{
|
||||||
dataField: 'id',
|
dataField: 'id',
|
||||||
text: 'Product ID',
|
text: 'Product ID',
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
|
||||||
const columns = [{
|
const columns = [{
|
||||||
dataField: 'id',
|
dataField: 'id',
|
||||||
text: 'Product ID',
|
text: 'Product ID',
|
||||||
|
|||||||
@@ -31,6 +31,8 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
|
||||||
function priceFormatter(cell, row) {
|
function priceFormatter(cell, row) {
|
||||||
if (row.onSale) {
|
if (row.onSale) {
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -34,6 +34,8 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
|
||||||
function rankFormatter(cell, row, rowIndex, formatExtraData) {
|
function rankFormatter(cell, row, rowIndex, formatExtraData) {
|
||||||
return (
|
return (
|
||||||
<i className={ formatExtraData[cell] } />
|
<i className={ formatExtraData[cell] } />
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
|
||||||
const columns = [{
|
const columns = [{
|
||||||
dataField: 'id',
|
dataField: 'id',
|
||||||
text: 'Product ID',
|
text: 'Product ID',
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
|
||||||
const columns = [{
|
const columns = [{
|
||||||
dataField: 'id',
|
dataField: 'id',
|
||||||
text: 'Product ID',
|
text: 'Product ID',
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ const columns = [{
|
|||||||
|
|
||||||
export default () => (
|
export default () => (
|
||||||
<div>
|
<div>
|
||||||
|
<h3>Try to hover on any Product Name cells</h3>
|
||||||
<BootstrapTable keyField="id" data={ products } columns={ columns } />
|
<BootstrapTable keyField="id" data={ products } columns={ columns } />
|
||||||
<Code>{ sourceCode }</Code>
|
<Code>{ sourceCode }</Code>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -32,6 +32,8 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
|
||||||
const columns = [{
|
const columns = [{
|
||||||
dataField: 'id',
|
dataField: 'id',
|
||||||
text: 'User ID'
|
text: 'User ID'
|
||||||
|
|||||||
80
packages/react-bootstrap-table2-example/examples/csv/csv-column-formatter.js
vendored
Normal file
80
packages/react-bootstrap-table2-example/examples/csv/csv-column-formatter.js
vendored
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
/* eslint react/prop-types: 0 */
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
/* eslint no-unused-vars: 0 */
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import ToolkitProvider, { CSVExport } from 'react-bootstrap-table2-toolkit';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const { ExportCSVButton } = CSVExport;
|
||||||
|
const products = productsGenerator();
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price',
|
||||||
|
csvFormatter: (cell, row, rowIndex) => `$ ${cell}NTD`
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import ToolkitProvider, { CSVExport } from 'react-bootstrap-table2-toolkit';
|
||||||
|
|
||||||
|
const { ExportCSVButton } = CSVExport;
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price',
|
||||||
|
csvFormatter: (cell, row, rowIndex) => \`$ \${cell}NTD\`
|
||||||
|
}];
|
||||||
|
|
||||||
|
<ToolkitProvider
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
exportCSV
|
||||||
|
>
|
||||||
|
{
|
||||||
|
props => (
|
||||||
|
<div>
|
||||||
|
<ExportCSVButton { ...props.csvProps }>Export CSV!!</ExportCSVButton>
|
||||||
|
<hr />
|
||||||
|
<BootstrapTable { ...props.baseProps } />
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</ToolkitProvider>
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<ToolkitProvider
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
exportCSV
|
||||||
|
>
|
||||||
|
{
|
||||||
|
props => (
|
||||||
|
<div>
|
||||||
|
<ExportCSVButton { ...props.csvProps }>Export CSV!!</ExportCSVButton>
|
||||||
|
<hr />
|
||||||
|
<BootstrapTable { ...props.baseProps } />
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</ToolkitProvider>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
79
packages/react-bootstrap-table2-example/examples/csv/csv-column-type.js
vendored
Normal file
79
packages/react-bootstrap-table2-example/examples/csv/csv-column-type.js
vendored
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
/* eslint react/prop-types: 0 */
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import ToolkitProvider, { CSVExport } from 'react-bootstrap-table2-toolkit';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const { ExportCSVButton } = CSVExport;
|
||||||
|
const products = productsGenerator();
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price',
|
||||||
|
csvType: Number
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import ToolkitProvider, { CSVExport } from 'react-bootstrap-table2-toolkit';
|
||||||
|
|
||||||
|
const { ExportCSVButton } = CSVExport;
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price',
|
||||||
|
csvType: Number
|
||||||
|
}];
|
||||||
|
|
||||||
|
<ToolkitProvider
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
exportCSV
|
||||||
|
>
|
||||||
|
{
|
||||||
|
props => (
|
||||||
|
<div>
|
||||||
|
<ExportCSVButton { ...props.csvProps }>Export CSV!!</ExportCSVButton>
|
||||||
|
<hr />
|
||||||
|
<BootstrapTable { ...props.baseProps } />
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</ToolkitProvider>
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<ToolkitProvider
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
exportCSV
|
||||||
|
>
|
||||||
|
{
|
||||||
|
props => (
|
||||||
|
<div>
|
||||||
|
<ExportCSVButton { ...props.csvProps }>Export CSV!!</ExportCSVButton>
|
||||||
|
<hr />
|
||||||
|
<BootstrapTable { ...props.baseProps } />
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</ToolkitProvider>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
97
packages/react-bootstrap-table2-example/examples/csv/custom-csv-button.js
vendored
Normal file
97
packages/react-bootstrap-table2-example/examples/csv/custom-csv-button.js
vendored
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
/* eslint react/prop-types: 0 */
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import ToolkitProvider from 'react-bootstrap-table2-toolkit';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsGenerator();
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price'
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import ToolkitProvider from 'react-bootstrap-table2-toolkit';
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price'
|
||||||
|
}];
|
||||||
|
|
||||||
|
const MyExportCSV = (props) => {
|
||||||
|
const handleClick = () => {
|
||||||
|
props.onExport();
|
||||||
|
};
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<button className="btn btn-success" onClick={ handleClick }>Export to CSV</button>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
<ToolkitProvider
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
exportCSV
|
||||||
|
>
|
||||||
|
{
|
||||||
|
props => (
|
||||||
|
<div>
|
||||||
|
<BootstrapTable { ...props.baseProps } />
|
||||||
|
<hr />
|
||||||
|
<MyExportCSV { ...props.csvProps } />
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</ToolkitProvider>
|
||||||
|
`;
|
||||||
|
|
||||||
|
const MyExportCSV = (props) => {
|
||||||
|
const handleClick = () => {
|
||||||
|
props.onExport();
|
||||||
|
};
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<button className="btn btn-success" onClick={ handleClick }>Export to CSV</button>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<ToolkitProvider
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
exportCSV
|
||||||
|
>
|
||||||
|
{
|
||||||
|
props => (
|
||||||
|
<div>
|
||||||
|
<BootstrapTable { ...props.baseProps } />
|
||||||
|
<hr />
|
||||||
|
<MyExportCSV { ...props.csvProps } />
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</ToolkitProvider>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
83
packages/react-bootstrap-table2-example/examples/csv/custom-csv-header.js
vendored
Normal file
83
packages/react-bootstrap-table2-example/examples/csv/custom-csv-header.js
vendored
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
/* eslint react/prop-types: 0 */
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import ToolkitProvider, { CSVExport } from 'react-bootstrap-table2-toolkit';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const { ExportCSVButton } = CSVExport;
|
||||||
|
const products = productsGenerator();
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID',
|
||||||
|
csvText: 'CSV Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name',
|
||||||
|
csvText: 'CSV Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price',
|
||||||
|
csvText: 'CSV Product price'
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import ToolkitProvider, { CSVExport } from 'react-bootstrap-table2-toolkit';
|
||||||
|
|
||||||
|
const { ExportCSVButton } = CSVExport;
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID',
|
||||||
|
csvText: 'CSV Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name',
|
||||||
|
csvText: 'CSV Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price',
|
||||||
|
csvText: 'CSV Product price'
|
||||||
|
}];
|
||||||
|
|
||||||
|
<ToolkitProvider
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
exportCSV
|
||||||
|
>
|
||||||
|
{
|
||||||
|
props => (
|
||||||
|
<div>
|
||||||
|
<ExportCSVButton { ...props.csvProps }>Export CSV!!</ExportCSVButton>
|
||||||
|
<hr />
|
||||||
|
<BootstrapTable { ...props.baseProps } />
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</ToolkitProvider>
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<ToolkitProvider
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
exportCSV
|
||||||
|
>
|
||||||
|
{
|
||||||
|
props => (
|
||||||
|
<div>
|
||||||
|
<ExportCSVButton { ...props.csvProps }>Export CSV!!</ExportCSVButton>
|
||||||
|
<hr />
|
||||||
|
<BootstrapTable { ...props.baseProps } />
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</ToolkitProvider>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
82
packages/react-bootstrap-table2-example/examples/csv/custom-csv.js
vendored
Normal file
82
packages/react-bootstrap-table2-example/examples/csv/custom-csv.js
vendored
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
/* eslint react/prop-types: 0 */
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import ToolkitProvider, { CSVExport } from 'react-bootstrap-table2-toolkit';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const { ExportCSVButton } = CSVExport;
|
||||||
|
const products = productsGenerator();
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price'
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import ToolkitProvider, { CSVExport } from 'react-bootstrap-table2-toolkit';
|
||||||
|
|
||||||
|
const { ExportCSVButton } = CSVExport;
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price'
|
||||||
|
}];
|
||||||
|
|
||||||
|
<ToolkitProvider
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
exportCSV
|
||||||
|
>
|
||||||
|
{
|
||||||
|
props => (
|
||||||
|
<div>
|
||||||
|
<ExportCSVButton { ...props.csvProps }>Export CSV!!</ExportCSVButton>
|
||||||
|
<hr />
|
||||||
|
<BootstrapTable { ...props.baseProps } />
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</ToolkitProvider>
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<ToolkitProvider
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
exportCSV={ {
|
||||||
|
fileName: 'custom.csv',
|
||||||
|
separator: '|',
|
||||||
|
ignoreHeader: true,
|
||||||
|
noAutoBOM: false
|
||||||
|
} }
|
||||||
|
>
|
||||||
|
{
|
||||||
|
props => (
|
||||||
|
<div>
|
||||||
|
<ExportCSVButton { ...props.csvProps }>Export CSV!!</ExportCSVButton>
|
||||||
|
<hr />
|
||||||
|
<BootstrapTable { ...props.baseProps } />
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</ToolkitProvider>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
79
packages/react-bootstrap-table2-example/examples/csv/hide-column.js
vendored
Normal file
79
packages/react-bootstrap-table2-example/examples/csv/hide-column.js
vendored
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
/* eslint react/prop-types: 0 */
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import ToolkitProvider, { CSVExport } from 'react-bootstrap-table2-toolkit';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const { ExportCSVButton } = CSVExport;
|
||||||
|
const products = productsGenerator();
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name',
|
||||||
|
csvExport: false
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price'
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import ToolkitProvider, { CSVExport } from 'react-bootstrap-table2-toolkit';
|
||||||
|
|
||||||
|
const { ExportCSVButton } = CSVExport;
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name',
|
||||||
|
csvExport: false
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price'
|
||||||
|
}];
|
||||||
|
|
||||||
|
<ToolkitProvider
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
exportCSV
|
||||||
|
>
|
||||||
|
{
|
||||||
|
props => (
|
||||||
|
<div>
|
||||||
|
<ExportCSVButton { ...props.csvProps }>Export CSV!!</ExportCSVButton>
|
||||||
|
<hr />
|
||||||
|
<BootstrapTable { ...props.baseProps } />
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</ToolkitProvider>
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<ToolkitProvider
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
exportCSV
|
||||||
|
>
|
||||||
|
{
|
||||||
|
props => (
|
||||||
|
<div>
|
||||||
|
<ExportCSVButton { ...props.csvProps }>Export CSV!!</ExportCSVButton>
|
||||||
|
<hr />
|
||||||
|
<BootstrapTable { ...props.baseProps } />
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</ToolkitProvider>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
77
packages/react-bootstrap-table2-example/examples/csv/index.js
vendored
Normal file
77
packages/react-bootstrap-table2-example/examples/csv/index.js
vendored
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
/* eslint react/prop-types: 0 */
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import ToolkitProvider, { CSVExport } from 'react-bootstrap-table2-toolkit';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const { ExportCSVButton } = CSVExport;
|
||||||
|
const products = productsGenerator();
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price'
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import ToolkitProvider, { CSVExport } from 'react-bootstrap-table2-toolkit';
|
||||||
|
|
||||||
|
const { ExportCSVButton } = CSVExport;
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price'
|
||||||
|
}];
|
||||||
|
|
||||||
|
<ToolkitProvider
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
exportCSV
|
||||||
|
>
|
||||||
|
{
|
||||||
|
props => (
|
||||||
|
<div>
|
||||||
|
<ExportCSVButton { ...props.csvProps }>Export CSV!!</ExportCSVButton>
|
||||||
|
<hr />
|
||||||
|
<BootstrapTable { ...props.baseProps } />
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</ToolkitProvider>
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<ToolkitProvider
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
exportCSV
|
||||||
|
>
|
||||||
|
{
|
||||||
|
props => (
|
||||||
|
<div>
|
||||||
|
<ExportCSVButton { ...props.csvProps }>Export CSV!!</ExportCSVButton>
|
||||||
|
<hr />
|
||||||
|
<BootstrapTable { ...props.baseProps } />
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</ToolkitProvider>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
@@ -21,6 +21,8 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
|
||||||
const columns = [{
|
const columns = [{
|
||||||
dataField: 'id',
|
dataField: 'id',
|
||||||
text: 'Product ID',
|
text: 'Product ID',
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
|
||||||
const columns = [{
|
const columns = [{
|
||||||
dataField: 'id',
|
dataField: 'id',
|
||||||
text: 'Product ID',
|
text: 'Product ID',
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ const columns = [{
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
const sourceCode = `\
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
|
||||||
const columns = [{
|
const columns = [{
|
||||||
dataField: 'id',
|
dataField: 'id',
|
||||||
text: 'Product ID'
|
text: 'Product ID'
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user