rocketjob_mission_control 5.0.0 → 6.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/Rakefile +1 -2
- data/app/assets/config/manifest.js +3 -0
- data/app/assets/fonts/glyphicons-halflings-regular.eot +0 -0
- data/app/assets/fonts/glyphicons-halflings-regular.svg +288 -0
- data/app/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/app/assets/fonts/glyphicons-halflings-regular.woff +0 -0
- data/app/assets/fonts/glyphicons-halflings-regular.woff2 +0 -0
- data/app/assets/javascripts/rocket_job_mission_control/application.js +10 -11
- data/app/assets/javascripts/rocket_job_mission_control/base.js +1 -1
- data/app/assets/javascripts/rocket_job_mission_control/bootstrap.min.js +6 -0
- data/app/assets/javascripts/rocket_job_mission_control/{datatable.js → datatable_init.js} +0 -0
- data/{vendor/assets/javascripts → app/assets/javascripts/rocket_job_mission_control}/datatables.min.js +0 -0
- data/app/assets/javascripts/rocket_job_mission_control/dirmon_entries.js +1 -1
- data/app/assets/javascripts/rocket_job_mission_control/jquery-3.5.1.min.js +2 -0
- data/app/assets/javascripts/rocket_job_mission_control/nested_fields.js +112 -0
- data/app/assets/javascripts/rocket_job_mission_control/selectize.min.js +3 -0
- data/app/assets/javascripts/rocket_job_mission_control/selectize_init.js +6 -0
- data/app/assets/stylesheets/rocket_job_mission_control/{application.scss → application.css} +9 -8
- data/app/assets/stylesheets/rocket_job_mission_control/base.css +420 -0
- data/app/assets/stylesheets/rocket_job_mission_control/bootstrap.min.css.erb +6 -0
- data/app/assets/stylesheets/rocket_job_mission_control/bootstrap.min.css.map +1 -0
- data/app/assets/stylesheets/rocket_job_mission_control/{callout.scss → callout.css} +50 -52
- data/{vendor/assets/stylesheets → app/assets/stylesheets/rocket_job_mission_control}/datatables.min.css +0 -0
- data/{vendor/assets/stylesheets → app/assets/stylesheets/rocket_job_mission_control}/fontawesome-all.min.css.erb +0 -0
- data/app/assets/stylesheets/rocket_job_mission_control/jobs.css +56 -0
- data/app/assets/stylesheets/rocket_job_mission_control/selectize.bootstrap3.css +1 -0
- data/app/assets/stylesheets/rocket_job_mission_control/selectize.css +19 -0
- data/app/assets/stylesheets/rocket_job_mission_control/worker_processes.css +7 -0
- data/app/controllers/rocket_job_mission_control/application_controller.rb +3 -1
- data/app/controllers/rocket_job_mission_control/dirmon_entries_controller.rb +23 -23
- data/app/controllers/rocket_job_mission_control/jobs_controller.rb +50 -7
- data/app/controllers/rocket_job_mission_control/servers_controller.rb +7 -7
- data/app/datatables/rocket_job_mission_control/dirmon_entries_datatable.rb +1 -1
- data/app/datatables/rocket_job_mission_control/jobs_datatable.rb +1 -1
- data/app/helpers/rocket_job_mission_control/application_helper.rb +51 -26
- data/app/helpers/rocket_job_mission_control/dirmon_entries_helper.rb +12 -0
- data/app/helpers/rocket_job_mission_control/jobs_helper.rb +76 -8
- data/app/helpers/rocket_job_mission_control/servers_helper.rb +4 -0
- data/app/models/rocket_job_mission_control/dirmon_sanitizer.rb +68 -0
- data/app/models/rocket_job_mission_control/job_sanitizer.rb +37 -0
- data/app/views/layouts/rocket_job_mission_control/application.html.erb +2 -2
- data/app/views/layouts/rocket_job_mission_control/partials/_flash.html.erb +4 -4
- data/app/views/rocket_job_mission_control/dirmon_entries/_form.html.erb +78 -42
- data/app/views/rocket_job_mission_control/dirmon_entries/_input_categories.html.erb +59 -0
- data/app/views/rocket_job_mission_control/dirmon_entries/_input_category_fields.html.erb +56 -0
- data/app/views/rocket_job_mission_control/dirmon_entries/_output_categories.html.erb +44 -0
- data/app/views/rocket_job_mission_control/dirmon_entries/_output_category_fields.html.erb +36 -0
- data/app/views/rocket_job_mission_control/dirmon_entries/_status.html.erb +22 -16
- data/app/views/rocket_job_mission_control/dirmon_entries/copy.html.erb +1 -1
- data/app/views/rocket_job_mission_control/dirmon_entries/edit.html.erb +7 -3
- data/app/views/rocket_job_mission_control/dirmon_entries/show.html.erb +2 -3
- data/app/views/rocket_job_mission_control/jobs/_attributes.html.erb +28 -0
- data/app/views/rocket_job_mission_control/jobs/_dates.html.erb +35 -0
- data/app/views/rocket_job_mission_control/jobs/_details.html.erb +125 -0
- data/app/views/rocket_job_mission_control/jobs/_exception.html.erb +22 -0
- data/app/views/rocket_job_mission_control/jobs/_input_categories.html.erb +76 -0
- data/app/views/rocket_job_mission_control/jobs/_input_category_fields.html.erb +56 -0
- data/app/views/rocket_job_mission_control/jobs/_output_categories.html.erb +49 -0
- data/app/views/rocket_job_mission_control/jobs/_output_category_fields.html.erb +36 -0
- data/app/views/rocket_job_mission_control/jobs/_retryable.html.erb +16 -0
- data/app/views/rocket_job_mission_control/jobs/_status.html.erb +20 -48
- data/app/views/rocket_job_mission_control/jobs/edit.html.erb +28 -0
- data/app/views/rocket_job_mission_control/jobs/edit_slice.html.erb +2 -2
- data/app/views/rocket_job_mission_control/jobs/exception.html.erb +1 -1
- data/app/views/rocket_job_mission_control/jobs/index.html.erb +24 -18
- data/app/views/rocket_job_mission_control/jobs/show.html.erb +32 -58
- data/app/views/rocket_job_mission_control/jobs/view_slice.html.erb +6 -4
- data/config/initializers/assets.rb +3 -4
- data/lib/rocket_job_mission_control/engine.rb +2 -2
- data/lib/rocket_job_mission_control/version.rb +1 -1
- data/test/controllers/rocket_job_mission_control/application_controller_test.rb +4 -12
- data/test/controllers/rocket_job_mission_control/dirmon_entries_controller_test.rb +20 -52
- data/test/controllers/rocket_job_mission_control/jobs_controller_test.rb +21 -41
- data/test/controllers/rocket_job_mission_control/servers_controller_test.rb +3 -3
- data/test/models/rocket_job_mission_control/dirmon_sanitizer_test.rb +146 -0
- data/test/models/rocket_job_mission_control/job_sanitizer_test.rb +9 -3
- data/test/test_helper.rb +6 -12
- metadata +73 -53
- data/app/assets/javascripts/rocket_job_mission_control/selectize.js +0 -8
- data/app/assets/stylesheets/rocket_job_mission_control/base.scss +0 -436
- data/app/assets/stylesheets/rocket_job_mission_control/bootstrap_and_overrides.scss +0 -488
- data/app/assets/stylesheets/rocket_job_mission_control/jobs.scss +0 -72
- data/app/assets/stylesheets/rocket_job_mission_control/worker_processes.scss +0 -9
- data/vendor/assets/javascripts/bootstrap.min.js +0 -7
- data/vendor/assets/javascripts/microplugin.js +0 -135
- data/vendor/assets/javascripts/selectize.js +0 -3058
- data/vendor/assets/javascripts/sifter.js +0 -470
- data/vendor/assets/stylesheets/bootstrap.min.css +0 -6
- data/vendor/assets/stylesheets/bootstrap.min.css.map +0 -1
- data/vendor/assets/stylesheets/selectize.bootstrap3.css +0 -408
- data/vendor/assets/stylesheets/selectize.css +0 -317
@@ -4,74 +4,72 @@
|
|
4
4
|
border-left-width: 0.5em;
|
5
5
|
}
|
6
6
|
.callout-queued {
|
7
|
-
border-left-color: #
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
border-left-color: #a29f00;
|
8
|
+
}
|
9
|
+
.callout-queued a {
|
10
|
+
color: #a29f00;
|
11
11
|
}
|
12
12
|
.callout-running {
|
13
13
|
border-left-color: #337ab7;
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
}
|
15
|
+
.callout-running a {
|
16
|
+
color: #337ab7;
|
17
17
|
}
|
18
18
|
.callout-sleeping {
|
19
19
|
border-left-color: darkcyan;
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
}
|
21
|
+
.callout-sleeping a {
|
22
|
+
color: darkcyan;
|
23
23
|
}
|
24
24
|
.callout-scheduled {
|
25
|
-
border-left-color:
|
26
|
-
|
27
|
-
|
28
|
-
|
25
|
+
border-left-color: purple;
|
26
|
+
}
|
27
|
+
.callout-scheduled a {
|
28
|
+
color: purple;
|
29
29
|
}
|
30
30
|
.callout-completed {
|
31
31
|
border-left-color: green;
|
32
|
-
|
33
|
-
|
34
|
-
|
32
|
+
}
|
33
|
+
.callout-completed a {
|
34
|
+
color: green;
|
35
35
|
}
|
36
36
|
.callout-paused {
|
37
37
|
border-left-color: orange;
|
38
|
-
|
39
|
-
|
40
|
-
|
38
|
+
}
|
39
|
+
.callout-paused a {
|
40
|
+
color: orange;
|
41
41
|
}
|
42
42
|
.callout-failed {
|
43
43
|
border-left-color: red;
|
44
|
-
|
45
|
-
|
46
|
-
|
44
|
+
}
|
45
|
+
.callout-failed a {
|
46
|
+
color: red;
|
47
47
|
}
|
48
48
|
.callout-aborted {
|
49
49
|
border-left-color: darkorange;
|
50
|
-
a {
|
51
|
-
color: darkorange;
|
52
|
-
}
|
53
50
|
}
|
54
|
-
|
51
|
+
.callout-aborted a {
|
52
|
+
color: darkorange;
|
53
|
+
}
|
55
54
|
/* Used by Dirmon Entries */
|
56
55
|
.callout-pending {
|
57
56
|
border-color: orange;
|
58
|
-
|
59
|
-
|
60
|
-
|
57
|
+
}
|
58
|
+
.callout-pending a {
|
59
|
+
color: orange;
|
61
60
|
}
|
62
61
|
.callout-enabled {
|
63
62
|
border-left-color: green;
|
64
|
-
|
65
|
-
|
66
|
-
|
63
|
+
}
|
64
|
+
.callout-enabled a {
|
65
|
+
color: green;
|
67
66
|
}
|
68
67
|
.callout-disabled {
|
69
68
|
border-left-color: grey;
|
70
|
-
a {
|
71
|
-
color: grey;
|
72
|
-
}
|
73
69
|
}
|
74
|
-
|
70
|
+
.callout-disabled a {
|
71
|
+
color: grey;
|
72
|
+
}
|
75
73
|
/* Used by Servers */
|
76
74
|
.callout-top {
|
77
75
|
border: 1px solid #eee;
|
@@ -79,31 +77,31 @@
|
|
79
77
|
}
|
80
78
|
.callout-info {
|
81
79
|
border-left-color: #1b809e;
|
82
|
-
|
83
|
-
|
84
|
-
|
80
|
+
}
|
81
|
+
.callout-info .title {
|
82
|
+
color: #1b809e;
|
85
83
|
}
|
86
84
|
.callout-success {
|
87
85
|
border-left-color: #3c763d;
|
88
|
-
|
89
|
-
|
90
|
-
|
86
|
+
}
|
87
|
+
.callout-success .title {
|
88
|
+
color: #3c763d;
|
91
89
|
}
|
92
90
|
.callout-warning {
|
93
91
|
border-left-color: #aa6708;
|
94
|
-
|
95
|
-
|
96
|
-
|
92
|
+
}
|
93
|
+
.callout-warning .title {
|
94
|
+
color: #aa6708;
|
97
95
|
}
|
98
96
|
.callout-alert {
|
99
97
|
border-left-color: #ce4844;
|
100
|
-
|
101
|
-
|
102
|
-
|
98
|
+
}
|
99
|
+
.callout-alert .title {
|
100
|
+
color: #ce4844;
|
103
101
|
}
|
104
102
|
.callout-zombie {
|
105
103
|
border-left-color: darkred;
|
106
|
-
|
107
|
-
|
108
|
-
|
104
|
+
}
|
105
|
+
.callout-zombie .title {
|
106
|
+
color: darkred;
|
109
107
|
}
|
File without changes
|
File without changes
|
@@ -0,0 +1,56 @@
|
|
1
|
+
.job-list {
|
2
|
+
/*padding: 1px 1px 1px 1px;
|
3
|
+
*/
|
4
|
+
}
|
5
|
+
.job-list .breadcrumb {
|
6
|
+
margin-bottom: 0px;
|
7
|
+
}
|
8
|
+
.job-list .breadcrumb {
|
9
|
+
padding: 2px;
|
10
|
+
}
|
11
|
+
.job-list .breadcrumb > li {
|
12
|
+
margin: 5px 0 0 5px;
|
13
|
+
}
|
14
|
+
.job-list .list .progress {
|
15
|
+
width: 10em;
|
16
|
+
height: 1em;
|
17
|
+
margin: 5px 0px 0px 10px;
|
18
|
+
display: inline-block;
|
19
|
+
-webkit-border-radius: 0 !important;
|
20
|
+
-moz-border-radius: 0 !important;
|
21
|
+
border-radius: 0 !important;
|
22
|
+
}
|
23
|
+
.job-list .list .progress-bar {
|
24
|
+
min-width: 0em;
|
25
|
+
}
|
26
|
+
.error pre {
|
27
|
+
margin: 0px 0px 0px 0px;
|
28
|
+
border-bottom: 0;
|
29
|
+
border-radius: 0;
|
30
|
+
word-wrap: normal;
|
31
|
+
}
|
32
|
+
.error pre:last-child {
|
33
|
+
border: 1px solid #ccc;
|
34
|
+
}
|
35
|
+
.pagination {
|
36
|
+
margin-top: 1em;
|
37
|
+
}
|
38
|
+
.pagination .btn {
|
39
|
+
border-radius: 0;
|
40
|
+
}
|
41
|
+
.input_slices {
|
42
|
+
font-size: 14px;
|
43
|
+
line-height: 2;
|
44
|
+
resize: none;
|
45
|
+
width: 100%;
|
46
|
+
padding-top: 5px;
|
47
|
+
padding-bottom: 5px;
|
48
|
+
margin-bottom: 4px;
|
49
|
+
}
|
50
|
+
.edit_button {
|
51
|
+
float: right;
|
52
|
+
margin-left: 3px;
|
53
|
+
}
|
54
|
+
.edit_input {
|
55
|
+
margin-left: 80px;
|
56
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
.selectize-control.plugin-drag_drop.multi>.selectize-input>div.ui-sortable-placeholder{visibility:visible !important;background:#f2f2f2 !important;background:rgba(0,0,0,.06) !important;border:0 none !important;box-shadow:inset 0 0 12px 4px #fff}.selectize-control.plugin-drag_drop .ui-sortable-placeholder::after{content:"!";visibility:hidden}.selectize-control.plugin-drag_drop .ui-sortable-helper{box-shadow:0 2px 5px rgba(0,0,0,.2)}.selectize-control .dropdown-header{position:relative;padding:6px 12px;border-bottom:1px solid #d0d0d0;background:#f8f8f8;border-radius:4px 4px 0 0}.selectize-control .dropdown-header-close{position:absolute;right:12px;top:50%;color:#333;opacity:.4;margin-top:-12px;line-height:20px;font-size:20px !important}.selectize-control .dropdown-header-close:hover{color:#000}.selectize-dropdown.plugin-optgroup_columns .selectize-dropdown-content{display:flex}.selectize-dropdown.plugin-optgroup_columns .optgroup{border-right:1px solid #f2f2f2;border-top:0 none;flex-grow:1;flex-basis:0;min-width:0}.selectize-dropdown.plugin-optgroup_columns .optgroup:last-child{border-right:0 none}.selectize-dropdown.plugin-optgroup_columns .optgroup:before{display:none}.selectize-dropdown.plugin-optgroup_columns .optgroup-header{border-top:0 none}.selectize-control.plugin-remove_button .item{display:inline-flex;align-items:center;padding-right:0 !important}.selectize-control.plugin-remove_button .item .remove{color:inherit;text-decoration:none;vertical-align:middle;display:inline-block;padding:1px 5px;border-left:1px solid rgba(0,0,0,0);border-radius:0 2px 2px 0;box-sizing:border-box;margin-left:5px}.selectize-control.plugin-remove_button .item .remove:hover{background:rgba(0,0,0,.05)}.selectize-control.plugin-remove_button .item.active .remove{border-left-color:rgba(0,0,0,0)}.selectize-control.plugin-remove_button .disabled .item .remove:hover{background:none}.selectize-control.plugin-remove_button .disabled .item .remove{border-left-color:rgba(77,77,77,0)}.selectize-control.plugin-remove_button .remove-single{position:absolute;right:0;top:0;font-size:23px}.selectize-control{position:relative}.selectize-dropdown,.selectize-input,.selectize-input input{color:#333;font-family:inherit;font-size:inherit;line-height:20px;font-smoothing:inherit}.selectize-input,.selectize-control.single .selectize-input.input-active{background:#fff;cursor:text;display:inline-block}.selectize-input{border:1px solid #ccc;padding:6px 12px;display:inline-block;width:100%;overflow:hidden;position:relative;z-index:1;box-sizing:border-box;box-shadow:none;border-radius:4px}.selectize-control.multi .selectize-input.has-items{padding:calc( 6px - 1px - 0 ) 12px calc( 6px - 1px - 3px - 0 )}.selectize-input.full{background-color:#fff}.selectize-input.disabled,.selectize-input.disabled *{cursor:default !important}.selectize-input.focus{box-shadow:inset 0 1px 2px rgba(0,0,0,.15)}.selectize-input.dropdown-active{border-radius:4px 4px 0 0}.selectize-input>*{vertical-align:baseline;display:inline-block;zoom:1}.selectize-control.multi .selectize-input>div{cursor:pointer;margin:0 3px 3px 0;padding:1px 5px;background:#efefef;color:#333;border:0 solid rgba(0,0,0,0)}.selectize-control.multi .selectize-input>div.active{background:#337ab7;color:#fff;border:0 solid rgba(0,0,0,0)}.selectize-control.multi .selectize-input.disabled>div,.selectize-control.multi .selectize-input.disabled>div.active{color:gray;background:#fff;border:0 solid rgba(77,77,77,0)}.selectize-input>input{display:inline-block !important;padding:0 !important;min-height:0 !important;max-height:none !important;max-width:100% !important;margin:0 !important;text-indent:0 !important;border:0 none !important;background:none !important;line-height:inherit !important;user-select:auto !important;box-shadow:none !important}.selectize-input>input::-ms-clear{display:none}.selectize-input>input:focus{outline:none !important}.selectize-input>input[placeholder]{box-sizing:initial}.selectize-input.has-items>input{margin:0 0px !important}.selectize-input::after{content:" ";display:block;clear:left}.selectize-input.dropdown-active::before{content:" ";display:block;position:absolute;background:#fff;height:1px;bottom:0;left:0;right:0}.selectize-dropdown{position:absolute;top:100%;left:0;width:100%;z-index:10;border:1px solid #d0d0d0;background:#fff;margin:-1px 0 0 0;border-top:0 none;box-sizing:border-box;box-shadow:0 1px 3px rgba(0,0,0,.1);border-radius:0 0 4px 4px}.selectize-dropdown [data-selectable]{cursor:pointer;overflow:hidden}.selectize-dropdown [data-selectable] .highlight{background:rgba(255,237,40,.4);border-radius:1px}.selectize-dropdown .option,.selectize-dropdown .optgroup-header,.selectize-dropdown .no-results,.selectize-dropdown .create{padding:3px 12px}.selectize-dropdown .option,.selectize-dropdown [data-disabled],.selectize-dropdown [data-disabled] [data-selectable].option{cursor:inherit;opacity:.5}.selectize-dropdown [data-selectable].option{opacity:1;cursor:pointer}.selectize-dropdown .optgroup:first-child .optgroup-header{border-top:0 none}.selectize-dropdown .optgroup-header{color:#777;background:#fff;cursor:default}.selectize-dropdown .active{background-color:#f5f5f5;color:#262626}.selectize-dropdown .active.create{color:#262626}.selectize-dropdown .create{color:rgba(51,51,51,.5)}.selectize-dropdown-content{overflow-y:auto;overflow-x:hidden;max-height:200px;overflow-scrolling:touch}.selectize-dropdown-emptyoptionlabel{text-align:center}.selectize-dropdown .spinner{display:inline-block;width:30px;height:30px;margin:3px 12px}.selectize-dropdown .spinner:after{content:" ";display:block;width:24px;height:24px;margin:3px;border-radius:50%;border:5px solid #d0d0d0;border-color:#d0d0d0 transparent #d0d0d0 transparent;animation:lds-dual-ring 1.2s linear infinite}@keyframes lds-dual-ring{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.selectize-control.single .selectize-input,.selectize-control.single .selectize-input input{cursor:pointer}.selectize-control.single .selectize-input.input-active,.selectize-control.single .selectize-input.input-active input{cursor:text}.selectize-control.single .selectize-input:after{content:" ";display:block;position:absolute;top:50%;right:17px;margin-top:-3px;width:0;height:0;border-style:solid;border-width:5px 5px 0 5px;border-color:#333 transparent transparent transparent}.selectize-control.single .selectize-input.dropdown-active:after{margin-top:-4px;border-width:0 5px 5px 5px;border-color:transparent transparent #333 transparent}.selectize-control.rtl{text-align:right}.selectize-control.rtl.single .selectize-input:after{left:17px;right:auto}.selectize-control.rtl .selectize-input>input{margin:0 4px 0 -2px !important}.selectize-control .selectize-input.disabled{opacity:.5;background-color:#fff}.selectize-dropdown,.selectize-dropdown.form-control{height:auto;padding:0;margin:2px 0 0 0;z-index:1000;background:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;box-shadow:0 6px 12px rgba(0,0,0,.175)}.selectize-dropdown .optgroup-header{font-size:12px;line-height:1.428571429}.selectize-dropdown .optgroup:first-child:before{display:none}.selectize-dropdown .optgroup:before{content:" ";display:block;height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5;margin-left:-12px;margin-right:-12px}.selectize-dropdown-content{padding:5px 0}.selectize-dropdown-emptyoptionlabel{text-align:center}.selectize-input{min-height:34px}.selectize-input.dropdown-active{border-radius:4px}.selectize-input.dropdown-active::before{display:none}.selectize-input.focus{border-color:#66afe9;outline:0;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.has-error .selectize-input{border-color:#a94442;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .selectize-input:focus{border-color:#843534;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.selectize-control.multi .selectize-input.has-items{padding-left:7px;padding-right:7px}.selectize-control.multi .selectize-input>div{border-radius:3px}.form-control.selectize-control{padding:0;height:auto;border:none;background:none;box-shadow:none;border-radius:0}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
/**
|
2
|
+
* selectize.css (v0.13.3)
|
3
|
+
* Copyright (c) 2013–2015 Brian Reavis & contributors
|
4
|
+
* Copyright (c) 2020 Selectize Team & contributors
|
5
|
+
*
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
|
7
|
+
* file except in compliance with the License. You may obtain a copy of the License at:
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
*
|
10
|
+
* Unless required by applicable law or agreed to in writing, software distributed under
|
11
|
+
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
12
|
+
* ANY KIND, either express or implied. See the License for the specific language
|
13
|
+
* governing permissions and limitations under the License.
|
14
|
+
*
|
15
|
+
* @author Brian Reavis <brian@thirdroute.com>
|
16
|
+
* @author Ris Adams <selectize@risadams.com>
|
17
|
+
*/
|
18
|
+
|
19
|
+
.selectize-control.plugin-drag_drop.multi>.selectize-input>div.ui-sortable-placeholder{visibility:visible !important;background:#f2f2f2 !important;background:rgba(0,0,0,.06) !important;border:0 none !important;box-shadow:inset 0 0 12px 4px #fff}.selectize-control.plugin-drag_drop .ui-sortable-placeholder::after{content:"!";visibility:hidden}.selectize-control.plugin-drag_drop .ui-sortable-helper{box-shadow:0 2px 5px rgba(0,0,0,.2)}.selectize-control .dropdown-header{position:relative;padding:10px 8px;border-bottom:1px solid #d0d0d0;background:#f8f8f8;border-radius:3px 3px 0 0}.selectize-control .dropdown-header-close{position:absolute;right:8px;top:50%;color:#303030;opacity:.4;margin-top:-12px;line-height:20px;font-size:20px !important}.selectize-control .dropdown-header-close:hover{color:#000}.selectize-dropdown.plugin-optgroup_columns .selectize-dropdown-content{display:flex}.selectize-dropdown.plugin-optgroup_columns .optgroup{border-right:1px solid #f2f2f2;border-top:0 none;flex-grow:1;flex-basis:0;min-width:0}.selectize-dropdown.plugin-optgroup_columns .optgroup:last-child{border-right:0 none}.selectize-dropdown.plugin-optgroup_columns .optgroup:before{display:none}.selectize-dropdown.plugin-optgroup_columns .optgroup-header{border-top:0 none}.selectize-control.plugin-remove_button .item{display:inline-flex;align-items:center;padding-right:0 !important}.selectize-control.plugin-remove_button .item .remove{color:inherit;text-decoration:none;vertical-align:middle;display:inline-block;padding:2px 6px;border-left:1px solid #d0d0d0;border-radius:0 2px 2px 0;box-sizing:border-box;margin-left:6px}.selectize-control.plugin-remove_button .item .remove:hover{background:rgba(0,0,0,.05)}.selectize-control.plugin-remove_button .item.active .remove{border-left-color:#cacaca}.selectize-control.plugin-remove_button .disabled .item .remove:hover{background:none}.selectize-control.plugin-remove_button .disabled .item .remove{border-left-color:#fff}.selectize-control.plugin-remove_button .remove-single{position:absolute;right:0;top:0;font-size:23px}.selectize-control{position:relative}.selectize-dropdown,.selectize-input,.selectize-input input{color:#303030;font-family:inherit;font-size:13px;line-height:18px;font-smoothing:inherit}.selectize-input,.selectize-control.single .selectize-input.input-active{background:#fff;cursor:text;display:inline-block}.selectize-input{border:1px solid #d0d0d0;padding:8px 8px;display:inline-block;width:100%;overflow:hidden;position:relative;z-index:1;box-sizing:border-box;box-shadow:inset 0 1px 1px rgba(0,0,0,.1);border-radius:3px}.selectize-control.multi .selectize-input.has-items{padding:calc( 8px - 2px - 0 ) 8px calc( 8px - 2px - 3px - 0 )}.selectize-input.full{background-color:#fff}.selectize-input.disabled,.selectize-input.disabled *{cursor:default !important}.selectize-input.focus{box-shadow:inset 0 1px 2px rgba(0,0,0,.15)}.selectize-input.dropdown-active{border-radius:3px 3px 0 0}.selectize-input>*{vertical-align:baseline;display:inline-block;zoom:1}.selectize-control.multi .selectize-input>div{cursor:pointer;margin:0 3px 3px 0;padding:2px 6px;background:#f2f2f2;color:#303030;border:0 solid #d0d0d0}.selectize-control.multi .selectize-input>div.active{background:#e8e8e8;color:#303030;border:0 solid #cacaca}.selectize-control.multi .selectize-input.disabled>div,.selectize-control.multi .selectize-input.disabled>div.active{color:#7d7d7d;background:#fff;border:0 solid #fff}.selectize-input>input{display:inline-block !important;padding:0 !important;min-height:0 !important;max-height:none !important;max-width:100% !important;margin:0 !important;text-indent:0 !important;border:0 none !important;background:none !important;line-height:inherit !important;user-select:auto !important;box-shadow:none !important}.selectize-input>input::-ms-clear{display:none}.selectize-input>input:focus{outline:none !important}.selectize-input>input[placeholder]{box-sizing:initial}.selectize-input.has-items>input{margin:0 0px !important}.selectize-input::after{content:" ";display:block;clear:left}.selectize-input.dropdown-active::before{content:" ";display:block;position:absolute;background:#f0f0f0;height:1px;bottom:0;left:0;right:0}.selectize-dropdown{position:absolute;top:100%;left:0;width:100%;z-index:10;border:1px solid #d0d0d0;background:#fff;margin:-1px 0 0 0;border-top:0 none;box-sizing:border-box;box-shadow:0 1px 3px rgba(0,0,0,.1);border-radius:0 0 3px 3px}.selectize-dropdown [data-selectable]{cursor:pointer;overflow:hidden}.selectize-dropdown [data-selectable] .highlight{background:rgba(125,168,208,.2);border-radius:1px}.selectize-dropdown .option,.selectize-dropdown .optgroup-header,.selectize-dropdown .no-results,.selectize-dropdown .create{padding:5px 8px}.selectize-dropdown .option,.selectize-dropdown [data-disabled],.selectize-dropdown [data-disabled] [data-selectable].option{cursor:inherit;opacity:.5}.selectize-dropdown [data-selectable].option{opacity:1;cursor:pointer}.selectize-dropdown .optgroup:first-child .optgroup-header{border-top:0 none}.selectize-dropdown .optgroup-header{color:#303030;background:#fff;cursor:default}.selectize-dropdown .active{background-color:#f5fafd;color:#495c68}.selectize-dropdown .active.create{color:#495c68}.selectize-dropdown .create{color:rgba(48,48,48,.5)}.selectize-dropdown-content{overflow-y:auto;overflow-x:hidden;max-height:200px;overflow-scrolling:touch}.selectize-dropdown-emptyoptionlabel{text-align:center}.selectize-dropdown .spinner{display:inline-block;width:30px;height:30px;margin:5px 8px}.selectize-dropdown .spinner:after{content:" ";display:block;width:24px;height:24px;margin:3px;border-radius:50%;border:5px solid #d0d0d0;border-color:#d0d0d0 transparent #d0d0d0 transparent;animation:lds-dual-ring 1.2s linear infinite}@keyframes lds-dual-ring{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.selectize-control.single .selectize-input,.selectize-control.single .selectize-input input{cursor:pointer}.selectize-control.single .selectize-input.input-active,.selectize-control.single .selectize-input.input-active input{cursor:text}.selectize-control.single .selectize-input:after{content:" ";display:block;position:absolute;top:50%;right:15px;margin-top:-3px;width:0;height:0;border-style:solid;border-width:5px 5px 0 5px;border-color:gray transparent transparent transparent}.selectize-control.single .selectize-input.dropdown-active:after{margin-top:-4px;border-width:0 5px 5px 5px;border-color:transparent transparent gray transparent}.selectize-control.rtl{text-align:right}.selectize-control.rtl.single .selectize-input:after{left:15px;right:auto}.selectize-control.rtl .selectize-input>input{margin:0 4px 0 -2px !important}.selectize-control .selectize-input.disabled{opacity:.5;background-color:#fafafa}
|
@@ -20,11 +20,13 @@ module RocketJobMissionControl
|
|
20
20
|
else
|
21
21
|
{roles: %i[admin]}
|
22
22
|
end
|
23
|
-
AccessPolicy.new(Authorization.new(
|
23
|
+
AccessPolicy.new(Authorization.new(**@args))
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
27
|
def login
|
28
|
+
return unless Config.authorization_callback
|
29
|
+
|
28
30
|
@login ||= begin
|
29
31
|
args = instance_exec(&Config.authorization_callback)
|
30
32
|
args[:login]
|
@@ -1,18 +1,11 @@
|
|
1
1
|
module RocketJobMissionControl
|
2
2
|
class DirmonEntriesController < RocketJobMissionControl::ApplicationController
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
before_filter :show_sidebar
|
7
|
-
else
|
8
|
-
before_action :find_entry_or_redirect, except: %i[index disabled enabled failed pending new create]
|
9
|
-
before_action :authorize_read, only: %i[index disabled enabled failed pending]
|
10
|
-
before_action :show_sidebar
|
11
|
-
end
|
3
|
+
before_action :find_entry_or_redirect, except: %i[index disabled enabled failed pending new create]
|
4
|
+
before_action :authorize_read, only: %i[index disabled enabled failed pending]
|
5
|
+
before_action :show_sidebar
|
12
6
|
|
13
7
|
rescue_from AccessGranted::AccessDenied do |exception|
|
14
8
|
raise exception if Rails.env.development? || Rails.env.test?
|
15
|
-
|
16
9
|
redirect_to :back, alert: "Access not authorized."
|
17
10
|
end
|
18
11
|
|
@@ -56,6 +49,7 @@ module RocketJobMissionControl
|
|
56
49
|
def create
|
57
50
|
authorize! :create, RocketJob::DirmonEntry
|
58
51
|
@dirmon_entry = RocketJob::DirmonEntry.new(dirmon_params)
|
52
|
+
|
59
53
|
if properties = params[:rocket_job_dirmon_entry][:properties]
|
60
54
|
@dirmon_entry.properties = JobSanitizer.sanitize(properties, @dirmon_entry.job_class, @dirmon_entry, false)
|
61
55
|
end
|
@@ -76,19 +70,23 @@ module RocketJobMissionControl
|
|
76
70
|
def edit
|
77
71
|
authorize! :edit, @dirmon_entry
|
78
72
|
end
|
79
|
-
|
73
|
+
|
74
|
+
# When you click on the Copy button,
|
80
75
|
# the copy method loads the Dirmon Entity attributes in Copy Dirmon Entry Page
|
81
76
|
def copy
|
82
77
|
authorize! :copy, @dirmon_entry
|
83
78
|
end
|
79
|
+
|
84
80
|
# When you click on the replicate button,
|
85
81
|
# the replicate method clones the existing Dirmon Entity
|
86
82
|
def replicate
|
87
83
|
authorize! :replicate, @dirmon_entry
|
88
84
|
dirmon_entry_replicate = RocketJob::DirmonEntry.new(@dirmon_entry.dup.attributes.except("id"))
|
85
|
+
|
89
86
|
if properties = params[:rocket_job_dirmon_entry][:properties]
|
90
|
-
dirmon_entry_replicate.properties = JobSanitizer.sanitize(properties, dirmon_entry_replicate.job_class,
|
87
|
+
dirmon_entry_replicate.properties = JobSanitizer.sanitize(properties, dirmon_entry_replicate.job_class, @dirmon_entry, false)
|
91
88
|
end
|
89
|
+
|
92
90
|
if dirmon_entry_replicate.errors.empty? && dirmon_entry_replicate.valid? && dirmon_entry_replicate.update_attributes(dirmon_params)
|
93
91
|
redirect_to(rocket_job_mission_control.dirmon_entry_path(dirmon_entry_replicate))
|
94
92
|
else
|
@@ -98,10 +96,12 @@ module RocketJobMissionControl
|
|
98
96
|
|
99
97
|
def update
|
100
98
|
authorize! :update, @dirmon_entry
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
99
|
+
sanitized_params = DirmonSanitizer.sanitize(params[:rocket_job_dirmon_entry], @dirmon_entry.job_class, @dirmon_entry)
|
100
|
+
properties = DirmonSanitizer.diff_properties(sanitized_params[:properties], @dirmon_entry)
|
101
|
+
|
102
|
+
sanitized_params[:properties] = properties
|
103
|
+
|
104
|
+
if @dirmon_entry.errors.empty? && @dirmon_entry.valid? && @dirmon_entry.update_attributes(sanitized_params)
|
105
105
|
redirect_to(rocket_job_mission_control.dirmon_entry_path(@dirmon_entry))
|
106
106
|
else
|
107
107
|
render :edit
|
@@ -110,22 +110,24 @@ module RocketJobMissionControl
|
|
110
110
|
|
111
111
|
def enable
|
112
112
|
authorize! :enable, @dirmon_entry
|
113
|
+
|
113
114
|
if @dirmon_entry.may_enable?
|
114
115
|
@dirmon_entry.enable!
|
115
116
|
redirect_to(rocket_job_mission_control.dirmon_entry_path(@dirmon_entry))
|
116
117
|
else
|
117
|
-
flash[:
|
118
|
+
flash[:danger] = t(:failure, scope: %i[dirmon_entry enable])
|
118
119
|
render(:show)
|
119
120
|
end
|
120
121
|
end
|
121
122
|
|
122
123
|
def disable
|
123
124
|
authorize! :disable, @dirmon_entry
|
125
|
+
|
124
126
|
if @dirmon_entry.may_disable?
|
125
127
|
@dirmon_entry.disable!
|
126
128
|
redirect_to(rocket_job_mission_control.dirmon_entry_path(@dirmon_entry))
|
127
129
|
else
|
128
|
-
flash[:
|
130
|
+
flash[:danger] = t(:failure, scope: %i[dirmon_entry disable])
|
129
131
|
render(:show)
|
130
132
|
end
|
131
133
|
end
|
@@ -147,16 +149,13 @@ module RocketJobMissionControl
|
|
147
149
|
|
148
150
|
def find_entry_or_redirect
|
149
151
|
unless @dirmon_entry = RocketJob::DirmonEntry.where(id: params[:id]).first
|
150
|
-
flash[:
|
151
|
-
|
152
|
+
flash[:danger] = t(:failure, scope: %i[dirmon_entry find], id: ActionController::Base.helpers.sanitize(params[:id]))
|
152
153
|
redirect_to(dirmon_entries_path)
|
153
154
|
end
|
154
155
|
end
|
155
156
|
|
156
157
|
def dirmon_params
|
157
|
-
params.
|
158
|
-
fetch(:rocket_job_dirmon_entry, {}).
|
159
|
-
permit(:name, :archive_directory, :pattern, :job_class_name)
|
158
|
+
params.fetch(:rocket_job_dirmon_entry, {}).permit(:name, :archive_directory, :pattern, :job_class_name, :properties)
|
160
159
|
end
|
161
160
|
|
162
161
|
def render_datatable(entries, description)
|
@@ -165,6 +164,7 @@ module RocketJobMissionControl
|
|
165
164
|
@description = description
|
166
165
|
render :index
|
167
166
|
end
|
167
|
+
|
168
168
|
format.json do
|
169
169
|
query = RocketJobMissionControl::Query.new(entries, name: :asc)
|
170
170
|
query.search_columns = %i[job_class_name name pattern]
|
@@ -74,8 +74,11 @@ module RocketJobMissionControl
|
|
74
74
|
|
75
75
|
def update
|
76
76
|
authorize! :update, @job
|
77
|
-
permitted_params = JobSanitizer.sanitize(
|
78
|
-
|
77
|
+
permitted_params = JobSanitizer.sanitize(job_params, @job.class, @job)
|
78
|
+
|
79
|
+
assign_job_values(@job, permitted_params)
|
80
|
+
|
81
|
+
if @job.errors.empty? && @job.valid? && @job.save
|
79
82
|
redirect_to job_path(@job)
|
80
83
|
else
|
81
84
|
render :edit
|
@@ -179,6 +182,9 @@ module RocketJobMissionControl
|
|
179
182
|
# Finds specific slice [Array]
|
180
183
|
slice = @job.input.failed.skip(offset).first
|
181
184
|
|
185
|
+
# Converts \r\n line breaks to \n
|
186
|
+
updated_records.each { |record| record.gsub(/\r\n/, "\n") }
|
187
|
+
|
182
188
|
# Assings modified slice (from the form) back to slice
|
183
189
|
slice.records = updated_records
|
184
190
|
|
@@ -225,14 +231,14 @@ module RocketJobMissionControl
|
|
225
231
|
offset = params.fetch(:offset, 0).to_i
|
226
232
|
|
227
233
|
unless error_type.present?
|
228
|
-
flash[:
|
234
|
+
flash[:warning] = t(:no_errors, scope: %i[job failures])
|
229
235
|
redirect_to(job_path(@job))
|
230
236
|
end
|
231
237
|
|
232
238
|
scope = @job.input.failed.where("exception.class_name" => error_type)
|
233
239
|
count = scope.count
|
234
240
|
unless count.positive?
|
235
|
-
flash[:
|
241
|
+
flash[:warning] = t(:no_errors, scope: %i[job failures])
|
236
242
|
redirect_to(job_path(@job))
|
237
243
|
end
|
238
244
|
|
@@ -247,6 +253,24 @@ module RocketJobMissionControl
|
|
247
253
|
|
248
254
|
private
|
249
255
|
|
256
|
+
def assign_job_values(target, hash)
|
257
|
+
hash.each_pair do |attribute, value|
|
258
|
+
if attribute == :input_categories
|
259
|
+
value.each do |category_hash|
|
260
|
+
h = category_hash.dup
|
261
|
+
assign_job_values(target.input_category(h.delete(:name)), h)
|
262
|
+
end
|
263
|
+
elsif attribute == :output_categories
|
264
|
+
value.each do |category_hash|
|
265
|
+
h = category_hash.dup
|
266
|
+
assign_job_values(target.output_category(h.delete(:name)), h)
|
267
|
+
end
|
268
|
+
elsif attribute != :id
|
269
|
+
target.send("#{attribute}=", value)
|
270
|
+
end
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
250
274
|
def authorize_read
|
251
275
|
authorize! :read, RocketJob::Job
|
252
276
|
end
|
@@ -257,14 +281,33 @@ module RocketJobMissionControl
|
|
257
281
|
|
258
282
|
def find_job_or_redirect
|
259
283
|
unless @job = RocketJob::Job.where(id: params[:id]).first
|
260
|
-
flash[:
|
284
|
+
flash[:danger] = t(:failure, scope: %i[job find], id: ActionController::Base.helpers.sanitize(params[:id]))
|
261
285
|
|
262
286
|
redirect_to(jobs_path)
|
263
287
|
end
|
264
288
|
end
|
265
289
|
|
266
290
|
def job_params
|
267
|
-
params.require(:job).permit(
|
291
|
+
params.require(:job).permit(
|
292
|
+
@job.class.user_editable_fields,
|
293
|
+
input_categories_attributes: [
|
294
|
+
:id,
|
295
|
+
:name,
|
296
|
+
:format,
|
297
|
+
:format_options,
|
298
|
+
:mode,
|
299
|
+
:skip_unknown,
|
300
|
+
:slice_size,
|
301
|
+
columns: []
|
302
|
+
],
|
303
|
+
output_categories_attributes: [
|
304
|
+
:id,
|
305
|
+
:name,
|
306
|
+
:format,
|
307
|
+
:format_options,
|
308
|
+
columns: []
|
309
|
+
]
|
310
|
+
)
|
268
311
|
end
|
269
312
|
|
270
313
|
def error_occurred(exception)
|
@@ -308,7 +351,7 @@ module RocketJobMissionControl
|
|
308
351
|
h = {data: index.to_s}
|
309
352
|
h[:width] = column[:width] if column.key?(:width)
|
310
353
|
h[:orderable] = column[:orderable] if column.key?(:orderable)
|
311
|
-
index
|
354
|
+
index += 1
|
312
355
|
h
|
313
356
|
end
|
314
357
|
end
|
@@ -62,9 +62,9 @@ module RocketJobMissionControl
|
|
62
62
|
RocketJob::Server.destroy_zombies
|
63
63
|
elsif VALID_ACTIONS.include?(server_action)
|
64
64
|
RocketJob::Subscribers::Server.publish(server_action)
|
65
|
-
flash[:
|
65
|
+
flash[:success] = t(:success, scope: %i[server update_all], action: server_action.to_s)
|
66
66
|
else
|
67
|
-
flash[:
|
67
|
+
flash[:danger] = t(:invalid, scope: %i[server update_all])
|
68
68
|
end
|
69
69
|
|
70
70
|
# TODO: Refresh the same page it was on
|
@@ -76,7 +76,7 @@ module RocketJobMissionControl
|
|
76
76
|
def stop
|
77
77
|
authorize! :stop, @server
|
78
78
|
RocketJob::Subscribers::Server.publish(:stop, server_id: @server.id)
|
79
|
-
flash[:
|
79
|
+
flash[:success] = t(:success, scope: %i[server update_one], action: "stop", name: @server.name)
|
80
80
|
|
81
81
|
respond_to do |format|
|
82
82
|
format.html { redirect_to servers_path }
|
@@ -86,7 +86,7 @@ module RocketJobMissionControl
|
|
86
86
|
def destroy
|
87
87
|
authorize! :destroy, @server
|
88
88
|
@server.destroy
|
89
|
-
flash[:
|
89
|
+
flash[:success] = t(:success, scope: %i[server destroy])
|
90
90
|
|
91
91
|
respond_to do |format|
|
92
92
|
format.html { redirect_to servers_path }
|
@@ -96,7 +96,7 @@ module RocketJobMissionControl
|
|
96
96
|
def pause
|
97
97
|
authorize! :pause, @server
|
98
98
|
RocketJob::Subscribers::Server.publish(:pause, server_id: @server.id)
|
99
|
-
flash[:
|
99
|
+
flash[:success] = t(:success, scope: %i[server update_one], action: "pause", name: @server.name)
|
100
100
|
|
101
101
|
respond_to do |format|
|
102
102
|
format.html { redirect_to servers_path }
|
@@ -106,7 +106,7 @@ module RocketJobMissionControl
|
|
106
106
|
def resume
|
107
107
|
authorize! :resume, @server
|
108
108
|
RocketJob::Subscribers::Server.publish(:resume, server_id: @server.id)
|
109
|
-
flash[:
|
109
|
+
flash[:success] = t(:success, scope: %i[server update_one], action: "resume", name: @server.name)
|
110
110
|
|
111
111
|
respond_to do |format|
|
112
112
|
format.html { redirect_to servers_path }
|
@@ -140,7 +140,7 @@ module RocketJobMissionControl
|
|
140
140
|
|
141
141
|
def find_server_or_redirect
|
142
142
|
unless @server = RocketJob::Server.where(id: params[:id]).first
|
143
|
-
flash[:
|
143
|
+
flash[:danger] = t(:failure, scope: %i[server find], id: params[:id])
|
144
144
|
|
145
145
|
redirect_to(servers_path)
|
146
146
|
end
|
@@ -47,7 +47,7 @@ module RocketJobMissionControl
|
|
47
47
|
{display: "Started", value: :started, field: "started_at"},
|
48
48
|
{display: "Actions", value: :action_buttons, orderable: false}
|
49
49
|
].freeze
|
50
|
-
RUNNING_FIELDS = (COMMON_FIELDS + %i[record_count
|
50
|
+
RUNNING_FIELDS = (COMMON_FIELDS + %i[record_count input_categories output_categories priority sub_state percent_complete]).freeze
|
51
51
|
|
52
52
|
SCHEDULED_COLUMNS = [
|
53
53
|
{display: "Class", value: :class_with_link, field: "_type"},
|