rocketjob_mission_control 5.0.1 → 6.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/app/assets/config/manifest.js +3 -0
  4. data/app/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  5. data/app/assets/fonts/glyphicons-halflings-regular.svg +288 -0
  6. data/app/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  7. data/app/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  8. data/app/assets/fonts/glyphicons-halflings-regular.woff2 +0 -0
  9. data/app/assets/javascripts/rocket_job_mission_control/application.js +10 -11
  10. data/app/assets/javascripts/rocket_job_mission_control/base.js +1 -1
  11. data/app/assets/javascripts/rocket_job_mission_control/bootstrap.min.js +6 -0
  12. data/app/assets/javascripts/rocket_job_mission_control/{datatable.js → datatable_init.js} +0 -0
  13. data/{vendor/assets/javascripts → app/assets/javascripts/rocket_job_mission_control}/datatables.min.js +0 -0
  14. data/app/assets/javascripts/rocket_job_mission_control/dirmon_entries.js +1 -1
  15. data/app/assets/javascripts/rocket_job_mission_control/jquery-3.5.1.min.js +2 -0
  16. data/app/assets/javascripts/rocket_job_mission_control/nested_fields.js +112 -0
  17. data/app/assets/javascripts/rocket_job_mission_control/selectize.min.js +3 -0
  18. data/app/assets/javascripts/rocket_job_mission_control/selectize_init.js +6 -0
  19. data/app/assets/stylesheets/rocket_job_mission_control/{application.scss → application.css} +9 -8
  20. data/app/assets/stylesheets/rocket_job_mission_control/base.css +420 -0
  21. data/app/assets/stylesheets/rocket_job_mission_control/bootstrap.min.css.erb +6 -0
  22. data/app/assets/stylesheets/rocket_job_mission_control/bootstrap.min.css.map +1 -0
  23. data/app/assets/stylesheets/rocket_job_mission_control/{callout.scss → callout.css} +50 -52
  24. data/{vendor/assets/stylesheets → app/assets/stylesheets/rocket_job_mission_control}/datatables.min.css +0 -0
  25. data/{vendor/assets/stylesheets → app/assets/stylesheets/rocket_job_mission_control}/fontawesome-all.min.css.erb +0 -0
  26. data/app/assets/stylesheets/rocket_job_mission_control/jobs.css +56 -0
  27. data/app/assets/stylesheets/rocket_job_mission_control/selectize.bootstrap3.css +1 -0
  28. data/app/assets/stylesheets/rocket_job_mission_control/selectize.css +19 -0
  29. data/app/assets/stylesheets/rocket_job_mission_control/worker_processes.css +7 -0
  30. data/app/controllers/rocket_job_mission_control/application_controller.rb +2 -0
  31. data/app/controllers/rocket_job_mission_control/dirmon_entries_controller.rb +23 -23
  32. data/app/controllers/rocket_job_mission_control/jobs_controller.rb +57 -7
  33. data/app/controllers/rocket_job_mission_control/servers_controller.rb +7 -7
  34. data/app/datatables/rocket_job_mission_control/dirmon_entries_datatable.rb +1 -1
  35. data/app/datatables/rocket_job_mission_control/jobs_datatable.rb +1 -1
  36. data/app/helpers/rocket_job_mission_control/application_helper.rb +52 -27
  37. data/app/helpers/rocket_job_mission_control/dirmon_entries_helper.rb +12 -0
  38. data/app/helpers/rocket_job_mission_control/jobs_helper.rb +76 -8
  39. data/app/helpers/rocket_job_mission_control/servers_helper.rb +4 -0
  40. data/app/models/rocket_job_mission_control/dirmon_sanitizer.rb +68 -0
  41. data/app/models/rocket_job_mission_control/job_sanitizer.rb +38 -0
  42. data/app/views/layouts/rocket_job_mission_control/application.html.erb +2 -2
  43. data/app/views/layouts/rocket_job_mission_control/partials/_flash.html.erb +4 -4
  44. data/app/views/rocket_job_mission_control/dirmon_entries/_form.html.erb +78 -42
  45. data/app/views/rocket_job_mission_control/dirmon_entries/_input_categories.html.erb +59 -0
  46. data/app/views/rocket_job_mission_control/dirmon_entries/_input_category_fields.html.erb +56 -0
  47. data/app/views/rocket_job_mission_control/dirmon_entries/_output_categories.html.erb +44 -0
  48. data/app/views/rocket_job_mission_control/dirmon_entries/_output_category_fields.html.erb +36 -0
  49. data/app/views/rocket_job_mission_control/dirmon_entries/_status.html.erb +22 -16
  50. data/app/views/rocket_job_mission_control/dirmon_entries/copy.html.erb +1 -1
  51. data/app/views/rocket_job_mission_control/dirmon_entries/edit.html.erb +7 -3
  52. data/app/views/rocket_job_mission_control/dirmon_entries/show.html.erb +2 -3
  53. data/app/views/rocket_job_mission_control/jobs/_attributes.html.erb +28 -0
  54. data/app/views/rocket_job_mission_control/jobs/_dates.html.erb +35 -0
  55. data/app/views/rocket_job_mission_control/jobs/_details.html.erb +125 -0
  56. data/app/views/rocket_job_mission_control/jobs/_exception.html.erb +22 -0
  57. data/app/views/rocket_job_mission_control/jobs/_input_categories.html.erb +76 -0
  58. data/app/views/rocket_job_mission_control/jobs/_input_category_fields.html.erb +56 -0
  59. data/app/views/rocket_job_mission_control/jobs/_output_categories.html.erb +49 -0
  60. data/app/views/rocket_job_mission_control/jobs/_output_category_fields.html.erb +36 -0
  61. data/app/views/rocket_job_mission_control/jobs/_retryable.html.erb +16 -0
  62. data/app/views/rocket_job_mission_control/jobs/_status.html.erb +20 -48
  63. data/app/views/rocket_job_mission_control/jobs/edit.html.erb +28 -0
  64. data/app/views/rocket_job_mission_control/jobs/edit_slice.html.erb +2 -2
  65. data/app/views/rocket_job_mission_control/jobs/exception.html.erb +1 -1
  66. data/app/views/rocket_job_mission_control/jobs/index.html.erb +24 -18
  67. data/app/views/rocket_job_mission_control/jobs/show.html.erb +32 -58
  68. data/app/views/rocket_job_mission_control/jobs/view_slice.html.erb +6 -4
  69. data/config/initializers/assets.rb +3 -4
  70. data/lib/rocket_job_mission_control/engine.rb +2 -2
  71. data/lib/rocket_job_mission_control/version.rb +1 -1
  72. data/test/controllers/rocket_job_mission_control/dirmon_entries_controller_test.rb +3 -3
  73. data/test/controllers/rocket_job_mission_control/jobs_controller_test.rb +7 -6
  74. data/test/controllers/rocket_job_mission_control/servers_controller_test.rb +3 -3
  75. data/test/models/rocket_job_mission_control/dirmon_sanitizer_test.rb +146 -0
  76. data/test/models/rocket_job_mission_control/job_sanitizer_test.rb +1 -1
  77. data/test/test_helper.rb +5 -11
  78. metadata +62 -41
  79. data/app/assets/javascripts/rocket_job_mission_control/selectize.js +0 -8
  80. data/app/assets/stylesheets/rocket_job_mission_control/base.scss +0 -436
  81. data/app/assets/stylesheets/rocket_job_mission_control/bootstrap_and_overrides.scss +0 -488
  82. data/app/assets/stylesheets/rocket_job_mission_control/jobs.scss +0 -72
  83. data/app/assets/stylesheets/rocket_job_mission_control/worker_processes.scss +0 -9
  84. data/vendor/assets/javascripts/bootstrap.min.js +0 -7
  85. data/vendor/assets/javascripts/microplugin.js +0 -135
  86. data/vendor/assets/javascripts/selectize.js +0 -3058
  87. data/vendor/assets/javascripts/sifter.js +0 -470
  88. data/vendor/assets/stylesheets/bootstrap.min.css +0 -6
  89. data/vendor/assets/stylesheets/bootstrap.min.css.map +0 -1
  90. data/vendor/assets/stylesheets/selectize.bootstrap3.css +0 -408
  91. 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: #A29F00;
