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
* * /
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' ,
2013-02-20 13:15:50 -05:00
2013-06-20 15:02:02 -04:00
// Helps with integration tests
URL _FIXTURES : { } ,
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 ;
} ,
2013-09-16 14:08:55 -04:00
Resolver : Discourse . Resolver ,
2013-06-03 16:12:24 -04:00
2013-02-26 14:54:43 -05:00
titleChanged : function ( ) {
2013-07-26 14:59:28 -04:00
var title = "" ;
2013-12-31 12:41:40 -05:00
2013-02-22 15:41:12 -05:00
if ( this . get ( 'title' ) ) {
title += "" + ( this . get ( 'title' ) ) + " - " ;
}
title += 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
if ( title !== document . title ) {
// 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 ) ;
}
2013-06-03 10:38:57 +10:00
} . observes ( 'title' , '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 ( ) ;
2013-08-06 16:04:02 -04:00
window . location . pathname = Discourse . getURL ( '/' ) ;
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-06-04 15:37:53 -07:00
loginRequired : function ( ) {
2014-01-20 14:41:11 +01:00
return Discourse . SiteSettings . login _required && ! Discourse . User . current ( ) ;
2013-06-04 15:37:53 -07:00
} . property ( ) ,
2013-06-04 15:39:35 -07:00
redirectIfLoginRequired : function ( route ) {
if ( this . get ( 'loginRequired' ) ) { route . transitionTo ( 'login' ) ; }
} ,
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-03-24 16:51:48 +11:00
} . property ( ) ,
globalNotice : function ( ) {
var notices = [ ] ;
if ( this . get ( "isReadOnly" ) ) {
notices . push ( I18n . t ( "read_only_mode.enabled" ) ) ;
}
2014-05-26 11:13:04 -04:00
if ( Discourse . User . currentProp ( 'admin' ) && Discourse . SiteSettings . show _create _topics _notice ) {
2014-05-28 13:33:39 -04:00
var topic _count = 0 ,
post _count = 0 ;
_ . each ( Discourse . Site . currentProp ( 'categories' ) , function ( c ) {
if ( ! c . get ( 'read_restricted' ) ) {
topic _count += c . get ( 'topic_count' ) ;
post _count += c . get ( 'post_count' ) ;
}
} ) ;
if ( topic _count < 5 || post _count < 50 ) {
2014-05-23 12:25:16 -04:00
notices . push ( I18n . t ( "too_few_topics_notice" ) ) ;
}
}
2014-03-24 16:51:48 +11:00
if ( ! _ . isEmpty ( Discourse . SiteSettings . global _notice ) ) {
notices . push ( Discourse . SiteSettings . global _notice ) ;
}
if ( notices . length > 0 ) {
return new Handlebars . SafeString ( _ . map ( notices , function ( text ) {
return "<div class='row'><div class='alert alert-info'>" + text + "</div></div>" ;
} ) . join ( "" ) ) ;
}
} . property ( "isReadOnly" )
2013-02-20 13:15:50 -05:00
2013-02-22 15:41:12 -05:00
} ) ;