active_scaffold 3.2.7 → 3.2.8
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.
- data/CHANGELOG +16 -1
- data/app/assets/javascripts/jquery/active_scaffold.js +50 -16
- data/app/assets/javascripts/jquery/jquery.editinplace.js +6 -6
- data/app/assets/javascripts/prototype/active_scaffold.js +39 -15
- data/app/assets/stylesheets/active_scaffold_layout.css +24 -1
- data/frontends/default/views/_base_form.html.erb +9 -10
- data/frontends/default/views/_form.html.erb +8 -7
- data/frontends/default/views/_form_attribute.html.erb +6 -3
- data/frontends/default/views/_form_messages.html.erb +3 -3
- data/frontends/default/views/_horizontal_subform_record.html.erb +1 -1
- data/frontends/default/views/_list_calculations.html.erb +1 -1
- data/frontends/default/views/_list_messages.html.erb +10 -13
- data/frontends/default/views/_list_record_columns.html.erb +2 -2
- data/frontends/default/views/_messages.html.erb +1 -1
- data/frontends/default/views/_refresh_list.js.erb +1 -0
- data/frontends/default/views/_row.html.erb +2 -2
- data/frontends/default/views/_search.html.erb +2 -2
- data/frontends/default/views/_update_calculations.js.erb +4 -0
- data/frontends/default/views/_update_messages.js.erb +2 -0
- data/frontends/default/views/_vertical_subform_record.html.erb +1 -1
- data/frontends/default/views/add_existing.js.erb +2 -6
- data/frontends/default/views/destroy.js.erb +25 -23
- data/frontends/default/views/on_action_update.js.erb +21 -12
- data/frontends/default/views/on_create.js.erb +24 -21
- data/frontends/default/views/on_update.js.erb +19 -18
- data/frontends/default/views/refresh_list.js.erb +2 -1
- data/frontends/default/views/row.js.erb +1 -0
- data/frontends/default/views/update_column.js.erb +14 -15
- data/lib/active_scaffold.rb +1 -1
- data/lib/active_scaffold/actions/core.rb +6 -2
- data/lib/active_scaffold/actions/create.rb +9 -12
- data/lib/active_scaffold/actions/delete.rb +1 -4
- data/lib/active_scaffold/actions/list.rb +15 -12
- data/lib/active_scaffold/actions/mark.rb +1 -2
- data/lib/active_scaffold/actions/nested.rb +2 -1
- data/lib/active_scaffold/actions/update.rb +5 -8
- data/lib/active_scaffold/config/list.rb +18 -0
- data/lib/active_scaffold/constraints.rb +2 -12
- data/lib/active_scaffold/data_structures/column.rb +5 -2
- data/lib/active_scaffold/data_structures/nested_info.rb +6 -5
- data/lib/active_scaffold/finder.rb +11 -7
- data/lib/active_scaffold/helpers/controller_helpers.rb +16 -6
- data/lib/active_scaffold/helpers/form_column_helpers.rb +10 -20
- data/lib/active_scaffold/helpers/id_helpers.rb +2 -2
- data/lib/active_scaffold/helpers/list_column_helpers.rb +15 -20
- data/lib/active_scaffold/helpers/search_column_helpers.rb +15 -27
- data/lib/active_scaffold/helpers/show_column_helpers.rb +9 -20
- data/lib/active_scaffold/helpers/view_helpers.rb +20 -1
- data/lib/active_scaffold/version.rb +1 -1
- metadata +8 -4
| @@ -48,8 +48,7 @@ module ActiveScaffold::Actions | |
| 48 48 | 
             
                      end
         | 
| 49 49 | 
             
                    else
         | 
| 50 50 | 
             
                      if !nested? && active_scaffold_config.actions.include?(:list) && active_scaffold_config.list.always_show_create
         | 
| 51 | 
            -
                         | 
| 52 | 
            -
                        render(:action => 'list')
         | 
| 51 | 
            +
                        list
         | 
| 53 52 | 
             
                      else
         | 
| 54 53 | 
             
                        render(:action => 'create')
         | 
| 55 54 | 
             
                      end
         | 
| @@ -58,10 +57,7 @@ module ActiveScaffold::Actions | |
| 58 57 | 
             
                end
         | 
| 59 58 |  | 
| 60 59 | 
             
                def create_respond_to_js
         | 
| 61 | 
            -
                  if successful? && active_scaffold_config.create.refresh_list && !render_parent?
         | 
| 62 | 
            -
                    do_search if respond_to? :do_search
         | 
| 63 | 
            -
                    do_list
         | 
| 64 | 
            -
                  end
         | 
| 60 | 
            +
                  do_refresh_list if successful? && active_scaffold_config.create.refresh_list && !render_parent?
         | 
