foreman_datacenter 1.19.0 → 1.19.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/stylesheets/foreman_datacenter/datacenter.css +3 -0
  3. data/app/assets/stylesheets/foreman_datacenter/device_roles.css +32 -0
  4. data/app/controllers/api/v2/foreman_datacenter/device_interfaces_controller.rb +1 -0
  5. data/app/controllers/api/v2/foreman_datacenter/devices_controller.rb +1 -1
  6. data/app/controllers/concerns/foreman_datacenter/controller/parameters/comment.rb +1 -1
  7. data/app/controllers/concerns/foreman_datacenter/controller/parameters/console_port.rb +1 -1
  8. data/app/controllers/concerns/foreman_datacenter/controller/parameters/console_port_template.rb +1 -1
  9. data/app/controllers/concerns/foreman_datacenter/controller/parameters/console_server_port.rb +1 -1
  10. data/app/controllers/concerns/foreman_datacenter/controller/parameters/console_server_port_template.rb +1 -1
  11. data/app/controllers/concerns/foreman_datacenter/controller/parameters/device_bay.rb +1 -1
  12. data/app/controllers/concerns/foreman_datacenter/controller/parameters/device_bay_template.rb +1 -1
  13. data/app/controllers/concerns/foreman_datacenter/controller/parameters/device_interface.rb +1 -1
  14. data/app/controllers/concerns/foreman_datacenter/controller/parameters/device_interface_connection.rb +1 -1
  15. data/app/controllers/concerns/foreman_datacenter/controller/parameters/device_module.rb +1 -1
  16. data/app/controllers/concerns/foreman_datacenter/controller/parameters/device_role.rb +1 -1
  17. data/app/controllers/concerns/foreman_datacenter/controller/parameters/device_type.rb +1 -1
  18. data/app/controllers/concerns/foreman_datacenter/controller/racks.rb +10 -0
  19. data/app/controllers/foreman_datacenter/application_controller.rb +2 -0
  20. data/app/controllers/foreman_datacenter/sites_controller.rb +6 -1
  21. data/app/models/foreman_datacenter/device.rb +1 -0
  22. data/app/models/foreman_datacenter/site.rb +1 -0
  23. data/app/views/foreman_datacenter/devices/show.html.erb +4 -1
  24. data/app/views/foreman_datacenter/racks/_device_position.html.erb +21 -3
  25. data/app/views/foreman_datacenter/racks/_dp.html.erb +46 -0
  26. data/app/views/foreman_datacenter/racks/_unpositioned_devices.html.erb +1 -1
  27. data/app/views/foreman_datacenter/sites/racks.html.erb +17 -0
  28. data/app/views/foreman_datacenter/sites/show.html.erb +4 -1
  29. data/config/routes.rb +1 -0
  30. data/db/migrate/20180725201545_add_location_id_and_organization_id_columns_to_devices.rb +1 -1
  31. data/lib/foreman_datacenter/engine.rb +2 -2
  32. data/lib/foreman_datacenter/version.rb +1 -1
  33. metadata +5 -3
  34. data/app/views/foreman_datacenter/racks/_device_position.html.erb.back +0 -28
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b107cc41f1cd6e3e03d3eaa9c742dc6d437e206c50c4d5389a1e73251b9e8852
4
- data.tar.gz: 2e0eb385586087cecd25ec166f12d7f45bd19a2cc4e9e761436a94ed0b50f00c
3
+ metadata.gz: 4000e320e81602255d6b49547063875bba5afd68677493afdbc1fdc88f366e7c
4
+ data.tar.gz: 5a3410cb8b471eb1e148d5ba9ccb18d39825bd0f0e05ab652ea90954af6d40ee
5
5
  SHA512:
6
- metadata.gz: fb2948be60ff1b973fc6bc6d0bc72d108129478b47c082a12bc572957f905554db7e91f7f0b136b74b06da30e8f1f45757bdb7f2a1ad2bba7b199517dc4da693
7
- data.tar.gz: 6efebfbac69d6ce1da94419d068573b5b31e1846d94a3d5b8a910f86b8cfc77482098c1ea0c722470de5b5fd1c896e1c68743f6f6d15aa41031dab5ae7257a92
6
+ metadata.gz: 5b248afe5f040fd1c7b58353e1e89e2bff897ca1fbf792a6d4020640ef002677d8a1db1722f6a87e7506d4760ebb6cef9672220c85388979e179b721ea26373a
7
+ data.tar.gz: 697deef8ae51b5c484ea275b1787bfbf847aa75ff2c4aad7e6c7bd674fac6036407c8d6599b0468261fd63d25741df32862241fa2b08329e241040b82530604a
@@ -9,3 +9,6 @@
9
9
  .nonbordercolor {
10
10
  border-color: transparent !important;
11
11
  }
12
+ .nonmargintop {
13
+ margin-top: 0px !important;
14
+ }
@@ -28,3 +28,35 @@ span.mediumgray {
28
28
  span.darkgray {
29
29
  background-color: #171515;
30
30
  }
31
+
32
+
33
+ .teal {
34
+ background-color: #06a79f;
35
+ }
36
+ .green {
37
+ background-color: #89A54E;
38
+ }
39
+ .blue {
40
+ background-color: #3D96AE;
41
+ }
42
+ .purple {
43
+ background-color: #D882d8;
44
+ }
45
+ .yellow {
46
+ background-color: #ecec61;
47
+ }
48
+ .orange {
49
+ background-color: #f37676;
50
+ }
51
+ .red {
52
+ background-color: #AA4643;
53
+ }
54
+ .lightgray {
55
+ background-color: gray;
56
+ }
57
+ .mediumgray {
58
+ background-color: #403e3e;
59
+ }
60
+ .darkgray {
61
+ background-color: #171515;
62
+ }
@@ -39,6 +39,7 @@ module Api
39
39
  def create
40
40
  @device_interface = ::ForemanDatacenter::DeviceInterface.new(device_interface_params)
41
41
  @device_interface.save
42
+ process_response @device_interface.save
42
43
  end
43
44
 
44
45
  api :PUT, "/foreman_datacenter/device_interfaces/:id/", N_("Update a DeviceInterface")
@@ -47,7 +47,7 @@ module Api
47
47
  param_group :device, :as => :create
48
48
 
49
49
  def create
50
- @device = ::ForemanDatacenter::Device.new(device_params.merge(hosy_id: params[:host_id]))
50
+ @device = ::ForemanDatacenter::Device.new(device_params.merge(host_id: params[:host_id]))
51
51
  process_response @device.save
52
52
  end
53
53
 
@@ -1,4 +1,4 @@
1
- module ForemanDatacenter::Controller::Parameters::Comment
1
+ module ForemanDatacenter::Controller::Parameters::Comment
2
2
  extend ActiveSupport::Concern
3
3
 
4
4
  class_methods do
@@ -1,4 +1,4 @@
1
- module ForemanDatacenter::Controller::Parameters::ConsolePort
1
+ module ForemanDatacenter::Controller::Parameters::ConsolePort
2
2
  extend ActiveSupport::Concern
3
3
 
4
4
  class_methods do
@@ -1,4 +1,4 @@
1
- module ForemanDatacenter::Controller::Parameters::ConsolePortTemplate
1
+ module ForemanDatacenter::Controller::Parameters::ConsolePortTemplate
2
2
  extend ActiveSupport::Concern
3
3
 
4
4
  class_methods do
@@ -1,4 +1,4 @@
1
- module ForemanDatacenter::Controller::Parameters::ConsoleServerPort
1
+ module ForemanDatacenter::Controller::Parameters::ConsoleServerPort
2
2
  extend ActiveSupport::Concern
3
3
 
4
4
  class_methods do
@@ -1,4 +1,4 @@
1
- module ForemanDatacenter::Controller::Parameters::ConsoleServerPortTemplate
1
+ module ForemanDatacenter::Controller::Parameters::ConsoleServerPortTemplate
2
2
  extend ActiveSupport::Concern
3
3
 
4
4
  class_methods do
@@ -1,4 +1,4 @@
1
- module ForemanDatacenter::Controller::Parameters::DeviceBay
1
+ module ForemanDatacenter::Controller::Parameters::DeviceBay
2
2
  extend ActiveSupport::Concern
3
3
 
4
4
  class_methods do
@@ -1,4 +1,4 @@
1
- module ForemanDatacenter::Controller::Parameters::DeviceBayTemplate
1
+ module ForemanDatacenter::Controller::Parameters::DeviceBayTemplate
2
2
  extend ActiveSupport::Concern
3
3
 
4
4
  class_methods do
@@ -1,4 +1,4 @@
1
- module ForemanDatacenter::Controller::Parameters::DeviceInterface
1
+ module ForemanDatacenter::Controller::Parameters::DeviceInterface
2
2
  extend ActiveSupport::Concern
3
3
 
4
4
  class_methods do
@@ -1,4 +1,4 @@
1
- module ForemanDatacenter::Controller::Parameters::DeviceInterfaceConnection
1
+ module ForemanDatacenter::Controller::Parameters::DeviceInterfaceConnection
2
2
  extend ActiveSupport::Concern
3
3
 
4
4
  class_methods do
@@ -1,4 +1,4 @@
1
- module ForemanDatacenter::Controller::Parameters::DeviceModule
1
+ module ForemanDatacenter::Controller::Parameters::DeviceModule
2
2
  extend ActiveSupport::Concern
3
3
 
4
4
  class_methods do
@@ -1,4 +1,4 @@
1
- module ForemanDatacenter::Controller::Parameters::DeviceRole
1
+ module ForemanDatacenter::Controller::Parameters::DeviceRole
2
2
  extend ActiveSupport::Concern
3
3
 
4
4
  class_methods do
@@ -1,4 +1,4 @@
1
- module ForemanDatacenter::Controller::Parameters::DeviceType
1
+ module ForemanDatacenter::Controller::Parameters::DeviceType
2
2
  extend ActiveSupport::Concern
3
3
 
4
4
  class_methods do
@@ -0,0 +1,10 @@
1
+ module ForemanDatacenter::Controller::Racks
2
+ extend ActiveSupport::Concern
3
+
4
+ def move
5
+ @rack_groups = resource_base_search_and_page
6
+ @racks = @rack_group.racks
7
+ process_error object: @rack_group, error_msg: 'Current Rack Group haven\'t any Racks.' if @racks.empty?
8
+ end
9
+
10
+ end
@@ -90,6 +90,8 @@ module ForemanDatacenter
90
90
  'populate'
91
91
  when 'move'
92
92
  'move'
93
+ when 'racks'
94
+ 'racks'
93
95
  else
94
96
  super
95
97
  end
@@ -3,7 +3,7 @@ module ForemanDatacenter
3
3
  include Foreman::Controller::AutoCompleteSearch
4
4
  include ForemanDatacenter::Controller::Parameters::Site
5
5
 
6
- before_action :find_resource, only: [:show, :edit, :update, :destroy, :move]
6
+ before_action :find_resource, only: [:show, :edit, :update, :destroy, :move, :racks]
7
7
 
8
8
  def index
9
9
  @sites = resource_base_search_and_page
@@ -50,6 +50,11 @@ module ForemanDatacenter
50
50
  end
51
51
  end
52
52
 
53
+ def racks
54
+ @racks = @site.racks.includes(:devices)
55
+ process_error redirect: site_path(@site), error_msg: 'Current site haven\'t any Racks.' if @racks.empty?
56
+ end
57
+
53
58
  def move
54
59
  @sites = resource_base_search_and_page
55
60
  @rack_groups = @site.rack_groups
@@ -51,6 +51,7 @@ module ForemanDatacenter
51
51
  scoped_search in: :device_role, on: :name, complete_value: true, rename: :role
52
52
  scoped_search in: :device_type, on: :model, complete_value: true, rename: :type
53
53
  scoped_search in: :platform, on: :name, complete_value: true, rename: :platform
54
+ scoped_search in: :comments, on: :content, complete_value: true, rename: :comments
54
55
 
55
56
  delegate :site_id, to: :rack, allow_nil: true
56
57
  delegate :manufacturer_id, :is_console_server, :is_pdu, :is_network_device,
@@ -20,6 +20,7 @@ module ForemanDatacenter
20
20
  scoped_search on: :shipping_address, complete_value: true, default_order: true
21
21
  scoped_search on: :created_at, complete_value: true, default_order: true
22
22
  scoped_search on: :updated_at, complete_value: true, default_order: true
23
+ scoped_search on: :comments, complete_value: true, default_order: true
23
24
 
24
25
  def racks_count
25
26
  @racks_count ||= racks.count
@@ -256,7 +256,10 @@
256
256
  <% if @device.management_device %>
257
257
  <tr>
258
258
  <td><%= _("Console URL") %></td>
259
- <td><%= h @device.console_url %></td>
259
+ <td>
260
+ <%= link_to @device.console_url, "http://#{@device.console_url}", target: "_blank" %>
261
+ </td>
262
+
260
263
  </tr>
261
264
  <tr>
262
265
  <td><%= _("Login") %></td>
@@ -1,15 +1,15 @@
1
1
  <div class="panel panel-default">
2
- <div class="panel-heading"><strong><%= _("Devices") %></strong></div>
2
+ <div class="panel-heading text-center"><h4 class="nonmargintop nonmarginbottom"><strong><%= link_to _("#{rack.name}"), rack_path(rack) %></strong></h4></div>
3
3
  <table class="<%= table_css_classes 'table-hover panel-body nonmarginbottom' %>">
4
4
  <tbody>
5
- <% @rack.positioned_devices.each do |positions, devices| %>
5
+ <% rack.positioned_devices.each do |positions, devices| %>
6
6
  <tr>
7
7
  <td class="col-md-1"><%= raw(positions.map{|p| "#{p}U"}.join("<br />")) %></td>
8
8
  <td class="col-md-4">
9
9
  <% unless devices.empty? %>
10
10
  <% devices.each do |d| %>
11
11
  <div class="<%= "text-" + ((d.side == "full" or d.side.nil?) ? "center" : "right") + " pull-" + ((d.side == "full" or d.side.nil?) ? "center" : d.side) %>">
12
- <span class="<%= "label " + d.device_role.color.downcase.gsub(" ","") %>">&nbsp;</span>
12
+ <div class="<%= "label " + d.device_role.color.downcase.gsub(" ","") %>" style="border-radius:40px;border:0px;">&nbsp;&nbsp;</div>
13
13
  <%= link_to d.name, device_path(d) %>
14
14
  <% if d.side.nil? %>
15
15
  *
@@ -23,6 +23,24 @@
23
23
  </td>
24
24
  </tr>
25
25
  <% end %>
26
+ <% unless rack.unpositioned_devices.empty? %>
27
+ <tr>
28
+ <td class="col-md-1">Unpositioned Devices</td>
29
+ <td class="col-md-4" style="text-align:center">
30
+ <% rack.unpositioned_devices.each do |d| %>
31
+ <div class="<%= "label " + d.device_role.color.downcase.gsub(" ","") %>" style="border-radius:40px;border:0px;">&nbsp;&nbsp;</div>
32
+ <%= link_to d.name, device_path(d) %>
33
+ <% if d.side.nil? %>
34
+ *
35
+ <% end %>
36
+ <% if d.size.nil? %>
37
+ **
38
+ <% end %>
39
+ </br>
40
+ <% end %>
41
+ </td>
42
+ </tr>
43
+ <% end %>
26
44
  </tbody>
27
45
  </table>
28
46
  </div>
@@ -0,0 +1,46 @@
1
+ <div class="panel panel-default">
2
+ <div class="panel-heading text-center"><h4 class="nonmargintop nonmarginbottom"><strong><%= _("#{rack.name}") %></strong></h4></div>
3
+ <table class="<%= table_css_classes 'table-hover panel-body nonmarginbottom' %>">
4
+ <tbody>
5
+ <% rack.positioned_devices.each do |positions, devices| %>
6
+ <tr>
7
+ <td class="col-md-1"><%= raw(positions.map{|p| "#{p}U"}.join("<br />")) %></td>
8
+ <td class="col-md-4">
9
+ <% unless devices.empty? %>
10
+ <% devices.each do |d| %>
11
+ <div class="<%= "text-" + ((d.side == "full" or d.side.nil?) ? "center" : "right") + " pull-" + ((d.side == "full" or d.side.nil?) ? "center" : d.side) %>">
12
+ <span class="<%= "label " + d.device_role.color.downcase.gsub(" ","") %>">&nbsp;</span>
13
+ <%= link_to d.name, device_path(d) %>
14
+ <% if d.side.nil? %>
15
+ *
16
+ <% end %>
17
+ <% if d.size.nil? %>
18
+ **
19
+ <% end %>
20
+ </div>
21
+ <% end %>
22
+ <% end %>
23
+ </td>
24
+ </tr>
25
+ <% end %>
26
+ <% unless rack.unpositioned_devices.empty? %>
27
+ <tr>
28
+ <td class="col-md-1">Unpositioned Devices</td>
29
+ <td class="col-md-4">
30
+ <% rack.unpositioned_devices.each do |d| %>
31
+ <div class="<%= "label " + d.device_role.color.downcase.gsub(" ","") %>" style="border-radius:40px;border:0px;">&nbsp;&nbsp;</div>
32
+ <%= link_to d.name, device_path(d) %>
33
+ <% if d.side.nil? %>
34
+ *
35
+ <% end %>
36
+ <% if d.size.nil? %>
37
+ **
38
+ <% end %>
39
+ </br>
40
+ <% end %>
41
+ </td>
42
+ </tr>
43
+ <% end %>
44
+ </tbody>
45
+ </table>
46
+ </div>
@@ -2,7 +2,7 @@
2
2
  <div class="panel-heading"><strong><%= _("Unpositioned Devices") %></strong></div>
3
3
  <table class="table table-hover panel-body nonmarginbottom">
4
4
  <tbody>
5
- <% @rack.unpositioned_devices.each do |d| %>
5
+ <% rack.unpositioned_devices.each do |d| %>
6
6
  <tr>
7
7
  <td class="col-md-4">
8
8
  <div class="<%= "text-" + ((d.side == "full" or d.side.nil?) ? "center" : "right") + " pull-" + ((d.side == "full" or d.side.nil?) ? "center" : d.side) %>">
@@ -0,0 +1,17 @@
1
+ <% stylesheet 'foreman_datacenter/datacenter' %>
2
+ <% stylesheet 'foreman_datacenter/device_roles' %>
3
+
4
+ <% title h(@site.name) %>
5
+
6
+ <% @racks.in_groups_of(3).each do |g| %>
7
+ <div class="row">
8
+ <% g.compact.each do |rack| %>
9
+ <div class="col-md-4">
10
+ <!-- Devices -->
11
+ <%= render "foreman_datacenter/racks/device_position", rack: rack %>
12
+ </div>
13
+ <% end %>
14
+ </div>
15
+ <% end %>
16
+ <div><h6 class="text-right"><%= _("* side is not defined") %></h6></div>
17
+ <div><h6 class="text-right"><%= _("** size is not defined") %></h6></div>
@@ -96,7 +96,10 @@
96
96
  </tr>
97
97
  <tr>
98
98
  <td><%= _("Racks") %></td>
99
- <td><%= link_to @site.racks_count, racks_path(search: "site=#{@site.name}") %></td>
99
+ <td>
100
+ <%= link_to @site.racks_count, racks_path(search: "site=#{@site.name}") %>
101
+ <%= link_to 'Overview', racks_site_path(@site), class: "btn btn-primary btn-xs pull-right" unless @site.racks.empty? %>
102
+ </td>
100
103
  </tr>
101
104
  <tr>
102
105
  <td><%= _("Devices") %></td>
data/config/routes.rb CHANGED
@@ -86,6 +86,7 @@ Foreman::Application.routes.draw do
86
86
  resources :sites do
87
87
  member do
88
88
  get :move
89
+ get :racks
89
90
  end
90
91
  collection do
91
92
  get 'auto_complete_search'
@@ -1,4 +1,4 @@
1
- class AddLocationIdAndOrganizationIdColumnsToDevices < ActiveRecord::Migration[4.2]
1
+ class AddLocationIdAndOrganizationIdColumnsToDevices < ActiveRecord::Migration
2
2
  def change
3
3
  add_column :devices, :organization_id, :integer
4
4
  add_column :devices, :location_id, :integer
@@ -28,7 +28,7 @@ module ForemanDatacenter
28
28
  requires_foreman '>= 1.12'
29
29
 
30
30
  security_block :datacenter do
31
- # Hosts
31
+ # Hosts
32
32
  permission :import_to_device, {
33
33
  :'hosts' => [:import_to_device]},
34
34
  :resource_type => "ForemanDatacenter::HostExtensions"
@@ -315,7 +315,7 @@ module ForemanDatacenter
315
315
  :resource_type => "ForemanDatacenter::Rack"
316
316
  # Sites
317
317
  permission :view_sites, {
318
- :'foreman_datacenter/sites' => [:show, :index]},
318
+ :'foreman_datacenter/sites' => [:show, :index, :racks]},
319
319
  :resource_type => "ForemanDatacenter::Site"
