module ActiveScaffold::Config class List < Base self.crud_type = :read def initialize(core_config) @core = core_config # inherit from global scope # full configuration path is: defaults => global table => local table @per_page = self.class.per_page # AST show_search_reset @show_search_reset = true # originates here @sorting = ActiveScaffold::DataStructures::Sorting.new(@core.columns) @sorting.set_default_sorting(@core.model) # inherit from global scope @empty_field_text = self.class.empty_field_text end # global level configuration # -------------------------- # how many records to show per page cattr_accessor :per_page @@per_page = 15 # what string to use when a field is empty cattr_accessor :empty_field_text @@empty_field_text = '-' # instance-level configuration # ---------------------------- # provides access to the list of columns specifically meant for the Table to use def columns self.columns = @core.columns._inheritable unless @columns # lazy evaluation @columns end def columns=(val) @columns = ActiveScaffold::DataStructures::ActionColumns.new(*val) @columns.action = self end # how many rows to show at once attr_accessor :per_page # what string to use when a field is empty attr_accessor :empty_field_text # the default sorting. should be an array of hashes of {column_name => direction}, e.g. [{:a => 'desc'}, {:b => 'asc'}]. to just sort on one column, you can simply provide a hash, though, e.g. {:a => 'desc'}. def sorting=(val) val = [val] if val.is_a? Hash sorting.clear val.each { |clause| sorting.add *Array(clause).first } end def sorting @sorting ||= ActiveScaffold::DataStructures::Sorting.new(@core.columns) end # overwrite the includes used for the count sql query attr_accessor :count_includes # the label for this List action. used for the header. attr_writer :label def label @label ? as_(@label, :count => 2) : @core.label(:count => 2) end # AST Begin - We are handling these via as_() and localization - see list.html.erb attr_writer :no_entries_message def no_entries_message @no_entries_message ? as_(@no_entries_message) : 'No Entries' end attr_writer :filtered_message def filtered_message @filtered_message ? as_(@filtered_message) : 'Filtered List' end # AST End attr_writer :always_show_search def always_show_search @always_show_search && !search_partial.blank? end # AST show_search_reset attr_accessor :show_search_reset def search_partial return "search" if @core.actions.include?(:search) return "live_search" if @core.actions.include?(:live_search) return "field_search" if @core.actions.include?(:field_search) end # always show create attr_writer :always_show_create def always_show_create @always_show_create && @core.actions.include?(:create) end class UserSettings < UserSettings # This label has alread been localized. def label @session[:label] ? @session[:label] : @conf.label end def per_page @session['per_page'] = @params['limit'].to_i if @params.has_key? 'limit' @session['per_page'] || @conf.per_page end def page @session['page'] = @params['page'] if @params.has_key? 'page' @session['page'] || 1 end def page=(value = nil) @session['page'] = value end def sorting # we want to store as little as possible in the session, but we want to return a Sorting data structure. so we recreate it each page load based on session data. @session['sort'] = [@params['sort'], @params['sort_direction']] if @params['sort'] and @params['sort_direction'] @session['sort'] = nil if @params['sort_direction'] == 'reset' if @session['sort'] sorting = @conf.sorting.clone sorting.set(*@session['sort']) return sorting else return @conf.sorting end end def count_includes @conf.count_includes end end end end