Add markdown editor on conversations and comments

This commit is contained in:
Augier 2016-11-22 09:37:06 +01:00 committed by cmrd Senya
parent f83fb6f4c3
commit fd39a48bea
No known key found for this signature in database
GPG key ID: 5FCC5BA680E67BFE
17 changed files with 285 additions and 32 deletions

View file

@ -9,8 +9,8 @@ app.views.CommentStream = app.views.Base.extend({
events: { events: {
"keydown .comment_box": "keyDownOnCommentBox", "keydown .comment_box": "keyDownOnCommentBox",
"submit form": "createComment", "submit form": "createComment",
"focus .comment_box": "commentTextareaFocused", "click .toggle_post_comments": "expandComments",
"click .toggle_post_comments": "expandComments" "click form": "openForm"
}, },
initialize: function() { initialize: function() {
@ -21,6 +21,7 @@ app.views.CommentStream = app.views.Base.extend({
setupBindings: function() { setupBindings: function() {
this.model.comments.bind("add", this.appendComment, this); this.model.comments.bind("add", this.appendComment, this);
this.model.comments.bind("remove", this.removeComment, this); this.model.comments.bind("remove", this.removeComment, this);
$(document.body).click(this.onFormBlur.bind(this));
}, },
postRenderTemplate : function() { postRenderTemplate : function() {
@ -28,6 +29,13 @@ app.views.CommentStream = app.views.Base.extend({
this.commentBox = this.$(".comment_box"); this.commentBox = this.$(".comment_box");
this.commentSubmitButton = this.$("input[name='commit']"); this.commentSubmitButton = this.$("input[name='commit']");
new app.views.CommentMention({el: this.$el, postId: this.model.get("id")}); new app.views.CommentMention({el: this.$el, postId: this.model.get("id")});
this.mdEditor = new Diaspora.MarkdownEditor(this.$(".comment_box"), {
onPreview: function($mdInstance) {
return "<div class='preview-content'>" + app.helpers.textFormatter($mdInstance.getContent()) + "</div>";
},
onFocus: this.openForm.bind(this)
});
}, },
presenter: function(){ presenter: function(){
@ -53,11 +61,14 @@ app.views.CommentStream = app.views.Base.extend({
success: function() { success: function() {
this.commentBox.val(""); this.commentBox.val("");
this.enableCommentBox(); this.enableCommentBox();
this.mdEditor.hidePreview();
this.closeForm();
autosize.update(this.commentBox); autosize.update(this.commentBox);
}.bind(this), }.bind(this),
error: function() { error: function() {
this.enableCommentBox(); this.enableCommentBox();
this.commentBox.focus(); this.mdEditor.hidePreview();
this.openForm();
}.bind(this) }.bind(this)
}); });
}, },
@ -122,10 +133,6 @@ app.views.CommentStream = app.views.Base.extend({
this.$("#" + comment.get("guid")).closest(".comment.media").remove(); this.$("#" + comment.get("guid")).closest(".comment.media").remove();
}, },
commentTextareaFocused: function(){
this.$("form").removeClass('hidden').addClass("open");
},
expandComments: function(evt){ expandComments: function(evt){
this.$(".loading-comments").removeClass("hidden"); this.$(".loading-comments").removeClass("hidden");
if(evt){ evt.preventDefault(); } if(evt){ evt.preventDefault(); }
@ -135,6 +142,29 @@ app.views.CommentStream = app.views.Base.extend({
this.$(".loading-comments").addClass("hidden"); this.$(".loading-comments").addClass("hidden");
}.bind(this) }.bind(this)
}); });
},
openForm: function() {
this.$("form").addClass("open");
this.$(".md-editor").addClass("active");
},
closeForm: function() {
this.$("form").removeClass("open");
this.$(".md-editor").removeClass("active");
autosize.update(this.commentBox);
},
onFormBlur: function(evt) {
if (this.mdEditor !== undefined && this.mdEditor.isPreviewOrTexareaNotEmpty()) {
return;
}
var $target = $(evt.target);
var isForm = $target.hasClass("new-comment") || $target.parents(".new-comment").length !== 0;
if (!isForm && !$target.hasClass("focus_comment_textarea")) {
this.closeForm();
}
} }
}); });
// @license-end // @license-end

