brick 1.0.148 → 1.0.150
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/brick/extensions.rb +96 -9
- data/lib/brick/frameworks/rails/engine.rb +12 -9
- data/lib/brick/frameworks/rails/form_builder.rb +1 -1
- data/lib/brick/version_number.rb +1 -1
- 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: 7914cc56d8cd8919835028d5ad9b05a50a2b17baf32c9699d1f78bbaf9417e0d
|
4
|
+
data.tar.gz: a7f945e136fe8401c54e8fd24a4d92a5cef24b22bb68d2caceac28d809ff8f07
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fa3ed344e3d4beed83cf9a6fd7059d78032497f8a6c51c825fd50d163e61bd8029afe3dd82e055631d8258b0c9cf54f7d176e064c47fe9fb5a70cc25cdb67faf
|
7
|
+
data.tar.gz: e43ca92a155c805d4dc5be0a2548d9612bc0b1a92cb2e65722ca4c55c81dbef9b476493d6764eece75489e9caf60e2a1046ca960d9a58cafe060aeae11db954a
|
data/lib/brick/extensions.rb
CHANGED
@@ -95,7 +95,7 @@ module ActiveRecord
|
|
95
95
|
return @_brick_primary_key if instance_variable_defined?(:@_brick_primary_key)
|
96
96
|
|
97
97
|
pk = begin
|
98
|
-
primary_key.is_a?(String) ? [primary_key] : primary_key || []
|
98
|
+
primary_key.is_a?(String) ? [primary_key] : primary_key.dup || []
|
99
99
|
rescue
|
100
100
|
[]
|
101
101
|
end
|
@@ -907,7 +907,7 @@ JOIN (SELECT #{hm_selects.map { |s| _br_quoted_name("#{'br_t0.' if from_clause}#
|
|
907
907
|
s << v
|
908
908
|
end
|
909
909
|
else # String stuff (which defines a custom ORDER BY) just comes straight through
|
910
|
-
v = v.split('.').map { |x| _br_quoted_name(x) }.join('.')
|
910
|
+
# v = v.split('.').map { |x| _br_quoted_name(x) }.join('.')
|
911
911
|
s << v
|
912
912
|
# Avoid "PG::InvalidColumnReference: ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list" in Postgres
|
913
913
|
selects << v if is_distinct
|
@@ -1695,7 +1695,7 @@ class Object
|
|
1695
1695
|
when Symbol
|
1696
1696
|
order_tbl[order_default] || order_default
|
1697
1697
|
else
|
1698
|
-
pk.map { |part| "#{table_name}.#{part}"}
|
1698
|
+
pk.map { |part| "#{table_name}.#{part}"} # If it's not a custom ORDER BY, just use the key
|
1699
1699
|
end
|
1700
1700
|
end
|
1701
1701
|
|
@@ -2238,12 +2238,7 @@ class Object
|
|
2238
2238
|
|
2239
2239
|
if is_need_params
|
2240
2240
|
code << " def #{params_name}\n"
|
2241
|
-
permits = model.columns_hash.keys.map(&:to_sym)
|
2242
|
-
permits_txt = permits.map(&:inspect) +
|
2243
|
-
model.reflect_on_all_associations.select { |assoc| assoc.macro == :has_many && assoc.options[:through] }.map do |assoc|
|
2244
|
-
permits << { "#{assoc.name.to_s.singularize}_ids".to_sym => [] }
|
2245
|
-
"#{assoc.name.to_s.singularize}_ids: []"
|
2246
|
-
end
|
2241
|
+
permits_txt = self._brick_find_permits(model, (permits = model.columns_hash.keys.map(&:to_sym)))
|
2247
2242
|
code << " params.require(:#{require_name = model.name.underscore.tr('/', '_')
|
2248
2243
|
}).permit(#{permits_txt.join(', ')})\n"
|
2249
2244
|
code << " end\n"
|
@@ -2259,6 +2254,98 @@ class Object
|
|
2259
2254
|
[built_controller, code]
|
2260
2255
|
end
|
2261
2256
|
|
2257
|
+
def _brick_find_permits(model, current_permits)
|
2258
|
+
model.reflect_on_all_associations.select { |assoc| assoc.macro == :has_many }.each_with_object([]) do |assoc, s|
|
2259
|
+
if assoc.options[:through]
|
2260
|
+
current_permits << { "#{assoc.name.to_s.singularize}_ids".to_sym => [] }
|
2261
|
+
s << "#{assoc.name.to_s.singularize}_ids: []"
|
2262
|
+
elsif assoc.active_record.instance_methods.include?(:"#{assoc.name}_attributes=")
|
2263
|
+
# Support nested attributes which use the friendly_id gem
|
2264
|
+
self._brick_nested_friendly_id if Object.const_defined?('FriendlyId') &&
|
2265
|
+
assoc.klass.instance_variable_get(:@friendly_id_config)
|
2266
|
+
new_attrib_text = self._brick_find_permits(assoc.klass, (new_permits = assoc.klass.columns_hash.keys.map(&:to_sym)))
|
2267
|
+
new_permits << :_destroy
|
2268
|
+
current_permits << { "#{assoc.name}_attributes".to_sym => new_permits }
|
2269
|
+
s << "#{assoc.name}_attributes: #{new_attrib_text}"
|
2270
|
+
end
|
2271
|
+
end
|
2272
|
+
current_permits
|
2273
|
+
end
|
2274
|
+
|
2275
|
+
def _brick_nested_friendly_id
|
2276
|
+
unless @_brick_nested_friendly_id
|
2277
|
+
::ActiveRecord::Base.class_exec do
|
2278
|
+
if private_instance_methods.include?(:assign_nested_attributes_for_collection_association)
|
2279
|
+
alias _brick_anafca assign_nested_attributes_for_collection_association
|
2280
|
+
def assign_nested_attributes_for_collection_association(association_name, attributes_collection)
|
2281
|
+
association = association(association_name)
|
2282
|
+
slug_column = association.klass.instance_variable_get(:@friendly_id_config)&.slug_column
|
2283
|
+
return _brick_anafca unless slug_column
|
2284
|
+
|
2285
|
+
# Here is the FriendlyId version of #assign_nested_attributes_for_collection_association
|
2286
|
+
options = nested_attributes_options[association_name]
|
2287
|
+
attributes_collection = attributes_collection.to_h if attributes_collection.respond_to?(:permitted?)
|
2288
|
+
|
2289
|
+
unless attributes_collection.is_a?(Hash) || attributes_collection.is_a?(Array)
|
2290
|
+
raise ArgumentError, "Hash or Array expected for attribute `#{association_name}`, got #{attributes_collection.class.name} (#{attributes_collection.inspect})"
|
2291
|
+
end
|
2292
|
+
|
2293
|
+
check_record_limit!(options[:limit], attributes_collection)
|
2294
|
+
|
2295
|
+
if attributes_collection.is_a? Hash
|
2296
|
+
keys = attributes_collection.keys
|
2297
|
+
attributes_collection = if keys.include?("id") || keys.include?(:id)
|
2298
|
+
[attributes_collection]
|
2299
|
+
else
|
2300
|
+
attributes_collection.values
|
2301
|
+
end
|
2302
|
+
end
|
2303
|
+
existing_records = if association.loaded?
|
2304
|
+
association.target
|
2305
|
+
else
|
2306
|
+
attribute_ids = attributes_collection.filter_map { |a| a["id"] || a[:id] }
|
2307
|
+
if attribute_ids.empty?
|
2308
|
+
[]
|
2309
|
+
else # Implement the same logic as "friendly" scope
|
2310
|
+
association.scope.where(association.klass.primary_key => attribute_ids)
|
2311
|
+
.or(association.scope.where(slug_column => attribute_ids))
|
2312
|
+
end
|
2313
|
+
end
|
2314
|
+
attributes_collection.each do |attributes|
|
2315
|
+
attributes = attributes.to_h if attributes.respond_to?(:permitted?)
|
2316
|
+
attributes = attributes.with_indifferent_access
|
2317
|
+
if attributes["id"].blank? && attributes[slug_column].blank?
|
2318
|
+
unless reject_new_record?(association_name, attributes)
|
2319
|
+
association.reader.build(attributes.except(*::ActiveRecord::Base::UNASSIGNABLE_KEYS))
|
2320
|
+
end
|
2321
|
+
elsif (attr_id_str = attributes["id"].to_s) &&
|
2322
|
+
(existing_record = existing_records.detect { |record| record.id.to_s == attr_id_str ||
|
2323
|
+
record.send(slug_column).to_s == attr_id_str })
|
2324
|
+
unless call_reject_if(association_name, attributes)
|
2325
|
+
# Make sure we are operating on the actual object which is in the association's
|
2326
|
+
# proxy_target array (either by finding it, or adding it if not found)
|
2327
|
+
# Take into account that the proxy_target may have changed due to callbacks
|
2328
|
+
target_record = association.target.detect { |record| record.id.to_s == attr_id_str ||
|
2329
|
+
record.send(slug_column).to_s == attr_id_str }
|
2330
|
+
if target_record
|
2331
|
+
existing_record = target_record
|
2332
|
+
else
|
2333
|
+
association.add_to_target(existing_record, skip_callbacks: true)
|
2334
|
+
end
|
2335
|
+
|
2336
|
+
assign_to_or_mark_for_destruction(existing_record, attributes, options[:allow_destroy])
|
2337
|
+
end
|
2338
|
+
else
|
2339
|
+
raise_nested_attributes_record_not_found!(association_name, attributes["id"])
|
2340
|
+
end
|
2341
|
+
end
|
2342
|
+
end # anafca
|
2343
|
+
end
|
2344
|
+
end if ::ActiveRecord::QueryMethods.instance_methods.include?(:or)
|
2345
|
+
@_brick_nested_friendly_id = true
|
2346
|
+
end
|
2347
|
+
end
|
2348
|
+
|
2262
2349
|
def _brick_get_hm_assoc_name(relation, hm_assoc, source = nil)
|
2263
2350
|
assoc_name, needs_class = if (relation[:hm_counts][hm_assoc[:inverse_table]]&.> 1) &&
|
2264
2351
|
hm_assoc[:alternate_name] != (source || name.underscore)
|
@@ -46,12 +46,12 @@ module Brick
|
|
46
46
|
end
|
47
47
|
end
|
48
48
|
unless val_err || val.nil?
|
49
|
-
if (geometry = RGeo::WKRep::WKBParser.new.parse(val.pack('c*'))).is_a?(RGeo::Cartesian::PointImpl)
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
49
|
+
val = if ((geometry = RGeo::WKRep::WKBParser.new.parse(val.pack('c*'))).is_a?(RGeo::Cartesian::PointImpl) ||
|
50
|
+
geometry.is_a?(RGeo::Geos::CAPIPointImpl)) &&
|
51
|
+
!(geometry.y == 0.0 && geometry.x == 0.0)
|
52
|
+
# Create a POINT link to this style of Google maps URL: https://www.google.com/maps/place/38.7071296+-121.2810649/@38.7071296,-121.2810649,12z
|
53
|
+
"<a href=\"https://www.google.com/maps/place/#{geometry.y}+#{geometry.x}/@#{geometry.y},#{geometry.x},12z\" target=\"blank\">#{geometry.to_s}</a>"
|
54
|
+
end
|
55
55
|
end
|
56
56
|
val_err || val
|
57
57
|
else
|
@@ -1760,14 +1760,17 @@ end
|
|
1760
1760
|
<tr><td<%= ' class=\"orphan\"'.html_safe if err_msg %>><%= err_msg || '(none)' %></td></tr>
|
1761
1761
|
<% else
|
1762
1762
|
collection2.each do |br_#{hm_singular_name}| %>
|
1763
|
-
<tr><td><%= br_descrip = if br_#{hm_singular_name}.respond_to?(
|
1763
|
+
<tr><td><%= br_descrip = if (dc = descrip_cols&.first&.first&.last) && br_#{hm_singular_name}.respond_to?(dc)
|
1764
1764
|
br_#{hm_singular_name}.brick_descrip(
|
1765
1765
|
descrip_cols&.first&.map { |col| br_#{hm_singular_name}.send(col.last) }
|
1766
1766
|
)
|
1767
1767
|
else # If the HM association has a scope, might not have picked up our SELECT detail
|
1768
1768
|
pks = (klass = br_#{hm_singular_name}.class).primary_key
|
1769
|
-
pks =
|
1770
|
-
|
1769
|
+
pks = if pks.is_a?(Array)
|
1770
|
+
pks.map { |pk| br_#{hm_singular_name}.send(pk).to_s }
|
1771
|
+
else
|
1772
|
+
[br_#{hm_singular_name}.send(pks).to_s]
|
1773
|
+
end
|
1771
1774
|
\"#\{klass.name} ##\{pks.join(', ')}\"
|
1772
1775
|
end
|
1773
1776
|
link_to(br_descrip, #{hm.first.klass._brick_index(:singular)}_path(slashify(#{obj_br_pk}))) %></td></tr>
|
@@ -104,7 +104,7 @@ module Brick::Rails::FormBuilder
|
|
104
104
|
out << "<div id=\"_br_json_#{self.field_id(method)}\"></div>"
|
105
105
|
else
|
106
106
|
is_revert = false
|
107
|
-
out << ::Brick::Rails.display_value(col_type, val)
|
107
|
+
out << (::Brick::Rails.display_value(col_type, val)&.html_safe || '')
|
108
108
|
end
|
109
109
|
end
|
110
110
|
if is_revert
|
data/lib/brick/version_number.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: brick
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.150
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lorin Thwaits
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-06-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|