solidus_admin 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. checksums.yaml +4 -4
  2. data/.prettierrc +4 -0
  3. data/app/assets/builds/solidus_admin/tailwind.css +164 -132
  4. data/app/components/solidus_admin/adjustment_reasons/edit/component.html.erb +2 -3
  5. data/app/components/solidus_admin/adjustment_reasons/edit/component.rb +1 -9
  6. data/app/components/solidus_admin/adjustment_reasons/index/component.rb +22 -8
  7. data/app/components/solidus_admin/adjustment_reasons/new/component.html.erb +2 -4
  8. data/app/components/solidus_admin/adjustment_reasons/new/component.rb +1 -9
  9. data/app/components/solidus_admin/base_component.rb +7 -9
  10. data/app/components/solidus_admin/layout/navigation/account/component.rb +2 -2
  11. data/app/components/solidus_admin/layout/navigation/component.js +1 -1
  12. data/app/components/solidus_admin/layout/navigation/component.rb +1 -1
  13. data/app/components/solidus_admin/layout/navigation/item/component.html.erb +2 -2
  14. data/app/components/solidus_admin/layout/navigation/item/component.rb +3 -6
  15. data/app/components/solidus_admin/orders/index/component.rb +3 -3
  16. data/app/components/solidus_admin/orders/show/address/component.js +2 -2
  17. data/app/components/solidus_admin/orders/show/adjustments/index/adjustable/component.rb +1 -1
  18. data/app/components/solidus_admin/orders/show/adjustments/index/source/component.rb +1 -1
  19. data/app/components/solidus_admin/orders/show/component.js +2 -2
  20. data/app/components/solidus_admin/orders/show/customer_search/component.js +5 -4
  21. data/app/components/solidus_admin/orders/show/summary/component.html.erb +6 -6
  22. data/app/components/solidus_admin/products/show/component.html.erb +7 -1
  23. data/app/components/solidus_admin/products/show/component.rb +6 -0
  24. data/app/components/solidus_admin/products/status/component.rb +1 -1
  25. data/app/components/solidus_admin/properties/edit/component.html.erb +16 -0
  26. data/app/components/solidus_admin/properties/edit/component.rb +4 -0
  27. data/app/components/solidus_admin/properties/edit/component.yml +4 -0
  28. data/app/components/solidus_admin/properties/index/component.rb +19 -6
  29. data/app/components/solidus_admin/properties/new/component.html.erb +16 -0
  30. data/app/components/solidus_admin/properties/new/component.rb +4 -0
  31. data/app/components/solidus_admin/properties/new/component.yml +4 -0
  32. data/app/components/solidus_admin/refund_reasons/edit/component.html.erb +2 -3
  33. data/app/components/solidus_admin/refund_reasons/edit/component.rb +1 -9
  34. data/app/components/solidus_admin/refund_reasons/index/component.rb +22 -8
  35. data/app/components/solidus_admin/refund_reasons/new/component.html.erb +2 -4
  36. data/app/components/solidus_admin/refund_reasons/new/component.rb +1 -9
  37. data/app/components/solidus_admin/resources/base_component.rb +20 -0
  38. data/app/components/solidus_admin/resources/edit/component.rb +11 -0
  39. data/app/components/solidus_admin/resources/new/component.rb +11 -0
  40. data/app/components/solidus_admin/return_reasons/edit/component.html.erb +2 -3
  41. data/app/components/solidus_admin/return_reasons/edit/component.rb +1 -9
  42. data/app/components/solidus_admin/return_reasons/index/component.rb +13 -7
  43. data/app/components/solidus_admin/return_reasons/new/component.html.erb +2 -4
  44. data/app/components/solidus_admin/return_reasons/new/component.rb +1 -9
  45. data/app/components/solidus_admin/roles/edit/component.html.erb +2 -4
  46. data/app/components/solidus_admin/roles/edit/component.rb +1 -10
  47. data/app/components/solidus_admin/roles/index/component.rb +16 -8
  48. data/app/components/solidus_admin/roles/new/component.html.erb +2 -4
  49. data/app/components/solidus_admin/roles/new/component.rb +1 -10
  50. data/app/components/solidus_admin/shipping_categories/edit/component.html.erb +2 -3
  51. data/app/components/solidus_admin/shipping_categories/edit/component.rb +1 -9
  52. data/app/components/solidus_admin/shipping_categories/index/component.rb +14 -17
  53. data/app/components/solidus_admin/shipping_categories/new/component.html.erb +2 -4
  54. data/app/components/solidus_admin/shipping_categories/new/component.rb +1 -9
  55. data/app/components/solidus_admin/stock_items/edit/component.html.erb +74 -73
  56. data/app/components/solidus_admin/stock_items/edit/component.js +4 -3
  57. data/app/components/solidus_admin/stock_items/edit/component.rb +1 -10
  58. data/app/components/solidus_admin/stock_items/index/component.rb +10 -6
  59. data/app/components/solidus_admin/stock_locations/index/component.rb +2 -2
  60. data/app/components/solidus_admin/store_credit_reasons/edit/component.html.erb +2 -3
  61. data/app/components/solidus_admin/store_credit_reasons/edit/component.rb +1 -9
  62. data/app/components/solidus_admin/store_credit_reasons/index/component.rb +14 -7
  63. data/app/components/solidus_admin/store_credit_reasons/new/component.html.erb +2 -4
  64. data/app/components/solidus_admin/store_credit_reasons/new/component.rb +1 -9
  65. data/app/components/solidus_admin/tax_categories/edit/component.html.erb +2 -4
  66. data/app/components/solidus_admin/tax_categories/edit/component.rb +1 -9
  67. data/app/components/solidus_admin/tax_categories/index/component.rb +30 -9
  68. data/app/components/solidus_admin/tax_categories/new/component.html.erb +2 -4
  69. data/app/components/solidus_admin/tax_categories/new/component.rb +1 -9
  70. data/app/components/solidus_admin/ui/dropdown/component.js +3 -3
  71. data/app/components/solidus_admin/ui/forms/address/component.js +5 -6
  72. data/app/components/solidus_admin/ui/forms/field/component.rb +18 -18
  73. data/app/components/solidus_admin/ui/forms/input/component.js +3 -4
  74. data/app/components/solidus_admin/ui/forms/input/component.rb +15 -4
  75. data/app/components/solidus_admin/ui/icon/component.rb +3 -1
  76. data/app/components/solidus_admin/ui/modal/component.js +2 -2
  77. data/app/components/solidus_admin/ui/pages/index/component.html.erb +3 -3
  78. data/app/components/solidus_admin/ui/pages/index/component.rb +11 -6
  79. data/app/components/solidus_admin/ui/table/component.html.erb +4 -3
  80. data/app/components/solidus_admin/ui/table/component.js +13 -17
  81. data/app/components/solidus_admin/ui/table/component.rb +1 -1
  82. data/app/components/solidus_admin/ui/table/ransack_filter/component.js +18 -16
  83. data/app/components/solidus_admin/ui/thumbnail_with_caption/component.rb +1 -1
  84. data/app/components/solidus_admin/ui/toast/component.html.erb +1 -1
  85. data/app/components/solidus_admin/ui/toast/component.js +3 -3
  86. data/app/components/solidus_admin/ui/toggletip/component.js +14 -12
  87. data/app/components/solidus_admin/users/index/component.rb +1 -1
  88. data/app/components/solidus_admin/users/orders/component.rb +1 -1
  89. data/app/components/solidus_admin/users/store_credits/edit_amount/component.html.erb +22 -0
  90. data/app/components/solidus_admin/users/store_credits/edit_amount/component.rb +22 -0
  91. data/app/components/solidus_admin/users/store_credits/edit_amount/component.yml +5 -0
  92. data/app/components/solidus_admin/users/store_credits/edit_memo/component.html.erb +15 -0
  93. data/app/components/solidus_admin/users/store_credits/edit_memo/component.rb +16 -0
  94. data/app/components/solidus_admin/users/store_credits/edit_memo/component.yml +4 -0
  95. data/app/components/solidus_admin/users/store_credits/edit_validity/component.html.erb +21 -0
  96. data/app/components/solidus_admin/users/store_credits/edit_validity/component.rb +22 -0
  97. data/app/components/solidus_admin/users/store_credits/edit_validity/component.yml +5 -0
  98. data/app/components/solidus_admin/users/store_credits/index/component.html.erb +65 -0
  99. data/app/components/solidus_admin/users/store_credits/index/component.rb +114 -0
  100. data/app/components/solidus_admin/users/store_credits/index/component.yml +12 -0
  101. data/app/components/solidus_admin/users/store_credits/new/component.html.erb +30 -0
  102. data/app/components/solidus_admin/users/store_credits/new/component.rb +22 -0
  103. data/app/components/solidus_admin/users/store_credits/new/component.yml +5 -0
  104. data/app/components/solidus_admin/users/store_credits/show/component.html.erb +83 -0
  105. data/app/components/solidus_admin/users/store_credits/show/component.rb +120 -0
  106. data/app/components/solidus_admin/users/store_credits/show/component.yml +18 -0
  107. data/app/controllers/solidus_admin/adjustment_reasons_controller.rb +3 -105
  108. data/app/controllers/solidus_admin/authentication_adapters/backend.rb +1 -1
  109. data/app/controllers/solidus_admin/base_controller.rb +12 -1
  110. data/app/controllers/solidus_admin/controller_helpers/search.rb +4 -4
  111. data/app/controllers/solidus_admin/properties_controller.rb +6 -24
  112. data/app/controllers/solidus_admin/refund_reasons_controller.rb +5 -105
  113. data/app/controllers/solidus_admin/resources_controller.rb +152 -0
  114. data/app/controllers/solidus_admin/return_reasons_controller.rb +4 -104
  115. data/app/controllers/solidus_admin/roles_controller.rb +3 -105
  116. data/app/controllers/solidus_admin/shipping_categories_controller.rb +3 -107
  117. data/app/controllers/solidus_admin/stock_items_controller.rb +12 -29
  118. data/app/controllers/solidus_admin/store_credit_reasons_controller.rb +5 -105
  119. data/app/controllers/solidus_admin/store_credits_controller.rb +231 -0
  120. data/app/controllers/solidus_admin/tax_categories_controller.rb +3 -109
  121. data/app/helpers/solidus_admin/void_elements_helper.rb +13 -0
  122. data/app/views/layouts/solidus_admin/application.html.erb +3 -0
  123. data/config/locales/menu_item.en.yml +0 -1
  124. data/config/locales/properties.en.yml +4 -0
  125. data/config/locales/store_credits.en.yml +16 -0
  126. data/config/routes.rb +12 -1
  127. data/lib/generators/solidus_admin/install/install_generator.rb +2 -0
  128. data/lib/solidus_admin/component_registry.rb +1 -1
  129. data/lib/solidus_admin/configuration.rb +3 -8
  130. data/lib/solidus_admin/engine.rb +6 -0
  131. data/lib/solidus_admin/install_tailwindcss.rb +1 -1
  132. data/lib/solidus_admin/testing_support/component_helpers.rb +3 -9
  133. data/lib/solidus_admin/testing_support/feature_helpers.rb +1 -1
  134. data/lib/solidus_admin/testing_support/shared_examples/bulk_delete_resources.rb +20 -0
  135. data/lib/solidus_admin/testing_support/shared_examples/crud_resource_requests.rb +138 -0
  136. data/lib/solidus_admin/testing_support/shared_examples/promotion_categories_features.rb +72 -0
  137. data/lib/solidus_admin/version.rb +1 -1
  138. data/solidus_admin.gemspec +2 -2
  139. metadata +39 -8
  140. data/bin/rails +0 -13
@@ -0,0 +1,120 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::Users::StoreCredits::Show::Component < SolidusAdmin::BaseComponent
4
+ include SolidusAdmin::Layout::PageHelpers
5
+ include Spree::Admin::StoreCreditEventsHelper
6
+
7
+ def initialize(user:, store_credit:, events:)
8
+ @user = user
9
+ @store_credit = store_credit
10
+ @events = events
11
+ end
12
+
13
+ def model_class
14
+ Spree::StoreCredit
15
+ end
16
+
17
+ def event_model_class
18
+ Spree::StoreCreditEvent
19
+ end
20
+
21
+ def tabs
22
+ [
23
+ {
24
+ text: t('.account'),
25
+ href: solidus_admin.user_path(@user),
26
+ current: false,
27
+ },
28
+ {
29
+ text: t('.addresses'),
30
+ href: solidus_admin.addresses_user_path(@user),
31
+ current: false,
32
+ },
33
+ {
34
+ text: t('.order_history'),
35
+ href: solidus_admin.orders_user_path(@user),
36
+ current: false,
37
+ },
38
+ {
39
+ text: t('.items'),
40
+ href: spree.items_admin_user_path(@user),
41
+ current: false,
42
+ },
43
+ {
44
+ text: t('.store_credit'),
45
+ href: solidus_admin.user_store_credits_path(@user),
46
+ current: true,
47
+ },
48
+ ]
49
+ end
50
+
51
+ def form_id
52
+ @form_id ||= "#{stimulus_id}--form-#{@store_credit.id}"
53
+ end
54
+
55
+ def edit_validity_url
56
+ solidus_admin.edit_validity_user_store_credit_path(@user, @store_credit, **search_filter_params)
57
+ end
58
+
59
+ def edit_memo_url
60
+ solidus_admin.edit_memo_user_store_credit_path(@user, @store_credit, **search_filter_params)
61
+ end
62
+
63
+ def edit_amount_url
64
+ solidus_admin.edit_amount_user_store_credit_path(@user, @store_credit, **search_filter_params)
65
+ end
66
+
67
+ def columns
68
+ [
69
+ {
70
+ header: :date,
71
+ col: { class: "w-[15%]" },
72
+ data: ->(event) do
73
+ content_tag :span, I18n.l(event.created_at, format: :short), class: "text-sm"
74
+ end
75
+ },
76
+ {
77
+ header: :action,
78
+ col: { class: "w-[10%]" },
79
+ data: ->(event) do
80
+ content_tag :span, store_credit_event_admin_action_name(event), class: "text-sm"
81
+ end
82
+ },
83
+ {
84
+ header: :credited,
85
+ col: { class: "w-[10%]" },
86
+ data: ->(event) do
87
+ content_tag :span, event.display_amount, class: "text-sm"
88
+ end
89
+ },
90
+ {
91
+ header: :created_by,
92
+ col: { class: "w-[20%]" },
93
+ data: ->(event) do
94
+ content_tag :span, store_credit_event_originator_link(event), class: "body-link text-sm"
95
+ end
96
+ },
97
+ {
98
+ header: :total_amount,
99
+ col: { class: "w-[10%]" },
100
+ data: ->(event) do
101
+ content_tag :span, event.display_user_total_amount, class: "text-sm"
102
+ end
103
+ },
104
+ {
105
+ header: :total_unused,
106
+ col: { class: "w-[10%]" },
107
+ data: ->(event) do
108
+ content_tag :span, event.display_remaining_amount, class: "text-sm"
109
+ end
110
+ },
111
+ {
112
+ header: :reason_for_updating,
113
+ col: { class: "w-[25%]" },
114
+ data: ->(event) do
115
+ content_tag :span, event.store_credit_reason&.name, class: "text-sm"
116
+ end
117
+ },
118
+ ]
119
+ end
120
+ end
@@ -0,0 +1,18 @@
1
+ en:
2
+ title: "Users / %{email} / Store Credit / %{amount}"
3
+ account: Account
4
+ addresses: Addresses
5
+ order_history: Order History
6
+ items: Items
7
+ store_credit: Store Credit
8
+ last_active: Last Active
9
+ add_store_credit: Add Store Credit
10
+ edit_amount: Edit Amount
11
+ edit_memo: Edit Memo
12
+ invalidate: Invalidate
13
+ store_credit_history: Store Credit History
14
+ credited: Credited
15
+ created_by: Created By
16
+ type: Type
17
+ memo: Memo
18
+ back: Back
@@ -1,115 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SolidusAdmin
4
- class AdjustmentReasonsController < SolidusAdmin::BaseController
5
- include SolidusAdmin::ControllerHelpers::Search
6
-
7
- before_action :set_adjustment_reason, only: %i[edit update]
8
-
9
- def index
10
- set_index_page
11
-
12
- respond_to do |format|
13
- format.html { render component('adjustment_reasons/index').new(page: @page) }
14
- end
15
- end
16
-
17
- def new
18
- @adjustment_reason = Spree::AdjustmentReason.new
19
-
20
- set_index_page
21
-
22
- respond_to do |format|
23
- format.html { render component('adjustment_reasons/new').new(page: @page, adjustment_reason: @adjustment_reason) }
24
- end
25
- end
26
-
27
- def create
28
- @adjustment_reason = Spree::AdjustmentReason.new(adjustment_reason_params)
29
-
30
- if @adjustment_reason.save
31
- respond_to do |format|
32
- flash[:notice] = t('.success')
33
-
34
- format.html do
35
- redirect_to solidus_admin.adjustment_reasons_path, status: :see_other
36
- end
37
-
38
- format.turbo_stream do
39
- render turbo_stream: '<turbo-stream action="refresh" />'
40
- end
41
- end
42
- else
43
- set_index_page
44
-
45
- respond_to do |format|
46
- format.html do
47
- page_component = component('adjustment_reasons/new').new(page: @page, adjustment_reason: @adjustment_reason)
48
- render page_component, status: :unprocessable_entity
49
- end
50
- end
51
- end
52
- end
53
-
54
- def edit
55
- set_index_page
56
-
57
- respond_to do |format|
58
- format.html { render component('adjustment_reasons/edit').new(page: @page, adjustment_reason: @adjustment_reason) }
59
- end
60
- end
61
-
62
- def update
63
- if @adjustment_reason.update(adjustment_reason_params)
64
- respond_to do |format|
65
- flash[:notice] = t('.success')
66
-
67
- format.html do
68
- redirect_to solidus_admin.adjustment_reasons_path, status: :see_other
69
- end
70
-
71
- format.turbo_stream do
72
- render turbo_stream: '<turbo-stream action="refresh" />'
73
- end
74
- end
75
- else
76
- set_index_page
77
-
78
- respond_to do |format|
79
- format.html do
80
- page_component = component('adjustment_reasons/edit').new(page: @page, adjustment_reason: @adjustment_reason)
81
- render page_component, status: :unprocessable_entity
82
- end
83
- end
84
- end
85
- end
86
-
87
- def destroy
88
- @adjustment_reason = Spree::AdjustmentReason.find_by!(id: params[:id])
89
-
90
- Spree::AdjustmentReason.transaction { @adjustment_reason.destroy }
91
-
92
- flash[:notice] = t('.success')
93
- redirect_back_or_to adjustment_reasons_path, status: :see_other
94
- end
95
-
4
+ class AdjustmentReasonsController < SolidusAdmin::ResourcesController
96
5
  private
97
6
 
98
- def set_adjustment_reason
99
- @adjustment_reason = Spree::AdjustmentReason.find(params[:id])
100
- end
7
+ def resource_class = Spree::AdjustmentReason
101
8
 
102
- def adjustment_reason_params
9
+ def permitted_resource_params
103
10
  params.require(:adjustment_reason).permit(:name, :code, :active)
104
11
  end
105
-
106
- def set_index_page
107
- adjustment_reasons = apply_search_to(
108
- Spree::AdjustmentReason.order(id: :desc),
109
- param: :q,
110
- )
111
-
112
- set_page_and_extract_portion_from(adjustment_reasons)
113
- end
114
12
  end
115
13
  end
@@ -13,7 +13,7 @@ module SolidusAdmin::AuthenticationAdapters::Backend
13
13
  def authenticate_solidus_backend_user!
14
14
  return if spree_current_user
15
15
 
16
- instance_exec(&Spree::Admin::BaseController.unauthorized_redirect)
16
+ Spree::Backend::Config.unauthorized_redirect_handler_class.new(self).call
17
17
  end
18
18
 
19
19
  def store_location
@@ -15,8 +15,19 @@ module SolidusAdmin
15
15
  include SolidusAdmin::ComponentsHelper
16
16
  include SolidusAdmin::AuthenticationAdapters::Backend if defined?(Spree::Backend)
