Rafał Pitoń 9 лет назад
Родитель
Сommit
c8496978ed

+ 0 - 8
misago/frontend/misago/components/loaders.js

@@ -18,12 +18,4 @@
     },
     after: 'components'
   });
-
-  Misago.LoadingPage = {
-    view: function(ctrl, _) {
-      return m('.page.loading-page',
-        _.component('loader')
-      );
-    }
-  };
 } (Misago.prototype));

+ 2 - 2
misago/frontend/misago/components/modals/signin.js

@@ -5,7 +5,7 @@
     context.retain = true;
   }
 
-  var signin = Misago.route({
+  var signin = {
     controller: function() {
       console.log('construct!');
       return {
@@ -65,7 +65,7 @@
         )
       );
     }
-  });
+  };
 
   Misago.addService('component:modal:sign-in', {
     factory: function(_) {

+ 20 - 9
misago/frontend/misago/routes/error-pages.js

@@ -22,7 +22,7 @@
     );
   };
 
-  Misago.ErrorBannedRoute = Misago.route({
+  var errorBanned = {
     controller: function() {
       this.container.title.set(gettext('You are banned'));
     },
@@ -61,9 +61,9 @@
         )
       );
     }
-  });
+  };
 
-  Misago.Error403Route = Misago.route({
+  var error403 = {
     controller: function() {
       this.container.title.set(gettext('Page not available'));
     },
@@ -80,9 +80,9 @@
         help: this.error
       });
     }
-  });
+  };
 
-  Misago.Error404Route = Misago.route({
+  var error404 = {
     controller: function() {
       this.container.title.set(gettext('Page not found'));
     },
@@ -94,9 +94,9 @@
         help: gettext("The link you followed was incorrect or the page has been moved or deleted.")
       });
     }
-  });
+  };
 
-  Misago.Error500Route = Misago.route({
+  var error500 = {
     controller: function() {
       this.container.title.set(gettext('Application error occured'));
     },
@@ -108,9 +108,9 @@
         help: gettext("Please try again later or contact site staff if error persists.")
       });
     }
-  });
+  };
 
-  Misago.Error0Route = Misago.route({
+  var error0 = {
     controller: function() {
       this.container.title.set(gettext('Lost connection with application'));
     },
@@ -122,5 +122,16 @@
         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.")
       });
     }
+  };
+
+  Misago.addService('route:error-pages', {
+    factory: function(_) {
+      _.route('error:banned', errorBanned);
+      _.route('error:403', error403);
+      _.route('error:404', error404);
+      _.route('error:500', error500);
+      _.route('error:0', error0);
+    },
+    after: 'routes'
   });
 }(Misago.prototype));

+ 8 - 1
misago/frontend/misago/routes/index.js

@@ -1,7 +1,7 @@
 (function (Misago) {
   'use strict';
 
-  Misago.IndexRoute = Misago.route({
+  var index = {
     controller: function() {
       var _ = this.container;
       document.title = _.settings.forum_index_title || _.settings.forum_name;
@@ -29,5 +29,12 @@
         )
       ]);
     }
+  };
+
+  Misago.addService('route:index', {
+    factory: function(_) {
+      _.route('index', index);
+    },
+    after: 'routes'
   });
 }(Misago.prototype));

+ 11 - 6
misago/frontend/misago/routes/legal.js

@@ -4,7 +4,7 @@
   var legalPageFactory = function(typeName, defaultTitle) {
     var dashedTypeName = typeName.replace(/_/g, '-');
 
-    return Misago.route({
+    return {
       controller: function() {
         var _ = this.container;
 
@@ -53,11 +53,16 @@
           )
         ]);
       }
-    });
+    };
   };
 
-  Misago.TermsOfServiceRoute = legalPageFactory(
-    'terms_of_service', gettext('Terms of service'));
-  Misago.PrivacyPolicyRoute = legalPageFactory(
-    'privacy_policy', gettext('Privacy policy'));
+  Misago.addService('route:legal-pages', {
+    factory: function(_) {
+      _.route('terms-of-service', legalPageFactory(
+        'terms_of_service', gettext('Terms of service')));
+      _.route('privacy-policy', legalPageFactory(
+        'privacy_policy', gettext('Privacy policy')));
+    },
+    after: 'routes'
+  });
 }(Misago.prototype));

+ 7 - 13
misago/frontend/misago/services/router.js

@@ -12,19 +12,12 @@
     this.urls = {};
     this.reverses = {};
 
-    var routedComponent = function(component) {
-      component.container = _;
-      return component;
-    };
-
     var populatePatterns = function(urlconf) {
       urlconf.patterns().forEach(function(url) {
-        // set service container on component
-
         var finalPattern = self.baseUrl + url.pattern;
         finalPattern = finalPattern.replace('//', '/');
 
-        self.urls[finalPattern] = routedComponent(url.component);
+        self.urls[finalPattern] = _.route(url.component);
         self.reverses[url.name] = finalPattern;
       });
     };
