brick 1.0.132 → 1.0.134
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/brick/config.rb +3 -1
- data/lib/brick/extensions.rb +28 -40
- data/lib/brick/frameworks/rails/engine.rb +36 -14
- data/lib/brick/frameworks/rails/form_tags.rb +6 -3
- data/lib/brick/version_number.rb +1 -1
- data/lib/generators/brick/models_generator.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: 613c6296c56af562bc77d55d734b0a6e5bdad7e3942891db4dc939fe087fca7f
|
4
|
+
data.tar.gz: acc5873eeae8a0d9e9d4a86cc8b71ee12dc0699821dee132c40c569147156075
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 046bec9f177ec74aaa3bbba3ef1dd2afe54f43376068ed657ed0fec6d18ac353e8addfabad514fdf33cc6199d053ca1e23c0f46aa1a53cac96fe6e21f7a50796
|
7
|
+
data.tar.gz: 7d21817ea8774f65852be247ae72c341559c84b0a58228d019d5630036827a99988699752392bbc43330400761ea9e59292231bae5993fa0620240126fe7490e
|
data/lib/brick/config.rb
CHANGED
@@ -258,7 +258,9 @@ module Brick
|
|
258
258
|
else
|
259
259
|
# Custom STI type columns for models built from specific tables
|
260
260
|
(v.last.is_a?(Array) ? v.last : [v.last]).each do |table|
|
261
|
-
::Brick.relations
|
261
|
+
if (relation = ::Brick.relations.fetch(table, nil))
|
262
|
+
relation[:sti_col] = v.first
|
263
|
+
end
|
262
264
|
end
|
263
265
|
end
|
264
266
|
end
|
data/lib/brick/extensions.rb
CHANGED
@@ -44,9 +44,20 @@
|
|
44
44
|
|
45
45
|
module ActiveRecord
|
46
46
|
class Base
|
47
|
+
@_brick_inheriteds = {}
|
47
48
|
class << self
|
48
49
|
attr_reader :_brick_relation
|
49
50
|
|
51
|
+
def _brick_inheriteds
|
52
|
+
@_brick_inheriteds ||= ::ActiveRecord::Base.instance_variable_get(:@_brick_inheriteds)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Track the file(s) in which each model is defined
|
56
|
+
def inherited(model)
|
57
|
+
(_brick_inheriteds[model] ||= []) << caller.first.split(':')[0..1] unless caller.first.include?('/lib/brick/extensions.rb:')
|
58
|
+
super
|
59
|
+
end
|
60
|
+
|
50
61
|
def is_brick?
|
51
62
|
instance_variables.include?(:@_brick_built) && instance_variable_get(:@_brick_built)
|
52
63
|
end
|
@@ -659,7 +670,6 @@ module ActiveRecord
|
|
659
670
|
# Add derived table JOIN for the has_many counts
|
660
671
|
nix = []
|
661
672
|
klass._br_hm_counts.each do |k, hm|
|
662
|
-
num_bt_things = 0
|
663
673
|
count_column = if hm.options[:through]
|
664
674
|
# Build the chain of JOINs going to the final destination HMT table
|
665
675
|
# (Usually just one JOIN, but could be many.)
|
@@ -680,7 +690,11 @@ module ActiveRecord
|
|
680
690
|
# Turn the last member of link_back into a foreign key
|
681
691
|
link_back << hmt_assoc.source_reflection.foreign_key
|
682
692
|
# If it's a HMT based on a HM -> HM, must JOIN the last table into the mix at the end
|
683
|
-
|
693
|
+
this_hm = hm
|
694
|
+
while !(src_ref = this_hm.source_reflection).belongs_to? && (thr = src_ref.options[:through])
|
695
|
+
through_sources.push(this_hm = src_ref.active_record.reflect_on_association(thr))
|
696
|
+
end
|
697
|
+
through_sources.push(src_ref) unless src_ref.belongs_to?
|
684
698
|
from_clause = +"#{through_sources.first.table_name} br_t0"
|
685
699
|
fk_col = through_sources.shift.foreign_key
|
686
700
|
|
@@ -689,9 +703,7 @@ module ActiveRecord
|
|
689
703
|
through_sources.map do |a|
|
690
704
|
from_clause << "\n LEFT OUTER JOIN #{a.table_name} br_t#{idx += 1} "
|
691
705
|
from_clause << if (src_ref = a.source_reflection).macro == :belongs_to
|
692
|
-
nm = hmt_assoc.source_reflection.inverse_of&.name
|
693
|
-
link_back << nm
|
694
|
-
num_bt_things += 1
|
706
|
+
link_back << (nm = hmt_assoc.source_reflection.inverse_of&.name)
|
695
707
|
# puts "BT #{a.table_name}"
|
696
708
|
"ON br_t#{idx}.#{a.active_record.primary_key} = br_t#{idx - 1}.#{a.foreign_key}"
|
697
709
|
elsif src_ref.options[:as]
|
@@ -712,9 +724,8 @@ module ActiveRecord
|
|
712
724
|
end
|
713
725
|
else # Standard has_many or has_one
|
714
726
|
# puts "HM #{a.table_name}"
|
715
|
-
# binding.pry unless (
|
716
727
|
nm = hmt_assoc.source_reflection.inverse_of&.name
|
717
|
-
#
|
728
|
+
# binding.pry unless nm
|
718
729
|
link_back << nm # if nm
|
719
730
|
"ON br_t#{idx}.#{a.foreign_key} = br_t#{idx - 1}.#{a.active_record.primary_key}"
|
720
731
|
end
|
@@ -731,16 +742,8 @@ module ActiveRecord
|
|
731
742
|
nix << k
|
732
743
|
next
|
733
744
|
elsif src_ref.macro == :belongs_to # Traditional HMT using an associative table
|
734
|
-
# binding.pry if link_back.length > 2
|
735
745
|
"br_t#{idx}.#{hm.foreign_key}"
|
736
746
|
else # A HMT that goes HM -> HM, something like Categories -> Products -> LineItems
|
737
|
-
# %%% Currently flaky, so will revisit this soon, probably while implementing the whole link_back architecture
|
738
|
-
if num_bt_things > 1
|
739
|
-
# binding.pry
|
740
|
-
nix << k
|
741
|
-
next
|
742
|
-
end
|
743
|
-
|
744
747
|
"br_t#{idx}.#{src_ref.active_record.primary_key}"
|
745
748
|
end
|
746
749
|
else
|
@@ -2743,31 +2746,15 @@ module Brick
|
|
2743
2746
|
end
|
2744
2747
|
end
|
2745
2748
|
abstract_activerecord_bases = ::Brick.eager_load_classes(true)
|
2746
|
-
|
2747
|
-
|
2748
|
-
|
2749
|
-
|
2750
|
-
|
2751
|
-
|
2752
|
-
|
2753
|
-
end
|
2754
|
-
# For all non-commented lines, look for any that start with "class " and also "< ApplicationRecord"
|
2755
|
-
if line.lstrip.start_with?('class ') && (idx = line.index('class')) &&
|
2756
|
-
(model_name = line[idx + 5..-1].match(/[\s:]+([\w:]+)/)&.captures&.first)
|
2757
|
-
# Prefix model class name with module names, if any
|
2758
|
-
model_name = modules.map{|m| "#{m}::"}.join + model_name
|
2759
|
-
unless abstract_activerecord_bases.include?(model_name)
|
2760
|
-
klass = begin
|
2761
|
-
model_name.constantize
|
2762
|
-
rescue
|
2763
|
-
end
|
2764
|
-
s[model_name.underscore.tr('/', '.').pluralize] = [
|
2765
|
-
path.start_with?(rails_root) ? path[rails_root.length + 1..-1] : path,
|
2766
|
-
klass
|
2767
|
-
]
|
2768
|
-
end
|
2769
|
-
end
|
2749
|
+
rails_root = ::Rails.root.to_s
|
2750
|
+
models = ::Brick.relations.each_with_object({}) do |rel, s|
|
2751
|
+
begin
|
2752
|
+
if (model = rel.last[:class_name]&.constantize) &&
|
2753
|
+
(inh = ActiveRecord::Base._brick_inheriteds[model]&.join(':'))
|
2754
|
+
inh = inh[rails_root.length + 1..-1] if inh.start_with?(rails_root)
|
2755
|
+
s[rel.first] = [inh, model]
|
2770
2756
|
end
|
2757
|
+
rescue
|
2771
2758
|
end
|
2772
2759
|
end
|
2773
2760
|
::Brick.relations.map do |k, v|
|
@@ -2781,7 +2768,8 @@ module Brick
|
|
2781
2768
|
v[:class_name].constantize.table_name
|
2782
2769
|
rescue
|
2783
2770
|
end
|
2784
|
-
|
2771
|
+
model = model.first if model.is_a?(Array)
|
2772
|
+
[k, table_name || k, migrations&.fetch(res, nil), model]
|
2785
2773
|
end
|
2786
2774
|
end
|
2787
2775
|
|
@@ -61,9 +61,11 @@ module Brick
|
|
61
61
|
::Brick::Rails.display_binary(val)
|
62
62
|
else
|
63
63
|
if col_type
|
64
|
-
if lat_lng
|
64
|
+
if lat_lng && !(lat_lng.first.zero? && lat_lng.last.zero?)
|
65
65
|
# Create a link to this style of Google maps URL: https://www.google.com/maps/place/38.7071296+-121.2810649/@38.7071296,-121.2810649,12z
|
66
66
|
"<a href=\"https://www.google.com/maps/place/#{lat_lng.first}+#{lat_lng.last}/@#{lat_lng.first},#{lat_lng.last},12z\" target=\"blank\">#{val}</a>"
|
67
|
+
elsif val.is_a?(Numeric)
|
68
|
+
::ActiveSupport::NumberHelper.number_to_delimited(val, delimiter: ',')
|
67
69
|
else
|
68
70
|
::Brick::Rails::FormBuilder.hide_bcrypt(val, col_type == :xml)
|
69
71
|
end
|
@@ -922,6 +924,9 @@ a.big-arrow {
|
|
922
924
|
background-color: #C0C0C0;
|
923
925
|
text-align: center;
|
924
926
|
}
|
927
|
+
.right {
|
928
|
+
text-align: right;
|
929
|
+
}
|
925
930
|
.orphan {
|
926
931
|
color: red;
|
927
932
|
white-space: nowrap;
|
@@ -1110,6 +1115,14 @@ if (headerTop) {
|
|
1110
1115
|
setHeaderSizes();
|
1111
1116
|
}, true);
|
1112
1117
|
}
|
1118
|
+
// Cause descriptive text to use the same font as the resource
|
1119
|
+
var brickFontFamily = document.getElementById(\"resourceName\").computedStyleMap().get(\"font-family\");
|
1120
|
+
if (window.brickFontFamily) {
|
1121
|
+
[...document.getElementsByClassName(\"__brick\")].forEach(function (x){
|
1122
|
+
if (!x.style.fontFamily)
|
1123
|
+
x.style.fontFamily = brickFontFamily.toString();
|
1124
|
+
});
|
1125
|
+
}
|
1113
1126
|
</script>"
|
1114
1127
|
|
1115
1128
|
erd_markup = if @_brick_model
|
@@ -1354,8 +1367,8 @@ end
|
|
1354
1367
|
%><%= if (page_num = @#{table_name}._brick_page_num)
|
1355
1368
|
\"<tr><td colspan=\\\"#\{td_count}\\\">Page #\{page_num}</td></tr>\".html_safe
|
1356
1369
|
end %></table>#{template_link}<%
|
1357
|
-
if description.present?
|
1358
|
-
description
|
1370
|
+
if description.present? %><span class=\"__brick\"><%=
|
1371
|
+
description %></span><br><%
|
1359
1372
|
end
|
1360
1373
|
# FILTER PARAMETERS
|
1361
1374
|
if @_brick_params&.present? %>
|
@@ -1366,12 +1379,12 @@ end
|
|
1366
1379
|
if (destination_fk = Brick.relations[origin.table_name][:fks].values.find { |fk| fk[:fk] == key_parts.last }) &&
|
1367
1380
|
(objs = (destination = origin.reflect_on_association(destination_fk[:assoc_name])&.klass)&.find(id))
|
1368
1381
|
objs = [objs] unless objs.is_a?(Array) %>
|
1369
|
-
<h3>for <% objs.each do |obj| %><%=
|
1382
|
+
<h3 class=\"__brick\">for <% objs.each do |obj| %><%=
|
1370
1383
|
link_to \"#{"#\{obj.brick_descrip\} (#\{destination.name\})\""}, send(\"#\{destination._brick_index(:singular)\}_path\".to_sym, id)
|
1371
1384
|
%><% end %></h3><%
|
1372
1385
|
end
|
1373
1386
|
end %>
|
1374
|
-
(<%= link_to \"See all #\{model.base_class.name.split('::').last.pluralize}\", #{@_brick_model._brick_index}_path %>)
|
1387
|
+
<span class=\"__brick\">(<%= link_to \"See all #\{model.base_class.name.split('::').last.pluralize}\", #{@_brick_model._brick_index}_path %>)</span>
|
1375
1388
|
<% end
|
1376
1389
|
# COLUMN EXCLUSIONS
|
1377
1390
|
if @_brick_excl&.present? %>
|
@@ -1422,7 +1435,7 @@ end
|
|
1422
1435
|
cols, poly_cols, bts, #{hms_keys.inspect}, {#{hms_columns.join(', ')}}) %>
|
1423
1436
|
|
1424
1437
|
#{"<hr><%= link_to(\"New #{new_path_name = "new_#{path_obj_name}_path"
|
1425
|
-
obj_name}\", #{new_path_name}) if respond_to?(:#{new_path_name}) %>" unless @_brick_model.is_view?}
|
1438
|
+
obj_name}\", #{new_path_name}, { class: '__brick' }) if respond_to?(:#{new_path_name}) %>" unless @_brick_model.is_view?}
|
1426
1439
|
#{script}
|
1427
1440
|
</body>
|
1428
1441
|
</html>
|
@@ -1534,7 +1547,7 @@ end
|
|
1534
1547
|
<p style=\"color: green\"><%= notice if request.respond_to?(:flash) %></p>#{"
|
1535
1548
|
#{schema_options}" if schema_options}
|
1536
1549
|
<select id=\"tbl\">#{table_options}</select>
|
1537
|
-
<table><td><h1><%= page_title %></h1></td>
|
1550
|
+
<table id=\"resourceName\"><td><h1><%= page_title %></h1></td>
|
1538
1551
|
<% if Object.const_defined?('Avo') && ::Avo.respond_to?(:railtie_namespace) %>
|
1539
1552
|
<td><%= link_to_brick(
|
1540
1553
|
avo_svg,
|
@@ -1560,10 +1573,10 @@ end
|
|
1560
1573
|
end %>
|
1561
1574
|
</table>
|
1562
1575
|
<%
|
1563
|
-
if (description = (relation = Brick.relations[#{model_name}.table_name])&.fetch(:description, nil))
|
1564
|
-
description
|
1576
|
+
if (description = (relation = Brick.relations[#{model_name}.table_name])&.fetch(:description, nil)) %>
|
1577
|
+
<span class=\"__brick\"><%= description %></span><br><%
|
1565
1578
|
end
|
1566
|
-
%><%= link_to \"(See all #\{model_name.pluralize})\", see_all_path %>
|
1579
|
+
%><%= link_to \"(See all #\{model_name.pluralize})\", see_all_path, { class: '__brick' } %>
|
1567
1580
|
#{erd_markup}
|
1568
1581
|
<% if obj
|
1569
1582
|
# path_options = [obj.#{pk}]
|
@@ -1647,7 +1660,8 @@ end
|
|
1647
1660
|
#{unless args.first == 'new'
|
1648
1661
|
# Was: confirm_are_you_sure = ActionView.version < ::Gem::Version.new('7.0') ? "data: { confirm: 'Delete #\{model_name} -- Are you sure?' }" : "form: { data: { turbo_confirm: 'Delete #\{model_name} -- Are you sure?' } }"
|
1649
1662
|
confirm_are_you_sure = "data: { confirm: 'Delete #\{model_name} -- Are you sure?' }"
|
1650
|
-
|
1663
|
+
ret = +"<%= button_to(\"Delete #\{@#{obj_name}.brick_descrip}\", send(\"#\{#{model_name}._brick_index(:singular)}_path\".to_sym, @#{obj_name}), { method: 'delete', class: 'danger', #{confirm_are_you_sure} }) %>"
|
1664
|
+
hms_headers.each_with_object(ret) do |hm, s|
|
1651
1665
|
# %%% Would be able to remove this when multiple foreign keys to same destination becomes bulletproof
|
1652
1666
|
next if hm.first.options[:through] && !hm.first.through_reflection
|
1653
1667
|
|
@@ -1707,8 +1721,7 @@ end
|
|
1707
1721
|
else
|
1708
1722
|
s
|
1709
1723
|
end
|
1710
|
-
end
|
1711
|
-
"<%= button_to(\"Delete #\{@#{obj_name}.brick_descrip}\", send(\"#\{#{model_name}._brick_index(:singular)}_path\".to_sym, @#{obj_name}), { method: 'delete', class: 'danger', #{confirm_are_you_sure} }) %>"
|
1724
|
+
end
|
1712
1725
|
end}
|
1713
1726
|
<% end %>
|
1714
1727
|
#{script}
|
@@ -1793,7 +1806,8 @@ flatpickr(\".timepicker\", {enableTime: true, noCalendar: true});
|
|
1793
1806
|
|
1794
1807
|
mermaidCode = document.createElement(\"SCRIPT\");
|
1795
1808
|
mermaidCode.setAttribute(\"src\", \"https://cdn.jsdelivr.net/npm/mermaid@9.1.7/dist/mermaid.min.js\");
|
1796
|
-
mermaidCode.addEventListener(\"load\",
|
1809
|
+
mermaidCode.addEventListener(\"load\", mermaidLoaded);
|
1810
|
+
function mermaidLoaded() {
|
1797
1811
|
mermaid.initialize({
|
1798
1812
|
startOnLoad: true,
|
1799
1813
|
securityLevel: \"loose\",
|
@@ -1826,6 +1840,14 @@ flatpickr(\".timepicker\", {enableTime: true, noCalendar: true});
|
|
1826
1840
|
window.history.pushState({}, '', changeout(location.href, '_brick_erd', null));
|
1827
1841
|
});
|
1828
1842
|
mermaidErd.appendChild(span);
|
1843
|
+
}
|
1844
|
+
// If there's an error with the CDN during load, revert to our local copy
|
1845
|
+
mermaidCode.addEventListener(\"error\", function (e) {
|
1846
|
+
console.warn(\"As we're unable to load Mermaid from\\n \" + e.srcElement.src + \" ,\\nnow reverting to copy from /assets.\");
|
1847
|
+
var mermaidCode2 = document.createElement(\"SCRIPT\");
|
1848
|
+
mermaidCode2.setAttribute(\"src\", \"/assets/mermaid.min.js\");
|
1849
|
+
mermaidCode2.addEventListener(\"load\", mermaidLoaded);
|
1850
|
+
e.srcElement.replaceWith(mermaidCode2);
|
1829
1851
|
});
|
1830
1852
|
document.body.appendChild(mermaidCode);
|
1831
1853
|
}
|
@@ -76,11 +76,14 @@ module Brick::Rails::FormTags
|
|
76
76
|
pk.map { |pk_part| obj.send(pk_part.to_sym) }), { class: 'big-arrow' })}</td>\n" if pk.present?
|
77
77
|
sequence.each do |col_name|
|
78
78
|
val = obj.attributes[col_name]
|
79
|
+
bt = bts[col_name]
|
79
80
|
out << '<td'
|
80
|
-
|
81
|
-
|
81
|
+
(classes ||= []) << 'dimmed' unless cols.key?(col_name) || (cust_col = cust_cols[col_name]) ||
|
82
|
+
(col_name.is_a?(Symbol) && bts.key?(col_name)) # HOT
|
83
|
+
(classes ||= []) << 'right' if val.is_a?(Numeric) && !bt
|
84
|
+
out << " class=\"#{classes.join(' ')}\"" if classes&.present?
|
82
85
|
out << '>'
|
83
|
-
if (bt
|
86
|
+
if (bt || composite_bt_names[col_name])
|
84
87
|
if bt[2] # Polymorphic?
|
85
88
|
if (poly_id = obj.send("#{bt.first}_id"))
|
86
89
|
# Was: obj.send("#{bt.first}_type")
|
data/lib/brick/version_number.rb
CHANGED
@@ -62,7 +62,7 @@ module Brick
|
|
62
62
|
dir = +"#{::Rails.root}/app"
|
63
63
|
path[0..-2].each do |path_part|
|
64
64
|
dir << "/#{path_part}"
|
65
|
-
Dir.mkdir(dir) unless Dir.
|
65
|
+
Dir.mkdir(dir) unless Dir.exist?(dir)
|
66
66
|
end
|
67
67
|
File.open("#{dir}/#{path.last}.rb", 'w') { |f| f.write code } unless code.blank?
|
68
68
|
end
|
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.134
|
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-04-
|
11
|
+
date: 2023-04-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|