Skip to content

Commit a8ed1bc

Browse files
committed
WIP
1 parent 6886375 commit a8ed1bc

File tree

11 files changed

+261
-52
lines changed

11 files changed

+261
-52
lines changed

Gemfile.lock

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -587,8 +587,10 @@ GEM
587587
zeitwerk (2.6.18)
588588

589589
PLATFORMS
590+
arm64-darwin
590591
arm64-darwin-22
591592
arm64-darwin-23
593+
arm64-darwin-24
592594
x86_64-darwin-21
593595
x86_64-darwin-22
594596
x86_64-darwin-23
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# frozen_string_literal: true
2+
3+
class PowerDistributionUnitsController < ServersController
4+
def index
5+
@pdus = Server.only_pdus.includes(:frame, :room, :islet, bay: :frames, modele: :category)
6+
.references(:room, :islet, :bay, modele: :category)
7+
.order(:name)
8+
@filter = ProcessorFilter.new(@pdus, params)
9+
10+
@pdus = @filter.results
11+
@search_params = search_params
12+
13+
respond_to do |format|
14+
format.json
15+
format.html { @pagy, @pdus = pagy(@pdus) }
16+
end
17+
end
18+
end

app/controllers/servers_controller.rb

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def index
1313
logger.warn("DEPRECATION WARNING: Search with 'name' is now deprecated. Use 'q' instead.")
1414
end
1515

16-
@servers = Server.includes(:frame, :room, :islet, bay: :frames, modele: :category)
16+
@servers = Server.no_pdus.includes(:frame, :room, :islet, bay: :frames, modele: :category)
1717
.references(:room, :islet, :bay, modele: :category)
1818
.order(:name)
1919
@filter = ProcessorFilter.new(@servers, params)
@@ -27,35 +27,12 @@ def index
2727
end
2828
end
2929

30-
def grid
31-
@servers = ServersGrid.new(params[:servers_grid])
32-
end
33-
34-
def sort
35-
room = Room.find_by_name(params[:room]) unless params[:room].include?('non ')
36-
frame = room.frames.where('islets.name = ? AND frames.name = ?', params[:islet], params[:frame]).first
37-
positions = params[:positions].split(',')
38-
params[:server].each_with_index do |id, index|
39-
if positions[index].present?
40-
server = Server.find_by_id(id)
41-
new_params_hash = { position: positions[index] }
42-
new_params_hash.merge!({ frame_id: frame.id }) if frame.present?
43-
new_params = ActionController::Parameters.new(new_params_hash)
44-
45-
server.update(new_params)
46-
end
47-
end if params[:server].present?
48-
head :ok # render empty body, status only
49-
end
50-
5130
def show; end
5231

5332
def new
5433
@server = Server.new
5534
end
5635

57-
def edit; end
58-
5936
def create
6037
@server = Server.new(server_params)
6138

@@ -70,6 +47,8 @@ def create
7047
end
7148
end
7249

50+
def edit; end
51+
7352
def update
7453
respond_to do |format|
7554
if @server.update(server_params)
@@ -82,6 +61,39 @@ def update
8261
end
8362
end
8463

64+
def destroy
65+
respond_to do |format|
66+
if @server.destroy
67+
format.html { redirect_to servers_path(search_params), notice: t(".flashes.destroyed") }
68+
format.json { head :no_content }
69+
else
70+
format.html { redirect_to servers_path(search_params), alert: t(".flashes.not_destroyed") }
71+
format.json { head :bad_request }
72+
end
73+
end
74+
end
75+
76+
def grid
77+
@servers = ServersGrid.new(params[:servers_grid])
78+
end
79+
80+
def sort
81+
room = Room.find_by_name(params[:room]) unless params[:room].include?('non ')
82+
frame = room.frames.where('islets.name = ? AND frames.name = ?', params[:islet], params[:frame]).first
83+
positions = params[:positions].split(',')
84+
params[:server].each_with_index do |id, index|
85+
if positions[index].present?
86+
server = Server.find_by_id(id)
87+
new_params_hash = { position: positions[index] }
88+
new_params_hash.merge!({ frame_id: frame.id }) if frame.present?
89+
new_params = ActionController::Parameters.new(new_params_hash)
90+
91+
server.update(new_params)
92+
end
93+
end if params[:server].present?
94+
head :ok # render empty body, status only
95+
end
96+
8597
def import_csv; end
8698

