tbl_select.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. /* vim: set expandtab sw=4 ts=4 sts=4: */
  2. /**
  3. * @fileoverview JavaScript functions used on tbl_select.php
  4. *
  5. * @requires jQuery
  6. * @requires js/functions.js
  7. */
  8. /**
  9. * Ajax event handlers for this page
  10. *
  11. * Actions ajaxified here:
  12. * Table Search
  13. */
  14. /**
  15. * Unbind all event handlers before tearing down a page
  16. */
  17. AJAX.registerTeardown('tbl_select.js', function () {
  18. $('#togglesearchformlink').unbind('click');
  19. $("#tbl_search_form.ajax").die('submit');
  20. $('select.geom_func').unbind('change');
  21. $('span.open_search_gis_editor').die('click');
  22. });
  23. AJAX.registerOnload('tbl_select.js', function () {
  24. /**
  25. * Prepare a div containing a link, otherwise it's incorrectly displayed
  26. * after a couple of clicks
  27. */
  28. $('<div id="togglesearchformdiv"><a id="togglesearchformlink"></a></div>')
  29. .insertAfter('#tbl_search_form')
  30. // don't show it until we have results on-screen
  31. .hide();
  32. $('#togglesearchformlink')
  33. .html(PMA_messages.strShowSearchCriteria)
  34. .bind('click', function () {
  35. var $link = $(this);
  36. $('#tbl_search_form').slideToggle();
  37. if ($link.text() == PMA_messages.strHideSearchCriteria) {
  38. $link.text(PMA_messages.strShowSearchCriteria);
  39. } else {
  40. $link.text(PMA_messages.strHideSearchCriteria);
  41. }
  42. // avoid default click action
  43. return false;
  44. });
  45. /**
  46. * Ajax event handler for Table Search
  47. */
  48. $("#tbl_search_form.ajax").live('submit', function (event) {
  49. var unaryFunctions = [
  50. 'IS NULL',
  51. 'IS NOT NULL',
  52. "= ''",
  53. "!= ''"
  54. ];
  55. // jQuery object to reuse
  56. $search_form = $(this);
  57. event.preventDefault();
  58. // empty previous search results while we are waiting for new results
  59. $("#sqlqueryresults").empty();
  60. var $msgbox = PMA_ajaxShowMessage(PMA_messages.strSearching, false);
  61. PMA_prepareForAjaxRequest($search_form);
  62. var values = {};
  63. $search_form.find(':input').each(function () {
  64. var $input = $(this);
  65. if ($input.attr('type') == 'checkbox' || $input.attr('type') == 'radio') {
  66. if ($input.is(':checked')) {
  67. values[this.name] = $input.val();
  68. }
  69. } else {
  70. values[this.name] = $input.val();
  71. }
  72. });
  73. var columnCount = $('select[name="columnsToDisplay[]"] option').length;
  74. // Submit values only for the columns that have unary column operator or a search criteria
  75. for (var a = 0; a < columnCount; a++) {
  76. if ($.inArray(values['criteriaColumnOperators[' + a + ']'], unaryFunctions) >= 0) {
  77. continue;
  78. }
  79. if (values['criteriaValues[' + a + ']'] === '' || values['criteriaValues[' + a + ']'] === null) {
  80. delete values['criteriaValues[' + a + ']'];
  81. delete values['criteriaColumnOperators[' + a + ']'];
  82. delete values['criteriaColumnNames[' + a + ']'];
  83. delete values['criteriaColumnTypes[' + a + ']'];
  84. delete values['criteriaColumnCollations[' + a + ']'];
  85. }
  86. }
  87. // If all columns are selected, use a single parameter to indicate that
  88. if (values['columnsToDisplay[]'] !== null) {
  89. if (values['columnsToDisplay[]'].length == columnCount) {
  90. delete values['columnsToDisplay[]'];
  91. values['displayAllColumns'] = true;
  92. }
  93. } else {
  94. values['displayAllColumns'] = true;
  95. }
  96. $.post($search_form.attr('action'), values, function (data) {
  97. PMA_ajaxRemoveMessage($msgbox);
  98. if (data.success === true) {
  99. if (typeof data.sql_query !== 'undefined') { // zero rows
  100. $("#sqlqueryresults").html(data.sql_query);
  101. } else { // results found
  102. $("#sqlqueryresults").html(data.message);
  103. $("#sqlqueryresults").trigger('makegrid').trigger('stickycolumns');
  104. }
  105. $('#tbl_search_form')
  106. // workaround for bug #3168569 - Issue on toggling the "Hide search criteria" in chrome.
  107. .slideToggle()
  108. .hide();
  109. $('#togglesearchformlink')
  110. // always start with the Show message
  111. .text(PMA_messages.strShowSearchCriteria);
  112. $('#togglesearchformdiv')
  113. // now it's time to show the div containing the link
  114. .show();
  115. // needed for the display options slider in the results
  116. PMA_init_slider();
  117. } else {
  118. $("#sqlqueryresults").html(data.error);
  119. }
  120. PMA_highlightSQL($('#sqlqueryresults'));
  121. }); // end $.post()
  122. });
  123. // Following section is related to the 'function based search' for geometry data types.
  124. // Initialy hide all the open_gis_editor spans
  125. $('span.open_search_gis_editor').hide();
  126. $('select.geom_func').bind('change', function () {
  127. var $geomFuncSelector = $(this);
  128. var binaryFunctions = [
  129. 'Contains',
  130. 'Crosses',
  131. 'Disjoint',
  132. 'Equals',
  133. 'Intersects',
  134. 'Overlaps',
  135. 'Touches',
  136. 'Within',
  137. 'MBRContains',
  138. 'MBRDisjoint',
  139. 'MBREquals',
  140. 'MBRIntersects',
  141. 'MBROverlaps',
  142. 'MBRTouches',
  143. 'MBRWithin',
  144. 'ST_Contains',
  145. 'ST_Crosses',
  146. 'ST_Disjoint',
  147. 'ST_Equals',
  148. 'ST_Intersects',
  149. 'ST_Overlaps',
  150. 'ST_Touches',
  151. 'ST_Within'
  152. ];
  153. var tempArray = [
  154. 'Envelope',
  155. 'EndPoint',
  156. 'StartPoint',
  157. 'ExteriorRing',
  158. 'Centroid',
  159. 'PointOnSurface'
  160. ];
  161. var outputGeomFunctions = binaryFunctions.concat(tempArray);
  162. // If the chosen function takes two geometry objects as parameters
  163. var $operator = $geomFuncSelector.parents('tr').find('td:nth-child(5)').find('select');
  164. if ($.inArray($geomFuncSelector.val(), binaryFunctions) >= 0) {
  165. $operator.prop('readonly', true);
  166. } else {
  167. $operator.prop('readonly', false);
  168. }
  169. // if the chosen function's output is a geometry, enable GIS editor
  170. var $editorSpan = $geomFuncSelector.parents('tr').find('span.open_search_gis_editor');
  171. if ($.inArray($geomFuncSelector.val(), outputGeomFunctions) >= 0) {
  172. $editorSpan.show();
  173. } else {
  174. $editorSpan.hide();
  175. }
  176. });
  177. $('span.open_search_gis_editor').live('click', function (event) {
  178. event.preventDefault();
  179. var $span = $(this);
  180. // Current value
  181. var value = $span.parent('td').children("input[type='text']").val();
  182. // Field name
  183. var field = 'Parameter';
  184. // Column type
  185. var geom_func = $span.parents('tr').find('.geom_func').val();
  186. var type;
  187. if (geom_func == 'Envelope') {
  188. type = 'polygon';
  189. } else if (geom_func == 'ExteriorRing') {
  190. type = 'linestring';
  191. } else {
  192. type = 'point';
  193. }
  194. // Names of input field and null checkbox
  195. var input_name = $span.parent('td').children("input[type='text']").attr('name');
  196. //Token
  197. var token = $("input[name='token']").val();
  198. openGISEditor();
  199. if (!gisEditorLoaded) {
  200. loadJSAndGISEditor(value, field, type, input_name, token);
  201. } else {
  202. loadGISEditor(value, field, type, input_name, token);
  203. }
  204. });
  205. });