Get caught up to this step

  • Check out the branch for the previous step: git checkout 10-done-tasks

Step 11: Deleting Tasks

We'll take the same approach as before in adding the delete feature, working from top to bottom.

Add db support for deletion

/both/collections/Tasks.js:

...
Meteor.methods({
...
  '/task/delete': function(id) {
    Tasks.remove({_id: id});
  }
});

Add a delete handler in the controller component

/client/views/TasksList.jsx:

TasksList = React.createClass({
...
  handleDeleteTask(task) {
    let confirmDelete = confirm("Really delete '" + task.title + "'?");
    if(confirmDelete){
      Meteor.call('/task/delete',task._id, function(err, result) {
        if (err) {
          console.log('there was an error: ' + err.reason);
        };
      });
    }
  },
...

  render() {

    return this.data.subsReady?
      <List
        ...
        canDeleteItem={true}
        handleDeleteItem={this.handleDeleteTask}
        ...
        />
  ...

});

List = React.createClass({
  propTypes: {
  ...
    canDeleteItem:    React.PropTypes.bool,
    handleDeleteItem: React.PropTypes.func,
   ...
  },
   getDefaultProps() {
    return {
     ...
      canDeleteItem: false
    };
  },
 ...
});
DeleteBtn = React.createClass({
  propTypes: {
    handleDelete:  React.PropTypes.func.isRequired
  },
  getDefaultProps() {
    return {
      title: "Delete"
    };
  },
  render() {
    return <button 
        onClick={this.props.handleDelete}
        className="btn btn-default btn-xs"
        title={this.props.btnTitle}
        alt={this.props.btnTitle}>
        <span className="glyphicon glyphicon-remove" aria-hidden="true"></span>
      </button>;   
  }
});
ListItem = React.createClass({
...
   displayDeleteBtn(){
    return this.props.canDeleteItem? <span className="pull-right li-option"><DeleteBtn handleDelete={this.handleDeleteItem} /></span>: null;
  },
  handleDeleteItem(){
    this.props.handleDeleteItem(this.props.item);
  },
  render(){
    return <li key={this.props.key} className="list-group-item">
             {this.displayDeleteBtn()}
             {this.displayListItem()} 
           </li>;
  }
});