|
|
-{"version":3,"sources":["misago.js"],"names":["window","Misago","ns","Object","getPrototypeOf","this","self","context","SETTINGS","_services","addService","name","factory","order","push","item","after","get","before","_initServices","services","orderedServices","OrderedList","forEach","undefined","serviceInstance","_destroyServices","reverse","destroy","registerCoreServices","Conf","ComponentFactory","RouterFactory","AjaxFactory","ApiFactory","RunLoopFactory","startTick","OutletFactory","PageTitle","startRouting","setup","init","fixture","inTest","Ajax","_","cookieRegex","RegExp","CSRF_COOKIE_NAME","csrfToken","document","cookie","match","split","runningGets","ajax","method","url","data","progress","promise","m","deferred","ajax_settings","headers","X-CSRFToken","dataType","success","pop","resolve","error","jqXHR","rejection","responseJSON","status","statusText","reject","$","preloaded","post","prototype","Api","buildUrl","model","call","querystrings","router","baseUrl","one","id","many","filters","target","component","argumentsArray","i","arguments","length","apply","settings","mount","getElementById","ForumLayout","noop","route","isActive","__controller","controller","__onunload","onunload","vm","__init","initArgs","then","ondata","finalArgs","f","container","errorPage","loading","Loader","__view","view","isReady","Router","attr","staticUrl","mediaUrl","urls","reverses","routedComponent","populatePatterns","urlconf","patterns","finalPattern","pattern","replace","mode","delegateElement","delegateName","cleanUrl","isRelative","substr","location","protocol","host","avatarsUrl","delegateClicks","element","on","e","href","preventDefault","off","prefixUrl","prefix","error403","ban","ErrorBannedRoute","message","detail","Ban","deserialize","Error403Route","error404","Error404Route","error500","Error500Route","error0","Error0Route","RunLoop","_intervals","run","callable","delay","setTimeout","result","runOnce","stop","hasOwnProperty","clearTimeout","runloop","startComputation","console","log","endComputation","_setTitle","title","completeTitle","page","interpolate","gettext","parent","forum_name","setTitle","html","plain","expires_on","deserializeDatetime","error_message","help","code","icon","trust","expirationMessage","isAfter","moment","fromNow","IndexRoute","forum_index_title","count","prop","increment","ctrl","onclick","legalPageFactory","typeName","defaultTitle","dashedTypeName","api","body","PageHeader","TermsOfServiceRoute","PrivacyPolicyRoute","legalLink","legalType","FooterNav","isVisible","forum_footnote","terms_of_service","terms_of_service_link","privacy_policy","privacy_policy_link","indexOf","items","ForumFooter","nav","FooterMisagoBranding","BrandFull","branding","children","src","alt","ForumNavbar","desktopNavbar","forum_branding_display","forum_branding_text","config","persistent","el","isInit","retain","LoadingPage","setupMarkup","MisagoMarkup","content","options","has","obj","key","value","returnValue","isOrdered","_items","add","values","values_only","_order","unordered","insertItem","insertAt","ordering","ordered","splice","index","iterations","deserialized","serializeDatetime","serialized","format","startsWith","string","beginning","endsWith","tail","UrlConfInvalidComponentError","toString","UrlConf","_patterns","prefixPattern","include","loadingPage"],"mappings":"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","file":"misago.js","sourcesContent":["/* global -Misago */\n/* exported Misago */\n(function () {\n 'use strict';\n\n window.Misago = function() {\n\n var ns = Object.getPrototypeOf(this);\n var self = this;\n\n // Context data\n this.context = {\n // Empty settings\n SETTINGS: {}\n };\n\n // Services\n this._services = [];\n this.addService = function(name, factory, order) {\n this._services.push({\n name: name,\n item: factory,\n after: this.get(order, 'after'),\n before: this.get(order, 'before')\n });\n };\n\n this._initServices = function(services) {\n var orderedServices = new ns.OrderedList(services).order(false);\n orderedServices.forEach(function (item) {\n var factory = null;\n if (item.item.factory !== undefined) {\n factory = item.item.factory;\n } else {\n factory = item.item;\n }\n\n var serviceInstance = factory(self);\n if (serviceInstance) {\n self[item.name] = serviceInstance;\n }\n });\n };\n\n this._destroyServices = function(services) {\n var orderedServices = new ns.OrderedList(services).order();\n orderedServices.reverse();\n orderedServices.forEach(function (item) {\n if (item.destroy !== undefined) {\n item.destroy(self);\n }\n });\n };\n\n this.registerCoreServices = function() {\n this.addService('conf', ns.Conf);\n this.addService('component', ns.ComponentFactory);\n this.addService('router', ns.RouterFactory);\n this.addService('ajax', ns.AjaxFactory);\n this.addService('api', ns.ApiFactory);\n this.addService('runloop', ns.RunLoopFactory);\n this.addService('tick', ns.startTick);\n this.addService('outlet', ns.OutletFactory);\n this.addService('title', ns.PageTitle);\n this.addService('start-routing', ns.startRouting);\n };\n\n // App init/destory\n this.setup = false;\n this.init = function(setup) {\n this.setup = {\n fixture: ns.get(setup, 'fixture', null),\n inTest: ns.get(setup, 'inTest', false)\n };\n\n this._initServices(this._services);\n };\n\n this.destroy = function() {\n this._destroyServices();\n };\n };\n}());\n\n(function (Misago) {\n 'use strict';\n\n var Ajax = function(_) {\n var cookieRegex = new RegExp(_.context.CSRF_COOKIE_NAME + '\\=([^;]*)');\n this.csrfToken = Misago.get(document.cookie.match(cookieRegex), 0).split('=')[1];\n\n /*\n List of GETs underway\n We are limiting number of GETs to API to 1 per url\n */\n var runningGets = {};\n\n this.ajax = function(method, url, data, progress) {\n var promise = m.deferred();\n\n var ajax_settings = {\n url: url,\n method: method,\n headers: {\n 'X-CSRFToken': this.csrfToken\n },\n\n data: data | {},\n dataType: 'json',\n\n success: function(data) {\n if (method === 'GET') {\n Misago.pop(runningGets, url);\n }\n promise.resolve(data);\n },\n error: function(jqXHR) {\n if (method === 'GET') {\n Misago.pop(runningGets, url);\n }\n\n var rejection = jqXHR.responseJSON || {};\n\n rejection.status = jqXHR.status;\n rejection.statusText = jqXHR.statusText;\n\n promise.reject(rejection);\n }\n };\n\n if (progress) {\n return; // not implemented... yet!\n }\n\n $.ajax(ajax_settings);\n return promise.promise;\n };\n\n this.get = function(url) {\n var preloaded = Misago.pop(_.context, url);\n if (preloaded) {\n var deferred = m.deferred();\n deferred.resolve(preloaded);\n return deferred.promise;\n } else if (runningGets[url] !== undefined) {\n return runningGets[url];\n } else {\n runningGets[url] = this.ajax('GET', url);\n return runningGets[url];\n }\n };\n\n this.post = function(url) {\n return this.ajax('POST', url);\n };\n };\n\n Misago.AjaxFactory = function(_) {\n return new Ajax(_);\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var Api = function(_) {\n this.buildUrl = function(model, call, querystrings) {\n var url = _.router.baseUrl;\n url += 'api/' + model + '/';\n return url;\n };\n\n this.one = function(model, id) {\n var url = this.buildUrl(model) + id + '/';\n return _.ajax.get(url);\n };\n\n this.many = function(model, filters) {\n\n };\n\n this.call = function(model, target, call, data) {\n\n };\n };\n\n Misago.ApiFactory = function(_) {\n return new Api(_);\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.ComponentFactory = function(_) {\n // Component factory\n _.component = function() {\n var argumentsArray = [];\n for (var i = 0; i < arguments.length; i += 1) {\n argumentsArray.push(arguments[i]);\n }\n\n argumentsArray.push(_);\n return m.component.apply(undefined, argumentsArray);\n };\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.Conf = function(_) {\n _.settings = Misago.get(_.context, 'SETTINGS', {});\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.OutletFactory = {\n factory: function(_) {\n if (_.setup.fixture) {\n m.mount(document.getElementById(_.setup.fixture),\n _.component(Misago.ForumLayout));\n }\n },\n\n destroy: function(_) {\n if (_.setup.fixture) {\n m.mount(_.setup.fixture, null);\n }\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var noop = function() {};\n\n Misago.route = function(component) {\n /*\n Boilerplate for Misago top-level components\n */\n\n // Component state\n component.isActive = true;\n\n // Wrap controller to store lifecycle methods\n var __controller = component.controller || noop;\n component.controller = function() {\n component.isActive = true;\n\n var controller = __controller.apply(component, arguments) || {};\n\n // wrap onunload for lifestate\n var __onunload = controller.onunload || noop;\n controller.onunload = function() {\n __onunload.apply(component, arguments);\n component.isActive = false;\n };\n\n return controller;\n };\n\n // Add state callbacks to View-Model\n if (component.vm && component.vm.init) {\n // wrap vm.init in promise handler\n var __init = component.vm.init;\n component.vm.init = function() {\n var initArgs = arguments;\n var promise = __init.apply(component.vm, initArgs);\n\n if (promise) {\n promise.then(function() {\n if (component.isActive && component.vm.ondata) {\n var finalArgs = [];\n for (var i = 0; i < arguments.length; i++) {\n finalArgs.push(arguments[i]);\n }\n for (var f = 0; f < initArgs.length; f++) {\n finalArgs.push(initArgs[f]);\n }\n\n component.vm.ondata.apply(component.vm, finalArgs);\n }\n }, function(error) {\n if (component.isActive) {\n component.container.router.errorPage(error);\n }\n });\n }\n };\n\n // setup default loading view\n if (!component.loading) {\n component.loading = function () {\n var _ = this.container;\n return m('.page.page-loading',\n _.component(Misago.Loader)\n );\n };\n }\n\n var __view = component.view;\n component.view = function() {\n if (component.vm.isReady) {\n return __view.apply(component, arguments);\n } else {\n return component.loading.apply(component, arguments);\n }\n };\n }\n\n return component;\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var Router = function(_) {\n var self = this;\n this.baseUrl = $('base').attr('href');\n\n var staticUrl = Misago.get(_.context, 'STATIC_URL', '/');\n var mediaUrl = Misago.get(_.context, 'MEDIA_URL', '/');\n\n // Routing\n this.urls = {};\n this.reverses = {};\n\n var routedComponent = function(component) {\n component.container = _;\n return component;\n };\n\n var populatePatterns = function(urlconf) {\n urlconf.patterns().forEach(function(url) {\n // set service container on component\n\n var finalPattern = self.baseUrl + url.pattern;\n finalPattern = finalPattern.replace('//', '/');\n\n self.urls[finalPattern] = routedComponent(url.component);\n self.reverses[url.name] = finalPattern;\n });\n };\n\n this.startRouting = function(urlconf, fixture) {\n populatePatterns(urlconf);\n this.fixture = fixture;\n\n m.route.mode = 'pathname';\n m.route(fixture, '/', this.urls);\n };\n\n this.url = function(name) {\n return this.reverses[name];\n };\n\n // Delegate clicks\n this.delegateElement = null;\n this.delegateName = 'click.misago-router';\n\n this.cleanUrl = function(url) {\n if (!url) { return; }\n\n // Is link relative?\n var isRelative = url.substr(0, 1) === '/' && url.substr(0, 2) !== '//';\n\n // If link contains host, validate to see if its outgoing\n if (!isRelative) {\n var location = window.location;\n\n // If protocol matches current one, strip it from string\n // otherwhise stop handler\n if (url.substr(0, 2) !== '//') {\n var protocol = url.substr(0, location.protocol.length + 2);\n if (protocol !== location.protocol + '//') { return; }\n url = url.substr(location.protocol.length + 2);\n } else {\n url = url.substr(2);\n }\n\n // Host checks out?\n if (url.substr(0, location.host.length) !== location.host) { return; }\n url = url.substr(location.host.length);\n }\n\n // Is link within Ember app?\n if (url.substr(0, this.baseUrl.length) !== this.baseUrl) { return; }\n\n // Is link to media/static/avatar server?\n if (url.substr(0, staticUrl.length) === staticUrl) { return; }\n\n if (url.substr(0, mediaUrl.length) === mediaUrl) { return; }\n\n var avatarsUrl = '/user-avatar/';\n if (url.substr(0, avatarsUrl.length) === avatarsUrl) { return; }\n\n return url;\n };\n\n this.delegateClicks = function(element) {\n this.delegateElement = element;\n $(this.delegateElement).on(this.delegateName, 'a', function(e) {\n var cleanUrl = self.cleanUrl(e.target.href);\n if (cleanUrl) {\n if (cleanUrl != m.route()) {\n m.route(cleanUrl);\n }\n e.preventDefault();\n }\n });\n };\n\n this.destroy = function() {\n $(this.delegateElement).off(this.delegateName);\n };\n\n // Media/Static url\n var prefixUrl = function(prefix) {\n return function(url) {\n return prefix + url;\n };\n };\n\n this.staticUrl = prefixUrl(staticUrl);\n this.mediaUrl = prefixUrl(mediaUrl);\n\n // Errors\n this.error403 = function(error) {\n var component = null;\n if (error.ban) {\n component = routedComponent(Misago.ErrorBannedRoute);\n component.error = {\n message: error.detail,\n ban: Misago.Ban.deserialize(error.ban)\n };\n } else {\n component = routedComponent(Misago.Error403Route);\n component.error = error.detail;\n }\n\n m.mount(this.fixture, component);\n };\n\n this.error404 = function() {\n m.mount(this.fixture, routedComponent(Misago.Error404Route));\n };\n\n this.error500 = function() {\n m.mount(this.fixture, routedComponent(Misago.Error500Route));\n };\n\n this.error0 = function() {\n m.mount(this.fixture, routedComponent(Misago.Error0Route));\n };\n\n this.errorPage = function(error) {\n if (error.status === 0) {\n this.error0();\n }\n\n if (error.status === 500) {\n this.error500();\n }\n\n if (error.status === 404) {\n this.error404();\n }\n\n if (error.status === 403) {\n this.error403(error);\n }\n };\n };\n\n Misago.RouterFactory = function(_) {\n return new Router(_);\n };\n\n Misago.startRouting = function(_) {\n _.router.startRouting(Misago.urls, document.getElementById('router-fixture'));\n _.router.delegateClicks(document.getElementById(_.setup.fixture));\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var RunLoop = function(_) {\n var self = this;\n\n this._intervals = {};\n\n this.run = function(callable, name, delay) {\n this._intervals[name] = window.setTimeout(function() {\n var result = callable(_);\n if (result !== false) {\n self.run(callable, name, delay);\n }\n }, delay);\n };\n\n this.runOnce = function(callable, name, delay) {\n this._intervals[name] = window.setTimeout(function() {\n callable(_);\n }, delay);\n };\n\n this.stop = function() {\n for (var name in this._intervals) {\n if (this._intervals.hasOwnProperty(name)) {\n window.clearTimeout(this._intervals[name]);\n delete this._intervals[name];\n }\n }\n };\n };\n\n Misago.RunLoopFactory = {\n factory: function(_) {\n return new RunLoop(_);\n },\n\n destroy: function(_) {\n _.runloop.stop();\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.startTick = function(_) {\n _.runloop.run(function() {\n m.startComputation();\n // just tick!\n console.log('tick!');\n m.endComputation();\n }, 60000);\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.PageTitle = function(_) {\n _._setTitle = function(title) {\n if (typeof title === 'string') {\n title = {title: title};\n }\n\n var completeTitle = title.title;\n\n if (typeof title.page !== 'undefined' && title.page > 1) {\n completeTitle += ' (' + interpolate(gettext('page %(page)s'), { page:title.page }, true) + ')';\n }\n\n if (typeof title.parent !== 'undefined') {\n completeTitle += ' | ' + title.parent;\n }\n\n document.title = completeTitle + ' | ' + this.settings.forum_name;\n };\n\n _.setTitle = function(title) {\n if (title) {\n this._setTitle(title);\n } else {\n document.title = this.settings.forum_name;\n }\n };\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.Ban = function(data) {\n this.message = {\n html: data.message.html,\n plain: data.message.plain,\n };\n\n this.expires_on = data.expires_on;\n };\n\n Misago.Ban.deserialize = function(data) {\n data.expires_on = Misago.deserializeDatetime(data.expires_on);\n\n return new Misago.Ban(data);\n };\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var errorPage = function(error) {\n var error_message = [\n m('p.lead', error.message)\n ];\n\n if (error.help) {\n error_message.push(m('p.help', error.help));\n }\n\n return m('.page.error-page.error-' + error.code + '-page',\n m('.container',\n m('.error-panel', [\n m('.error-icon',\n m('span.material-icon', error.icon)\n ),\n m('.error-message', error_message)\n ])\n )\n );\n };\n\n Misago.ErrorBannedRoute = Misago.route({\n controller: function() {\n this.container.setTitle(gettext('You are banned'));\n },\n error: null,\n view: function() {\n var error_message = [];\n if (this.error.ban.message.html) {\n error_message.push(m('.lead', m.trust(this.error.ban.message.html)));\n } else {\n error_message.push(m('p.lead', this.error.message));\n }\n\n var expirationMessage = null;\n if (this.error.ban.expires_on) {\n console.log('new render!');\n if (this.error.ban.expires_on.isAfter(moment())) {\n expirationMessage = interpolate(\n gettext('This ban expires %(expires_on)s.'),\n { 'expires_on': this.error.ban.expires_on.fromNow() },\n true);\n } else {\n expirationMessage = gettext('This ban has expired.');\n }\n } else {\n expirationMessage = gettext('This ban is permanent.');\n }\n error_message.push(m('p', expirationMessage));\n\n return m('.page.error-page.error-banned-page',\n m('.container',\n m('.error-panel', [\n m('.error-icon',\n m('span.material-icon', 'highlight_off')\n ),\n m('.error-message', error_message)\n ])\n )\n );\n }\n });\n\n Misago.Error403Route = Misago.route({\n controller: function() {\n this.container.setTitle(gettext('Page not available'));\n },\n error: null,\n view: function() {\n return errorPage({\n code: 403,\n icon: 'remove_circle_outline',\n message: gettext(\"This page is not available.\"),\n help: this.error || gettext(\"You don't have permission to access this page.\")\n });\n }\n });\n\n Misago.Error404Route = Misago.route({\n controller: function() {\n this.container.setTitle(gettext('Page not found'));\n },\n view: function() {\n return errorPage({\n code: 404,\n icon: 'info_outline',\n message: gettext(\"Requested page could not be found.\"),\n help: gettext(\"The link you followed was incorrect or the page has been moved or deleted.\")\n });\n }\n });\n\n Misago.Error500Route = Misago.route({\n controller: function() {\n this.container.setTitle(gettext('Application error occured'));\n },\n view: function() {\n return errorPage({\n code: 500,\n icon: 'error_outline',\n message: gettext(\"Requested page could not be displayed due to an error.\"),\n help: gettext(\"Please try again later or contact site staff if error persists.\")\n });\n }\n });\n\n Misago.Error0Route = Misago.route({\n controller: function() {\n this.container.setTitle(gettext('Lost connection with application'));\n },\n view: function() {\n return errorPage({\n code: 500,\n icon: 'sync_problem',\n message: gettext(\"Could not connect to application.\"),\n help: gettext(\"This may be caused by problems with your connection or application server. Please check your inter connection and refresh page if problem persists.\")\n });\n }\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.IndexRoute = Misago.route({\n controller: function() {\n var _ = this.container;\n document.title = _.settings.forum_index_title || _.settings.forum_name;\n\n var count = m.prop(0);\n\n return {\n count: count,\n increment: function() {\n console.log('increment()');\n count(count() + 1);\n }\n };\n },\n view: function(ctrl) {\n return m('.container', [\n m('h1', ['Count: ', m('strong', ctrl.count())]),\n m('p', 'Clicky click button to increase count!.'),\n m('p',\n m('button.btn.btn-primary', {onclick: ctrl.increment}, 'Clicky clicky!')\n )\n ]);\n }\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var legalPageFactory = function(typeName, defaultTitle) {\n var dashedTypeName = typeName.replace(/_/g, '-');\n\n return Misago.route({\n controller: function() {\n var _ = this.container;\n\n if (Misago.get(_.settings, typeName + '_link')) {\n window.location = Misago.get(_.settings, typeName + '_link');\n } else {\n this.vm.init(this, _);\n }\n },\n vm: {\n isReady: false,\n init: function(component, _) {\n if (this.isReady) {\n _.setTitle(this.title);\n } else {\n _.setTitle();\n return _.api.one('legal-pages', dashedTypeName);\n }\n },\n ondata: function(data, component, _) {\n m.startComputation();\n\n this.title = data.title || defaultTitle;\n this.body = data.body;\n this.isReady = true;\n\n m.endComputation();\n\n if (component.isActive) {\n _.setTitle(data.title);\n }\n }\n },\n view: function() {\n var _ = this.container;\n\n return m('.page.legal-page.' + dashedTypeName + '-page', [\n _.component(Misago.PageHeader, {title: this.vm.title}),\n m('.container',\n m.trust(this.vm.body)\n )\n ]);\n }\n });\n };\n\n Misago.TermsOfServiceRoute = legalPageFactory(\n 'terms_of_service', gettext('Terms of service'));\n Misago.PrivacyPolicyRoute = legalPageFactory(\n 'privacy_policy', gettext('Privacy policy'));\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var legalLink = function(_, legalType, defaultTitle) {\n var url = Misago.get(_.settings, legalType + '_link');\n if (!url && Misago.get(_.settings, legalType)) {\n url = _.router.url(legalType);\n }\n\n if (url) {\n return m('li',\n m('a', {href: url}, Misago.get(_.settings, legalType + '_title', defaultTitle))\n );\n } else {\n return null;\n }\n };\n\n Misago.FooterNav = {\n isVisible: function(settings) {\n return [\n !!settings.forum_footnote,\n !!settings.terms_of_service,\n !!settings.terms_of_service_link,\n !!settings.privacy_policy,\n !!settings.privacy_policy_link\n ].indexOf(true) !== -1;\n },\n view: function(ctrl, _) {\n var items = [];\n\n if (_.settings.forum_footnote) {\n items.push(m('li.forum-footnote', m.trust(_.settings.forum_footnote)));\n }\n\n items.push(legalLink(_, 'terms_of_service', gettext('Terms of service')));\n items.push(legalLink(_, 'privacy_policy', gettext('Privacy policy')));\n\n return m('ul.list-inline.footer-nav', items);\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.ForumFooter = {\n view: function(ctrl, _) {\n var nav = null;\n if (Misago.FooterNav.isVisible(_.settings)) {\n nav = _.component(Misago.FooterNav);\n }\n\n return m('footer.forum-footer', [\n m('.container',\n m('.footer-content', [\n nav,\n _.component(Misago.FooterMisagoBranding)\n ])\n )\n ]);\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.FooterMisagoBranding = {\n view: function() {\n return m('a.misago-branding[href=http://misago-project.org]', [\n \"powered by \", m('strong', \"misago\")\n ]);\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.BrandFull = {\n view: function(ctrl, branding, _) {\n var children = [\n m('img', {\n src: _.router.staticUrl('misago/img/site-logo.png'),\n alt: _.settings.forum_name\n })\n ];\n\n if (branding) {\n children.push(branding);\n }\n\n return m('a.navbar-brand', {href: _.router.url('index')}, children);\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.ForumNavbar = {\n view: function(ctrl, _) {\n var desktopNavbar = [];\n\n if (_.settings.forum_branding_display) {\n desktopNavbar.push(_.component(Misago.BrandFull, _.settings.forum_branding_text));\n }\n\n desktopNavbar.push(m('ul.nav.navbar-nav', [\n m('li', m(\"a\", {config: m.route, href: _.router.url('index')}, 'Index')),\n m('li', m(\"a\", {config: m.route, href: _.router.url('test')}, 'Test'))\n ]));\n\n return m('nav.navbar.navbar-default.navbar-static-top[role=\"navigation\"]', [\n m('.container.navbar-full.hidden-xs.hidden-sm', desktopNavbar)\n ]);\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var persistent = function(el, isInit, context) {\n context.retain = true;\n };\n\n Misago.ForumLayout = {\n view: function(ctrl, _) {\n return [\n _.component(Misago.ForumNavbar),\n m('#router-fixture', {config: persistent}),\n _.component(Misago.ForumFooter)\n ];\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.Loader = {\n view: function() {\n return m('.loader.sk-folding-cube', [\n m('.sk-cube1.sk-cube'),\n m('.sk-cube2.sk-cube'),\n m('.sk-cube4.sk-cube'),\n m('.sk-cube3.sk-cube')\n ]);\n }\n };\n\n Misago.LoadingPage = {\n view: function(ctrl, _) {\n return m('.page.loading-page',\n _.component(Misago.Loader)\n );\n }\n };\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var setupMarkup = function(el, isInit, context) {\n context.retain = true;\n };\n\n Misago.MisagoMarkup = {\n view: function(ctrl, content) {\n return m('article.misago-markup', {config: setupMarkup}, m.trust(content));\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.PageHeader = {\n view: function(ctrl, options) {\n return m('.page-header',\n m('.container', [\n m('h1', options.title),\n ])\n );\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.has = function(obj, key) {\n if (obj !== undefined) {\n return obj.hasOwnProperty(key);\n } else {\n return false;\n }\n };\n\n Misago.get = function(obj, key, value) {\n if (Misago.has(obj, key)) {\n return obj[key];\n } else if (value !== undefined) {\n return value;\n } else {\n return undefined;\n }\n };\n\n Misago.pop = function(obj, key, value) {\n var returnValue = Misago.get(obj, key, value);\n if (Misago.has(obj, key)) {\n delete obj[key];\n }\n return returnValue;\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.OrderedList = function(items) {\n this.isOrdered = false;\n this._items = items || [];\n\n this.add = function(key, item, order) {\n this._items.push({\n key: key,\n item: item,\n after: Misago.get(order, 'after'),\n before: Misago.get(order, 'before')\n });\n };\n\n this.get = function(key, value) {\n for (var i = 0; i < this._items.length; i++) {\n if (this._items[i].key === key) {\n return this._items[i].item;\n }\n }\n\n return value;\n };\n\n this.has = function(key) {\n return this.get(key) !== undefined;\n };\n\n this.values = function() {\n var values = [];\n for (var i = 0; i < this._items.length; i++) {\n values.push(this._items[i].item);\n }\n return values;\n };\n\n this.order = function(values_only) {\n if (!this.isOrdered) {\n this._items = this._order(this._items);\n this.isOrdered = true;\n }\n\n if (values_only || typeof values_only === 'undefined') {\n return this.values();\n } else {\n return this._items;\n }\n };\n\n this._order = function(unordered) {\n // Index of unordered items\n var index = [];\n unordered.forEach(function (item) {\n index.push(item.key);\n });\n\n // Ordered items\n var ordered = [];\n var ordering = [];\n\n // First pass: register items that\n // don't specify their order\n unordered.forEach(function (item) {\n if (!item.after && !item.before) {\n ordered.push(item);\n ordering.push(item.key);\n }\n });\n\n // Second pass: keep iterating items\n // until we hit iterations limit or finish\n // ordering list\n function insertItem(item) {\n var insertAt = -1;\n if (ordering.indexOf(item.key) === -1) {\n if (item.after) {\n insertAt = ordering.indexOf(item.after);\n if (insertAt !== -1) {\n insertAt += 1;\n }\n } else if (item.before) {\n insertAt = ordering.indexOf(item.before);\n }\n\n if (insertAt !== -1) {\n ordered.splice(insertAt, 0, item);\n ordering.splice(insertAt, 0, item.key);\n }\n }\n }\n\n var iterations = 200;\n while (iterations > 0 && index.length !== ordering.length) {\n iterations -= 1;\n unordered.forEach(insertItem);\n }\n\n return ordered;\n };\n };\n} (Misago.prototype));\n\n(function (Misago) {\n Misago.deserializeDatetime = function(deserialized) {\n return deserialized ? moment(deserialized) : null;\n };\n\n Misago.serializeDatetime = function(serialized) {\n return serialized ? serialized.format() : null;\n };\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.startsWith = function(string, beginning) {\n return string.indexOf(beginning) === 0;\n };\n\n Misago.endsWith = function(string, tail) {\n return string.indexOf(tail, string.length - tail.length) !== -1;\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.UrlConfInvalidComponentError = function(name) {\n this.message = \"route's \" + name + \" component should be an array or object\";\n\n this.toString = function() {\n return this.message;\n };\n };\n\n Misago.UrlConf = function() {\n var self = this;\n this._patterns = [];\n\n this.patterns = function() {\n return this._patterns;\n };\n\n var prefixPattern = function(prefix, pattern) {\n return (prefix + pattern).replace('//', '/');\n };\n\n var include = function(prefix, patterns) {\n for (var i = 0; i < patterns.length; i ++) {\n self.url(prefixPattern(prefix, patterns[i].pattern),\n patterns[i].component,\n patterns[i].name);\n }\n };\n\n this.url = function(pattern, component, name) {\n if (typeof component !== 'object') {\n throw new Misago.UrlConfInvalidComponentError(name);\n }\n\n if (pattern === '') {\n pattern = '/';\n }\n\n if (component instanceof Misago.UrlConf) {\n include(pattern, component.patterns());\n } else {\n this._patterns.push({\n pattern: pattern,\n component: component,\n name: name\n });\n }\n };\n };\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.loadingPage = function(_) {\n return m('.page.page-loading', _.component(Misago.Loader));\n };\n} (Misago.prototype));\n\n(function (Misago, UrlConf) {\n 'use strict';\n\n var urls = new UrlConf();\n urls.url('/', Misago.IndexRoute, 'index');\n\n // Legal pages\n urls.url('/terms-of-service/', Misago.TermsOfServiceRoute, 'terms_of_service');\n urls.url('/privacy-policy/', Misago.PrivacyPolicyRoute, 'privacy_policy');\n\n Misago.urls = urls;\n} (Misago.prototype, Misago.prototype.UrlConf));\n"],"sourceRoot":"/source/"}
|
|
|
+{"version":3,"sources":["misago.js"],"names":["window","Misago","ns","Object","getPrototypeOf","this","self","context","SETTINGS","_initServices","services","m","startComputation","orderedServices","OrderedList","order","forEach","item","factory","undefined","serviceInstance","name","endComputation","_destroyServices","reverse","destroy","setup","init","fixture","get","inTest","n","_services","addService","push","after","before","has","obj","key","hasOwnProperty","value","pop","returnValue","prototype","items","isOrdered","_items","add","i","length","values","values_only","_order","unordered","insertItem","insertAt","ordering","indexOf","ordered","splice","index","iterations","deserializeDatetime","deserialized","moment","serializeDatetime","serialized","format","startsWith","string","beginning","endsWith","tail","UrlConfInvalidComponentError","message","toString","UrlConf","_patterns","patterns","prefixPattern","prefix","pattern","replace","include","url","component","loadingPage","_","Loader","Ajax","cookieRegex","RegExp","CSRF_COOKIE_NAME","csrfToken","document","cookie","match","split","runningGets","ajax","method","data","progress","promise","deferred","ajax_settings","headers","X-CSRFToken","dataType","success","resolve","error","jqXHR","rejection","responseJSON","status","statusText","reject","$","preloaded","post","Api","buildUrl","model","call","querystrings","router","baseUrl","one","id","many","filters","target","argumentsArray","arguments","apply","settings","mount","getElementById","ForumLayout","locale","attr","noop","route","isActive","__controller","controller","__onunload","onunload","vm","__init","initArgs","then","ondata","finalArgs","f","container","errorPage","loading","__view","view","isReady","Router","staticUrl","mediaUrl","urls","reverses","routedComponent","populatePatterns","urlconf","finalPattern","startRouting","mode","delegateElement","delegateName","cleanUrl","isRelative","substr","location","protocol","host","avatarsUrl","delegateClicks","element","on","e","href","preventDefault","off","prefixUrl","error403","ban","ErrorBannedRoute","detail","Ban","deserialize","Error403Route","error404","Error404Route","error500","Error500Route","error0","Error0Route","RunLoop","_intervals","run","callable","delay","setTimeout","result","runOnce","stop","clearTimeout","runloop","_setTitle","title","completeTitle","page","interpolate","gettext","parent","forum_name","setTitle","html","plain","expires_on","error_message","help","code","icon","trust","expirationMessage","isAfter","fromNow","IndexRoute","forum_index_title","count","prop","increment","console","log","ctrl","onclick","legalPageFactory","typeName","defaultTitle","dashedTypeName","api","body","PageHeader","TermsOfServiceRoute","PrivacyPolicyRoute","legalLink","legalType","FooterNav","isVisible","forum_footnote","terms_of_service","terms_of_service_link","privacy_policy","privacy_policy_link","ForumFooter","nav","FooterMisagoBranding","BrandFull","branding","children","src","alt","ForumNavbar","desktopNavbar","forum_branding_display","forum_branding_text","config","persistent","el","isInit","retain","LoadingPage","setupMarkup","MisagoMarkup","content","options"],"mappings":"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","file":"misago.js","sourcesContent":["/* global -Misago */\n/* exported Misago */\n(function () {\n 'use strict';\n\n window.Misago = function() {\n var ns = Object.getPrototypeOf(this);\n var self = this;\n\n // Context data\n this.context = {\n // Empty settings\n SETTINGS: {}\n };\n\n this._initServices = function(services) {\n m.startComputation();\n\n var orderedServices = new ns.OrderedList(services).order(false);\n orderedServices.forEach(function (item) {\n var factory = null;\n if (item.item.factory !== undefined) {\n factory = item.item.factory;\n } else {\n factory = item.item;\n }\n\n var serviceInstance = factory(self);\n if (serviceInstance) {\n self[item.name] = serviceInstance;\n }\n });\n\n m.endComputation();\n };\n\n this._destroyServices = function(services) {\n var orderedServices = new ns.OrderedList(services).order();\n orderedServices.reverse();\n orderedServices.forEach(function (item) {\n if (item.destroy !== undefined) {\n item.destroy(self);\n }\n });\n };\n\n // App init/destory\n this.setup = false;\n this.init = function(setup) {\n this.setup = {\n fixture: ns.get(setup, 'fixture', null),\n inTest: ns.get(setup, 'inTest', false)\n };\n\n this._initServices(n._services);\n };\n\n this.destroy = function() {\n this._destroyServices(ns._services);\n };\n };\n\n // Services\n var ns = window.Misago;\n\n ns._services = [];\n\n ns.addService = function(name, factory, order) {\n ns._services.push({\n name: name,\n item: factory,\n after: ns.get(order, 'after'),\n before: ns.get(order, 'before')\n });\n };\n}());\n\n(function (Misago) {\n 'use strict';\n\n Misago.has = function(obj, key) {\n if (obj !== undefined) {\n return obj.hasOwnProperty(key);\n } else {\n return false;\n }\n };\n\n Misago.get = function(obj, key, value) {\n if (Misago.has(obj, key)) {\n return obj[key];\n } else if (value !== undefined) {\n return value;\n } else {\n return undefined;\n }\n };\n\n Misago.pop = function(obj, key, value) {\n var returnValue = Misago.get(obj, key, value);\n if (Misago.has(obj, key)) {\n delete obj[key];\n }\n return returnValue;\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.OrderedList = function(items) {\n this.isOrdered = false;\n this._items = items || [];\n\n this.add = function(key, item, order) {\n this._items.push({\n key: key,\n item: item,\n after: Misago.get(order, 'after'),\n before: Misago.get(order, 'before')\n });\n };\n\n this.get = function(key, value) {\n for (var i = 0; i < this._items.length; i++) {\n if (this._items[i].key === key) {\n return this._items[i].item;\n }\n }\n\n return value;\n };\n\n this.has = function(key) {\n return this.get(key) !== undefined;\n };\n\n this.values = function() {\n var values = [];\n for (var i = 0; i < this._items.length; i++) {\n values.push(this._items[i].item);\n }\n return values;\n };\n\n this.order = function(values_only) {\n if (!this.isOrdered) {\n this._items = this._order(this._items);\n this.isOrdered = true;\n }\n\n if (values_only || typeof values_only === 'undefined') {\n return this.values();\n } else {\n return this._items;\n }\n };\n\n this._order = function(unordered) {\n // Index of unordered items\n var index = [];\n unordered.forEach(function (item) {\n index.push(item.key);\n });\n\n // List start\n\n // Ordered items\n var ordered = [];\n var ordering = [];\n\n // First pass: register items that\n // don't specify their order\n unordered.forEach(function (item) {\n if (!item.after && !item.before) {\n ordered.push(item);\n ordering.push(item.key);\n }\n });\n\n // Second pass: keep iterating items\n // until we hit iterations limit or finish\n // ordering list\n function insertItem(item) {\n var insertAt = -1;\n if (ordering.indexOf(item.key) === -1) {\n if (item.after) {\n insertAt = ordering.indexOf(item.after);\n if (insertAt !== -1) {\n insertAt += 1;\n }\n } else if (item.before) {\n insertAt = ordering.indexOf(item.before);\n }\n\n if (insertAt !== -1) {\n ordered.splice(insertAt, 0, item);\n ordering.splice(insertAt, 0, item.key);\n }\n }\n }\n\n var iterations = 200;\n while (iterations > 0 && index.length !== ordering.length) {\n iterations -= 1;\n unordered.forEach(insertItem);\n }\n\n return ordered;\n };\n };\n} (Misago.prototype));\n\n(function (Misago) {\n Misago.deserializeDatetime = function(deserialized) {\n return deserialized ? moment(deserialized) : null;\n };\n\n Misago.serializeDatetime = function(serialized) {\n return serialized ? serialized.format() : null;\n };\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.startsWith = function(string, beginning) {\n return string.indexOf(beginning) === 0;\n };\n\n Misago.endsWith = function(string, tail) {\n return string.indexOf(tail, string.length - tail.length) !== -1;\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.UrlConfInvalidComponentError = function(name) {\n this.message = \"route's \" + name + \" component should be an array or object\";\n\n this.toString = function() {\n return this.message;\n };\n };\n\n Misago.UrlConf = function() {\n var self = this;\n this._patterns = [];\n\n this.patterns = function() {\n return this._patterns;\n };\n\n var prefixPattern = function(prefix, pattern) {\n return (prefix + pattern).replace('//', '/');\n };\n\n var include = function(prefix, patterns) {\n for (var i = 0; i < patterns.length; i ++) {\n self.url(prefixPattern(prefix, patterns[i].pattern),\n patterns[i].component,\n patterns[i].name);\n }\n };\n\n this.url = function(pattern, component, name) {\n if (typeof component !== 'object') {\n throw new Misago.UrlConfInvalidComponentError(name);\n }\n\n if (pattern === '') {\n pattern = '/';\n }\n\n if (component instanceof Misago.UrlConf) {\n include(pattern, component.patterns());\n } else {\n this._patterns.push({\n pattern: pattern,\n component: component,\n name: name\n });\n }\n };\n };\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.loadingPage = function(_) {\n return m('.page.page-loading', _.component(Misago.Loader));\n };\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var Ajax = function(_) {\n var cookieRegex = new RegExp(_.context.CSRF_COOKIE_NAME + '\\=([^;]*)');\n this.csrfToken = Misago.get(document.cookie.match(cookieRegex), 0).split('=')[1];\n\n /*\n List of GETs underway\n We are limiting number of GETs to API to 1 per url\n */\n var runningGets = {};\n\n this.ajax = function(method, url, data, progress) {\n var promise = m.deferred();\n\n var ajax_settings = {\n url: url,\n method: method,\n headers: {\n 'X-CSRFToken': this.csrfToken\n },\n\n data: data | {},\n dataType: 'json',\n\n success: function(data) {\n if (method === 'GET') {\n Misago.pop(runningGets, url);\n }\n promise.resolve(data);\n },\n error: function(jqXHR) {\n if (method === 'GET') {\n Misago.pop(runningGets, url);\n }\n\n var rejection = jqXHR.responseJSON || {};\n\n rejection.status = jqXHR.status;\n rejection.statusText = jqXHR.statusText;\n\n promise.reject(rejection);\n }\n };\n\n if (progress) {\n return; // not implemented... yet!\n }\n\n $.ajax(ajax_settings);\n return promise.promise;\n };\n\n this.get = function(url) {\n var preloaded = Misago.pop(_.context, url);\n if (preloaded) {\n var deferred = m.deferred();\n deferred.resolve(preloaded);\n return deferred.promise;\n } else if (runningGets[url] !== undefined) {\n return runningGets[url];\n } else {\n runningGets[url] = this.ajax('GET', url);\n return runningGets[url];\n }\n };\n\n this.post = function(url) {\n return this.ajax('POST', url);\n };\n };\n\n Misago.addService('ajax', function(_) {\n return new Ajax(_);\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var Api = function(_) {\n this.buildUrl = function(model, call, querystrings) {\n var url = _.router.baseUrl;\n url += 'api/' + model + '/';\n return url;\n };\n\n this.one = function(model, id) {\n var url = this.buildUrl(model) + id + '/';\n return _.ajax.get(url);\n };\n\n this.many = function(model, filters) {\n\n };\n\n this.call = function(model, target, call, data) {\n\n };\n };\n\n Misago.addService('api', function(_) {\n return new Api(_);\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.addService('components-factory', function(_) {\n // Component factory\n _.component = function() {\n var argumentsArray = [];\n for (var i = 0; i < arguments.length; i += 1) {\n argumentsArray.push(arguments[i]);\n }\n\n argumentsArray.push(_);\n return m.component.apply(undefined, argumentsArray);\n };\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.addService('conf', function(_) {\n _.settings = Misago.get(_.context, 'SETTINGS', {});\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.addService('forum-layout', {\n factory: function(_) {\n if (_.setup.fixture) {\n m.mount(document.getElementById(_.setup.fixture),\n _.component(Misago.ForumLayout));\n }\n },\n\n destroy: function(_) {\n if (_.setup.fixture) {\n m.mount(_.setup.fixture, null);\n }\n }\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.addService('set-momentjs-locale', function() {\n moment.locale($('html').attr('lang'));\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var noop = function() {};\n\n Misago.route = function(component) {\n /*\n Boilerplate for Misago top-level components\n */\n\n // Component state\n component.isActive = true;\n\n // Wrap controller to store lifecycle methods\n var __controller = component.controller || noop;\n component.controller = function() {\n component.isActive = true;\n\n var controller = __controller.apply(component, arguments) || {};\n\n // wrap onunload for lifestate\n var __onunload = controller.onunload || noop;\n controller.onunload = function() {\n __onunload.apply(component, arguments);\n component.isActive = false;\n };\n\n return controller;\n };\n\n // Add state callbacks to View-Model\n if (component.vm && component.vm.init) {\n // wrap vm.init in promise handler\n var __init = component.vm.init;\n component.vm.init = function() {\n var initArgs = arguments;\n var promise = __init.apply(component.vm, initArgs);\n\n if (promise) {\n promise.then(function() {\n if (component.isActive && component.vm.ondata) {\n var finalArgs = [];\n for (var i = 0; i < arguments.length; i++) {\n finalArgs.push(arguments[i]);\n }\n for (var f = 0; f < initArgs.length; f++) {\n finalArgs.push(initArgs[f]);\n }\n\n component.vm.ondata.apply(component.vm, finalArgs);\n }\n }, function(error) {\n if (component.isActive) {\n component.container.router.errorPage(error);\n }\n });\n }\n };\n\n // setup default loading view\n if (!component.loading) {\n component.loading = function () {\n var _ = this.container;\n return m('.page.page-loading',\n _.component(Misago.Loader)\n );\n };\n }\n\n var __view = component.view;\n component.view = function() {\n if (component.vm.isReady) {\n return __view.apply(component, arguments);\n } else {\n return component.loading.apply(component, arguments);\n }\n };\n }\n\n return component;\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var Router = function(_) {\n var self = this;\n this.baseUrl = $('base').attr('href');\n\n var staticUrl = Misago.get(_.context, 'STATIC_URL', '/');\n var mediaUrl = Misago.get(_.context, 'MEDIA_URL', '/');\n\n // Routing\n this.urls = {};\n this.reverses = {};\n\n var routedComponent = function(component) {\n component.container = _;\n return component;\n };\n\n var populatePatterns = function(urlconf) {\n urlconf.patterns().forEach(function(url) {\n // set service container on component\n\n var finalPattern = self.baseUrl + url.pattern;\n finalPattern = finalPattern.replace('//', '/');\n\n self.urls[finalPattern] = routedComponent(url.component);\n self.reverses[url.name] = finalPattern;\n });\n };\n\n this.startRouting = function(urlconf, fixture) {\n populatePatterns(urlconf);\n this.fixture = fixture;\n\n m.route.mode = 'pathname';\n m.route(fixture, '/', this.urls);\n };\n\n this.url = function(name) {\n return this.reverses[name];\n };\n\n // Delegate clicks\n this.delegateElement = null;\n this.delegateName = 'click.misago-router';\n\n this.cleanUrl = function(url) {\n if (!url) { return; }\n\n // Is link relative?\n var isRelative = url.substr(0, 1) === '/' && url.substr(0, 2) !== '//';\n\n // If link contains host, validate to see if its outgoing\n if (!isRelative) {\n var location = window.location;\n\n // If protocol matches current one, strip it from string\n // otherwhise stop handler\n if (url.substr(0, 2) !== '//') {\n var protocol = url.substr(0, location.protocol.length + 2);\n if (protocol !== location.protocol + '//') { return; }\n url = url.substr(location.protocol.length + 2);\n } else {\n url = url.substr(2);\n }\n\n // Host checks out?\n if (url.substr(0, location.host.length) !== location.host) { return; }\n url = url.substr(location.host.length);\n }\n\n // Is link within Ember app?\n if (url.substr(0, this.baseUrl.length) !== this.baseUrl) { return; }\n\n // Is link to media/static/avatar server?\n if (url.substr(0, staticUrl.length) === staticUrl) { return; }\n\n if (url.substr(0, mediaUrl.length) === mediaUrl) { return; }\n\n var avatarsUrl = '/user-avatar/';\n if (url.substr(0, avatarsUrl.length) === avatarsUrl) { return; }\n\n return url;\n };\n\n this.delegateClicks = function(element) {\n this.delegateElement = element;\n $(this.delegateElement).on(this.delegateName, 'a', function(e) {\n var cleanUrl = self.cleanUrl(e.target.href);\n if (cleanUrl) {\n if (cleanUrl != m.route()) {\n m.route(cleanUrl);\n }\n e.preventDefault();\n }\n });\n };\n\n this.destroy = function() {\n $(this.delegateElement).off(this.delegateName);\n };\n\n // Media/Static url\n var prefixUrl = function(prefix) {\n return function(url) {\n return prefix + url;\n };\n };\n\n this.staticUrl = prefixUrl(staticUrl);\n this.mediaUrl = prefixUrl(mediaUrl);\n\n // Errors\n this.error403 = function(error) {\n var component = null;\n if (error.ban) {\n component = routedComponent(Misago.ErrorBannedRoute);\n component.error = {\n message: error.detail,\n ban: Misago.Ban.deserialize(error.ban)\n };\n } else {\n component = routedComponent(Misago.Error403Route);\n component.error = error.detail;\n }\n\n m.mount(this.fixture, component);\n };\n\n this.error404 = function() {\n m.mount(this.fixture, routedComponent(Misago.Error404Route));\n };\n\n this.error500 = function() {\n m.mount(this.fixture, routedComponent(Misago.Error500Route));\n };\n\n this.error0 = function() {\n m.mount(this.fixture, routedComponent(Misago.Error0Route));\n };\n\n this.errorPage = function(error) {\n if (error.status === 0) {\n this.error0();\n }\n\n if (error.status === 500) {\n this.error500();\n }\n\n if (error.status === 404) {\n this.error404();\n }\n\n if (error.status === 403) {\n this.error403(error);\n }\n };\n };\n\n Misago.addService('router', function(_) {\n return new Router(_);\n });\n\n Misago.addService('start-routing', function(_) {\n _.router.startRouting(Misago.urls, document.getElementById('router-fixture'));\n _.router.delegateClicks(document.getElementById(_.setup.fixture));\n }, {after: 'forum-layout'});\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var RunLoop = function(_) {\n var self = this;\n\n this._intervals = {};\n\n this.run = function(callable, name, delay) {\n this._intervals[name] = window.setTimeout(function() {\n var result = callable(_);\n if (result !== false) {\n self.run(callable, name, delay);\n }\n }, delay);\n };\n\n this.runOnce = function(callable, name, delay) {\n this._intervals[name] = window.setTimeout(function() {\n callable(_);\n }, delay);\n };\n\n this.stop = function() {\n for (var name in this._intervals) {\n if (this._intervals.hasOwnProperty(name)) {\n window.clearTimeout(this._intervals[name]);\n delete this._intervals[name];\n }\n }\n };\n };\n\n Misago.addService('runloop', {\n factory: function(_) {\n return new RunLoop(_);\n },\n\n destroy: function(_) {\n _.runloop.stop();\n }\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.addService('start-tick', function(_) {\n _.runloop.run(function() {\n m.startComputation();\n // just tick once a minute so stuff gets rerendered\n // syncing dynamic timestamps, etc ect\n m.endComputation();\n }, 'tick', 60000);\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.addService('page-title', function(_) {\n _._setTitle = function(title) {\n if (typeof title === 'string') {\n title = {title: title};\n }\n\n var completeTitle = title.title;\n\n if (typeof title.page !== 'undefined' && title.page > 1) {\n completeTitle += ' (' + interpolate(gettext('page %(page)s'), { page:title.page }, true) + ')';\n }\n\n if (typeof title.parent !== 'undefined') {\n completeTitle += ' | ' + title.parent;\n }\n\n document.title = completeTitle + ' | ' + this.settings.forum_name;\n };\n\n _.setTitle = function(title) {\n if (title) {\n this._setTitle(title);\n } else {\n document.title = this.settings.forum_name;\n }\n };\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.Ban = function(data) {\n this.message = {\n html: data.message.html,\n plain: data.message.plain,\n };\n\n this.expires_on = data.expires_on;\n };\n\n Misago.Ban.deserialize = function(data) {\n data.expires_on = Misago.deserializeDatetime(data.expires_on);\n\n return new Misago.Ban(data);\n };\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var errorPage = function(error) {\n var error_message = [\n m('p.lead', error.message)\n ];\n\n if (error.help) {\n error_message.push(m('p.help', error.help));\n }\n\n return m('.page.error-page.error-' + error.code + '-page',\n m('.container',\n m('.error-panel', [\n m('.error-icon',\n m('span.material-icon', error.icon)\n ),\n m('.error-message', error_message)\n ])\n )\n );\n };\n\n Misago.ErrorBannedRoute = Misago.route({\n controller: function() {\n this.container.setTitle(gettext('You are banned'));\n },\n error: null,\n view: function() {\n var error_message = [];\n if (this.error.ban.message.html) {\n error_message.push(m('.lead', m.trust(this.error.ban.message.html)));\n } else {\n error_message.push(m('p.lead', this.error.message));\n }\n\n var expirationMessage = null;\n if (this.error.ban.expires_on) {\n if (this.error.ban.expires_on.isAfter(moment())) {\n expirationMessage = interpolate(\n gettext('This ban expires %(expires_on)s.'),\n { 'expires_on': this.error.ban.expires_on.fromNow() },\n true);\n } else {\n expirationMessage = gettext('This ban has expired.');\n }\n } else {\n expirationMessage = gettext('This ban is permanent.');\n }\n error_message.push(m('p', expirationMessage));\n\n return m('.page.error-page.error-banned-page',\n m('.container',\n m('.error-panel', [\n m('.error-icon',\n m('span.material-icon', 'highlight_off')\n ),\n m('.error-message', error_message)\n ])\n )\n );\n }\n });\n\n Misago.Error403Route = Misago.route({\n controller: function() {\n this.container.setTitle(gettext('Page not available'));\n },\n error: null,\n view: function() {\n return errorPage({\n code: 403,\n icon: 'remove_circle_outline',\n message: gettext(\"This page is not available.\"),\n help: this.error || gettext(\"You don't have permission to access this page.\")\n });\n }\n });\n\n Misago.Error404Route = Misago.route({\n controller: function() {\n this.container.setTitle(gettext('Page not found'));\n },\n view: function() {\n return errorPage({\n code: 404,\n icon: 'info_outline',\n message: gettext(\"Requested page could not be found.\"),\n help: gettext(\"The link you followed was incorrect or the page has been moved or deleted.\")\n });\n }\n });\n\n Misago.Error500Route = Misago.route({\n controller: function() {\n this.container.setTitle(gettext('Application error occured'));\n },\n view: function() {\n return errorPage({\n code: 500,\n icon: 'error_outline',\n message: gettext(\"Requested page could not be displayed due to an error.\"),\n help: gettext(\"Please try again later or contact site staff if error persists.\")\n });\n }\n });\n\n Misago.Error0Route = Misago.route({\n controller: function() {\n this.container.setTitle(gettext('Lost connection with application'));\n },\n view: function() {\n return errorPage({\n code: 500,\n icon: 'sync_problem',\n message: gettext(\"Could not connect to application.\"),\n help: gettext(\"This may be caused by problems with your connection or application server. Please check your internet connection and refresh page if problem persists.\")\n });\n }\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.IndexRoute = Misago.route({\n controller: function() {\n var _ = this.container;\n document.title = _.settings.forum_index_title || _.settings.forum_name;\n\n var count = m.prop(0);\n\n return {\n count: count,\n increment: function() {\n console.log('increment()');\n count(count() + 1);\n }\n };\n },\n view: function(ctrl) {\n return m('.container', [\n m('h1', ['Count: ', m('strong', ctrl.count())]),\n m('p', 'Clicky click button to increase count!.'),\n m('p',\n m('button.btn.btn-primary', {onclick: ctrl.increment}, 'Clicky clicky!')\n )\n ]);\n }\n });\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var legalPageFactory = function(typeName, defaultTitle) {\n var dashedTypeName = typeName.replace(/_/g, '-');\n\n return Misago.route({\n controller: function() {\n var _ = this.container;\n\n if (Misago.get(_.settings, typeName + '_link')) {\n window.location = Misago.get(_.settings, typeName + '_link');\n } else {\n this.vm.init(this, _);\n }\n },\n vm: {\n isReady: false,\n init: function(component, _) {\n if (this.isReady) {\n _.setTitle(this.title);\n } else {\n _.setTitle();\n return _.api.one('legal-pages', dashedTypeName);\n }\n },\n ondata: function(data, component, _) {\n m.startComputation();\n\n this.title = data.title || defaultTitle;\n this.body = data.body;\n this.isReady = true;\n\n m.endComputation();\n\n if (component.isActive) {\n _.setTitle(data.title);\n }\n }\n },\n view: function() {\n var _ = this.container;\n\n return m('.page.legal-page.' + dashedTypeName + '-page', [\n _.component(Misago.PageHeader, {title: this.vm.title}),\n m('.container',\n m.trust(this.vm.body)\n )\n ]);\n }\n });\n };\n\n Misago.TermsOfServiceRoute = legalPageFactory(\n 'terms_of_service', gettext('Terms of service'));\n Misago.PrivacyPolicyRoute = legalPageFactory(\n 'privacy_policy', gettext('Privacy policy'));\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var legalLink = function(_, legalType, defaultTitle) {\n var url = Misago.get(_.settings, legalType + '_link');\n if (!url && Misago.get(_.settings, legalType)) {\n url = _.router.url(legalType);\n }\n\n if (url) {\n return m('li',\n m('a', {href: url}, Misago.get(_.settings, legalType + '_title', defaultTitle))\n );\n } else {\n return null;\n }\n };\n\n Misago.FooterNav = {\n isVisible: function(settings) {\n return [\n !!settings.forum_footnote,\n !!settings.terms_of_service,\n !!settings.terms_of_service_link,\n !!settings.privacy_policy,\n !!settings.privacy_policy_link\n ].indexOf(true) !== -1;\n },\n view: function(ctrl, _) {\n var items = [];\n\n if (_.settings.forum_footnote) {\n items.push(m('li.forum-footnote', m.trust(_.settings.forum_footnote)));\n }\n\n items.push(legalLink(_, 'terms_of_service', gettext('Terms of service')));\n items.push(legalLink(_, 'privacy_policy', gettext('Privacy policy')));\n\n return m('ul.list-inline.footer-nav', items);\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.ForumFooter = {\n view: function(ctrl, _) {\n var nav = null;\n if (Misago.FooterNav.isVisible(_.settings)) {\n nav = _.component(Misago.FooterNav);\n }\n\n return m('footer.forum-footer', [\n m('.container',\n m('.footer-content', [\n nav,\n _.component(Misago.FooterMisagoBranding)\n ])\n )\n ]);\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.FooterMisagoBranding = {\n view: function() {\n return m('a.misago-branding[href=http://misago-project.org]', [\n \"powered by \", m('strong', \"misago\")\n ]);\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.BrandFull = {\n view: function(ctrl, branding, _) {\n var children = [\n m('img', {\n src: _.router.staticUrl('misago/img/site-logo.png'),\n alt: _.settings.forum_name\n })\n ];\n\n if (branding) {\n children.push(branding);\n }\n\n return m('a.navbar-brand', {href: _.router.url('index')}, children);\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.ForumNavbar = {\n view: function(ctrl, _) {\n var desktopNavbar = [];\n\n if (_.settings.forum_branding_display) {\n desktopNavbar.push(_.component(Misago.BrandFull, _.settings.forum_branding_text));\n }\n\n desktopNavbar.push(m('ul.nav.navbar-nav', [\n m('li', m(\"a\", {config: m.route, href: _.router.url('index')}, 'Index')),\n m('li', m(\"a\", {config: m.route, href: _.router.url('test')}, 'Test'))\n ]));\n\n return m('nav.navbar.navbar-default.navbar-static-top[role=\"navigation\"]', [\n m('.container.navbar-full.hidden-xs.hidden-sm', desktopNavbar)\n ]);\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var persistent = function(el, isInit, context) {\n context.retain = true;\n };\n\n Misago.ForumLayout = {\n view: function(ctrl, _) {\n return [\n _.component(Misago.ForumNavbar),\n m('#router-fixture', {config: persistent}),\n _.component(Misago.ForumFooter)\n ];\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.Loader = {\n view: function() {\n return m('.loader.sk-folding-cube', [\n m('.sk-cube1.sk-cube'),\n m('.sk-cube2.sk-cube'),\n m('.sk-cube4.sk-cube'),\n m('.sk-cube3.sk-cube')\n ]);\n }\n };\n\n Misago.LoadingPage = {\n view: function(ctrl, _) {\n return m('.page.loading-page',\n _.component(Misago.Loader)\n );\n }\n };\n} (Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n var setupMarkup = function(el, isInit, context) {\n context.retain = true;\n };\n\n Misago.MisagoMarkup = {\n view: function(ctrl, content) {\n return m('article.misago-markup', {config: setupMarkup}, m.trust(content));\n }\n };\n}(Misago.prototype));\n\n(function (Misago) {\n 'use strict';\n\n Misago.PageHeader = {\n view: function(ctrl, options) {\n return m('.page-header',\n m('.container', [\n m('h1', options.title),\n ])\n );\n }\n };\n}(Misago.prototype));\n\n(function (Misago, UrlConf) {\n 'use strict';\n\n var urls = new UrlConf();\n urls.url('/', Misago.IndexRoute, 'index');\n\n // Legal pages\n urls.url('/terms-of-service/', Misago.TermsOfServiceRoute, 'terms_of_service');\n urls.url('/privacy-policy/', Misago.PrivacyPolicyRoute, 'privacy_policy');\n\n Misago.urls = urls;\n} (Misago.prototype, Misago.prototype.UrlConf));\n"],"sourceRoot":"/source/"}
|