brick 1.0.172 → 1.0.173

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8a38be99462ba1e409c48be433e3ab289b971872c6a3988e28159f52cfdc4645
4
- data.tar.gz: 4af53a2029649d13b978f9ab263ce2ead02818afd807751621cf6fd38ac1b7dc
3
+ metadata.gz: 0a26fe42450ca6c08c82b70f7d60c51a256b3171e626f961806564336413c645
4
+ data.tar.gz: d02880197677be70fef8b9f4897210202a31610660245953cd5f6acf03cfee49
5
5
  SHA512:
6
- metadata.gz: 9890e01ab3124bf1256f094569abd92c92712d440df8f3ccf9f06cf6ec57fb29bf4afa3e7acc7344253330ae80cbb17983aa4b6b508f2748b13b8926553dadd1
7
- data.tar.gz: 280c4a94f788fe459f83ea18fa858152020d952eadb0bc5cd9aee645e03faf65d3dca5edd045328366d7f67a62879341043657396c6bf35ab0e282850cd889fe
6
+ metadata.gz: 51bd9281080d4d77b61b309c9dfe1fc160ac7377591ec06cbe1127edadcd2a608ed09f96787979bdcb02c30a331232e413f0e5b9e2993ddb5000f026f3ce4249
7
+ data.tar.gz: 4a28c71ca04c1d2036e07415c363ff7b6d72fa843c0233ec01f9ec1ab074f01cb1e48919c7cfe91ad9c9a1592c8c473ab09fa4b4cbf49a8e50fbce36e5e6417c
@@ -1885,7 +1885,7 @@ class Object
1885
1885
  cspd.select! { |val| val == "'self'" }
1886
1886
  cspd << style_value
1887
1887
  else
1888
- cspd << "'sha256-W2ts9oOhJ+mkUTLCn4yS7VZSGkeqfdUogX8MEjE0TSw='"
1888
+ cspd << "'sha256-Q8t+pETkz0RtyV4XprwdP+uEkVaFyMnx1mXif0wDoxw='"
1889
1889
  end
1890
1890
  cspd << 'https://cdn.jsdelivr.net'
1891
1891
  end
@@ -2278,10 +2278,15 @@ class Object
2278
2278
  else
2279
2279
  @_lookup_context.instance_variable_set("@#{singular_table_name}".to_sym,
2280
2280
  (created_obj = model.send(:create, send(params_name_sym))))
2281
- # %%% Surface any errors to the user in a flash message
2282
2281
  @_lookup_context.instance_variable_set(:@_brick_model, model)
2283
- index
2284
- render :index
2282
+ if created_obj.errors.empty?
2283
+ index
2284
+ render :index
2285
+ else # Surface errors to the user in a flash message
2286
+ flash.alert = (created_obj.errors.errors.map { |err| "<b>#{err.attribute}</b> #{err.message}" }.join(', '))
2287
+ new
2288
+ render :new
2289
+ end
2285
2290
  end
2286
2291
  end
2287
2292
 
@@ -2350,6 +2355,9 @@ class Object
2350
2355
  upd_hash[model.inheritance_column] = nil
2351
2356
  end
2352
2357
  obj.send(:update, upd_hash || upd_params)
2358
+ if obj.errors.any? # Surface errors to the user in a flash message
2359
+ flash.alert = (obj.errors.errors.map { |err| "<b>#{err.attribute}</b> #{err.message}" }.join(', '))
2360
+ end
2353
2361
  end
2354
2362
 
2355
2363
  code << " def destroy\n"
@@ -2660,10 +2668,9 @@ end.class_exec do
2660
2668
  s[row.first] = { dt: row.last } unless ['information_schema', 'pg_catalog', 'pg_toast', 'heroku_ext',
2661
2669
  'INFORMATION_SCHEMA', 'sys'].include?(row.first)
2662
2670
  end
2663
- if (possible_schemas = (multitenancy = ::Brick.config.schema_behavior&.[](:multitenant)) &&
2664
- multitenancy&.[](:schema_to_analyse))
2665
- possible_schemas = [possible_schemas] unless possible_schemas.is_a?(Array)
2666
- if (possible_schema = possible_schemas.find { |ps| ::Brick.db_schemas.key?(ps) })
2671
+ possible_schema, possible_schemas, multitenancy = ::Brick.get_possible_schemas
2672
+ if possible_schemas
2673
+ if possible_schema
2667
2674
  ::Brick.default_schema = ::Brick.apartment_default_tenant
2668
2675
  schema = possible_schema
2669
2676
  orig_schema = ActiveRecord::Base.execute_sql('SELECT current_schemas(true)').first['current_schemas'][1..-2].split(',')
@@ -6,7 +6,7 @@ module Brick
6
6
  def display_value(col_type, val, lat_lng = nil)
7
7
  is_mssql_geography = nil
8
8
  # Some binary thing that really looks like a Microsoft-encoded WGS84 point? (With the first two bytes, E6 10, indicating an EPSG code of 4326)
9
- if col_type == :binary && val && val.length < 31 && (val.length - 6) % 8 == 0 && val[0..5].bytes == [230, 16, 0, 0, 1, 12]
9
+ if col_type == :binary && val && ::Brick.is_geography?(val)
10
10
  col_type = 'geography'
11
11
  is_mssql_geography = true
12
12
  end
