Merged in iss87 (pull request #47) Улучшить аяксовые рекоммендации

This commit is contained in:
Alexey Skobkin 2015-02-10 19:47:01 +03:00
commit 11b1338841
5 changed files with 104 additions and 8 deletions

View file

@ -188,5 +188,8 @@
}, },
"msg_saving_post_draft":{ "msg_saving_post_draft":{
"message": "Saving the post..." "message": "Saving the post..."
},
"msg_success_recommendation": {
"message": "is recommended"
} }
} }

View file

@ -189,5 +189,8 @@
}, },
"msg_saving_post_draft":{ "msg_saving_post_draft":{
"message": "Сохранение поста..." "message": "Сохранение поста..."
},
"msg_success_recommendation": {
"message": "рекомендовано"
} }
} }

View file

@ -503,6 +503,9 @@ function PointPlus(ppVersion) {
if (options.is('option_ajax')) { if (options.is('option_ajax')) {
// Comments // Comments
if (options.is('option_ajax_comments')) { if (options.is('option_ajax_comments')) {
messenger.css({
file: 'modules/ajax-comments.css'
});
messenger.js({ messenger.js({
file: 'modules/ajax-comments.js' file: 'modules/ajax-comments.js'
}, function() { }, function() {

View file

@ -0,0 +1,27 @@
.pp-notification {
display: block;
position: fixed;
top: 40px;
right: 40px;
padding: 20px;
border-radius: 2px;
font-size: 15px;
line-height: 20px;
transition: all 10s ease-in;
color: #fff;
}
.pp-notification a,
.pp-notification a:visited, {
color: #fff;
text-decoration: none;
font-weight: bold;
}
.pp-notification-success {
background: #4CAF50;
}
.pp-notification.pp-fade {
opacity: 0;
}

View file

@ -48,7 +48,7 @@ AjaxComments.prototype.onSubmit = function(event) {
}; };
/** /**
* Проверяет, выбран ли файл. Если да отправляет форму с перезагрузкой, иначе аяксом  * Проверяет, выбран ли файл. Если да отправляет форму с перезагрузкой, иначе аяксом
* @param {jQuery} $form Элемент формы * @param {jQuery} $form Элемент формы
*/ */
AjaxComments.prototype.submit = function($form) { AjaxComments.prototype.submit = function($form) {
@ -67,7 +67,6 @@ AjaxComments.prototype.submit = function($form) {
*/ */
AjaxComments.prototype.onKeypress = function(event) { AjaxComments.prototype.onKeypress = function(event) {
var $form; var $form;
var proc;
if (this.isProperKeys(event)) { if (this.isProperKeys(event)) {
event.preventDefault(); event.preventDefault();
@ -116,12 +115,19 @@ function AjaxCommentProcessor($form) {
this._text = this._$textarea.val(); this._text = this._$textarea.val();
this._CSRF = $form.get(0).elements.csrf_token.value; this._CSRF = $form.get(0).elements.csrf_token.value;
this._actionUrl = this._$form.attr('action');
this._postId = this._$post.data('id'); this._postId = this._$post.data('id');
this._commentId = this._$post.data('comment-id'); this._commentId = this._$post.data('comment-id');
this.sendComment(); this.sendComment();
} }
/**
* Регулярка для урла, проверяюшая, не рекомендация ли это
* @type {RegExp}
*/
AjaxCommentProcessor.recommendationReg = /^\/[^/]*\/r$/;
/** /**
* Отправляет комментарий * Отправляет комментарий
*/ */
@ -130,7 +136,7 @@ AjaxCommentProcessor.prototype.sendComment = function() {
$.ajax({ $.ajax({
type: 'POST', type: 'POST',
url: '/api/post' + this._$form.attr('action'), url: this.getUrl(),
data: { data: {
text: this._text, text: this._text,
comment_id: this._commentId comment_id: this._commentId
@ -141,6 +147,25 @@ AjaxCommentProcessor.prototype.sendComment = function() {
}); });
}; };
/**
* @return {Boolean} true это коммент-рекомендация, fasle обычный коммент
*/
AjaxCommentProcessor.prototype.isRecommendation = function() {
return this._isRec || (this._isRec = this.constructor.recommendationReg.test(this._actionUrl));
};
/**
* @return {String} Адрес, на который слать запрос
*/
AjaxCommentProcessor.prototype.getUrl = function() {
// Если это рекомендация комментария
if (this.isRecommendation() && this._commentId) {
return '/api/post/' + this._postId + '/' + this._commentId + '/r';
} else {
return '/api/post' + this._actionUrl;
}
};
/** /**
* Подкладывает CSRF-токен в заголовки запроса * Подкладывает CSRF-токен в заголовки запроса
* @param {XMLHttpRequest} xhr Объект запроса * @param {XMLHttpRequest} xhr Объект запроса
@ -168,9 +193,12 @@ AjaxCommentProcessor.prototype.onSuccess = function(data, textStatus) {
if (textStatus === 'success') { if (textStatus === 'success') {
if (data.error) { if (data.error) {
this.onError(null, null, data.error); this.onError(null, null, data.error);
} else {
if (this.isRecommendation() && this._text.trim().length === 0) {
this.showSuccessRecommendation();
} else { } else {
this.createComment(data); this.createComment(data);
}
this.hideForm(); this.hideForm();
// Cleaning textarea // Cleaning textarea
@ -181,13 +209,15 @@ AjaxCommentProcessor.prototype.onSuccess = function(data, textStatus) {
}; };
AjaxCommentProcessor.prototype.createComment = function(data) { AjaxCommentProcessor.prototype.createComment = function(data) {
/* global create_comment_elements */
create_comment_elements({ create_comment_elements({
id: data.comment_id, id: data.comment_id,
toId: this._commentId || null, toId: this._commentId || null,
postId: this._postId, postId: this._postId,
author: $('#name h1').text(), author: $('#name h1').text(),
text: this._text, text: this._text,
fadeOut: true fadeOut: true,
isRec: this.isRecommendation()
}, this.insertComment.bind(this)); }, this.insertComment.bind(this));
}; };
@ -236,6 +266,7 @@ AjaxCommentProcessor.prototype.showComment = function($comment) {
* @param {String} error * @param {String} error
*/ */
AjaxCommentProcessor.prototype.onError = function(req, status, error) { AjaxCommentProcessor.prototype.onError = function(req, status, error) {
/* global alert */
alert(chrome.i18n.getMessage('msg_comment_send_failed') + '\n' + error); alert(chrome.i18n.getMessage('msg_comment_send_failed') + '\n' + error);
this.setProgress(false); this.setProgress(false);
@ -243,9 +274,38 @@ AjaxCommentProcessor.prototype.onError = function(req, status, error) {
/** /**
* Устанавливает прогресс * Устанавливает прогресс
* @param {Boolean} isProgress true включить прогресс, false  отключить * @param {Boolean} isProgress true включить прогресс, false отключить
*/ */
AjaxCommentProcessor.prototype.setProgress = function(isProgress) { AjaxCommentProcessor.prototype.setProgress = function(isProgress) {
this._$textarea.prop('disabled', isProgress); this._$textarea.prop('disabled', isProgress);
this._$form.toggleClass('pp-progress', isProgress); this._$form.toggleClass('pp-progress', isProgress);
}; };
AjaxCommentProcessor.prototype.getRecommendationLink = function() {
var url = '//point.im/' + this._postId;
var text = '#' + this._postId;
if (this._commentId) {
url += '#' + this._commentId;
text += '/' + this._commentId;
}
return '<a href="' + url + '">' + text + '</a>';
};
AjaxCommentProcessor.prototype.showSuccessRecommendation = function() {
var $notification = $('<div>')
.addClass('pp-notification pp-notification-success');
$notification.html(this.getRecommendationLink() + ' ' + chrome.i18n.getMessage('msg_success_recommendation'));
$notification.on('transitionend', function() {
$notification.remove();
});
$('body').append($notification);
window.requestAnimationFrame(function() {
$notification.addClass('pp-fade');
});
};