320
320
  permission :create_sites, {
321
321
  :'foreman_datacenter/sites' => [:new, :create]},
@@ -1,3 +1,3 @@
1
1
  module ForemanDatacenter
2
- VERSION = '1.19.0'.freeze
2
+ VERSION = '1.19.1'.freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_datacenter
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.19.0
4
+ version: 1.19.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pavel Ivanov
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-02-09 00:00:00.000000000 Z
12
+ date: 2019-05-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: prawn
@@ -140,6 +140,7 @@ files:
140
140
  - app/controllers/concerns/foreman_datacenter/controller/parameters/rack.rb
141
141
  - app/controllers/concerns/foreman_datacenter/controller/parameters/rack_group.rb
142
142
  - app/controllers/concerns/foreman_datacenter/controller/parameters/site.rb
143
+ - app/controllers/concerns/foreman_datacenter/controller/racks.rb
143
144
  - app/controllers/concerns/foreman_datacenter/hosts_controller_extensions.rb
144
145
  - app/controllers/foreman_datacenter/application_controller.rb
145
146
  - app/controllers/foreman_datacenter/comments_controller.rb
@@ -460,7 +461,7 @@ files:
460
461
  - app/views/foreman_datacenter/rack_groups/show.html.erb
461
462
  - app/views/foreman_datacenter/rack_groups/welcome.html.erb
