active_scaffold 3.7.5 → 3.7.6

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ba64ea5cfd0c7476b2a534dd60d646c9b25b00f86278873e132d930336007673
4
- data.tar.gz: 5ec04a9180e01392a6718ba25453a2731819a53551ef15de1e58e207533b1881
3
+ metadata.gz: cfe45d0a0b28f5cb324e7104add97e7a105de6986accf8d64db02cf5f65f19ea
4
+ data.tar.gz: f8461b6a58ce6b1c93df2eaf95540a759fdcd73d21f256ee1a38ea4436b73987
5
5
  SHA512:
6
- metadata.gz: 67a8322a087fbb94b4c2b51d2bb8a4687fe76e0d4c73eae18d57b30d2457fb85bbe30d67c5b84a1e3b6dfd0100710b79cd304d81cac087d49f9f0967900343df
7
- data.tar.gz: ff5d7ae043ba814460a375d3f146115fc8b9fd0a21b5d9ea7c31410ff52b85c83641d27ac5ab9c99724b22e38265542eb141c8eafd64ba173e76e0c4145ecefb
6
+ metadata.gz: a65de91f886605e57d0f183295d9d1f8ea358b4657826143265f8359f4d41761b6325644fcb6d5dc1d5e5d4b87bbc966bf8cd9d4ee66db0ae4048455eb0c6b62
7
+ data.tar.gz: 9fb4e3b6a38c5f340cdf430146ae9616a5e9a93e66c11e32dece9cb5704229499610da861916371e3bafb973d43705c9716228b5d04c50f896d5538320e0125c
data/CHANGELOG.rdoc CHANGED
@@ -1,3 +1,8 @@
1
+ = 3.7.6
2
+ - Respect :label_method set in form_ui_options on list.
3
+ - Fix grouped search for PostgreSQL
4
+ - Fix loading current search params when search form is open and store_user_settings is disabled
5
+
1
6
  = 3.7.5
2
7
  - Fix always show search for nested list on multi-level through associations
3
8
  - Support changing step, min and max options with column options or search_ui options for decimal and integer search_ui
@@ -3,9 +3,9 @@ module ActiveScaffold::Actions
3
3
  def self.included(base)
4
4
  return if base < InstanceMethods
5
5
  base.send :include, InstanceMethods
6
- base.before_action :search_authorized_filter, :only => :show_search
7
- base.before_action :store_search_params_into_session, :only => [:index]
8
- base.before_action :do_search, :only => [:index]
6
+ base.before_action :search_authorized_filter, only: :show_search
7
+ base.before_action :store_search_params_into_session, :only => %i[index show_search]
8
+ base.before_action :do_search, only: [:index]
9
9
  base.helper_method :search_params
10
10
  end
11
11
 
@@ -56,25 +56,33 @@ module ActiveScaffold::Actions
56
56
 
57
57
  def custom_finder_options
58
58
  if grouped_search?
59
- group_sql = calculation_for_group_by(search_group_column&.field || search_group_name)
60
- select_query = grouped_search_select
61
- select_query << group_sql.as(search_group_column.name.to_s) if search_group_column && group_sql.respond_to?(:to_sql)
62
- {group: group_sql, select: select_query}
59
+ grouped_search_finder_options
63
60
  else
64
61
  super
65
62
  end
66
63
  end
67
64
 
65
+ def grouped_search_finder_options
66
+ group_sql = calculation_for_group_by(search_group_column&.field || search_group_name, search_group_function) if search_group_function
67
+ group_by = group_sql&.to_sql || quoted_select_columns(search_group_column&.select_columns || [search_group_name])
68
+ select_query = grouped_search_select + (group_sql ? [group_sql.as(search_group_column.name.to_s)] : group_by)
69
+ {group: group_by, select: select_query, reorder: grouped_sorting(group_by)}
70
+ end
71
+
68
72
  def grouped_search_select
69
- select_query = quoted_select_columns(search_group_column&.select_columns || [search_group_name])
70
- if active_scaffold_config.model.columns_hash.include?(active_scaffold_config.model.inheritance_column)
71
- select_query << active_scaffold_config.columns[active_scaffold_config.model.inheritance_column].field
72
- end
73
- grouped_columns_calculations.each do |name, part|
74
- select_query << (part.respond_to?(:as) ? part : Arel::Nodes::SqlLiteral.new(part)).as(name.to_s)
73
+ grouped_columns_calculations.map do |name, part|
74
+ (part.respond_to?(:as) ? part : Arel::Nodes::SqlLiteral.new(part)).as(name.to_s)
75
75
  end
76
76
  end
77
77
 