17
17
 
18
- layout 'solidus_admin/application'
18
+ layout :set_layout
19
+
19
20
  helper 'solidus_admin/components'
20
21
  helper 'solidus_admin/layout'
22
+
23
+ private
24
+
25
+ def set_layout
26
+ if turbo_frame_request?
27
+ 'turbo_rails/frame'
28
+ else
29
+ 'solidus_admin/application'
30
+ end
31
+ end
21
32
  end
22
33
  end
@@ -7,8 +7,8 @@ module SolidusAdmin::ControllerHelpers::Search
7
7
  def search_scope(name, default: false, &block)
8
8
  search_scopes << SearchScope.new(
9
9
  name: name.to_s,
10
- block: block,
11
- default: default,
10
+ block:,
11
+ default:,
12
12
  )
13
13
  end
14
14
 
@@ -20,8 +20,8 @@ module SolidusAdmin::ControllerHelpers::Search
20
20
  private
21
21
 
22
22
  def apply_search_to(relation, param:)
23
- relation = apply_scopes_to(relation, param: param)
24
- apply_ransack_search_to(relation, param: param)
23
+ relation = apply_scopes_to(relation, param:)
24
+ apply_ransack_search_to(relation, param:)
25
25
  end
26
26
 
27
27
  def apply_ransack_search_to(relation, param:)
