mirror of
https://github.com/freeCodeCamp/devdocs
synced 2024-11-16 19:48:10 +01:00
109 lines
2 KiB
CoffeeScript
109 lines
2 KiB
CoffeeScript
class app.views.EntryPage extends app.View
|
|
@className: '_page'
|
|
|
|
@events:
|
|
click: 'onClick'
|
|
|
|
@routes:
|
|
before: 'beforeRoute'
|
|
|
|
init: ->
|
|
@cacheMap = {}
|
|
@cacheStack = []
|
|
return
|
|
|
|
deactivate: ->
|
|
if super
|
|
@empty()
|
|
@entry = null
|
|
return
|
|
|
|
loading: ->
|
|
@empty()
|
|
@trigger 'loading'
|
|
return
|
|
|
|
render: (content = '') ->
|
|
return unless @activated
|
|
@empty()
|
|
|
|
@subview = new (@subViewClass()) @el, @entry
|
|
@subview.render(content)
|
|
|
|
if app.disabledDocs.findBy 'slug', @entry.doc.slug
|
|
@hiddenView = new app.views.HiddenPage @el, @entry
|
|
|
|
@trigger 'loaded'
|
|
return
|
|
|
|
empty: ->
|
|
@subview?.deactivate()
|
|
@subview = null
|
|
|
|
@hiddenView?.deactivate()
|
|
@hiddenView = null
|
|
|
|
@resetClass()
|
|
super
|
|
return
|
|
|
|
subViewClass: ->
|
|
docType = @entry.doc.type
|
|
app.views["#{docType[0].toUpperCase()}#{docType[1..]}Page"] or app.views.BasePage
|
|
|
|
getTitle: ->
|
|
@entry.doc.name + if @entry.isIndex() then '' else "/#{@entry.name}"
|
|
|
|
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) =>
|
|
@xhr = null
|
|
@render response
|
|
return
|
|
|
|
onError: =>
|
|
@xhr = null
|
|
@render @tmpl('pageLoadError')
|
|
app.appCache?.update()
|
|
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
|
|
|
|
onClick: (event) =>
|
|
if event.target.hasAttribute 'data-retry'
|
|
$.stopEvent(event)
|
|
@load()
|
|
return
|