@@ -119,13 +112,14 @@
     this.error403 = function(error) {
       var component = null;
       if (error.ban) {
-        component = routedComponent(Misago.ErrorBannedRoute);
+        component = _.route('error:banned');
+        console.log(component);
         component.error = {
           message: error.detail,
           ban: _.models.deserialize('ban', error.ban)
         };
       } else {
-        component = routedComponent(Misago.Error403Route);
+        component = _.route('error:403');
         component.error = error.detail;
       }
 
@@ -133,15 +127,15 @@
     };
 
     this.error404 = function() {
-      m.mount(this.fixture, routedComponent(Misago.Error404Route));
+      m.mount(this.fixture, _.route('error:404'));
     };
 
     this.error500 = function() {
-      m.mount(this.fixture, routedComponent(Misago.Error500Route));
+      m.mount(this.fixture, _.route('error:500'));
     };
 
     this.error0 = function() {
-      m.mount(this.fixture, routedComponent(Misago.Error0Route));
+      m.mount(this.fixture, _.route('error:0'));
     };
 
     this.errorPage = function(error) {

+ 21 - 9
misago/frontend/misago/services/route.js → misago/frontend/misago/services/routes.js

@@ -3,7 +3,7 @@
 
   var noop = function() {};
 
-  Misago.route = function(component) {
+  var boilerplate = function(component) {
     /*
       Boilerplate for Misago top-level components
     */
@@ -12,16 +12,16 @@
     component.isActive = true;
 
     // Wrap controller to store lifecycle methods
-    var __controller = component.controller || noop;
+    var _controller = component.controller || noop;
     component.controller = function() {
       component.isActive = true;
 
-      var controller = __controller.apply(component, arguments) || {};
+      var controller = _controller.apply(component, arguments) || {};
 
       // wrap onunload for lifestate
-      var __onunload = controller.onunload || noop;
+      var _onunload = controller.onunload || noop;
       controller.onunload = function() {
-        __onunload.apply(component, arguments);
+        _onunload.apply(component, arguments);
         component.isActive = false;
       };
 
@@ -31,10 +31,10 @@
     // Add state callbacks to View-Model
     if (component.vm && component.vm.init) {
       // wrap vm.init in promise handler
-      var __init = component.vm.init;
+      var _init = component.vm.init;
       component.vm.init = function() {
         var initArgs = arguments;
-        var promise = __init.apply(component.vm, initArgs);
+        var promise = _init.apply(component.vm, initArgs);
 
         if (promise) {
           promise.then(function() {
@@ -67,10 +67,10 @@
         };
       }
 
-      var __view = component.view;
+      var _view = component.view;
       component.view = function() {
         if (component.vm.isReady) {
-          return __view.apply(component, arguments);
+          return _view.apply(component, arguments);
         } else {
           return component.loading.apply(component, arguments);
         }
@@ -79,4 +79,16 @@
 
     return component;
   };
+
+  Misago.addService('routes', function(_) {
+    _._routes = {};
+    _.route = function(name, component) {
+      if (name && component) {
+        component.container = _;
+        this._routes[name] = boilerplate(component);
+      } else {
+        return this._routes[name];
+      }
+    };
+  });
 }(Misago.prototype));

+ 2 - 4
misago/frontend/misago/urls.js

@@ -2,21 +2,19 @@
   'use strict';
 
   var urls = new UrlConf();
-  urls.url('/', Misago.IndexRoute, 'index');
+  urls.url('/', 'index');
 
   // Legal pages
   urls.url(
     '/terms-of-service/',
-    Misago.TermsOfServiceRoute,
     'terms_of_service');
 
   urls.url(
     '/privacy-policy/',
-    Misago.PrivacyPolicyRoute,
     'privacy_policy');
 
   // Catch-all 404 not found route
-  urls.url('/:rest...', Misago.Error404Route, 'not_found');
+  urls.url('/:rest...', 'error:404', 'not_found');
 
   Misago.urls = urls;
 } (Misago.prototype, Misago.prototype.UrlConf));

+ 2 - 15
misago/frontend/misago/utils/urlconf.js

@@ -1,15 +1,6 @@
 (function (Misago) {
   'use strict';
 
-  Misago.UrlConfInvalidComponentError = function(name) {
-    this.message = "route's " + name + " component " +
-                   "should be an array or object";
-
-    this.toString = function() {
-      return this.message;
-    };
-  };
-
   Misago.UrlConf = function() {
     var self = this;
     this._patterns = [];
@@ -31,10 +22,6 @@
     };
 
     this.url = function(pattern, component, name) {
-      if (typeof component !== 'object') {
-        throw new Misago.UrlConfInvalidComponentError(name);
-      }
-
       if (pattern === '') {
         pattern = '/';
       }
@@ -44,8 +31,8 @@
       } else {
         this._patterns.push({
           pattern: pattern,
-          component: component,
-          name: name
+          component: component.replace(/_/g, '-'),
+          name: name || component
         });
       }
     };

+ 11 - 5
misago/frontend/test/tests/unit/urlconf.js

@@ -10,21 +10,27 @@
   });
 
   QUnit.test("url registers pattern in config", function(assert) {
-    var component = {test: 'test'};
-
-    urlconf.url('/test/', component, 'test_url');
+    urlconf.url('/test/', 'route', 'test_url');
     var patterns = urlconf.patterns();
 
     assert.equal(patterns.length, 1,
       'url() has registered single URL in config');
     assert.deepEqual(
       patterns[0],
-      {pattern: '/test/', component: component, name: 'test_url'},
+      {pattern: '/test/', component: 'route', name: 'test_url'},
       'url() has registered valid URL in config');
   });
 
+  QUnit.test("url normalizes route component name", function(assert) {
+    urlconf.url('/test/', 'some_test_route', 'test_url');
+    var patterns = urlconf.patterns();
+
+    assert.equal(patterns[0].component, 'some-test-route',
+      'url() has normalized component name underscores to comas');
+  });
+
   QUnit.test("UrlConf.url(conf) includes child config", function(assert) {
-    var component = {test: 'test'};
+    var component = 'some-test';
     urlconf.url('', component, 'test_url');
     urlconf.url('/test/', component, 'test_url');