78
+ def grouped_sorting(group_sql)
79
+ return unless search_group_column && active_scaffold_config.list.user.sorting
80
+ group_sort = search_group_function ? group_sql : search_group_column.sort[:sql] if search_group_column.sortable?
81
+ grouped_columns = grouped_columns_calculations.merge(search_group_column.name => group_sort)
82
+ sorting = active_scaffold_config.list.user.sorting.clause(grouped_columns)
83
+ active_scaffold_config.active_record? ? sorting&.map(&Arel.method(:sql)) : sorting
84
+ end
85
+
78
86
  def grouped_columns_calculations
79
87
  @grouped_columns_calculations ||= list_columns[1..-1].each_with_object({}) do |c, h|
80
88
  h[c.name] = calculation_for_group_search(c)
@@ -85,21 +93,24 @@ module ActiveScaffold::Actions
85
93
  sql_function column.calculate.to_s, column.active_record_class.arel_table[column.name]
86
94
  end
87
95
 
88
- def calculation_for_group_by(group_sql)
89
- return group_sql unless search_group_function
96
+ def calculation_for_group_by(group_sql, group_function)
90
97
  group_sql = Arel::Nodes::SqlLiteral.new(group_sql)
91
- case search_group_function
98
+ case group_function
92
99
  when 'year', 'month', 'quarter'
93
- sql_function(search_group_function, group_sql)
100
+ extract_sql_fn(group_function, group_sql)
94
101
  when 'year_month'
95
- sql_function('extract', sql_operator(Arel::Nodes::SqlLiteral.new('YEAR_MONTH'), 'FROM', group_sql))
102
+ sql_operator(sql_operator(extract_sql_fn('year', group_sql), '*', 100), '+', extract_sql_fn('month', group_sql))
96
103
  when 'year_quarter'
97
- sql_operator(sql_operator(sql_function('year', group_sql), '*', 10), '+', sql_function('quarter', group_sql))
104
+ sql_operator(sql_operator(extract_sql_fn('year', group_sql), '*', 10), '+', extract_sql_fn('quarter', group_sql))
98
105
  else
99
- raise "#{search_group_function} unsupported, override calculation_for_group_by in #{self.class.name}"
106
+ raise "#{group_function} unsupported, override calculation_for_group_by in #{self.class.name}"
100
107
  end
101
108
  end
102
109
 
110
+ def extract_sql_fn(part, column)
111
+ sql_function('extract', sql_operator(Arel::Nodes::SqlLiteral.new(part), 'FROM', column))
112
+ end
113
+
103
114
  def sql_function(function, *args)
104
115
  args.map! { |arg| quoted_arel_value(arg) }
105
116
  Arel::Nodes::NamedFunction.new(function, args)
@@ -121,14 +121,14 @@ module ActiveScaffold::DataStructures
121
121
  end
122
122
 
123
123
  # builds an order-by clause
124
- def clause(grouped_columns_calculations = nil)
124
+ def clause(grouped_columns = nil)
125
125
  return nil if sorts_by_method? || default_sorting?
126
126
 
127
127
  # unless the sorting is by method, create the sql string
128
128
  order = []
129
129
  each do |sort_column, sort_direction|
130
130
  next if constraint_columns.include? sort_column.name
131
- sql = grouped_columns_calculations&.dig(sort_column.name) || sort_column.sort[:sql]
131
+ sql = grouped_columns ? grouped_columns[sort_column.name] : sort_column.sort[:sql]
132
132
  next if sql.blank?
133
133
  sql = sql.to_sql if sql.respond_to?(:to_sql)
134
134
 
@@ -138,7 +138,7 @@ module ActiveScaffold::DataStructures
138
138
  order << parts
139
139
  end
140
140
 
141
- order << @primary_key_order_clause if @sorting_by_primary_key
141
+ order << @primary_key_order_clause if @sorting_by_primary_key && grouped_columns.nil?
142
142
  order.flatten!(1)
143
143
  order unless order.empty?
144
144
  end
@@ -577,7 +577,7 @@ module ActiveScaffold
577
577
  def finder_options(options = {})
578
578
  search_conditions = all_conditions
579
579
 
580
- sorting = options[:sorting]&.clause((grouped_columns_calculations if grouped_search?))
580
+ sorting = options[:sorting]&.clause
581
581
  sorting = sorting.map(&Arel.method(:sql)) if sorting && active_scaffold_config.active_record?
582
582
  # create a general-use options array that's compatible with Rails finders
