123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- Spine = require('spine/core')
- require('spine/route')
- require('spine/manager')
- require('lib/spine-couch-ajax')
- require('lib/spine-couch-changes')
- require('lib/fastclick')
- templates = require('duality/templates')
- session = require('session')
- MainNav = require('controllers/main-nav')
- MainStack = require('controllers/main-stack')
- HelpUI = require('controllers/ui/help')
- Site = require('models/site')
- Author = require('models/author')
- Collection = require('models/collection')
- Essay = require('models/essay')
- Video = require('models/video')
- Scene = require('models/scene')
- Block = require('models/block')
- Contact = require('models/contact')
- Sponsor = require('models/sponsor')
- Redirect = require('models/redirect')
- class App extends Spine.Controller
-
- constructor: ->
- super
- @appStarted = false
- @mainNav = new MainNav
- @append @mainNav
- @initApp()
- initApp: =>
- @mainStack = new MainStack
- @helpUI = new HelpUI
- @append @mainStack, @helpUI
- Spine.Route.setup()
-
- @setupSession()
- @hookPanelsToNav()
- @setupOnlineOffline()
- @doOtherStuff()
- setupSession: ->
- session.on 'change', @checkRole
- @getSessionInfo()
- getSessionInfo: =>
- session.info (err, info) =>
- if not info
- # try again in 5 seconds
- @mainNav.offline.show()
- @delay @getSessionInfo, 5000
- else
- @mainNav.offline.hide()
- @checkRole info.userCtx
- checkRole: (userCtx) =>
- if userCtx?.roles and 'manager' in userCtx.roles
- @mainNav.hideLogin()
- @mainNav.greetUser(userCtx.name)
- @startApp()
- @mainStack.el.css('visibility', 'visible')
- @helpUI.el.css('visibility', 'visible')
- else
- @mainNav.showLogin()
- @endApp()
- @mainStack.el.css('visibility', 'hidden')
- @helpUI.el.css('visibility', 'hidden')
- startApp: =>
- unless @appStarted
- @loadData()
- @navigate('/')
- @appStarted = true
- endApp: =>
- if @appStarted
- @unloadData()
- @mainStack.filterBox.reset()
- @appStarted = false
- loadData: =>
- # Load data models
- Site.fetch()
- Author.fetch()
- Collection.fetch()
- Essay.fetch()
- Video.fetch()
- Scene.fetch()
- Block.fetch()
- Contact.fetch()
- Sponsor.fetch()
- Redirect.fetch()
- @dataLoaded = true
- unloadData: =>
- # Empty data from client models
- Site.deleteAll()
- Author.deleteAll()
- Collection.deleteAll()
- Essay.deleteAll()
- Video.deleteAll()
- Scene.deleteAll()
- Block.deleteAll()
- Contact.deleteAll()
- Sponsor.deleteAll()
- Redirect.deleteAll()
- @dataLoaded = false
- hookPanelsToNav: ->
- cls = @
- for k, v of @mainStack.controllers
- @mainStack[k].active -> cls.mainNav.selectFromClassName(@className)
- setupOnlineOffline: ->
- if not navigator.onLine
- @mainNav.offline.show()
-
- $(window).on 'offline', =>
- @mainNav.offline.show()
-
- $(window).on 'online', =>
- @mainNav.offline.hide()
- @delay @getSessionInfo, 5000
- doOtherStuff: ->
- # Use the fastclick module for touch devices.
- # Add a class of `needsclick` if the original click is needed.
- new FastClick(document.body)
- # Alert user when leaving the application.
- window.onbeforeunload = (e) ->
- msg = 'Bye bye! Leaving Kleks now, but you may have unsaved items. Keep going if you are sure.'
- e = window.event if not e?
- e.returnValue = msg if e
- msg
- module.exports = App
-
|