brick 1.0.209 → 1.0.211
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7950119f788fe1cac3fde68806f2b4a1145da0cf17ff0d47363b102be9c69933
|
4
|
+
data.tar.gz: 33bb7d89a0744890d4450afde332dbd0f0635a8d3acd0beb4107cf4e44ff9718
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 959c6ada7e03de34f566ad6059a4431ea66d2be9f12764de3edb3760074a70f3e91354e9052bc3c1a74eed4d5d7a274a78cf490195815b736b02f282ffe03d47
|
7
|
+
data.tar.gz: a87abaf8c878fecda93fc6751bae171e5194b6b63d933f83ba331191aee701859d3022754f68af3d730c25add0cc0a8174246fd18913040bed75ec700ba2b543
|
data/lib/brick/extensions.rb
CHANGED
@@ -72,7 +72,7 @@ module ActiveRecord
|
|
72
72
|
|
73
73
|
def real_model(params)
|
74
74
|
if params && (sub_model = params.fetch(type_col = inheritance_column, nil))
|
75
|
-
sub_model = sub_model.first if sub_model.is_a?(Array) # Support the params style that gets returned from #
|
75
|
+
sub_model = sub_model.first if sub_model.is_a?(Array) # Support the params style that gets returned from #_brick_querying
|
76
76
|
# Make sure the chosen model is really the same or a subclass of this model
|
77
77
|
(possible_model = sub_model.constantize) <= self ? possible_model : self
|
78
78
|
else
|
@@ -92,11 +92,49 @@ module ActiveRecord
|
|
92
92
|
reflect_on_association(assoc).foreign_type || "#{assoc}_type"
|
93
93
|
end
|
94
94
|
|
95
|
-
def _brick_all_fields
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
95
|
+
def _brick_all_fields(skip_id = nil)
|
96
|
+
col_names = columns_hash.keys
|
97
|
+
# If it's a composite primary key then allow all the values through
|
98
|
+
# TODO: Should disallow any autoincrement / SERIAL columns
|
99
|
+
if skip_id && (pk_as_array = _pk_as_array).length == 1
|
100
|
+
col_names -= _pk_as_array
|
101
|
+
end
|
102
|
+
hoa, hma, rtans = _activestorage_actiontext_fields
|
103
|
+
col_names.map(&:to_sym) + hoa + hma.map { |as| { as => [] } } + rtans.values
|
104
|
+
end
|
105
|
+
|
106
|
+
# Return three lists of fields for this model --
|
107
|
+
# has_one_attached, has_many_attached, and has_rich_text
|
108
|
+
def _activestorage_actiontext_fields
|
109
|
+
fields = [[], [], {}]
|
110
|
+
if !(self <= ActiveStorage::Blob) && respond_to?(:generated_association_methods) # ActiveStorage
|
111
|
+
generated_association_methods.instance_methods.each do |method_sym|
|
112
|
+
method_str = method_sym.to_s
|
113
|
+
fields[0] << method_str[0..-13].to_sym if method_str.end_with?('_attachment=') # has_one_attached
|
114
|
+
fields[1] << method_str[0..-14].to_sym if method_str.end_with?('_attachments=') # has_many_attached
|
115
|
+
end
|
116
|
+
end
|
117
|
+
if respond_to?(:rich_text_association_names) # ActionText
|
118
|
+
rich_text_association_names&.each do |rtan| # has_rich_text
|
119
|
+
rtan_str = rtan.to_s
|
120
|
+
fields[2][rtan] = rtan_str.start_with?('rich_text_') ? rtan_str[10..-1].to_sym : rtan
|
121
|
+
end
|
122
|
+
end
|
123
|
+
fields
|
124
|
+
end
|
125
|
+
|
126
|
+
def _active_storage_name(col_name)
|
127
|
+
if Object.const_defined?('ActiveStorage') && (self <= ActiveStorage::Attachment || self <= ActiveStorage::Blob)
|
128
|
+
if (col_str = col_name.to_s).end_with?('_attachments')
|
129
|
+
col_str[0..-13]
|
130
|
+
elsif col_str.end_with?('_blobs')
|
131
|
+
col_str[0..-7]
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def _pk_as_array
|
137
|
+
self.primary_key.is_a?(Array) ? self.primary_key : [self.primary_key]
|
100
138
|
end
|
101
139
|
|
102
140
|
def _br_quoted_name(name)
|
@@ -147,8 +185,8 @@ module ActiveRecord
|
|
147
185
|
skip_columns = _brick_get_fks + (::Brick.config.metadata_columns || []) + [primary_key]
|
148
186
|
dsl = if (descrip_col = columns.find { |c| [:boolean, :binary, :xml].exclude?(c.type) && skip_columns.exclude?(c.name) })
|
149
187
|
"[#{descrip_col.name}]"
|
150
|
-
|
151
|
-
"#{name} ##{
|
188
|
+
else
|
189
|
+
"#{name} ##{_pk_as_array.map { |pk_part| "[#{pk_part}]" }.join(', ')}"
|
152
190
|
end
|
153
191
|
::Brick.config.model_descrips[name] = dsl
|
154
192
|
end
|
@@ -491,17 +529,12 @@ module ActiveRecord
|
|
491
529
|
[order_by, order_by_txt]
|
492
530
|
end
|
493
531
|
|
494
|
-
def self.brick_select(*args,
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
args
|
501
|
-
end
|
502
|
-
(relation = all).brick_select(selects, *other_args,
|
503
|
-
params: params, brick_col_names: brick_col_names, **kwargs)
|
504
|
-
relation.select(selects)
|
532
|
+
def self.brick_select(*args, **kwargs)
|
533
|
+
all.brick_select(*args, **kwargs)
|
534
|
+
end
|
535
|
+
|
536
|
+
def self.brick_pluck(*args, withhold_ids: true, **kwargs)
|
537
|
+
all.brick_pluck(*args, withhold_ids: withhold_ids, **kwargs)
|
505
538
|
end
|
506
539
|
|
507
540
|
def self.brick_where(*args)
|
@@ -559,7 +592,7 @@ module ActiveRecord
|
|
559
592
|
# If it's a CollectionProxy (which inherits from Relation) then need to dig
|
560
593
|
# out the core Relation object which is found in the association scope.
|
561
594
|
brick_rel = is_a?(ActiveRecord::Associations::CollectionProxy) ? scope : self
|
562
|
-
brick_rel = brick_rel.dup if do_dup
|
595
|
+
brick_rel = (@_brick_rel_dup ||= brick_rel.dup) if do_dup
|
563
596
|
# Start out with a hash that has only the root table name
|
564
597
|
brick_rel.instance_variable_set(:@_brick_links, bl = { '' => table_name })
|
565
598
|
brick_rel.arel.ast if do_dup # Walk the AST tree in order to capture all the other correlation names
|
@@ -567,10 +600,22 @@ module ActiveRecord
|
|
567
600
|
end
|
568
601
|
end
|
569
602
|
|
570
|
-
def brick_select(*args,
|
571
|
-
|
572
|
-
|
573
|
-
|
603
|
+
def brick_select(*args, **kwargs)
|
604
|
+
selects = args[0].is_a?(Array) ? args[0] : args
|
605
|
+
_brick_querying(selects, **kwargs)
|
606
|
+
select(selects)
|
607
|
+
end
|
608
|
+
|
609
|
+
def brick_pluck(*args, withhold_ids: true, **kwargs)
|
610
|
+
selects = args[0].is_a?(Array) ? args[0] : args
|
611
|
+
_brick_querying(selects, withhold_ids: withhold_ids, **kwargs)
|
612
|
+
pluck(selects)
|
613
|
+
end
|
614
|
+
|
615
|
+
def _brick_querying(*args, withhold_ids: nil, params: {}, order_by: nil, translations: {},
|
616
|
+
join_array: ::Brick::JoinArray.new,
|
617
|
+
cust_col_override: nil,
|
618
|
+
brick_col_names: nil)
|
574
619
|
selects = args[0].is_a?(Array) ? args[0] : args
|
575
620
|
if selects.present? && cust_col_override.nil? # See if there's any fancy ones in the select list
|
576
621
|
idx = 0
|
@@ -654,13 +699,13 @@ module ActiveRecord
|
|
654
699
|
"'<#{typ.end_with?('_TYP') ? typ[0..-5] : typ}>' AS #{col.name}"
|
655
700
|
end
|
656
701
|
end
|
657
|
-
|
702
|
+
elsif !withhold_ids # Having some select columns chosen, add any missing always_load_fields for this model ...
|
658
703
|
this_model = klass
|
659
704
|
loop do
|
660
705
|
::Brick.config.always_load_fields.fetch(this_model.name, nil)&.each do |alf|
|
661
706
|
selects << alf unless selects.include?(alf)
|
662
707
|
end
|
663
|
-
# ... plus any and all STI superclasses it may inherit from
|
708
|
+
# ... plus ALF fields from any and all STI superclasses it may inherit from
|
664
709
|
break if (this_model = this_model.superclass).abstract_class? || this_model == ActiveRecord::Base
|
665
710
|
end
|
666
711
|
end
|
@@ -673,15 +718,16 @@ module ActiveRecord
|
|
673
718
|
end
|
674
719
|
end
|
675
720
|
|
676
|
-
core_selects = selects.dup
|
721
|
+
# core_selects = selects.dup
|
677
722
|
id_for_tables = Hash.new { |h, k| h[k] = [] }
|
678
723
|
field_tbl_names = Hash.new { |h, k| h[k] = {} }
|
679
724
|
used_col_aliases = {} # Used to make sure there is not a name clash
|
680
725
|
|
681
726
|
# CUSTOM COLUMNS
|
682
727
|
# ==============
|
683
|
-
(cust_col_override || klass._br_cust_cols)
|
684
|
-
|
728
|
+
(cust_col_override || (!withhold_ids && klass._br_cust_cols))&.each do |k, cc|
|
729
|
+
brick_links # Intentionally create a relation duplicate
|
730
|
+
if @_brick_rel_dup.respond_to?(k) # Name already taken?
|
685
731
|
# %%% Use ensure_unique here in this kind of fashion:
|
686
732
|
# cnstr_name = ensure_unique(+"(brick) #{for_tbl}_#{pri_tbl}", nil, bts, hms)
|
687
733
|
# binding.pry
|
@@ -730,12 +776,14 @@ module ActiveRecord
|
|
730
776
|
selects << "#{_br_quoted_name(tbl_name)}.#{_br_quoted_name(cc_part.last)} AS #{_br_quoted_name(col_alias)}"
|
731
777
|
cc_part << col_alias
|
732
778
|
end
|
733
|
-
|
734
|
-
|
735
|
-
|
736
|
-
|
779
|
+
unless withhold_ids
|
780
|
+
# Add a key column unless we've already got it
|
781
|
+
if key_alias && !used_col_aliases.key?(key_alias)
|
782
|
+
selects << "#{_br_quoted_name(key_tbl_name)}.#{_br_quoted_name(dest_pk)} AS #{_br_quoted_name(key_alias)}"
|
783
|
+
used_col_aliases[key_alias] = nil
|
784
|
+
end
|
785
|
+
cc[2] = key_alias ? [key_klass, key_alias] : nil
|
737
786
|
end
|
738
|
-
cc[2] = key_alias ? [key_klass, key_alias] : nil
|
739
787
|
end
|
740
788
|
|
741
789
|
# LEFT OUTER JOINs
|
@@ -751,7 +799,7 @@ module ActiveRecord
|
|
751
799
|
# %%% Strangely in Rails 7.1 on a slower system then very rarely brick_link comes back nil...
|
752
800
|
brick_link = brick_links[sel_col.first]
|
753
801
|
field_tbl_name = brick_link&.split('.')&.last ||
|
754
|
-
# ... so here's a best-effort guess
|
802
|
+
# ... so if it is nil then here's a best-effort guess as to what the table name might be.
|
755
803
|
klass.reflect_on_association(sel_col.first)&.klass&.table_name
|
756
804
|
# If it's Oracle, quote any AREL aliases that had been applied
|
757
805
|
field_tbl_name = "\"#{field_tbl_name}\"" if ::Brick.is_oracle && brick_links.values.include?(field_tbl_name)
|
@@ -831,6 +879,8 @@ module ActiveRecord
|
|
831
879
|
end
|
832
880
|
through_sources.push(src_ref) unless src_ref.belongs_to?
|
833
881
|
from_clause = +"#{_br_quoted_name(through_sources.first.table_name)} br_t0"
|
882
|
+
# ActiveStorage will not get the correct count unless we do some extra filtering later
|
883
|
+
tbl_nm = 'br_t0' if Object.const_defined?('ActiveStorage') && through_sources.first.klass <= ActiveStorage::Attachment
|
834
884
|
fk_col = through_sources.shift.foreign_key
|
835
885
|
|
836
886
|
idx = 0
|
@@ -924,10 +974,14 @@ module ActiveRecord
|
|
924
974
|
tbl_nm = hm.macro == :has_and_belongs_to_many ? hm.join_table : hm.table_name
|
925
975
|
hm_table_name = _br_quoted_name(tbl_nm)
|
926
976
|
end
|
977
|
+
# ActiveStorage has_many_attached needs a bit more filtering
|
978
|
+
if (k_str = hm.klass._active_storage_name(k))
|
979
|
+
where_ct_clause = "WHERE #{_br_quoted_name("#{tbl_nm}.name")} = '#{k_str}' "
|
980
|
+
end
|
927
981
|
group_bys = ::Brick.is_oracle || is_mssql ? hm_selects : (1..hm_selects.length).to_a
|
928
982
|
join_clause = "LEFT OUTER
|
929
983
|
JOIN (SELECT #{hm_selects.map { |s| _br_quoted_name("#{'br_t0.' if from_clause}#{s}") }.join(', ')}, COUNT(#{'DISTINCT ' if hm.options[:through]}#{_br_quoted_name(count_column)
|
930
|
-
}) AS c_t_ FROM #{from_clause || hm_table_name} GROUP BY #{group_bys.join(', ')}) #{_br_quoted_name(tbl_alias)}"
|
984
|
+
}) AS c_t_ FROM #{from_clause || hm_table_name} #{where_ct_clause}GROUP BY #{group_bys.join(', ')}) #{_br_quoted_name(tbl_alias)}"
|
931
985
|
self.joins_values |= ["#{join_clause} ON #{on_clause.join(' AND ')}"] # Same as: joins!(...)
|
932
986
|
end unless cust_col_override
|
933
987
|
while (n = nix.pop)
|
@@ -1022,9 +1076,10 @@ JOIN (SELECT #{hm_selects.map { |s| _br_quoted_name("#{'br_t0.' if from_clause}#
|
|
1022
1076
|
selects << 'customer_id' if klass.name == 'Pay::Subscription' && Pay::Subscription.columns_hash.key?('customer_id')
|
1023
1077
|
|
1024
1078
|
pieces, my_dsl = klass.brick_parse_dsl(join_array = ::Brick::JoinArray.new, [], translations = {}, false, nil, true)
|
1025
|
-
|
1079
|
+
_brick_querying(
|
1026
1080
|
selects, where_values_hash, nil, translations: translations, join_array: join_array,
|
1027
|
-
cust_col_override: { '_br' => (descrip_cols = [pieces, my_dsl]) }
|
1081
|
+
cust_col_override: { '_br' => (descrip_cols = [pieces, my_dsl]) },
|
1082
|
+
brick_col_names: true
|
1028
1083
|
)
|
1029
1084
|
order_values = "#{_br_quoted_name(klass.table_name)}.#{_br_quoted_name(klass.primary_key)}"
|
1030
1085
|
[self.select(selects), descrip_cols]
|
@@ -2246,9 +2301,10 @@ class Object
|
|
2246
2301
|
|
2247
2302
|
ar_relation = ActiveRecord.version < Gem::Version.new('4') ? real_model.preload : real_model.all
|
2248
2303
|
params['_brick_is_api'] = true if (is_api = request.format == :js || current_api_root)
|
2249
|
-
@_brick_params = ar_relation.
|
2250
|
-
|
2251
|
-
|
2304
|
+
@_brick_params = ar_relation._brick_querying((selects ||= []), params: params, order_by: order_by,
|
2305
|
+
translations: (translations = {}),
|
2306
|
+
join_array: (join_array = ::Brick::JoinArray.new),
|
2307
|
+
brick_col_names: true)
|
2252
2308
|
|
2253
2309
|
if is_api # Asking for JSON?
|
2254
2310
|
# Apply column renaming
|
@@ -2342,7 +2398,7 @@ class Object
|
|
2342
2398
|
_, order_by_txt = model._brick_calculate_ordering(default_ordering(table_name, pk, true)) if pk
|
2343
2399
|
code << " def index\n"
|
2344
2400
|
code << " @#{plural_table_name} = #{model.name}#{pk&.present? ? ".order(#{order_by_txt.join(', ')})" : '.all'}\n"
|
2345
|
-
code << " @#{plural_table_name}.
|
2401
|
+
code << " @#{plural_table_name}._brick_querying(params, brick_col_names: true)\n"
|
2346
2402
|
code << " end\n"
|
2347
2403
|
|
2348
2404
|
is_pk_string = nil
|
@@ -2357,6 +2413,8 @@ class Object
|
|
2357
2413
|
end
|
2358
2414
|
end
|
2359
2415
|
|
2416
|
+
params_name_sym = (params_name = "#{singular_table_name}_params").to_sym
|
2417
|
+
|
2360
2418
|
# By default, views get marked as read-only
|
2361
2419
|
# unless model.readonly # (relation = relations[model.table_name]).key?(:isView)
|
2362
2420
|
code << " def new\n"
|
@@ -2364,7 +2422,11 @@ class Object
|
|
2364
2422
|
code << " end\n"
|
2365
2423
|
self.define_method :new do
|
2366
2424
|
_schema, @_is_show_schema_list = ::Brick.set_db_schema(params)
|
2367
|
-
new_params =
|
2425
|
+
new_params = begin
|
2426
|
+
send(params_name_sym)
|
2427
|
+
rescue
|
2428
|
+
end
|
2429
|
+
new_params ||= model.attribute_names.each_with_object({}) do |a, s|
|
2368
2430
|
if (val = params["__#{a}"])
|
2369
2431
|
# val = case new_obj.class.column_for_attribute(a).type
|
2370
2432
|
# when :datetime, :date, :time, :timestamp
|
@@ -2385,8 +2447,6 @@ class Object
|
|
2385
2447
|
add_csp_hash
|
2386
2448
|
end
|
2387
2449
|
|
2388
|
-
params_name_sym = (params_name = "#{singular_table_name}_params").to_sym
|
2389
|
-
|
2390
2450
|
code << " def create\n"
|
2391
2451
|
code << " @#{singular_table_name} = #{model.name}.create(#{params_name})\n"
|
2392
2452
|
code << " end\n"
|
@@ -2403,8 +2463,7 @@ class Object
|
|
2403
2463
|
end
|
2404
2464
|
render json: { result: ::Brick.unexclude_column(table_name, col) }
|
2405
2465
|
else
|
2406
|
-
|
2407
|
-
(created_obj = model.send(:create, send(params_name_sym))))
|
2466
|
+
created_obj = model.send(:create, send(params_name_sym))
|
2408
2467
|
@_lookup_context.instance_variable_set(:@_brick_model, model)
|
2409
2468
|
if created_obj.errors.empty?
|
2410
2469
|
index
|
@@ -2481,7 +2540,16 @@ class Object
|
|
2481
2540
|
if (upd_hash ||= upd_params).fetch(model.inheritance_column, nil)&.strip == ''
|
2482
2541
|
upd_hash[model.inheritance_column] = nil
|
2483
2542
|
end
|
2484
|
-
|
2543
|
+
# Do not clear out a has_many_attached field if it already has an entry and nothing is supplied
|
2544
|
+
hoa, hma, rtans = model._activestorage_actiontext_fields
|
2545
|
+
all_params = params[singular_table_name]
|
2546
|
+
hma.each do |hma_field|
|
2547
|
+
if upd_hash.fetch(hma_field) == [''] && # No new attachments...
|
2548
|
+
all_params&.fetch("_brick_attached_#{hma_field}", nil) # ...and there is something existing
|
2549
|
+
upd_hash.delete(hma_field)
|
2550
|
+
end
|
2551
|
+
end
|
2552
|
+
obj.send(:update, upd_hash)
|
2485
2553
|
if obj.errors.any? # Surface errors to the user in a flash message
|
2486
2554
|
flash.now.alert = (obj.errors.errors.map { |err| "<b>#{err.attribute}</b> #{err.message}" }.join(', '))
|
2487
2555
|
end
|
@@ -2531,7 +2599,7 @@ class Object
|
|
2531
2599
|
|
2532
2600
|
if is_need_params
|
2533
2601
|
code << " def #{params_name}\n"
|
2534
|
-
permits_txt = model._brick_find_permits(model, permits = model._brick_all_fields)
|
2602
|
+
permits_txt = model._brick_find_permits(model, permits = model._brick_all_fields(true))
|
2535
2603
|
code << " params.require(:#{require_name = model.name.underscore.tr('/', '_')
|
2536
2604
|
}).permit(#{permits_txt.map(&:inspect).join(', ')})\n"
|
2537
2605
|
code << " end\n"
|
@@ -641,6 +641,11 @@ window.addEventListener(\"popstate\", linkSchemas);
|
|
641
641
|
type_col = hm_assoc.inverse_of&.foreign_type || hm_assoc.type
|
642
642
|
keys << [type_col, poly_type]
|
643
643
|
end
|
644
|
+
# ActiveStorage has_one_attached and has_many_attached needs additional filtering on the name
|
645
|
+
if (as_name = hm_assoc.klass&._active_storage_name(hm_assoc.name)) # ActiveStorage HMT
|
646
|
+
prefix = 'attachments.' if hm_assoc.through_reflection&.klass&.<= ActiveStorage::Attachment
|
647
|
+
keys << ["#{prefix}name", as_name]
|
648
|
+
end
|
644
649
|
keys.to_h
|
645
650
|
end
|
646
651
|
|
@@ -1506,7 +1511,7 @@ end
|
|
1506
1511
|
|
1507
1512
|
if (pk = hm.first.klass.primary_key)
|
1508
1513
|
hm_singular_name = (hm_name = hm.first.name.to_s).singularize.underscore
|
1509
|
-
obj_br_pk =
|
1514
|
+
obj_br_pk = hm.first.klass._pk_as_array.map { |pk_part| "br_#{hm_singular_name}.#{pk_part}" }.join(', ')
|
1510
1515
|
poly_fix = if (poly_type = (hm.first.options[:as] && hm.first.type))
|
1511
1516
|
"
|
1512
1517
|
# Let's fix an unexpected \"feature\" of AR -- when going through a polymorphic has_many
|
@@ -110,6 +110,41 @@ module Brick::Rails::FormBuilder
|
|
110
110
|
::Brick::Rails.display_binary(val)
|
111
111
|
end
|
112
112
|
end
|
113
|
+
when :file, :files
|
114
|
+
if attached = begin
|
115
|
+
self.object.send(method)
|
116
|
+
rescue
|
117
|
+
end
|
118
|
+
# Show any existing image(s)
|
119
|
+
existing = []
|
120
|
+
got_one = nil
|
121
|
+
(attached.respond_to?(:attachments) ? attached.attachments : [attached]).each do |attachment|
|
122
|
+
next unless (blob = attachment.blob)
|
123
|
+
|
124
|
+
existing << blob.key
|
125
|
+
out << "#{blob.filename}<br>"
|
126
|
+
url = begin
|
127
|
+
self.object.send(method)&.url
|
128
|
+
rescue StandardError => e
|
129
|
+
# Another possible option:
|
130
|
+
# Rails.application.routes.url_helpers.rails_blob_path(attachment, only_path: true)
|
131
|
+
Rails.application.routes.url_helpers.rails_storage_proxy_path(attachment, only_path: true)
|
132
|
+
end
|
133
|
+
out << if url
|
134
|
+
"<img src=\"#{url}\" title=\"#{val}\">"
|
135
|
+
else # Convert the raw binary to a Base64 image
|
136
|
+
::Brick::Rails.display_binary(attachment.download, 500_000)
|
137
|
+
end
|
138
|
+
got_one = true
|
139
|
+
out << '<br>'
|
140
|
+
end
|
141
|
+
out << 'Update: ' if got_one
|
142
|
+
end
|
143
|
+
out << self.hidden_field("_brick_attached_#{method}", value: existing.join(',')) unless existing.blank?
|
144
|
+
# Render a "Choose File(s)" input element
|
145
|
+
args = [method.to_sym]
|
146
|
+
args << { multiple: true } if col&.type == :files
|
147
|
+
out << self.file_field(*args)
|
113
148
|
when :primary_key
|
114
149
|
is_revert = false
|
115
150
|
when :json, :jsonb
|
@@ -445,19 +445,25 @@ function onImagesLoaded(event) {
|
|
445
445
|
obj.send("#{model.brick_foreign_type(v.first)}=", v[1].first&.first&.name)
|
446
446
|
end
|
447
447
|
end if obj.new_record?
|
448
|
-
rtans = model.
|
449
|
-
(model.column_names +
|
448
|
+
hoa, hma, rtans = model._activestorage_actiontext_fields
|
449
|
+
(model.column_names + hoa + hma + rtans.keys).each do |k|
|
450
450
|
pk_pos = (pk.index(k)&.+ 1)
|
451
451
|
next if (pk_pos && pk.length == 1 && !bts.key?(k)) ||
|
452
452
|
::Brick.config.metadata_columns.include?(k)
|
453
453
|
|
454
454
|
col = model.columns_hash[k]
|
455
|
-
if !col
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
455
|
+
if !col
|
456
|
+
kwargs = if hoa.include?(k) # has_one_attached
|
457
|
+
{ sql_type: 'binary', type: :file }
|
458
|
+
elsif hma.include?(k) # has_many_attached
|
459
|
+
{ sql_type: 'binary', type: :files }
|
460
|
+
elsif rtans&.key?(k) # has_rich_text
|
461
|
+
k = rtans[k]
|
462
|
+
{ sql_type: 'varchar', type: :text }
|
463
|
+
end
|
464
|
+
col = (ActiveRecord::ConnectionAdapters::Column.new(
|
465
|
+
'', nil, ActiveRecord::ConnectionAdapters::SqlTypeMetadata.new(**kwargs)
|
466
|
+
)) if kwargs
|
461
467
|
end
|
462
468
|
val = obj.attributes[k]
|
463
469
|
out << "
|
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.211
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lorin Thwaits
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-03-
|
11
|
+
date: 2024-03-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -285,7 +285,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
285
285
|
- !ruby/object:Gem::Version
|
286
286
|
version: 1.3.6
|
287
287
|
requirements: []
|
288
|
-
rubygems_version: 3.
|
288
|
+
rubygems_version: 3.1.6
|
289
289
|
signing_key:
|
290
290
|
specification_version: 4
|
291
291
|
summary: Create a Rails app from data alone
|