You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.2 KiB
90 lines
2.2 KiB
/**
|
|
* @jsx React.DOM
|
|
*/
|
|
/*jshint quotmark:false */
|
|
/*jshint white:false */
|
|
/*jshint trailing:false */
|
|
/*jshint newcap:false */
|
|
var app = app || {};
|
|
|
|
(function () {
|
|
'use strict';
|
|
|
|
var Utils = app.Utils;
|
|
// Generic "model" object. You can use whatever
|
|
// framework you want. For this application it
|
|
// may not even be worth separating this logic
|
|
// out, but we do this to demonstrate one way to
|
|
// separate out parts of your application.
|
|
app.TodoModel = function (key) {
|
|
this.key = key;
|
|
this.todos = Utils.store(key);
|
|
this.onChanges = [];
|
|
};
|
|
|
|
app.TodoModel.prototype.subscribe = function (onChange) {
|
|
this.onChanges.push(onChange);
|
|
};
|
|
|
|
app.TodoModel.prototype.inform = function () {
|
|
Utils.store(this.key, this.todos);
|
|
this.onChanges.forEach(function (cb) { cb(); });
|
|
};
|
|
|
|
app.TodoModel.prototype.addTodo = function (title) {
|
|
this.todos = this.todos.concat({
|
|
id: Utils.uuid(),
|
|
title: title,
|
|
completed: false
|
|
});
|
|
|
|
this.inform();
|
|
};
|
|
|
|
app.TodoModel.prototype.toggleAll = function (checked) {
|
|
// Note: it's usually better to use immutable data structures since they're
|
|
// easier to reason about and React works very well with them. That's why we
|
|
// use map() and filter() everywhere instead of mutating the array or todo
|
|
// items themselves.
|
|
this.todos = this.todos.map(function (todo) {
|
|
return Utils.extend({}, todo, {completed: checked});
|
|
});
|
|
|
|
this.inform();
|
|
};
|
|
|
|
app.TodoModel.prototype.toggle = function (todoToToggle) {
|
|
this.todos = this.todos.map(function (todo) {
|
|
return todo !== todoToToggle ?
|
|
todo :
|
|
Utils.extend({}, todo, {completed: !todo.completed});
|
|
});
|
|
|
|
this.inform();
|
|
};
|
|
|
|
app.TodoModel.prototype.destroy = function (todo) {
|
|
this.todos = this.todos.filter(function (candidate) {
|
|
return candidate !== todo;
|
|
});
|
|
|
|
this.inform();
|
|
};
|
|
|
|
app.TodoModel.prototype.save = function (todoToSave, text) {
|
|
this.todos = this.todos.map(function (todo) {
|
|
return todo !== todoToSave ? todo : Utils.extend({}, todo, {title: text});
|
|
});
|
|
|
|
this.inform();
|
|
};
|
|
|
|
app.TodoModel.prototype.clearCompleted = function () {
|
|
this.todos = this.todos.filter(function (todo) {
|
|
return !todo.completed;
|
|
});
|
|
|
|
this.inform();
|
|
};
|
|
|
|
})();
|
|
|