8799
def import
@@ -96,18 +108,6 @@ def import
96108
end
97109
end
98110

99-
def destroy
100-
respond_to do |format|
101-
if @server.destroy
102-
format.html { redirect_to servers_path(search_params), notice: t(".flashes.destroyed") }
103-
format.json { head :no_content }
104-
else
105-
format.html { redirect_to servers_path(search_params), alert: t(".flashes.not_destroyed") }
106-
format.json { head :bad_request }
107-
end
108-
end
109-
end
110-
111111
def duplicate
112112
@original_server = Server.friendly.find(params[:id].to_s.downcase)
113113
@server = @original_server.deep_dup

app/models/modele.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ class Modele < ApplicationRecord
2424
scope :sorted, -> { order(:name) }
2525
scope :with_servers, -> { joins(:servers).uniq }
2626
scope :glpi_synchronizable, -> { where(category: Category.glpi_synchronizable) }
27+
scope :no_pdus, -> { joins(:category).where("categories.name<>'Pdu'") }
28+
scope :only_pdus, -> { joins(:category).where("categories.name='Pdu'").order(:name) }
2729

2830
def self.all_sorted
2931
Modele.includes(:manufacturer).all.sort { |f1, f2| f1.name_with_brand.capitalize <=> f2.name_with_brand.capitalize }

app/models/server.rb

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,23 +40,23 @@ class Server < ApplicationRecord
4040
validate :validate_network_types_values
4141

4242
accepts_nested_attributes_for :cards,
43-
:allow_destroy => true,
44-
:reject_if => :all_blank
43+
allow_destroy: true,
44+
reject_if: :all_blank
4545
accepts_nested_attributes_for :disks,
46-
:allow_destroy => true,
47-
:reject_if => :all_blank
46+
allow_destroy: true,
47+
reject_if: :all_blank
4848
accepts_nested_attributes_for :memory_components,
49-
:allow_destroy => true,
50-
:reject_if => :all_blank
49+
allow_destroy: true,
50+
reject_if: :all_blank
5151
accepts_nested_attributes_for :documents,
52-
:allow_destroy => true,
53-
:reject_if => :all_blank
52+
allow_destroy: true,
53+
reject_if: :all_blank
5454

5555
normalizes :network_types, with: ->(values) { values.compact_blank }
5656

5757
before_create :set_default_network_types
5858

59-
scope :sorted, -> { order(:position => :desc) }
59+
scope :sorted, -> { order(position: :desc) }
6060
scope :sorted_by_name, -> { order('LOWER(name) ASC') }
6161

6262
scope :glpi_synchronizable, -> { joins(modele: :category).merge(Modele.glpi_synchronizable) }