583
583
  finder_options = {
@@ -226,7 +226,10 @@ module ActiveScaffold
226
226
  I18n.t(options[:group_format] || search_group_function, scope: 'date.formats', num: value)
227
227
  when 'month'
228
228
  I18n.l(Date.new(Time.zone.today.year, value, 1), format: options[:group_format] || search_group_function.to_sym)
229
- else value
229
+ when 'year'
230
+ value.to_i
231
+ else
232
+ value
230
233
  end
231
234
  end
232
235
 
@@ -263,7 +266,7 @@ module ActiveScaffold
263
266
  end
264
267
 
265
268
  def format_association_value(value, column, size)
266
- method = column.options[:label_method] || :to_label
269
+ method = (column.list_ui_options || column.options)[:label_method] || :to_label
267
270
  value =
268
271
  if column.association.collection?
269
272
  format_collection_association_value(value, column, method, size)
@@ -2,7 +2,7 @@ module ActiveScaffold
2
2
  module Version
3
3
  MAJOR = 3
4
4
  MINOR = 7
5
- PATCH = 5
5
+ PATCH = 6
6
6
  FIX = nil
7
7
 
8
8
  STRING = [MAJOR, MINOR, PATCH, FIX].compact.join('.')
@@ -75,13 +75,13 @@ class FinderTest < Minitest::Test
75
75
 
76
76
  def test_condition_for_column
77
77
  column = ActiveScaffold::DataStructures::Column.new('adult', Person)
78
- assert_equal ['"people"."adult" = ?', false], ClassWithFinder.condition_for_column(column, '0')
78
+ assert_equal ['"people"."adult" = ?', false], ClassWithFinder.condition_for_column(column, '0', :full, {})
79
79
  end
80
80
 
81
81
  def test_condition_for_polymorphic_column
82
82
  column = ActiveScaffold::DataStructures::Column.new('addressable', Address)
83
83
  column.search_sql = [{subquery: [Building, 'name']}]
84
- condition = ClassWithFinder.condition_for_column(column, 'test search')
84
+ condition = ClassWithFinder.condition_for_column(column, 'test search', :full, {})
85
85
  assert_equal Building.where(['name LIKE ?', '%test search%']).select(:id).to_sql, condition[1].to_sql
86
86
  assert_equal '"addresses"."addressable_id" IN (?) AND "addresses"."addressable_type" = ?', condition[0]
87
87
  assert_equal ['Building'], condition[2..-1]
@@ -90,7 +90,7 @@ class FinderTest < Minitest::Test
90
90
  def test_condition_for_polymorphic_column_with_relation
91
91
  column = ActiveScaffold::DataStructures::Column.new('contactable', Contact)
92
92
  column.search_sql = [{subquery: [Person.joins(:buildings), 'first_name', 'last_name']}]
93
- condition = ClassWithFinder.condition_for_column(column, 'test search')
93
+ condition = ClassWithFinder.condition_for_column(column, 'test search', :full, {})
94
94
  assert_equal Person.joins(:buildings).where(['first_name LIKE ? OR last_name LIKE ?', '%test search%', '%test search%']).select(:id).to_sql, condition[1].to_sql
95
95
  assert_equal '"contacts"."contactable_id" IN (?) AND "contacts"."contactable_type" = ?', condition[0]
96
96
  assert_equal ['Person'], condition[2..-1]
@@ -100,7 +100,7 @@ class FinderTest < Minitest::Test
100
100
  column = ActiveScaffold::DataStructures::Column.new('owner', Building)
101
101
  column.search_sql = [{subquery: [Person, 'first_name', 'last_name'], conditions: ['floor_count > 0']}]
102
102
  column.search_ui = :text
103
- condition = ClassWithFinder.condition_for_column(column, 'test search')
103
+ condition = ClassWithFinder.condition_for_column(column, 'test search', :full, {})
104
104
  assert_equal Person.where(['first_name LIKE ? OR last_name LIKE ?', '%test search%', '%test search%']).select(:id).to_sql, condition[1].to_sql
105
105
  assert_equal '"buildings"."owner_id" IN (?) AND floor_count > 0', condition[0]
106
106
  assert_equal [], condition[2..-1]
@@ -110,7 +110,7 @@ class FinderTest < Minitest::Test
110
110
  column = ActiveScaffold::DataStructures::Column.new('owner', Building)
111
111
  column.search_sql = [{subquery: [Person, 'first_name', 'last_name'], conditions: ['floor_count > 0 AND name != ?', '']}]
112
112
  column.search_ui = :text
113
- condition = ClassWithFinder.condition_for_column(column, 'test search')
113
+ condition = ClassWithFinder.condition_for_column(column, 'test search', :full, {})
114
114
  assert_equal Person.where(['first_name LIKE ? OR last_name LIKE ?', '%test search%', '%test search%']).select(:id).to_sql, condition[1].to_sql
115
115
  assert_equal '"buildings"."owner_id" IN (?) AND floor_count > 0 AND name != ?', condition[0]
116
116
  assert_equal [''], condition[2..-1]
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_scaffold
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.7.5
4
+ version: 3.7.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Many, see README
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-06-18 00:00:00.000000000 Z
11
+ date: 2024-06-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails