protected/modules/feedback/views/assets/js/feedback.js

Summary

Maintainability
C
1 day
Test Coverage
'use strict';

// Опредедяем объект:
var listCell = {};

// Настраиваем инициализатор:
listCell.init = function () {
    // Запоминаем текущий объект,
    // так как он не доступен внутри
    // других методов:
    var self = this,
    // Объект нашего listView:
        parent = undefined,
    // Объект loader:
        loader = undefined,
    // Текущий элемент:
        curentItem = undefined;

    // Объявляем нужные обработчики:
    self.prepare = function () {
        // Обработчик для кнопок управления записями:
        $(document).on('click', '.list-cell [data-action]', function () {
            listCell.buttons($(this));
        });

        // Обработчик submit-а формы:
        $(document).on('submit', '.ajax-form', function () {
            // Запоминаем объект формы:
            var form = $(this);

            // Отключаем дефолтное событие:
            event.preventDefault();

            // Обрабатываем Ajax-запрос:
            $.post(form.attr('action'), form.serialize())
                .done(function (response) {
                    form.closest('.modal').modal('hide');
                    self.update();

                    // Если нам вернули форму - значит есть ошибки:
                    if (response.data.html !== undefined) {
                        self.answerForm(response, self.currentItem);
                    } else {
                        bootbox.alert(response.data.message);
                    }
                })
                .fail(function () {
                    // Выполняем при ошибке.
                })
                .always(function () {
                    // Всегда выполняется.
                });
        });

        $(document).on("hide", '.modal', function () {
            var modal = $(this);
            setTimeout(function () {
                modal.remove();
            }, 500);

        });
    };

    // Обработчики action'ов:
    self.buttons = function (item) {
        var callback,
            confirm = undefined;

        // Получаем родителя:
        self.parent = item.closest('.list-view');

        // Сбрасываем текущий элемент:
        self.currentItem = item;

        // Получаем loader-элемент:
        self.loader = item.closest('.list-cell').find('.loader');

        console.log(item.data('action'), item);

        // Определяем callback:
        switch (item.data('action')) {
            case 'toggle-faq':
                callback = self.toggleFaq;
                break;
            case 'delete':
                callback = self.delete;
                break;
            case 'answer':
                callback = self.answer;
                break;
            case 'show':
                callback = self.show;
                break;

            // Если действие нам неизвестно:
            default:
                return null;
        }

        // Если необходимо спрашиваем подтверждение:
        if ((confirm = item.data('confirm')) !== undefined) {
            bootbox.confirm(confirm, function (result) {
                // При положительном результате - запускаем callback:
                if (result) return callback(item);
            })
        } else {
            callback(item);
        }
    };

    // Обновляем listView:
    self.update = function () {
        $.fn.yiiListView.update(self.parent.attr('id'));
    }

    // Основной Ajax-обработчик:
    self.postWithUpdate = function (item) {
        // Показываем процесс выполнения:
        self.loader.show();

        var response = undefined;

        // Запускаем AJAX-зарос:
        $.ajax({
            url: item.data('url'),
            data: item.data('params'),
            async: item.data('return') == undefined,
            type: 'POST'
        }).done(function (data) {
            self.update();

            // Если необходимо, возвращаем данные:
            if (item.data('return')) {
                response = data;
            }
        }).fail(function () {
            bootbox.alert(self.parent.data('failMessage'));
        }).always(function () {
            self.loader.hide();
        });

        // Если необходимо, возвращаем данные:
        if (item.data('return')) {
            return response;
        }
    }

    // Просмотр сообщения:
    self.show = function (item) {
        var response = self.postWithUpdate(item),
            modal = $('<div class="modal hide fade"></div>');

        if (response.result) {
            modal.append('<div class="modal-header"><h4>' + item.data('title') + '</h4></div>');
            modal.append('<div class="modal-body">' + response.data.html + '</div>');
            modal.modal('show');
        } else {
            bootbox.confirm(response.data.message);
        }
    };

    // Метод отрисовки формы ответа:
    self.answerForm = function (response, item) {
        var modal = $('<div class="modal hide fade"></div>');

        if (response.result) {
            modal.append('<div class="modal-header"><h4>' + item.data('title') + '</h4></div>');
            modal.append('<div class="modal-body">' + response.data.html + '</div>');
            modal.modal('show').css({width: '600px'});

            setTimeout(function () {
                $('.answer-text').redactor();
            }, 300);
        } else {
            bootbox.alert(response.data.message);
        }
    }

    // Метож для ответа пользователю:
    self.answer = function (item) {
        var response = self.postWithUpdate(item);

        self.answerForm(response, item);
    };

    // Метод удаления записи:
    self.delete = function (item) {
        return self.postWithUpdate(item);
    };

    // выполняем toggle-faq (добавляем/удаляем сообщение в FAQ):
    self.toggleFaq = function (item) {
        return self.postWithUpdate(item);
    };

    // Включаем обработчики:
    self.prepare();
};

// Инициализация:
jQuery(document).ready(function ($) {

    // Инициализируем наш объект:
    listCell.init();

});