@@ -1,33 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SolidusAdmin
4
- class PropertiesController < SolidusAdmin::BaseController
5
- include SolidusAdmin::ControllerHelpers::Search
4
+ class PropertiesController < SolidusAdmin::ResourcesController
5
+ private
6
6
 
7
- def index
8
- properties = apply_search_to(
9
- Spree::Property.order(created_at: :desc, id: :desc),
10
- param: :q,
11
- )
7
+ def resource_class = Spree::Property
12
8
 
13
- set_page_and_extract_portion_from(
14
- properties,
15
- )
16
-
17
- respond_to do |format|
18
- format.html { render component('properties/index').new(page: @page) }
19
- end
9
+ def permitted_resource_params
10
+ params.require(:property).permit(:name, :presentation)
20
11
  end
21
12
 
22
- def destroy
23
- @properties = Spree::Property.where(id: params[:id])
24
-
25
- Spree::Property.transaction do
26
- @properties.destroy_all
27
- end
28
-
29
- flash[:notice] = t('.success')
30
- redirect_to properties_path, status: :see_other
31
- end
13
+ def resources_collection = Spree::Property.unscoped
32
14
  end
33
15
  end
@@ -1,115 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SolidusAdmin
4
- class RefundReasonsController < SolidusAdmin::BaseController
5
- include SolidusAdmin::ControllerHelpers::Search
6
-
7
- before_action :set_refund_reason, only: %i[edit update]
8
-
9
- def index
10
- set_index_page
11
-
12
- respond_to do |format|
13
- format.html { render component('refund_reasons/index').new(page: @page) }
14
- end
15
- end
16
-
17
- def new
18
- @refund_reason = Spree::RefundReason.new
19
-
20
- set_index_page
21
-
22
- respond_to do |format|
23
- format.html { render component('refund_reasons/new').new(page: @page, refund_reason: @refund_reason) }
24
- end
25
- end
26
-
27
- def create
28
- @refund_reason = Spree::RefundReason.new(refund_reason_params)
29
-
30
- if @refund_reason.save
31
- respond_to do |format|
32
- flash[:notice] = t('.success')
33
-
34
- format.html do
35
- redirect_to solidus_admin.refund_reasons_path, status: :see_other
36
- end
37
-
38
- format.turbo_stream do
39
- render turbo_stream: '<turbo-stream action="refresh" />'
40
- end
41
- end
42
- else
43
- set_index_page
44
-
45
- respond_to do |format|
46
- format.html do
47
- page_component = component('refund_reasons/new').new(page: @page, refund_reason: @refund_reason)
48
- render page_component, status: :unprocessable_entity
49
- end
50
- end
51
- end
52
- end
53
-
54
- def edit
55
- set_index_page
56
-
57
- respond_to do |format|
58
- format.html { render component('refund_reasons/edit').new(page: @page, refund_reason: @refund_reason) }
59
- end
60
- end
61
-
62
- def update
63
- if @refund_reason.update(refund_reason_params)
64
- respond_to do |format|
65
- flash[:notice] = t('.success')
66
-
67
- format.html do
68
- redirect_to solidus_admin.refund_reasons_path, status: :see_other
69
- end
70
-
71
- format.turbo_stream do
72
- render turbo_stream: '<turbo-stream action="refresh" />'
73
- end
74
- end
75
- else
76
- set_index_page
77
-
78
- respond_to do |format|
79
- format.html do
80
- page_component = component('refund_reasons/edit').new(page: @page, refund_reason: @refund_reason)
81
- render page_component, status: :unprocessable_entity
82
- end
83
- end
84
- end
85
- end
86
-
87
- def destroy
88
- @refund_reason = Spree::RefundReason.find_by!(id: params[:id])
89
-
90
- Spree::RefundReason.transaction { @refund_reason.destroy }
91
-
92
- flash[:notice] = t('.success')
93
- redirect_back_or_to refund_reasons_path, status: :see_other
94
- end
95
-
4
+ class RefundReasonsController < SolidusAdmin::ResourcesController
96
5
  private
