oxidized-web 0.13.1 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of oxidized-web might be problematic. Click here for more details.

Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/.github/PULL_REQUEST_TEMPLATE.md +12 -0
  3. data/.github/dependabot.yml +25 -0
  4. data/.github/workflows/codeql.yml +76 -0
  5. data/.github/workflows/ruby.yml +41 -0
  6. data/.github/workflows/stale.yml +20 -0
  7. data/.gitignore +3 -0
  8. data/.rubocop.yml +38 -3
  9. data/.rubocop_todo.yml +27 -211
  10. data/CHANGELOG.md +46 -0
  11. data/README.md +8 -5
  12. data/Rakefile +49 -5
  13. data/docs/development.md +182 -0
  14. data/lib/oxidized/web/public/css/oxidized.css +59 -0
  15. data/lib/oxidized/web/public/scripts/oxidized.js +1 -48
  16. data/lib/oxidized/web/public/weblibs/bootstrap-icons.css +2078 -0
  17. data/lib/oxidized/web/public/weblibs/bootstrap.bundle.js +6314 -0
  18. data/lib/oxidized/web/public/weblibs/bootstrap.bundle.js.map +1 -0
  19. data/lib/oxidized/web/public/weblibs/bootstrap.css +12057 -0
  20. data/lib/oxidized/web/public/weblibs/bootstrap.css.map +1 -0
  21. data/lib/oxidized/web/public/weblibs/bootstrap.js +4494 -0
  22. data/lib/oxidized/web/public/weblibs/bootstrap.js.map +1 -0
  23. data/lib/oxidized/web/public/weblibs/buttons.bootstrap5.css +395 -0
  24. data/lib/oxidized/web/public/weblibs/buttons.bootstrap5.js +114 -0
  25. data/lib/oxidized/web/public/weblibs/buttons.colVis.js +256 -0
  26. data/lib/oxidized/web/public/weblibs/dataTables.bootstrap5.css +517 -0
  27. data/lib/oxidized/web/public/weblibs/dataTables.bootstrap5.js +122 -0
  28. data/lib/oxidized/web/public/weblibs/dataTables.buttons.js +2936 -0
  29. data/lib/oxidized/web/public/weblibs/dataTables.js +13843 -0
  30. data/lib/oxidized/web/public/weblibs/fonts/bootstrap-icons.woff +0 -0
  31. data/lib/oxidized/web/public/weblibs/fonts/bootstrap-icons.woff2 +0 -0
  32. data/lib/oxidized/web/public/weblibs/jquery.js +10716 -0
  33. data/lib/oxidized/web/version.rb +7 -0
  34. data/lib/oxidized/web/views/conf_search.haml +14 -13
  35. data/lib/oxidized/web/views/diffs.haml +5 -5
  36. data/lib/oxidized/web/views/footer.haml +5 -4
  37. data/lib/oxidized/web/views/head.haml +21 -7
  38. data/lib/oxidized/web/views/layout.haml +25 -34
  39. data/lib/oxidized/web/views/node.haml +10 -8
  40. data/lib/oxidized/web/views/nodes.haml +45 -35
  41. data/lib/oxidized/web/views/stats.haml +32 -24
  42. data/lib/oxidized/web/views/version.haml +8 -6
  43. data/lib/oxidized/web/views/versions.haml +23 -24
  44. data/lib/oxidized/web/webapp.rb +117 -113
  45. data/lib/oxidized/web.rb +10 -7
  46. data/oxidized-web.gemspec +32 -18
  47. data/package-lock.json +104 -0
  48. data/package.json +21 -0
  49. data/spec/node_spec.rb +99 -0
  50. data/spec/node_version_spec.rb +102 -0
  51. data/spec/nodes_spec.rb +57 -0
  52. data/spec/root_spec.rb +18 -0
  53. data/spec/spec_helper.rb +11 -0
  54. data/spec/webapp_spec.rb +28 -0
  55. metadata +183 -74
  56. data/lib/oxidized/web/mig.rb +0 -150
  57. data/lib/oxidized/web/public/css/bootstrap.min.css +0 -5
  58. data/lib/oxidized/web/public/css/buttons.bootstrap.min.css +0 -1
  59. data/lib/oxidized/web/public/css/dataTables.bootstrap.css +0 -299
  60. data/lib/oxidized/web/public/css/dataTables.colVis.css +0 -171
  61. data/lib/oxidized/web/public/css/oxidized_custom.css +0 -19
  62. data/lib/oxidized/web/public/fonts/glyphicons-halflings-regular.eot +0 -0
  63. data/lib/oxidized/web/public/fonts/glyphicons-halflings-regular.svg +0 -229
  64. data/lib/oxidized/web/public/fonts/glyphicons-halflings-regular.ttf +0 -0
  65. data/lib/oxidized/web/public/fonts/glyphicons-halflings-regular.woff +0 -0
  66. data/lib/oxidized/web/public/images/diff_15x17.png +0 -0
  67. data/lib/oxidized/web/public/images/sort_asc.png +0 -0
  68. data/lib/oxidized/web/public/images/sort_asc_disabled.png +0 -0
  69. data/lib/oxidized/web/public/images/sort_both.png +0 -0
  70. data/lib/oxidized/web/public/images/sort_desc.png +0 -0
  71. data/lib/oxidized/web/public/images/sort_desc_disabled.png +0 -0
  72. data/lib/oxidized/web/public/images/versioning_18px.png +0 -0
  73. data/lib/oxidized/web/public/scripts/bootstrap.min.js +0 -6
  74. data/lib/oxidized/web/public/scripts/dataTables.bootstrap.js +0 -186
  75. data/lib/oxidized/web/public/scripts/dataTables.colVis.js +0 -1123
  76. data/lib/oxidized/web/public/scripts/jquery-2.1.1.min.js +0 -4
  77. data/lib/oxidized/web/public/scripts/jquery.dataTables.min.js +0 -157
  78. data/lib/oxidized/web/public/scripts/jquery.min.js +0 -6
  79. data/lib/oxidized/web/public/scripts/script-migration.js +0 -15
  80. data/lib/oxidized/web/views/migration.haml +0 -46
  81. data/lib/oxidized/web/views/sass/oxidized.sass +0 -113