8
- a {
9
- color: #A29F00;
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
- a {
15
- color: #337ab7;
16
- }
14
+ }
15
+ .callout-running a {
16
+ color: #337ab7;
17
17
  }
18
18
  .callout-sleeping {
19
19
  border-left-color: darkcyan;
20
- a {
21
- color: darkcyan;
22
- }
20
+ }
21
+ .callout-sleeping a {
22
+ color: darkcyan;
23
23
  }
24
24
  .callout-scheduled {
25
- border-left-color: #92001B;
26
- a {
27
- color: #92001B;
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
- a {
33
- color: green;
34
- }
32
+ }
33
+ .callout-completed a {
34
+ color: green;
35
35
  }
36
36
  .callout-paused {
37
37
  border-left-color: orange;
38
- a {
39
- color: orange;
40
- }
38
+ }
39
+ .callout-paused a {
40
+ color: orange;
41
41
  }
42
42
  .callout-failed {
43
43
  border-left-color: red;
44
- a {
45
- color: red;
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
- a {
59
- color: orange;
60
- }
57
+ }
58
+ .callout-pending a {
59
+ color: orange;
61
60
  }
62
61
  .callout-enabled {
63
62
  border-left-color: green;
64
- a {
65
- color: green;
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
- .title {
83
- color: #1b809e;
84
- }
80
+ }
81
+ .callout-info .title {
82
+ color: #1b809e;
85
83
  }
86
84
  .callout-success {
87
85
  border-left-color: #3c763d;
88
- .title {
89
- color: #3c763d;
90
- }
86
+ }
87
+ .callout-success .title {
88
+ color: #3c763d;
91
89
  }
92
90
  .callout-warning {
93
91
  border-left-color: #aa6708;
94
- .title {
95
- color: #aa6708;
96
- }
92
+ }
93
+ .callout-warning .title {
94
+ color: #aa6708;
97
95
  }
98
96
  .callout-alert {
99
97
  border-left-color: #ce4844;
100
- .title {
101
- color: #ce4844;
102
- }
98
+ }
99
+ .callout-alert .title {
100
+ color: #ce4844;
103
101
  }
104
102
  .callout-zombie {
105
103
  border-left-color: darkred;
106
- .title {
107
- color: darkred;
108
- }
104
+ }
105
+ .callout-zombie .title {
106
+ color: darkred;
109
107
  }
@@ -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}
@@ -0,0 +1,7 @@
1
+ #servers .server-collection-actions {
2
+ margin: 1em 0;
3
+ }
4
+ #servers .actions > a {
5
+ display: inline;
6
+ margin: 5px;
7
+ }
@@ -25,6 +25,8 @@ module RocketJobMissionControl
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
- if Rails.version.to_i < 5
4
- before_filter :find_entry_or_redirect, except: %i[index disabled enabled failed pending new create]
5
- before_filter :authorize_read, only: %i[index disabled enabled failed pending]
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
- # When you click on the Copy button,
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, dirmon_entry_replicate, false)
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
- if properties = params[:rocket_job_dirmon_entry][:properties]
102
- @dirmon_entry.properties = JobSanitizer.sanitize(properties, @dirmon_entry.job_class, @dirmon_entry, false)
103
- end
104
- if @dirmon_entry.errors.empty? && @dirmon_entry.valid? && @dirmon_entry.update_attributes(dirmon_params)
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[:alert] = t(:failure, scope: %i[dirmon_entry enable])
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[:alert] = t(:failure, scope: %i[dirmon_entry disable])
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[:alert] = t(:failure, scope: %i[dirmon_entry find], id: params[:id])
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(params[:job], @job.class, @job)
78
- if @job.errors.empty? && @job.valid? && @job.update_attributes(permitted_params)
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[:notice] = t(:no_errors, scope: %i[job failures])
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[:notice] = t(:no_errors, scope: %i[job failures])
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,40 @@ module RocketJobMissionControl
257
281
 
