From f128ab6b8b435ab7f870a607f5aeea64062b7dc4 Mon Sep 17 00:00:00 2001 From: Thomas von Deyen Date: Wed, 22 Jan 2025 15:22:40 +0100 Subject: [PATCH] Admin product properties: Load modal with turbo frame --- .../properties/edit/component.html.erb | 5 +- .../properties/edit/component.rb | 10 +- .../properties/index/component.rb | 22 ++-- .../properties/new/component.html.erb | 6 +- .../solidus_admin/properties/new/component.rb | 10 +- .../solidus_admin/properties_controller.rb | 110 +----------------- admin/spec/features/properties_spec.rb | 8 +- 7 files changed, 26 insertions(+), 145 deletions(-) diff --git a/admin/app/components/solidus_admin/properties/edit/component.html.erb b/admin/app/components/solidus_admin/properties/edit/component.html.erb index e116b899486..b2a90586684 100644 --- a/admin/app/components/solidus_admin/properties/edit/component.html.erb +++ b/admin/app/components/solidus_admin/properties/edit/component.html.erb @@ -1,6 +1,6 @@ -<%= turbo_frame_tag :edit_property_modal do %> +<%= turbo_frame_tag :resource_modal, target: "_top" do %> <%= render component("ui/modal").new(title: t(".title")) do |modal| %> - <%= form_for @property, url: solidus_admin.property_path(@property), html: { id: form_id } do |f| %> + <%= form_for @property, url: form_url, html: { id: form_id } do |f| %>
<%= render component("ui/forms/field").text_field(f, :name, class: "required") %> <%= render component("ui/forms/field").text_field(f, :presentation, class: "required") %> @@ -14,4 +14,3 @@ <% end %> <% end %> <% end %> -<%= render component("properties/index").new(page: @page) %> diff --git a/admin/app/components/solidus_admin/properties/edit/component.rb b/admin/app/components/solidus_admin/properties/edit/component.rb index b2ed34d9114..0a2fa7a856b 100644 --- a/admin/app/components/solidus_admin/properties/edit/component.rb +++ b/admin/app/components/solidus_admin/properties/edit/component.rb @@ -1,12 +1,4 @@ # frozen_string_literal: true -class SolidusAdmin::Properties::Edit::Component < SolidusAdmin::BaseComponent - def initialize(page:, property:) - @page = page - @property = property - end - - def form_id - dom_id(@property, "#{stimulus_id}_edit_property_form") - end +class SolidusAdmin::Properties::Edit::Component < SolidusAdmin::Resources::Edit::Component end diff --git a/admin/app/components/solidus_admin/properties/index/component.rb b/admin/app/components/solidus_admin/properties/index/component.rb index 61aca2318c4..9782ba2e624 100644 --- a/admin/app/components/solidus_admin/properties/index/component.rb +++ b/admin/app/components/solidus_admin/properties/index/component.rb @@ -17,22 +17,20 @@ def search_url solidus_admin.properties_path end - def row_url(property) - solidus_admin.edit_property_path(property, _turbo_frame: :edit_property_modal) + def edit_path(property) + solidus_admin.edit_property_path(property, **search_filter_params) end def turbo_frames - %w[ - new_property_modal - edit_property_modal - ] + %w[resource_modal] end def page_actions render component("ui/button").new( tag: :a, text: t('.add'), - href: solidus_admin.new_property_path, data: { turbo_frame: :new_property_modal }, + href: solidus_admin.new_property_path(**search_filter_params), + data: { turbo_frame: :resource_modal }, icon: "add-line", ) end @@ -41,7 +39,7 @@ def batch_actions [ { label: t('.batch_actions.delete'), - action: solidus_admin.properties_path, + action: solidus_admin.properties_path(**search_filter_params), method: :delete, icon: 'delete-bin-7-line', }, @@ -59,7 +57,9 @@ def name_column { header: :name, data: ->(property) do - content_tag :div, property.name + link_to property.name, edit_path(property), + data: { turbo_frame: :resource_modal }, + class: 'body-link' end } end @@ -68,7 +68,9 @@ def presentation_column { header: :presentation, data: ->(property) do - content_tag :div, property.presentation + link_to property.presentation, edit_path(property), + data: { turbo_frame: :resource_modal }, + class: 'body-link' end } end diff --git a/admin/app/components/solidus_admin/properties/new/component.html.erb b/admin/app/components/solidus_admin/properties/new/component.html.erb index d306cebcf4c..b2a90586684 100644 --- a/admin/app/components/solidus_admin/properties/new/component.html.erb +++ b/admin/app/components/solidus_admin/properties/new/component.html.erb @@ -1,6 +1,6 @@ -<%= turbo_frame_tag :new_property_modal do %> +<%= turbo_frame_tag :resource_modal, target: "_top" do %> <%= render component("ui/modal").new(title: t(".title")) do |modal| %> - <%= form_for @property, url: solidus_admin.properties_path, html: { id: form_id } do |f| %> + <%= form_for @property, url: form_url, html: { id: form_id } do |f| %>
<%= render component("ui/forms/field").text_field(f, :name, class: "required") %> <%= render component("ui/forms/field").text_field(f, :presentation, class: "required") %> @@ -14,5 +14,3 @@ <% end %> <% end %> <% end %> - -<%= render component("properties/index").new(page: @page) %> diff --git a/admin/app/components/solidus_admin/properties/new/component.rb b/admin/app/components/solidus_admin/properties/new/component.rb index 55e8806c68f..afd74de491e 100644 --- a/admin/app/components/solidus_admin/properties/new/component.rb +++ b/admin/app/components/solidus_admin/properties/new/component.rb @@ -1,12 +1,4 @@ # frozen_string_literal: true -class SolidusAdmin::Properties::New::Component < SolidusAdmin::BaseComponent - def initialize(page:, property:) - @page = page - @property = property - end - - def form_id - dom_id(@property, "#{stimulus_id}_new_property_form") - end +class SolidusAdmin::Properties::New::Component < SolidusAdmin::Resources::New::Component end diff --git a/admin/app/controllers/solidus_admin/properties_controller.rb b/admin/app/controllers/solidus_admin/properties_controller.rb index 53db315d8d6..f09d590ce81 100644 --- a/admin/app/controllers/solidus_admin/properties_controller.rb +++ b/admin/app/controllers/solidus_admin/properties_controller.rb @@ -1,117 +1,15 @@ # frozen_string_literal: true module SolidusAdmin - class PropertiesController < SolidusAdmin::BaseController - include SolidusAdmin::ControllerHelpers::Search - - before_action :set_property, only: %i[edit update] - - def index - set_index_page - - respond_to do |format| - format.html { render component('properties/index').new(page: @page) } - end - end - - def new - @property = Spree::Property.new - - set_index_page - - respond_to do |format| - format.html { render component('properties/new').new(page: @page, property: @property) } - end - end - - def create - @property = Spree::Property.new(property_params) - - if @property.save - respond_to do |format| - flash[:notice] = t('.success') - - format.html do - redirect_to solidus_admin.properties_path, status: :see_other - end - - format.turbo_stream do - render turbo_stream: '' - end - end - else - set_index_page - - respond_to do |format| - format.html do - page_component = component('properties/new').new(page: @page, property: @property) - render page_component, status: :unprocessable_entity - end - end - end - end - - def edit - set_index_page - - respond_to do |format| - format.html { render component('properties/edit').new(page: @page, property: @property) } - end - end - - def update - if @property.update(property_params) - respond_to do |format| - flash[:notice] = t('.success') - - format.html do - redirect_to solidus_admin.properties_path, status: :see_other - end - - format.turbo_stream do - render turbo_stream: '' - end - end - else - set_index_page - - respond_to do |format| - format.html do - page_component = component('properties/edit').new(page: @page, property: @property) - render page_component, status: :unprocessable_entity - end - end - end - end - - def destroy - @properties = Spree::Property.where(id: params[:id]) - - Spree::Property.transaction do - @properties.destroy_all - end - - flash[:notice] = t('.success') - redirect_to properties_path, status: :see_other - end - + class PropertiesController < SolidusAdmin::ResourcesController private - def set_property - @property = Spree::Property.find(params[:id]) - end + def resource_class = Spree::Property - def property_params + def permitted_resource_params params.require(:property).permit(:name, :presentation) end - def set_index_page - properties = apply_search_to( - Spree::Property.unscoped.order(id: :desc), - param: :q, - ) - - set_page_and_extract_portion_from(properties) - end + def resources_collection = Spree::Property.unscoped end end diff --git a/admin/spec/features/properties_spec.rb b/admin/spec/features/properties_spec.rb index bf0c813b368..bf095252f1c 100644 --- a/admin/spec/features/properties_spec.rb +++ b/admin/spec/features/properties_spec.rb @@ -54,7 +54,7 @@ it "updates the property" do visit "/admin/properties" - find_row("Color").click + click_on "Color" fill_in "Name", with: "Size" fill_in "Presentation", with: "Cool Size" @@ -68,7 +68,7 @@ it "shows validation errors" do visit "/admin/properties" - find_row("Color").click + click_on "Color" fill_in "Name", with: "" click_on "Update Property" @@ -83,7 +83,7 @@ it "updates the property" do visit "/admin/properties" - find_row("Color").click + click_on "Color" fill_in "Name", with: "Size" fill_in "Presentation", with: "Cool Size" @@ -97,7 +97,7 @@ it "shows validation errors" do visit "/admin/properties" - find_row("Color").click + click_on "Color" expect(page).to have_field("Name", with: "Color") fill_in "Name", with: "" click_on "Update Property"