2013-08-18 21:52:13 +10:00
/*global Favcount:true*/
2013-02-25 11:18:10 +11:00
2013-02-26 14:54:43 -05:00
/ * *
The main Discourse Application
2013-02-20 13:15:50 -05:00
2013-02-26 14:54:43 -05:00
@ class Discourse
@ extends Ember . Application
* * /
2014-08-07 11:47:45 -04:00
var DiscourseResolver = require ( 'discourse/ember/resolver' ) . default ;
2013-12-30 12:42:05 -05:00
window . Discourse = Ember . Application . createWithMixins ( Discourse . Ajax , {
2013-02-22 15:41:12 -05:00
rootElement : '#main' ,
2014-10-09 14:37:23 -04:00
_docTitle : null ,
2013-02-20 13:15:50 -05:00
2013-03-14 13:01:52 +01:00
getURL : function ( url ) {
2013-05-07 13:30:12 -04:00
// If it's a non relative URL, return it.
if ( url . indexOf ( 'http' ) === 0 ) return url ;
2013-04-04 00:26:47 +02:00
var u = ( Discourse . BaseUri === undefined ? "/" : Discourse . BaseUri ) ;
2013-03-14 13:01:52 +01:00
if ( u [ u . length - 1 ] === '/' ) {
u = u . substring ( 0 , u . length - 1 ) ;
}
2013-11-12 11:25:27 -05:00
if ( url . indexOf ( u ) !== - 1 ) return url ;
2013-03-14 13:01:52 +01:00
return u + url ;
} ,
2015-01-29 22:53:48 +01:00
getURLWithCDN : function ( url ) {
url = this . getURL ( url ) ;
if ( Discourse . CDN ) { url = Discourse . CDN + url ; }
return url ;
} ,
2014-08-07 11:47:45 -04:00
Resolver : DiscourseResolver ,
2013-06-03 16:12:24 -04:00
2014-10-09 14:37:23 -04:00
_titleChanged : function ( ) {
var title = this . get ( '_docTitle' ) || Discourse . SiteSettings . title ;
2014-06-17 11:32:59 +10:00
// if we change this we can trigger changes on document.title
// only set if changed.
if ( $ ( 'title' ) . text ( ) !== title ) {
$ ( 'title' ) . text ( title ) ;
}
2013-06-03 10:38:57 +10:00
var notifyCount = this . get ( 'notifyCount' ) ;
2013-08-08 12:42:08 -04:00
if ( notifyCount > 0 && ! Discourse . User . currentProp ( 'dynamic_favicon' ) ) {
2013-06-03 10:38:57 +10:00
title = "(" + notifyCount + ") " + title ;
2013-02-22 15:41:12 -05:00
}
2014-01-09 10:26:53 +11:00
2014-10-09 14:37:23 -04:00
if ( title !== document . title ) {
2014-01-09 10:26:53 +11:00
// chrome bug workaround see: http://stackoverflow.com/questions/2952384/changing-the-window-title-when-focussing-the-window-doesnt-work-in-chrome
window . setTimeout ( function ( ) {
document . title = "." ;
document . title = title ;
} , 200 ) ;
}
2014-10-09 14:37:23 -04:00
} . observes ( '_docTitle' , 'hasFocus' , 'notifyCount' ) ,
2013-02-20 13:15:50 -05:00
2013-06-07 17:15:49 -07:00
faviconChanged : function ( ) {
2013-08-08 12:42:08 -04:00
if ( Discourse . User . currentProp ( 'dynamic_favicon' ) ) {
2013-08-18 11:26:03 -07:00
new Favcount ( Discourse . SiteSettings . favicon _url ) . set (
this . get ( 'notifyCount' )
2013-06-07 17:15:49 -07:00
) ;
}
} . observes ( 'notifyCount' ) ,
2013-02-26 14:54:43 -05:00
// The classes of buttons to show on a post
postButtons : function ( ) {
return Discourse . SiteSettings . post _menu . split ( "|" ) . map ( function ( i ) {
return ( i . replace ( /\+/ , '' ) . capitalize ( ) ) ;
} ) ;
2014-02-12 20:02:34 -08:00
} . property ( ) ,
2013-02-26 14:54:43 -05:00
2013-06-03 10:38:57 +10:00
notifyTitle : function ( count ) {
this . set ( 'notifyCount' , count ) ;
2013-02-22 15:41:12 -05:00
} ,
2013-02-20 13:15:50 -05:00
2013-02-26 14:54:43 -05:00
/ * *
Log the current user out of Discourse
@ method logout
* * /
2013-02-22 15:41:12 -05:00
logout : function ( ) {
2013-05-28 11:08:32 -04:00
Discourse . User . logout ( ) . then ( function ( ) {
2013-04-03 16:06:55 -04:00
// Reloading will refresh unbound properties
2013-05-28 11:08:32 -04:00
Discourse . KeyValueStore . abandonLocal ( ) ;
2014-08-15 12:57:29 +10:00
var redirect = Discourse . SiteSettings . logout _redirect ;
if ( redirect . length === 0 ) {
window . location . pathname = Discourse . getURL ( '/' ) ;
} else {
window . location . href = redirect ;
}
2013-06-21 14:06:20 -04:00
} ) ;
2013-02-22 15:41:12 -05:00
} ,
authenticationComplete : function ( options ) {
2013-05-30 14:12:33 -04:00
// TODO, how to dispatch this to the controller without the container?
var loginController = Discourse . _ _container _ _ . lookup ( 'controller:login' ) ;
return loginController . authenticationComplete ( options ) ;
2013-02-22 15:41:12 -05:00
} ,
2013-02-26 14:54:43 -05:00
2013-04-01 16:28:26 -04:00
/ * *
2013-12-03 14:22:32 -05:00
Start up the Discourse application by running all the initializers we ' ve defined .
2013-04-01 16:28:26 -04:00
@ method start
* * /
2013-02-22 15:41:12 -05:00
start : function ( ) {
2014-05-15 17:01:01 -04:00
2014-06-17 11:01:48 +10:00
$ ( 'noscript' ) . remove ( ) ;
2014-05-15 17:01:01 -04:00
// Load any ES6 initializers
2014-05-28 15:32:42 -04:00
Ember . keys ( requirejs . _eak _seen ) . forEach ( function ( key ) {
if ( /\/initializers\// . test ( key ) ) {
var module = require ( key , null , null , true ) ;
if ( ! module ) { throw new Error ( key + ' must export an initializer.' ) ; }
Discourse . initializer ( module . default ) ;
}
2014-05-15 17:01:01 -04:00
} ) ;
2014-01-14 16:59:08 +11:00
} ,
2014-01-15 12:07:42 +11:00
requiresRefresh : function ( ) {
var desired = Discourse . get ( "desiredAssetVersion" ) ;
return desired && Discourse . get ( "currentAssetVersion" ) !== desired ;
} . property ( "currentAssetVersion" , "desiredAssetVersion" ) ,
2014-01-14 16:59:08 +11:00
assetVersion : function ( prop , val ) {
if ( val ) {
if ( this . get ( "currentAssetVersion" ) ) {
this . set ( "desiredAssetVersion" , val ) ;
} else {
this . set ( "currentAssetVersion" , val ) ;
}
}
return this . get ( "currentAssetVersion" ) ;
2014-09-11 15:25:30 -04:00
} . property ( )
2013-02-20 13:15:50 -05:00
2013-02-22 15:41:12 -05:00
} ) ;