1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-07-08 09:24:25 +03:00
ifhub.club/application/frontend/common/js/vote.js

148 lines
4.4 KiB
JavaScript
Raw Normal View History

/**
* Голосование
*
* @module ls/vote
* @dependencies jquery, jquery.widget, tooltip, ls.utils, ls.ajax
*
* @license GNU General Public License, version 2
* @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com}
* @author Denis Shakhov <denis.shakhov@gmail.com>
*/
(function($) {
2013-07-09 11:40:06 +03:00
"use strict";
$.widget( "livestreet.vote", {
/**
* Дефолтные опции
*/
options: {
// Ссылки
urls: {
// Голосование
vote: null,
// Информация о голосовании
info: null
2011-05-03 13:10:28 +03:00
},
// Селекторы
selectors: {
// Кнопки голосования
item: '.js-vote-item',
// Рейтинг
rating: '.js-vote-rating',
2011-05-03 13:10:28 +03:00
},
// Классы
classes : {
// Пользователь проголосовал
voted: 'vote--voted',
// Не проголосовал
not_voted: 'vote--not-voted',
// Понравилось
voted_up: 'vote--voted-up',
// Не понравилось
voted_down: 'vote--voted-down',
// Воздержался
voted_zero: 'vote--voted-zero',
// Рейтинг больше нуля
count_positive: 'vote--count-positive',
// Меньше нуля
count_negative: 'vote--count-negative',
// Равен нулю
count_zero: 'vote--count-zero',
// Рейтинг скрыт
rating_hidden: 'vote--rating-hidden',
2011-05-03 13:10:28 +03:00
},
// Параметры отправляемые при каждом аякс запросе
params: {},
// Опции тултипа с информацией о голосовании
tooltip_options: {}
},
2013-07-09 11:40:06 +03:00
/**
* Конструктор
*
* @constructor
* @private
*/
_create: function () {
var _this = this;
this.options.params = $.extend({}, this.options.params, ls.utils.getDataOptions(this.element, 'param'));
this.elements = {};
this.elements.rating = this.element.find(this.options.selectors.rating);
this.elements.items = this.element.find(this.options.selectors.item);
// Обработка кликов по кнопкам голосования
if ( ! this.element.hasClass(this.options.classes.voted) ) {
this._on( this.elements.items, {
'click': function (e) {
_this.vote( $(e.currentTarget).data('vote-value') );
e.preventDefault();
}
});
2011-09-06 13:43:14 +03:00
}
2011-05-03 13:10:28 +03:00
// Иниц-ия тултипа с информацией о голосовании
// Показываем инфо-ию только если рейтинг отображается
if ( ! this.element.hasClass(this.options.classes.rating_hidden) ) {
this.info();
2011-04-01 10:49:36 +03:00
}
},
2011-05-03 13:10:28 +03:00
/**
* Голосование
*
* @param {Number} iValue Значение
*/
vote: function(iValue) {
var oParams = $.extend({}, { value: iValue }, this.options.params);
ls.ajax.load(this.options.urls.vote, oParams, function (oResponse) {
if (oResponse.bStateError) {
ls.msg.error(null, oResponse.sMsg);
} else {
ls.msg.notice(null, oResponse.sMsg);
oResponse.iRating = parseFloat(oResponse.iRating);
this.element
.removeClass(this.options.classes.count_negative + ' ' + this.options.classes.count_positive + ' ' + this.options.classes.count_zero)
.removeClass(this.options.classes.rating_hidden + ' ' + this.options.classes.not_voted)
.addClass(this.options.classes.voted)
.addClass(this.options.classes[ iValue > 0 ? 'voted_up' : ( iValue < 0 ? 'voted_down' : 'voted_zero' ) ])
.addClass(this.options.classes[ oResponse.iRating > 0 ? 'count_positive' : ( oResponse.iRating < 0 ? 'count_negative' : 'count_zero' ) ]);
this.elements.rating.text(oResponse.iRating);
// Не обрабатываем клики после голосования
this._off(this.elements.items, 'click');
// Удаляем подсказки
this.elements.items.removeAttr('title');
// Иниц-ия тултипа
this.info().tooltip('show');
}
}.bind(this));
},
2013-07-09 11:40:06 +03:00
/**
* Иниц-ия тултипа с информацией о голосовании
*
* @return {jQuery}
*/
info: function () {
if ( ! this.options.urls.info ) return $();
return this.element.tooltip($.extend({}, {
ajax: {
url: this.options.urls.info,
params: this.options.params
}
}, this.options.tooltip_options));
2011-05-03 13:10:28 +03:00
}
});
})(jQuery);