rocketjob_mission_control 5.0.0.beta1 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/Rakefile +1 -2
  4. data/app/assets/config/manifest.js +3 -0
  5. data/app/assets/javascripts/rocket_job_mission_control/application.js +3 -5
  6. data/app/assets/javascripts/rocket_job_mission_control/nested_fields.js +112 -0
  7. data/app/assets/stylesheets/rocket_job_mission_control/{application.scss → application.css} +9 -9
  8. data/app/assets/stylesheets/rocket_job_mission_control/base.css +420 -0
  9. data/app/assets/stylesheets/rocket_job_mission_control/{callout.scss → callout.css} +50 -52
  10. data/app/assets/stylesheets/rocket_job_mission_control/jobs.css +56 -0
  11. data/app/assets/stylesheets/rocket_job_mission_control/worker_processes.css +7 -0
  12. data/app/controllers/rocket_job_mission_control/application_controller.rb +3 -1
  13. data/app/controllers/rocket_job_mission_control/dirmon_entries_controller.rb +40 -21
  14. data/app/controllers/rocket_job_mission_control/jobs_controller.rb +50 -7
  15. data/app/controllers/rocket_job_mission_control/servers_controller.rb +7 -7
  16. data/app/datatables/rocket_job_mission_control/dirmon_entries_datatable.rb +1 -1
  17. data/app/datatables/rocket_job_mission_control/jobs_datatable.rb +1 -1
  18. data/app/helpers/rocket_job_mission_control/application_helper.rb +51 -26
  19. data/app/helpers/rocket_job_mission_control/dirmon_entries_helper.rb +12 -0
  20. data/app/helpers/rocket_job_mission_control/jobs_helper.rb +76 -8
  21. data/app/helpers/rocket_job_mission_control/servers_helper.rb +4 -0
  22. data/app/models/rocket_job_mission_control/access_policy.rb +2 -2
  23. data/app/models/rocket_job_mission_control/dirmon_sanitizer.rb +68 -0
  24. data/app/models/rocket_job_mission_control/job_sanitizer.rb +37 -0
  25. data/app/views/layouts/rocket_job_mission_control/partials/_flash.html.erb +4 -4
  26. data/app/views/rocket_job_mission_control/dirmon_entries/_form.html.erb +78 -42
  27. data/app/views/rocket_job_mission_control/dirmon_entries/_input_categories.html.erb +59 -0
  28. data/app/views/rocket_job_mission_control/dirmon_entries/_input_category_fields.html.erb +56 -0
  29. data/app/views/rocket_job_mission_control/dirmon_entries/_output_categories.html.erb +44 -0
  30. data/app/views/rocket_job_mission_control/dirmon_entries/_output_category_fields.html.erb +36 -0
  31. data/app/views/rocket_job_mission_control/dirmon_entries/_status.html.erb +22 -16
  32. data/app/views/rocket_job_mission_control/dirmon_entries/copy.html.erb +4 -0
  33. data/app/views/rocket_job_mission_control/dirmon_entries/edit.html.erb +7 -3
  34. data/app/views/rocket_job_mission_control/dirmon_entries/show.html.erb +8 -5
  35. data/app/views/rocket_job_mission_control/jobs/_attributes.html.erb +28 -0
  36. data/app/views/rocket_job_mission_control/jobs/_dates.html.erb +35 -0
  37. data/app/views/rocket_job_mission_control/jobs/_details.html.erb +125 -0
  38. data/app/views/rocket_job_mission_control/jobs/_exception.html.erb +22 -0
  39. data/app/views/rocket_job_mission_control/jobs/_input_categories.html.erb +76 -0
  40. data/app/views/rocket_job_mission_control/jobs/_input_category_fields.html.erb +56 -0
  41. data/app/views/rocket_job_mission_control/jobs/_output_categories.html.erb +49 -0
  42. data/app/views/rocket_job_mission_control/jobs/_output_category_fields.html.erb +36 -0
  43. data/app/views/rocket_job_mission_control/jobs/_retryable.html.erb +16 -0
  44. data/app/views/rocket_job_mission_control/jobs/_status.html.erb +20 -48
  45. data/app/views/rocket_job_mission_control/jobs/edit.html.erb +28 -0
  46. data/app/views/rocket_job_mission_control/jobs/edit_slice.html.erb +2 -2
  47. data/app/views/rocket_job_mission_control/jobs/exception.html.erb +1 -1
  48. data/app/views/rocket_job_mission_control/jobs/index.html.erb +24 -18
  49. data/app/views/rocket_job_mission_control/jobs/show.html.erb +32 -58
  50. data/app/views/rocket_job_mission_control/jobs/view_slice.html.erb +6 -4
  51. data/config/initializers/assets.rb +3 -4
  52. data/config/routes.rb +4 -0
  53. data/lib/rocket_job_mission_control/engine.rb +0 -3
  54. data/lib/rocket_job_mission_control/version.rb +1 -1
  55. data/test/controllers/rocket_job_mission_control/application_controller_test.rb +4 -12
  56. data/test/controllers/rocket_job_mission_control/dirmon_entries_controller_test.rb +20 -52
  57. data/test/controllers/rocket_job_mission_control/jobs_controller_test.rb +21 -41
  58. data/test/controllers/rocket_job_mission_control/servers_controller_test.rb +3 -3
  59. data/test/models/rocket_job_mission_control/dirmon_sanitizer_test.rb +146 -0
  60. data/test/models/rocket_job_mission_control/job_sanitizer_test.rb +9 -3
  61. data/test/test_helper.rb +6 -12
  62. data/vendor/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  63. data/vendor/assets/fonts/glyphicons-halflings-regular.svg +288 -0
  64. data/vendor/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  65. data/vendor/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  66. data/vendor/assets/fonts/glyphicons-halflings-regular.woff2 +0 -0
  67. data/vendor/assets/javascripts/bootstrap.min.js +3 -4
  68. data/vendor/assets/javascripts/datatables.min.js +881 -0
  69. data/vendor/assets/javascripts/jquery-3.5.1.min.js +2 -0
  70. data/vendor/assets/stylesheets/bootstrap.min.css.erb +6 -0
  71. data/vendor/assets/stylesheets/bootstrap.min.css.map +1 -1
  72. data/vendor/assets/stylesheets/datatables.min.css +141 -0
  73. metadata +60 -63
  74. data/app/assets/stylesheets/rocket_job_mission_control/base.scss +0 -436
  75. data/app/assets/stylesheets/rocket_job_mission_control/bootstrap_and_overrides.scss +0 -488
  76. data/app/assets/stylesheets/rocket_job_mission_control/jobs.scss +0 -72
  77. data/app/assets/stylesheets/rocket_job_mission_control/worker_processes.scss +0 -9
  78. data/vendor/assets/stylesheets/bootstrap.min.css +0 -6
@@ -1,13 +1,13 @@
1
1
  <% if flash.present? %>
2
- <div class='flash text-center'>
2
+ <div class="flash text-center">
3
3
  <% flash.each do |key, msg| %>
4
- <div class='alert alert-<%=key%> alert-dismissable' role='alert'>
5
- <button class='close' data-dismiss='alert'>
4
+ <div class="alert alert-<%=key%> alert-dismissable" role="alert">
5
+ <button class="close" data-dismiss="alert">
6
6
  <span>&times;</span>
7
7
  </button>
8
8
 
9
9
  <% if msg.kind_of? Array %>
10
- <ul class='list-unstyled margin-bottom-0'>
10
+ <ul class="list-unstyled margin-bottom-0">
11
11
  <% msg.each do |m| %>
12
12
  <li><%= m.html_safe %></li>
13
13
  <% end %>
@@ -1,69 +1,105 @@
1
1
  <% action ||= :create %>
2
2
 
3
3
  <% if @dirmon_entry.errors.present? %>
4
- <div class='alert alert-alert'>Invalid Dirmon entry!</div>
4
+ <div class="alert alert-alert">Invalid Dirmon entry!</div>
5
+
5
6
  <% @dirmon_entry.errors.messages.each_pair do |field, message| %>
6
- <div class='message'><%= field %>: <%= message %></div>
7
+ <div class="message"><%= field %>: <%= message %></div>
7
8
  <% end %>
8
9
  <% end %>
9
10
 
10
- <%= form_for @dirmon_entry, url: {action: action} do |f| %>
11
- <div class='row'>
12
- <div class='col-md-6'>
13
- <div class='name form-group'>
14
- <%= f.label :name %>
15
- <%= f.text_field :name, class: 'form-control' %>
16
- </div>
17
- </div>
11
+ <%= form_for @dirmon_entry, url: { action: action } do |f| %>
12
+ <div class="row">
13
+ <div class="col-md-12">
14
+ <div class="arguments">
15
+ <div class="panel panel-default">
16
+ <div class="panel-body">
17
+ <div class="job_arguments form-group"></div>
18
18
 
