App.jsx 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // App component : represents the whole app.
  2. App = React.createClass({
  3. // This mixin makes the getMeteorData work.
  4. mixins: [ReactMeteorData],
  5. getInitialState() {
  6. return {
  7. hideCompleted: false
  8. };
  9. },
  10. // Loads items from the Tasks collection and puts them on this.data.tasks.
  11. getMeteorData() {
  12. let query = {};
  13. const uncheckedQuery = { checked: { $ne: true} };
  14. if (this.state.hideCompleted) {
  15. // If hideCompleted is checked, filter tasks.
  16. query = uncheckedQuery;
  17. }
  18. let result = {
  19. tasks: Tasks.find(query, { sort: { createdAt: -1 }}).fetch(),
  20. // Since we already have the data in the client-side Minimongo collection,
  21. // adding this extra count doesn't involve asking the server for anything.
  22. incompleteCount: Tasks.find(uncheckedQuery).count()
  23. };
  24. // Meteor._debug("result", result);
  25. return result;
  26. },
  27. renderTasks() {
  28. return this.data.tasks.map((task) => {
  29. // Meteor._debug(task._id);
  30. return <Task key={task._id} task={task} />;
  31. });
  32. },
  33. handleSubmit(event) {
  34. event.preventDefault();
  35. // Meteor._debug('refs', this.refs);
  36. // Find the text field via the React ref.
  37. var text = ReactDOM.findDOMNode(this.refs.textInput).value.trim();
  38. Tasks.insert({
  39. text: text,
  40. createdAt: new Date(), // Current time
  41. owner: Meteor.userId(), // _id of logged-in user
  42. username: Meteor.user().username // username of logged-in user
  43. });
  44. // Clear form to allow a new input.
  45. ReactDOM.findDOMNode(this.refs.textInput).value = '';
  46. },
  47. toggleHideCompleted() {
  48. this.setState({
  49. hideCompleted: !this.state.hideCompleted
  50. });
  51. },
  52. render() {
  53. return (
  54. <div className="container">
  55. <header>
  56. <h1>Todo list ({this.data.incompleteCount})</h1>
  57. <label className="hide-completed">
  58. <input type="checkbox" readOnly={true}
  59. checked={this.state.hideCompleted}
  60. onClick={this.toggleHideCompleted} />
  61. Hide completed
  62. </label>
  63. <AccountsUIWrapper />
  64. {/* These are JSX comments. */}
  65. {/* Beware: for React, onsubmit is not the same as onSubmit, the former doesn't work */}
  66. <form className="new-task" onSubmit={this.handleSubmit} >
  67. <input type="text" ref="textInput" placeholder="Type to add new tasks" />
  68. </form>
  69. </header>
  70. <ul>
  71. {this.renderTasks()}
  72. </ul>
  73. </div>
  74. );
  75. }
  76. });