active_scaffold 3.7.6 → 3.7.7

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: cfe45d0a0b28f5cb324e7104add97e7a105de6986accf8d64db02cf5f65f19ea
4
- data.tar.gz: f8461b6a58ce6b1c93df2eaf95540a759fdcd73d21f256ee1a38ea4436b73987
3
+ metadata.gz: 5777dd56be3d144f2c62d8b2fa3cf8a0e765155d3afd445b5d150ce25c203155
4
+ data.tar.gz: 2c2ef1fbe12d539b84d81d48d1a2d373f3634a864664d61ab27099c783f404c4
5
5
  SHA512:
6
- metadata.gz: a65de91f886605e57d0f183295d9d1f8ea358b4657826143265f8359f4d41761b6325644fcb6d5dc1d5e5d4b87bbc966bf8cd9d4ee66db0ae4048455eb0c6b62
7
- data.tar.gz: 9fb4e3b6a38c5f340cdf430146ae9616a5e9a93e66c11e32dece9cb5704229499610da861916371e3bafb973d43705c9716228b5d04c50f896d5538320e0125c
6
+ metadata.gz: e13283f6ae89cf8618e070ee0e6afa87a47389eaee7043a669ab771f82c6aec2dbbdf2317c57ca6872785622e601d0d1278140e53cf24ca5245a88f9353dfe97
7
+ data.tar.gz: ea569709001c16bae097715c62fe9a9717597c288b2504d2c930e55aa01b28e77b53c29583d3e0462c86f329aebae8c8a82d73c832b14332a8999ee777d42e3c
data/CHANGELOG.rdoc CHANGED
@@ -1,3 +1,11 @@
1
+ = 3.7.7
2
+ - Fix usage with mongoid, broken on 3.7.5
3
+ - Support proc or lambda in label of action links
4
+ - Set successful to false when update_column is not authorized for the column
5
+ - Use action link's label for flash message when custom action is not authorized
6
+ - Add default_value to columns, so default_value can be defined in AS config, overriding DB default
7
+ - Fix caching query from association_klass_scoped in subforms, when returns different queries for the same association on different rows
8
+
1
9
  = 3.7.6
2
10
  - Respect :label_method set in form_ui_options on list.
3
11
  - Fix grouped search for PostgreSQL
@@ -4,7 +4,7 @@
4
4
  <h4><%= link.confirm(h(record&.to_label)) -%></h4>
5
5
 
6
6
  <p class="form-footer">
7
- <%= submit_tag as_(link.label), :class => 'submit' %>
7
+ <%= submit_tag as_(link.label(record)), :class => 'submit' %>
8
8
  <%= link_to as_(:cancel), main_path_to_return, :class => 'cancel' %>
9
9
  </p>
10
10
 
@@ -294,7 +294,7 @@ module ActiveScaffold::Actions
294
294
  end
295
295
  end
296
296
 
297
- def new_model
297
+ def empty_model
298
298
  relation = beginning_of_chain
299
299
  if nested? && nested.plural_association? && nested.match_model?(active_scaffold_config.model)
300
300
  build_options = sti_nested_build_options(relation.klass)
@@ -302,6 +302,18 @@ module ActiveScaffold::Actions
302
302
  relation.respond_to?(:build) ? relation.build(build_options || {}) : relation.new
303
303
  end
304
304
 
305
+ def new_model
306
+ empty_model.tap do |record|
307
+ assign_default_attributes record
308
+ end
309
+ end
310
+
311
+ def assign_default_attributes(record)
312
+ active_scaffold_config.columns.each do |column|
313
+ record.write_attribute column.name, column.default_value if column.default_value?
314
+ end
315
+ end
316
+
305
317
  def sti_nested_build_options(klass)
306
318
  config = active_scaffold_config_for(klass)
307
319
  return unless config
@@ -391,7 +403,7 @@ module ActiveScaffold::Actions
391
403
  get_row(crud_type_or_security_options)
392
404
  if @record.nil?
393
405
  self.successful = false
394
- flash[:error] = as_(:no_authorization_for_action, :action => action_name)
406
+ flash[:error] = as_(:no_authorization_for_action, :action => @action_link&.label(nil) || action_name)
395
407
  else
396
408
  yield @record
397
409
  end
@@ -12,7 +12,7 @@ module ActiveScaffold::Actions
12
12
  # FieldSearch uses params[:search] and not @record because search conditions do not always pass the Model's validations.
13
13
  # This facilitates for example, textual searches against associations via .search_sql
14
14
  def show_search
15
- @record = new_model
15
+ @record = empty_model
16
16
  super
17
17
  end
18
18
 
@@ -150,9 +150,8 @@ module ActiveScaffold::Actions
150
150
  params.delete(:original_html)
151
151
  params.delete(:original_value)
152
152
  @column = active_scaffold_config.columns[column]
153
- value_record = record_for_update_column
154
- return unless value_record
155
153
 
154
+ value_record = record_for_update_column
156
155
  value = value_for_update_column(value, @column, value_record)
157
156
  value_record.send("#{@column.name}=", value)
158
157
  before_update_save(@record)
@@ -168,16 +167,19 @@ module ActiveScaffold::Actions
168
167
  end
169
168
  end
170
169
  after_update_save(@record)
170
+ rescue ActiveScaffold::ActionNotAllowed
171
+ self.successful = false
171
172
  end
172
173
 
173
174
  def record_for_update_column
174
175
  @record = find_if_allowed(params[:id], :read)
175
- return unless @record.authorized_for?(:crud_type => :update, :column => @column.name)
176
+ raise ActiveScaffold::ActionNotAllowed unless @record.authorized_for?(:crud_type => :update, :column => @column.name)
176
177
 
177
178
  if @column.delegated_association
178
179
  value_record = @record.send(@column.delegated_association.name)
179
180
  value_record ||= @record.association(@column.delegated_association.name).build
180
- value_record if value_record.authorized_for?(:crud_type => :update, :column => @column.name)
181
+ raise ActiveScaffold::ActionNotAllowed unless value_record.authorized_for?(:crud_type => :update, :column => @column.name)
182
+ value_record
181
183
  else
182
184
  @record
183
185
  end
@@ -185,7 +187,7 @@ module ActiveScaffold::Actions
185
187
 
186
188
  def value_for_update_column(param_value, column, record)
187
189
  unless param_value
188
- param_value = ActiveScaffold::Core.column_type_cast column.default_for_empty_value, column.column
190
+ param_value = column.default_for_empty_value
189
191
  param_value = false if param_value == true
190
192
  end
191
193
  value = column_value_from_param_value(record, column, param_value)
@@ -267,12 +267,12 @@ module ActiveScaffold
267
267
  end
268
268
 
269
269
  def self.mongoid_column_type_cast(value, column)
270
- return Time.zone.at(value.to_i) if value =~ /\A\d+\z/ && [Time, DateTime].include?(column.type)
270
+ return Time.zone.at(value.to_i) if [Time, DateTime].include?(column.type) && value =~ /\A\d+\z/
271
271
  column.type.evolve value
272
272
  end
273
273
 
274
274
  def self.active_record_column_type_cast(value, column_or_type)
275
- return Time.zone.at(value.to_i) if value =~ /\A\d+\z/ && %i[time datetime].include?(column_or_type.type)
275
+ return Time.zone.at(value.to_i) if %i[time datetime].include?(column_or_type.type) && value =~ /\A\d+\z/
276
276
  cast_type = column_or_type.is_a?(ActiveRecord::ConnectionAdapters::Column) ? ActiveRecord::Type.lookup(column_or_type.type) : column_or_type
277
277
  cast_type ? cast_type.cast(value) : value
278
278
  end
@@ -77,8 +77,15 @@ module ActiveScaffold::DataStructures
77
77
 
78
78
  # what string to use to represent this action
79
79
  attr_writer :label
80
- def label
81
- @label.is_a?(Symbol) ? ActiveScaffold::Registry.cache(:translations, @label) { as_(@label) } : @label
80
+ def label(record = nil)
81
+ case @label
82
+ when Symbol
83
+ ActiveScaffold::Registry.cache(:translations, @label) { as_(@label) }
84
+ when Proc
85
+ @label.call(record)
86
+ else
87
+ @label
88
+ end
82
89
  end
83
90
 
84
91
  # image to use {:name => 'arrow.png', :size => '16x16'}
@@ -139,8 +139,15 @@ module ActiveScaffold::DataStructures
139
139
  end
140
140
 
141
141
  attr_writer :label
142
- def label
143
- as_(@label) if @label
142
+ def label(record)
143
+ case @label
144
+ when Symbol
145
+ ActiveScaffold::Registry.cache(:translations, @label) { as_(@label) }
146
+ when Proc
147
+ @label.call(record)
148
+ else
149
+ @label
150
+ end
144
151
  end
145
152
 
146
153
  def method_missing(name, *args, &block)
@@ -37,6 +37,19 @@ module ActiveScaffold::DataStructures
37
37
  @params ||= NO_PARAMS.dup
38
38
  end
39
39
 
40
+ def default_value
41
+ @default_value || @db_default_value
42
+ end
43
+
44
+ def default_value=(value)
45
+ raise ArgumentError, "Can't set default value for non-DB columns (virtual columns or associations)" unless column
46
+ @default_value = value
47
+ end
48
+
49
+ def default_value?
50
+ defined? @default_value
51
+ end
52
+
40
53
  # the display-name of the column. this will be used, for instance, as the column title in the table and as the field name in the form.
41
54
  # if left alone it will utilize human_attribute_name which includes localization
42
55
  attr_writer :label
@@ -377,6 +390,7 @@ module ActiveScaffold::DataStructures
377
390
  if @column.nil? && active_record? && active_record_class._default_attributes.key?(name.to_s)
378
391
  @column = active_record_class._default_attributes[name.to_s]
379
392
  end
393
+ @db_default_value = ActiveScaffold::OrmChecks.default_value active_record_class, name if @column
380
394
  @delegated_association = delegated_association
381
395
  @cache_key = [@active_record_class.name, name].compact.map(&:to_s).join('#')
382
396
  setup_association_info
@@ -455,10 +469,8 @@ module ActiveScaffold::DataStructures
455
469
  return nil unless column
456
470
  if column.is_a?(ActiveModel::Attribute)
457
471
  column.value
458
- elsif active_record?
459
- null? ? nil : column.default
460
- elsif mongoid?
461
- column.default_val
472
+ else
473
+ default_value
462
474
  end
463
475
  end
464
476
 
@@ -487,10 +499,6 @@ module ActiveScaffold::DataStructures
487
499
  ActiveScaffold::OrmChecks.column_type active_record_class, name
488
500
  end
489
501
 
490
- def default_value
491
- ActiveScaffold::OrmChecks.column_type active_record_class, name
492
- end
493
-
494
502
  def attributes=(opts)
495
503
  opts.each do |setting, value|
496
504
  send "#{setting}=", value
@@ -68,7 +68,7 @@ module ActiveScaffold
68
68
  group_tag = :li
69
69
  end
70
70
  content = content_tag(group_tag, :class => html_classes.presence, :onclick => ('' if hover_via_click?)) do
71
- content_tag(:div, as_(link.label), :class => link.name.to_s.downcase) << content_tag(:ul, content)
71
+ content_tag(:div, as_(link.label(record)), :class => link.name.to_s.downcase) << content_tag(:ul, content)
72
72
  end
73
73
  else
74
74
  content = render_action_link(link, record, options)
@@ -86,7 +86,7 @@ module ActiveScaffold
86
86
  end
87
87
  if link.action.nil? || (link.type == :member && options.key?(:authorized) && !options[:authorized])
88
88
  html_class = "disabled #{link.action}#{" #{link.html_options[:class]}" if link.html_options[:class].present?}"
89
- html_options = {:link => action_link_text(link, options), :class => html_class, :title => options[:not_authorized_reason]}
89
+ html_options = {:link => action_link_text(link, record, options), :class => html_class, :title => options[:not_authorized_reason]}
90
90
  action_link_html(link, nil, html_options, record)
91
91
  else
92
92
  url = action_link_url(link, record)
@@ -298,8 +298,8 @@ module ActiveScaffold
298
298
  url_options
299
299
  end
300
300
 
301
- def action_link_text(link, options)
302
- text = image_tag(link.image[:name], :size => link.image[:size], :alt => options[:link] || link.label, :title => options[:link] || link.label) if link.image
301
+ def action_link_text(link, record, options)
302
+ text = image_tag(link.image[:name], :size => link.image[:size], :alt => options[:link] || link.label(record), :title => options[:link] || link.label(record)) if link.image
303
303
  text || options[:link]
304
304
  end
305
305
 
@@ -329,7 +329,7 @@ module ActiveScaffold
329
329
  def action_link_html_options(link, record, options)
330
330
  link_id = get_action_link_id(link, record)
331
331
  html_options = link.html_options.merge(:class => [link.html_options[:class], link.action.to_s].compact.join(' '))
332
- html_options[:link] = action_link_text(link, options)
332
+ html_options[:link] = action_link_text(link, record, options)
333
333
 
334
334
  # Needs to be in html_options to as the adding _method to the url is no longer supported by Rails
335
335
  html_options[:method] = link.method if link.method != :get
@@ -388,7 +388,7 @@ module ActiveScaffold
388
388
 
389
389
  def action_link_html(link, url, html_options, record)
390
390
  label = html_options.delete(:link)
391
- label ||= link.label
391
+ label ||= link.label(record)
392
392
  if url.nil?
393
393
  content_tag(:a, label, html_options)
394
394
  else
@@ -6,7 +6,7 @@ module ActiveScaffold
6
6
  def cache_association_options(association, conditions, klass, cache = true)
7
7
  if active_scaffold_config.cache_association_options && cache
8
8
  @_associations_cache ||= Hash.new { |h, k| h[k] = {} }
9
- key = [association.name, association.inverse_klass.name, klass.name].join('/')
9
+ key = [association.name, association.inverse_klass.name, klass.respond_to?(:cache_key) ? klass.cache_key : klass.name].join('/')
10
10
  @_associations_cache[key][conditions] ||= yield
11
11
  else
12
12
  yield
@@ -31,8 +31,8 @@ module ActiveScaffold
31
31
  end
32
32
 
33
33
  conditions ||= send(association_helper_method(association, :options_for_association_conditions), association, record)
34
+ klass = send(association_helper_method(association, :association_klass_scoped), association, klass, record)
34
35
  cache_association_options(association, conditions, klass, cache) do
35
- klass = send(association_helper_method(association, :association_klass_scoped), association, klass, record)
36
36
  relation = klass.where(conditions)
37
37
  column = column_for_association(association, record)
38
38
  if column&.includes
@@ -181,6 +181,7 @@ module ActiveScaffold
181
181
  parent_record.send("build_#{association.name}")
182
182
  else
183
183
  association.klass.new.tap do |record|
184
+ assign_default_attributes record
184
185
  save_record_to_association(record, association.reverse_association, parent_record) # set inverse
185
186
  end
186
187
  end
@@ -157,7 +157,7 @@ module ActiveScaffold
157
157
  cache_keys ||= [method, model.name]
158
158
  ActiveScaffold::Registry.cache(*cache_keys) do
159
159
  model_names = [model.name]
160
- model_names << model.base_class.name if model.base_class != model
160
+ model_names << model.base_class.name if model.respond_to?(:base_class) && model.base_class != model
161
161
  method_with_class = model_names.find do |model_name|
162
162
  method_with_class = "#{clean_class_name(model_name)}_#{method}"
163
163
  break method_with_class if respond_to?(method_with_class)
@@ -85,9 +85,9 @@ module ActiveScaffold
85
85
 
86
86
  def default_value(klass, column_name)
87
87
  if ActiveScaffold::OrmChecks.mongoid? klass
88
- columns_hash(klass)[column_name]&.default_val
88
+ columns_hash(klass)[column_name.to_s]&.default_val
89
89
  elsif ActiveScaffold::OrmChecks.active_record? klass
90
- klass._default_attributes[column_name]&.value
90
+ klass._default_attributes[column_name.to_s]&.value
91
91
  end
92
92
  end
93
93
 
@@ -2,7 +2,7 @@ module ActiveScaffold
2
2
  module Version
3
3
  MAJOR = 3
4
4
  MINOR = 7
5
- PATCH = 6
5
+ PATCH = 7
6
6
  FIX = nil
7
7
 
8
8
  STRING = [MAJOR, MINOR, PATCH, FIX].compact.join('.')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_scaffold
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.7.6
4
+ version: 3.7.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Many, see README
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-06-26 00:00:00.000000000 Z
11
+ date: 2024-09-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails