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: bc284b8783ca27862ff567079ba680a238690e3779a57d705ee67a54ed016ab2
4
- data.tar.gz: 812044a88cff33dbf4fe7dbfa37a80e91b1b1a94980091590f4665a123529e80
3
+ metadata.gz: faca98f57870f50ba6474325fa995fe70ac36b4efd4c58946553242afe7ccb86
4
+ data.tar.gz: 3dd28e3cb60b74bd99209da86e302b7301e0eb844e314e7c56dde43ed4475b7e
5
5
  SHA512:
6
- metadata.gz: 9a5f82a5956b40beeaa8aeca2861672561ea552b3b21cb85ebf9b426a31bdbd4025f4c047131ae962cdefb31378c8845c9bea947a50dfc34cf497cd9b68ae6b9
7
- data.tar.gz: 83e1c1399045dc67d6c5dcd98347d2c84a7dec4ac474b5cc09da43b86ce21859d01204844be75d6764a5653c7ea1c220f3887835d07f703c789a82b6311bfad0
6
+ metadata.gz: 3ccbfc86abb0a16f053ddbf0b43e0c96a6d70a9f2ab3cab95ea008d76bcba1572aaf87b5d6eb9a79a342c20b26b900c42a1dd178c6b478e6f0f8daf372bb9189
7
+ data.tar.gz: 464e92a80e820c66c8ed2517593440e0752bfc4b8d7fdf3667fd662291b6663e95e417f60281647529cea7c11c0d13a3fa5c22d69142c6b880db5ae077e632d3
@@ -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
- if (json_cols = model.columns.select { |c| c.type == :json }.map(&:name)).present?
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]) # At least attempt to turn this into a parsed hash or array object
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
+ "&lt;&nbsp;#{signature.last} image, #{val.length} bytes&nbsp;>"
32
+ end
33
+ else
34
+ "&lt;&nbsp;Binary, #{val.length} bytes&nbsp;>"
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
- \"&lt;&nbsp;#\{signature.last} image, #\{val.length} bytes&nbsp;>\"
956
- end
957
- else
958
- \"&lt;&nbsp;Binary, #\{val.length} bytes&nbsp;>\"
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
- options[:url] = send(\"#\{#{model_name}._brick_index(:singular)}_path\".to_sym, obj) if ::Brick.config.path_prefix
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\">&lt;&lt; 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 || '')
@@ -5,7 +5,7 @@ module Brick
5
5
  module VERSION
6
6
  MAJOR = 1
7
7
  MINOR = 0
8
- TINY = 118
8
+ TINY = 120
9
9
 
10
10
  # PRE is nil unless it's a pre-release (beta, RC, etc.)
11
11
  PRE = nil
@@ -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 #45\" where 45 is that
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.118
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-03 00:00:00.000000000 Z
11
+ date: 2023-03-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord