forked from discourse/discourse
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
refactors header notifications (renders them via separate controller …
…/ template)
- Loading branch information
Showing
14 changed files
with
244 additions
and
75 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
17 changes: 17 additions & 0 deletions
17
app/assets/javascripts/discourse/controllers/notification_controller.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
Discourse.NotificationController = Discourse.ObjectController.extend({ | ||
scope: function() { | ||
return "notifications." + Discourse.Site.currentProp("notificationLookup")[this.get("notification_type")]; | ||
}.property(), | ||
|
||
username: function() { | ||
return this.get("data.display_username"); | ||
}.property(), | ||
|
||
link: function() { | ||
if (this.blank("data.topic_title")) { | ||
return ""; | ||
} | ||
var url = Discourse.Utilities.postUrl(this.get("slug"), this.get("topic_id"), this.get("post_number")); | ||
return '<a href="' + url + '">' + this.get("data.topic_title") + '</a>'; | ||
}.property() | ||
}); |
3 changes: 3 additions & 0 deletions
3
app/assets/javascripts/discourse/controllers/notifications_controller.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
Discourse.NotificationsController = Ember.ArrayController.extend(Discourse.HasCurrentUser, { | ||
itemController: "notification" | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
14 changes: 14 additions & 0 deletions
14
app/assets/javascripts/discourse/templates/notifications.js.handlebars
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
<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}} …</a> | ||
</li> | ||
</ul> | ||
{{else}} | ||
<div class="none">{{i18n notifications.none}}</div> | ||
{{/if}} | ||
</section> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
var server; | ||
|
||
module("Discourse.HeaderController", { | ||
setup: function() { | ||
server = sinon.fakeServer.create(); | ||
}, | ||
|
||
teardown: function() { | ||
server.restore(); | ||
} | ||
}); | ||
|
||
test("showNotifications action", function() { | ||
var controller = Discourse.HeaderController.create(); | ||
var viewSpy = { | ||
showDropdownBySelector: sinon.spy() | ||
}; | ||
Discourse.User.current().set("unread_notifications", 1); | ||
server.respondWith("/notifications", [200, { "Content-Type": "application/json" }, '["notification"]']); | ||
|
||
|
||
Ember.run(function() { | ||
controller.send("showNotifications", viewSpy); | ||
}); | ||
|
||
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"); | ||
|
||
|
||
server.respond(); | ||
|
||
deepEqual(controller.get("notifications"), ["notification"], "notifications are set correctly after data has finished loading"); | ||
equal(Discourse.User.current().get("unread_notifications"), 0, "current user's unread notifications count is zeroed after data has finished loading"); | ||
ok(viewSpy.showDropdownBySelector.calledWith("#user-notifications"), "dropdown with notifications is shown after data has finished loading"); | ||
}); |
51 changes: 51 additions & 0 deletions
51
test/javascripts/controllers/notification_controller_test.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
var controller; | ||
var notificationFixture = { | ||
notification_type: 1, //mentioned | ||
post_number: 1, | ||
topic_id: 1234, | ||
slug: "a-slug", | ||
data: { | ||
topic_title: "some title", | ||
display_username: "velesin" | ||
} | ||
}; | ||
var postUrlStub = "post-url-stub"; | ||
|
||
module("Discourse.NotificationController", { | ||
setup: function() { | ||
sinon.stub(Discourse.Utilities, "postUrl").returns(postUrlStub); | ||
|
||
controller = Discourse.NotificationController.create({ | ||
content: notificationFixture | ||
}); | ||
}, | ||
|
||
teardown: function() { | ||
Discourse.Utilities.postUrl.restore(); | ||
} | ||
}); | ||
|
||
test("scope property is correct", function() { | ||
equal(controller.get("scope"), "notifications.mentioned"); | ||
}); | ||
|
||
test("username property is correct", function() { | ||
equal(controller.get("username"), "velesin"); | ||
}); | ||
|
||
test("link property returns empty string when there is no topic title", function() { | ||
var fixtureWithEmptyTopicTitle = _.extend({}, notificationFixture, {data: {topic_title: ""}}); | ||
Ember.run(function() { | ||
controller.set("content", fixtureWithEmptyTopicTitle); | ||
}); | ||
|
||
equal(controller.get("link"), ""); | ||
}); | ||
|
||
test("link property returns correctly built link when there is a topic title", function() { | ||
var $link = $(controller.get("link")); | ||
|
||
ok(Discourse.Utilities.postUrl.calledWithExactly("a-slug", 1234, 1), "URL is generated with the correct slug, topic ID and post number"); | ||
equal($link.attr("href"), postUrlStub, "generated link points to a correct URL"); | ||
equal($link.text(), "some title", "generated link has correct text"); | ||
}); |
82 changes: 82 additions & 0 deletions
82
test/javascripts/controllers/notifications_controller_test.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
var controller, view; | ||
|
||
var appendView = function() { | ||
Ember.run(function() { | ||
view.appendTo(fixture()); | ||
}); | ||
}; | ||
|
||
var noItemsMessageSelector = "div.none"; | ||
var itemListSelector = "ul"; | ||
var itemSelector = "li"; | ||
|
||
module("Discourse.NotificationsController", { | ||
setup: function() { | ||
sinon.stub(I18n, "t", function (scope, options) { | ||
options = options || {}; | ||
return [scope, options.username, options.link].join(" ").trim(); | ||
}); | ||
|
||
controller = Discourse.NotificationsController.create(); | ||
|
||
view = Ember.View.create({ | ||
controller: controller, | ||
templateName: "notifications" | ||
}); | ||
}, | ||
|
||
teardown: function() { | ||
I18n.t.restore(); | ||
} | ||
}); | ||
|
||
test("mixes in HasCurrentUser", function() { | ||
ok(Discourse.HasCurrentUser.detect(controller)); | ||
}); | ||
|
||
test("by default uses NotificationController as its item controller", function() { | ||
equal(controller.get("itemController"), "notification"); | ||
}); | ||
|
||
test("shows proper info when there are no notifications", function() { | ||
controller.set("content", null); | ||
|
||
appendView(); | ||
|
||
ok(exists(fixture(noItemsMessageSelector)), "special 'no notifications' message is displayed"); | ||
equal(fixture(noItemsMessageSelector).text(), "notifications.none", "'no notifications' message contains proper internationalized text"); | ||
equal(count(fixture(itemListSelector)), 0, "a list of notifications is not displayed"); | ||
}); | ||
|
||
test("displays a list of notifications and a 'more' link when there are notifications", function() { | ||
controller.set("itemController", null); | ||
controller.set("content", [ | ||
{ | ||
read: false, | ||
scope: "scope_1", | ||
username: "username_1", | ||
link: "link_1" | ||
}, | ||
{ | ||
read: true, | ||
scope: "scope_2", | ||
username: "username_2", | ||
link: "link_2" | ||
} | ||
]); | ||
|
||
appendView(); | ||
|
||
var items = fixture(itemSelector); | ||
equal(count(items), 3, "number of list items is correct"); | ||
|
||
equal(items.eq(0).attr("class"), "", "first (unread) item has proper class"); | ||
equal(items.eq(0).text(), "scope_1 username_1 link_1", "first item has correct content"); | ||
|
||
equal(items.eq(1).attr("class"), "read", "second (read) item has proper class"); | ||
equal(items.eq(1).text(), "scope_2 username_2 link_2", "second item has correct content"); | ||
|
||
var moreLink = items.eq(2).find("> a"); | ||
equal(moreLink.attr("href"), Discourse.User.current().get("path"), "'more' link points to a correct URL"); | ||
equal(moreLink.text(), "notifications.more …", "'more' link has correct text"); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
module("Discourse.HeaderView"); | ||
|
||
test("showNotifications", function() { | ||
var controllerSpy = { | ||
send: sinon.spy() | ||
}; | ||
var view = Discourse.HeaderView.create({ | ||
controller: controllerSpy | ||
}); | ||
|
||
view.showNotifications(); | ||
|
||
ok(controllerSpy.send.calledWith("showNotifications", view), "sends showNotifications message to the controller, passing header view as a param"); | ||
}); |