sql-jarvis 2.0.8 → 2.0.9

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a5a36f0b67ceeb2631023fcf4b625fb1a614fa023499b26f6f3db2248191afce
4
- data.tar.gz: b3d84a6f1513b2b6d785053f7c261717b84878f89a5f73b3f399f89945a4c529
3
+ metadata.gz: 95d91e5cd88710c9bcfc4275feefe9adcf44fe0094ee18a1292ade8667c745f9
4
+ data.tar.gz: ca7ac9b757cf70a255354471daaaae0a38bade6e1d32943ca57bf00af45f62b8
5
5
  SHA512:
6
- metadata.gz: e48de5e62e08dbe79c39d2a5b83dcd96527ab1581bce37d00aac27707d68bdfa8552a630674467cdeda4840d9c6e2c507e8fc8958f888caef7f7598b71e51b7b
7
- data.tar.gz: 16a1199a86f623e06ffcd6fcbc2ce22ff2bfaebbf4d7c5e2a84f34dca29d9315c9ccfc65557991eee47944da6ffcb383d62a1bde80ef5fb4725b20e25d0e250b
6
+ metadata.gz: 455fa161a14556cef7aac3baba521186c670b0c1469e945cc55201fd9d4635aaecfbad20051fd3e08438bb0b455567e9059f0199c44700f7bba3bc48d9194f09
7
+ data.tar.gz: e3752620502bcfe904e0320df5f8b51725d41283ab47b496f8a9b60dddf43af722c1cf9be09f38e29ddca1674d9490e07a81299ec01e0ba25a81b60bac10d0c9
@@ -17,64 +17,5 @@
17
17
  //= require ./queries
18
18
  //= require ./fuzzysearch
19
19
  //= require ./select2
20
-
21
- Vue.config.devtools = false
22
- Vue.config.productionTip = false
23
-
24
- $(document).on('mouseenter', '.dropdown-toggle', function () {
25
- $(this).parent().addClass('open')
26
- })
27
-
28
- $(document).on("change", "#bind input, #bind select", function () {
29
- submitIfCompleted($(this).closest("form"))
30
- })
31
-
32
- $(document).on("click", "#code", function () {
33
- $(this).addClass("expanded")
34
- })
35
-
36
- function submitIfCompleted($form) {
37
- var completed = true
38
- $form.find("input[name], select").each( function () {
39
- if ($(this).val() == "") {
40
- completed = false
41
- }
42
- })
43
- if (completed) {
44
- $form.submit()
45
- }
46
- }
47
-
48
- // Prevent backspace from navigating backwards.
49
- // Adapted from Biff MaGriff: http://stackoverflow.com/a/7895814/1196499
50
- function preventBackspaceNav() {
51
- $(document).keydown(function (e) {
52
- var preventKeyPress
53
- if (e.keyCode == 8) {
54
- var d = e.srcElement || e.target
55
- switch (d.tagName.toUpperCase()) {
56
- case 'TEXTAREA':
57
- preventKeyPress = d.readOnly || d.disabled
58
- break
59
- case 'INPUT':
60
- preventKeyPress = d.readOnly || d.disabled || (d.attributes["type"] && $.inArray(d.attributes["type"].value.toLowerCase(), ["radio", "reset", "checkbox", "submit", "button"]) >= 0)
61
- break
62
- case 'DIV':
63
- preventKeyPress = d.readOnly || d.disabled || !(d.attributes["contentEditable"] && d.attributes["contentEditable"].value == "true")
64
- break
65
- default:
66
- preventKeyPress = true
67
- break
68
- }
69
- }
70
- else {
71
- preventKeyPress = false
72
- }
73
-
74
- if (preventKeyPress) {
75
- e.preventDefault()
76
- }
77
- })
78
- }
79
-
80
- preventBackspaceNav()
20
+ //= require ./position
21
+ //= require ./main
@@ -1,325 +1,325 @@
1
1
  /*! Copyright (c) Jonas Mosbech - https://github.com/jmosbech/StickyTableHeaders
2
- MIT license info: https://github.com/jmosbech/StickyTableHeaders/blob/master/license.txt */
2
+ MIT license info: https://github.com/jmosbech/StickyTableHeaders/blob/master/license.txt */
3
3
 
4
4
  ;(function ($, window, undefined) {
5
- 'use strict';
6
-
7
- var name = 'stickyTableHeaders',
8
- id = 0,
9
- defaults = {
10
- fixedOffset: 0,
11
- leftOffset: 0,
12
- marginTop: 0,
13
- objDocument: document,
14
- objHead: 'head',
15
- objWindow: window,
16
- scrollableArea: window,
17
- cacheHeaderHeight: false,
18
- zIndex: 3
19
- };
20
-
21
- function Plugin (el, options) {
22
- // To avoid scope issues, use 'base' instead of 'this'
23
- // to reference this class from internal events and functions.
24
- var base = this;
25
-
26
- // Access to jQuery and DOM versions of element
27
- base.$el = $(el);
28
- base.el = el;
29
- base.id = id++;
30
-
31
- // Listen for destroyed, call teardown
32
- base.$el.bind('destroyed',
33
- $.proxy(base.teardown, base));
34
-
35
- // Cache DOM refs for performance reasons
36
- base.$clonedHeader = null;
37
- base.$originalHeader = null;
38
-
39
- // Cache header height for performance reasons
40
- base.cachedHeaderHeight = null;
41
-
42
- // Keep track of state
43
- base.isSticky = false;
44
- base.hasBeenSticky = false;
45
- base.leftOffset = null;
46
- base.topOffset = null;
47
-
48
- base.init = function () {
49
- base.setOptions(options);
50
-
51
- base.$el.each(function () {
52
- var $this = $(this);
53
-
54
- // remove padding on <table> to fix issue #7
55
- $this.css('padding', 0);
56
-
57
- base.$originalHeader = $('thead:first', this);
58
- base.$clonedHeader = base.$originalHeader.clone();
59
- $this.trigger('clonedHeader.' + name, [base.$clonedHeader]);
60
-
61
- base.$clonedHeader.addClass('tableFloatingHeader');
62
- base.$clonedHeader.css({display: 'none', opacity: 0.0});
63
-
64
- base.$originalHeader.addClass('tableFloatingHeaderOriginal');
65
-
66
- base.$originalHeader.after(base.$clonedHeader);
67
-
68
- base.$printStyle = $('<style type="text/css" media="print">' +
69
- '.tableFloatingHeader{display:none !important;}' +
70
- '.tableFloatingHeaderOriginal{position:static !important;}' +
71
- '</style>');
72
- base.$head.append(base.$printStyle);
73
- });
74
-
75
- base.$clonedHeader.find("input, select").attr("disabled", true);
76
-
77
- base.updateWidth();
78
- base.toggleHeaders();
79
- base.bind();
80
- };
81
-
82
- base.destroy = function (){
83
- base.$el.unbind('destroyed', base.teardown);
84
- base.teardown();
85
- };
86
-
87
- base.teardown = function(){
88
- if (base.isSticky) {
89
- base.$originalHeader.css('position', 'static');
90
- }
91
- $.removeData(base.el, 'plugin_' + name);
92
- base.unbind();
93
-
94
- base.$clonedHeader.remove();
95
- base.$originalHeader.removeClass('tableFloatingHeaderOriginal');
96
- base.$originalHeader.css('visibility', 'visible');
97
- base.$printStyle.remove();
98
-
99
- base.el = null;
100
- base.$el = null;
101
- };
102
-
103
- base.bind = function(){
104
- base.$scrollableArea.on('scroll.' + name, base.toggleHeaders);
105
- if (!base.isWindowScrolling) {
106
- base.$window.on('scroll.' + name + base.id, base.setPositionValues);
107
- base.$window.on('resize.' + name + base.id, base.toggleHeaders);
108
- }
109
- base.$scrollableArea.on('resize.' + name, base.toggleHeaders);
110
- base.$scrollableArea.on('resize.' + name, base.updateWidth);
111
- };
112
-
113
- base.unbind = function(){
114
- // unbind window events by specifying handle so we don't remove too much
115
- base.$scrollableArea.off('.' + name, base.toggleHeaders);
116
- if (!base.isWindowScrolling) {
117
- base.$window.off('.' + name + base.id, base.setPositionValues);
118
- base.$window.off('.' + name + base.id, base.toggleHeaders);
119
- }
120
- base.$scrollableArea.off('.' + name, base.updateWidth);
121
- };
122
-
123
- // We debounce the functions bound to the scroll and resize events
124
- base.debounce = function (fn, delay) {
125
- var timer = null;
126
- return function () {
127
- var context = this, args = arguments;
128
- clearTimeout(timer);
129
- timer = setTimeout(function () {
130
- fn.apply(context, args);
131
- }, delay);
132
- };
133
- };
134
-
135
- base.toggleHeaders = base.debounce(function () {
136
- if (base.$el) {
137
- base.$el.each(function () {
138
- var $this = $(this),
139
- newLeft,
140
- newTopOffset = base.isWindowScrolling ? (
141
- isNaN(base.options.fixedOffset) ?
142
- base.options.fixedOffset.outerHeight() :
143
- base.options.fixedOffset
144
- ) :
145
- base.$scrollableArea.offset().top + (!isNaN(base.options.fixedOffset) ? base.options.fixedOffset : 0),
146
- offset = $this.offset(),
147
-
148
- scrollTop = base.$scrollableArea.scrollTop() + newTopOffset,
149
- scrollLeft = base.$scrollableArea.scrollLeft(),
150
-
151
- headerHeight,
152
-
153
- scrolledPastTop = base.isWindowScrolling ?
154
- scrollTop > offset.top :
155
- newTopOffset > offset.top,
156
- notScrolledPastBottom;
157
-
158
- if (scrolledPastTop) {
159
- headerHeight = base.options.cacheHeaderHeight ? base.cachedHeaderHeight : base.$clonedHeader.height();
160
- notScrolledPastBottom = (base.isWindowScrolling ? scrollTop : 0) <
161
- (offset.top + $this.height() - headerHeight - (base.isWindowScrolling ? 0 : newTopOffset));
162
- }
163
-
164
- if (scrolledPastTop && notScrolledPastBottom) {
165
- newLeft = offset.left - scrollLeft + base.options.leftOffset;
166
- base.$originalHeader.css({
167
- 'position': 'fixed',
168
- 'margin-top': base.options.marginTop,
169
- 'top': 0,
170
- 'left': newLeft,
171
- 'z-index': base.options.zIndex
172
- });
173
- base.leftOffset = newLeft;
174
- base.topOffset = newTopOffset;
175
- base.$clonedHeader.css('display', '');
176
- if (!base.isSticky) {
177
- base.isSticky = true;
178
- // make sure the width is correct: the user might have resized the browser while in static mode
179
- base.updateWidth();
180
- $this.trigger('enabledStickiness.' + name);
181
- }
182
- base.setPositionValues();
183
- } else if (base.isSticky) {
184
- base.$originalHeader.css('position', 'static');
185
- base.$clonedHeader.css('display', 'none');
186
- base.isSticky = false;
187
- base.resetWidth($('td,th', base.$clonedHeader), $('td,th', base.$originalHeader));
188
- $this.trigger('disabledStickiness.' + name);
189
- }
190
- });
191
- }
192
- }, 0);
193
-
194
- base.setPositionValues = base.debounce(function () {
195
- var winScrollTop = base.$window.scrollTop(),
196
- winScrollLeft = base.$window.scrollLeft();
197
- if (!base.isSticky ||
198
- winScrollTop < 0 || winScrollTop + base.$window.height() > base.$document.height() ||
199
- winScrollLeft < 0 || winScrollLeft + base.$window.width() > base.$document.width()) {
200
- return;
201
- }
202
- base.$originalHeader.css({
203
- 'top': base.topOffset - (base.isWindowScrolling ? 0 : winScrollTop),
204
- 'left': base.leftOffset - (base.isWindowScrolling ? 0 : winScrollLeft)
205
- });
206
- }, 0);
207
-
208
- base.updateWidth = base.debounce(function () {
209
- if (!base.isSticky) {
210
- return;
211
- }
212
- // Copy cell widths from clone
213
- if (!base.$originalHeaderCells) {
214
- base.$originalHeaderCells = $('th,td', base.$originalHeader);
215
- }
216
- if (!base.$clonedHeaderCells) {
217
- base.$clonedHeaderCells = $('th,td', base.$clonedHeader);
218
- }
219
- var cellWidths = base.getWidth(base.$clonedHeaderCells);
220
- base.setWidth(cellWidths, base.$clonedHeaderCells, base.$originalHeaderCells);
221
-
222
- // Copy row width from whole table
223
- base.$originalHeader.css('width', base.$clonedHeader.width());
224
-
225
- // If we're caching the height, we need to update the cached value when the width changes
226
- if (base.options.cacheHeaderHeight) {
227
- base.cachedHeaderHeight = base.$clonedHeader.height();
228
- }
229
- }, 0);
230
-
231
- base.getWidth = function ($clonedHeaders) {
232
- var widths = [];
233
- $clonedHeaders.each(function (index) {
234
- var width, $this = $(this);
235
-
236
- if ($this.css('box-sizing') === 'border-box') {
237
- var boundingClientRect = $this[0].getBoundingClientRect();
238
- if(boundingClientRect.width) {
239
- width = boundingClientRect.width; // #39: border-box bug
240
- } else {
241
- width = boundingClientRect.right - boundingClientRect.left; // ie8 bug: getBoundingClientRect() does not have a width property
242
- }
243
- } else {
244
- var $origTh = $('th', base.$originalHeader);
245
- if ($origTh.css('border-collapse') === 'collapse') {
246
- if (window.getComputedStyle) {
247
- width = parseFloat(window.getComputedStyle(this, null).width);
248
- } else {
249
- // ie8 only
250
- var leftPadding = parseFloat($this.css('padding-left'));
251
- var rightPadding = parseFloat($this.css('padding-right'));
252
- // Needs more investigation - this is assuming constant border around this cell and it's neighbours.
253
- var border = parseFloat($this.css('border-width'));
254
- width = $this.outerWidth() - leftPadding - rightPadding - border;
255
- }
256
- } else {
257
- width = $this.width();
258
- }
259
- }
260
-
261
- widths[index] = width;
262
- });
263
- return widths;
264
- };
265
-
266
- base.setWidth = function (widths, $clonedHeaders, $origHeaders) {
267
- $clonedHeaders.each(function (index) {
268
- var width = widths[index];
269
- $origHeaders.eq(index).css({
270
- 'min-width': width,
271
- 'max-width': width
272
- });
273
- });
274
- };
275
-
276
- base.resetWidth = function ($clonedHeaders, $origHeaders) {
277
- $clonedHeaders.each(function (index) {
278
- var $this = $(this);
279
- $origHeaders.eq(index).css({
280
- 'min-width': $this.css('min-width'),
281
- 'max-width': $this.css('max-width')
282
- });
283
- });
284
- };
285
-
286
- base.setOptions = function (options) {
287
- base.options = $.extend({}, defaults, options);
288
- base.$window = $(base.options.objWindow);
289
- base.$head = $(base.options.objHead);
290
- base.$document = $(base.options.objDocument);
291
- base.$scrollableArea = $(base.options.scrollableArea);
292
- base.isWindowScrolling = base.$scrollableArea[0] === base.$window[0];
293
- };
294
-
295
- base.updateOptions = function (options) {
296
- base.setOptions(options);
297
- // scrollableArea might have changed
298
- base.unbind();
299
- base.bind();
300
- base.updateWidth();
301
- base.toggleHeaders();
302
- };
303
-
304
- // Run initializer
305
- base.init();
306
- }
307
-
308
- // A plugin wrapper around the constructor,
309
- // preventing against multiple instantiations
310
- $.fn[name] = function ( options ) {
311
- return this.each(function () {
312
- var instance = $.data(this, 'plugin_' + name);
313
- if (instance) {
314
- if (typeof options === 'string') {
315
- instance[options].apply(instance);
316
- } else {
317
- instance.updateOptions(options);
318
- }
319
- } else if(options !== 'destroy') {
320
- $.data(this, 'plugin_' + name, new Plugin( this, options ));
321
- }
322
- });
323
- };
5
+ 'use strict';
6
+
7
+ var name = 'stickyTableHeaders',
8
+ id = 0,
9
+ defaults = {
10
+ fixedOffset: 0,
11
+ leftOffset: 0,
12
+ marginTop: 0,
13
+ objDocument: document,
14
+ objHead: 'head',
15
+ objWindow: window,
16
+ scrollableArea: window,
17
+ cacheHeaderHeight: false,
18
+ zIndex: 3
19
+ };
20
+
21
+ function Plugin (el, options) {
22
+ // To avoid scope issues, use 'base' instead of 'this'
23
+ // to reference this class from internal events and functions.
24
+ var base = this;
25
+
26
+ // Access to jQuery and DOM versions of element
27
+ base.$el = $(el);
28
+ base.el = el;
29
+ base.id = id++;
30
+
31
+ // Listen for destroyed, call teardown
32
+ base.$el.bind('destroyed',
33
+ $.proxy(base.teardown, base));
34
+
35
+ // Cache DOM refs for performance reasons
36
+ base.$clonedHeader = null;
37
+ base.$originalHeader = null;
38
+
39
+ // Cache header height for performance reasons
40
+ base.cachedHeaderHeight = null;
41
+
42
+ // Keep track of state
43
+ base.isSticky = false;
44
+ base.hasBeenSticky = false;
45
+ base.leftOffset = null;
46
+ base.topOffset = null;
47
+
48
+ base.init = function () {
49
+ base.setOptions(options);
50
+
51
+ base.$el.each(function () {
52
+ var $this = $(this);
53
+
54
+ // remove padding on <table> to fix issue #7
55
+ $this.css('padding', 0);
56
+
57
+ base.$originalHeader = $('thead:first', this);
58
+ base.$clonedHeader = base.$originalHeader.clone();
59
+ $this.trigger('clonedHeader.' + name, [base.$clonedHeader]);
60
+
61
+ base.$clonedHeader.addClass('tableFloatingHeader');
62
+ base.$clonedHeader.css({display: 'none', opacity: 0.0});
63
+
64
+ base.$originalHeader.addClass('tableFloatingHeaderOriginal');
65
+
66
+ base.$originalHeader.after(base.$clonedHeader);
67
+
68
+ base.$printStyle = $('<style type="text/css" media="print">' +
69
+ '.tableFloatingHeader{display:none !important;}' +
70
+ '.tableFloatingHeaderOriginal{position:static !important;}' +
71
+ '</style>');
72
+ base.$head.append(base.$printStyle);
73
+ });
74
+
75
+ base.$clonedHeader.find("input, select").attr("disabled", true);
76
+
77
+ base.updateWidth();
78
+ base.toggleHeaders();
79
+ base.bind();
80
+ };
81
+
82
+ base.destroy = function (){
83
+ base.$el.unbind('destroyed', base.teardown);
84
+ base.teardown();
85
+ };
86
+
87
+ base.teardown = function(){
88
+ if (base.isSticky) {
89
+ base.$originalHeader.css('position', 'static');
90
+ }
91
+ $.removeData(base.el, 'plugin_' + name);
92
+ base.unbind();
93
+
94
+ base.$clonedHeader.remove();
95
+ base.$originalHeader.removeClass('tableFloatingHeaderOriginal');
96
+ base.$originalHeader.css('visibility', 'visible');
97
+ base.$printStyle.remove();
98
+
99
+ base.el = null;
100
+ base.$el = null;
101
+ };
102
+
103
+ base.bind = function(){
104
+ base.$scrollableArea.on('scroll.' + name, base.toggleHeaders);
105
+ if (!base.isWindowScrolling) {
106
+ base.$window.on('scroll.' + name + base.id, base.setPositionValues);
107
+ base.$window.on('resize.' + name + base.id, base.toggleHeaders);
108
+ }
109
+ base.$scrollableArea.on('resize.' + name, base.toggleHeaders);
110
+ base.$scrollableArea.on('resize.' + name, base.updateWidth);
111
+ };
112
+
113
+ base.unbind = function(){
114
+ // unbind window events by specifying handle so we don't remove too much
115
+ base.$scrollableArea.off('.' + name, base.toggleHeaders);
116
+ if (!base.isWindowScrolling) {
117
+ base.$window.off('.' + name + base.id, base.setPositionValues);
118
+ base.$window.off('.' + name + base.id, base.toggleHeaders);
119
+ }
120
+ base.$scrollableArea.off('.' + name, base.updateWidth);
121
+ };
122
+
123
+ // We debounce the functions bound to the scroll and resize events
124
+ base.debounce = function (fn, delay) {
125
+ var timer = null;
126
+ return function () {
127
+ var context = this, args = arguments;
128
+ clearTimeout(timer);
129
+ timer = setTimeout(function () {
130
+ fn.apply(context, args);
131
+ }, delay);
132
+ };
133
+ };
134
+
135
+ base.toggleHeaders = base.debounce(function () {
136
+ if (base.$el) {
137
+ base.$el.each(function () {
138
+ var $this = $(this),
139
+ newLeft,
140
+ newTopOffset = base.isWindowScrolling ? (
141
+ isNaN(base.options.fixedOffset) ?
142
+ base.options.fixedOffset.outerHeight() :
143
+ base.options.fixedOffset
144
+ ) :
145
+ base.$scrollableArea.offset().top + (!isNaN(base.options.fixedOffset) ? base.options.fixedOffset : 0),
146
+ offset = $this.offset(),
147
+
148
+ scrollTop = base.$scrollableArea.scrollTop() + newTopOffset,
149
+ scrollLeft = base.$scrollableArea.scrollLeft(),
150
+
151
+ headerHeight,
152
+
153
+ scrolledPastTop = base.isWindowScrolling ?
154
+ scrollTop > offset.top :
155
+ newTopOffset > offset.top,
156
+ notScrolledPastBottom;
157
+
158
+ if (scrolledPastTop) {
159
+ headerHeight = base.options.cacheHeaderHeight ? base.cachedHeaderHeight : base.$clonedHeader.height();
160
+ notScrolledPastBottom = (base.isWindowScrolling ? scrollTop : 0) <
161
+ (offset.top + $this.height() - headerHeight - (base.isWindowScrolling ? 0 : newTopOffset));
162
+ }
163
+
164
+ if (scrolledPastTop && notScrolledPastBottom) {
165
+ newLeft = offset.left - scrollLeft + base.options.leftOffset;
166
+ base.$originalHeader.css({
167
+ 'position': 'fixed',
168
+ 'margin-top': base.options.marginTop,
169
+ 'top': 0,
170
+ 'left': newLeft,
171
+ 'z-index': base.options.zIndex
172
+ });
173
+ base.leftOffset = newLeft;
174
+ base.topOffset = newTopOffset;
175
+ base.$clonedHeader.css('display', '');
176
+ if (!base.isSticky) {
177
+ base.isSticky = true;
178
+ // make sure the width is correct: the user might have resized the browser while in static mode
179
+ base.updateWidth();
180
+ $this.trigger('enabledStickiness.' + name);
181
+ }
182
+ base.setPositionValues();
183
+ } else if (base.isSticky) {
184
+ base.$originalHeader.css('position', 'static');
185
+ base.$clonedHeader.css('display', 'none');
186
+ base.isSticky = false;
187
+ base.resetWidth($('td,th', base.$clonedHeader), $('td,th', base.$originalHeader));
188
+ $this.trigger('disabledStickiness.' + name);
189
+ }
190
+ });
191
+ }
192
+ }, 0);
193
+
194
+ base.setPositionValues = base.debounce(function () {
195
+ var winScrollTop = base.$window.scrollTop(),
196
+ winScrollLeft = base.$window.scrollLeft();
197
+ if (!base.isSticky ||
198
+ winScrollTop < 0 || winScrollTop + base.$window.height() > base.$document.height() ||
199
+ winScrollLeft < 0 || winScrollLeft + base.$window.width() > base.$document.width()) {
200
+ return;
201
+ }
202
+ base.$originalHeader.css({
203
+ 'top': base.topOffset - (base.isWindowScrolling ? 0 : winScrollTop),
204
+ 'left': base.leftOffset - (base.isWindowScrolling ? 0 : winScrollLeft)
205
+ });
206
+ }, 0);
207
+
208
+ base.updateWidth = base.debounce(function () {
209
+ if (!base.isSticky) {
210
+ return;
211
+ }
212
+ // Copy cell widths from clone
213
+ if (!base.$originalHeaderCells) {
214
+ base.$originalHeaderCells = $('th,td', base.$originalHeader);
215
+ }
216
+ if (!base.$clonedHeaderCells) {
217
+ base.$clonedHeaderCells = $('th,td', base.$clonedHeader);
218
+ }
219
+ var cellWidths = base.getWidth(base.$clonedHeaderCells);
220
+ base.setWidth(cellWidths, base.$clonedHeaderCells, base.$originalHeaderCells);
221
+
222
+ // Copy row width from whole table
223
+ base.$originalHeader.css('width', base.$clonedHeader.width());
224
+
225
+ // If we're caching the height, we need to update the cached value when the width changes
226
+ if (base.options.cacheHeaderHeight) {
227
+ base.cachedHeaderHeight = base.$clonedHeader.height();
228
+ }
229
+ }, 0);
230
+
231
+ base.getWidth = function ($clonedHeaders) {
232
+ var widths = [];
233
+ $clonedHeaders.each(function (index) {
234
+ var width, $this = $(this);
235
+
236
+ if ($this.css('box-sizing') === 'border-box') {
237
+ var boundingClientRect = $this[0].getBoundingClientRect();
238
+ if(boundingClientRect.width) {
239
+ width = boundingClientRect.width; // #39: border-box bug
240
+ } else {
241
+ width = boundingClientRect.right - boundingClientRect.left; // ie8 bug: getBoundingClientRect() does not have a width property
242
+ }
243
+ } else {
244
+ var $origTh = $('th', base.$originalHeader);
245
+ if ($origTh.css('border-collapse') === 'collapse') {
246
+ if (window.getComputedStyle) {
247
+ width = parseFloat(window.getComputedStyle(this, null).width);
248
+ } else {
249
+ // ie8 only
250
+ var leftPadding = parseFloat($this.css('padding-left'));
251
+ var rightPadding = parseFloat($this.css('padding-right'));
252
+ // Needs more investigation - this is assuming constant border around this cell and it's neighbours.
253
+ var border = parseFloat($this.css('border-width'));
254
+ width = $this.outerWidth() - leftPadding - rightPadding - border;
255
+ }
256
+ } else {
257
+ width = $this.width();
258
+ }
259
+ }
260
+
261
+ widths[index] = width;
262
+ });
263
+ return widths;
264
+ };
265
+
266
+ base.setWidth = function (widths, $clonedHeaders, $origHeaders) {
267
+ $clonedHeaders.each(function (index) {
268
+ var width = widths[index];
269
+ $origHeaders.eq(index).css({
270
+ 'min-width': width,
271
+ 'max-width': width
272
+ });
273
+ });
274
+ };
275
+
276
+ base.resetWidth = function ($clonedHeaders, $origHeaders) {
277
+ $clonedHeaders.each(function (index) {
278
+ var $this = $(this);
279
+ $origHeaders.eq(index).css({
280
+ 'min-width': $this.css('min-width'),
281
+ 'max-width': $this.css('max-width')
282
+ });
283
+ });
284
+ };
285
+
286
+ base.setOptions = function (options) {
287
+ base.options = $.extend({}, defaults, options);
288
+ base.$window = $(base.options.objWindow);
289
+ base.$head = $(base.options.objHead);
290
+ base.$document = $(base.options.objDocument);
291
+ base.$scrollableArea = $(base.options.scrollableArea);
292
+ base.isWindowScrolling = base.$scrollableArea[0] === base.$window[0];
293
+ };
294
+
295
+ base.updateOptions = function (options) {
296
+ base.setOptions(options);
297
+ // scrollableArea might have changed
298
+ base.unbind();
299
+ base.bind();
300
+ base.updateWidth();
301
+ base.toggleHeaders();
302
+ };
303
+
304
+ // Run initializer
305
+ base.init();
306
+ }
307
+
308
+ // A plugin wrapper around the constructor,
309
+ // preventing against multiple instantiations
310
+ $.fn[name] = function ( options ) {
311
+ return this.each(function () {
312
+ var instance = $.data(this, 'plugin_' + name);
313
+ if (instance) {
314
+ if (typeof options === 'string') {
315
+ instance[options].apply(instance);
316
+ } else {
317
+ instance.updateOptions(options);
318
+ }
319
+ } else if(options !== 'destroy') {
320
+ $.data(this, 'plugin_' + name, new Plugin( this, options ));
321
+ }
322
+ });
323
+ };
324
324
 
325
325
  })(jQuery, window);
@@ -0,0 +1,140 @@
1
+ Vue.config.devtools = false
2
+ Vue.config.productionTip = false
3
+
4
+ $(document).on('mouseenter', '.dropdown-toggle', function () {
5
+ $(this).parent().addClass('open')
6
+ })
7
+
8
+ $(document).on("change", "#bind input, #bind select", function () {
9
+ submitIfCompleted($(this).closest("form"))
10
+ })
11
+
12
+ $(document).on("click", "#code", function () {
13
+ $(this).addClass("expanded")
14
+ })
15
+
16
+ $(document).on("click", "a.click2CopyTable", function (event) {
17
+ event.preventDefault();
18
+ var selector = $(this).attr('href');
19
+ copyToClipboard(selector)
20
+ })
21
+
22
+ $(document).on("mouseover", "table th[data-popup='true']", function (event) {
23
+ var sum = 0, numbers = [];
24
+ var columns = $(this).parents('thead').find('th');
25
+ var columnIndex = columns.index(this) + 1;
26
+ var cells = $(this).parents('table').find('tbody tr td:nth-child('+columnIndex+')');
27
+ cells.each(function(index, cell) {
28
+ content = $(cell).text();
29
+ content = content.split('.').join('').replace(',', '.');
30
+ float = parseFloat(content);
31
+ if (isNaN(float)) float = 0;
32
+ numbers.push(float);
33
+ sum += float
34
+ });
35
+ showTooltip({
36
+ el: this,
37
+ min: Math.min.apply(null, numbers),
38
+ max: Math.max.apply(null, numbers),
39
+ avg: parseFloat((sum / cells.length).toFixed(2)),
40
+ sum: sum,
41
+ count: cells.length
42
+ })
43
+ })
44
+
45
+ $(document).on("mouseleave", "table th[data-popup='true']", function (event) {
46
+ $('#summanyPopup').remove();
47
+ })
48
+
49
+ function submitIfCompleted($form) {
50
+ var completed = true
51
+ $form.find("input[name], select").each( function () {
52
+ if ($(this).val() == "") {
53
+ completed = false
54
+ }
55
+ })
56
+ if (completed) {
57
+ $form.submit()
58
+ }
59
+ }
60
+
61
+ // Prevent backspace from navigating backwards.
62
+ // Adapted from Biff MaGriff: http://stackoverflow.com/a/7895814/1196499
63
+ function preventBackspaceNav() {
64
+ $(document).keydown(function (e) {
65
+ var preventKeyPress
66
+ if (e.keyCode == 8) {
67
+ var d = e.srcElement || e.target
68
+ switch (d.tagName.toUpperCase()) {
69
+ case 'TEXTAREA':
70
+ preventKeyPress = d.readOnly || d.disabled
71
+ break
72
+ case 'INPUT':
73
+ preventKeyPress = d.readOnly || d.disabled || (d.attributes["type"] && $.inArray(d.attributes["type"].value.toLowerCase(), ["radio", "reset", "checkbox", "submit", "button"]) >= 0)
74
+ break
75
+ case 'DIV':
76
+ preventKeyPress = d.readOnly || d.disabled || !(d.attributes["contentEditable"] && d.attributes["contentEditable"].value == "true")
77
+ break
78
+ default:
79
+ preventKeyPress = true
80
+ break
81
+ }
82
+ }
83
+ else {
84
+ preventKeyPress = false
85
+ }
86
+
87
+ if (preventKeyPress) {
88
+ e.preventDefault()
89
+ }
90
+ })
91
+ }
92
+
93
+ function copyToClipboard(selector) {
94
+ $(selector).find('.text-muted').hide();
95
+ var el = $(selector)[0];
96
+ var body = document.body, range, sel;
97
+ if (document.createRange && window.getSelection) {
98
+ range = document.createRange();
99
+ sel = window.getSelection();
100
+ sel.removeAllRanges();
101
+ try {
102
+ range.selectNodeContents(el);
103
+ sel.addRange(range);
104
+ } catch (e) {
105
+ range.selectNode(el);
106
+ sel.addRange(range);
107
+ }
108
+ document.execCommand("copy");
109
+ sel.removeAllRanges();
110
+ } else if (body.createTextRange) {
111
+ range = body.createTextRange();
112
+ range.moveToElementText(el);
113
+ range.select();
114
+ range.execCommand("Copy");
115
+ sel.removeAllRanges();
116
+ }
117
+ $(selector).find('.text-muted').show();
118
+ }
119
+
120
+ function showTooltip(data) {
121
+ var position = $(data.el).weOffset();
122
+ var top = position.top + 20 + $(data.el).height();
123
+ var left = position.left - 100 + $(data.el).width() / 2;
124
+ var tooltipEl = $('#summanyPopup');
125
+ if (tooltipEl.length == 0) {
126
+ tooltipEl = $('<div/>').attr('id', 'summanyPopup').appendTo('body');
127
+ }
128
+ tooltipEl.css({ top: top, left: left }).html('');
129
+ $('<p/>').html('Count: <span>' + formatNumber(data.count) + '</span>').appendTo(tooltipEl);
130
+ $('<p/>').html('Min: <span>' + formatNumber(data.min) + '</span>').appendTo(tooltipEl);
131
+ $('<p/>').html('Max: <span>' + formatNumber(data.max) + '</span>').appendTo(tooltipEl);
132
+ $('<p/>').html('Avg: <span>' + formatNumber(data.avg) + '</span>').appendTo(tooltipEl);
133
+ $('<p/>').html('Sum: <span>' + formatNumber(data.sum) + '</span>').appendTo(tooltipEl);
134
+ }
135
+
136
+ function formatNumber(num) {
137
+ return num.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,')
138
+ }
139
+
140
+ preventBackspaceNav()
@@ -0,0 +1,7 @@
1
+ (function($) {
2
+ jQuery.fn.weOffset = function () {
3
+ var top = $(this).offset().top - (window.scrollY || window.pageYOffset || document.body.scrollTop);
4
+ var left = $(this).offset().left - (window.scrollX || window.pageXOffset || document.body.scrollLeft);
5
+ return { top: top, left: left };
6
+ };
7
+ }(jQuery));
@@ -594,7 +594,6 @@ var formatComponentName = (noop);
594
594
  if (config.warnHandler) {
595
595
  config.warnHandler.call(null, msg, vm, trace);
596
596
  } else if (hasConsole && (!config.silent)) {
597
- console.error(("[Vue warn]: " + msg + trace));
598
597
  }