@@ -19,7 +19,7 @@ module Brick
19
19
 
20
20
  if @is_mysql || (is_mssql_geography ||=
21
21
  (@is_mssql ||
22
- (val && val.length < 31 && (val.length - 6) % 8 == 0 && val[0..5].bytes == [230, 16, 0, 0, 1, 12])
22
+ (val && ::Brick.is_geography?(val))
23
23
  )
24
24
  )
25
25
  # MySQL's \"Internal Geometry Format\" and MSSQL's Geography are like WKB, but with an initial 4 bytes that indicates the SRID.
@@ -335,14 +335,10 @@ function linkSchemas() {
335
335
  def eager_load(entity)
336
336
  _brick_eager_load(entity)
337
337
  if entity == :resources
338
- # %%% This useful logic can be DRYd up since it's very similar to what's around extensions.rb:1894
339
- if (possible_schemas = (multitenancy = ::Brick.config.schema_behavior&.[](:multitenant)) &&
340
- multitenancy&.[](:schema_to_analyse))
341
- possible_schemas = [possible_schemas] unless possible_schemas.is_a?(Array)
342
- if (possible_schema = possible_schemas.find { |ps| ::Brick.db_schemas.key?(ps) })
343
- orig_tenant = Apartment::Tenant.current
344
- Apartment::Tenant.switch!(possible_schema)
345
- end
338
+ possible_schema, _x1, _x2 = ::Brick.get_possible_schemas
339
+ if possible_schema
340
+ orig_tenant = Apartment::Tenant.current
341
+ Apartment::Tenant.switch!(possible_schema)
346
342
  end
347
343
  existing = Avo::BaseResource.descendants.each_with_object({}) do |r, s|
348
344
  s[r.name[0..-9]] = nil if r.name.end_with?('Resource')
@@ -803,15 +799,26 @@ window.addEventListener(\"popstate\", linkSchemas);
803
799
  position: sticky;
804
800
  display: inline-block;
805
801
  left: 0;
802
+ z-index: 2;
806
803
  }
807
804
 
808
805
  .flashNotice {
809
806
  color: green;
810
807
  }
808
+ .flashAlert {
809
+ color: red;
810
+ }
811
811
 
812
812
  h1, h3 {
813
813
  margin-bottom: 0;
814
814
  }
815
+ #rowCount {
816
+ display: table-cell;
817
+ height: 32px;
818
+ vertical-align: middle;
819
+ font-size: 0.9em;
820
+ font-family: sans-serif;
821
+ }
815
822
  #imgErd {
816
823
  display: table-cell;
817
824
  background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE0AAABNCAMAAADU1xmCAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAARxaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+CiAgICAgICAgIDx0aWZmOllSZXNvbHV0aW9uPjcyPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj43MjwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgICAgPHhtcE1NOkRlcml2ZWRGcm9tIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgPHN0UmVmOmluc3RhbmNlSUQ+eG1wLmlpZDoxN0U3OEI3RjAzN0MxMUU3QTZDMDhBQjVCRDc2QkZCQjwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ+eG1wLmRpZDoxN0U3OEI4MDAzN0MxMUU3QTZDMDhBQjVCRDc2QkZCQjwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgPC94bXBNTTpEZXJpdmVkRnJvbT4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDoxN0U3OEI4MjAzN0MxMUU3QTZDMDhBQjVCRDc2QkZCQjwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOkluc3RhbmNlSUQ+eG1wLmlpZDoxN0U3OEI4MTAzN0MxMUU3QTZDMDhBQjVCRDc2QkZCQjwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3M8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+ChMBcXgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAL9UExURUdwTDRRc1EVG6ioqFJSUmJiYn+AgURWa2uEkauorszGwmtrawonUKzY7DMRIlFTVWV9m4qKiwaN0G1raJSQiJjV7jWh2HmizPLs6CaV0QohSmdoaVdXWLWsomFdYmIgD4WCfQWa2WIoFUxylldpekeRuGtrajhztIuLizV3qc3DvThDVEyFs31+fiRViVRNViVWjwsvWxIzXxZEekeL1FZIVVRdeEZrk359fj52ppubm3l6e4qbqJOTlBlGfM3k3Nzc3K6lnk9RWaenp0FjikGDyJGRkWJiYk2L0Li4uJubnH5+flFbeNPT02tpac3NzVBGJkCCyMvLy9LS0oxETk2U3tLS0tXV1cPDw+Xl5amDftbX19na2uLj4+jo6dzd3OXl511dXd/g31paWlZXV9TU1HBwcOvr687OzdDQ0u/u7fTx79PSzcrJx6KiooWFhujn5NvW05WUk7S1t3R1d7y9vcLCv37J68vMzVJTVOLY1gMiSpmamnt7e7K6zHq+43LQ9Vyez+Pf3LGyscXGybzD1sXDw46v02vI8I+Pj7vEtNvIx7q4ubnZ54a3it3f5s+8vGS/6L6trK+6qICs1H+33cXc6KiuwAOr48fN20ee0Fao0lyz4W6s1qyrrKKlt3XdkoqnyyFoqzuTy6ixosuVeobA4YHNl8TOv3/Ck9bc4I3P7Uqq3tDIxz2FwzN/vF+VxdDe59mIfU+OxJmovxl+wX7S9WjbhovW9jihyKGalIq31uNyY36exJCatJONhTm36nKj0B2q4Mqxsae2zc/U3tvf1cqKa7zAyJS4npqyyTh2tUhMT1drj5ixtN98cEfC8U2Y5vf39355cSN0s4mDfKaomlrG8b2cmcFvaGx/m2CeZge68HG64YCNntSgoVHUdJzKnIHIh6c+BalVVaPM5qrG2CZZkyaHH3WRtYrdn5nH2rxoP22+gN1VQTyxW1aXl0iO2GaxtFuzaCCAQyXSWDOKlDZwkxIINVZPP52Io3uldtIoC1uGVxmzRP6PHn8AAADVdFJOUwAmEf6t/v4EAQVR/oT+Hl4U/v1bR/7+Kf7+a/76Q4Y2Wf1b4j71sXm0y2hF/bBwbtXN/fyGl8Sxiu382Preqfzia9iIkdP51/Povnineu+9n6H7ov5ksLfYy/7////////+/////////////////////v/////////////////////////////////////////////////////////////////////////////+/////////////////////////////////////////////////////r5xM8kAAA0qSURBVFjDpZh3WFNnG8YDMZOiLEFEsVhn1Vq1Vq1abWv3br+dc5IQsklCSEiIyAoJyAhb9h4ishVQcCAIOLC4UBFxr7bu0X6dX6/vec8JikIptecPVrh+576f5z3vez+HQmGyKBSK28eT4SsL/fiXLiaFwmD/E5NzPmU7wG8s5l/DOXy8+vhxLg8TcN5/yw0JZPwV2GoJH+fjPI7UHBWV/8HzwGIynlkgm+vv788RiURSs06bT6WuJAQynlEgO+JaUzoWhGAWE1X1mkqlmYUEMp5JIBs7ejYz3L4iyN+gy1epVMGvaYI1K5faIIF/nsfuPDr325LMo5XpvCCFThUMrHccY2L85j2TQHZna11kZFGd19lo+4oI/yiqJiYmxtGP7kdf/gwC2bLWuix1RWTX7uzMo+PTI4KkJo0fXPSQkBDxDOc/KZBtaK3P4uLqrPXri+rcz4YjgbpgegidHhIgDhC/6/mnBLLNVTWdclzdmbYTeAMClVS6OCAgQGxnZ0cbM4dBPDKjoh2oqo309ZV3ppWV7UTAur1nw+MrIhRaRzsPsdiDRqN5v+lpO0oc0OrrirLkiWGVZVYeIXBLRFBUsNiH5kHz9vHxeZMxOhxb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);
