multi_column_sort.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /* vim: set expandtab sw=4 ts=4 sts=4: */
  2. /**
  3. * @fileoverview Implements the shiftkey + click remove column
  4. * from order by clause funcationality
  5. * @name columndelete
  6. *
  7. * @requires jQuery
  8. */
  9. function captureURL(url)
  10. {
  11. var URL = {};
  12. url = '' + url;
  13. // Exclude the url part till HTTP
  14. url = url.substr(url.search("sql.php"), url.length);
  15. // The url part between ORDER BY and &session_max_rows needs to be replaced.
  16. URL['head'] = url.substr(0, url.indexOf('ORDER+BY') + 9);
  17. URL['tail'] = url.substr(url.indexOf("&session_max_rows"), url.length);
  18. return URL;
  19. }
  20. /**
  21. * This function is for navigating to the generated URL
  22. *
  23. * @param object target HTMLAnchor element
  24. * @param object parent HTMLDom Object
  25. */
  26. function removeColumnFromMultiSort(target, parent)
  27. {
  28. var URL = captureURL(target);
  29. var begin = target.indexOf('ORDER+BY') + 8;
  30. var end = target.indexOf('&session_max_rows');
  31. // get the names of the columns involved
  32. var between_part = target.substr(begin, end-begin);
  33. var columns = between_part.split('%2C+');
  34. // If the given column is not part of the order clause exit from this function
  35. var index = parent.find('small').length ? parent.find('small').text() : '';
  36. if (index == ''){
  37. return;
  38. }
  39. // Remove the current clicked column
  40. columns.splice(index-1, 1);
  41. // If all the columns have been removed dont submit a query with nothing
  42. // After order by clause.
  43. if (columns.length == 0){
  44. var head = URL['head'];
  45. head = head.slice(0,head.indexOf('ORDER+BY'));
  46. URL['head'] = head;
  47. // removing the last sort order should have priority over what
  48. // is remembered via the RememberSorting directive
  49. URL['tail'] += '&discard_remembered_sort=1';
  50. }
  51. var middle_part = columns.join('%2C+');
  52. url = URL['head'] + middle_part + URL['tail'];
  53. return url;
  54. }
  55. AJAX.registerOnload('keyhandler.js', function () {
  56. $("th.draggable.column_heading.pointer.marker a").on('click', function (event) {
  57. var url = $(this).parent().find('input').val();
  58. if (event.ctrlKey) {
  59. event.preventDefault();
  60. url = removeColumnFromMultiSort(url, $(this).parent());
  61. AJAX.source = $(this);
  62. $.get(url, {'ajax_request' : true, 'ajax_page_request' : true}, AJAX.responseHandler);
  63. } else if (event.shiftKey) {
  64. event.preventDefault();
  65. AJAX.source = $(this);
  66. $.get(url, {'ajax_request' : true, 'ajax_page_request' : true}, AJAX.responseHandler);
  67. }
  68. });
  69. });
  70. AJAX.registerTeardown('keyhandler.js', function () {
  71. $("th.draggable.column_heading.pointer.marker a").die('click');
  72. });