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.