Просмотр исходного кода

ember framework update

* page title service
* WIP better moment.js implementation
Rafał Pitoń 10 лет назад
Родитель
Сommit
d1ac632453

+ 1 - 1
misago/emberapp/app/controllers/error-banned.js

@@ -5,7 +5,7 @@ export default Ember.ObjectController.extend({
 
   expiresMoment: function() {
     if (!this.get('isPermanent')) {
-      return moment(this.get('model.expires_on'));
+      return moment.utc(this.get('model.expires_on'));
     } else {
       return null;
     }

+ 13 - 0
misago/emberapp/app/initializers/page-title-service.js

@@ -0,0 +1,13 @@
+import PageTitleService from 'misago/services/page-title';
+
+export function initialize(container, application) {
+  application.inject('service:page-title', 'settings', 'misago:settings');
+
+  application.register('service:page-title', PageTitleService, { singleton: true });
+  application.inject('route', 'page-title', 'service:page-title');
+}
+
+export default {
+  name: 'page-title-service',
+  initialize: initialize
+};

+ 5 - 0
misago/emberapp/app/routes/activation/activate.js

@@ -14,6 +14,11 @@ export default Ember.Route.extend(ResetScroll, {
   },
 
   actions: {
+    loading: function() {
+      this.get('page-title').setTitle(gettext('Activating account...'));
+      return true;
+    },
+
     error: function(reason) {
       if (reason.status === 404) {
         this.get('toast').error(reason.responseJSON.detail);

+ 2 - 6
misago/emberapp/app/routes/activation/index.js

@@ -14,23 +14,19 @@ export default Ember.Route.extend(ResetScroll, {
 
   actions: {
     didTransition: function() {
-      this.send('setTitle', this.get('title'));
-      return true;
+      this.get('page-title').setTitle(this.get('title'));
     },
 
     showSentPage: function(linkRecipient) {
-      this.send('setTitle', this.get('sentTitle'));
+      this.get('page-title').setTitle(this.get('sentTitle'));
       this.render(this.get('sentTemplateName'), {
         model: linkRecipient
       });
-
-      return true;
     },
 
     retry: function() {
       this.send('didTransition');
       this.renderTemplate();
-      return true;
     }
   }
 });

+ 6 - 26
misago/emberapp/app/routes/application.js

@@ -2,41 +2,21 @@ import Ember from 'ember';
 
 export default Ember.Route.extend({
   actions: {
-    setTitle: function(title) {
-      if (typeof title === 'string') {
-        title = {title: title};
-      }
-
-      var complete_title = title.title;
-
-      if (typeof title.page !== 'undefined') {
-        complete_title += ' (' + interpolate(gettext('page %(page)s'), {page:title.page}, true) + ')';
-      }
-
-      if (typeof title.parent !== 'undefined') {
-        complete_title += ' | ' + title.parent;
-      }
-
-      complete_title += ' | ' + this.get('settings.forum_name');
-
-      document.title = complete_title;
-    },
-
     // Error handlers
 
     error: function(reason) {
       if (reason.status === 0) {
-        this.send('setTitle', gettext('Connection lost'));
+        this.get('page-title').setTitle(gettext('Connection lost'));
         return this.intermediateTransitionTo('error-0');
       }
 
       if (typeof reason.responseJSON !== 'undefined' && typeof reason.responseJSON.ban !== 'undefined') {
-        this.send('setTitle', gettext('You are banned'));
+        this.get('page-title').setTitle(gettext('You are banned'));
         return this.intermediateTransitionTo('error-banned', reason.responseJSON.ban);
       }
 
       if (reason.status === 403) {
-        this.send('setTitle', gettext('Page not available'));
+        this.get('page-title').setTitle(gettext('Page not available'));
 
         var final_error = {status: 403, message: null};
         if (typeof reason.responseJSON !== 'undefined' && typeof reason.responseJSON.detail !== 'undefined' && reason.responseJSON.detail !== 'Permission denied') {
@@ -47,11 +27,11 @@ export default Ember.Route.extend({
       }
 
       if (reason.status === 404) {
-        this.send('setTitle', gettext('Page not found'));
+        this.get('page-title').setTitle(gettext('Page not found'));
         return this.intermediateTransitionTo('error-404');
       }
 
-      this.send('setTitle', gettext('Error'));
+      this.get('page-title').setTitle(gettext('Error'));
       return true;
     },
 
@@ -78,7 +58,7 @@ export default Ember.Route.extend({
     },
 
     showBan: function(ban) {
-      this.send('setTitle', gettext('You are banned'));
+      this.get('page-title').setTitle(gettext('You are banned'));
       this.intermediateTransitionTo('error-banned', ban);
     },
 

+ 1 - 2
misago/emberapp/app/routes/forgotten-password/change-form.js

@@ -9,8 +9,7 @@ export default Ember.Route.extend(ResetScroll, {
 
   actions: {
     didTransition: function() {
-      this.send('setTitle', gettext('Change forgotten password'));
-      return true;
+      this.get('page-title').setTitle(gettext('Change forgotten password'));
     },
 
     error: function(reason) {

+ 2 - 1
misago/emberapp/app/routes/index.js

@@ -4,7 +4,8 @@ import ResetScroll from 'misago/mixins/reset-scroll';
 export default Ember.Route.extend(ResetScroll, {
   actions: {
     didTransition: function() {
-      document.title = this.get('settings.forum_index_title') || this.get('settings.forum_name');
+      console.log(this.get('page-title'));
+      this.get('page-title').setIndexTitle();
     }
   }
 });

+ 1 - 2
misago/emberapp/app/routes/privacy-policy.js

@@ -37,8 +37,7 @@ export default Ember.Route.extend(ResetScroll, {
 
   actions: {
     didTransition: function() {
-      this.send('setTitle', this.get('title'));
-      return true;
+      this.get('page-title').setTitle(this.get('title'));
     }
   }
 });

+ 35 - 0
misago/emberapp/app/services/page-title.js

@@ -0,0 +1,35 @@
+import Ember from 'ember';
+
+export default Ember.Service.extend({
+  indexTitle: '',
+  forumName: '',
+
+  init: function() {
+    this.set('indexTitle', this.get('settings.forum_index_title'));
+    this.set('forumName', this.get('settings.forum_name'));
+  },
+
+  setTitle: function(title) {
+    if (typeof title === 'string') {
+      title = {title: title};
+    }
+
+    var complete_title = title.title;
+
+    if (typeof title.page !== 'undefined') {
+      complete_title += ' (' + interpolate(gettext('page %(page)s'), {page:title.page}, true) + ')';
+    }
+
+    if (typeof title.parent !== 'undefined') {
+      complete_title += ' | ' + title.parent;
+    }
+
+    complete_title += ' | ' + this.get('forumName');
+
+    document.title = complete_title;
+  },
+
+  setIndexTitle: function() {
+    document.title = this.get('indexTitle') || this.get('forumName');
+  }
+});

+ 11 - 0
misago/emberapp/app/transforms/moment-date.js

@@ -0,0 +1,11 @@
+import DS from 'ember-data';
+
+export default DS.Transform.extend({
+  deserialize: function(serialized) {
+    return serialized ? serialized.format() : null;
+  },
+
+  serialize: function(deserialized) {
+    return deserialized ? moment.utc(deserialized) : null;
+  }
+});

+ 9 - 0
misago/emberapp/app/utils/datetime-formats.js

@@ -0,0 +1,9 @@
+import MisagoPreloadStore from 'misago/utils/preloadstore';
+
+export function local(datetime) {
+  return datetime.utcOffset(MisagoPreloadStore.get('utcOffset') / 60);
+}
+
+export default function datetimeFormats() {
+  return true;
+}

+ 0 - 38
misago/emberapp/tests/unit/routes/application-test.js

@@ -17,41 +17,3 @@ test('it exists', function(assert) {
   var route = this.subject();
   assert.ok(route);
 });
-
-test('error', function(assert) {
-  assert.expect(1);
-
-  var route = this.subject();
-  route.set('settings', {'forum_name': 'Test Forum'});
-
-  // generic error
-  route.send('error', {status: 123});
-  assert.equal(document.title, 'Error | Test Forum');
-});
-
-test('setTitle', function(assert) {
-  assert.expect(5);
-
-  var route = this.subject();
-  route.set('settings', {'forum_name': 'Test Forum'});
-
-  // string argument
-  route.send('setTitle', 'Welcome!');
-  assert.equal(document.title, 'Welcome! | Test Forum');
-
-  // object argument
-  route.send('setTitle', {title: 'Thread'});
-  assert.equal(document.title, 'Thread | Test Forum');
-
-  // object argument with parent
-  route.send('setTitle', {title: 'Test Thread', parent: 'Support'});
-  assert.equal(document.title, 'Test Thread | Support | Test Forum');
-
-  // object argument with page
-  route.send('setTitle', {title: 'Test Thread', page: 12});
-  assert.equal(document.title, 'Test Thread (page 12) | Test Forum');
-
-  // object argument with page and parent
-  route.send('setTitle', {title: 'Test Thread', page: 12, parent: 'Support'});
-  assert.equal(document.title, 'Test Thread (page 12) | Support | Test Forum');
-});

+ 0 - 22
misago/emberapp/tests/unit/routes/index-test.js

@@ -17,25 +17,3 @@ test('it exists', function(assert) {
   var route = this.subject();
   assert.ok(route);
 });
-
-test('sets title correctly', function(assert) {
-  assert.expect(2);
-
-  var route = this.subject();
-
-  route.set('settings', {
-    'forum_index_title': '',
-    'forum_name': 'Forum Name',
-  });
-
-  route.send('didTransition');
-  assert.equal(document.title, 'Forum Name');
-
-  route.set('settings', {
-    'forum_index_title': 'Welcome to Forum!',
-    'forum_name': 'Forum Name',
-  });
-
-  route.send('didTransition');
-  assert.equal(document.title, 'Welcome to Forum!');
-});

+ 56 - 0
misago/emberapp/tests/unit/services/page-title-test.js

@@ -0,0 +1,56 @@
+import {
+  moduleFor,
+  test
+} from 'ember-qunit';
+
+moduleFor('service:page-title', {
+  needs: ['initializer:misago-settings']
+});
+
+test('it exists', function(assert) {
+  var service = this.subject();
+  assert.ok(service);
+});
+
+test('setTitle changes document title', function(assert) {
+  assert.expect(5);
+
+  var service = this.subject();
+  service.set('forumName', 'Test Forum');
+
+  // string argument
+  service.setTitle('Welcome!');
+  assert.equal(document.title, 'Welcome! | Test Forum');
+
+  // object argument
+  service.setTitle({title: 'Thread'});
+  assert.equal(document.title, 'Thread | Test Forum');
+
+  // object argument with parent
+  service.setTitle({title: 'Test Thread', parent: 'Support'});
+  assert.equal(document.title, 'Test Thread | Support | Test Forum');
+
+  // object argument with page
+  service.setTitle({title: 'Test Thread', page: 12});
+  assert.equal(document.title, 'Test Thread (page 12) | Test Forum');
+
+  // object argument with page and parent
+  service.setTitle({title: 'Test Thread', page: 12, parent: 'Support'});
+  assert.equal(document.title, 'Test Thread (page 12) | Support | Test Forum');
+});
+
+test('setIndexTitle changes document title to one defined for index', function(assert) {
+  assert.expect(2);
+
+  var service = this.subject();
+  service.set('forumName', 'Test Forum');
+
+  // no index title is set
+  service.setIndexTitle();
+  assert.equal(document.title, 'Test Forum');
+
+  // index title is set
+  service.set('indexTitle', 'Test Forum Index');
+  service.setIndexTitle();
+  assert.equal(document.title, 'Test Forum Index');
+});

+ 15 - 0
misago/emberapp/tests/unit/transforms/moment-date-test.js

@@ -0,0 +1,15 @@
+import {
+  moduleFor,
+  test
+} from 'ember-qunit';
+
+moduleFor('transform:moment-date', {
+  // Specify the other units that are required for this test.
+  // needs: ['serializer:foo']
+});
+
+// Replace this with your real tests.
+test('it exists', function(assert) {
+  var transform = this.subject();
+  assert.ok(transform);
+});

+ 10 - 0
misago/emberapp/tests/unit/utils/datetime-formats-test.js

@@ -0,0 +1,10 @@
+import datetimeFormats from '../../../utils/datetime-formats';
+import { module, test } from 'qunit';
+
+module('datetimeFormats');
+
+// Replace this with your real tests.
+test('it works', function(assert) {
+  var result = datetimeFormats();
+  assert.ok(result);
+});

+ 4 - 2
misago/emberapp/vendor/testutils/misago-preload-data.js

@@ -34,6 +34,8 @@ window.MisagoData = {
 
   "user": {
     "isAnonymous": true,
-    "isAuthenticated": false
-  }
+    "isAuthenticated": false,
+  },
+
+  "utcOffset": 0
 };

+ 8 - 1
misago/users/middleware.py

@@ -46,6 +46,13 @@ class TimezoneMiddleware(object):
         else:
             timezone.activate(pytz.timezone(settings.default_timezone))
 
+        current_tz = timezone.get_current_timezone()
+
+        utc_offset = current_tz.normalize(timezone.now()).utcoffset()
+        utc_offset_seconds = int(utc_offset.total_seconds())
+
+        request.preloaded_ember_data['utcOffset'] = utc_offset_seconds
+
 
 class PreloadUserMiddleware(object):
     def process_request(self, request):
@@ -65,7 +72,7 @@ class PreloadUserMiddleware(object):
             request.preloaded_ember_data.update({
                 'user': {
                     'isAuthenticated': False,
-                    'isAnonymous': True
+                    'isAnonymous': True,
                 }
             })