blazer 3.4.0 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/README.md +23 -27
  4. data/app/assets/javascripts/blazer/Sortable.js +826 -1162
  5. data/app/assets/javascripts/blazer/ace/ace.js +15775 -13360
  6. data/app/assets/javascripts/blazer/ace/ext-language_tools.js +1411 -668
  7. data/app/assets/javascripts/blazer/ace/mode-sql.js +12 -6
  8. data/app/assets/javascripts/blazer/ace/theme-twilight.js +3 -3
  9. data/app/assets/javascripts/blazer/application.js +94 -52
  10. data/app/assets/javascripts/blazer/chart.umd.js +6 -6
  11. data/app/assets/javascripts/blazer/daterangepicker.js +193 -199
  12. data/app/assets/javascripts/blazer/highlight.min.js +235 -373
  13. data/app/assets/javascripts/blazer/moment-timezone-with-data.js +116 -82
  14. data/app/assets/javascripts/blazer/moment.js +368 -365
  15. data/app/assets/javascripts/blazer/queries.js +68 -58
  16. data/app/assets/javascripts/blazer/routes.js +11 -11
  17. data/app/assets/javascripts/blazer/tablesort.js +42 -0
  18. data/app/assets/javascripts/blazer/tom-select.base.js +4175 -0
  19. data/app/assets/stylesheets/blazer/application.css +114 -5
  20. data/app/assets/stylesheets/blazer/tom-select.css +502 -0
  21. data/app/controllers/blazer/base_controller.rb +1 -1
  22. data/app/controllers/blazer/checks_controller.rb +5 -2
  23. data/app/controllers/blazer/queries_controller.rb +3 -1
  24. data/app/helpers/blazer/base_helper.rb +1 -1
  25. data/app/models/blazer/check.rb +35 -57
  26. data/app/views/blazer/_nav.html.erb +1 -1
  27. data/app/views/blazer/_variables.html.erb +57 -42
  28. data/app/views/blazer/checks/_form.html.erb +20 -16
  29. data/app/views/blazer/checks/index.html.erb +17 -20
  30. data/app/views/blazer/dashboards/_form.html.erb +63 -48
  31. data/app/views/blazer/dashboards/show.html.erb +23 -16
  32. data/app/views/blazer/queries/_caching.html.erb +1 -1
  33. data/app/views/blazer/queries/_chart.html.erb +8 -0
  34. data/app/views/blazer/queries/_form.html.erb +153 -180
  35. data/app/views/blazer/queries/_map.html.erb +8 -0
  36. data/app/views/blazer/queries/docs.html.erb +6 -6
  37. data/app/views/blazer/queries/edit.html.erb +1 -0
  38. data/app/views/blazer/queries/home.html.erb +101 -102
  39. data/app/views/blazer/queries/new.html.erb +1 -0
  40. data/app/views/blazer/queries/run.html.erb +23 -34
  41. data/app/views/blazer/queries/schema.html.erb +20 -20
  42. data/app/views/blazer/queries/show.html.erb +19 -12
  43. data/app/views/blazer/uploads/index.html.erb +10 -10
  44. data/app/views/layouts/blazer/application.html.erb +3 -3
  45. data/lib/blazer/adapters/athena_adapter.rb +12 -6
  46. data/lib/blazer/adapters/clickhouse_adapter.rb +136 -0
  47. data/lib/blazer/adapters/druid_adapter.rb +0 -2
  48. data/lib/blazer/adapters/snowflake2_adapter.rb +198 -0
  49. data/lib/blazer/adapters/soda_adapter.rb +0 -2
  50. data/lib/blazer/adapters/sql_adapter.rb +4 -0
  51. data/lib/blazer/adapters.rb +2 -0
  52. data/lib/blazer/check_types.rb +20 -0
  53. data/lib/blazer/email_notifier.rb +49 -0
  54. data/lib/blazer/result.rb +15 -0
  55. data/lib/blazer/slack_notifier.rb +39 -7
  56. data/lib/blazer/version.rb +1 -1
  57. data/lib/blazer.rb +32 -26
  58. data/lib/generators/blazer/templates/config.yml.tt +0 -2
  59. data/licenses/LICENSE-chart.js.txt +1 -1
  60. metadata +12 -31
  61. data/app/assets/javascripts/blazer/bootstrap.js +0 -2580
  62. data/app/assets/javascripts/blazer/jquery.js +0 -10872
  63. data/app/assets/javascripts/blazer/jquery.stickytableheaders.js +0 -325
  64. data/app/assets/javascripts/blazer/rails-ujs.js +0 -746
  65. data/app/assets/javascripts/blazer/selectize.js +0 -3891
  66. data/app/assets/javascripts/blazer/stupidtable-custom-settings.js +0 -13
  67. data/app/assets/javascripts/blazer/stupidtable.js +0 -281
  68. data/app/assets/javascripts/blazer/vue.global.prod.js +0 -1
  69. data/app/assets/stylesheets/blazer/selectize.css +0 -403
  70. data/licenses/LICENSE-jquery.txt +0 -20
  71. data/licenses/LICENSE-rails-ujs.txt +0 -20
  72. data/licenses/LICENSE-stickytableheaders.txt +0 -20
  73. data/licenses/LICENSE-stupidtable.txt +0 -19
  74. data/licenses/LICENSE-vue.txt +0 -21
  75. /data/licenses/{LICENSE-selectize.txt → LICENSE-tom-select.txt} +0 -0
