Skip to content

Commit 844cf05

Browse files
committed
Add error handling for missing column/filter in before/after options
- Raise `Datagrid::ConfigurationError` when a column or filter name specified in the `before` or `after` option is not found. - Update `Datagrid::Utils.extract_position_from_options` to handle cases where the specified column/filter does not exist. - Add tests to ensure proper error handling and functionality for `before` and `after` options in both columns and filters.
1 parent 487b1bc commit 844cf05

File tree

6 files changed

+63
-9
lines changed

6 files changed

+63
-9
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# Changelog
22

3+
* Raise `Datagrid::ConfigurationError` when column or filter name
4+
specified in `before` or `after` option not found.
5+
36
## [2.0.6]
47

58
* Validate dummy filter can not accept block

lib/datagrid/columns.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,9 @@ def define_column(columns, name, query = nil, **options, &block)
378378
end
379379

380380
position = Datagrid::Utils.extract_position_from_options(columns, options)
381+
unless position
382+
raise Datagrid::ConfigurationError, "#{self}##{options[:before] || options[:after]} column not found"
383+
end
381384
column = Datagrid::Columns::Column.new(
382385
self, name, query, options, &block
383386
)

lib/datagrid/filters.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,9 @@ def filter(name, type = :default, **options, &block)
244244
raise ConfigurationError, "filter class #{type.inspect} not found" unless klass
245245

246246
position = Datagrid::Utils.extract_position_from_options(filters_array, options)
247+
unless position
248+
raise Datagrid::ConfigurationError, "#{self}##{options[:before] || options[:after]} filter not found"
249+
end
247250
filter = klass.new(self, name, **options, &block)
248251
filters_array.insert(position, filter)
249252

lib/datagrid/utils.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,9 @@ def extract_position_from_options(array, options)
6868
array.index { |c| c.name.to_sym == before }
6969
elsif after
7070
after = after.to_sym
71-
array.index { |c| c.name.to_sym == after } + 1
71+
if index = array.index { |c| c.name.to_sym == after }
72+
index + 1
73+
end
7274
else
7375
-1
7476
end

spec/datagrid/columns_spec.rb

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -267,13 +267,43 @@ def show?
267267
end.to raise_error(Datagrid::ConfigurationError)
268268
end
269269

270-
it "raises when :before and :after used together" do
271-
expect do
272-
test_grid do
270+
describe "before and after options" do
271+
272+
it "can't be used together" do
273+
expect do
274+
test_grid do
275+
scope { Entry }
276+
column(:id)
277+
column(:name, before: :id, after: :name)
278+
end
279+
end.to raise_error(Datagrid::ConfigurationError)
280+
end
281+
282+
it "used to control columns order" do
283+
grid = test_grid do
284+
scope { Entry }
273285
column(:id)
274-
column(:name, before: :id, after: :name)
286+
column(:name, before: :id)
287+
column(:group, after: :name)
275288
end
276-
end.to raise_error(Datagrid::ConfigurationError)
289+
290+
expect(grid.columns.map(&:name)).to eq([:name, :group, :id])
291+
end
292+
293+
it "raises exception when column not found" do
294+
expect do
295+
test_grid do
296+
scope { Entry }
297+
column(:name, before: :id)
298+
end
299+
end.to raise_error(Datagrid::ConfigurationError)
300+
expect do
301+
test_grid do
302+
scope { Entry }
303+
column(:name, after: :id)
304+
end
305+
end.to raise_error(Datagrid::ConfigurationError)
306+
end
277307
end
278308

279309
describe ".column_names attributes" do

spec/datagrid/filters_spec.rb

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ def check_performed(value, result, **options)
112112
end
113113
end
114114

115-
describe "positioning filter before another" do
115+
describe "positioning filter" do
116116
it "inserts the filter before the specified element" do
117117
grid = test_grid do
118118
scope { Entry }
@@ -121,9 +121,7 @@ def check_performed(value, result, **options)
121121
end
122122
expect(grid.filters.index { |f| f.name == :name }).to eq(0)
123123
end
124-
end
125124

126-
describe "positioning filter after another" do
127125
it "inserts the filter before the specified element" do
128126
grid = test_grid do
129127
scope { Entry }
@@ -133,6 +131,21 @@ def check_performed(value, result, **options)
133131
end
134132
expect(grid.filters.index { |f| f.name == :group_id }).to eq(1)
135133
end
134+
135+
it "raises if filter not found" do
136+
expect do
137+
test_grid do
138+
scope { Entry }
139+
filter(:name, before: :id)
140+
end
141+
end.to raise_error(Datagrid::ConfigurationError)
142+
expect do
143+
test_grid do
144+
scope { Entry }
145+
filter(:name, after: :id)
146+
end
147+
end.to raise_error(Datagrid::ConfigurationError)
148+
end
136149
end
137150

138151
describe "#filter_by" do

0 commit comments

Comments
 (0)