258
282
  def find_job_or_redirect
259
283
  unless @job = RocketJob::Job.where(id: params[:id]).first
260
- flash[:alert] = t(:failure, scope: %i[job find], id: params[:id])
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(@job.class.user_editable_fields)
291
+ params.require(:job).permit(
292
+ job_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
+ )
311
+ end
312
+
313
+ def job_fields
314
+ @job.class.user_editable_fields.collect do |field_name|
315
+ field = @job.class.fields[field_name.to_s]
316
+ field.type.name == "Array" ? {field_name.to_sym => []} : field_name.to_sym
317
+ end
268
318
  end
269
319
 
270
320
  def error_occurred(exception)
@@ -308,7 +358,7 @@ module RocketJobMissionControl
308
358
  h = {data: index.to_s}
309
359
  h[:width] = column[:width] if column.key?(:width)
310
360
  h[:orderable] = column[:orderable] if column.key?(:orderable)
311
- index += 1
361
+ index += 1
312
362
  h
313
363
  end
314
364
  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[:notice] = t(:success, scope: %i[server update_all], action: server_action.to_s)
65
+ flash[:success] = t(:success, scope: %i[server update_all], action: server_action.to_s)
66
66
  else
67
- flash[:alert] = t(:invalid, scope: %i[server update_all])
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[:notice] = t(:success, scope: %i[server update_one], action: "stop", name: @server.name)
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[:notice] = t(:success, scope: %i[server destroy])
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[:notice] = t(:success, scope: %i[server update_one], action: "pause", name: @server.name)
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[:notice] = t(:success, scope: %i[server update_one], action: "resume", name: @server.name)
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[:alert] = t(:failure, scope: %i[server find], id: params[:id])
143
+ flash[:danger] = t(:failure, scope: %i[server find], id: params[:id])
144
144
 
145
145
  redirect_to(servers_path)
146
146
  end
@@ -17,7 +17,7 @@ module RocketJobMissionControl
17
17
  <<-EOS
18
18
  <a href="#{dirmon_entry_path(dirmon.id)}">
19
19
  <i class="#{state_icon(dirmon.state)}" style="font-size: 75%" title="#{dirmon.state}"></i>
20
- #{dirmon.name}
20
+ #{h(dirmon.name)}
21
21
  </a>
22
22
  EOS
23
23
  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 collect_output input_categories output_categories encrypt compress slice_size priority sub_state percent_complete]).freeze
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"},