@@ -4,12 +4,18 @@ var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
4
4
  var SqlHighlightRules = function () {
5
5
  var keywords = ("select|insert|update|delete|from|where|and|or|group|by|order|limit|offset|having|as|case|" +
6
6
  "when|then|else|end|type|left|right|join|on|outer|desc|asc|union|create|table|primary|key|if|" +
7
- "foreign|not|references|default|null|inner|cross|natural|database|drop|grant|distinct");
7
+ "foreign|not|references|default|null|inner|cross|natural|database|drop|grant|distinct|is|in|" +
8
+ "all|alter|any|array|at|authorization|between|both|cast|check|collate|column|commit|constraint|" +
9
+ "cube|current|current_date|current_time|current_timestamp|current_user|describe|escape|except|" +
10
+ "exists|external|extract|fetch|filter|for|full|function|global|grouping|intersect|interval|" +
11
+ "into|leading|like|local|no|of|only|out|overlaps|partition|position|range|revoke|rollback|rollup|" +
12
+ "row|rows|session_user|set|some|start|tablesample|time|to|trailing|truncate|unique|unknown|" +
13
+ "user|using|values|window|with");
8
14
  var builtinConstants = ("true|false");
9
15
  var builtinFunctions = ("avg|count|first|last|max|min|sum|ucase|lcase|mid|len|round|rank|now|format|" +
10
16
  "coalesce|ifnull|isnull|nvl");