View file

@ -24,6 +24,14 @@ app.views.ConversationsForm = app.views.Base.extend({
remoteRoute: {url: "/contacts", extraParameters: "mutual=true"} remoteRoute: {url: "/contacts", extraParameters: "mutual=true"}
}); });
this.newConversationMdEditor = this.renderMarkdownEditor("#new-message-text");
// Creates another markdown editor in case of displaying conversation
var responseTextarea = $("#conversation-show .conversation-message-text");
if (responseTextarea.length === 1) {
this.renderMarkdownEditor(responseTextarea);
}
this.bindTypeaheadEvents(); this.bindTypeaheadEvents();
this.tagListElement.empty(); this.tagListElement.empty();
@ -31,10 +39,18 @@ app.views.ConversationsForm = app.views.Base.extend({
this.prefill(opts.prefill); this.prefill(opts.prefill);
} }
this.$("form#new-conversation").on("ajax:success", this.conversationCreateSuccess); this.$("form#new-conversation").on("ajax:success", this.conversationCreateSuccess.bind(this));
this.$("form#new-conversation").on("ajax:error", this.conversationCreateError); this.$("form#new-conversation").on("ajax:error", this.conversationCreateError);
}, },
renderMarkdownEditor: function(element) {
return new Diaspora.MarkdownEditor($(element), {
onPreview: function($mdInstance) {
return "<div class='preview-content'>" + app.helpers.textFormatter($mdInstance.getContent()) + "</div>";
}
});
},
addRecipient: function(person) { addRecipient: function(person) {
this.conversationRecipients.push(person); this.conversationRecipients.push(person);
this.updateContactIdsListInput(); this.updateContactIdsListInput();
@ -84,6 +100,7 @@ app.views.ConversationsForm = app.views.Base.extend({
}, },
conversationCreateSuccess: function(evt, data) { conversationCreateSuccess: function(evt, data) {
this.newConversationMdEditor.hidePreview();
app._changeLocation(Routes.conversation(data.id)); app._changeLocation(Routes.conversation(data.id));
}, },

View file

@ -9,7 +9,7 @@ app.views.ConversationsInbox = app.views.Base.extend({
}, },
initialize: function() { initialize: function() {
new app.views.ConversationsForm(); this.conversationForm = new app.views.ConversationsForm();
this.setupConversation(); this.setupConversation();
}, },
@ -23,6 +23,7 @@ app.views.ConversationsInbox = app.views.Base.extend({
self.$el.find("#conversation-show").removeClass("hidden").html(data); self.$el.find("#conversation-show").removeClass("hidden").html(data);
self.selectConversation(conversationId); self.selectConversation(conversationId);
self.setupConversation(); self.setupConversation();
self.conversationForm.renderMarkdownEditor("#conversation-show .conversation-message-text");
} }
}); });
}, },

View file

@ -130,6 +130,13 @@ Diaspora.MarkdownEditor.prototype = {
} }
}, },
isPreviewOrTexareaNotEmpty: function() {
if (this.instance === undefined) {
return false;
}
return (this.instance.$editor.find(".md-preview").length > 0) || (this.instance.getContent().length > 0);
},
localize: function() { localize: function() {
var locale = Diaspora.I18n.language; var locale = Diaspora.I18n.language;

View file

@ -35,7 +35,7 @@
self.scrollToOffset(commentContainer); self.scrollToOffset(commentContainer);
}); });
this.stream().on("submit", ".new_comment", this.submitComment); this.stream().on("submit", ".new-comment", this.submitComment);
}, },
submitComment: function(evt){ submitComment: function(evt){

View file

@ -52,7 +52,6 @@
float: right; float: right;
} }
padding-left: 12px; padding-left: 12px;
display: none;
} }
.comment_box { .comment_box {
height: 35px; height: 35px;
@ -60,8 +59,6 @@
} }
textarea.comment_box:focus, textarea.comment_box:valid, textarea.comment_box:active { textarea.comment_box:focus, textarea.comment_box:valid, textarea.comment_box:active {
border-color: $border-dark-grey; border-color: $border-dark-grey;
~ .submit-button { display: block; }
min-height: 35px;
box-shadow: none; box-shadow: none;
} }
@ -73,3 +70,16 @@
// scss-lint:enable ImportantRule // scss-lint:enable ImportantRule
} }
} }
.new-comment {
&:not(.open) .submit-button,
&:not(.open) .md-header {
display: none;
}
// The rule for .md-preview is required until we switch to the newer release of bootstrap-markdown with
// the following commit in:
// https://github.com/toopay/bootstrap-markdown/commit/14a21c3837140144b27efc19c795d1a37fad70fb
.md-preview,
&.open .md-editor textarea { min-height: 70px; }
}

