| 1 |
module AjaxScaffold # :nodoc: |
|---|
| 2 |
class ScaffoldColumn |
|---|
| 3 |
attr_reader :name, :eval, :sort_sql, :label, :class_name, :sanitize |
|---|
| 4 |
|
|---|
| 5 |
# Only options[:name] is required. It will infer the eval and sort values |
|---|
| 6 |
# based on the given class. |
|---|
| 7 |
def initialize(klass, options) |
|---|
| 8 |
@name = options[:name] |
|---|
| 9 |
@eval = options[:eval].nil? ? "#{Inflector.underscore(klass.to_s)}.#{@name}" : options[:eval] |
|---|
| 10 |
@label = options[:label].nil? ? Inflector.titleize(@name) : options[:label] |
|---|
| 11 |
@sortable = options[:sortable].nil? ? true : options[:sortable] |
|---|
| 12 |
@sort_sql = options[:sort_sql].nil? ? "#{klass.table_name}.#{@name}" : options[:sort_sql] unless !@sortable |
|---|
| 13 |
@class_name = options[:class_name].nil? ? "" : options[:class_name] |
|---|
| 14 |
@sanitize = options[:sanitize].nil? ? true : options[:sanitize] |
|---|
| 15 |
end |
|---|
| 16 |
|
|---|
| 17 |
def sanitize? |
|---|
| 18 |
@sanitize |
|---|
| 19 |
end |
|---|
| 20 |
|
|---|
| 21 |
def sortable? |
|---|
| 22 |
@sortable |
|---|
| 23 |
end |
|---|
| 24 |
|
|---|
| 25 |
end |
|---|
| 26 |
|
|---|
| 27 |
module Common |
|---|
| 28 |
def current_sort(params) |
|---|
| 29 |
session[params[:scaffold_id]][:sort] |
|---|
| 30 |
end |
|---|
| 31 |
|
|---|
| 32 |
def current_sort_direction(params) |
|---|
| 33 |
session[params[:scaffold_id]][:sort_direction] |
|---|
| 34 |
end |
|---|
| 35 |
end |
|---|
| 36 |
|
|---|
| 37 |
module Controller |
|---|
| 38 |
include AjaxScaffold::Common |
|---|
| 39 |
|
|---|
| 40 |
def clear_flashes |
|---|
| 41 |
if request.xhr? |
|---|
| 42 |
flash.keys.each do |flash_key| |
|---|
| 43 |
flash[flash_key] = nil |
|---|
| 44 |
end |
|---|
| 45 |
end |
|---|
| 46 |
end |
|---|
| 47 |
|
|---|
| 48 |
def default_per_page |
|---|
| 49 |
25 |
|---|
| 50 |
end |
|---|
| 51 |
|
|---|
| 52 |
def store_or_get_from_session(id_key, value_key) |
|---|
| 53 |
session[id_key][value_key] = params[value_key] if !params[value_key].nil? |
|---|
| 54 |
params[value_key] ||= session[id_key][value_key] |
|---|
| 55 |
end |
|---|
| 56 |
|
|---|
| 57 |
def update_params(options) |
|---|
| 58 |
@scaffold_id = params[:scaffold_id] ||= options[:default_scaffold_id] |
|---|
| 59 |
session[@scaffold_id] ||= {:sort => options[:default_sort], :sort_direction => options[:default_sort_direction], :page => 1} |
|---|
| 60 |
|
|---|
| 61 |
store_or_get_from_session(@scaffold_id, :sort) |
|---|
| 62 |
store_or_get_from_session(@scaffold_id, :sort_direction) |
|---|
| 63 |
store_or_get_from_session(@scaffold_id, :page) |
|---|
| 64 |
end |
|---|
| 65 |
|
|---|
| 66 |
end |
|---|
| 67 |
|
|---|
| 68 |
module Helper |
|---|
| 69 |
include AjaxScaffold::Common |
|---|
| 70 |
|
|---|
| 71 |
def format_column(column_value, sanitize = true) |
|---|
| 72 |
if column_empty?(column_value) |
|---|
| 73 |
empty_column_text |
|---|
| 74 |
elsif column_value.instance_of? Time |
|---|
| 75 |
format_time(column_value) |
|---|
| 76 |
elsif column_value.instance_of? Date |
|---|
| 77 |
format_date(column_value) |
|---|
| 78 |
else |
|---|
| 79 |
sanitize ? h(column_value.to_s) : column_value.to_s |
|---|
| 80 |
end |
|---|
| 81 |
end |
|---|
| 82 |
|
|---|
| 83 |
def format_time(time) |
|---|
| 84 |
time.strftime("%m/%d/%Y %I:%M %p") |
|---|
| 85 |
end |
|---|
| 86 |
|
|---|
| 87 |
def format_date(date) |
|---|
| 88 |
date.strftime("%m/%d/%Y") |
|---|
| 89 |
end |
|---|
| 90 |
|
|---|
| 91 |
def column_empty?(column_value) |
|---|
| 92 |
column_value.nil? || (column_value.empty? rescue false) |
|---|
| 93 |
end |
|---|
| 94 |
|
|---|
| 95 |
def empty_column_text |
|---|
| 96 |
"-" |
|---|
| 97 |
end |
|---|
| 98 |
|
|---|
| 99 |
# Generates a temporary id for creating a new element |
|---|
| 100 |
def generate_temporary_id |
|---|
| 101 |
(Time.now.to_f*1000).to_i.to_s |
|---|
| 102 |
end |
|---|
| 103 |
|
|---|
| 104 |
def pagination_ajax_links(paginator, params) |
|---|
| 105 |
pagination_links_each(paginator, {}) do |n| |
|---|
| 106 |
link_to_remote n, |
|---|
| 107 |
{ :url => params.merge(:page => n ), |
|---|
| 108 |
:loading => "Element.show('#{loading_indicator_id(params.merge(:action => 'pagination'))}');", |
|---|
| 109 |
:update => scaffold_content_id(params) }, |
|---|
| 110 |
{ :href => url_for(params.merge(:page => n )) } |
|---|
| 111 |
end |
|---|
| 112 |
end |
|---|
| 113 |
|
|---|
| 114 |
def column_sort_direction(column_name, params) |
|---|
| 115 |
if column_name && column_name == current_sort(params) |
|---|
| 116 |
current_sort_direction(params) == "asc" ? "desc" : "asc" |
|---|
| 117 |
else |
|---|
| 118 |
"asc" |
|---|
| 119 |
end |
|---|
| 120 |
end |
|---|
| 121 |
|
|---|
| 122 |
def column_class(column_name, column_value, sort_column, class_name = nil) |
|---|
| 123 |
class_attr = String.new |
|---|
| 124 |
class_attr += "empty " if column_empty?(column_value) |
|---|
| 125 |
class_attr += "sorted " if (!sort_column.nil? && column_name == sort_column) |
|---|
| 126 |
class_attr += "#{class_name} " unless class_name.nil? |
|---|
| 127 |
class_attr |
|---|
| 128 |
end |
|---|
| 129 |
|
|---|
| 130 |
def loading_indicator_tag(options) |
|---|
| 131 |
image_tag "indicator.gif", :style => "display:none;", :id => loading_indicator_id(options), :alt => "loading indicator", :class => "loading-indicator" |
|---|
| 132 |
end |
|---|
| 133 |
|
|---|
| 134 |
# The following are a bunch of helper methods to produce the common scaffold view id's |
|---|
| 135 |
|
|---|
| 136 |
def scaffold_content_id(options) |
|---|
| 137 |
"#{options[:scaffold_id]}-content" |
|---|
| 138 |
end |
|---|
| 139 |
|
|---|
| 140 |
def scaffold_column_header_id(options) |
|---|
| 141 |
"#{options[:scaffold_id]}-#{options[:column_name]}-column" |
|---|
| 142 |
end |
|---|
| 143 |
|
|---|
| 144 |
def scaffold_tbody_id(options) |
|---|
| 145 |
"#{options[:scaffold_id]}-tbody" |
|---|
| 146 |
end |
|---|
| 147 |
|
|---|
| 148 |
def scaffold_messages_id(options) |
|---|
| 149 |
"#{options[:scaffold_id]}-messages" |
|---|
| 150 |
end |
|---|
| 151 |
|
|---|
| 152 |
def empty_message_id(options) |
|---|
| 153 |
"#{options[:scaffold_id]}-empty-message" |
|---|
| 154 |
end |
|---|
| 155 |
|
|---|
| 156 |
def element_row_id(options) |
|---|
| 157 |
"#{options[:scaffold_id]}-#{options[:action]}-#{options[:id]}-row" |
|---|
| 158 |
end |
|---|
| 159 |
|
|---|
| 160 |
def element_cell_id(options) |
|---|
| 161 |
"#{options[:scaffold_id]}-#{options[:action]}-#{options[:id]}-cell" |
|---|
| 162 |
end |
|---|
| 163 |
|
|---|
| 164 |
def element_form_id(options) |
|---|
| 165 |
"#{options[:scaffold_id]}-#{options[:action]}-#{options[:id]}-form" |
|---|
| 166 |
end |
|---|
| 167 |
|
|---|
| 168 |
def loading_indicator_id(options) |
|---|
| 169 |
if options[:id].nil? |
|---|
| 170 |
"#{options[:scaffold_id]}-#{options[:action]}-loading-indicator" |
|---|
| 171 |
else |
|---|
| 172 |
"#{options[:scaffold_id]}-#{options[:action]}-#{options[:id]}-loading-indicator" |
|---|
| 173 |
end |
|---|
| 174 |
end |
|---|
| 175 |
|
|---|
| 176 |
def element_messages_id(options) |
|---|
| 177 |
"#{options[:scaffold_id]}-#{options[:action]}-#{options[:id]}-messages" |
|---|
| 178 |
end |
|---|
| 179 |
end |
|---|
| 180 |
|
|---|
| 181 |
module Model |
|---|
| 182 |
module ClassMethods |
|---|
| 183 |
|
|---|
| 184 |
def build_scaffold_columns |
|---|
| 185 |
scaffold_columns = Array.new |
|---|
| 186 |
content_columns.each do |column| |
|---|
| 187 |
scaffold_columns << ScaffoldColumn.new(self, { :name => column.name }) |
|---|
| 188 |
end |
|---|
| 189 |
scaffold_columns |
|---|
| 190 |
end |
|---|
| 191 |
|
|---|
| 192 |
def build_scaffold_columns_hash |
|---|
| 193 |
scaffold_columns_hash = Hash.new |
|---|
| 194 |
scaffold_columns.each do |scaffold_column| |
|---|
| 195 |
scaffold_columns_hash[scaffold_column.name] = scaffold_column |
|---|
| 196 |
end |
|---|
| 197 |
scaffold_columns_hash |
|---|
| 198 |
end |
|---|
| 199 |
end |
|---|
| 200 |
end |
|---|
| 201 |
end |
|---|
| 202 |
|
|---|
| 203 |
class ActiveRecord::Base |
|---|
| 204 |
extend AjaxScaffold::Model::ClassMethods |
|---|
| 205 |
|
|---|
| 206 |
@scaffold_columns = nil |
|---|
| 207 |
def self.scaffold_columns |
|---|
| 208 |
@scaffold_columns ||= build_scaffold_columns |
|---|
| 209 |
end |
|---|
| 210 |
|
|---|
| 211 |
@scaffold_columns_hash = nil |
|---|
| 212 |
def self.scaffold_columns_hash |
|---|
| 213 |
@scaffold_columns_hash ||= build_scaffold_columns_hash |
|---|
| 214 |
end |
|---|
| 215 |
end |
|---|