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
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  *= require ./bootstrap-sprockets
3
3
  *= require ./bootstrap
4
- *= require ./selectize
4
+ *= require ./tom-select
5
5
  *= require ./github
6
6
  *= require ./daterangepicker
7
7
  *= require_self
@@ -37,6 +37,8 @@ table.results-table {
37
37
  input.search {
38
38
  border: none;
39
39
  box-shadow: none;
40
+ width: 300px;
41
+ display: inline-block;
40
42
  }
41
43
 
42
44
  input.search:focus {
@@ -52,18 +54,26 @@ input.search:focus {
52
54
  outline: none;
53
55
  }
54
56
 
55
- .form-inline .selectize-control, .text-right .selectize-control {
57
+ .form-inline .ts-wrapper, .text-right .ts-wrapper {
56
58
  display: inline-block;
57
- vertical-align: middle;
58
59
  margin-left: 5px;
59
60
  margin-right: 20px;
60
61
  text-align: left;
61
62
  }
62
63
 
63
- #statement-box .selectize-control {
64
+ #statement-box .ts-wrapper {
64
65
  margin-right: 0;
65
66
  }
66
67
 
68
+ .ts-control > input {
69
+ min-width: 0;
70
+ }
71
+
72
+ .has-items .ts-control > input {
73
+ margin-left: 1px !important;
74
+ margin-right: 0 !important;
75
+ }
76
+
67
77
  #editor-container {
68
78
  background-color: #141414;
69
79
  padding-top: 10px;
@@ -177,6 +187,10 @@ input.search:focus {
177
187
  color: #999;
178
188
  }
179
189
 
190
+ .header-div {
191
+ line-height: 34px;
192
+ }
193
+
180
194
  #code {
181
195
  max-height: 236px;
182
196
  overflow: hidden;
@@ -238,6 +252,101 @@ h2 {
238
252
  max-width: 500px;
239
253
  }
240
254
 
241
- .selectize-dropdown .create {
255
+ .ts-dropdown .create {
242
256
  padding: 5px 8px;
243
257
  }
258
+
259
+ .ts-dropdown {
260
+ margin-top: 0 !important;
261
+ }
262
+
263
+ .user-header {
264
+ width: 20%;
265
+ text-align: right;
266
+ }
267
+
268
+ .state-header {
269
+ width: 10%;
270
+ }
271
+
272
+ .run-header {
273
+ width: 10%;
274
+ }
275
+
276
+ .notify-header {
277
+ width: 20%;
278
+ }
279
+
280
+ .actions-header {
281
+ width: 15%;
282
+ }
283
+
284
+ .description-header {
285
+ width: 60%;
286
+ }
287
+
288
+ .notifiers {
289
+ margin-bottom: 0;
290
+ word-break: break-all;
291
+ }
292
+
293
+ .table > tbody > tr > td.check-actions {
294
+ text-align: right;
295
+ padding: 1px;
296
+ }
297
+
298
+ #dashboard-actions {
299
+ padding-bottom: 140px;
300
+ }
301
+
302
+ .name-header {
303
+ line-height: 34px;
304
+ display: inline;
305
+ margin-left: 5px;
306
+ }
307
+
308
+ .name-row {
309
+ padding-top: 13px;
310
+ }
311
+
312
+ .topbar-margin {
313
+ margin-bottom: 60px;
314
+ }
315
+
316
+ .query-description {
317
+ white-space: pre-line;
318
+ }
319
+
320
+ .nav-btn-group {
321
+ vertical-align: top;
322
+ margin-right: 5px;
323
+ }
324
+
325
+ .docs-table {
326
+ max-width: 500px;
327
+ }
328
+
329
+ .docs-table .first-header {
330
+ width: 20%;
331
+ }
332
+
333
+ .column-name {
334
+ width: 60%;
335
+ }
336
+
337
+ .stickytable thead {
338
+ position: sticky;
339
+ top: 60px;
340
+ }
341
+
342
+ .stickytable th {
343
+ box-shadow: inset 0 -2px 0 0 #ddd;
344
+ }
345
+
346
+ .table.stickytable > thead > tr > th {
347
+ border-bottom: none;
348
+ }
349
+
350
+ .table.stickytable > tbody > tr:first-child > td {
351
+ border-top: none;
352
+ }
@@ -0,0 +1,502 @@
1
+ /**
2
+ * tom-select.css (v2.6.1)
3
+ * Copyright (c) contributors
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
6
+ * file except in compliance with the License. You may obtain a copy of the License at:
7
+ * http://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ * Unless required by applicable law or agreed to in writing, software distributed under
10
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ * ANY KIND, either express or implied. See the License for the specific language
12
+ * governing permissions and limitations under the License.
13
+ *
14
+ */
15
+ .ts-control {
16
+ border: 1px solid #d0d0d0;
17
+ padding: 8px 8px;
18
+ width: 100%;
19
+ overflow: hidden;
20
+ position: relative;
21
+ z-index: 1;
22
+ box-sizing: border-box;
23
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.1);
24
+ border-radius: 3px;
25
+ display: flex;
26
+ flex-wrap: wrap;
27
+ }
28
+ .ts-wrapper.multi.has-items .ts-control {
29
+ padding: calc(8px - 2px - 1px) 8px calc(8px - 2px - 3px - 1px);
30
+ }
31
+ .full .ts-control {
32
+ background-color: #fff;
33
+ }
34
+ .disabled .ts-control, .disabled .ts-control * {
35
+ cursor: default !important;
36
+ }
37
+ .focus .ts-control {
38
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.15);
39
+ }
40
+ .ts-control > * {
41
+ vertical-align: baseline;
42
+ display: inline-block;
43
+ }
44
+ .ts-wrapper.multi .ts-control > div {
45
+ cursor: pointer;
46
+ margin: 0 3px 3px 0;
47
+ padding: 2px 6px;
48
+ background: #1da7ee;
49
+ color: #fff;
50
+ border: 1px solid #0073bb;
51
+ overflow: auto;
52
+ }
53
+ .ts-wrapper.multi .ts-control > div.active {
54
+ background: #92c836;
55
+ color: #fff;
56
+ border: 1px solid #00578d;
57
+ }
58
+ .ts-wrapper.multi.disabled .ts-control > div, .ts-wrapper.multi.disabled .ts-control > div.active {
59
+ color: hsl(0, 0%, 130%);
60
+ background: #d2d2d2;
61
+ border: 1px solid #aaaaaa;
62
+ }
63
+ .ts-control > input {
64
+ flex: 1 1 auto;
65
+ min-width: 7rem;
66
+ display: inline-block !important;
67
+ padding: 0 !important;
68
+ min-height: 0 !important;
69
+ max-height: none !important;
70
+ max-width: 100% !important;
71
+ margin: 0 !important;
72
+ text-indent: 0 !important;
73
+ border: 0 none !important;
74
+ background: none !important;
75
+ line-height: inherit !important;
76
+ -webkit-user-select: auto !important;
77
+ -moz-user-select: auto !important;
78
+ -ms-user-select: auto !important;
79
+ user-select: auto !important;
80
+ box-shadow: none !important;
81
+ }
82
+ .ts-control > input::-ms-clear {
83
+ display: none;
84
+ }
85
+ .ts-control > input:focus {
86
+ outline: none !important;
87
+ }
88
+ .has-items .ts-control > input {
89
+ margin: 0px 4px !important;
90
+ }
91
+ .ts-control.rtl {
92
+ text-align: right;
93
+ }
94
+ .ts-control.rtl.single .ts-control:after {
95
+ left: 15px;
96
+ right: auto;
97
+ }
98
+ .ts-control.rtl .ts-control > input {
99
+ margin: 0px 4px 0px -2px !important;
100
+ }
101
+ .disabled .ts-control {
102
+ opacity: 0.5;
103
+ background-color: #fafafa;
104
+ }
105
+ .input-hidden .ts-control > input {
106
+ opacity: 0;
107
+ position: absolute;
108
+ left: -10000px;
109
+ }
110
+
111
+ .ts-dropdown {
112
+ position: absolute;
113
+ top: 100%;
114
+ left: 0;
115
+ width: 100%;
116
+ z-index: 10;
117
+ border: 1px solid #d0d0d0;
118
+ background: #fff;
119
+ margin: 0.25rem 0 0;
120
+ border-top: 0 none;
121
+ box-sizing: border-box;
122
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
123
+ border-radius: 0 0 3px 3px;
124
+ }
125
+ .ts-dropdown [data-selectable] {
126
+ cursor: pointer;
127
+ overflow: hidden;
128
+ }
129
+ .ts-dropdown [data-selectable] .highlight {
130
+ background: rgba(125, 168, 208, 0.2);
131
+ border-radius: 1px;
132
+ }
133
+ .ts-dropdown .option,
134
+ .ts-dropdown .optgroup-header,
135
+ .ts-dropdown .no-results,
136
+ .ts-dropdown .create {
137
+ padding: 5px 8px;
138
+ }
139
+ .ts-dropdown .option, .ts-dropdown [data-disabled], .ts-dropdown [data-disabled] [data-selectable].option {
140
+ cursor: inherit;
141
+ opacity: 0.5;
142
+ }
143
+ .ts-dropdown [data-selectable].option {
144
+ opacity: 1;
145
+ cursor: pointer;
146
+ }
147
+ .ts-dropdown .optgroup:first-child .optgroup-header {
148
+ border-top: 0 none;
149
+ }
150
+ .ts-dropdown .optgroup-header {
151
+ color: #303030;
152
+ background: #fff;
153
+ cursor: default;
154
+ }
155
+ .ts-dropdown .active {
156
+ background-color: #f5fafd;
157
+ color: #495c68;
158
+ }
159
+ .ts-dropdown .active.create {
160
+ color: #495c68;
161
+ }
162
+ .ts-dropdown .create {
163
+ color: rgba(48, 48, 48, 0.5);
164
+ }
165
+ .ts-dropdown .spinner {
166
+ display: inline-block;
167
+ width: 30px;
168
+ height: 30px;
169
+ margin: 5px 8px;
170
+ }
171
+ .ts-dropdown .spinner::after {
172
+ content: " ";
173
+ display: block;
174
+ width: 24px;
175
+ height: 24px;
176
+ margin: 3px;
177
+ border-radius: 50%;
178
+ border: 5px solid #d0d0d0;
179
+ border-color: #d0d0d0 transparent #d0d0d0 transparent;
180
+ animation: lds-dual-ring 1.2s linear infinite;
181
+ }
182
+ @keyframes lds-dual-ring {
183
+ 0% {
184
+ transform: rotate(0deg);
185
+ }
186
+ 100% {
187
+ transform: rotate(360deg);
188
+ }
189
+ }
190
+
191
+ .ts-dropdown-content {
192
+ overflow: hidden auto;
193
+ max-height: 200px;
194
+ scroll-behavior: smooth;
195
+ }
196
+
197
+ .ts-wrapper.plugin-drag_drop .ts-dragging {
198
+ color: transparent !important;
199
+ }
200
+ .ts-wrapper.plugin-drag_drop .ts-dragging > * {
201
+ visibility: hidden !important;
202
+ }
203
+
204
+ .plugin-checkbox_options:not(.rtl) .option input {
205
+ margin-right: 0.5rem;
206
+ }
207
+
208
+ .plugin-checkbox_options.rtl .option input {
209
+ margin-left: 0.5rem;
210
+ }
211
+
212
+ /* stylelint-disable function-name-case */
213
+ .plugin-clear_button {
214
+ --ts-pr-clear-button: 1em;
215
+ }
216
+ .plugin-clear_button .clear-button {
217
+ opacity: 0;
218
+ position: absolute;
219
+ top: 50%;
220
+ transform: translateY(-50%);
221
+ right: calc(8px - 6px);
222
+ margin-right: 0 !important;
223
+ background: transparent !important;
224
+ transition: opacity 0.5s;
225
+ cursor: pointer;
226
+ }
227
+ .plugin-clear_button.form-select .clear-button, .plugin-clear_button.single .clear-button {
228
+ right: max(var(--ts-pr-caret), 8px);
229
+ }
230
+ .plugin-clear_button.focus.has-items .clear-button, .plugin-clear_button:not(.disabled):hover.has-items .clear-button {
231
+ opacity: 1;
232
+ }
233
+
234
+ .ts-wrapper .dropdown-header {
235
+ position: relative;
236
+ padding: 10px 8px;
237
+ border-bottom: 1px solid #d0d0d0;
238
+ background: color-mix(#fff, #d0d0d0, 85%);
239
+ border-radius: 3px 3px 0 0;
240
+ }
241
+ .ts-wrapper .dropdown-header-close {
242
+ position: absolute;
243
+ right: 8px;
244
+ top: 50%;
245
+ color: #303030;
246
+ opacity: 0.4;
247
+ margin-top: -12px;
248
+ line-height: 20px;
249
+ font-size: 20px !important;
250
+ }
251
+ .ts-wrapper .dropdown-header-close:hover {
252
+ color: hsl(0, 0%, -6.1764705882%);
253
+ }
254
+
255
+ .plugin-dropdown_input.focus.dropdown-active .ts-control {
256
+ box-shadow: none;
257
+ border: 1px solid #d0d0d0;
258
+ }
259
+ .plugin-dropdown_input .dropdown-input {
260
+ border: 1px solid #d0d0d0;
261
+ border-width: 0 0 1px;
262
+ display: block;
263
+ padding: 8px 8px;
264
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.1);
265
+ width: 100%;
266
+ background: transparent;
267
+ }
268
+ .plugin-dropdown_input .items-placeholder {
269
+ border: 0 none !important;
270
+ box-shadow: none !important;
271
+ width: 100%;
272
+ }
273
+ .plugin-dropdown_input.has-items .items-placeholder, .plugin-dropdown_input.dropdown-active .items-placeholder {
274
+ display: none !important;
275
+ }
276
+
277
+ .ts-wrapper.plugin-input_autogrow.has-items .ts-control > input {
278
+ min-width: 0;
279
+ }
280
+ .ts-wrapper.plugin-input_autogrow.has-items.focus .ts-control > input {
281
+ flex: none;
282
+ min-width: 4px;
283
+ }
284
+ .ts-wrapper.plugin-input_autogrow.has-items.focus .ts-control > input::-ms-input-placeholder {
285
+ color: transparent;
286
+ }
287
+ .ts-wrapper.plugin-input_autogrow.has-items.focus .ts-control > input::placeholder {
288
+ color: transparent;
289
+ }
290
+
291
+ .ts-dropdown.plugin-optgroup_columns .ts-dropdown-content {
292
+ display: flex;
293
+ }
294
+ .ts-dropdown.plugin-optgroup_columns .optgroup {
295
+ border-right: 1px solid #f2f2f2;
296
+ border-top: 0 none;
297
+ flex-grow: 1;
298
+ flex-basis: 0;
299
+ min-width: 0;
300
+ }
301
+ .ts-dropdown.plugin-optgroup_columns .optgroup:last-child {
302
+ border-right: 0 none;
303
+ }
304
+ .ts-dropdown.plugin-optgroup_columns .optgroup::before {
305
+ display: none;
306
+ }
307
+ .ts-dropdown.plugin-optgroup_columns .optgroup-header {
308
+ border-top: 0 none;
309
+ }
310
+
311
+ .ts-wrapper.plugin-remove_button .item {
312
+ display: inline-flex;
313
+ align-items: center;
314
+ }
315
+ .ts-wrapper.plugin-remove_button .item .remove {
316
+ color: inherit;
317
+ text-decoration: none;
318
+ vertical-align: middle;
319
+ display: inline-block;
320
+ padding: 0 6px;
321
+ border-radius: 0 2px 2px 0;
322
+ box-sizing: border-box;
323
+ }
324
+ .ts-wrapper.plugin-remove_button .item .remove:hover {
325
+ background: rgba(0, 0, 0, 0.05);
326
+ }
327
+ .ts-wrapper.plugin-remove_button.disabled .item .remove:hover {
328
+ background: none;
329
+ }
330
+ .ts-wrapper.plugin-remove_button .remove-single {
331
+ position: absolute;
332
+ right: 0;
333
+ top: 0;
334
+ font-size: 23px;
335
+ }
336
+
337
+ .ts-wrapper.plugin-remove_button:not(.rtl) .item {
338
+ padding-right: 0 !important;
339
+ }
340
+ .ts-wrapper.plugin-remove_button:not(.rtl) .item .remove {
341
+ border-left: 1px solid #0073bb;
342
+ margin-left: 6px;
343
+ }
344
+ .ts-wrapper.plugin-remove_button:not(.rtl) .item.active .remove {
345
+ border-left-color: #00578d;
346
+ }
347
+ .ts-wrapper.plugin-remove_button:not(.rtl).disabled .item .remove {
348
+ border-left-color: #aaaaaa;
349
+ }
350
+
351
+ .ts-wrapper.plugin-remove_button.rtl .item {
352
+ padding-left: 0 !important;
353
+ }
354
+ .ts-wrapper.plugin-remove_button.rtl .item .remove {
355
+ border-right: 1px solid #0073bb;
356
+ margin-right: 6px;
357
+ }
358
+ .ts-wrapper.plugin-remove_button.rtl .item.active .remove {
359
+ border-right-color: #00578d;
360
+ }
361
+ .ts-wrapper.plugin-remove_button.rtl.disabled .item .remove {
362
+ border-right-color: #aaaaaa;
363
+ }
364
+
365
+ :root {
366
+ --ts-pr-clear-button: 0px;
367
+ --ts-pr-caret: 0px;
368
+ --ts-pr-min: .75rem;
369
+ }
370
+
371
+ .ts-wrapper.single .ts-control, .ts-wrapper.single .ts-control input {
372
+ cursor: pointer;
373
+ }
374
+
375
+ .ts-control:not(.rtl) {
376
+ padding-right: max(var(--ts-pr-min), var(--ts-pr-clear-button) + var(--ts-pr-caret)) !important;
377
+ }
378
+
379
+ .ts-control.rtl {
380
+ padding-left: max(var(--ts-pr-min), var(--ts-pr-clear-button) + var(--ts-pr-caret)) !important;
381
+ }
382
+
383
+ .ts-wrapper {
384
+ position: relative;
385
+ }
386
+
387
+ .ts-dropdown,
388
+ .ts-control,
389
+ .ts-control input {
390
+ color: #303030;
391
+ font-family: inherit;
392
+ font-size: 13px;
393
+ line-height: 18px;
394
+ }
395
+
396
+ .ts-control,
397
+ .ts-wrapper.single.input-active .ts-control {
398
+ background: #fff;
399
+ cursor: text;
400
+ }
401
+
402
+ .ts-hidden-accessible {
403
+ border: 0 !important;
404
+ clip: rect(0 0 0 0) !important;
405
+ -webkit-clip-path: inset(50%) !important;
406
+ clip-path: inset(50%) !important;
407
+ overflow: hidden !important;
408
+ padding: 0 !important;
409
+ position: absolute !important;
410
+ width: 1px !important;
411
+ white-space: nowrap !important;
412
+ }
413
+
414
+ .ts-wrapper.single .ts-control {
415
+ --ts-pr-caret: 2rem;
416
+ }
417
+ .ts-wrapper.single .ts-control::after {
418
+ content: " ";
419
+ display: block;
420
+ position: absolute;
421
+ top: 50%;
422
+ margin-top: -3px;
423
+ width: 0;
424
+ height: 0;
425
+ border-style: solid;
426
+ border-width: 5px 5px 0 5px;
427
+ border-color: #808080 transparent transparent transparent;
428
+ }
429
+ .ts-wrapper.single .ts-control:not(.rtl)::after {
430
+ right: 15px;
431
+ }
432
+ .ts-wrapper.single .ts-control.rtl::after {
433
+ left: 15px;
434
+ }
435
+ .ts-wrapper.single.dropdown-active .ts-control::after {
436
+ margin-top: -4px;
437
+ border-width: 0 5px 5px 5px;
438
+ border-color: transparent transparent #808080 transparent;
439
+ }
440
+ .ts-wrapper.single.input-active .ts-control, .ts-wrapper.single.input-active .ts-control input {
441
+ cursor: text;
442
+ }
443
+
444
+ .ts-wrapper {
445
+ display: flex;
446
+ min-height: 36px;
447
+ }
448
+ .ts-wrapper.multi.has-items .ts-control {
449
+ padding-left: 5px;
450
+ --ts-pr-min: 5px;
451
+ }
452
+ .ts-wrapper.multi .ts-control [data-value] {
453
+ text-shadow: 0 1px 0 rgba(0, 51, 83, 0.3);
454
+ border-radius: 3px;
455
+ background-color: color-mix(#1da7ee, #178ee9, 60%);
456
+ background-image: linear-gradient(to bottom, #1da7ee, #178ee9);
457
+ background-repeat: repeat-x;
458
+ box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), inset 0 1px rgba(255, 255, 255, 0.03);
459
+ }
460
+ .ts-wrapper.multi .ts-control [data-value].active {
461
+ background-color: color-mix(#008fd8, #0075cf, 60%);
462
+ background-image: linear-gradient(to bottom, #008fd8, #0075cf);
463
+ background-repeat: repeat-x;
464
+ }
465
+ .ts-wrapper.multi.disabled .ts-control [data-value] {
466
+ color: #999;
467
+ text-shadow: none;
468
+ background: none;
469
+ box-shadow: none;
470
+ }
471
+ .ts-wrapper.multi.disabled .ts-control [data-value], .ts-wrapper.multi.disabled .ts-control [data-value] .remove {
472
+ border-color: #e6e6e6;
473
+ }
474
+ .ts-wrapper.multi.disabled .ts-control [data-value] .remove {
475
+ background: none;
476
+ }
477
+ .ts-wrapper.single .ts-control {
478
+ box-shadow: 0 1px 0 rgba(0, 0, 0, 0.05), inset 0 1px 0 rgba(255, 255, 255, 0.8);
479
+ background-color: color-mix(#fefefe, #f2f2f2, 60%);
480
+ background-image: linear-gradient(to bottom, #fefefe, #f2f2f2);
481
+ background-repeat: repeat-x;
482
+ }
483
+
484
+ .ts-wrapper.single .ts-control, .ts-dropdown.single {
485
+ border-color: #b8b8b8;
486
+ }
487
+
488
+ .dropdown-active .ts-control {
489
+ border-radius: 3px 3px 0 0;
490
+ }
491
+
492
+ .ts-dropdown .optgroup-header {
493
+ padding-top: 7px;
494
+ font-weight: bold;
495
+ font-size: 0.85em;
496
+ }
497
+ .ts-dropdown .optgroup {
498
+ border-top: 1px solid #f0f0f0;
499
+ }
500
+ .ts-dropdown .optgroup:first-child {
501
+ border-top: 0 none;
502
+ }
@@ -24,7 +24,7 @@ module Blazer
24
24
 
25
25
  if Blazer.override_csp
26
26
  after_action do
27
- response.headers['Content-Security-Policy'] = "default-src 'self' https: 'unsafe-inline' 'unsafe-eval' data: blob:"
27
+ response.headers["Content-Security-Policy"] = "default-src 'self' https: 'unsafe-inline' 'unsafe-eval' data: blob:"
28
28
  end
29
29
  end
30
30
 
@@ -5,7 +5,7 @@ module Blazer
5
5
  def index
6
6
  state_order = [nil, "disabled", "error", "timed out", "failing", "passing"]
7
7
  @checks = Blazer::Check.joins(:query).includes(:query).order("blazer_queries.name, blazer_checks.id").to_a.sort_by { |q| state_order.index(q.state) || 99 }
8
- @checks.select! { |c| "#{c.query.name} #{c.emails}".downcase.include?(params[:q]) } if params[:q]
8
+ @checks.select! { |c| "#{c.query.name} #{Blazer.notifiers.flat_map { |n| n.notify_list(c) }.join(", ")}".downcase.include?(params[:q]) } if params[:q]
9
9
  end
10
10
 
11
11
  def new
@@ -25,6 +25,9 @@ module Blazer
25
25
  end
26
26
  end
27
27
 
28
+ def edit
29
+ end
30
+
28
31
  def update
29
32
  if @check.update(check_params)
30
33
  redirect_to query_path(@check.query)
@@ -46,7 +49,7 @@ module Blazer
46
49
  private
47
50
 
48
51
  def check_params
49
- params.require(:check).permit(:query_id, :emails, :slack_channels, :invert, :check_type, :schedule)
52
+ params.require(:check).permit(:query_id, :invert, :check_type, :schedule, *Blazer.notifiers.flat_map(&:fields))
50
53
  end
51
54
 
52
55
  def set_check
@@ -43,7 +43,7 @@ module Blazer
43
43
  name: params[:name]
44
44
  )
45
45
  if params[:fork_query_id]
46
- @query.statement ||= Blazer::Query.find(params[:fork_query_id]).try(:statement)
46
+ @query.statement ||= Blazer::Query.find(params[:fork_query_id]).statement
47
47
  end
48
48
  if params[:upload_id]
49
49
  upload = Blazer::Upload.find(params[:upload_id])
@@ -125,6 +125,7 @@ module Blazer
125
125
  @columns = @result.columns
126
126
  @rows = @result.rows
127
127
  @error = @result.error
128
+ @explain = @result.explain
128
129
  @just_cached = !@result.error && @result.cached_at.present?
129
130
  @cached_at = nil
130
131
  params[:data_source] = nil
@@ -163,6 +164,7 @@ module Blazer
163
164
  @columns = @result.columns
164
165
  @rows = @result.rows
165
166
  @error = @result.error
167
+ @explain = @result.explain
166
168
  @cached_at = @result.cached_at
167
169
  @just_cached = @result.just_cached
168
170