2013-08-14 06:53:29 +08:00
|
|
|
var filters = {
|
|
|
|
|
all: function () { return true },
|
|
|
|
|
active: function (todo) { return !todo.completed },
|
|
|
|
|
completed: function (todo) { return todo.completed }
|
|
|
|
|
}
|
|
|
|
|
|
2013-08-15 12:39:32 +08:00
|
|
|
var Todos = Seed.ViewModel.extend({
|
2013-08-07 14:03:16 +08:00
|
|
|
|
2013-08-16 09:41:02 +08:00
|
|
|
init: function () {
|
2013-08-14 06:53:29 +08:00
|
|
|
this.todos = todoStorage.fetch()
|
|
|
|
|
this.remaining = this.todos.filter(filters.active).length
|
2013-08-16 00:26:13 +08:00
|
|
|
this.updateFilter()
|
2013-08-14 06:53:29 +08:00
|
|
|
},
|
2013-08-07 14:03:16 +08:00
|
|
|
|
2013-08-16 09:41:02 +08:00
|
|
|
props: {
|
2013-08-15 12:39:32 +08:00
|
|
|
|
|
|
|
|
updateFilter: function () {
|
|
|
|
|
var filter = location.hash.slice(2)
|
|
|
|
|
this.filter = (filter in filters) ? filter : 'all'
|
2013-08-10 00:18:34 +08:00
|
|
|
},
|
2013-08-09 04:24:28 +08:00
|
|
|
|
2013-08-15 12:39:32 +08:00
|
|
|
// computed properties ----------------------------------------------------
|
|
|
|
|
total: {get: function () {
|
|
|
|
|
return this.todos.length
|
|
|
|
|
}},
|
|
|
|
|
|
|
|
|
|
completed: {get: function () {
|
|
|
|
|
return this.total - this.remaining
|
|
|
|
|
}},
|
|
|
|
|
|
|
|
|
|
// dynamic context computed property using info from target viewmodel
|
|
|
|
|
todoFiltered: {get: function (ctx) {
|
|
|
|
|
return filters[this.filter]({ completed: ctx.vm.completed })
|
|
|
|
|
}},
|
|
|
|
|
|
|
|
|
|
// dynamic context computed property using info from target element
|
|
|
|
|
filterSelected: {get: function (ctx) {
|
|
|
|
|
return this.filter === ctx.el.textContent.toLowerCase()
|
|
|
|
|
}},
|
|
|
|
|
|
|
|
|
|
// two-way computed property with both getter and setter
|
|
|
|
|
allDone: {
|
|
|
|
|
get: function () {
|
|
|
|
|
return this.remaining === 0
|
|
|
|
|
},
|
|
|
|
|
set: function (value) {
|
|
|
|
|
this.todos.forEach(function (todo) {
|
|
|
|
|
todo.completed = value
|
|
|
|
|
})
|
|
|
|
|
this.remaining = value ? 0 : this.total
|
|
|
|
|
todoStorage.save(this.todos)
|
|
|
|
|
}
|
|
|
|
|
},
|
2013-08-07 14:03:16 +08:00
|
|
|
|
2013-08-15 12:39:32 +08:00
|
|
|
// event handlers ---------------------------------------------------------
|
|
|
|
|
addTodo: function () {
|
|
|
|
|
var value = this.newTodo && this.newTodo.trim()
|
|
|
|
|
if (value) {
|
|
|
|
|
this.todos.unshift({ title: value, completed: false })
|
|
|
|
|
this.newTodo = ''
|
|
|
|
|
this.remaining++
|
|
|
|
|
todoStorage.save(this.todos)
|
|
|
|
|
}
|
|
|
|
|
},
|
2013-08-07 14:03:16 +08:00
|
|
|
|
2013-08-15 12:39:32 +08:00
|
|
|
removeTodo: function (e) {
|
|
|
|
|
this.todos.remove(e.vm)
|
|
|
|
|
this.remaining -= e.vm.completed ? 0 : 1
|
|
|
|
|
todoStorage.save(this.todos)
|
|
|
|
|
},
|
2013-08-07 14:03:16 +08:00
|
|
|
|
2013-08-15 12:39:32 +08:00
|
|
|
toggleTodo: function (e) {
|
|
|
|
|
this.remaining += e.vm.completed ? -1 : 1
|
|
|
|
|
todoStorage.save(this.todos)
|
|
|
|
|
},
|
2013-08-07 14:03:16 +08:00
|
|
|
|
2013-08-15 12:39:32 +08:00
|
|
|
editTodo: function (e) {
|
|
|
|
|
this.beforeEditCache = e.vm.title
|
|
|
|
|
e.vm.editing = true
|
|
|
|
|
},
|
2013-08-11 13:50:32 +08:00
|
|
|
|
2013-08-15 12:39:32 +08:00
|
|
|
doneEdit: function (e) {
|
|
|
|
|
if (!e.vm.editing) return
|
|
|
|
|
e.vm.editing = false
|
|
|
|
|
e.vm.title = e.vm.title.trim()
|
|
|
|
|
if (!e.vm.title) this.removeTodo(e)
|
|
|
|
|
todoStorage.save(this.todos)
|
|
|
|
|
},
|
2013-08-14 06:53:29 +08:00
|
|
|
|
2013-08-15 12:39:32 +08:00
|
|
|
cancelEdit: function (e) {
|
|
|
|
|
e.vm.editing = false
|
|
|
|
|
e.vm.title = this.beforeEditCache
|
|
|
|
|
},
|
2013-08-07 14:03:16 +08:00
|
|
|
|
2013-08-15 12:39:32 +08:00
|
|
|
removeCompleted: function () {
|
|
|
|
|
this.todos = this.todos.filter(filters.active)
|
|
|
|
|
todoStorage.save(this.todos)
|
|
|
|
|
}
|
2013-08-07 14:03:16 +08:00
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
2013-08-16 00:26:13 +08:00
|
|
|
var app = new Todos({ el: '#todoapp' })
|
|
|
|
|
|
|
|
|
|
window.addEventListener('hashchange', function () {
|
|
|
|
|
app.updateFilter()
|
|
|
|
|
})
|