From 01e4e4e2b09ee739b1af17bf075ff482040d84bd Mon Sep 17 00:00:00 2001 From: Seth Lemmons Date: Wed, 24 Jan 2018 19:32:52 -0700 Subject: [PATCH] Split the code to separate files and tested --- 18-panel/a-panel/src/App.css | 28 -------- 18-panel/a-panel/src/App.js | 109 +----------------------------- 18-panel/a-panel/src/Expander.css | 6 ++ 18-panel/a-panel/src/Expander.js | 41 +++++++++++ 18-panel/a-panel/src/Header.css | 16 +++++ 18-panel/a-panel/src/Header.js | 28 ++++++++ 18-panel/a-panel/src/Panel.css | 7 ++ 18-panel/a-panel/src/Panel.js | 53 +++++++++++++++ 8 files changed, 152 insertions(+), 136 deletions(-) create mode 100644 18-panel/a-panel/src/Expander.css create mode 100644 18-panel/a-panel/src/Expander.js create mode 100644 18-panel/a-panel/src/Header.css create mode 100644 18-panel/a-panel/src/Header.js create mode 100644 18-panel/a-panel/src/Panel.css create mode 100644 18-panel/a-panel/src/Panel.js diff --git a/18-panel/a-panel/src/App.css b/18-panel/a-panel/src/App.css index c5c6e8a..e69de29 100644 --- a/18-panel/a-panel/src/App.css +++ b/18-panel/a-panel/src/App.css @@ -1,28 +0,0 @@ -.App { - text-align: center; -} - -.App-logo { - animation: App-logo-spin infinite 20s linear; - height: 80px; -} - -.App-header { - background-color: #222; - height: 150px; - padding: 20px; - color: white; -} - -.App-title { - font-size: 1.5em; -} - -.App-intro { - font-size: large; -} - -@keyframes App-logo-spin { - from { transform: rotate(0deg); } - to { transform: rotate(360deg); } -} diff --git a/18-panel/a-panel/src/App.js b/18-panel/a-panel/src/App.js index 0402614..07f75fe 100644 --- a/18-panel/a-panel/src/App.js +++ b/18-panel/a-panel/src/App.js @@ -1,115 +1,8 @@ import React, { Component } from 'react'; -import './App.css'; +import Panel from './Panel'; import FontAwesomeIcon from '@fortawesome/react-fontawesome'; -import faChevronDown from '@fortawesome/fontawesome-free-solid/faChevronDown'; import faReact from '@fortawesome/fontawesome-free-brands/faReact'; - -// HEADER -// -class Header extends Component { - render () { - const { collapsible, preTools, postTools, - title, toggleCollapse } = this.props; - return ( -
- {title} -
- {preTools} - {collapsible && - - } - {postTools} -
- ); - } -} - -// EXPANDER -// -class Expander extends Component { - static defaultProps = { - expanded: true - } - componentDidMount = () => { - this.setHeight(this.props.expanded); - this.forceUpdate(); - } - componentWillReceiveProps = ({ expanded }) => { - this.setHeight(expanded); - } - setHeight = (expanded) => { - const { scrollHeight } = this.expandWrap; - this.wrapHeight = expanded ? scrollHeight + 'px' : 0; - } - render () { - const { className = 'expander-wrap', style = {} } = this.props; - Object.assign(style, { - height: this.wrapHeight - }) - return ( -
this.expandWrap = el} - className={className} - style={style} - > - {this.props.render(this.props)} -
- ); - } -} - - -// PANEL -// -class Panel extends Component { - static defaultProps = { - expanded: true - } - state = { - expanded: this.props.expanded - } - componentWillReceiveProps = ({ expanded }) => { - this.setState({expanded}); - } - toggleCollapse = () => { - this.setState({ - expanded: !this.state.expanded - }); - } - render() { - const { collapsible, expandDir, preTools, - postTools, style = {}, title } = this.props; - const { expanded } = this.state; - const showHeader = title.length || collapsible; - const className = `panel${expanded ? ' expanded' : ''}`; - return ( -
- {showHeader && -
- } - ( -
- {this.props.children} -
- )} /> -
- ); - } -} - -// PANEL INSTANCE -// class App extends Component { render() { return ( diff --git a/18-panel/a-panel/src/Expander.css b/18-panel/a-panel/src/Expander.css new file mode 100644 index 0000000..058b439 --- /dev/null +++ b/18-panel/a-panel/src/Expander.css @@ -0,0 +1,6 @@ +.expander-wrap { + overflow-y: auto; + transition: all 200ms cubic-bezier(0.25, 0.46, 0.45, 0.94); + border: 1px solid #3d83cc; + border-top-width: 0; +} \ No newline at end of file diff --git a/18-panel/a-panel/src/Expander.js b/18-panel/a-panel/src/Expander.js new file mode 100644 index 0000000..a546407 --- /dev/null +++ b/18-panel/a-panel/src/Expander.js @@ -0,0 +1,41 @@ +import React, { Component } from 'react'; +import './Expander.css'; + +class Expander extends Component { + static defaultProps = { + expanded: true + } + + componentDidMount = () => { + this.setHeight(this.props.expanded); + this.forceUpdate(); + } + + componentWillReceiveProps = ({ expanded }) => { + this.setHeight(expanded); + } + + setHeight = (expanded) => { + const { scrollHeight } = this.expandWrap; + this.wrapHeight = expanded ? scrollHeight + 'px' : 0; + } + + render () { + const { className = 'expander-wrap', style = {} } = this.props; + Object.assign(style, { + height: this.wrapHeight + }) + + return ( +
this.expandWrap = el} + className={className} + style={style} + > + {this.props.render(this.props)} +
+ ); + } +} + +export default Expander; \ No newline at end of file diff --git a/18-panel/a-panel/src/Header.css b/18-panel/a-panel/src/Header.css new file mode 100644 index 0000000..10cfce5 --- /dev/null +++ b/18-panel/a-panel/src/Header.css @@ -0,0 +1,16 @@ +.header { + display: flex; + border: 1px solid #3d83cc; + border-bottom-width: 0; + background-color: #3d83cc; + padding: 4px 8px; + color: white; +} +.header-tool { + cursor: pointer; + transition: all 200ms cubic-bezier(0.25, 0.46, 0.45, 0.94); + margin-left: 6px; +} +.expanded .collapse-tool { + transform: rotate(-180deg); +} \ No newline at end of file diff --git a/18-panel/a-panel/src/Header.js b/18-panel/a-panel/src/Header.js new file mode 100644 index 0000000..1e2e273 --- /dev/null +++ b/18-panel/a-panel/src/Header.js @@ -0,0 +1,28 @@ +import React, { Component } from 'react'; +import FontAwesomeIcon from '@fortawesome/react-fontawesome'; +import faChevronDown from '@fortawesome/fontawesome-free-solid/faChevronDown'; +import './Header.css'; + +class Header extends Component { + render() { + const { collapsible, preTools, postTools, title, toggleCollapse } = this.props; + + return ( +
+ {title} +
+ {preTools} + {collapsible && + + } + {postTools} +
+ ); + } +} + +export default Header; \ No newline at end of file diff --git a/18-panel/a-panel/src/Panel.css b/18-panel/a-panel/src/Panel.css new file mode 100644 index 0000000..a4b1a92 --- /dev/null +++ b/18-panel/a-panel/src/Panel.css @@ -0,0 +1,7 @@ +.panel { + display: flex; + flex-direction: column; +} +.body-el { + padding: 8px; +} \ No newline at end of file diff --git a/18-panel/a-panel/src/Panel.js b/18-panel/a-panel/src/Panel.js new file mode 100644 index 0000000..f6766b4 --- /dev/null +++ b/18-panel/a-panel/src/Panel.js @@ -0,0 +1,53 @@ +import React, { Component } from 'react'; +import Header from './Header'; +import Expander from './Expander'; +import './Panel.css'; + +class Panel extends Component { + static defaultProps = { + expanded: true + } + + state = { + expanded: this.props.expanded + } + + componentWillReceiveProps = ({ expanded }) => { + this.setState({ expanded }); + } + + toggleCollapse = () => { + this.setState({ + expanded: !this.state.expanded + }); + } + + render() { + const { collapsible, expandDir, headerPosition, preTools, + postTools, style = {}, title } = this.props; + const { expanded } = this.state; + const showHeader = title.length || collapsible; + const className = `panel${expanded ? ' expanded' : ''}`; + + return ( +
+ {showHeader && +
+ } + ( +
+ {this.props.children} +
+ )} /> +
+ ); + } +} + +export default Panel; \ No newline at end of file