brick 1.0.118 → 1.0.120
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: faca98f57870f50ba6474325fa995fe70ac36b4efd4c58946553242afe7ccb86
|
4
|
+
data.tar.gz: 3dd28e3cb60b74bd99209da86e302b7301e0eb844e314e7c56dde43ed4475b7e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3ccbfc86abb0a16f053ddbf0b43e0c96a6d70a9f2ab3cab95ea008d76bcba1572aaf87b5d6eb9a79a342c20b26b900c42a1dd178c6b478e6f0f8daf372bb9189
|
7
|
+
data.tar.gz: 464e92a80e820c66c8ed2517593440e0752bfc4b8d7fdf3667fd662291b6663e95e417f60281647529cea7c11c0d13a3fa5c22d69142c6b880db5ae077e632d3
|
data/lib/brick/extensions.rb
CHANGED
@@ -1846,11 +1846,12 @@ class Object
|
|
1846
1846
|
|
1847
1847
|
instance_variable_set("@#{singular_table_name}".to_sym, (obj = find_obj))
|
1848
1848
|
upd_params = send(params_name_sym)
|
1849
|
-
|
1849
|
+
json_overrides = ::Brick.config.json_columns&.fetch(table_name, nil)
|
1850
|
+
if (json_cols = model.columns.select { |c| c.type == :json || json_overrides&.include?(c.name) }.map(&:name)).present?
|
1850
1851
|
upd_hash = upd_params.to_h
|
1851
1852
|
json_cols.each do |c|
|
1852
1853
|
begin
|
1853
|
-
upd_hash[c] = JSON.parse(upd_hash[c])
|
1854
|
+
upd_hash[c] = JSON.parse(upd_hash[c].tr('`', '"').gsub('^^br_btick__', '`'))
|
1854
1855
|
rescue
|
1855
1856
|
end
|
1856
1857
|
end
|
@@ -2,6 +2,39 @@
|
|
2
2
|
|
3
3
|
module Brick
|
4
4
|
module Rails
|
5
|
+
def self.display_binary(val)
|
6
|
+
@image_signatures ||= { (+"\xFF\xD8\xFF\xEE").force_encoding('ASCII-8BIT') => 'jpeg',
|
7
|
+
(+"\xFF\xD8\xFF\xE0\x00\x10\x4A\x46\x49\x46\x00\x01").force_encoding('ASCII-8BIT') => 'jpeg',
|
8
|
+
(+"\x89PNG\r\n\x1A\n").force_encoding('ASCII-8BIT') => 'png',
|
9
|
+
'<svg' => 'svg+xml', # %%% Not yet very good detection for SVG
|
10
|
+
(+'BM').force_encoding('ASCII-8BIT') => 'bmp',
|
11
|
+
(+'GIF87a').force_encoding('ASCII-8BIT') => 'gif',
|
12
|
+
(+'GIF89a').force_encoding('ASCII-8BIT') => 'gif' }
|
13
|
+
|
14
|
+
if val[0..1] == "\x15\x1C" # One of those goofy Microsoft OLE containers?
|
15
|
+
package_header_length = val[2..3].bytes.reverse.inject(0) {|m, b| (m << 8) + b }
|
16
|
+
# This will often be just FF FF FF FF
|
17
|
+
# object_size = val[16..19].bytes.reverse.inject(0) {|m, b| (m << 8) + b }
|
18
|
+
friendly_and_class_names = val[20...package_header_length].split("\0")
|
19
|
+
object_type_name_length = val[package_header_length + 8..package_header_length+11].bytes.reverse.inject(0) {|m, b| (m << 8) + b }
|
20
|
+
friendly_and_class_names << val[package_header_length + 12...package_header_length + 12 + object_type_name_length].strip
|
21
|
+
# friendly_and_class_names will now be something like: ['Bitmap Image', 'Paint.Picture', 'PBrush']
|
22
|
+
real_object_size = val[package_header_length + 20 + object_type_name_length..package_header_length + 23 + object_type_name_length].bytes.reverse.inject(0) {|m, b| (m << 8) + b }
|
23
|
+
object_start = package_header_length + 24 + object_type_name_length
|
24
|
+
val = val[object_start...object_start + real_object_size]
|
25
|
+
end
|
26
|
+
|
27
|
+
if (signature = @image_signatures.find { |k, _v| val[0...k.length] == k })
|
28
|
+
if val.length < 500_000
|
29
|
+
"<img src=\"data:image/#{signature.last};base64,#{Base64.encode64(val)}\">"
|
30
|
+
else
|
31
|
+
"< #{signature.last} image, #{val.length} bytes >"
|
32
|
+
end
|
33
|
+
else
|
34
|
+
"< Binary, #{val.length} bytes >"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
5
38
|
# See http://guides.rubyonrails.org/engines.html
|
6
39
|
class Engine < ::Rails::Engine
|
7
40
|
JS_CHANGEOUT = "function changeout(href, param, value, trimAfter) {
|
@@ -186,6 +219,21 @@ function linkSchemas() {
|
|
186
219
|
end
|
187
220
|
end
|
188
221
|
|
222
|
+
# class Fields::TextField
|
223
|
+
# alias _original_initialize initialize
|
224
|
+
# def initialize(id, **args, &block)
|
225
|
+
# if instance_of?(::Avo::Fields::TextField) || instance_of?(::Avo::Fields::TextareaField)
|
226
|
+
# args[:format_using] ||= ->(value) do
|
227
|
+
# if value.is_a?(String) && value.encoding != Encoding::UTF_8
|
228
|
+
# value = value.encode!("UTF-8", invalid: :replace, undef: :replace, replace: "?")
|
229
|
+
# end
|
230
|
+
# value
|
231
|
+
# end
|
232
|
+
# end
|
233
|
+
# _original_initialize(id, **args, &block)
|
234
|
+
# end
|
235
|
+
# end
|
236
|
+
|
189
237
|
class App
|
190
238
|
class << self
|
191
239
|
alias _brick_eager_load eager_load
|
@@ -451,6 +499,13 @@ window.addEventListener(\"popstate\", linkSchemas);
|
|
451
499
|
end
|
452
500
|
end
|
453
501
|
|
502
|
+
# Spina compatibility
|
503
|
+
if Object.const_defined?('Spina')
|
504
|
+
# Add JSON fields
|
505
|
+
(::Brick.config.json_columns['spina_accounts'] ||= []) << 'json_attributes' if ::Spina.const_defined?('Account')
|
506
|
+
(::Brick.config.json_columns['spina_pages'] ||= []) << 'json_attributes' if ::Spina.const_defined?('Page')
|
507
|
+
end
|
508
|
+
|
454
509
|
# ====================================
|
455
510
|
# Dynamically create generic templates
|
456
511
|
# ====================================
|
@@ -916,7 +971,7 @@ def display_value(col_type, val)
|
|
916
971
|
'(Add RGeo gem to parse geometry detail)'
|
917
972
|
end
|
918
973
|
when :binary
|
919
|
-
display_binary(val) if val
|
974
|
+
::Brick::Rails.display_binary(val) if val
|
920
975
|
else
|
921
976
|
if col_type
|
922
977
|
hide_bcrypt(val, col_type == :xml)
|
@@ -926,39 +981,6 @@ def display_value(col_type, val)
|
|
926
981
|
end
|
927
982
|
end
|
928
983
|
|
929
|
-
def image_signatures
|
930
|
-
@image_signatures ||= { \"\\xFF\\xD8\\xFF\\xEE\".force_encoding('ASCII-8BIT') => 'jpeg',
|
931
|
-
\"\\xFF\\xD8\\xFF\\xE0\\x00\\x10\\x4A\\x46\\x49\\x46\\x00\\x01\".force_encoding('ASCII-8BIT') => 'jpeg',
|
932
|
-
\"\\x89PNG\\r\\n\\x1A\\n\".force_encoding('ASCII-8BIT') => 'png',
|
933
|
-
'<svg' => 'svg+xml', # %%% Not yet very good detection for SVG
|
934
|
-
'BM'.force_encoding('ASCII-8BIT') => 'bmp',
|
935
|
-
'GIF87a'.force_encoding('ASCII-8BIT') => 'gif',
|
936
|
-
'GIF89a'.force_encoding('ASCII-8BIT') => 'gif' }
|
937
|
-
end
|
938
|
-
def display_binary(val)
|
939
|
-
if val[0..1] == \"\\x15\\x1C\" # One of those goofy Microsoft OLE containers?
|
940
|
-
package_header_length = val[2..3].bytes.reverse.inject(0) {|m, b| (m << 8) + b }
|
941
|
-
# This will often be just FF FF FF FF
|
942
|
-
# object_size = val[16..19].bytes.reverse.inject(0) {|m, b| (m << 8) + b }
|
943
|
-
friendly_and_class_names = val[20...package_header_length].split(\"\\0\")
|
944
|
-
object_type_name_length = val[package_header_length + 8..package_header_length+11].bytes.reverse.inject(0) {|m, b| (m << 8) + b }
|
945
|
-
friendly_and_class_names << val[package_header_length + 12...package_header_length + 12 + object_type_name_length].strip
|
946
|
-
# friendly_and_class_names will now be something like: ['Bitmap Image', 'Paint.Picture', 'PBrush']
|
947
|
-
real_object_size = val[package_header_length + 20 + object_type_name_length..package_header_length + 23 + object_type_name_length].bytes.reverse.inject(0) {|m, b| (m << 8) + b }
|
948
|
-
object_start = package_header_length + 24 + object_type_name_length
|
949
|
-
val = val[object_start...object_start + real_object_size]
|
950
|
-
end
|
951
|
-
if (signature = image_signatures.find { |k, _v| val[0...k.length] == k })
|
952
|
-
if val.length < 500_000
|
953
|
-
\"<img src=\\\"data:image/#\{signature.last};base64,#\{Base64.encode64(val)}\\\">\"
|
954
|
-
else
|
955
|
-
\"< #\{signature.last} image, #\{val.length} bytes >\"
|
956
|
-
end
|
957
|
-
else
|
958
|
-
\"< Binary, #\{val.length} bytes >\"
|
959
|
-
end
|
960
|
-
end
|
961
|
-
|
962
984
|
# Accommodate composite primary keys that include strings with forward-slash characters
|
963
985
|
def slashify(*vals)
|
964
986
|
vals.map { |val_part| val_part.is_a?(String) ? val_part.gsub('/', '^^sl^^') : val_part }
|
@@ -1551,8 +1573,11 @@ end
|
|
1551
1573
|
# path_options << { '_brick_schema': } if
|
1552
1574
|
# url = send(:#\{model._brick_index(:singular)}_path, obj.#{pk})
|
1553
1575
|
options = {}
|
1554
|
-
|
1555
|
-
|
1576
|
+
if ::Brick.config.path_prefix
|
1577
|
+
path_helper = obj.new_record? ? #{model_name}._brick_index : #{model_name}._brick_index(:singular)
|
1578
|
+
options[:url] = send(\"#\{path_helper}_path\".to_sym, obj)
|
1579
|
+
end
|
1580
|
+
%>
|
1556
1581
|
<br><br>
|
1557
1582
|
<%= form_for(obj.becomes(#{model_name}), options) do |f| %>
|
1558
1583
|
<table class=\"shadow\">
|
@@ -1660,16 +1685,23 @@ end
|
|
1660
1685
|
if val.length < 31 && (val.length - 6) % 8 == 0 && val[0..5].bytes == [230, 16, 0, 0, 1, 12]
|
1661
1686
|
display_value('geography', val)
|
1662
1687
|
else
|
1663
|
-
display_binary(val)
|
1688
|
+
::Brick::Rails.display_binary(val)
|
1664
1689
|
end.html_safe
|
1665
1690
|
end %>
|
1666
1691
|
<% when :primary_key
|
1667
1692
|
is_revert = false %>
|
1668
1693
|
<% when :json
|
1669
|
-
is_includes_json = true
|
1694
|
+
is_includes_json = true
|
1695
|
+
if val.is_a?(String)
|
1696
|
+
val_str = val
|
1697
|
+
else
|
1698
|
+
eheij = ActiveSupport::JSON::Encoding.escape_html_entities_in_json
|
1699
|
+
ActiveSupport::JSON::Encoding.escape_html_entities_in_json = false if eheij
|
1700
|
+
val_str = val.to_json
|
1701
|
+
ActiveSupport::JSON::Encoding.escape_html_entities_in_json = eheij
|
1702
|
+
end %>
|
1670
1703
|
<%= # Because there are so danged many quotes in JSON, escape them specially by converting to backticks.
|
1671
1704
|
# (and previous to this, escape backticks with our own goofy code of ^^br_btick__ )
|
1672
|
-
val_str = val.is_a?(String) ? val : val.to_json # Clean up bogus JSON if necessary
|
1673
1705
|
json_field = f.hidden_field k.to_sym, { class: 'jsonpicker', value: val_str.gsub('`', '^^br_btick__').tr('\"', '`').html_safe } %>
|
1674
1706
|
<div id=\"_br_json_<%= f.field_id(k) %>\"></div>
|
1675
1707
|
<% else %>
|
@@ -1797,7 +1829,7 @@ flatpickr(\".timepicker\", {enableTime: true, noCalendar: true});
|
|
1797
1829
|
onChange: (function (inp2) {
|
1798
1830
|
return function (updatedContent, previousContent, contentErrors, patchResult) {
|
1799
1831
|
// console.log('onChange', updatedContent.json, updatedContent.text);
|
1800
|
-
inp2.value = updatedContent.text || JSON.stringify(updatedContent.json);
|
1832
|
+
inp2.value = (updatedContent.text || JSON.stringify(updatedContent.json)).replace(/`/g, \"\\^\\^br_btick__\").replace(/\"/g, '`');
|
1801
1833
|
};
|
1802
1834
|
})(inp)
|
1803
1835
|
}
|
@@ -90,7 +90,7 @@ module Brick::Rails::FormTags
|
|
90
90
|
# 0..62 because Postgres column names are limited to 63 characters
|
91
91
|
obj, descrips[0..-2].map { |id| obj.send(id.last[0..62]) }, bt_id_col
|
92
92
|
)
|
93
|
-
bt_txt = display_binary(bt_txt).html_safe if bt_txt&.encoding&.name == 'ASCII-8BIT'
|
93
|
+
bt_txt = ::Brick::Rails.display_binary(bt_txt).html_safe if bt_txt&.encoding&.name == 'ASCII-8BIT'
|
94
94
|
bt_txt ||= "<span class=\"orphan\"><< Orphaned ID: #{val} >></span>" if val
|
95
95
|
bt_id = bt_id_col&.map { |id_col| obj.respond_to?(id_sym = id_col.to_sym) ? obj.send(id_sym) : id_col }
|
96
96
|
out << (bt_id&.first ? link_to(bt_txt, send("#{bt_class.base_class._brick_index(:singular)}_path".to_sym, bt_id)) : bt_txt || '')
|
data/lib/brick/version_number.rb
CHANGED
@@ -268,7 +268,7 @@ if ActiveRecord::Base.respond_to?(:brick_select) && !::Brick.initializer_loaded
|
|
268
268
|
# # FRIENDLY DSL
|
269
269
|
|
270
270
|
# # A simple DSL is available to allow more user-friendly display of objects. Normally a user object might be shown
|
271
|
-
# # as its first non-metadata column, or if that is not available then something like \"User #
|
271
|
+
# # as its first non-metadata column, or if that is not available then something like \"User #42\" where 42 is that
|
272
272
|
# # object's ID. If there is no primary key then even that is not possible, so the object's .to_s method is called.
|
273
273
|
# # To override these defaults and specify exactly what you want shown, such as first names and last names for a
|
274
274
|
# # user, then you can use model_descrips like this, putting expressions with property references in square brackets:
|
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.120
|
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-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|