mirror of
https://github.com/gosticks/react-bootstrap-table2.git
synced 2025-10-16 11:55:39 +00:00
add stories for loading overlay
This commit is contained in:
parent
dc096a6c4e
commit
70303617fb
@ -2,6 +2,7 @@ const path = require('path');
|
|||||||
|
|
||||||
const sourcePath = path.join(__dirname, '../../react-bootstrap-table2/src');
|
const sourcePath = path.join(__dirname, '../../react-bootstrap-table2/src');
|
||||||
const paginationSourcePath = path.join(__dirname, '../../react-bootstrap-table2-paginator/src');
|
const paginationSourcePath = path.join(__dirname, '../../react-bootstrap-table2-paginator/src');
|
||||||
|
const overlaySourcePath = path.join(__dirname, '../../react-bootstrap-table2-overlay/src');
|
||||||
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 storyPath = path.join(__dirname, '../stories');
|
const storyPath = path.join(__dirname, '../stories');
|
||||||
@ -25,7 +26,7 @@ const loaders = [{
|
|||||||
test: /\.js?$/,
|
test: /\.js?$/,
|
||||||
use: ['babel-loader'],
|
use: ['babel-loader'],
|
||||||
exclude: /node_modules/,
|
exclude: /node_modules/,
|
||||||
include: [sourcePath, paginationSourcePath, storyPath],
|
include: [sourcePath, paginationSourcePath, overlaySourcePath, storyPath],
|
||||||
}, {
|
}, {
|
||||||
test: /\.css$/,
|
test: /\.css$/,
|
||||||
use: ['style-loader', 'css-loader'],
|
use: ['style-loader', 'css-loader'],
|
||||||
|
|||||||
145
packages/react-bootstrap-table2-example/examples/loading-overlay/empty-table-overlay.js
vendored
Normal file
145
packages/react-bootstrap-table2-example/examples/loading-overlay/empty-table-overlay.js
vendored
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
/* eslint react/no-multi-comp: 0 */
|
||||||
|
import React from 'react';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import BootstrapTable from 'react-bootstrap-table2';
|
||||||
|
import paginator from 'react-bootstrap-table2-paginator';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsGenerator(87);
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price'
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table2';
|
||||||
|
import paginator from 'react-bootstrap-table2-paginator';
|
||||||
|
// ...
|
||||||
|
const RemotePagination = ({ data, page, sizePerPage, onTableChange, totalSize }) => (
|
||||||
|
<div>
|
||||||
|
<BootstrapTable
|
||||||
|
remote
|
||||||
|
keyField="id"
|
||||||
|
data={ data }
|
||||||
|
columns={ columns }
|
||||||
|
pagination={ paginator({ page, sizePerPage, totalSize }) }
|
||||||
|
onTableChange={ onTableChange }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
class Container extends React.Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
this.state = {
|
||||||
|
page: 1,
|
||||||
|
data: products.slice(0, 10),
|
||||||
|
sizePerPage: 10
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
handleTableChange = ({ page, sizePerPage }) => {
|
||||||
|
const currentIndex = (page - 1) * sizePerPage;
|
||||||
|
setTimeout(() => {
|
||||||
|
this.setState(() => ({
|
||||||
|
page,
|
||||||
|
data: products.slice(currentIndex, currentIndex + sizePerPage),
|
||||||
|
sizePerPage
|
||||||
|
}));
|
||||||
|
}, 2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const { data, sizePerPage, page } = this.state;
|
||||||
|
return (
|
||||||
|
<RemotePagination
|
||||||
|
data={ data }
|
||||||
|
page={ page }
|
||||||
|
sizePerPage={ sizePerPage }
|
||||||
|
totalSize={ products.length }
|
||||||
|
onTableChange={ this.handleTableChange }
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
const NoDataIndication = () => (
|
||||||
|
<div className="spinner">
|
||||||
|
<div className="rect1" />
|
||||||
|
<div className="rect2" />
|
||||||
|
<div className="rect3" />
|
||||||
|
<div className="rect4" />
|
||||||
|
<div className="rect5" />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
const Table = ({ data, page, sizePerPage, onTableChange, totalSize }) => (
|
||||||
|
<div>
|
||||||
|
<BootstrapTable
|
||||||
|
remote
|
||||||
|
keyField="id"
|
||||||
|
data={ data }
|
||||||
|
columns={ columns }
|
||||||
|
pagination={ paginator({ page, sizePerPage, totalSize }) }
|
||||||
|
onTableChange={ onTableChange }
|
||||||
|
noDataIndication={ () => <NoDataIndication /> }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
Table.propTypes = {
|
||||||
|
data: PropTypes.array.isRequired,
|
||||||
|
page: PropTypes.number.isRequired,
|
||||||
|
totalSize: PropTypes.number.isRequired,
|
||||||
|
sizePerPage: PropTypes.number.isRequired,
|
||||||
|
onTableChange: PropTypes.func.isRequired
|
||||||
|
};
|
||||||
|
|
||||||
|
class EmptyTableOverlay extends React.Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
this.state = {
|
||||||
|
page: 1,
|
||||||
|
data: products.slice(0, 10),
|
||||||
|
sizePerPage: 10
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
handleTableChange = ({ page, sizePerPage }) => {
|
||||||
|
const currentIndex = (page - 1) * sizePerPage;
|
||||||
|
setTimeout(() => {
|
||||||
|
this.setState(() => ({
|
||||||
|
page,
|
||||||
|
data: products.slice(currentIndex, currentIndex + sizePerPage),
|
||||||
|
sizePerPage
|
||||||
|
}));
|
||||||
|
}, 3000);
|
||||||
|
this.setState(() => ({ data: [] }));
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const { data, sizePerPage, page } = this.state;
|
||||||
|
return (
|
||||||
|
<Table
|
||||||
|
data={ data }
|
||||||
|
page={ page }
|
||||||
|
sizePerPage={ sizePerPage }
|
||||||
|
totalSize={ products.length }
|
||||||
|
onTableChange={ this.handleTableChange }
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default EmptyTableOverlay;
|
||||||
158
packages/react-bootstrap-table2-example/examples/loading-overlay/table-overlay.js
vendored
Normal file
158
packages/react-bootstrap-table2-example/examples/loading-overlay/table-overlay.js
vendored
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
/* eslint react/no-multi-comp: 0 */
|
||||||
|
import React from 'react';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import BootstrapTable from 'react-bootstrap-table2';
|
||||||
|
import paginator from 'react-bootstrap-table2-paginator';
|
||||||
|
import overlayFactory from 'react-bootstrap-table2-overlay';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsGenerator(87);
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price'
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table2';
|
||||||
|
import paginator from 'react-bootstrap-table2-paginator';
|
||||||
|
import overlayFactory from 'react-bootstrap-table2-overlay';
|
||||||
|
|
||||||
|
// ...
|
||||||
|
const RemotePagination = ({ loading, data, page, sizePerPage, onTableChange, totalSize }) => (
|
||||||
|
<div>
|
||||||
|
<BootstrapTable
|
||||||
|
remote
|
||||||
|
loading={ loading }
|
||||||
|
keyField="id"
|
||||||
|
data={ data }
|
||||||
|
columns={ columns }
|
||||||
|
pagination={ paginator({ page, sizePerPage, totalSize }) }
|
||||||
|
onTableChange={ onTableChange }
|
||||||
|
overlay={ overlayFactory({ spinner: true, background: 'rgba(192,192,192,0.3)' }) }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
RemotePagination.propTypes = {
|
||||||
|
data: PropTypes.array.isRequired,
|
||||||
|
page: PropTypes.number.isRequired,
|
||||||
|
loading: PropTypes.bool.isRequired,
|
||||||
|
totalSize: PropTypes.number.isRequired,
|
||||||
|
sizePerPage: PropTypes.number.isRequired,
|
||||||
|
onTableChange: PropTypes.func.isRequired
|
||||||
|
};
|
||||||
|
|
||||||
|
class Container extends React.Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
this.state = {
|
||||||
|
page: 1,
|
||||||
|
loading: false,
|
||||||
|
data: products.slice(0, 10),
|
||||||
|
sizePerPage: 10
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
handleTableChange = ({ page, sizePerPage }) => {
|
||||||
|
const currentIndex = (page - 1) * sizePerPage;
|
||||||
|
setTimeout(() => {
|
||||||
|
this.setState(() => ({
|
||||||
|
page,
|
||||||
|
loading: false,
|
||||||
|
data: products.slice(currentIndex, currentIndex + sizePerPage),
|
||||||
|
sizePerPage
|
||||||
|
}));
|
||||||
|
}, 3000);
|
||||||
|
this.setState(() => ({ loading: true }));
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const { data, sizePerPage, page, loading } = this.state;
|
||||||
|
return (
|
||||||
|
<RemotePagination
|
||||||
|
data={ data }
|
||||||
|
page={ page }
|
||||||
|
loading={ loading }
|
||||||
|
sizePerPage={ sizePerPage }
|
||||||
|
totalSize={ products.length }
|
||||||
|
onTableChange={ this.handleTableChange }
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
const RemotePagination = ({ loading, data, page, sizePerPage, onTableChange, totalSize }) => (
|
||||||
|
<div>
|
||||||
|
<BootstrapTable
|
||||||
|
remote
|
||||||
|
loading={ loading }
|
||||||
|
keyField="id"
|
||||||
|
data={ data }
|
||||||
|
columns={ columns }
|
||||||
|
pagination={ paginator({ page, sizePerPage, totalSize }) }
|
||||||
|
onTableChange={ onTableChange }
|
||||||
|
overlay={ overlayFactory({ spinner: true, background: 'rgba(192,192,192,0.3)' }) }
|
||||||
|
/>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
RemotePagination.propTypes = {
|
||||||
|
data: PropTypes.array.isRequired,
|
||||||
|
page: PropTypes.number.isRequired,
|
||||||
|
loading: PropTypes.bool.isRequired,
|
||||||
|
totalSize: PropTypes.number.isRequired,
|
||||||
|
sizePerPage: PropTypes.number.isRequired,
|
||||||
|
onTableChange: PropTypes.func.isRequired
|
||||||
|
};
|
||||||
|
|
||||||
|
class Container extends React.Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
this.state = {
|
||||||
|
page: 1,
|
||||||
|
loading: false,
|
||||||
|
data: products.slice(0, 10),
|
||||||
|
sizePerPage: 10
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
handleTableChange = ({ page, sizePerPage }) => {
|
||||||
|
const currentIndex = (page - 1) * sizePerPage;
|
||||||
|
setTimeout(() => {
|
||||||
|
this.setState(() => ({
|
||||||
|
page,
|
||||||
|
loading: false,
|
||||||
|
data: products.slice(currentIndex, currentIndex + sizePerPage),
|
||||||
|
sizePerPage
|
||||||
|
}));
|
||||||
|
}, 3000);
|
||||||
|
this.setState(() => ({ loading: true }));
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const { data, sizePerPage, page, loading } = this.state;
|
||||||
|
return (
|
||||||
|
<RemotePagination
|
||||||
|
data={ data }
|
||||||
|
page={ page }
|
||||||
|
loading={ loading }
|
||||||
|
sizePerPage={ sizePerPage }
|
||||||
|
totalSize={ products.length }
|
||||||
|
onTableChange={ this.handleTableChange }
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Container;
|
||||||
@ -18,7 +18,8 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"bootstrap": "^3.3.7",
|
"bootstrap": "^3.3.7",
|
||||||
"react-bootstrap-table2": "0.0.1",
|
"react-bootstrap-table2": "0.0.1",
|
||||||
"react-bootstrap-table2-paginator": "0.0.1"
|
"react-bootstrap-table2-paginator": "0.0.1",
|
||||||
|
"react-bootstrap-table2-overlay": "0.0.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@storybook/addon-console": "^1.0.0",
|
"@storybook/addon-console": "^1.0.0",
|
||||||
|
|||||||
@ -74,6 +74,10 @@ import PaginationHooksTable from 'examples/pagination/pagination-hooks';
|
|||||||
import CustomPaginationTable from 'examples/pagination/custom-pagination';
|
import CustomPaginationTable from 'examples/pagination/custom-pagination';
|
||||||
import RemotePaginationTable from 'examples/pagination/remote-pagination';
|
import RemotePaginationTable from 'examples/pagination/remote-pagination';
|
||||||
|
|
||||||
|
// loading overlay
|
||||||
|
import EmptyTableOverlay from 'examples/loading-overlay/empty-table-overlay';
|
||||||
|
import TableOverlay from 'examples/loading-overlay/table-overlay';
|
||||||
|
|
||||||
// css style
|
// css style
|
||||||
import 'bootstrap/dist/css/bootstrap.min.css';
|
import 'bootstrap/dist/css/bootstrap.min.css';
|
||||||
import 'stories/stylesheet/tomorrow.min.css';
|
import 'stories/stylesheet/tomorrow.min.css';
|
||||||
@ -156,3 +160,7 @@ storiesOf('Pagination', module)
|
|||||||
.add('Pagination Hooks', () => <PaginationHooksTable />)
|
.add('Pagination Hooks', () => <PaginationHooksTable />)
|
||||||
.add('Custom Pagination', () => <CustomPaginationTable />)
|
.add('Custom Pagination', () => <CustomPaginationTable />)
|
||||||
.add('Remote Pagination', () => <RemotePaginationTable />);
|
.add('Remote Pagination', () => <RemotePaginationTable />);
|
||||||
|
|
||||||
|
storiesOf('EmptyTableOverlay', module)
|
||||||
|
.add('Empty Table Overlay', () => <EmptyTableOverlay />)
|
||||||
|
.add('Table Overlay', () => <TableOverlay />);
|
||||||
|
|||||||
@ -0,0 +1,52 @@
|
|||||||
|
.spinner {
|
||||||
|
margin: 100px auto;
|
||||||
|
width: 50px;
|
||||||
|
height: 40px;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.spinner > div {
|
||||||
|
background-color: #333;
|
||||||
|
height: 100%;
|
||||||
|
width: 6px;
|
||||||
|
display: inline-block;
|
||||||
|
|
||||||
|
-webkit-animation: sk-stretchdelay 1.2s infinite ease-in-out;
|
||||||
|
animation: sk-stretchdelay 1.2s infinite ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.spinner .rect2 {
|
||||||
|
-webkit-animation-delay: -1.1s;
|
||||||
|
animation-delay: -1.1s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.spinner .rect3 {
|
||||||
|
-webkit-animation-delay: -1.0s;
|
||||||
|
animation-delay: -1.0s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.spinner .rect4 {
|
||||||
|
-webkit-animation-delay: -0.9s;
|
||||||
|
animation-delay: -0.9s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.spinner .rect5 {
|
||||||
|
-webkit-animation-delay: -0.8s;
|
||||||
|
animation-delay: -0.8s;
|
||||||
|
}
|
||||||
|
|
||||||
|
@-webkit-keyframes sk-stretchdelay {
|
||||||
|
0%, 40%, 100% { -webkit-transform: scaleY(0.4) }
|
||||||
|
20% { -webkit-transform: scaleY(1.0) }
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes sk-stretchdelay {
|
||||||
|
0%, 40%, 100% {
|
||||||
|
transform: scaleY(0.4);
|
||||||
|
-webkit-transform: scaleY(0.4);
|
||||||
|
} 20% {
|
||||||
|
transform: scaleY(1.0);
|
||||||
|
-webkit-transform: scaleY(1.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -7,4 +7,5 @@
|
|||||||
@import "columns/index";
|
@import "columns/index";
|
||||||
@import "cell-edit/index";
|
@import "cell-edit/index";
|
||||||
@import "row-selection/index";
|
@import "row-selection/index";
|
||||||
@import "rows/index";
|
@import "rows/index";
|
||||||
|
@import "loading-overlay/index";
|
||||||
Loading…
Reference in New Issue
Block a user