Speech bubble waiting for an ajax response prior to rendering

This commit is contained in:
Arpit Jalan 2014-05-09 22:23:27 +05:30
parent aa9a8aa217
commit 93cff8deb5
7 changed files with 46 additions and 20 deletions

View file

@ -10,6 +10,7 @@ export default Discourse.Controller.extend({
topic: null,
showExtraInfo: null,
notifications: null,
loading_notifications: null,
showStarButton: function() {
return Discourse.User.current() && !this.get('topic.isPrivateMessage');
@ -25,11 +26,17 @@ export default Discourse.Controller.extend({
showNotifications: function(headerView) {
var self = this;
Discourse.ajax("/notifications").then(function(result) {
self.set("notifications", result);
self.set("currentUser.unread_notifications", 0);
headerView.showDropdownBySelector("#user-notifications");
});
if (self.get('currentUser.unread_notifications') || self.get('currentUser.unread_private_messages') || !self.get('notifications')) {
self.set("loading_notifications", true);
Discourse.ajax("/notifications").then(function(result) {
self.setProperties({
notifications: result,
loading_notifications: false,
'currentUser.unread_notifications': 0
});
});
}
headerView.showDropdownBySelector("#user-notifications");
},
jumpToTopPost: function () {
@ -41,5 +48,3 @@ export default Discourse.Controller.extend({
}
});

View file

@ -1,3 +1,4 @@
Discourse.NotificationsController = Ember.ArrayController.extend(Discourse.HasCurrentUser, {
needs: ['header'],
itemController: "notification"
});

View file

@ -1,14 +1,18 @@
<section class="d-dropdown" id="notifications-dropdown">
{{#if content}}
<ul>
{{#each}}
<li {{bind-attr class="read"}}>{{unbound boundI18n scope linkBinding="link" usernameBinding="username"}}</li>
{{/each}}
<li class="read last">
<a {{bind-attr href="currentUser.path"}}>{{i18n notifications.more}} &hellip;</a>
</li>
</ul>
{{#unless controllers.header.loading_notifications}}
{{#if content}}
<ul>
{{#each}}
<li {{bind-attr class="read"}}>{{unbound boundI18n scope linkBinding="link" usernameBinding="username"}}</li>
{{/each}}
<li class="read last">
<a {{bind-attr href="currentUser.path"}}>{{i18n notifications.more}} &hellip;</a>
</li>
</ul>
{{else}}
<div class="none">{{i18n notifications.none}}</div>
{{/if}}
{{else}}
<div class="none">{{i18n notifications.none}}</div>
{{/if}}
<div class='loading'><i class='fa fa-spinner fa-spin'></i></div>
{{/unless}}
</section>

View file

@ -204,6 +204,13 @@
.none {
padding: 5px;
}
.loading {
padding: 10px;
display: block;
color: scale-color($primary, $lightness: 50%);
font-size: 24px;
text-align: center;
}
}
// Search

View file

@ -194,6 +194,13 @@
.none {
padding: 5px;
}
.loading {
padding: 10px;
display: block;
color: #777;
font-size: 24px;
text-align: center;
}
}
// Search

View file

@ -23,7 +23,7 @@ test("showNotifications action", function() {
equal(controller.get("notifications"), null, "notifications are null before data has finished loading");
equal(Discourse.User.current().get("unread_notifications"), 1, "current user's unread notifications count is not zeroed before data has finished loading");
ok(viewSpy.showDropdownBySelector.notCalled, "dropdown with notifications is not shown before data has finished loading");
ok(viewSpy.showDropdownBySelector.calledWith("#user-notifications"), "dropdown with loading glyph is shown before data has finished loading");
Ember.run(function() {

View file

@ -17,7 +17,9 @@ module("Discourse.NotificationsController", {
return [scope, options.username, options.link].join(" ").trim();
});
controller = Discourse.NotificationsController.create();
controller = Discourse.NotificationsController.create({
container: Discourse.__container__
});
view = Ember.View.create({
container: Discourse.__container__,