View file

@ -238,3 +238,9 @@
} }
.new-conversation.form-horizontal .form-group:last-of-type { margin-bottom: 0; } .new-conversation.form-horizontal .form-group:last-of-type { margin-bottom: 0; }
// This rule is required until we switch to the newer release of bootstrap-markdown with
// the following commit in: https://github.com/toopay/bootstrap-markdown/commit/14a21c3837140144b27efc19c795d1a37fad70fb
.conversations-form-container .md-preview {
min-height: 105px;
}

View file

@ -1,3 +1,18 @@
.md-editor {
border: 1px solid $border-grey;
border-radius: $border-radius-small;
overflow: hidden;
&.active { border: 1px solid $border-dark-grey; }
textarea,
textarea:focus {
border: 0;
box-shadow: none;
margin: 0;
}
}
.md-footer, .md-footer,
.md-header { .md-header {
background: $white; background: $white;
@ -83,7 +98,6 @@
// scss-lint:disable ImportantRule // scss-lint:disable ImportantRule
height: auto !important; height: auto !important;
// scss-lint:enable ImportantRule // scss-lint:enable ImportantRule
min-height: 90px;
overflow: auto; overflow: auto;
position: relative; position: relative;
// !important is needed to override the CSS rules dynamically added to the element // !important is needed to override the CSS rules dynamically added to the element
@ -91,6 +105,8 @@
width: 100% !important; width: 100% !important;
// scss-lint:enable ImportantRule // scss-lint:enable ImportantRule
z-index: 10; z-index: 10;
.preview-content { padding: 10px; }
} }
.md-controls { .md-controls {

View file

@ -78,9 +78,7 @@
textarea { textarea {
background: transparent; background: transparent;
border: 0 solid $light-grey; border: 0 solid $light-grey;
box-shadow: none;
height: 50px; height: 50px;
margin: 0;
resize: none; resize: none;
} }
@ -193,6 +191,16 @@
margin-bottom: 0; margin-bottom: 0;
} }
} }
.md-editor,
.md-editor.active {
border: 0;
}
// This rule is required until we switch to the newer release of bootstrap-markdown with
// the following commit in:
// https://github.com/toopay/bootstrap-markdown/commit/14a21c3837140144b27efc19c795d1a37fad70fb
.md-preview { min-height: 90px; }
} }
.publisher-textarea-wrapper { .publisher-textarea-wrapper {

View file

@ -25,7 +25,8 @@
{{/with}} {{/with}}
<div class="bd"> <div class="bd">
<form accept-charset="UTF-8" action="/posts/{{id}}/comments" class="new_comment" id="new_comment_on_{{id}}" method="post"> <form accept-charset="UTF-8" action="/posts/{{id}}/comments"
class="new-comment" id="new-comment-on-{{id}}" method="post">
<textarea class="comment_box form-control mention-textarea" <textarea class="comment_box form-control mention-textarea"
id="comment_text_on_{{id}}" name="text" rows="1" required placeholder="{{t "stream.comment"}}" /> id="comment_text_on_{{id}}" name="text" rows="1" required placeholder="{{t "stream.comment"}}" />

View file

@ -5,7 +5,7 @@
.add_comment_bottom_link_container .add_comment_bottom_link_container
- if user_signed_in? - if user_signed_in?
= form_tag(post_comments_path(post_id), id: "new-comment-on-#{post_id}", = form_tag(post_comments_path(post_id), id: "new-comment-on-#{post_id}",
class: "new_comment", autocomplete: "off") do class: "new-comment", autocomplete: "off") do
%fieldset %fieldset
= hidden_field_tag :post_id, post_id, id: "post-id-on-#{post_id}" = hidden_field_tag :post_id, post_id, id: "post-id-on-#{post_id}"
.form-group.clearfix .form-group.clearfix

View file

@ -3,12 +3,12 @@ When /^I focus the comment field$/ do
end end
Then /^the first comment field should be open/ do Then /^the first comment field should be open/ do
find("#main_stream .stream-element .new_comment").should be_visible find("#main_stream .stream-element .new-comment").should be_visible
end end
Then /^the first comment field should be closed$/ do Then /^the first comment field should be closed$/ do
page.should have_css(".stream-element .media") page.should have_css(".stream-element .media")
page.should_not have_selector("#main_stream .stream-element .new_comment", match: :first) page.should_not have_selector("#main_stream .stream-element .new-comment", match: :first)
end end
When /^I make a show page comment "([^"]*)"$/ do |comment_text| When /^I make a show page comment "([^"]*)"$/ do |comment_text|

View file

@ -19,6 +19,13 @@ describe("app.views.CommentStream", function(){
this.view.model.comments.pop(); this.view.model.comments.pop();
expect(this.view.removeComment).toHaveBeenCalled(); expect(this.view.removeComment).toHaveBeenCalled();
}); });
it("calls onFormBlur when clicking outside the comment box", function() {
spyOn(app.views.CommentStream.prototype, "onFormBlur");
this.view.setupBindings();
$(document.body).click();
expect(app.views.CommentStream.prototype.onFormBlur).toHaveBeenCalled();
});
}); });
describe("postRenderTemplate", function() { describe("postRenderTemplate", function() {
@ -57,6 +64,14 @@ describe("app.views.CommentStream", function(){
var call = app.views.CommentMention.prototype.initialize.calls.mostRecent(); var call = app.views.CommentMention.prototype.initialize.calls.mostRecent();
expect(call.args[0]).toEqual({el: this.view.$el, postId: this.view.model.id}); expect(call.args[0]).toEqual({el: this.view.$el, postId: this.view.model.id});
}); });
it("creates the markdown editor", function() {
spyOn(Diaspora.MarkdownEditor.prototype, "initialize");
this.view.mdEditor = undefined;
this.view.postRenderTemplate();
expect(Diaspora.MarkdownEditor.prototype.initialize).toHaveBeenCalled();
expect(this.view.mdEditor).toBeDefined();
});
}); });
describe("createComment", function() { describe("createComment", function() {
@ -117,6 +132,18 @@ describe("app.views.CommentStream", function(){
this.request.respondWith({status: 200, responseText: "[]"}); this.request.respondWith({status: 200, responseText: "[]"});
expect(autosize.update).toHaveBeenCalledWith(this.view.commentBox); expect(autosize.update).toHaveBeenCalledWith(this.view.commentBox);
}); });
it("hides the markdown preview", function() {
spyOn(this.view.mdEditor, "hidePreview");
this.request.respondWith({status: 200, responseText: "[]"});
expect(this.view.mdEditor.hidePreview).toHaveBeenCalled();
});
it("closes the form", function() {
spyOn(this.view, "closeForm");
this.request.respondWith({status: 200, responseText: "[]"});
expect(this.view.closeForm).toHaveBeenCalled();
});
}); });
context("on error", function() { context("on error", function() {
@ -135,6 +162,18 @@ describe("app.views.CommentStream", function(){
this.request.respondWith({status: 500}); this.request.respondWith({status: 500});
expect(this.view.enableCommentBox).toHaveBeenCalled(); expect(this.view.enableCommentBox).toHaveBeenCalled();
}); });
it("hides the markdown preview", function() {
spyOn(this.view.mdEditor, "hidePreview");
this.request.respondWith({status: 500, responseText: "[]"});
expect(this.view.mdEditor.hidePreview).toHaveBeenCalled();
});
it("opens the form", function() {
spyOn(this.view, "openForm");
this.request.respondWith({status: 500, responseText: "[]"});
expect(this.view.openForm).toHaveBeenCalled();
});
}); });
}); });
}); });
@ -283,6 +322,73 @@ describe("app.views.CommentStream", function(){
}); });
}); });
describe("openForm", function() {
beforeEach(function() {
this.view.render();
});
it("adds the 'open' class to form", function() {
this.view.$("form").removeClass("open");
this.view.openForm();
expect(this.view.$("form")).toHaveClass("open");
});
it("adds the 'active' class to markdown editor", function() {
this.view.$(".md-editor").removeClass("active");
this.view.openForm();
expect(this.view.$(".md-editor")).toHaveClass("active");
});
});
describe("closeForm", function() {
beforeEach(function() {
this.view.render();
});
it("removes the 'open' class to form", function() {
this.view.$("form").addClass("open");
this.view.closeForm();
expect(this.view.$("form")).not.toHaveClass("open");
});
it("removes the 'active' class to markdown editor", function() {
this.view.$(".md-editor").addClass("active");
this.view.closeForm();
expect(this.view.$(".md-editor")).not.toHaveClass("active");
});
});
describe("onFormBlur", function() {
beforeEach(function() {
this.view.render();
this.view.postRenderTemplate();
spec.content().html("<div class='new-comment'/><div class='focus_comment_textarea'/>");
});
it("does not call closeForm if markdown editor contains text or is in preview mode", function() {
spyOn(this.view, "closeForm");
spyOn(this.view.mdEditor, "isPreviewOrTexareaNotEmpty").and.returnValue(true);
this.view.onFormBlur();
expect(this.view.closeForm).not.toHaveBeenCalled();
});
it("does not call closeForm when the form is clicked", function() {
spyOn(this.view, "closeForm");
spyOn(this.view.mdEditor, "isPreviewOrTexareaNotEmpty").and.returnValue(false);
this.view.onFormBlur($.Event("click", {target: $(".new-comment")}));
expect(this.view.closeForm).not.toHaveBeenCalled();
this.view.onFormBlur($.Event("click", {target: $(".focus_comment_textarea")}));
expect(this.view.closeForm).not.toHaveBeenCalled();
});
it("calls closeForm when the user clicks outside of the form", function() {
spyOn(this.view, "closeForm");
spyOn(this.view.mdEditor, "isPreviewOrTexareaNotEmpty").and.returnValue(false);
this.view.onFormBlur($.Event("click", {target: $("body")}));
expect(this.view.closeForm).toHaveBeenCalled();
});
});
describe("pressing a key when typing on the new comment box", function(){ describe("pressing a key when typing on the new comment box", function(){
var submitCallback; var submitCallback;

View file

@ -35,6 +35,28 @@ describe("app.views.ConversationsForm", function() {
this.target.initialize({prefill: {}}); this.target.initialize({prefill: {}});
expect(app.views.ConversationsForm.prototype.prefill).toHaveBeenCalledWith({}); expect(app.views.ConversationsForm.prototype.prefill).toHaveBeenCalledWith({});
}); });
it("creates markdown editor for new conversations", function() {
spyOn(this.target, "renderMarkdownEditor");
this.target.initialize();
expect(this.target.renderMarkdownEditor).toHaveBeenCalledWith("#new-message-text");
});
it("creates markdown editor for an existing conversation", function() {
spyOn(this.target, "renderMarkdownEditor");
this.target.initialize();
expect(this.target.renderMarkdownEditor).toHaveBeenCalledWith(
$("#conversation-show .conversation-message-text"));
});
});
describe("renderMarkdownEditor", function() {
it("creates MarkdownEditor", function() {
spec.content().html("<form><textarea id='new-message-text'/></form>");
var mdEditor = this.target.renderMarkdownEditor("#new-message-text");
expect(mdEditor).toEqual(jasmine.any(Diaspora.MarkdownEditor));
expect($("#new-message-text")).toHaveClass("md-input");
});
}); });
describe("addRecipient", function() { describe("addRecipient", function() {
@ -253,6 +275,12 @@ describe("app.views.ConversationsForm", function() {
$("#new-conversation").trigger("ajax:success", [{id: 23}]); $("#new-conversation").trigger("ajax:success", [{id: 23}]);
expect(app._changeLocation).toHaveBeenCalledWith(Routes.conversation(23)); expect(app._changeLocation).toHaveBeenCalledWith(Routes.conversation(23));
}); });
it("hides the preview", function() {
spyOn(Diaspora.MarkdownEditor.prototype, "hidePreview");
$("#new-conversation").trigger("ajax:success", [{id: 23}]);
expect(Diaspora.MarkdownEditor.prototype.hidePreview).toHaveBeenCalled();
});
}); });
describe("conversationCreateError", function() { describe("conversationCreateError", function() {

View file

@ -34,6 +34,7 @@ describe("app.views.ConversationsInbox", function() {
spyOn($, "ajax").and.callThrough(); spyOn($, "ajax").and.callThrough();
spyOn(app.views.ConversationsInbox.prototype, "selectConversation"); spyOn(app.views.ConversationsInbox.prototype, "selectConversation");
spyOn(app.views.ConversationsInbox.prototype, "setupConversation"); spyOn(app.views.ConversationsInbox.prototype, "setupConversation");
spyOn(app.views.ConversationsForm.prototype, "renderMarkdownEditor");
this.target.renderConversation(this.conversationId); this.target.renderConversation(this.conversationId);
jasmine.Ajax.requests.mostRecent().respondWith({ jasmine.Ajax.requests.mostRecent().respondWith({
status: 200, status: 200,
@ -44,6 +45,7 @@ describe("app.views.ConversationsInbox", function() {
expect(jasmine.Ajax.requests.mostRecent().url).toBe("/conversations/" + this.conversationId + "/raw"); expect(jasmine.Ajax.requests.mostRecent().url).toBe("/conversations/" + this.conversationId + "/raw");
expect(app.views.ConversationsInbox.prototype.selectConversation).toHaveBeenCalledWith(this.conversationId); expect(app.views.ConversationsInbox.prototype.selectConversation).toHaveBeenCalledWith(this.conversationId);
expect(app.views.ConversationsInbox.prototype.setupConversation).toHaveBeenCalled(); expect(app.views.ConversationsInbox.prototype.setupConversation).toHaveBeenCalled();
expect(app.views.ConversationsForm.prototype.renderMarkdownEditor).toHaveBeenCalled();
expect($("#conversation-new")).toHaveClass("hidden"); expect($("#conversation-new")).toHaveClass("hidden");
expect($("#conversation-show")).not.toHaveClass("hidden"); expect($("#conversation-show")).not.toHaveClass("hidden");
expect($("#conversation-show #fake-conversation-content").length).toBe(1); expect($("#conversation-show #fake-conversation-content").length).toBe(1);

View file

@ -220,6 +220,27 @@ describe("Diaspora.MarkdownEditor", function() {
}); });
}); });
describe("isPreviewOrTexareaNotEmpty", function() {
beforeEach(function() {
this.target = new Diaspora.MarkdownEditor(this.$el, {onPreview: $.noop, onPostPreview: $.noop()});
});
it("return false if editor is not visible yet", function() {
this.target.instance = undefined;
expect(this.target.isPreviewOrTexareaNotEmpty()).toBe(false);
});
it("returns true if editor is in preview mode", function() {
this.target.showPreview();
expect(this.target.isPreviewOrTexareaNotEmpty()).toBe(true);
});
it("returns true if editor has content", function() {
$("textarea").text("Yolo");
expect(this.target.isPreviewOrTexareaNotEmpty()).toBe(true);
});
});
describe("localize", function() { describe("localize", function() {
beforeEach(function() { beforeEach(function() {
this.target = new Diaspora.MarkdownEditor(this.$el, {}); this.target = new Diaspora.MarkdownEditor(this.$el, {});

View file

@ -10,7 +10,7 @@ describe("Diaspora.Mobile.Comments", function(){
spyOn(Diaspora.Mobile.Comments, "submitComment").and.returnValue(false); spyOn(Diaspora.Mobile.Comments, "submitComment").and.returnValue(false);
Diaspora.Mobile.Comments.initialize(); Diaspora.Mobile.Comments.initialize();
Diaspora.Mobile.Comments.showCommentBox($(".stream .comment-action").first()); Diaspora.Mobile.Comments.showCommentBox($(".stream .comment-action").first());
$(".stream .new_comment").first().submit(); $(".stream .new-comment").first().submit();
expect(Diaspora.Mobile.Comments.submitComment).toHaveBeenCalled(); expect(Diaspora.Mobile.Comments.submitComment).toHaveBeenCalled();
}); });
}); });
@ -97,28 +97,28 @@ describe("Diaspora.Mobile.Comments", function(){
}); });
it("doesn't submit an empty comment", function() { it("doesn't submit an empty comment", function() {
$(".stream .new_comment").first().submit(); $(".stream .new-comment").first().submit();
expect(jasmine.Ajax.requests.count()).toBe(0); expect(jasmine.Ajax.requests.count()).toBe(0);
}); });
it("submits comments with text", function() { it("submits comments with text", function() {
$(".stream .new_comment textarea").val("comment text"); $(".stream .new-comment textarea").val("comment text");
$(".stream .new_comment").first().submit(); $(".stream .new-comment").first().submit();
expect(jasmine.Ajax.requests.mostRecent().data().text).toEqual(["comment text"]); expect(jasmine.Ajax.requests.mostRecent().data().text).toEqual(["comment text"]);
}); });
it("calls updateStream on success", function() { it("calls updateStream on success", function() {
spyOn(Diaspora.Mobile.Comments, "updateStream"); spyOn(Diaspora.Mobile.Comments, "updateStream");
$(".stream .new_comment textarea").val("comment text"); $(".stream .new-comment textarea").val("comment text");
$(".stream .new_comment").first().submit(); $(".stream .new-comment").first().submit();
jasmine.Ajax.requests.mostRecent().respondWith({status: 200, responseText: "foo"}); jasmine.Ajax.requests.mostRecent().respondWith({status: 200, responseText: "foo"});
expect(Diaspora.Mobile.Comments.updateStream).toHaveBeenCalledWith($(".stream .new_comment").first(), "foo"); expect(Diaspora.Mobile.Comments.updateStream).toHaveBeenCalledWith($(".stream .new-comment").first(), "foo");
}); });
it("lets Diaspora.Mobile.Alert handle AJAX errors", function() { it("lets Diaspora.Mobile.Alert handle AJAX errors", function() {
spyOn(Diaspora.Mobile.Alert, "handleAjaxError"); spyOn(Diaspora.Mobile.Alert, "handleAjaxError");
$(".stream .new_comment textarea").val("comment text"); $(".stream .new-comment textarea").val("comment text");
$(".stream .new_comment").first().submit(); $(".stream .new-comment").first().submit();
jasmine.Ajax.requests.mostRecent().respondWith({status: 400, responseText: "oh noez! comment failed!"}); jasmine.Ajax.requests.mostRecent().respondWith({status: 400, responseText: "oh noez! comment failed!"});
expect(Diaspora.Mobile.Alert.handleAjaxError).toHaveBeenCalled(); expect(Diaspora.Mobile.Alert.handleAjaxError).toHaveBeenCalled();
expect(Diaspora.Mobile.Alert.handleAjaxError.calls.argsFor(0)[0].responseText).toBe("oh noez! comment failed!"); expect(Diaspora.Mobile.Alert.handleAjaxError.calls.argsFor(0)[0].responseText).toBe("oh noez! comment failed!");
@ -126,10 +126,10 @@ describe("Diaspora.Mobile.Comments", function(){
it("calls resetCommentBox on errors", function() { it("calls resetCommentBox on errors", function() {
spyOn(Diaspora.Mobile.Comments, "resetCommentBox"); spyOn(Diaspora.Mobile.Comments, "resetCommentBox");
$(".stream .new_comment textarea").val("comment text"); $(".stream .new-comment textarea").val("comment text");
$(".stream .new_comment").first().submit(); $(".stream .new-comment").first().submit();
jasmine.Ajax.requests.mostRecent().respondWith({status: 400, responseText: "oh noez! comment failed!"}); jasmine.Ajax.requests.mostRecent().respondWith({status: 400, responseText: "oh noez! comment failed!"});
expect(Diaspora.Mobile.Comments.resetCommentBox).toHaveBeenCalledWith($(".stream .new_comment").first()); expect(Diaspora.Mobile.Comments.resetCommentBox).toHaveBeenCalledWith($(".stream .new-comment").first());
}); });
}); });