brick 1.0.121 → 1.0.122
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 +21 -9
- data/lib/brick/frameworks/rails/engine.rb +43 -13
- data/lib/brick/frameworks/rails/form_tags.rb +9 -15
- data/lib/brick/version_number.rb +1 -1
- data/lib/brick.rb +4 -4
- 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: b1f047f700bc850e0e54210cd9669e2877c2d770010f42c82b7f2616ad14f542
|
4
|
+
data.tar.gz: e89b2be75f7d961b24681b4e6c5aeb8beedef51e2537759f93a68baff1787e60
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 54418f3b20260bea82b912383038fce3a019a6daf85e56714a1eb2331c7aa130c44706d64e8d1c86502d9ed7c6f7ece730b8a3d467fbe77ee3e699f8e2eb1586
|
7
|
+
data.tar.gz: baf068daf69952fd2235b14abddd93420b73984912eef5da6ffc33699db124058b2e6a093d9984d2fe31abbe620e6d51d5bdbecc5cf23297f6c31b4d4450ed71
|
data/lib/brick/extensions.rb
CHANGED
@@ -58,6 +58,16 @@ module ActiveRecord
|
|
58
58
|
def is_view?
|
59
59
|
false
|
60
60
|
end
|
61
|
+
|
62
|
+
def real_model(params)
|
63
|
+
if params && (sub_model = params.fetch(type_col = inheritance_column, nil))
|
64
|
+
sub_model = sub_model.first if sub_model.is_a?(Array) # Support the params style that gets returned from #brick_select
|
65
|
+
# Make sure the chosen model is really the same or a subclass of this model
|
66
|
+
(possible_model = sub_model.constantize) <= self ? possible_model : self
|
67
|
+
else
|
68
|
+
self
|
69
|
+
end
|
70
|
+
end
|
61
71
|
end
|
62
72
|
|
63
73
|
def self._brick_primary_key(relation = nil)
|
@@ -1651,16 +1661,18 @@ class Object
|
|
1651
1661
|
return
|
1652
1662
|
end
|
1653
1663
|
|
1664
|
+
real_model = model.real_model(params)
|
1665
|
+
|
1654
1666
|
if request.format == :csv # Asking for a template?
|
1655
1667
|
require 'csv'
|
1656
1668
|
exported_csv = CSV.generate(force_quotes: false) do |csv_out|
|
1657
|
-
|
1669
|
+
real_model.df_export(real_model.brick_import_template).each { |row| csv_out << row }
|
1658
1670
|
end
|
1659
1671
|
render inline: exported_csv, content_type: request.format
|
1660
1672
|
return
|
1661
1673
|
# elsif request.format == :js || current_api_root # Asking for JSON?
|
1662
1674
|
# # %%% Add: where, order, page, page_size, offset, limit
|
1663
|
-
# data = (
|
1675
|
+
# data = (real_model.is_view? || !Object.const_defined?('DutyFree')) ? real_model.limit(1000) : real_model.df_export(real_model.brick_import_template)
|
1664
1676
|
# render inline: { data: data }.to_json, content_type: request.format == '*/*' ? 'application/json' : request.format
|
1665
1677
|
# return
|
1666
1678
|
end
|
@@ -1670,9 +1682,9 @@ class Object
|
|
1670
1682
|
# %%% Allow params to define which columns to use for order_by
|
1671
1683
|
# Overriding the default by providing a querystring param?
|
1672
1684
|
ordering = params['_brick_order']&.split(',')&.map(&:to_sym) || Object.send(:default_ordering, table_name, pk)
|
1673
|
-
order_by, _ =
|
1685
|
+
order_by, _ = real_model._brick_calculate_ordering(ordering, true) # Don't do the txt part
|
1674
1686
|
|
1675
|
-
ar_relation = ActiveRecord.version < Gem::Version.new('4') ?
|
1687
|
+
ar_relation = ActiveRecord.version < Gem::Version.new('4') ? real_model.preload : real_model.all
|
1676
1688
|
params['_brick_is_api'] = true if (is_api = request.format == :js || current_api_root)
|
1677
1689
|
@_brick_params = ar_relation.brick_select(params, (selects ||= []), order_by,
|
1678
1690
|
translations = {},
|
@@ -1682,7 +1694,7 @@ class Object
|
|
1682
1694
|
# Apply column renaming
|
1683
1695
|
data = ar_relation.respond_to?(:_select!) ? ar_relation.dup._select!(*selects) : ar_relation.select(selects)
|
1684
1696
|
if data.present? &&
|
1685
|
-
(column_renaming = ::Brick.find_col_renaming(current_api_root,
|
1697
|
+
(column_renaming = ::Brick.find_col_renaming(current_api_root, real_model&._brick_relation)&.select { |cr| cr.last })
|
1686
1698
|
data.map!({}) do |row, s|
|
1687
1699
|
column_renaming.each_with_object({}) do |rename, s|
|
1688
1700
|
s[rename.last] = row[rename.first] if rename.last
|
@@ -1693,7 +1705,7 @@ class Object
|
|
1693
1705
|
# # %%% This currently only gives a window to check security and raise an exception if someone isn't
|
1694
1706
|
# # authenticated / authorised. Still need to figure out column filtering and transformations.
|
1695
1707
|
# proc_result = if (column_filter = ::Brick.config.api_column_filter).is_a?(Proc)
|
1696
|
-
# object_columns = (relation =
|
1708
|
+
# object_columns = (relation = real_model&._brick_relation)[:cols]
|
1697
1709
|
# begin
|
1698
1710
|
# num_args = column_filter.arity.negative? ? 5 : column_filter.arity
|
1699
1711
|
# # object_name, api_version, columns, data
|
@@ -1718,7 +1730,7 @@ class Object
|
|
1718
1730
|
|
1719
1731
|
# %%% Add custom HM count columns
|
1720
1732
|
# %%% What happens when the PK is composite?
|
1721
|
-
counts =
|
1733
|
+
counts = real_model._br_hm_counts.each_with_object([]) do |v, s|
|
1722
1734
|
s << if is_mysql
|
1723
1735
|
"`b_r_#{v.first}`.c_t_ AS \"b_r_#{v.first}_ct\""
|
1724
1736
|
elsif is_postgres
|
@@ -1738,8 +1750,8 @@ class Object
|
|
1738
1750
|
s << excl_parts.last
|
1739
1751
|
end
|
1740
1752
|
end
|
1741
|
-
@_brick_bt_descrip =
|
1742
|
-
@_brick_hm_counts =
|
1753
|
+
@_brick_bt_descrip = real_model._br_bt_descrip
|
1754
|
+
@_brick_hm_counts = real_model._br_hm_counts
|
1743
1755
|
@_brick_join_array = join_array
|
1744
1756
|
@_brick_erd = params['_brick_erd']&.to_i
|
1745
1757
|
end
|
@@ -510,6 +510,16 @@ window.addEventListener(\"popstate\", linkSchemas);
|
|
510
510
|
# Dynamically create generic templates
|
511
511
|
# ====================================
|
512
512
|
if ::Brick.enable_views?
|
513
|
+
# Add the params to the lookup_context so that we have context about STI classes when setting @_brick_model
|
514
|
+
ActionView::ViewPaths.class_exec do
|
515
|
+
alias :_brick_lookup_context :lookup_context
|
516
|
+
def lookup_context(*args)
|
517
|
+
ret = _brick_lookup_context(*args)
|
518
|
+
@_lookup_context.instance_variable_set(:@_brick_req_params, params)
|
519
|
+
ret
|
520
|
+
end
|
521
|
+
end
|
522
|
+
|
513
523
|
ActionView::LookupContext.class_exec do
|
514
524
|
# Used by Rails 5.0 and above
|
515
525
|
alias :_brick_template_exists? :template_exists?
|
@@ -520,10 +530,10 @@ window.addEventListener(\"popstate\", linkSchemas);
|
|
520
530
|
_brick_template_exists?(*args, **options) ||
|
521
531
|
# Do not auto-create a template when it's searching for an application.html.erb, which comes in like: ["edit", ["games", "application"]]
|
522
532
|
((args[1].length == 1 || args[1][-1] != 'application') &&
|
523
|
-
set_brick_model(args))
|
533
|
+
set_brick_model(args, @_brick_req_params))
|
524
534
|
end
|
525
535
|
|
526
|
-
def set_brick_model(find_args)
|
536
|
+
def set_brick_model(find_args, params)
|
527
537
|
# Return an appropriate model for a given view template request.
|
528
538
|
# find_args will generally be something like: ["index", ["categories"]]
|
529
539
|
# and must cycle through all of find_args[1] because in some cases such as with Devise we get something like:
|
@@ -537,7 +547,7 @@ window.addEventListener(\"popstate\", linkSchemas);
|
|
537
547
|
# Only CUD stuff has create / update / destroy
|
538
548
|
(!model.is_view? && ['new', 'create', 'edit', 'update', 'destroy'].include?(find_args.first))
|
539
549
|
)
|
540
|
-
@_brick_model = model
|
550
|
+
@_brick_model = model.real_model(params)
|
541
551
|
end
|
542
552
|
rescue
|
543
553
|
end
|
@@ -579,7 +589,7 @@ window.addEventListener(\"popstate\", linkSchemas);
|
|
579
589
|
find_template_err = e # Can come up with stuff like Devise which has its own view templates
|
580
590
|
end
|
581
591
|
# Used to also have: ActionView.version < ::Gem::Version.new('5.0') &&
|
582
|
-
model_name = set_brick_model(args)&.name
|
592
|
+
model_name = set_brick_model(args, @_brick_req_params)&.name
|
583
593
|
end
|
584
594
|
|
585
595
|
if @_brick_model
|
@@ -848,6 +858,10 @@ input+svg.revert {
|
|
848
858
|
color: #FFF;
|
849
859
|
}
|
850
860
|
</style>
|
861
|
+
<script>
|
862
|
+
if (window.history.state && window.history.state.turbo)
|
863
|
+
window.addEventListener(\"popstate\", function () { location.reload(true); });
|
864
|
+
</script>
|
851
865
|
|
852
866
|
<% is_includes_dates = nil
|
853
867
|
is_includes_json = nil
|
@@ -1158,7 +1172,7 @@ erDiagram
|
|
1158
1172
|
@_brick_bt_descrip&.each do |bt|
|
1159
1173
|
bt_class = bt[1].first.first
|
1160
1174
|
callbacks[bt_name = bt_class.name.split('::').last] = bt_class
|
1161
|
-
is_has_one = #{@_brick_model.name}.reflect_on_association(bt.first)
|
1175
|
+
is_has_one = #{@_brick_model.name}.reflect_on_association(bt.first)&.inverse_of&.macro == :has_one ||
|
1162
1176
|
::Brick.config.has_ones&.fetch('#{@_brick_model.name}', nil)&.key?(bt.first.to_s)
|
1163
1177
|
%> <%= \"#\{model_short_name} #\{is_has_one ? '||' : '}o'}--|| #\{bt_name} : \\\"#\{
|
1164
1178
|
bt_underscored = bt[1].first.first.name.underscore.singularize
|
@@ -1316,13 +1330,9 @@ erDiagram
|
|
1316
1330
|
+"<html>
|
1317
1331
|
<head>
|
1318
1332
|
#{css}
|
1319
|
-
<title
|
1320
|
-
|
1321
|
-
|
1322
|
-
end
|
1323
|
-
%><%= model.name %><%
|
1324
|
-
if (description = (relation = Brick.relations[model.table_name])&.fetch(:description, nil)).present?
|
1325
|
-
%> - <%= description
|
1333
|
+
<title><%= (model = #{model_name}).name %><%
|
1334
|
+
if (description = (relation = Brick.relations[model.table_name])&.fetch(:description, nil)).present?
|
1335
|
+
%> - <%= description
|
1326
1336
|
%><% end
|
1327
1337
|
%></title>
|
1328
1338
|
</head>
|
@@ -1359,7 +1369,27 @@ erDiagram
|
|
1359
1369
|
) %></td>
|
1360
1370
|
<% end
|
1361
1371
|
end %>
|
1362
|
-
</tr
|
1372
|
+
</tr>
|
1373
|
+
|
1374
|
+
<%= if model < (base_model = model.base_class)
|
1375
|
+
this_model = model
|
1376
|
+
parent_links = []
|
1377
|
+
until this_model == base_model do
|
1378
|
+
this_model = this_model.superclass
|
1379
|
+
path = send(\"#\{this_model._brick_index}_path\")
|
1380
|
+
path << \"?#\{base_model.inheritance_column}=#\{this_model.name}\" unless this_model == base_model
|
1381
|
+
parent_links << link_to(this_model.name, path)
|
1382
|
+
end
|
1383
|
+
\"<tr><td colspan=\\\"#\{td_count}\\\">Parent: #\{parent_links.join(' ')}</tr>\".html_safe
|
1384
|
+
end
|
1385
|
+
%><%= if (children = model.descendants).present?
|
1386
|
+
child_links = children.map do |child|
|
1387
|
+
path = send(\"#\{child._brick_index}_path\") + \"?#\{base_model.inheritance_column}=#\{child.name}\"
|
1388
|
+
link_to(child.name, path)
|
1389
|
+
end
|
1390
|
+
\"<tr><td colspan=\\\"#\{td_count}\\\">Children: #\{child_links.join(' ')}</tr>\".html_safe
|
1391
|
+
end
|
1392
|
+
%><%= if (page_num = @#{table_name}._brick_page_num)
|
1363
1393
|
\"<tr><td colspan=\\\"#\{td_count}\\\">Page #\{page_num}</td></tr>\".html_safe
|
1364
1394
|
end %></table>#{template_link}<%
|
1365
1395
|
if description.present? %><%=
|
@@ -86,19 +86,13 @@ module Brick::Rails::FormTags
|
|
86
86
|
elsif descrips.length == 1
|
87
87
|
[obj.class.reflect_on_association(bt.first)&.foreign_key]
|
88
88
|
else
|
89
|
-
|
90
|
-
[bt.first]
|
89
|
+
descrips.last
|
91
90
|
end
|
92
|
-
|
93
|
-
obj2 = obj
|
94
|
-
id[0..-2].each { |ref| obj2 = obj2&.send(ref) }
|
91
|
+
bt_txt = bt_class.brick_descrip(
|
95
92
|
# 0..62 because Postgres column names are limited to 63 characters
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
bt_txt = bt_class.brick_descrip(obj, txt_parts, bt_id_col)
|
100
|
-
bt_txt = ::Brick::Rails.display_binary(bt_txt).html_safe if bt_txt&.encoding&.name == 'ASCII-8BIT'
|
101
|
-
end
|
93
|
+
obj, descrips[0..-2].map { |id| obj.send(id.last[0..62]) }, bt_id_col
|
94
|
+
)
|
95
|
+
bt_txt = ::Brick::Rails.display_binary(bt_txt).html_safe if bt_txt&.encoding&.name == 'ASCII-8BIT'
|
102
96
|
bt_txt ||= "<span class=\"orphan\"><< Orphaned ID: #{val} >></span>" if val
|
103
97
|
bt_id = bt_id_col&.map { |id_col| obj.respond_to?(id_sym = id_col.to_sym) ? obj.send(id_sym) : id_col }
|
104
98
|
out << (bt_id&.first ? link_to(bt_txt, send("#{bt_class.base_class._brick_index(:singular)}_path".to_sym, bt_id)) : bt_txt || '')
|
@@ -110,16 +104,16 @@ module Brick::Rails::FormTags
|
|
110
104
|
hm_klass = (col = cols[col_name])[1]
|
111
105
|
if col[2] == 'HO'
|
112
106
|
descrips = bt_descrip[col_name.to_sym][hm_klass]
|
113
|
-
if (ho_id = (ho_id_col = descrips.last).map { |id_col| obj.
|
107
|
+
if (ho_id = (ho_id_col = descrips.last).map { |id_col| obj.send(id_col.to_sym) })&.first
|
114
108
|
ho_txt = hm_klass.brick_descrip(obj, descrips[0..-2].map { |id| obj.send(id.last[0..62]) }, ho_id_col)
|
115
109
|
out << link_to(ho_txt, send("#{hm_klass.base_class._brick_index(:singular)}_path".to_sym, ho_id))
|
116
110
|
end
|
117
111
|
else
|
118
112
|
if (ct = obj.send(hms_col[1].to_sym)&.to_i)&.positive?
|
113
|
+
predicates = hms_col[2].each_with_object({}) { |v, s| s[v.first] = v.last.is_a?(String) ? v.last : obj.send(v.last) }
|
114
|
+
predicates.each { |k, v| predicates[k] = obj.class.name if v == '[sti_type]' }
|
119
115
|
out << "#{link_to("#{ct || 'View'} #{hms_col.first}",
|
120
|
-
send("#{hm_klass._brick_index}_path".to_sym,
|
121
|
-
hms_col[2].each_with_object({}) { |v, s| s[v.first] = v.last.is_a?(String) ? v.last : obj.send(v.last) })
|
122
|
-
)}\n"
|
116
|
+
send("#{hm_klass._brick_index}_path".to_sym, predicates))}\n"
|
123
117
|
end
|
124
118
|
end
|
125
119
|
end
|
data/lib/brick/version_number.rb
CHANGED
data/lib/brick.rb
CHANGED
@@ -1618,8 +1618,8 @@ module ActiveRecord
|
|
1618
1618
|
end
|
1619
1619
|
end
|
1620
1620
|
|
1621
|
-
if
|
1622
|
-
|
1621
|
+
# No matter if it's older or newer Rails, now extend so that we can associate AR links to table_alias names
|
1622
|
+
if ActiveRecord.version < ::Gem::Version.new('6.1')
|
1623
1623
|
alias _brick_table_aliases_for table_aliases_for
|
1624
1624
|
def table_aliases_for(parent, node)
|
1625
1625
|
result = _brick_table_aliases_for(parent, node)
|
@@ -1630,7 +1630,7 @@ module ActiveRecord
|
|
1630
1630
|
end
|
1631
1631
|
result
|
1632
1632
|
end
|
1633
|
-
else # Same idea but for Rails
|
1633
|
+
else # Same idea but for Rails >= 6.1
|
1634
1634
|
alias _brick_make_constraints make_constraints
|
1635
1635
|
def make_constraints(parent, child, join_type)
|
1636
1636
|
result = _brick_make_constraints(parent, child, join_type)
|
@@ -1657,7 +1657,7 @@ if Gem::Specification.all_names.any? { |g| g.start_with?('ransack-') }
|
|
1657
1657
|
module Polyamorous::JoinDependencyExtensions
|
1658
1658
|
def build(associations, base_klass, root = nil, path = '')
|
1659
1659
|
root ||= associations
|
1660
|
-
puts associations.map(&:first)
|
1660
|
+
# puts associations.map(&:first)
|
1661
1661
|
|
1662
1662
|
associations.map do |name, right|
|
1663
1663
|
link_path = path.blank? ? name.to_s : path + ".#{name}"
|
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.122
|
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-03-
|
11
|
+
date: 2023-03-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|