97
6
 
98
- def set_refund_reason
99
- @refund_reason = Spree::RefundReason.find(params[:id])
100
- end
101
-
102
- def refund_reason_params
103
- params.require(:refund_reason).permit(:name, :code, :active)
104
- end
7
+ def resource_class = Spree::RefundReason
105
8
 
106
- def set_index_page
107
- refund_reasons = apply_search_to(
108
- Spree::RefundReason.unscoped.order(id: :desc),
109
- param: :q,
110
- )
9
+ def resources_collection = Spree::RefundReason.unscoped
111
10
 
112
- set_page_and_extract_portion_from(refund_reasons)
11
+ def permitted_resource_params
12
+ params.require(:refund_reason).permit(:name, :code, :active)
113
13
  end
114
14
  end
115
15
  end
@@ -0,0 +1,152 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusAdmin
4
+ class ResourcesController < SolidusAdmin::BaseController
5
+ include SolidusAdmin::ControllerHelpers::Search
6
+
7
+ helper_method :search_filter_params
8
+
9
+ before_action :set_paginated_resources, only: %i[index]
10
+ before_action :set_resource, only: %i[edit update]
11
+
12
+ # GET /index
13
+ #
14
+ # Uses {set_paginated_resources} to set @resources
15
+ # and a instance variable with the plural name of the resource.
16
+ #
17
+ # Uses the geared_pagination gem to set @page for pagination.
18
+ #
19
+ # @see set_paginated_resources
20
+ # @see resources_collection
21
+ def index
22
+ respond_to do |format|
23
+ format.html { render index_component.new(page: @page) }
24
+ end
25
+ end
26
+
27
+ def new
28
+ @resource = resource_class.new
29
+ render new_component.new(@resource)
30
+ end
31
+
32
+ def create
33
+ @resource = resource_class.new(permitted_resource_params)
34
+
35
+ if @resource.save
36
+ flash[:notice] = t('.success')
37
+ redirect_to after_create_path, status: :see_other
38
+ else
39
+ page_component = new_component.new(@resource)
40
+ render_resource_form_with_errors(page_component)
41
+ end
42
+ end
43
+
44
+ def edit
45
+ render edit_component.new(@resource)
46
+ end
47
+
48
+ def update
49
+ if @resource.update(permitted_resource_params)
50
+ flash[:notice] = t('.success')
51
+ redirect_to after_update_path, status: :see_other
52
+ else
53
+ page_component = edit_component.new(@resource)
54
+ render_resource_form_with_errors(page_component)
55
+ end
56
+ end
57
+
58
+ def destroy
59
+ @resource = resource_class.where(id: params[:id])
60
+
61
+ resource_class.transaction { @resource.destroy_all }
62
+
63
+ flash[:notice] = t('.success')
64
+ redirect_back_or_to after_destroy_path, status: :see_other
65
+ end
66
+
67
+ private
68
+
69
+ def search_filter_params
70
+ request.params.slice(:q, :page)
71
+ end
72
+
73
+ def set_paginated_resources
74
+ @resources ||= apply_search_to(
75
+ resources_collection,
76
+ param: :q,
77
+ ).tap do |resources|
78
+ instance_variable_set("@#{plural_resource_name}", resources)
79
+ # sets @page instance variable in geared_pagination gem
80
+ set_page_and_extract_portion_from(resources, ordered_by: resources_sorting_options)
81
+ end
82
+ end
83
+
84
+ def resources_sorting_options
85
+ { id: :desc }
86
+ end
87
+
88
+ def resources_collection
89
+ resource_class.all
90
+ end
91
+
92
+ def set_resource
93
+ @resource ||= resource_class.find(params[:id]).tap do |resource|
94
+ instance_variable_set("@#{resource_name}", resource)
95
+ end
96
+ end
97
+
98
+ def resource_class
99
+ raise NotImplementedError,
100
+ "You must implement the resource_class method in #{self.class}"
101
+ end
102
+
103
+ def resource_name
104
+ resource_class.model_name.singular_route_key
105
+ end
106
+
107
+ def plural_resource_name
108
+ resource_class.model_name.route_key
109
+ end
110
+
111
+ def index_component
112
+ component("#{plural_resource_name}/index")
113
+ end
114
+
115
+ def new_component
116
+ component("#{plural_resource_name}/new")
117
+ end
118
+
119
+ def edit_component
120
+ component("#{plural_resource_name}/edit")
121
+ end
122
+
123
+ def render_resource_form_with_errors(page_component)
124
+ respond_to do |format|
125
+ format.html do
126
+ render page_component, status: :unprocessable_entity
127
+ end
128
+ format.turbo_stream do
129
+ render turbo_stream: turbo_stream.replace(:resource_modal, page_component),
130
+ status: :unprocessable_entity
131
+ end
132
+ end
133
+ end
134
+
135
+ def permitted_resource_params
136
+ raise NotImplementedError,
137
+ "You must implement the permitted_resource_params method in #{self.class}"
138
+ end
139
+
140
+ def after_create_path
141
+ solidus_admin.send("#{plural_resource_name}_path", **search_filter_params)
142
+ end
143
+
144
+ def after_update_path
145
+ solidus_admin.send("#{plural_resource_name}_path", **search_filter_params)
146
+ end
147
+
148
+ def after_destroy_path
149
+ solidus_admin.send("#{plural_resource_name}_path", **search_filter_params)
150
+ end
151
+ end
152
+ end