599
598
  };
600
599
 
@@ -4,6 +4,7 @@
4
4
  *= require ./github
5
5
  *= require ./daterangepicker
6
6
  *= require ./select2.min
7
+ *= require ./main
7
8
  *= require_self
8
9
  */
9
10
 
@@ -0,0 +1,48 @@
1
+ #summanyPopup {
2
+ position: fixed;
3
+ background-color: #FFF;
4
+ z-index: 100;
5
+ border-radius: 5px;
6
+ width: 200px;
7
+ padding: 15px;
8
+ box-shadow: inset 0 4px 7px 1px #fff, inset 0 -5px 20px rgba(173,186,204,.25), 0 2px 6px rgba(0,21,64,.14), 0 10px 20px rgba(0,21,64,.05);
9
+ top: 30px;
10
+ }
11
+
12
+ #summanyPopup p {
13
+ margin-bottom: 10px;
14
+ }
15
+
16
+ #summanyPopup p span {
17
+ float: right;
18
+ }
19
+
20
+ #summanyPopup:after {
21
+ bottom: 100%;
22
+ left: 50%;
23
+ border: solid transparent;
24
+ content: " ";
25
+ height: 0;
26
+ width: 0;
27
+ position: absolute;
28
+ pointer-events: none;
29
+ border-color: rgba(0, 0, 0, 0);
30
+ border-bottom-color: #FFF;
31
+ border-width: 10px;
32
+ margin-left: -10px;
33
+ }
34
+
35
+ #summanyPopup:before {
36
+ bottom: 101%;
37
+ left: 50%;
38
+ border: solid transparent;
39
+ content: " ";
40
+ height: 0;
41
+ width: 0;
42
+ position: absolute;
43
+ pointer-events: none;
44
+ border-color: rgba(0, 0, 0, 0);
45
+ border-bottom-color: #BBB;
46
+ border-width: 10px;
47
+ margin-left: -10px;
48
+ }
@@ -25,6 +25,8 @@
25
25
  <a v-on:click="run" v-if="!running" class="btn btn-info" style="vertical-align: top; width: 70px;">Run</a>
