Extra tests for composer
This commit is contained in:
parent
7335f5fb7f
commit
11bb9aafc7
|
@ -242,7 +242,7 @@ Discourse.ComposerController = Discourse.Controller.extend({
|
||||||
composer = null;
|
composer = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (composer && !opts.tested && composer.get('wouldLoseChanges')) {
|
if (composer && !opts.tested && composer.get('replyDirty')) {
|
||||||
if (composer.composeState === Discourse.Composer.DRAFT && composer.draftKey === opts.draftKey && composer.action === opts.action) {
|
if (composer.composeState === Discourse.Composer.DRAFT && composer.draftKey === opts.draftKey && composer.action === opts.action) {
|
||||||
composer.set('composeState', Discourse.Composer.OPEN);
|
composer.set('composeState', Discourse.Composer.OPEN);
|
||||||
promise.resolve();
|
promise.resolve();
|
||||||
|
@ -300,7 +300,7 @@ Discourse.ComposerController = Discourse.Controller.extend({
|
||||||
var composerController = this;
|
var composerController = this;
|
||||||
|
|
||||||
return Ember.Deferred.promise(function (promise) {
|
return Ember.Deferred.promise(function (promise) {
|
||||||
if (composerController.get('model.hasMetaData') || composerController.get('model.wouldLoseChanges')) {
|
if (composerController.get('model.hasMetaData') || composerController.get('model.replyDirty')) {
|
||||||
bootbox.confirm(Em.String.i18n("post.abandon"), Em.String.i18n("no_value"), Em.String.i18n("yes_value"), function(result) {
|
bootbox.confirm(Em.String.i18n("post.abandon"), Em.String.i18n("no_value"), Em.String.i18n("yes_value"), function(result) {
|
||||||
if (result) {
|
if (result) {
|
||||||
composerController.destroyDraft();
|
composerController.destroyDraft();
|
||||||
|
@ -326,7 +326,7 @@ Discourse.ComposerController = Discourse.Controller.extend({
|
||||||
},
|
},
|
||||||
|
|
||||||
shrink: function() {
|
shrink: function() {
|
||||||
if (this.get('model.wouldLoseChanges')) {
|
if (this.get('model.replyDirty')) {
|
||||||
this.collapse();
|
this.collapse();
|
||||||
} else {
|
} else {
|
||||||
this.close();
|
this.close();
|
||||||
|
|
|
@ -113,7 +113,7 @@ Discourse.QuoteButtonController = Discourse.Controller.extend({
|
||||||
|
|
||||||
var buffer = this.get('buffer');
|
var buffer = this.get('buffer');
|
||||||
var quotedText = Discourse.BBCode.buildQuoteBBCode(post, buffer);
|
var quotedText = Discourse.BBCode.buildQuoteBBCode(post, buffer);
|
||||||
if (composerController.get('content.wouldLoseChanges')) {
|
if (composerController.get('content.replyDirty')) {
|
||||||
composerController.appendText(quotedText);
|
composerController.appendText(quotedText);
|
||||||
} else {
|
} else {
|
||||||
composerController.open(composerOpts).then(function() {
|
composerController.open(composerOpts).then(function() {
|
||||||
|
|
|
@ -21,13 +21,6 @@ var CLOSED = 'closed',
|
||||||
|
|
||||||
Discourse.Composer = Discourse.Model.extend({
|
Discourse.Composer = Discourse.Model.extend({
|
||||||
|
|
||||||
init: function() {
|
|
||||||
this._super();
|
|
||||||
var val = Discourse.KeyValueStore.get('composer.showPreview') || 'true';
|
|
||||||
this.set('showPreview', val === 'true');
|
|
||||||
this.set('archetypeId', Discourse.Site.instance().get('default_archetype'));
|
|
||||||
},
|
|
||||||
|
|
||||||
archetypes: function() {
|
archetypes: function() {
|
||||||
return Discourse.Site.instance().get('archetypes');
|
return Discourse.Site.instance().get('archetypes');
|
||||||
}.property(),
|
}.property(),
|
||||||
|
@ -40,6 +33,8 @@ Discourse.Composer = Discourse.Model.extend({
|
||||||
viewOpen: Em.computed.equal('composeState', OPEN),
|
viewOpen: Em.computed.equal('composeState', OPEN),
|
||||||
viewDraft: Em.computed.equal('composeState', DRAFT),
|
viewDraft: Em.computed.equal('composeState', DRAFT),
|
||||||
|
|
||||||
|
notCreatingPrivateMessage: Em.computed.not('creatingPrivateMessage'),
|
||||||
|
|
||||||
archetype: function() {
|
archetype: function() {
|
||||||
return this.get('archetypes').findProperty('id', this.get('archetypeId'));
|
return this.get('archetypes').findProperty('id', this.get('archetypeId'));
|
||||||
}.property('archetypeId'),
|
}.property('archetypeId'),
|
||||||
|
@ -48,42 +43,14 @@ Discourse.Composer = Discourse.Model.extend({
|
||||||
return this.set('metaData', Em.Object.create());
|
return this.set('metaData', Em.Object.create());
|
||||||
}.observes('archetype'),
|
}.observes('archetype'),
|
||||||
|
|
||||||
editTitle: function() {
|
editingFirstPost: Em.computed.and('editingPost', 'post.firstPost'),
|
||||||
if (this.get('creatingTopic') || this.get('creatingPrivateMessage')) return true;
|
canEditTitle: Em.computed.or('creatingTopic', 'creatingPrivateMessage', 'editingFirstPost'),
|
||||||
if (this.get('editingPost') && this.get('post.post_number') === 1) return true;
|
canCategorize: Em.computed.and('canEditTitle', 'notCreatingPrivateMessage'),
|
||||||
return false;
|
|
||||||
}.property('editingPost', 'creatingTopic', 'post.post_number'),
|
|
||||||
|
|
||||||
canCategorize: function() {
|
|
||||||
return (this.get('editTitle') && !this.get('creatingPrivateMessage'));
|
|
||||||
}.property('editTitle', 'creatingPrivateMessage'),
|
|
||||||
|
|
||||||
showAdminOptions: function() {
|
showAdminOptions: function() {
|
||||||
if (this.get('creatingTopic') && Discourse.User.current('staff')) return true;
|
if (this.get('creatingTopic') && Discourse.User.current('staff')) return true;
|
||||||
return false;
|
return false;
|
||||||
}.property('editTitle'),
|
}.property('canEditTitle'),
|
||||||
|
|
||||||
togglePreview: function() {
|
|
||||||
this.toggleProperty('showPreview');
|
|
||||||
Discourse.KeyValueStore.set({ key: 'composer.showPreview', value: this.get('showPreview') });
|
|
||||||
},
|
|
||||||
|
|
||||||
importQuote: function() {
|
|
||||||
// If there is no current post, use the post id from the stream
|
|
||||||
var postId = this.get('post.id') || this.get('topic.postStream.firstPostId');
|
|
||||||
if (postId) {
|
|
||||||
this.set('loading', true);
|
|
||||||
var composer = this;
|
|
||||||
return Discourse.Post.load(postId).then(function(post) {
|
|
||||||
composer.appendText(Discourse.BBCode.buildQuoteBBCode(post, post.get('raw')));
|
|
||||||
composer.set('loading', false);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
appendText: function(text) {
|
|
||||||
this.set('reply', (this.get('reply') || '') + text);
|
|
||||||
},
|
|
||||||
|
|
||||||
// Determine the appropriate title for this action
|
// Determine the appropriate title for this action
|
||||||
actionTitle: function() {
|
actionTitle: function() {
|
||||||
|
@ -144,7 +111,7 @@ Discourse.Composer = Discourse.Model.extend({
|
||||||
// - editing the 1st post
|
// - editing the 1st post
|
||||||
// - creating a private message
|
// - creating a private message
|
||||||
|
|
||||||
if (this.get('editTitle') && !this.get('titleLengthValid')) return true;
|
if (this.get('canEditTitle') && !this.get('titleLengthValid')) return true;
|
||||||
|
|
||||||
// Need at least one user when sending a private message
|
// Need at least one user when sending a private message
|
||||||
if ( this.get('creatingPrivateMessage') &&
|
if ( this.get('creatingPrivateMessage') &&
|
||||||
|
@ -159,16 +126,17 @@ Discourse.Composer = Discourse.Model.extend({
|
||||||
if (this.get('canCategorize') && !Discourse.SiteSettings.allow_uncategorized_topics && !this.get('categoryName')) return true;
|
if (this.get('canCategorize') && !Discourse.SiteSettings.allow_uncategorized_topics && !this.get('categoryName')) return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}.property('loading', 'editTitle', 'titleLength', 'targetUsernames', 'replyLength', 'categoryName', 'missingReplyCharacters'),
|
}.property('loading', 'canEditTitle', 'titleLength', 'targetUsernames', 'replyLength', 'categoryName', 'missingReplyCharacters'),
|
||||||
|
|
||||||
|
/**
|
||||||
|
Is the title's length valid?
|
||||||
|
|
||||||
|
@property titleLengthValid
|
||||||
|
**/
|
||||||
titleLengthValid: function() {
|
titleLengthValid: function() {
|
||||||
if (this.get('creatingPrivateMessage')) {
|
if (this.get('titleLength') < this.get('minimumTitleLength')) return false;
|
||||||
if (this.get('titleLength') < Discourse.SiteSettings.min_private_message_title_length) return false;
|
|
||||||
} else {
|
|
||||||
if (this.get('titleLength') < Discourse.SiteSettings.min_topic_title_length) return false;
|
|
||||||
}
|
|
||||||
return (this.get('titleLength') <= Discourse.SiteSettings.max_topic_title_length);
|
return (this.get('titleLength') <= Discourse.SiteSettings.max_topic_title_length);
|
||||||
}.property('creatingPrivateMessage', 'titleLength'),
|
}.property('minimumTitleLength', 'titleLength'),
|
||||||
|
|
||||||
// The text for the save button
|
// The text for the save button
|
||||||
saveText: function() {
|
saveText: function() {
|
||||||
|
@ -185,9 +153,139 @@ Discourse.Composer = Discourse.Model.extend({
|
||||||
return metaData ? Em.empty(Em.keys(this.get('metaData'))) : false;
|
return metaData ? Em.empty(Em.keys(this.get('metaData'))) : false;
|
||||||
}.property('metaData'),
|
}.property('metaData'),
|
||||||
|
|
||||||
wouldLoseChanges: function() {
|
/**
|
||||||
|
Did the user make changes to the reply?
|
||||||
|
|
||||||
|
@property replyDirty
|
||||||
|
**/
|
||||||
|
replyDirty: function() {
|
||||||
return this.get('reply') !== this.get('originalText');
|
return this.get('reply') !== this.get('originalText');
|
||||||
}.property('reply', 'save'),
|
}.property('reply', 'originalText'),
|
||||||
|
|
||||||
|
/**
|
||||||
|
Number of missing characters in the title until valid.
|
||||||
|
|
||||||
|
@property missingTitleCharacters
|
||||||
|
**/
|
||||||
|
missingTitleCharacters: function() {
|
||||||
|
return this.get('minimumTitleLength') - this.get('titleLength');
|
||||||
|
}.property('minimumTitleLength', 'titleLength'),
|
||||||
|
|
||||||
|
/**
|
||||||
|
Minimum number of characters for a title to be valid.
|
||||||
|
|
||||||
|
@property minimumTitleLength
|
||||||
|
**/
|
||||||
|
minimumTitleLength: function() {
|
||||||
|
if (this.get('creatingPrivateMessage')) {
|
||||||
|
return Discourse.SiteSettings.min_private_message_title_length;
|
||||||
|
} else {
|
||||||
|
return Discourse.SiteSettings.min_topic_title_length;
|
||||||
|
}
|
||||||
|
}.property('creatingPrivateMessage'),
|
||||||
|
|
||||||
|
/**
|
||||||
|
Number of missing characters in the reply until valid.
|
||||||
|
|
||||||
|
@property missingReplyCharacters
|
||||||
|
**/
|
||||||
|
missingReplyCharacters: function() {
|
||||||
|
return this.get('minimumPostLength') - this.get('replyLength');
|
||||||
|
}.property('minimumPostLength', 'replyLength'),
|
||||||
|
|
||||||
|
/**
|
||||||
|
Minimum number of characters for a post body to be valid.
|
||||||
|
|
||||||
|
@property minimumPostLength
|
||||||
|
**/
|
||||||
|
minimumPostLength: function() {
|
||||||
|
if( this.get('creatingPrivateMessage') ) {
|
||||||
|
return Discourse.SiteSettings.min_private_message_post_length;
|
||||||
|
} else {
|
||||||
|
return Discourse.SiteSettings.min_post_length;
|
||||||
|
}
|
||||||
|
}.property('creatingPrivateMessage'),
|
||||||
|
|
||||||
|
/**
|
||||||
|
Computes the length of the title minus non-significant whitespaces
|
||||||
|
|
||||||
|
@property titleLength
|
||||||
|
**/
|
||||||
|
titleLength: function() {
|
||||||
|
var title = this.get('title') || "";
|
||||||
|
return title.replace(/\s+/img, " ").trim().length;
|
||||||
|
}.property('title'),
|
||||||
|
|
||||||
|
/**
|
||||||
|
Computes the length of the reply minus the quote(s) and non-significant whitespaces
|
||||||
|
|
||||||
|
@property replyLength
|
||||||
|
**/
|
||||||
|
replyLength: function() {
|
||||||
|
var reply = this.get('reply') || "";
|
||||||
|
while (Discourse.BBCode.QUOTE_REGEXP.test(reply)) { reply = reply.replace(Discourse.BBCode.QUOTE_REGEXP, ""); }
|
||||||
|
return reply.replace(/\s+/img, " ").trim().length;
|
||||||
|
}.property('reply'),
|
||||||
|
|
||||||
|
|
||||||
|
updateDraftStatus: function() {
|
||||||
|
var $title = $('#reply-title'),
|
||||||
|
$reply = $('#wmd-input');
|
||||||
|
|
||||||
|
// 'title' is focused
|
||||||
|
if ($title.is(':focus')) {
|
||||||
|
var titleDiff = this.get('missingTitleCharacters');
|
||||||
|
if (titleDiff > 0) {
|
||||||
|
this.flashDraftStatusForNewUser();
|
||||||
|
return this.set('draftStatus', Em.String.i18n('composer.min_length.need_more_for_title', { n: titleDiff }));
|
||||||
|
}
|
||||||
|
// 'reply' is focused
|
||||||
|
} else if ($reply.is(':focus')) {
|
||||||
|
var replyDiff = this.get('missingReplyCharacters');
|
||||||
|
if (replyDiff > 0) {
|
||||||
|
return this.set('draftStatus', Em.String.i18n('composer.min_length.need_more_for_reply', { n: replyDiff }));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// hide the counters if the currently focused text field is OK
|
||||||
|
this.set('draftStatus', null);
|
||||||
|
|
||||||
|
}.observes('missingTitleCharacters', 'missingReplyCharacters'),
|
||||||
|
|
||||||
|
init: function() {
|
||||||
|
this._super();
|
||||||
|
var val = Discourse.KeyValueStore.get('composer.showPreview') || 'true';
|
||||||
|
this.set('showPreview', val === 'true');
|
||||||
|
this.set('archetypeId', Discourse.Site.instance().get('default_archetype'));
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
Append text to the current reply
|
||||||
|
|
||||||
|
@method appendText
|
||||||
|
@param {String} text the text to append
|
||||||
|
**/
|
||||||
|
appendText: function(text) {
|
||||||
|
this.set('reply', (this.get('reply') || '') + text);
|
||||||
|
},
|
||||||
|
|
||||||
|
togglePreview: function() {
|
||||||
|
this.toggleProperty('showPreview');
|
||||||
|
Discourse.KeyValueStore.set({ key: 'composer.showPreview', value: this.get('showPreview') });
|
||||||
|
},
|
||||||
|
|
||||||
|
importQuote: function() {
|
||||||
|
// If there is no current post, use the post id from the stream
|
||||||
|
var postId = this.get('post.id') || this.get('topic.postStream.firstPostId');
|
||||||
|
if (postId) {
|
||||||
|
this.set('loading', true);
|
||||||
|
var composer = this;
|
||||||
|
return Discourse.Post.load(postId).then(function(post) {
|
||||||
|
composer.appendText(Discourse.BBCode.buildQuoteBBCode(post, post.get('raw')));
|
||||||
|
composer.set('loading', false);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Open a composer
|
Open a composer
|
||||||
|
@ -440,97 +538,7 @@ Discourse.Composer = Discourse.Model.extend({
|
||||||
$draftStatus.toggleClass('flash', true);
|
$draftStatus.toggleClass('flash', true);
|
||||||
setTimeout(function() { $draftStatus.removeClass('flash'); }, 250);
|
setTimeout(function() { $draftStatus.removeClass('flash'); }, 250);
|
||||||
}
|
}
|
||||||
},
|
|
||||||
|
|
||||||
updateDraftStatus: function() {
|
|
||||||
var $title = $('#reply-title'),
|
|
||||||
$reply = $('#wmd-input');
|
|
||||||
|
|
||||||
// 'title' is focused
|
|
||||||
if ($title.is(':focus')) {
|
|
||||||
var titleDiff = this.get('missingTitleCharacters');
|
|
||||||
if (titleDiff > 0) {
|
|
||||||
this.flashDraftStatusForNewUser();
|
|
||||||
return this.set('draftStatus', Em.String.i18n('composer.min_length.need_more_for_title', { n: titleDiff }));
|
|
||||||
}
|
}
|
||||||
// 'reply' is focused
|
|
||||||
} else if ($reply.is(':focus')) {
|
|
||||||
var replyDiff = this.get('missingReplyCharacters');
|
|
||||||
if (replyDiff > 0) {
|
|
||||||
return this.set('draftStatus', Em.String.i18n('composer.min_length.need_more_for_reply', { n: replyDiff }));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// hide the counters if the currently focused text field is OK
|
|
||||||
this.set('draftStatus', null);
|
|
||||||
|
|
||||||
}.observes('missingTitleCharacters', 'missingReplyCharacters'),
|
|
||||||
|
|
||||||
/**
|
|
||||||
Number of missing characters in the title until valid.
|
|
||||||
|
|
||||||
@property missingTitleCharacters
|
|
||||||
**/
|
|
||||||
missingTitleCharacters: function() {
|
|
||||||
return this.get('minimumTitleLength') - this.get('titleLength');
|
|
||||||
}.property('minimumTitleLength', 'titleLength'),
|
|
||||||
|
|
||||||
/**
|
|
||||||
Minimum number of characters for a title to be valid.
|
|
||||||
|
|
||||||
@property minimumTitleLength
|
|
||||||
**/
|
|
||||||
minimumTitleLength: function() {
|
|
||||||
if (this.get('creatingPrivateMessage')) {
|
|
||||||
return Discourse.SiteSettings.min_private_message_title_length;
|
|
||||||
} else {
|
|
||||||
return Discourse.SiteSettings.min_topic_title_length;
|
|
||||||
}
|
|
||||||
}.property('creatingPrivateMessage'),
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Number of missing characters in the reply until valid.
|
|
||||||
|
|
||||||
@property missingReplyCharacters
|
|
||||||
**/
|
|
||||||
missingReplyCharacters: function() {
|
|
||||||
return this.get('minimumPostLength') - this.get('replyLength');
|
|
||||||
}.property('minimumPostLength', 'replyLength'),
|
|
||||||
|
|
||||||
/**
|
|
||||||
Minimum number of characters for a post body to be valid.
|
|
||||||
|
|
||||||
@property minimumPostLength
|
|
||||||
**/
|
|
||||||
minimumPostLength: function() {
|
|
||||||
if( this.get('creatingPrivateMessage') ) {
|
|
||||||
return Discourse.SiteSettings.min_private_message_post_length;
|
|
||||||
} else {
|
|
||||||
return Discourse.SiteSettings.min_post_length;
|
|
||||||
}
|
|
||||||
}.property('creatingPrivateMessage'),
|
|
||||||
|
|
||||||
/**
|
|
||||||
Computes the length of the title minus non-significant whitespaces
|
|
||||||
|
|
||||||
@property titleLength
|
|
||||||
**/
|
|
||||||
titleLength: function() {
|
|
||||||
var title = this.get('title') || "";
|
|
||||||
return title.replace(/\s+/img, " ").trim().length;
|
|
||||||
}.property('title'),
|
|
||||||
|
|
||||||
/**
|
|
||||||
Computes the length of the reply minus the quote(s) and non-significant whitespaces
|
|
||||||
|
|
||||||
@property replyLength
|
|
||||||
**/
|
|
||||||
replyLength: function() {
|
|
||||||
var reply = this.get('reply') || "";
|
|
||||||
while (Discourse.BBCode.QUOTE_REGEXP.test(reply)) { reply = reply.replace(Discourse.BBCode.QUOTE_REGEXP, ""); }
|
|
||||||
return reply.replace(/\s+/img, " ").trim().length;
|
|
||||||
}.property('reply')
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -9,8 +9,7 @@
|
||||||
Discourse.Post = Discourse.Model.extend({
|
Discourse.Post = Discourse.Model.extend({
|
||||||
|
|
||||||
shareUrl: function() {
|
shareUrl: function() {
|
||||||
if (this.get('postnumber') === 1) return this.get('topic.url');
|
if (this.get('firstPost')) return this.get('topic.url');
|
||||||
|
|
||||||
var user = Discourse.User.current();
|
var user = Discourse.User.current();
|
||||||
return this.get('url') + (user ? '?u=' + user.get('username_lower') : '');
|
return this.get('url') + (user ? '?u=' + user.get('username_lower') : '');
|
||||||
}.property('url'),
|
}.property('url'),
|
||||||
|
@ -38,9 +37,7 @@ Discourse.Post = Discourse.Model.extend({
|
||||||
return this.get('topic.details.created_by.id') === this.get('user_id');
|
return this.get('topic.details.created_by.id') === this.get('user_id');
|
||||||
}.property('topic.details.created_by.id', 'user_id'),
|
}.property('topic.details.created_by.id', 'user_id'),
|
||||||
|
|
||||||
hasHistory: function() {
|
hasHistory: Em.computed.gt('version', 1),
|
||||||
return this.get('version') > 1;
|
|
||||||
}.property('version'),
|
|
||||||
|
|
||||||
postElementId: function() {
|
postElementId: function() {
|
||||||
return "post_" + (this.get('post_number'));
|
return "post_" + (this.get('post_number'));
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
<div class='control-row reply-area'>
|
<div class='control-row reply-area'>
|
||||||
<div class='reply-to'>{{{model.actionTitle}}}:</div>
|
<div class='reply-to'>{{{model.actionTitle}}}:</div>
|
||||||
|
|
||||||
{{#if model.editTitle}}
|
{{#if model.canEditTitle}}
|
||||||
<div class='form-element clearfix'>
|
<div class='form-element clearfix'>
|
||||||
{{#if model.creatingPrivateMessage}}
|
{{#if model.creatingPrivateMessage}}
|
||||||
{{userSelector topicId=controller.controllers.topic.model.id
|
{{userSelector topicId=controller.controllers.topic.model.id
|
||||||
|
|
|
@ -14,7 +14,7 @@ Discourse.ComposerView = Discourse.View.extend({
|
||||||
classNameBindings: ['model.creatingPrivateMessage:private-message',
|
classNameBindings: ['model.creatingPrivateMessage:private-message',
|
||||||
'composeState',
|
'composeState',
|
||||||
'model.loading',
|
'model.loading',
|
||||||
'model.editTitle',
|
'model.canEditTitle:edit-title',
|
||||||
'postMade',
|
'postMade',
|
||||||
'model.creatingTopic:topic',
|
'model.creatingTopic:topic',
|
||||||
'model.showPreview',
|
'model.showPreview',
|
||||||
|
|
|
@ -114,7 +114,6 @@ test("right clicks are tracked", function() {
|
||||||
Discourse.SiteSettings.track_external_right_clicks = true;
|
Discourse.SiteSettings.track_external_right_clicks = true;
|
||||||
trackRightClick();
|
trackRightClick();
|
||||||
equal($('a').first().attr('href'), "/clicks/track?url=http%3A%2F%2Fwww.google.com&post_id=42");
|
equal($('a').first().attr('href'), "/clicks/track?url=http%3A%2F%2Fwww.google.com&post_id=42");
|
||||||
Discourse.SiteSettings.track_external_right_clicks = false;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,2 +1,3 @@
|
||||||
/*jshint maxlen:10000000 */
|
/*jshint maxlen:10000000 */
|
||||||
Discourse.SiteSettings = {"title":"Discourse Meta","logo_url":"/assets/logo.png","logo_small_url":"/assets/logo-single.png","traditional_markdown_linebreaks":false,"top_menu":"latest|new|unread|read|favorited|categories","post_menu":"like|edit|flag|delete|share|bookmark|reply","share_links":"twitter|facebook|google+|email","track_external_right_clicks":false,"must_approve_users":false,"ga_tracking_code":"UA-33736483-2","ga_domain_name":"","enable_long_polling":true,"polling_interval":3000,"anon_polling_interval":30000,"min_post_length":20,"max_post_length":16000,"min_topic_title_length":15,"max_topic_title_length":255,"min_private_message_title_length":2,"allow_uncategorized_topics":true,"min_search_term_length":3,"flush_timings_secs":5,"suppress_reply_directly_below":true,"email_domains_blacklist":"mailinator.com","email_domains_whitelist":null,"version_checks":true,"min_title_similar_length":10,"min_body_similar_length":15,"category_colors":"BF1E2E|F1592A|F7941D|9EB83B|3AB54A|12A89D|25AAE2|0E76BD|652D90|92278F|ED207B|8C6238|231F20|808281|B3B5B4|283890","max_upload_size_kb":1024,"category_featured_topics":6,"favicon_url":"/assets/favicon.ico","dynamic_favicon":false,"uncategorized_name":"uncategorized","uncategorized_color":"AB9364","uncategorized_text_color":"FFFFFF","invite_only":false,"login_required":false,"enable_local_logins":true,"enable_local_account_create":true,"enable_google_logins":true,"enable_yahoo_logins":true,"enable_twitter_logins":true,"enable_facebook_logins":true,"enable_cas_logins":false,"enable_github_logins":true,"enable_persona_logins":true,"educate_until_posts":2,"topic_views_heat_low":1000,"topic_views_heat_medium":2000,"topic_views_heat_high":5000,"min_private_message_post_length":5,"faq_url":"","tos_url":"","privacy_policy_url":"","authorized_extensions":".jpg|.jpeg|.png|.gif"};
|
Discourse.SiteSettingsOriginal = {"title":"Discourse Meta","logo_url":"/assets/logo.png","logo_small_url":"/assets/logo-single.png","traditional_markdown_linebreaks":false,"top_menu":"latest|new|unread|read|favorited|categories","post_menu":"like|edit|flag|delete|share|bookmark|reply","share_links":"twitter|facebook|google+|email","track_external_right_clicks":false,"must_approve_users":false,"ga_tracking_code":"UA-33736483-2","ga_domain_name":"","enable_long_polling":true,"polling_interval":3000,"anon_polling_interval":30000,"min_post_length":20,"max_post_length":16000,"min_topic_title_length":15,"max_topic_title_length":255,"min_private_message_title_length":2,"allow_uncategorized_topics":true,"min_search_term_length":3,"flush_timings_secs":5,"suppress_reply_directly_below":true,"email_domains_blacklist":"mailinator.com","email_domains_whitelist":null,"version_checks":true,"min_title_similar_length":10,"min_body_similar_length":15,"category_colors":"BF1E2E|F1592A|F7941D|9EB83B|3AB54A|12A89D|25AAE2|0E76BD|652D90|92278F|ED207B|8C6238|231F20|808281|B3B5B4|283890","max_upload_size_kb":1024,"category_featured_topics":6,"favicon_url":"/assets/favicon.ico","dynamic_favicon":false,"uncategorized_name":"uncategorized","uncategorized_color":"AB9364","uncategorized_text_color":"FFFFFF","invite_only":false,"login_required":false,"enable_local_logins":true,"enable_local_account_create":true,"enable_google_logins":true,"enable_yahoo_logins":true,"enable_twitter_logins":true,"enable_facebook_logins":true,"enable_cas_logins":false,"enable_github_logins":true,"enable_persona_logins":true,"educate_until_posts":2,"topic_views_heat_low":1000,"topic_views_heat_medium":2000,"topic_views_heat_high":5000,"min_private_message_post_length":5,"faq_url":"","tos_url":"","privacy_policy_url":"","authorized_extensions":".jpg|.jpeg|.png|.gif"};
|
||||||
|
Discourse.SiteSettings = jQuery.extend(true, {}, Discourse.SiteSettingsOriginal);
|
|
@ -33,22 +33,76 @@ test('missingTitleCharacters', function() {
|
||||||
missingTitleCharacters('z', true, Discourse.SiteSettings.min_private_message_title_length - 1, 'too short pm title');
|
missingTitleCharacters('z', true, Discourse.SiteSettings.min_private_message_title_length - 1, 'too short pm title');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('replyDirty', function() {
|
||||||
test('wouldLoseChanges', function() {
|
|
||||||
var composer = Discourse.Composer.create();
|
var composer = Discourse.Composer.create();
|
||||||
ok(!composer.get('wouldLoseChanges'), "by default it's false");
|
ok(!composer.get('replyDirty'), "by default it's false");
|
||||||
|
|
||||||
composer.setProperties({
|
composer.setProperties({
|
||||||
originalText: "hello",
|
originalText: "hello",
|
||||||
reply: "hello"
|
reply: "hello"
|
||||||
});
|
});
|
||||||
|
|
||||||
ok(!composer.get('wouldLoseChanges'), "it's false when the originalText is the same as the reply");
|
ok(!composer.get('replyDirty'), "it's false when the originalText is the same as the reply");
|
||||||
composer.set('reply', 'hello world');
|
composer.set('reply', 'hello world');
|
||||||
ok(composer.get('wouldLoseChanges'), "it's true when the reply changes");
|
ok(composer.get('replyDirty'), "it's true when the reply changes");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("appendText", function() {
|
||||||
|
var composer = Discourse.Composer.create();
|
||||||
|
|
||||||
|
blank(composer.get('reply'), "the reply is blank by default");
|
||||||
|
|
||||||
|
composer.appendText("hello");
|
||||||
|
equal(composer.get('reply'), "hello", "it appends text to nothing");
|
||||||
|
composer.appendText(" world");
|
||||||
|
equal(composer.get('reply'), "hello world", "it appends text to existing text");
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
test("Title length for regular topics", function() {
|
||||||
|
Discourse.SiteSettings.min_topic_title_length = 5;
|
||||||
|
Discourse.SiteSettings.max_topic_title_length = 10;
|
||||||
|
var composer = Discourse.Composer.create();
|
||||||
|
|
||||||
|
composer.set('title', 'asdf');
|
||||||
|
ok(!composer.get('titleLengthValid'), "short titles are not valid");
|
||||||
|
|
||||||
|
composer.set('title', 'this is a long title');
|
||||||
|
ok(!composer.get('titleLengthValid'), "long titles are not valid");
|
||||||
|
|
||||||
|
composer.set('title', 'just right');
|
||||||
|
ok(composer.get('titleLengthValid'), "in the range is okay");
|
||||||
|
});
|
||||||
|
|
||||||
|
test("Title length for private messages", function() {
|
||||||
|
Discourse.SiteSettings.min_private_message_title_length = 5;
|
||||||
|
Discourse.SiteSettings.max_topic_title_length = 10;
|
||||||
|
var composer = Discourse.Composer.create({action: Discourse.Composer.PRIVATE_MESSAGE});
|
||||||
|
|
||||||
|
composer.set('title', 'asdf');
|
||||||
|
ok(!composer.get('titleLengthValid'), "short titles are not valid");
|
||||||
|
|
||||||
|
composer.set('title', 'this is a long title');
|
||||||
|
ok(!composer.get('titleLengthValid'), "long titles are not valid");
|
||||||
|
|
||||||
|
composer.set('title', 'just right');
|
||||||
|
ok(composer.get('titleLengthValid'), "in the range is okay");
|
||||||
|
});
|
||||||
|
|
||||||
|
test("Title length for private messages", function() {
|
||||||
|
Discourse.SiteSettings.min_private_message_title_length = 5;
|
||||||
|
Discourse.SiteSettings.max_topic_title_length = 10;
|
||||||
|
var composer = Discourse.Composer.create({action: Discourse.Composer.PRIVATE_MESSAGE});
|
||||||
|
|
||||||
|
composer.set('title', 'asdf');
|
||||||
|
ok(!composer.get('titleLengthValid'), "short titles are not valid");
|
||||||
|
|
||||||
|
composer.set('title', 'this is a long title');
|
||||||
|
ok(!composer.get('titleLengthValid'), "long titles are not valid");
|
||||||
|
|
||||||
|
composer.set('title', 'just right');
|
||||||
|
ok(composer.get('titleLengthValid'), "in the range is okay");
|
||||||
|
});
|
||||||
|
|
||||||
test('importQuote with no data', function() {
|
test('importQuote with no data', function() {
|
||||||
this.stub(Discourse.Post, 'load');
|
this.stub(Discourse.Post, 'load');
|
||||||
|
@ -63,6 +117,19 @@ test('importQuote with no data', function() {
|
||||||
ok(!Discourse.Post.load.calledOnce, "load is not called");
|
ok(!Discourse.Post.load.calledOnce, "load is not called");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('editingFirstPost', function() {
|
||||||
|
var composer = Discourse.Composer.create();
|
||||||
|
ok(!composer.get('editingFirstPost'), "it's false by default");
|
||||||
|
|
||||||
|
var post = Discourse.Post.create({id: 123, post_number: 2});
|
||||||
|
composer.setProperties({post: post, action: Discourse.Composer.EDIT });
|
||||||
|
ok(!composer.get('editingFirstPost'), "it's false when not editing the first post");
|
||||||
|
|
||||||
|
post.set('post_number', 1);
|
||||||
|
ok(composer.get('editingFirstPost'), "it's true when editing the first post");
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
asyncTest('importQuote with a post', function() {
|
asyncTest('importQuote with a post', function() {
|
||||||
expect(1);
|
expect(1);
|
||||||
|
|
||||||
|
|
|
@ -30,3 +30,15 @@ test('updateFromPost', function() {
|
||||||
|
|
||||||
equal(post.get('raw'), "different raw", "raw field updated");
|
equal(post.get('raw'), "different raw", "raw field updated");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('hasHistory', function() {
|
||||||
|
|
||||||
|
var post = Discourse.Post.create({id: 1});
|
||||||
|
ok(!post.get('hasHistory'), 'posts without versions have no history');
|
||||||
|
post.set('version', 1);
|
||||||
|
ok(!post.get('hasHistory'), 'posts with one version have no history');
|
||||||
|
post.set('version', 2);
|
||||||
|
ok(post.get('hasHistory'), 'posts with more than one version have a history');
|
||||||
|
|
||||||
|
|
||||||
|
});
|
|
@ -72,8 +72,13 @@ Discourse.setupForTesting();
|
||||||
Discourse.injectTestHelpers();
|
Discourse.injectTestHelpers();
|
||||||
Discourse.bindDOMEvents();
|
Discourse.bindDOMEvents();
|
||||||
|
|
||||||
|
|
||||||
Discourse.Router.map(function() {
|
Discourse.Router.map(function() {
|
||||||
return Discourse.routeBuilder.call(this);
|
return Discourse.routeBuilder.call(this);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
QUnit.testStart(function() {
|
||||||
|
// Allow our tests to change site settings and have them reset before the next test
|
||||||
|
Discourse.SiteSettings = jQuery.extend(true, {}, Discourse.SiteSettingsOriginal);
|
||||||
|
})
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue