active_scaffold 3.7.6 → 3.7.7

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: 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