19
- <div class='col-md-6'>
20
- <div class='job form-group'>
21
- <%= f.label :job_class_name %>
22
- <%= f.text_field :job_class_name, class: 'form-control', disabled: action != :create %>
23
- </div>
24
- </div>
25
- </div>
19
+ <div class="form-group">
20
+ <%= f.label :name %>
21
+ <%= f.text_field :name, class: "form-control" %>
22
+ </div>
26
23
 
27
- <div class='path form-group'>
28
- <%= f.label :pattern %>
29
- <%= f.text_field :pattern, class: 'form-control' %>
30
- </div>
24
+ <div class="form-group">
25
+ <%= f.label "Job Class" %>
26
+ <%= f.text_field :job_class_name, class: "form-control", disabled: action != :create %>
27
+ </div>
31
28
 
32
- <div class='path form-group'>
33
- <%= f.label :archive_directory %>
34
- <%= f.text_field :archive_directory, class: 'form-control' %>
35
- </div>
29
+ <div class="form-group">
30
+ <%= f.label :pattern %>
31
+ <%= f.text_field :pattern, class: "form-control" %>
32
+ </div>
33
+
34
+ <div class="form-group">
35
+ <%= f.label :archive_directory %>
36
+ <%= f.text_field :archive_directory, class: "form-control" %>
37
+ </div>
38
+ </div>
39
+ </div>
40
+
41
+ <% if @dirmon_entry.job_class %>
42
+ <% @job = @dirmon_entry.job_class.from_properties(@dirmon_entry.properties) %>
43
+ <%= f.fields_for :properties do |p| %>
44
+ <div class="panel panel-default">
45
+ <div class="panel-heading">
46
+ <strong>Properties</strong>
47
+ </div>
48
+
49
+ <div class="panel-body">
50
+ <% @dirmon_entry.job_class.user_editable_fields.sort.each do |property_name| %>
51
+ <% next if property_name == :run_at %>
52
+
53
+ <div class="form-group">
54
+ <%= p.label property_name.to_s %>
55
+ <%= editable_field_html(@dirmon_entry.job_class, property_name, @job.public_send(property_name), p) %>
56
+ </div>
57
+ <% end %>
58
+ </div>
59
+ </div>
60
+
61
+ <% if @dirmon_entry.job_class.respond_to?(:defined_input_categories) && @dirmon_entry.job_class.respond_to?(:defined_output_categories) %>
62
+ <div class="row">
63
+ <div class="col-sm-6">
64
+ <div class="panel panel-primary">
65
+ <div class="panel-body">
66
+ <div class='lead'>Input Categories</div>
36
67
 
37
- <div class='row'>
38
- <div class='col-md-12'>
39
- <% if @dirmon_entry.job_class %>
40
- <div class='lead'>Job Properties</div>
68
+ <% @job.input_categories.each do |input_categories| %>
69
+ <%= p.fields_for "input_categories_attributes[]", input_categories do |i| %>
70
+ <%= render "input_category_fields.html", f: i %>
71
+ <% end %>
72
+ <% end %>
73
+ </div>
74
+ </div>
75
+ </div>
41
76
 
42
- <div class='arguments'>
43
- <div class='job_arguments form-group'></div>
77
+ <div class="col-sm-6">
78
+ <div class="panel panel-success">
79
+ <div class="panel-body">
80
+ <div class='lead'>Output Categories</div>
44
81
 
45
- <%= f.fields_for :properties do |properties| %>
46
- <% @dirmon_entry.job_class.user_editable_fields.each do |property_name| %>
47
- <div class='form-group'>
48
- <%= properties.label property_name.to_s %>
49
- <%= editable_field_html(@dirmon_entry.job_class, property_name, @dirmon_entry.properties[property_name], properties, true) %>
82
+ <% @job.output_categories.each do |output_categories| %>
83
+ <%= p.fields_for "output_categories_attributes[]", output_categories do |o| %>
84
+ <%= render "output_category_fields.html", f: o %>
85
+ <% end %>
86
+ <% end %>
87
+ </div>
88
+ </div>
89
+ </div>
50
90
  </div>
51
91
  <% end %>
52
92
  <% end %>
53
93
  </div>
54
94
  <% end %>
55
95
 
56
- <div class='buttons pull-right'>
96
+ <div class='buttons'>
57
97
  <%= f.submit action, class: 'btn btn-primary' %>
58
98
  <%= link_to 'cancel', :back, class: 'btn btn-default' %>