@@ -0,0 +1,395 @@
1
+ @keyframes dtb-spinner {
2
+ 100% {
3
+ transform: rotate(360deg);
4
+ }
5
+ }
6
+ @-o-keyframes dtb-spinner {
7
+ 100% {
8
+ -o-transform: rotate(360deg);
9
+ transform: rotate(360deg);
10
+ }
11
+ }
12
+ @-ms-keyframes dtb-spinner {
13
+ 100% {
14
+ -ms-transform: rotate(360deg);
15
+ transform: rotate(360deg);
16
+ }
17
+ }
18
+ @-webkit-keyframes dtb-spinner {
19
+ 100% {
20
+ -webkit-transform: rotate(360deg);
21
+ transform: rotate(360deg);
22
+ }
23
+ }
24
+ @-moz-keyframes dtb-spinner {
25
+ 100% {
26
+ -moz-transform: rotate(360deg);
27
+ transform: rotate(360deg);
28
+ }
29
+ }
30
+ div.dataTables_wrapper {
31
+ position: relative;
32
+ }
33
+
34
+ div.dt-buttons {
35
+ position: initial;
36
+ }
37
+ div.dt-buttons .dt-button {
38
+ overflow: hidden;
39
+ text-overflow: ellipsis;
40
+ white-space: nowrap;
41
+ }
42
+
43
+ div.dt-button-info {
44
+ position: fixed;
45
+ top: 50%;
46
+ left: 50%;
47
+ width: 400px;
48
+ margin-top: -100px;
49
+ margin-left: -200px;
50
+ background-color: white;
51
+ border-radius: 0.75em;
52
+ box-shadow: 3px 4px 10px 1px rgba(0, 0, 0, 0.8);
53
+ text-align: center;
54
+ z-index: 2003;
55
+ overflow: hidden;
56
+ }
57
+ div.dt-button-info h2 {
58
+ padding: 2rem 2rem 1rem 2rem;
59
+ margin: 0;
60
+ font-weight: normal;
61
+ }
62
+ div.dt-button-info > div {
63
+ padding: 1em 2em 2em 2em;
64
+ }
65
+
66
+ div.dtb-popover-close {
67
+ position: absolute;
68
+ top: 6px;
69
+ right: 6px;
70
+ width: 22px;
71
+ height: 22px;
72
+ text-align: center;
73
+ border-radius: 3px;
74
+ cursor: pointer;
75
+ z-index: 2003;
76
+ }
77
+
78
+ button.dtb-hide-drop {
79
+ display: none !important;
80
+ }
81
+
82
+ div.dt-button-collection-title {
83
+ text-align: center;
84
+ padding: 0.3em 0.5em 0.5em;
85
+ margin-left: 0.5em;
86
+ margin-right: 0.5em;
87
+ font-size: 0.9em;
88
+ white-space: nowrap;
89
+ overflow: hidden;
90
+ text-overflow: ellipsis;
91
+ }
92
+
93
+ div.dt-button-collection-title:empty {
94
+ display: none;
95
+ }
96
+
97
+ span.dt-button-spacer {
98
+ display: inline-block;
99
+ margin: 0.5em;
100
+ white-space: nowrap;
101
+ }
102
+ span.dt-button-spacer.bar {
103
+ border-left: 1px solid rgba(0, 0, 0, 0.3);
104
+ vertical-align: middle;
105
+ padding-left: 0.5em;
106
+ }
107
+ span.dt-button-spacer.bar:empty {
108
+ height: 1em;
109
+ width: 1px;
110
+ padding-left: 0;
111
+ }
112
+
113
+ div.dt-button-collection .dt-button-active {
114
+ padding-right: 3em;
115
+ }
116
+ div.dt-button-collection .dt-button-active:after {
117
+ position: absolute;
118
+ top: 50%;
119
+ margin-top: -10px;
120
+ right: 1em;
121
+ display: inline-block;
122
+ content: "✓";
123
+ color: inherit;
124
+ }
125
+ div.dt-button-collection .dt-button-active.dt-button-split {
126
+ padding-right: 0;
127
+ }
128
+ div.dt-button-collection .dt-button-active.dt-button-split:after {
129
+ display: none;
130
+ }
131
+ div.dt-button-collection .dt-button-active.dt-button-split > *:first-child {
132
+ padding-right: 3em;
133
+ }
134
+ div.dt-button-collection .dt-button-active.dt-button-split > *:first-child:after {
135
+ position: absolute;
136
+ top: 50%;
137
+ margin-top: -10px;
138
+ right: 1em;
139
+ display: inline-block;
140
+ content: "✓";
141
+ color: inherit;
142
+ }
143
+ div.dt-button-collection .dt-button-active-a a {
144
+ padding-right: 3em;
145
+ }
146
+ div.dt-button-collection .dt-button-active-a a:after {
147
+ position: absolute;
148
+ right: 1em;
149
+ display: inline-block;
150
+ content: "✓";
151
+ color: inherit;
152
+ }
153
+ div.dt-button-collection span.dt-button-spacer {
154
+ width: 100%;
155
+ font-size: 0.9em;
156
+ text-align: center;
157
+ margin: 0.5em 0;
158
+ }
159
+ div.dt-button-collection span.dt-button-spacer:empty {
160
+ height: 0;
161
+ width: 100%;
162
+ }
163
+ div.dt-button-collection span.dt-button-spacer.bar {
164
+ border-left: none;
165
+ border-bottom: 1px solid rgba(0, 0, 0, 0.1);
166
+ padding-left: 0;
167
+ }
168
+
169
+ @media print {
170
+ table.dataTable tr > * {
171
+ box-shadow: none !important;
172
+ }
173
+ }
174
+ div.dt-buttons div.btn-group {
175
+ position: initial;
176
+ }
177
+ div.dt-buttons span.dt-button-spacer.empty {
178
+ margin: 1px;
179
+ }
180
+ div.dt-buttons span.dt-button-spacer.bar:empty {
181
+ height: inherit;
182
+ }
183
+ div.dt-buttons .btn.processing {
184
+ color: rgba(0, 0, 0, 0.2);
185
+ }
186
+ div.dt-buttons .btn.processing:after {
187
+ position: absolute;
188
+ top: 50%;
189
+ left: 50%;
190
+ width: 16px;
191
+ height: 16px;
192
+ margin: -8px 0 0 -8px;
193
+ box-sizing: border-box;
194
+ display: block;
195
+ content: " ";
196
+ border: 2px solid rgb(40, 40, 40);
197
+ border-radius: 50%;
198
+ border-left-color: transparent;
199
+ border-right-color: transparent;
200
+ animation: dtb-spinner 1500ms infinite linear;
201
+ -o-animation: dtb-spinner 1500ms infinite linear;
202
+ -ms-animation: dtb-spinner 1500ms infinite linear;
203
+ -webkit-animation: dtb-spinner 1500ms infinite linear;
204
+ -moz-animation: dtb-spinner 1500ms infinite linear;
205
+ }
206
+
207
+ div.dropdown-menu.dt-button-collection {
208
+ margin-top: 4px;
209
+ width: 200px;
210
+ }
211
+ div.dropdown-menu.dt-button-collection .dt-button {
212
+ position: relative;
213
+ }
214
+ div.dropdown-menu.dt-button-collection .dt-button.dropdown-toggle::after {
215
+ position: absolute;
216
+ right: 12px;
217
+ top: 14px;
218
+ }
219
+ div.dropdown-menu.dt-button-collection div.dt-button-split {
220
+ display: flex;
221
+ flex-direction: row;
222
+ flex-wrap: wrap;
223
+ justify-content: flex-start;
224
+ align-content: flex-start;
225
+ align-items: stretch;
226
+ }
227
+ div.dropdown-menu.dt-button-collection div.dt-button-split a:first-child {
228
+ min-width: auto;
229
+ flex: 1 0 50px;
230
+ padding-right: 0;
231
+ }
232
+ div.dropdown-menu.dt-button-collection div.dt-button-split button:last-child {
233
+ min-width: 33px;
234
+ flex: 0;
235
+ background: transparent;
236
+ border: none;
237
+ line-height: 1rem;
238
+ color: var(--bs-dropdown-link-color);
239
+ padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);
240
+ overflow: visible;
241
+ }
242
+ div.dropdown-menu.dt-button-collection div.dt-button-split button:last-child:hover {
243
+ color: var(--bs-dropdown-link-hover-color);
244
+ background-color: var(--bs-dropdown-link-hover-bg);
245
+ }
246
+ div.dropdown-menu.dt-button-collection.fixed {
247
+ position: fixed;
248
+ display: block;
249
+ top: 50%;
250
+ left: 50%;
251
+ margin-left: -75px;
252
+ border-radius: 5px;
253
+ background-color: white;
254
+ padding: 0.5em;
255
+ }
256
+ div.dropdown-menu.dt-button-collection.fixed.two-column {
257
+ margin-left: -200px;
258
+ }
259
+ div.dropdown-menu.dt-button-collection.fixed.three-column {
260
+ margin-left: -225px;
261
+ }
262
+ div.dropdown-menu.dt-button-collection.fixed.four-column {
263
+ margin-left: -300px;
264
+ }
265
+ div.dropdown-menu.dt-button-collection.fixed.columns {
266
+ margin-left: -409px;
267
+ }
268
+ @media screen and (max-width: 1024px) {
269
+ div.dropdown-menu.dt-button-collection.fixed.columns {
270
+ margin-left: -308px;
271
+ }
272
+ }
273
+ @media screen and (max-width: 640px) {
274
+ div.dropdown-menu.dt-button-collection.fixed.columns {
275
+ margin-left: -203px;
276
+ }
277
+ }
278
+ @media screen and (max-width: 460px) {
279
+ div.dropdown-menu.dt-button-collection.fixed.columns {
280
+ margin-left: -100px;
281
+ }
282
+ }
283
+ div.dropdown-menu.dt-button-collection.fixed > :last-child {
284
+ max-height: 100vh;
285
+ overflow: auto;
286
+ }
287
+ div.dropdown-menu.dt-button-collection.two-column > :last-child, div.dropdown-menu.dt-button-collection.three-column > :last-child, div.dropdown-menu.dt-button-collection.four-column > :last-child {
288
+ display: block !important;
289
+ column-gap: 8px;
290
+ }
291
+ div.dropdown-menu.dt-button-collection.two-column > :last-child > *, div.dropdown-menu.dt-button-collection.three-column > :last-child > *, div.dropdown-menu.dt-button-collection.four-column > :last-child > * {
292
+ -webkit-column-break-inside: avoid;
293
+ break-inside: avoid;
294
+ }
295
+ div.dropdown-menu.dt-button-collection.two-column {
296
+ width: 400px;
297
+ }
298
+ div.dropdown-menu.dt-button-collection.two-column > :last-child {
299
+ padding-bottom: 1px;
300
+ column-count: 2;
301
+ }
302
+ div.dropdown-menu.dt-button-collection.three-column {
303
+ width: 450px;
304
+ }
305
+ div.dropdown-menu.dt-button-collection.three-column > :last-child {
306
+ padding-bottom: 1px;
307
+ column-count: 3;
308
+ }
309
+ div.dropdown-menu.dt-button-collection.four-column {
310
+ width: 600px;
311
+ }
312
+ div.dropdown-menu.dt-button-collection.four-column > :last-child {
313
+ padding-bottom: 1px;
314
+ column-count: 4;
315
+ }
316
+ div.dropdown-menu.dt-button-collection .dt-button {
317
+ border-radius: 0;
318
+ }
319
+ div.dropdown-menu.dt-button-collection.columns {
320
+ width: auto;
321
+ }
322
+ div.dropdown-menu.dt-button-collection.columns > :last-child {
323
+ display: flex;
324
+ flex-wrap: wrap;
325
+ justify-content: flex-start;
326
+ align-items: center;
327
+ gap: 6px;
328
+ width: 818px;
329
+ padding-bottom: 1px;
330
+ }
331
+ div.dropdown-menu.dt-button-collection.columns > :last-child .dt-button {
332
+ min-width: 200px;
333
+ flex: 0 1;
334
+ margin: 0;
335
+ }
336
+ div.dropdown-menu.dt-button-collection.columns.dtb-b3 > :last-child, div.dropdown-menu.dt-button-collection.columns.dtb-b2 > :last-child, div.dropdown-menu.dt-button-collection.columns.dtb-b1 > :last-child {
337
+ justify-content: space-between;
338
+ }
339
+ div.dropdown-menu.dt-button-collection.columns.dtb-b3 .dt-button {
340
+ flex: 1 1 32%;
341
+ }
342
+ div.dropdown-menu.dt-button-collection.columns.dtb-b2 .dt-button {
343
+ flex: 1 1 48%;
344
+ }
345
+ div.dropdown-menu.dt-button-collection.columns.dtb-b1 .dt-button {
346
+ flex: 1 1 100%;
347
+ }
348
+ @media screen and (max-width: 1024px) {
349
+ div.dropdown-menu.dt-button-collection.columns > :last-child {
350
+ width: 612px;
351
+ }
352
+ }
353
+ @media screen and (max-width: 640px) {
354
+ div.dropdown-menu.dt-button-collection.columns > :last-child {
355
+ width: 406px;
356
+ }
357
+ div.dropdown-menu.dt-button-collection.columns.dtb-b3 .dt-button {
358
+ flex: 0 1 32%;
359
+ }
360
+ }
361
+ @media screen and (max-width: 460px) {
362
+ div.dropdown-menu.dt-button-collection.columns > :last-child {
363
+ width: 200px;
364
+ }
365
+ }
366
+
367
+ div.dt-button-background {
368
+ position: fixed;
369
+ top: 0;
370
+ left: 0;
371
+ width: 100%;
372
+ height: 100%;
373
+ z-index: 999;
374
+ }
375
+
376
+ @media screen and (max-width: 767px) {
377
+ div.dt-buttons {
378
+ float: none;
379
+ width: 100%;
380
+ text-align: center;
381
+ margin-bottom: 0.5em;
382
+ }
383
+ div.dt-buttons a.btn {
384
+ float: none;
385
+ }
386
+ }
387
+ div.dt-button-info {
388
+ background-color: var(--bs-body-bg);
389
+ border: 1px solid var(--bs-border-color-translucent);
390
+ }
391
+
392
+ :root[data-bs-theme=dark] div.dropdown-menu.dt-button-collection.fixed {
393
+ background-color: var(--bs-body-bg);
394
+ border: 1px solid var(--bs-border-color-translucent);
395
+ }
@@ -0,0 +1,114 @@
1
+ /*! Bootstrap integration for DataTables' Buttons
2
+ * © SpryMedia Ltd - datatables.net/license
3
+ */
4
+
5
+ (function( factory ){
6
+ if ( typeof define === 'function' && define.amd ) {
7
+ // AMD
8
+ define( ['jquery', 'datatables.net-bs5', 'datatables.net-buttons'], function ( $ ) {
9
+ return factory( $, window, document );
10
+ } );
11
+ }
12
+ else if ( typeof exports === 'object' ) {
13
+ // CommonJS
14
+ var jq = require('jquery');
15
+ var cjsRequires = function (root, $) {
16
+ if ( ! $.fn.dataTable ) {
17
+ require('datatables.net-bs5')(root, $);
18
+ }
19
+
20
+ if ( ! $.fn.dataTable.Buttons ) {
21
+ require('datatables.net-buttons')(root, $);
22
+ }
23
+ };
24
+
25
+ if (typeof window === 'undefined') {
26
+ module.exports = function (root, $) {
27
+ if ( ! root ) {
28
+ // CommonJS environments without a window global must pass a
29
+ // root. This will give an error otherwise
30
+ root = window;
31
+ }
32
+
33
+ if ( ! $ ) {
34
+ $ = jq( root );
35
+ }
36
+
37
+ cjsRequires( root, $ );
38
+ return factory( $, root, root.document );
39
+ };
40
+ }
41
+ else {
42
+ cjsRequires( window, jq );
43
+ module.exports = factory( jq, window, window.document );
44
+ }
45
+ }
46
+ else {
47
+ // Browser
48
+ factory( jQuery, window, document );
49
+ }
50
+ }(function( $, window, document ) {
51
+ 'use strict';
52
+ var DataTable = $.fn.dataTable;
53
+
54
+
55
+
56
+ $.extend(true, DataTable.Buttons.defaults, {
57
+ dom: {
58
+ container: {
59
+ className: 'dt-buttons btn-group flex-wrap'
60
+ },
61
+ button: {
62
+ className: 'btn btn-secondary',
63
+ active: 'active',
64
+ dropHtml: '',
65
+ dropClass: 'dropdown-toggle'
66
+ },
67
+ collection: {
68
+ container: {
69
+ tag: 'div',
70
+ className: 'dropdown-menu dt-button-collection'
71
+ },
72
+ closeButton: false,
73
+ button: {
74
+ tag: 'a',
75
+ className: 'dt-button dropdown-item',
76
+ active: 'dt-button-active',
77
+ disabled: 'disabled',
78
+ spacer: {
79
+ className: 'dropdown-divider',
80
+ tag: 'hr'
81
+ }
82
+ }
83
+ },
84
+ split: {
85
+ action: {
86
+ tag: 'a',
87
+ className: 'btn btn-secondary dt-button-split-drop-button',
88
+ closeButton: false
89
+ },
90
+ dropdown: {
91
+ tag: 'button',
92
+ className:
93
+ 'btn btn-secondary dt-button-split-drop dropdown-toggle-split',
94
+ closeButton: false,
95
+ align: 'split-left',
96
+ splitAlignClass: 'dt-button-split-left'
97
+ },
98
+ wrapper: {
99
+ tag: 'div',
100
+ className: 'dt-button-split btn-group',
101
+ closeButton: false
102
+ }
103
+ }
104
+ },
105
+ buttonCreated: function (config, button) {
106
+ return config.buttons ? $('<div class="btn-group"/>').append(button) : button;
107
+ }
108
+ });
109
+
110
+ DataTable.ext.buttons.collection.rightAlignClassName = 'dropdown-menu-right';
111
+
112
+
113
+ return DataTable;
114
+ }));