Files
ember-cli-dunlop/addon/mixins/application-route.coffee
T

209 lines
8.8 KiB
CoffeeScript

import Ember from 'ember'
import config from 'ember-get-config'
import ApplicationRouteMixin from 'ember-simple-auth/mixins/application-route-mixin'
export default Ember.Mixin.create ApplicationRouteMixin,
current_user_loaded: (user) -> @get('initial_resources_resolve')(user)
beforeModel: (transition) ->
@set 'router.globals.initial_resources_fulfilled', false
time_now = new Date()
console.log "Application beforeModel"
initial_resources_loaded = new Ember.RSVP.Promise((resolve, reject) =>
@set 'initial_resources_resolve', resolve
@set 'initial_resources_reject', reject
).then((resources) =>
console.log "Initial resources loaded (#{Math.round((new Date() - time_now) / 100) / 10}s)" # rounded devide by 1000
@set 'router.globals.initial_resources_fulfilled', true
).catch((reason) =>
console.log "No initial resource loading (#{Math.round((new Date() - time_now) / 100) / 10}s)" # rounded devide by 1000
@set('router.globals.flash_message', reason) if reason
).finally -> Ember.$('#initial-loader').remove()
@set 'initial_resources_loaded_promise', initial_resources_loaded
@_loadCurrentUser arguments...
initial_resources_loaded
sessionAuthenticated: ->
@_super arguments...
@_loadCurrentUser()
_loadCurrentUser: (transition) ->
#if userId = @get('session.data.authenticated.user_id')
if transition?.targetName is 'login' # don't load current user on login page
@get('initial_resources_reject')('Please login')
return
@get('store').queryRecord('user', me: true).then (user) =>
@set 'router.globals.current_user', user
@current_user_loaded user # overloadable
, =>
@set 'router.globals.current_user', null
#@get('initial_resources_reject')('Unauthenticated user')
@transitionTo('login')
actions:
error: (error, maybeTransition) ->
return unless @connections?.length # cannot use outlet at this moment
console.log error
container = Ember.getOwner(@)
if status = error.status || error?.errors?[0].status
switch parseInt(status)
when 401, 403
@set 'router.globals.current_user', null
@transitionTo 'login'
return
#when 404
# # nothing for now apparently
# #maybeTransition?.abort?()
# #@transitionTo 'four-oh-four'
# #return
controller = container.lookup "component:error-handling"
return unless controller?.set
controller.set 'error', error
@render 'global/error-messages',
into: 'application'
outlet: 'error-handling'
controller: controller
#@set "router.globals.flash_message", "Oops! Something went wrong!<br>#{error.message}".htmlSafe()
clear_error: ->
#@disconnectOutlet # https://github.com/emberjs/ember-inspector/issues/625
# outlet: 'error-handling'
# parentView: 'application'
@render 'modals/nothing',
outlet: 'error-handling'
into: 'application'
controller: 'application'
@set 'router.globals.modal_active', false
clear_error_and_go_home: ->
@send 'clear_error'
@transitionTo 'index'
didTransition: ->
@_super arguments...
Ember.run.next =>
return unless path = @get('controller.currentPath')
@set 'router.globals.current_route', Ember.Object.create
path: path # a.b.c
node: path.replace(/.*\./, '') # c
primary: '.' in path
openModal: (modalName, options={}) ->
if typeof options is 'function'
console.warn "Modal #{modalName} call has function as argument in stead of options!"
return
else if options.promise? and options.content
options = {model: options.content}
else if typeof options isnt 'object'
options = {model: options}
# opening a model on an unresolved promise is a bad thing, so we can assume (model) promise content for non paginated arrays as model
options.model = options.model.content if options.model?.promise? and options.model.content and not options.model.dunlop_remote_array
container = Ember.getOwner(@)
console.log "MODAL: #{modalName}"
modalNameParts = modalName.split('/')
partialName = modalNameParts.pop()
controller = container.lookup "component:modals/#{modalName}"
if not controller and modalNameParts.length
controller = container.lookup "component:#{modalNameParts.join('/')}/modals/#{partialName}"
controller ||= container.lookup "component:#{modalName}"
controller ||= container.lookup('component:modals/base')
#try
# controller = @controllerFor("modals/#{modalName}")
#catch error
# controller = @controllerFor("modals/base")
#controller ||= @controllerFor("modals/base")
controller.set 'model', options.model
defaultModalOptions =
closeOnOverlay: true
closeOnModalClick: false
modal_options = Ember.Object.create($.extend(defaultModalOptions, options))
controller.set 'modal_options', modal_options
# use root level partials for wizards and elementary use case
# Try to resolve the modalName traversing up the hierarchy so a modalName
# of wizard/create-distribution-point/copper/edit-distribution-point will look for partials:
#
# wizard/create-distribution-point/copper/-edit-distribution-point
# wizard/create-distribution-point/copper/modals/-edit-distribution-point
# modals/wizard/create-distribution-point/copper/-edit-distribution-point
#
# wizard/create-distribution-point/-edit-distribution-point
# wizard/create-distribution-point/modals/-edit-distribution-point
# modals/wizard/create-distribution-point/-edit-distribution-point
#
# wizard/-edit-distribution-point
# wizard/modals/-edit-distribution-point
# modals/wizard/-edit-distribution-point
#
# -edit-distribution-point
# modals/-edit-distribution-point
#
unless controller.get('partialName')
partialPath = null
while not partialPath and modalNameParts.length
if container.lookup "template:#{modalNameParts.join('/')}/-#{partialName}"
partialPath = "#{modalNameParts.join('/')}/#{partialName}" # without the dash
else if container.lookup "template:#{modalNameParts.join('/')}/modals/-#{partialName}"
partialPath = "#{modalNameParts.join('/')}/modals/#{partialName}" # without the dash
else if container.lookup "template:modals/#{modalNameParts.join('/')}/modals/-#{partialName}"
partialPath = "modals/#{modalNameParts.join('/')}/modals/#{partialName}" # without the dash
else if container.lookup "template:components/#{modalNameParts.join('/')}/-#{partialName}"
partialPath = "components/#{modalNameParts.join('/')}/#{partialName}" # without the dash
modalNameParts.pop()
partialPath ||= partialName if container.lookup("template:-#{partialName}") # can be root template
partialPath ||= "modals/#{partialName}" if container.lookup("template:modals/-#{partialName}") # can be root template
unless partialPath
message = "Cannot find template for modal '#{modalName}'"
console.log message
@set "router.globals.flash_message", message
return
controller.set 'partialName', partialPath
@incrementProperty 'router.globals.modals_counter'
controller.willOpenModal() # can be implemented to setup stuff before rendering and hooks
@render 'modals/layout',
into: 'application'
outlet: 'modal'
controller: controller
@set 'router.globals.modal_active', true
false # return false since this result will in most cases the the last statement of an action. So prevent bubbling
closeModal: ->
#@disconnectOutlet # https://github.com/emberjs/ember-inspector/issues/625
# outlet: 'modal'
# parentView: 'application'
@render 'modals/nothing',
outlet: 'modal'
into: 'application'
controller: 'application'
@set 'router.globals.modal_active', false
signOut: ->
@set 'router.globals.current_user', null
@get('session').invalidate() if @get('session.isAuthenticated')
@transitionTo 'login'
try
$.ajax
url: "#{config.apiHost}/users/sign_out"
type: 'DELETE'
dataType: 'json'
destroyRecord: (model, options = {}) ->
return unless model
model = model.get("_content") if model.__changeset__
@send 'openModal', 'confirm',
title_path: options.destroy_text_path || 'general.destroy.are_you_sure'
model: model
body: options.body
ok: ->
@get('model').destroyRecord()
@send 'closeModal' unless @preventClose
false
reload: (target) ->
target?.reload?()
false