59
99
  </div>
60
100
 
61
101
  <% if action == :create %>
62
- <%= button_tag 'properties',
63
- type: 'button',
64
- class: 'btn btn-default',
65
- id: 'properties',
66
- data: { url: rocket_job_mission_control.new_dirmon_entry_path } %>
102
+ <%= button_tag 'properties', type: 'button', class: 'btn btn-default', id: 'properties', data: {url: rocket_job_mission_control.new_dirmon_entry_path} %>
67
103
  <% end %>
68
104
  </div>
69
105
  </div>
@@ -0,0 +1,59 @@
1
+ <div class='lead'>Input Categories:</div>
2
+ <% @job.input_categories.each do |category| %>
3
+ <div class='row'>
4
+ <div class='col-md-12'>
5
+ <div class='status-message'><label><%= category.name.to_s.camelcase %>:</label></div>
6
+ <div class='row'>
7
+ <div class='col-md-12'>
8
+ <table>
9
+ <% if category.name == :main %>
10
+ <tr>
11
+ <td><label>Slice Size:</label></td>
12
+ <td><%= category.slice_size %></td>
13
+ </tr>
14
+ <% end %>
15
+ </tr>
16
+ <tr>
17
+ <td><label>Format:</label></td>
18
+ <td><%= category.format %></td>
19
+ </tr>
20
+ <tr>
21
+ <td><label>Skip Unknown Columns:</label></td>
22
+ <td><%= category.skip_unknown %></td>
23
+ </tr>
24
+ <tr>
25
+ <td><label>Mode:</label></td>
26
+ <td><%= category.mode %></td>
27
+ </tr>
28
+ <% if category.format_options %>
29
+ <tr>
30
+ <td><label>Format Options:</label></td>
31
+ <td>
32
+ <pre><code><%= category.format_options.ai(plain: true, ruby19_syntax: true, sort_keys: true) %></code></pre>
33
+ </td>
34
+ </tr>
35
+ <% end %>
36
+ <% if category.columns %>
37
+ <% first = true %>
38
+ <% category.columns.each do |item| %>
39
+ <% if first %>
40
+ <tr>
41
+ <td><label>Columns:</label></td>
42
+ <td><%= item %></td>
43
+ </tr>
44
+ <% first = false %>
45
+ <% else %>
46
+ <tr>
47
+ <td></td>
48
+ <td><%= item %></td>
49
+ </tr>
50
+ <% end %>
51
+ <% end %>
52
+ <% end %>
53
+ </table>
54
+ </div>
55
+ </div>
56
+ </div>
57
+ </div>
58
+ <br/>
59
+ <% end %>
@@ -0,0 +1,56 @@
1
+ <% input_category = f.object %>
2
+
3
+ <div class="nested-fields">
4
+ <div class="panel panel-primary">
5
+ <div class="panel-heading">
6
+ <div class="row">
7
+ <div class="col-sm-12">
8
+ <h4><%= input_category.name %></h4>
9
+ </div>
10
+ </div>
11
+ </div>
12
+
13
+ <div class="panel-body">
14
+ <%= f.hidden_field :name, value: input_category.name %>
15
+
16
+ <div class="form-group">
17
+ <%= f.label :columns %>
18
+ <% options = input_category.columns || []%>
19
+ <%= f.select(:columns, options_for_select(options, options), { include_hidden: false }, { class: "selectize form-control", multiple: true }) %>
20
+ </div>
21
+
22
+ <div class="form-group">
23
+ <%= f.label :format %>
24
+ <% options = extract_inclusion_values(RocketJob::Category::Input, :format) %>
25
+ <% value = input_category.format %>
26
+ <%= f.select(:format, options, { include_blank: true, selected: value }, { class: "selectize form-control" }) %>
27
+ </div>
28
+
29
+ <div class="form-group">
30
+ <%= f.label :format_options %>
31
+ <% value = input_category.format_options %>
32
+ <%= f.text_field(:format_options, value: value ? value.to_json : nil, class: "form-control", placeholder: '{"key1":"value1", "key2":"value2", "key3":"value3"}') %>
33
+ </div>
34
+
35
+ <div class="form-group">
36
+ <%= f.label :mode %>
37
+ <% options = extract_inclusion_values(RocketJob::Category::Input, :mode) %>
38
+ <% value = input_category.mode %>
39
+ <%= f.select(:mode, options, { include_blank: true, selected: value }, { class: "selectize form-control" }) %>
40
+ </div>
41
+
42
+ <div class="form-group">
43
+ <%= f.label "Skip and Ignore Unknown Columns" %>
44
+ <% options = extract_inclusion_values(RocketJob::Category::Input, :skip_unknown) %>
45
+ <% value = input_category.skip_unknown %>
46
+ <%= f.select(:skip_unknown, options, { include_blank: true, selected: value }, { class: "selectize form-control" }) %>
47
+ </div>
48
+
49
+ <div class="form-group">
50
+ <%= f.label :slice_size %>
51
+ <% value = input_category.slice_size %>
52
+ <%= f.number_field(:slice_size, value: value, class: "form-control") %>
53
+ </div>
54
+ </div>
55
+ </div>
56
+ </div>
@@ -0,0 +1,44 @@
1
+ <div class='lead'>Output Categories:</div>
2
+ <% @job.output_categories.each do |category| %>
3
+ <div class='row'>
4
+ <div class='col-md-12'>
5
+ <div class='status-message'><label><%= category.name.to_s.camelcase %>:</label></div>
6
+ <div class='row'>
7
+ <div class='col-md-12'>
8
+ <table>
9
+ <tr>
10
+ <td><label>Format:</label></td>
11
+ <td><%= category.format %></td>
12
+ </tr>
13
+ <% if category.format_options %>
14
+ <tr>
15
+ <td><label>Format Options:</label></td>
16
+ <td>
17
+ <pre><code><%= category.format_options.ai(plain: true, ruby19_syntax: true, sort_keys: true) %></code></pre>
18
+ </td>
19
+ </tr>
20
+ <% end %>
21
+ <% if category.columns %>
22
+ <% first = true %>
23
+ <% category.columns.each do |item| %>
24
+ <% if first %>
25
+ <tr>
26
+ <td><label>Columns:</label></td>
27
+ <td><%= item %></td>
28
+ </tr>
29
+ <% first = false %>
30
+ <% else %>
31
+ <tr>
32
+ <td></td>
33
+ <td><%= item %></td>
34
+ </tr>
35
+ <% end %>
36
+ <% end %>
37
+ <% end %>
38
+ </table>
39
+ </div>
40
+ </div>
41
+ </div>
42
+ </div>
43
+ <br/>
44
+ <% end %>
@@ -0,0 +1,36 @@
1
+ <% output_category = f.object %>
2
+
3
+ <div class="nested-fields">
4
+ <div class="panel panel-success">
5
+ <div class="panel-heading">
6
+ <div class="row">
7
+ <div class="col-sm-12">
8
+ <h4><%= output_category.name %></h4>
9
+ </div>
10
+ </div>
11
+ </div>
12
+
13
+ <div class="panel-body">
14
+ <%= f.hidden_field :name, value: output_category.name %>
15
+
16
+ <div class="form-group">
17
+ <%= f.label :columns %>
18
+ <% options = output_category.columns || [] %>
19
+ <%= f.select(:columns, options_for_select(options, options), { include_hidden: false }, { class: "selectize form-control", multiple: true }) %>
20
+ </div>
21
+
22
+ <div class="form-group">
23
+ <%= f.label :format %>
24
+ <% options = extract_inclusion_values(RocketJob::Category::Output, :format) %>
25
+ <% value = output_category.format %>
26
+ <%= f.select(:format, options, { include_blank: true, selected: value }, { class: "selectize form-control" }) %>
27
+ </div>
28
+
29
+ <div class="form-group">
30
+ <%= f.label :format_options %>
31
+ <% value = output_category.format_options %>
32
+ <%= f.text_field(:format_options, value: value ? value.to_json : nil, class: "form-control", placeholder: '{"key1":"value1", "key2":"value2", "key3":"value3"}') %>
33
+ </div>
34
+ </div>
35
+ </div>
36
+ </div>
@@ -1,20 +1,26 @@
1
- <div><label>Name:</label><%= @dirmon_entry.name %></div>
2
- <div><label>Pattern:</label><%= @dirmon_entry.pattern %></div>
3
- <div><label>Job Class Name:</label><%= @dirmon_entry.job_class_name %></div>
4
- <div><label>Archive Directory:</label><%= @dirmon_entry.archive_directory %></div>
5
-
6
- </br>
1
+ <div class='row'>
2
+ <div class='col-md-12'>
3
+ <div><label>Job Class:</label><%= @dirmon_entry.job_class_name %></div>
4
+ <div><label>Pattern:</label><%= @dirmon_entry.pattern %></div>
5
+ <div><label>Archive Directory:</label><%= @dirmon_entry.archive_directory %></div>
6
+ <div class='id'><label>ID:</label><%= @dirmon_entry.id %></div>
7
+ </div>
8
+ </div>
7
9
 