26
26
  <a v-on:click="cancel" v-if="running" class="btn btn-danger" style="vertical-align: top; width: 70px;">Cancel</a>
27
27
  </div>
28
+ <hr>
29
+ <%= render partial: "tips" %>
28
30
  </div>
29
31
  <div class="col-xs-4">
30
32
  <div class="form-group">
@@ -61,8 +63,6 @@
61
63
  </div>
62
64
  <% end %>
63
65
  <% end %>
64
- <hr>
65
- <%= render partial: "tips" %>
66
66
  </div>
67
67
  </div>
68
68
  <% end %>
@@ -24,21 +24,6 @@
24
24
  <% end %>
25
25
  </p>
26
26
  <% end %>
27
- <p class="text-muted" style="margin-bottom: 10px;">
28
- <%= pluralize(@rows.size, "row") %>
29
-
30
- <% @checks.select(&:state).each do |check| %>
31
- &middot; <small class="check-state <%= check.state.parameterize.gsub("-", "_") %>"><%= link_to check.state.upcase, edit_check_path(check) %></small>
32
- <% if check.try(:message) %>
33
- &middot; <%= check.message %>
34
- <% end %>
35
- <% end %>
36
-
37
- <% if @query && @result.forecastable? && !params[:forecast] %>
38
- &middot;
39
- <%= link_to "Forecast", query_path(@query, {forecast: "t"}.merge(variable_params)) %>
40
- <% end %>
41
- </p>
42
27
  <% end %>
43
28
  <% if @forecast_error %>
44
29
  <div class="alert alert-danger"><%= @forecast_error %></div>
@@ -144,52 +129,74 @@
144
129
  <% elsif @columns == ["PLAN"] && @data_source.adapter == "druid" %>
145
130
  <pre><code><%= @rows[0][0] %></code></pre>
146
131
  <% else %>
147
- <table class="table results-table" style="margin-bottom: 0;">
148
- <thead>
149
- <tr>
150
- <% @columns.each_with_index do |key, i| %>
151
- <% type = @column_types[i] %>
152
- <th style="width: <%= header_width %>%;" data-sort="<%= type %>">
153
- <div style="min-width: <%= @min_width_types.include?(i) ? 180 : 60 %>px;">
154
- <%= key %>
155
- </div>
156
- </th>
157
- <% end %>
158
- </tr>
159
- </thead>
160
- <tbody>
161
- <% @rows.each do |row| %>
132
+ <p class="text-muted" style="margin-bottom: 10px; margin-top: 15px">
133
+ <%= pluralize(@rows.size, "row") %>
134
+ <% @checks.select(&:state).each do |check| %>
135
+ &middot; <small class="check-state <%= check.state.parameterize.gsub("-", "_") %>"><%= link_to check.state.upcase, edit_check_path(check) %></small>
136
+ <% if check.try(:message) %>
137
+ &middot; <%= check.message %>
138
+ <% end %>
139
+ <% end %>
140
+
141
+ <% if @query && @result.forecastable? && !params[:forecast] %>
142
+ &middot;
143
+ <%= link_to "Forecast", query_path(@query, {forecast: "t"}.merge(variable_params)) %>
144
+ <% end %>
145
+ <span class='pull-right'>
146
+ <%- if @rows.size > 0 %>
147
+ <%= link_to 'Copy to clipboard', '#results-table', class: 'click2CopyTable btn btn-xs btn-info' %>
148
+ <% end %>
149
+ </span>
150
+ </p>
151
+ <div class='scroll-content'>
152
+ <table class="table results-table" id='results-table'>
153
+ <thead>
162
154
  <tr>
