brick 1.0.23 → 1.0.24
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 +4 -4
- data/lib/brick/extensions.rb +22 -8
- data/lib/brick/frameworks/rails/engine.rb +92 -85
- data/lib/brick/version_number.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: 96ba9e8b4ddc54e5feaaf8652c93e5d9e1ffe15345a8cad719674e051b296718
|
4
|
+
data.tar.gz: 3901467e7918ece559f55740759bd555bababe96c407488307fcb01298c14034
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aa73995e69947be5ca83597a71751cfffb2433551d04fb00b760bc51c199bcd9890d7a05c0deb2f2c07c2c89205acf52b942d00ae78e1d7c0a26544acf70a4d0
|
7
|
+
data.tar.gz: 2328082844a0c993ada29c02eab22cf0d04efbcf3e4479c804e16f7d2a39a42d28debcd5592620fecd3bc9c404458fe3b5ff448f1f2c1b7f0d2e13557f5f9fa8
|
data/lib/brick/extensions.rb
CHANGED
@@ -115,8 +115,8 @@ module ActiveRecord
|
|
115
115
|
# If available, parse simple DSL attached to a model in order to provide a friendlier name.
|
116
116
|
# Object property names can be referenced in square brackets like this:
|
117
117
|
# { 'User' => '[profile.firstname] [profile.lastname]' }
|
118
|
-
def brick_descrip
|
119
|
-
self.class.brick_descrip(self)
|
118
|
+
def brick_descrip(data = nil, pk_alias = nil)
|
119
|
+
self.class.brick_descrip(self, data, pk_alias)
|
120
120
|
end
|
121
121
|
|
122
122
|
def self.brick_descrip(obj, data = nil, pk_alias = nil)
|
@@ -136,11 +136,7 @@ module ActiveRecord
|
|
136
136
|
this_obj = obj
|
137
137
|
bracket_name.split('.').each do |part|
|
138
138
|
obj_name += ".#{part}"
|
139
|
-
this_obj =
|
140
|
-
caches[obj_name]
|
141
|
-
else
|
142
|
-
(caches[obj_name] = this_obj&.send(part.to_sym))
|
143
|
-
end
|
139
|
+
this_obj = caches.fetch(obj_name) { caches[obj_name] = this_obj&.send(part.to_sym) }
|
144
140
|
end
|
145
141
|
this_obj&.to_s || ''
|
146
142
|
end
|
@@ -160,7 +156,8 @@ module ActiveRecord
|
|
160
156
|
end
|
161
157
|
if is_brackets_have_content
|
162
158
|
output
|
163
|
-
elsif pk_alias
|
159
|
+
elsif (pk_alias ||= primary_key)
|
160
|
+
pk_alias = [pk_alias] unless pk_alias.is_a?(Array)
|
164
161
|
id = []
|
165
162
|
pk_alias.each do |pk_alias_part|
|
166
163
|
if (pk_part = obj.send(pk_alias_part))
|
@@ -282,6 +279,23 @@ module ActiveRecord
|
|
282
279
|
# , is_add_bts, is_add_hms
|
283
280
|
)
|
284
281
|
is_add_bts = is_add_hms = true
|
282
|
+
wheres = {}
|
283
|
+
has_hm = false
|
284
|
+
params.each do |k, v|
|
285
|
+
case (ks = k.split('.')).length
|
286
|
+
when 1
|
287
|
+
next unless klass._brick_get_fks.include?(k)
|
288
|
+
when 2
|
289
|
+
assoc_name = ks.first.to_sym
|
290
|
+
# Make sure it's a good association name and that the model has that column name
|
291
|
+
next unless (assoc = klass.reflect_on_association(assoc_name))&.klass&.columns&.map(&:name)&.include?(ks.last)
|
292
|
+
|
293
|
+
# There is some potential for duplicates when there is an HM-based where in play. De-duplicate if so.
|
294
|
+
has_hm ||= assoc.macro == :has_many
|
295
|
+
join_array[assoc_name] = nil # Store this relation name in our special collection for .joins()
|
296
|
+
end
|
297
|
+
wheres[k] = v.split(',')
|
298
|
+
end
|
285
299
|
|
286
300
|
# %%% Skip the metadata columns
|
287
301
|
if selects&.empty? # Default to all columns
|
@@ -274,96 +274,97 @@ function changeout(href, param, value) {
|
|
274
274
|
template_link = "
|
275
275
|
<%= link_to 'CSV', #{table_name}_path(format: :csv) %> <a href=\"#\" id=\"sheetsLink\">Sheets</a>
|
276
276
|
<div id=\"dropper\" contenteditable=\"true\"></div>
|
277
|
-
<input type=\"button\" id=\"btnImport\" value=\"Import\">
|
278
|
-
|
279
|
-
"#{css}
|
280
|
-
<p style=\"color: green\"><%= notice %></p>#{"
|
281
|
-
<select id=\"schema\">#{schema_options}</select>" if ::Brick.db_schemas.length > 1}
|
282
|
-
<select id=\"tbl\">#{table_options}</select>
|
283
|
-
<h1>#{model_name.pluralize}</h1>#{template_link}
|
277
|
+
<input type=\"button\" id=\"btnImport\" value=\"Import\">
|
278
|
+
|
284
279
|
<script>
|
285
|
-
var dropperDiv = document.getElementById(\"dropper\");
|
286
|
-
var btnImport = document.getElementById(\"btnImport\");
|
287
|
-
var droppedTSV;
|
288
|
-
if (dropperDiv) { // Other interesting events: blur keyup input
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
});
|
296
|
-
btnImport.addEventListener(\"click\", function () {
|
297
|
-
fetch(changeout(<%= #{obj_name}_path(-1, format: :csv).inspect.html_safe %>, \"_brick_schema\", brickSchema), {
|
298
|
-
method: 'PATCH',
|
299
|
-
headers: { 'Content-Type': 'text/tab-separated-values' },
|
300
|
-
body: droppedTSV
|
301
|
-
}).then(function (tsvResponse) {
|
302
|
-
btnImport.style.display = \"none\";
|
303
|
-
console.log(\"toaster\", tsvResponse);
|
280
|
+
var dropperDiv = document.getElementById(\"dropper\");
|
281
|
+
var btnImport = document.getElementById(\"btnImport\");
|
282
|
+
var droppedTSV;
|
283
|
+
if (dropperDiv) { // Other interesting events: blur keyup input
|
284
|
+
dropperDiv.addEventListener(\"paste\", function (evt) {
|
285
|
+
droppedTSV = evt.clipboardData.getData('text/plain');
|
286
|
+
var html = evt.clipboardData.getData('text/html');
|
287
|
+
var tbl = html.substring(html.indexOf(\"<tbody>\") + 7, html.lastIndexOf(\"</tbody>\"));
|
288
|
+
console.log(tbl);
|
289
|
+
btnImport.style.display = droppedTSV.length > 0 ? \"block\" : \"none\";
|
304
290
|
});
|
305
|
-
|
306
|
-
}
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
function
|
311
|
-
|
312
|
-
|
313
|
-
evt.preventDefault();
|
314
|
-
await gapi.load(\"client\", function () {
|
315
|
-
gapi.client.init({ // Load the discovery doc to initialize the API
|
316
|
-
clientId: \"487319557829-fgj4u660igrpptdji7ev0r5hb6kh05dh.apps.googleusercontent.com\",
|
317
|
-
scope: \"https://www.googleapis.com/auth/spreadsheets https://www.googleapis.com/auth/drive.file\",
|
318
|
-
discoveryDocs: [\"https://sheets.googleapis.com/$discovery/rest?version=v4\"]
|
319
|
-
}).then(function () {
|
320
|
-
gapi.auth2.getAuthInstance().isSignedIn.listen(updateSignInStatus);
|
321
|
-
updateSignInStatus(gapi.auth2.getAuthInstance().isSignedIn.get());
|
291
|
+
btnImport.addEventListener(\"click\", function () {
|
292
|
+
fetch(changeout(<%= #{obj_name}_path(-1, format: :csv).inspect.html_safe %>, \"_brick_schema\", brickSchema), {
|
293
|
+
method: 'PATCH',
|
294
|
+
headers: { 'Content-Type': 'text/tab-separated-values' },
|
295
|
+
body: droppedTSV
|
296
|
+
}).then(function (tsvResponse) {
|
297
|
+
btnImport.style.display = \"none\";
|
298
|
+
console.log(\"toaster\", tsvResponse);
|
322
299
|
});
|
323
300
|
});
|
324
|
-
}
|
325
|
-
|
301
|
+
}
|
302
|
+
var sheetUrl;
|
303
|
+
var spreadsheetId;
|
304
|
+
var sheetsLink = document.getElementById(\"sheetsLink\");
|
305
|
+
function gapiLoaded() {
|
306
|
+
// Have a click on the sheets link to bring up the sign-in window. (Must happen from some kind of user click.)
|
307
|
+
sheetsLink.addEventListener(\"click\", async function (evt) {
|
308
|
+
evt.preventDefault();
|
309
|
+
await gapi.load(\"client\", function () {
|
310
|
+
gapi.client.init({ // Load the discovery doc to initialize the API
|
311
|
+
clientId: \"487319557829-fgj4u660igrpptdji7ev0r5hb6kh05dh.apps.googleusercontent.com\",
|
312
|
+
scope: \"https://www.googleapis.com/auth/spreadsheets https://www.googleapis.com/auth/drive.file\",
|
313
|
+
discoveryDocs: [\"https://sheets.googleapis.com/$discovery/rest?version=v4\"]
|
314
|
+
}).then(function () {
|
315
|
+
gapi.auth2.getAuthInstance().isSignedIn.listen(updateSignInStatus);
|
316
|
+
updateSignInStatus(gapi.auth2.getAuthInstance().isSignedIn.get());
|
317
|
+
});
|
318
|
+
});
|
319
|
+
});
|
320
|
+
}
|
326
321
|
|
327
|
-
async function updateSignInStatus(isSignedIn) {
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
// console.log(\"beefcake\", response2);
|
322
|
+
async function updateSignInStatus(isSignedIn) {
|
323
|
+
if (isSignedIn) {
|
324
|
+
console.log(\"turds!\");
|
325
|
+
await gapi.client.sheets.spreadsheets.create({
|
326
|
+
properties: {
|
327
|
+
title: #{table_name.inspect},
|
328
|
+
},
|
329
|
+
sheets: [
|
330
|
+
// sheet1, sheet2, sheet3
|
331
|
+
]
|
332
|
+
}).then(function (response) {
|
333
|
+
sheetUrl = response.result.spreadsheetUrl;
|
334
|
+
spreadsheetId = response.result.spreadsheetId;
|
335
|
+
sheetsLink.setAttribute(\"href\", sheetUrl); // response.result.spreadsheetUrl
|
336
|
+
console.log(\"x1\", sheetUrl);
|
337
|
+
|
338
|
+
// Get JSON data
|
339
|
+
fetch(changeout(<%= #{table_name}_path(format: :js).inspect.html_safe %>, \"_brick_schema\", brickSchema)).then(function (response) {
|
340
|
+
response.json().then(function (data) {
|
341
|
+
gapi.client.sheets.spreadsheets.values.append({
|
342
|
+
spreadsheetId: spreadsheetId,
|
343
|
+
range: \"Sheet1\",
|
344
|
+
valueInputOption: \"RAW\",
|
345
|
+
insertDataOption: \"INSERT_ROWS\"
|
346
|
+
}, {
|
347
|
+
range: \"Sheet1\",
|
348
|
+
majorDimension: \"ROWS\",
|
349
|
+
values: data,
|
350
|
+
}).then(function (response2) {
|
351
|
+
// console.log(\"beefcake\", response2);
|
352
|
+
});
|
357
353
|
});
|
358
354
|
});
|
359
355
|
});
|
360
|
-
|
361
|
-
|
356
|
+
window.open(sheetUrl, '_blank');
|
357
|
+
}
|
362
358
|
}
|
363
|
-
}
|
364
359
|
</script>
|
365
360
|
<script async defer src=\"https://apis.google.com/js/api.js\" onload=\"gapiLoaded()\"></script>
|
366
|
-
|
361
|
+
"
|
362
|
+
end
|
363
|
+
"#{css}
|
364
|
+
<p style=\"color: green\"><%= notice %></p>#{"
|
365
|
+
<select id=\"schema\">#{schema_options}</select>" if ::Brick.db_schemas.length > 1}
|
366
|
+
<select id=\"tbl\">#{table_options}</select>
|
367
|
+
<h1>#{model_name.pluralize}</h1>#{template_link}
|
367
368
|
|
368
369
|
<% if @_brick_params&.present? %><h3>where <%= @_brick_params.each_with_object([]) { |v, s| s << \"#\{v.first\} = #\{v.last.inspect\}\" }.join(', ') %></h3><% end %>
|
369
370
|
<table id=\"#{table_name}\">
|
@@ -400,8 +401,7 @@ async function updateSignInStatus(isSignedIn) {
|
|
400
401
|
<% end %>
|
401
402
|
</td>
|
402
403
|
<% end %>
|
403
|
-
|
404
|
-
<!-- td>X</td -->
|
404
|
+
#{hms_columns.each_with_object(+'') { |hm_col, s| s << "<td>#{hm_col}</td>" }}
|
405
405
|
</tr>
|
406
406
|
</tbody>
|
407
407
|
<% end %>
|
@@ -422,19 +422,21 @@ async function updateSignInStatus(isSignedIn) {
|
|
422
422
|
# url = send(:#{model_name.underscore}_path, obj.#{pk})
|
423
423
|
form_for(obj.becomes(#{model_name})) do |f| %>
|
424
424
|
<table>
|
425
|
-
<%
|
425
|
+
<% has_fields = false
|
426
|
+
@#{obj_name}.first.attributes.each do |k, val| %>
|
426
427
|
<tr>
|
427
428
|
<%# %%% Accommodate composite keys %>
|
428
429
|
<% next if k == '#{pk}' || ::Brick.config.metadata_columns.include?(k) %>
|
429
430
|
<th class=\"show-field\">
|
430
|
-
<%
|
431
|
+
<% has_fields = true
|
432
|
+
if (bt = bts[k])
|
431
433
|
# Add a final member in this array with descriptive options to be used in <select> drop-downs
|
432
434
|
bt_name = bt[1].name
|
433
435
|
# %%% Only do this if the user has permissions to edit this bt field
|
434
436
|
if bt.length < 4
|
435
437
|
bt << (option_detail = [[\"(No #\{bt_name\} chosen)\", '^^^brick_NULL^^^']])
|
436
438
|
# %%% Accommodate composite keys for obj.pk at the end here
|
437
|
-
bt[1].order(bt[1].primary_key).each { |obj| option_detail << [obj.brick_descrip, obj.send(
|
439
|
+
bt[1].order(obj_pk = bt[1].primary_key).each { |obj| option_detail << [obj.brick_descrip(nil, obj_pk), obj.send(obj_pk)] }
|
438
440
|
end %>
|
439
441
|
BT <%= bt[1].bt_link(bt.first) %>
|
440
442
|
<% else %>
|
@@ -467,8 +469,12 @@ async function updateSignInStatus(isSignedIn) {
|
|
467
469
|
<% end %>
|
468
470
|
</td>
|
469
471
|
</tr>
|
472
|
+
<% end
|
473
|
+
if has_fields %>
|
474
|
+
<tr><td colspan=\"2\" class=\"right\"><%= f.submit %></td></tr>
|
475
|
+
<% else %>
|
476
|
+
<tr><td colspan=\"2\">(No displayable fields)</td></tr>
|
470
477
|
<% end %>
|
471
|
-
<tr><td colspan=\"2\" class=\"right\"><%= f.submit %></td></tr>
|
472
478
|
</table>
|
473
479
|
<% end %>
|
474
480
|
|
@@ -482,6 +488,7 @@ async function updateSignInStatus(isSignedIn) {
|
|
482
488
|
<tr><td>(none)</td></tr>
|
483
489
|
<% else %>
|
484
490
|
<% collection.uniq.each do |#{hm_singular_name = hm_name.singularize.underscore}| %>
|
491
|
+
<%# %%% accommodate composite primary key %>
|
485
492
|
<tr><td><%= link_to(#{hm_singular_name}.brick_descrip, #{hm.first.klass.name.underscore}_path(#{hm_singular_name}.#{pk})) %></td></tr>
|
486
493
|
<% end %>
|
487
494
|
<% end %>
|
data/lib/brick/version_number.rb
CHANGED
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.24
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lorin Thwaits
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-05-
|
11
|
+
date: 2022-05-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|