462
463
  - app/views/foreman_datacenter/racks/_device_position.html.erb
463
- - app/views/foreman_datacenter/racks/_device_position.html.erb.back
464
+ - app/views/foreman_datacenter/racks/_dp.html.erb
464
465
  - app/views/foreman_datacenter/racks/_form.html.erb
465
466
  - app/views/foreman_datacenter/racks/_rack_groups.html.erb
466
467
  - app/views/foreman_datacenter/racks/_unpositioned_devices.html.erb
@@ -478,6 +479,7 @@ files:
478
479
  - app/views/foreman_datacenter/sites/index.html.erb
479
480
  - app/views/foreman_datacenter/sites/move.html.erb
480
481
  - app/views/foreman_datacenter/sites/new.html.erb
482
+ - app/views/foreman_datacenter/sites/racks.html.erb
481
483
  - app/views/foreman_datacenter/sites/show.html.erb
482
484
  - app/views/foreman_datacenter/sites/welcome.html.erb
483
485
  - app/views/hosts/import_to_device.html.erb
@@ -1,28 +0,0 @@
1
- <div class="col-md-5">
2
- <div class="panel panel-default">
3
- <div class="panel-heading"><strong>Devices</strong></div>
4
- <table class="table table-hover panel-body">
5
- <tbody>
6
- <% @rack.positioned_devices.each do |position, devices| %>
7
- <tr>
8
- <td class="col-md-1"><%= position %>U</td>
9
- <td class="col-md-4">
10
- <% unless devices.empty? %>
11
- <% devices.each do |d| %>
12
- <div class="<%= "text-" + ((d.side == "full" or d.side.nil?) ? "center" : "right") + " pull-" + ((d.side == "full" or d.side.nil?) ? "center" : d.side) %>">
13
- <%= link_to d.name, device_path(d) %>
14
- <% if d.side.nil? %>
15
- *
16
- <% end %>
17
- </div>
18
- <% end %>
19
- <% end %>
20
- </td>
21
- </tr>
22
- <% end %>
23
- </tbody>
24
- </table>
25
- </div>
26
- <div><h6 class="text-right">* side is not defined</h6></div>
27
- </div>
28
-