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/models/doc.coffee

143 lines
3.0 KiB

class app.models.Doc extends app.Model
# Attributes: name, slug, type, version, release, db_size, mtime, links
constructor: ->
super
@reset @
@slug_without_version = @slug.split('~')[0]
@fullName = "#{@name}" + if @version then " #{@version}" else ''
@icon = @slug_without_version
@short_version = @version.split(' ')[0] if @version
@text = @toEntry().text
reset: (data) ->
@resetEntries data.entries
@resetTypes data.types
return
resetEntries: (entries) ->
@entries = new app.collections.Entries(entries)
@entries.each (entry) => entry.doc = @
return
resetTypes: (types) ->
@types = new app.collections.Types(types)
@types.each (type) => type.doc = @
return
fullPath: (path = '') ->
path = "/#{path}" unless path[0] is '/'
"/#{@slug}#{path}"
fileUrl: (path) ->
"#{app.config.docs_host}#{@fullPath(path)}?#{@mtime}"
dbUrl: ->
"#{app.config.docs_host}/#{@slug}/#{app.config.db_filename}?#{@mtime}"
indexUrl: ->
"#{app.indexHost()}/#{@slug}/#{app.config.index_filename}?#{@mtime}"
toEntry: ->
@entry ||= new app.models.Entry
doc: @
name: @fullName
path: 'index'
findEntryByPathAndHash: (path, hash) ->
if hash and entry = @entries.findBy 'path', "#{path}##{hash}"
entry
else if path is 'index'
@toEntry()
else
@entries.findBy 'path', path
load: (onSuccess, onError, options = {}) ->
return if options.readCache and @_loadFromCache(onSuccess)
callback = (data) =>
@reset data
onSuccess()
@_setCache data if options.writeCache
return
ajax
url: @indexUrl()
success: callback
error: onError
clearCache: ->
app.localStorage.del @slug
return
_loadFromCache: (onSuccess) ->
return unless data = @_getCache()
callback = =>
@reset data
onSuccess()
return
setTimeout callback, 0
true
_getCache: ->
return unless data = app.localStorage.get @slug
if data[0] is @mtime
return data[1]
else
@clearCache()
return
_setCache: (data) ->
app.localStorage.set @slug, [@mtime, data]
return
install: (onSuccess, onError, onProgress) ->
return if @installing
@installing = true
error = =>
@installing = null
onError()
return
success = (data) =>
@installing = null
app.db.store @, data, onSuccess, error
return
ajax
url: @dbUrl()
success: success
error: error
progress: onProgress
timeout: 3600
return
uninstall: (onSuccess, onError) ->
return if @installing
@installing = true
success = =>
@installing = null
onSuccess()
return
error = =>
@installing = null
onError()
return
app.db.unstore @, success, error
return
getInstallStatus: (callback) ->
app.db.version @, (value) ->
callback installed: !!value, mtime: value
return
isOutdated: (status) ->
status and status.installed and @mtime isnt status.mtime