Changeset 32 for trunk

Show
Ignore:
Timestamp:
06/25/2007 02:35:19 PM (2 years ago)
Author:
matthew
Message:

Added support for filtering by membership in a has_and_belongs_to_many
relationship, along with a basic 'multiselect' helper for maintaining
them.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/auto-admin/lib/auto_admin_configuration.rb

    r29 r32  
    124124      (@custom_filter_options ||= {})[column_name.to_sym] = AutoAdmin::CustomFilterSet.new( self, reflect_on_association( column_name ) || find_column( column_name ), custom_options, &block ) 
    125125    end 
     126    def dynamic_filter_options_for column_name, &block 
     127      filter_options_for( column_name, block ) 
     128    end 
    126129    def filters 
    127130      columns_for_filter.map { |col| filter_instance( col ) } 
     
    134137      when :belongs_to: AutoAdmin::AssociationFilterSet 
    135138      when :has_one: AutoAdmin::AssociationFilterSet 
     139      when :has_many: AutoAdmin::MultiAssociationFilterSet 
     140      when :has_and_belongs_to_many: AutoAdmin::MultiAssociationFilterSet 
    136141      when :datetime: AutoAdmin::DateFilterSet 
    137142      else 
  • trunk/auto-admin/lib/auto_admin_filter_sets.rb

    r20 r32  
    4747    def other_options 
    4848      a = [] 
    49       @options.each do |k,v| 
     49      options = @options 
     50      options = options.call if options.respond_to?( :call ) 
     51      options.each do |k,v| 
    5052        o = build_option( k, v ) 
    5153        o[:sql] = @block.call( k ) unless @block.nil? 
     
    9193    end 
    9294    def sql_column 
    93       (assoc.options && assoc.options[:foreign_key]) || (assoc.name.to_s + '_id') 
     95      assoc.association_foreign_key 
    9496    end 
    9597    def objects 
     
    104106    def sql_from_string option_name 
    105107      sql_from_value option_name.to_i 
     108    end 
     109  end 
     110  class MultiAssociationFilterSet < AssociationFilterSet 
     111    def sql_from_value option_name 
     112      ["EXISTS(SELECT * FROM #{assoc.options[:join_table]} WHERE #{assoc.primary_key_name} = #{assoc.active_record.primary_key} AND #{assoc.association_foreign_key} = ?)", option_name] 
    106113    end 
    107114  end 
  • trunk/auto-admin/lib/auto_admin_simple_theme.rb

    r29 r32  
    178178    def get_column_from_field(field) 
    179179      assoc = model.reflect_on_association( field.to_sym ) 
    180       assoc ? assoc.primary_key_name : field 
     180      assoc ? ([:has_many, :has_and_belongs_to_many].include?(assoc.macro) ? "#{field.to_s.singularize}_ids" : assoc.primary_key_name) : field 
    181181    end 
    182182 
     
    286286      end 
    287287      super( field, dropdown_options, options, html_options ) 
     288    end 
     289    def multiselect(field, options = {}, html_options = {}) 
     290      common_option_translations! options 
     291      dropdown_options = find_choices(field, options) 
     292      column = get_column_from_field(field) 
     293      html_defaults = { :size => 8, :multiple => true, 
     294        :name => "#{@object_name}[#{column}][]", 
     295        :id => "#{@object_name}_#{column}" } 
     296 
     297      helpers.content_tag('select', helpers.options_for_select( dropdown_options, @object && @object.send(column) ), html_defaults.merge( html_options ) ) 
    288298    end 
    289299    def radio_group(field, options = {})