@@ -1037,21 +1044,8 @@ callbacks = {} %>"
1037
1044
  poly_cols = #{poly_cols.inspect} %>"
1038
1045
  end
1039
1046
 
1040
- addNewLink = if !@_brick_model&.is_view?
1041
- "<% if respond_to?(:#{new_path_name = "new_#{path_obj_name}_path"}) %>
1042
- var addNew = document.createElement(\"A\");
1043
- addNew.id = \"addNew\";
1044
- addNew.href = \"<%= send(:#{new_path_name}) %>\";
1045
- addNew.title = \"New #{obj_name}\";
1046
- addNew.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"#fff\" d=\"M24 10h-10v-10h-4v10h-10v4h10v10h4v-10h10z\"/></svg>';
1047
- document.getElementById(\"headerButtonBox\").append(addNew);
1048
- <% end %>"
1049
- end
1050
-
1051
1047
  # %%% When doing schema select, if we're on a new page go to index
1052
1048
  script = "<script>
1053
- var #{table_name}HtColumns;
1054
-
1055
1049
  // Add \"Are you sure?\" behaviour to any data-confirm buttons out there
1056
1050
  document.querySelectorAll(\"input[type=submit][data-confirm]\").forEach(function (btn) {
1057
1051
  btn.addEventListener(\"click\", function (evt) {
@@ -1062,108 +1056,11 @@ document.querySelectorAll(\"input[type=submit][data-confirm]\").forEach(function
1062
1056
  });
1063
1057
  });
1064
1058
 
1059
+ <%= @_brick_javascripts&.fetch(:grid_scripts, nil)&.html_safe
1060
+ %>
1065
1061
  #{JS_CHANGEOUT}#{
1066
1062
  "\nbrickTestSchema = \"#{::Brick.test_schema}\";" if ::Brick.test_schema
1067
1063
  }
1068
- // Snag first TR for sticky header
1069
- var grid = document.getElementById(\"#{table_name}\");
1070
- #{table_name}HtColumns = grid && [grid.getElementsByTagName(\"TR\")[0]];
1071
- var headerTop = document.getElementById(\"headerTop\");
1072
- var headerCols;
1073
- if (grid) {
1074
- // COLUMN HEADER AND TABLE CELL HIGHLIGHTING
1075
- var gridHighHeader = null,
1076
- gridHighCell = null;
1077
- grid.addEventListener(\"mouseenter\", gridMove);
1078
- grid.addEventListener(\"mousemove\", gridMove);
1079
- grid.addEventListener(\"mouseleave\", function (evt) {
1080
- if (gridHighCell) gridHighCell.classList.remove(\"highlight\");
1081
- gridHighCell = null;
1082
- if (gridHighHeader) gridHighHeader.classList.remove(\"highlight\");
1083
- gridHighHeader = null;
1084
- });
1085
- function gridMove(evt) {
1086
- var lastHighCell = gridHighCell;
1087
- gridHighCell = document.elementFromPoint(evt.x, evt.y);
1088
- while (gridHighCell && gridHighCell.tagName !== \"TD\" && gridHighCell.tagName !== \"TH\")
1089
- gridHighCell = gridHighCell.parentElement;
1090
- if (gridHighCell) {
1091
- if (lastHighCell !== gridHighCell) {
1092
- gridHighCell.classList.add(\"highlight\");
1093
- if (lastHighCell) lastHighCell.classList.remove(\"highlight\");
1094
- }
1095
- var lastHighHeader = gridHighHeader;
1096
- if ((gridHighHeader = headerCols[gridHighCell.cellIndex]) && lastHighHeader !== gridHighHeader) {
1097
- if (gridHighHeader) gridHighHeader.classList.add(\"highlight\");
1098
- if (lastHighHeader) lastHighHeader.classList.remove(\"highlight\");
1099
- }
1100
- }
1101
- }
1102
- // // LESS TOUCHY NAVIGATION BACK OR FORWARD IN HISTORY WHEN USING MOUSE WHEEL
1103
- // grid.addEventListener(\"wheel\", function (evt) {
1104
- // grid.scrollLeft += evt.deltaX;
1105
- // document.body.scrollTop += (evt.deltaY * 0.6);
1106
- // evt.preventDefault();
1107
- // return false;
1108
- // });
1109
- }
1110
- function setHeaderSizes() {
1111
- if (grid.clientWidth > window.outerWidth)
1112
- document.getElementById(\"titleBox\").style.width = grid.clientWidth;
1113
- // console.log(\"start\");
1114
- // See if the headerTop is already populated
1115
- // %%% Grab the TRs from headerTop, clear it out, do this stuff, add them back
1116
- headerTop.innerHTML = \"\"; // %%% Would love to not have to clear it out like this every time! (Currently doing this to support resize events.)
1117
- var isEmpty = headerTop.childElementCount === 0;
1118
- var numFixed = parseInt(grid.getAttribute(\"x-num-frozen\")) || 0;
1119
- var fixedColLefts = [0];
1120
-
1121
- // Set up proper sizings of sticky column header
1122
- var node;
1123
- for (var j = 0; j < #{table_name}HtColumns.length; ++j) {
1124
- var row = #{table_name}HtColumns[j];
1125
- var tr = isEmpty ? document.createElement(\"TR\") : headerTop.childNodes[j];
1126
- tr.innerHTML = row.innerHTML.trim();
1127
- var curLeft = 0.0;
1128
- // Match up widths from the original column headers
1129
- for (var i = 0; i < row.childNodes.length; ++i) {
1130
- node = row.childNodes[i];
1131
- if (node.nodeType === 1) {
1132
- var th = tr.childNodes[i];
1133
- th.style.minWidth = th.style.maxWidth = getComputedStyle(node).width;
1134
- // Add \"left: __px\" style to the fixed-width column THs
1135
- if (i <= numFixed) {
1136
- th.style.position = \"sticky\";
1137
- th.style.backgroundColor = \"#008061\";
1138
- th.style.zIndex = \"1\";
1139
- th.style.left = curLeft + \"px\";
1140
- fixedColLefts.push(curLeft += node.clientWidth);
1141
- }
1142
- if (#{pk&.present? ? 'i > 0' : 'true'}) {
1143
- // Add <span> at the end
1144
- var span = document.createElement(\"SPAN\");
1145
- span.className = \"exclude\";
1146
- span.innerHTML = \"X\";
1147
- span.addEventListener(\"click\", function (e) {
1148
- e.stopPropagation();
1149
- doFetch(\"POST\", {_brick_exclude: this.parentElement.getAttribute(\"x-order\")});
1150
- });
1151
- th.appendChild(span);
1152
- }
1153
- }
1154
- }
1155
- headerCols = tr.childNodes;
1156
- if (isEmpty) headerTop.appendChild(tr);
1157
- }
1158
- // Add \"left: __px\" style to all fixed-width column TDs
1159
- [...grid.children[1].children].forEach(function (row) {
1160
- for (var j = 1; j <= numFixed; ++j) {
1161
- row.children[j].style.left = fixedColLefts[j] + 'px';
1162
- }
1163
- });
1164
- grid.style.marginTop = \"-\" + getComputedStyle(headerTop).height;
1165
- // console.log(\"end\");
1166
- }
1167
1064
  function doFetch(method, payload, success) {
1168
1065
  payload.authenticity_token = <%= session[:_csrf_token].inspect.html_safe %>;
1169
1066
  if (!success) {
@@ -1176,13 +1073,7 @@ function doFetch(method, payload, success) {
1176
1073
  if (payload) options.body = JSON.stringify(payload);
1177
1074
  return fetch(location.href, options).then(success);
1178
1075
  }
1179
- if (headerTop) {
1180
- setHeaderSizes();
1181
- window.addEventListener('resize', function(event) {
1182
- setHeaderSizes();
1183
- }, true);#{
1184
- addNewLink}
1185
- }
1076
+
1186
1077
  // Cause descriptive text to use the same font as the resource
1187
1078
  var brickFontFamily = document.getElementById(\"resourceName\").computedStyleMap().get(\"font-family\");
1188
1079
  if (window.brickFontFamily) {
@@ -1402,7 +1293,14 @@ erDiagram
1402
1293
  </head>
1403
1294
  <body>
1404
1295
  <div id=\"titleBox\"><div id=\"titleSticky\">
1405
- <p class=\"flashNotice\"><%= notice if request.respond_to?(:flash) %></p>#{"
1296
+ <% if request.respond_to?(:flash)
1297
+ if (alert)
1298
+ %><p class=\"flashAlert\"><%= alert.html_safe %></p><%
1299
+ end
1300
+ if (notice)
1301
+ %><p class=\"flashNotice\"><%= notice.html_safe %></p><%
1302
+ end
1303
+ end %>#{"
1406
1304
  #{schema_options}" if schema_options}
1407
1305
  <select id=\"tbl\">#{table_options}</select>
1408
1306
  <table id=\"resourceName\"><tr>
@@ -1620,7 +1518,14 @@ end
1620
1518
  c23.141-70.188,89.141-120.906,167.063-120.906c97.25,0,176,78.813,176,176C511.828,227.078,404.391,119.641,271.844,119.641z\" />
1621
1519
  </svg>
1622
1520
 
1623
- <p class=\"flashNotice\"><%= notice if request.respond_to?(:flash) %></p>#{"
1521
+ <% if request.respond_to?(:flash)
1522
+ if (alert)
1523
+ %><p class=\"flashAlert\"><%= alert.html_safe %></p><%
1524
+ end
1525
+ if (notice)
1526
+ %><p class=\"flashNotice\"><%= notice.html_safe %></p><%
1527
+ end
1528
+ end %>#{"
1624
1529
  #{schema_options}" if schema_options}
1625
1530
  <select id=\"tbl\">#{table_options}</select>
1626
1531
  <table id=\"resourceName\"><td><h1><%= page_title %></h1></td>
@@ -1694,12 +1599,14 @@ end
1694
1599
  end
1695
1600
  s << "<table id=\"#{hm_name}\" class=\"shadow\">
1696
1601
  <tr><th>#{hm[1]}#{' poly' if hm[0].options[:as]} #{hm[3]}
1602
+ <% if respond_to?(:new_#{partial_new_path_name = hm.first.klass._brick_index(:singular)}_path) %>
1697
1603
  <span class = \"add-hm-related\"><%=
1698
1604
  pk_val = (obj_pk = model.primary_key).is_a?(String) ? obj.send(obj_pk) : obj_pk.map { |pk_part| obj.send(pk_part) }
1699
1605
  pk_val_arr = [pk_val] unless pk_val.is_a?(Array)
1700
1606
  link_to('<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"#fff\" d=\"M24 10h-10v-10h-4v10h-10v4h10v10h4v-10h10z\"/></svg>'.html_safe,
1701
- new_#{hm.first.klass._brick_index(:singular)}_path(predicates))
1607
+ new_#{partial_new_path_name}_path(predicates))
1702
1608
  %></span>
1609
+ <% end %>
1703
1610
  </th></tr>
1704
1611
  <% if (assoc = @#{obj_name}.class.reflect_on_association(:#{hm_name})).macro == :has_one &&
1705
1612
  assoc.options&.fetch(:through, nil).nil?
@@ -91,8 +91,7 @@ module Brick::Rails::FormBuilder
91
91
  when :binary
92
92
  is_revert = false
93
93
  if val
94
- # %%% This same kind of geography check is done two other times in engine.rb ... would be great to DRY it up.
95
- out << if val.length < 31 && (val.length - 6) % 8 == 0 && val[0..5].bytes == [230, 16, 0, 0, 1, 12]
94
+ out << if ::Brick.is_geography?(val)
96
95
  ::Brick::Rails.display_value('geography', val)
97
96
  else
98
97
  ::Brick::Rails.display_binary(val)
@@ -1,7 +1,8 @@
1
1
  module Brick::Rails::FormTags
2
2
  # Our super speedy grid
3
3
  def brick_grid(relation = nil, bt_descrip = nil, sequence = nil, inclusions = nil, exclusions = nil,
4
- cols = {}, poly_cols = nil, bts = {}, hms_keys = [], hms_cols = {})
4
+ cols = {}, poly_cols = nil, bts = {}, hms_keys = [], hms_cols = {},
5
+ show_header: nil, show_row_count: nil, show_erd_button: nil, show_new_button: nil, show_avo_button: nil, show_aa_button: nil)
5
6
  # When a relation is not provided, first see if one exists which matches the controller name
6
7
  unless (relation ||= instance_variable_get("@#{controller_name}".to_sym))
7
8
  # Failing that, dig through the instance variables with hopes to find something that is an ActiveRecord::Relation
@@ -27,44 +28,57 @@ module Brick::Rails::FormTags
27
28
  nfc = Brick.config.sidescroll.fetch(relation.table_name, nil)&.fetch(:num_frozen_columns, nil) ||
28
29
  Brick.config.sidescroll.fetch(:num_frozen_columns, nil) ||
29
30
  0
31
+
32
+ # HTML for brick_grid
30
33
  out = +"<div id=\"headerTopContainer\"><table id=\"headerTop\"></table>
31
- <div id=\"headerTopAddNew\">
32
- <div id=\"headerButtonBox\">
33
- <div id=\"imgErd\" title=\"Show ERD\"></div>
34
34
  "
35
35
  klass = relation.klass
36
- if Object.const_defined?('Avo') && ::Avo.respond_to?(:railtie_namespace) && klass.name.exclude?('::')
37
- out << "
36
+ unless show_header == false
37
+ out << " <div id=\"headerTopAddNew\">
38
+ <div id=\"headerButtonBox\">
39
+ "
40
+ unless show_row_count == false
41
+ out << " <div id=\"rowCount\"></div>
42
+ "
43
+ end
44
+ unless show_erd_button == false
45
+ out << " <div id=\"imgErd\" title=\"Show ERD\"></div>
46
+ "
47
+ end
48
+ if show_avo_button != false && Object.const_defined?('Avo') && ::Avo.respond_to?(:railtie_namespace) && klass.name.exclude?('::')
49
+ out << "
38
50
  <td>#{link_to_brick(
39
- ::Brick::Rails::AVO_SVG,
40
- { index_proc: Proc.new do |_avo_model, relation|
41
- path_helper = "resources_#{relation.fetch(:auto_prefixed_schema, nil)}#{klass.model_name.route_key}_path".to_sym
42
- ::Avo.railtie_routes_url_helpers.send(path_helper) if ::Avo.railtie_routes_url_helpers.respond_to?(path_helper)
43
- end,
44
- title: "#{klass.name} in Avo" }
51
+ ::Brick::Rails::AVO_SVG,
52
+ { index_proc: Proc.new do |_avo_model, relation|
53
+ path_helper = "resources_#{relation.fetch(:auto_prefixed_schema, nil)}#{klass.model_name.route_key}_path".to_sym
54
+ ::Avo.railtie_routes_url_helpers.send(path_helper) if ::Avo.railtie_routes_url_helpers.respond_to?(path_helper)
55
+ end,
56
+ title: "#{klass.name} in Avo" }
45
57
  )}</td>
46
58
  "
47
- end
59
+ end
48
60
 
49
- if Object.const_defined?('ActiveAdmin')
50
- ActiveAdmin.application.namespaces.names.each do |ns|
51
- out << "
52
- <td>#{link_to_brick(
53
- ::Brick::Rails::AA_PNG,
54
- { index_proc: Proc.new do |aa_model, relation|
55
- path_helper = "#{ns}_#{relation.fetch(:auto_prefixed_schema, nil)}#{rk = aa_model.model_name.route_key}_path".to_sym
56
- send(path_helper) if respond_to?(path_helper)
57
- end,
58
- title: "#{klass.name} in ActiveAdmin" }
61
+ if show_aa_button != false && Object.const_defined?('ActiveAdmin')
62
+ ActiveAdmin.application.namespaces.names.each do |ns|
63
+ out << "
64
+ <td>#{link_to_brick(
65
+ ::Brick::Rails::AA_PNG,
66
+ { index_proc: Proc.new do |aa_model, relation|
67
+ path_helper = "#{ns}_#{relation.fetch(:auto_prefixed_schema, nil)}#{rk = aa_model.model_name.route_key}_path".to_sym
68
+ send(path_helper) if respond_to?(path_helper)
69
+ end,
70
+ title: "#{klass.name} in ActiveAdmin" }
59
71
  )}</td>
60
72
  "
73
+ end
61
74
  end
62
- end
63
-
64
75
  out << " </div>
65
76
  </div>
66
- </div>
67
- <table id=\"#{relation.table_name.split('.').last}\" class=\"shadow\"#{ " x-num-frozen=\"#{nfc}\"" if nfc.positive? }>
77
+ "
78
+ end
79
+
80
+ out << "</div>
81
+ <table id=\"#{table_name = relation.table_name.split('.').last}\" class=\"shadow\"#{ " x-num-frozen=\"#{nfc}\"" if nfc.positive? }>
68
82
  <thead><tr>"
69
83
  pk = klass.primary_key || []
70
84
  pk = [pk] unless pk.is_a?(Array)
@@ -137,6 +151,7 @@ module Brick::Rails::FormTags
137
151
  # ActiveRecord::StatementTimeout in Warehouse::ColdRoomTemperatures_Archive#index
138
152
  # TinyTds::Error: Adaptive Server connection timed out
139
153
  # (After restarting the server it worked fine again.)
154
+ rowCount = 0
140
155
  relation.each do |obj|
141
156
  out << "<tr>\n"
142
157
  out << "<td class=\"col-sticky\">#{link_to('⇛', send("#{klass._brick_index(:singular)}_path".to_sym,
@@ -152,16 +167,16 @@ module Brick::Rails::FormTags
152
167
  out << " class=\"#{classes.join(' ')}\"" if classes&.present?
153
168
  out << '>'
154
169
  if (bt || composite_bt_names[col_name])
155
- if bt[2] # Polymorphic?
156
- if (poly_id = obj.send("#{bt.first}_id"))
170
+ if bt[2] && obj.respond_to?(poly_id_col = "#{bt.first}_id") # Polymorphic?
171
+ if (poly_id = obj.send(poly_id_col))
157
172
  bt_class = obj.send(klass.brick_foreign_type(bt.first))
158
173
  base_class_underscored = (::Brick.existing_stis[bt_class] || bt_class).constantize.base_class._brick_index(:singular)
159
174
  out << link_to("#{bt_class} ##{poly_id}", send("#{base_class_underscored}_path".to_sym, poly_id))
160
175
  end
161
176
  else # BT or HOT
162
177
  bt_class = bt[1].first.first
163
- if bt_descrip
164
- descrips = bt_descrip[bt.first][bt_class]
178
+ if bt_descrip && (this_bt_descrip = bt_descrip[bt.first])
179
+ descrips = this_bt_descrip[bt_class]
165
180
  bt_id_col = if descrips.nil?
166
181
  puts "Caught it in the act for obj / #{col_name}!"
167
182
  elsif descrips.length == 1
@@ -237,10 +252,160 @@ module Brick::Rails::FormTags
237
252
  out << '</td>'
238
253
  end
239
254
  out << '</tr>'
255
+ rowCount += 1
240
256
  end
241
257
  out << " </tbody>
242
258
  </table>
259
+ <script>
260
+ var rowCount = document.getElementById(\"rowCount\");
261
+ if (rowCount) rowCount.innerHTML = \"#{pluralize(rowCount, "row")} &nbsp;\";
262
+ </script>
263
+ "
264
+
265
+ # Javascript for brick_grid
266
+ (@_brick_javascripts ||= {})[:grid_scripts] = "
267
+ var #{table_name}HtColumns;
268
+
269
+ // Snag first TR for sticky header
270
+ var grid = document.getElementById(\"#{table_name}\");
271
+ #{table_name}HtColumns = grid && [grid.getElementsByTagName(\"TR\")[0]];
272
+ var headerTop = document.getElementById(\"headerTop\");
273
+ var headerCols;
274
+ if (grid) {
275
+ // COLUMN HEADER AND TABLE CELL HIGHLIGHTING
276
+ var gridHighHeader = null,
277
+ gridHighCell = null;
278
+ grid.addEventListener(\"mouseenter\", gridMove);
279
+ grid.addEventListener(\"mousemove\", gridMove);
280
+ grid.addEventListener(\"mouseleave\", function (evt) {
281
+ if (gridHighCell) gridHighCell.classList.remove(\"highlight\");
282
+ gridHighCell = null;
283
+ if (gridHighHeader) gridHighHeader.classList.remove(\"highlight\");
284
+ gridHighHeader = null;
285
+ });
286
+ function gridMove(evt) {
287
+ var lastHighCell = gridHighCell;
288
+ gridHighCell = document.elementFromPoint(evt.x, evt.y);
289
+ while (gridHighCell && gridHighCell.tagName !== \"TD\" && gridHighCell.tagName !== \"TH\")
290
+ gridHighCell = gridHighCell.parentElement;
291
+ if (gridHighCell) {
292
+ if (lastHighCell !== gridHighCell) {
293
+ gridHighCell.classList.add(\"highlight\");
294
+ if (lastHighCell) lastHighCell.classList.remove(\"highlight\");
295
+ }
296
+ var lastHighHeader = gridHighHeader;
297
+ if ((gridHighHeader = headerCols[gridHighCell.cellIndex]) && lastHighHeader !== gridHighHeader) {
298
+ if (gridHighHeader) gridHighHeader.classList.add(\"highlight\");
299
+ if (lastHighHeader) lastHighHeader.classList.remove(\"highlight\");
300
+ }
301
+ }
302
+ }
303
+ // // LESS TOUCHY NAVIGATION BACK OR FORWARD IN HISTORY WHEN USING MOUSE WHEEL
304
+ // grid.addEventListener(\"wheel\", function (evt) {
305
+ // grid.scrollLeft += evt.deltaX;
306
+ // document.body.scrollTop += (evt.deltaY * 0.6);
307
+ // evt.preventDefault();
308
+ // return false;
309
+ // });
310
+ }
311
+ function setHeaderSizes() {
312
+ if (grid.clientWidth > window.outerWidth)
313
+ document.getElementById(\"titleBox\").style.width = grid.clientWidth;
314
+ // console.log(\"start\");
315
+ // See if the headerTop is already populated
316
+ // %%% Grab the TRs from headerTop, clear it out, do this stuff, add them back
317
+ headerTop.innerHTML = \"\"; // %%% Would love to not have to clear it out like this every time! (Currently doing this to support resize events.)
318
+ var isEmpty = headerTop.childElementCount === 0;
319
+ var numFixed = parseInt(grid.getAttribute(\"x-num-frozen\")) || 0;
320
+ var fixedColLefts = [0];
321
+
322
+ // Set up proper sizings of sticky column header
323
+ var node;
324
+ for (var j = 0; j < #{table_name}HtColumns.length; ++j) {
325
+ var row = #{table_name}HtColumns[j];
326
+ var tr = isEmpty ? document.createElement(\"TR\") : headerTop.childNodes[j];
327
+ tr.innerHTML = row.innerHTML.trim();
328
+ var curLeft = 0.0;
329
+ // Match up widths from the original column headers
330
+ for (var i = 0; i < row.childNodes.length; ++i) {
331
+ node = row.childNodes[i];
332
+ if (node.nodeType === 1) {
333
+ var th = tr.childNodes[i];
334
+ th.style.minWidth = th.style.maxWidth = getComputedStyle(node).width;
335
+ // Add \"left: __px\" style to the fixed-width column THs
336
+ if (i <= numFixed) {
337
+ th.style.position = \"sticky\";
338
+ th.style.backgroundColor = \"#008061\";
339
+ th.style.zIndex = \"1\";
340
+ th.style.left = curLeft + \"px\";
341
+ fixedColLefts.push(curLeft += node.clientWidth);
342
+ }
343
+ if (#{pk&.present? ? 'i > 0' : 'true'}) {
344
+ // Add <span> at the end
345
+ var span = document.createElement(\"SPAN\");
346
+ span.className = \"exclude\";
347
+ span.innerHTML = \"X\";
348
+ span.addEventListener(\"click\", function (e) {
349
+ e.stopPropagation();
350
+ doFetch(\"POST\", {_brick_exclude: this.parentElement.getAttribute(\"x-order\")});
351
+ });
352
+ th.appendChild(span);
353
+ }
354
+ }
355
+ }
356
+ headerCols = tr.childNodes;
357
+ if (isEmpty) headerTop.appendChild(tr);
358
+ }
359
+ // Add \"left: __px\" style to all fixed-width column TDs
360
+ [...grid.children[1].children].forEach(function (row) {
361
+ for (var j = 1; j <= numFixed; ++j) {
362
+ row.children[j].style.left = fixedColLefts[j] + 'px';
363
+ }
364
+ });
365
+ grid.style.marginTop = \"-\" + getComputedStyle(headerTop).height;
366
+ // console.log(\"end\");
367
+ }
368
+
369
+ if (headerTop) {
370
+ onImagesLoaded(function() {
371
+ setHeaderSizes();
372
+ });
373
+ window.addEventListener(\"resize\", function(event) {
374
+ setHeaderSizes();
375
+ }, true);#{
376
+ if !klass.is_view? && respond_to?(new_path_name = "new_#{klass._brick_index(:singular)}_path")
377
+ "
378
+ var headerButtonBox = document.getElementById(\"headerButtonBox\");
379
+ if (headerButtonBox) {
380
+ var addNew = document.createElement(\"A\");
381
+ addNew.id = \"addNew\";
382
+ addNew.href = \"#{send(new_path_name)}\";
383
+ addNew.title = \"New #{table_name.singularize}\";
384
+ addNew.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"#fff\" d=\"M24 10h-10v-10h-4v10h-10v4h10v10h4v-10h10z\"/></svg>';
385
+ headerButtonBox.append(addNew);
386
+ }
243
387
  "
388
+ end}
389
+ }
390
+
391
+ function onImagesLoaded(event) {
392
+ var images = document.getElementsByTagName(\"IMG\");
393
+ var numLoaded = images.length;
394
+ for (var i = 0; i < images.length; ++i) {
395
+ if (images[i].complete)
396
+ --numLoaded;
397
+ else {
398
+ images[i].addEventListener(\"load\", function() {
399
+ if (--numLoaded <= 0)
400
+ event();
401
+ });
402
+ }
403
+ }
404
+ if (numLoaded <= 0)
405
+ event();
406
+ }
407
+ "
408
+
244
409
  out.html_safe
245
410
  end # brick_grid
246
411
 
@@ -5,7 +5,7 @@ module Brick
5
5
  module VERSION
6
6
  MAJOR = 1
7
7
  MINOR = 0
8
- TINY = 172
8
+ TINY = 173
9
9
 
10
10
  # PRE is nil unless it's a pre-release (beta, RC, etc.)
11
11
  PRE = nil
data/lib/brick.rb CHANGED
@@ -111,6 +111,15 @@ module Brick
111
111
  :is_oracle, :is_eager_loading, :auto_models, :initializer_loaded
112
112
  ::Brick.auto_models = []
113
113
 
114
+ def get_possible_schemas
115
+ if (possible_schemas = (multitenancy = ::Brick.config.schema_behavior&.[](:multitenant)) &&
116
+ multitenancy&.[](:schema_to_analyse))
117
+ possible_schemas = [possible_schemas] unless possible_schemas.is_a?(Array)
118
+ possible_schema = possible_schemas.find { |ps| ::Brick.db_schemas.key?(ps) }
119
+ end
120
+ [possible_schema, possible_schemas, multitenancy]
121
+ end
122
+
114
123
  def set_db_schema(params = nil)
115
124
  # If Apartment::Tenant.current is not still the default (usually 'public') then an elevator has brought us into
116
125
  # a different tenant. If so then don't allow schema navigation.
@@ -297,6 +306,10 @@ module Brick
297
306
  true
298
307
  end
299
308
 
309
+ def is_geography?(val)
310
+ val.length < 31 && (val.length - 6) % 8 == 0 && val[0..5].bytes == [230, 16, 0, 0, 1, 12]
311
+ end
312
+
300
313
  # @api public
301
314
  def mode=(setting)
302
315
  Brick.config.mode = setting
@@ -894,7 +907,7 @@ In config/initializers/brick.rb appropriate entries would look something like:
894
907
  else
895
908
  table_class_length = class_name.length if class_name.length > table_class_length
896
909
  tables
897
- end << [class_name, aps, resource_name]
910
+ end << [class_name, aps, k.tr('.', '/')]
898
911
  end
899
912
 
900
913
  options = {}
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.172
4
+ version: 1.0.173
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-09-01 00:00:00.000000000 Z
11
+ date: 2023-09-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord