PageSourceSearch

https://sgjp.pl/static/js/slickgrid.js?1773928782

js sgjp.pl collected 2026-09-24 19:14:13 UTC 24,139 bytes, 726 lines download raw bytes

1/* global $dj, Slick, edit, layout, common, getBusyOverlay, gettext */
2
3var slickgrid = (function() {
4    "use strict";
5    return {
6        loader: new Slick.Data.RemoteModel(
7            $dj.ajax_get_page, $dj.ajax_search_index),
8        grid: undefined,
9        set_active_when_loaded: undefined,
10        skip_cell_changed: false,
11        last_active_row: undefined,
12        last_search: undefined,
13
14        op_names: {
15            eq: gettext("equal to"),
16            in: gettext("equal to"),
17            ne: gettext("not equal to"),
18            '-in': gettext("not equal to"),
19            belongs: gettext("belongs to"),
20            '-belongs': gettext("doesn't belong to"),
21            eqcnt: gettext("equal to"),
22            le: gettext("less than"),
23            ge: gettext("greater than"),
24            bw: gettext("starts with"),
25            bn: gettext("doesn't start with"),
26            ew: gettext("ends with"),
27            en: gettext("doesn't end with"),
28            cn: gettext("contains"),
29            nc: gettext("doesn't contain"),
30            re: gettext("matched by pattern"),
31            nr: gettext("not matched by pattern")
32        },
33
34        search_string: function () {
35            return $('#text-search').val();
36        },
37
38        set_active: function (index, load) {
39            if (load && edit.changed && !edit.confirm_discard()) {
40                return;
41            }
42
43            if (slickgrid.grid.getData().length > 0) {
44                slickgrid.skip_cell_changed = true;
45                slickgrid.grid.setActiveCell(index, 0);
46                slickgrid.skip_cell_changed = false;
47                slickgrid.last_active_row = index;
48                if (load) {
49                    slickgrid.load_content(slickgrid.active_id());
50                }
51            } else
52                slickgrid.last_active_row = undefined;
53        },
54
55        active_id: function () {
56            var cell = slickgrid.grid.getActiveCell();
57            if (cell === null || cell === undefined)
58                return undefined;
59            var row = slickgrid.grid.getActiveCell().row;
60            if (row === undefined)
61                return undefined;
62            if (slickgrid.grid.getDataItem(row) === undefined)
63                return undefined;
64            return slickgrid.grid.getDataItem(row).id;
65        },
66
67        get_id: function () {
68            return edit.active_id;
69        },
70
71        search_counter: 0,
72
73        scroll_search: function () {
74            if (slickgrid.search_string() === slickgrid.last_search)
75                return;
76            slickgrid.last_search = slickgrid.search_string();
77            slickgrid.search_counter++;
78            //slickgrid.loader.onDataLoading.notify();
79            slickgrid.loader.searchRow(
80                function (row) {
81                    slickgrid.set_active_when_loaded = row;
82                    slickgrid.grid.scrollRowToCenter(row);
83                    slickgrid.loading_off();
84                });
85        },
86
87        search: function () {
88            slickgrid.scroll_search();
89        },
90
91        search_enter: function () {
92            slickgrid.search();
93        },
94
95        row_index: function (id) {
96            $.ajaxJSON({
97                url: $dj.ajax_row_index,
98                method: 'get',
99                data: {
100                    id: id,
101                    query_params: slickgrid.query_params()
102                },
103                callback: function (data) {
104                    var index = data.index;
105                    if (index === null) {
106                        slickgrid.load_content(id);
107                        slickgrid.last_active_row = undefined;
108                        slickgrid.grid.resetActiveCell();
109                    } else {
110                        slickgrid.set_active_when_loaded = index;
111                        slickgrid.grid.scrollRowToCenter(index);
112                        slickgrid.ensure_data();
113                    }
114                }
115            });
116        },
117
118        ensure_data: function () {
119            var filter_button = $('#filter-button');
120            filter_button.children().first().toggleClass('ui-state-highlight',
121                slickgrid.loader.getFilter().rules.length !== 0);
122            filter_button.toggleClass(
123                'menu-button-active',
124                slickgrid.loader.getFilter().rules.length !== 0);
125            var vp = slickgrid.grid.getViewport();
126            slickgrid.loader.ensureData(vp.top, vp.bottom);
127        },
128
129        reload_data: function () {
130            var vp = slickgrid.grid.getViewport();
131            slickgrid.loader.reloadData(vp.top, vp.bottom);
132        },
133
134        title_part: function () {
135            return slickgrid.grid_caption;
136        },
137
138        refresh_title: function () {
139            var num = slickgrid.grid.getDataLength();
140            document.title = slickgrid.title_part() +
141                ' – SGJP (' + num + ' ' + slickgrid.counter(num) + ')';
142        },
143
144        saved_filters: function () {
145            return $.parseJSON(
146                localStorage.getItem(slickgrid.storage_filters_key)) || {};
147        },
148
149        update_saved_filters: function (filters) {
150            localStorage.setItem(
151                slickgrid.storage_filters_key, $.toJSON(filters));
152        }
153    };
154})();
155
156var options = {
157    editable: false,
158    enableAddRow: false,
159    enableCellNavigation: true,
160    forceFitColumns: true
161};
162
163function set_columns() {
164    "use strict";
165    var column_list_val = $('#column-list').val();
166    if (!column_list_val)
167        column_list_val = [];
168    var chosen_column_ids = [slickgrid.main_field]
169        .concat(column_list_val);
170    var chosen_columns = columns_from_ids(chosen_column_ids);
171    slickgrid.grid.setColumns(chosen_columns);
172    if (slickgrid.update_sort_button) {
173        slickgrid.update_sort_button(slickgrid.loader.getSort());
174    }
175    // slickgrid.grid.autosizeColumns();
176    slickgrid.loader.setColumns(chosen_column_ids);
177    var column_names = $.map(
178        slickgrid.grid.getColumns(), function (col) {return col.name;});
179    $('#columns').text(column_names.join(', '));
180    slickgrid.reload_data();
181}
182
183function columns_from_ids(column_ids) {
184    "use strict";
185    return $.map(column_ids, function(id) {
186        return slickgrid.all_columns[id];
187    });
188}
189
190function update_filter_row(row) {
191    "use strict";
192    var field = row.find('.rule-field').val();
193    var field_info = slickgrid.filter_fields[field];
194    var op_select = $('<select/>').addClass('rule-op');
195    var value_input;
196    $.each(field_info.ops, function(i, op) {
197        var op_name;
198        var op_name_info = slickgrid.op_names[op];
199        if (op_name_info.indexOf('|') !== -1) {
200            var gender = 'mfn'.indexOf(field_info.gender);
201            op_name = op_name_info.split('|')[gender];
202        } else {
203            op_name = op_name_info;
204        }
205        $('<option/>').text(op_name).val(op).appendTo(op_select);
206    });
207    if (field_info.options) {
208        value_input = $('<select/>').addClass('rule-data');
209        value_input.prop('multiple', true);
210        $.each(field_info.options, function(i, option) {
211            $('<option/>').text(option[1]).val(option[0]).appendTo(value_input);
212        });
213    } else if (field_info.optgroups) {
214        value_input = $('<select/>').addClass('rule-data');
215        value_input.prop('multiple', true);
216        $.each(field_info.optgroups, function(i, optgroup) {
217            var group = $('<optgroup/>').attr('label', optgroup[0]);
218            $.each(optgroup[1], function(i, option) {
219                $('<option/>').text(option[1]).val(option[0]).appendTo(group);
220            });
221            value_input.append(group);
222        });
223    } else if (field_info.sel) {
224        value_input = $('<select/>').addClass('rule-data');
225        value_input.prop('multiple', false);
226        $.each(field_info.sel, function(i, option) {
227            $('<option/>').text(option[1]).val(option[0]).appendTo(value_input);
228        });
229    } else {
230        value_input = $('<input/>').attr('type', 'text');
231        value_input.addClass('rule-data');
232    }
233    row.children().eq(1).empty().append(op_select);
234    row.children().eq(2).empty().append(value_input);
235    if (!op_select.data('uiSelectmenu')) {
236        op_select.selectmenu();
237    }
238    if (field_info.options || field_info.optgroups) {
239        value_input.multiSelect();
240    }
241    if (field_info.sel) {
242        value_input.selectmenu();
243    }
244}
245
246function add_filter_rule(field) {
247    "use strict";
248    var filter_table = $('#filter-table');
249    var row = $('<tr/>');
250    var field_select = $('<select/>').addClass('rule-field');
251
252    $.each(slickgrid.filter_fields, function(id, filter_field) {
253        var option = $('<option/>').text(filter_field.name).val(id);
254        if (id === field) {
255            option.prop('selected', true);
256        }
257        option.appendTo(field_select);
258    });
259    $('<td/>').append(field_select).appendTo(row);
260    row.append($('<td/>')).append($('<td/>'));
261    var remove_button = $('<input/>').attr('type', 'button').val('-')
262        .addClass('remove-filter');
263    $('<td/>').append(remove_button).appendTo(row);
264    filter_table.append(row);
265    update_filter_row(row);
266    if ($.fn.selectmenu) {
267        row.find('select').not('[multiple]').each(function () {
268            var $t = $(this);
269            if (!$t.data('uiSelectmenu'))
270                $t.selectmenu();
271        });
272    }
273    row.find('.remove-filter').button();
274    return row;
275}
276
277function get_filter() {
278    "use strict";
279    return {
280        group_op: $('#group-op').val(),
281        rules: $('#filter-table').find('tr').map(function(i, row) {
282            var $row = $(row);
283            return {
284                'field': $row.find('.rule-field').val(),
285                'op': $row.find('.rule-op').val(),
286                'data': $row.find('.rule-data').val()
287            };
288        }).toArray()
289    };
290}
291
292function save_filter() {
293    "use strict";
294    var filter_name = window.prompt("Wybierz nazwę filtru do zapisania");
295    if (filter_name) {
296        var filter_params = get_filter();
297        if (edit.reader) {
298            if (common.storage_present() && slickgrid.storage_filters_key) {
299                var saved_filters = slickgrid.saved_filters();
300                if (!saved_filters)
301                    saved_filters = {};
302                if (!saved_filters[filter_name] || window.confirm(
303                        "Filtr o tej nazwie już istnieje. Nadpisać?")) {
304                    saved_filters[filter_name] = filter_params;
305                }
306                slickgrid.update_saved_filters(saved_filters);
307            }
308        } else {
309            var post_data = {
310                name: filter_name,
311                serialized_filter: $.toJSON(filter_params),
312                grid_id: slickgrid.grid_id
313            };
314            var save_filter_params = {
315                method: 'post',
316                url: $dj.ajax_save_filter,
317                data: post_data,
318                description: 'Zapisanie filtru'
319            };
320            $.ajaxJSON($.extend(save_filter_params, {
321                callback: function (data) {
322                    if (data.exists && window.confirm(
323                            "Filtr o tej nazwie już istnieje. Nadpisać?")) {
324                        $.ajaxJSON($.extend(save_filter_params, {
325                            data: $.extend(post_data, {force: true})
326                        }));
327                    }
328                }
329            }));
330        }
331    }
332    return false;
333}
334
335function put_filter(filter_params) {
336    "use strict";
337    $('#group-op').val(filter_params.group_op);
338    $('#filter-table').empty();
339    var filter_dialog = $('#choose-filter-dialog');
340    var filter_is_open = filter_dialog.dialog('isOpen');
341    $.each(filter_params.rules, function(i, rule) {
342        if (!filter_is_open)
343            filter_dialog.dialog('open');
344        var row = add_filter_rule(rule.field);
345        if (!filter_is_open)
346            filter_dialog.dialog('close');
347        if ($.fn.selectmenu)
348            row.find('.rule-op').selectmenu('value', rule.op);
349        else
350            row.find('.rule-op').val(rule.op);
351        var data_input = row.find('.rule-data');
352        data_input.val(rule.data);
353        if (data_input.is('select[multiple]')) {
354            data_input.multiselect2('refresh');
355        }
356    });
357}
358
359function filter_choice(filters) {
360    "use strict";
361    var list = $('#filter-list');
362    list.empty();
363    $.each(filters, function (i, filter) {
364        var item = $('<li/>').addClass('ui-state-default');
365        if (filter.id)
366            item.attr('id', filter.id);
367        var delete_button = $('<span/>')
368            .addClass('remove ui-icon ui-icon-closethick');
369        delete_button.click(function () {
370            if (window.confirm('Usunąć filtr "' + filter.name + '"?')) {
371                if (edit.reader && slickgrid.storage_filters_key) {
372                    var saved_filters = slickgrid.saved_filters();
373                    delete saved_filters[filter.name];
374                    slickgrid.update_saved_filters(saved_filters);
375                    item.remove();
376                } else {
377                    $.ajaxJSON({
378                        method: 'post',
379                        url: $dj.ajax_delete_filter,
380                        data: {id: filter.id},
381                        description: 'Usunięcie filtru',
382                        callback: function () {
383                            item.remove();
384                        }
385                    });
386                }
387            }
388            return false;
389        });
390        item.append(delete_button);
391        item.append(filter.name);
392        item.click(function () {
393            put_filter(filter.params);
394            $("#load-filter-dialog").dialog('close');
395        });
396        list.append(item);
397    });
398    $("#load-filter-dialog").dialog('open');
399}
400
401function apply_filter(filter, reload) {
402    "use strict";
403    if (reload === undefined) reload = true;
404    $('#text-search').text('');
405    slickgrid.loader.setFilter(filter || get_filter(), reload);
406    slickgrid.set_active_when_loaded = 0;
407    slickgrid.grid.scrollRowToTop(0);
408    slickgrid.ensure_data();
409}
410
411$(function() {
412    "use strict";
413    var columns = $dj.columns || slickgrid.initial_columns;
414    slickgrid.last_search = slickgrid.search_string();
415    slickgrid.element = $('#' + slickgrid.grid_element_id);
416    slickgrid.grid = new Slick.Grid(
417        slickgrid.element, slickgrid.loader.data, columns_from_ids(columns),
418        options);
419    slickgrid.loader.setColumns(columns);
420
421    var column_names = $.map(
422        slickgrid.grid.getColumns(), function (col) {return col.name;});
423    $('#columns').text(column_names.join(', '));
424
425    slickgrid.grid.onViewportChanged.subscribe(function () {
426        slickgrid.ensure_data();
427    });
428
429    var timeout_handler;
430    slickgrid.grid.onActiveCellChanged.subscribe(function(e, cell) {
431        if (cell.row === undefined)
432            return;
433        if (slickgrid.skip_cell_changed) {
434            slickgrid.skip_cell_changed = false;
435            return;
436        }
437        if (slickgrid.get_id() === slickgrid.active_id())
438            return;
439        if (edit.changed && !edit.confirm_discard()) {
440            setTimeout(function() {
441                if (slickgrid.last_active_row !== undefined) {
442                    slickgrid.grid.scrollRowToCenter(slickgrid.last_active_row);
443                    slickgrid.set_active(slickgrid.last_active_row, false);
444                } else {
445                    slickgrid.grid.resetActiveCell();
446                }
447            }, 100); // hack, bo inaczej z dziwnego powodu odpala się dwa razy
448            return;
449        }
450        slickgrid.last_active_row = cell.row;
451        clearTimeout(timeout_handler);
452        timeout_handler = setTimeout(function() {
453            var id = slickgrid.active_id();
454            if (id !== undefined) {
455                slickgrid.load_content(id);
456            }
457        }, 500);
458    });
459
460
461
462    var loading_ctrl = null;
463    slickgrid.loader.onDataLoading.subscribe(function () {
464        //layout.adjust_grid_size();
465        if (!loading_ctrl) {
466            loading_ctrl = getBusyOverlay(
467                $('#left')[0],
468                {color: 'black', opacity: 0.2},
469                {size: 30});
470        }
471    });
472
473    function loading_off() {
474        if (loading_ctrl) loading_ctrl.remove();
475        loading_ctrl = null;
476    }
477    slickgrid.loading_off = loading_off;
478
479    slickgrid.loader.onDataLoaded.subscribe(function (e, args) {
480        for (var i = args.from; i <= args.to; i++) {
481            slickgrid.grid.invalidateRow(i);
482        }
483
484        slickgrid.grid.updateRowCount();
485        slickgrid.grid.render();
486
487        loading_off();
488        layout.adjust_grid_size();
489        slickgrid.refresh_title();
490
491        if (slickgrid.set_active_when_loaded !== undefined) {
492            if (location.hash && !common.hash_interpreted) {
493                $(window).trigger('hashchange');
494            } else {
495                common.hash_interpreted = true;
496                slickgrid.set_active(slickgrid.set_active_when_loaded, true);
497            }
498            slickgrid.set_active_when_loaded = undefined;
499        }
500    });
501
502    slickgrid.loader.onAjaxError.subscribe(function() {
503        common.error_alert(gettext("Page load failed."));
504        loading_off();
505    });
506
507    // wyszukiwanie
508    //var search_timeout_handler;
509    $('#text-search').keyup(function (e) {
510        if (e.which === 13) {
511            //clearTimeout(search_timeout_handler);
512            slickgrid.search_enter();
513        } else if ($dj.auto_search) {
514            //clearTimeout(search_timeout_handler);
515            //search_timeout_handler = setTimeout(slickgrid.search, 500);
516            slickgrid.search();
517        }
518    });
519
520    $('#search-button').click(slickgrid.search_enter);
521
522    var sort_rules = $dj.sort_rules || slickgrid.initial_sort_rules;
523
524    // sortowanie
525    slickgrid.loader.setSort(sort_rules);
526
527    slickgrid.init_sort();
528
529    // filtry
530    var all_filter_buttons = {
531        clear:
532            {
533                text: gettext("Clear"),
534                click: function() {
535                    $('#filter-table').empty();
536                    add_filter_rule(slickgrid.filter_def_field);
537                    apply_filter({group_op: 'AND', rules: []}, false);
538                }
539            },
540        save:
541            {
542                text: gettext("Save filter"),
543                click: save_filter
544            },
545        load:
546            {
547                text: gettext("Load filter"),
548                click: function () {
549                    if (edit.reader && slickgrid.storage_filters_key) {
550                        var saved_filters = slickgrid.saved_filters();
551                        var filters = [];
552                        $.each(saved_filters, function(name, filter) {
553                            filters.push({name: name, params: filter});
554                        });
555                        filter_choice(filters);
556                    } else {
557                        $.ajaxJSON({
558                            method: 'get',
559                            url: $dj.ajax_get_filters,
560                            data: {grid_id: slickgrid.grid_id},
561                            description: 'Pobranie listy filtrów',
562                            callback: function(data) {
563                                filter_choice(data.filters);
564                            }
565                        });
566                    }
567                    //return false;
568                }
569            },
570        apply:
571            {
572                text: gettext("Apply filter"),
573                click: function() {
574                    apply_filter();
575                }
576            }
577    };
578    var filter_buttons;
579    if (edit.reader && !common.storage_present()) {
580        filter_buttons = [all_filter_buttons.clear, all_filter_buttons.apply];
581    } else {
582        filter_buttons = [
583            all_filter_buttons.clear,
584            all_filter_buttons.save,
585            all_filter_buttons.load,
586            all_filter_buttons.apply
587        ];
588    }
589    var filter_dialog = $('#choose-filter-dialog');
590    filter_dialog.default_dialog({
591        modal: false,
592        buttons: filter_buttons
593    });
594    filter_dialog.dialog('open');
595    if ($.fn.selectmenu)
596        $('#group-op').selectmenu();
597    add_filter_rule(slickgrid.filter_def_field);
598    filter_dialog.dialog('close');
599    $('#add-filter-button').button().click(function() {
600        add_filter_rule(slickgrid.filter_def_field);
601    });
602    $(document).on('change', '.rule-field', function() {
603        update_filter_row($(this).closest('tr'));
604    });
605    $(document).on('click', '.remove-filter', function() {
606       $(this).closest('tr').remove();
607    });
608
609    $('#filter-button').click(function() {
610        $('#choose-filter-dialog').dialog('open');
611    });
612
613    $('#load-filter-dialog').default_dialog({
614        autoOpen: false,
615        modal: true
616    });
617
618
619    $(document).on('keyup', '#filter-table input', function (e) {
620        if (e.which === 13) { // enter
621            $(this).change();
622            apply_filter();
623        }
624    });
625
626    if ($dj.filter && $dj.filter.rules.length > 0) {
627        slickgrid.loader.setFilter($dj.filter, false);
628        put_filter($dj.filter);
629    }
630
631    // wybór kolumn
632    $('#choose-columns-dialog').default_dialog({
633        modal: true,
634        buttons: [
635            {
636                text: gettext("Cancel"),
637                click: function () {
638                    $(this).dialog('close');
639                }
640            },
641            {
642                text: gettext("Confirm"),
643                click: function() {
644                    set_columns();
645                    $(this).dialog('close');
646                }
647            }
648        ]
649    });
650    var column_list = $('#column-list');
651    $('#show-columns-button').click(function() {
652        $('#choose-columns-dialog').dialog('open');
653        column_list.multiselect('refresh');
654    });
655    function add_column_option(column, selected) {
656        // tymczasowa łata
657        if (!column)
658            return;
659        var option = $('<option/>');
660        option.attr('value', column.id);
661        option.prop('selected', selected);
662        option.text(column.name);
663        column_list.append(option);
664    }
665    $.each(columns.slice(1), function(i, column) {
666        add_column_option(slickgrid.all_columns[column], true);
667    });
668    $.each(slickgrid.all_columns, function(id, column) {
669        if (columns.indexOf(id) === -1)
670            add_column_option(column, false);
671    });
672    column_list.multiselect({
673        sortable: true,
674        locale: gettext('en')
675    });
676
677    // inne działania
678    $('#more-actions-dialog').default_dialog({
679        modal: true
680    });
681
682    $('#more-button').click(function() {
683        $('#more-actions-dialog').dialog('open');
684    });
685
686    $('#export-list-button').click(function() {
687        export_list();
688        $('#more-actions-dialog').dialog('close');
689    });
690    $('#reload-list-button').click(function() {
691        apply_filter(slickgrid.loader.getFilter());
692        $('#more-actions-dialog').dialog('close');
693    });
694
695    // load the first page
696    slickgrid.set_active_when_loaded = 0;
697    slickgrid.grid.onViewportChanged.notify();
698
699    layout.adjust_tabs();
700    slickgrid.init();
701});
702
703function export_list(filename) {
704    "use strict";
705    var param = {
706        query_params: $.toJSON(slickgrid.query_params()),
707        columns: $.toJSON($.map(
708            slickgrid.grid.getColumns(), function(col) {return col.field;})),
709        filename: filename
710    };
711    location.href = $dj.ajax_export_list + '?' + $.param(param);
712}
713
714function scroll_to_hash(hash) {
715    "use strict";
716    var hash_parts = hash.split('/');
717    if (/^\d*$/.test(hash_parts[0])) {
718        var id = parseInt(hash_parts[0], 10);
719        slickgrid.row_index(id);
720    } else {
721        $('#text-search').val(hash_parts[0]);
722        slickgrid.scroll_search();
723    }
724}
725
726common.register_hash_interpteter(scroll_to_hash);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.