index.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. var React = require('react');
  2. var ReactDOM = require('react-dom');
  3. var Remarkable = require('remarkable');
  4. var DatePicker = require('react-datepicker');
  5. require('react-datepicker/dist/react-datepicker.css');
  6. var Bootstrap = require('react-bootstrap');
  7. var moment = require('moment');
  8. var $ = require('jquery');
  9. var TodoForm = React.createClass({
  10. getInitialState: function() {
  11. return {title: '', text: '', deadline: moment(), priority: '1'};
  12. },
  13. handleTitleChange: function(e) {
  14. this.setState({title: e.target.value});
  15. },
  16. handleDateChange: function(date) {
  17. this.setState({deadline: date});
  18. },
  19. handlePriorityChange: function(e) {
  20. this.setState({priority: e.target.value});
  21. },
  22. handleTextChange: function(e) {
  23. this.setState({text: e.target.value});
  24. },
  25. handleSubmit: function(e) {
  26. e.preventDefault();
  27. var title = this.state.title.trim();
  28. var text = this.state.text.trim();
  29. var priority = this.state.priority;
  30. var deadline = this.state.deadline._d.toLocaleDateString();
  31. console.log(deadline);
  32. if (!title || !text || !deadline) {
  33. return;
  34. }
  35. this.props.onCommentSubmit({a: 'add', title: title, text: text, deadline: deadline, priority: priority});
  36. this.setState({title: '', text: '', deadline: moment(), priority: '1'});
  37. },
  38. render: function() {
  39. return (
  40. <form className="form-inline" name="todoForm" onSubmit={this.handleSubmit}>
  41. <input
  42. className="form-control"
  43. type="text"
  44. placeholder="Title"
  45. value={this.state.title}
  46. onChange={this.handleTitleChange}
  47. />
  48. <select className="form-control" value={this.state.priority} onChange={this.handlePriorityChange}>
  49. <option value="1">First priority</option>
  50. <option value="2">Second priority</option>
  51. <option value="3">Not very important</option>
  52. <option value="4">Only if you are bored</option>
  53. </select>
  54. <DatePicker
  55. placeholder="yyyy-mm-dd"
  56. selected={this.state.deadline}
  57. onChange={this.handleDateChange}
  58. />
  59. <br />
  60. <textarea
  61. className="form-control"
  62. value={this.state.text}
  63. onChange={this.handleTextChange}>
  64. </textarea>
  65. <br />
  66. <input className="btn btn-primary" type="submit" value="Add" />
  67. </form>
  68. );
  69. }
  70. });
  71. var LoginForm = React.createClass({
  72. render: function() {
  73. return (
  74. <a href="http://tankernn.eu/login?redirect=http://todo.tankernn.eu">Log In</a>
  75. );
  76. }
  77. });
  78. var Item = React.createClass({
  79. rawMarkup: function() {
  80. var md = new Remarkable();
  81. var rawMarkup = md.render(this.props.children.toString());
  82. return { __html: rawMarkup };
  83. },
  84. render: function() {
  85. var md = new Remarkable();
  86. return (
  87. <div className="item">
  88. <h2>{this.props.title}</h2>
  89. <span dangerouslySetInnerHTML={this.rawMarkup()} />
  90. </div>
  91. );
  92. }
  93. });
  94. var TodoList = React.createClass({
  95. render: function() {
  96. console.log(this.props.list);
  97. var itemList = this.props.list.map(function(item) {
  98. return (
  99. <Item priority={item.priority} title={item.title} key={item.id}>
  100. {item.description}
  101. </Item>
  102. );
  103. });
  104. return (
  105. <div className="list">
  106. {itemList}
  107. </div>
  108. );
  109. }
  110. });
  111. var App = React.createClass({
  112. getInitialState: function() {
  113. return {list: []};
  114. },
  115. componentDidMount: function() {
  116. $.ajax({
  117. url: this.props.url,
  118. dataType: 'json',
  119. type: 'GET',
  120. success: function(data) {
  121. this.setState({list: data.list});
  122. }.bind(this),
  123. error: function(xhr, status, err) {
  124. console.error(this.props.url, status, err.toString());
  125. }.bind(this)
  126. });
  127. },
  128. handleCommentSubmit: function(comment) {
  129. $.ajax({
  130. url: this.props.url,
  131. dataType: 'json',
  132. cache: false,
  133. type: 'POST',
  134. data: comment,
  135. success: function(data) {
  136. if (data.result != 0) {
  137. console.log("Error in API: " + data.result);
  138. }
  139. this.setState({list: data.list});
  140. }.bind(this),
  141. error: function(xhr, status, err) {
  142. console.error(this.props.url, status, err.toString());
  143. }.bind(this)
  144. });
  145. },
  146. render: function() {
  147. return (
  148. <main>
  149. <h1>Tankernn TODO list</h1>
  150. <TodoForm onCommentSubmit={this.handleCommentSubmit} />
  151. <TodoList list={this.state.list} />
  152. <LoginForm />
  153. </main>
  154. );
  155. }
  156. });
  157. ReactDOM.render(<App url="/php/api.php" />, document.getElementById('content'));