2013-08-18 21:52:13 +10:00
/*global Favcount:true*/
2014-08-07 11:47:45 -04:00
var DiscourseResolver = require ( 'discourse/ember/resolver' ) . default ;
2015-05-11 13:16:44 -04:00
// Allow us to import Ember
define ( 'ember' , [ 'exports' ] , function ( _ _exports _ _ ) {
2015-08-11 17:34:02 -04:00
_ _exports _ _ . default = Ember ;
2015-05-11 13:16:44 -04:00
} ) ;
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' ,
2015-02-12 12:27:51 -05:00
_docTitle : document . title ,
2013-02-20 13:15:50 -05:00
2013-03-14 13:01:52 +01:00
getURL : function ( url ) {
2015-07-15 23:00:11 +02:00
if ( ! url ) return url ;
2015-02-18 12:30:41 -05:00
2015-07-15 23:00:11 +02:00
// if it's a non relative URL, return it.
if ( ! /^\/[^\/]/ . test ( url ) ) return url ;
2013-05-07 13:30:12 -04:00
2015-08-11 17:34:02 -04:00
var u = Discourse . BaseUri === undefined ? "/" : Discourse . BaseUri ;
2015-03-09 11:45:36 +11:00
2015-07-15 23:00:11 +02:00
if ( u [ u . length - 1 ] === '/' ) u = u . substring ( 0 , u . length - 1 ) ;
if ( url . indexOf ( u ) !== - 1 ) return url ;
if ( u . length > 0 && url [ 0 ] !== "/" ) url = "/" + url ;
2015-03-09 11:45:36 +11:00
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 ) ;
2015-07-15 23:00:11 +02:00
// only relative urls
2015-07-15 19:24:23 +02:00
if ( Discourse . CDN && /^\/[^\/]/ . test ( url ) ) {
2015-05-27 12:59:51 +10:00
url = Discourse . CDN + url ;
} else if ( Discourse . S3CDN ) {
url = url . replace ( Discourse . S3BaseUrl , Discourse . S3CDN ) ;
}
2015-01-29 22:53:48 +01:00
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
2015-02-12 12:27:51 -05:00
document . title = title ;
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' ) ) {
2015-08-25 11:54:23 +10:00
var url = Discourse . SiteSettings . favicon _url ;
if ( /^http/ . test ( url ) ) {
url = Discourse . getURL ( "/favicon/proxied?" + encodeURIComponent ( url ) ) ;
}
new Favcount ( url ) . set (
2013-08-18 11:26:03 -07:00
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 ) {
2015-08-11 17:34:02 -04:00
return i . replace ( /\+/ , '' ) . capitalize ( ) ;
2013-02-26 14:54:43 -05:00
} ) ;
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-28 15:32:42 -04:00
Ember . keys ( requirejs . _eak _seen ) . forEach ( function ( key ) {
2015-08-11 17:34:02 -04:00
if ( /\/pre\-initializers\// . test ( key ) ) {
2014-05-28 15:32:42 -04:00
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
} ) ;
2015-08-11 17:34:02 -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.' ) ; }
var init = module . default ;
var oldInitialize = init . initialize ;
init . initialize = function ( app ) {
2015-08-18 11:10:50 -04:00
oldInitialize . call ( this , app . container , Discourse ) ;
2015-08-11 17:34:02 -04:00
} ;
Discourse . instanceInitializer ( init ) ;
}
} ) ;
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" ) ,
2015-08-11 17:34:02 -04:00
assetVersion : Ember . computed ( {
get : function ( ) {
return this . get ( "currentAssetVersion" ) ;
} ,
set : function ( key , val ) {
if ( val ) {
if ( this . get ( "currentAssetVersion" ) ) {
this . set ( "desiredAssetVersion" , val ) ;
} else {
this . set ( "currentAssetVersion" , val ) ;
}
2014-01-14 16:59:08 +11:00
}
2015-08-11 17:34:02 -04:00
return this . get ( "currentAssetVersion" ) ;
2014-01-14 16:59:08 +11:00
}
2015-08-11 17:34:02 -04:00
} )
2013-02-22 15:41:12 -05:00
} ) ;
2015-02-26 15:54:39 -05:00
2015-08-11 14:07:08 -04:00
function proxyDep ( propName , moduleFunc , msg ) {
if ( Discourse . hasOwnProperty ( propName ) ) { return ; }
Object . defineProperty ( Discourse , propName , {
get : function ( ) {
msg = msg || "import the module" ;
Ember . warn ( "DEPRECATION: `Discourse." + propName + "` is deprecated, " + msg + "." ) ;
return moduleFunc ( ) ;
}
} ) ;
}
proxyDep ( 'computed' , function ( ) { return require ( 'discourse/lib/computed' ) } ) ;
proxyDep ( 'Formatter' , function ( ) { return require ( 'discourse/lib/formatter' ) } ) ;
proxyDep ( 'PageTracker' , function ( ) { return require ( 'discourse/lib/page-tracker' ) . default } ) ;
2015-08-11 12:27:07 -04:00
proxyDep ( 'URL' , function ( ) { return require ( 'discourse/lib/url' ) . default } ) ;
proxyDep ( 'Quote' , function ( ) { return require ( 'discourse/lib/quote' ) . default } ) ;
proxyDep ( 'debounce' , function ( ) { return require ( 'discourse/lib/debounce' ) . default } ) ;
proxyDep ( 'View' , function ( ) { return Ember . View } , "Use `Ember.View` instead" ) ;