var Marionette = require('backbone.marionette');
var tpl = require('./item.hbs');
/**
* @version 1.0.0
* @description Todo List Item View -
* Display an individual todo item, and respond to changes
* that are made to the item, including marking completed.
* @module views/todos/item
* @link {http://marionettejs.com/}
*/
module.exports = Marionette.ItemView.extend({
/** tag name */
tagName: 'li',
/** template */
template: tpl,
/**
* @desc UI bindings create cached attributes that
* point to jQuery selected objects
*/
ui: {
edit: '.edit'
},
/** events */
events: {
'click .destroy': 'destroy',
'click .toggle': 'toggle',
'dblclick label': 'onEditClick',
'keydown @ui.edit': 'onEditKeypress',
'focusout @ui.edit': 'onEditFocusout'
},
/** model events */
modelEvents: {
'change': 'render'
},
/**
* @func onRender
*/
onRender: function () {
this.$el.removeClass('active completed');
if (this.model.get('completed')) {
this.$el.addClass('completed');
} else {
this.$el.addClass('active');
}
},
/**
* @func destroy
*/
destroy: function () {
this.model.destroy();
},
/**
* @func toggle
*/
toggle: function () {
this.model.toggle().save();
},
/**
* @desc edit click event handler
* @func onEditClick
*/
onEditClick: function () {
this.$el.addClass('editing');
this.ui.edit.focus();
this.ui.edit.val(this.ui.edit.val());
},
/**
* @desc edit focus out event handler
* @func onEditFocusout
*/
onEditFocusout: function () {
var todoText = this.ui.edit.val().trim();
if (todoText) {
this.model.set('title', todoText).save();
this.$el.removeClass('editing');
} else {
this.destroy();
}
},
/**
* @desc edit key press event handler
* @func onEditKeypress
* @param e - event
*/
onEditKeypress: function (e) {
var ENTER_KEY = 13, ESC_KEY = 27;
if (e.which === ENTER_KEY) {
this.onEditFocusout();
return;
}
if (e.which === ESC_KEY) {
this.ui.edit.val(this.model.get('title'));
this.$el.removeClass('editing');
}
}
});