Skip to content

Commit f67defb

Browse files
committed
Fix to show validation errors in modals
Fixes #1735
1 parent ac3fe35 commit f67defb

6 files changed

Lines changed: 54 additions & 7 deletions

File tree

app/assets/javascripts/rails_admin/ra.remote-form.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,7 @@
8888

8989
form.bind("ajax:complete", function(event) {
9090
var data = event.detail[0], status = event.detail[1];
91-
if (status == 'error') {
92-
dialog.find('.modal-body').html(data.responseText);
93-
widget._bindFormEvents();
94-
} else {
91+
if (status == 'OK') {
9592
var json = $.parseJSON(data.responseText);
9693
var option = '<option value="' + json.id + '" selected>' + json.label + '</option>';
9794
var select = widget.element.find('select').filter(":hidden");
@@ -116,6 +113,9 @@
116113
}
117114
widget._trigger("success");
118115
dialog.modal("hide");
116+
} else {
117+
dialog.find('.modal-body').html(data.responseText);
118+
widget._bindFormEvents();
119119
}
120120
});
121121
},

app/controllers/rails_admin/main_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ def handle_save_error(whereto = :new)
110110

111111
respond_to do |format|
112112
format.html { render whereto, status: :not_acceptable }
113-
format.js { render whereto, layout: false, status: :not_acceptable }
113+
format.js { render whereto, layout: 'rails_admin/modal', status: :not_acceptable, content_type: Mime[:html].to_s }
114114
end
115115
end
116116

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
- flash && flash.each do |key, value|
2+
.alert.alert-dismissible{class: flash_alert_class(key)}
3+
%button.close{type: 'button', :'data-dismiss' => "alert"} &times;
4+
= value
5+
= yield

lib/rails_admin/config/actions/edit.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class Edit < RailsAdmin::Config::Actions::Base
1818

1919
respond_to do |format|
2020
format.html { render @action.template_name }
21-
format.js { render @action.template_name, layout: false }
21+
format.js { render @action.template_name, layout: 'rails_admin/modal', content_type: Mime[:html].to_s }
2222
end
2323

2424
elsif request.put? # UPDATE

lib/rails_admin/config/actions/new.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class New < RailsAdmin::Config::Actions::Base
2626
end
2727
respond_to do |format|
2828
format.html { render @action.template_name }
29-
format.js { render @action.template_name, layout: false }
29+
format.js { render @action.template_name, layout: 'rails_admin/modal', content_type: Mime[:html].to_s }
3030
end
3131

3232
elsif request.post? # CREATE

spec/integration/widgets/remote_form_spec.rb

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,4 +105,46 @@
105105
expect(FieldTest.first.carrierwave_asset.file.size).to eq 1575
106106
end
107107
end
108+
109+
context 'with validation errors' do
110+
before do
111+
RailsAdmin.config Team do
112+
field :players
113+
end
114+
RailsAdmin.config Player do
115+
field :name
116+
field :number
117+
field :team
118+
end
119+
end
120+
121+
context 'on create' do
122+
it 'shows the error messages' do
123+
visit new_path(model_name: 'team')
124+
click_link 'Add a new Player'
125+
is_expected.to have_content 'New Player'
126+
find('#player_name').set('on steroids')
127+
find('#modal .save-action').click
128+
is_expected.to have_css('#modal')
129+
is_expected.to have_content 'Player is cheating'
130+
is_expected.to have_css '.text-danger', text: 'is not a number'
131+
end
132+
end
133+
134+
context 'on update' do
135+
let!(:player) { FactoryBot.create :player, name: 'Cheater' }
136+
137+
it 'shows the error messages' do
138+
visit new_path(model_name: 'team')
139+
find('option', text: 'Cheater').double_click
140+
is_expected.to have_content "Edit Player 'Cheater'"
141+
find('#player_name').set('Cheater on steroids')
142+
find('#player_number').set('')
143+
find('#modal .save-action').click
144+
is_expected.to have_css('#modal')
145+
is_expected.to have_content 'Player is cheating'
146+
is_expected.to have_css '.text-danger', text: 'is not a number'
147+
end
148+
end
149+
end
108150
end

0 commit comments

Comments
 (0)