todomvc
Version:
> Helping you select an MV\* framework
99 lines (76 loc) • 2.89 kB
text/coffeescript
derby = require 'derby'
{get, view, ready} = derby.createApp module
derby.use(require '../../ui')
view.fn 'noItems',
get: (list) -> !list.length unless list is undefined
set: ->
view.fn 'oneItem',
get: (list) -> list.length == 1 unless list is undefined
get '/', (page) ->
page.redirect '/' + parseInt(Math.random() * 1e9).toString(36)
get '/:groupName', (page, model, {groupName}) ->
model.query('todos').forGroup(groupName).subscribe ->
model.set '_groupName', groupName
model.ref '_list.all', model.filter('todos')
.where('group').equals(groupName)
model.ref '_list.completed', model.filter('todos')
.where('group').equals(groupName)
.where('completed').equals(true)
model.ref '_list.active', model.filter('todos')
.where('group').equals(groupName)
.where('completed').notEquals(true)
model.set '_list.filterName', 'all'
model.ref '_list.shown', '_list.all'
page.render()
get from: '/:groupName', to: '/:groupName/:filterName',
forward: (model, {filterName}) ->
model.set '_list.filterName', filterName
model.ref '_list.shown', "_list.#{filterName}"
back: (model, params) ->
model.set '_list.filterName', filterName
model.ref '_list.shown', "_list.all"
get from: '/:groupName/:filterName', to: '/:groupName/:filterName',
forward: (model, {filterName}) ->
model.set '_list.filterName', filterName
model.ref '_list.shown', "_list.#{filterName}"
ready (model) ->
todos = model.at 'todos'
newTodo = model.at '_newTodo'
exports.add = ->
text = newTodo.get().trim()
newTodo.set ''
return unless text
todos.add text: text, group: model.get('_groupName')
exports.del = (e, el) ->
todos.del model.at(el).get('id')
exports.clearCompleted = ->
for {id} in model.get('_list.completed')
todos.del id
exports.clickToggleAll = ->
value = !!model.get('_list.active.length')
for {id} in model.get('_list.all')
todos.set id + '.completed', value
exports.submitEdit = (e, el) ->
el.firstChild.blur()
exports.startEdit = (e, el) ->
item = model.at(el)
item.set '_editing', true
input = el.parentElement.parentElement.lastChild.firstChild
input.value = item.get('text')
input.focus()
exports.endEdit = (e, el) ->
item = model.at(el)
item.set '_editing', false
if item.get('text').trim() == ''
todos.del item.get('id')