application.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. //= require ./jquery
  2. //= require ./jquery_ujs
  3. //= require ./list
  4. //= require ./stupidtable
  5. //= require ./jquery.stickytableheaders
  6. //= require ./selectize
  7. //= require ./highlight.pack
  8. //= require ./moment
  9. //= require ./moment-timezone
  10. //= require ./daterangepicker
  11. //= require ./Chart.js
  12. //= require ./chartkick
  13. //= require ./ace/ace
  14. //= require ./ace/ext-language_tools
  15. //= require ./ace/theme-twilight
  16. //= require ./ace/mode-sql
  17. //= require ./ace/snippets/text
  18. //= require ./ace/snippets/sql
  19. //= require ./Sortable
  20. //= require ./bootstrap
  21. $( function () {
  22. $('.dropdown-toggle').mouseenter( function () {
  23. $(this).parent().addClass('open');
  24. });
  25. });
  26. function uuid() {
  27. return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
  28. var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
  29. return v.toString(16);
  30. });
  31. }
  32. function cancelQuery(runningQuery) {
  33. runningQuery.canceled = true;
  34. var xhr = runningQuery.xhr;
  35. if (xhr) {
  36. xhr.abort();
  37. }
  38. remoteCancelQuery(runningQuery);
  39. queryComplete();
  40. }
  41. function csrfProtect(payload) {
  42. var param = $("meta[name=csrf-param]").attr("content");
  43. var token = $("meta[name=csrf-token]").attr("content");
  44. if (param && token) payload[param] = token;
  45. return new Blob([JSON.stringify(payload)], {type : "application/json; charset=utf-8"});
  46. }
  47. function remoteCancelQuery(runningQuery) {
  48. var path = window.cancelQueriesPath;
  49. var data = {run_id: runningQuery.run_id, data_source: runningQuery.data_source};
  50. if (navigator.sendBeacon) {
  51. navigator.sendBeacon(path, csrfProtect(data));
  52. } else {
  53. // TODO make sync
  54. $.post(path, data);
  55. }
  56. }
  57. var queriesQueue = [];
  58. var runningQueries = 0;
  59. var maxQueries = 3;
  60. function queueQuery(callback) {
  61. queriesQueue.push(callback);
  62. runNext();
  63. }
  64. function runNext() {
  65. if (runningQueries < maxQueries) {
  66. var callback = queriesQueue.shift();
  67. if (callback) {
  68. runningQueries++;
  69. callback();
  70. runNext();
  71. }
  72. }
  73. }
  74. function queryComplete() {
  75. runningQueries--;
  76. runNext();
  77. }
  78. function runQuery(data, success, error, runningQuery) {
  79. queueQuery( function () {
  80. runningQuery = runningQuery || {};
  81. runningQuery.run_id = data.run_id = uuid();
  82. runningQuery.data_source = data.data_source;
  83. return runQueryHelper(data, success, error, runningQuery);
  84. });
  85. }
  86. function runQueryHelper(data, success, error, runningQuery) {
  87. var xhr = $.ajax({
  88. url: window.runQueriesPath,
  89. method: "POST",
  90. data: data,
  91. dataType: "html"
  92. }).done( function (d) {
  93. if (d[0] == "{") {
  94. var response = $.parseJSON(d);
  95. data.blazer = response;
  96. setTimeout( function () {
  97. if (!(runningQuery && runningQuery.canceled)) {
  98. runQueryHelper(data, success, error, runningQuery);
  99. }
  100. }, 1000);
  101. } else {
  102. success(d);
  103. queryComplete();
  104. }
  105. }).fail( function(jqXHR, textStatus, errorThrown) {
  106. var message = (typeof errorThrown === "string") ? errorThrown : errorThrown.message;
  107. error(message);
  108. queryComplete();
  109. });
  110. if (runningQuery) {
  111. runningQuery.xhr = xhr;
  112. }
  113. return xhr;
  114. }
  115. function submitIfCompleted($form) {
  116. var completed = true;
  117. $form.find("input[name], select").each( function () {
  118. if ($(this).val() == "") {
  119. completed = false;
  120. }
  121. });
  122. if (completed) {
  123. $form.submit();
  124. }
  125. }
  126. // Prevent backspace from navigating backwards.
  127. // Adapted from Biff MaGriff: http://stackoverflow.com/a/7895814/1196499
  128. function preventBackspaceNav() {
  129. $(document).keydown(function (e) {
  130. var preventKeyPress;
  131. if (e.keyCode == 8) {
  132. var d = e.srcElement || e.target;
  133. switch (d.tagName.toUpperCase()) {
  134. case 'TEXTAREA':
  135. preventKeyPress = d.readOnly || d.disabled;
  136. break;
  137. case 'INPUT':
  138. preventKeyPress = d.readOnly || d.disabled || (d.attributes["type"] && $.inArray(d.attributes["type"].value.toLowerCase(), ["radio", "reset", "checkbox", "submit", "button"]) >= 0);
  139. break;
  140. case 'DIV':
  141. preventKeyPress = d.readOnly || d.disabled || !(d.attributes["contentEditable"] && d.attributes["contentEditable"].value == "true");
  142. break;
  143. default:
  144. preventKeyPress = true;
  145. break;
  146. }
  147. }
  148. else {
  149. preventKeyPress = false;
  150. }
  151. if (preventKeyPress) {
  152. e.preventDefault();
  153. }
  154. });
  155. }