lexeme-view.js 9.13 KB
/* global $dj, slickgrid, edit, Slick */

var text_ops = ['eq', 'ne', 'bw', 'bn', 'ew', 'en', 'cn', 'nc', 're', 'nr'];
var eqne = ['eq', 'ne'];
var count_ops = ['eq', 'ge', 'le'];

var extra_attr_filter_fields = {};

$.each($dj.extra_attributes, function(i, attr) {
    "use strict";
    var filter_field = {
        name: 'Atrybut: ' + attr.name,
        gender: 'm'
    };
    if (attr.closed) {
        filter_field.ops = eqne;
        filter_field.options = attr.options;
    } else
        filter_field.ops = text_ops;
    extra_attr_filter_fields['extra-' + attr.id] = filter_field;
});

$(function() {
    "use strict";
    $(document).on('click', '.cr-link', function() {
        var id = parseInt(this.id.substr(2), 10);
        slickgrid.row_index(id);
    });

    if ($dj.visible_vocabularies.length === 0) {
        $('#no-vocabs-dialog').dialog({modal: true});
    }
    $('#search-by-form-dialog').dialog({
        autoOpen: false,
        width: 'auto',
        height: 'auto',
        modal: false
    });
    $(document).on('click', '.search-by-form-row', function() {
        var row = $(this).data('row');
        slickgrid.set_active_when_loaded = row;
        slickgrid.grid.scrollRowToCenter(row);
        slickgrid.ensure_data();
    });
});

var visible_vocab_ids = $.map($dj.visible_vocabularies, function(vocab) {
    "use strict";
    return vocab[0];
});

$.extend(slickgrid, {
    loader: new Slick.Data.RemoteModel(
        $dj.ajax_get_page, $dj.ajax_search_index,
        {visible_vocabs: visible_vocab_ids}),
    grid_caption: "Leksemy",
    grid_element_id: 'lexeme-grid',
    main_field: 'entry',
    initial_columns: $dj.initial_columns,
    initial_sort_rules: ['a_fronte'],
    all_columns: {
        id: {id: "id", name: "Nr", field: "id"},
        entry: {id: "entry", name: "Hasło", field: "entry"},
        pos: {id: "pos", name: "Część mowy", field: "pos"},
        patterns: {id: "patterns", name: "Wzory", field: "patterns"},
        genders: {id: "genders", name: "Rodzaj/aspekt", field: "genders"},
        vocabs: {id: "vocabs", name: "Słowniki", field: "vocabs"},
        owner: {id: "owner", name: "Sł. właściciel", field: "owner"},
        status: {id: "status", name: "Status", field: "status"},
        qualifiers: {id: "qualifiers", name: "Kwal.", field: "qualifiers"}
    },
    filter_fields: $.extend({
        entry: {name: 'Hasło', gender: 'n', ops: text_ops},
        part_of_speech: {
            name: 'Część mowy',
            gender: 'f',
            ops: eqne,
            options: $dj.parts_of_speech
        },
        pattern_name: {name: 'Wzór', gender: 'm', ops: text_ops},
        pattern_count: {name: 'Liczba wzorów', gender: 'f', ops: count_ops},
        pattern_type: {
            name: 'Typ wzoru',
            gender: 'm',
            ops: eqne,
            optgroups: $dj.pattern_type_options
        },
        gender: {
            name: 'Rodzaj',
            gender: 'm',
            ops: eqne,
            options: $dj.gender_options
        },
        gender_count: {name: 'Liczba rodzajów', gender: 'f', ops: count_ops},
        form: {name: 'Forma', gender: 'f', ops: text_ops},
        containing_vocabulary: {
            name: 'Słownik',
            gender: 'm',
            ops: eqne,
            options: $dj.visible_vocabularies
        },
        owner_vocabulary: {
            name: 'Słownik właściciel',
            gender: 'm',
            ops: eqne,
            options: $dj.visible_vocabularies
        },
        status: {
            name: 'Status',
            gender: 'm',
            ops: eqne,
            options: $dj.status_options
        },
        comment: {name: 'Komentarz', gender: 'm', ops: text_ops},
        lexeme_qualifier: {
            name: 'Kwal. leksemu',
            gender: 'm',
            ops: eqne,
            options: $dj.lexeme_qualifier_options
        },
        lip_qualifier: {
            name: 'Kwal. odmieniasia',
            gender: 'm',
            ops: eqne,
            options: $dj.form_qualifier_options
        },
        qualifier: {
            name: 'Kwal. przy dow. formie',
            gender: 'm',
            ops: eqne,
            options: $dj.qualifier_options
        },
        classification_value: {
            name: 'Wartość klasyfikacji',
            gender: 'f',
            ops: eqne,
            options: $dj.cv_options
        },
        cr_type: {
            name: 'Typ odsyłacza',
            gender: 'm',
            ops: eqne,
            options: $dj.cr_type_options
        },
        responsible: {
            name: 'Autor ostatniej zmiany',
            gender: 'm',
            ops: eqne,
            options: $dj.user_options
        }
    }, extra_attr_filter_fields),

    load_content: function(id, is_created) {
        "use strict";
        function check() {
            var active_id = slickgrid.active_id();
            return active_id === undefined || id === active_id;
        }
        edit.busy_on();
        edit.load_content(id, is_created, check);
    },

    update_sort_button: function(sort_rules) {
        "use strict";
        var icon = $('#sort-button').find('.ui-icon');
        var a_fronte = sort_rules[0] === 'a_fronte';
        if (a_fronte) {
            icon.removeClass('ui-icon-sort-atergo').addClass('ui-icon-sort');
        } else {
            icon.removeClass('ui-icon-sort').addClass('ui-icon-sort-atergo');
        }
        var entry_index = slickgrid.grid.getColumnIndex('entry');
        if (entry_index !== undefined) {
            var columns = slickgrid.grid.getColumns();
            if (a_fronte)
                columns[entry_index].cssClass = '';
            else
                columns[entry_index].cssClass = 'atergo';
            slickgrid.grid.setColumns(columns);
        }
    },

    row_index: function(id) {
        "use strict";
        $.ajaxJSON({
            url: $dj.ajax_row_index,
            method: 'get',
            data: {
                id: id,
                sort_rules: slickgrid.loader.getSort(),
                filter: slickgrid.loader.getFilter(),
                visible_vocabs: visible_vocab_ids
            },
            callback: function(data) {
                var index = data.index;
                if (index === null) {
                    slickgrid.load_content(id);
                    slickgrid.last_active_row = undefined;
                    slickgrid.grid.resetActiveCell();
                } else {
                    slickgrid.set_active_when_loaded = index;
                    slickgrid.grid.scrollRowToCenter(index);
                    slickgrid.ensure_data();
                }
            }
        });
    },

    init_sort: function() {
        "use strict";
        var sort_rules = slickgrid.loader.getSort();
        slickgrid.update_sort_button(sort_rules);
        $('#sort-button').click(function() {
            if (sort_rules[0] === 'a_fronte')
                sort_rules[0] = 'a_tergo';
            else
                sort_rules[0] = 'a_fronte';
            slickgrid.update_sort_button(sort_rules);
            var active_id = slickgrid.active_id();
            slickgrid.loader.setSort(sort_rules);
            if (active_id)
                slickgrid.row_index(active_id);
        });
    },
    init: function() {
        "use strict";
        $('#lexeme-tabs').on('tabsactivate', function(e, ui) {
            if (ui.newPanel.html() === '') {
                edit.load_tab(ui.newPanel.attr('id'), edit.get_id());
            }
        });
    },

    search_enter: function() {
        // lista leksemów z daną formą
        "use strict";
        if ($dj.ajax_search_by_form) {
            $.ajaxJSON({
                url: $dj.ajax_search_by_form,
                method: 'get',
                data: {
                    filter: slickgrid.loader.getFilter(),
                    sort_rules: slickgrid.loader.getSort(),
                    exponent: slickgrid.search_string(),
                    visible_vocabs: visible_vocab_ids
                },
                callback: function(data) {
                    var table = $('#search-by-form-table');
                    table.empty();
                    if (data.rows.length === 0) {
                        slickgrid.search();
                        return;
                    }
                    if (data.rows.length === 1) {
                        var row = data.rows[0].row;
                        slickgrid.cancel_search = true;
                        slickgrid.set_active_when_loaded = row;
                        slickgrid.grid.scrollRowToCenter(row);
                        slickgrid.ensure_data();
                        return;
                    }
                    $.each(data.rows, function(i, row) {
                        // row: entry, id, pos, row
                        var tr = $('<tr/>');
                        tr.addClass('search-by-form-row').data('row', row.row);
                        tr.append('<td>' + row.entry + '</td>');
                        tr.append('<td>' + row.pos + '</td>');
                        table.append(tr);
                    });
                    $('#search-by-form-dialog').dialog('open');
                }
            });
        } else {
            slickgrid.search();
        }
    }
});