index.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. var React = require('react');
  2. var ReactDOM = require('react-dom');
  3. var Remarkable = require('remarkable');
  4. var Button = require('react-bootstrap').Button;
  5. var FormControl = require('react-bootstrap').FormControl;
  6. var FormGroup = require('react-bootstrap').FormGroup;
  7. var Panel = require('react-bootstrap').Panel;
  8. var DatePicker = require('react-bootstrap-date-picker');
  9. var $ = require('jquery');
  10. const LOGIN_URL = "https://tankernn.eu/login/check_login.php";
  11. const API_URL = "https://todo.tankernn.eu/php/api.php";
  12. const priorityNames = {1: "danger", 2: "warning", 3: "primary", 4: "success"};
  13. var TodoForm = React.createClass({
  14. getInitialState: function() {
  15. return {title: '', text: '', deadline: new Date().toISOString(), priority: '1'};
  16. },
  17. handleTitleChange: function(e) {
  18. this.setState({title: e.target.value});
  19. },
  20. handleDateChange: function(dateString) {
  21. this.setState({deadline: dateString});
  22. },
  23. handlePriorityChange: function(e) {
  24. this.setState({priority: e.target.value});
  25. },
  26. handleTextChange: function(e) {
  27. this.setState({text: e.target.value});
  28. },
  29. handleSubmit: function(e) {
  30. e.preventDefault();
  31. var title = this.state.title.trim();
  32. var text = this.state.text.trim();
  33. var priority = this.state.priority;
  34. var deadline = this.state.deadline;
  35. console.log(deadline);
  36. if (!title || !text || !deadline) {
  37. return;
  38. }
  39. this.props.onCommentSubmit({a: 'add', title: title, text: text, deadline: deadline, priority: priority});
  40. this.setState(this.getInitialState());
  41. },
  42. render: function() {
  43. return (
  44. <form className="form-inline" name="todoForm" onSubmit={this.handleSubmit}>
  45. <FormControl
  46. type="text"
  47. placeholder="Title"
  48. value={this.state.title}
  49. onChange={this.handleTitleChange}
  50. />
  51. <FormControl componentClass="select" value={this.state.priority} onChange={this.handlePriorityChange}>
  52. <option value="1">First priority</option>
  53. <option value="2">Second priority</option>
  54. <option value="3">Not very important</option>
  55. <option value="4">Only if you are bored</option>
  56. </FormControl>
  57. <DatePicker
  58. value={this.state.deadline}
  59. onChange={this.handleDateChange}
  60. />
  61. <br />
  62. <FormControl
  63. componentClass="textarea"
  64. value={this.state.text}
  65. onChange={this.handleTextChange} />
  66. <br />
  67. <Button bsStyle="primary" type="submit">Add</Button>
  68. </form>
  69. );
  70. }
  71. });
  72. var LoginForm = React.createClass({
  73. getInitialState: function() {
  74. return {user: '', pass: ''};
  75. },
  76. handleUserChange: function(e) {
  77. this.setState({user: e.target.value});
  78. },
  79. handlePassChange: function(e) {
  80. this.setState({pass: e.target.value});
  81. },
  82. handleSubmit: function(e) {
  83. e.preventDefault();
  84. var user = this.state.user;
  85. var pass = this.state.pass;
  86. if (!user || !pass) {
  87. return;
  88. }
  89. this.props.onLoginSubmit({user: user, pass: pass});
  90. this.setState(this.getInitialState());
  91. },
  92. render: function() {
  93. return (
  94. <form id="loginForm" name="loginForm" onSubmit={this.handleSubmit}>
  95. <FormControl type="text" value={this.state.user} onChange={this.handleUserChange} />
  96. <FormControl type="password" value={this.state.pass} onChange={this.handlePassChange} />
  97. <Button bsStyle="primary" type="submit">Log in</Button>
  98. </form>
  99. );
  100. }
  101. });
  102. var Item = React.createClass({
  103. rawMarkup: function() {
  104. var md = new Remarkable();
  105. var rawMarkup = md.render(this.props.children.toString());
  106. return { __html: rawMarkup };
  107. },
  108. handleEditClick: function() {
  109. console.log("I wanna edit.");
  110. },
  111. render: function() {
  112. var md = new Remarkable();
  113. return (
  114. <Panel header={this.props.title} footer={<FormGroup><Button bsStyle="primary" onClick={this.handleEditClick}>Edit</Button><Button bsStyle="danger">Delete</Button></FormGroup>} bsStyle={priorityNames[this.props.priority]}>
  115. <span dangerouslySetInnerHTML={this.rawMarkup()} />
  116. </Panel>
  117. );
  118. }
  119. });
  120. var TodoList = React.createClass({
  121. render: function() {
  122. console.log(this.props.list);
  123. var itemList = this.props.list.map(function(item) {
  124. return (
  125. <Item priority={item.priority} title={item.title} key={item.id} deadline={item.deadline}>
  126. {item.description}
  127. </Item>
  128. );
  129. });
  130. return (
  131. <div className="list">
  132. {itemList}
  133. </div>
  134. );
  135. }
  136. });
  137. var App = React.createClass({
  138. getInitialState: function() {
  139. return {list: [], result: 0};
  140. },
  141. updateList: function() {
  142. $.ajax({
  143. url: this.props.url,
  144. dataType: 'json',
  145. type: 'GET',
  146. success: function(data) {
  147. this.setState({list: data.list, result: data.result});
  148. }.bind(this),
  149. error: function(xhr, status, err) {
  150. console.error(this.props.url, status, err.toString());
  151. }.bind(this)
  152. });
  153. },
  154. componentDidMount: function() {
  155. this.updateList();
  156. },
  157. handleCommentSubmit: function(comment) {
  158. $.ajax({
  159. url: this.props.url,
  160. dataType: 'json',
  161. cache: false,
  162. type: 'POST',
  163. data: comment,
  164. success: function(data) {
  165. if (data.result != 0) {
  166. console.log("Error in API: " + data.result);
  167. }
  168. this.setState({list: data.list, result: data.result});
  169. }.bind(this),
  170. error: function(xhr, status, err) {
  171. console.error(this.props.url, status, err.toString());
  172. this.setState({result: 1});
  173. }.bind(this)
  174. });
  175. },
  176. handleLoginSubmit: function(data) {
  177. $.ajax({
  178. url: LOGIN_URL,
  179. cache: false,
  180. type: 'POST',
  181. data: data,
  182. success: function(result) {
  183. console.log(result);
  184. this.forceUpdate();
  185. }.bind(this)
  186. });
  187. },
  188. render: function() {
  189. console.log(this.state);
  190. if (this.state.result != 1)
  191. return (
  192. <main>
  193. <h1>Tankernn TODO list</h1>
  194. <TodoForm onCommentSubmit={this.handleCommentSubmit} />
  195. <TodoList list={this.state.list} />
  196. </main>
  197. );
  198. else
  199. return (
  200. <main>
  201. <h1>Tankernn TODO list</h1>
  202. <LoginForm onLoginSubmit={this.handleLoginSubmit} />
  203. </main>
  204. );
  205. }
  206. });
  207. ReactDOM.render(<App url={API_URL} />, document.getElementById('content'));