163
- <% row.each_with_index do |v, i| %>
164
- <% k = @columns[i] %>
165
- <td>
166
- <% if v.is_a?(Time) %>
167
- <% v = blazer_time_value(@data_source, k, v) %>
168
- <% end %>
155
+ <% @columns.each_with_index do |key, i| %>
156
+ <% type = @column_types[i] %>
157
+ <% summany_popup = type.in?(['float', 'int']) && !key.end_with?('id') %>
158
+ <th style="width: <%= header_width %>%;" data-sort="<%= type %>" data-popup=<%= summany_popup %>>
159
+ <div style="min-width: <%= @min_width_types.include?(i) ? 180 : 60 %>px;">
160
+ <%= key %>
161
+ </div>
162
+ </th>
163
+ <% end %>
164
+ </tr>
165
+ </thead>
166
+ <tbody>
167
+ <% @rows.each do |row| %>
168
+ <tr>
169
+ <% row.each_with_index do |v, i| %>
170
+ <% k = @columns[i] %>
171
+ <td>
172
+ <% if v.is_a?(Time) %>
173
+ <% v = blazer_time_value(@data_source, k, v) %>
174
+ <% end %>
169
175
 
170
- <% unless v.nil? %>
171
- <% if v.is_a?(String) && v == "" %>
172
- <div class="text-muted">empty string</div>
173
- <% elsif @linked_columns[k] %>
174
- <%= link_to blazer_format_value(k, v), @linked_columns[k].gsub("{value}", u(v.to_s)), target: "_blank" %>
175
- <% else %>
176
- <%= blazer_format_value(k, v) %>
176
+ <% unless v.nil? %>
177
+ <% if v.is_a?(String) && v == "" %>
178
+ <div class="text-muted">empty string</div>
179
+ <% elsif @linked_columns[k] %>
180
+ <%= link_to blazer_format_value(k, v), @linked_columns[k].gsub("{value}", u(v.to_s)), target: "_blank" %>
181
+ <% else %>
182
+ <%= blazer_format_value(k, v) %>
183
+ <% end %>
177
184
  <% end %>
