Your IP : 3.146.105.252


Current Path : /home/bitrix/ext_www/home-comfort.in.ua/bitrix/js/webprofy.offersgroup/
Upload File :
Current File : /home/bitrix/ext_www/home-comfort.in.ua/bitrix/js/webprofy.offersgroup/offersgroup.js

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();
});