2014-02-06 11:43:12 +02:00
|
|
|
|
/**
|
|
|
|
|
* Пополняемый список пользователей
|
2014-04-03 10:36:30 +03:00
|
|
|
|
*
|
2014-02-06 11:43:12 +02:00
|
|
|
|
* @module ls/user_list_add
|
2014-04-03 10:36:30 +03:00
|
|
|
|
*
|
2014-02-06 11:43:12 +02:00
|
|
|
|
* @license GNU General Public License, version 2
|
|
|
|
|
* @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com}
|
|
|
|
|
* @author Denis Shakhov <denis.shakhov@gmail.com>
|
|
|
|
|
*/
|
|
|
|
|
|
2014-04-03 10:36:30 +03:00
|
|
|
|
(function($) {
|
2014-02-06 11:43:12 +02:00
|
|
|
|
"use strict";
|
|
|
|
|
|
2014-04-03 10:36:30 +03:00
|
|
|
|
$.widget( "livestreet.user_list_add", {
|
|
|
|
|
/**
|
|
|
|
|
* Дефолтные опции
|
|
|
|
|
*/
|
|
|
|
|
options: {
|
|
|
|
|
urls: {
|
|
|
|
|
add: null,
|
|
|
|
|
remove: null
|
2014-02-06 11:43:12 +02:00
|
|
|
|
},
|
2014-04-03 10:36:30 +03:00
|
|
|
|
// Селекторы
|
|
|
|
|
selectors: {
|
|
|
|
|
// Блок со списком объектов
|
|
|
|
|
list: '.js-user-list-add-users',
|
|
|
|
|
// Объект
|
|
|
|
|
item: '.js-user-list-small-item',
|
|
|
|
|
// Кнопка удаления объекта
|
|
|
|
|
item_remove: '.js-user-list-add-user-remove',
|
|
|
|
|
// Сообщение о пустом списке
|
|
|
|
|
empty: '.js-user-list-small-empty',
|
|
|
|
|
// Форма добавления
|
|
|
|
|
form: '.js-user-list-add-form'
|
2014-02-06 11:43:12 +02:00
|
|
|
|
},
|
2014-04-03 10:36:30 +03:00
|
|
|
|
// Анимация при скрытии объекта
|
|
|
|
|
hide: {
|
|
|
|
|
effect: 'slide',
|
|
|
|
|
duration: 200,
|
|
|
|
|
direction: 'left'
|
2014-02-06 11:43:12 +02:00
|
|
|
|
},
|
2014-04-03 10:36:30 +03:00
|
|
|
|
// Кастомные аякс параметры
|
|
|
|
|
params: {}
|
|
|
|
|
},
|
2014-02-06 11:43:12 +02:00
|
|
|
|
|
2014-04-03 10:36:30 +03:00
|
|
|
|
/**
|
|
|
|
|
* Конструктор
|
|
|
|
|
*
|
|
|
|
|
* @constructor
|
|
|
|
|
* @private
|
|
|
|
|
*/
|
|
|
|
|
_create: function () {
|
|
|
|
|
var _this = this;
|
|
|
|
|
|
|
|
|
|
// Получаем список элементов
|
|
|
|
|
this.elements = {};
|
|
|
|
|
this.elements.container = this.element;
|
|
|
|
|
this.elements.list = this.elements.container.find(this.options.selectors.list);
|
|
|
|
|
this.elements.empty = this.elements.container.find(this.options.selectors.empty);
|
|
|
|
|
this.elements.form = this.elements.container.find(this.options.selectors.form);
|
|
|
|
|
this.elements.form_text = this.elements.form.find('input[type=text]');
|
|
|
|
|
|
|
|
|
|
// Получаем кастомные аякс параметры
|
|
|
|
|
this.options.params = $.extend({}, this.options.params, ls.utils.getDataOptions(this.elements.container, 'param'));
|
|
|
|
|
|
|
|
|
|
// Ивент удаления
|
2014-06-24 16:29:04 +03:00
|
|
|
|
this.elements.list.on('click' + this.eventNamespace, this.options.selectors.item_remove, function (e) {
|
2014-04-03 10:36:30 +03:00
|
|
|
|
_this.remove( $(this).data('user-id') );
|
|
|
|
|
e.preventDefault();
|
2014-02-06 11:43:12 +02:00
|
|
|
|
});
|
|
|
|
|
|
2014-04-03 10:36:30 +03:00
|
|
|
|
// Ивент добавления
|
2014-06-24 16:29:04 +03:00
|
|
|
|
this.elements.form.on('submit' + this.eventNamespace, function (e) {
|
2014-04-03 10:36:30 +03:00
|
|
|
|
var aItemList = _this.getItems();
|
2014-02-06 11:43:12 +02:00
|
|
|
|
|
2014-04-03 10:36:30 +03:00
|
|
|
|
if ( aItemList.length ) {
|
|
|
|
|
ls.utils.formLock(_this.elements.form);
|
|
|
|
|
_this.add( aItemList );
|
|
|
|
|
}
|
2014-02-06 11:43:12 +02:00
|
|
|
|
|
2014-04-03 10:36:30 +03:00
|
|
|
|
e.preventDefault();
|
2014-02-06 11:43:12 +02:00
|
|
|
|
});
|
2014-04-03 10:36:30 +03:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Получает объекты для добавления
|
|
|
|
|
*
|
|
|
|
|
* @return {Array} Массив с объектами
|
|
|
|
|
*/
|
|
|
|
|
getItems: function () {
|
|
|
|
|
var sValue = this.elements.form_text.val();
|
2014-02-06 11:43:12 +02:00
|
|
|
|
|
2014-04-03 10:36:30 +03:00
|
|
|
|
return $.map(sValue.split(','), function(sItem, iIndex) {
|
|
|
|
|
return $.trim(sItem) || null;
|
|
|
|
|
});
|
|
|
|
|
},
|
2014-02-06 11:43:12 +02:00
|
|
|
|
|
2014-04-03 10:36:30 +03:00
|
|
|
|
/**
|
|
|
|
|
* Добавление объекта
|
|
|
|
|
*/
|
|
|
|
|
add: function(aUserList) {
|
|
|
|
|
if ( ! aUserList ) return;
|
2014-02-06 11:43:12 +02:00
|
|
|
|
|
2014-04-03 10:36:30 +03:00
|
|
|
|
var oParams = {
|
|
|
|
|
aUserList: aUserList,
|
2014-02-06 11:43:12 +02:00
|
|
|
|
};
|
|
|
|
|
|
2014-04-03 10:36:30 +03:00
|
|
|
|
oParams = $.extend({}, oParams, this.options.params);
|
|
|
|
|
|
|
|
|
|
ls.ajax.load(this.options.urls.add, oParams, function(oResponse) {
|
|
|
|
|
this._onAdd(oResponse);
|
|
|
|
|
|
|
|
|
|
this._trigger("afteradd", null, { context: this, response: oResponse });
|
|
|
|
|
}.bind(this));
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
_onUserAdd: function (oItem) {
|
|
|
|
|
return;
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
/**
|
2014-06-24 16:29:04 +03:00
|
|
|
|
* Коллбэк вызываемый при добавлении объекта
|
2014-04-03 10:36:30 +03:00
|
|
|
|
*/
|
|
|
|
|
_onAdd: function (oResponse) {
|
|
|
|
|
var aUsers = this._getUsersAll();
|
|
|
|
|
|
|
|
|
|
// Составляем список добавляемых объектов
|
|
|
|
|
var sItemsHtml = $.map(oResponse.aUserList, function (oItem, iIndex) {
|
|
|
|
|
if (oItem.bStateError) {
|
|
|
|
|
ls.msg.error(null, oItem.sMsg);
|
|
|
|
|
} else {
|
|
|
|
|
ls.msg.notice(null, ls.lang.get('common.success.add'));
|
|
|
|
|
|
|
|
|
|
this._trigger("afterobjectadd", null, { context: this, oItem: oItem, response: oResponse });
|
|
|
|
|
|
|
|
|
|
this._onUserAdd(oItem);
|
|
|
|
|
|
|
|
|
|
// Не добавляем юзера если он уже есть в списке
|
|
|
|
|
if ( aUsers.filter('[data-user-id=' + oItem.iUserId + ']').length ) {
|
|
|
|
|
return null;
|
2014-02-06 11:43:12 +02:00
|
|
|
|
} else {
|
2014-04-03 10:36:30 +03:00
|
|
|
|
return oItem.sHtml;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}.bind(this)).join('');
|
2014-02-06 11:43:12 +02:00
|
|
|
|
|
2014-04-03 10:36:30 +03:00
|
|
|
|
if ( sItemsHtml ) {
|
|
|
|
|
// Скрываем сообщение о пустом списке
|
|
|
|
|
this.elements.empty.hide();
|
|
|
|
|
// Добавляем объекты
|
|
|
|
|
this.elements.list.show().prepend(sItemsHtml);
|
2014-02-06 11:43:12 +02:00
|
|
|
|
}
|
|
|
|
|
|
2014-04-03 10:36:30 +03:00
|
|
|
|
ls.utils.formUnlock( this.elements.form );
|
|
|
|
|
this.elements.form_text.focus().val('');
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Удаление объекта
|
|
|
|
|
*/
|
|
|
|
|
remove: function(iUserId) {
|
|
|
|
|
if ( ! this.options.urls.remove ) return;
|
2014-02-06 11:43:12 +02:00
|
|
|
|
|
2014-04-03 10:36:30 +03:00
|
|
|
|
var _this = this,
|
|
|
|
|
oParams = {
|
|
|
|
|
iUserId: iUserId
|
|
|
|
|
};
|
2014-02-07 16:11:30 +02:00
|
|
|
|
|
2014-04-03 10:36:30 +03:00
|
|
|
|
oParams = $.extend({}, oParams, this.options.params);
|
|
|
|
|
|
|
|
|
|
ls.ajax.load(this.options.urls.remove, oParams, function(oResponse) {
|
2014-02-06 11:43:12 +02:00
|
|
|
|
ls.msg.notice(null, ls.lang.get('common.success.remove'));
|
|
|
|
|
|
2014-04-03 10:36:30 +03:00
|
|
|
|
this._hide( this._getUserById( iUserId ), this.options.hide, function () {
|
|
|
|
|
$(this).remove();
|
2014-02-06 11:43:12 +02:00
|
|
|
|
|
2014-04-03 10:36:30 +03:00
|
|
|
|
// Скрываем список если объектов в нем больше нет
|
|
|
|
|
if ( ! _this.elements.list.find(_this.options.selectors.item).length ) {
|
|
|
|
|
_this.elements.list.hide();
|
|
|
|
|
_this.elements.empty.show();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
this._trigger("afterremove", null, { context: this, response: oResponse, oParams: oParams });
|
|
|
|
|
}.bind(this));
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Получает пользователя по ID
|
|
|
|
|
*
|
|
|
|
|
* @private
|
|
|
|
|
* @param {Number} iUserId , ID объекта
|
|
|
|
|
* @return {jQuery} Объект
|
|
|
|
|
*/
|
|
|
|
|
_getUserById: function(iUserId) {
|
|
|
|
|
return this.elements.list.find(this.options.selectors.item + '[data-user-id=' + iUserId + ']');
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Получает всех пользователей
|
|
|
|
|
*/
|
|
|
|
|
_getUsersAll: function() {
|
|
|
|
|
return this.elements.list.find(this.options.selectors.item);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
})(jQuery);
|