active_scaffold 3.2.20 → 3.3.0.rc
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +19 -13
- data/README +66 -0
- data/app/assets/javascripts/jquery/active_scaffold.js +156 -113
- data/app/assets/javascripts/jquery/active_scaffold_chosen.js +11 -0
- data/app/assets/javascripts/jquery/date_picker_bridge.js.erb +0 -1
- data/app/assets/javascripts/jquery/jquery.editinplace.js +132 -128
- data/app/assets/javascripts/prototype/active_scaffold.js +68 -25
- data/{frontends/default/views/_horizontal_subform_footer.html.erb → app/assets/javascripts/prototype/active_scaffold_chosen.js} +0 -0
- data/app/assets/stylesheets/active_scaffold_colors.css.scss +8 -1
- data/app/assets/stylesheets/active_scaffold_layout.css +14 -8
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_add_existing_form.html.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_base_form.html.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_create_form.html.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_create_form_on_list.html.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_field_search.html.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_form.html.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_form_association.html.erb +8 -3
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_form_association_footer.html.erb +5 -4
- data/app/views/active_scaffold_overrides/_form_association_record.html.erb +85 -0
- data/app/views/active_scaffold_overrides/_form_attribute.html.erb +23 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_form_hidden_attribute.html.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_form_messages.html.erb +0 -0
- data/app/views/active_scaffold_overrides/_horizontal_subform.html.erb +12 -0
- data/app/views/active_scaffold_overrides/_horizontal_subform_footer.html.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_horizontal_subform_header.html.erb +3 -2
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_human_conditions.html.erb +0 -0
- data/app/views/active_scaffold_overrides/_list.html.erb +35 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_list_calculations.html.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_list_column_headings.html.erb +0 -0
- data/app/views/active_scaffold_overrides/_list_header.html.erb +8 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_list_inline_adapter.html.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_list_messages.html.erb +4 -4
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_list_pagination.html.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_list_pagination_links.html.erb +0 -0
- data/app/views/active_scaffold_overrides/_list_record.html.erb +30 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_list_with_header.html.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_messages.html.erb +0 -0
- data/app/views/active_scaffold_overrides/_refresh_list.js.erb +1 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_render_field.js.erb +9 -1
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_row.html.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_search.html.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_search_attribute.html.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_show.html.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_show_columns.html.erb +0 -0
- data/app/views/active_scaffold_overrides/_update_actions.html.erb +9 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_update_calculations.js.erb +0 -0
- data/app/views/active_scaffold_overrides/_update_column.js.erb +16 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_update_form.html.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/_update_messages.js.erb +0 -0
- data/app/views/active_scaffold_overrides/_vertical_subform.html.erb +8 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/action_confirmation.html.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/add_existing.js.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/add_existing_form.html.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/create.html.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/delete.html.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/destroy.js.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/edit_associated.js.erb +1 -1
- data/{frontends/default/views → app/views/active_scaffold_overrides}/field_search.html.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/form_messages.js.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/list.html.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/on_action_update.js.erb +3 -3
- data/{frontends/default/views → app/views/active_scaffold_overrides}/on_create.js.erb +1 -1
- data/{frontends/default/views → app/views/active_scaffold_overrides}/on_mark.js.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/on_update.js.erb +4 -4
- data/{frontends/default/views → app/views/active_scaffold_overrides}/render_field.js.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/row.js.erb +1 -1
- data/{frontends/default/views → app/views/active_scaffold_overrides}/search.html.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/show.html.erb +0 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/update.html.erb +1 -1
- data/app/views/active_scaffold_overrides/update_column.js.erb +26 -0
- data/{frontends/default/views → app/views/active_scaffold_overrides}/update_row.js.erb +0 -0
- data/config/locales/de.yml +1 -0
- data/config/locales/en.yml +1 -0
- data/config/locales/es.yml +1 -0
- data/config/locales/fr.yml +1 -0
- data/config/locales/hu.yml +1 -0
- data/config/locales/ja.yml +1 -0
- data/config/locales/ru.yml +1 -0
- data/lib/active_scaffold.rb +14 -26
- data/lib/active_scaffold/actions/core.rb +14 -11
- data/lib/active_scaffold/actions/create.rb +3 -3
- data/lib/active_scaffold/actions/delete.rb +3 -0
- data/lib/active_scaffold/actions/list.rb +9 -6
- data/lib/active_scaffold/actions/mark.rb +1 -1
- data/lib/active_scaffold/actions/nested.rb +8 -6
- data/lib/active_scaffold/actions/show.rb +6 -1
- data/lib/active_scaffold/actions/update.rb +39 -19
- data/lib/active_scaffold/active_record_permissions.rb +29 -12
- data/lib/active_scaffold/attribute_params.rb +14 -7
- data/lib/active_scaffold/bridges/calendar_date_select.rb +1 -1
- data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +1 -2
- data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +1 -1
- data/lib/active_scaffold/bridges/chosen.rb +14 -0
- data/lib/active_scaffold/bridges/chosen/helpers.rb +48 -0
- data/lib/active_scaffold/bridges/date_picker/helper.rb +7 -6
- data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +1 -1
- data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +1 -1
- data/lib/active_scaffold/bridges/file_column.rb +1 -1
- data/lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb +1 -1
- data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +2 -2
- data/lib/active_scaffold/bridges/file_column/list_ui.rb +4 -4
- data/lib/active_scaffold/bridges/paperclip.rb +1 -1
- data/lib/active_scaffold/bridges/paperclip/form_ui.rb +1 -1
- data/lib/active_scaffold/bridges/paperclip/list_ui.rb +1 -1
- data/lib/active_scaffold/bridges/paperclip/paperclip_bridge_helpers.rb +1 -1
- data/lib/active_scaffold/bridges/shared/date_bridge.rb +1 -1
- data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +1 -1
- data/lib/active_scaffold/config/core.rb +9 -2
- data/lib/active_scaffold/config/list.rb +9 -13
- data/lib/active_scaffold/config/nested.rb +11 -2
- data/lib/active_scaffold/data_structures/action_columns.rb +19 -5
- data/lib/active_scaffold/data_structures/action_link.rb +9 -2
- data/lib/active_scaffold/data_structures/action_links.rb +5 -36
- data/lib/active_scaffold/data_structures/column.rb +21 -21
- data/lib/active_scaffold/data_structures/nested_info.rb +31 -44
- data/lib/active_scaffold/extensions/action_controller_rescueing.rb +1 -0
- data/lib/active_scaffold/extensions/action_view_rendering.rb +30 -36
- data/lib/active_scaffold/extensions/reverse_associations.rb +10 -6
- data/lib/active_scaffold/extensions/routing_mapper.rb +6 -5
- data/lib/active_scaffold/extensions/unsaved_associated.rb +1 -1
- data/lib/active_scaffold/finder.rb +18 -10
- data/lib/active_scaffold/helpers/association_helpers.rb +21 -2
- data/lib/active_scaffold/helpers/controller_helpers.rb +14 -16
- data/lib/active_scaffold/helpers/form_column_helpers.rb +161 -21
- data/lib/active_scaffold/helpers/id_helpers.rb +7 -7
- data/lib/active_scaffold/helpers/list_column_helpers.rb +42 -92
- data/lib/active_scaffold/helpers/search_column_helpers.rb +10 -3
- data/lib/active_scaffold/helpers/show_column_helpers.rb +4 -9
- data/lib/active_scaffold/helpers/view_helpers.rb +278 -78
- data/lib/active_scaffold/version.rb +2 -2
- data/lib/generators/active_scaffold_controller/templates/controller.rb +1 -1
- data/test/bridges/paperclip_test.rb +2 -2
- data/vendor/assets/javascripts/jquery-ui-timepicker-addon.js +1882 -1276
- metadata +79 -80
- data/README.md +0 -67
- data/frontends/default/views/_action_group.html.erb +0 -24
- data/frontends/default/views/_form_attribute.html.erb +0 -23
- data/frontends/default/views/_horizontal_subform.html.erb +0 -22
- data/frontends/default/views/_horizontal_subform_record.html.erb +0 -43
- data/frontends/default/views/_list.html.erb +0 -18
- data/frontends/default/views/_list_actions.html.erb +0 -15
- data/frontends/default/views/_list_header.html.erb +0 -10
- data/frontends/default/views/_list_record.html.erb +0 -13
- data/frontends/default/views/_list_record_columns.html.erb +0 -8
- data/frontends/default/views/_refresh_list.js.erb +0 -1
- data/frontends/default/views/_update_actions.html.erb +0 -9
- data/frontends/default/views/_vertical_subform.html.erb +0 -12
- data/frontends/default/views/_vertical_subform_record.html.erb +0 -43
- data/frontends/default/views/refresh_list.js.erb +0 -2
- data/frontends/default/views/update_column.js.erb +0 -15
- data/lib/active_scaffold/extensions/active_record_offset.rb +0 -12
- data/lib/active_scaffold/extensions/nil_id_in_url_params.rb +0 -7
@@ -12,7 +12,7 @@ module ActiveScaffold::Bridges
|
|
12
12
|
/%m/ => 'mm',
|
13
13
|
/%y/ => 'y',
|
14
14
|
/%Y/ => 'yy',
|
15
|
-
/%H/ => '
|
15
|
+
/%H/ => 'HH', # options ampm => false
|
16
16
|
/%I/ => 'hh', # options ampm => true
|
17
17
|
/%M/ => 'mm',
|
18
18
|
/%p/ => 'tt',
|
@@ -101,6 +101,7 @@ module ActiveScaffold::Bridges
|
|
101
101
|
nil
|
102
102
|
end
|
103
103
|
js_format = rails_format.dup
|
104
|
+
js_format.gsub! /([ ]|^)([^% ]\S*)/, " '\\2'"
|
104
105
|
DATE_FORMAT_CONVERSION.each do |key, value|
|
105
106
|
js_format.gsub!(key, value)
|
106
107
|
end
|
@@ -110,13 +111,13 @@ module ActiveScaffold::Bridges
|
|
110
111
|
def self.split_datetime_format(datetime_format)
|
111
112
|
date_format = datetime_format
|
112
113
|
time_format = nil
|
113
|
-
time_start_indicators = %w{hh mm tt ss}
|
114
|
+
time_start_indicators = %w{HH hh mm tt ss}
|
114
115
|
unless datetime_format.nil?
|
115
116
|
start_indicator = time_start_indicators.detect {|indicator| datetime_format.include?(indicator)}
|
116
117
|
unless start_indicator.nil?
|
117
118
|
pos_time_format = datetime_format.index(start_indicator)
|
118
|
-
date_format = datetime_format.to(pos_time_format - 1)
|
119
|
-
time_format = datetime_format.from(pos_time_format)
|
119
|
+
date_format = datetime_format.to(pos_time_format - 1).strip
|
120
|
+
time_format = datetime_format.from(pos_time_format).strip
|
120
121
|
end
|
121
122
|
end
|
122
123
|
return date_format, time_format
|
@@ -158,7 +159,7 @@ module ActiveScaffold::Bridges
|
|
158
159
|
options = active_scaffold_input_text_options(options.merge(column.options))
|
159
160
|
options[:class] << " #{column.search_ui.to_s}"
|
160
161
|
options[:style] = (options[:show].nil? || options[:show]) ? nil : "display: none"
|
161
|
-
format = options.delete(:format) || column.search_ui == :date_picker ? :default : :picker
|
162
|
+
format = options.delete(:format) || (column.search_ui == :date_picker ? :default : :picker)
|
162
163
|
datepicker_format_options(column, format, options)
|
163
164
|
text_field_tag("#{options[:name]}[#{name}]", value ? l(value, :format => format) : nil, options.merge(:id => "#{options[:id]}_#{name}", :name => "#{options[:name]}[#{name}]"))
|
164
165
|
end
|
@@ -169,7 +170,7 @@ module ActiveScaffold::Bridges
|
|
169
170
|
options = active_scaffold_input_text_options(options.merge(column.options))
|
170
171
|
options[:class] << " #{column.form_ui.to_s}"
|
171
172
|
value = controller.class.condition_value_for_datetime(@record.send(column.name), column.form_ui == :date_picker ? :to_date : :to_time)
|
172
|
-
format = options.delete(:format) || column.form_ui == :date_picker ? :default : :picker
|
173
|
+
format = options.delete(:format) || (column.form_ui == :date_picker ? :default : :picker)
|
173
174
|
datepicker_format_options(column, format, options)
|
174
175
|
options[:value] = (value ? l(value, :format => format) : nil)
|
175
176
|
text_field(:record, column.name, options)
|
@@ -12,7 +12,7 @@ module ActiveScaffold
|
|
12
12
|
js_remove_file_code = "$(this).previous().value='true'; $(this).up().hide().next().show(); return false;";
|
13
13
|
end
|
14
14
|
|
15
|
-
content = active_scaffold_column_dragonfly(
|
15
|
+
content = active_scaffold_column_dragonfly(@record, column)
|
16
16
|
content_tag(:div,
|
17
17
|
content + " | " +
|
18
18
|
hidden_field(:record, "remove_#{column.name}", :value => "false") +
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module ActiveScaffold
|
2
2
|
module Helpers
|
3
3
|
module ListColumnHelpers
|
4
|
-
def active_scaffold_column_dragonfly(
|
4
|
+
def active_scaffold_column_dragonfly(record, column)
|
5
5
|
attachment = record.send("#{column.name}")
|
6
6
|
return nil unless attachment.present?
|
7
7
|
content = if attachment.image?
|
@@ -1,6 +1,6 @@
|
|
1
1
|
class ActiveScaffold::Bridges::FileColumn < ActiveScaffold::DataStructures::Bridge
|
2
2
|
def self.install
|
3
|
-
if ActiveScaffold::Config::Core.instance_methods.include?("initialize_with_file_column"
|
3
|
+
if ActiveScaffold::Config::Core.instance_methods.include?("initialize_with_file_column")
|
4
4
|
raise RuntimeError, "We've detected that you have active_scaffold_file_column_bridge installed. This plugin has been moved to core. Please remove active_scaffold_file_column_bridge to prevent any conflicts"
|
5
5
|
end
|
6
6
|
require File.join(File.dirname(__FILE__), "file_column/as_file_column_bridge")
|
@@ -24,7 +24,7 @@ module ActiveScaffold::Config
|
|
24
24
|
}
|
25
25
|
end
|
26
26
|
|
27
|
-
alias_method_chain :initialize, :file_column unless self.instance_methods.include?("initialize_without_file_column"
|
27
|
+
alias_method_chain :initialize, :file_column unless self.instance_methods.include?("initialize_without_file_column")
|
28
28
|
|
29
29
|
def configure_file_column_field(field)
|
30
30
|
# set list_ui first because it gets its default value from form_ui
|
@@ -4,12 +4,12 @@ module ActiveScaffold
|
|
4
4
|
module FileColumnHelpers
|
5
5
|
class << self
|
6
6
|
def file_column_fields(klass)
|
7
|
-
klass.instance_methods.
|
7
|
+
klass.instance_methods.grep(/_just_uploaded\?$/).collect{|m| m[0..-16].to_sym }
|
8
8
|
end
|
9
9
|
|
10
10
|
def generate_delete_helpers(klass)
|
11
11
|
file_column_fields(klass).each { |field|
|
12
|
-
klass.send :class_eval, <<-EOF, __FILE__, __LINE__ + 1 unless klass.methods.include?("#{field}_with_delete="
|
12
|
+
klass.send :class_eval, <<-EOF, __FILE__, __LINE__ + 1 unless klass.methods.include?("#{field}_with_delete=")
|
13
13
|
attr_reader :delete_#{field}
|
14
14
|
|
15
15
|
def delete_#{field}=(value)
|
@@ -2,18 +2,18 @@ module ActiveScaffold
|
|
2
2
|
module Helpers
|
3
3
|
# Helpers that assist with the rendering of a List Column
|
4
4
|
module ListColumnHelpers
|
5
|
-
def active_scaffold_column_download_link_with_filename(
|
5
|
+
def active_scaffold_column_download_link_with_filename(record, column)
|
6
6
|
return nil if record.send(column.name).nil?
|
7
|
-
active_scaffold_column_download_link(
|
7
|
+
active_scaffold_column_download_link(record, column, File.basename(record.send(column.name)))
|
8
8
|
end
|
9
9
|
|
10
|
-
def active_scaffold_column_download_link(
|
10
|
+
def active_scaffold_column_download_link(record, column, label = nil)
|
11
11
|
return nil if record.send(column.name).nil?
|
12
12
|
label||=as_(:download)
|
13
13
|
link_to( label, url_for_file_column(record, column.name.to_s), :popup => true)
|
14
14
|
end
|
15
15
|
|
16
|
-
def active_scaffold_column_thumbnail(
|
16
|
+
def active_scaffold_column_thumbnail(record, column)
|
17
17
|
return nil if record.send(column.name).nil?
|
18
18
|
link_to(
|
19
19
|
image_tag(url_for_file_column(record, column.name.to_s, "thumb"), :border => 0),
|
@@ -1,6 +1,6 @@
|
|
1
1
|
class ActiveScaffold::Bridges::Paperclip < ActiveScaffold::DataStructures::Bridge
|
2
2
|
def self.install
|
3
|
-
if ActiveScaffold::Config::Core.instance_methods.include?("initialize_with_paperclip"
|
3
|
+
if ActiveScaffold::Config::Core.instance_methods.include?("initialize_with_paperclip")
|
4
4
|
raise RuntimeError, "We've detected that you have active_scaffold_paperclip_bridge installed. This plugin has been moved to core. Please remove active_scaffold_paperclip_bridge to prevent any conflicts"
|
5
5
|
end
|
6
6
|
require File.join(File.dirname(__FILE__), "paperclip/form_ui")
|
@@ -12,7 +12,7 @@ module ActiveScaffold
|
|
12
12
|
js_remove_file_code = "$(this).previous().value='true'; $(this).up().hide().next().show(); return false;";
|
13
13
|
end
|
14
14
|
|
15
|
-
content = active_scaffold_column_paperclip(
|
15
|
+
content = active_scaffold_column_paperclip(@record, column)
|
16
16
|
content_tag(:div,
|
17
17
|
content + " | " +
|
18
18
|
hidden_field(:record, "delete_#{column.name}", :value => "false") +
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module ActiveScaffold
|
2
2
|
module Helpers
|
3
3
|
module ListColumnHelpers
|
4
|
-
def active_scaffold_column_paperclip(
|
4
|
+
def active_scaffold_column_paperclip(record, column)
|
5
5
|
paperclip = record.send("#{column.name}")
|
6
6
|
return nil unless paperclip.file?
|
7
7
|
content = if paperclip.styles.include?(ActiveScaffold::Bridges::Paperclip::PaperclipBridgeHelpers.thumbnail_style)
|
@@ -6,7 +6,7 @@ module ActiveScaffold
|
|
6
6
|
self.thumbnail_style = :thumbnail
|
7
7
|
|
8
8
|
def self.generate_delete_helper(klass, field)
|
9
|
-
klass.class_eval <<-EOF, __FILE__, __LINE__ + 1 unless klass.instance_methods.include?("delete_#{field}="
|
9
|
+
klass.class_eval <<-EOF, __FILE__, __LINE__ + 1 unless klass.instance_methods.include?("delete_#{field}=")
|
10
10
|
attr_reader :delete_#{field}
|
11
11
|
|
12
12
|
def delete_#{field}=(value)
|
@@ -114,7 +114,7 @@ module ActiveScaffold
|
|
114
114
|
unless operator.nil?
|
115
115
|
["%{search_sql} #{value[:opt]} ?", from_value.to_s(:db)] unless from_value.nil?
|
116
116
|
else
|
117
|
-
["%{search_sql} BETWEEN ? AND ?", from_value.to_s(:db), to_value.to_s(:db)] unless from_value.nil?
|
117
|
+
["%{search_sql} BETWEEN ? AND ?", from_value.to_s(:db), to_value.to_s(:db)] unless from_value.nil? && to_value.nil?
|
118
118
|
end
|
119
119
|
end
|
120
120
|
end
|
@@ -16,7 +16,7 @@ class ActiveScaffold::Bridges::TinyMce
|
|
16
16
|
options[:class] = "#{options[:class]} mceEditor #{column.options[:class]}".strip
|
17
17
|
|
18
18
|
settings = { :theme => 'simple' }.merge(column.options[:tinymce] || {})
|
19
|
-
|
19
|
+
settings = settings.to_s.gsub(/:(.+?)\=\>/, '\1:')
|
20
20
|
settings = "tinyMCE.settings = #{settings};"
|
21
21
|
|
22
22
|
html = []
|
@@ -25,6 +25,10 @@ module ActiveScaffold::Config
|
|
25
25
|
cattr_accessor :theme
|
26
26
|
@@theme = :default
|
27
27
|
|
28
|
+
# enable caching of action link urls
|
29
|
+
cattr_accessor :cache_action_link_urls
|
30
|
+
@@cache_action_link_urls = true
|
31
|
+
|
28
32
|
# lets you disable the DHTML history
|
29
33
|
def self.dhtml_history=(val)
|
30
34
|
@@dhtml_history = val
|
@@ -91,6 +95,9 @@ module ActiveScaffold::Config
|
|
91
95
|
# lets you override the global ActiveScaffold theme for a specific controller
|
92
96
|
attr_accessor :theme
|
93
97
|
|
98
|
+
# enable caching of action link urls
|
99
|
+
attr_accessor :cache_action_link_urls
|
100
|
+
|
94
101
|
# lets you specify whether add a create link for each sti child for a specific controller
|
95
102
|
attr_accessor :sti_create_links
|
96
103
|
def add_sti_create_links?
|
@@ -139,6 +146,7 @@ module ActiveScaffold::Config
|
|
139
146
|
# inherit the global frontend
|
140
147
|
@frontend = self.class.frontend
|
141
148
|
@theme = self.class.theme
|
149
|
+
@cache_action_link_urls = self.class.cache_action_link_urls
|
142
150
|
@sti_create_links = self.class.sti_create_links
|
143
151
|
|
144
152
|
# inherit from the global set of action links
|
@@ -154,8 +162,7 @@ module ActiveScaffold::Config
|
|
154
162
|
# then, register the column objects
|
155
163
|
self.actions.each do |action_name|
|
156
164
|
action = self.send(action_name)
|
157
|
-
|
158
|
-
action.columns.set_columns(self.columns)
|
165
|
+
action.columns.set_columns(self.columns) if action.respond_to?(:columns)
|
159
166
|
end
|
160
167
|
end
|
161
168
|
|
@@ -23,6 +23,7 @@ module ActiveScaffold::Config
|
|
23
23
|
@wrap_tag = self.class.wrap_tag
|
24
24
|
@always_show_search = self.class.always_show_search
|
25
25
|
@always_show_create = self.class.always_show_create
|
26
|
+
@messages_above_header = self.class.messages_above_header
|
26
27
|
end
|
27
28
|
|
28
29
|
# global level configuration
|
@@ -39,17 +40,14 @@ module ActiveScaffold::Config
|
|
39
40
|
cattr_accessor :page_links_outer_window
|
40
41
|
@@page_links_outer_window = 0
|
41
42
|
|
42
|
-
class << self
|
43
|
-
def page_links_window=(value)
|
44
|
-
ActiveSupport::Deprecation.warn("Use page_links_inner_window", caller(1))
|
45
|
-
self.page_links_inner_window = value
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
43
|
# what string to use when a field is empty
|
50
44
|
cattr_accessor :empty_field_text
|
51
45
|
@@empty_field_text = '-'
|
52
46
|
|
47
|
+
# display messages above table header
|
48
|
+
cattr_accessor :messages_above_header
|
49
|
+
@@messages_above_header = false
|
50
|
+
|
53
51
|
# what string to use to join records from plural associations
|
54
52
|
cattr_accessor :association_join_text
|
55
53
|
@@association_join_text = ', '
|
@@ -67,7 +65,7 @@ module ActiveScaffold::Config
|
|
67
65
|
|
68
66
|
# the ActionLink to reset search
|
69
67
|
cattr_reader :reset_link
|
70
|
-
@@reset_link = ActiveScaffold::DataStructures::ActionLink.new('index', :label => :click_to_reset, :type => :collection, :position => false)
|
68
|
+
@@reset_link = ActiveScaffold::DataStructures::ActionLink.new('index', :label => :click_to_reset, :type => :collection, :position => false, :parameters => {:search => ''})
|
71
69
|
|
72
70
|
# wrap normal cells (not inplace editable columns or with link) with a tag
|
73
71
|
# it allows for more css styling
|
@@ -102,11 +100,6 @@ module ActiveScaffold::Config
|
|
102
100
|
# how many page links around current page to show
|
103
101
|
attr_accessor :page_links_outer_window
|
104
102
|
|
105
|
-
def page_links_window=(value)
|
106
|
-
ActiveSupport::Deprecation.warn("Use page_links_inner_window", caller(1))
|
107
|
-
self.page_links_inner_window = value
|
108
|
-
end
|
109
|
-
|
110
103
|
# What kind of pagination to use:
|
111
104
|
# * true: The usual pagination
|
112
105
|
# * :infinite: Treat the source as having an infinite number of pages (i.e. don't count the records; useful for large tables where counting is slow and we don't really care anyway)
|
@@ -116,6 +109,9 @@ module ActiveScaffold::Config
|
|
116
109
|
# what string to use when a field is empty
|
117
110
|
attr_accessor :empty_field_text
|
118
111
|
|
112
|
+
# display messages above table header
|
113
|
+
attr_accessor :messages_above_header
|
114
|
+
|
119
115
|
# what string to use to join records from plural associations
|
120
116
|
attr_accessor :association_join_text
|
121
117
|
|
@@ -6,25 +6,34 @@ module ActiveScaffold::Config
|
|
6
6
|
super
|
7
7
|
@label = :add_existing_model
|
8
8
|
@shallow_delete = self.class.shallow_delete
|
9
|
+
@ignore_order_from_association = self.class.ignore_order_from_association
|
9
10
|
end
|
10
11
|
|
11
12
|
# global level configuration
|
12
13
|
# --------------------------
|
13
14
|
cattr_accessor :shallow_delete
|
14
15
|
@@shallow_delete = true
|
16
|
+
|
17
|
+
cattr_accessor :ignore_order_from_association
|
15
18
|
|
16
19
|
# instance-level configuration
|
17
20
|
# ----------------------------
|
18
21
|
attr_accessor :shallow_delete
|
22
|
+
|
23
|
+
attr_accessor :ignore_order_from_association
|
19
24
|
|
20
25
|
# Add a nested ActionLink
|
21
26
|
def add_link(attribute, options = {})
|
22
27
|
column = @core.columns[attribute.to_sym]
|
23
28
|
unless column.nil? || column.association.nil?
|
24
|
-
|
29
|
+
label = if column.polymorphic_association?
|
30
|
+
column.label
|
31
|
+
else
|
32
|
+
column.association.klass.model_name.human({:count => column.singular_association? ? 1 : 2, :default => column.association.klass.name.pluralize})
|
33
|
+
end
|
34
|
+
options.reverse_merge! :security_method => :nested_authorized?, :label => label
|
25
35
|
action_group = options.delete(:action_group) || self.action_group
|
26
36
|
action_link = @core.link_for_association(column, options)
|
27
|
-
action_link.action ||= :index
|
28
37
|
@core.action_links.add_to_group(action_link, action_group) unless action_link.nil?
|
29
38
|
else
|
30
39
|
# TODO: raise exception
|
@@ -16,6 +16,16 @@ module ActiveScaffold::DataStructures
|
|
16
16
|
@label.to_s.underscore
|
17
17
|
end
|
18
18
|
|
19
|
+
# this is so that array.delete and array.include?, etc., will work by column name
|
20
|
+
def ==(other) #:nodoc:
|
21
|
+
# another ActionColumns
|
22
|
+
if other.class == self.class
|
23
|
+
self.label == other.label
|
24
|
+
else
|
25
|
+
@label.to_s == other.to_s
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
19
29
|
# Whether this column set is collapsed by default in contexts where collapsing is supported
|
20
30
|
attr_accessor :collapsed
|
21
31
|
|
@@ -39,7 +49,7 @@ module ActiveScaffold::DataStructures
|
|
39
49
|
|
40
50
|
def names
|
41
51
|
if @columns
|
42
|
-
self.
|
52
|
+
self.collect_visible(:flatten => true) { |c| c.name }
|
43
53
|
else
|
44
54
|
names_without_auth_check
|
45
55
|
end
|
@@ -66,8 +76,12 @@ module ActiveScaffold::DataStructures
|
|
66
76
|
item = (@columns[item] || ActiveScaffold::DataStructures::Column.new(item.to_sym, @columns.active_record_class))
|
67
77
|
next if self.skip_column?(item, options)
|
68
78
|
end
|
69
|
-
if item.is_a? ActiveScaffold::DataStructures::ActionColumns
|
70
|
-
|
79
|
+
if item.is_a? ActiveScaffold::DataStructures::ActionColumns
|
80
|
+
if options[:flatten]
|
81
|
+
item.each(options, &proc)
|
82
|
+
elsif !options[:skip_groups]
|
83
|
+
yield item
|
84
|
+
end
|
71
85
|
else
|
72
86
|
yield item
|
73
87
|
end
|
@@ -84,9 +98,9 @@ module ActiveScaffold::DataStructures
|
|
84
98
|
next if self.skip_column?(item, options)
|
85
99
|
end
|
86
100
|
if item.is_a? ActiveScaffold::DataStructures::ActionColumns and options.has_key?(:flatten) and options[:flatten]
|
87
|
-
columns
|
101
|
+
columns += item.collect_visible(options, &proc)
|
88
102
|
else
|
89
|
-
columns << item
|
103
|
+
columns << (block_given? ? yield(item) : item)
|
90
104
|
end
|
91
105
|
end
|
92
106
|
columns
|
@@ -172,13 +172,20 @@ module ActiveScaffold::DataStructures
|
|
172
172
|
# nested action_links are referencing a column
|
173
173
|
attr_accessor :column
|
174
174
|
|
175
|
+
# don't close the panel when another action link is open
|
176
|
+
attr_writer :keep_open
|
177
|
+
def keep_open?
|
178
|
+
@keep_open
|
179
|
+
end
|
180
|
+
|
175
181
|
# indicates that this a nested_link
|
176
182
|
def nested_link?
|
177
183
|
@column || (parameters && parameters[:named_scope])
|
178
184
|
end
|
179
185
|
|
180
|
-
|
181
|
-
|
186
|
+
def name_to_cache_link_url
|
187
|
+
@name_to_cache_link_url ||= :"#{controller || 'self'}_#{action}#{'_' if parameters.present?}#{parameters.map{|k,v| "#{k}_#{v}"}.join('_')}_link_url"
|
188
|
+
end
|
182
189
|
|
183
190
|
|
184
191
|
end
|
@@ -88,8 +88,9 @@ module ActiveScaffold::DataStructures
|
|
88
88
|
|
89
89
|
# iterates over the links, possibly by type
|
90
90
|
def each(options = {}, &block)
|
91
|
-
|
92
|
-
|
91
|
+
method = options[:reverse] ? :reverse_each : :each
|
92
|
+
@set.send(method) do |item|
|
93
|
+
if item.is_a?(ActiveScaffold::DataStructures::ActionLinks) && !options[:groups]
|
93
94
|
item.each(options, &block)
|
94
95
|
else
|
95
96
|
if options[:include_set]
|
@@ -98,7 +99,7 @@ module ActiveScaffold::DataStructures
|
|
98
99
|
yield item
|
99
100
|
end
|
100
101
|
end
|
101
|
-
|
102
|
+
end
|
102
103
|
end
|
103
104
|
|
104
105
|
def collect_by_type(type = nil)
|
@@ -107,34 +108,6 @@ module ActiveScaffold::DataStructures
|
|
107
108
|
links
|
108
109
|
end
|
109
110
|
|
110
|
-
def traverse(controller, options = {}, &block)
|
111
|
-
traverse_method = options.delete(:reverse).nil? ? :each : :reverse_each
|
112
|
-
options[:level] ||= -1
|
113
|
-
options[:level] += 1
|
114
|
-
first_action = true
|
115
|
-
@set.send(traverse_method) do |link|
|
116
|
-
if link.is_a?(ActiveScaffold::DataStructures::ActionLinks)
|
117
|
-
unless link.empty?
|
118
|
-
yield(link, nil, {:node => :start_traversing, :first_action => first_action, :level => options[:level]})
|
119
|
-
link.traverse(controller,options, &block)
|
120
|
-
yield(link, nil, {:node => :finished_traversing, :first_action => first_action, :level => options[:level]})
|
121
|
-
first_action = false
|
122
|
-
end
|
123
|
-
elsif controller.nil? || !skip_action_link(controller, link, *(Array(options[:for])))
|
124
|
-
security_method = link.security_method_set? || controller.respond_to?(link.security_method)
|
125
|
-
authorized = if security_method
|
126
|
-
controller.send(link.security_method, *(Array(options[:for])))
|
127
|
-
else
|
128
|
-
options[:for].nil? ? true : options[:for].authorized_for?(:crud_type => link.crud_type, :action => link.action)
|
129
|
-
end
|
130
|
-
next unless authorized || link.type == :member
|
131
|
-
yield(self, link, {:authorized => authorized, :first_action => first_action, :level => options[:level]})
|
132
|
-
first_action = false
|
133
|
-
end
|
134
|
-
end
|
135
|
-
options[:level] -= 1
|
136
|
-
end
|
137
|
-
|
138
111
|
def collect
|
139
112
|
@set
|
140
113
|
end
|
@@ -178,14 +151,10 @@ module ActiveScaffold::DataStructures
|
|
178
151
|
|
179
152
|
protected
|
180
153
|
|
181
|
-
def skip_action_link(controller, link, *args)
|
182
|
-
!link.ignore_method.nil? && controller.respond_to?(link.ignore_method) && controller.send(link.ignore_method, *args)
|
183
|
-
end
|
184
|
-
|
185
154
|
# called during clone or dup. makes the clone/dup deeper.
|
186
155
|
def initialize_copy(from)
|
187
156
|
@set = []
|
188
157
|
from.instance_variable_get('@set').each { |link| @set << link.clone }
|
189
158
|
end
|
190
159
|
end
|
191
|
-
end
|
160
|
+
end
|