diff --git a/admin/app/components/solidus_admin/stock_items/edit/component.html.erb b/admin/app/components/solidus_admin/stock_items/edit/component.html.erb index 64a8d7cc594..a0faf887296 100644 --- a/admin/app/components/solidus_admin/stock_items/edit/component.html.erb +++ b/admin/app/components/solidus_admin/stock_items/edit/component.html.erb @@ -1,83 +1,84 @@ -
-initial-count-on-hand-value="<%= @stock_item.count_on_hand_was || @stock_item.count_on_hand %>" - data-action="input-><%= stimulus_id %>#updateCountOnHand" -> - <%= turbo_frame_tag :edit_stock_item_modal do %> - <%= render component("ui/modal").new(title: t(".title")) do |modal| %> - <%= form_for @stock_item, url: solidus_admin.stock_item_path(@stock_item), html: { id: form_id } do |f| %> -
-
- <%= link_to spree.edit_admin_product_variant_path( - @stock_item.variant.product, - @stock_item.variant, - ), class: 'hover:bg-gray-25 rounded p-1 w-1/2 border border-gray-100' do %> - <%= render component("ui/resource_item").new( - thumbnail: - ( - @stock_item.variant.images.first || - @stock_item.variant.product.gallery.images.first - )&.url(:small), - title: @stock_item.variant.name, - subtitle: - "#{@stock_item.variant.sku}#{@stock_item.variant.options_text.presence&.prepend(" - ")}", - ) %> - <% end %> - <%= link_to spree.edit_admin_stock_location_path(@stock_item.stock_location), class: 'hover:bg-gray-25 rounded p-1 w-1/2 border border-gray-100' do %> - <%= render component("ui/resource_item").new( - title: @stock_item.stock_location.name, - subtitle: "#{Spree::StockLocation.model_name.human} #{@stock_item.stock_location.code}", - ) %> - <% end %> -
- - <%= render component("ui/forms/field").text_field( - f, - :count_on_hand, - disabled: true, - value: @stock_item.count_on_hand_was || @stock_item.count_on_hand, - "data-#{stimulus_id}-target": 'countOnHand', - ) %> - <%= render component("ui/forms/field").new( - label: t(".quantity_adjustment"), - hint: t(".quantity_adjustment_hint_html"), - ) do %> - <%= render component("ui/forms/input").new( - value: params[:quantity_adjustment] || 0, - name: :quantity_adjustment, - type: :number, - step: 1, - "data-#{stimulus_id}-target": 'quantityAdjustment', +<%= turbo_frame_tag :resource_modal, target: "_top" do %> + <%= render component("ui/modal").new(title: t(".title")) do |modal| %> + <%= form_for @stock_item, url: form_url, html: { id: form_id } do |f| %> +
-initial-count-on-hand-value="<%= @stock_item.count_on_hand_was || @stock_item.count_on_hand %>" + data-action="input-><%= stimulus_id %>#updateCountOnHand" + > +
+ <%= link_to spree.edit_admin_product_variant_path( + @stock_item.variant.product, + @stock_item.variant, + ), + data: {turbo_frame: "_top"}, + class: 'hover:bg-gray-25 rounded p-1 w-1/2 border border-gray-100' do %> + <%= render component("ui/resource_item").new( + thumbnail: + ( + @stock_item.variant.images.first || + @stock_item.variant.product.gallery.images.first + )&.url(:small), + title: @stock_item.variant.name, + subtitle: + "#{@stock_item.variant.sku}#{@stock_item.variant.options_text.presence&.prepend(" - ")}", + ) %> + <% end %> + <%= link_to spree.edit_admin_stock_location_path(@stock_item.stock_location), + data: {turbo_frame: "_top"}, + class: 'hover:bg-gray-25 rounded p-1 w-1/2 border border-gray-100' do %> + <%= render component("ui/resource_item").new( + title: @stock_item.stock_location.name, + subtitle: "#{Spree::StockLocation.model_name.human} #{@stock_item.stock_location.code}", ) %> <% end %> - - <%= render component("ui/forms/switch_field").new( - name: "#{f.object_name}[backorderable]", - label: Spree::StockItem.human_attribute_name(:backorderable), - error: f.object.errors[:backorderable], - hint: t(".backorderable_hint_html"), - checked: f.object.backorderable?, - include_hidden: true, - ) %>
- <% end %> - <% modal.with_actions do %> -
- <%= render component("ui/button").new( - scheme: :secondary, - text: t(".cancel"), + <%= render component("ui/forms/field").text_field( + f, + :count_on_hand, + readonly: true, + value: @stock_item.count_on_hand_was || @stock_item.count_on_hand, + "data-#{stimulus_id}-target": 'countOnHand', + ) %> + <%= render component("ui/forms/field").new( + label: t(".quantity_adjustment"), + hint: t(".quantity_adjustment_hint_html"), + ) do %> + <%= render component("ui/forms/input").new( + value: params[:quantity_adjustment] || 0, + name: :quantity_adjustment, + type: :number, + step: 1, + "data-#{stimulus_id}-target": 'quantityAdjustment', ) %> -
+ <% end %> + + <%= render component("ui/forms/switch_field").new( + name: "#{f.object_name}[backorderable]", + label: Spree::StockItem.human_attribute_name(:backorderable), + error: f.object.errors[:backorderable], + hint: t(".backorderable_hint_html"), + checked: f.object.backorderable?, + include_hidden: true, + ) %> +
+ <% end %> + <% modal.with_actions do %> +
<%= render component("ui/button").new( - tag: :button, - text: t(".submit"), - form: form_id, + scheme: :secondary, + text: t(".cancel"), ) %> - <% end %> +
+ + <%= render component("ui/button").new( + tag: :button, + text: t(".submit"), + form: form_id, + ) %> <% end %> <% end %> - - <%= render component("stock_items/index").new(page: @page) %> -
+<% end %> diff --git a/admin/app/components/solidus_admin/stock_items/edit/component.rb b/admin/app/components/solidus_admin/stock_items/edit/component.rb index 3573444d413..63ccf53032e 100644 --- a/admin/app/components/solidus_admin/stock_items/edit/component.rb +++ b/admin/app/components/solidus_admin/stock_items/edit/component.rb @@ -1,18 +1,9 @@ # frozen_string_literal: true -class SolidusAdmin::StockItems::Edit::Component < SolidusAdmin::BaseComponent - def initialize(stock_item:, page:) - @stock_item = stock_item - @page = page - end - +class SolidusAdmin::StockItems::Edit::Component < SolidusAdmin::Resources::Edit::Component def title [ "#{Spree::StockLocation.model_name.human}: #{@stock_item.stock_location.name}", ].join(' / ') end - - def form_id - "#{stimulus_id}-#{dom_id(@stock_item)}" - end end diff --git a/admin/app/components/solidus_admin/stock_items/index/component.rb b/admin/app/components/solidus_admin/stock_items/index/component.rb index fc20bb93f71..4e480aedc6c 100644 --- a/admin/app/components/solidus_admin/stock_items/index/component.rb +++ b/admin/app/components/solidus_admin/stock_items/index/component.rb @@ -13,8 +13,8 @@ def search_url solidus_admin.stock_items_path end - def row_url(stock_item) - solidus_admin.edit_stock_item_path(stock_item, _turbo_frame: :edit_stock_item_modal) + def edit_path(stock_item) + solidus_admin.edit_stock_item_path(stock_item) end def scopes @@ -90,7 +90,9 @@ def name_column { header: :name, data: ->(stock_item) do - content_tag :div, stock_item.variant.name + link_to stock_item.variant.name, edit_path(stock_item), + data: { turbo_frame: :resource_modal, turbo_prefetch: false }, + class: 'body-link' end } end @@ -99,7 +101,9 @@ def sku_column { header: :sku, data: ->(stock_item) do - content_tag :div, stock_item.variant.sku + link_to stock_item.variant.sku, edit_path(stock_item), + data: { turbo_frame: :resource_modal, turbo_prefetch: false }, + class: 'body-link' end } end @@ -168,6 +172,6 @@ def count_on_hand_column end def turbo_frames - %w[edit_stock_item_modal] + %w[resource_modal] end end diff --git a/admin/app/controllers/solidus_admin/stock_items_controller.rb b/admin/app/controllers/solidus_admin/stock_items_controller.rb index 1333dbe672c..b4be4707d7b 100644 --- a/admin/app/controllers/solidus_admin/stock_items_controller.rb +++ b/admin/app/controllers/solidus_admin/stock_items_controller.rb @@ -1,10 +1,9 @@ # frozen_string_literal: true module SolidusAdmin - class StockItemsController < SolidusAdmin::BaseController + class StockItemsController < SolidusAdmin::ResourcesController include SolidusAdmin::ControllerHelpers::Search - before_action :load_stock_items, only: [:index, :edit, :update] - before_action :load_stock_item, only: [:edit, :update] + before_action :load_stock_items, only: [:index] search_scope(:all, default: true) { _1 } search_scope(:back_orderable) { _1.where(backorderable: true) } @@ -18,31 +17,32 @@ def index end end - def edit - respond_to do |format| - format.html { render component('stock_items/edit').new(stock_item: @stock_item, page: @page) } - end - end - def update quantity_adjustment = params[:quantity_adjustment].to_i - @stock_item.assign_attributes(stock_item_params) + @stock_item.assign_attributes(permitted_resource_params) @stock_item.stock_movements.build(quantity: quantity_adjustment, originator: current_solidus_admin_user) if @stock_item.save - respond_to do |format| - format.html { redirect_to solidus_admin.stock_items_path, status: :see_other } - format.turbo_stream { render turbo_stream: '' } - end + redirect_to after_update_path, status: :see_other else respond_to do |format| - format.html { render component('stock_items/edit').new(stock_item: @stock_item, page: @page), status: :unprocessable_entity } + page_component = edit_component.new(@resource) + + format.html do + render page_component, status: :unprocessable_entity + end + format.turbostream do + render turbo_stream: turbo_stream.replace(:resource_modal, page_component), + status: :unprocessable_entity + end end end end private + def resource_class = Spree::StockItem + def load_stock_items @stock_items = apply_search_to( Spree::StockItem.reorder(nil), @@ -56,11 +56,7 @@ def load_stock_items }) end - def load_stock_item - @stock_item = Spree::StockItem.find(params[:id]) - end - - def stock_item_params + def permitted_resource_params params.require(:stock_item).permit(:backorderable) end end