8
- <% @dirmon_entry.properties.each_pair do |name, value| %>
9
- <div class='parameters'>
10
- <label><%= name.to_s.titleize %>:</label>
10
+ <div class='lead'>Properties</div>
11
+ <div class='row'>
12
+ <div class='col-md-12'>
13
+ <% @dirmon_entry.properties.keys.sort.each do |name| %>
14
+ <% value = @dirmon_entry.properties[name] %>
15
+ <div class='parameters'>
16
+ <label><%= name.to_s.titleize %>:</label>
11
17
 
12
- <% if value.is_a?(Array) || value.is_a?(Hash) %>
13
- <pre><code><%= pretty_print_array_or_hash(value) %></code></pre>
14
- <% else %>
15
- <%= value %>
18
+ <% if value.is_a?(Array) || value.is_a?(Hash) %>
19
+ <pre><code><%= pretty_print_array_or_hash(value) %></code></pre>
20
+ <% else %>
21
+ <%= value %>
22
+ <% end %>
23
+ </div>
16
24
  <% end %>
17
25
  </div>
18
- <% end %>
19
-
20
- <div class='id'><label>ID:</label><%= @dirmon_entry.id %></div>
26
+ </div>
@@ -0,0 +1,4 @@
1
+ <div class='container-fluid'>
2
+ <div class='lead'>Copy Dirmon Entry</div>
3
+ <%= render partial: 'form', locals: { action: :replicate} %>
4
+ </div>
@@ -1,5 +1,9 @@
1
- <div class='container-fluid'>
2
- <div class='lead'>Edit Dirmon Entry</div>
1
+ <div class="container-fluid">
2
+ <div class="row">
3
+ <div class="col-md-12">
4
+ <div class="lead">Edit Dirmon Entry</div>
5
+ </div>
6
+ </div>
3
7
 
