active_scaffold 3.6.15 → 3.6.19
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 +4 -4
- data/CHANGELOG.rdoc +20 -1
- data/lib/active_scaffold/actions/common_search.rb +16 -0
- data/lib/active_scaffold/actions/core.rb +1 -2
- data/lib/active_scaffold/actions/field_search.rb +5 -9
- data/lib/active_scaffold/actions/list.rb +2 -1
- data/lib/active_scaffold/actions/nested.rb +10 -5
- data/lib/active_scaffold/actions/search.rb +1 -6
- data/lib/active_scaffold/bridges/paper_trail/actions.rb +1 -1
- data/lib/active_scaffold/data_structures/column.rb +0 -1
- data/lib/active_scaffold/data_structures/nested_info.rb +9 -1
- data/lib/active_scaffold/tableless.rb +30 -16
- data/lib/active_scaffold/version.rb +1 -1
- data/test/misc/tableless_test.rb +3 -2
- data/test/mock_app/app/models/file_model.rb +12 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f3e15dbddabba45c8d0c75e9cd91a00b805c2f8d9f229e8c4fc1a9bfa08136dd
|
4
|
+
data.tar.gz: 8be97ebe3447c4f77b55e69ee6e6d501c62f342ab49379303a9071c664590a5c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c351ddf8bbd11a8a2540a6f589197f68a9a520eaba6f446b2f53934dc1c100df14ebe99894d40a97f489a132002645c80db8aa4122bbf09e952f3f6f367a84ea
|
7
|
+
data.tar.gz: 35b42d0d6f2d8ffae123b046ede6b5761dfe9910f4922c3dbdf985899c30fbf36fc6696d774d486c888fae774a1c7e390a761fe4f97f8c804b3df1d9b57b95c2
|
data/CHANGELOG.rdoc
CHANGED
@@ -1,3 +1,22 @@
|
|
1
|
+
= 3.6.19
|
2
|
+
- Improve create action in has_many through singular association, supporting more cases
|
3
|
+
|
4
|
+
= 3.6.18
|
5
|
+
- Add references only for column.search_joins which are in column.includes, and do search_joins for the rest, search_joins default to includes, so won't change behaviour on most cases, but allows to preload some associations without joining in the query
|
6
|
+
- Don't define default search_joins, as it may return includes, so search_joins will default to includes unless is defined, and the previous change won't change the behaviour if user doesn't define search_joins
|
7
|
+
- Fix update_columns on through association
|
8
|
+
|
9
|
+
= 3.6.17
|
10
|
+
- Don't add includes or left joins for constrained columns, as they are ignored on sorting clause
|
11
|
+
- Fix deprecation on cache counts with rails 5, and fix the queries for rails >= 5.1
|
12
|
+
- Fix new for tableless models on rails 5.0
|
13
|
+
|
14
|
+
= 3.6.16
|
15
|
+
- Fix query on paper_trail action
|
16
|
+
- Fix one? on tableless relation
|
17
|
+
- Fix exists? on tableless relation
|
18
|
+
- Fix getting conditions from association in the tableless relation
|
19
|
+
|
1
20
|
= 3.6.15
|
2
21
|
- Prevent firing 2 change events on jquery datetime pickers
|
3
22
|
- Fix setting data options on columns for date and datetime pickers
|
@@ -62,7 +81,7 @@
|
|
62
81
|
= 3.6.1
|
63
82
|
- Display group cols vertically when subform layout is vertical
|
64
83
|
- Fix html attributes for input datetime on field search, when jquery ui is not used
|
65
|
-
- Fix constraint columns for nested list on through
|
84
|
+
- Fix constraint columns for nested list on through associations
|
66
85
|
- Support rails 6.1
|
67
86
|
|
68
87
|
= 3.6.0
|
@@ -31,6 +31,22 @@ module ActiveScaffold::Actions
|
|
31
31
|
params_hash params[:search]
|
32
32
|
end
|
33
33
|
|
34
|
+
def set_outer_joins_for_search(columns)
|
35
|
+
references = []
|
36
|
+
outer_joins = []
|
37
|
+
columns.each do |column|
|
38
|
+
next unless column.search_joins.present?
|
39
|
+
if column.includes.present? && list_columns.include?(column)
|
40
|
+
references << (column.search_joins & column.includes)
|
41
|
+
outer_joins << (column.search_joins - column.includes)
|
42
|
+
else
|
43
|
+
outer_joins << column.search_joins
|
44
|
+
end
|
45
|
+
end
|
46
|
+
active_scaffold_references.concat references.flatten.uniq.compact
|
47
|
+
active_scaffold_outer_joins.concat outer_joins.flatten.uniq.compact
|
48
|
+
end
|
49
|
+
|
34
50
|
def store_search_params_into_session
|
35
51
|
if active_scaffold_config.store_user_settings
|
36
52
|
if params[:search].present?
|
@@ -100,8 +100,7 @@ module ActiveScaffold::Actions
|
|
100
100
|
record = params[:id] ? copy_attributes(find_if_allowed(params[:id], :read)) : new_model
|
101
101
|
apply_constraints_to_record(record) unless scope || params[:id]
|
102
102
|
create_association_with_parent record, true if nested?
|
103
|
-
|
104
|
-
record.send "#{column.name}=", value
|
103
|
+
update_column_from_params(record, column, value, true)
|
105
104
|
record.id = params[:id]
|
106
105
|
record
|
107
106
|
end
|
@@ -161,10 +161,14 @@ module ActiveScaffold::Actions
|
|
161
161
|
search_condition = self.class.condition_for_column(column, value, text_search)
|
162
162
|
next if search_condition.blank?
|
163
163
|
|
164
|
-
joins_for_search_on_column(column, count_includes)
|
165
164
|
active_scaffold_conditions << search_condition
|
166
165
|
filtered_columns << column
|
167
166
|
end
|
167
|
+
if grouped_search? || active_scaffold_config.list.user.count_includes.present?
|
168
|
+
active_scaffold_outer_joins.concat filtered_columns.map(&:search_joins).flatten.uniq.compact
|
169
|
+
else
|
170
|
+
set_outer_joins_for_search filtered_columns
|
171
|
+
end
|
168
172
|
if filtered_columns.present? || grouped_search?
|
169
173
|
@filtered = active_scaffold_config.field_search.human_conditions ? filtered_columns : true
|
170
174
|
end
|
@@ -172,14 +176,6 @@ module ActiveScaffold::Actions
|
|
172
176
|
active_scaffold_config.list.user.page = nil
|
173
177
|
end
|
174
178
|
|
175
|
-
def joins_for_search_on_column(column, count_includes)
|
176
|
-
if count_includes.nil? && column.includes.present? && list_columns.include?(column) && !grouped_search?
|
177
|
-
active_scaffold_references << column.includes
|
178
|
-
elsif column.search_joins.present?
|
179
|
-
active_scaffold_outer_joins << column.search_joins
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
179
|
def field_search_ignore?
|
184
180
|
active_scaffold_config.list.always_show_search && active_scaffold_config.list.search_partial == 'field_search'
|
185
181
|
end
|
@@ -83,6 +83,7 @@ module ActiveScaffold::Actions
|
|
83
83
|
|
84
84
|
def set_includes_for_sorting(columns, sorting)
|
85
85
|
sorting.each_column do |col|
|
86
|
+
next if sorting.constraint_columns.include? col.name
|
86
87
|
next unless col.includes.present? && !columns.include?(col)
|
87
88
|
if active_scaffold_config.model.connection.needs_order_expressions_in_select?
|
88
89
|
active_scaffold_references << col.includes
|
@@ -176,7 +177,7 @@ module ActiveScaffold::Actions
|
|
176
177
|
query = active_scaffold_config.model.where(active_scaffold_config.primary_key => records.map(&:id))
|
177
178
|
.joins(column.name).group(active_scaffold_config.primary_key)
|
178
179
|
.select("#{klass.quoted_table_name}.#{klass.quoted_primary_key}")
|
179
|
-
query = query.
|
180
|
+
query = query.distinct if column.association.scope && klass.instance_exec(&column.association.scope).values[:distinct]
|
180
181
|
query
|
181
182
|
end
|
182
183
|
|
@@ -122,16 +122,21 @@ module ActiveScaffold::Actions
|
|
122
122
|
# has_many is done by beginning_of_chain and rails if direct association, not in through associations
|
123
123
|
return false if nested.has_many? && !nested.association.through?
|
124
124
|
return false if check_match && !nested.match_model?(active_scaffold_config.model)
|
125
|
-
nested.child_association && nested_parent_record
|
125
|
+
(nested.child_association || nested.create_through_singular?) && nested_parent_record
|
126
126
|
end
|
127
127
|
|
128
128
|
def create_association_with_parent(record, check_match = false)
|
129
129
|
return unless create_association_with_parent?(check_match)
|
130
|
-
if nested.child_association
|
130
|
+
if nested.child_association&.singular?
|
131
131
|
record.send("#{nested.child_association.name}=", nested_parent_record)
|
132
|
-
elsif nested.
|
133
|
-
through = nested_parent_record.send(nested.association.through_reflection.name)
|
134
|
-
|
132
|
+
elsif nested.create_through_singular?
|
133
|
+
through = nested_parent_record.send(nested.association.through_reflection.name) ||
|
134
|
+
nested_parent_record.send("build_#{nested.association.through_reflection.name}")
|
135
|
+
if nested.source_reflection.reverse_association.collection?
|
136
|
+
record.send(nested.source_reflection.reverse) << through
|
137
|
+
else
|
138
|
+
record.send("#{nested.source_reflection.reverse}=", through)
|
139
|
+
end
|
135
140
|
else
|
136
141
|
record.send(nested.child_association.name) << nested_parent_record
|
137
142
|
end
|
@@ -26,12 +26,7 @@ module ActiveScaffold::Actions
|
|
26
26
|
@filtered = search_conditions.present?
|
27
27
|
active_scaffold_conditions.concat search_conditions if @filtered
|
28
28
|
|
29
|
-
|
30
|
-
column.includes.present? && list_columns.include?(column)
|
31
|
-
end
|
32
|
-
active_scaffold_references.concat references.map(&:includes).flatten.uniq.compact
|
33
|
-
active_scaffold_outer_joins.concat outer_joins.map(&:search_joins).flatten.uniq.compact
|
34
|
-
|
29
|
+
set_outer_joins_for_search columns
|
35
30
|
active_scaffold_config.list.user.page = nil
|
36
31
|
else
|
37
32
|
super
|
@@ -10,7 +10,7 @@ module ActiveScaffold::Actions
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def deleted
|
13
|
-
query = PaperTrail::Version.destroys.where(:item_type => active_scaffold_config.model)
|
13
|
+
query = PaperTrail::Version.destroys.where(:item_type => active_scaffold_config.model.name)
|
14
14
|
if nested? && nested.child_association&.belongs_to? && PaperTrail::Version.respond_to?(:where_object)
|
15
15
|
query = query.where_object(nested.child_association.foreign_key => nested.parent_id)
|
16
16
|
end
|
@@ -353,7 +353,6 @@ module ActiveScaffold::DataStructures
|
|
353
353
|
if delegated_association
|
354
354
|
self.includes = includes ? [delegated_association.name => includes] : [delegated_association.name]
|
355
355
|
end
|
356
|
-
self.search_joins = includes.clone if includes
|
357
356
|
|
358
357
|
# default all the configurable variables
|
359
358
|
self.css_class = ''
|
@@ -94,12 +94,20 @@ module ActiveScaffold::DataStructures
|
|
94
94
|
return false unless through_association?
|
95
95
|
return true if association.through_reflection.options[:through] # create not possible, too many levels
|
96
96
|
return true if association.source_reflection.options[:through] # create not possible, too many levels
|
97
|
-
return false if
|
97
|
+
return false if create_through_singular? # create allowed, AS has code for this
|
98
98
|
|
99
99
|
# create allowed only if through reflection in record to be created is included in create columns
|
100
100
|
!child_association || !columns.include?(child_association.through_reflection.name)
|
101
101
|
end
|
102
102
|
|
103
|
+
def create_through_singular?
|
104
|
+
association.through_singular? && source_reflection.reverse
|
105
|
+
end
|
106
|
+
|
107
|
+
def source_reflection
|
108
|
+
@source_reflection ||= ActiveScaffold::DataStructures::Association::ActiveRecord.new(association.source_reflection)
|
109
|
+
end
|
110
|
+
|
103
111
|
def through_association?
|
104
112
|
association.through?
|
105
113
|
end
|
@@ -76,6 +76,10 @@ class ActiveScaffold::Tableless < ActiveRecord::Base # rubocop:disable Rails/App
|
|
76
76
|
super.tap do |scope|
|
77
77
|
if klass < ActiveScaffold::Tableless
|
78
78
|
class << scope; include RelationExtension; end
|
79
|
+
assoc_conditions = scope.proxy_association&.send(:association_scope)&.conditions
|
80
|
+
if assoc_conditions&.present?
|
81
|
+
scope.conditions.concat(assoc_conditions.map { |c| c.is_a?(Hash) ? c[klass.table_name] || c : c })
|
82
|
+
end
|
79
83
|
end
|
80
84
|
end
|
81
85
|
end
|
@@ -112,8 +116,6 @@ class ActiveScaffold::Tableless < ActiveRecord::Base # rubocop:disable Rails/App
|
|
112
116
|
end
|
113
117
|
|
114
118
|
module RelationExtension
|
115
|
-
attr_reader :conditions
|
116
|
-
|
117
119
|
def initialize(klass, *)
|
118
120
|
super
|
119
121
|
@conditions ||= []
|
@@ -124,6 +126,10 @@ class ActiveScaffold::Tableless < ActiveRecord::Base # rubocop:disable Rails/App
|
|
124
126
|
super
|
125
127
|
end
|
126
128
|
|
129
|
+
def conditions
|
130
|
+
@conditions ||= []
|
131
|
+
end
|
132
|
+
|
127
133
|
def where(opts, *rest)
|
128
134
|
if opts.present?
|
129
135
|
opts = opts.with_indifferent_access if opts.is_a? Hash
|
@@ -131,6 +137,7 @@ class ActiveScaffold::Tableless < ActiveRecord::Base # rubocop:disable Rails/App
|
|
131
137
|
end
|
132
138
|
self
|
133
139
|
end
|
140
|
+
alias where! where
|
134
141
|
|
135
142
|
def merge(rel)
|
136
143
|
super.tap do |merged|
|
@@ -140,14 +147,13 @@ class ActiveScaffold::Tableless < ActiveRecord::Base # rubocop:disable Rails/App
|
|
140
147
|
|
141
148
|
def except(*skips)
|
142
149
|
super.tap do |new_relation|
|
143
|
-
|
150
|
+
unless new_relation.is_a?(RelationExtension)
|
151
|
+
class << new_relation; include RelationExtension; end
|
152
|
+
end
|
153
|
+
new_relation.conditions.concat conditions unless skips.include? :where
|
144
154
|
end
|
145
155
|
end
|
146
156
|
|
147
|
-
def to_a
|
148
|
-
@klass.find_all(self)
|
149
|
-
end
|
150
|
-
|
151
157
|
def find_one(id)
|
152
158
|
@klass.find_one(id, self) || raise(ActiveRecord::RecordNotFound)
|
153
159
|
end
|
@@ -161,7 +167,15 @@ class ActiveScaffold::Tableless < ActiveRecord::Base # rubocop:disable Rails/App
|
|
161
167
|
end
|
162
168
|
|
163
169
|
def exists?
|
164
|
-
|
170
|
+
size.positive?
|
171
|
+
end
|
172
|
+
|
173
|
+
private
|
174
|
+
|
175
|
+
def exec_queries
|
176
|
+
@records = @klass.find_all(self)
|
177
|
+
@loaded = true
|
178
|
+
@records
|
165
179
|
end
|
166
180
|
end
|
167
181
|
|
@@ -203,15 +217,15 @@ class ActiveScaffold::Tableless < ActiveRecord::Base # rubocop:disable Rails/App
|
|
203
217
|
end
|
204
218
|
end
|
205
219
|
end
|
206
|
-
|
207
|
-
def self.columns_hash
|
208
|
-
if self < ActiveScaffold::Tableless
|
209
|
-
@columns_hash ||= Hash[columns.map { |c| [c.name, c] }]
|
210
|
-
else
|
211
|
-
super
|
212
|
-
end
|
213
|
-
end
|
214
220
|
if Rails.version < '5.0' # 4.2.x
|
221
|
+
def self.columns_hash
|
222
|
+
if self < ActiveScaffold::Tableless
|
223
|
+
@columns_hash ||= Hash[columns.map { |c| [c.name, c] }]
|
224
|
+
else
|
225
|
+
super
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
215
229
|
def self.initialize_find_by_cache
|
216
230
|
self.find_by_statement_cache = Hash.new { |h, k| h[k] = StatementCache.new(k) } # rubocop:disable Rails/DynamicFindBy
|
217
231
|
end
|
data/test/misc/tableless_test.rb
CHANGED
@@ -27,8 +27,9 @@ class TablelessTest < MiniTest::Test
|
|
27
27
|
assert Person.new.files.empty?
|
28
28
|
@person = Person.new
|
29
29
|
@person.save(validate: false)
|
30
|
-
assert
|
31
|
-
|
30
|
+
assert !@person.files.empty?
|
31
|
+
assert @person.files.all.exists?
|
32
|
+
assert_equal @person.id, @person.files.first.person_id
|
32
33
|
end
|
33
34
|
|
34
35
|
def test_tableless_assoc_with_dependent
|
@@ -6,6 +6,18 @@ class FileModel < ActiveScaffold::Tableless
|
|
6
6
|
belongs_to :person
|
7
7
|
|
8
8
|
def self.find_all(relation)
|
9
|
+
relation.conditions&.each&.with_index do |condition, i|
|
10
|
+
person_id =
|
11
|
+
case condition
|
12
|
+
when Hash
|
13
|
+
condition[:person_id]
|
14
|
+
when Arel::Nodes::Equality
|
15
|
+
if condition.left.name.to_sym == :person_id
|
16
|
+
relation.bind_values[i].present? ? relation.bind_values[i][1] : condition.right.first
|
17
|
+
end
|
18
|
+
end
|
19
|
+
return [new(person_id: person_id)] if person_id
|
20
|
+
end
|
9
21
|
[]
|
10
22
|
end
|
11
23
|
|
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.6.
|
4
|
+
version: 3.6.19
|
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:
|
11
|
+
date: 2023-06-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|