soma.js
Version:
soma.js is a javascript framework created to build scalable and maintainable applications.
117 lines (92 loc) • 2.48 kB
JavaScript
var todo = window.todo || {};
(function( window ) {
'use strict';
var ENTER_KEY = 13;
todo.Template = function( scope, template, model, router ) {
var todos = scope.todos = model.get();
router.on(/.*/, function(path) {
render();
});
var render = function() {
scope.active = getActiveItems( scope.todos );
scope.completed = scope.todos.length - scope.active;
scope.allCompleted = scope.todos.length > 0 && scope.active === 0 ? true : false;
scope.clearCompletedVisible = scope.completed > 0 ? true : false;
//scope.footerVisible = scope.todos.length > 0 ? true : false;
scope.itemLabel = scope.active === 1 ? 'item' : 'items';
template.render();
model.set( todos );
}.bind( this );
scope.filteredTodos = function() {
var filter = router.getRoute()[0];
if (filter === '') {
return todos;
}
return todos.filter(function( todo ) {
return filter === 'active' ? !todo.completed : todo.completed;
});
};
scope.completedClass = function( completed ) {
return completed ? 'completed' : '';
};
scope.add = function( event ) {
var value = event.currentTarget.value.trim();
if ( event.which === ENTER_KEY && value !== '' ) {
todos.push({
title: value,
completed: false
});
render();
event.currentTarget.value = '';
}
};
scope.remove = function( event, todo ) {
if ( todo ) {
todos.splice( todos.indexOf( todo ), 1 );
render();
}
};
scope.toggle = function( event, todo ) {
todo.completed = !todo.completed;
render();
};
scope.edit = function( event, todo ) {
todo.editing = "editing";
render();
};
scope.update = function( event, todo ) {
var value = event.currentTarget.value.trim();
if ( event.which === ENTER_KEY ) {
if ( value ) {
todo.title = value;
}
else {
todos.splice(todos.indexOf(todo), 1);
}
todo.editing = "";
render();
}
};
scope.toggleAll = function( event ) {
todos.forEach(function( todo ) {
todo.completed = event.currentTarget.checked;
});
render();
};
scope.clearCompleted = function() {
todos = scope.todos = todos.filter(function( todo ) {
return !todo.completed;
});
render();
};
scope.clear = function( event ) {
event.currentTarget.value = '';
};
function getActiveItems( data ) {
return todos.filter(function( todo ) {
return !todo.completed;
}).length;
}
render();
};
})( window );