11
17
  var dataTypes = ("int|numeric|decimal|date|varchar|char|bigint|float|double|bit|binary|text|set|timestamp|" +
12
- "money|real|number|integer");
18
+ "money|real|number|integer|string");
13
19
  var keywordMapper = this.createKeywordMapper({
14
20
  "support.function": builtinFunctions,
15
21
  "keyword": keywords,
@@ -25,16 +31,16 @@ var SqlHighlightRules = function () {
25
31
  start: "/\\*",
26
32
  end: "\\*/"
27
33
  }, {
28
- token: "string",
34
+ token: "string", // " string
29
35
  regex: '".*?"'
30
36
  }, {
31
- token: "string",
37
+ token: "string", // ' string
32
38
  regex: "'.*?'"
33
39
  }, {
34
- token: "string",
40
+ token: "string", // ` string (apache drill)
35
41
  regex: "`.*?`"
36
42
  }, {
37
- token: "constant.numeric",
43
+ token: "constant.numeric", // float
38
44
  regex: "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"
39
45
  }, {
40
46
  token: keywordMapper,
@@ -1,10 +1,10 @@
1
- define("ace/theme/twilight.css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-twilight .ace_gutter {\n background: #232323;\n color: #E2E2E2\n}\n\n.ace-twilight .ace_print-margin {\n width: 1px;\n background: #232323\n}\n\n.ace-twilight {\n background-color: #141414;\n color: #F8F8F8\n}\n\n.ace-twilight .ace_cursor {\n color: #A7A7A7\n}\n\n.ace-twilight .ace_marker-layer .ace_selection {\n background: rgba(221, 240, 255, 0.20)\n}\n\n.ace-twilight.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #141414;\n}\n\n.ace-twilight .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-twilight .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(255, 255, 255, 0.25)\n}\n\n.ace-twilight .ace_marker-layer .ace_active-line {\n background: rgba(255, 255, 255, 0.031)\n}\n\n.ace-twilight .ace_gutter-active-line {\n background-color: rgba(255, 255, 255, 0.031)\n}\n\n.ace-twilight .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(221, 240, 255, 0.20)\n}\n\n.ace-twilight .ace_invisible {\n color: rgba(255, 255, 255, 0.25)\n}\n\n.ace-twilight .ace_keyword,\n.ace-twilight .ace_meta {\n color: #CDA869\n}\n\n.ace-twilight .ace_constant,\n.ace-twilight .ace_constant.ace_character,\n.ace-twilight .ace_constant.ace_character.ace_escape,\n.ace-twilight .ace_constant.ace_other,\n.ace-twilight .ace_heading,\n.ace-twilight .ace_markup.ace_heading,\n.ace-twilight .ace_support.ace_constant {\n color: #CF6A4C\n}\n\n.ace-twilight .ace_invalid.ace_illegal {\n color: #F8F8F8;\n background-color: rgba(86, 45, 86, 0.75)\n}\n\n.ace-twilight .ace_invalid.ace_deprecated {\n text-decoration: underline;\n font-style: italic;\n color: #D2A8A1\n}\n\n.ace-twilight .ace_support {\n color: #9B859D\n}\n\n.ace-twilight .ace_fold {\n background-color: #AC885B;\n border-color: #F8F8F8\n}\n\n.ace-twilight .ace_support.ace_function {\n color: #DAD085\n}\n\n.ace-twilight .ace_list,\n.ace-twilight .ace_markup.ace_list,\n.ace-twilight .ace_storage {\n color: #F9EE98\n}\n\n.ace-twilight .ace_entity.ace_name.ace_function,\n.ace-twilight .ace_meta.ace_tag {\n color: #AC885B\n}\n\n.ace-twilight .ace_string {\n color: #8F9D6A\n}\n\n.ace-twilight .ace_string.ace_regexp {\n color: #E9C062\n}\n\n.ace-twilight .ace_comment {\n font-style: italic;\n color: #5F5A60\n}\n\n.ace-twilight .ace_variable {\n color: #7587A6\n}\n\n.ace-twilight .ace_xml-pe {\n color: #494949\n}\n\n.ace-twilight .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERFpYLC1tf0PAAgOAnPnhxyiAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-twilight .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n}\n";
1
+ define("ace/theme/twilight-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-twilight .ace_gutter {\n background: #232323;\n color: #E2E2E2\n}\n\n.ace-twilight .ace_print-margin {\n width: 1px;\n background: #232323\n}\n\n.ace-twilight {\n background-color: #141414;\n color: #F8F8F8\n}\n\n.ace-twilight .ace_cursor {\n color: #A7A7A7\n}\n\n.ace-twilight .ace_marker-layer .ace_selection {\n background: rgba(221, 240, 255, 0.20)\n}\n\n.ace-twilight.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #141414;\n}\n\n.ace-twilight .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-twilight .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(255, 255, 255, 0.25)\n}\n\n.ace-twilight .ace_marker-layer .ace_active-line {\n background: rgba(255, 255, 255, 0.031)\n}\n\n.ace-twilight .ace_gutter-active-line {\n background-color: rgba(255, 255, 255, 0.031)\n}\n\n.ace-twilight .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(221, 240, 255, 0.20)\n}\n\n.ace-twilight .ace_invisible {\n color: rgba(255, 255, 255, 0.25)\n}\n\n.ace-twilight .ace_keyword,\n.ace-twilight .ace_meta {\n color: #CDA869\n}\n\n.ace-twilight .ace_constant,\n.ace-twilight .ace_constant.ace_character,\n.ace-twilight .ace_constant.ace_character.ace_escape,\n.ace-twilight .ace_constant.ace_other,\n.ace-twilight .ace_heading,\n.ace-twilight .ace_markup.ace_heading,\n.ace-twilight .ace_support.ace_constant {\n color: #CF6A4C\n}\n\n.ace-twilight .ace_invalid.ace_illegal {\n color: #F8F8F8;\n background-color: rgba(86, 45, 86, 0.75)\n}\n\n.ace-twilight .ace_invalid.ace_deprecated {\n text-decoration: underline;\n font-style: italic;\n color: #D2A8A1\n}\n\n.ace-twilight .ace_support {\n color: #9B859D\n}\n\n.ace-twilight .ace_fold {\n background-color: #AC885B;\n border-color: #F8F8F8\n}\n\n.ace-twilight .ace_support.ace_function {\n color: #DAD085\n}\n\n.ace-twilight .ace_list,\n.ace-twilight .ace_markup.ace_list,\n.ace-twilight .ace_storage {\n color: #F9EE98\n}\n\n.ace-twilight .ace_entity.ace_name.ace_function,\n.ace-twilight .ace_meta.ace_tag {\n color: #AC885B\n}\n\n.ace-twilight .ace_string {\n color: #8F9D6A\n}\n\n.ace-twilight .ace_string.ace_regexp {\n color: #E9C062\n}\n\n.ace-twilight .ace_comment {\n font-style: italic;\n color: #5F5A60\n}\n\n.ace-twilight .ace_variable {\n color: #7587A6\n}\n\n.ace-twilight .ace_xml-pe {\n color: #494949\n}\n\n.ace-twilight .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERFpYLC1tf0PAAgOAnPnhxyiAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-twilight .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n";
2
2
 
3
3
  });
4
4
 
5
- define("ace/theme/twilight",["require","exports","module","ace/theme/twilight.css","ace/lib/dom"], function(require, exports, module){exports.isDark = true;
5
+ define("ace/theme/twilight",["require","exports","module","ace/theme/twilight-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true;
6
6
  exports.cssClass = "ace-twilight";
7
- exports.cssText = require("./twilight.css");
7
+ exports.cssText = require("./twilight-css");
8
8
  var dom = require("../lib/dom");
9
9
  dom.importCssString(exports.cssText, exports.cssClass, false);
10
10
 
@@ -1,9 +1,5 @@
1
- //= require ./jquery
2
- //= require ./rails-ujs
3
- //= require ./stupidtable
4
- //= require ./stupidtable-custom-settings
5
- //= require ./jquery.stickytableheaders
6
- //= require ./selectize
1
+ //= require ./tablesort
2
+ //= require ./tom-select.base
7
3
  //= require ./highlight.min
8
4
  //= require ./moment
9
5
  //= require ./moment-timezone-with-data
@@ -14,71 +10,117 @@
14
10
  //= require ./mapkick.bundle
15
11
  //= require ./ace
16
12
  //= require ./Sortable
17
- //= require ./bootstrap
18
- //= require ./vue.global.prod
19
13
  //= require ./routes
20
14
  //= require ./queries
21
15
  //= require ./fuzzysearch
22
16
 
23
- $(document).on('mouseenter', '.dropdown-toggle', function () {
24
- $(this).parent().addClass('open')
17
+ document.addEventListener("mouseover", function (e) {
18
+ const target = e.target.closest(".dropdown-toggle")
19
+ if (target) {
20
+ target.parentElement.classList.add("open")
21
+ }
25
22
  })
26
23
 
27
- $(document).on("change", "#bind input, #bind select", function () {
28
- submitIfCompleted($(this).closest("form"))
24
+ document.addEventListener("click", function (e) {
25
+ const dropdown = document.querySelector(".dropdown-toggle")
26
+ if (dropdown) {
27
+ if (dropdown.contains(e.target)) {
28
+ dropdown.parentElement.classList.toggle("open")
29
+ } else {
30
+ dropdown.parentElement.classList.remove("open")
31
+ }
32
+ }
29
33
  })
30
34
 
31
- $(document).on("click", "#code", function () {
32
- $(this).addClass("expanded")
35
+ document.addEventListener("change", function (e) {
36
+ const target = e.target.closest("#bind input, #bind select")
37
+ if (target) {
38
+ submitIfCompleted(target.closest("form"))
39
+ }
33
40
  })
34
41
 
35
- $(document).on("click", "a[disabled]", function (e) {
36
- e.preventDefault()
42
+ document.addEventListener("click", function (e) {
43
+ const target = e.target.closest("#code")
44
+ if (target) {
45
+ target.classList.add("expanded")
46
+ }
47
+ })
48
+
49
+ document.addEventListener("click", function (e) {
50
+ const target = e.target.closest("a[disabled]")
51
+ if (target) {
52
+ e.preventDefault()
53
+ }
54
+ })
55
+
56
+ document.addEventListener("click", function (e) {
57
+ const target = e.target.closest("a[data-confirm]")
58
+ if (target) {
59
+ if (!window.confirm(target.getAttribute("data-confirm"))) {
60
+ e.preventDefault()
61
+ }
62
+ }
63
+ })
64
+
65
+ // make autofocus work with back button
66
+ window.addEventListener("pageshow", function (e) {
67
+ if (e.persisted) {
68
+ const element = document.querySelector("input[autofocus]")
69
+ if (element) {
70
+ element.focus()
71
+ }
72
+ }
37
73
  })
38
74
 
39
- function submitIfCompleted($form) {
40
- var completed = true
41
- $form.find("input[name], select").each( function () {
42
- if ($(this).val() == "") {
75
+ function submitIfCompleted(form) {
76
+ let completed = true
77
+ for (const input of form.querySelectorAll("input[name], select")) {
78
+ if (input.value == "") {
43
79
  completed = false
80
+ break
44
81
  }
45
- })
82
+ }
46
83
  if (completed) {
47
- $form.submit()
84
+ form.submit()
48
85
  }
49
86
  }
50
87
 
51
- // Prevent backspace from navigating backwards.
52
- // Adapted from Biff MaGriff: http://stackoverflow.com/a/7895814/1196499
53
- function preventBackspaceNav() {
54
- $(document).keydown(function (e) {
55
- var preventKeyPress
56
- if (e.keyCode == 8) {
57
- var d = e.srcElement || e.target
58
- switch (d.tagName.toUpperCase()) {
59
- case 'TEXTAREA':
60
- preventKeyPress = d.readOnly || d.disabled
61
- break
62
- case 'INPUT':
63
- preventKeyPress = d.readOnly || d.disabled || (d.attributes["type"] && $.inArray(d.attributes["type"].value.toLowerCase(), ["radio", "reset", "checkbox", "submit", "button"]) >= 0)
64
- break
65
- case 'DIV':
66
- preventKeyPress = d.readOnly || d.disabled || !(d.attributes["contentEditable"] && d.attributes["contentEditable"].value == "true")
67
- break
68
- default:
69
- preventKeyPress = true
70
- break
71
- }
72
- }
73
- else {
74
- preventKeyPress = false
75
- }
88
+ function show(element) {
89
+ element.classList.remove("hide")
90
+ }
76
91
 
77
- if (preventKeyPress) {
78
- e.preventDefault()
79
- }
80
- })
92
+ function hide(element) {
93
+ element.classList.add("hide")
94
+ }
95
+
96
+ function toggle(element, found) {
97
+ if (found) {
98
+ show(element)
99
+ } else {
100
+ hide(element)
101
+ }
102
+ }
103
+
104
+ function pathParams(params) {
105
+ return (new URLSearchParams(params)).toString()
81
106
  }
82
107
 
83
- preventBackspaceNav()
108
+ function getJSON(url, success, controller) {
109
+ const options = {headers: {"Accept": "application/json"}}
110
+ if (controller) {
111
+ options.signal = controller.signal
112
+ }
113
+ fetch(url, options)
114
+ .then(function (response) {
115
+ if (!response.ok) {
116
+ throw new Error(response.statusText)
117
+ }
118
+ return response.json()
119
+ })
120
+ .then(success)
121
+ }
84
122
 
123
+ function renderResults(element, data) {
124
+ const range = document.createRange()
125
+ element.replaceChildren(range.createContextualFragment(data))
126
+ }