Skip to content

Commit 80d9a86

Browse files
committed
PC-50: Add validations for Item pricing
1 parent 1d61c17 commit 80d9a86

2 files changed

Lines changed: 116 additions & 71 deletions

File tree

app/admin/items.rb

Lines changed: 68 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
ActiveAdmin.register Item do
2-
permit_params :name, :description, :category_id, :is_disabled,
3-
:is_fixed, :is_open, :is_selectable_options,
4-
:fixed_parameters, :open_parameters_label,
5-
:calculation_formula
2+
permit_params do
3+
%i[
4+
name description category_id is_disabled is_fixed is_open is_selectable_options
5+
fixed_parameters pricing_options open_parameters_label formula_parameters calculation_formula
6+
]
7+
end
68

79
filter :name_cont, as: :string, label: "Product Name"
810
filter :category, as: :select, collection: -> { Category.pluck(:name, :id) }, label: "Category"
911
filter :is_disabled, label: "Disabled"
10-
12+
1113
index do
1214
id_column
1315
column :name
@@ -20,7 +22,7 @@
2022
actions defaults: false do |resource|
2123
item("View", admin_item_path(resource), class: "member_link")
2224
item("Edit", edit_admin_item_path(resource), class: "member_link")
23-
25+
2426
unless resource.category&.is_disabled?
2527
item(resource.is_disabled? ? "Enable" : "Disable", toggle_admin_item_path(resource),
2628
method: :put,
@@ -53,20 +55,20 @@
5355
div class: "add-param-link-wrapper" do
5456
item_id = f.object.persisted? ? f.object.id.to_s : "new"
5557
formula_label = f.object.calculation_formula.present? ? "Update Calculation Formula" : "Create Calculation Formula"
56-
58+
5759
para do
58-
concat(link_to "Add Parameter", "#", class: "button store-and-navigate", data: {
59-
redirect: new_parameter_admin_item_path(id: item_id),
60-
item_id: item_id
61-
})
62-
63-
concat(link_to formula_label, "#", class: "button store-and-navigate", data: {
64-
redirect: new_formula_admin_item_path(id: item_id),
65-
item_id: item_id
66-
})
67-
end
60+
concat(link_to("Add Parameter", "#", class: "button store-and-navigate", data: {
61+
redirect: new_parameter_admin_item_path(id: item_id),
62+
item_id: item_id
63+
}))
64+
65+
concat(link_to(formula_label, "#", class: "button store-and-navigate", data: {
66+
redirect: new_formula_admin_item_path(id: item_id),
67+
item_id: item_id
68+
}))
69+
end
6870
end
69-
71+
7072
f.inputs "Pricing Parameters" do
7173
f.input :formula_parameters, as: :hidden
7274
div class: "formula-preview" do
@@ -77,14 +79,13 @@
7779
span class: "formula-label" do
7880
"Calculation Formula:"
7981
end
80-
82+
8183
span class: "formula" do
8284
item_key = f.object.persisted? ? f.object.id.to_s : "new"
8385
session_formula = controller.view_context.session.dig(:tmp_params, item_key, "calculation_formula")
8486
f.object.calculation_formula.presence || session_formula.presence || "No formula yet"
8587
end
8688
end
87-
8889
end
8990

9091
item_key = f.object.persisted? ? f.object.id.to_s : "new"
@@ -131,8 +132,7 @@
131132
end
132133
end
133134
end
134-
135-
135+
136136
panel "Pricing Parameters" do
137137
render partial: "admin/items/parameters", locals: {
138138
fixed_parameters: item.fixed_parameters || {},
@@ -163,7 +163,7 @@ def create
163163
def edit
164164
@item = Item.find(params[:id])
165165
item_key = @item.id.to_s
166-
166+
167167
session[:tmp_params] ||= {}
168168
session[:tmp_params][item_key] ||= {
169169
fixed: @item.fixed_parameters || {},
@@ -172,44 +172,45 @@ def edit
172172
formula_parameters: @item.formula_parameters || [],
173173
calculation_formula: @item.calculation_formula
174174
}
175-
175+
176176
super
177177
end
178178

179179
def update
180180
@item = Item.find(params[:id])
181181
item_key = @item.id.to_s
182-
182+
183183
apply_tmp_params(@item, session[:tmp_params][item_key]) if session[:tmp_params]&.key?(item_key)
184-
184+
185185
if @item.update(permitted_params[:item])
186186
session[:tmp_params]&.delete(item_key)
187187
redirect_to admin_item_path(@item), notice: "Item was successfully updated."
188188
else
189-
flash[:error] = "Failed to update item"
190-
render :edit
189+
flash[:error] = "Failed to update item"
190+
render :edit
191191
end
192192
end
193193

194194
private
195195

196196
def apply_tmp_params(item, tmp)
197197
return unless tmp.present?
198-
198+
199199
data = tmp.deep_symbolize_keys
200200
item.fixed_parameters = data[:fixed] || {}
201201
item.open_parameters_label = data[:open] || []
202202
item.pricing_options = data[:select] || {}
203203
item.formula_parameters = data[:formula_parameters] || []
204-
204+
item.calculation_formula = data[:calculation_formula]
205+
205206
item.is_open = item.open_parameters_label.any?
206207
item.is_selectable_options = item.pricing_options.any?
207208
item.is_fixed = item.fixed_parameters.any?
208209

209210
Rails.logger.info "🧠 APPLY TMP: formula_parameters = #{item.formula_parameters.inspect}"
210211
end
211212
end
212-
213+
213214
actions :all, except: [:destroy]
214215

215216
action_item :back, only: :show do
@@ -219,14 +220,13 @@ def apply_tmp_params(item, tmp)
219220
action_item :toggle, only: :show do
220221
unless resource.category&.is_disabled?
221222
link_to(
222-
resource.is_disabled? ? "Enable item" : "Disable item",
223+
resource.is_disabled? ? "Enable item" : "Disable item",
223224
toggle_admin_item_path(resource),
224225
method: :put,
225226
data: { confirm: "Are you sure?" }
226227
)
227228
end
228229
end
229-
230230

231231
member_action :toggle, method: :put do
232232
resource.update(is_disabled: !resource.is_disabled)
@@ -243,170 +243,170 @@ def apply_tmp_params(item, tmp)
243243

244244
session[:tmp_params] ||= {}
245245
session[:tmp_params][item_key] ||= {}
246-
246+
247247
Rails.logger.info "🔑 item_key: #{item_key}"
248248
Rails.logger.info "📦 Session before: #{session[:tmp_params][item_key]}"
249-
249+
250250
store = session[:tmp_params][item_key].deep_symbolize_keys
251251
store[:fixed] ||= {}
252252
store[:open] ||= []
253253
store[:select] ||= {}
254254
store[:formula_parameters] ||= []
255-
255+
256256
param_type = params[:parameter_type]
257257
param_name = case param_type
258258
when "Fixed" then params[:fixed_parameter_name].to_s.strip
259259
when "Open" then params[:open_parameter_name].to_s.strip
260260
when "Select" then params[:select_parameter_name].to_s.strip
261261
end
262-
262+
263263
if param_name.blank?
264264
flash[:error] = "Parameter name can't be blank"
265265
return redirect_back(fallback_location: edit_admin_item_path(@item))
266266
end
267-
267+
268268
store[:formula_parameters] << param_name unless store[:formula_parameters].include?(param_name)
269-
269+
270270
case param_type
271271
when "Fixed"
272272
param_value = params[:fixed_parameter_value]
273273
store[:fixed][param_name] = param_value
274-
274+
275275
when "Open"
276276
store[:open] << param_name unless store[:open].include?(param_name)
277-
277+
278278
when "Select"
279279
sub_hash = {}
280280
(1..10).each do |i|
281281
desc = params["option_description_#{i}"]
282282
val = params["option_value_#{i}"]
283283
next if desc.blank? || val.blank?
284+
284285
sub_hash[desc] = val
285286
end
286287
store[:select][param_name] = sub_hash if sub_hash.any?
287-
288+
288289
else
289290
flash[:error] = "Unknown parameter type"
290291
return redirect_back(fallback_location: edit_admin_item_path(@item))
291292
end
292-
293+
293294
session[:tmp_params][item_key] = store.deep_stringify_keys
294-
295+
295296
Rails.logger.info "📤 Session after update: #{session[:tmp_params][item_key]}"
296-
297+
297298
flash[:notice] = "Parameter '#{param_name}' added (stored in session)."
298299
redirect_to @item.persisted? ? edit_admin_item_path(@item) : new_resource_path
299300
end
300-
301+
301302
member_action :remove_parameter, method: :delete do
302303
Rails.logger.info "🧩 REMOVE PARAMETER"
303304
@item = params[:id] == "new" ? Item.new : Item.find(params[:id])
304305
item_key = @item.persisted? ? @item.id.to_s : "new"
305306
Rails.logger.info "🔑 item_key: #{item_key}"
306-
307+
307308
session[:tmp_params] ||= {}
308309
session[:tmp_params][item_key] ||= {
309310
fixed: {},
310311
open: [],
311312
select: {},
312313
formula_parameters: []
313314
}
314-
315+
315316
store = session[:tmp_params][item_key].deep_symbolize_keys
316317
param_type = params[:param_type].to_s
317318
key = params[:param_key].to_s
318319
desc_key = params[:desc_key].to_s if params[:desc_key].present?
319-
320+
320321
Rails.logger.info "📦 Session before delete: #{store}"
321322
Rails.logger.info "🛠 Param type: #{param_type}, Key: #{key}, Desc key: #{desc_key}"
322-
323+
323324
case param_type
324325
when "fixed"
325326
store[:fixed]&.delete(key.to_sym)
326327
store[:formula_parameters]&.delete(key)
327328
Rails.logger.info "🗑 Deleted fixed #{key}"
328-
329+
329330
when "open"
330331
store[:open]&.delete(key)
331332
store[:formula_parameters]&.delete(key)
332333
Rails.logger.info "🗑 Deleted open #{key}"
333-
334+
334335
when "select"
335336
key_str = key.to_s
336337
if desc_key.present?
337338
store[:select][key_str]&.delete(desc_key)
338-
store[:select].delete(key_str) if store[:select][key_str]&.empty?
339+
store[:select].delete(key_str) if store[:select][key_str] && store[:select][key_str].empty?
339340
Rails.logger.info "🗑 Deleted desc #{desc_key} from #{key_str}"
340341
else
341342
store[:select] = store[:select].reject { |k, _| k.to_s == key_str }
342343
Rails.logger.info "🗑 Deleted whole select #{key_str}"
343344
end
344345
store[:formula_parameters]&.delete(key_str)
345-
346+
346347
else
347348
Rails.logger.warn "⚠️ Unknown param_type=#{param_type}"
348349
end
349-
350+
350351
session[:tmp_params][item_key] = store.deep_stringify_keys
351-
352+
352353
Rails.logger.info "📦 Session after delete: #{session[:tmp_params][item_key]}"
353354
redirect_to @item.persisted? ? edit_admin_item_path(@item) : new_resource_path
354-
end
355+
end
355356

356357
member_action :save_meta_to_session, method: :post do
357358
item_key = params[:id] == "new" ? "new" : params[:id].to_s
358-
359+
359360
session[:tmp_params] ||= {}
360361
session[:tmp_params][item_key] ||= {}
361362
session[:tmp_params][item_key]["name"] = params[:name]
362363
session[:tmp_params][item_key]["description"] = params[:description]
363364
session[:tmp_params][item_key]["category_id"] = params[:category_id]
364-
365-
Rails.logger.info "💾 Saved to session: #{session[:tmp_params][item_key].slice("name", "description", "category_id")}"
365+
366+
Rails.logger.info "💾 Saved to session: #{session[:tmp_params][item_key].slice('name', 'description', 'category_id')}"
366367

367368
head :ok
368369
end
369370

370371
member_action :new_formula, method: :get do
371372
@item = params[:id] == "new" ? Item.new : Item.find(params[:id])
372373
item_key = @item.persisted? ? @item.id.to_s : "new"
373-
374+
374375
session[:tmp_params] ||= {}
375376
store = session[:tmp_params][item_key] || {}
376-
377+
377378
@formula_params = store["formula_parameters"] || []
378379
@initial_formula = store["calculation_formula"] || @item.calculation_formula
379380
end
380-
381381

382382
member_action :update_formula, method: :post do
383383
if params[:id] == "new"
384384
session[:tmp_params] ||= {}
385385
session[:tmp_params]["new"] ||= {}
386386
session[:tmp_params]["new"]["calculation_formula"] = params[:calculation_formula]
387-
387+
388388
flash[:notice] = "Formula saved (in session)!"
389389
redirect_to new_resource_path
390390
else
391391
@item = Item.find(params[:id])
392392
@item.calculation_formula = params[:calculation_formula]
393-
393+
394394
if @item.save
395395
flash[:notice] = "Formula saved!"
396396
else
397397
flash[:error] = "Failed to save formula: #{@item.errors.full_messages.to_sentence}"
398398
end
399-
399+
400400
redirect_to edit_admin_item_path(@item)
401401
end
402-
end
402+
end
403403

404404
member_action :clear_session, method: :post do
405405
if params[:id] == "new"
406406
session[:tmp_params]&.delete("new")
407407
Rails.logger.info "🧹 Session[:tmp_params][\"new\"] cleared via JS"
408408
end
409-
409+
410410
head :ok
411411
end
412412
end

0 commit comments

Comments
 (0)