Skip to content

Commit 40abfed

Browse files
feature: action dynamic backdrop option (#3379)
* feature: action dynamic backdrop option * style: dynamic_backdrop reader * code review changes * rename to `close_modal_on_backdrop_click`
1 parent 15836c2 commit 40abfed

File tree

7 files changed

+42
-4
lines changed

7 files changed

+42
-4
lines changed

app/components/avo/modal_component.html.erb

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
<div class="modal-container fixed inset-0 w-full min-h-screen z-[100] flex justify-center items-center"
22
data-controller="modal"
33
data-modal-target="modal"
4+
data-modal-close-modal-on-backdrop-click-value="<%= close_modal_on_backdrop_click %>"
45
>
5-
<div aria-expanded="true" class="modal-overlay absolute w-full h-full bg-opacity-25 bg-gray-800 flex justify-center items-center" data-action="click->modal#close"></div>
6+
<div aria-expanded="true" class="modal-overlay absolute w-full h-full bg-opacity-25 bg-gray-800 flex justify-center items-center" data-modal-target="backdrop" data-action="click->modal#close" ></div>
67
<div aria-expanded="true" role="dialog" aria-modal="true" class="modal-body rounded-lg inset-auto bg-white flex z-50 relative shadow-modal <%= overflow_classes %> <%= width_classes %> <%= height_classes %>">
78
<div class="flex-1 flex flex-col justify-between">
89
<div>
@@ -25,4 +26,3 @@
2526
</div>
2627
</div>
2728
</div>
28-

app/components/avo/modal_component.rb

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ class Avo::ModalComponent < Avo::BaseComponent
77
prop :width, default: :md
88
prop :body_class
99
prop :overflow, default: :auto
10+
prop :close_modal_on_backdrop_click, default: true, reader: :public
1011

1112
def width_classes
1213
case @width.to_sym

app/javascript/js/controllers/modal_controller.js

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
import { Controller } from '@hotwired/stimulus'
22

33
export default class extends Controller {
4-
static targets = ['modal']
4+
static targets = ['modal', 'backdrop']
5+
6+
static values = {
7+
closeModalOnBackdropClick: true,
8+
}
59

610
close() {
11+
if (event.target === this.backdropTarget && !this.closeModalOnBackdropClickValue) return
12+
713
this.modalTarget.remove()
814

915
document.dispatchEvent(new Event('actions-modal:close'))

app/views/avo/actions/show.html.erb

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
**@action.class.form_data_attributes,
2222
} do |form|
2323
%>
24-
<%= render Avo::ModalComponent.new do |c| %>
24+
<%= render Avo::ModalComponent.new(close_modal_on_backdrop_click: @action.close_modal_on_backdrop_click) do |c| %>
2525
<% c.with_heading do %>
2626
<%= @action.action_name %>
2727
<% end %>

lib/avo/base_action.rb

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class BaseAction
1414
class_attribute :may_download_file
1515
class_attribute :turbo
1616
class_attribute :authorize, default: true
17+
class_attribute :close_modal_on_backdrop_click, default: true
1718

1819
attr_accessor :view
1920
attr_accessor :response

spec/dummy/app/avo/actions/export_csv.rb

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ class Avo::Actions::ExportCsv < Avo::BaseAction
44
self.name = "Export CSV"
55
self.no_confirmation = false
66
self.standalone = true
7+
self.close_modal_on_backdrop_click = false
78

89
def fields
910
# Add more fields here for custom user-selected columns

spec/system/avo/actions_spec.rb

+29
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,35 @@
168168
end
169169
end
170170

171+
describe "action close_modal_on_backdrop_click" do
172+
it "closes the modal on backdrop click" do
173+
Avo::Actions::ExportCsv.close_modal_on_backdrop_click = true
174+
175+
visit "/admin/resources/projects"
176+
177+
click_on "Actions"
178+
click_on "Export CSV"
179+
find('[data-modal-target="backdrop"]').trigger("click")
180+
181+
expect(page).not_to have_selector '[data-controller="modal"]'
182+
end
183+
184+
it "does not close the modal on backdrop click" do
185+
Avo::Actions::ExportCsv.close_modal_on_backdrop_click = false
186+
187+
visit "/admin/resources/projects"
188+
189+
click_on "Actions"
190+
click_on "Export CSV"
191+
find('[data-modal-target="backdrop"]').trigger("click")
192+
193+
expect(page).to have_selector '[data-controller="modal"]'
194+
195+
click_on "Cancel"
196+
expect(page).not_to have_selector '[data-controller="modal"]'
197+
end
198+
end
199+
171200
describe "redirects when no confirmation" do
172201
it "redirects to hey page" do
173202
visit "/admin/resources/users"

0 commit comments

Comments
 (0)