You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
devdocs/assets/javascripts/views/content/entry_page.coffee

142 lines
3.1 KiB

11 years ago
class app.views.EntryPage extends app.View
@className: '_page'
@errorClass: '_page-error'
11 years ago
@events:
click: 'onClick'
@routes:
before: 'beforeRoute'
init: ->
@cacheMap = {}
@cacheStack = []
return
deactivate: ->
if super
@empty()
@entry = null
return
loading: ->
@empty()
@trigger 'loading'
return
render: (content = '', fromCache = false) ->
return unless @activated
11 years ago
@empty()
@subview = new (@subViewClass()) @el, @entry
$.batchUpdate @el, =>
@subview.render(content, fromCache)
@addClipboardLinks() unless fromCache
return
11 years ago
if app.disabledDocs.findBy 'slug', @entry.doc.slug
@hiddenView = new app.views.HiddenPage @el, @entry
@trigger 'loaded'
return
addClipboardLinks: ->
unless @clipBoardLink
@clipBoardLink = document.createElement('a')
@clipBoardLink.className = '_pre-clip'
@clipBoardLink.title = 'Copy to clipboard'
@clipBoardLink.tabIndex = -1
el.appendChild(@clipBoardLink.cloneNode()) for el in @el.querySelectorAll('pre')
11 years ago
return
LINKS =
home: 'Homepage'
code: 'Source code'
prepareContent: (content) ->
return content unless @entry.isIndex() and @entry.doc.links
links = for link, url of @entry.doc.links
"""<a href="#{url}" class="_links-link">#{LINKS[link]}</a>"""
"""<p class="_links">#{links.join('')}</p>#{content}"""
11 years ago
empty: ->
@subview?.deactivate()
@subview = null
@hiddenView?.deactivate()
@hiddenView = null
@resetClass()
super
return
subViewClass: ->
app.views["#{$.classify(@entry.doc.type)}Page"] or app.views.BasePage
11 years ago
getTitle: ->
@entry.doc.fullName + if @entry.isIndex() then ' documentation' else " / #{@entry.name}"
11 years ago
beforeRoute: =>
@abort()
@cache()
return
onRoute: (context) ->
isSameFile = context.entry.filePath() is @entry?.filePath()
@entry = context.entry
@restore() or @load() unless isSameFile
return
load: ->
@loading()
@xhr = @entry.loadFile @onSuccess, @onError
return
abort: ->
if @xhr
@xhr.abort()
@xhr = null
return
onSuccess: (response) =>
return unless @activated
11 years ago
@xhr = null
@render @prepareContent(response)
11 years ago
return
onError: =>
@xhr = null
@render @tmpl('pageLoadError')
@resetClass()
@addClass @constructor.errorClass
app.appCache?.update()
11 years ago
return
cache: ->
return if not @entry or @cacheMap[path = @entry.filePath()]
@cacheMap[path] = @el.innerHTML
@cacheStack.push(path)
while @cacheStack.length > app.config.history_cache_size
delete @cacheMap[@cacheStack.shift()]
return
restore: ->
if @cacheMap[path = @entry.filePath()]
@render @cacheMap[path], true
11 years ago
true
onClick: (event) =>
target = event.target
if target.hasAttribute 'data-retry'
11 years ago
$.stopEvent(event)
@load()
else if target.classList.contains '_pre-clip'
$.stopEvent(event)
target.classList.add if $.copyToClipboard(target.parentNode.textContent) then '_pre-clip-success' else '_pre-clip-error'
setTimeout (-> target.className = '_pre-clip'), 2000
11 years ago
return