todomvc
Version:
> Helping you select an MV\* framework
83 lines (59 loc) • 2.04 kB
text/coffeescript
class Todo extends Serenade.Model
'app', inverseOf: 'all', as: -> App
'title', serialize: true
'completed', serialize: true
'incomplete',
get: -> not
'edit'
remove: ->
.all.delete(this)
class App extends Serenade.Model
'all', inverseOf: 'app', serialize: true, as: -> Todo
'active', from: 'all', filter: 'incomplete'
'completed', from: 'all', filter: 'completed'
'label',
get: -> if is 1 then 'item left' else 'items left'
'allCompleted',
get: -> is 0
set: (value) -> todo.completed = value for todo in
'newTitle'
'filter', value: 'all'
'filtered', get: -> @[]
'filterAll', get: -> is 'all'
'filterActive', get: -> is 'active'
'filterCompleted', get: -> is 'completed'
class AppController
constructor: () ->
newTodo: ->
title = .newTitle.trim()
.all.push(title: title) if title
.newTitle = ''
clearCompleted: ->
.all = .active
class TodoController
constructor: () ->
removeTodo: ->
.remove()
edit: ->
.edit = true
.select()
edited: ->
if .title.trim()
.title = .title.trim()
.edit = false if .edit
else
.remove()
.app.changed.trigger()
loadField: () ->
app = new App(JSON.parse(localStorage.getItem('todos-serenade')))
app.changed.bind -> localStorage.setItem('todos-serenade', app)
router = Router
'/': -> app.filter = 'all'
'/active': -> app.filter = 'active'
'/completed': -> app.filter = 'completed'
router.init()
Serenade.view('app', document.getElementById('app').innerHTML)
Serenade.view('todo', document.getElementById('todo').innerHTML)
Serenade.controller('app', AppController)
Serenade.controller('todo', TodoController)
document.body.insertBefore(Serenade.render('app', app), document.body.children[0])