active_scaffold 3.4.5 → 3.4.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
  SHA1:
3
- metadata.gz: 9f474117432310ae21c926433541aa5849b9303b
4
- data.tar.gz: 1ebb3ec0f64123d0afc586b4015e29a4d634a294
3
+ metadata.gz: ac10aec1fac3d66afecec71c2262dedb311c000c
4
+ data.tar.gz: 77208c9dbc9f3c50b8bd88265ba645be6fe6e857
5
5
  SHA512:
6
- metadata.gz: 33bfb4cd1023bc82fe3c2974f4725794688b8a96e11033c62081f16dce820e6d31ae09a321949e70605312aa51d87c17a60c373378b9fda71079512803e418f3
7
- data.tar.gz: 1f351e2a0d0e5b49cfb952c6763fb0ecd826cc91788ddd8c4cb7c6999a2e02ccdee0f7e1867c730ce09f27029de4e9655a39b3da13d4812d363d14cdb24c322a
6
+ metadata.gz: 8cd83d6362143864a3cf2c753163562821da1c32ebb641f0b0e25e49459b3bbee91c415db5f1a256b13a8a06a1d774361c0233bdffd1902ae0f9417b9e004b62
7
+ data.tar.gz: da1a7da25ad88b2d88ce8811e5d6d4b830c2991a673bc90412f68b30244e4141a51b2119cf0415a11daa8a2f99ad99166f3d7845921e671d6ed0ac37653a5c0d
data/CHANGELOG CHANGED
@@ -1,3 +1,15 @@
1
+ = 3.4.7 (not released yet)
2
+ - sorting by primary key added by default only for postgres, on mysql it will avoid using index to sort (you can see using filesort on explain), slowdown sorting
3
+ - fix set_parent on rails 3.2 with attr_accessible
4
+ - fix saving changes on render_field when blank row is changed and request render_field action
5
+
6
+ = 3.4.6
7
+ - Add paper_trail bridge (requires 3.0.5 version for nested support). It adds:
8
+ - a collection link to deleted action which display deleted_records
9
+ - a member link to PaperTrail::VersionsController which display changes for current record. PaperTrail::VersionsController must be added, not included with ActiveScaffold.
10
+ - Focus first element on persistent create forms when form is reloaded
11
+ - Fix linking to non-namespaced controller from namespaced controller
12
+
1
13
  = 3.4.5
2
14
  - Fix default sorting on ruby 1.8
3
15
  - Fix add existing button, broken on 3.4.4
@@ -30,6 +30,7 @@ action_link.update_flash_messages('<%= escape_javascript(render(:partial => 'mes
30
30
  ActiveScaffold.reset_form('<%= form_selector %>');
31
31
  <% elsif params[:dont_close] %>
32
32
  ActiveScaffold.replace('<%= form_selector %>','<%= escape_javascript(render(:partial => 'create_form', :locals => {:xhr => true})) %>');
33
+ ActiveScaffold.focus_first_element_of_form('<%= form_selector %>');
33
34
  <% else %>
34
35
  action_link.close();
35
36
  <% end %>
@@ -21,6 +21,7 @@ en:
21
21
  between: Between
22
22
  cancel: Cancel
23
23
  cant_destroy_record: "%{record} can't be destroyed"
24
+ changes: Changes
24
25
  click_to_edit: "Click to edit"
25
26
  click_to_reset: "Click to reset"
26
27
  close: Close
@@ -43,6 +44,7 @@ en:
43
44
  days: Days
44
45
  delete: Delete
45
46
  deleted_model: "Deleted %{model}"
47
+ deleted_records: "List Deleted Records"
46
48
  delimiter: Delimiter
47
49
  download: Download
48
50
  edit: Edit
@@ -21,6 +21,7 @@ es:
21
21
  between: Entre
22
22
  cancel: Cancelar
23
23
  cant_destroy_record: "No se pudo borrar %{record}"
24
+ changes: Cambios
24
25
  click_to_edit: "Pulsa para editar"
25
26
  click_to_reset: "Pulsa para restaurar"
26
27
  close: Cerrar
@@ -43,6 +44,7 @@ es:
43
44
  days: Días
44
45
  delete: Borrar
45
46
  deleted_model: "%{model} borrado"
47
+ deleted_records: "Ver Eliminados"
46
48
  delimiter: Delimitador
47
49
  download: Descargar
48
50
  edit: Editar
@@ -84,7 +84,7 @@ module ActiveScaffold::Actions
84
84
  @record.id = params[:id]
85
85
  end
86
86
  set_parent(@record) if @record.id.nil? && params[:parent_controller] && @scope
87
-
87
+
88
88
  after_render_field(@record, @column)
89
89
  end
90
90
  end
@@ -97,7 +97,7 @@ module ActiveScaffold::Actions
97
97
  parent = parent_model.new
98
98
  copy_attributes(parent_model.find(params[:parent_id]), parent) if params[:parent_id]
99
99
  parent.id = params[:parent_id]
100
- parent = update_record_from_params(parent, active_scaffold_config_for(parent_model).send(params[:parent_id] ? :update : :create).columns, params[:record]) if @column.send_form_on_update_column
100
+ parent = update_record_from_params(parent, active_scaffold_config_for(parent_model).send(params[:parent_id] ? :update : :create).columns, params[:record], true) if @column.send_form_on_update_column
101
101
  apply_constraints_to_record(parent) if params[:parent_id]
102
102
  if record.class.reflect_on_association(association).collection?
103
103
  record.send(association) << parent
@@ -107,10 +107,14 @@ module ActiveScaffold::Actions
107
107
  end
108
108
  end
109
109
 
110
- def copy_attributes(orig, dst)
110
+ def copy_attributes(orig, dst = nil)
111
+ dst ||= orig.class.new
111
112
  attributes = orig.attributes
112
- if orig.class.respond_to? :protected_attributes
113
- orig.class.protected_attributes.each { |attr| dst[attr] = orig[attr] }
113
+ if orig.class.respond_to?(:accessible_attributes) && orig.class.accessible_attributes.present?
114
+ attributes.each { |attr, value| dst.send :write_attribute, attr, value if orig.class.accessible_attributes.deny? attr }
115
+ attributes = attributes.slice(*orig.class.accessible_attributes)
116
+ elsif orig.class.respond_to? :protected_attributes
117
+ orig.class.protected_attributes.each { |attr| dst.send :write_attribute, attr, orig[attr] }
114
118
  attributes = attributes.except(*orig.class.protected_attributes)
115
119
  end
116
120
  dst.attributes = attributes
@@ -59,7 +59,7 @@ module ActiveScaffold
59
59
  if multi_parameter_attributes.has_key? column.name.to_s
60
60
  parent_record.send(:assign_multiparameter_attributes, multi_parameter_attributes[column.name.to_s])
61
61
  elsif attributes.has_key? column.name
62
- value = column_value_from_param_value(parent_record, column, attributes[column.name])
62
+ value = column_value_from_param_value(parent_record, column, attributes[column.name], avoid_changes)
63
63
  if avoid_changes && column.plural_association?
64
64
  parent_record.association(column.name).target = value
65
65
  else
@@ -84,13 +84,13 @@ module ActiveScaffold
84
84
  parent_record
85
85
  end
86
86
 
87
- def column_value_from_param_value(parent_record, column, value)
87
+ def column_value_from_param_value(parent_record, column, value, avoid_changes = false)
88
88
  # convert the value, possibly by instantiating associated objects
89
89
  form_ui = column.form_ui || column.column.try(:type)
90
90
  if form_ui && self.respond_to?("column_value_for_#{form_ui}_type", true)
91
91
  self.send("column_value_for_#{form_ui}_type", parent_record, column, value)
92
92
  elsif value.is_a?(Hash)
93
- column_value_from_param_hash_value(parent_record, column, value)
93
+ column_value_from_param_hash_value(parent_record, column, value, avoid_changes)
94
94
  else
95
95
  column_value_from_param_simple_value(parent_record, column, value)
96
96
  end
@@ -146,25 +146,25 @@ module ActiveScaffold
146
146
  end
147
147
  end
148
148
 
149
- def column_value_from_param_hash_value(parent_record, column, value)
149
+ def column_value_from_param_hash_value(parent_record, column, value, avoid_changes = false)
150
150
  if column.singular_association?
151
- manage_nested_record_from_params(parent_record, column, value)
151
+ manage_nested_record_from_params(parent_record, column, value, avoid_changes)
152
152
  elsif column.plural_association?
153
153
  value = value.sort if RUBY_VERSION < '1.9'
154
154
  # HACK to be able to delete all associated records, hash will include "0" => ""
155
- value.collect {|key, value| manage_nested_record_from_params(parent_record, column, value) unless value == ""}.compact
155
+ value.collect {|key, value| manage_nested_record_from_params(parent_record, column, value, avoid_changes) unless value == ""}.compact
156
156
  else
157
157
  value
158
158
  end
159
159
  end
160
160
 
161
- def manage_nested_record_from_params(parent_record, column, attributes)
161
+ def manage_nested_record_from_params(parent_record, column, attributes, avoid_changes = false)
162
162
  return nil unless build_record_from_params(attributes, column, parent_record)
163
163
  record = find_or_create_for_params(attributes, column, parent_record)
164
164
  if record
165
165
  record_columns = active_scaffold_config_for(column.association.klass).subform.columns
166
166
  record_columns.constraint_columns = [column.association.reverse]
167
- update_record_from_params(record, record_columns, attributes)
167
+ update_record_from_params(record, record_columns, attributes, avoid_changes)
168
168
  record.unsaved = true
169
169
  end
170
170
  record
@@ -0,0 +1,10 @@
1
+ class ActiveScaffold::Bridges::PaperTrail < ActiveScaffold::DataStructures::Bridge
2
+ def self.install
3
+ require File.join(File.dirname(__FILE__), "paper_trail/paper_trail_bridge")
4
+ require File.join(File.dirname(__FILE__), "paper_trail/actions")
5
+ require File.join(File.dirname(__FILE__), "paper_trail/config")
6
+ require File.join(File.dirname(__FILE__), "paper_trail/helper")
7
+ ActiveScaffold::Config::Core.send :include, ActiveScaffold::Bridges::PaperTrail::PaperTrailBridge
8
+ ActionDispatch::Routing::ACTIVE_SCAFFOLD_CORE_ROUTING[:collection][:deleted] = :get
9
+ end
10
+ end
@@ -0,0 +1,23 @@
1
+ module ActiveScaffold::Actions
2
+ module DeletedRecords
3
+ def self.included(base)
4
+ base.class_eval do
5
+ config = active_scaffold_config
6
+ if config.actions.include?(:nested) && config.deleted_records.nested_link_group
7
+ config.configure { nested.add_link :versions, :label => config.deleted_records.nested_link_label, :action_group => config.deleted_records.nested_link_group }
8
+ end
9
+ end
10
+ end
11
+
12
+ def deleted
13
+ query = PaperTrail::Version.destroys.where(:item_type => active_scaffold_config.model)
14
+ query = query.where_object(nested.child_association.foreign_key => nested.parent_id) if nested? && nested.child_association.macro == :belongs_to && PaperTrail::Version.respond_to?(:where_object)
15
+ pager = Paginator.new(query.count, active_scaffold_config.list.per_page) do |offset, per_page|
16
+ query.offset(offset).limit(per_page).map(&:reify)
17
+ end
18
+ @page = pager.page(params[:page] || 1)
19
+ @records = @page.items
20
+ respond_to_action(:list)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,29 @@
1
+ module ActiveScaffold::Config
2
+ class DeletedRecords < Base
3
+ self.crud_type = :read
4
+
5
+ def initialize(core_config)
6
+ super
7
+ @nested_link_label = self.class.nested_link_label
8
+ @nested_link_group = self.class.nested_link_group
9
+ end
10
+
11
+ # the ActionLink for this action
12
+ cattr_accessor :link
13
+ @@link = ActiveScaffold::DataStructures::ActionLink.new(:deleted, :label => :deleted_records, :type => :collection)
14
+
15
+ # label for versions nested link
16
+ cattr_accessor :nested_link_label
17
+ @@nested_link_label = :changes
18
+
19
+ # group for versions nested link
20
+ cattr_accessor :nested_link_group
21
+ @@nested_link_group = 'member'
22
+
23
+ # label for versions nested link
24
+ attr_accessor :nested_link_label
25
+
26
+ # group for versions nested link
27
+ attr_accessor :nested_link_group
28
+ end
29
+ end
@@ -0,0 +1,20 @@
1
+ module ActiveScaffold::Bridges
2
+ class PaperTrail
3
+ module Helper
4
+ def filter_action_links_for_deleted(action_links, record, options)
5
+ end
6
+
7
+ def display_action_links(action_links, record, options, &block)
8
+ if action_name == 'deleted'
9
+ action_links = filter_action_links_for_deleted(action_links, record, options)
10
+ return unless action_links
11
+ end
12
+ super(action_links, record, options, &block)
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ ActionView::Base.class_eval do
19
+ include ActiveScaffold::Bridges::PaperTrail::Helper
20
+ end
@@ -0,0 +1,17 @@
1
+ module ActiveScaffold
2
+ module Bridges
3
+ class PaperTrail
4
+ module PaperTrailBridge
5
+ def initialize_with_paper_trail(model_id)
6
+ initialize_without_paper_trail(model_id)
7
+ return unless self.model < ::PaperTrail::Model::InstanceMethods
8
+ self.actions << :deleted_records
9
+ end
10
+
11
+ def self.included(base)
12
+ base.alias_method_chain :initialize, :paper_trail
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -171,7 +171,7 @@ module ActiveScaffold
171
171
  controller = active_scaffold_controller_for_column(column, options)
172
172
 
173
173
  unless controller.nil?
174
- options.reverse_merge! :position => :after, :type => :member, :controller => (controller == :polymorph ? controller : controller.controller_path), :column => column
174
+ options.reverse_merge! :position => :after, :type => :member, :controller => (controller == :polymorph ? controller : "/#{controller.controller_path}"), :column => column
175
175
  options[:parameters] ||= {}
176
176
  options[:parameters].reverse_merge! :association => column.association.name
177
177
  if column.plural_association?
@@ -4,6 +4,7 @@ module ActiveScaffold::DataStructures
4
4
  include Enumerable
5
5
 
6
6
  attr_accessor :constraint_columns
7
+ attr_accessor :sorting_by_primary_key
7
8
 
8
9
  def initialize(columns)
9
10
  @columns = columns
@@ -18,7 +19,8 @@ module ActiveScaffold::DataStructures
18
19
  # fallback to setting primary key ordering
19
20
  if model.column_names.include?(model.primary_key)
20
21
  set([model.primary_key, 'ASC'])
21
- @sorting_by_primary_key = clause
22
+ @primary_key_clause = clause
23
+ @sorting_by_primary_key = model.connection.try(:adapter_name) == 'PostgreSQL' # mandatory for postgres, so enabled by default
22
24
  end
23
25
  # If an ORDER BY clause is found set default sorting according to it
24
26
  if order_clause
@@ -121,7 +123,7 @@ module ActiveScaffold::DataStructures
121
123
  order << Array(sql).map {|column| "#{column} #{sort_direction}"}.join(', ')
122
124
  end
123
125
 
124
- order << @sorting_by_primary_key if @sorting_by_primary_key # mandatory for postgres
126
+ order << @primary_key_clause if @sorting_by_primary_key
125
127
  order unless order.empty?
126
128
  end
127
129
 
@@ -6,7 +6,7 @@ module ActiveScaffold
6
6
  end
7
7
 
8
8
  def pagination_url_options(url_options = nil)
9
- url_options ||= params_for(:action => :index)
9
+ url_options ||= params_for
10
10
  unless active_scaffold_config.store_user_settings
11
11
  url_options.merge!(:search => search_params) if search_params.present?
12
12
  if active_scaffold_config.list.user.user_sorting?
@@ -2,7 +2,7 @@ module ActiveScaffold
2
2
  module Version
3
3
  MAJOR = 3
4
4
  MINOR = 4
5
- PATCH = 5
5
+ PATCH = 7
6
6
 
7
7
  STRING = [MAJOR, MINOR, PATCH].compact.join('.')
8
8
  end
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.4.5
4
+ version: 3.4.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: 2014-09-19 00:00:00.000000000 Z
11
+ date: 2014-10-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: shoulda
@@ -230,6 +230,11 @@ files:
230
230
  - lib/active_scaffold/bridges/file_column/test/functional/file_column_keep_test.rb
231
231
  - lib/active_scaffold/bridges/file_column/test/mock_model.rb
232
232
  - lib/active_scaffold/bridges/file_column/test/test_helper.rb
233
+ - lib/active_scaffold/bridges/paper_trail.rb
234
+ - lib/active_scaffold/bridges/paper_trail/actions.rb
235
+ - lib/active_scaffold/bridges/paper_trail/config.rb
236
+ - lib/active_scaffold/bridges/paper_trail/helper.rb
237
+ - lib/active_scaffold/bridges/paper_trail/paper_trail_bridge.rb
233
238
  - lib/active_scaffold/bridges/paperclip.rb
234
239
  - lib/active_scaffold/bridges/paperclip/form_ui.rb
235
240
  - lib/active_scaffold/bridges/paperclip/list_ui.rb