diff --git a/packages/patternfly-3/patternfly-react/src/components/LoadingState/LoadingState.js b/packages/patternfly-3/patternfly-react/src/components/LoadingState/LoadingState.js new file mode 100644 index 00000000000..c4726a763d8 --- /dev/null +++ b/packages/patternfly-3/patternfly-react/src/components/LoadingState/LoadingState.js @@ -0,0 +1,65 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import classNames from 'classnames'; +import { Spinner } from '../Spinner'; + +class LoadingState extends Component { + constructor(props) { + super(props); + this.state = { + render: false + }; + } + + componentDidMount() { + this.onTimeout = setTimeout(() => { + this.setState({ render: true }); + }, this.props.timeout); + } + + componentWillUnmout() { + clearTimeout(this.onTimeout); + } + + render() { + const { loading, loadingText, children, size, additionalClasses } = this.props; + + const spinner = ( +
+ + {loadingText} +
+ ); + + if (loading) { + return this.state.render ? spinner : null; + } + return children; + } +} + +LoadingState.propTypes = { + /** determines whether to show spinner or children */ + loading: PropTypes.bool, + /** text to show with spinner */ + loadingText: PropTypes.string, + /** children nodes */ + children: PropTypes.node, + /** delay in showing the children */ + timeout: PropTypes.number, + /** size of the spinner */ + size: PropTypes.oneOf(['lg', 'md', 'sm', 'xs']), + /** additional css classes for LoadingState */ + additionalClasses: PropTypes.string +}; + +LoadingState.defaultProps = { + loading: false, + loadingText: 'Loading', + children: null, + timeout: 300, + size: 'lg', + additionalClasses: '' +}; + +export default LoadingState; diff --git a/packages/patternfly-3/patternfly-react/src/components/LoadingState/LoadingState.stories.js b/packages/patternfly-3/patternfly-react/src/components/LoadingState/LoadingState.stories.js new file mode 100644 index 00000000000..c7a52524b9d --- /dev/null +++ b/packages/patternfly-3/patternfly-react/src/components/LoadingState/LoadingState.stories.js @@ -0,0 +1,35 @@ +import React from 'react'; +import { storiesOf } from '@storybook/react'; +import { withKnobs, boolean, select } from '@storybook/addon-knobs'; +import { withInfo } from '@storybook/addon-info'; +import { inlineTemplate } from 'storybook/decorators/storyTemplates'; +import { storybookPackageName, DOCUMENTATION_URL, STORYBOOK_CATEGORY } from 'storybook/constants/siteConstants'; + +import { LoadingState } from './index'; + +import { name } from '../../../package.json'; + +const stories = storiesOf(`${storybookPackageName(name)}/${STORYBOOK_CATEGORY.COMMUNICATION}/Loading State`, module); + +stories.addDecorator(withKnobs); + +stories.add( + 'Loading State', + withInfo('Loading State shows centered spinner when loading')(() => { + const loading = boolean('Loading', true); + + const size = select('Size', ['lg', 'md', 'sm', 'xs'], 'lg'); + + const story = ( + +
Look at me! I am loaded content!
+
+ ); + + return inlineTemplate({ + title: 'Loading State', + documentationLink: `${DOCUMENTATION_URL.PATTERNFLY_ORG_COMMUNICATION}loading-state/`, + story + }); + }) +); diff --git a/packages/patternfly-3/patternfly-react/src/components/LoadingState/LoadingState.test.js b/packages/patternfly-3/patternfly-react/src/components/LoadingState/LoadingState.test.js new file mode 100644 index 00000000000..6cbad96d68a --- /dev/null +++ b/packages/patternfly-3/patternfly-react/src/components/LoadingState/LoadingState.test.js @@ -0,0 +1,41 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import toJson from 'enzyme-to-json'; + +import { LoadingState } from './index'; + +jest.useFakeTimers(); + +test('Loading State renders properly while loading', () => { + const component = shallow( + +

Loading Complete

+
+ ); + jest.runAllTimers(); + component.update(); + expect(component.state('render')).toEqual(true); + expect(toJson(component.render())).toMatchSnapshot(); +}); + +test('Loading State renders properly while not loading', () => { + const component = shallow( + +

Loading Complete

+
+ ); + jest.runAllTimers(); + component.update(); + expect(toJson(component.render())).toMatchSnapshot(); +}); + +test('Loadin State renders in xs size', () => { + const component = shallow( + +

Loading Complete

+
+ ); + jest.runAllTimers(); + component.update(); + expect(toJson(component.render())).toMatchSnapshot(); +}); diff --git a/packages/patternfly-3/patternfly-react/src/components/LoadingState/__snapshots__/LoadingState.test.js.snap b/packages/patternfly-3/patternfly-react/src/components/LoadingState/__snapshots__/LoadingState.test.js.snap new file mode 100644 index 00000000000..e7d4fce4cb7 --- /dev/null +++ b/packages/patternfly-3/patternfly-react/src/components/LoadingState/__snapshots__/LoadingState.test.js.snap @@ -0,0 +1,29 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Loadin State renders in xs size 1`] = ` +
+
+ Loading +
+`; + +exports[`Loading State renders properly while loading 1`] = ` +
+
+ Loading +
+`; + +exports[`Loading State renders properly while not loading 1`] = ` +

+ Loading Complete +

+`; diff --git a/packages/patternfly-3/patternfly-react/src/components/LoadingState/index.js b/packages/patternfly-3/patternfly-react/src/components/LoadingState/index.js new file mode 100644 index 00000000000..47654a4c939 --- /dev/null +++ b/packages/patternfly-3/patternfly-react/src/components/LoadingState/index.js @@ -0,0 +1 @@ +export { default as LoadingState } from './LoadingState'; diff --git a/packages/patternfly-3/react-console/package.json b/packages/patternfly-3/react-console/package.json index 73410bf865f..12cb479615a 100644 --- a/packages/patternfly-3/react-console/package.json +++ b/packages/patternfly-3/react-console/package.json @@ -45,7 +45,7 @@ "xterm": "^3.3.0" }, "devDependencies": { - "patternfly": "^3.52.1", + "patternfly": "^3.58.0", "patternfly-react": "^2.24.6" }, "peerDependencies": { diff --git a/yarn.lock b/yarn.lock index c47d6321aac..f25beed2631 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11131,40 +11131,10 @@ patternfly-bootstrap-treeview@~2.1.0: bootstrap "3.3.x" jquery ">= 2.1.x" -patternfly@^3.52.1: - version "3.54.2" - resolved "https://registry.yarnpkg.com/patternfly/-/patternfly-3.54.2.tgz#58b4b424462c4b01aaebf41db2da3bcd63bedfbf" - dependencies: - bootstrap "~3.3.7" - font-awesome "^4.7.0" - jquery "~3.2.1" - optionalDependencies: - "@types/c3" "^0.6.0" - bootstrap-datepicker "^1.7.1" - bootstrap-sass "^3.3.7" - bootstrap-select "1.12.2" - bootstrap-slider "^9.9.0" - bootstrap-switch "~3.3.4" - bootstrap-touchspin "~3.1.1" - c3 "~0.4.11" - d3 "~3.5.17" - datatables.net "^1.10.15" - datatables.net-colreorder "^1.4.1" - datatables.net-colreorder-bs "~1.3.2" - datatables.net-select "~1.2.0" - drmonty-datatables-colvis "~1.1.2" - eonasdan-bootstrap-datetimepicker "^4.17.47" - font-awesome-sass "^4.7.0" - google-code-prettify "~1.0.5" - jquery-match-height "^0.7.2" - moment "^2.19.1" - moment-timezone "^0.4.1" - patternfly-bootstrap-combobox "~1.1.7" - patternfly-bootstrap-treeview "~2.1.0" - patternfly@^3.58.0: version "3.58.0" resolved "https://registry.yarnpkg.com/patternfly/-/patternfly-3.58.0.tgz#c94516a9fbf2b645b63a53e58fcf39c45bf66a8b" + integrity sha512-geY0cbSFXoi9qv9cXCZe0OPCZBuLCuPKfEPXk0usTHjYSk5oUv3KMMuAJidbsbtXqc6vnDYjGfngepIlJ99rfg== dependencies: bootstrap "~3.3.7" font-awesome "^4.7.0"