178
- <% end %>
179
185
 
180
- <% if v2 = (@boom[k] || {})[v.nil? ? v : v.to_s] %>
181
- <div class="text-muted"><%= v2 %></div>
182
- <% end %>
183
- </td>
184
- <% end %>
185
- </tr>
186
- <% end %>
187
- </tbody>
188
- </table>
186
+ <% if v2 = (@boom[k] || {})[v.nil? ? v : v.to_s] %>
187
+ <div class="text-muted"><%= v2 %></div>
188
+ <% end %>
189
+ </td>
190
+ <% end %>
191
+ </tr>
192
+ <% end %>
193
+ </tbody>
194
+ </table>
195
+ </div>
189
196
  <% end %>
190
197
  </div>
191
198
  <% end %>
192
- <% elsif @only_chart %>
193
- <p class="text-muted">No rows</p>
199
+ <% else %>
200
+ <p class="text-muted text-center" style='margin-top: 15px'>No rows</p>
194
201
  <% end %>
195
202
  <% end %>
@@ -49,12 +49,14 @@
49
49
 
50
50
  <script>
51
51
  function showRun(data) {
52
- $("#results").html(data)
53
- $("#results table").stupidtable().stickyTableHeaders({fixedOffset: 60})
52
+ $("#results").html(data);
53
+ $("#results table").stupidtable().stickyTableHeaders({
54
+ fixedOffset: 60,
55
+ });
54
56
  }
55
57
 
56
58
  function showError(message) {
57
- $("#results").addClass("query-error").html(message)
59
+ $("#results").addClass("query-error").html(message);
58
60
  }
59
61
 
60
62
  <%= blazer_js_var "data", variable_params.merge(statement: @statement, query_id: @query.id, data_source: @query.data_source) %>
@@ -1,3 +1,3 @@
1
1
  module Blazer
2
- VERSION = '2.0.8'
2
+ VERSION = '2.0.9'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sql-jarvis
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.8
4
+ version: 2.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-19 00:00:00.000000000 Z
11
+ date: 2019-05-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -170,8 +170,10 @@ files:
170
170
  - app/assets/javascripts/blazer/jquery-ujs.js
171
171
  - app/assets/javascripts/blazer/jquery.js
172
172
  - app/assets/javascripts/blazer/jquery.stickytableheaders.js
173
+ - app/assets/javascripts/blazer/main.js
173
174
  - app/assets/javascripts/blazer/moment-timezone-with-data.js
174
175
  - app/assets/javascripts/blazer/moment.js
176
+ - app/assets/javascripts/blazer/position.js
175
177
  - app/assets/javascripts/blazer/queries.js
176
178
  - app/assets/javascripts/blazer/routes.js
177
179
  - app/assets/javascripts/blazer/select2.js
@@ -182,6 +184,7 @@ files:
182
184
  - app/assets/stylesheets/blazer/bootstrap.css.erb
183
185
  - app/assets/stylesheets/blazer/daterangepicker.css
184
186
  - app/assets/stylesheets/blazer/github.css
187
+ - app/assets/stylesheets/blazer/main.css
185
188
  - app/assets/stylesheets/blazer/select2.min.css
186
189
  - app/assets/stylesheets/blazer/selectize.default.css
187
190
  - app/controllers/blazer/base_controller.rb
@@ -264,8 +267,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
264
267
  - !ruby/object:Gem::Version
265
268
  version: '0'
266
269
  requirements: []
267
- rubyforge_project:
268
- rubygems_version: 2.7.7
270
+ rubygems_version: 3.0.3
269
271
  signing_key:
270
272
  specification_version: 4
271
273
  summary: Fork from ankane! Explore your data with SQL. Easily create charts and dashboards,