pattern-edit.js 7.76 KB
/* global $dj, edit, common, slickgrid, gettext, ngettext, interpolate */

var deleted;

var new_row_counter = 1; // potrzebne tylko dla niepowtarzalności idów
function get_new_row_html() {
    "use strict";
    var new_row_html = $.ajax({
        type: 'get',
        url: $dj.ajax_new_ending_row,
        data: {pattern_id: slickgrid.get_id()},
        async: false // w zasadzie się tak nie powinno robić
    }).responseText;
    var row_html = new_row_html.replace(/NUM/g, new_row_counter.toString());
    new_row_counter++;
    return row_html;
}

$.extend(edit, {
    form_id: 'pattern-edit-form',
    form_cancel_class: 'pattern-edit-cancel',
    form_submit_class: 'pattern-edit-submit',

    init_form_widgets: function() {
        "use strict";
        $(document).on('click', 'span.remove', function () {
            var li = $(this).closest('li');
            var name = li.find('input')[0].id;
            if (name.split('-')[1] !== 'add')
                deleted.push(name.split('-')[1]);
            li.remove();
            edit.show_changed();
        });
        $(document).on('click', '.add-ending', function () {
            var id = $('input[name=id]', $(this).closest('form')).value();
            var new_row = $(get_new_row_html());
            var this_group = $(this).closest('tr').find('.ending-group');
            this_group.append(new_row);
            edit.qualifier_select(this_group.find('.qualifiers').last());
            edit.show_changed();
        });
        $('#edit').on('scroll', function() {
            if (common.multiselect_is_open) {
                $(this).find('select[multiple]').multiselect2('close');
            }
        });
        $('#add-button').click(add_pattern);
        $('#clone-pattern-button').on('click', function() {
            clone_pattern();
            $('#more-actions-dialog').dialog('close');
        });
        $(document).on('change', '#id_type', function () {
            var $t = $(this);
            var old_bfls = $dj.base_form_labels[common.previous_value($t)];
            var new_bfls = $dj.base_form_labels[$t.val()];
            var stale_bfls = [], fresh_bfls = [];
            var confirmed;
            $.each(old_bfls, function(i, bfl) {
                if (new_bfls.indexOf(bfl) === -1)
                    stale_bfls.push(bfl);
            });
            $.each(new_bfls, function(i, bfl) {
                if (old_bfls.indexOf(bfl) === -1)
                    fresh_bfls.push(bfl);
            });
            if (stale_bfls.length > 0) {
                var fmt = ngettext(
                    "Etykieta: %s zostanie usunięta.",
                    "Etykiety: %s zostaną usunięte.", stale_bfls.length);
                var bfl_symbols = $.map(
                    stale_bfls, function(bfl_id) {
                        return $dj.bfl_symbols[bfl_id];
                    });
                confirmed = window.confirm(
                    interpolate(fmt, [bfl_symbols.join(', ')]) +
                    ' ' + gettext("Kontynuować?"));
                if (!confirmed) {
                    common.revert_selection($t);
                }
            }
            if (confirmed || stale_bfls.length === 0) {
                common.confirm_selection($t);
                reload_endings(stale_bfls, fresh_bfls);
            }
        });
    },

    load_content: function(id, is_created, check_callback) {
        "use strict";
        $.ajaxJSON({
            method: 'get',
            url: $dj.ajax_edit_form,
            dest: $('#edit'),
            data: {id: id},
            callback: function () {
                edit.form_init();
                edit.created = Boolean(is_created);
            },
            check_callback: check_callback
        });
        $.ajaxJSON({
            method: 'get',
            url: $dj.ajax_pattern_preview,
            dest: $('#preview'),
            data: {id: id},
            check_callback: check_callback
        });
        $.ajaxJSON({
            method: 'get',
            url: $dj.ajax_history_table,
            dest: $('#history'),
            data: {pattern_id: id},
            check_callback: check_callback
        });
        edit.active_id = id;
    },

    form_init: function() {
        "use strict";
        $('button', '#edit').button();
        $('#ending-list.editable').find('.ending-group').sortable().sortable({
            change: function () {
                edit.show_changed();
            }
        });
        //$('#ending-list').disableSelection();
        edit.qualifier_select($('#ending-list').find('.qualifiers'));
        deleted = [];
        common.init_selection($('#id_type'));
        edit.hide_changed();
        edit.busy_off();
    },

    form_submit: function(form_data) {
        "use strict";
        form_data.push({name: 'deleted', value: deleted});
        deleted = [];
        var ending_list = [];
        var rows = $('#ending-list').find('tr');
        $.each(rows, function (i, row) {
            var label = $(row).find('td:eq(0) strong').html();
            var endings = [];
            $(row).find('td:eq(1) input').map(function (i, input) {
                var id_parts = $(input).attr('id').split('-');
                var id = id_parts[1], q_id;
                if (id === 'add')
                    q_id = '#id_add-' + id_parts[2] + '-qualifiers';
                else
                    q_id = '#id_end' + id + '-qualifiers';
                endings.push({
                    id: id,
                    string: $(input).val(),
                    qualifiers: $(q_id).val() || []
                });
            });
            ending_list.push({base_form_label: label, endings: endings});
        });
        form_data.push({name: 'ending_list', value: ending_list});
        edit.busy_on();
        var result = $.ajaxJSON({
            method: 'post',
            url: $dj.ajax_update_pattern,
            data: {
                form_data: form_data
            },
            description: gettext("Zapisanie zmian"),
            callback: function () {
                edit.hide_changed();
                // odświeżyć?
                edit.load_content(slickgrid.get_id());
            },
            error_callback: function (xhr, status, error) {
                common.error_alert(status + ': ' + error);
                edit.cleanup();
            },
            bad_data_callback: function () {
                edit.cleanup();
                return true;
            }
        });
        if (result === false) {
            edit.cleanup();
        }
    }
});

function add_pattern() {
    "use strict";
    $.ajaxJSON({
        method: 'post',
        url: $dj.ajax_create_pattern,
        data: {},
        description: gettext("Utworzenie wzoru"),
        callback: function(data) {
            edit.load_content(data.id, true);
        }
    });
}

function clone_pattern() {
    "use strict";
    $.ajaxJSON({
        method: 'post',
        url: $dj.ajax_clone_pattern,
        data: {pattern_id: slickgrid.get_id()},
        descripton: gettext("Sklonowanie wzoru"),
        callback: function(data) {
            slickgrid.reload_data();
            slickgrid.row_index(data.new_id);
        }
    });
}

function reload_endings(stale_bfls, fresh_bfls) {
    "use strict";
    // skasować nieświeże zakończenia
    $.each(stale_bfls, function(i, bfl_id) {
        var bfl_row = $('[data-bfl-id='+bfl_id+']');
        bfl_row.find('.ending-row').each(function() {
            $(this).find('span.remove').click();
        });
        bfl_row.remove();
    });
    $.each(fresh_bfls, function(i, bfl_id) {
        // dodać wiersz w tabelce
        $.ajaxJSON({
            method: 'get',
            url: $dj.ajax_new_ending_table_row,
            data: {bfl_id: bfl_id},
            callback: function(data) {
                $('#ending-list').prepend(data.html);
            }
        });
    });
}