app/views/layouts/_sidebar.html.erb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
</li>
4646
</ul>
4747
</li>
48-
<!-- Equipement -->
48+
<!-- Equipments -->
4949
<li class="mydcim-sidebar-links-group py-2">
5050
<strong class="mydcim-sidebar-links-heading d-flex align-items-center fw-semibold">
5151
<i class="bi bi-hdd-rack me-2 text-primary"></i>
@@ -58,6 +58,12 @@
5858
class: class_names("mydcim-sidebar-links-link d-inline-block rounded",
5959
active: controller.controller_name == "servers") %>
6060
</li>
61+
<li>
62+
<%= link_to t("power_distribution_units.index.title"),
63+
power_distribution_units_path,
64+
class: class_names("mydcim-sidebar-links-link d-inline-block rounded",
65+
active: controller.controller_name == "power_distribution_units") %>
66+
</li>
6167
<li>
6268
<%= link_to AirConditioner.model_name.human.pluralize,
6369
air_conditioners_path,
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
<% provide(:title, t(".title")) %>
2+
3+
<%= render Page::HeadingComponent.new(title: t(".title"), breadcrumb_steps: { t(".title") => "" } ) do |heading| %>
4+
<% heading.with_right_content do %>
5+
<div class="d-flex align-self-center column-gap-2">
6+
7+
<%= render ButtonComponent.new(t("servers.index.add_server_via_csv"),
8+
url: import_csv_servers_path,
9+
variant: :success,
10+
icon: "filetype-csv",
11+
is_responsive: true) %>
12+
13+
<%= render ButtonComponent.new(t(".new_power_distributon_unit"),
14+
url: new_server_path,
15+
variant: :success,
16+
icon: "plus-lg",
17+
is_responsive: true) %>
18+
</div>
19+
<% end %>
20+
<% end %>
21+
22+
<div class="p-4 border-top d-flex flex-column row-gap-4">
23+
<%= render FilterComponent.new(@filter) do |c| %>
24+
<% c.with_form do |f| %>
25+
<div class="w-100">
26+
<fieldset class="form-floating">
27+
<%= f.text_field :q, class: "form-control", placeholder: t("filters.placeholder.search") %>
28+
<%= f.label :q %>
29+
</fieldset>
30+
</div>
31+
32+
<div>
33+
<fieldset class="form-floating">
34+
<%= f.collection_select(:room_ids, Room.order(:name),
35+
:id,
36+
:name,
37+
{ prompt: true, multiple: true },
38+
{ class: "form-select", data: { controller: :select } }) %>
39+
<%= f.label :room_ids %>
40+
</fieldset>
41+
</div>
42+
43+
<div>
44+
<fieldset class="form-floating">
45+
<%= f.collection_select(:islet_ids, Islet.sorted,
46+
:id,
47+
:name_with_room,
48+
{ prompt: true, multiple: true },
49+
{ class: "form-select", data: { controller: :select } }) %>
50+
<%= f.label :islet_ids %>
51+
</fieldset>
52+
</div>
53+
54+
<div>
55+
<fieldset class="form-floating">
56+
<%= f.collection_select(:bay_ids, Bay.sorted,
57+
:id,
58+
:to_s,
59+
{ prompt: true, multiple: true },
60+
{ class: "form-select", data: { controller: :select } }) %>
61+
<%= f.label :bay_ids %>
62+
</fieldset>
63+
</div>
64+
65+
<div>
66+
<fieldset class="form-floating">
67+
<%= f.collection_select(:frame_ids, Frame.order(:name),
68+
:id,
69+
:name,
70+
{ prompt: true, multiple: true },
71+
{ class: "form-select", data: { controller: :select } }) %>
72+
<%= f.label :frame_ids %>
73+
</fieldset>
74+
</div>
75+
76+
<div>
77+
<fieldset class="form-floating">
78+
<%= f.collection_select(:modele_ids, Modele.only_pdus.sorted,
79+
:id,
80+
:name,
81+
{ prompt: true, multiple: true },
82+
{ class: "form-select", data: { controller: :select } }) %>
83+
<%= f.label :modele_ids %>
84+
</fieldset>
85+
</div>
86+
87+
<div>
88+
<fieldset class="form-floating">
89+
<%= f.collection_select(:domaine_ids, Domaine.sorted,
90+
:id,
91+
:name,
92+
{ prompt: true, multiple: true },
93+
{ class: "form-select", data: { controller: :select } }) %>
94+
<%= f.label :domaine_ids %>
95+
</fieldset>
96+
</div>
97+
98+
<div>
99+
<fieldset class="form-floating">
100+
<%= f.collection_select(:cluster_ids, Cluster.sorted,
101+
:id,
102+
:name,
103+
{ prompt: true, multiple: true },
104+
{ class: "form-select", data: { controller: :select } }) %>
105+
<%= f.label :cluster_ids %>
106+
</fieldset>
107+
</div>
108+
<% end %>
109+
<% end %>
110+
111+
<%= turbo_frame_tag(dom_id(Server, :table), data: { turbo_action: :advance }) do %>
112+
<div class="d-flex flex-column row-gap-4">
113+
<%= render List::DataTableComponent.new(@pdus) do |table| %>
114+
<% table.with_column(Server.human_attribute_name(:name), sort_by: :name) do |server| %>
115+
<%= link_to server.name, server_path(server), class: "fw-bold", data: { turbo_frame: :_top } %>
116+
<% end %>
117+
118+
<% table.with_column(Server.human_attribute_name(:numero), sort_by: :numero) do |server| %>
119+
<%= link_to server.numero, server_path(server), class: "fw-bold", data: { turbo_frame: :_top } %>
120+
<% end %>
121+
122+
<% table.with_column(Server.human_attribute_name(:room), sort_by: :"rooms.name") do |server| %>
123+
<%= link_to server.room, room_path(server.room), data: { turbo_frame: :_top } if server.room %>
124+
<% end %>
125+
126+
<% table.with_column(Islet.model_name.human, sort_by: :"islets.name") do |server| %>
127+
<%= link_to server.islet, islet_path(server.islet), data: { turbo_frame: :_top } if server.islet %>
128+
<% end %>
129+
130+
<% table.with_column(Bay.model_name.human, sort_by: :"bays.id") do |server| %>
131+
<%= link_to server.bay, bay_path(server.bay), data: { turbo_frame: :_top } if server.bay %>
132+
<% end %>
133+
134+
<% table.with_column(Server.human_attribute_name(:network_types)) do |server| %>
135+
<%= server.decorated.network_types_to_human %>
136+
<% end %>
137+
138+
<% table.with_column(style: "min-width: 100px; width: 100px") do |server| %>
139+
<div class="btn-group btn-group-sm" role="group" aria-label="...">
140+
<%= link_to duplicate_server_path(server), class: "btn btn-success", data: { turbo_frame: :_top } do %>
141+
<span class="bi bi-copy" title="<%= t("action.duplicate") %>" aria-hidden="true"
142+
data-controller="tooltip"
143+
data-bs-placement="left"></span>
144+
<span class="visually-hidden"><%= t("action.duplicate") %></span>
145+
<% end %>
146+
<%= link_to edit_server_path(server), class: "btn btn-info", data: { turbo_frame: :_top } do %>
147+
<span class="bi bi-pencil" title="<%= t("action.edit") %>" aria-hidden="true"
148+
data-controller="tooltip"
149+
data-bs-placement="left"></span>
150+
<span class="visually-hidden"><%= t("action.edit") %></span>
151+
<% end %>
152+
<%= link_to server_path(server, @search_params),
153+
method: :delete,
154+
data: { turbo_frame: :_top, confirm: t("action.confirm") },
155+
class: "btn btn-danger" do %>
156+
<span class="bi bi-trash" title="<%= t("action.delete") %>" aria-hidden="true"
157+
data-controller="tooltip"
158+
data-bs-placement="left"></span>
159+
<span class="visually-hidden"><%= t("action.delete") %></span>
160+
<% end %>
161+
</div>
162+
<% end %>
163+
<% end %>
164+
165+
<% if @pagy.pages > 1 %>
166+
<%== pagy_bootstrap_nav(@pagy) %>
167+
<% end %>
168+
</div>
169+
<% end %>
170+
</div>

app/views/servers/index.html.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@
8080

8181
<div>
8282
<fieldset class="form-floating">
83-
<%= f.collection_select(:modele_ids, Modele.sorted,
83+
<%= f.collection_select(:modele_ids, Modele.no_pdus.sorted,
8484
:id,
8585
:name,
8686
{ prompt: true, multiple: true },

0 commit comments

Comments
 (0)