summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMaxim <stenmarsh938@gmail.com>2017-05-23 17:32:17 +0300
committerGitHub <noreply@github.com>2017-05-23 17:32:17 +0300
commit60c207b7f52ba614d63c0003fee0b0974745f547 (patch)
tree619ed3b3f854ff4e2df81fb3e671e0cc0af539de /src
parent7b1e4c1749c599a154616b0df8ccc252be5f8739 (diff)
parent9c9af54cde48937f7d0ce1ac9f26918af51ada08 (diff)
downloadreact-gantt-demo-60c207b7f52ba614d63c0003fee0b0974745f547.zip
react-gantt-demo-60c207b7f52ba614d63c0003fee0b0974745f547.tar.gz
react-gantt-demo-60c207b7f52ba614d63c0003fee0b0974745f547.tar.bz2
Merge pull request #1 from AlexKlimenkov/master
move toolbar and message area to separate components
Diffstat (limited to 'src')
-rw-r--r--src/App.js41
-rw-r--r--src/Gantt.js10
-rw-r--r--src/MessageArea.js23
-rw-r--r--src/Toolbar.js36
4 files changed, 75 insertions, 35 deletions
diff --git a/src/App.js b/src/App.js
index e6ccfb2..c38227a 100644
--- a/src/App.js
+++ b/src/App.js
@@ -1,8 +1,10 @@
import React, { Component } from 'react';
import Gantt from './Gantt';
+import Toolbar from './Toolbar';
+import MessageArea from './MessageArea';
import './App.css';
-var data = {
+let data = {
data: [
{id: 1, text: 'Task #1', start_date: '15-04-2017', duration: 3, progress: 0.6},
{id: 2, text: 'Task #2', start_date: '18-04-2017', duration: 3, progress: 0.4}
@@ -50,36 +52,19 @@ class App extends Component {
this.addMessage(message)
}
- handleZoomChange(e) {
+ handleZoomChange(zoom) {
this.setState({
- currentZoom: e.target.value
+ currentZoom: zoom
});
}
render() {
- let zoomRadios = ['Hours', 'Days', 'Months'].map((value) => {
- let isActive = this.state.currentZoom === value;
- return (
- <label key={value} className={`radio-label ${isActive ? 'radio-label-active': ''}`}>
- <input type='radio'
- checked={isActive}
- onChange={this.handleZoomChange}
- value={value}/>
- {value}
- </label>
- );
- });
-
- let messages = this.state.messages.map(({key, message}) => {
- return <li key={key}>{message}</li>
- });
-
return (
<div>
- <div className="zoom-bar">
- <b>Zooming: </b>
- {zoomRadios}
- </div>
+ <Toolbar
+ zoom={this.state.currentZoom}
+ onZoomChange={this.handleZoomChange}
+ />
<div className="gantt-container">
<Gantt
tasks={data}
@@ -88,11 +73,9 @@ class App extends Component {
onLinkUpdated={this.logLinkUpdate}
/>
</div>
- <div className="message-area">
- <ul>
- {messages}
- </ul>
- </div>
+ <MessageArea
+ messages={this.state.messages}
+ />
</div>
);
}
diff --git a/src/Gantt.js b/src/Gantt.js
index 63f672b..7a04bc5 100644
--- a/src/Gantt.js
+++ b/src/Gantt.js
@@ -39,14 +39,12 @@ export default class Gantt extends Component {
}
}
- componentWillReceiveProps(nextProps){
- this.needGanttRedraw = this.props.zoom !== nextProps.zoom;
+ shouldComponentUpdate(nextProps ){
+ return this.props.zoom !== nextProps.zoom;
}
componentDidUpdate() {
- if (this.needGanttRedraw) {
- gantt.render();
- }
+ gantt.render();
}
componentDidMount() {
@@ -85,7 +83,7 @@ export default class Gantt extends Component {
this.props.onLinkUpdated(id, 'deleted');
}
});
- gantt.init(this.ganttContainer);
+ gantt.init(this.ganttContainer);
gantt.parse(this.props.tasks);
}
diff --git a/src/MessageArea.js b/src/MessageArea.js
new file mode 100644
index 0000000..bef505d
--- /dev/null
+++ b/src/MessageArea.js
@@ -0,0 +1,23 @@
+import React, { Component } from 'react';
+
+class MessageArea extends Component {
+ render() {
+ let messages = this.props.messages.map(({key, message}) => {
+ return <li key={key}>{message}</li>
+ });
+
+ return (
+ <div className="message-area">
+ <ul>
+ {messages}
+ </ul>
+ </div>
+ );
+ }
+}
+
+MessageArea.defaultProps = {
+ messages: []
+};
+
+export default MessageArea; \ No newline at end of file
diff --git a/src/Toolbar.js b/src/Toolbar.js
new file mode 100644
index 0000000..ca42f75
--- /dev/null
+++ b/src/Toolbar.js
@@ -0,0 +1,36 @@
+import React, { Component } from 'react';
+
+export default class Toolbar extends Component {
+ constructor(props) {
+ super(props);
+ this.handleZoomChange = this.handleZoomChange.bind(this);
+ }
+
+ handleZoomChange(e) {
+ if(this.props.onZoomChange){
+ this.props.onZoomChange(e.target.value)
+ }
+ }
+
+ render() {
+ let zoomRadios = ['Hours', 'Days', 'Months'].map((value) => {
+ let isActive = this.props.zoom === value;
+ return (
+ <label key={value} className={`radio-label ${isActive ? 'radio-label-active': ''}`}>
+ <input type='radio'
+ checked={isActive}
+ onChange={this.handleZoomChange}
+ value={value}/>
+ {value}
+ </label>
+ );
+ });
+
+ return (
+ <div className="zoom-bar">
+ <b>Zooming: </b>
+ {zoomRadios}
+ </div>
+ );
+ }
+}