Your IP : 3.146.105.252
WebprofyOffersGroup = (function () {
var containerTable = 'div#offers-group__container';
var containerForm = 'div#offers-group__form';
var form = 'form#offersgroup-form';
var setPriceButton = 'a[data-action="set-price"]';
var saveGroupButton = 'a[data-action="save-group"]';
var saveNewGroupButton = 'a[data-action="save-new-group"]';
var delGroupButton = 'a[data-action="delete-group"]';
var messContainer = 'div#message-block';
var addGroupButton = 'a[data-action="add-group"]';
var updateReferenceButton = 'a[data-action="update_reference"]';
/**
* внешние функции
*/
return {
init: init,
responseHandler: responseHandler,
customPost: customPost
};
function init() {
$(".js-select").select2();
topSelectProduct();
fixForm();
}
function fixForm() {
$(window).scroll(function() {
var top = $(document).scrollTop();
if (top < 200) $(form).removeClass('fixed');
else $(form).addClass('fixed');
});
}
function customPost(url, data, callback, type) {
$.ajax({
"type": 'POST',
"url": url,
"data": data,
"success": callback,
"dataType": type,
beforeSend: function () {
$("body").fadeIn("slow", function () {
$(this).addClass("overlay");
});
},
complete: function () {
$("body").fadeIn("slow", function () {
$(this).removeClass("overlay");
});
}
});
}
/**
* Инициализация обработчика на изменения селекта с товарами
*/
function topSelectProduct() {
$('select#selected_product').on('change', updateTable);
}
/**
* Обновляем таблицу с торговыми предложениями,
* После выбора в селекте
* Или после сохранения цены
*/
function updateTable() {
var selected = $('select#selected_product').val();
if (!selected) return;
var data = {'productID': selected, 'action': 'getTable'};
// $(messContainer).empty();
customPost('/bitrix/admin/offersgroup.php', data, makeGroupTable, 'html');
}
/**
* Вставляет таблицу с торговыми группами по выбранному товару
* @param data
*/
function makeGroupTable(data) {
//очистим старые значения
$(containerTable).empty();
if (!data)
return;
$(containerTable).append(data);
var conflictsRow = $(containerTable).find('span[data-conflict=1]').closest('tr');
if (conflictsRow != undefined) {
$.each(conflictsRow, function (i, item) {
$(item).addClass('conflict-group');
});
}
initTableHandlers();
}
/**
* Инициализация обработчиков
*/
function initTableHandlers() {
//Поставим обработчик на форму
var row = $('table#tbl_offers_group');
$(row).on('click', function (event) {
event.preventDefault();
getForm();
});
//Обработчик добавить группу
addGroup();
}
/**
* Запрашивает данные по группе и вставляет в контейнер
*/
function getForm(groupID) {
if (!groupID) {
var row = $(event.target).closest('tr');
var spanWithID = $(row).find('span');
if (spanWithID.length == 0) return;
var groupID = $(spanWithID).attr('data-group-id');
}
if (!groupID) {
return;
}
var loadedForm = $(containerForm).find('input[name=groupID]').val();
if ((loadedForm !== undefined) && (loadedForm == groupID)) return;
var data = {'groupID': groupID, 'action': 'getExistsForm'};
customPost('/bitrix/admin/offersgroup_getForm.php', data, makeForm, 'html');
}
/**
* Запрашивает пустую форму для новой группы
*/
function addGroup() {
$(addGroupButton).on('click', function (event) {
event.preventDefault();
var productID = $('select#selected_product').val();
var products = [];
products.push(productID);
//todo: Поставить проверку на загруженную форму и прелоадер на загрузку
var data = {products: products, 'action': 'getNewForm'};
customPost('/bitrix/admin/offersgroup_getForm.php', data, makeForm, 'html');
});
}
function updateReference() {
enableButton(updateReferenceButton);
$(updateReferenceButton).on('click', function (event) {
event.preventDefault();
customPost('/bitrix/admin/offersgroup_getReference.php', {}, updateReferenceHandler, 'json');
});
}
function updateReferenceHandler(data) {
if (data == undefined || data.length == 0) {
return;
}
$.each(data, function (i, item) {
var select = 'select[data-name="' + i + '"]';
var options = $(select).find('option');
var referenceValue = {};
if (options.length > 0) {
$.each(options, function (i, item) {
referenceValue[$(item).val()] = $(item).text();
});
}
if (Object.keys(item).length > 0) {
$.each(item, function (iElement, iValue) {
if (!referenceValue[iElement]) {
var option = '<option value="' + iElement + '">' + iValue + '</option>';
$(select).append(option);
}
});
}
});
}
/**
* Вставляет форму по выбранной группе в контейнер
* @param data
*/
function makeForm(data) {
$(containerForm).empty();
if (!data)
return;
$(containerForm).append(data);
initFormSelect();
initFormButtonHandler();
updateReference();
}
/**
* Инцициализация плагинов для формы
*/
function initFormSelect() {
$(".js-custom-select").select2({});
$(form).on('change', changeForm);
}
/**
* Поиск конфликтов на изменение формы
* @param event
*/
function changeForm(event) {
//не обрабатываем изменение цены
if (event.target.name == 'PRICE') return;
// enableButton(saveGroupButton);
disableButton(setPriceButton);
var formData = getFormData();
customPost('/bitrix/admin/offersgroup_conflicts.php', formData, conflictResponse, 'json');
}
/**
* Обработка ответов на поиск конфликтов
* @param data
*/
function conflictResponse(data) {
//Конфликтов нет, активируем кнопку установки цены
if (!data) {
var li = $(form).find('li.conflict');
if (li.length > 0) {
$.each(li, function (i, itemID) {
$(itemID).removeClass('conflict');
});
}
//enablePriceButton();
return;
}
$.each(data, function (iResponse, itemResponse) {
$.each(itemResponse, function (iReference, itemReference) {
var divContainerLi = $('div#s2id_reference_' + iReference).find('li');
$.each(divContainerLi, function (i, itemID) {
var id = $(itemID).attr('data-id');
if (!id) return;
if (itemReference){
if (itemReference.indexOf(id) !== -1) {
$(itemID).addClass('conflict');
}
}
});
});
});
}
function enableButton(btnSelector) {
$(btnSelector).attr('disabled', false);
}
function disableButton(btnSelector) {
$(btnSelector).attr('disabled', true);
}
/**
* Инициализация обработчиков на кнопки в форме управления группой
*/
function initFormButtonHandler() {
$(saveGroupButton).on('click', beforeSave);
$(saveNewGroupButton).on('click', saveNewGroup);
$(delGroupButton).on('click', delGroup);
$(setPriceButton).on('click', setPrice);
}
/**
* Установка цены
* @param event
*/
function setPrice(event) {
event.preventDefault();
if ($(event.target).attr('disabled')) {
return;
}
var groupID = $(form).find('input[name="groupID"]').val();
var price = $(form).find('input[name="PRICE"]').val();
if (!groupID || !price) return;
var data = {
groupID: groupID,
price: price
};
cleanMessContainer();
console.log('setPrice data. ', data);
customPost('/bitrix/admin/offersgroup_setPrice.php', data, cycleSetPrice, 'json');
}
function cleanMessContainer() {
$(messContainer).empty();
$(messContainer).removeClass();
}
function cycleSetPrice(response) {
if (response && (response['next'] != null) && (response['next'] == true)) {
if (response['progress']) {
$(messContainer).html(response['progress']);
$(messContainer).removeClass('is-success-message');
}
$("body").addClass("overlay-image");
return customPost('/bitrix/admin/offersgroup_setPrice.php', {'next': true}, cycleSetPrice, 'json');
}
else {
$("body").removeClass("overlay-image");
responseHandler(response);
}
}
function delGroup(event) {
event.preventDefault();
var groupID = $(form).find('input[name="groupID"]').val();
return WebprofyOffersGroup.action.createModal(WebprofyOffersGroup.action.deleteGroup, groupID);
}
function saveNewGroup(event) {
event.preventDefault();
var action = $(event.target).attr('data-action');
var formData = getFormData();
var data = {
'data': formData,
'action': 'save-new-group'
};
customPost('/bitrix/admin/offersgroup_save.php', data, responseHandler, 'json');
}
function getFormData() {
var Selects = $(form).find('select');
var Data = {};
var minIndex, maxIndex, sizeSelectorName;
//Поиск значений формы
$.each(Selects, function (i, select) {
var selectCode = $(select).attr('data-name');
var selectName = $(select).attr('name').replace('[]', '');
var selectedNowValue = $(select).val();
if (selectCode.indexOf('SIZE') === -1) {
Data[selectName] = selectedNowValue;
}
else {
if (selectCode.indexOf('min') !== -1) {
minIndex = selectedNowValue;
sizeSelectorName = selectName;
}
else if (selectCode.indexOf('max') !== -1) {
maxIndex = selectedNowValue;
}
}
});
//Поиск размеров
if (sizeSelectorName != undefined) {
var options = $('select[name="' + sizeSelectorName + '"]').find('option');
var arSize = {}, arSelectSize = [], value, text;
//соберем массив ключ - id размера, -значение размера
$.each(options, function (i, item) {
value = $(item).val();
text = $(item).text();
arSize[value] = text;
});
var minValue = arSize[minIndex];
var maxValue = arSize[maxIndex];
$.each(arSize, function (i, item) {
if (item <= maxValue && item >= minValue) {
arSelectSize.push(i);
}
});
Data[sizeSelectorName] = arSelectSize;
}
//Поиск id групы, если есть
var groupID = $(form).find('input[name="groupID"]').val();
if (groupID != undefined) {
Data['groupID'] = groupID;
}
//Поиск цены
var price = $(form).find('input[name="PRICE"]').val();
if (price != undefined) {
Data['PRICE'] = price;
}
//Поиск чекбокса Активность
var active = $(form).find('input[name="active"]').prop('checked');
Data['active'] = active;
return Data;
}
/**
* Сохранение группы
* @param event
*/
function saveGroup(mode) {
var formData = getFormData();
var data = {
'data': formData,
'action': 'save-group'
};
if (mode !== undefined) {
data['mode'] = mode;
}
cleanMessContainer();
customPost('/bitrix/admin/offersgroup_save.php', data, cycleSave, 'json');
}
function cycleSave(response) {
if (response && (response['next'] != null) && (response['next'] == true)) {
$(messContainer).html(response.progress);
$(messContainer).removeClass('is-success-message');
$("body").addClass("overlay-image");
return customPost('/bitrix/admin/offersgroup_save.php', {'next': true}, cycleSave, 'json');
}
else {
$("body").removeClass("overlay-image");
responseHandler(response);
}
}
/**
* Перед сохранение проверим, не удалены ли свойства
* @param event
* @returns {*}
*/
function beforeSave(event) {
event.preventDefault();
//проверка активности группы
var active = $(form).find('input[name="active"]').prop('checked');
if (active === true) {
var Selects = $(form).find('select');
var Deleted = [];
$.each(Selects, function (i, select) {
var selectName = $(select).attr('data-name');
if (selectName.indexOf('SIZE') === -1) {
var selectedNowValue = $(select).val();
var selectedBefore = $(select).find('option[data-option="selected"]');
if (selectedBefore.length > 0) {
if (selectedNowValue == null) {
$.each(selectedBefore, function (i, option) {
var value = $(option).val();
Deleted.push(value);
});
} else {
$.each(selectedBefore, function (i, option) {
var value = $(option).val();
if (selectedNowValue.indexOf(value) === -1) {
Deleted.push(value);
}
});
}
}
}
else {
//поиск изменений для размеров
var selectedNowValue = $(select).val();
var selectedNowText = $(select).find('option[value="' + selectedNowValue + '"]').text();
var selectedBefore = $(select).find('option[data-option="selected"]').text();
if (selectedBefore.length > 0 && selectedNowValue.length > 0) {
if (selectName.indexOf('min') !== -1) {
if (selectedNowText > selectedBefore) {
Deleted.push(selectedNowValue);
}
} else if (selectName.indexOf('max') !== -1) {
if (selectedNowText < selectedBefore) {
Deleted.push(selectedNowValue);
}
}
}
}
});
//Есть удаленные элементы
if (Deleted.length > 0) {
return WebprofyOffersGroup.action.createModalDelProps(saveGroup);
}
}
//нет удаленных элементов
return saveGroup();
}
/**
* Обработка ответа
* @param data
*/
function responseHandler(data) {
console.log(data);
if (data == undefined || data.message == undefined) {
return;
}
cleanMessContainer();
if (data.groupID) {
getForm(data.groupID);
}
if (data.status == 'ok') {
$(messContainer).addClass('is-success-message');
} else {
$(messContainer).addClass('is-error-message');
}
updateTable();
$(messContainer).append(data.message);
}
})();
WebprofyOffersGroup.action = (function () {
var containerTable = 'div#offers-group__container';
return {
createModal: createModal,
activateGroup: activateGroup,
deleteGroup: deleteGroup,
deactivateGroup: deactivateGroup,
createModalDelProps: createModalDelProps,
};
/**
* Удаление группы/групп
* @param params
* @returns {*}
*/
function deleteGroup(params) {
params['action'] = 'deleteGroup';
if (!params['groupID']) {
var selected = getSelectedGroup();
if (selected.length == 0) return;
params['groupID'] = selected;
}
console.log(params);
return doAction(params);
}
/**
* Активация группы/групп
* @param params
* @returns {*}
*/
function activateGroup(groupID) {
var data = {
'action': 'activateGroup',
'mode': 'activate_offers'
};
if (groupID) {
data['groupID'] = [groupID];
} else {
var selected = getSelectedGroup();
if (selected.length == 0) return;
data['groupID'] = selected;
}
return doAction(data);
}
/**
* Деактивация группы/групп
* @param params
* @returns {*}
*/
function deactivateGroup(params) {
params['action'] = 'deactivateGroup';
if (!params['groupID']) {
var selected = getSelectedGroup();
if (selected.length == 0) return;
params['groupID'] = selected;
}
return doAction(params);
}
/**
* Сбор массива отмеченных чекбоксов
* @returns {Array}
*/
function getSelectedGroup() {
var input = $(containerTable).find('input[name^="ID"]');
var selected = [];
if (input !== undefined) {
$.each(input, function (i, item) {
if ($(item).attr('checked')) {
selected.push($(item).val());
}
});
}
return selected;
}
function checkActiveGroups() {
var inputs = $(containerTable).find('input[name^="ID"]');
var count = 0;
if (inputs !== undefined) {
$.each(inputs, function (i, item) {
if ($(item).attr('checked')) {
var row = $(item).closest('tr');
var active = $(row).find('input[name="active"]').val();
if (active > 0) {
count++;
}
}
});
}
return (count > 0) ? true : false;
}
function checkActiveGroup(groupID) {
var input = $(containerTable).find('input[value="' + groupID + '"]');
var row = $(input).closest('tr');
var active = $(row).find('input[name="active"]').val();
return (active > 0) ? true : false;
}
/**
* Формирование модального окна, для уточнения действий при удалении или деактивации группы/групп (из таблица)
* @param callback
* @param parametrID
*/
function createModal(callback, parametrID) {
if (!parametrID && !checkActiveGroups()) {
return callback({});
}
$("#dialog").dialog({
title: 'Выберите действие',
resizable: false,
height: 140,
width: 350,
modal: true,
buttons: {
"Удалить": function () {
$(this).dialog("close");
data = {};
if (parametrID) {
data['groupID'] = [parametrID];
}
data['mode'] = 'delete_offers';
return callback(data);
},
"Деактивировать": function () {
$(this).dialog("close");
data = {};
if (parametrID) {
data['groupID'] = [parametrID];
}
data['mode'] = 'deactivate_offers';
return callback(data);
},
"Не трогать": function () {
$(this).dialog("close");
data = {};
if (parametrID) {
data['groupID'] = [parametrID];
}
data['mode'] = 'skip_offers';
return callback(data);
},
},
open: function () {
$(this).siblings('.ui-dialog-buttonpane').find('button:eq(1)').focus();
}
});
}
/**
* Формируем диалог для выбора дополнительной опции при удалении свойств конкретной группы (из формы)
* @param callback
*/
function createModalDelProps(callback) {
$("#dialog").dialog({
title: 'Были удалены свойства',
resizable: false,
height: 140,
width: 350,
modal: true,
buttons: {
"Удалить": function () {
$(this).dialog("close");
return callback('delete_offers');
},
"Деактивировать": function () {
$(this).dialog("close");
return callback('deactivate_offers');
},
"Не трогать": function () {
$(this).dialog("close");
return callback('skip_offers');
},
},
open: function () {
$(this).siblings('.ui-dialog-buttonpane').find('button:eq(1)').focus();
}
});
}
/**
* Выполяем ajax запрос параметрами
* @param data
*/
function doAction(data) {
WebprofyOffersGroup.customPost('/bitrix/admin/offersgroup_action.php', data, WebprofyOffersGroup.responseHandler, 'json');
}
})();
WebprofyOffersGroup.saveProperty = (function () {
var formName = 'form#saveProperty'
var messContainer = 'div#message-block';
return {
init: init,
};
function init() {
$(formName).on('submit', function (event) {
event.preventDefault();
var data = $(formName).serialize();
WebprofyOffersGroup.customPost('/bitrix/admin/offersgroup_saveProperty.php', data, responseHandler, 'json');
});
}
function responseHandler(data) {
if (data == undefined || data.message == undefined) {
return;
}
if (data.status == 'ok') {
$(messContainer).addClass('is-success-message');
} else {
$(messContainer).addClass('is-error-message');
}
$(messContainer).append(data.message);
}
})();
$(document).ready(function () {
WebprofyOffersGroup.init();
});