4
- <%= render partial: 'form', locals: { action: :update } %>
8
+ <%= render partial: "form", locals: { action: :update } %>
5
9
  </div>
@@ -1,18 +1,17 @@
1
1
  <div class='col-md-12 job-status'>
2
2
  <div id='job'>
3
- <div class='lead'><%= @dirmon_entry.job_class_name %></div>
3
+ <div class='lead'><%= @dirmon_entry.name %></div>
4
4
 
5
5
  <div class='job-state inline-block'>
6
6
  <div class='left'>status</div>
7
7
  <div class="<%= @dirmon_entry.state %> right"><%= @dirmon_entry.state %></div>
8
8
  </div>
9
9
 
10
- <div class='btn-toolbar job-actions pull-right'>
10
+ <div class='btn-toolbar job-actions'>
11
11
  <div class='btn-group'>
12
12
  <% if (@dirmon_entry.disabled? || @dirmon_entry.pending?) && can?(:enable, @dirmon_entry) %>
13
13
  <%= link_to 'Enable', enable_dirmon_entry_path(@dirmon_entry.id), method: :put, class: 'btn btn-default' %>
14
14
  <% end %>
15
-
16
15
  <% if @dirmon_entry.enabled? && can?(:disable, @dirmon_entry)%>
17
16
  <%= link_to 'Disable', disable_dirmon_entry_path(@dirmon_entry.id), method: :put, class: 'btn btn-default', data: { confirm: 'Are you sure?' } %>
18
17
  <% end %>
@@ -24,8 +23,12 @@
24
23
  <%= link_to 'Destroy', dirmon_entry_path(@dirmon_entry), method: :delete, class: 'btn btn-default', data: { confirm: 'Are you sure?' } %>
25
24
  <% end %>
26
25
  </div>
27
-
28
-
26
+ <%# It shows the Copy button in each Dirmon%>
27
+ <div class='btn-group'>
28
+ <% if can?(:copy, @dirmon_entry)%>
29
+ <%= link_to 'Copy', copy_dirmon_entry_path(@dirmon_entry), class: 'btn btn-default' %>
30
+ <% end %>
31
+ </div>
29
32
  <div class='btn-group'>
30
33
  <% if can?(:edit, @dirmon_entry)%>
31
34
  <%= link_to 'Edit', edit_dirmon_entry_path(@dirmon_entry), class: 'btn btn-default' %>