From 70303617fbc3341c96e90a16d24910a5ccf32fe2 Mon Sep 17 00:00:00 2001 From: AllenFang Date: Sun, 3 Dec 2017 17:13:05 +0800 Subject: [PATCH] add stories for loading overlay --- .../.storybook/webpack.config.js | 3 +- .../loading-overlay/empty-table-overlay.js | 145 ++++++++++++++++ .../examples/loading-overlay/table-overlay.js | 158 ++++++++++++++++++ .../package.json | 3 +- .../stories/index.js | 8 + .../stylesheet/loading-overlay/_index.scss | 52 ++++++ .../stories/stylesheet/storybook.scss | 3 +- 7 files changed, 369 insertions(+), 3 deletions(-) create mode 100644 packages/react-bootstrap-table2-example/examples/loading-overlay/empty-table-overlay.js create mode 100644 packages/react-bootstrap-table2-example/examples/loading-overlay/table-overlay.js create mode 100644 packages/react-bootstrap-table2-example/stories/stylesheet/loading-overlay/_index.scss diff --git a/packages/react-bootstrap-table2-example/.storybook/webpack.config.js b/packages/react-bootstrap-table2-example/.storybook/webpack.config.js index 3e55ec8..8ebc72a 100644 --- a/packages/react-bootstrap-table2-example/.storybook/webpack.config.js +++ b/packages/react-bootstrap-table2-example/.storybook/webpack.config.js @@ -2,6 +2,7 @@ const path = require('path'); const sourcePath = path.join(__dirname, '../../react-bootstrap-table2/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 paginationStylePath = path.join(__dirname, '../../react-bootstrap-table2-paginator/style'); const storyPath = path.join(__dirname, '../stories'); @@ -25,7 +26,7 @@ const loaders = [{ test: /\.js?$/, use: ['babel-loader'], exclude: /node_modules/, - include: [sourcePath, paginationSourcePath, storyPath], + include: [sourcePath, paginationSourcePath, overlaySourcePath, storyPath], }, { test: /\.css$/, use: ['style-loader', 'css-loader'], diff --git a/packages/react-bootstrap-table2-example/examples/loading-overlay/empty-table-overlay.js b/packages/react-bootstrap-table2-example/examples/loading-overlay/empty-table-overlay.js new file mode 100644 index 0000000..6366f16 --- /dev/null +++ b/packages/react-bootstrap-table2-example/examples/loading-overlay/empty-table-overlay.js @@ -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 }) => ( +
+ + { sourceCode } +
+); + +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 ( + + ); + } +} +`; + +const NoDataIndication = () => ( +
+
+
+
+
+
+
+); + +const Table = ({ data, page, sizePerPage, onTableChange, totalSize }) => ( +
+ } + /> + { sourceCode } +
+); + +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 ( + + ); + } +} + +export default EmptyTableOverlay; diff --git a/packages/react-bootstrap-table2-example/examples/loading-overlay/table-overlay.js b/packages/react-bootstrap-table2-example/examples/loading-overlay/table-overlay.js new file mode 100644 index 0000000..b0dca04 --- /dev/null +++ b/packages/react-bootstrap-table2-example/examples/loading-overlay/table-overlay.js @@ -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 }) => ( +
+ + { sourceCode } +
+); + +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 ( + + ); + } +} +`; + +const RemotePagination = ({ loading, data, page, sizePerPage, onTableChange, totalSize }) => ( +
+ + { sourceCode } +
+); + +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 ( + + ); + } +} + +export default Container; diff --git a/packages/react-bootstrap-table2-example/package.json b/packages/react-bootstrap-table2-example/package.json index 563432b..a726ef5 100644 --- a/packages/react-bootstrap-table2-example/package.json +++ b/packages/react-bootstrap-table2-example/package.json @@ -18,7 +18,8 @@ "dependencies": { "bootstrap": "^3.3.7", "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": { "@storybook/addon-console": "^1.0.0", diff --git a/packages/react-bootstrap-table2-example/stories/index.js b/packages/react-bootstrap-table2-example/stories/index.js index 71746da..a999782 100644 --- a/packages/react-bootstrap-table2-example/stories/index.js +++ b/packages/react-bootstrap-table2-example/stories/index.js @@ -74,6 +74,10 @@ import PaginationHooksTable from 'examples/pagination/pagination-hooks'; import CustomPaginationTable from 'examples/pagination/custom-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 import 'bootstrap/dist/css/bootstrap.min.css'; import 'stories/stylesheet/tomorrow.min.css'; @@ -156,3 +160,7 @@ storiesOf('Pagination', module) .add('Pagination Hooks', () => ) .add('Custom Pagination', () => ) .add('Remote Pagination', () => ); + +storiesOf('EmptyTableOverlay', module) + .add('Empty Table Overlay', () => ) + .add('Table Overlay', () => ); diff --git a/packages/react-bootstrap-table2-example/stories/stylesheet/loading-overlay/_index.scss b/packages/react-bootstrap-table2-example/stories/stylesheet/loading-overlay/_index.scss new file mode 100644 index 0000000..982c07f --- /dev/null +++ b/packages/react-bootstrap-table2-example/stories/stylesheet/loading-overlay/_index.scss @@ -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); + } +} diff --git a/packages/react-bootstrap-table2-example/stories/stylesheet/storybook.scss b/packages/react-bootstrap-table2-example/stories/stylesheet/storybook.scss index 3bbec85..07510ce 100644 --- a/packages/react-bootstrap-table2-example/stories/stylesheet/storybook.scss +++ b/packages/react-bootstrap-table2-example/stories/stylesheet/storybook.scss @@ -7,4 +7,5 @@ @import "columns/index"; @import "cell-edit/index"; @import "row-selection/index"; -@import "rows/index"; \ No newline at end of file +@import "rows/index"; +@import "loading-overlay/index"; \ No newline at end of file