| 65 61 | 
             
                  render :action => 'on_create'
         | 
| 66 62 | 
             
                end
         | 
| 67 63 |  | 
| @@ -84,26 +80,27 @@ module ActiveScaffold::Actions | |
| 84 80 | 
             
                  apply_constraints_to_record(@record)
         | 
| 85 81 | 
             
                  if nested?
         | 
| 86 82 | 
             
                    create_association_with_parent(@record)
         | 
| 87 | 
            -
                    register_constraints_with_action_columns | 
| 83 | 
            +
                    register_constraints_with_action_columns
         | 
| 88 84 | 
             
                  end
         | 
| 89 85 | 
             
                  @record
         | 
| 90 86 | 
             
                end
         | 
| 91 87 |  | 
| 92 88 | 
             
                # A somewhat complex method to actually create a new record. The complexity is from support for subforms and associated records.
         | 
| 93 89 | 
             
                # If you want to customize this behavior, consider using the +before_create_save+ and +after_create_save+ callbacks.
         | 
| 94 | 
            -
                def do_create
         | 
| 90 | 
            +
                def do_create(hash = nil)
         | 
| 91 | 
            +
                  hash ||= params[:record]
         | 
| 95 92 | 
             
                  begin
         | 
| 96 93 | 
             
                    active_scaffold_config.model.transaction do
         | 
| 97 | 
            -
                      @record = update_record_from_params(new_model, active_scaffold_config.create.columns,  | 
| 94 | 
            +
                      @record = update_record_from_params(new_model, active_scaffold_config.create.columns, hash)
         | 
| 98 95 | 
             
                      apply_constraints_to_record(@record, :allow_autosave => true)
         | 
| 99 96 | 
             
                      if nested?
         | 
| 100 97 | 
             
                        create_association_with_parent(@record) 
         | 
| 101 | 
            -
                        register_constraints_with_action_columns | 
| 98 | 
            +
                        register_constraints_with_action_columns
         | 
| 102 99 | 
             
                      end
         | 
| 103 100 | 
             
                      create_save
         | 
| 104 101 | 
             
                    end
         | 
| 105 | 
            -
                  rescue ActiveRecord:: | 
| 106 | 
            -
                    flash[:error] =  | 
| 102 | 
            +
                  rescue ActiveRecord::ActiveRecordError => ex
         | 
| 103 | 
            +
                    flash[:error] = ex.message
         | 
| 107 104 | 
             
                    self.successful = false
         | 
| 108 105 | 
             
                  end
         | 
| 109 106 | 
             
                end
         | 
| @@ -23,10 +23,7 @@ module ActiveScaffold::Actions | |
| 23 23 | 
             
                end
         | 
| 24 24 |  | 
| 25 25 | 
             
                def destroy_respond_to_js
         | 
| 26 | 
            -
                  if successful? && active_scaffold_config.delete.refresh_list && !render_parent?
         | 
| 27 | 
            -
                    do_search if respond_to? :do_search
         | 
| 28 | 
            -
                    do_list
         | 
| 29 | 
            -
                  end
         | 
| 26 | 
            +
                  do_refresh_list if successful? && active_scaffold_config.delete.refresh_list && !render_parent?
         | 
| 30 27 | 
             
                  render(:action => 'destroy')
         | 
| 31 28 | 
             
                end
         | 
| 32 29 |  | 
| @@ -16,7 +16,11 @@ module ActiveScaffold::Actions | |
| 16 16 | 
             
                end
         | 
| 17 17 |  | 
| 18 18 | 
             
                def list
         | 
| 19 | 
            -
                   | 
| 19 | 
            +
                  if %w(index list).include? action_name
         | 
| 20 | 
            +
                    do_list
         | 
| 21 | 
            +
                  else
         | 
| 22 | 
            +
                    do_refresh_list
         | 
| 23 | 
            +
                  end
         | 
| 20 24 | 
             
                  @nested_auto_open = active_scaffold_config.list.nested_auto_open
         | 
| 21 25 | 
             
                  respond_to_action(:list)
         | 
| 22 26 | 
             
                end
         | 
| @@ -33,7 +37,7 @@ module ActiveScaffold::Actions | |
| 33 37 | 
             
                  if params[:adapter] || embedded?
         | 
| 34 38 | 
             
                    render(:partial => 'list_with_header')
         | 
| 35 39 | 
             
                  else
         | 
| 36 | 
            -
                    render : | 
| 40 | 
            +
                    render :partial => 'refresh_list', :formats => [:js]
         | 
| 37 41 | 
             
                  end
         | 
| 38 42 | 
             
                end
         | 
| 39 43 | 
             
                def list_respond_to_xml
         | 
| @@ -78,6 +82,11 @@ module ActiveScaffold::Actions | |
| 78 82 | 
             
                  end
         | 
| 79 83 | 
             
                  @page, @records = page, page.items
         | 
| 80 84 | 
             
                end
         | 
| 85 | 
            +
                
         | 
| 86 | 
            +
                def do_refresh_list
         | 
| 87 | 
            +
                  do_search if respond_to? :do_search
         | 
| 88 | 
            +
                  do_list
         | 
| 89 | 
            +
                end
         | 
| 81 90 |  | 
| 82 91 | 
             
                def each_record_in_page
         | 
| 83 92 | 
             
                  _page = active_scaffold_config.list.user.page
         | 
| @@ -89,13 +98,7 @@ module ActiveScaffold::Actions | |
| 89 98 |  | 
| 90 99 | 
             
                def each_record_in_scope
         | 
| 91 100 | 
             
                  do_search if respond_to? :do_search
         | 
| 92 | 
            -
                  finder_options  | 
| 93 | 
            -
                    :conditions => all_conditions,
         | 
| 94 | 
            -
                    :joins => joins_for_finder}
         | 
| 95 | 
            -
                  finder_options.merge! custom_finder_options
         | 
| 96 | 
            -
                  finder_options.merge! :include => (active_scaffold_includes.blank? ? nil : active_scaffold_includes)
         | 
| 97 | 
            -
                  klass = beginning_of_chain
         | 
| 98 | 
            -
                  klass.all(finder_options).each {|record| yield record}
         | 
| 101 | 
            +
                  append_to_query(beginning_of_chain, finder_options).all.each {|record| yield record}
         | 
| 99 102 | 
             
                end
         | 
| 100 103 |  | 
| 101 104 | 
             
                # The default security delegates to ActiveRecordPermissions.
         | 
| @@ -117,6 +120,7 @@ module ActiveScaffold::Actions | |
| 117 120 | 
             
                    @record = find_if_allowed(params[:id], :read) if params[:id] && params[:id] && params[:id].to_i > 0
         | 
| 118 121 | 
             
                    respond_to_action(:action_confirmation)
         | 
| 119 122 | 
             
                  else
         | 
| 123 | 
            +
                    @action_link = active_scaffold_config.action_links[action_name]
         | 
| 120 124 | 
             
                    if params[:id] && params[:id] && params[:id].to_i > 0
         | 
| 121 125 | 
             
                      crud_type ||= (request.post? || request.put?) ? :update : :delete
         | 
| 122 126 | 
             
                      @record = find_if_allowed(params[:id], crud_type)
         | 
| @@ -139,12 +143,11 @@ module ActiveScaffold::Actions | |
| 139 143 | 
             
                end
         | 
| 140 144 |  | 
| 141 145 | 
             
                def action_update_respond_to_html
         | 
| 142 | 
            -
                  do_search if respond_to? :do_search
         | 
| 143 | 
            -
                  do_list
         | 
| 144 146 | 
             
                  redirect_to :action => 'index'
         | 
| 145 147 | 
             
                end
         | 
| 146 148 |  | 
| 147 149 | 
             
                def action_update_respond_to_js
         | 
| 150 | 
            +
                  do_refresh_list unless @record.present?
         | 
| 148 151 | 
             
                  render(:action => 'on_action_update')
         | 
| 149 152 | 
             
                end
         | 
| 150 153 |  | 
| @@ -171,7 +174,7 @@ module ActiveScaffold::Actions | |
| 171 174 | 
             
                alias_method :index_formats, :list_formats
         | 
| 172 175 |  | 
| 173 176 | 
             
                def row_formats
         | 
| 174 | 
            -
                  ([:html] + active_scaffold_config.formats + active_scaffold_config.list.formats).uniq
         | 
| 177 | 
            +
                  ([:html, :js] + active_scaffold_config.formats + active_scaffold_config.list.formats).uniq
         | 
| 175 178 | 
             
                end
         | 
| 176 179 |  | 
| 177 180 | 
             
                def action_update_formats
         | 
| @@ -13,17 +13,16 @@ module ActiveScaffold::Actions | |
| 13 13 | 
             
                  else
         | 
| 14 14 | 
             
                    do_unmark
         | 
| 15 15 | 
             
                  end
         | 
| 16 | 
            +
                  do_list
         | 
| 16 17 | 
             
                  respond_to_action(:mark_all)
         | 
| 17 18 | 
             
                end
         | 
| 18 19 | 
             
                protected
         | 
| 19 20 |  | 
| 20 21 | 
             
                def mark_all_respond_to_html
         | 
| 21 | 
            -
                  do_list
         | 
| 22 22 | 
             
                  list_respond_to_html
         | 
| 23 23 | 
             
                end
         | 
| 24 24 |  | 
| 25 25 | 
             
                def mark_all_respond_to_js
         | 
| 26 | 
            -
                  do_list
         | 
| 27 26 | 
             
                  render :action => 'on_mark_all', :locals => {:mark_all => mark_all?}
         | 
| 28 27 | 
             
                end
         | 
| 29 28 |  | 
| @@ -27,8 +27,9 @@ module ActiveScaffold::Actions | |
| 27 27 | 
             
                  if params[:parent_scaffold] && (params[:association] || params[:named_scope])
         | 
| 28 28 | 
             
                    @nested = ActiveScaffold::DataStructures::NestedInfo.get(active_scaffold_config.model, params)
         | 
| 29 29 | 
             
                    unless @nested.nil?
         | 
| 30 | 
            +
                      active_scaffold_constraints.merge! @nested.constraints  
         | 
| 30 31 | 
             
                      active_scaffold_constraints[:id] = params[:id] if @nested.belongs_to?
         | 
| 31 | 
            -
                      register_constraints_with_action_columns | 
| 32 | 
            +
                      register_constraints_with_action_columns
         | 
| 32 33 | 
             
                    end
         | 
| 33 34 | 
             
                  end
         | 
| 34 35 | 
             
                end
         | 
| @@ -48,10 +48,7 @@ module ActiveScaffold::Actions | |
| 48 48 | 
             
                end
         | 
| 49 49 | 
             
                def update_respond_to_js
         | 
| 50 50 | 
             
                  if successful?
         | 
| 51 | 
            -
                    if update_refresh_list? && !render_parent?
         | 
| 52 | 
            -
                      do_search if respond_to? :do_search
         | 
| 53 | 
            -
                      do_list
         | 
| 54 | 
            -
                    end
         | 
| 51 | 
            +
                    do_refresh_list if update_refresh_list? && !render_parent?
         | 
| 55 52 | 
             
                    flash.now[:info] = as_(:updated_model, :model => @record.to_label) if active_scaffold_config.update.persistent
         | 
| 56 53 | 
             
                  end
         | 
| 57 54 | 
             
                  render :action => 'on_update'
         | 
| @@ -68,7 +65,7 @@ module ActiveScaffold::Actions | |
| 68 65 | 
             
                # A simple method to find and prepare a record for editing
         | 
| 69 66 | 
             
                # May be overridden to customize the record (set default values, etc.)
         | 
| 70 67 | 
             
                def do_edit
         | 
| 71 | 
            -
                  register_constraints_with_action_columns( | 
| 68 | 
            +
                  register_constraints_with_action_columns(active_scaffold_config.update.hide_nested_column ? [] : [:update]) if nested?
         | 
| 72 69 | 
             
                  @record = find_if_allowed(params[:id], :update)
         | 
| 73 70 | 
             
                end
         | 
| 74 71 |  | 
| @@ -94,15 +91,15 @@ module ActiveScaffold::Actions | |
| 94 91 | 
             
                        raise ActiveRecord::Rollback, "don't save habtm associations unless record is valid"
         | 
| 95 92 | 
             
                      end
         | 
| 96 93 | 
             
                    end
         | 
| 97 | 
            -
                  rescue ActiveRecord::RecordInvalid
         | 
| 98 | 
            -
                    flash[:error] = $!.message
         | 
| 99 | 
            -
                    self.successful = false
         | 
| 100 94 | 
             
                  rescue ActiveRecord::StaleObjectError
         | 
| 101 95 | 
             
                    @record.errors.add(:base, as_(:version_inconsistency))
         | 
| 102 96 | 
             
                    self.successful = false
         | 
| 103 97 | 
             
                  rescue ActiveRecord::RecordNotSaved
         | 
| 104 98 | 
             
                    @record.errors.add(:base, as_(:record_not_saved)) if @record.errors.empty?
         | 
| 105 99 | 
             
                    self.successful = false
         | 
| 100 | 
            +
                  rescue ActiveRecord::ActiveRecordError => ex
         | 
| 101 | 
            +
                    flash[:error] = ex.message
         | 
| 102 | 
            +
                    self.successful = false
         | 
| 106 103 | 
             
                  end
         | 
| 107 104 | 
             
                end
         | 
| 108 105 |  | 
| @@ -19,7 +19,9 @@ module ActiveScaffold::Config | |
| 19 19 | 
             
                  @association_join_text = self.class.association_join_text
         | 
| 20 20 | 
             
                  @pagination = self.class.pagination
         | 
| 21 21 | 
             
                  @show_search_reset = true
         | 
| 22 | 
            +
                  @reset_link = self.class.reset_link.clone
         | 
| 22 23 | 
             
                  @mark_records = self.class.mark_records
         | 
| 24 | 
            +
                  @wrap_tag = self.class.wrap_tag
         | 
| 23 25 | 
             
                end
         | 
| 24 26 |  | 
| 25 27 | 
             
                # global level configuration
         | 
| @@ -61,6 +63,15 @@ module ActiveScaffold::Config | |
| 61 63 | 
             
                # Add a checkbox in front of each record to mark them and use them with a batch action later
         | 
| 62 64 | 
             
                cattr_accessor :mark_records
         | 
| 63 65 |  | 
| 66 | 
            +
                # the ActionLink to reset search
         | 
| 67 | 
            +
                cattr_accessor :reset_link
         | 
| 68 | 
            +
                @@reset_link = ActiveScaffold::DataStructures::ActionLink.new('index', :label => :click_to_reset, :type => :collection, :position => false)
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                # wrap normal cells (not inplace editable columns or with link) with a tag
         | 
| 71 | 
            +
                # it allows for more css styling
         | 
| 72 | 
            +
                cattr_accessor :wrap_tag
         | 
| 73 | 
            +
                @@wrap_tag = nil
         | 
| 74 | 
            +
             | 
| 64 75 | 
             
                # instance-level configuration
         | 
| 65 76 | 
             
                # ----------------------------
         | 
| 66 77 |  | 
| @@ -101,6 +112,9 @@ module ActiveScaffold::Config | |
| 101 112 | 
             
                # show a link to reset the search next to filtered message
         | 
| 102 113 | 
             
                attr_accessor :show_search_reset
         | 
| 103 114 |  | 
| 115 | 
            +
                # the ActionLink to reset search
         | 
| 116 | 
            +
                attr_reader :reset_link
         | 
| 117 | 
            +
             | 
| 104 118 | 
             
                # Add a checkbox in front of each record to mark them and use them with a batch action later
         | 
| 105 119 | 
             
                attr_accessor :mark_records
         | 
| 106 120 |  | 
| @@ -161,6 +175,10 @@ module ActiveScaffold::Config | |
| 161 175 | 
             
                # will open nested players view if there are 2 or less records in parent
         | 
| 162 176 | 
             
                attr_accessor :nested_auto_open
         | 
| 163 177 |  | 
| 178 | 
            +
                # wrap normal cells (not inplace editable columns or with link) with a tag
         | 
| 179 | 
            +
                # it allows for more css styling
         | 
| 180 | 
            +
                attr_accessor :wrap_tag
         | 
| 181 | 
            +
                
         | 
| 164 182 | 
             
                class UserSettings < UserSettings
         | 
| 165 183 | 
             
                  def initialize(conf, storage, params)
         | 
| 166 184 | 
             
                    super(conf,storage,params)
         | 
| @@ -8,23 +8,13 @@ module ActiveScaffold | |
| 8 8 | 
             
                  @active_scaffold_constraints ||= active_scaffold_session_storage[:constraints] || {}
         | 
| 9 9 | 
             
                end
         | 
| 10 10 |  | 
| 11 | 
            -
                def set_active_scaffold_constraints
         | 
| 12 | 
            -
                  associations_by_params = {}
         | 
| 13 | 
            -
                  active_scaffold_config.model.reflect_on_all_associations.each do |association|
         | 
| 14 | 
            -
                    associations_by_params[association.klass.name.foreign_key] = association.name unless association.options[:polymorphic]
         | 
| 15 | 
            -
                  end
         | 
| 16 | 
            -
                  params.each do |key, value|
         | 
| 17 | 
            -
                    active_scaffold_constraints[associations_by_params[key]] = value if associations_by_params.include? key
         | 
| 18 | 
            -
                  end
         | 
| 19 | 
            -
                end
         | 
| 20 | 
            -
             | 
| 21 11 | 
             
                # For each enabled action, adds the constrained columns to the ActionColumns object (if it exists).
         | 
| 22 12 | 
             
                # This lets the ActionColumns object skip constrained columns.
         | 
| 23 13 | 
             
                #
         | 
| 24 14 | 
             
                # If the constraint value is a Hash, then we assume the constraint is a multi-level association constraint (the reverse of a has_many :through) and we do NOT register the constraint column.
         | 
| 25 | 
            -
                def register_constraints_with_action_columns( | 
| 15 | 
            +
                def register_constraints_with_action_columns(exclude_actions = [])
         | 
| 26 16 | 
             
                  constrained_fields = active_scaffold_constraints.reject{|k, v| v.is_a? Hash}.keys.collect{|k| k.to_sym}
         | 
| 27 | 
            -
                   | 
| 17 | 
            +
                  exclude_actions << :list unless active_scaffold_config.list.hide_nested_column
         | 
| 28 18 | 
             
                  if self.class.uses_active_scaffold?
         | 
| 29 19 | 
             
                    # we actually want to do this whether constrained_fields exist or not, so that we can reset the array when they don't
         | 
| 30 20 | 
             
                    active_scaffold_config.actions.each do |action_name|
         | 
| @@ -67,7 +67,10 @@ module ActiveScaffold::DataStructures | |
| 67 67 | 
             
                attr_accessor :send_form_on_update_column
         | 
| 68 68 |  | 
| 69 69 | 
             
                # column to be updated in a form when this column changes
         | 
| 70 | 
            -
                 | 
| 70 | 
            +
                def update_column=(column_name)
         | 
| 71 | 
            +
                  ActiveSupport::Deprecation.warn "Use update_columns= instead of update_column="
         | 
| 72 | 
            +
                  self.update_columns = column_name
         | 
| 73 | 
            +
                end
         | 
| 71 74 |  | 
| 72 75 | 
             
                # send all the form instead of only new value when this column change
         | 
| 73 76 | 
             
                cattr_accessor :send_form_on_update_column
         | 
| @@ -165,7 +168,7 @@ module ActiveScaffold::DataStructures | |
| 165 168 | 
             
                attr_reader :includes
         | 
| 166 169 | 
             
                def includes=(value)
         | 
| 167 170 | 
             
                  @includes = case value
         | 
| 168 | 
            -
                    when Array | 
| 171 | 
            +
                    when Array then value 
         | 
| 169 172 | 
             
                    else [value] # automatically convert to an array
         | 
| 170 173 | 
             
                  end
         | 
| 171 174 | 
             
                end
         | 
| @@ -19,7 +19,7 @@ module ActiveScaffold::DataStructures | |
| 19 19 | 
             
                  end
         | 
| 20 20 | 
             
                end
         | 
| 21 21 |  | 
| 22 | 
            -
                attr_accessor :association, :child_association, :parent_model, :parent_scaffold, :parent_id, :constrained_fields, :scope
         | 
| 22 | 
            +
                attr_accessor :association, :child_association, :parent_model, :parent_scaffold, :parent_id, :constrained_fields, :constraints, :scope
         | 
| 23 23 |  | 
| 24 24 | 
             
                def initialize(model, nested_info)
         | 
| 25 25 | 
             
                  @parent_model = nested_info[:parent_model]
         | 
| @@ -108,16 +108,16 @@ module ActiveScaffold::DataStructures | |
| 108 108 | 
             
                protected
         | 
| 109 109 |  | 
| 110 110 | 
             
                def iterate_model_associations(model)
         | 
| 111 | 
            -
                  @ | 
| 112 | 
            -
                  @ | 
| 111 | 
            +
                  @constraints = {}
         | 
| 112 | 
            +
                  @constraints[association.foreign_key.to_sym] = parent_id unless association.belongs_to?
         | 
| 113 113 | 
             
                  model.reflect_on_all_associations.each do |current|
         | 
| 114 114 | 
             
                    if !current.belongs_to? && association.foreign_key == current.association_foreign_key
         | 
| 115 | 
            -
                       | 
| 115 | 
            +
                      constraints[current.name.to_sym] = parent_id
         | 
| 116 116 | 
             
                      @child_association = current if current.klass == @parent_model
         | 
| 117 117 | 
             
                    end
         | 
| 118 118 | 
             
                    if association.foreign_key == current.foreign_key
         | 
| 119 119 | 
             
                      # show columns for has_many and has_one child associationes
         | 
| 120 | 
            -
                       | 
| 120 | 
            +
                      constraints[current.name.to_sym] = parent_id if current.belongs_to?
         | 
| 121 121 | 
             
                      if association.options[:as] and current.options[:polymorphic]
         | 
| 122 122 | 
             
                        @child_association = current if association.options[:as].to_sym == current.name
         | 
| 123 123 | 
             
                      else
         | 
| @@ -125,6 +125,7 @@ module ActiveScaffold::DataStructures | |
| 125 125 | 
             
                      end
         | 
| 126 126 | 
             
                    end
         | 
| 127 127 | 
             
                  end
         | 
| 128 | 
            +
                  @constrained_fields = @constraints.keys
         | 
| 128 129 | 
             
                end
         | 
| 129 130 | 
             
              end
         | 
| 130 131 |  | 
| @@ -121,11 +121,17 @@ module ActiveScaffold | |
| 121 121 | 
             
                      Date.strptime(value, I18n.t('date.formats.default')) rescue nil
         | 
| 122 122 | 
             
                    else
         | 
| 123 123 | 
             
                      parts = Date._parse(value)
         | 
| 124 | 
            -
                       | 
| 125 | 
            -
                       | 
| 124 | 
            +
                      format = I18n.translate 'time.formats.picker', :default => '' if ActiveScaffold.js_framework == :jquery
         | 
| 125 | 
            +
                      if format.blank?
         | 
| 126 | 
            +
                        time_parts = [[:hour, '%H'], [:min, '%M'], [:sec, '%S']].collect {|part, format_part| format_part if parts[part].present?}.compact
         | 
| 127 | 
            +
                        format = "#{I18n.t('date.formats.default')} #{time_parts.join(':')} #{'%z' if parts[:offset].present?}"
         | 
| 128 | 
            +
                      else
         | 
| 129 | 
            +
                        format += ' %z' if parts[:offset].present? && format !~ /%z/i
         | 
| 130 | 
            +
                      end
         | 
| 126 131 | 
             
                      time = DateTime.strptime(value, format)
         | 
| 127 | 
            -
                      time = Time.zone.local_to_utc(time) unless parts[:offset]
         | 
| 128 | 
            -
                      time. | 
| 132 | 
            +
                      time = Time.zone.local_to_utc(time).in_time_zone unless parts[:offset]
         | 
| 133 | 
            +
                      time = time.send(conversion) unless conversion == :to_time
         | 
| 134 | 
            +
                      time
         | 
| 129 135 | 
             
                    end unless value.nil? || value.blank?
         | 
| 130 136 | 
             
                  end
         | 
| 131 137 |  | 
| @@ -265,8 +271,6 @@ module ActiveScaffold | |
| 265 271 | 
             
                # * :per_page
         | 
| 266 272 | 
             
                # * :page
         | 
| 267 273 | 
             
                def finder_options(options = {})
         | 
| 268 | 
            -
                  options.assert_valid_keys :sorting, :per_page, :page, :count_includes, :pagination, :select
         | 
| 269 | 
            -
             | 
| 270 274 | 
             
                  search_conditions = all_conditions
         | 
| 271 275 | 
             
                  full_includes = (active_scaffold_includes.blank? ? nil : active_scaffold_includes)
         | 
| 272 276 |  | 
| @@ -291,8 +295,8 @@ module ActiveScaffold | |
| 291 295 |  | 
| 292 296 | 
             
                # returns a Paginator::Page (not from ActiveRecord::Paginator) for the given parameters
         | 
| 293 297 | 
             
                # See finder_options for valid options
         | 
| 294 | 
            -
                # TODO: this should reside on the model, not the controller
         | 
| 295 298 | 
             
                def find_page(options = {})
         | 
| 299 | 
            +
                  options.assert_valid_keys :sorting, :per_page, :page, :count_includes, :pagination
         | 
| 296 300 | 
             
                  options[:per_page] ||= 999999999
         | 
| 297 301 | 
             
                  options[:page] ||= 1
         | 
| 298 302 |  | 
| @@ -59,7 +59,7 @@ module ActiveScaffold | |
| 59 59 | 
             
                    if nested_singular_association?
         | 
| 60 60 | 
             
                      {:controller => nested.parent_scaffold.controller_path, :action => :row, :id => nested.parent_id}
         | 
| 61 61 | 
             
                    elsif params[:parent_sti]
         | 
| 62 | 
            -
                      options = {:controller => params[:parent_sti], :action => render_parent_action | 
| 62 | 
            +
                      options = {:controller => params[:parent_sti], :action => render_parent_action}
         | 
| 63 63 | 
             
                      if render_parent_action(params[:parent_sti]) == :index
         | 
| 64 64 | 
             
                        options.merge(params.slice(:eid))
         | 
| 65 65 | 
             
                      else
         | 
| @@ -68,17 +68,27 @@ module ActiveScaffold | |
| 68 68 | 
             
                    end
         | 
| 69 69 | 
             
                  end
         | 
| 70 70 |  | 
| 71 | 
            -
                  def render_parent_action | 
| 71 | 
            +
                  def render_parent_action
         | 
| 72 72 | 
             
                    begin
         | 
| 73 73 | 
             
                      @parent_action = :row
         | 
| 74 | 
            -
                       | 
| 75 | 
            -
             | 
| 76 | 
            -
             | 
| 77 | 
            -
             | 
| 74 | 
            +
                      if params[:parent_sti]
         | 
| 75 | 
            +
                        parent_controller = "#{params[:parent_sti].to_s.camelize}Controller".constantize
         | 
| 76 | 
            +
                        @parent_action = :index if action_name == 'create' && parent_controller.active_scaffold_config.actions.include?(:create) && parent_controller.active_scaffold_config.create.refresh_list == true
         | 
| 77 | 
            +
                        @parent_action = :index if action_name == 'update' && parent_controller.active_scaffold_config.actions.include?(:update) && parent_controller.active_scaffold_config.update.refresh_list == true
         | 
| 78 | 
            +
                        @parent_action = :index if action_name == 'destroy' && parent_controller.active_scaffold_config.actions.include?(:delete) && parent_controller.active_scaffold_config.delete.refresh_list == true
         | 
| 79 | 
            +
                      end
         | 
| 78 80 | 
             
                    rescue ActiveScaffold::ControllerNotFound
         | 
| 79 81 | 
             
                    end if @parent_action.nil?
         | 
| 80 82 | 
             
                    @parent_action
         | 
| 81 83 | 
             
                  end
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                  def render_parent_controller
         | 
| 86 | 
            +
                    if nested_singular_association?
         | 
| 87 | 
            +
                      nested.parent_scaffold.controller_path
         | 
| 88 | 
            +
                    else
         | 
| 89 | 
            +
                      params[:parent_sti]
         | 
| 90 | 
            +
                    end
         | 
| 91 | 
            +
                  end
         | 
| 82 92 |  | 
| 83 93 | 
             
                  def build_associated(column, record)
         | 
| 84 94 | 
             
                    if column.singular_association?
         | 
| @@ -15,11 +15,11 @@ module ActiveScaffold | |
| 15 15 | 
             
                  def active_scaffold_render_input(column, options)
         | 
| 16 16 | 
             
                    begin
         | 
| 17 17 | 
             
                      # first, check if the dev has created an override for this specific field
         | 
| 18 | 
            -
                      if override_form_field | 
| 19 | 
            -
                        send( | 
| 18 | 
            +
                      if (method = override_form_field(column))
         | 
| 19 | 
            +
                        send(method, @record, options)
         | 
| 20 20 | 
             
                      # second, check if the dev has specified a valid form_ui for this column
         | 
| 21 | 
            -
                      elsif column.form_ui and override_input | 
| 22 | 
            -
                        send( | 
| 21 | 
            +
                      elsif column.form_ui and (method = override_input(column.form_ui))
         | 
| 22 | 
            +
                        send(method, column, options)
         | 
| 23 23 | 
             
                      # fallback: we get to make the decision
         | 
| 24 24 | 
             
                      else
         | 
| 25 25 | 
             
                        if column.association
         | 
| @@ -36,8 +36,8 @@ module ActiveScaffold | |
| 36 36 |  | 
| 37 37 | 
             
                        else # regular model attribute column
         | 
| 38 38 | 
             
                          # if we (or someone else) have created a custom render option for the column type, use that
         | 
| 39 | 
            -
                          if override_input | 
| 40 | 
            -
                            send( | 
| 39 | 
            +
                          if (method = override_input(column.column.type))
         | 
| 40 | 
            +
                            send(method, column, options)
         | 
| 41 41 | 
             
                          # final ultimate fallback: use rails' generic input method
         | 
| 42 42 | 
             
                          else
         | 
| 43 43 | 
             
                            # for textual fields we pass different options
         | 
| @@ -229,26 +229,16 @@ module ActiveScaffold | |
| 229 229 | 
             
                  end
         | 
| 230 230 |  | 
| 231 231 | 
             
                  def override_form_field(column)
         | 
| 232 | 
            -
                     | 
| 233 | 
            -
                    return method_with_class if respond_to?(method_with_class)
         | 
| 234 | 
            -
                    method = override_form_field_name(column)
         | 
| 235 | 
            -
                    method if respond_to?(method)
         | 
| 232 | 
            +
                    override_helper column, 'form_column'
         | 
| 236 233 | 
             
                  end
         | 
| 237 234 | 
             
                  alias_method :override_form_field?, :override_form_field
         | 
| 238 235 |  | 
| 239 | 
            -
                  # the naming convention for overriding form fields with helpers
         | 
| 240 | 
            -
                  def override_form_field_name(column, class_prefix = false)
         | 
| 241 | 
            -
                    "#{clean_class_name(column.active_record_class.name) + '_' if class_prefix}#{clean_column_name(column.name)}_form_column"
         | 
| 242 | 
            -
                  end
         | 
| 243 | 
            -
             | 
| 244 | 
            -
                  def override_input?(form_ui)
         | 
| 245 | 
            -
                    respond_to?(override_input(form_ui))
         | 
| 246 | 
            -
                  end
         | 
| 247 | 
            -
             | 
| 248 236 | 
             
                  # the naming convention for overriding form input types with helpers
         | 
| 249 237 | 
             
                  def override_input(form_ui)
         | 
| 250 | 
            -
                    "active_scaffold_input_#{form_ui}"
         | 
| 238 | 
            +
                    method = "active_scaffold_input_#{form_ui}"
         | 
| 239 | 
            +
                    method if respond_to? method
         | 
| 251 240 | 
             
                  end
         | 
| 241 | 
            +
                  alias_method :override_input?, :override_input
         | 
| 252 242 |  | 
| 253 243 | 
             
                  def form_partial_for_column(column, renders_as = nil)
         | 
| 254 244 | 
             
                    renders_as ||= column_renders_as(column)
         |