mirror of
https://github.com/freeCodeCamp/devdocs
synced 2024-11-16 19:48:10 +01:00
172 lines
3.6 KiB
CoffeeScript
172 lines
3.6 KiB
CoffeeScript
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
|