active_scaffold 3.6.20 → 3.7.1
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/CHANGELOG.rdoc +47 -0
- data/README.md +29 -16
- data/app/assets/javascripts/jquery/active_scaffold.js +106 -68
- data/app/assets/javascripts/jquery/active_scaffold_chosen.js +6 -5
- data/app/assets/javascripts/jquery/tiny_mce_bridge.js +18 -4
- data/app/assets/stylesheets/active_scaffold_layout.css +13 -2
- data/app/views/active_scaffold_overrides/_base_form.html.erb +5 -1
- data/app/views/active_scaffold_overrides/_field_search.html.erb +1 -0
- data/app/views/active_scaffold_overrides/_form_association_record.html.erb +2 -1
- data/app/views/active_scaffold_overrides/_render_field.js.erb +24 -13
- data/config/locales/de.yml +6 -3
- data/config/locales/en.yml +3 -0
- data/config/locales/es.yml +3 -0
- data/config/locales/fr.yml +9 -6
- data/config/locales/hu.yml +20 -17
- data/config/locales/ja.yml +83 -80
- data/config/locales/ru.yml +17 -14
- data/lib/active_scaffold/actions/common_search.rb +2 -2
- data/lib/active_scaffold/actions/core.rb +30 -10
- data/lib/active_scaffold/actions/field_search.rb +9 -6
- data/lib/active_scaffold/actions/nested.rb +7 -7
- data/lib/active_scaffold/actions/update.rb +3 -3
- data/lib/active_scaffold/attribute_params.rb +22 -70
- data/lib/active_scaffold/bridges/active_storage/active_storage_helpers.rb +0 -3
- data/lib/active_scaffold/bridges/active_storage/form_ui.rb +6 -6
- data/lib/active_scaffold/bridges/active_storage/list_ui.rb +7 -7
- data/lib/active_scaffold/bridges/active_storage.rb +3 -0
- data/lib/active_scaffold/bridges/ancestry/ancestry_bridge.rb +2 -2
- data/lib/active_scaffold/bridges/bitfields/bitfields_bridge.rb +2 -2
- data/lib/active_scaffold/bridges/calendar_date_select/as_cds_bridge.rb +12 -14
- data/lib/active_scaffold/bridges/carrierwave/form_ui.rb +2 -2
- data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +1 -1
- data/lib/active_scaffold/bridges/chosen/helpers.rb +10 -10
- data/lib/active_scaffold/bridges/country_select/country_select_bridge_helper.rb +7 -7
- data/lib/active_scaffold/bridges/date_picker/ext.rb +20 -9
- data/lib/active_scaffold/bridges/date_picker/helper.rb +9 -9
- data/lib/active_scaffold/bridges/date_picker.rb +2 -0
- data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +3 -3
- data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +5 -5
- data/lib/active_scaffold/bridges/file_column/form_ui.rb +1 -1
- data/lib/active_scaffold/bridges/file_column/list_ui.rb +3 -3
- data/lib/active_scaffold/bridges/file_column/test/functional/file_column_keep_test.rb +1 -1
- data/lib/active_scaffold/bridges/paper_trail/actions.rb +4 -1
- data/lib/active_scaffold/bridges/paperclip/form_ui.rb +3 -3
- data/lib/active_scaffold/bridges/paperclip/list_ui.rb +1 -1
- data/lib/active_scaffold/bridges/record_select/helpers.rb +17 -17
- data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +6 -6
- data/lib/active_scaffold/bridges/tiny_mce.rb +1 -1
- data/lib/active_scaffold/bridges/usa_state_select/usa_state_select_helper.rb +6 -11
- data/lib/active_scaffold/bridges.rb +0 -3
- data/lib/active_scaffold/config/core.rb +1 -1
- data/lib/active_scaffold/config/field_search.rb +9 -1
- data/lib/active_scaffold/config/form.rb +9 -1
- data/lib/active_scaffold/constraints.rb +22 -7
- data/lib/active_scaffold/core.rb +6 -10
- data/lib/active_scaffold/data_structures/action_columns.rb +0 -25
- data/lib/active_scaffold/data_structures/action_links.rb +1 -1
- data/lib/active_scaffold/data_structures/association/abstract.rb +8 -0
- data/lib/active_scaffold/data_structures/association/active_mongoid.rb +8 -0
- data/lib/active_scaffold/data_structures/association/active_record.rb +1 -13
- data/lib/active_scaffold/data_structures/association/mongoid.rb +21 -8
- data/lib/active_scaffold/data_structures/column.rb +139 -28
- data/lib/active_scaffold/data_structures/columns.rb +12 -12
- data/lib/active_scaffold/data_structures/nested_info.rb +12 -0
- data/lib/active_scaffold/data_structures/sorting.rb +1 -1
- data/lib/active_scaffold/engine.rb +15 -1
- data/lib/active_scaffold/extensions/action_view_rendering.rb +13 -5
- data/lib/active_scaffold/extensions/cow_proxy.rb +1 -1
- data/lib/active_scaffold/extensions/routing_mapper.rb +1 -0
- data/lib/active_scaffold/extensions/unsaved_record.rb +9 -3
- data/lib/active_scaffold/finder.rb +147 -28
- data/lib/active_scaffold/helpers/action_link_helpers.rb +1 -1
- data/lib/active_scaffold/helpers/controller_helpers.rb +9 -4
- data/lib/active_scaffold/helpers/form_column_helpers.rb +153 -107
- data/lib/active_scaffold/helpers/human_condition_helpers.rb +48 -14
- data/lib/active_scaffold/helpers/list_column_helpers.rb +37 -20
- data/lib/active_scaffold/helpers/search_column_helpers.rb +137 -55
- data/lib/active_scaffold/helpers/show_column_helpers.rb +6 -6
- data/lib/active_scaffold/helpers/view_helpers.rb +1 -1
- data/lib/active_scaffold/orm_checks.rb +21 -1
- data/lib/active_scaffold/registry.rb +10 -15
- data/lib/active_scaffold/tableless.rb +10 -79
- data/lib/active_scaffold/version.rb +2 -2
- data/lib/active_scaffold.rb +3 -9
- data/lib/generators/active_scaffold/install_generator.rb +2 -2
- data/test/bridges/bridge_test.rb +1 -1
- data/test/bridges/date_picker_test.rb +3 -2
- data/test/bridges/paperclip_test.rb +18 -14
- data/test/bridges/tiny_mce_test.rb +5 -3
- data/test/config/base_test.rb +1 -1
- data/test/config/core_test.rb +1 -1
- data/test/config/create_test.rb +1 -1
- data/test/config/delete_test.rb +1 -1
- data/test/config/field_search_test.rb +1 -1
- data/test/config/list_test.rb +1 -1
- data/test/config/nested_test.rb +1 -1
- data/test/config/search_test.rb +1 -1
- data/test/config/show_test.rb +1 -1
- data/test/config/subform_test.rb +1 -1
- data/test/config/update_test.rb +1 -1
- data/test/data_structures/action_columns_test.rb +1 -1
- data/test/data_structures/action_link_test.rb +1 -1
- data/test/data_structures/action_links_test.rb +1 -1
- data/test/data_structures/actions_test.rb +1 -1
- data/test/data_structures/association_column_test.rb +1 -1
- data/test/data_structures/column_test.rb +1 -1
- data/test/data_structures/columns_test.rb +1 -1
- data/test/data_structures/set_test.rb +1 -1
- data/test/data_structures/sorting_test.rb +1 -1
- data/test/data_structures/standard_column_test.rb +1 -1
- data/test/data_structures/validation_reflection_test.rb +1 -1
- data/test/data_structures/virtual_column_test.rb +1 -1
- data/test/extensions/active_record_test.rb +1 -1
- data/test/helpers/form_column_helpers_test.rb +7 -5
- data/test/helpers/pagination_helpers_test.rb +1 -1
- data/test/helpers/search_column_helpers_test.rb +2 -1
- data/test/misc/active_record_permissions_test.rb +1 -1
- data/test/misc/attribute_params_test.rb +1 -1
- data/test/misc/calculation_test.rb +1 -1
- data/test/misc/configurable_test.rb +1 -1
- data/test/misc/constraints_test.rb +2 -1
- data/test/misc/convert_numbers_format_test.rb +1 -1
- data/test/misc/finder_test.rb +39 -1
- data/test/misc/lang_test.rb +1 -1
- data/test/misc/parse_datetime_test.rb +1 -1
- data/test/misc/tableless_test.rb +1 -1
- data/test/test_helper.rb +4 -4
- metadata +5 -17
- data/config/brakeman.ignore +0 -26
- data/config/brakeman.yml +0 -3
- data/config/i18n-tasks.yml +0 -121
- data/lib/active_scaffold/bridges/shared/date_bridge.rb +0 -221
- data/lib/active_scaffold/delayed_setup.rb +0 -41
- data/lib/active_scaffold/extensions/left_outer_joins.rb +0 -43
|
@@ -110,26 +110,57 @@ module ActiveScaffold
|
|
|
110
110
|
end
|
|
111
111
|
return nil unless sql
|
|
112
112
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
113
|
+
where_values = []
|
|
114
|
+
sql_conditions = []
|
|
115
|
+
column.search_sql.each do |search_sql|
|
|
116
|
+
if search_sql.is_a?(Hash)
|
|
117
|
+
subquery_sql, *subquery_values = subquery_condition(column, sql, search_sql, values)
|
|
118
|
+
sql_conditions << subquery_sql
|
|
119
|
+
where_values.concat subquery_values
|
|
120
|
+
else
|
|
121
|
+
sql_conditions << sql % {:search_sql => search_sql}
|
|
122
|
+
where_values.concat values
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
[sql_conditions.join(' OR '), *where_values]
|
|
116
126
|
rescue StandardError => e
|
|
117
127
|
Rails.logger.error "#{e.class.name}: #{e.message} -- on the ActiveScaffold column :#{column.name}, search_ui = #{search_ui} in #{name}"
|
|
118
128
|
raise e
|
|
119
129
|
end
|
|
120
130
|
end
|
|
121
131
|
|
|
132
|
+
def subquery_condition(column, sql, options, values)
|
|
133
|
+
relation, *columns = options[:subquery]
|
|
134
|
+
conditions = [columns.map { |search_sql| sql % {:search_sql => search_sql} }.join(' OR ')]
|
|
135
|
+
conditions += values * columns.size if values.present?
|
|
136
|
+
subquery = relation.where(conditions)
|
|
137
|
+
subquery = subquery.select(relation.primary_key) if subquery.select_values.blank?
|
|
138
|
+
|
|
139
|
+
conditions = [["#{options[:field] || column.field} IN (?)", options[:conditions]&.first].compact.join(' AND ')]
|
|
140
|
+
conditions << subquery
|
|
141
|
+
conditions.concat options[:conditions][1..-1] if options[:conditions]
|
|
142
|
+
if column.association&.polymorphic?
|
|
143
|
+
conditions[0] << " AND #{column.quoted_foreign_type} = ?"
|
|
144
|
+
conditions << relation.name
|
|
145
|
+
end
|
|
146
|
+
conditions
|
|
147
|
+
end
|
|
148
|
+
|
|
122
149
|
def condition_for_search_ui(column, value, like_pattern, search_ui)
|
|
123
150
|
case search_ui
|
|
124
151
|
when :boolean, :checkbox
|
|
125
|
-
|
|
152
|
+
if value == 'null'
|
|
153
|
+
condition_for_null_type(column, value)
|
|
154
|
+
else
|
|
155
|
+
['%<search_sql>s = ?', column.column ? ActiveScaffold::Core.column_type_cast(value, column.column) : value]
|
|
156
|
+
end
|
|
126
157
|
when :integer, :decimal, :float
|
|
127
158
|
condition_for_numeric(column, value)
|
|
128
159
|
when :string, :range
|
|
129
160
|
condition_for_range(column, value, like_pattern)
|
|
130
161
|
when :date, :time, :datetime, :timestamp
|
|
131
162
|
condition_for_datetime(column, value)
|
|
132
|
-
when :select, :multi_select, :country, :usa_state, :chosen, :multi_chosen
|
|
163
|
+
when :select, :select_multiple, :draggable, :multi_select, :country, :usa_state, :chosen, :multi_chosen
|
|
133
164
|
values = Array(value).select(&:present?)
|
|
134
165
|
['%<search_sql>s in (?)', values] if values.present?
|
|
135
166
|
else
|
|
@@ -167,7 +198,10 @@ module ActiveScaffold
|
|
|
167
198
|
elsif value[:from].blank?
|
|
168
199
|
nil
|
|
169
200
|
elsif ActiveScaffold::Finder::STRING_COMPARATORS.values.include?(value[:opt])
|
|
170
|
-
[
|
|
201
|
+
[
|
|
202
|
+
"%<search_sql>s #{'NOT ' if value[:opt].start_with?('not_')}#{ActiveScaffold::Finder.like_operator} ?",
|
|
203
|
+
value[:opt].sub('not_', '').sub('?', value[:from])
|
|
204
|
+
]
|
|
171
205
|
elsif value[:opt] == 'BETWEEN'
|
|
172
206
|
['(%<search_sql>s BETWEEN ? AND ?)', value[:from], value[:to]]
|
|
173
207
|
elsif ActiveScaffold::Finder::NUMERIC_COMPARATORS.include?(value[:opt])
|
|
@@ -237,14 +271,19 @@ module ActiveScaffold
|
|
|
237
271
|
nil
|
|
238
272
|
end
|
|
239
273
|
|
|
240
|
-
def
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
274
|
+
def format_for_date(column, value, format_name = column.options[:format])
|
|
275
|
+
if format_name
|
|
276
|
+
format = I18n.t("date.formats.#{format_name}")
|
|
277
|
+
format.gsub!(/%-d|%-m|%_m/) { |s| s.gsub(/[-_]/, '') } # strptime fails with %-d, %-m, %_m
|
|
278
|
+
en_value = I18n.locale == :en ? value : translate_days_and_months(value, format)
|
|
279
|
+
end
|
|
280
|
+
[en_value || value, format]
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
def parse_date_with_format(value, format)
|
|
284
|
+
Date.strptime(value, *format)
|
|
245
285
|
rescue StandardError => e
|
|
246
|
-
message = "Error parsing date from #{
|
|
247
|
-
message << " (#{value})" if en_value != value
|
|
286
|
+
message = "Error parsing date from #{value}"
|
|
248
287
|
message << ", with format #{format}" if format
|
|
249
288
|
Rails.logger.warn "#{message}:\n#{e.message}\n#{e.backtrace.join("\n")}"
|
|
250
289
|
nil
|
|
@@ -276,7 +315,7 @@ module ActiveScaffold
|
|
|
276
315
|
value.send(conversion)
|
|
277
316
|
end
|
|
278
317
|
elsif conversion == :to_date
|
|
279
|
-
parse_date_with_format(
|
|
318
|
+
parse_date_with_format(*format_for_date(column, value))
|
|
280
319
|
elsif value.include?('T')
|
|
281
320
|
Time.zone.parse(value)
|
|
282
321
|
else # datetime
|
|
@@ -288,7 +327,7 @@ module ActiveScaffold
|
|
|
288
327
|
def condition_value_for_numeric(column, value)
|
|
289
328
|
return value if value.nil?
|
|
290
329
|
value = column.number_to_native(value) if column.options[:format] && column.search_ui != :number
|
|
291
|
-
case (column.search_ui || column.
|
|
330
|
+
case (column.search_ui || column.column_type)
|
|
292
331
|
when :integer then
|
|
293
332
|
if value.is_a?(TrueClass) || value.is_a?(FalseClass)
|
|
294
333
|
value ? 1 : 0
|
|
@@ -296,8 +335,7 @@ module ActiveScaffold
|
|
|
296
335
|
value.to_i
|
|
297
336
|
end
|
|
298
337
|
when :float then value.to_f
|
|
299
|
-
when :decimal
|
|
300
|
-
::ActiveRecord::Type::Decimal.new.send(Rails.version < '5.0' ? :type_cast_from_user : :cast, value)
|
|
338
|
+
when :decimal then ::ActiveRecord::Type::Decimal.new.cast(value)
|
|
301
339
|
else
|
|
302
340
|
value
|
|
303
341
|
end
|
|
@@ -305,28 +343,102 @@ module ActiveScaffold
|
|
|
305
343
|
|
|
306
344
|
def datetime_conversion_for_condition(column)
|
|
307
345
|
if column.column
|
|
308
|
-
column.
|
|
346
|
+
column.column_type == :date ? :to_date : :to_time
|
|
309
347
|
else
|
|
310
348
|
:to_time
|
|
311
349
|
end
|
|
312
350
|
end
|
|
313
351
|
|
|
314
352
|
def condition_for_datetime(column, value, like_pattern = nil)
|
|
353
|
+
operator = ActiveScaffold::Finder::NUMERIC_COMPARATORS.include?(value['opt']) && value['opt'] != 'BETWEEN' ? value['opt'] : nil
|
|
354
|
+
from_value, to_value = datetime_from_to(column, value)
|
|
355
|
+
|
|
356
|
+
if column.search_sql.is_a? Proc
|
|
357
|
+
column.search_sql.call(from_value, to_value, operator)
|
|
358
|
+
elsif operator.nil?
|
|
359
|
+
['%<search_sql>s BETWEEN ? AND ?', from_value, to_value] unless from_value.nil? || to_value.nil?
|
|
360
|
+
else
|
|
361
|
+
["%<search_sql>s #{value['opt']} ?", from_value] unless from_value.nil?
|
|
362
|
+
end
|
|
363
|
+
end
|
|
364
|
+
|
|
365
|
+
def datetime_from_to(column, value)
|
|
315
366
|
conversion = datetime_conversion_for_condition(column)
|
|
316
|
-
|
|
317
|
-
|
|
367
|
+
case value['opt']
|
|
368
|
+
when 'RANGE'
|
|
369
|
+
values = datetime_from_to_for_range(column, value)
|
|
370
|
+
# Avoid calling to_time, not needed and broken on rails >= 4, because return local time instead of UTC
|
|
371
|
+
values.collect!(&conversion) if conversion != :to_time
|
|
372
|
+
values
|
|
373
|
+
when 'PAST', 'FUTURE'
|
|
374
|
+
values = datetime_from_to_for_trend(column, value)
|
|
375
|
+
# Avoid calling to_time, not needed and broken on rails >= 4, because return local time instead of UTC
|
|
376
|
+
values.collect!(&conversion) if conversion != :to_time
|
|
377
|
+
values
|
|
378
|
+
else
|
|
379
|
+
%w[from to].collect { |field| condition_value_for_datetime(column, value[field], conversion) }
|
|
380
|
+
end
|
|
381
|
+
end
|
|
318
382
|
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
383
|
+
def datetime_now
|
|
384
|
+
Time.zone.now
|
|
385
|
+
end
|
|
386
|
+
|
|
387
|
+
def datetime_from_to_for_trend(column, value)
|
|
388
|
+
case value['opt']
|
|
389
|
+
when 'PAST'
|
|
390
|
+
trend_number = [value['number'].to_i, 1].max
|
|
391
|
+
now = datetime_now
|
|
392
|
+
if datetime_column_date?(column)
|
|
393
|
+
from = now.beginning_of_day.ago(trend_number.send(value['unit'].downcase.singularize.to_sym))
|
|
394
|
+
to = now.end_of_day
|
|
395
|
+
else
|
|
396
|
+
from = now.ago(trend_number.send(value['unit'].downcase.singularize.to_sym))
|
|
397
|
+
to = now
|
|
398
|
+
end
|
|
399
|
+
[from, to]
|
|
400
|
+
when 'FUTURE'
|
|
401
|
+
trend_number = [value['number'].to_i, 1].max
|
|
402
|
+
now = datetime_now
|
|
403
|
+
if datetime_column_date?(column)
|
|
404
|
+
from = now.beginning_of_day
|
|
405
|
+
to = now.end_of_day.in(trend_number.send(value['unit'].downcase.singularize.to_sym))
|
|
406
|
+
else
|
|
407
|
+
from = now
|
|
408
|
+
to = now.in(trend_number.send(value['unit'].downcase.singularize.to_sym))
|
|
409
|
+
end
|
|
410
|
+
[from, to]
|
|
411
|
+
end
|
|
412
|
+
end
|
|
413
|
+
|
|
414
|
+
def datetime_from_to_for_range(column, value)
|
|
415
|
+
case value['range']
|
|
416
|
+
when 'TODAY'
|
|
417
|
+
[datetime_now.beginning_of_day, datetime_now.end_of_day]
|
|
418
|
+
when 'YESTERDAY'
|
|
419
|
+
[datetime_now.ago(1.day).beginning_of_day, datetime_now.ago(1.day).end_of_day]
|
|
420
|
+
when 'TOMORROW'
|
|
421
|
+
[datetime_now.in(1.day).beginning_of_day, datetime_now.in(1.day).end_of_day]
|
|
325
422
|
else
|
|
326
|
-
|
|
423
|
+
range_type, range = value['range'].downcase.split('_')
|
|
424
|
+
raise ArgumentError unless %w[week month year].include?(range)
|
|
425
|
+
case range_type
|
|
426
|
+
when 'this'
|
|
427
|
+
return datetime_now.send("beginning_of_#{range}".to_sym), datetime_now.send("end_of_#{range}")
|
|
428
|
+
when 'prev'
|
|
429
|
+
return datetime_now.ago(1.send(range.to_sym)).send("beginning_of_#{range}".to_sym), datetime_now.ago(1.send(range.to_sym)).send("end_of_#{range}".to_sym)
|
|
430
|
+
when 'next'
|
|
431
|
+
return datetime_now.in(1.send(range.to_sym)).send("beginning_of_#{range}".to_sym), datetime_now.in(1.send(range.to_sym)).send("end_of_#{range}".to_sym)
|
|
432
|
+
else
|
|
433
|
+
return nil, nil
|
|
434
|
+
end
|
|
327
435
|
end
|
|
328
436
|
end
|
|
329
437
|
|
|
438
|
+
def datetime_column_date?(column)
|
|
439
|
+
column.column&.type == :date
|
|
440
|
+
end
|
|
441
|
+
|
|
330
442
|
def condition_for_record_select_type(column, value, like_pattern = nil)
|
|
331
443
|
if value.is_a?(Array)
|
|
332
444
|
['%<search_sql>s IN (?)', value]
|
|
@@ -357,9 +469,16 @@ module ActiveScaffold
|
|
|
357
469
|
STRING_COMPARATORS = {
|
|
358
470
|
:contains => '%?%',
|
|
359
471
|
:begins_with => '?%',
|
|
360
|
-
:ends_with => '%?'
|
|
472
|
+
:ends_with => '%?',
|
|
473
|
+
:doesnt_contain => 'not_%?%',
|
|
474
|
+
:doesnt_begin_with => 'not_?%',
|
|
475
|
+
:doesnt_end_with => 'not_%?'
|
|
361
476
|
}.freeze
|
|
362
477
|
NULL_COMPARATORS = %w[null not_null].freeze
|
|
478
|
+
DATE_COMPARATORS = %w[PAST FUTURE RANGE].freeze
|
|
479
|
+
DATE_UNITS = %w[DAYS WEEKS MONTHS YEARS].freeze
|
|
480
|
+
TIME_UNITS = %w[SECONDS MINUTES HOURS].freeze
|
|
481
|
+
DATE_RANGES = %w[TODAY YESTERDAY TOMORROW THIS_WEEK PREV_WEEK NEXT_WEEK THIS_MONTH PREV_MONTH NEXT_MONTH THIS_YEAR PREV_YEAR NEXT_YEAR].freeze
|
|
363
482
|
|
|
364
483
|
def self.included(klass)
|
|
365
484
|
klass.extend ClassMethods
|
|
@@ -212,7 +212,7 @@ module ActiveScaffold
|
|
|
212
212
|
end
|
|
213
213
|
|
|
214
214
|
def column_in_params_conditions?(key)
|
|
215
|
-
if key
|
|
215
|
+
if key.match?(/!$/)
|
|
216
216
|
conditions_from_params[1..-1].any? { |node| node.left.name.to_s == key[0..-2] }
|
|
217
217
|
else
|
|
218
218
|
conditions_from_params[0].include?(key)
|
|
@@ -25,17 +25,22 @@ module ActiveScaffold
|
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
def generate_temporary_id(record = nil, generated_id = nil)
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
unless generated_id
|
|
29
|
+
temp_id = (Time.now.to_f * 1_000_000).to_i.to_s
|
|
30
|
+
temp_id.succ! while @temporary_ids&.dig(record.class.name)&.include?(temp_id)
|
|
31
|
+
generated_id = temp_id
|
|
30
32
|
end
|
|
33
|
+
cache_generated_id record, generated_id
|
|
34
|
+
generated_id
|
|
31
35
|
end
|
|
32
36
|
|
|
33
37
|
def cache_generated_id(record, generated_id)
|
|
34
|
-
|
|
38
|
+
# cache all generated ids for the same class, so generate_temporary_id can check and ensure ids are unique
|
|
39
|
+
((@temporary_ids ||= {})[record.class.name] ||= []) << generated_id if record && generated_id
|
|
35
40
|
end
|
|
36
41
|
|
|
37
42
|
def generated_id(record)
|
|
38
|
-
@temporary_ids[record.class.name] if record && @temporary_ids
|
|
43
|
+
@temporary_ids[record.class.name]&.last if record && @temporary_ids
|
|
39
44
|
end
|
|
40
45
|
|
|
41
46
|
# These params should not propagate:
|