module ActiveScaffold module Helpers # All extra helpers that should be included in the View. # Also a dumping ground for uncategorized helpers. module ViewHelpers include ActiveScaffold::Helpers::IdHelpers include ActiveScaffold::Helpers::AssociationHelpers include ActiveScaffold::Helpers::PaginationHelpers include ActiveScaffold::Helpers::ListColumnHelpers include ActiveScaffold::Helpers::ShowColumnHelpers include ActiveScaffold::Helpers::FormColumnHelpers include ActiveScaffold::Helpers::CountryHelpers include ActiveScaffold::Helpers::SearchColumnHelpers # AST include ActiveScaffold::Helpers::NumberHelpers ## ## Delegates ## # access to the configuration variable def active_scaffold_config @controller.class.active_scaffold_config end def active_scaffold_config_for(*args) @controller.class.active_scaffold_config_for(*args) end def active_scaffold_controller_for(*args) @controller.class.active_scaffold_controller_for(*args) end ## ## Uncategorized ## def generate_temporary_id (Time.now.to_f*1000).to_i.to_s end # Turns [[label, value]] into " : "" end end # Should this column be displayed in the subform? def in_subform?(column, parent_record) return true unless column.association # Polymorphic associations can't appear because they *might* be the reverse association, and because you generally don't assign an association from the polymorphic side ... I think. return false if column.polymorphic_association? # We don't have the UI to currently handle habtm in subforms return false if column.association.macro == :has_and_belongs_to_many # A column shouldn't be in the subform if it's the reverse association to the parent return false if column.association.reverse_for?(parent_record.class) #return false if column.association.klass == parent_record.class return true end def form_remote_upload_tag(url_for_options = {}, options = {}) onsubmits = options[:onsubmit] ? [ options[:onsubmit] ] : [ ] # simulate a "loading". the setTimeout prevents the Form.disable from being called before the submit, so that data actually posts. onsubmits << "setTimeout(function() { #{options[:loading]} }, 10); " onsubmits << "return true" # make sure the form still submits options[:onsubmit] = onsubmits * ';' options[:target] = action_iframe_id(url_for_options) options[:multipart] = true output="" output << "" output << form_tag(url_for_options, options) end # Provides list of javascripts to include with +javascript_include_tag+ # You can use this with your javascripts like # <%= javascript_include_tag :defaults, 'your_own_cool_script', active_scaffold_javascripts, :cache => true %> def active_scaffold_javascripts(frontend = :default) ActiveScaffold::Config::Core.javascripts(frontend).collect do |name| ActiveScaffold::Config::Core.asset_path(name, frontend) end end # Provides stylesheets to include with +stylesheet_link_tag+ def active_scaffold_stylesheets(frontend = :default) # AST Begin css = [ActiveScaffold::Config::Core.asset_path("stylesheet.css", frontend)] css << ActiveScaffold::Config::Core.asset_path('tools-left-handed-stylesheet.css', frontend) if ActiveScaffold::Config::Core.left_handed css # AST End end # Provides stylesheets for IE to include with +stylesheet_link_tag+ def active_scaffold_ie_stylesheets(frontend = :default) # AST Begin css = [ActiveScaffold::Config::Core.asset_path("stylesheet-ie.css", frontend)] css << ActiveScaffold::Config::Core.asset_path('tools-left-handed-stylesheet-ie.css', frontend) if ActiveScaffold::Config::Core.left_handed css # AST End end # easy way to include ActiveScaffold assets def active_scaffold_includes(*args) frontend = args.first.is_a?(Symbol) ? args.shift : :default options = args.first.is_a?(Hash) ? args.shift : {} js = javascript_include_tag(*active_scaffold_javascripts(frontend).push(options)) css = stylesheet_link_tag(*active_scaffold_stylesheets(frontend).push(options)) options[:cache] += '_ie' if options[:cache].is_a? String options[:concat] += '_ie' if options[:concat].is_a? String ie_css = stylesheet_link_tag(*active_scaffold_ie_stylesheets(frontend).push(options)) js + "\n" + css + "\n\n" end # a general-use loading indicator (the "stuff is happening, please wait" feedback) def loading_indicator_tag(options) image_tag "/images/active_scaffold/default/indicator.gif", :style => "visibility:hidden;", :id => loading_indicator_id(options), :alt => "loading indicator", :class => "loading-indicator" end # Creates a javascript-based link that toggles the visibility of some element on the page. # By default, it toggles the visibility of the sibling after the one it's nested in. You may pass custom javascript logic in options[:of] to change that, though. For example, you could say :of => '$("my_div_id")'. # You may also flag whether the other element is visible by default or not, and the initial text will adjust accordingly. def link_to_visibility_toggle(options = {}) options[:of] ||= '$(this.parentNode).next()' options[:default_visible] = true if options[:default_visible].nil? link_text = options[:default_visible] ? as_(:hide) : as_(:show) link_to_function link_text, "e = #{options[:of]}; e.toggle(); this.innerHTML = (e.style.display == 'none') ? '#{as_(:show)}' : '#{as_(:hide)}'", :class => 'visibility-toggle' end def skip_action_link(link) (link.security_method_set? or controller.respond_to? link.security_method) and !controller.send(link.security_method) end # AST link_html_options = {} def render_action_link(link, url_options, link_html_options = {}) url_options = url_options.clone url_options[:action] = link.action url_options[:controller] = link.controller if link.controller url_options.delete(:search) if link.controller and link.controller.to_s != params[:controller] url_options.merge! link.parameters if link.parameters # AST link_html_options html_options = link.html_options.merge({:class => link.action}).merge(link_html_options) if link.inline? # NOTE this is in url_options instead of html_options on purpose. the reason is that the client-side # action link javascript needs to submit the proper method, but the normal html_options[:method] # argument leaves no way to extract the proper method from the rendered tag. url_options[:_method] = link.method if link.method != :get and respond_to?(:protect_against_forgery?) and protect_against_forgery? url_options[:authenticity_token] = form_authenticity_token end # robd: protect against submitting get links as forms, since this causes annoying # 'Do you wish to resubmit your form?' messages whenever you go back and forwards. elsif link.method != :get # Needs to be in html_options to as the adding _method to the url is no longer supported by Rails html_options[:method] = link.method end html_options[:confirm] = as_(link.confirm) if link.confirm? html_options[:position] = link.position if link.position and link.inline? html_options[:class] += ' action' if link.inline? html_options[:popup] = true if link.popup? html_options[:id] = action_link_id("#{id_from_controller(url_options[:controller]) + '-' if url_options[:parent_controller]}" + "#{url_options[:associations].to_s + '-' if url_options[:associations]}" + url_options[:action],url_options[:id] || url_options[:parent_id]) if link.dhtml_confirm? html_options[:class] += ' action' if !link.inline? html_options[:page_link] = 'true' if !link.inline? html_options[:dhtml_confirm] = link.dhtml_confirm.value html_options[:onclick] = link.dhtml_confirm.onclick_function(controller,action_link_id(url_options[:action],url_options[:id] || url_options[:parent_id])) end html_options[:class] += " #{link.html_options[:class]}" unless link.html_options[:class].blank? # issue 260, use url_options[:link] if it exists. This prevents DB data from being localized. label = url_options.delete(:link) || link.label link_to label, url_options, html_options end def column_class(column, column_value) classes = [] classes << "#{column.name}-column" classes << column.css_class unless column.css_class.nil? classes << 'empty' if column_empty? column_value classes << 'sorted' if active_scaffold_config.list.user.sorting.sorts_on?(column) # AST - allow format of column to be specified via Column#list_ui classes << 'numeric' if [:number].include?(column.list_ui) or (column.column and [:decimal, :float, :integer].include?(column.column.type)) classes.join(' ') end def column_empty?(column_value) empty = column_value.nil? empty ||= column_value.empty? if column_value.respond_to? :empty? empty ||= [' ', active_scaffold_config.list.empty_field_text].include? column_value if String === column_value return empty end def column_calculation(column) calculation = active_scaffold_config.model.calculate(column.calculate, column.name, :conditions => controller.send(:all_conditions), :joins => controller.send(:joins_for_collection), :include => controller.send(:active_scaffold_joins)) end # AST Begin def column_show_add_existing(column) (column.allow_add_existing and !column.through_association? and options_for_association_count(column.association) > 0) end def column_show_add_new(column, associated, action) value = !column.through_association? and (column.plural_association? or (column.singular_association? and not associated.empty?)) value = false unless @record.class.authorized_for?(:action => action) value end # AST End end end end