Thibaut CouroubleUI improvements0f238609 years agoHistory
172 lines · 3.6 KB · Text
RawDownload
class app.View  $.extend @prototype, Events   constructor: ->    @setupElement()    @originalClassName = @el.className if @el.className    @resetClass() if @constructor.className    @refreshElements()    @init?()    @refreshElements()   setupElement: ->    @el ?= if typeof @constructor.el is 'string'      $ @constructor.el    else if @constructor.el      @constructor.el    else      document.createElement @constructor.tagName or 'div'     if @constructor.attributes      for key, value of @constructor.attributes        @el.setAttribute(key, value)    return   refreshElements: ->    if @constructor.elements      @[name] = @find selector for name, selector of @constructor.elements    return   addClass: (name) ->    @el.classList.add(name)    return   removeClass: (name) ->    @el.classList.remove(name)    return   toggleClass: (name) ->    @el.classList.toggle(name)    return   hasClass: (name) ->    @el.classList.contains(name)   resetClass: ->    @el.className = @originalClassName or ''    if @constructor.className      @addClass name for name in @constructor.className.split ' '    return   find: (selector) ->    $ selector, @el   findAll: (selector) ->    $$ selector, @el   findByClass: (name) ->    @findAllByClass(name)[0]   findLastByClass: (name) ->    all = @findAllByClass(name)[0]    all[all.length - 1]   findAllByClass: (name) ->    @el.getElementsByClassName(name)   findByTag: (tag) ->    @findAllByTag(tag)[0]   findLastByTag: (tag) ->    all = @findAllByTag(tag)    all[all.length - 1]   findAllByTag: (tag) ->    @el.getElementsByTagName(tag)   append: (value) ->    $.append @el, value.el or value    return   appendTo: (value) ->    $.append value.el or value, @el    return   prepend: (value) ->    $.prepend @el, value.el or value    return   prependTo: (value) ->    $.prepend value.el or value, @el    return   before: (value) ->    $.before @el, value.el or value    return   after: (value) ->    $.after @el, value.el or value    return   remove: (value) ->    $.remove value.el or value    return   empty: ->    $.empty @el    @refreshElements()    return   html: (value) ->    @empty()    @append value    return   tmpl: (args...) ->    app.templates.render(args...)   delay: (fn, args...) ->    delay = if typeof args[args.length - 1] is 'number' then args.pop() else 0    setTimeout fn.bind(@, args...), delay   onDOM: (event, callback) ->    $.on @el, event, callback    return   offDOM: (event, callback) ->    $.off @el, event, callback    return   bindEvents: ->    if @constructor.events      @onDOM name, @[method] for name, method of @constructor.events     if @constructor.routes      app.router.on name, @[method] for name, method of @constructor.routes     if @constructor.shortcuts      app.shortcuts.on name, @[method] for name, method of @constructor.shortcuts    return   unbindEvents: ->    if @constructor.events      @offDOM name, @[method] for name, method of @constructor.events     if @constructor.routes      app.router.off name, @[method] for name, method of @constructor.routes     if @constructor.shortcuts      app.shortcuts.off name, @[method] for name, method of @constructor.shortcuts    return   addSubview: (view) ->    (@subviews or= []).push(view)   activate: ->    return if @activated    @bindEvents()    view.activate() for view in @subviews if @subviews    @activated = true    true   deactivate: ->    return unless @activated    @unbindEvents()    view.deactivate() for view in @subviews if @subviews    @activated = false    true   detach: ->    @deactivate()    $.remove @el    return